Tasks — add-polyfill-connector-system

tasks85/90
Created openspec/changes/add-polyfill-connector-system/tasks.mdView on GitHub →

Legend: [x] done, [~] in progress, [ ] pending, [!] blocked on user, [?] needs Tim's review on return.

Last revised: 2026-04-24.

Split-out follow-ups (2026-04-24)

The running connector-system change remains the home for MVP fleet operation, connector-specific live bugs, and near-term infrastructure. Three large backlog clusters have been split out so workers can execute them without dragging the entire connector program forward at once:

  • add-polyfill-layer-two-stream-coverage owns high-value stream additions and the Spotify/Reddit fake-data cleanup before those connectors are used as internal-demo evidence.
  • add-connector-fixture-scrubber-pipeline owns raw capture, scrubbed fixture generation, and connector-specific redaction rules.
  • define-partial-run-honesty owns skipped-stream/gap taxonomy, known-gaps summaries, and recovery hints.

Status at a glance (2026-04-21)

  • 31 manifests total (30 + Chase added 2026-04-21). All validate against the reference AS.
  • 951,313 real records across 8 active connectors in a unified 2.8 GB DB (polyfill.sqlite):
    • slack 349,139 · claude-code 235,757 · codex 74,033 · gmail 50,407 · ynab 21,513 · chatgpt 11,341 · github 8,608 · usaa 924
  • Data provenance caveat: any local Spotify or Reddit rows currently visible in the reference DB are not trusted as Tim-account data. Treat them as seed/demo/fake population until they are purged and replaced by a verified real-account ingest.
  • All 8 connectors' most recent run committed state successfully.
  • Browser daemon retired 2026-04-25 (openspec/changes/retire-browser-daemon). The original USAA session-token-on-exit motivation never made it into the production runtime — the runtime path always launched per-connector isolated patchright profiles via acquireIsolatedBrowser. Re-auth on each run via ensureSession is the supported pattern for short-server-session sites.
  • Fleet-wide JSONL correctness fixes: U+2028/U+2029 escape + BigInt coercion + stdout backpressure drain in src/safe-emit.js; Gmail 887-record crash and Slack 1,716-record truncation both traced to these.
  • USAA: credit-card CSV export working; PDF parser handles trailing-minus currency, non-statement filter, and year-assignment for December-on-January-statement cases.
  • Slack: 24 GB archive, 196k distinct messages, 0 missing thread parents; retry-budget bump (config/slackdump-api-config.toml) resolves eng_github-class 500-error cascade.
  • Chase v0.1 scaffolded: manifest + auto-login probe + design-notes/chase.md (QFX-over-browser strategy; Direct Connect rejected per research). Auto-login probe verified end-to-end through full 2FA including mds-* shadow DOM.
  • Reference-impl fix: express.json body limit 100kb → 100mb so claude-code's file_mtimes cursor stops 413'ing state commits.
  • Three new open-question notes documenting the partial-data honesty mechanism (decision deferred; must be decided together):
    • partial-run-semantics-open-question.md (production side)
    • cursor-finality-and-gap-awareness-open-question.md (memory side)
    • gap-recovery-execution-open-question.md (execution side, with 4-category skip taxonomy)
  • Blob-hydration + storage-topology notes extended with Slack's 24 GB concrete scale data — rules out SQLite BLOB column, suggests hybrid content-addressed filesystem + metadata.

Per-connector status

