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.
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.
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.
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)
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.
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.
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.
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.
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.
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
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
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.
~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)
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.
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
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.
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.
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
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.
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.
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.
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)
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
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.
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.
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.
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.
(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
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
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
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
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
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.
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.
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
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.
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.
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.
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.
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.
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...
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...
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.
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.
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
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
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.
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.
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
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.
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
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.
## 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.
## 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.
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
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
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.
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.
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.
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?
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.
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.
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
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.
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
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
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
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.
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.
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}.
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.
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.
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.
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.
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.
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
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
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...
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
"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."