Audit Triage

225 line items total β€” 78 from inventory/master-reset/MASTER_PLAN.md (2026-05-18 master-reset) and 75 from open FixLater issues (15 fresh, captured via scripts/fixlater.sh β€” live from fixlater_items, no redeploy required), 18 from feature_catalog_v2 (build-now + regressed features from Mission 035), and 32 from system (output producer audit β€” orphaned files, unwired drift alerts, missing indexes). Use the Source filter to pivot between feeds. Category and Priority are auto-assigned by Claude β€” override them to disagree. Fit recommendation is against the go-forward operating model: finding leads, processing them, building deal templates, finding buy/sell targets.

Mark each as matters (keep + act on it) or doesn't matter (defer or kill). Add a comment if you want. Persists immediately.

Total
225
Decided
35
190 undecided
Matters
16
Doesn't matter
19
Completed
28
In flight
9
Blocked
0
Later
1
Source:
Bucket:
Fit:
Verdict:
Progress:
225 shown / 225 total

SECURITY9 items

Credential rotation, secret exposure, auth-gate that breaks things on rotation. Run first.

fixlater-143PARTIAL

GOOGLE_CSE_API_KEY returns 403 (org-policy block)

S Β· <2hΒ·owner: ewing
infraintegrationsenrichmentsources: GH #143 Β· project 56543540838 Β· CX 843fa16c
Context
GOOGLE_CSE_API_KEY (project 56543540838, key "Claude Web Search", CX 843fa16c...48b2) returns 403 even with Custom Search API enabled and billing active. Suspected org-policy block at chapter.guide GCP org level.
Already decided
Until resolved, Exa /search is the canonical owner-discovery path. Workaround is in place.
Left to do
Org admin checks constraints/iam.allowedPolicyMemberDomains and gcp.restrictCloudCustomSearchServiceUsage. Either exempt the project or move CSE to non-org GCP account.
My fit reasoning
CSE would be a cheap fallback for owner discovery (function #1). Since Exa covers it today, this is a redundancy item, not blocking.
Progress:
Verdict:
last saved 5/27/2026, 12:58:09 AM
fixlater-144INFRA

Orphan GCP API keys in unowned projects

M Β· half-dayΒ·owner: ewing
infraintegrationsdopplerleadgensources: GH #144 Β· 2026-05-25 LA-pool key lockdown
Context
GOOGLE_API_KEY lives in project 1086376262403 (unknown owner, no access). GOOGLE_MAPS_API_KEY lives in project 618741625931 (unknown owner, Maps works but no admin access). Both should be consolidated under Next Chapter OS project 56543540838 or documented with named owners. Risk: key rotation requires owner access we don't have β€” if these keys leak, we can't rotate.
Already decided
Risk surfaced during 2026-05-25 LA-pool key lockdown work. Two unowned-project keys identified, no consolidation plan yet.
Left to do
Consolidate both keys into Next Chapter OS GCP project 56543540838 (preferred) OR document the named owners of projects 1086376262403 and 618741625931 so rotation is possible.
My fit reasoning
Pure infra hygiene β€” but the risk surface (unrotatable keys) directly threatens leadgen + enrichment if compromised.
Progress:
Verdict:
last saved 5/27/2026, 12:58:09 AM
fixlater-164INFRA

Restrict NEXT_PUBLIC_GOOGLE_MAPS_API_KEY (browser key)

S Β· <2hΒ·owner: ewing
infraintegrationsdopplersources: GH #164 Β· used by src/app/campaigns/[slug]/tracker/MapTab.tsx
Context
Browser key embedded in src/app/campaigns/[slug]/tracker/MapTab.tsx is unrestricted. The server-side GOOGLE_MAPS_API_KEY was locked down 2026-05-25 (IP-restricted). Browser keys cannot use IP restrictions because every visitor IP is different β€” they need HTTP referrer restrictions.
Already decided
Server-side counterpart already IP-restricted. Allowlist scope already defined: os.chapter.guide/*, chapter.guide/*, *.vercel.app/*, localhost:*. API restrictions: Maps JavaScript API + Places API (New) only.
Left to do
At https://console.cloud.google.com/apis/credentials?project=learned-raceway-491320-q2 find the key matching NEXT_PUBLIC_GOOGLE_MAPS_API_KEY in Doppler. Apply HTTP referrer restrictions + API restrictions.
My fit reasoning
Defensive β€” without restrictions, an extracted browser key could be racked up on someone else's tab. Doesn't directly serve the 4 functions but is the cost-protection layer for the Maps-powered tracker.
Progress:
Verdict:
last saved 5/27/2026, 12:58:09 AM
fixlater-190INFRA

Doppler prd: 4 Vercel-sensitive keys still need manual entry (BATCH_SEND_SECRET, GOOGLE_SHEETS_RSVP_WEBHOOK, LOB_WEBHOOK_SECRET, VERCEL_ANALYZE_BUILD_OUTPUT)

M Β· half-dayΒ·owner: ewing
infrasources: GH #190
Context
These 4 keys exist as 'Sensitive' type in Vercel prod, which means `vercel env pull` returns empty quotes — CLI can't extract values. They also don't exist in Doppler dev, so the dev→prd promotion path doesn't help. Manual fix (each): 1. Go to Vercel dashboard → Project → Settings → Environment Variables → find <KEY> → reveal value 2. Locally: `echo '<value>' | doppler secrets set <KEY> --project clawdbot --config prd --no-interactive` 3. Verify: `doppler secrets get <KEY> --project clawdbot --config prd --plain` Also add to Doppler dev so future promotions work: `echo '<value>' | doppler se
Already decided
Auto-imported from GH #190 during 2026-05-27 audit regen.
Left to do
See GH issue for full scope.
My fit reasoning
Auto-classified security by regen script β€” refine when item is triaged.
Progress:
Verdict:
fixlater-220INFRA

scripts/fixlater.sh mirror_to_supabase silently fails when invoked from conte...

M Β· half-dayΒ·owner: ewing
schemainfraplatformsources: GH #220
Context
scripts/fixlater.sh mirror_to_supabase silently fails when invoked from contexts where psql isn't on PATH or Doppler subprocess inherits different env. All 5 captures #204-208 this thread bypassed /audit until pushed manually via REST API. Fix: replace psql call with fetch() to Supabase REST endpoint (no driver dep, no PATH issue), OR add diagnostics so the silent skip becomes visible. Verified: SUPABASE_POSTGRES_ADMIN_PASSWORD IS in Doppler clawdbot/prd; psql IS at /opt/homebrew/opt/libpq/bin/psql. So neither was the failure β€” likely a quoting/heredoc issue in the embedded SQL when title or b
Already decided
Auto-imported from GH #220 during 2026-05-27 audit regen.
Left to do
See GH issue for full scope.
My fit reasoning
Auto-classified security by regen script β€” refine when item is triaged.
Progress:
Verdict:
fcv2-44FIT

[regressed] deal-rooms-cims: Deal rooms + CIMs for active engagements

L Β· full-day+Β·owner: ewing
dealssources: feature_catalog_v2
Context
Regressed: Blind-First violated on /hugo. Demoted until BUILD-02.
Already decided
Seeded in fcv2 (Mission 035 Pass 4). Cost estimate: $0.
Left to do
Fix the regression before marking done.
My fit reasoning
regressed feature in the Great Rebuild catalog.
Progress:
Verdict:
fcv2-45FIT

[regressed] intern-partitioning: Intern tier partitioning with canUse() enforcement

S Β· <2hΒ·owner: ewing
tech adminsources: feature_catalog_v2
Context
Regressed: deal-rooms shadow leak. Demoted until intern_tier_blast_radius recipe.
Already decided
Seeded in fcv2 (Mission 035 Pass 4). Cost estimate: $0.
Left to do
Fix the regression before marking done.
My fit reasoning
regressed feature in the Great Rebuild catalog.
Progress:
Verdict:
fcv2-46FIT

[regressed] orphan-finder: Orphan finder at /orphans detecting pages without shared header

S Β· <2hΒ·owner: mark
efficiencysources: feature_catalog_v2
Context
Regressed: /jeremy still violates rule. Demoted until BUILD-04.
Already decided
Seeded in fcv2 (Mission 035 Pass 4). Cost estimate: $0.
Left to do
Fix the regression before marking done.
My fit reasoning
regressed feature in the Great Rebuild catalog.
Progress:
Verdict:
fcv2-47FIT

[regressed] deal-financials-banner: Deal financials banner UI on deal pages

S Β· <2hΒ·owner: mark
dealssources: feature_catalog_v2
Context
Regressed: 28/35 deals NULL. Demoted until BUILD-03.
Already decided
Seeded in fcv2 (Mission 035 Pass 4). Cost estimate: $0.
Left to do
Fix the regression before marking done.
My fit reasoning
regressed feature in the Great Rebuild catalog.
Progress:
Verdict:

BLOCKED6 items

Cannot proceed without a decision or external dependency.

BLK-2FIT◐ Later

Mission #029 "No Longer with Company" rehydrate

M Β· half-dayΒ·owner: architect / operator
pipelineleadgencallsources: BACKLOG.md (OPEN, was blocked on #027) Β· inventory/missions/029-no-longer-with-company-rehydrate.md
Context
When a Salesfinity rep dispositions a call as "Answered - No Longer with Company", the original contact has actually left the company (not bad phone, not wrong mapping). Job: mark contact as departed, run hunter person-find for the same title at the same company, route candidate through review queue.
Already decided
Mission split out of #027 because trigger semantics differ. #027 closed DONE 2026-05-17 β†’ mechanical blocker is gone. Mission doc says "Owner: TBD (architect to pick up)".
Left to do
Someone has to start it. Schema extension (contacts.data_quality_status += 'departed'), exclusion row write, review queue scaffold, person-find job trigger.
My fit reasoning
Directly recovers a lost lead β€” function #1 (find leads). Person-find on same title at same company is the fastest path back to a working dial-list entry.
Progress:
Verdict:
last saved 5/18/2026, 2:18:01 AM
fixlater-126PARTIAL

meeting_notes vs public.meetings drift (placeholder, do-not-action-now)

M Β· half-dayΒ·owner: ewing
transcriptsupabasedealssources: GH #126 Β· src/app/api/webhooks/fireflies/route.ts:147 Β· maxswarm #031
Context
Two tables exist: meeting_notes (LEGACY flat table, 52 rows, populated by engine/scripts/backfill_meeting_notes.py from raw Fireflies AI summaries) and public.meetings (modern structured extraction via extractFromTranscript() with full deal context). The webhook handler explicitly notes "All extraction-aware data lives in public.meetings." 5 open questions including whether meeting_notes is still being written.
Already decided
Ewing explicitly flagged "do not action now." Verified on first inspection: companies has zero notes columns (1-to-many design is correct); both meeting tables have entity_id; no explicit potential-vs-existing-deal field.
Left to do
Revisit when executing Issue #124 Phase 1 close-out. Answer the 5 questions in the body before deciding kill-or-keep on meeting_notes. FIN-4 in MASTER_PLAN may need to be killed or redirected.
My fit reasoning
Data-model clarity prerequisite for transcript-driven deal intel (function #2). Not blocking today.
Progress:
Verdict:
last saved 5/27/2026, 12:58:10 AM
fixlater-134FIT

Salesfinity custom-field Gate 9 validator

M Β· half-dayΒ·owner: ewing
salesfinitysupabasepipelineenrichmentsources: GH #134 Β· skills/salesfinity-loader Β· 2026-05-25
Context
Salesfinity's Custom1-Custom10 slots are blank string slots with no labels defined in Salesfinity itself β€” enforcement must live entirely in NC loader code. Without a validator, contacts can hit the API with wrong-shaped custom fields.
Already decided
Schema file path proposed: skills/salesfinity-loader/custom_field_schema.json. Pre-flight check pattern decided. Live API confirmed slot shape.
Left to do
Ewing provides definitions for Custom1-Custom10 (what each slot holds, required/optional, valid values). Then claude-api writes the JSON schema + pre-flight check.
My fit reasoning
Salesfinity is the dialer β€” function #2 (process). Wrong custom-field shapes corrupt downstream classification.
Progress:
Verdict:
last saved 5/27/2026, 12:58:10 AM
fixlater-152FIT

Ratify v1.yaml buy-signal patterns β†’ flip transcript.buy-signal-extraction live

S Β· <2hΒ·owner: ewing
transcriptcallfeature-defssources: GH #152 Β· src/lib/features/defs/transcript-buy-signal-extraction.ts Β· Phase 3 of #124
Context
Code exists (engine/transcripts/mine_signals.py) but the v1.yaml pattern library needs Ewing's review and ratification before the feature def can flip from design to live. This is the last transcript feature still at design besides diarization.
Already decided
Sequenced as "Phase 3" in the transcription consolidation plan (commit cf369bd). Build plan: inventory/missions/124-transcription-quality.md.
Left to do
Ewing reviews engine/transcripts/signals/v1.yaml. Says "these are good" or "change X". Agent flips status: design β†’ live in the feature def.
My fit reasoning
Buy-signal extraction surfaces conversion-ready leads from transcripts β€” function #2.
Progress:
Verdict:
last saved 5/27/2026, 12:58:10 AM
fixlater-158INFRA

Branch protection for swarm-upgrade (requires GitHub Pro)

S Β· <2hΒ·owner: ewing
infrabranch-protectionswarmgitsources: GH #158 Β· SKILL-SYNC-08 Β· maxswarm run #019
Context
Branch protection rules on main (requiring PRs for non-Ewing pushers) need GitHub Pro for private repos. Current plan: free. Convention is documented in swarm-upgrade SKILL.md but not technically enforced.
Already decided
Workaround: convention documented. Technical enforcement deferred. Revisit when repo goes public or GitHub plan upgrades.
Left to do
Either upgrade to GitHub Pro OR accept convention-only enforcement until repo visibility changes.
My fit reasoning
Process hygiene. Indirect protection for every build that touches main.
Progress:
Verdict:
last saved 5/27/2026, 12:58:10 AM
fixlater-206INFRA

Build Supabase induction triple (induction_runs + induction_business_rules + ...

M Β· half-dayΒ·owner: ewing
schemaplatformsources: GH #206
Context
Build Supabase induction triple (induction_runs + induction_business_rules + induction_frictions) when there is non-noise capture data to fill it. Schemas in inventory/skill-builds/migrate-to-external-induction.md as reference; data-architect's full proposal in this thread's review. Gated on FixLater #204 (capture signal fix) β€” premature without real captures. Read pattern: Phase 5 validation gate query 'rules with user_facing=true AND in_skill_md=false'; cross-build friction analytics by bucket_id. --- Captured via /FixLater on 2026-05-27 from branch `main` on `MacBook-115.local`.
Already decided
Auto-imported from GH #206 during 2026-05-27 audit regen.
Left to do
See GH issue for full scope.
My fit reasoning
Auto-classified blocked by regen script β€” refine when item is triaged.
Progress:
Verdict:

FINALIZE86 items

Code exists. Open questions or unwired integrations remain.

FIN-2FIT

Resolve 9 exa-audit BLOCKs (raw HTTP outside ExaMiddleware chokepoint)

L Β· full-day+Β·owner: claude-api / swarm-build run
exapipelineleadgeninfrasources: architect/open_issues.jsonl iss_0001–iss_0009 Β· exa.md Run 3 OQ Β· consolidation.md
Context
After consolidating Exa behind a single ExaMiddleware chokepoint (swarm-build #007), the exa-audit skill v1.1 ran 2026-05-17 and found 9 P1 files still calling Exa with raw HTTP and bypassing the middleware. Files: buyside_hunt_v1.py, pool_hunt_v2.py, run1_pipeline.py, run2_enhanced_pipeline.py, fetch_webset_data.py, solar_pwa_pipeline.py, sales-enrich/scripts/exa_enrich.py, tests/fixtures/buyside_hunt_v1/capture_live.py, engine/lib/exa_websets.py. Plus 19 REWORK items + 3 WARN.
Already decided
ExaMiddleware is the canonical chokepoint. exa-audit catches drift. 9 P1 issues filed in architect open_issues.
Left to do
Refactor each file to call through exa_skill.py / ExaMiddleware. Replace manual companies dicts with companies_row(). Address 19 REWORK items separately.
My fit reasoning
Exa is the lead-finding and target-discovery engine (functions #1 + #4). If callers bypass middleware, cost-capping/caching/disambiguation all silently break β€” meaning lead-finding costs are uncontrolled and dedup logic fails.
Progress:
Verdict:
last saved 5/27/2026, 12:57:56 AM
FIN-24FIT→ In flight

Diarize.py V1.1 β€” swap _heuristic_diarize() for WhisperX/pyannote backend

L Β· full-day+Β·owner: claude-api
transcriptcallsources: engine/transcripts/diarize.py:10 TODO Β· queue_runner.py:236 TODO Β· diarize.py:41 TODO
Context
Speaker diarization (who said what, with timestamps) is the heart of transcript.diarization feature. Current implementation in engine/transcripts/diarize.py uses a heuristic stub that returns None or guesses. Real diarization needs WhisperX or pyannote. This is the bottleneck for FIN-1 transcript.diarization flip.
Already decided
V1 architecture supports pluggable backend. Stub returns nothing.
Left to do
pip install WhisperX (or pyannote). Replace _heuristic_diarize() with real call. Wire whisper_model field on call_log. Required for transcript.diarization to actually be usable.
My fit reasoning
Speaker-attribution makes call transcripts actionable for downstream lead/deal processing (function #2). Without it, "what did the prospect say vs the rep" is guesswork.
Progress:
Verdict:
last saved 5/23/2026, 4:22:47 AM
FIN-6FIT

Mission #027 person-find job execution (closed schema, code pending)

M Β· half-dayΒ·owner: architect / operator
pipelineexaleadgensources: BACKLOG.md (#027 DONE, "Person-find job execution still pending") Β· inventory/missions/027-wrong-contact-reenrichment.md Β· swarm-build #007 notebook
Context
When a Salesfinity call dispositions as "Bad Number" or "Answered - Wrong Contact", the (person, company) tuple is invalid. Mission #027 added the schema (person_company_exclusions table), the trigger, exclusion helpers, and Gate 9 in salesfinity-loader. But the actual job that runs Clay/Exa person-find on the excluded tuple β€” the part that produces a NEW contact for the dial list β€” was deferred to ship paired with #029.
Already decided
Mission #027 closed DONE 2026-05-17. Schema in prod. Interface frozen. Smoke test 8/8 PASS.
Left to do
Build the execution job: read exclusion rows, call hunter/Clay for new contact at same title, write candidate to review queue. Pair with #029.
My fit reasoning
Recovers wasted dial slots into working leads (functions #1 + #2). 4-5% of dials hit this disposition class.
Progress:
Verdict:
last saved 5/27/2026, 12:57:56 AM
FIN-8FIT→ In flight

"Take over UVD flow scaffold project" β€” finish + register more flows

M Β· half-dayΒ·owner: operator
pipelinelettersemailsources: PROJECT_PLAN.md I3 Β· pipeline.md Β· inventory/missions/011-user-validated-data.md
Context
UVD (User-Validated Data) is a reusable template for any human-in-the-loop review. Originally Mission #011. The /uvd-flow skill scaffolds a new approval flow with one command. Three flows registered: hvac_warmup, letter_review, phoenix_home_services_fit. A "Take over UVD flow scaffold project" session is unresolved β€” someone started picking it up.
Already decided
Framework lives. Three flows in production. Pattern proven via uvd-flow skill.
Left to do
Decide which next flows to scaffold (referral-lookup for #028, departed-contact for #029, transcript-correction). Each is one /uvd-flow invocation. Plus close out whoever was "taking over".
My fit reasoning
UVD is the chokepoint for human-in-loop review on every machine output β€” lead enrichment, letters, transcripts. Directly enables functions #2 and #3 at scale.
Progress:
Verdict:
last saved 5/18/2026, 5:39:43 AM
FIN-10FIT→ In flight

Wire ExaMiddleware do_not_mention filter for anti_facts / discovery_call_gaps

M Β· half-dayΒ·owner: claude-api
exadealssources: exa.md OQ #6 Β· migration 2026_05_17__anti_facts.sql
touches:exa.refresh
Context
Migration added two JSONB columns to companies: anti_facts (DO-NOT-MENTION list per company, severity-tagged with expires_at) and discovery_call_gaps (per-company unanswered conversation fields). View v_company_writer_layer exposes them. Filter wired in swarm-build #021 (2026-05-20) via engine/lib/writer_safety.py + exa_middleware.py call site 9b. Cache stores raw results; callers receive filtered.
Already decided
Schema applied. GIN indexes built. View created. Writers are SUPPOSED to read v_company_writer_layer before output. Filter wired in ExaMiddleware (both cache-hit + live-call paths). engine/lib/writer_safety.apply_do_not_mention_filter + get_discovery_gaps exposed as the helper for writer/draper.
Left to do
Populate discovery_call_gaps on every exa.refresh (Q12/Q13/Q14 consumers should write back to the column when a discovery field is answered). Currently the column is populated only by Hunter/listener writes; no auto-populate on Exa refresh yet.
My fit reasoning
Anti-facts protect client deliverables (function #3) from saying the wrong thing about a target. Filter is live as of #021; ongoing population of discovery_call_gaps is the remaining tail.
Progress:
Verdict:
last saved 5/18/2026, 5:41:24 AM
FIN-17FIT

Solar / Midwest construction prospect hunts β€” push to Salesfinity + enrich PWA solar leaders

M Β· half-dayΒ·owner: operator
leadgenpipelinesources: PROJECT_PLAN.md I8 Β· pipeline.md Run 2 sessions
Context
Active build sessions for two prospect hunts: solar (PWA-qualified project leaders) and Midwest construction. Stannp integration ready to send letters once contacts land. Goal: build lists, enrich phone/email, push to Salesfinity for dialer rotation.
Already decided
Verticals chosen. Hunter pipeline exists.
Left to do
Run hunter waterfall on PWA solar leaders. Run salesfinity-loader on solar + Midwest lists. Hand to dialer.
My fit reasoning
Active lead generation on two verticals β€” functions #1 + #4. Both vertically focused which is exactly the go-forward model's shape.
Progress:
Verdict:
last saved 5/27/2026, 12:57:57 AM
FIN-20FIT

Mission #028 referral disposition β†’ Clay person-lookup β†’ review queue

M Β· half-dayΒ·owner: operator
pipelineleadgencallsources: BACKLOG.md (#028 OPEN) Β· inventory/missions/028-referral-person-lookup.md
Context
~7% of NC dial calls end with the contact naming someone else to talk to ("call my brother", "talk to corp dev VP"). Warmest lead source we have outside an inbound β€” prospect literally handed us a person to call. Today: rep notes it in Salesfinity, nothing automated. Mission #028 fixes that.
Already decided
Mission filed 2026-05-17 with crisp scope: extract β†’ Clay lookup β†’ UVD flow review β†’ dial-list insert with citation. pending_referrals fallback if Clay fails.
Left to do
Build extraction step (LLM parses rep notes for referred_name + relationship + company). Wire Clay person-lookup. Scaffold /review/referral-lookup UVD flow. Insert to contacts + Salesfinity with extra_fields.referred_by.
My fit reasoning
Warm referrals are the highest-value lead class. Direct hit on functions #1 + #2.
Progress:
Verdict:
last saved 5/27/2026, 12:57:57 AM
FIN-4FIT→ In flight

Backfill 5 meeting_notes from Fireflies transcripts (Mission #012)

S Β· <2hΒ·owner: bear / mark
calltranscriptdealssources: inventory/missions/012-meetings-fireflies-backfill.md Β· commit 2b18c62
Context
The /meetings/[id] page has a beautiful pre/during/post tabbed interface with industry-aware question banks and a meeting_notes table behind it. But the table was mostly empty. Mission #012: pull last 5 Next Chapter meetings from past 45 days, extract structured facts, populate meeting_notes so the page renders auto-filled. Shipped per commit 2b18c62 2026-05-05.
Already decided
Backfill script written and ran. 5 rows landed.
Left to do
Hit each of the 5 meeting URLs on os.chapter.guide/meetings/[id]. Confirm pre-checklist, insights, objections, post-actions populated. Close any remaining "open questions for executing session" items in the mission doc.
My fit reasoning
Auto-filled meeting context = processing transcripts into deal-ready material (function #2 feeding #3). Proves the transcript→structured-fact loop.
Progress:
Verdict:
last saved 5/23/2026, 4:22:47 AM
FIN-13FIT

Email editor (swarm-build #007 Phases 3-5) β€” verify live + Mark handoff

S Β· <2hΒ·owner: mark / ewing
emailinterninfraswarmsources: PROJECT_PLAN.md I2 Β· infra.md Run 3 OQ Β· email.md OQ Β· INDEX.md active threads
Context
Email editor went through 5 phases in swarm-build #007: Phase 1 schema (templates, template_edit_sessions, edit_snapshots, test_runs, propagation_log), Phase 2 template index with filter chips, Phases 3-5 lock + version + test batch. 18 feature defs registered. "Complete email template handoff to Mark" session was running live.
Already decided
All 5 phases shipped commits. Migration applied. Feature defs declared. Handoff in flight.
Left to do
Hit os.chapter.guide/templates/index. Edit a template end-to-end (lock β†’ version β†’ test). Confirm Mark has writer access. Land the 16 followup templates from commit e13e07a.
My fit reasoning
Email editor + templates = function #3 (templates to work deals). High direct value.
Progress:
Verdict:
last saved 5/27/2026, 12:57:57 AM
FIN-14FIT

Verify maxswarm #027 Tier-1 email templates (4) deployed + tests

S Β· <2hΒ·owner: ewing
emailswarmsources: swarm.md Run 3 OQ Β· commit a8f5cee
Context
maxswarm run #027 audited the email templates against last 50 Salesfinity calls. Produced 4 new "Tier-1" templates landed in templates/email/. Each should have a vitest test.
Already decided
Templates committed (a8f5cee).
Left to do
Confirm 4 templates on disk. Each has a test file. Each appears in /templates/index with filter chips working.
My fit reasoning
Templates to work deals = function #3.
Progress:
Verdict:
last saved 5/27/2026, 12:57:58 AM
FIN-15FIT→ In flight

letters.generate status:live + requires_review β€” confirm path blocks on review_queue

S Β· <2hΒ·owner: operator
letterspipelinesources: letters.md OQ #3 Β· PROJECT_PLAN.md S1 STALLED
Context
Letters pipeline shipped 2026-05-05 (commit 357f1c9): Stannp wired, review.chapter.guide integration. letters.generate declared status:live with requires_review:true. Means: agent generates draft β†’ row goes to uvd_flows letter-review flow β†’ human approves β†’ THEN Stannp gets called and physical mail sends. If review step is silently skipped, Stannp gets called immediately and physical letters mail without human eyes.
Already decided
Schema + Stannp wired. Feature def declared with requires_review.
Left to do
Trace letters.generate β†’ uvd_flows row letter-review β†’ review_queue insert β†’ human approval β†’ Stannp call. End-to-end test with a test recipient (mail to yourself).
My fit reasoning
Letters = direct lead processing into deal action (function #2 β†’ #3). Unreviewed sends are a financial + reputational risk.
Progress:
Verdict:
last saved 5/23/2026, 4:07:32 AM
FIN-18FIT

Buyside hunt v1 β†’ v2 β€” merge branch claude/sleepy-carson-9ee184

S Β· <2hΒ·owner: claude-api
leadgenexapipelinesources: PROJECT_PLAN.md I7
Context
Original buyside_hunt_v1 was rebuilt with findSimilar Phase 2 to fan out from a seed company. New version lives on branch claude/sleepy-carson-9ee184 alongside pool_socal pushes that now write to Supabase cleanly (commit 2b39aaf).
Already decided
v2 design landed. Tests pass.
Left to do
Merge to main. Resolve conflicts. Note: buyside_hunt_v1.py is one of the 9 exa-audit BLOCKs (FIN-2) β€” needs middleware refactor either way.
My fit reasoning
Buyside target discovery = function #4.
Progress:
Verdict:
last saved 5/27/2026, 12:57:58 AM
FIN-27FIT

engagement_fee defaults per HR.com deal β€” verify

S Β· <2hΒ·owner: ewing
dealssources: deals.md OQ #4
Context
Migration 2026_05_05__engagement_fee.sql added an engagement_fee column to deals table. Each active client engagement (HR.com, Ches Booker, Design Precast) has specific fee terms.
Already decided
Schema applied.
Left to do
Open HR.com deal row in Supabase. Confirm engagement_fee populated with agreed numbers. Same for Ches + Precast.
My fit reasoning
Deal economics for active engagements β€” the money side of function #4.
Progress:
Verdict:
last saved 5/27/2026, 12:57:58 AM
FIN-28FIT

Refine HotLeadFollowup prompt with Ewing

S Β· <2hΒ·owner: ewing + claude-api
callpipelinesources: src/lib/salesfinity-classifier.ts:53 TODO
Context
src/lib/salesfinity-classifier.ts has a TODO at line 53: "refine HotLeadFollowup prompt with Ewing". The classifier sorts incoming Salesfinity calls into outcomes; HotLeadFollowup triggers downstream automation.
Already decided
Classifier exists. Prompt is functional but not optimized.
Left to do
30-min review session: read current prompt, review last 50 hot-lead calls for misclassifications, refine with concrete examples, commit.
My fit reasoning
Hot leads = top of the lead-processing funnel. Misclassification = wasted dial time. Direct lever on function #2 quality.
Progress:
Verdict:
last saved 5/27/2026, 12:57:59 AM
FIN-7INFRA→ In flight

Unload 3 LaunchAgents (contacts-sync, salesfinity-sync, drive-mirror) post-Hermes

S Β· <2hΒ·owner: cron / Mac-mini ops
hermesinfrasources: infra.md Run 3 OQ Β· hermes.md OQ
Context
Three macOS LaunchAgents ran background jobs on the Mac mini: contacts-sync (CRM), salesfinity-sync (dialer), drive-mirror (Google Drive). Migrated to Hermes cron entries 2026-05-10. But the original plists are still loaded β€” running redundantly with Hermes.
Already decided
Migration to Hermes complete. 11 cron entries in Hermes including the 3 replacements.
Left to do
On Mac mini: `launchctl unload ~/Library/LaunchAgents/{contacts-sync,salesfinity-sync,drive-mirror}.plist`. Delete plist files. Confirm Hermes picks up the work on next cycle.
My fit reasoning
Hygiene β€” running two of the same job wastes CPU and creates race conditions on writes. Doesn't directly serve the 4 functions but every duplicate run is a small bug-surface.
Progress:
Verdict:
last saved 5/18/2026, 5:39:48 AM
FIN-16INFRA→ In flight

Letters health check β€” Stannp cost_ledger writes per send

S Β· <2hΒ·owner: cron / ewing
lettershermessources: letters.md OQ #2 Β· PROJECT_PLAN.md S1 Β· Next Action #3
Context
Each Stannp letter costs $0.89 per uvd_flow metadata. cost-watchdog skill monitors daily spend. But there are zero cost_ledger entries for letters in either thread-mine sample. Either no letters sent in 14 days (consistent with STALLED status), or letters are sending but the ledger write is missing.
Already decided
Cost known ($0.89). Ledger is source of truth.
Left to do
`SELECT * FROM cost_ledger WHERE service='stannp' AND created_at > now() - interval '30 days'`. Empty β†’ confirm dormant or fix ledger write. Non-empty β†’ confirm appears in cost-report.
My fit reasoning
Cost observability. Critical if FIN-15 confirms live path β€” otherwise sends are invisible.
Progress:
Verdict:
last saved 5/23/2026, 4:07:32 AM
FIN-19INFRA

swarm-upgrade weekly cadence β€” confirm still firing

S Β· <2hΒ·owner: cron / ewing
swarmhermessources: infra.md Run 3 OQ Β· swarm.md OQ
Context
swarm-upgrade reads swarm notebooks, finds recurring patterns (cross-system gaps, repeated currency exchanges, audit failures), proposes upgrades to agent SKILL.md files. Was supposed to run weekly. Last batch is #002 from 2026-05-10 (manual). Notebook #004 approved 4 proposals 2026-05-17 β€” unclear if weekly cadence or one-off.
Already decided
swarm-upgrade is a real skill that ships proposals. Notebook process exists.
Left to do
Check Hermes cron for swarm-upgrade entry. If missing, add. If present, confirm last firing time.
My fit reasoning
Skill self-improvement loop. Doesn't directly serve the 4 functions but each upgrade compounds quality of skills that do.
Progress:
Verdict:
last saved 5/27/2026, 12:58:00 AM
FIN-25INFRA

Mark's iMac (third machine in fleet) β€” integration loose ends

S Β· <2hΒ·owner: ewing
infrainternsources: intern.md OQ Β· commits 43ed892, cb234d8
Context
Mark joined the fleet on his iMac 2026-05-12. Setup completion guide committed (cb234d8). TypeScript fix to make his build work (43ed892).
Already decided
Mark gets operator tier. Doppler access provisioned per intern rules.
Left to do
Confirm Mark can: Doppler-pull, git-push, run /pull skill, access /admin tier pages. Verify pre-flight on his machine. Mark not yet in fleet thread-mine rotation.
My fit reasoning
Fleet onboarding for a teammate doing the work. INFRA-flavored but Mark is the human doing the deal work.
Progress:
Verdict:
last saved 5/27/2026, 12:58:00 AM
TODO-002INFRA

Register 4 missing feature_keys for TODO(iss_0045) markers

S Β· <2hΒ·owner: claude-api
feature-defsauditsources: GH #234 Β· src/lib/features/registry.ts Β· 4 sites tagged TODO(iss_0045)
Context
swarm-build #045 landed cost_usd instrumentation in 21 call sites but 4 sites had no exact registry key β€” the agent used a near-match (calls.review, admin.stuck-detector, admin.intern-activity, admin.ticket-dashboard) and tagged the call site with TODO(iss_0045). The cost attribution is defensible but slightly off; downstream dashboards filtering by these proxy keys will see commingled events.
Already decided
Near-match proxies in place: calls/chat β†’ calls.review, orphans/suggest β†’ admin.stuck-detector, slack-responder β†’ admin.intern-activity, prd/dispatcher β†’ admin.ticket-dashboard. All TS clean. Ghost bucket avoided.
Left to do
Add 4 feature defs (calls.chat in defs/call-library.ts, orphans.suggest in defs/admin.ts, slack.respond in defs/misc.ts, prd.dispatch in defs/admin.ts). Update each call site to use the new key. Remove the TODO(iss_0045) comments. ~20 LOC across 4 def files + 4 source files.
My fit reasoning
Hygiene. Sharper cost attribution improves the operator surface but is not blocking.
Progress:
Verdict:
fixlater-89INFRA

Auto-publish shifts current branch mid-commit

M Β· half-dayΒ·owner: claude-api
gitinfrabranch-protectionsources: GH #89 Β· 2026-05-18 Β· observed on swarm-build/007, wip/exa-recipe-pickup, fin-2-orphan-cleanup
Context
Auto-publish keeps shifting current branch mid-commit. Work observed landing on swarm-build/007-exa-chokepoint-refactor, wip/exa-recipe-pickup-2026-05-17, and fin-2-orphan-cleanup instead of main. Forces cherry-pick-back-to-main dance every commit. Real friction on every push.
Already decided
Two paths enumerated.
Left to do
Either disable the auto-rebranching for sessions on main, OR document an explicit branch-protection convention so agents know when they've been moved off main. Related to #127.
My fit reasoning
Per-commit friction tax across every workstream.
Progress:
Verdict:
last saved 5/27/2026, 12:58:18 AM
fixlater-90FIT

Run Exa enrichment pass on active dial list

M Β· half-dayΒ·owner: claude-api
exaenrichmentemailleadgenpipelinesources: GH #90 Β· email-editor merge fields Β· 2026-05-18
touches:exa.refresh
Context
Production DB has 1 company with exa_fields and 0 contacts linked. Test-batch renderer is wired to all 49 tokens but most still emit [MISSING: ...] because companies.exa_fields is empty. Until enrichment runs, new templates (send-buyer-thesis-hot, send-info-on-radar-warm) can't be evaluated.
Already decided
Email-editor merge fields shipped. 49-token test-batch renderer in place.
Left to do
Pick the 200-500 most-active dial-rotation companies β†’ run exa.refresh() per company β†’ populate companies.exa_fields. Budget guardrail via cost-watchdog.
My fit reasoning
Enrichment is function #2; populates the data layer for template-driven outreach in function #3.
Progress:
Verdict:
last saved 5/27/2026, 12:58:12 AM
fixlater-103PARTIAL

drive_mirror date corruption (all files get import timestamp)

S Β· <2hΒ·owner: claude-api
integrationssupabasepipelinesources: GH #103 Β· engine/drive_mirror/sync.py Β· 2026-05-20
Context
All crawled files end up with modified_time = the seed-import timestamp (e.g. 2026-03-20T00:36:19 for all DPP files), instead of Drive's real createdTime/modifiedTime. Verified by live drive.googleapis.com call: real dates span 2025-10-08 β†’ 2026-04-22.
Already decided
Cause and fix file identified.
Left to do
engine/drive_mirror/sync.py must store Drive's createdTime + modifiedTime fields rather than the import-time timestamp. Verify PR #110 doesn't already fix.
My fit reasoning
Drive ingestion supports function #2 (process source docs). Corrupted dates corrupt downstream sorting and recency signals.
Progress:
Verdict:
last saved 5/27/2026, 12:58:15 AM
fixlater-117FIT

Refactor HR.com followups to canonical per-deal home

M Β· half-dayΒ·owner: claude-api
dealshr-comconsolidationsources: GH #117 Β· Truth-Lives-With-The-Deal master rule
Context
Global /deals/followups currently owns followup-008..013 (all HR.com). Violates Truth-Lives-With-The-Deal master rule which requires per-deal homes.
Already decided
Aggregator pattern decided: per-deal is the writer, global is the reader.
Left to do
Create /deals/hr-com/page.tsx hub + /deals/hr-com/followups/ canonical. Refactor src/lib/followups.ts to read per-deal. Keep /deals/followups as aggregator.
My fit reasoning
Truth-lives-with-the-deal enables function #3 cleanly per deal.
Progress:
Verdict:
last saved 5/27/2026, 12:58:14 AM
fixlater-122INFRA

Restore Tailscale SSH with proper ACL accept rule

S Β· <2hΒ·owner: ewing
integrationsinfradopplersources: GH #122 Β· 2026-05-23 Β· disabled to unblock cross-machine forensics
Context
Tailscale SSH currently disabled to unblock cross-machine forensics from Claude shell (key auth via plain OpenSSH).
Already decided
Disabled-state is temporary; restoration plan defined.
Left to do
Add proper ACL accept rule for ewing@chapter.guide β†’ clawdbot on next-chapter-mac-mini. Add TAILSCALE_API_KEY to Doppler for future ACL automation.
My fit reasoning
Cross-machine ops plumbing.
Progress:
Verdict:
last saved 5/27/2026, 12:58:16 AM
fixlater-123FIT

P1 URGENT: Complete letters channel (FIN-12 + FIN-15 + FIN-16 + BLD-1)

L Β· full-day+Β·owner: claude-api
letterspipelinehermesdealsleadgensources: GH #123 Β· MASTER_PLAN FIN-12/15/16/BLD-1 Β· maxswarm #031
Context
Decision logged by Ewing 2026-05-22 via maxswarm #031 audit. Letters channel CONFIRMED primary. 4 items collapse into 1 build. FIN-16 is a silent-money item β€” every day undone is $20-50/day potential undetected overspend. All 4 active deals (HR.com, Capstone, Design Precast, Jeff VanHoose) use letters as a touchpoint.
Already decided
Letters channel confirmed primary. 4 items upserted to audit_triage as matters=true, status=inflight. FIN-23 (/letters/legacy) remains KILLED (file missing, orphan confirmed).
Left to do
(1) Decide letter_approvals alive or dead via grep on supabase/migrations and src/. (2) Verify letters.generate blocks on review_queue before Stannp call. (3) Verify Stannp cost_ledger writes per send + $9/day cap enforced. (4) Wire claude-api personalized paragraph generation at engine/contacts/pipeline/generate_letters.py:249.
My fit reasoning
Letters are the differentiated cold-outreach channel for sellers β€” function #1 + #4. The silent-money risk on FIN-16 makes this P1 not just on FIT but on cost-control.
Progress:
Verdict:
last saved 5/27/2026, 12:58:10 AM
fixlater-124FIT

P1.5 URGENT: Transcription Quality consolidated 4-phase project

L Β· full-day+Β·owner: claude-api + ewing
transcriptcallpipelinedealsfeature-defssources: GH #124 Β· MASTER_PLAN FIN-1/4/24/DEC-18/19 Β· maxswarm #031
Context
Five transcript-* feature defs already live, two stuck at design. UVD correction flow shipped. 52 meeting_notes in prod. 38-call audio corpus downloaded. Work is 60% done but scattered across 5 MASTER_PLAN items plus undocumented heuristics. Phase gates defined so faster phases don't wait for slower ones.
Already decided
Consolidation logged by Ewing 2026-05-22 via maxswarm #031 audit. FIN-24 was kill-candidate, REVERSED. Whisper LOCAL preserved. Operator-only tier. 38-call V1 corpus downloaded.
Left to do
Phase 1 (verify 5 backfilled meeting_notes render, grep mine-meeting-booked-phrases, enum parity, feature_metrics traffic). Phase 2 (install WhisperX, write engine/transcripts/diarize.py FRESH β€” file currently does not exist, implement 3-rule NC-rep heuristic, flip diarization def). Phase 3 (Ewing pattern ratification β€” see fixlater-152). Phase 4 (corpus expansion + retention).
My fit reasoning
Transcript quality directly feeds deal intel and downstream extraction β€” function #2 + #4.
Progress:
Verdict:
last saved 5/27/2026, 12:58:11 AM
fixlater-128INFRA

Audit Mac mini for sync-on-stop wiring + LaunchAgent writers

S Β· <2hΒ·owner: operator
gitinfrahermessources: GH #128 Β· follow-on to #127
Context
#127 fix landed on MacBook side; Mac mini audit was deferred. Need to enumerate what daemons/crons/sessions on the Mac mini can write to the shared working tree.
Already decided
Audit procedure defined: ssh in, run 4 commands.
Left to do
ssh into clawdbot. Run crontab -l, launchctl list, ls ~/Library/LaunchAgents/, grep sync-on-stop in ~/.claude/settings*.json. Append findings to inventory/repos-on-this-fleet.md Mac mini row.
My fit reasoning
Diagnostic prerequisite for #127 root-cause fix.
Progress:
Verdict:
last saved 5/27/2026, 12:58:12 AM
fixlater-129FIT

Merge 20 unmerged DDP commits from ~/repos/next-chapter-os

M Β· half-dayΒ·owner: operator
gitconsolidationsalesfinitydesign-precastsources: GH #129 Β· claude/review-deals-page-design-nI4Il branch Β· last fetch 2026-05-21
Context
20 unmerged commits on claude/review-deals-page-design-nI4Il branch including phone pipeline (df3b137), GH Actions test runner (85a6c94, 1165b1f), Salesfinity loader (afe095a, be97e0c), ingest_spec recovery (f4a35e6, 9a89a41). Surfaced during issue #127 investigation.
Already decided
Branch identified. Last fetch 2026-05-21.
Left to do
Open PR from claude/review-deals-page-design-nI4Il β†’ origin/main. After merge, leave ~/repos/next-chapter-os for Cowork to re-clone fresh.
My fit reasoning
Recovers shipped code (Salesfinity loader, phone pipeline) β€” functions #1, #2.
Progress:
Verdict:
last saved 5/27/2026, 12:58:12 AM
fixlater-131FIT

Backfill financials for 28 active deals with NULL ev_estimate_usd/ebitda_usd

M Β· half-dayΒ·owner: claude-api
dealspipelinesupabasesources: GH #131 Β· 2026-05-24 Β· Apply-to-All banner gap
Context
Apply-to-All rule: banner now shipped but shows empty boxes for 28 of 35 deals. 28 slugs listed (aqua-pros, arnold-roofing-and-restoration, barclay-street-real-estate-ltd, bel-aire-mechanical-inc, bell-precast, cal-west-roofing-inc, capsoft, complete-aquatic-solutions, cypris, fss-inc, imperial-plumbing, indiana-precast-inc, indianola-precast, jonathan-salomon, lenox-advisors, manco-structures-ltd, mccody-concrete, mid-south-prestress-llc, mosquito-shield-of-buffalo, natura-pest-control-llc, pacific-shore-pest-control, pinnacle-wealth-brokers, premier-systems-roofing, protouch-pool-services, puddle-pool-services, re-max-fine-properties, rocket-partners, swim-chem-inc).
Already decided
Pipeline + cost estimate documented (~$0.06/deal expand mode, ~$1.70 total).
Left to do
Run node scripts/fireflies-ingest-one.mjs --target-deal-slug <slug> for each of 28 deals. Many will stay NULL if no transcripts exist β€” that's the actual data signal.
My fit reasoning
Deal financial visibility β€” function #3 + #4.
Progress:
Verdict:
last saved 5/27/2026, 12:58:13 AM
fixlater-133INFRA

P0 Finish Run #024 β€” Change-the-Page build + trackpad validation

L Β· full-day+Β·owner: ewing + claude-api
change-the-pagepage-dnaauditfeature-defsvercelsources: GH #133 Β· swarm-build run #024 Β· src/components/page-change/*
Context
Run #024 built the unified "Change the page" feature β€” a floating box that hides whether the data-agent or ui-agent handles a request. Shipped across multiple commits to main. Trackpad compatibility fix (9ab9f24) landed. Primary admin tool for making page changes without opening code.
Already decided
Shipped: page_change_runs + page_change_events tables with 8 indexes. PageChangeContract Zod schema + classifyIntent() + decide() decision tree (16 tests passing). Schema inspector (zero LLM). UI-agent bridge. Orchestrator with SSE + $2 cost cap. ChangePageBox floating UI. Pointer Events trackpad fix.
Left to do
(1) Trackpad validation on MacBook after 9ab9f24 deploys. (2) Add BLOB_READ_WRITE_TOKEN to Vercel. (3) E2E test on production. (4) Registry classifier improvement for literal/computed text_source types. (5) Cost ledger append. (6) Debrief notebook entry at skills/swarm-build/notebook/. (7) Re-issue VERCEL_TOKEN (invalidToken: true).
My fit reasoning
Meta-tool: lets Ewing change pages without code. Compounds across every other FIT item that needs a UI tweak.
Progress:
Verdict:
last saved 5/27/2026, 12:58:11 AM
fixlater-135FIT

Glossy-pack: build about.html for Keystone/Bedrock/Lagoon/Granite

L Β· full-day+Β·owner: claude-api
glossy-packdealsdesign-precastloan-martsources: GH #135 Β· Apply-to-All rule Β· gold ref helios/valuation.html Β· forum example 2026-05-24
Context
Forum (HR.com) glossy hub built at public/deal-rooms/forum/about.html on 2026-05-24. Per Apply-to-All rule, same capability must land on all active hubs. Helios (Loan Mart) is DONE β€” gold reference. 4 remain: Keystone (Capstone), Bedrock (DPP), Lagoon (Puddle Pool), Granite (Wieser).
Already decided
Template + design tokens locked at skills/glossy-pack/template-hub.html + skills/glossy-pack/rules.md.
Left to do
Build 4 about.html using template. Source material needed per hub (CIM / Ches deck for Keystone, DPP source docs for Bedrock, Puddle Pool docs for Lagoon, Wieser overview + letters for Granite).
My fit reasoning
Sell-side deliverables across the active deal slate β€” function #3 + #4.
Progress:
Verdict:
last saved 5/27/2026, 12:58:15 AM
fixlater-138INFRA

BACKLOG Unload 3 superseded LaunchAgents from Mac mini

S Β· <2hΒ·owner: operator
hermesinfrasources: GH #138 Β· MASTER_PLAN FIN-7 Β· architect audit 2026-05-24
Context
Three LaunchAgents scheduled for unload: contacts-sync, salesfinity-sync, drive-mirror β€” all superseded or folded into hermes cron.
Already decided
Supersession decided. Hermes cron live (11 entries per swarm-build #006).
Left to do
On Mac mini: launchctl unload ~/Library/LaunchAgents/com.clawdbot.{contacts-sync,salesfinity-sync,drive-mirror}.plist. Verify hermes cron entries cover all three. Move plist files to launchagents/_retired/.
My fit reasoning
Cleanup β€” but also reduces concurrent writers per #127.
Progress:
Verdict:
last saved 5/27/2026, 12:58:15 AM
fixlater-141FIT

Ship Option A: pattern-based .html rewrite in next.config.ts

S Β· <2hΒ·owner: claude-api
dealsvercelinfraloan-martsources: GH #141 Β· diagnosed in 2026-05-25-intern-block-deal-rooms-shadow-diag thread Β· swarm-build #016 Track B
Context
A dynamic route at src/app/deal-rooms/[codename]/[page]/page.tsx catches /deal-rooms/*/* requests and queries Supabase deal_pages for slug=codename AND page_kind=page AND visibility="blind". This shadows static files in public/deal-rooms/<codename>/*.html. The deal_pages.page_kind values are "hub"/"cim"/etc β€” never "valuation.html" β€” so the dynamic route always misses and returns 404. The dynamic route is DEAD CODE: gated entry routes still read public/ via hubPath in gated-deal-room.ts. 10 codenames affected.
Already decided
Architect-reviewed: ship the pattern-based rewrite. Pattern over .html suffix, not codename list. Idempotent under future blind-mode migration.
Left to do
Add to next.config.ts beforeFiles BEFORE existing host rewrites: { source: "/deal-rooms/:codename/:file(.+\\.html)", destination: "/deal-rooms/:codename/:file" }. DO NOT SHIP until 7+ UNKNOWN production deploys diagnosed. Verify via curl -sI https://os.chapter.guide/deal-rooms/loanmart-hugo/valuation.html.
My fit reasoning
Unbreaks /hugo and 9 other deal-room codenames β€” function #3 (templates for deals).
Progress:
Verdict:
last saved 5/27/2026, 12:58:12 AM
fixlater-145FIT

Second-pass owner search for 13 LA pool companies

S Β· <2hΒ·owner: operator
la-poolleadgenenrichmentexasources: GH #145 Β· LA pool mission Β· 2026-05-25
Context
12 companies where Exa returned Google Maps mis-matched results (city/brand token overload), 1 with zero results. These 13 have no person candidate in extra_people.
Already decided
Three fallback sources identified.
Left to do
CSLB license lookup by business name, SoS filings (bizfileonline.sos.ca.gov), or direct company website contact page.
My fit reasoning
Direct lead recovery β€” function #1.
Progress:
Verdict:
last saved 5/27/2026, 12:58:15 AM
fixlater-146FIT

288 LA pool owner candidates exist in Sheet but never written to Supabase

M Β· half-dayΒ·owner: operator
la-poolsupabaseleadgenenrichmentsources: GH #146 Β· Sheet 1YBvLBbrYX5eTBiOxvqJIH5Y0kk7ePEZFaSe7GF3xAd0 Β· mission_id la-pool-2026-05-22
Context
288 LA pool owner candidates in Google Sheet were NEVER written to Supabase companies.extra_people β€” violates Supabase-first rule. /tmp/owner_candidates_full.json was lost on session restart.
Already decided
Two recovery paths identified.
Left to do
Pull from sheet (https://docs.google.com/spreadsheets/d/1YBvLBbrYX5eTBiOxvqJIH5Y0kk7ePEZFaSe7GF3xAd0/edit#gid=1846500135) and upsert via extra_people JSONB. OR re-run owner_finder.py batch against 77 LA pool companies (~$0.54 Exa).
My fit reasoning
Lead recovery β€” function #1.
Progress:
Verdict:
last saved 5/27/2026, 12:58:15 AM
fixlater-147FIT

Loan Mart: build buyer profiles from Hugo discovery call

M Β· half-dayΒ·owner: ewing
loan-martdealsleadgentranscriptsources: GH #147 Β· Fireflies ID 01KR9N0RXSK78K0DPY39303C31 Β· 2026-05-11 Loan Mart Discovery Call
Context
Action item from 2026-05-11 Loan Mart Discovery Call. Prepare target buyer profiles based on Hugo's business insights: high-interest lending, M NI, off-market preference, flexible deal structures.
Already decided
Source identified: CIM at public/deal-rooms/loan-mart/cim.html. Discovery transcript available in Fireflies.
Left to do
Build buyer profiles matching Hugo's stated preferences. Run by Hugo for feedback.
My fit reasoning
Direct sell-side buyer targeting β€” function #4.
Progress:
Verdict:
last saved 5/27/2026, 12:58:14 AM
fixlater-149FIT

Wire Plaud MCP into production pipeline

M Β· half-dayΒ·owner: operator + claude-api
transcriptintegrationspipelinesupabasesources: GH #149 Β· MCP server https://mcp.plaud.ai/mcp Β· complements Fireflies
Context
Plaud captures offline/in-person audio (complements Fireflies, not replacement). Note 200-recording API cap; audio download links expire 24h so fetch must happen in same job.
Already decided
Use case decided (offline/in-person). MCP endpoint identified. Architecture (Plaud Cloud Sync required).
Left to do
Install Plaud Web MCP connector (claude.ai β†’ Customize β†’ Connectors β†’ Plaud Web MCP β†’ Connect β†’ Authorize). Smoke test list_files + get_transcript. Build polling automation: Plaud CLI cron in engine/ β†’ dedup against Supabase β†’ route through transcript-polish β†’ listener β†’ Supabase.
My fit reasoning
Captures audio Fireflies misses (in-person meetings) β€” function #2.
Progress:
Verdict:
last saved 5/27/2026, 12:58:13 AM
fixlater-151INFRA

MacBook disk at 97% (13Gi free) β€” run cache purge

S Β· <2hΒ·owner: ewing
infradisk-cleanupsources: GH #151 Β· macbook-115 Β· 2026-05-25
Context
Mac mini got disk cleanup 2026-05-24 (9GB freed). MacBook NOT cleaned. 460Gi total / 409Gi used / 13Gi free / 97% capacity. Next swarm or build session will fail mid-run.
Already decided
Mac mini playbook proven. Same procedure applies.
Left to do
npm cache clean --force, brew cleanup --prune=all, pip cache purge, clear browser caches, audit ~/Library/Caches/, check for orphan worktrees via find ~/Github -maxdepth 2 -name ".git" -type d.
My fit reasoning
Operational prerequisite β€” without disk space, no FIT work happens.
Progress:
Verdict:
last saved 5/27/2026, 12:58:17 AM
fixlater-153FIT

Build blind-codename siblings for Jeremy Byrd CIMs before external share

M Β· half-dayΒ·owner: claude-api
jeremy-byrddealsletterssources: GH #153 Β· Jeremy Byrd thread 2026-05-18 Β· AGENTS.md Blind-First
Context
Two NAMED-version CIMs shipped 2026-05-18: pixelflex.html + elite-multimedia.html. Both safe for internal use. Both violate Blind-First Master Rule if shared with any external party before NDA. Becomes blocking the moment Ewing wants to send a CIM URL to anyone outside Next Chapter or Jeremy himself.
Already decided
AGENTS.md rule and storage convention documented. Two CIMs identified as in-violation.
Left to do
Assign codenames in inventory/blind-codenames.json for PixelFlex LED and Elite Multimedia Productions. Build blind sibling CIMs at public/deal-rooms/<codename>/cim.html. Add password-gating. Update /jeremy/cims landing to surface blind URLs as default for external share.
My fit reasoning
CIM = sell-side deliverable, function #3 + #4.
Progress:
Verdict:
last saved 5/27/2026, 12:58:14 AM
fixlater-160FIT

Re-apply Phase 2 /findSimilar to buyside_hunt_v1.py using ExaMiddleware pattern

S Β· <2hΒ·owner: claude-api
exaleadgenpipelinesources: GH #160 Β· inventory/thread-audit/2026-05-16__exa-extraction-findsimilar-phase2-buyside.md
Context
Code was written mid-thread but lost to stash. Exact diff spec preserved at inventory/thread-audit/2026-05-16__exa-extraction-findsimilar-phase2-buyside.md. Must call _hunt_middleware.call(ExaCallRequest(endpoint="findSimilar", ...)) NOT raw requests.post. ExaMiddleware handles findSimilar at line 620 of engine/lib/exa_middleware.py.
Already decided
Diff spec written. Budget set: 3 findSimilar calls/vertical, threshold >85% score.
Left to do
Re-apply diff per spec. Test against one vertical.
My fit reasoning
findSimilar expands buy-side target lists β€” function #4.
Progress:
Verdict:
last saved 5/27/2026, 12:58:15 AM
fixlater-182INFRA

migration-drift-check v2 β€” honor DROP statements. v1 flags any CREATE TABLE /...

M Β· half-dayΒ·owner: ewing
schemasources: GH #182
Context
migration-drift-check v2 β€” honor DROP statements. v1 flags any CREATE TABLE / ALTER ADD COLUMN in supabase/migrations/*.sql whose target doesn't exist in live information_schema. False positive surfaced 2026-05-26: `2026_05_26_g__toolbox_requests.sql` creates public.toolbox_requests, then `2026_05_26_h__deprecate_toolbox_requests.sql` drops it. v1 sees `_g`'s CREATE claim against a missing table and flags drift. v2 should parse DROP TABLE / DROP COLUMN / DROP VIEW from later migrations and exclude claims that were intentionally reversed. Lives at scripts/migration-drift-check.ts:35 (RE_ patter
Already decided
Auto-imported from GH #182 during 2026-05-27 audit regen.
Left to do
See GH issue for full scope.
My fit reasoning
Auto-classified finalize by regen script β€” refine when item is triaged.
Progress:
Verdict:
fixlater-184INFRA

Load migration-drift LaunchAgent on Mac mini

M Β· half-dayΒ·owner: ewing
schemainfrasources: GH #184
Context
launchagents/com.nextchapter.migration-drift.plist committed in b5af122a (2026-05-26). The file exists in repo but the LaunchAgent is NOT yet loaded on the Mac mini host. Until `launchctl load -w /Library/LaunchAgents/com.nextchapter.migration-drift.plist` runs on the mini, the 4h drift check is committed code but inert in production. Verification when loaded: `launchctl list | grep migration-drift` `tail /tmp/migration_drift_check.out` should grow every 4h Source: fixlater #177 (closed b5af122a) but the deployment step was deferred.
Already decided
Auto-imported from GH #184 during 2026-05-27 audit regen.
Left to do
See GH issue for full scope.
My fit reasoning
Auto-classified finalize by regen script β€” refine when item is triaged.
Progress:
Verdict:
fixlater-196INFRA

Audit every active deal for HR.com-style folder sprawl (multiple disk locatio...

M Β· half-dayΒ·owner: ewing
dealsplatformsources: GH #196
Context
Audit every active deal for HR.com-style folder sprawl (multiple disk locations for the same deal). Active deals to check: loanmart-hugo, design-precast, capstone-construction, puddle-pools, elite-multimedia, hr-com (already audited β€” worst case). Output: per-deal disk-location inventory + which artifacts are NOT surfaced from /deals/<slug>/documents today. Likely 30-50 minutes of grep+ls work. Locked by One Canonical Deal Room master rule 2026-05-27. --- Captured via /FixLater on 2026-05-26 from branch `main` on `MacBook-115.local`.
Already decided
Auto-imported from GH #196 during 2026-05-27 audit regen.
Left to do
See GH issue for full scope.
My fit reasoning
Auto-classified finalize by regen script β€” refine when item is triaged.
Progress:
Verdict:
fixlater-202INFRA

Capture the 2 invented drive-by businesses from browser DevTools Network

M Β· half-dayΒ·owner: ewing
platformuisources: GH #202
Context
## Why Audit (`inventory/audits/drive-by-route-invented-business-audit-2026-05-26.md`) confirmed the route bug but the 2 specific invented business names are not recoverable from disk β€” `onTrack` doesn't persist the outbound Maps URL. ## How to capture 1. Open `/campaigns/NC-LUNCH-PHX-2026-06/tracker` (or whichever Phoenix campaign last reproduced the bug) 2. Switch to Drive-By tab 3. Set start = 'current location' (or any starting venue) 4. Open DevTools β†’ Network tab 5. Click 'Get route' (or whatever opens the Maps URL) 6. Find the outbound `maps.google.com/maps/dir/...` URL in Network 7.
Already decided
Auto-imported from GH #202 during 2026-05-27 audit regen.
Left to do
See GH issue for full scope.
My fit reasoning
Auto-classified finalize by regen script β€” refine when item is triaged.
Progress:
Verdict:
fixlater-204INFRA

v2 capture-session.sh heuristic still produces noise: all v2 captures show lo...

M Β· half-dayΒ·owner: ewing
othersources: GH #204
Context
v2 capture-session.sh heuristic still produces noise: all v2 captures show looks_like_build:true with 50 commits + 300-400 changed files because transcript-birth-time anchor is too wide (concurrent sessions' commits leak in via wall-clock window). Fix: read transcript JSONL and extract Edit/Write tool calls as the session-scoped file list, OR replace SessionEnd hook entirely with a commit-watcher LaunchAgent. Current state: 4 v2 captures archived alongside 5 v1 captures in inventory/skill-builds/captures/.archive-v1-noise/. Hook is still armed; expires 2026-05-28T07:39Z. Data-architect leading
Already decided
Auto-imported from GH #204 during 2026-05-27 audit regen.
Left to do
See GH issue for full scope.
My fit reasoning
Auto-classified finalize by regen script β€” refine when item is triaged.
Progress:
Verdict:
fixlater-210INFRA

Apply promote-workflow pattern to 4 sibling design→done tables (email_drafts,...

M Β· half-dayΒ·owner: ewing
platformsources: GH #210
Context
Apply promote-workflow pattern to 4 sibling design→done tables (email_drafts, pending_reviews, toolbox_requests, writer_template_proposals). Per architect+data-architect on run #051; Apply-to-All rule. Generalize POST /api/features/promote-request, or file four routes. --- Captured via /FixLater on 2026-05-27 from branch `mission/035-pass-4-finetune` on `MacBook-115.local`.
Already decided
Auto-imported from GH #210 during 2026-05-27 audit regen.
Left to do
See GH issue for full scope.
My fit reasoning
Auto-classified finalize by regen script β€” refine when item is triaged.
Progress:
Verdict:
fixlater-211INFRA

Add feature_def_request_events append-only log per Modeling Rule 4. Today sta...

M Β· half-dayΒ·owner: ewing
schemasources: GH #211
Context
Add feature_def_request_events append-only log per Modeling Rule 4. Today status flips destructively. Schema: id uuid PK, request_id uuid FK, event text, actor text, at timestamptz, payload jsonb. Trigger on UPDATE OF status on feature_def_requests. --- Captured via /FixLater on 2026-05-27 from branch `mission/035-pass-4-finetune` on `MacBook-115.local`.
Already decided
Auto-imported from GH #211 during 2026-05-27 audit regen.
Left to do
See GH issue for full scope.
My fit reasoning
Auto-classified finalize by regen script β€” refine when item is triaged.
Progress:
Verdict:
fixlater-212INFRA

File<->DB reconciler for feature_def_requests vs ALL_FEATURES. Forward: 'buil...

M Β· half-dayΒ·owner: ewing
schemasources: GH #212
Context
File<->DB reconciler for feature_def_requests vs ALL_FEATURES. Forward: 'built' rows whose feature_key isn't in ALL_FEATURES = orphan. Reverse: FeatureDef without upstream request = undocumented. Pattern: clone scripts/migration-drift-check.ts. --- Captured via /FixLater on 2026-05-27 from branch `mission/035-pass-4-finetune` on `MacBook-115.local`.
Already decided
Auto-imported from GH #212 during 2026-05-27 audit regen.
Left to do
See GH issue for full scope.
My fit reasoning
Auto-classified finalize by regen script β€” refine when item is triaged.
Progress:
Verdict:
fixlater-213INFRA

Relocate PromoteRequestModal.tsx from src/components/page-dna/ to src/compone...

S Β· <2hΒ·owner: ewing
platformuisources: GH #213
Context
Relocate PromoteRequestModal.tsx from src/components/page-dna/ to src/components/features/ (or src/app/admin/features/_components/). Misfiled: it's feature-registry, not page-DNA. Trivial mv + import path update. --- Captured via /FixLater on 2026-05-27 from branch `mission/035-pass-4-finetune` on `MacBook-115.local`.
Already decided
Auto-imported from GH #213 during 2026-05-27 audit regen.
Left to do
See GH issue for full scope.
My fit reasoning
Auto-classified finalize by regen script β€” refine when item is triaged.
Progress:
Verdict:
fixlater-214INFRA

Register feature_def_requests columns in architect/field_registry.json: page_...

M Β· half-dayΒ·owner: ewing
schemaplatformsources: GH #214
Context
Register feature_def_requests columns in architect/field_registry.json: page_key, target_table, proposed_column, column_type, filled_by, needed_by, target_defs_file. Registry has zero entries for this table today. --- Captured via /FixLater on 2026-05-27 from branch `mission/035-pass-4-finetune` on `MacBook-115.local`.
Already decided
Auto-imported from GH #214 during 2026-05-27 audit regen.
Left to do
See GH issue for full scope.
My fit reasoning
Auto-classified finalize by regen script β€” refine when item is triaged.
Progress:
Verdict:
fixlater-215INFRA

Split column_type='fk' into references_table + references_column on feature_d...

M Β· half-dayΒ·owner: ewing
schemasources: GH #215
Context
Split column_type='fk' into references_table + references_column on feature_def_requests. Today FK requests can't specify the target. Additive migration: ADD COLUMN references_table text + references_column text DEFAULT 'id' + CHECK (column_type <> 'fk' OR references_table IS NOT NULL). --- Captured via /FixLater on 2026-05-27 from branch `mission/035-pass-4-finetune` on `MacBook-115.local`.
Already decided
Auto-imported from GH #215 during 2026-05-27 audit regen.
Left to do
See GH issue for full scope.
My fit reasoning
Auto-classified finalize by regen script β€” refine when item is triaged.
Progress:
Verdict:
fixlater-216INFRA

Investigate concurrent-Claude-session rebase pattern from runs #048-051. Mult...

M Β· half-dayΒ·owner: ewing
platformsources: GH #216
Context
Investigate concurrent-Claude-session rebase pattern from runs #048-051. Multiple sessions on one repo cause silent rebase-and-push to main; PRs stay OPEN. Options: per-repo session lock, mandatory isolated worktrees, or accept+document. Decision lands in skills/git-guardrail/SKILL.md. --- Captured via /FixLater on 2026-05-27 from branch `mission/035-pass-4-finetune` on `MacBook-115.local`.
Already decided
Auto-imported from GH #216 during 2026-05-27 audit regen.
Left to do
See GH issue for full scope.
My fit reasoning
Auto-classified finalize by regen script β€” refine when item is triaged.
Progress:
Verdict:
fixlater-218INFRA

PR #209 (feat(deal-rooms): SCHEMA_MOVE_FIRST + loanmart-hugo hub + Mission 03...

M Β· half-dayΒ·owner: ewing
dealsschemainfraplatformsources: GH #218
Context
PR #209 (feat(deal-rooms): SCHEMA_MOVE_FIRST + loanmart-hugo hub + Mission 035 Pass 4) is OPEN with +2231/-7 additive diff after rebase onto main. Contains MIXED work from this thread (/audit automation + 7 fixlater captures) and prior concurrent Mission-035 sessions (SCHEMA_MOVE_FIRST migration, loanmart-hugo hub, audit-rescue, Pass 4 layout). dash-check SUCCESS, Vercel PENDING. Decision needed: merge as-is, or split Mission-035 work onto its own PR. Owner: ewing. Refs: https://github.com/ewing-operating-system/next-chapter-os/pull/209 --- Captured via /FixLater on 2026-05-27 from branch `mi
Already decided
Auto-imported from GH #218 during 2026-05-27 audit regen.
Left to do
See GH issue for full scope.
My fit reasoning
Auto-classified finalize by regen script β€” refine when item is triaged.
Progress:
Verdict:
SYS-META-002INFRA

Thread lifecycle: 5 skills write to inventory/thread-inventory/ with no dedup or index

M Β· half-dayΒ·owner: ewing
swarmconsolidationauditsources: producer-registry: debrief-thread, close2, thread-close, thread-handoff, name-thread
Context
Five skills all write to inventory/thread-inventory/. Overlapping file shapes, no dedup, ~70 files, no index page.
Already decided
close2 and debrief-thread are the two active closers. thread-close is original. thread-handoff is cloud-specific. name-thread is naming-only.
Left to do
Pick ONE canonical closer (debrief-thread). Deprecate thread-close. Make close2 an alias. Build index page.
My fit reasoning
Five producers doing overlapping work is maintenance cost, not a capability gap.
Progress:
Verdict:
SYS-META-005PARTIAL

cost-ledger.jsonl exists but no page visualizes spend or alerts on budget overruns

M Β· half-dayΒ·owner: ewing
auditinfrahermessources: inventory/cost-ledger.jsonl + cost-watchdog skill
Context
cost-ledger-append.sh writes after every swarm run. cost-watchdog alerts at 70% threshold. No page shows cumulative spend or per-skill costs.
Already decided
Ledger format stable (JSONL). Append-only semantics correct.
Left to do
Build /audit/costs that reads cost-ledger.jsonl, shows daily/weekly spend by skill, highlights alerts.
My fit reasoning
Cost visibility supports $9/day cap enforcement. Without it, cost-watchdog alerts to Slack but no dashboard to investigate.
Progress:
Verdict:
SYS-debrief-threadINFRA

debrief-thread: Thread inventory files exist on disk but no page indexes or searches them.

S Β· <2hΒ·owner: ewing
skillswarmauditsources: producer-registry scan (1 output types, ~30 files)
Context
End-of-thread close: names thread, runs audit, produces archive/delete/live verdict. Writes to: inventory/thread-inventory/{thread-name}.md. Triggered by: Manual /debrief-thread at end of conversation.
Already decided
1 of 1 output types orphaned on disk.
Left to do
Wire output into /audit as a data source so items appear without grepping disk.
My fit reasoning
1 output type(s) orphaned. Institutional memory generated but never surfaces to operators.
Progress:
Verdict:
SYS-close2INFRA

close2: Same output path as debrief-thread. Overlapping producers, no dedup.

M Β· half-dayΒ·owner: ewing
skillswarmsources: producer-registry scan (1 output types, ~15 files)
Context
Graceful end-of-thread cleanup with GitHub archival. Writes to: inventory/thread-inventory/{thread-name}.md. Triggered by: Manual /close2 at end of conversation.
Already decided
1 of 1 output types orphaned on disk.
Left to do
Move outputs to canonical location. Update producer to write there. Delete old path.
My fit reasoning
1 output type(s) orphaned. Institutional memory generated but never surfaces to operators.
Progress:
Verdict:
SYS-thread-mineINFRA

thread-mine: MASTER_PLAN.md surfaced on /audit as hardcoded snapshot β€” not live-read. Extraction docs orphaned.

S Β· <2hΒ·owner: ewing
skillswarmauditsources: producer-registry scan (3 output types, ~22 files)
Context
Ground-truth reset. Mines git history, schema, features, skills, session titles. Writes to: inventory/master-reset/{cluster}.md, inventory/master-reset/INDEX.md, inventory/master-reset/MASTER_PLAN.md. Triggered by: Manual /thread-mine for ground-truth reset.
Already decided
2 of 3 output types orphaned on disk.
Left to do
Wire output into /audit as a data source so items appear without grepping disk.
My fit reasoning
2 output type(s) orphaned. Institutional memory generated but never surfaces to operators.
Progress:
Verdict:
SYS-thread-handoffINFRA

thread-handoff: Fourth producer writing to thread-inventory/. Same orphan problem.

M Β· half-dayΒ·owner: ewing
skillswarmsources: producer-registry scan (1 output types, ~5 files)
Context
Cross-environment thread close (cloud half). Writes to: inventory/thread-inventory/{thread-name}.md. Triggered by: Manual /thread-handoff.
Already decided
1 of 1 output types orphaned on disk.
Left to do
Move outputs to canonical location. Update producer to write there. Delete old path.
My fit reasoning
1 output type(s) orphaned. Institutional memory generated but never surfaces to operators.
Progress:
Verdict:
SYS-name-threadINFRA

name-thread: Fifth producer writing to thread-inventory/.

M Β· half-dayΒ·owner: ewing
skillswarmsources: producer-registry scan (1 output types, ~10 files)
Context
Names a thread with [tier][domain][action][outcome] convention. Writes to: inventory/thread-inventory/{thread-name}.md. Triggered by: Manual /name-thread.
Already decided
1 of 1 output types orphaned on disk.
Left to do
Move outputs to canonical location. Update producer to write there. Delete old path.
My fit reasoning
1 output type(s) orphaned. Institutional memory generated but never surfaces to operators.
Progress:
Verdict:
SYS-create-featureINFRA

create-feature: PASSPORT.md files orphaned.

S Β· <2hΒ·owner: ewing
skillswarmauditsources: producer-registry scan (2 output types, ~95 files)
Context
Transcript-to-skill induction. Writes SKILL.md + PASSPORT.md. Writes to: skills/{skill-name}/SKILL.md, skills/{skill-name}/PASSPORT.md. Triggered by: Manual /create-feature after a build.
Already decided
1 of 2 output types orphaned on disk.
Left to do
Wire output into /audit as a data source so items appear without grepping disk.
My fit reasoning
1 output type(s) orphaned. Institutional memory generated but never surfaces to operators.
Progress:
Verdict:
SYS-audit-fixlaterINFRA

audit-fixlater: Reconciliation reports orphaned. Verdicts not written back to audit_triage.

S Β· <2hΒ·owner: ewing
skillswarmauditsources: producer-registry scan (1 output types, ~5 files)
Context
Cross-checks fixlater issues against git history. Writes to: inventory/audits/fixlater/{date}-reconciliation.md. Triggered by: Manual /audit-fixlater.
Already decided
1 of 1 output types orphaned on disk.
Left to do
Wire output into /audit as a data source so items appear without grepping disk.
My fit reasoning
1 output type(s) orphaned. Institutional memory generated but never surfaces to operators.
Progress:
Verdict:
SYS-audit-dataINFRA

audit-data: Quality reports orphaned. Health scores not persisted.

S Β· <2hΒ·owner: ewing
skillswarmauditsources: producer-registry scan (1 output types, ~5 files)
Context
Audits Supabase tables for duplicates, invalid phones, missing fields. Writes to: inventory/audits/{date}-data-quality.html. Triggered by: Manual /audit-data.
Already decided
1 of 1 output types orphaned on disk.
Left to do
Wire output into /audit as a data source so items appear without grepping disk.
My fit reasoning
1 output type(s) orphaned. Institutional memory generated but never surfaces to operators.
Progress:
Verdict:
SYS-audit-thread-historyINFRA

audit-thread-history: Reports orphaned on disk.

S Β· <2hΒ·owner: ewing
skillswarmauditsources: producer-registry scan (1 output types, ~3 files)
Context
30-tag CTO audit and offense-ready scoring. Writes to: inventory/audits/{date}-thread-audit.html. Triggered by: Manual /audit-thread-history.
Already decided
1 of 1 output types orphaned on disk.
Left to do
Wire output into /audit as a data source so items appear without grepping disk.
My fit reasoning
1 output type(s) orphaned. Institutional memory generated but never surfaces to operators.
Progress:
Verdict:
SYS-cold-call-workflowINFRA

cold-call-workflow: Activity summaries go to Slack only. No persistent record.

S Β· <2hΒ·owner: ewing
skillswarmauditsources: producer-registry scan (1 output types, ~0 files)
Context
Daily sales activity orchestrator. Writes to: Slack #hermes-ops (not on disk). Triggered by: Daily cron or manual invocation.
Already decided
All outputs surfaced or intentionally ephemeral.
Left to do
Wire output into /audit as a data source so items appear without grepping disk.
My fit reasoning
All outputs reach their intended consumer.
Progress:
Verdict:
SYS-morning-briefingINFRA

morning-briefing: Briefings go to Slack only. Historical briefings not archived.

S Β· <2hΒ·owner: ewing
skillswarmauditsources: producer-registry scan (1 output types, ~0 files)
Context
Daily morning briefing for pipeline status. Writes to: Slack #hermes-ops (not on disk). Triggered by: 8:00 AM daily cron via Hermes.
Already decided
All outputs surfaced or intentionally ephemeral.
Left to do
Wire output into /audit as a data source so items appear without grepping disk.
My fit reasoning
All outputs reach their intended consumer.
Progress:
Verdict:
SYS-migration-drift-checkINFRA

scripts/migration-drift-check.ts: Drift alerts table exists but not wired to /audit or any page.

S Β· <2hΒ·owner: ewing
scriptauditsources: producer-registry scan (2 output types, ~1 files)
Context
Checks migration files against live Supabase schema for drift. Writes to: public/.migration-drift.json, migration_drift_alerts table. Triggered by: Manual invocation or planned cron.
Already decided
2 of 2 output types orphaned on disk.
Left to do
Wire output into /audit as a data source so items appear without grepping disk.
My fit reasoning
2 output type(s) orphaned. Institutional memory generated but never surfaces to operators.
Progress:
Verdict:
SYS-sheet-sync-checkINFRA

scripts/sheet-sync-check.mjs: Drift alerts not surfaced on any page.

S Β· <2hΒ·owner: ewing
scriptauditsources: producer-registry scan (1 output types, ~0 files)
Context
Walks sheet_bindings, compares headers + row count against last sync. Writes to: sheet_drift_alerts table. Triggered by: 4-hour cadence (planned) or manual.
Already decided
1 of 1 output types orphaned on disk.
Left to do
Wire output into /audit as a data source so items appear without grepping disk.
My fit reasoning
1 output type(s) orphaned. Institutional memory generated but never surfaces to operators.
Progress:
Verdict:
SYS-pool-hunt-v2INFRA

engine/contacts/pool_hunt_v2.py: Results orphaned on disk. Should flow to Supabase, not sit in JSON.

M Β· half-dayΒ·owner: ewing
enginesources: producer-registry scan (2 output types, ~2 files)
Context
Pool/spa lead hunt pipeline. Writes to: engine/contacts/output/pool_hunt_v2_output/results.json, engine/contacts/output/pool_hunt_v2_output/summary.json. Triggered by: Manual python run.
Already decided
2 of 2 output types orphaned on disk.
Left to do
Move outputs to canonical location. Update producer to write there. Delete old path.
My fit reasoning
2 output type(s) orphaned. Institutional memory generated but never surfaces to operators.
Progress:
Verdict:
SYS-generate-lettersINFRA

engine/scripts/generate_letters.py: Manifests orphaned. Letters may or may not reach review queue.

S Β· <2hΒ·owner: ewing
engineauditsources: producer-registry scan (2 output types, ~55 files)
Context
Generates HTML letters for prospects. Writes to: engine/scripts/output/{prospect}/*.html, engine/scripts/output/{batch}/manifest.json. Triggered by: Manual python run.
Already decided
1 of 2 output types orphaned on disk.
Left to do
Wire output into /audit as a data source so items appear without grepping disk.
My fit reasoning
1 output type(s) orphaned. Institutional memory generated but never surfaces to operators.
Progress:
Verdict:
SYS-score-and-rankINFRA

engine/scored_lists/score_and_rank.py: Scored CSVs orphaned. Should flow to Supabase for dialer push.

M Β· half-dayΒ·owner: ewing
enginesources: producer-registry scan (1 output types, ~10 files)
Context
Scores and ranks contact lists by vertical-specific criteria. Writes to: engine/scored_lists/{vertical}_scored.csv. Triggered by: Manual python run.
Already decided
1 of 1 output types orphaned on disk.
Left to do
Move outputs to canonical location. Update producer to write there. Delete old path.
My fit reasoning
1 output type(s) orphaned. Institutional memory generated but never surfaces to operators.
Progress:
Verdict:
fixlater-238INFRA

Thread-close architecture research (defers Frankenstein cluster #3 from swarm...

M Β· half-dayΒ·owner: ewing
sources: GH #238 Β· captured 2026-05-27
Context
Thread-close architecture research (defers Frankenstein cluster #3 from swarm-build #046). close2 was built as canonical successor to thread-close (its own SKILL.md says so) but both still wired AND debrief-thread claims the same 'close this thread' trigger β€” 3-way trigger collision the runtime picks nondeterministically. Plus: name-thread, thread-handoff, thread-mine, thread-consolidation-catalog.mjs, thread-dup-loop.mjs, thread-close-migrate.sh all in the same family. The script thread-consolidation-catalog.mjs literally exists to dedup outputs across these β€” the team already knows about the problem. Per Ewing's call 2026-05-27: do NOT touch the 3 collision skills yet. First research what threads SHOULD do at close time after the new architecture (post-output-skill-merge + post-audit-dir-consolidation) settles. Rebuild the unified thread-close skill ONCE after the architecture turnover, not before. Need: (1) catalog every artifact a thread close produces today across the 5 skills, (2) catalog every destination they write to (inventory/thread-inventory + inventory/thread-audit + inventory/handoff + inventory/handoffs + inventory/thread-handoff + ~/Downloads/debrief), (3) define the single canonical close artifact + destination, (4) write one skill that produces it, (5) make the others thin aliases that point at it. This is filed as TODO-006 on /audit (bucket: DECIDE β†’ BUILD post-research; fit: INFRA; clusters: thread-close, skill-design, frankenstein, architecture). Defers Cluster 3 from inventory/audits/2026-05-27__frankenstein-audit.md.
Already decided
Captured 2026-05-27 via /FixLater. Awaiting triage.
Left to do
Thread-close architecture research (defers Frankenstein cluster #3 from swarm-build #046). close2 was built as canonical successor to thread-close (its own SKILL.md says so) but both still wired AND debrief-thread claims the same 'close this thread' trigger β€” 3-way trigger collision the runtime picks nondeterministically. Plus: name-thread, thread-handoff, thread-mine, thread-consolidation-catalog.mjs, thread-dup-loop.mjs, thread-close-migrate.sh all in the same family. The script thread-consolidation-catalog.mjs literally exists to dedup outputs across these β€” the team already knows about the problem. Per Ewing's call 2026-05-27: do NOT touch the 3 collision skills yet. First research what threads SHOULD do at close time after the new architecture (post-output-skill-merge + post-audit-dir-consolidation) settles. Rebuild the unified thread-close skill ONCE after the architecture turnover, not before. Need: (1) catalog every artifact a thread close produces today across the 5 skills, (2) catalog every destination they write to (inventory/thread-inventory + inventory/thread-audit + inventory/handoff + inventory/handoffs + inventory/thread-handoff + ~/Downloads/debrief), (3) define the single canonical close artifact + destination, (4) write one skill that produces it, (5) make the others thin aliases that point at it. This is filed as TODO-006 on /audit (bucket: DECIDE β†’ BUILD post-research; fit: INFRA; clusters: thread-close, skill-design, frankenstein, architecture). Defers Cluster 3 from inventory/audits/2026-05-27__frankenstein-audit.md.
My fit reasoning
Awaiting triage β€” bucket/effort/fit will be set when an operator reviews the capture.
Progress:
Verdict:
fixlater-235INFRA

swarm-build #046: letters channel burn-down. 7 open items concentrate on lett...

M Β· half-dayΒ·owner: ewing
sources: GH #235 Β· captured 2026-05-27
Context
swarm-build #046: letters channel burn-down. 7 open items concentrate on letters.generate per swarm-build #044's tech-to-business map: FIN-15 (letters.generate STATUS:live + requires_review block), FIN-16 (Stannp cost_ledger writes per send), FIN-23 (/letters/legacy 212 archived letters wired or orphaned), DEC-4 (letter_approvals legacy table alive or dead), KIL-5 (kill /letters/legacy if FIN-23 says orphaned), GH #122 (Tailscale + letter sending pipeline), GH #123 (P1 URGENT: complete letters channel β€” FIN-12 + FIN-15 + FIN-16 + BLD-1). Coordinate as one swarm-build run #046, not 7 sequential fixes.
Already decided
Captured 2026-05-27 via /FixLater. Awaiting triage.
Left to do
swarm-build #046: letters channel burn-down. 7 open items concentrate on letters.generate per swarm-build #044's tech-to-business map: FIN-15 (letters.generate STATUS:live + requires_review block), FIN-16 (Stannp cost_ledger writes per send), FIN-23 (/letters/legacy 212 archived letters wired or orphaned), DEC-4 (letter_approvals legacy table alive or dead), KIL-5 (kill /letters/legacy if FIN-23 says orphaned), GH #122 (Tailscale + letter sending pipeline), GH #123 (P1 URGENT: complete letters channel β€” FIN-12 + FIN-15 + FIN-16 + BLD-1). Coordinate as one swarm-build run #046, not 7 sequential fixes.
My fit reasoning
Awaiting triage β€” bucket/effort/fit will be set when an operator reviews the capture.
Progress:
Verdict:
fixlater-234INFRA

Register 4 missing feature_keys for TODO(iss_0045) markers landed by swarm-bu...

M Β· half-dayΒ·owner: ewing
sources: GH #234 Β· captured 2026-05-27
Context
Register 4 missing feature_keys for TODO(iss_0045) markers landed by swarm-build #045: calls.chat (src/app/api/calls/[id]/chat/route.ts), orphans.suggest (src/app/api/orphans/suggest/route.ts), slack.respond (src/lib/slack-responder.ts), prd.dispatch (src/lib/prd/dispatcher.ts). Each call site currently uses a near-match key (calls.review, admin.stuck-detector, admin.intern-activity, admin.ticket-dashboard) and is tagged TODO(iss_0045) in code. Add dedicated feature defs in src/lib/features/defs/, then update each call site to use the new key and remove the TODO comment.
Already decided
Captured 2026-05-27 via /FixLater. Awaiting triage.
Left to do
Register 4 missing feature_keys for TODO(iss_0045) markers landed by swarm-build #045: calls.chat (src/app/api/calls/[id]/chat/route.ts), orphans.suggest (src/app/api/orphans/suggest/route.ts), slack.respond (src/lib/slack-responder.ts), prd.dispatch (src/lib/prd/dispatcher.ts). Each call site currently uses a near-match key (calls.review, admin.stuck-detector, admin.intern-activity, admin.ticket-dashboard) and is tagged TODO(iss_0045) in code. Add dedicated feature defs in src/lib/features/defs/, then update each call site to use the new key and remove the TODO comment.
My fit reasoning
Awaiting triage β€” bucket/effort/fit will be set when an operator reviews the capture.
Progress:
Verdict:
fixlater-233INFRA

Sweep Python scripts/*.mjs for cost instrumentation. swarm-build #045 instrum...

M Β· half-dayΒ·owner: ewing
sources: GH #233 Β· captured 2026-05-27
Context
Sweep Python scripts/*.mjs for cost instrumentation. swarm-build #045 instrumented 21 TS-side paid-API call sites (Anthropic, Exa, Lob) but Python scripts/*.mjs (Clay enrichments, Google Maps/CSE, Salesfinity webhooks) were out of scope. Until done, all Python-driven spend stays invisible at /admin/features $/mo. Follow same pattern: import recordMetric helper (Python wrapper), pass cost_usd derived from API response. Targets: ~15-20 call sites.
Already decided
Captured 2026-05-27 via /FixLater. Awaiting triage.
Left to do
Sweep Python scripts/*.mjs for cost instrumentation. swarm-build #045 instrumented 21 TS-side paid-API call sites (Anthropic, Exa, Lob) but Python scripts/*.mjs (Clay enrichments, Google Maps/CSE, Salesfinity webhooks) were out of scope. Until done, all Python-driven spend stays invisible at /admin/features $/mo. Follow same pattern: import recordMetric helper (Python wrapper), pass cost_usd derived from API response. Targets: ~15-20 call sites.
My fit reasoning
Awaiting triage β€” bucket/effort/fit will be set when an operator reviews the capture.
Progress:
Verdict:
fixlater-232INFRA

P8: Loan Mart (Hugo) β€” buyer profile shortlist (8-12 named PE buyers with 'wh...

M Β· half-dayΒ·owner: ewing
sources: GH #232 Β· captured 2026-05-27
Context
P8: Loan Mart (Hugo) β€” buyer profile shortlist (8-12 named PE buyers with 'why this buyer' one-liners). Open action item from 2026-05-11 discovery call. /hugo now serves named hub. Cost: $2-3 hunter.
Already decided
Captured 2026-05-27 via /FixLater. Awaiting triage.
Left to do
P8: Loan Mart (Hugo) β€” buyer profile shortlist (8-12 named PE buyers with 'why this buyer' one-liners). Open action item from 2026-05-11 discovery call. /hugo now serves named hub. Cost: $2-3 hunter.
My fit reasoning
Awaiting triage β€” bucket/effort/fit will be set when an operator reviews the capture.
Progress:
Verdict:
fixlater-231INFRA

P7: Elite Multimedia (Jeremy Byrd) β€” named buyer shortlist (multimedia/video-...

M Β· half-dayΒ·owner: ewing
sources: GH #231 Β· captured 2026-05-27
Context
P7: Elite Multimedia (Jeremy Byrd) β€” named buyer shortlist (multimedia/video-production strategics + financial sponsors). $33M EV + $7M PixelFlex debt per 2026-05-11 discovery call. Canonical home at /deals/elite-multimedia. Cost: $2-3 hunter.
Already decided
Captured 2026-05-27 via /FixLater. Awaiting triage.
Left to do
P7: Elite Multimedia (Jeremy Byrd) β€” named buyer shortlist (multimedia/video-production strategics + financial sponsors). $33M EV + $7M PixelFlex debt per 2026-05-11 discovery call. Canonical home at /deals/elite-multimedia. Cost: $2-3 hunter.
My fit reasoning
Awaiting triage β€” bucket/effort/fit will be set when an operator reviews the capture.
Progress:
Verdict:
fixlater-230INFRA

P6: Puddle Pools β€” promote /signatures to PROD with NDA + engagement letter t...

M Β· half-dayΒ·owner: ewing
sources: GH #230 Β· captured 2026-05-27
Context
P6: Puddle Pools β€” promote /signatures to PROD with NDA + engagement letter templates + 24h reminder. Closes proposal_sent β†’ engaged transition. /signatures v1 already shipped (Pass 0 feature #3); needs PROD promotion only. Cost: $0.
Already decided
Captured 2026-05-27 via /FixLater. Awaiting triage.
Left to do
P6: Puddle Pools β€” promote /signatures to PROD with NDA + engagement letter templates + 24h reminder. Closes proposal_sent β†’ engaged transition. /signatures v1 already shipped (Pass 0 feature #3); needs PROD promotion only. Cost: $0.
My fit reasoning
Awaiting triage β€” bucket/effort/fit will be set when an operator reviews the capture.
Progress:
Verdict:
fixlater-229INFRA

P5: Capstone reroofing target inventory dashboard at /deals/capstone-construc...

M Β· half-dayΒ·owner: ewing
sources: GH #229 Β· captured 2026-05-27
Context
P5: Capstone reroofing target inventory dashboard at /deals/capstone-construction/targets. Ches Booker needs to see flow BEFORE signing proposal. Cost: $3-5 hunter on commercial reroofing operators. Engagement fee $50K+ at risk if deal goes cold.
Already decided
Captured 2026-05-27 via /FixLater. Awaiting triage.
Left to do
P5: Capstone reroofing target inventory dashboard at /deals/capstone-construction/targets. Ches Booker needs to see flow BEFORE signing proposal. Cost: $3-5 hunter on commercial reroofing operators. Engagement fee $50K+ at risk if deal goes cold.
My fit reasoning
Awaiting triage β€” bucket/effort/fit will be set when an operator reviews the capture.
Progress:
Verdict:
fixlater-228INFRA

P4: Design Precast weekly cadence dashboard at /deals/design-precast/standup....

M Β· half-dayΒ·owner: ewing
sources: GH #228 Β· captured 2026-05-27
Context
P4: Design Precast weekly cadence dashboard at /deals/design-precast/standup. Built FROM existing 248 transcript_extractions β€” no Exa needed. Chris Fore expects weekly cadence: new targets, stage moves, NOT_FIT drops, next 5 calls. Cost: $0-1.
Already decided
Captured 2026-05-27 via /FixLater. Awaiting triage.
Left to do
P4: Design Precast weekly cadence dashboard at /deals/design-precast/standup. Built FROM existing 248 transcript_extractions β€” no Exa needed. Chris Fore expects weekly cadence: new targets, stage moves, NOT_FIT drops, next 5 calls. Cost: $0-1.
My fit reasoning
Awaiting triage β€” bucket/effort/fit will be set when an operator reviews the capture.
Progress:
Verdict:
fixlater-227INFRA

P3: HR.com buyer universe β€” ship from existing 17 buyer_signals captured in t...

M Β· half-dayΒ·owner: ewing
sources: GH #227 Β· captured 2026-05-27
Context
P3: HR.com buyer universe β€” ship from existing 17 buyer_signals captured in transcript_extractions. Cost: $2-3 hunter waterfall on top-20 HR-tech PE buyers. Closes sell-side mandate next milestone. /deals/hr-com is the canonical surface.
Already decided
Captured 2026-05-27 via /FixLater. Awaiting triage.
Left to do
P3: HR.com buyer universe β€” ship from existing 17 buyer_signals captured in transcript_extractions. Cost: $2-3 hunter waterfall on top-20 HR-tech PE buyers. Closes sell-side mandate next milestone. /deals/hr-com is the canonical surface.
My fit reasoning
Awaiting triage β€” bucket/effort/fit will be set when an operator reviews the capture.
Progress:
Verdict:
fixlater-226INFRA

P2: Apply 7 Feature Catalog V2 migrations to prod Supabase via csv-stage-and-...

M Β· half-dayΒ·owner: ewing
sources: GH #226 Β· captured 2026-05-27
Context
P2: Apply 7 Feature Catalog V2 migrations to prod Supabase via csv-stage-and-diff. Files: supabase/migrations/2026_05_27{,_b,_c,_d,_e,_f,_h}__fcv2_*.sql + 2026_05_28__feature_apply_status.sql. Use scripts/csv-stage-and-diff.mjs inspection-in-the-loop pattern. Gated β€” needs explicit Ewing ack before any DB write.
Already decided
Captured 2026-05-27 via /FixLater. Awaiting triage.
Left to do
P2: Apply 7 Feature Catalog V2 migrations to prod Supabase via csv-stage-and-diff. Files: supabase/migrations/2026_05_27{,_b,_c,_d,_e,_f,_h}__fcv2_*.sql + 2026_05_28__feature_apply_status.sql. Use scripts/csv-stage-and-diff.mjs inspection-in-the-loop pattern. Gated β€” needs explicit Ewing ack before any DB write.
My fit reasoning
Awaiting triage β€” bucket/effort/fit will be set when an operator reviews the capture.
Progress:
Verdict:
fixlater-225INFRA

P1: BUILD-03 deals.financials roll-up (SQL only, $0, ~30min). Roll existing t...

M Β· half-dayΒ·owner: ewing
sources: GH #225 Β· captured 2026-05-27
Context
P1: BUILD-03 deals.financials roll-up (SQL only, $0, ~30min). Roll existing transcript_extractions facts UP into deals.financials JSONB. Already verified live: 5 engaged-track deals have ev_estimate_usd populated, 1,077 extractions across them β€” facts ARE captured, just not aggregated. See inventory/thread-inventory/QUARTERBACK_BUILD_03_VERDICT.md for SQL skeleton. Apply via csv-stage-and-diff.
Already decided
Captured 2026-05-27 via /FixLater. Awaiting triage.
Left to do
P1: BUILD-03 deals.financials roll-up (SQL only, $0, ~30min). Roll existing transcript_extractions facts UP into deals.financials JSONB. Already verified live: 5 engaged-track deals have ev_estimate_usd populated, 1,077 extractions across them β€” facts ARE captured, just not aggregated. See inventory/thread-inventory/QUARTERBACK_BUILD_03_VERDICT.md for SQL skeleton. Apply via csv-stage-and-diff.
My fit reasoning
Awaiting triage β€” bucket/effort/fit will be set when an operator reviews the capture.
Progress:
Verdict:
fixlater-224INFRA

[cloud-handoff] Add .gitignore exclusion for archive/cloud-thread/ to mirror ...

M Β· half-dayΒ·owner: ewing
sources: GH #224 Β· captured 2026-05-27
Context
[cloud-handoff] Add .gitignore exclusion for archive/cloud-thread/ to mirror the existing archive/thread-close/ exclusion. Currently main's .gitignore has 'archive/thread-close/' but not 'archive/cloud-thread/' (the namespace used by scripts/thread-handoff-process.sh). Without it, the script's working-tree scratch could leak onto main commits if a guard ever fails. Add the line right under the existing thread-close entry. Trivial fix. Bucket: FINALIZE. Priority: P3. Cluster: cloud-handoff, infra.
Already decided
Captured 2026-05-27 via /FixLater. Awaiting triage.
Left to do
[cloud-handoff] Add .gitignore exclusion for archive/cloud-thread/ to mirror the existing archive/thread-close/ exclusion. Currently main's .gitignore has 'archive/thread-close/' but not 'archive/cloud-thread/' (the namespace used by scripts/thread-handoff-process.sh). Without it, the script's working-tree scratch could leak onto main commits if a guard ever fails. Add the line right under the existing thread-close entry. Trivial fix. Bucket: FINALIZE. Priority: P3. Cluster: cloud-handoff, infra.
My fit reasoning
Awaiting triage β€” bucket/effort/fit will be set when an operator reviews the capture.
Progress:
Verdict:
fixlater-223INFRA

[cloud-handoff] Unify INDEX_CLOUD.md into INDEX.md with a 'source' column. Ar...

M Β· half-dayΒ·owner: ewing
sources: GH #223 Β· captured 2026-05-27
Context
[cloud-handoff] Unify INDEX_CLOUD.md into INDEX.md with a 'source' column. Architect explicitly deferred this on 2026-05-25 β€” cloud-thread archives currently land in a sibling INDEX_CLOUD.md (separate trust tier, separate namespace archive/cloud-thread/*) so cloud-LLM hallucinations don't poison /architect and /swarm-build queries that expect every row to represent shipped code. Once 20+ cloud archives accumulate AND queries start needing cross-namespace filters, merge by: (a) extend cmd_index in scripts/thread-close-archive.sh to also iterate archive/cloud-thread/*, (b) add 'source: local|cloud' column to INDEX.md, (c) delete INDEX_CLOUD.md regenerator from scripts/thread-handoff-process.sh. Trust split preserved via source column instead of separate files. Bucket: BUILD. Priority: P3. Cluster: cloud-handoff, infra.
Already decided
Captured 2026-05-27 via /FixLater. Awaiting triage.
Left to do
[cloud-handoff] Unify INDEX_CLOUD.md into INDEX.md with a 'source' column. Architect explicitly deferred this on 2026-05-25 β€” cloud-thread archives currently land in a sibling INDEX_CLOUD.md (separate trust tier, separate namespace archive/cloud-thread/*) so cloud-LLM hallucinations don't poison /architect and /swarm-build queries that expect every row to represent shipped code. Once 20+ cloud archives accumulate AND queries start needing cross-namespace filters, merge by: (a) extend cmd_index in scripts/thread-close-archive.sh to also iterate archive/cloud-thread/*, (b) add 'source: local|cloud' column to INDEX.md, (c) delete INDEX_CLOUD.md regenerator from scripts/thread-handoff-process.sh. Trust split preserved via source column instead of separate files. Bucket: BUILD. Priority: P3. Cluster: cloud-handoff, infra.
My fit reasoning
Awaiting triage β€” bucket/effort/fit will be set when an operator reviews the capture.
Progress:
Verdict:
fixlater-222INFRA

[cloud-handoff] Process backlog of ~10-15 dead cloud threads through the new ...

M Β· half-dayΒ·owner: ewing
sources: GH #222 Β· captured 2026-05-27
Context
[cloud-handoff] Process backlog of ~10-15 dead cloud threads through the new handoff pipeline. User has 10-15 Claude.ai web / ChatGPT / lost-skill threads queued up to close via the new flow. For each: paste ~/Downloads/CLOUD_HANDOFF_PROMPT.txt into the thread, copy the LLM's HANDOFF.md output, paste/drag into a local Claude Code thread β€” close2 auto-detects schema_version:1+source:cloud and runs scripts/thread-handoff-process.sh process-all, which validates schema, verifies claims, creates archive/cloud-thread/<slug> branch, comments on verified GH issues, moves processed file to inventory/thread-inventory/cloud/. Each cycle is ~2 min once the snippet is in Raycast/Text Replacement. Bucket: BUILD. Priority: P2. Cluster: cloud-handoff, ops.
Already decided
Captured 2026-05-27 via /FixLater. Awaiting triage.
Left to do
[cloud-handoff] Process backlog of ~10-15 dead cloud threads through the new handoff pipeline. User has 10-15 Claude.ai web / ChatGPT / lost-skill threads queued up to close via the new flow. For each: paste ~/Downloads/CLOUD_HANDOFF_PROMPT.txt into the thread, copy the LLM's HANDOFF.md output, paste/drag into a local Claude Code thread β€” close2 auto-detects schema_version:1+source:cloud and runs scripts/thread-handoff-process.sh process-all, which validates schema, verifies claims, creates archive/cloud-thread/<slug> branch, comments on verified GH issues, moves processed file to inventory/thread-inventory/cloud/. Each cycle is ~2 min once the snippet is in Raycast/Text Replacement. Bucket: BUILD. Priority: P2. Cluster: cloud-handoff, ops.
My fit reasoning
Awaiting triage β€” bucket/effort/fit will be set when an operator reviews the capture.
Progress:
Verdict:

BUILD45 items

Decision made, scope clear, nothing built yet.

MIS-035INFRA

Mission 035 β€” Busitechgraph Pass 4 (Great Rebuild continuation)

L Β· full-day+Β·owner: ewing
infraswarmpipelinedealsconsolidationsources: inventory/missions/035-busitechgraph-rebuild/ Β· branch mission/035-pass-4-layout Β· D1 audit 2026-05-26
Context
Pass 4 of The Great Rebuild β€” finishes what Passes 0-3 designed but did not fully ship. D1 audit confirmed all 7 fcv2 migrations applied to prod (feature_catalog_v2=0 rows awaiting seed, arch_decisions=6 rows live, deal_pages=5 rows pending schema move to documents). Net-new work: commands + command_routes tables (the unified user-vocabulary layer Ewing identified β€” Command becomes the 13th meta-pattern hiding under skill/agent/tool/MCP terminology), seed migration for 58 features from FCV2_FINAL.md, 5 unbuilt Verifier recipes (blind_first_gate, deal_first_clone_gate, intern_tier_blast_radius, field_registry_drift_check, feature_def_present_for_route), entity_registry v0.2 β†’ v1.0 promotion, /deal router as first Command-entity instance. 12th BLOCKING Master Rule "One Canonical Deal Room" was locked 2026-05-27 (30 min before mission opened).
Already decided
Mission opened 2026-05-26. Step 1 INDEX + entity_registry v0.2 seed + PASS_4_SEQUENCE landed on branch mission/035-pass-4-layout (commit e392cc6f). Audit-rescue commit (e1c46720) preserved 1 orphan audit file. Architect verdict: own canonical branch (mission/<NNN>-<slug>). Data-architect verdict: 12 audit files from other sessions stay attributed to their producers. Ewing rule: no Exa spend, layout work only. Original $42 / 22-day estimate revised to $28 / 16 days after dropping data-fill tasks.
Left to do
Open fresh thread per inventory/missions/035-busitechgraph-rebuild/NEXT-THREAD-START-HERE.md. Run Week 1.0 SCHEMA_MOVE_FIRST migration (documents unified artifact index). Land Weeks 1-4 per sequence doc.
My fit reasoning
Canonical-vocabulary + entity-registry layer underpins every other function. Without unified Command entity routing, every new skill multiplies the 108-skill discoverability problem. Without seeded feature_catalog_v2, "is this already shipped" stays a guess. INFRA-tier but with the highest leverage of any current INFRA item β€” it makes the 4 go-forward functions discoverable and re-runnable.
Progress:
Verdict:
last saved 5/27/2026, 12:58:01 AM
BLD-1FIT→ In flight

Personalized letter paragraph generation

M Β· half-dayΒ·owner: claude-api
lettersleadgensources: engine/contacts/pipeline/generate_letters.py:249 TODO
Context
engine/contacts/pipeline/generate_letters.py line 249 has a TODO: 'call AI to generate personalized paragraphs.' Letters today probably use boilerplate templated paragraphs; the personalization (specific to that owner/company/situation) is the missing layer.
Already decided
Letter pipeline exists. Templates land in /letters/legacy. Stannp wired.
Left to do
Wire an Anthropic call into the letter generation flow. Pass in company context (revenue, owner, recent signals). Generate 1-2 personalized paragraphs. Splice into template. Each letter becomes owner-specific.
My fit reasoning
Templates + personalization = function #3. Personalized letters are demonstrably higher response than boilerplate.
Progress:
Verdict:
last saved 5/23/2026, 4:07:32 AM
BLD-2INFRA

exa_recipe.py output type mapping

S Β· <2hΒ·owner: claude-api
exasources: engine/lib/exa_recipe.py:30 TODO Β· inventory/missions/exa-consolidation/Q-BACKLOG.md
Context
engine/lib/exa_recipe.py line 30 has a TODO about mapping back to output types. exa-recipe is the operator-composable Exa search recipes feature (commit d07015e 2026-05-17). Output-type mapping feeds results into downstream surfaces.
Already decided
Recipe framework shipped via UVD flow.
Left to do
Implement output-type mapping for recipe results. Small TODO.
My fit reasoning
Exa internals. Important for the recipe feature to be usable but not lead-generating directly.
Progress:
Verdict:
last saved 5/27/2026, 12:58:02 AM
BLD-8INFRA

Raise /thread-mine session limit on personal run to 200

S Β· <2hΒ·owner: ewing
infrasources: INDEX.md Gaps #5 Β· PROJECT_PLAN.md Unresolved #5
Context
thread-mine skill defaults to 30 sessions. MacBook personal Run 1 returned 100 (capped) but only stored 30 of them (separate bug, fixed in Run 5). Older sessions on the MacBook personal account were not captured β€” your sidebar showed ~90+ visible. Limit:200 would catch them.
Already decided
Skill supports limit override. Run 5 ran with 100 successfully.
Left to do
Re-run /thread-mine on MacBook personal with limit:200. Will surface another wave of cluster categories that today's plan does not reflect.
My fit reasoning
Meta tooling. Important for this audit cycle to be complete, but the tooling itself does not serve leads.
Progress:
Verdict:
last saved 5/27/2026, 12:58:02 AM
TODO-001INFRA

Sweep Python scripts/*.mjs for cost instrumentation

M Β· half-dayΒ·owner: claude-api
costinstrumentationhermessalesfinityclaysources: GH #233 Β· skills/swarm-build/notebook/2026-05-26__045__instrument-spend-cost-rollup-fix.md
Context
swarm-build #045 instrumented 21 TS-side paid-API call sites (Anthropic + Exa + Lob) but Python scripts/*.mjs (Clay enrichments, Google Maps/CSE, Salesfinity webhooks) were explicitly out of scope. Until done, Python-driven spend stays invisible at /admin/features $/mo column β€” meaning enrichment + dialer spend are silent.
Already decided
TS sweep canonical pattern is: capture cost from API response (Anthropic usage tokens via anthropicCostMeta(), Exa via response.costDollars, Lob via response.price with $0.89 fallback). recordMetric() already supports cost_usd. spend_log is DEPRECATED β€” write to feature_metrics.cost_usd.
Left to do
Inventory paid-API call sites in scripts/*.mjs (likely 15-20). Build Python recordMetric wrapper if absent (writes to public.feature_metrics via Supabase service role key). Map each call to an existing feature_key from src/lib/features/registry.ts. Cost capture per API per #045 conventions.
My fit reasoning
Pure observability β€” does not directly serve the 4 functions but blocks accurate $/mo attribution for enrichment, dialer, geo-validation. Until this lands, "balance effort by cost" cannot work for Python-driven spend.
Progress:
Verdict:
TODO-003FIT

swarm-build #046 β€” letters channel burn-down (7 items)

L Β· full-day+Β·owner: claude-api
lettersswarmdealsconsolidationsources: GH #235 Β· letters.generate concentration cluster from swarm-build #044 (FIN-15, FIN-16, FIN-23, DEC-4, KIL-5 + GH #122, #123)
Context
swarm-build #044 (/admin/features tech↔business map) revealed that letters.generate is the single feature with the most concentrated open backlog on the platform: 7 items spanning FIN-15 (requires_review block), FIN-16 (Stannp cost ledger writes), FIN-23 (/letters/legacy 212-letter index orphaned check), DEC-4 (letter_approvals legacy table alive/dead), KIL-5 (kill /letters/legacy if orphaned), GH #122 (Tailscale + sending pipeline), GH #123 (P1 URGENT β€” complete letters channel).
Already decided
Letters pipeline exists end-to-end: BLD-1 personalized paragraphs queued, Stannp wired, /letters/legacy + letter_approvals legacy artifacts unverified. Single-feature concentration justifies one coordinated swarm-build over 7 sequential fixes.
Left to do
Open swarm-build #046 with mission "letters channel β€” verify shipped, kill orphans, close requires_review path, prove Stannp cost ledger writes, decide /letters/legacy fate." Phase 0 inventory: re-read FIN-15/16/23 + DEC-4 + KIL-5 + GH #122/#123. Phase 1 split: verifiers (FIN-23 /letters/legacy 404 check + DEC-4 letter_approvals grep) parallel with executors (BLD-1 personalized paragraphs + FIN-16 cost ledger wire). Phase 3 audit gate before sending any test letter.
My fit reasoning
Letters are function #3 (templates) AND function #4 (target outreach). Closing this channel end-to-end unlocks Mark + interns to use letters as a workflow without weekly "is this wired?" friction.
Progress:
Verdict:
TODO-005INFRA

Add DEV_AUTH_BYPASS env var to src/proxy.ts

S Β· <2hΒ·owner: claude-api
infraauthpreviewswarmsources: GH #237 Β· friction documented across #043 + #044 + #045 notebooks
Context
Every UI-touching swarm-build hits the src/proxy.ts auth gate when verifying locally β€” readIdentity() bypasses on Vercel (process.env.VERCEL check) but local dev requires a real Supabase magic-link session. Today the fallback is "verify post-deploy on Vercel" which delays the verification gate by 60-90s and prevents catching UI regressions before commit.
Already decided
Pattern lives in src/lib/identity.ts readIdentity(). Vercel auto-bypass logic is the template: when process.env.X is set, treat request as identity="ewing" and skip Supabase session check. Extend src/proxy.ts to honor a parallel DEV_AUTH_BYPASS env var, gated to NODE_ENV !== "production" so it never ships.
Left to do
5-line change in src/proxy.ts: read process.env.DEV_AUTH_BYPASS, if set + NODE_ENV !== "production" β†’ skip the supabase.auth.getUser() check and short-circuit to next(). Document in .env.example. Update swarm-build SKILL.md to set DEV_AUTH_BYPASS=1 in Phase 1 local preview verifications.
My fit reasoning
Closes the verification gap on every UI-touching swarm-build run going forward. Pays back in minutes-saved per swarm.
Progress:
Verdict:
fixlater-120FIT

BLD-9: Sub-agent list cleaning vs paid batch API β€” benchmark + playbook

M Β· half-dayΒ·owner: ewing
leadgenexaenrichmentsources: GH #120 Β· MASTER_PLAN BLD-9 Β· 2026-05-22
Context
Codex/Claude Code task sub-agents on the $200/mo plan can run ICP/fit-judgment passes at zero marginal API cost. Order: (1) free deterministic Python, (2) coding-agent task sub-agents for judgment, (3) paid batch API only for residue. For step 3, GPT-5 nano/mini at batch and flex tiers are same price β€” prefer flex unless 24h latency is fine. Inflection point unknown.
Already decided
Premise documented. Scope set: document playbook + benchmark + threshold-codify + reproducibility check.
Left to do
Document playbook in skills/hunter/ or skills/list-clean/. Benchmark sub-agent throughput vs batch on a real NC list (precast or solar). Codify size/complexity threshold where we flip sub-agents β†’ batch API. Verify reproducibility (sub-agents aren't pinned to versioned model).
My fit reasoning
Cost-optimized lead-cleaning β€” function #1.
Progress:
Verdict:
last saved 5/27/2026, 12:58:18 AM
fixlater-136FIT

P0: Phoenix Drive-By Plan β€” 205 offices, June Lunch & Learn

L Β· full-day+Β·owner: ewing + mark
phoenix-llleadgendealssources: GH #136 Β· Sheet 1pkVbmV1IJxxOJ2RJED5zjzdQrrt_9EOYC_DKKf2Fc6A Β· 2026-05-25
Context
Walk or drive office-to-office across Phoenix metro and personally invite business owners to June Lunch & Learn. Event: "3 Things Owners Are Doing Instead of Selling to Private Equity." Two venues: Capital Grille Biltmore + Kierland. Cap 12 seats/event. 205 dialable, qualified contacts with exact addresses in Sheet at https://docs.google.com/spreadsheets/d/1pkVbmV1IJxxOJ2RJED5zjzdQrrt_9EOYC_DKKf2Fc6A/edit#gid=1094962103.
Already decided
Venues + script + list locked. 203/205 have street addresses. Sorting by city cluster (Phoenix 98, Glendale 6, Peoria 3, Avondale 1, Goodyear 2, Surprise 1, Scottsdale 13, Tempe 21, Mesa 16, Chandler 15, Gilbert 25).
Left to do
Decide drive-by execution (Ewing, Mark, or both). Prioritize highest-revenue contacts. Build daily route via Google Maps multi-stop. Track visits + responses (add Status column to sheet). Phone follow-up for misses.
My fit reasoning
Active lead-gen + sell-side event filling β€” function #1 + #4.
Progress:
Verdict:
last saved 5/27/2026, 12:58:18 AM
fixlater-155INFRA

Quarterly audit-skills run: detect orphan files from renamed skills

S Β· <2hΒ·owner: cron
infraauditsources: GH #155 Β· maxswarm run #019 skills-sync-architecture Β· 2026-05-24
Context
LaunchAgent uses git pull --ff-only which never deletes files not tracked in remote. If a skill is renamed (e.g., maxswarm/ β†’ swarm/), the old path stays on disk on every machine. Over time creates ghost skills that load stale instructions.
Already decided
Procedure decided: diff disk vs canonical skills/ listing. 30-day warning then rm on next bootstrap.
Left to do
Create scripts/audit-skills.sh that diffs ~/.claude/skills/ against current next-chapter-os/skills/. Run quarterly via CronCreate or Slack reminder.
My fit reasoning
Skill-loader integrity. Stale skills = wrong agent behavior.
Progress:
Verdict:
last saved 5/27/2026, 12:58:19 AM
fixlater-188FIT

swarm-build #047: 3 missing deal canonical-home page.tsx (design-precast, hr-com, loanmart-hugo)

M Β· half-dayΒ·owner: ewing
dealsplatformuisources: GH #188
Context
## Why audit-fixlater 2026-05-26 (inventory/audits/fixlater/2026-05-26-burndown-audit.md) identified this as the highest-leverage architect-class cluster. Three deal canonical-home pages are MISSING from src/app/deals/: - src/app/deals/design-precast/page.tsx - src/app/deals/hr-com/page.tsx - src/app/deals/loanmart-hugo/page.tsx Per AGENTS.md Deal-First-Then-Clone rule, every deal-room page must have its canonical home at /deals/<slug>/. Six dependent items create orphan content if shipped before the hubs exist: - #116 β€” Recover deleted DDP hub pages - #117 β€” Refactor HR.com followups to c
Already decided
Auto-imported from GH #188 during 2026-05-27 audit regen.
Left to do
See GH issue for full scope.
My fit reasoning
Auto-classified build by regen script β€” refine when item is triaged.
Progress:
Verdict:
fixlater-195FIT

HR.com 4-way folder sprawl consolidation per One Canonical Deal Room master r...

M Β· half-dayΒ·owner: ewing
dealssources: GH #195
Context
HR.com 4-way folder sprawl consolidation per One Canonical Deal Room master rule. Today the HR.com deal has artifacts scattered across 4 disk locations: public/hrcom/ (8 subdirs, 158 files), public/projects/hrcom/ (engagement letter docx+pdf + call-cards), public/client/hrcom/ (dossiers, transcripts, index), public/deal-rooms/hrcom/ (index.html only). Consolidate into public/deal-rooms/hrcom/ as the single canonical disk home. Surface from /deals/hr-com/documents tab. This is the worst-case sprawl in the system right now and the model for what to clean up everywhere else. --- Captured via /Fi
Already decided
Auto-imported from GH #195 during 2026-05-27 audit regen.
Left to do
See GH issue for full scope.
My fit reasoning
Auto-classified build by regen script β€” refine when item is triaged.
Progress:
Verdict:
fixlater-197FIT

Build the HR.com CIM (Confidential Information Memorandum) β€” the storybook-st...

M Β· half-dayΒ·owner: ewing
dealssources: GH #197
Context
Build the HR.com CIM (Confidential Information Memorandum) β€” the storybook-style narrative document equivalent to public/deal-rooms/loanmart-hugo/cim.html. Today HR.com has a deal room (public/deal-rooms/hrcom/index.html titled 'Project Summit') but no CIM. Per Blind-First master rule the blind sibling must ship first. Codename per inventory/blind-codenames.json (assign one if not present). Source material: public/hrcom/dossiers/ (63 files), public/hrcom/transcripts/ (63 files), public/hrcom/reports/ (13 files), public/projects/hrcom/NextChapter_HR_com_Final.docx for engagement context. --- C
Already decided
Auto-imported from GH #197 during 2026-05-27 audit regen.
Left to do
See GH issue for full scope.
My fit reasoning
Auto-classified build by regen script β€” refine when item is triaged.
Progress:
Verdict:
fixlater-201FIT

swarm-build #049: drive-by route waypoint hardening + invented-business gate

S Β· <2hΒ·owner: ewing
platformuisources: GH #201
Context
## Why audit-fixlater 2026-05-26 (`inventory/audits/drive-by-route-invented-business-audit-2026-05-26.md`) traced a real bug: when 'current location' is the route start, 2 businesses NOT in our `campaign_targets` roster get added to the last 10 stops. Root cause: `DriveByTab.tsx:357` builds Google Maps Directions waypoints as text (`"${name}, ${city}, ${state}"`) instead of coordinates. When companies have city+state only (no street address), Google's Place Resolver picks a different business with the same name; `optimize:true` shuffles those mis-resolved waypoints to the end. The audit rule
Already decided
Auto-imported from GH #201 during 2026-05-27 audit regen.
Left to do
See GH issue for full scope.
My fit reasoning
Auto-classified build by regen script β€” refine when item is triaged.
Progress:
Verdict:
fixlater-205FIT

Wire create-feature -> feature-def-from-thread at the end of induction. Archi...

M Β· half-dayΒ·owner: ewing
platformsources: GH #205
Context
Wire create-feature -> feature-def-from-thread at the end of induction. Architect's recommendation: every induced skill must auto-register in feature_catalog_v2 (call feature-def-from-thread after Phase 4 writes SKILL.md). Without this, the catalog drifts every time create-feature runs. ~30 LOC change to skills/create-feature/create-feature.sh. --- Captured via /FixLater on 2026-05-27 from branch `main` on `MacBook-115.local`.
Already decided
Auto-imported from GH #205 during 2026-05-27 audit regen.
Left to do
See GH issue for full scope.
My fit reasoning
Auto-classified build by regen script β€” refine when item is triaged.
Progress:
Verdict:
fixlater-207FIT

Replace SessionEnd hook with universal-capture path (commit-watcher LaunchAge...

M Β· half-dayΒ·owner: ewing
infraplatformsources: GH #207
Context
Replace SessionEnd hook with universal-capture path (commit-watcher LaunchAgent OR debrief-thread invocation). Architect's structural recommendation: SessionEnd is Claude-Code-only β€” misses Cowork, Codex, intern sessions. Worktree-fragile (already fixed in v2 by basename match, but the next surface bug will look the same). Pattern exists at launchagents/com.nextchapter.toolbox-receiver.plist for git-watch jobs. Likely depends on FixLater #204 (signal fix) landing first. --- Captured via /FixLater on 2026-05-27 from branch `main` on `MacBook-115.local`.
Already decided
Auto-imported from GH #207 during 2026-05-27 audit regen.
Left to do
See GH issue for full scope.
My fit reasoning
Auto-classified build by regen script β€” refine when item is triaged.
Progress:
Verdict:
fixlater-208FIT

debrief-thread SKILL.md claims it triggers an induction if the thread shipped...

M Β· half-dayΒ·owner: ewing
platformsources: GH #208
Context
debrief-thread SKILL.md claims it triggers an induction if the thread shipped a new feature. No wire exists. Either delete the claim from skills/debrief-thread/SKILL.md or build the wire (likely the latter β€” debrief-thread is the right invocation surface for create-feature per architect's review). Surface bug: a claim with no implementation is worse than no claim. --- Captured via /FixLater on 2026-05-27 from branch `main` on `MacBook-115.local`.
Already decided
Auto-imported from GH #208 during 2026-05-27 audit regen.
Left to do
See GH issue for full scope.
My fit reasoning
Auto-classified build by regen script β€” refine when item is triaged.
Progress:
Verdict:
fixlater-219FIT

Map tab v2: replace P/H/R/E category letters with verdict shape (circle/squar...

M Β· half-dayΒ·owner: ewing
platformuisources: GH #219
Context
Map tab v2: replace P/H/R/E category letters with verdict shape (circle/square/triangle) + data-completeness color (saturated/muted/outline). Watch telemetry from swarm-build #048 first β€” clustering may have obviated far-zoom category scanning. File: src/app/campaigns/[slug]/tracker/MapTab.tsx CompanyPinContent --- Captured via /FixLater on 2026-05-27 from branch `feat/048-map-multiselect` on `MacBook-115.local`.
Already decided
Auto-imported from GH #219 during 2026-05-27 audit regen.
Left to do
See GH issue for full scope.
My fit reasoning
Auto-classified build by regen script β€” refine when item is triaged.
Progress:
Verdict:
GIT-BR-3PARTIAL

Branch: feat/048-map-multiselect β€” 3 commits ahead, 28 behind main

M Β· half-dayΒ·owner: ewing
gitmapcampaignssources: git branch audit 2026-05-26 Β· worktree at next-chapter-os-048-map-multiselect
Context
Swarm-build #048 β€” MapTab selection state + MapSelectionBar. 3 commits of real feature work (multi-select on the campaign map). Has its own worktree checkout at ~/Github/next-chapter-os-048-map-multiselect. 28 commits behind main β€” significant divergence. Touches package-lock, thread-inventory, backlog stubs, and campaign map components.
Already decided
Feature partially built (3/4 phases of swarm-build #048).
Left to do
Decide: (a) Finish phase 4 of swarm-build, rebase, merge. (b) Abandon β€” map multiselect not a priority. (c) Cherry-pick the MapSelectionBar component to main, discard the rest.
My fit reasoning
Map multi-select helps campaign target review (function #2 β€” process leads). Worth finishing if campaigns are active.
Progress:
Verdict:
last saved 5/27/2026, 12:58:20 AM
SYS-META-001INFRA

32 output producers cataloged; 34 of 53 output types orphaned

L Β· full-day+Β·owner: ewing
auditinfraconsolidationsources: producer-registry meta-analysis
Context
The system has 32 distinct producers. Of 53 output types, 34 orphaned, 6 partial, 10 surfaced. 25 producers need action.
Already decided
Producer registry created. System items wired to /audit as 4th source.
Left to do
For each orphaned output: decide surface, index, migrate, or kill.
My fit reasoning
Meta-infrastructure. Operators building without this visibility waste cycles rediscovering what the system already produced.
Progress:
Verdict:
SYS-META-003INFRA

Drift alerts (migration + sheet) exist in DB but not surfaced on any page

M Β· half-dayΒ·owner: ewing
auditsupabaseinfrasources: migration_drift_alerts table, sheet_drift_alerts table
Context
migration-drift-check.ts writes to migration_drift_alerts. sheet-sync-check.mjs writes to sheet_drift_alerts. Both tables exist. Neither has a UI reader.
Already decided
Tables created. Scripts exist. Detection works.
Left to do
Wire drift alerts as new /audit source. Each open alert becomes an audit item.
My fit reasoning
Drift detection without a reader is a smoke detector with no alarm.
Progress:
Verdict:
SYS-META-004INFRA

inventory/audits/ has 20+ HTML reports with no index β€” institutional memory invisible from UI

S Β· <2hΒ·owner: ewing
auditinfrasources: inventory/audits/ directory scan
Context
Various audit skills write HTML reports to inventory/audits/. Valuable findings β€” modeling rule violations, data quality scores, skill health. Nobody finds them unless they know to look.
Already decided
Reports generated correctly. File naming consistent.
Left to do
Build /audit/reports viewer listing all HTML reports with date, size, preview. Link from main /audit.
My fit reasoning
Makes prior audit work discoverable. Prevents re-running audits whose results already exist.
Progress:
Verdict:
SYS-META-006INFRA

101 swarm-build notebooks + 80 journals orphaned β€” no search, no viewer

M Β· half-dayΒ·owner: ewing
swarminfrasources: skills/swarm-build/notebook/ directory scan
Context
maxswarm notebooks get HTML mirrors at /swarm. swarm-build notebooks get nothing β€” 51 runs + 80 journals in markdown on disk. Engineering institutional memory, completely invisible.
Already decided
Notebooks follow standard template. Sequential numbering correct.
Left to do
Generate HTML mirrors like maxswarm, or build /swarm/builds viewer. Add cross-notebook search.
My fit reasoning
Engineering memory. Prior run notebooks have interface contracts, test evidence, lessons.
Progress:
Verdict:
SYS-maxswarmPARTIAL

maxswarm: Contributions and currency events never surfaced. Leaderboard not visible. No cross-notebook search.

L Β· full-day+Β·owner: ewing
skillswarmsources: producer-registry scan (7 output types, ~532 files)
Context
11-agent strategic swarm. Writes run notebooks, per-agent journals, contributions, currency events, and HTML archives. Writes to: skills/maxswarm/notebook/{DATE}__{NNN}__{slug}.md, skills/maxswarm/notebook/journals/{NNN}__{agent}.md, skills/maxswarm/notebook/contributions/{NNN}__{agent}.md, skills/maxswarm/currency/events/{NNN}__{agent}.json, skills/maxswarm/currency/leaderboard.json, public/swarm/{NNN}-{slug}.html, skills/maxswarm/notebook/recent_runs.json. Triggered by: Manual /maxswarm invocation, Phase 6 debrief writes all artifacts.
Already decided
4 of 7 output types orphaned on disk.
Left to do
Build a UI surface (page or panel) that renders these outputs. Add to /audit index.
My fit reasoning
4 output type(s) orphaned. Institutional memory generated but never surfaces to operators.
Progress:
Verdict:
SYS-swarm-buildPARTIAL

swarm-build: Zero notebooks surfaced. 51 runs of engineering memory orphaned on disk.

S Β· <2hΒ·owner: ewing
skillswarmsources: producer-registry scan (3 output types, ~191 files)
Context
5-agent code-building swarm. Writes run notebooks and per-agent journals. Writes to: skills/swarm-build/notebook/{DATE}__{NNN}__{slug}.md, skills/swarm-build/notebook/journals/{NNN}__{agent}.md, skills/swarm-build/notebook/contributions/{NNN}__{agent}.md. Triggered by: Manual /swarm-build invocation, Phase 5 debrief writes artifacts.
Already decided
3 of 3 output types orphaned on disk.
Left to do
Build a UI surface (page or panel) that renders these outputs. Add to /audit index.
My fit reasoning
3 output type(s) orphaned. Institutional memory generated but never surfaces to operators.
Progress:
Verdict:
SYS-feature-def-from-threadPARTIAL

feature-def-from-thread: Defs used by runtime but not browsable from UI.

S Β· <2hΒ·owner: ewing
skillswarmsources: producer-registry scan (1 output types, ~30 files)
Context
Auto-registers feature defs on commit. Writes to: src/lib/features/defs/{slug}.ts. Triggered by: Post-commit hook on /feature: tag.
Already decided
All outputs surfaced or intentionally ephemeral.
Left to do
Build a UI surface (page or panel) that renders these outputs. Add to /audit index.
My fit reasoning
All outputs reach their intended consumer.
Progress:
Verdict:
SYS-swarm-upgradePARTIAL

swarm-upgrade: Proposals discussed in-thread but not persisted as reviewable artifacts.

S Β· <2hΒ·owner: ewing
skillswarmsources: producer-registry scan (1 output types, ~10 files)
Context
Reads swarm notebooks, finds patterns, proposes skill upgrades. Writes to: skills/{skill-name}/SKILL.md (proposed edits). Triggered by: Manual /swarm-upgrade or auto after maxswarm non-PASS.
Already decided
1 of 1 output types orphaned on disk.
Left to do
Build a UI surface (page or panel) that renders these outputs. Add to /audit index.
My fit reasoning
1 output type(s) orphaned. Institutional memory generated but never surfaces to operators.
Progress:
Verdict:
SYS-audit-skillsPARTIAL

audit-skills: Health reports orphaned on disk.

S Β· <2hΒ·owner: ewing
skillswarmsources: producer-registry scan (1 output types, ~3 files)
Context
Automated health check for all installed skills. Writes to: inventory/audits/{date}-skill-health.html. Triggered by: Manual /audit-skills.
Already decided
1 of 1 output types orphaned on disk.
Left to do
Build a UI surface (page or panel) that renders these outputs. Add to /audit index.
My fit reasoning
1 output type(s) orphaned. Institutional memory generated but never surfaces to operators.
Progress:
Verdict:
SYS-cost-ledger-appendPARTIAL

scripts/cost-ledger-append.sh: Cost data exists but no page visualizes spend trends.

S Β· <2hΒ·owner: ewing
scriptsources: producer-registry scan (1 output types, ~1 files)
Context
Appends cost entries to the JSONL cost ledger. Writes to: inventory/cost-ledger.jsonl. Triggered by: Called by debrief at end of swarm runs.
Already decided
1 of 1 output types orphaned on disk.
Left to do
Build a UI surface (page or panel) that renders these outputs. Add to /audit index.
My fit reasoning
1 output type(s) orphaned. Institutional memory generated but never surfaces to operators.
Progress:
Verdict:
SYS-architect-skillPARTIAL

architect: Architecture registry and open issues not surfaced on any page.

S Β· <2hΒ·owner: ewing
skillswarmsources: producer-registry scan (3 output types, ~3 files)
Context
Infrastructure decisions, capability matrix, protected-files audit. Writes to: inventory/architect/architecture.json, inventory/architect/audit_log.jsonl, inventory/architect/open_issues.jsonl. Triggered by: Phase 0/4 of swarm-build, or standalone invocation.
Already decided
3 of 3 output types orphaned on disk.
Left to do
Build a UI surface (page or panel) that renders these outputs. Add to /audit index.
My fit reasoning
3 output type(s) orphaned. Institutional memory generated but never surfaces to operators.
Progress:
Verdict:
SYS-inventory-auditsPARTIAL

inventory/audits/: 20+ HTML reports with no index page. Invisible from UI.

S Β· <2hΒ·owner: ewing
scriptsources: producer-registry scan (2 output types, ~30 files)
Context
Accumulated HTML audit reports from various skills and manual runs. Writes to: inventory/audits/*.html, inventory/audits/data/*.json. Triggered by: Various audit skills write here.
Already decided
2 of 2 output types orphaned on disk.
Left to do
Build a UI surface (page or panel) that renders these outputs. Add to /audit index.
My fit reasoning
2 output type(s) orphaned. Institutional memory generated but never surfaces to operators.
Progress:
Verdict:
fcv2-1FIT

[build-now] writer-safety-fix: Every Exa script imports safely; FixLater #160 closed

S Β· <2hΒ·owner: ewing
tech adminsources: feature_catalog_v2
Context
BUILD-01. Blocks all downstream Exa work.
Already decided
Seeded in fcv2 (Mission 035 Pass 4). Cost estimate: $0.5.
Left to do
Build per PASS_4_SEQUENCE.md dependency order.
My fit reasoning
build-now feature in the Great Rebuild catalog.
Progress:
Verdict:
fcv2-2FIT

[build-now] blind-first-hugo-remediation: Helios blind CIM live at /deal-rooms/helios/; /hugo redirects to blind version

M Β· half-dayΒ·owner: ewing
dealssources: feature_catalog_v2
Context
BUILD-02. Live Master Rule violation β€” wholesaler-poaching risk.
Already decided
Seeded in fcv2 (Mission 035 Pass 4). Cost estimate: $6.
Left to do
Build per PASS_4_SEQUENCE.md dependency order.
My fit reasoning
build-now feature in the Great Rebuild catalog.
Progress:
Verdict:
fcv2-3FIT

[build-now] deal-financials-backfill: 28/35 deals have non-NULL financials; expand-mode trigger wired

M Β· half-dayΒ·owner: ewing
dealssources: feature_catalog_v2
Context
BUILD-03. Banner UI serves nothing while 80% NULL.
Already decided
Seeded in fcv2 (Mission 035 Pass 4). Cost estimate: $4.5.
Left to do
Build per PASS_4_SEQUENCE.md dependency order.
My fit reasoning
build-now feature in the Great Rebuild catalog.
Progress:
Verdict:
fcv2-4FIT

[build-now] deal-first-then-clone-jeremy: /deals/elite-multimedia/ canonical home exists; /jeremy redirects to it

S Β· <2hΒ·owner: ewing
dealssources: feature_catalog_v2
Context
BUILD-04. Active orphan; Jeremy is $100M+ candidate.
Already decided
Seeded in fcv2 (Mission 035 Pass 4). Cost estimate: $2.
Left to do
Build per PASS_4_SEQUENCE.md dependency order.
My fit reasoning
build-now feature in the Great Rebuild catalog.
Progress:
Verdict:
fcv2-5FIT

[build-now] apply-to-all-gate: gate-check.sh exits cleanly; feature_apply_status table tracks per-deal coverage

S Β· <2hΒ·owner: ewing
tech adminsources: feature_catalog_v2
Context
BUILD-05. Prevents 6 Apply-to-All violations from recurring.
Already decided
Seeded in fcv2 (Mission 035 Pass 4). Cost estimate: $1.5.
Left to do
Build per PASS_4_SEQUENCE.md dependency order.
My fit reasoning
build-now feature in the Great Rebuild catalog.
Progress:
Verdict:
fcv2-6FIT

[build-now] meta-feature-def-from-thread: Auto-registers feature defs on commit via /feature: tag or swarm-build #NNN

M Β· half-dayΒ·owner: ewing
tech adminsources: feature_catalog_v2
Context
BUILD-09. Bootstraps every other meta-skill.
Already decided
Seeded in fcv2 (Mission 035 Pass 4). Cost estimate: $3.
Left to do
Build per PASS_4_SEQUENCE.md dependency order.
My fit reasoning
build-now feature in the Great Rebuild catalog.
Progress:
Verdict:
fcv2-7FIT

[build-now] signatures-prod-promotion: /signatures live in PROD with NDA + engagement letter templates + 24h reminder cron

M Β· half-dayΒ·owner: ewing
dealssources: feature_catalog_v2
Context
Quarterback: cuts engagement letter from 2 weeks to 48 hours.
Already decided
Seeded in fcv2 (Mission 035 Pass 4). Cost estimate: $2.
Left to do
Build per PASS_4_SEQUENCE.md dependency order.
My fit reasoning
build-now feature in the Great Rebuild catalog.
Progress:
Verdict:
fcv2-8FIT

[build-now] meta-deal-scaffold: One-command full deal site: 6 canonical pages + blind CIM + Supabase row + codename

M Β· half-dayΒ·owner: ewing
dealssources: feature_catalog_v2
Context
BUILD-07. Highest deal-closing leverage.
Already decided
Seeded in fcv2 (Mission 035 Pass 4). Cost estimate: $3.5.
Left to do
Build per PASS_4_SEQUENCE.md dependency order.
My fit reasoning
build-now feature in the Great Rebuild catalog.
Progress:
Verdict:
fcv2-9FIT

[build-now] meta-page-scaffold: One-command new page with nav + tier + canUse + feature def

S Β· <2hΒ·owner: ewing
efficiencysources: feature_catalog_v2
Context
BUILD-06. 10 future features will use this. Unlocks intern velocity.
Already decided
Seeded in fcv2 (Mission 035 Pass 4). Cost estimate: $2.
Left to do
Build per PASS_4_SEQUENCE.md dependency order.
My fit reasoning
build-now feature in the Great Rebuild catalog.
Progress:
Verdict:
fcv2-10FIT

[build-now] cim-backfill-9-deals: 9 engaged deals have CIMs via deal-scaffold; oldest Apply-to-All violation closed

S Β· <2hΒ·owner: ewing
dealssources: feature_catalog_v2
Context
Proves deal-scaffold works. Zero marginal cost after BUILD-07 ships.
Already decided
Seeded in fcv2 (Mission 035 Pass 4). Cost estimate: $0.
Left to do
Build per PASS_4_SEQUENCE.md dependency order.
My fit reasoning
build-now feature in the Great Rebuild catalog.
Progress:
Verdict:
fcv2-11FIT

[build-now] meta-cost-decorated-enrichment: Every enrichment call wrapped with pre-flight + NOT_FIT filter + breaker + signal log

M Β· half-dayΒ·owner: ewing
efficiencysources: feature_catalog_v2
Context
BUILD-10. 20%+ of enrichment spend currently wasted.
Already decided
Seeded in fcv2 (Mission 035 Pass 4). Cost estimate: $4.
Left to do
Build per PASS_4_SEQUENCE.md dependency order.
My fit reasoning
build-now feature in the Great Rebuild catalog.
Progress:
Verdict:
fcv2-12FIT

[build-now] meta-binding-register: External-store binding registrar: Drive/Salesfinity/Stannp/Lob/Gmail drift detection

S Β· <2hΒ·owner: ewing
tech adminsources: feature_catalog_v2
Context
BUILD-08. Generalizes sheet-bindings to all external systems.
Already decided
Seeded in fcv2 (Mission 035 Pass 4). Cost estimate: $2.5.
Left to do
Build per PASS_4_SEQUENCE.md dependency order.
My fit reasoning
build-now feature in the Great Rebuild catalog.
Progress:
Verdict:
fcv2-13FIT

[build-now] meta-audit-triage-router: Single /triage surface unifying /audit /orphans /sticky /signatures /FixLater

S Β· <2hΒ·owner: mark
efficiencysources: feature_catalog_v2
Context
BUILD-11. Last scaffolder; unifies 5 triage surfaces.
Already decided
Seeded in fcv2 (Mission 035 Pass 4). Cost estimate: $3.
Left to do
Build per PASS_4_SEQUENCE.md dependency order.
My fit reasoning
build-now feature in the Great Rebuild catalog.
Progress:
Verdict:
fcv2-14FIT

[build-now] auto-feature-builder: Meta-skill that auto-builds features: scaffolds page + def + migration + contract

M Β· half-dayΒ·owner: ewing
tech adminsources: feature_catalog_v2
Context
BUILD-14. The actual goal. Possible only after all 6 scaffolders ship.
Already decided
Seeded in fcv2 (Mission 035 Pass 4). Cost estimate: $3.
Left to do
Build per PASS_4_SEQUENCE.md dependency order.
My fit reasoning
build-now feature in the Great Rebuild catalog.
Progress:
Verdict:

DECIDE36 items

No decision made. Item is a question, not a task.

DEC-6FIT

Promotion criteria for probationary Exa signals

S Β· <2hΒ·owner: ewing
exasources: exa.md OQ #3
Context
signal_registry has 16 rows. Some are probationary β€” added for a specific use case but not proven across enough calls. No defined criteria for when a probationary signal graduates to canonical (or gets killed).
Already decided
signal_registry table exists. cost_per_observation declared per signal.
Left to do
Define: N successful uses + P% answer rate + cost-per-validated-fact ceiling. Or different metric.
My fit reasoning
Signal quality is the heart of lead intelligence (function #1). Without graduation criteria, probationary signals never improve or die.
Progress:
Verdict:
last saved 5/27/2026, 12:58:03 AM
DEC-7FIT

9 additional Exa templates β€” still need signal_registry rows?

S Β· <2hΒ·owner: ewing
exasources: exa.md OQ #2
Context
9 Exa templates exist (company_search, owner_search, reviews_search, financials_search, industry_ma, buyer_search, company_financials, employee_sentiment, sell_side_discovery). Before orphan-close migration they had no signal_registry rows. Orphan-close added 11 rows. Coverage unclear.
Already decided
11 signals added. 5 existed. Total 16.
Left to do
Pick: (a) Already covered β€” map templates to existing signals. (b) Add explicit rows per template (9 more).
My fit reasoning
Lead-finding surface area. Each template is a different way to find targets.
Progress:
Verdict:
last saved 5/27/2026, 12:58:03 AM
DEC-8FIT

Q17–Q29+ Exa Q-set candidates β€” approve for v2?

S Β· <2hΒ·owner: ewing
exasources: inventory/missions/exa-consolidation/Q-BACKLOG.md
Context
Q-BACKLOG has 13 candidate Qs proposed (prior_exit_history, competitive_dynamics, customer_concentration_proxies, technology_stack, hiring_signals, regulatory/legal, capital_intensity, vendor_dependencies, geographic_expansion, digital_footprint, industry_certifications, pricing_signals, key_person_press). Per Ewing 2026-05-17: 'add later unless critical now.'
Already decided
v1 (Q1-Q16) locked. Backlog frozen pending live data.
Left to do
Defer all to post 30-day production check. Or pick 2-3 to ship now.
My fit reasoning
Each Q is a lead-intelligence dimension. More Qs = more target context = higher engagement quality. But signal-discipline matters more than volume.
Progress:
Verdict:
last saved 5/27/2026, 12:58:03 AM
DEC-9FIT

Tempest deal β€” current stage

S Β· <2hΒ·owner: ewing
dealssources: deals.md OQ #1
Context
Tempest deal was added to the deals page. Intern was assigned. No recent commits about it.
Already decided
Deal exists. Intern assigned.
Left to do
quarterback skill or deal-manager equivalent should know stage. Update needed.
My fit reasoning
Active deal β€” function #4.
Progress:
Verdict:
last saved 5/27/2026, 12:58:03 AM
DEC-12FIT

Ches Booker proposal outcome (2026-04-30)

S Β· <2hΒ·owner: ewing
dealspipelinesources: pipeline.md Run 3 OQ Β· deals.md commit 5b58d49
Context
Session 'Create proposal and needs analysis for Ches Booker' 2026-04-30. Then commit 5b58d49 added the unified 3-tier engagement letter to deal room. Outcome unclear.
Already decided
Proposal documents produced. Engagement letter committed.
Left to do
Pick: (a) Live engagement, in progress. (b) Stalled, restart. (c) Killed. ches-booker-deal-manager skill should know.
My fit reasoning
Active client engagement β€” function #4.
Progress:
Verdict:
last saved 5/27/2026, 12:58:04 AM
DEC-18FIT→ In flight

mine-meeting-booked-phrases β€” in production use?

S Β· <2hΒ·owner: ewing
callsources: call.md Run 3 OQ Β· branch 8a03093
Context
Script harvested from branch 8a03093. Purpose: mine call transcripts for phrases that indicate a meeting got booked. Feeds buy-signal extraction.
Already decided
Script exists.
Left to do
Pick: (a) Wire into queue_runner.py. (b) Delete script.
My fit reasoning
Meeting-booked signal extraction = top-tier buy signal. If it works, wire it. If unreliable, kill β€” but don't leave it loose.
Progress:
Verdict:
last saved 5/23/2026, 4:22:47 AM
DEC-27FIT

4 precast audit features reassigned to Charlie β€” Charlie started?

S Β· <2hΒ·owner: charlie / ewing
internsources: intern.md OQ Β· commits 1de058e, ed5068c
Context
Commit 1de058e registered 4 precast audit features (design status). ed5068c reassigned from Bear to Charlie 2026-05-11. Still status:design.
Already decided
Assigned to Charlie.
Left to do
Pick: (a) Charlie picks up β€” flip to live as built. (b) Reassign. (c) Drop.
My fit reasoning
Design Precast is an active buy-side roll-up engagement (function #4). The 4 audit features feed target discovery for that deal.
Progress:
Verdict:
last saved 5/27/2026, 12:58:04 AM
DEC-2INFRA

Sales-agent cluster boundary β€” promote or fold

S Β· <2hΒ·owner: ewing
pipelineswarmsources: INDEX.md Gaps #4 Β· PROJECT_PLAN.md Unresolved #4
Context
3 sessions in Run 2 about sales-agent (Slack listener, activity routine, sales-agent skill startup). Currently folded into pipeline cluster. Possibly large enough to be its own cluster on next thread-mine.
Already decided
Currently a subdomain.
Left to do
Pick: (a) Promote to standalone cluster. (b) Keep folded into pipeline.
My fit reasoning
Org/structure decision for documentation purposes only. No code impact.
Progress:
Verdict:
last saved 5/27/2026, 12:58:05 AM
DEC-4INFRA

letter_approvals legacy table β€” alive or dead

S Β· <2hΒ·owner: ewing
letterssources: INDEX.md Gaps #2 Β· PROJECT_PLAN.md S3 Β· PROJECT_PLAN.md Next Action #5 Β· letters.md OQ #1
Context
Migration uvd_flow_letter_review references letter_approvals as 'legacy' β€” superseded. But no CREATE TABLE for it appears in current migration range. Might live in 0000_baseline_schema.sql or might not exist at all.
Already decided
New letter approval flow lives in uvd_flows. Old table referenced as legacy.
Left to do
Resolve via `grep -rE 'letter_approvals' supabase/ src/`. Then: (a) Exists, mark dead, document. (b) Does not exist, remove references.
My fit reasoning
Schema hygiene. Resolves KIL-5 path too.
Progress:
Verdict:
last saved 5/27/2026, 12:58:05 AM
DEC-5INFRA

exa.websets.* deprecated features β€” fully remove or keep internal

S Β· <2hΒ·owner: ewing
exasources: exa.md OQ #1
Context
Original Exa integration used websets API directly. Three feature defs (exa.websets.create/.poll/.items) declared admin-tier with "(deprecated)" labels. ExaMiddleware/exa.refresh is now the canonical path. Deprecated defs still appear in admin UI.
Already decided
Deprecated. Internal-orchestrator only.
Left to do
Pick: (a) Delete feature defs + code paths. (b) Keep as internal plumbing, untag from feature surface.
My fit reasoning
Cleanup of superseded path.
Progress:
Verdict:
last saved 5/27/2026, 12:58:05 AM
DEC-16INFRA

email.ts feature def β€” uncommitted changes?

S Β· <2hΒ·owner: ewing
emailsources: email.md OQ #3
Context
Infra thread-audit flagged email.ts as a "dirty file" β€” may have uncommitted edits from parallel work during swarm-build #007.
Already decided
18 features declared in email.ts.
Left to do
Check `git status src/lib/features/defs/email.ts`. Commit or reset.
My fit reasoning
Git hygiene.
Progress:
Verdict:
last saved 5/27/2026, 12:58:06 AM
DEC-24INFRA

OpenRouter β€” used or kill

S Β· <2hΒ·owner: ewing
integrationssources: integrations.md OQ #4
Context
OPENROUTER_API_KEY in Doppler. OpenRouter routes LLM calls to multiple providers. No recent commits use it.
Already decided
Key provisioned.
Left to do
Pick: (a) Pay-for-future-use. (b) Kill β€” Anthropic + Vercel AI Gateway cover needs.
My fit reasoning
LLM routing. Vercel AI Gateway is now GA (Aug 2025) and covers multi-provider with observability. OpenRouter is probably superseded.
Progress:
Verdict:
last saved 5/27/2026, 12:58:06 AM
DEC-26INFRA

Permission gates 13%β†’100% but auth toggle defaults OFF

S Β· <2hΒ·owner: ewing
infrasources: infra.md OQ
Context
Permission gates retrofit went from 13% to 100% coverage 2026-05-06 (commit f27778a). But the global auth toggle defaults to OFF β€” so permissions exist but are not enforced in default config.
Already decided
Both states landed.
Left to do
Pick: (a) Default auth ON. (b) Keep OFF β€” document why.
My fit reasoning
Auth posture. Per skills/CLAUDE.md (speed > security till 2027), keeping OFF is consistent with current policy. Just document.
Progress:
Verdict:
last saved 5/27/2026, 12:58:07 AM
DEC-28INFRA

Mac mini account distinction β€” both run thread-mine going forward?

S Β· <2hΒ·owner: ewing
infrasources: INDEX.md Run 5 note Β· PROJECT_PLAN.md Next Action #4
Context
Mac mini has two macOS users (clawdbot, team). They share ~/.claude/projects/ so thread-mine returns identical session lists. Run 3 and Run 4 produced duplicate data.
Already decided
SKILL.md preserves both run identity files.
Left to do
Pick: (a) Drop one slot. (b) Keep both. (c) Force clawdbot to always run with limit:100.
My fit reasoning
Meta tooling decision.
Progress:
Verdict:
last saved 5/27/2026, 12:58:07 AM
DEC-20NO-FIT

Honcho β€” keep building or kill

S Β· <2hΒ·owner: ewing
hermessources: hermes.md OQ
Context
One session referenced Honcho (cross-session memory). architect.agent_tooling lists it. No commits.
Already decided
None β€” exploratory.
Left to do
Pick: (a) Build. (b) Kill the reference.
My fit reasoning
Memory-research project. None of the 4 functions are bottlenecked here.
Progress:
Verdict:
last saved 5/27/2026, 12:58:07 AM
DEC-21NO-FIT

Obsidian Hermes memory β€” keep or kill

S Β· <2hΒ·owner: ewing
hermessources: hermes.md OQ
Context
One session evaluated Obsidian integration for Hermes memory. No commits.
Already decided
None.
Left to do
Pick: (a) Build. (b) Kill.
My fit reasoning
Same shape as Honcho.
Progress:
Verdict:
last saved 5/27/2026, 12:58:08 AM
TODO-006INFRA

Thread-close architecture research (THEN rebuild) β€” defers Frankenstein cluster #3

M Β· half-dayΒ·owner: ewing
thread-closeskill-designfrankensteinarchitecturesources: GH #238 Β· inventory/audits/2026-05-27__frankenstein-audit.md cluster #1 Β· Ewing call 2026-05-27
Context
close2 was built as the canonical successor to thread-close (its own SKILL.md says so) but both are still wired AND debrief-thread claims the same "close this thread" trigger β€” 3-way collision the runtime picks nondeterministically. Plus name-thread, thread-handoff, thread-mine, thread-consolidation-catalog.mjs, thread-dup-loop.mjs, thread-close-migrate.sh all in the same family. The script thread-consolidation-catalog.mjs exists to dedup outputs across these β€” proving the team already knows about the problem.
Already decided
Ewing 2026-05-27: do NOT touch the 3 collision skills yet. First let the new architecture from clusters #2 (output-skill merge) + #1 (audit dir consolidation) settle. Then research, then rebuild ONCE β€” not iterative patching that creates the next Frankenstein.
Left to do
Research phase (no code): (1) catalog every artifact a thread close produces today across the 5 skills, (2) catalog every destination they write to (inventory/thread-inventory + inventory/thread-audit + inventory/handoff + inventory/handoffs + inventory/thread-handoff + ~/Downloads/debrief), (3) define the single canonical close artifact + destination, (4) one skill that produces it, (5) the others become thin aliases pointing at it.
My fit reasoning
Skill plumbing β€” not directly serving the 4 functions but every thread close passes through this code. Fragility here is hidden tax on every session. Deferred deliberately to avoid building the next Frankenstein on the old foundation.
Progress:
Verdict:
fixlater-140INFRA

Rename targets β†’ company_targets in Supabase

M Β· half-dayΒ·owner: ewing
supabaseconsolidationsources: GH #140 Β· architect audit 2026-05-24 Β· field_registry.json naming
Context
The targets table (public.targets) is named too generically. It holds company-level targeting records and is better named company_targets to match field_registry.json conventions and avoid ambiguity with potential other "targets" concepts.
Already decided
Pre-decision steps documented: count all from("targets") references across src/, engine/, skills/; confirm no FKs from other tables point to targets.id.
Left to do
Decide: (a) Do the coordinated migration (ALTER TABLE + code sweep + field_registry + architecture.json β€” single PR, Medium risk). (b) Document as legacy name and leave it.
My fit reasoning
Naming hygiene. Indirect β€” but architect audit flagged it.
Progress:
Verdict:
last saved 5/27/2026, 12:58:19 AM
fixlater-176INFRA

Prune venue auto-select brand list with operator instinct

M Β· half-dayΒ·owner: ewing
othersources: GH #176
Context
## Why \`skills/launch-city/venue-select-in.json::auto_select_brands\` was seeded by Claude from Capital Grille reverse-engineering (run 2026-05-26). The list is 16 chains β€” needs Ewing's eyeball before it drives a real city pick. ## Known-stretchy picks to review - **Hillstone** β€” often refuses private events outright; may not belong on auto-select - **Maggiano's Little Italy** β€” banquet rooms are great but downmarket-feeling for \$30M-EBITDA home-services owners ## Candidates to potentially add - Smith & Wollensky - Sullivan's Steakhouse - Halls Chophouse - Joe Muer Seafood - Regional s
Already decided
Auto-imported from GH #176 during 2026-05-27 audit regen.
Left to do
See GH issue for full scope.
My fit reasoning
Auto-classified decide by regen script β€” refine when item is triaged.
Progress:
Verdict:
GIT-BR-1INFRA

Branch: mission/035-pass-4-finetune β€” 10 commits ahead, 11 behind main

M Β· half-dayΒ·owner: ewing
gitmission-035sources: git branch audit 2026-05-26
Context
Current working branch. 10 unique commits including fixlater items #210-#216, deal-room SCHEMA_MOVE_FIRST migration, audit-rescue of 12 orphan files, and Pass 4 layout work. 11 commits behind main β€” divergence is growing. Last commit: "chore(fixlater): #216 Investigate concurrent-Claude-session rebase pattern." Contains uncommitted changes to auth, deal-rooms route, hugo/CEOinsights, login actions, and Toolbox.
Already decided
Active work branch for mission 035.
Left to do
Decide: (a) Rebase onto main and merge the 10 commits. (b) Cherry-pick valuable commits (schema migration, fixlater closures) to main and reset this branch. (c) Keep diverging β€” risk grows daily.
My fit reasoning
Git hygiene. The longer this stays unmerged, the harder the eventual reconciliation.
Progress:
Verdict:
last saved 5/27/2026, 12:58:20 AM
GIT-BR-2INFRA

Branch: mission/035-pass-4-layout β€” 2 commits ahead, 11 behind main

S Β· <2hΒ·owner: ewing
gitmission-035sources: git branch audit 2026-05-26
Context
Predecessor to pass-4-finetune. 2 unique commits: audit-rescue (12 orphan files) and Pass 4 layout (INDEX + sequence + entity registry v0.2). Also adds mission docs, entity_registry.draft.json, PASS_4_SEQUENCE.md. Likely superseded by pass-4-finetune which has all this plus 8 more commits.
Already decided
Superseded by mission/035-pass-4-finetune.
Left to do
Decide: (a) Delete β€” finetune branch has everything this had. (b) Merge to main first if finetune diverged from it. Verify with: git log mission/035-pass-4-layout..mission/035-pass-4-finetune --oneline
My fit reasoning
Dead branch if finetune subsumes it. Delete candidate.
Progress:
Verdict:
last saved 5/27/2026, 12:58:20 AM
GIT-BR-4FIT

Branch: wip/2026-05-27-schema-move-scaffold β€” 2 commits ahead, 10 behind main

S Β· <2hΒ·owner: ewing
gitdealsschemasources: git branch audit 2026-05-26
Context
Schema-move scaffold + fixlater #188 partial. From a data-architect handoff. Adds backfill-documents-from-disk.mjs script, loanmart-hugo canonical hub page (src/app/deals/loanmart-hugo/page.tsx), and feature def cleanups (deletes atlas.ts, communications.ts, email-extras.ts, interns.ts, lists.ts). This is One Canonical Deal Room rule work.
Already decided
Scaffold started. Loanmart-hugo canonical page created.
Left to do
Decide: (a) Finish and merge β€” this is blocking the deal-room consolidation mandate. (b) Merge the page + script, drop the feature def deletions if risky. (c) Abandon if superseded by other deal-room work.
My fit reasoning
Directly supports the One Canonical Deal Room master rule. The loanmart-hugo page is the first canonical deal hub β€” blocking all subsequent deal-room work.
Progress:
Verdict:
last saved 5/27/2026, 12:58:21 AM
GIT-ST-0PARTIAL

Stash @{0}: pagedna-phase3-wip β€” Toolbox refactor + auth changes (8 files)

S Β· <2hΒ·owner: ewing
gitstashtoolboxauthsources: git stash list Β· on mission/035-pass-4-finetune
Context
Stashed on current branch. 8 files changed (208 insertions, 437 deletions). Major Toolbox.tsx refactor (496 lines changed β€” net reduction, likely a component split), auth.ts changes, auth callback exchange route, hugo/CEOinsights route, login actions, deal-rooms page, plus new files (team.ts, skill-build capture). This is substantial work β€” not a throwaway stash.
Already decided
Stashed mid-work.
Left to do
Decide: (a) Pop and commit β€” this is real feature work. (b) Inspect first: git stash show -p stash@{0} to see if it conflicts with current state. (c) Drop if superseded.
My fit reasoning
Toolbox refactor and auth changes affect the core UI shell.
Progress:
Verdict:
last saved 5/27/2026, 12:58:21 AM
GIT-ST-1INFRA

Stash @{1}: other-session-toolbox-dnatab β€” empty diff (likely conflicts)

S Β· <2hΒ·owner: ewing
gitstashtoolboxsources: git stash list Β· on mission/035-pass-4-finetune
Context
Named "other-session-toolbox-dnatab" β€” from a parallel Claude session. Shows empty diff, meaning the stashed content may have been incorporated elsewhere, or the stash is corrupt/empty. Created at the same timestamp as stash@{0}.
Already decided
None.
Left to do
Decide: (a) Drop β€” empty stash is dead weight. (b) Inspect untracked files: git stash show --include-untracked stash@{1}.
My fit reasoning
Likely empty. Drop candidate.
Progress:
Verdict:
last saved 5/27/2026, 12:58:21 AM
GIT-ST-2PARTIAL

Stash @{2}: pre-mission-035-pickup β€” cost-ledger + HANDOFF_QUEUE (1 file)

S Β· <2hΒ·owner: ewing
gitstashhandoffsources: git stash list Β· on mission/035-pass-4-finetune
Context
Saved before picking up mission 035. Contains cost-ledger.jsonl updates and HANDOFF_QUEUE.md additions (39 new lines). The handoff queue content may be intelligence about what was in-flight at the time.
Already decided
Pre-pickup safety stash.
Left to do
Decide: (a) Inspect HANDOFF_QUEUE changes β€” if still relevant, apply. (b) Drop if handoff queue has been updated since.
My fit reasoning
Handoff queue content could contain actionable context about work in progress.
Progress:
Verdict:
last saved 5/27/2026, 12:58:22 AM
GIT-ST-3INFRA

Stash @{3}: mission-035-pass-4-seed β€” skill cleanup (7 files)

S Β· <2hΒ·owner: ewing
gitstashskillssources: git stash list Β· on feat/pagedna-polish-phase3
Context
Stashed on pagedna-polish-phase3. 7 files including connectors/SKILL.md changes and deletion of migrate-to-external/SKILL.induced.md (119 lines). This is skill hygiene work β€” cleaning up induced skills that were superseded.
Already decided
None.
Left to do
Decide: (a) Apply to main if the skill cleanup is still valid. (b) Drop if skills were already cleaned up.
My fit reasoning
Skill housekeeping.
Progress:
Verdict:
last saved 5/27/2026, 12:58:22 AM
GIT-ST-4FIT

Stash @{4}: phase5-bookkeeping β€” tracker + campaign changes (12 files)

M Β· half-dayΒ·owner: ewing
gitstashcampaignstrackersources: git stash list Β· on feat/pagedna-polish-phase3
Context
Substantial: 12 files, 287 insertions, 206 deletions. Includes TrackerShell.tsx expansion (42 lines) and types.ts additions. This is campaign tracker feature work that was stashed during a context switch to pagedna polish.
Already decided
Stashed mid-feature.
Left to do
Decide: (a) Pop onto a new branch and finish β€” tracker work is valuable. (b) Inspect for conflicts with current tracker state. (c) Drop if tracker was rebuilt differently.
My fit reasoning
Campaign tracker directly supports function #2 (process leads). 12-file change set suggests real progress.
Progress:
Verdict:
last saved 5/27/2026, 12:58:22 AM
GIT-ST-5FIT

Stash @{5}: WIP on main β€” calls/[id] page rewrite (6 files, 667 insertions)

M Β· half-dayΒ·owner: ewing
gitstashcallssources: git stash list Β· on main
Context
Major work: 667 insertions across 6 files. Includes calls/[id]/page.tsx rewrite (201 lines changed β€” net reduction, likely a cleanup) and new mock data. Row status field + geolocation origin on Drive-By tracker feature. Stashed directly on main.
Already decided
Feature work in progress, stashed.
Left to do
Decide: (a) Pop onto a feature branch and finish β€” calls page + drive-by tracker are active surfaces. (b) Check if this work shipped via a different branch. (c) Drop if superseded.
My fit reasoning
Calls page is function #2 (process leads). Drive-by tracker is function #1 (find leads). Both active.
Progress:
Verdict:
last saved 5/27/2026, 12:58:22 AM
GIT-ST-6INFRA

Stash @{6}: WIP on main β€” audit-fixlater burndown (2 files, minimal)

S Β· <2hΒ·owner: ewing
gitstashauditsources: git stash list Β· on main
Context
Tiny: 2 files, 2 insertions. Admin layout + meetings sync-to-deal route β€” likely just import additions. From the audit-fixlater 2026-05-26 burndown session.
Already decided
None.
Left to do
Decide: (a) Pop and commit β€” trivial change, low risk. (b) Drop β€” 2 lines probably already landed elsewhere.
My fit reasoning
Trivial. Quick win or quick drop.
Progress:
Verdict:
last saved 5/27/2026, 12:58:22 AM
GIT-ST-7PARTIAL

Stash @{7}: WIP on main β€” thread-audit exa extraction docs

S Β· <2hΒ·owner: ewing
gitstashexathread-auditsources: git stash list Β· on main
Context
2 files: discover_pool_socal.py (13 new lines) and salesfinity webhook route (19 lines changed). From exa-consolidation thread extraction. The Python script is a pool discovery script for SoCal β€” could be a one-off or a template.
Already decided
None.
Left to do
Decide: (a) If SoCal pool discovery is still relevant, pop and commit. (b) Drop if this vertical is dead.
My fit reasoning
Pool/SoCal discovery is a lead-finding variant (function #1) if active.
Progress:
Verdict:
last saved 5/27/2026, 12:58:23 AM
GIT-ST-8INFRA

Stash @{8}: WIP on feat/124-transcript-quality β€” merge artifact

S Β· <2hΒ·owner: ewing
gitstashtranscriptsources: git stash list Β· on feat/124-transcript-quality
Context
1 file: exa_skill.py (9 insertions). Stashed on the transcript-quality feature branch during a merge from origin/main. The branch itself no longer exists locally (was likely cleaned up), but the stash persists.
Already decided
Orphan stash β€” parent branch gone.
Left to do
Decide: (a) Inspect the exa_skill.py change β€” if it is a fix, apply to main. (b) Drop β€” merge artifact likely superseded.
My fit reasoning
Orphan. Likely dead.
Progress:
Verdict:
last saved 5/27/2026, 12:58:23 AM
GIT-ST-9PARTIAL

Stash @{9}: pool-pipeline-la-first-run β€” thread-mine SKILL.md rewrite (5 files)

M Β· half-dayΒ·owner: ewing
gitstashthread-minepipelinesources: git stash list Β· on feat/pool-pipeline-la-first-run
Context
5 files, 435 insertions, 385 deletions. Major thread-mine SKILL.md rewrite (400 lines changed). Also includes swarm journal cleanup. Parent branch (pool-pipeline-la-first-run) no longer exists locally. The SKILL.md rewrite may contain important process documentation.
Already decided
Orphan stash β€” parent branch gone.
Left to do
Decide: (a) Inspect the thread-mine SKILL.md diff β€” if it is an improvement, apply to current SKILL.md. (b) Drop if thread-mine SKILL.md has been rewritten since.
My fit reasoning
Thread-mine SKILL.md rewrites are meta-process improvements. Worth checking if current version is stale.
Progress:
Verdict:
last saved 5/27/2026, 12:58:23 AM
GIT-ST-10PARTIAL

Stash @{10}: pre-LLPhoenix-pull β€” master-reset extractions (7 files, 1254 insertions)

M Β· half-dayΒ·owner: ewing
gitstashmaster-resetsources: git stash list Β· on main
Context
Largest stash: 7 files, 1254 insertions. Major rewrites of pipeline.md (426 lines of new extraction content) and swarm.md (83 lines). Pre-LLPhoenix (Mac mini) pull β€” this was work in progress before syncing with the other machine. Could contain unique extraction intelligence not captured elsewhere.
Already decided
Safety stash before pull.
Left to do
Decide: (a) Inspect pipeline.md and swarm.md diffs β€” if this extraction content is unique, it is intelligence that should be preserved. (b) Compare against current versions of those files. (c) Drop only after confirming content was merged.
My fit reasoning
Master-reset extractions feed the audit page itself. If unique content exists here, it is lost intelligence.
Progress:
Verdict:
last saved 5/27/2026, 12:58:23 AM
GIT-UC-1INFRA

Uncommitted: 5 modified + 3 untracked files on current branch

S Β· <2hΒ·owner: ewing
gituncommittedauthtoolboxdealssources: git status 2026-05-26
Context
Modified (unstaged): auth/callback/exchange/route.ts, deal-rooms/[codename]/[page]/page.tsx, hugo/CEOinsights/route.ts, login/_actions.ts, lib/caller/auth.ts. Untracked: skill-build captures (2 JSON files), src/lib/auth/team.ts. The auth changes + team.ts suggest an auth refactor in progress. The deal-rooms page change may conflict with the One Canonical Deal Room mandate (that route is on the remediation kill list).
Already decided
Work in progress, not staged.
Left to do
Decide: (a) Stage and commit the auth changes as a coherent unit. (b) Stash if not ready. (c) Reset the deal-rooms route change β€” that file is supposed to be deleted per the One Canonical Deal Room rule. (d) Add team.ts if it is part of the auth refactor.
My fit reasoning
Auth and login changes are infrastructure. The deal-rooms route is a kill target.
Progress:
Verdict:
last saved 5/27/2026, 12:58:24 AM
GIT-WT-1INFRA

Worktree: next-chapter-os-048-map-multiselect (active)

S Β· <2hΒ·owner: ewing
gitworktreemapsources: git worktree list 2026-05-26
Context
Active worktree at ~/Github/next-chapter-os-048-map-multiselect on branch feat/048-map-multiselect. This is the swarm-build #048 checkout. If the branch is merged or abandoned, the worktree must be removed first (git worktree remove <path>) before the branch can be deleted.
Already decided
Active β€” linked to GIT-BR-3.
Left to do
Follows GIT-BR-3 decision. If branch merges: remove worktree. If abandoned: remove worktree then delete branch.
My fit reasoning
Linked to branch decision.
Progress:
Verdict:
last saved 5/27/2026, 12:58:24 AM
SYS-META-007INFRA

engine/contacts/output/ has orphaned JSON results from one-off pipeline runs

S Β· <2hΒ·owner: ewing
enrichmentconsolidationpipelinesources: pool_hunt_v2.py, pool_owner_hunt.py, extract_exa_contacts.py, buyside_hunt_v1.py
Context
Multiple Python scripts write results.json to engine/contacts/output/ subdirectories. One-off pipeline runs. Some data may be in Supabase already; some may be orphaned.
Already decided
Scripts exist. Output directories contain historical run data.
Left to do
Audit each directory. If in Supabase, delete local JSON (in git history). If not, load it. Apply Rule 11.
My fit reasoning
Disk hygiene. Orphaned JSON already in Supabase is duplicated state.
Progress:
Verdict:

KILL15 items

Registered/designed but abandoned/superseded. Recommend removal.

KIL-5PARTIAL

/letters/legacy 212-letter index β€” if FIN-23 confirms orphaned

S Β· <2hΒ·owner: ewing
lettersleadgensources: letters.md OQ #4 Β· leadgen.md OQ #4
Context
See FIN-23. If page 404s, delete src/app/letters/legacy/ + feature def.
Already decided
Conditional on FIN-23 result.
Left to do
After FIN-23 verify, delete or leave.
My fit reasoning
If alive, historical reference for templates. If dead, dead.
Progress:
Verdict:
last saved 5/27/2026, 12:58:08 AM
KIL-1INFRA

Legacy HTML journals in skills/maxswarm/notebook/journals/

S Β· <2hΒ·owner: ewing
swarmsources: swarm.md OQ Β· commits 4218f3f, 09385ab
Context
Journal Standards v2.0 (commit 4218f3f 2026-05-10) declared markdown source, HTML generated. Migration script 09385ab converted 71 legacy HTML journals. But source HTML files may still exist as dead weight, potentially confusing swarm-upgrade pattern detection.
Already decided
v2.0 standards in effect.
Left to do
Verify legacy HTMLs gone or delete them.
My fit reasoning
Cleanup.
Progress:
Verdict:
KIL-2NO-FIT

Topia codebase (pending DEC-13)

S Β· <2hΒ·owner: ewing
leadgensources: leadgen.md OQ #1
Context
See DEC-13. Single review session, no integration in 90d. Strong kill candidate.
Already decided
Pending DEC-13.
Left to do
After decision, remove any references to Topia.
My fit reasoning
See DEC-13. Hunter + Exa cover lead-finding.
Progress:
Verdict:
last saved 5/27/2026, 12:58:08 AM
KIL-3NO-FIT

Honcho mention (pending DEC-20)

S Β· <2hΒ·owner: ewing
hermessources: hermes.md OQ
Context
See DEC-20. Listed in architect agent_tooling. No commits, no plan.
Already decided
Pending DEC-20.
Left to do
If kill: remove from agent_tooling section.
My fit reasoning
See DEC-20.
Progress:
Verdict:
last saved 5/27/2026, 12:58:09 AM
KIL-4NO-FIT

Obsidian Hermes memory (pending DEC-21)

S Β· <2hΒ·owner: ewing
hermessources: hermes.md OQ
Context
See DEC-21. One session, no commits.
Already decided
Pending DEC-21.
Left to do
If kill: nothing to remove (no code shipped).
My fit reasoning
See DEC-21.
Progress:
Verdict:
last saved 5/27/2026, 12:58:09 AM
TODO-004INFRA

Deprecate + drop public.spend_log table

S Β· <2hΒ·owner: ewing
supabaseschemaconsolidationcostsources: GH #236 Β· architect ruling in skills/swarm-build/notebook/2026-05-26__045__instrument-spend-cost-rollup-fix.md
Context
Architect declared spend_log DEPRECATED in swarm-build #045. Migration 2026_05_06__foundation_tables.sql created spend_log as "the new canonical cost table" but no TS code ever wrote to it (0 rows live as of 2026-05-26). feature_metrics later gained cost_usd column (iss_0045) and IS the live cost-capture path ($18.27/mo of Exa spend flowing through). Two writers competing β†’ drift; architect ruled one winner: feature_metrics.
Already decided
feature_metrics is canonical. spend_log stays in schema today to avoid migration churn but is documented as DEPRECATED in /api/features/cost-rollup/route.ts header comment + #045 notebook. No TS callers. Python writer status unverified.
Left to do
(1) Repo + LaunchAgent grep to confirm no Python writer to spend_log. (2) If empty + no callers: DROP TABLE public.spend_log in a new migration. (3) Remove deprecated mention from cost-rollup route header. Reversible if Python writer surfaces (table can be re-added).
My fit reasoning
Pure cleanup. Removing a dead table reduces schema-introspection noise and prevents a future agent from re-wiring the wrong cost path.
Progress:
Verdict:
fixlater-186NO-FIT

Refine no-delete-gate.sh override-marker regex to ignore documentation references

M Β· half-dayΒ·owner: ewing
platformsources: GH #186
Context
scripts/no-delete-gate.sh (shipped 4eaac8b3) checks for `# no-delete-override:` as the bypass marker. Currently the regex matches against ANY occurrence in the diff β€” including the literal documentation string in skills/git-guardrail/SKILL.md which contains the words `# no-delete-override: <reason>` as instruction. Result: any commit that touches git-guardrail/SKILL.md (or anything that documents the gate) silently bypasses the gate. Fix: require the marker to appear as an added line (starts with `+` in the diff) AND with a non-placeholder justification (not in angle brackets like `<reason>`
Already decided
Auto-imported from GH #186 during 2026-05-27 audit regen.
Left to do
See GH issue for full scope.
My fit reasoning
Auto-classified kill by regen script β€” refine when item is triaged.
Progress:
Verdict:
fixlater-191NO-FIT

Retire /room/[slug] parallel deal-room route per One Canonical Deal Room mast...

M Β· half-dayΒ·owner: ewing
dealsplatformuisources: GH #191
Context
Retire /room/[slug] parallel deal-room route per One Canonical Deal Room master rule. Delete src/app/room/[slug]/page.tsx + src/app/room/[slug]/documents/[id]/page.tsx. The 'Deal room β†’' link on /deals/[slug]/page.tsx currently points to /room/[slug] β€” replace with no-op (link to self) or remove. Audit for downstream callers of /api/room/* first. Locked by AGENTS.md One Canonical Deal Room Master Rule 2026-05-27. --- Captured via /FixLater on 2026-05-26 from branch `main` on `MacBook-115.local`.
Already decided
Auto-imported from GH #191 during 2026-05-27 audit regen.
Left to do
See GH issue for full scope.
My fit reasoning
Auto-classified kill by regen script β€” refine when item is triaged.
Progress:
Verdict:
fixlater-192NO-FIT

Delete src/app/deal-rooms/[codename]/[page]/page.tsx shadow route per One Can...

M Β· half-dayΒ·owner: ewing
dealsinfrauisources: GH #192
Context
Delete src/app/deal-rooms/[codename]/[page]/page.tsx shadow route per One Canonical Deal Room master rule. Was also flagged in #141 (shadows public/deal-rooms/<codename>/*.html). Patch next.config.ts with the beforeFiles rewrite from #141 OR rely on Vercel serving the public/ files directly. Verify via curl https://os.chapter.guide/deal-rooms/loanmart-hugo/valuation.html β†’ 200 after change. --- Captured via /FixLater on 2026-05-26 from branch `main` on `MacBook-115.local`.
Already decided
Auto-imported from GH #192 during 2026-05-27 audit regen.
Left to do
See GH issue for full scope.
My fit reasoning
Auto-classified kill by regen script β€” refine when item is triaged.
Progress:
Verdict:
GIT-BR-5INFRA

Branch: feat/pagedna-polish-phase1 β€” merged to main, safe to delete

S Β· <2hΒ·owner: ewing
gitsources: git branch audit 2026-05-26
Context
Already merged to main. Zero commits ahead. Last commit: "feat(audit + /todo): register MIS-035 on /audit + ship /todo skill layout." This branch pointer is pure clutter.
Already decided
Merged. Work is on main.
Left to do
Delete: git branch -d feat/pagedna-polish-phase1
My fit reasoning
Dead pointer. No data at risk.
Progress:
Verdict:
last saved 5/27/2026, 12:58:21 AM
GIT-BR-6INFRA

Branch: feat/pagedna-polish-phase2 β€” merged to main, safe to delete

S Β· <2hΒ·owner: ewing
gitsources: git branch audit 2026-05-26
Context
Already merged to main. Zero commits ahead. Same tip as phase1. Also has a locked worktree referencing it at .claude/worktrees/agent-a340dcbe... which should be pruned first.
Already decided
Merged. Work is on main.
Left to do
Prune locked worktree first (git worktree remove), then delete: git branch -d feat/pagedna-polish-phase2
My fit reasoning
Dead pointer + orphan worktree lock.
Progress:
Verdict:
last saved 5/27/2026, 12:58:21 AM
GIT-ST-11NO-FIT

Stash @{11}: wip/exa-recipe-pickup β€” "not mine" marker

S Β· <2hΒ·owner: ewing
gitstashsources: git stash list Β· on wip/exa-recipe-pickup-2026-05-17
Context
Explicitly labeled "not mine" β€” from another session or machine. Parent branch gone. Stash description says "wip-branch state, not mine."
Already decided
Disowned by creator.
Left to do
Drop: git stash drop stash@{11}. The "not mine" label is an explicit signal.
My fit reasoning
Explicitly disowned.
Progress:
Verdict:
last saved 5/27/2026, 12:58:23 AM
GIT-ST-12NO-FIT

Stash @{12}: swarm-build/007-exa-chokepoint β€” "not mine (2nd hold)"

S Β· <2hΒ·owner: ewing
gitstashsources: git stash list Β· on swarm-build/007-exa-chokepoint-refactor
Context
Explicitly labeled "not mine (2nd hold)" β€” master-reset files stashed from a swarm-build branch. Parent branch gone. Second disowned stash.
Already decided
Disowned by creator.
Left to do
Drop: git stash drop stash@{12} (drop @{11} first since indices shift).
My fit reasoning
Explicitly disowned.
Progress:
Verdict:
last saved 5/27/2026, 12:58:23 AM
GIT-WT-2INFRA

Worktree: .claude/worktrees/agent-a340dcbe... (locked, stale)

S Β· <2hΒ·owner: ewing
gitworktreesources: git worktree list 2026-05-26
Context
Locked Claude Code agent worktree on feat/pagedna-polish-phase2. That branch is already merged to main β€” the worktree is orphaned. Locked status means git won't auto-prune it. Must be explicitly removed: git worktree remove --force .claude/worktrees/agent-a340dcbe...
Already decided
Stale β€” branch is merged.
Left to do
Remove: git worktree remove --force .claude/worktrees/agent-a340dcbe9b0f64b1f
My fit reasoning
Dead lock. Safe to force-remove since the branch is merged.
Progress:
Verdict:
last saved 5/27/2026, 12:58:24 AM
SYS-thread-closeNO-FIT

thread-close: Third producer writing to same directory. Three skills doing the same job.

S Β· <2hΒ·owner: ewing
skillswarmsources: producer-registry scan (1 output types, ~10 files)
Context
Graceful end-of-thread cleanup with GitHub archival (original version). Writes to: inventory/thread-inventory/{thread-name}.md. Triggered by: Manual /thread-close at end of conversation.
Already decided
1 of 1 output types orphaned on disk.
Left to do
Identify canonical replacement. Migrate any unique data. Delete the producer.
My fit reasoning
1 output type(s) orphaned. Institutional memory generated but never surfaces to operators.
Progress:
Verdict:

CLOSED28 archived

Auto-archived when marked Completed. Click to reopen.

FIN-29CLOSED
Dash Check CI failing on every push since 2026-05-17 (em-dash detection in audit docs)
"VERIFIED 2026-05-24 β€” Dash Check CI is GREEN. Last 5 runs on main all SUCCESS. The dash_check.py script already exempts inventory/, docs/, swarm notebooks, etc. via CLIENT_FACING_PREFIXES whitelist. Original audit claim was stale."
closed 5/24/2026, 2:56:27 AM by maxswarm-031-t1
FIN-5CLOSED
Verify backfill_company_keys.py ran on prod (1,895 rows expected)
"VERIFIED 2026-05-24 β€” companies WHERE company_key IS NULL = 0 of 2583. Backfill ran successfully on prod."
closed 5/24/2026, 2:55:49 AM by maxswarm-031-t1
FIN-3CLOSED
Verify chapter.guide apex routing β€” Salesfinity webhook may be silently broken
"VERIFIED 2026-05-24 β€” os.chapter.guide apex routing is healthy. Salesfinity webhook handler reachable + responsive (HTTP 500 on minimal probe = handler reached, expected non-2xx on incomplete payload). Real webhooks now delivered successfully via commit f3fd847."
closed 5/24/2026, 2:55:49 AM by maxswarm-031-t1
FIN-26CLOSED
HCI contamination removed from prod deal room
"ALREADY SHIPPED β€” HCI contamination grep returns zero hits in HR.com deal room. Closed 2026-05-24."
closed 5/24/2026, 2:54:56 AM by maxswarm-031-closeout
FIN-23CLOSED
/letters/legacy 212 archived letters β€” verify wired or orphaned
"KILL β€” /letters/legacy directory MISSING. Orphan confirmed."
closed 5/24/2026, 2:54:56 AM by maxswarm-031-cluster1
FIN-21CLOSED
engine/contacts merged 2026-05-03 β€” verify not orphaned
"ALREADY SHIPPED β€” engine/contacts merged 78 commits + 12 notebook refs. Closed 2026-05-24."
closed 5/24/2026, 2:54:56 AM by maxswarm-031-closeout
FIN-22CLOSED
/api/unlock and /unlock routes β€” commit or delete
"ALREADY SHIPPED β€” /api/unlock route.ts (34 LOC) + /unlock page both committed. Closed 2026-05-24."
closed 5/24/2026, 2:54:56 AM by maxswarm-031-closeout
BLD-4CLOSED
TODO/ticket tracking system for tickets
"KILL β€” duplicate of FixLater system (already canonical per CLAUDE.md). DEC-3 close."
closed 5/24/2026, 2:54:56 AM by maxswarm-031-cluster7
BLD-3CLOSED
Education page /education
"KILL β€” /education page has no src/app/education directory. 12 commits is generic-term false-positive."
closed 5/24/2026, 2:54:56 AM by maxswarm-031-cluster1
BLD-5CLOSED
Honcho integration
"KILL β€” Honcho integration: zero code references. Telegram won via hermes-notify."
closed 5/24/2026, 2:54:56 AM by maxswarm-031-cluster1
BLD-6CLOSED
Obsidian integration for Hermes memory
"KILL β€” Obsidian: zero git history ever. Pure session graffiti."
closed 5/24/2026, 2:54:56 AM by maxswarm-031-cluster1
BLD-7CLOSED
iMessage Claude-terminal integration
"KILL β€” iMessage-bridge file missing. Telegram is primary."
closed 5/24/2026, 2:54:56 AM by maxswarm-031-cluster1
DEC-11CLOSED
'Identify high-value sales opportunities from Mark's calls' β€” turned into action?
"KILL β€” Marks-calls-action: zero commits, zero refs. Likely actioned or absorbed."
closed 5/24/2026, 2:54:56 AM by maxswarm-031-cluster1
DEC-10CLOSED
CRO HTML report β€” one-off or recurring
"KILL β€” CRO HTML: one-off artifact, no recurring need."
closed 5/24/2026, 2:54:56 AM by maxswarm-031-cluster1
DEC-14CLOSED
Pest-control list UI parked β€” resume or kill
"KILL β€” Pest-control: parked, no demand signal."
closed 5/24/2026, 2:54:56 AM by maxswarm-031-cluster1
DEC-3CLOSED
Ticket-tracking system β€” fold into review.resolve or greenfield
"RESOLVED β€” FixLater system is canonical per CLAUDE.md. BLD-4 kill closes this."
closed 5/24/2026, 2:54:56 AM by maxswarm-031-cluster7
DEC-15CLOSED
template_editor_tables.sql vs email_editor.sql β€” duplicative?
"ALREADY SHIPPED β€” drop_dead_email_editor_tables migration applied 2026-05-17. Closed 2026-05-24."
closed 5/24/2026, 2:54:56 AM by maxswarm-031-closeout
DEC-17CLOSED
"Deploy swarm upgrade phases 2 through 5" β€” all 4 phases land?
"KILL β€” Phases 2-5 phantom: zero commits. Skill works as-is."
closed 5/24/2026, 2:54:56 AM by maxswarm-031-cluster1
DEC-19CLOSED
Meeting classification 5-category enum vs call_log enum β€” verify match
"KILL β€” Enum parity: small check, verify in code review."
closed 5/24/2026, 2:54:56 AM by maxswarm-031-cluster1
DEC-22CLOSED
Tailscale β€” used or kill
"KILL β€” Tailscale: not in use. Doppler covers credential sync."
closed 5/24/2026, 2:54:56 AM by maxswarm-031-cluster1
DEC-25CLOSED
Spokephone β€” status
"KILL β€” Spokephone: legacy, replaced by Fireflies + Salesfinity."
closed 5/24/2026, 2:54:56 AM by maxswarm-031-cluster1
DEC-13CLOSED
Topia lead-gen codebase β€” archive or use
"KILL β€” Topia: review-only, no integration. Archive."
closed 5/24/2026, 2:54:56 AM by maxswarm-031-cluster1
DEC-23CLOSED
iMessage integration β€” fallback-only or kill
"KILL β€” iMessage: Telegram primary, bridge fallback or dead."
closed 5/24/2026, 2:54:56 AM by maxswarm-031-cluster1
SEC-1CLOSED
Rotate FIREFLIES_WEBHOOK_SECRET (chat-leaked seed)
"Rotated 2026-05-17. Doppler dev+prd aligned, Vercel prd updated, deploy live, signed POST signature_verified=true. Code fallback fix (PR #84) shipped same session β€” extract.ts queries text+summary instead of raw_words."
closed 5/18/2026, 5:19:13 AM by claude-via-service-role
BLK-1CLOSED
Mission #010 Vercel ultra deep dive β€” completion verdict
"Thread is: Audit Vercel pages and design structure "
closed 5/18/2026, 4:01:25 AM by ewing
FIN-1CLOSED
Flip 7 transcript-* feature defs from design β†’ live
"DONE for 4 live flips. transcript.diarization + transcript.buy-signal-extraction reopened under P1.5 transcription consolidation Issue #124 β€” they were never killed, just blocked on FIN-24/Ewing pattern ratification."
closed 5/17/2026, 12:00:00 AM by ewing
FIN-9CLOSED
PR #72 β€” /pre-flight skill close-out
"Closed 2026-05-17. PR #72 was actually Bear (not Charlie) and was /pre-flight skill (not a tab). Already merged 2026-05-08. Post-merge checks passed today: env vars clean, Supabase reachable, Exa live, skill resolves. PR comment: https://github.com/ewing-operating-system/next-chapter-os/pull/72#issuecomment-4474749617"
closed 5/17/2026, 12:00:00 AM by ewing
DEC-1CLOSED
meeting_notes_flat vs call_log.our_transcript β€” pick canonical
"RESOLVED 2026-05-17 (option c) β€” different concerns, document split. meeting_notes = Fireflies multi-attendee transcripts. call_log.our_transcript = Salesfinity 3-min outbound calls. See inventory/missions/transcript-canonical-home.md Β§4. Phantom blocker."
closed 5/17/2026, 12:00:00 AM by ewing