ConnectorStatusRecords in RSNotes
ynab✅ done21,513Tombstones via op=delete. server_knowledge cursor is gap-free by construction.
gmail✅ done50,407IMAP + app password. BigInt crash fixed 2026-04-20 (shared stringifyForJsonl coerces BigInt; was dropping 887 records + state per run).
chatgpt✅ done11,341Browser fetch, tree-walk, bearer from #client-bootstrap. 4,188 durably-logged http_429 skips await the gap-recovery mechanism (see chatgpt.md).
usaa🟡 regression924accounts, transactions, statements, inbox_messages, credit_card_billing. Credit-card CSV export fixed 2026-04-20 (.as_credit__export selector, startDate input name). 2026-04-24 live run failed before browser interaction with net::ERR_HTTP2_PROTOCOL_ERROR on https://www.usaa.com/my/logon; investigate Playwright/network/session setup before calling USAA done again. 2026-04-25 schema replay flagged 6/924 records as drift: 4 transactions with currency: undefined and 1 with empty original_description from a 2026-04-19 emit batch that pre-dates the current parsers (today's csvRowToTransaction and buildStatementRecords set currency: "USD" and pass through original_description). 1 statement with empty account_reference from the same era. Schema is correct; current connector is correct. Data cleanup, not parser change: re-ingest the affected period to overwrite the stale-shaped historical records once the live-login regression is resolved. Do not loosen schemas.
claude_code✅ ingest fixed235,7572.8 GB DB. state_streams_committed: 4/4 historically after the 413 fix. 2026-04-24 live run showed >1k IN_PROGRESS rows then failed /ingest/sessions with 500 Internal Server Error; root cause was controller-managed runtime ingest using the public composed web origin instead of the internal RS URL. Progress volume remains a separate follow-up.
codex✅ done74,0330 nulls, 0 drops across function_calls + messages + sessions.
amazon🟡 v0.1 in progress02FA-on-wife's-phone blocker resolved 2026-04-21 (new account). Auto-login verified end-to-end (#ap_email_login + #ap_password selectors, OTP via INTERACTION). fetchOrderDetail intentionally stubbed pending live DOM probe. Manifest overclaims ~11 fields (see amazon.md).
chase✅ v0.1 working16 (1 account, 14 txns, 1 balance)NEW 2026-04-21. End-to-end: auto-login via src/auto-login/chase.js (mds-* shadow DOM, text/role locators per Playwright best practices), discover accounts via #accounts-name-link-button-<id>-label pattern, QFX download via mds-select#downloadFileTypeOption + mds-button#download, parse via ofx-js. Only credit card so far (account-param CARD,BAC); checking/savings param shapes are placeholders. v0.2: date-range support (currently "Current display" ~30 days), statement PDFs.
github✅ (fixed 2026-04-24)8,608PAT auto-created via bin/bootstrap-github-pat.js (headless login → INTERACTION for 2FA → PAT form → token written to .env.local). Earlier progress_for_undeclared_stream failure was controller path-resolution colliding on connector_id; see GitHub section below.
oura🟡 ready0Awaits OURA_PERSONAL_ACCESS_TOKEN.
spotify🚫 blocked upstream + data cleanup0 trustedSpotify froze new developer app creation in Feb 2026; OAuth-only anyway. Any local Spotify records are seed/demo/fake population, not Tim account data. Purge those rows or mark them non-trusted before using dashboard/API counts as evidence. Keep manifest, revisit real-account ingest when Spotify re-opens.
strava🟡 ready0Awaits STRAVA_ACCESS_TOKEN.
notion🟡 ready0Awaits NOTION_API_TOKEN.
reddit🟡 ready + data cleanup0 trustedAwaits Reddit credentials; cursor fix landed. Any local Reddit records are seed/demo/fake population, not Tim account data. Purge those rows and re-ingest from Tim's Reddit credentials before using dashboard/API counts as evidence.
pocket🚫 deprecated0Mozilla shut Pocket down 2025-07-08; all user data deleted 2025-10-08. Excluded from register-all. Connector retained as historical reference only.
slack✅ done349,139slackdump subprocess, 24 GB archive, 196k messages, 73k reactions, 57k attachments, 17k files, 973 channels, 292 users, 0 missing thread parents. Retry-budget config + backpressure drain landed 2026-04-20.
anthropic🟡 scaffolded0Selectors TBD; needs live DOM walk.
shopify🟡 scaffolded0Selectors TBD.
heb🟡 scaffolded0Selectors TBD.
wholefoods🟡 scaffolded0Piggybacks on Amazon session; selectors TBD.
linkedin🟡 scaffolded0Selectors TBD.
meta (Instagram)🟡 scaffolded0Selectors TBD.
loom🟡 scaffolded0Selectors TBD.
uber🟡 scaffolded0Selectors TBD.
doordash🟡 scaffolded0Selectors TBD.
whatsapp✅ file-based0Drop .txt exports in ~/.pdpp/imports/whatsapp/.
google_takeout✅ file-based0Extract into ~/.pdpp/imports/google_takeout/.
twitter_archive✅ file-based0Extract into ~/.pdpp/imports/twitter_archive/.
imessage✅ file-based0Auto-discovers ~/Library/Messages/chat.db.
apple_health✅ file-based0Extract into ~/.pdpp/imports/apple_health/.
ical✅ file-based0Drop .ics files or set ICAL_SUBSCRIPTION_URL.

