{"mode":"cloudflare-d1","project":{"id":"opencard-ai","name":"OpenCard.ai","description":"OpenCard.ai product, credit card database, card adaptor, TaiwanCard, benefits/wiki, and related channels.","status":"active","owner_id":"KC","metadata_json":"{}","created_at":"2026-05-24T04:29:43.502937+00:00","updated_at":"2026-05-24T04:29:43.502937+00:00"},"channels":[{"id":"discord-1501593132083580968","project_id":"opencard-ai","platform":"discord","external_id":"1501593132083580968","name":"#card-adaptor","purpose":"OpenCard card adaptor and data ingestion pipeline","sync_mode":"important_only","metadata_json":"{}","created_at":"2026-05-24T04:29:43.724979+00:00"},{"id":"discord-1498096325122592911","project_id":"opencard-ai","platform":"discord","external_id":"1498096325122592911","name":"#taiwan-card","purpose":"TaiwanCard / Taiwan credit card tax benefits project","sync_mode":"important_only","metadata_json":"{}","created_at":"2026-05-24T04:29:43.680870+00:00"},{"id":"discord-1492386478746112023","project_id":"opencard-ai","platform":"discord","external_id":"1492386478746112023","name":"#credit-card-wiki","purpose":"OpenCard credit card wiki/database discussion","sync_mode":"important_only","metadata_json":"{}","created_at":"2026-05-24T04:29:43.636383+00:00"},{"id":"discord-1490177843466993764","project_id":"opencard-ai","platform":"discord","external_id":"1490177843466993764","name":"#unlock-lifestyle","purpose":"OpenCard lifestyle/unlock discussion","sync_mode":"important_only","metadata_json":"{}","created_at":"2026-05-24T04:29:43.591369+00:00"},{"id":"discord-category-1495655435464868011","project_id":"opencard-ai","platform":"discord","external_id":"1495655435464868011","name":"Category: Opencard.ai","purpose":"Discord category; all child channels inherit OpenCard.ai project context","sync_mode":"important_only","metadata_json":"{}","created_at":"2026-05-24T04:29:43.547237+00:00"}],"tasks":[{"id":"opencard-cron-quality-sync","title":"OpenCard cron quality sync / 5-11 triage backfill","description":"Backfilled from repo state: 2026-05-11 cron triggered 28 PR triage; reported result 14 merged / 6 closed / 1 held, followed by 2026-05-13 cron pause. Next step is to preserve the measured baseline and decide maintenance model before re-enabling scheduled catalog writes.","status":"blocked","priority":"urgent","owner_type":"human","owner_id":"KC","current_worker_id":null,"created_by":"kaceyc@openclaw","due_at":null,"metadata_json":"{\"source\":\"repo_backfill\",\"needs_sync\":true}","created_at":"2026-05-24T18:10:24.945Z","updated_at":"2026-05-27T20:08:00-07:00","project_id":"opencard-ai","claimed_by_type":null,"claimed_by_id":null,"claimed_by_name":null,"claimed_session_id":null,"claimed_at":null,"lock_expires_at":null,"owner_agent_id":null,"purpose":null,"linked_session_ids_json":"[]","review_pending":0,"review_requested_by":null,"review_requested_at":null,"review_checklist_json":"[]","review_decision":null,"review_decision_by":null,"review_decision_at":null,"pr_url":null,"branch_name":null,"usage_summary_json":"{}"},{"id":"opencard-source-swap-backlog","title":"OpenCard 11-card source swap backlog","description":"Backfilled from docs/CARD_SOURCE_SWAP_BACKLOG.md. 2026-05-09 dry-run had 13 All sources failed cards: 2 fixed, 8 mechanical URL swaps, 3 discontinued issuer-change records. Need confirm final commit/deploy state and whether cron failures dropped to zero.","status":"done","priority":"high","owner_type":"team","owner_id":"KC+Claude","current_worker_id":null,"created_by":"kaceyc@openclaw","due_at":null,"metadata_json":"{\"source_doc\":\"docs/CARD_SOURCE_SWAP_BACKLOG.md\"}","created_at":"2026-05-24T18:10:25.163Z","updated_at":"2026-05-27T20:08:00-07:00","project_id":"opencard-ai","claimed_by_type":null,"claimed_by_id":null,"claimed_by_name":null,"claimed_session_id":null,"claimed_at":null,"lock_expires_at":null,"owner_agent_id":null,"purpose":null,"linked_session_ids_json":"[]","review_pending":0,"review_requested_by":null,"review_requested_at":null,"review_checklist_json":"[]","review_decision":"approved","review_decision_by":"KC","review_decision_at":"2026-05-27T20:08:00-07:00","pr_url":null,"branch_name":null,"usage_summary_json":"{}"},{"id":"opencard-card-adaptor-phase-2","title":"OpenCard Card Adaptor Phase 2 artifact-first spec","description":"Backfilled from docs/CARD_ADAPTOR_PHASE_2_SPEC.md. Draft v1 proposes moving cron from direct PR/catalog writes to artifact-first runs under data/adaptor/runs/<run_id>, then QA/review/apply. Status remains draft/deferred pending KC maintenance model decision.","status":"planning","priority":"high","owner_type":"team","owner_id":"KC+Claude","current_worker_id":null,"created_by":"kaceyc@openclaw","due_at":null,"metadata_json":"{\"source_doc\":\"docs/CARD_ADAPTOR_PHASE_2_SPEC.md\"}","created_at":"2026-05-24T18:10:25.367Z","updated_at":"2026-05-27T20:08:00-07:00","project_id":"opencard-ai","claimed_by_type":null,"claimed_by_id":null,"claimed_by_name":null,"claimed_session_id":null,"claimed_at":null,"lock_expires_at":null,"owner_agent_id":null,"purpose":null,"linked_session_ids_json":"[]","review_pending":0,"review_requested_by":null,"review_requested_at":null,"review_checklist_json":"[]","review_decision":null,"review_decision_by":null,"review_decision_at":null,"pr_url":null,"branch_name":null,"usage_summary_json":"{}"},{"id":"opencard-cfpb-pipeline-disabled","title":"OpenCard CFPB pipeline disabled / rewrite required","description":"Backfilled from scripts/pipelines/cfpb/_killswitch.py and CFPB diagnosis docs. Pipeline is disabled after annual_fee corruption; do not re-enable until rewritten with fact store, sanity gates, and review queue.","status":"blocked","priority":"urgent","owner_type":"team","owner_id":"KC+Claude","current_worker_id":null,"created_by":"kaceyc@openclaw","due_at":null,"metadata_json":"{\"source_file\":\"scripts/pipelines/cfpb/_killswitch.py\"}","created_at":"2026-05-24T18:10:25.598Z","updated_at":"2026-05-27T20:08:00-07:00","project_id":"opencard-ai","claimed_by_type":null,"claimed_by_id":null,"claimed_by_name":null,"claimed_session_id":null,"claimed_at":null,"lock_expires_at":null,"owner_agent_id":null,"purpose":null,"linked_session_ids_json":"[]","review_pending":0,"review_requested_by":null,"review_requested_at":null,"review_checklist_json":"[]","review_decision":null,"review_decision_by":null,"review_decision_at":null,"pr_url":null,"branch_name":null,"usage_summary_json":"{}"},{"id":"opencard-claude-kacey-workflow","title":"OpenCard Claude/Kacey workflow proposal","description":"Backfilled from docs/CLAUDE_KACEY_WORKFLOW.md. Defines lane separation: Claude can execute code-lane work, catalog data remains KC-owned, cron/schedule/external actions require explicit KC approval, and Claude writes handoff docs at session end.","status":"done","priority":"normal","owner_type":"human","owner_id":"KC","current_worker_id":null,"created_by":"kaceyc@openclaw","due_at":null,"metadata_json":"{\"source_doc\":\"docs/CLAUDE_KACEY_WORKFLOW.md\"}","created_at":"2026-05-24T18:10:25.818Z","updated_at":"2026-05-27T20:08:00-07:00","project_id":"opencard-ai","claimed_by_type":null,"claimed_by_id":null,"claimed_by_name":null,"claimed_session_id":null,"claimed_at":null,"lock_expires_at":null,"owner_agent_id":null,"purpose":null,"linked_session_ids_json":"[]","review_pending":0,"review_requested_by":null,"review_requested_at":null,"review_checklist_json":"[]","review_decision":"approved","review_decision_by":"KC","review_decision_at":"2026-05-27T20:08:00-07:00","pr_url":null,"branch_name":null,"usage_summary_json":"{}"},{"id":"opencard-adsense-longform-content","title":"OpenCard AdSense approval: long-form editorial content","description":"From prior session §32 #4 punch list: Google AdSense review requires substantive long-form articles on the site. Current state: AdSense script loaded in layout (ca-pub-9241929717890328) but site is mostly card directory + tools, lacking editorial depth.\n\nScope (per prior discussion):\n- 5-10 long-form pillar articles (1500+ words each) covering high-value topics — welcome offer strategy, transferable points 101, by-issuer rewards comparison, churning ethics, etc.\n- 25 shorter editorial pieces (400-800 words) — single card reviews, monthly elevated-offer roundups, news commentary, FAQ-style answers.\n- Multi-language: ideally en + zh primary, es as stretch.\n\nDeliverable paths to consider:\n1. New /[lang]/blog or /[lang]/guides route under app/ with MDX support.\n2. Reuse existing NewsFeed surface area, just promote long-form items.\n3. Standalone editorial CMS feeding into data/articles.json (mirrors data/news.json pattern).\n\nReview gates: each article needs original analysis (not regurgitated issuer copy), accurate numbers, citations to issuer/DoC/TPG. AdSense reviewers also look for traffic + bounce rate signals — pure-volume content without substance can backfire.\n\nDependencies / gates:\n- Coordinate with KC since editorial voice + topic priority is owner decision.\n- Possibly integrate with card-adaptor methodology so article facts stay in sync with catalog (citation system).\n- Decide language strategy before scaling — translating later is more expensive.","status":"active","priority":"normal","owner_type":"team","owner_id":"KC+Claude","current_worker_id":null,"created_by":"claudecode@macmini","due_at":null,"metadata_json":"\"{\\\"source\\\":\\\"prior session §32 #4\\\",\\\"goal\\\":\\\"Google AdSense approval\\\",\\\"scope\\\":\\\"5-10 long-form + 25 editorial\\\",\\\"adsense_pub_id\\\":\\\"ca-pub-9241929717890328\\\"}\"","created_at":"2026-05-25T04:50:53.123Z","updated_at":"2026-05-27T20:08:00-07:00","project_id":"opencard-ai","claimed_by_type":null,"claimed_by_id":null,"claimed_by_name":null,"claimed_session_id":null,"claimed_at":null,"lock_expires_at":null,"owner_agent_id":"jisoo","purpose":"writing","linked_session_ids_json":"[]","review_pending":0,"review_requested_by":null,"review_requested_at":null,"review_checklist_json":"[]","review_decision":null,"review_decision_by":null,"review_decision_at":null,"pr_url":null,"branch_name":null,"usage_summary_json":"{}"}],"events":[{"id":"cleanup-cron-remains-blocked-20260527","task_id":"opencard-cron-quality-sync","actor_id":"KC","actor_type":"human","event_type":"note","summary":"Kept blocked: maintenance model decision required","body_markdown":"Keep blocked until KC decides whether to re-enable cron or move to artifact-first + review queue.","artifact_ids":"[]","metadata_json":"{}","created_at":"2026-05-27T20:08:00-07:00"},{"id":"cleanup-source-swap-approved-20260527","task_id":"opencard-source-swap-backlog","actor_id":"KC","actor_type":"human","event_type":"decision","summary":"Approved source swap backlog","body_markdown":"Prior events show the 11-card source swap backlog was applied and related follow-ups were handled. Closing as approved.","artifact_ids":"[]","metadata_json":"{\"reviewDecision\":\"approved\"}","created_at":"2026-05-27T20:08:00-07:00"},{"id":"cleanup-card-adaptor-keep-planning-20260527","task_id":"opencard-card-adaptor-phase-2","actor_id":"KC","actor_type":"human","event_type":"note","summary":"Kept planning: depends on CFPB/cron policy","body_markdown":"Do not start coding until CFPB rewrite and cron review model are settled. Direction remains artifact-first adaptor runs.","artifact_ids":"[]","metadata_json":"{}","created_at":"2026-05-27T20:08:00-07:00"},{"id":"cleanup-cfpb-remains-blocked-20260527","task_id":"opencard-cfpb-pipeline-disabled","actor_id":"KC","actor_type":"human","event_type":"note","summary":"Kept blocked: CFPB pipeline requires rewrite","body_markdown":"Do not unblock the CFPB pipeline until rewritten with fact store, sanity gates, and review queue. Kill switch remains appropriate.","artifact_ids":"[]","metadata_json":"{}","created_at":"2026-05-27T20:08:00-07:00"},{"id":"cleanup-workflow-approved-20260527","task_id":"opencard-claude-kacey-workflow","actor_id":"KC","actor_type":"human","event_type":"decision","summary":"Approved Claude/Kacey workflow proposal","body_markdown":"KC approved the proposed lane separation and workflow policy; closing this review item.","artifact_ids":"[]","metadata_json":"{\"reviewDecision\":\"approved\"}","created_at":"2026-05-27T20:08:00-07:00"},{"id":"cleanup-adsense-active-20260527","task_id":"opencard-adsense-longform-content","actor_id":"KC","actor_type":"human","event_type":"status","summary":"Moved to active: content planning/writing next","body_markdown":"Next step: produce topic plan and long-form editorial content for AdSense approval. Suggested owner: Jisoo/Rosé research + Kacey/Claude implementation.","artifact_ids":"[]","metadata_json":"{\"ownerAgentId\":\"jisoo\",\"purpose\":\"writing\"}","created_at":"2026-05-27T20:08:00-07:00"},{"id":"971abb49-52c7-42c2-95f4-174d31ea93ad","task_id":"opencard-claude-kacey-workflow","actor_id":"claudecode@macmini","actor_type":"agent","event_type":"handoff","summary":"Session 2026-05-25 end. HEAD 685a81ca on origin/main. Session covered: AgentHub adoption + 17-event backfill + bug-hunting + AdSense pillar #1 shipped to prod. Local handoff doc at ~/Documents/opencard-session-2026-05-25-handoff.md.","body_markdown":"## Next session first action (per handoff §6)\n1. Read AgentHub Project Report (canonical)\n2. Add /guides nav link on fresh branch\n3. KC picks pillar #2 topic\n4. Pillar #2 + #3 → AdSense submission\n\n## Open KC decisions (carried forward)\n- MAINTENANCE_MODEL_REVIEW §7 (cron model A/B/C/D)\n- CLAUDE_KACEY_WORKFLOW §10 (push / PR / catalog / methodology)\n- Pillar #2 topic\n- /guides nav placement (main vs submenu)\n\n## AgentHub feature requests filed\n- PATCH /api/tasks/{id} for status updates\n- POST /api/artifacts endpoint (or document the WebUI-only path)\n- Idempotency key on POST /api/events","artifact_ids":"[]","metadata_json":"{}","created_at":"2026-05-26T06:20:54.240Z"},{"id":"1a0abc64-a783-488e-8ee4-8f175159a030","task_id":"opencard-adsense-longform-content","actor_id":"claudecode@macmini","actor_type":"agent","event_type":"handoff","summary":"v1 merged to main via PR #33 (squash). Production: https://opencardai.com/en/guides/transferable-points-101. Branch deleted. Vercel prod deploy success.","body_markdown":"## Live on prod\n- Index: https://opencardai.com/en/guides\n- Pillar #1: https://opencardai.com/en/guides/transferable-points-101 (2 tables rendering)\n- Locales: /zh, /zh-cn, /es (en content for now)\n\n## Status\nTask remains active. v1 corpus = 1 pillar. AdSense submission needs ≥3 pillars + nav link visibility, so next iterations:\n1. Add /guides link to site header nav (small)\n2. Pillar #2 (Welcome Offer Strategy 101 or Chase 5/24 — KC picks)\n3. Pillar #3\n4. Optional: data/articles.json for shorter editorial pieces\n5. Then submit to AdSense\n\nEach as its own claude/adsense-guides-X branch + PR per the incremental ship pattern.","artifact_ids":"[]","metadata_json":"{}","created_at":"2026-05-26T06:18:26.181Z"},{"id":"32dcc0f9-f68d-4ecd-a30e-c0c7d6b16631","task_id":"opencard-adsense-longform-content","actor_id":"claudecode@macmini","actor_type":"agent","event_type":"review","summary":"KC approved v1 preview 2026-05-25 (\"很好, 都改好了\"). Branch claude/adsense-guides-v1 (HEAD c89d7dc3) ready to merge to main. Awaiting KC decision on merge mechanism + whether to add nav link + scale to 3 pillars before merge or incrementally after.","body_markdown":"","artifact_ids":"[]","metadata_json":"{}","created_at":"2026-05-26T06:13:25.308Z"},{"id":"e6bfd2f3-2dee-4ebf-9c26-de858a4ba1fa","task_id":"opencard-adsense-longform-content","actor_id":"claudecode@macmini","actor_type":"agent","event_type":"note","summary":"Fixed: KC noted tables rendered as literal text. Root cause: @next/mdx ships without GFM. Installed remark-gfm and added to createMDX options. New preview: https://opencard-m8x0gvd76-opencard-ais-projects.vercel.app/en/guides/transferable-points-101","body_markdown":"Commit c89d7dc3 on claude/adsense-guides-v1. Build green, both tables (4 programs at a glance + which currency to chase first) now have proper structure. Plugin passed as string per Next.js Turbopack requirement.","artifact_ids":"[]","metadata_json":"{}","created_at":"2026-05-26T06:06:34.953Z"},{"id":"39d3b733-bead-4bcc-b607-3e6cc0ef69bd","task_id":"opencard-adsense-longform-content","actor_id":"claudecode@macmini","actor_type":"agent","event_type":"artifact","summary":"Vercel preview deploy live for KC review: https://opencard-bvi51yteb-opencard-ais-projects.vercel.app/en/guides/transferable-points-101","body_markdown":"Branch claude/adsense-guides-v1 pushed; Vercel preview built in ~2 min, status Ready.\n\n- Index: https://opencard-bvi51yteb-opencard-ais-projects.vercel.app/en/guides\n- First pillar: https://opencard-bvi51yteb-opencard-ais-projects.vercel.app/en/guides/transferable-points-101\n- Localized stubs (same content, en-only v1): /zh/guides/transferable-points-101 etc.\n\nKC review checklist:\n- Tone and authority\n- Tailwind styling on MDX elements (h1/h2/h3, links, blockquote, table)\n- Internal cross-links to card pages render correctly\n- Mobile layout\n- AdSense ads.txt + script still loaded (layout untouched)","artifact_ids":"[]","metadata_json":"{}","created_at":"2026-05-25T05:20:43.715Z"},{"id":"2eb1c6fc-e6eb-40a3-bdd1-59d3098d91e6","task_id":"opencard-adsense-longform-content","actor_id":"claudecode@macmini","actor_type":"agent","event_type":"review","summary":"v1 deliverable shipped (local commit 6d0009e3, not pushed): MDX scaffold + first pillar article. 8 new static pages prerender clean. Awaiting KC review before scaling to 3 pillars or adding nav link.","body_markdown":"## What landed (local commit 6d0009e3)\n- `@next/mdx` + `@mdx-js/{loader,react}` + `@types/mdx` installed\n- `next.config.ts` wrapped with createMDX, pageExtensions extended\n- `mdx-components.tsx` (required by App Router) — Tailwind-styled MDX→HTML map, no @tailwindcss/typography dep\n- `lib/guides.ts` — hand-curated registry\n- `app/[lang]/guides/page.tsx` — index page per locale\n- `app/[lang]/guides/[slug]/page.tsx` — dynamic import pattern per Next 16 docs, dynamicParams=false\n- `content/guides/transferable-points-101.mdx` — ~2,000-word pillar covering Chase UR / Amex MR / Citi TYP / Capital One Miles + transfer-vs-portal decision framework + start-here matrix\n\n## Verification\n- `npm run build` green: 8 new prerendered pages (/[lang]/guides + /[lang]/guides/transferable-points-101 × 4 locales)\n- No type / lint errors\n- KC parallel unstaged work untouched (app/[lang]/cards/[card_id]/page.tsx, capital-one-venture-x catalog + prompt, scripts/sync-news.mjs)\n\n## Not pushed\nPer CLAUDE_KACEY_WORKFLOW.md §6: push to main requires per-action KC OK. Article is on local commit, ready for KC to:\n  (a) preview via `npm run dev` → http://localhost:3000/en/guides/transferable-points-101\n  (b) push to a preview branch for Vercel preview deploy\n  (c) approve direct push to main\n\n## Next iterations (per KC review)\n1. Tone / format feedback — adjust template via mdx-components.tsx or article rewrite\n2. Scale to 3 pillars: add Welcome Offer Strategy + Chase 5/24\n3. Add /guides link to site header nav (currently URL-reachable but no nav entry)\n4. Spin up data/articles.json for shorter editorial pieces (Phase 2 of the hybrid surface)\n5. Decide language strategy for v2 — zh translations as separate MDX files or shared metadata + body translation","artifact_ids":"[]","metadata_json":"\"{\\\"commit\\\":\\\"6d0009e3\\\",\\\"pushed\\\":false,\\\"pages_added\\\":8,\\\"article_word_count\\\":2000,\\\"surface\\\":\\\"MDX pillar route\\\",\\\"language\\\":\\\"en-only-v1\\\"}\"","created_at":"2026-05-25T05:15:00.329Z"},{"id":"647e9897-7501-417b-a52c-aff7630add85","task_id":"opencard-adsense-longform-content","actor_id":"claudecode@macmini","actor_type":"agent","event_type":"handoff","summary":"claudecode@macmini claiming task. (PATCH/PUT /api/tasks/{id} returns 405 — using event as workaround. Status stays planning until WebUI update or task-update endpoint lands.)","body_markdown":"Surfacing 3 decisions to KC before scaffolding content:\n\n1. **Delivery surface**: MDX route under app/[lang]/guides/ (best for long-form, needs config) vs data/articles.json mirroring news.json (zero config, multilingual built-in, bad for 1500-word articles) vs hybrid.\n2. **Language strategy**: en-only first 3 pillars then translate (cheapest, AdSense en-heavy) vs simultaneous en+zh (doubles cost, matches site i18n).\n3. **First-iteration scope**: 1 sample article (validate surface + design) vs 3 pillars (minimum AdSense-viable) vs full 50+ (months).\n\nMy lean per decision: hybrid surface (MDX for pillars / JSON for editorial) → en-only first → 1 sample article (topic = welcome-offer strategy 101 or transferable points 101 or Chase 5/24 — KC picks).","artifact_ids":"[]","metadata_json":"{}","created_at":"2026-05-25T05:04:09.674Z"},{"id":"00a84e06-0b23-455b-bcea-9908dbce9d94","task_id":"opencard-cron-quality-sync","actor_id":"claudecode@macmini","actor_type":"agent","event_type":"note","summary":"Resolves earlier [needs-sync] note (9bdd66a9): opencard-adsense-longform-content task now exists as first-class entity. Root cause of POST /api/tasks 500: enum validation on status/priority columns throws 500 instead of 4xx for invalid values. Workaround: use enum values observed in existing tasks.","body_markdown":"See AgentHub bug report event (next) for full repro details.","artifact_ids":"[]","metadata_json":"{}","created_at":"2026-05-25T04:51:54.251Z"},{"id":"6675873b-ed62-430e-9111-ffd0a24acf01","task_id":"opencard-adsense-longform-content","actor_id":"claudecode@macmini","actor_type":"agent","event_type":"note","summary":"Task created by claudecode@macmini per KC request 2026-05-24 chat. Scope = 5-10 long-form pillar articles + 25 editorial pieces to pass Google AdSense review. See task description for delivery surface options + dependencies.","body_markdown":"Triggered by KC chat: 我說的是long context的文章, 讓google adsence可以通過. Prior reference: §32 #4 punch list in opencard-session-2026-05-10-pm-handoff.md (untouched there).","artifact_ids":"[]","metadata_json":"{}","created_at":"2026-05-25T04:51:54.017Z"},{"id":"9cf3cfea-c98b-47a9-8f67-10e9ff68d935","task_id":"opencard-adsense-longform-content","actor_id":"claudecode@macmini","actor_type":"human","event_type":"note","summary":"Task created from WebUI","body_markdown":"From prior session §32 #4 punch list: Google AdSense review requires substantive long-form articles on the site. Current state: AdSense script loaded in layout (ca-pub-9241929717890328) but site is mostly card directory + tools, lacking editorial depth.\n\nScope (per prior discussion):\n- 5-10 long-form pillar articles (1500+ words each) covering high-value topics — welcome offer strategy, transferable points 101, by-issuer rewards comparison, churning ethics, etc.\n- 25 shorter editorial pieces (400-800 words) — single card reviews, monthly elevated-offer roundups, news commentary, FAQ-style answers.\n- Multi-language: ideally en + zh primary, es as stretch.\n\nDeliverable paths to consider:\n1. New /[lang]/blog or /[lang]/guides route under app/ with MDX support.\n2. Reuse existing NewsFeed surface area, just promote long-form items.\n3. Standalone editorial CMS feeding into data/articles.json (mirrors data/news.json pattern).\n\nReview gates: each article needs original analysis (not regurgitated issuer copy), accurate numbers, citations to issuer/DoC/TPG. AdSense reviewers also look for traffic + bounce rate signals — pure-volume content without substance can backfire.\n\nDependencies / gates:\n- Coordinate with KC since editorial voice + topic priority is owner decision.\n- Possibly integrate with card-adaptor methodology so article facts stay in sync with catalog (citation system).\n- Decide language strategy before scaling — translating later is more expensive.","artifact_ids":"[]","metadata_json":"{}","created_at":"2026-05-25T04:50:53.123Z"},{"id":"221ae62b-1b8c-44c0-bf6b-a5ef2e699c30","task_id":"opencard-cron-quality-sync","actor_id":"claudecode@macmini","actor_type":"agent","event_type":"note","summary":"BUG-REPRO-PROBE-DELETE-ME","body_markdown":"","artifact_ids":"[]","metadata_json":"{}","created_at":"2026-05-25T04:49:05.637Z"},{"id":"9bdd66a9-3e64-4a98-b791-6d558ff32b64","task_id":"opencard-cron-quality-sync","actor_id":"claudecode@macmini","actor_type":"agent","event_type":"note","summary":"[needs-sync][new-task] Scoped opencard-adsense-longform-content task per KC request. POST /api/tasks returns 500 (likely regression from project_id bug fix) so cannot auto-create. Payload at /tmp/agenthub-long-context-task.json on Mac mini. KC to create via WebUI or fix API + replay.","body_markdown":"## Proposed task\n- **id**: opencard-adsense-longform-content\n- **title**: OpenCard AdSense approval: long-form editorial content\n- **status**: pending\n- **priority**: medium\n- **owner**: KC+Claude\n\n## Scope (from prior session §32 #4)\nGoogle AdSense approval requires substantive long-form articles. Site currently has AdSense script loaded (ca-pub-9241929717890328) but is mostly card directory + tools.\n\n- 5-10 long-form pillar articles (1500+ words): welcome-offer strategy, transferable points 101, by-issuer rewards comparison, churning ethics\n- 25 shorter editorial pieces (400-800 words): single card reviews, monthly elevated-offer roundups, news commentary, FAQ\n- Multi-language: en + zh primary, es stretch\n\n## Delivery surface options\n1. New /[lang]/blog or /[lang]/guides route with MDX\n2. Reuse NewsFeed component, promote long-form items\n3. Standalone editorial CMS feeding data/articles.json\n\n## Gates / dependencies\n- KC owns editorial voice + topic priority\n- Integrate with card-adaptor methodology so article facts stay in sync with catalog\n- Decide language strategy before scaling (translation cost compounds)\n- AdSense reviewers care about traffic + bounce rate signals — volume without substance can backfire\n\n## API bug evidence\nPOST /api/tasks tried with 4 payload variations (with/without id, with/without owner_id, matching 5/23 smoke task shape exactly) — all returned HTTP 500 Internal Server Error. POST /api/events with same auth token works fine. Suspect regression from yesterday's project_id fix.","artifact_ids":"[]","metadata_json":"\"{\\\"proposed_task_id\\\":\\\"opencard-adsense-longform-content\\\",\\\"payload_file\\\":\\\"/tmp/agenthub-long-context-task.json\\\",\\\"api_bug\\\":\\\"POST /api/tasks returns 500\\\",\\\"prior_ref\\\":\\\"§32 #4 in prior handoff\\\"}\"","created_at":"2026-05-25T04:43:47.142Z"},{"id":"1aac82a5-1de0-4a15-bb6e-7e9a9162dadb","task_id":"opencard-cron-quality-sync","actor_id":"claudecode@macmini","actor_type":"agent","event_type":"handoff","summary":"Backfill session complete (2026-05-24): 17 events POSTed to OpenCard Project Report under claudecode@macmini. Report now 28 events / 8 artifacts / 5 tasks. Next agent: read MAINTENANCE_MODEL_REVIEW §7 + CLAUDE_KACEY_WORKFLOW §10 open questions before resuming.","body_markdown":"## Status\n**Done** — verified via GET /api/projects/opencard-ai/report.\n\n## What completed\n- 16 historical events (2026-05-09 → 2026-05-22 repo state) + 1 [needs-sync] summary event POSTed\n- Per-task distribution: cron-quality-sync +10, source-swap-backlog +3, claude-kacey-workflow +2, card-adaptor-phase-2 +2\n- All POSTs HTTP 200; full log at /tmp/agenthub-ingest.log\n- Manifest at /tmp/agenthub-backfill-2026-05-24.json (replayable)\n- Ingest script at /tmp/agenthub-ingest.py (modes: smoke / all / rest / summary)\n\n## Verification\n- 17/17 POSTs returned 200 with event UUIDs\n- Final report fetch: 11 → 28 events; per-task counts match manifest\n- Cloudflare WAF blocks Python's default UA — script uses browser UA. Future agents must do the same.\n\n## Repo state untouched\n- No git commits, no push, no catalog data edits, no KC unstaged work touched\n- Ingest was read-only repo introspection + AgentHub writes only\n\n## Remaining for KC\n1. **Artifact ingest path** — POST /api/artifacts returns 404 (with or without auth, top-level or nested). 9 artifact entries surfaced as event_type=artifact events instead. KC to clarify if first-class artifact rows need WebUI upload or different endpoint.\n2. **One duplicate event** — smoke test created event 67448b24-2939-476a-be27-4fbc0346403b (2026-05-09 dry-run baseline). Later 'rest' run posted the same payload again at a52c42c6-e861-4b62-a69e-a6b224ebdeab. KC can delete one.\n3. **§7 + §10 open questions** still pending — they gate progress on cron-quality-sync (blocked) and claude-kacey-workflow (review).\n4. **5/16-5/22 commits** (my-cards / Resend / sync-news) listed in event 5d629d35 but no AgentHub task yet. KC decide whether to open opencard-my-cards-iteration.\n\n## Idempotency note\nNo dedup mechanism on POST /api/events — replaying the manifest will insert duplicates. Future ingest scripts should track posted event IDs to skip on retry, or AgentHub could add a client_event_id field for at-least-once delivery.","artifact_ids":"[]","metadata_json":"\"{\\\"session_date\\\":\\\"2026-05-24\\\",\\\"events_posted\\\":17,\\\"posts_succeeded\\\":17,\\\"manifest\\\":\\\"/tmp/agenthub-backfill-2026-05-24.json\\\",\\\"log\\\":\\\"/tmp/agenthub-ingest.log\\\",\\\"actor\\\":\\\"claudecode@macmini\\\"}\"","created_at":"2026-05-24T23:07:47.397Z"},{"id":"c4a62393-84a8-49d7-b3b3-5310a102a154","task_id":"opencard-cron-quality-sync","actor_id":"claudecode@macmini","actor_type":"agent","event_type":"handoff","summary":"[needs-sync] Claude Code 2026-05-24 backfill manifest produced: 16 events + 9 artifacts covering 2026-05-09 → 2026-05-22 repo state not captured in KC's first-pass backfill. Blocked on AgentHub auth — need connector token for events:write to ingest, or KC runs POSTs from /tmp/agenthub-backfill-2026-05-24.json.","body_markdown":"Manifest at /tmp/agenthub-backfill-2026-05-24.json (Mac mini local). Contents reflect 4 main-branch commits (4dbd7ed1 / 73ea7842 / 63e02b23 / d4e60175), the 5/11 cron firing, the 28-PR triage, KC's parallel scripts/card-adaptor + adaptor runs + us-bank-harley-davidson catalog entry, the 5/21 here.now overview deploy, and 7 unrelated my-cards/email/sync-news commits flagged for separate task scoping. Claude Code did not write to AgentHub or to data/cards/ — backfill is read-only repo introspection.","artifact_ids":"[]","metadata_json":"\"{\\\"manifest_path\\\":\\\"/tmp/agenthub-backfill-2026-05-24.json\\\",\\\"events_count\\\":16,\\\"artifacts_count\\\":9,\\\"covers\\\":\\\"2026-05-09 → 2026-05-22\\\"}\"","created_at":"2026-05-24T22:40:50.321Z"},{"id":"5d629d35-cafd-4239-b245-2458db36d98d","task_id":"opencard-cron-quality-sync","actor_id":"claudecode@macmini","actor_type":"agent","event_type":"note","summary":"Other recent main-branch commits (5/16-5/22) NOT yet tied to a task: my-cards refactors (9481405b, ff257041), Resend email (bc449bc4), lint baseline (f0273aec), sync-news regex fix (b78cbd26), MiniMax key rotation drama (ca95ca89 + 06a52abb).","body_markdown":"These touch /api/my-cards and /lib/email and scripts/sync-news.mjs — outside the cron pipeline lane. Suggest creating a separate AgentHub task 'opencard-my-cards-iteration' if KC wants to track. Listed here only for completeness; the cron-quality-sync scope is narrower.","artifact_ids":"[]","metadata_json":"\"{\\\"commits\\\":[\\\"9481405b\\\",\\\"ff257041\\\",\\\"bc449bc4\\\",\\\"f0273aec\\\",\\\"b78cbd26\\\",\\\"ca95ca89\\\",\\\"06a52abb\\\"]}\"","created_at":"2026-05-24T22:40:09.039Z"},{"id":"32ac3c7a-288e-45d6-8a06-7e7b5bccec4d","task_id":"opencard-claude-kacey-workflow","actor_id":"claudecode@macmini","actor_type":"agent","event_type":"note","summary":"2026-05-21: Claude Code deployed standalone repo-overview HTML to here.now anonymous publish for remote review. URL https://sleek-serenity-rqyg.here.now/ (24-hr anon expiry; claim URL retained locally).","body_markdown":"Single 38 KB HTML, self-contained dark-theme docs site with 18 sections (product, tech stack, routes, API, my-cards, recommendation, UI, auto-update pipeline, 3 gates, Phase 2 CLI, CFPB disabled, card schema, data dirs, workflows, docs catalog, recent activity, open decisions, fragile). Built from parallel Explore-agent surveys. Not committed to repo; transient deliverable for KC review.","artifact_ids":"[]","metadata_json":"\"{\\\"deploy\\\":\\\"https://sleek-serenity-rqyg.here.now/\\\",\\\"expires_at\\\":\\\"2026-05-23T20:07:58Z\\\",\\\"size_bytes\\\":38334}\"","created_at":"2026-05-24T22:40:08.787Z"},{"id":"6a06e27a-7429-4e8a-b44f-9cab4ff40cf3","task_id":"opencard-cron-quality-sync","actor_id":"claudecode@macmini","actor_type":"agent","event_type":"artifact","summary":"Handoff doc ~/Documents/opencard-session-2026-05-10-pm-handoff.md captures full state at end of 5/10 session (4 commits to main, 2 §10 resolutions, step-back review).","body_markdown":"Filed in ~/Documents/ (Mac-mini local). Series of 5 handoff docs total: 5/4, 5/5, 5/10 morning, 5/10 PM. Each follows the Claude session handoff template (§1 repo state → §10 KC ToDo). The 5/10 PM doc is the most recent; §10.0 priority is 'read MAINTENANCE_MODEL_REVIEW before resuming pipeline work'.","artifact_ids":"[]","metadata_json":"\"{\\\"file\\\":\\\"~/Documents/opencard-session-2026-05-10-pm-handoff.md\\\",\\\"sections\\\":10,\\\"top_priority_section\\\":\\\"§10.0\\\"}\"","created_at":"2026-05-24T22:40:08.503Z"},{"id":"c461eaec-7519-4888-9767-994a51b7838f","task_id":"opencard-cron-quality-sync","actor_id":"claudecode@macmini","actor_type":"agent","event_type":"review","summary":"docs/MAINTENANCE_MODEL_REVIEW.md (2026-05-10 draft) proposes 4-way maintenance model decision (A monitor-only / B PR-generator [current paused] / C research-pipeline / D manual-first cron-as-spotter). Decision pending KC.","body_markdown":"Step-back doc written after observing Track 1 (Claude/cron) vs Track 2 (KC manual) divergence. §7 has 5 questions for KC: catalog field-impact priorities, hour-budget, Track 1 retrospective, A/B/C/D choice using 5/11 numbers, methodology drafts authority. Until KC answers, no new pipeline architecture should be built. Existing defenses (gates, source swaps, headCheck) remain in.","artifact_ids":"[]","metadata_json":"\"{\\\"source_doc\\\":\\\"docs/MAINTENANCE_MODEL_REVIEW.md\\\",\\\"models_proposed\\\":[\\\"A\\\",\\\"B\\\",\\\"C\\\",\\\"D\\\"],\\\"open_questions\\\":5}\"","created_at":"2026-05-24T22:40:08.263Z"},{"id":"658458b3-893c-44a6-a499-6367d9ae473f","task_id":"opencard-source-swap-backlog","actor_id":"claudecode@macmini","actor_type":"agent","event_type":"artifact","summary":"KC parallel work: data/cards/us-bank-harley-davidson.json catalog entry created (date ~5/12 based on adaptor run timing). H-D successor research task from §10.3 resolved by KC.","body_markdown":"Originally deferred 5/10 because no scraper-friendly source had been verified. KC appears to have either verified a source or accepted the catalog entry without scraper coverage. Claude Code did not author this file.","artifact_ids":"[]","metadata_json":"\"{\\\"file\\\":\\\"data/cards/us-bank-harley-davidson.json\\\",\\\"author\\\":\\\"KC\\\",\\\"successor_to\\\":\\\"barclays-harley-davidson\\\"}\"","created_at":"2026-05-24T22:40:07.963Z"},{"id":"18fa267c-e6c3-4cc3-806a-a4557c12670a","task_id":"opencard-card-adaptor-phase-2","actor_id":"claudecode@macmini","actor_type":"agent","event_type":"artifact","summary":"KC parallel work: 11 Phase 2 POC runs under data/adaptor/runs/ between 5/9 and 5/20. Card coverage: amex-gold (×4), chase-sapphire-reserve (×4), chase-sapphire-preferred (×2), amex-morgan-stanley-platinum (×1).","body_markdown":"Earliest: 2026-05-09T00-22-50Z-amex-gold (the spec-defining POC). Most recent: 2026-05-20T08-24-15Z-amex-morgan-stanley-platinum. Each run produces the 5-file artifact set per Phase 2 spec §3 (manifest / candidate / qa-report / review-diff / run + sources/). Demonstrates the artifact-first flow exceeds Phase 2 spec v1 (multi-source, cross-source check, existing-data sanity check).","artifact_ids":"[]","metadata_json":"\"{\\\"run_count\\\":11,\\\"cards_covered\\\":[\\\"amex-gold\\\",\\\"chase-sapphire-reserve\\\",\\\"chase-sapphire-preferred\\\",\\\"amex-morgan-stanley-platinum\\\"]}\"","created_at":"2026-05-24T22:40:07.720Z"},{"id":"5c9f1d7b-7836-4a07-8cdd-f12eaf7e75d9","task_id":"opencard-card-adaptor-phase-2","actor_id":"claudecode@macmini","actor_type":"agent","event_type":"artifact","summary":"KC parallel work: scripts/card-adaptor/ CLI in active development. Commits 614c152b (5/16 review pipeline CLI) and c8867f9c (5/20 credits-only QA mode) ship features beyond Phase 2 spec v1.","body_markdown":"CLI commands documented: doctor, list, fetch, extract, normalize, validate, apply, review, community-check. Active dev — Claude Code should NOT touch this directory unless KC explicitly assigns. Aligned with methodology (pipeline proposes, reviewer decides).","artifact_ids":"[]","metadata_json":"\"{\\\"commits\\\":[\\\"614c152b\\\",\\\"c8867f9c\\\"],\\\"feature_lane\\\":\\\"KC-driven\\\"}\"","created_at":"2026-05-24T22:40:07.460Z"},{"id":"a430c740-ac11-4763-9182-98e737722c20","task_id":"opencard-claude-kacey-workflow","actor_id":"claudecode@macmini","actor_type":"agent","event_type":"note","summary":"docs/CLAUDE_KACEY_WORKFLOW.md §10 has 4 open questions awaiting KC decision: push policy, PR-vs-direct-to-main, can Claude edit data/cards mechanically, methodology drafts authority.","body_markdown":"Until §10 is answered Claude continues under stated v1 defaults: per-push approval, direct-to-main OK, never edit catalog without explicit ask, methodology = WIP-may-shift.","artifact_ids":"[]","metadata_json":"\"{\\\"source_doc\\\":\\\"docs/CLAUDE_KACEY_WORKFLOW.md\\\",\\\"open_questions\\\":4}\"","created_at":"2026-05-24T22:40:07.209Z"},{"id":"d9df262a-0a6b-499e-98b0-f91eebe12447","task_id":"opencard-cron-quality-sync","actor_id":"claudecode@macmini","actor_type":"agent","event_type":"handoff","summary":"2026-05-13 commit d4e60175: paused weekly card-updates cron schedule pending docs/MAINTENANCE_MODEL_REVIEW.md decision.","body_markdown":".github/workflows/card-updates.yml: schedule block commented out, workflow_dispatch preserved for one-off runs. Reversal = uncomment one line; no code change required. Rationale recorded in commit body: 50% hit rate + structural manual-vs-cron conflict means Model B (PR-generator) is incompatible with Kacey's parallel manual maintenance. Next cron would have fired 2026-05-18 12:00 UTC; this commit stopped it.","artifact_ids":"[]","metadata_json":"\"{\\\"commit\\\":\\\"d4e60175\\\",\\\"workflow_file\\\":\\\".github/workflows/card-updates.yml\\\",\\\"prevented_run\\\":\\\"2026-05-18T12:00Z\\\"}\"","created_at":"2026-05-24T22:40:06.933Z"},{"id":"068f9a07-ea90-4fea-b1b2-0ad212e20fab","task_id":"opencard-cron-quality-sync","actor_id":"claudecode@macmini","actor_type":"agent","event_type":"review","summary":"2026-05-13 PR triage complete: 14 merged ✅ / 6 closed 🔴 (regressions) / 6 closed 🟡 (cosmetic) / 1 held / 1 already merged = 28 disposed. Hit rate ~50%.","body_markdown":"Merged: #7, #12, #14, #15, #16, #17, #18, #19, #22, #23, #24, #25, #26, #28, #29. Closed (regressions): #4 amex-biz-gold MR→MR rename, #5 amex-biz-platinum 200K→300K hallucination, #8 marriott-brilliant 200K→125K from historical article, #9 amex-platinum $8K→$12K spend req, #13 chase-freedom-unlimited 250→200, #30 capital-one-spark-cash-select $6K→$4.5K from stale page. Closed (cosmetic): #6 (point_program abbreviation), #11 (is_elevated wrongly true on Venture), #20 (Prime Visa description synonym), #21 (already-discontinued rewording), #27 (BoA-biz-travel stale 2021.10 USCCG inheriting 'best ever' flag), #31 (VentureOne lost '$200 in travel' framing). Held: #10 Bilt Obsidian is_elevated. Critical structural finding: 4 of 4 PRs touching a card Kacey hand-edited on 5/8 (amex backfill) were 🔴 — Track 1 (cron, judges by 'issuer-current') vs Track 2 (Kacey manual, judges by 'public vs targeted framing') produce conflicting PRs deterministically.","artifact_ids":"[]","metadata_json":"\"{\\\"merged\\\":14,\\\"regressions_closed\\\":6,\\\"cosmetic_closed\\\":6,\\\"held\\\":1,\\\"hit_rate_real_updates\\\":\\\"~50%\\\",\\\"manual_conflict_rate\\\":\\\"4/4 amex hand-edited cards\\\"}\"","created_at":"2026-05-24T22:40:06.689Z"},{"id":"10fc9480-aa50-4aa4-9c54-b6920cc1aec8","task_id":"opencard-cron-quality-sync","actor_id":"claudecode@macmini","actor_type":"agent","event_type":"review","summary":"2026-05-11 12:00 UTC: scheduled cron fired → 28 bot PRs opened against catalog.","body_markdown":"First cron run after 5/10 gates + source swaps shipped. Gates blocked the 3 known HIGH regressions at extract-time (no PR opened for chase-hyatt / chase-ink-biz-unlimited / amex-gold legacy page). All sources failed count: 13 → 0. PR review-time burden surfaced.","artifact_ids":"[]","metadata_json":"\"{\\\"gh_cron_run\\\":\\\"2026-05-11T12:00Z\\\",\\\"prs_opened\\\":28,\\\"all_sources_failed\\\":0}\"","created_at":"2026-05-24T22:40:06.433Z"},{"id":"40f7e64b-4290-474c-867d-27e313c7e7fa","task_id":"opencard-source-swap-backlog","actor_id":"claudecode@macmini","actor_type":"agent","event_type":"note","summary":"2026-05-10 commit 63e02b23: closed §10.2 (keep barclays-ubereats file) + §10.3 (defer us-bank-harley-davidson successor).","body_markdown":"Cross-reference search found card_id 'barclays-ubereats' referenced in 17+ files outside data/cards/ (url-map.json, all-cards-index*.json, reference-list.json, 3 CFPB pipeline configs, CFPB extracted cache, recurring-credits staging, 4 check-reports). CFPB tracks barclays-ubereats.pdf as an independent filing → catalog distinction may reflect a real-world Uber Eats co-brand variant. Decision: keep file, refine discontinued_notes. For us-bank-harley-davidson successor: NerdWallet 403'd to WebFetch (cron UA likely also blocked), h-dvisa.com content sparse, USCCG has no review — creating the entry now would just produce another All-sources-failed card. Spawned research task to find a working source before catalog work.","artifact_ids":"[]","metadata_json":"\"{\\\"commit\\\":\\\"63e02b23\\\",\\\"resolved\\\":[\\\"barclays-ubereats keep\\\",\\\"us-bank-harley-davidson defer\\\"]}\"","created_at":"2026-05-24T22:40:06.190Z"},{"id":"d5a0ebae-34ad-4449-b6c9-b16ec1dfe43f","task_id":"opencard-source-swap-backlog","actor_id":"claudecode@macmini","actor_type":"agent","event_type":"note","summary":"2026-05-10 commit 73ea7842: applied 11-card source-swap backlog (8 URL swaps + 3 discontinued markers).","body_markdown":"URL swaps: 4 BoA business cards prepend USCCG and demote bankofamerica.com to fallback (SPA); 4 Barclays cards (JetBlue Plus + 3 Wyndham Earner variants) added USCCG as source[0] in previously-empty arrays. Discontinued markers: barclays-uber (Uber Visa converted to Barclays View Mastercard Oct 2021), barclays-ubereats (duplicate of barclays-uber but file kept due to ~17 cross-references), barclays-harley-davidson (transferred to U.S. Bank ~2024). loadCards() smoke test confirmed cards-loader.ts:66 skips the 3 discontinued cards. CARD_SOURCE_SWAP_BACKLOG.md updated to reflect 11/11 applied state.","artifact_ids":"[]","metadata_json":"\"{\\\"commit\\\":\\\"73ea7842\\\",\\\"url_swaps\\\":8,\\\"discontinued_markers\\\":3,\\\"verification\\\":\\\"loadCards() smoke test passed\\\"}\"","created_at":"2026-05-24T22:40:05.940Z"},{"id":"1c131c99-52e1-4106-9c5d-4de8c81d1634","task_id":"opencard-cron-quality-sync","actor_id":"claudecode@macmini","actor_type":"agent","event_type":"artifact","summary":"2026-05-10 commit 4dbd7ed1: added scripts/test-extract-gates.ts — 22 unit cases covering the regression scenarios + cashback exemption + threshold edges + window-boundary cases. 22/22 pass.","body_markdown":"Run with `npx tsx scripts/test-extract-gates.ts`. Validates each gate's positive + negative paths, including the deliberately conservative behavior of source_page_marked_discontinued (generic words near 'discontinued' fire the gate — false positive preferred over false negative).","artifact_ids":"[]","metadata_json":"\"{\\\"commit\\\":\\\"4dbd7ed1\\\",\\\"test_count\\\":22,\\\"passing\\\":22}\"","created_at":"2026-05-24T22:40:05.589Z"},{"id":"a52c42c6-e861-4b62-a69e-a6b224ebdeab","task_id":"opencard-cron-quality-sync","actor_id":"claudecode@macmini","actor_type":"agent","event_type":"note","summary":"2026-05-10 commit 4dbd7ed1: wired 3 Phase 2 §4 blocking gates into scripts/auto-update-cards/extract.ts + accepted 3xx in scrape.ts headCheck.","body_markdown":"Three gates exported as pure checker fns: checkPaidToFreeNoEvidence, checkPointsCollapse, checkSourcePageDiscontinued. Each throws on block; processCardCore catches and records error-<card_id>.json. Targets the 3 known HIGH regressions from 2026-05-09 dry-run. Also fixed headCheck rejecting 3xx redirects (caught amex-marriott-brilliant USCCG 301).","artifact_ids":"[]","metadata_json":"\"{\\\"commit\\\":\\\"4dbd7ed1\\\",\\\"files\\\":[\\\"scripts/auto-update-cards/extract.ts\\\",\\\"scripts/auto-update-cards/scrape.ts\\\"]}\"","created_at":"2026-05-24T22:40:05.267Z"},{"id":"67448b24-2939-476a-be27-4fbc0346403b","task_id":"opencard-cron-quality-sync","actor_id":"claudecode@macmini","actor_type":"agent","event_type":"note","summary":"2026-05-09 cron dry-run baseline: 50 cards processed → 13 All-sources-failed / 26 with changes / 4 low-confidence / 2 truncated. 15 HIGH-risk proposals contained 3 manually-flagged LLM regressions (chase-hyatt $95→$0, chase-ink-biz-unlimited 75K→750, amex-gold reading legacy USCCG page).","body_markdown":"GH run id: 25612748894. Origin of the 3 blocking gates and the source-swap backlog. Raw outcome bucket counts grounded every threshold in CARD_ADAPTOR_PHASE_2_SPEC.md §4.","artifact_ids":"[]","metadata_json":"\"{\\\"gh_run_id\\\":\\\"25612748894\\\",\\\"cards_processed\\\":50}\"","created_at":"2026-05-24T22:39:22.839Z"},{"id":"cf66679c-e25b-4024-8173-06fee6077e56","task_id":"opencard-claude-kacey-workflow","actor_id":"kaceyc@openclaw","actor_type":"agent","event_type":"review","summary":"Workflow proposal pending KC adoption: lane separation, explicit staging, no push/cron schedule changes without KC approval.","body_markdown":"Claude Code should read latest handoff and git status first; never touch KC-owned catalog data or methodology docs without explicit permission; actor id claude-code@kacey-mac-mini.","artifact_ids":"[]","metadata_json":"{}","created_at":"2026-05-24T18:10:27.149Z"},{"id":"7764aeeb-9042-4529-b40f-c5e8c11f3267","task_id":"opencard-cfpb-pipeline-disabled","actor_id":"kaceyc@openclaw","actor_type":"agent","event_type":"error","summary":"CFPB pipeline kill switch is active after annual_fee corruption; re-enable only after rewrite.","body_markdown":"scripts/pipelines/cfpb/_killswitch.py blocks data/cards writes unless ALLOW_DISABLED_PIPELINE=1. Reason: prior pipeline wrote annual_fee: 12 from monthly billing cycle text for ~24 cards.","artifact_ids":"[]","metadata_json":"{}","created_at":"2026-05-24T18:10:26.925Z"},{"id":"acbddaa4-4735-459c-a280-0603bf226449","task_id":"opencard-card-adaptor-phase-2","actor_id":"kaceyc@openclaw","actor_type":"agent","event_type":"artifact","summary":"Source doc: docs/CARD_ADAPTOR_PHASE_2_SPEC.md defines artifact-first v1 card-adaptor flow.","body_markdown":"Core decision: cron should stop opening PRs directly against catalog and instead write review artifacts; human/agent applies only after QA and approval.","artifact_ids":"[]","metadata_json":"{}","created_at":"2026-05-24T18:10:26.714Z"},{"id":"a068ba84-5208-4364-8575-ae397766e753","task_id":"opencard-source-swap-backlog","actor_id":"kaceyc@openclaw","actor_type":"agent","event_type":"artifact","summary":"Source doc: docs/CARD_SOURCE_SWAP_BACKLOG.md tracks 13-card source[0] swap backlog from 2026-05-09 dry-run.","body_markdown":"Key state: 2 fixed, 8 mechanical URL swaps, 3 discontinued records. Expected dry-run All sources failed count 13 -> 0 after committing 11 JSON edits.","artifact_ids":"[]","metadata_json":"{}","created_at":"2026-05-24T18:10:26.480Z"},{"id":"4544803f-7527-4dc9-9a1e-5e47d4389b64","task_id":"opencard-cron-quality-sync","actor_id":"kaceyc@openclaw","actor_type":"agent","event_type":"handoff","summary":"Actor ID convention set: Claude Code on Mac mini should use claude-code@kacey-mac-mini.","body_markdown":"Use claude-code@kacey-mac-mini for Claude Code sessions running on KC/Kacey Mac mini. Use kaceyc@openclaw for this OpenClaw runtime. Format: <agent-or-runtime>@<platform-or-host>.","artifact_ids":"[]","metadata_json":"{}","created_at":"2026-05-24T18:10:26.256Z"},{"id":"58b03449-0ce1-47a9-be9c-060a596d7464","task_id":"opencard-cron-quality-sync","actor_id":"kaceyc@openclaw","actor_type":"agent","event_type":"note","summary":"[needs-sync] Backfilled from Claude Code feedback: AgentHub was empty while repo contains multi-week OpenCard cron/adaptor work.","body_markdown":"Claude Code correctly flagged Project Report as stale: 0 tasks/artifacts/events in AgentHub versus repo state with cron blocking gates, source swap backlog, Phase 2 spec, CFPB pipeline disabled, workflow proposal, and 5/13 cron pause.","artifact_ids":"[]","metadata_json":"{}","created_at":"2026-05-24T18:10:26.050Z"},{"id":"417976c9-aa54-40f3-b1ad-0213bdeeaa98","task_id":"opencard-claude-kacey-workflow","actor_id":"kaceyc@openclaw","actor_type":"human","event_type":"note","summary":"Task created from WebUI","body_markdown":"Backfilled from docs/CLAUDE_KACEY_WORKFLOW.md. Defines lane separation: Claude can execute code-lane work, catalog data remains KC-owned, cron/schedule/external actions require explicit KC approval, and Claude writes handoff docs at session end.","artifact_ids":"[]","metadata_json":"{}","created_at":"2026-05-24T18:10:25.818Z"},{"id":"782fec47-1389-486b-b5e9-6e96d470a62d","task_id":"opencard-cfpb-pipeline-disabled","actor_id":"kaceyc@openclaw","actor_type":"human","event_type":"note","summary":"Task created from WebUI","body_markdown":"Backfilled from scripts/pipelines/cfpb/_killswitch.py and CFPB diagnosis docs. Pipeline is disabled after annual_fee corruption; do not re-enable until rewritten with fact store, sanity gates, and review queue.","artifact_ids":"[]","metadata_json":"{}","created_at":"2026-05-24T18:10:25.598Z"},{"id":"f066e5b5-9e6f-435b-9340-b529dc115104","task_id":"opencard-card-adaptor-phase-2","actor_id":"kaceyc@openclaw","actor_type":"human","event_type":"note","summary":"Task created from WebUI","body_markdown":"Backfilled from docs/CARD_ADAPTOR_PHASE_2_SPEC.md. Draft v1 proposes moving cron from direct PR/catalog writes to artifact-first runs under data/adaptor/runs/<run_id>, then QA/review/apply. Status remains draft/deferred pending KC maintenance model decision.","artifact_ids":"[]","metadata_json":"{}","created_at":"2026-05-24T18:10:25.367Z"},{"id":"0347fc82-332a-4c6c-81bd-66da62004c92","task_id":"opencard-source-swap-backlog","actor_id":"kaceyc@openclaw","actor_type":"human","event_type":"note","summary":"Task created from WebUI","body_markdown":"Backfilled from docs/CARD_SOURCE_SWAP_BACKLOG.md. 2026-05-09 dry-run had 13 All sources failed cards: 2 fixed, 8 mechanical URL swaps, 3 discontinued issuer-change records. Need confirm final commit/deploy state and whether cron failures dropped to zero.","artifact_ids":"[]","metadata_json":"{}","created_at":"2026-05-24T18:10:25.163Z"},{"id":"f5f480e2-ced4-494e-bc50-d9bac8aff30c","task_id":"opencard-cron-quality-sync","actor_id":"kaceyc@openclaw","actor_type":"human","event_type":"note","summary":"Task created from WebUI","body_markdown":"Backfilled from repo state: 2026-05-11 cron triggered 28 PR triage; reported result 14 merged / 6 closed / 1 held, followed by 2026-05-13 cron pause. Next step is to preserve the measured baseline and decide maintenance model before re-enabling scheduled catalog writes.","artifact_ids":"[]","metadata_json":"{}","created_at":"2026-05-24T18:10:24.945Z"}],"artifacts":[{"id":"opencard-art-maintenance-review","task_id":"opencard-cron-quality-sync","uploaded_by":"kaceyc@openclaw","kind":"file","name":"docs/MAINTENANCE_MODEL_REVIEW.md","storage_url":"repo:opencard/docs/MAINTENANCE_MODEL_REVIEW.md","content_type":"text/markdown","size_bytes":null,"metadata_json":"{\"backfill\":true}","created_at":"2026-05-24 18:11:19"},{"id":"opencard-art-source-swap-backlog","task_id":"opencard-source-swap-backlog","uploaded_by":"kaceyc@openclaw","kind":"file","name":"docs/CARD_SOURCE_SWAP_BACKLOG.md","storage_url":"repo:opencard/docs/CARD_SOURCE_SWAP_BACKLOG.md","content_type":"text/markdown","size_bytes":null,"metadata_json":"{\"backfill\":true}","created_at":"2026-05-24 18:11:19"},{"id":"opencard-art-phase-2-spec","task_id":"opencard-card-adaptor-phase-2","uploaded_by":"kaceyc@openclaw","kind":"file","name":"docs/CARD_ADAPTOR_PHASE_2_SPEC.md","storage_url":"repo:opencard/docs/CARD_ADAPTOR_PHASE_2_SPEC.md","content_type":"text/markdown","size_bytes":null,"metadata_json":"{\"backfill\":true}","created_at":"2026-05-24 18:11:19"},{"id":"opencard-art-methodology","task_id":"opencard-card-adaptor-phase-2","uploaded_by":"kaceyc@openclaw","kind":"file","name":"docs/CARD_ADAPTOR_METHODOLOGY.md","storage_url":"repo:opencard/docs/CARD_ADAPTOR_METHODOLOGY.md","content_type":"text/markdown","size_bytes":null,"metadata_json":"{\"backfill\":true}","created_at":"2026-05-24 18:11:19"},{"id":"opencard-art-gstack-workflow","task_id":"opencard-card-adaptor-phase-2","uploaded_by":"kaceyc@openclaw","kind":"file","name":"docs/card-adaptor-gstack-workflow.md","storage_url":"repo:opencard/docs/card-adaptor-gstack-workflow.md","content_type":"text/markdown","size_bytes":null,"metadata_json":"{\"backfill\":true}","created_at":"2026-05-24 18:11:19"},{"id":"opencard-art-cfpb-killswitch","task_id":"opencard-cfpb-pipeline-disabled","uploaded_by":"kaceyc@openclaw","kind":"file","name":"scripts/pipelines/cfpb/_killswitch.py","storage_url":"repo:opencard/scripts/pipelines/cfpb/_killswitch.py","content_type":"text/x-python","size_bytes":null,"metadata_json":"{\"backfill\":true}","created_at":"2026-05-24 18:11:19"},{"id":"opencard-art-cfpb-diagnosis","task_id":"opencard-cfpb-pipeline-disabled","uploaded_by":"kaceyc@openclaw","kind":"file","name":"docs/cfpb-pipeline-diagnosis-2026-04-22.md","storage_url":"repo:opencard/docs/cfpb-pipeline-diagnosis-2026-04-22.md","content_type":"text/markdown","size_bytes":null,"metadata_json":"{\"backfill\":true}","created_at":"2026-05-24 18:11:19"},{"id":"opencard-art-claude-workflow","task_id":"opencard-claude-kacey-workflow","uploaded_by":"kaceyc@openclaw","kind":"file","name":"docs/CLAUDE_KACEY_WORKFLOW.md","storage_url":"repo:opencard/docs/CLAUDE_KACEY_WORKFLOW.md","content_type":"text/markdown","size_bytes":null,"metadata_json":"{\"backfill\":true}","created_at":"2026-05-24 18:11:19"}],"markdown":"# OpenCard.ai — Project Report\n\n## 1. Project Snapshot\n\n- Project ID: opencard-ai\n- Status: active\n- Owner: KC\n- Last updated: 2026-05-24T04:29:43.502937+00:00\n- Channels linked: 5\n- Active tasks: 4\n- Tasks in review: 0\n- Blocked tasks: 2\n\n## 2. Goal / Definition of Done\n\nOpenCard.ai product, credit card database, card adaptor, TaiwanCard, benefits/wiki, and related channels.\n\n## 3. Channels / Context Streams\n\n- #card-adaptor (discord:1501593132083580968) — sync: important_only — OpenCard card adaptor and data ingestion pipeline\n- #taiwan-card (discord:1498096325122592911) — sync: important_only — TaiwanCard / Taiwan credit card tax benefits project\n- #credit-card-wiki (discord:1492386478746112023) — sync: important_only — OpenCard credit card wiki/database discussion\n- #unlock-lifestyle (discord:1490177843466993764) — sync: important_only — OpenCard lifestyle/unlock discussion\n- Category: Opencard.ai (discord:1495655435464868011) — sync: important_only — Discord category; all child channels inherit OpenCard.ai project context\n\n## 4. Active Tasks\n\n- opencard-cron-quality-sync — OpenCard cron quality sync / 5-11 triage backfill [blocked / urgent]\n  - Owner/worker: KC\n  - Updated: 2026-05-27T20:08:00-07:00\n- opencard-card-adaptor-phase-2 — OpenCard Card Adaptor Phase 2 artifact-first spec [planning / high]\n  - Owner/worker: KC+Claude\n  - Updated: 2026-05-27T20:08:00-07:00\n- opencard-cfpb-pipeline-disabled — OpenCard CFPB pipeline disabled / rewrite required [blocked / urgent]\n  - Owner/worker: KC+Claude\n  - Updated: 2026-05-27T20:08:00-07:00\n- opencard-adsense-longform-content — OpenCard AdSense approval: long-form editorial content [active / normal]\n  - Owner/worker: KC+Claude\n  - Updated: 2026-05-27T20:08:00-07:00\n\n## 5. Recent Activity\n\n- 2026-05-27T20:08:00-07:00 — KC / note: Kept blocked: maintenance model decision required\n- 2026-05-27T20:08:00-07:00 — KC / decision: Approved source swap backlog\n- 2026-05-27T20:08:00-07:00 — KC / note: Kept planning: depends on CFPB/cron policy\n- 2026-05-27T20:08:00-07:00 — KC / note: Kept blocked: CFPB pipeline requires rewrite\n- 2026-05-27T20:08:00-07:00 — KC / decision: Approved Claude/Kacey workflow proposal\n- 2026-05-27T20:08:00-07:00 — KC / status: Moved to active: content planning/writing next\n- 2026-05-26T06:20:54.240Z — claudecode@macmini / handoff: Session 2026-05-25 end. HEAD 685a81ca on origin/main. Session covered: AgentHub adoption + 17-event backfill + bug-hunting + AdSense pillar #1 shipped to prod. Local handoff doc at ~/Documents/opencard-session-2026-05-25-handoff.md.\n- 2026-05-26T06:18:26.181Z — claudecode@macmini / handoff: v1 merged to main via PR #33 (squash). Production: https://opencardai.com/en/guides/transferable-points-101. Branch deleted. Vercel prod deploy success.\n- 2026-05-26T06:13:25.308Z — claudecode@macmini / review: KC approved v1 preview 2026-05-25 (\"很好, 都改好了\"). Branch claude/adsense-guides-v1 (HEAD c89d7dc3) ready to merge to main. Awaiting KC decision on merge mechanism + whether to add nav link + scale to 3 pillars before merge or incrementally after.\n- 2026-05-26T06:06:34.953Z — claudecode@macmini / note: Fixed: KC noted tables rendered as literal text. Root cause: @next/mdx ships without GFM. Installed remark-gfm and added to createMDX options. New preview: https://opencard-m8x0gvd76-opencard-ais-projects.vercel.app/en/guides/transferable-points-101\n- 2026-05-25T05:20:43.715Z — claudecode@macmini / artifact: Vercel preview deploy live for KC review: https://opencard-bvi51yteb-opencard-ais-projects.vercel.app/en/guides/transferable-points-101\n- 2026-05-25T05:15:00.329Z — claudecode@macmini / review: v1 deliverable shipped (local commit 6d0009e3, not pushed): MDX scaffold + first pillar article. 8 new static pages prerender clean. Awaiting KC review before scaling to 3 pillars or adding nav link.\n\n## 6. Artifacts\n\n- file — docs/MAINTENANCE_MODEL_REVIEW.md — repo:opencard/docs/MAINTENANCE_MODEL_REVIEW.md\n- file — docs/CARD_SOURCE_SWAP_BACKLOG.md — repo:opencard/docs/CARD_SOURCE_SWAP_BACKLOG.md\n- file — docs/CARD_ADAPTOR_PHASE_2_SPEC.md — repo:opencard/docs/CARD_ADAPTOR_PHASE_2_SPEC.md\n- file — docs/CARD_ADAPTOR_METHODOLOGY.md — repo:opencard/docs/CARD_ADAPTOR_METHODOLOGY.md\n- file — docs/card-adaptor-gstack-workflow.md — repo:opencard/docs/card-adaptor-gstack-workflow.md\n- file — scripts/pipelines/cfpb/_killswitch.py — repo:opencard/scripts/pipelines/cfpb/_killswitch.py\n- file — docs/cfpb-pipeline-diagnosis-2026-04-22.md — repo:opencard/docs/cfpb-pipeline-diagnosis-2026-04-22.md\n- file — docs/CLAUDE_KACEY_WORKFLOW.md — repo:opencard/docs/CLAUDE_KACEY_WORKFLOW.md\n\n## 7. KC Review Checklist\n\n- What changed since last review?\n- What decision is needed from KC?\n- What risk should KC know?\n- What is the recommended next step?\n\n## 8. Agent README / Standard Operating Flow\n\nUse this section as the canonical handoff guide when another agent or platform takes over this project.\n\n### A. When taking over\n\n1. First read the local runtime / platform instructions for the environment you are operating in.\n   - OpenClaw: `AGENTS.md`, `SOUL.md`, `USER.md`, recent `memory/YYYY-MM-DD.md`; read `MEMORY.md` only in a private/main KC session, not in a shared channel.\n   - Claude Code / Codex / Cursor / other CLI agents: read `AGENTS.md`, `CLAUDE.md`, `GEMINI.md`, `.cursor/rules`, repo instructions, and `README.md` if present.\n2. Then read this Project Report from top to bottom.\n3. Check linked artifacts, repo state, PRs, deployments, and active task leases before editing.\n4. Treat Discord/chat history as supporting context only, not the primary source of truth.\n5. If the report conflicts with actual repo/deployment state, mark it as `[needs-sync]` and explain the real state.\n\n### B. While working\n\n1. Continue only active, review, or blocked tasks unless KC explicitly asks for new scope.\n2. Make small, verifiable changes and attach evidence: test/build output, screenshots, logs, PRs, or deployed URLs.\n3. Append progress/events/artifacts back to AgentHub so the next agent does not need to reconstruct context from chat.\n4. Ask one specific question when blocked; do not invent missing context.\n\n### C. Before handing off\n\nLeave a handoff note with:\n\n- Status: done / partially done / blocked\n- What changed\n- Verification performed and result\n- Artifacts: report, PR/commit, deployment, docs, logs, screenshots\n- Remaining work\n- Known issues / risks\n- Suggested next agent action\n- If blocked: the exact input needed from KC\n\n### D. Copy/paste handoff note template\n\n```md\n## Handoff Note\n\n### Status\nDone / Partially done / Blocked\n\n### What I completed\n- \n\n### Verification\n- Ran:\n- Result:\n- Evidence:\n\n### Artifacts\n- Report:\n- PR / commit:\n- Deployment:\n- Docs:\n- Logs / screenshots:\n\n### Remaining work\n- \n\n### Known issues / risks\n- \n\n### Suggested next agent action\n1. \n2. \n3. \n\n### If blocked\nNeed from KC:\n- \n```\n\n## 9. Agent Handoff Prompt\n\n```text\nYou are taking over this project on a new agent/platform.\n\nFirst read the local runtime/platform instructions for your environment.\nThen read this Project Report, especially the Agent README / Standard Operating Flow section.\nProject ID: opencard-ai\nUse actor id: <agent>@<platform-or-host>.\nCheck active tasks, leases, artifacts, repo state, PRs, and deployments before editing.\nContinue only remaining, active, review, or blocked tasks.\nAppend progress/events/artifacts back to AgentHub.\nBefore final delivery, verify against the KC Review Checklist.\nIf anything is stale or inconsistent, mark it as [needs-sync] and explain the actual state.\nDo not invent missing context. If blocked, ask one specific question.\n```\n"}