You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Charges-strip auto-matching: today the hub's "charges this period" strip is hand-fed evidence. Automate it:
Match Plaid transactions (linked accounts: Royal Credit Union; Citi is NOT linked — that gap is tracked in the account campaign, do not work around it) and Gmail receipt/card alerts to hub services, one row per charge with its source labelled (Plaid vs Gmail alert).
Unmatched charges that look like SaaS/AI vendors surface in the attention strip for manual classification, once, not repeatedly.
Full balances/debt stay in the finance tooling; the hub links out, per design §2.4.
Acceptance: strip populates from the daily morning-readout Plaid read + Gmail alerts with no manual copying; a charge is never double-counted across sources.
Agent: queue worker (repo-worker-code), lane C shift
Session / ID: queue task 2325 (triage)
Found via: queue claim · repo-health-code-pilot
Task: Triage verdict — CONFIRMED feasible, all inputs live (verified 2026-10-29):
Plaid: connector status = connected, 4 linked institutions; transactions-get reads an inclusive date range. The Citi gap stands exactly as filed (account campaign owns it; this work does not work around it).
Gmail: connector status = connected; search/read reaches receipt/card alert mail.
Hub side:pm-stack/aggregator already serves the /quota charges evidence strip (/api/quota.json extended with charges) and already accepts Muse-side poster feeds for external data — the matcher plugs into the daily collector flow, it does not need a new hub surface.
Pinned for the fix: one row per charge with source labelled (Plaid vs Gmail alert); cross-source dedupe on amount + normalized merchant + date window, Plaid as source of record on a tie; unmatched SaaS/AI-looking charges surface in the attention strip once (persisted state, never repeatedly); no balances/debt in the hub (links out, design §2.4).
Expectation: small_fix enqueued (dedupe repo-health:v1:fix:developing-today/code:issue:1057; packet hidden_files/packet-2325-fix.json). Issue stays open for that task.
agent-note:v1
state: triaged (coverage pass)
Coverage pass 2026-11-03: reviewed in the fleet-wide per-issue pass (drift / overlap / already-handled / stale / blockers / ordering). Verdict: still live; queued in repo-health-code-pilot as triage at priority 30 (priority/none). If this is already handled at current main, the triage closes it with evidence; if it needs splitting, the triage files the split.
Found via: coverage pass 2026-11-03
Triage verdict: DONE — closing (the issue was left open after the final done note)
The last note here (2026-10-29T09:20Z, "done") recorded the acceptance step verified live, but the issue was never re-closed after the 2026-10-29T05:45Z reopen (timeline checked fresh — no close event after the reopen). Re-verified today, 2026-11-03:
Implementation on main (1e3763faf4)
pm-stack/aggregator/src/charges-match.ts — cross-source dedupe + service matching; matched rows carry source: "Plaid" or "Gmail alert".
Live acceptance, checked this run — GET https://amd-6.raptor-pumpkinseed.ts.net/api/quota.json returns a charges array containing auto rows in the matcher's own source format, including two dated today: 2026-11-03 OpenCode $10 (Gmail alert) and 2026-11-03 Command Code $1.36 (Gmail alert), matched to service labels. No duplicate of either is present from the hand-fed set, so the no-double-count merge is holding in the published feed. Unmatched SaaS/AI items are in the attention strip (5 items, persisted-state behaviour unchanged).
Not in scope / not touched: the Citi link gap (account campaign), balances/debt (finance tooling). Charge identity/lifecycle as a contract is a separate design tracked in #3161 — not a regression here.
Activity
developing-today commentedon Oct 27, 2026
CODE-202
dezren39 commentedon Oct 29, 2026
🤖 Agent note · triaged
status= connected, 4 linked institutions;transactions-getreads an inclusive date range. The Citi gap stands exactly as filed (account campaign owns it; this work does not work around it).status= connected; search/read reaches receipt/card alert mail.pm-stack/aggregatoralready serves the /quota charges evidence strip (/api/quota.jsonextended withcharges) and already accepts Muse-side poster feeds for external data — the matcher plugs into the daily collector flow, it does not need a new hub surface.95 remaining items
Merge pull request #2467 from developing-today/queue/2990-1057-charge…
dezren39 commentedon Nov 3, 2026
agent-note:v1
state: triaged (coverage pass)
Coverage pass 2026-11-03: reviewed in the fleet-wide per-issue pass (drift / overlap / already-handled / stale / blockers / ordering). Verdict: still live; queued in repo-health-code-pilot as triage at priority 30 (priority/none). If this is already handled at current main, the triage closes it with evidence; if it needs splitting, the triage files the split.
Found via: coverage pass 2026-11-03
dezren39 commentedon Nov 3, 2026
🤖 Agent note · done (closed with evidence)
478797cd) · live/api/quota.jsonTriage verdict: DONE — closing (the issue was left open after the final done note)
The last note here (2026-10-29T09:20Z, "done") recorded the acceptance step verified live, but the issue was never re-closed after the 2026-10-29T05:45Z reopen (timeline checked fresh — no close event after the reopen). Re-verified today, 2026-11-03:
Implementation on main (
1e3763faf4)pm-stack/aggregator/src/charges-match.ts— cross-source dedupe + service matching; matched rows carrysource: "Plaid"or"Gmail alert".pm-stack/aggregator/src/charges-collect.ts—mergeChargeRows(auto rows first, hand-fed rows not double-counted),filterNewUnmatched(surfaced-once state).pm-stack/aggregator/scripts/produce-charge-candidates.ts+confirm-charges-surfaced.ts— the producer/confirm side, since extended with staged-input mode (Split charge-candidates producer: staged inputs staged on the sandbox, producer runs on the laptop #4641) and staged-manifest period validation (aggregator(charges-producer): staged mode never validates the manifest period — a field-less manifest writes a candidates file with period {} and exits 0 #4663), so the pipeline has kept being maintained.charges-match.test.ts,charges-collect.test.ts,charges-feed-gate.test.ts,charges-push.test.ts,produce-charge-candidates.test.ts.Live acceptance, checked this run —
GET https://amd-6.raptor-pumpkinseed.ts.net/api/quota.jsonreturns achargesarray containing auto rows in the matcher's own source format, including two dated today:2026-11-03 OpenCode $10 (Gmail alert)and2026-11-03 Command Code $1.36 (Gmail alert), matched to service labels. No duplicate of either is present from the hand-fed set, so the no-double-count merge is holding in the published feed. Unmatched SaaS/AI items are in the attention strip (5 items, persisted-state behaviour unchanged).Not in scope / not touched: the Citi link gap (account campaign), balances/debt (finance tooling). Charge identity/lifecycle as a contract is a separate design tracked in #3161 — not a regression here.
Closing as complete.