Infrastructure (delivered)

  • bin/bootstrap-github-pat.js — headless PAT creation with 2FA via INTERACTION. Pattern replicable for other PAT-capable platforms.
  • src/interaction-handler.js — canonical onInteraction handler for CLI (file drop + TTY + ntfy)
  • Shared src/scope-filters.js helper (resourceSet, passesTimeRange, passesResourceFilter, makeEmitGate, emitTombstones, requireCredentialsOrAsk)
  • Shared src/browser-scraper-runtime.js harness with optional ensureSession hook
  • src/auto-login/{usaa,amazon,chatgpt}.js — stored-creds + 2FA-via-ntfy helpers
  • bin/register-all.js — smoke test that all manifests parse + validate
  • Orchestrator respects PDPP_DB_PATH env override (enables parallel runs into separate DBs)
  • flushAndExit(code) fix in every connector — prevents JSONL truncation at end of run
  • filesystem: {} binding exposed by runtime (buildAvailableBindings) — enables local-file connectors

Infrastructure (still pending)

  • Browser daemon — long-lived Chromium, CDP-attached, session cookies persist across runs. pdpp-connectors browser start|stop|status|restart|logs CLI. Resolves the USAA session-token-on-process-exit problem documented in the 2026-04-20 Opus research. Superseded 2026-04-25 by openspec/changes/retire-browser-daemon. Production runtime never used the daemon path; the per-connector isolated patchright profile in acquireIsolatedBrowser is the only remaining browser-launch primitive.
  • Session keep-alive probes (scripts/session-keepalive.mjs) — 8-min interval ping against Chase + Amazon authenticated URLs.
  • Scheduler persistence (SQLite-backed run_history + last_run_time)
  • Inbox module (reference-implementation/server/inbox.js) + routes + minimal HTML (reference-impl concern)
  • ntfy bridge module — exists at src/ntfy.js, used by scheduler-runner and the new CLI interaction handler
  • Orchestrator CLI now wires onInteraction — file-drop response + ntfy + TTY prompt. Runs that need creds/OTP no longer fail silently.
  • Pause/resume INTERACTION handling — runtime supports parking, scheduler doesn't read the state yet
  • [~] First-party connector progress reporting pass — audit core connectors and emit PROGRESS { count, total } wherever the upstream exposes a bounded unit of work (pages, files, accounts, budgets, repositories, archive entries). Connectors that cannot know a total should still report phase/count honestly. Do not invent percentages.
    • 2026-04-24 worker pass patched bounded counters for ynab, gmail, github PR search, chase, usaa statement hydration, and chatgpt conversation detail batches; compacted duplicate Claude Code line progress. Audit captured in design-notes/core-connector-progress-audit-2026-04-24.md.
  • Nightly status summary via ntfy — today still fires manually
  • Partial-run honesty mechanism transferred to define-partial-run-honesty (SKIP_RESULT taxonomy, known gaps, and recovery contract). The three linked *-open-question.md notes remain as source context.

Spec-conformance work (delivered today)

See design-notes/spec-conformance-upgrade-2026-04-19.md for the full retrofit table. Summary:

  • All 28 connectors honor the resources filter on every stream
  • Mutable-state connectors emit tombstones (op=delete) where the upstream exposes deletion signals (YNAB, Notion, Pocket, Gmail). Others deferred — see note below.
  • Runtime-binding violations now emit INTERACTION kind=missing_credentials instead of failing silently
  • Reddit cursor replaced with sinceEpochUtc stop-condition in paginate() — resolves duplicate-across-runs bug
  • flushAndExit pattern applied to every connector
  • USAA unattended re-auth (OTP via INTERACTION → ntfy → Tim's phone → wife's-phone forward)
  • USAA brought to 5 streams (was 1)
  • Amazon / ChatGPT re-auth via ensure-session helpers

Claude Code + Codex (delivered today)

  • connectors/claude_code/index.js + manifests/claude_code.json — parses ~/.claude/projects/**/*.jsonl, emits sessions/messages/attachments. Incremental via file-mtime.
  • connectors/codex/index.js + manifests/codex.json — parses ~/.codex/sessions/YYYY/MM/DD/rollout-*.jsonl, emits sessions/messages/function_calls. Reasoning encrypted-content skipped intentionally.
  • Runtime filesystem binding exposed (buildAvailableBindings)
  • Content preview capped at 5 KB (down from 20 KB) — plenty of signal, 4× smaller payloads
  • PROGRESS every 2000 lines so long parses show liveness
  • CLAUDE_CODE_PROJECT_INCLUDE/EXCLUDE env vars for optional scoping (trigger for the open-question note)
  • Historical live-run note: Claude Code ingest status is no longer tracked as an evergreen in-progress checkbox here. Current Claude Code bugs and Layer 2 gaps are tracked in the dedicated section below and add-polyfill-layer-two-stream-coverage.
  • Historical live-run note: Codex ingest status is no longer tracked as an evergreen in-progress checkbox here. Current Codex Layer 2 gaps are tracked in the dedicated section below and add-polyfill-layer-two-stream-coverage.

OpenSpec hygiene

  • Change proposal written
  • Design.md written
  • tasks.md updated (this file, 2026-04-19 EOD)
  • design-notes/0-overnight-summary.md — 2026-04-19 morning
  • design-notes/spec-conformance-upgrade-2026-04-19.md
  • design-notes/unattended-operation.md
  • design-notes/connector-configuration-open-question.md — new today
  • design-notes/settings-stream-convention-open-question.md — new today (Layer 2 cross-cutting)
  • design-notes/usaa-extra-streams.md
  • New design-notes/claude-code-codex-connectors.md — rationale + schema decisions for the two local-file connectors.
  • Move OpenAI/Anthropic token data from "scaffolded" to "implemented" once selectors wired

Post-refactor quality follow-up (owner-approved 2026-04-23)

This section captures the durable outcome of the A++ follow-up review. It is the canonical execution list; the temporary response memo can be deleted once these tasks are tracked here.

Tranche A — establish truth first

  • Compare every decomposed connector against the last pre-decomposition commit before changing behavior. Output must be a short matrix: connector, last pre-decomp commit, material differences, intentional vs regression, required action.
  • Replace hand-rolled integration emitRecord mocks with a helper that runs the real shape validator and records both emitted and skipped records.
  • Audit the remaining @ts-expect-error directives inside page.evaluate() and remove them unless they are still genuinely required.
  • Investigate the apple_health parser timeout hypothesis and record whether it was warmup-only or a real pathological test.

Tranche B — remove accidental complexity

  • Replace the current collect-helpers.ts workaround with a small explicit entrypoint helper (isMainModule() / runConnectorIfMain() or equivalent) without overloading runConnector() with process-launch semantics.
  • Add package-scoped CI for packages/polyfill-connectors/** running verify and test. Start non-blocking first; only promote to required after a proving period.

Tranche C — behavior correction, only after Tranche A

  • Standardize connector emit ordering on parent-first, after the pre-decomposition audit confirmed gmail/chatgpt/claude_code child-first behavior was intentional pre-existing behavior rather than decomposition drift.
  • Update packages/polyfill-connectors/docs/authoring-guide.md so connector authors can rely on parent-first explicitly. Owner decision: keep parent-first as the reference-quality default because the live-ingest contract benefits outweigh the measured wall-clock cost on large real corpora. This is a connector/runtime quality rule, not a core PDPP protocol requirement. Connector-specific exceptions require explicit owner sign-off after benchmarked evidence.

Tranche D — narrow protocol proof

  • Build a subprocess-level protocol harness as a narrow Phase 1 only. Success criteria: one non-browser connector test, one browser connector test, and evidence that the harness catches something helper-level tests do not.
    • 2026-04-24 worker lane added runConnectorProtocolSubprocess, proving START over stdin through RECORD / STATE / PROGRESS / SKIP_RESULT to DONE over stdout against a real child process. Coverage is synthetic and no-network: one non-browser fixture plus one browser-shaped no-browser fixture. The harness also rejects a child that exits without terminal DONE, covering process/stdio failure modes direct makeRecordingEmit helper tests cannot observe.
  • Decide on wider rollout of protocol subprocess tests only after Phase 1 proves stable and worth the maintenance cost.
    • Decision: do not roll this out across the live connector fleet yet. Keep the subprocess harness as a narrow protocol sentinel because Phase 1 proves useful coverage for bootstrap/stdout/DONE behavior, but fleet-wide subprocess tests would duplicate existing collect-layer coverage and add maintenance cost around auth, fixtures, and browser setup. Add connector-specific subprocess cases only when a connector introduces a new entrypoint/auth/bootstrap pattern or regresses at the process boundary.

Explicitly deferred unless evidence changes

  • Do not spend effort balancing parser-vs-integration test counts for aesthetic reasons. Reassess only if real blind spots remain after the protocol-harness phase.
  • Do not rewrite history for commit-aesthetics cleanup.
  • Do not add clever staged/unstaged merge machinery to lefthook unless a concrete reproducible data-loss case is demonstrated. If hook behavior becomes a real problem, prefer the simpler guard: refuse auto-format on partially staged same-file changes.

Deferred / open

  • Tombstones for additional mutable_state streams. ChatGPT has no "deleted conversations" signal. USAA statements are append-only. ChatGPT memories mutate; needs a follow-up pass.
  • USAA transfers, bill_payments, scheduled_transactions, external_accounts streams. Covered by design-notes/usaa-extra-streams.md; wiring pending.
  • USAA history beyond 18 months. Statement-PDF parsing is the likely path; design not started.
  • Browser connector selector-wiring. Nine connectors scaffolded but need live co-pilot DOM walks.
  • Connector configuration surface. Open question — manifest-declared credentials_schema + options_schema. See design-notes/connector-configuration-open-question.md. Decision paused pending RFC.
  • RS storage topology. Open question — one DB per owner vs. per connector, or both under a unified query surface. See design-notes/rs-storage-topology-open-question.md. Today Codex is split out under PDPP_DB_PATH to dodge SQLITE_BUSY; the split was tactical, not chosen.
  • Credential storage. Open question — .env.local plaintext is the wrong answer for anything beyond single-user laptop dev. See design-notes/credential-storage-open-question.md. Vault interface proposed; decision paused.
  • External-tool dependencies. Open question — runtime_requirements.external_tools for subprocess binaries like slackdump (AGPL), osxphotos, Playwright browsers. Today invisible to spec, consent card, and auditors. See design-notes/external-tool-dependencies-open-question.md.
  • Layer 2 manifest completeness. Open question — does a polyfill manifest commit to a coverage contract against the source's actual surface? See design-notes/layer-2-completeness-open-question.md.
  • Owner self-export. Open question — should the RS expose a canonical owner-facing GET /v1/connectors / bulk-export surface? See design-notes/owner-self-export-open-question.md.
  • Identity graph. Open question — should cross-connector followers/friends/orgs be promoted to a standard identity_graph profile? See design-notes/identity-graph-open-question.md.
  • Settings/preferences stream convention. Open question — normalized settings stream shape across connectors. Every connector has user-authored settings; today most omit them. See design-notes/settings-stream-convention-open-question.md.
  • SillyTavern re-ingest. Tim confirmed he wants it included. Re-run after current pass finishes (no EXCLUDE).
  • Spotify/Reddit fake-data cleanup. Local rows for Spotify and Reddit must be treated as seed/demo/fake population until proven otherwise. Before internal demo or assistant evaluation, purge those rows from the reference DB and either re-ingest from Tim-owned credentials (Reddit) or keep the connector visibly blocked/untrusted until real-account access exists (Spotify).

Layer 2 implementation follow-up (raised 2026-04-19)

P0 stream additions identified by the Layer 2 audits (design-notes/layer-2-coverage-chatgpt-claude-codex.md, design-notes/layer-2-coverage-gmail-ynab-usaa-github.md) have been transferred to add-polyfill-layer-two-stream-coverage. The checklist below is retained as historical source material and intentionally marked transferred rather than implemented.

Query/API readiness follow-up (raised 2026-04-24)

These are the highest-leverage gaps surfaced by live assistant use of the reference API. Start with an audit matrix before adding new surface area: field/stream, current manifest declaration, current server behavior, docs/spec claim, tests, and recommended fix.

  • Audit first-party stream schemas for useful range-filter declarations. Add every honest date/date-time/numeric query.range_filters entry that enables common windows like "last 7 days" or amount windows; document exclusions where field types, cursor semantics, or source data quality make range filtering unsafe. See design-notes/query-api-readiness-audit-2026-04-24.md.
  • Schema discoverability audit and implementation completed by define-field-level-query-capability-schema and archived into canonical specs.
  • expand[] audit and implementation completed by enable-safe-parent-child-expand and archived into canonical specs.
  • changes_since initial-bookmark usability completed by define-initial-changes-bookmark and archived into canonical specs.
  • Gmail attachment byte/blob hydration completed by hydrate-gmail-attachment-blobs and archived into canonical specs.
  • Public surfaces such as /v1/timeline, /v1/entities, hybrid search, semantic reranking, webhooks, and broader facets remain deferred until proposed as separate OpenSpec changes.

ChatGPT

  • Transferred to add-polyfill-layer-two-stream-coverage: add custom_gpts stream (from /backend-api/gizmos/mine).
  • Transferred to add-polyfill-layer-two-stream-coverage: add custom_instructions stream (from /backend-api/user_system_messages).
  • Transferred to add-polyfill-layer-two-stream-coverage: add shared_conversations stream (from /backend-api/shared_conversations).
  • Transferred to add-polyfill-layer-two-stream-coverage: re-run after ChatGPT extractor fix lands in next scheduled run.

Claude Code

  • Fix live sessions ingest regression: current run can emit >1k IN_PROGRESS events then fail /ingest/sessions with 500 Internal Server Error. Captured with a safe synthetic Claude Code sessions fixture: controller-managed composed-mode runs were posting the NDJSON sessions batch to the public browser origin, so proxy/body handling could turn /v1/ingest/sessions into a 500. Regression test now traps the public origin and proves Claude Code ingest uses the internal RS URL.
  • Reduce or summarize Claude Code two-pass progress volume. The >1k IN_PROGRESS rows were not the 500 root cause, but the connector currently emits per-file parse progress in both build and emit passes; decide whether to compact connector progress or summarize it in the operator UI.
    • 2026-04-24 worker pass keeps build-pass per-file liveness, suppresses duplicate build-pass per-line progress, and labels file progress as indexing vs emitting.
  • Transferred to add-polyfill-layer-two-stream-coverage: recursive session traversal for projects/<p>/<session>/subagents/*.jsonl + /tool-results/*.txt.
  • Transferred to add-polyfill-layer-two-stream-coverage: add memory_notes stream (from projects/<p>/memory/*.md).
  • Transferred to add-polyfill-layer-two-stream-coverage: add skills stream (from ~/.claude/skills/<name>/SKILL.md).
  • Transferred to add-polyfill-layer-two-stream-coverage: add slash_commands stream (from ~/.claude/commands/*.md + per-repo ./.claude/commands/*.md).

Codex

  • Transferred to add-polyfill-layer-two-stream-coverage: evaluate ~/.codex/state_5.sqlite#threads for canonical session metadata.
  • Transferred to add-polyfill-layer-two-stream-coverage: add prompts stream (from ~/.codex/prompts/*.md).
  • Transferred to add-polyfill-layer-two-stream-coverage: add skills stream (from ~/.codex/skills/<name>/SKILL.md).
  • Transferred to add-polyfill-layer-two-stream-coverage: add approval_rules stream (from ~/.codex/rules/default.rules).

GitHub

  • Fix progress_for_undeclared_stream regression. Root cause was controller path resolution, not the GitHub connector: the reference fixture manifest and the polyfill manifest share connector_id https://registry.pdpp.org/connectors/github, and reference-implementation/runtime/controller.ts matched the reference fixture id first — so polyfill GitHub runs executed the reference seed connector, whose GitHub fixture emits a commits PROGRESS stream the polyfill manifest does not declare. The 2026-04-24 worker audit also confirmed the current GitHub polyfill connector emits PROGRESS only for declared streams (user, repositories, starred, issues, pull_requests, gists). Fix: resolveDefaultConnectorPath now compares a manifest fingerprint (version + sorted stream names) against the on-disk reference and polyfill manifests and prefers the polyfill implementation on collision. Regression covered by reference-implementation/test/connector-path-resolution.test.js.
  • Transferred to add-polyfill-layer-two-stream-coverage: evaluate issues stream (authored, assigned, mentioned, commented).
  • Transferred to add-polyfill-layer-two-stream-coverage: evaluate pull_requests stream (authored, reviewed, review-requested, merged).
  • Transferred to add-polyfill-layer-two-stream-coverage: evaluate gists stream.
  • Transferred to add-polyfill-layer-two-stream-coverage: evaluate followers / following streams.

YNAB

  • Transferred to add-polyfill-layer-two-stream-coverage: add month_categories matrix stream.

USAA

  • Fix live login navigation regression: current run fails immediately with connector_reported_failed / usaa_session_failed: page.goto: net::ERR_HTTP2_PROTOCOL_ERROR at https://www.usaa.com/my/logon and never surfaces a browser interaction. Reproduce with browser-daemon logs enabled, compare headed vs headless, and preserve an interaction path if the site blocks automated navigation.
  • Transferred to add-polyfill-layer-two-stream-coverage: wire already-designed streams (transfers, bill_payments, scheduled_transactions, external_accounts).
  • Transferred to add-polyfill-layer-two-stream-coverage: implement statement PDF download + pdf_sha256 once live browser session is available.

Gmail

  • message_bodies stream — implemented 2026-04-19 (Layer 2 exemplar fix: body_sha256 + text/html parts, deferred blob hydration pattern)
  • Transferred to add-polyfill-layer-two-stream-coverage: Gmail attachment blob collection and deferred hydration.

Slack

  • Transferred to add-polyfill-layer-two-stream-coverage: audit Slack v0.3.0 coverage for reactions, message attachments, and related streams.
  • Transferred to add-polyfill-layer-two-stream-coverage: evaluate Slack canvases, stars, user groups, and reminders.

Fixture pipeline (test-harness prerequisite)

  • Transferred to add-connector-fixture-scrubber-pipeline: LLM-based PII scrubber for captured fixtures.
  • Transferred to add-connector-fixture-scrubber-pipeline: connector-specific scrub-rule files.

Review checklist for Tim

  • [?] Every (autonomous 2026-04-19) decision in design notes
  • [?] Schema shape for each connector (platform-native; sanity-check for missed fields)
  • [?] Claude Code + Codex stream design (sessions/messages/attachments vs sessions/messages/function_calls)
  • [?] Connector-configuration open question — direction on manifest-declared schemas
  • [?] ntfy morning summary content