πŸ›  Project View

2026-05-22 Β· 48 active Β· 22 plans Β· 11 unscoped

🚧 IN THE WORKS (8 +1 deprio)

[DECISION] Equity Compβ–Ύ
β”” BUILD_equity_comp_calculators_20260511.md
# BUILD: Equity Comp β€” Liquidity Event Calculator Suite (Phase 2.5) Created: 2026-05-11 Status: SEALED β€” pending risk-check ## Goal Add an 8th tab "Calculators" to the existing Equity Comp Dashboard containing 5 collapsible, interactive client-side calculators that support liquidity-event decision-making for the May 14 / July 28 early-release window β€” fully additive to the current comp dashboard, no edits to existing tabs. ## UX requirements (cross-cutting) - **Easy to execute**: every calculator should be usable in under 30 seconds with no documentation. Defaults pre-populated from `comp_state.json`. One-click "Reset to defaults" button per calculator. - **Helper text everywhere**: every input has a short "β“˜" tooltip or inline `<small>` explainer. Every output has a one-line plain-English interpretation (e.g. "This is what hits your bank after taxes."). Every calculator has a top "What this answers" 1–2 sentence intro and a bottom "Caveats" note. - **No jargon without decode**: AMT, bargain element, strike, vested, sell-to-cover all get inline glossary the first time they appear in each calc. - **Visual feedback**: outputs animate/highlight when inputs change; red text when a constraint is violated (e.g. allocation sliders sum != 100%). - **Mobile-aware spacing** even though mobile card is deferred β€” sections should not break the desktop layout if viewed on a tablet. ## Scope ### In - New tab `tab-calculators` in `dashboards/comp_dashboard.html` (desktop only β€” mobile deferred) - 5 collapsible `<details>` sections inside that tab, each rendering one calculator: 1. Early Release / Liquidity Calculator 2. Proceeds Distribution / Allocation Engine 3. ISO Exercise Timeline Model 4. AMT Sensitivity Model 5. Long-Term Equity Tracker (read-only summary aggregating existing comp_state.json) - All calc logic in pure client-side JavaScript inline in the rendered HTML β€” no new Python compute - New `render_calculators_tab(s)` function in `scripts/comp_render.py` - Tab nav link added in dashboard header - Defaults pre-populated from `comp_state.json` (current shares, strike, price) but every input editable ### Out (not in this build) - Mobile card (`mobile/comp.html`) β€” deferred to Phase 2.6 - Pipeline wiring for A39 (`/comp-refresh` skill remains manual trigger) - Per-grant AMT (already in HIGH backlog as Phase 2 sub-item β€” leave there) - Persistence of calculator inputs beyond page reload (use `localStorage` only β€” no JSON sidecar yet) - Preset save/load for allocation sliders (deferred β€” sliders start at 0 each session) - Any change to `comp_compute.py` schema or `comp_state.json` writers - Any touch on shared CSVs (recommendation_events, control_group, sil_learnings, etc.) β€” isolation contract preserved ## Files affected ### Created - (none β€” all changes inline in existing files) ### Edited - `scripts/comp_render.py` β€” add `render_calculators_tab(s)` function (~250 lines new); add nav link entry; register tab in main render assembly - `dashboards/comp_dashboard.html` β€” regenerated as output of `comp_render. …[truncated at 3072B β€” open file for full content]
[FIX] Session-start health check truncated at 4000 charsβ–Ύ
β”” BUILD_session_start_healthcheck_cap_20260516.md
# BUILD: Session-start health check cap fix + full-report path surfacing Created: 2026-05-16 Status: SEALED β€” pending risk-check ## Goal Stop silently truncating the MDE health check at session start so the user/Claude make decisions on the **complete** warning list, not a clipped prefix. Surface the path to the full HTML report alongside the (now larger) inline preview so the user can always reach the unabridged version in one click. ## Scope **In:** - Bump the `[:4000]` slice on the MDE health check hook from 4000 β†’ 12000 chars (`C:/Users/jjwat/.claude/settings.json` line 25). - After the truncated preview, print one line: `Full report: <path to health_check_report.html>`. - Verify the resulting hook payload still fits within Claude Code's per-hook context budget (no crash, no truncation on Claude's side). **Out:** - Smart-truncation logic (prioritize ERRORS first) β€” over-engineered for current scope; revisit if 12000 still clips. - Reformatting the health check report itself β€” separate concern. - Touching the digest hook (line 31) β€” digest is verified accurate at 22/22 sections; no cap needed. - Touching session_context.py (line 19) or the workspace CURRENT.md hook (line 15). ## Files affected - **EDIT** `C:/Users/jjwat/.claude/settings.json` β€” single line (25) β€” two changes inside the embedded one-line Python: 1. `s[:4000]` β†’ `s[:12000]` 2. After `'MDE HEALTH CHECK:\\n'+s[:12000]`, append `+'\\n\\nFull report: C:/Users/jjwat/OneDrive/Claude Code_All/Claude Code Terminal/projects/investments/dashboards/health_check_report.html'` (verify path exists before sealing the string). No other files touched. ## Steps 1. **Verify full-report HTML path exists** β€” `Glob` for `dashboards/health_check_report.html` under investments. Acceptance: file exists and is mtime-current (regenerated by pipeline Step 31 or similar). If missing, abort and file follow-up to generate it before re-sealing. 2. **Read current settings.json line 25** to confirm the exact embedded Python string still matches the `[:4000]` pattern (no parallel-session edit since audit). Acceptance: line matches expected shape. 3. **Edit settings.json line 25** β€” bump cap + append path line. Acceptance: file written; manual diff shows only those two textual changes. 4. **Validate JSON** β€” `py -c "import json; json.load(open('C:/Users/jjwat/.claude/settings.json'))"`. Acceptance: exits 0, no parse error. (Critical β€” a broken settings.json breaks every future session.) 5. **Dry-fire the hook** β€” run the modified command line directly: `py -c "<command>"` from a shell. Acceptance: prints JSON with the SessionStart payload, no Python errors, payload includes the path line at the end, total length ≀ ~15KB. Confirms the change works before next real session uses it. 6. **Document** β€” append to `CHANGELOG.md` under today's entry; close the `[FIX]` task with `[x]` + Closes line. ## Rollback - **Failure modes:** (a) JSON parse error β†’ next session fails to start hook β†’ no digest/health at session-start (but Claude still works). (b) Hook timeout β€” unlikely, …[truncated at 3072B β€” open file for full content]
[INVESTIGATE] Pipeline run efficiency overhaulβ–Ύ
β”” BUILD_pipeline_efficiency_overhaul_20260427.md
# BUILD β€” Pipeline run efficiency overhaul **Date filed:** 2026-04-27 (Session 109) **Tier:** HIGH **Class:** Performance / architecture (not data integrity β€” that's the parallel CRITICAL stdout-deadlock fix) **Linked task:** TASKS.md HIGH β€” `[INVESTIGATE] Pipeline run efficiency overhaul` **Linked to:** `references/BUILD_yfinance_timeout_guard_20260427.md` (Phase 0 stdout streaming fix is a hard dependency β€” without visibility, we can't measure efficiency) --- ## Symptom Pipeline runs are taking **90+ minutes** with new CSVs. Each session ships data but the wait is painful and discourages running. Multiple architectural decisions compound: - Strictly sequential step orchestration - Network steps interleaved with cheap compute (no batching) - No incremental / no-change short-circuit (full re-run every time) - No per-step timing logged (we're guessing where time goes) - Slow/optional/non-blocking steps gate everything downstream - Some steps (mobile deploy) are fire-and-forget candidates running synchronously at the end - Staleness guards exist on a few steps (Step 10, 10a) but not consistently applied --- ## Hard dependency ⚠ **`BUILD_yfinance_timeout_guard_20260427.md` Phase 0 must ship first.** Without real-time stdout streaming we cannot measure per-step duration accurately, and the 64KB pipe-deadlock will reappear inside any parallel-batch implementation. Phase 0 is also the cheapest single change with the biggest immediate quality-of-life win. --- ## Inefficiency catalogue | # | Inefficiency | Where | Fix direction | Phase | |---|---|---|---|---| | 1 | No per-step timing logged | run_pipeline.py top-level | Wrap each step in a wall-clock timer; append to `data/logs/PIPELINE_TIMINGS.csv`; surface top-3 slowest in session digest | A | | 2 | Step 6 dashboards run sequentially | watchlist β†’ take_action β†’ gate_alts β†’ dir_stability β†’ metric_insights β†’ l1_dashboard β†’ index | All independent β€” parallelize via `concurrent.futures.ProcessPoolExecutor` | B | | 3 | Network steps interleaved with cheap compute | 8.56 (net) β†’ 8.57 (cheap) β†’ 8.6 (cheap) β†’ 9 (cheap) β†’ 10 (net) β†’ 10a (net) | Batch all network calls together near end; run concurrently | C | | 4 | yfinance one-batch-per-date in 8.56 | fetch_sold_prices.py:167 loop | Single bulk `yf.download()` over the date range; partition results client-side | C | | 5 | No incremental / no-change short-circuit | Phase 1 ingest, MPS, BF | If CSV mtime hasn't changed since last run, skip Phase 1 ingest. If MPS inputs unchanged, skip Phase 2. | E | | 6 | Mobile deploy (Step 12) runs synchronously at end | run_pipeline.py:660 | Move to fire-and-forget background subprocess (no `wait()`); pipeline completes immediately, deploy runs to completion in the background | C | | 7 | Staleness guards inconsistent | Step 10/10a have them; 8.56, 11, 11.5, 11.6, 12 do not | Apply staleness guard pattern to every "expensive but doesn't change often" step β€” check input mtime / output mtime, skip if output fresher than input AND output age < threshold | D | | 8 | Slow/optional steps gate …[truncated at 3072B β€” open file for full content]
[BUILD] Health CHECK NNβ–Ύ
β”” BUILD_health_checks_45_46_20260423.md
# BUILD β€” Health CHECK 45 + CHECK 46 + Pre-Fix Q7 Rewrite (class-of-failure prevention layer) **Session:** 2026-04-23 Session 133 **Closes:** `[BUILD] Health CHECK 45` (TASKS.md line 362) + `[REVIEW + BUILD] Recurring class-of-failure` umbrella (TASKS.md line 276) **Related:** `references/BUG_REPORT_2026-04-23.md` (Prevention plan section) **Unblocks:** Gate Intelligence Layer P1 (TASKS.md line 360 β€” sequenced behind CHECK 45) --- ## Context β€” Why this is being built Four incidents in 25 days share one class of failure: **a shared CSV was modified (schema, row-type, or dtype) and the downstream consumer audit was incomplete.** Three caused data loss; the fourth (2026-04-23) would have if it had landed in a writer instead of a render script. | Date | Incident | Covered by existing check? | |---|---|---| | 2026-03-28 | FIELDNAMES schema drift | βœ“ CHECK 18 / 26 / 35 | | 2026-04-18 | Writer-side rec_type scope (same-date overwrite) | βœ“ CHECK 37 | | 2026-04-19 | Reader-side rec_type filter missing | βœ— **GAP β†’ CHECK 46** | | 2026-04-23 | Dtype consumer cast (int on float) | βœ— **GAP β†’ CHECK 45** | Originally proposed as 4 new checks (CHECK 43/44/45/46). Phase 1 exploration (this session) found CHECK 43 equivalent covered by CHECK 18/26/35 and CHECK 44 equivalent covered by CHECK 37. **Net new work: 2 checks, not 4.** Pre-Build Q7 as written relies on verbal confirmation ("confirm all writers have identical FIELDNAMES"). The 2026-04-23 postmortem demonstrates this class of process control has failed 4Γ— in 25 days. Per user memory `feedback_user_never_verifies.md`: governance that asks the user to verify is worthless. Q7 is rewritten to require **Claude-self-executed grep output** as part of the Pre-Fix Assessment, not user-paste-proof. --- ## Scope (locked) 1. **CHECK 45** β€” shared-CSV consumer format/dtype audit. Extended scope: numeric dtype casts (`int()` on a field written as float) **and** string-format consumers (slice, split, regex on structured string fields). Per TASKS.md line 362 Session 132 close decision. 2. **CHECK 46** β€” reader rec_type filter audit. Flags any script that reads a rec_type-bearing shared CSV without an explicit rec_type filter. 3. **Pre-Fix Q7 rewrite** β€” drop verbal-confirmation wording; replace with Claude-self-executed grep protocol. 4. **Task closure** β€” mark CHECK 45 (line 362) and umbrella (line 276) `[x]` done. 5. **Governance housekeeping** β€” CHANGELOG entry with `**Closes:**`, PROJECT_MAP entry for this plan file, BUG_REPORT prevention-plan update. --- ## Risk assessment **Safety rating:** LOW. All additive or text-only. No shared CSV touched. No pipeline step added/removed. Fully reversible. **Downstream impact verified:** - `session_digest.py` β€” 0 references to Q7 or any Q-number text - 7 files reference "Q7" by number only (pass-by-number, not text-parsed) - Q7 number preserved; only wording changes - Gate Intelligence Layer P1 (line 360) is sequenced behind this build β€” will unblock on completion, no conflict - Pre-Build Q10 (write_safe, `BUILD_write_safety_hardening_2 …[truncated at 3072B β€” open file for full content]
[BUILD] Gate alternativesβ–Ύ
β”” BUILD_gate_alternatives_naming_20260424.md
# BUILD β€” Gate Identity System (GIS) β€” Naming + Propagation > ## βœ… Build Complete β€” Session 152 (2026-04-25) > > All 4 batches shipped end-to-end in a single session. Zero regressions on a Danger Zone CSV that produced **4 incidents in 25 days** prior. **Health: 0 errors / 47β†’27 warnings / 134β†’141 OK.** > > ### Post-build retrospective β€” what kept this safe > > **What the user did:** > - Capped scope upfront: "4 batches ideal, 6 tops if it makes it safer" β€” set discipline before any code touched. > - Demanded LESSONS_LEARNED.md review before /risk-check, not after a problem surfaced. > - Reviewed `--dry-run` output explicitly before `--execute` on Batch 4 (the only non-revertable action) β€” surfaced their own insight (v10 7x stricter than v9) during review. > - Raised clarifying questions mid-build (gate_hash semantics, dist-sensitivity tradeoffs, SHADOW contamination concern) β€” caught design issues early. > - Refused to bundle stages β€” accepted that Batch 4 was the high-risk action and gated it explicitly. > - Approved at each go/no-go gate explicitly. Never inferred-and-executed. > > **What the system did:** > - **/risk-check fired before each batch** β€” Q0–Q9 + Pre-Fix Steps 1–6 with concrete file:line refs, not boilerplate. > - **Schema add decoupled from writer population** β€” Batch 2 proved the FIELDNAMES contract held alone before Batch 3 introduced population logic. The two prior schema-mismatch incidents (2026-03-28, 2026-04-18) were both caused by bundling these. > - **Recon revised scope** β€” Batch 3 originally 4 writers. Code inspection classified 2 as read-modify-write (DictReaderβ†’DictWriter preserves new fields automatically) and proved it via simulation on all 2,128 actual rows BEFORE first live edit. Cut scope in half with mechanical evidence. > - **3-layer Batch 4 safety** β€” pre-write file snapshot + sha256 record + `--dry-run` default + atomic `write_csv_safe` + post-write asserts (row count unchanged, sha256 changed, expected gate_id values present, pre-tracking still blank). > - **Per-batch `.bak` rollback hooks** β€” project not under git, so file-copy snapshots replaced the planned `git revert` strategy. Hooks created BEFORE first edit each batch. > - **WIRING + PROJECT_MAP updated inline** β€” every new file (`gate_identity.py`, `migrate_rec_events_gate_id.py`) registered in the same batch that introduced it. CHECK 31 stayed clean; no orphans surfaced next session. > - **CHECKs 18/26/35/45 verified between every batch** β€” health check became the per-batch verification gate. Warnings dropped 47β†’27 across the build because WIRING fixes cleared a stack of CHECK 31 false positives en route. > - **Module-load collision assert** in `gate_alternatives.py` caught the alt9-vs-current rule-set match the moment the simplified hash shipped β€” converted from runtime mystery into compile-time exception. > - **Of 7 historical rec_events failure classes, 4 were structurally impossible for this build (no rec_type change, no overwrite scope change).** Recognized upfront, eliminated from the risk surface. > > **Replicabl …[truncated at 3072B β€” open file for full content]
[BUILD] Equity Comp Phase 2β–Ύ
β”” BUILD_equity_comp_calculators_20260511.md
# BUILD: Equity Comp β€” Liquidity Event Calculator Suite (Phase 2.5) Created: 2026-05-11 Status: SEALED β€” pending risk-check ## Goal Add an 8th tab "Calculators" to the existing Equity Comp Dashboard containing 5 collapsible, interactive client-side calculators that support liquidity-event decision-making for the May 14 / July 28 early-release window β€” fully additive to the current comp dashboard, no edits to existing tabs. ## UX requirements (cross-cutting) - **Easy to execute**: every calculator should be usable in under 30 seconds with no documentation. Defaults pre-populated from `comp_state.json`. One-click "Reset to defaults" button per calculator. - **Helper text everywhere**: every input has a short "β“˜" tooltip or inline `<small>` explainer. Every output has a one-line plain-English interpretation (e.g. "This is what hits your bank after taxes."). Every calculator has a top "What this answers" 1–2 sentence intro and a bottom "Caveats" note. - **No jargon without decode**: AMT, bargain element, strike, vested, sell-to-cover all get inline glossary the first time they appear in each calc. - **Visual feedback**: outputs animate/highlight when inputs change; red text when a constraint is violated (e.g. allocation sliders sum != 100%). - **Mobile-aware spacing** even though mobile card is deferred β€” sections should not break the desktop layout if viewed on a tablet. ## Scope ### In - New tab `tab-calculators` in `dashboards/comp_dashboard.html` (desktop only β€” mobile deferred) - 5 collapsible `<details>` sections inside that tab, each rendering one calculator: 1. Early Release / Liquidity Calculator 2. Proceeds Distribution / Allocation Engine 3. ISO Exercise Timeline Model 4. AMT Sensitivity Model 5. Long-Term Equity Tracker (read-only summary aggregating existing comp_state.json) - All calc logic in pure client-side JavaScript inline in the rendered HTML β€” no new Python compute - New `render_calculators_tab(s)` function in `scripts/comp_render.py` - Tab nav link added in dashboard header - Defaults pre-populated from `comp_state.json` (current shares, strike, price) but every input editable ### Out (not in this build) - Mobile card (`mobile/comp.html`) β€” deferred to Phase 2.6 - Pipeline wiring for A39 (`/comp-refresh` skill remains manual trigger) - Per-grant AMT (already in HIGH backlog as Phase 2 sub-item β€” leave there) - Persistence of calculator inputs beyond page reload (use `localStorage` only β€” no JSON sidecar yet) - Preset save/load for allocation sliders (deferred β€” sliders start at 0 each session) - Any change to `comp_compute.py` schema or `comp_state.json` writers - Any touch on shared CSVs (recommendation_events, control_group, sil_learnings, etc.) β€” isolation contract preserved ## Files affected ### Created - (none β€” all changes inline in existing files) ### Edited - `scripts/comp_render.py` β€” add `render_calculators_tab(s)` function (~250 lines new); add nav link entry; register tab in main render assembly - `dashboards/comp_dashboard.html` β€” regenerated as output of `comp_render. …[truncated at 3072B β€” open file for full content]
[FIX] Gate Builder dropdownβ–Ύ
β”” BUILD_gate_builder_l1_dropdown_completion_20260429.md
# BUILD: Gate Builder L1 dropdown completion (Session 172 second-instance fix) Created: 2026-04-29 Status: SEALED β€” pending risk-check ## Goal Apply Session 172's already-established `_L1_MPS_BY_NAME` name-fallback pattern to the gate-builder metrics dropdown render path (`window.GB.metrics` array, line ~2756 + ~2813) so SM L1 cols that have NR L1 equivalents (RSI, ROE) display real grade/mps/sep_pp instead of `?` / 0. ## Context β€” why this is "second-instance" Session 172 (2026-04-28) shipped name-fallback `_L1_MPS_BY_NAME` lookup at `gate_alternatives.py:858-862` for the alt **rule-row** rendering path. Smoke-verified live: "JSON 8/8 L1 rule rows mps>0; new silfixv2 Phase B variant picked up RSI as L1 anchor." That fix is real and unchanged. The gate-**builder dropdown** path (`window.GB.metrics` array at line ~2756 SM L1 branch + ~2813 NR L1 branch) is in the same file but a **separate render function** that was never wired to use `_L1_MPS_BY_NAME`. Empirical proof: live `dashboards/Gate_Alternatives_Dashboard.html` (last regenerated 2026-04-28 20:41, after Session 172 ship) shows: ``` "col":14,"name":"RSI","grade":"?","mps":0.0,"sep_pp":0.0 ``` Same bug class, same file, different function. This build closes the second instance. ## Scope **In:** - `gate_alternatives.py:~2748-2772` β€” SM L1 branch in metrics dropdown JSON builder - `gate_alternatives.py:~2806-2829` β€” NR L1 branch (same fix pattern) - Suffix-normalization helper (strip trailing `" (%)"` and whitespace before lowercase compare) β€” addresses Agent F showstopper for "Net Profit Margin" vs "Net Profit Margin (%)" - Direction-divergence WARN log if matched NR-L1 `winner_dir` β‰  SM-L1 `winner_dir` (rare, signals data vintage drift) - Reuse existing `_L1_MPS_BY_NAME` dict (loaded by Session 172 β€” not new infrastructure) - Extend CHECK 62 in `mde_health_check.py` to also audit `window.GB.metrics` array (currently audits scoring path only) - File a follow-up TASKS.md entry for the 15 SM L1 metrics that have NO NR L1 equivalent in `l1_metric_power_scores.csv` **Out (explicit):** - Re-scoring the 15 SM L1 metrics (D/E, ROIC, EV/EBITDA, FCF Yield, FCF Margin, NPM, P/C, P/C Multiple, P/FCF, P/S, Rev Growth, EPS, ROA, Int Coverage) β€” separate larger build, touches `mde_02_metric_power.py` + ingest - Schema changes to `l1_metric_power_scores.csv` - Changes to Session 172's already-shipped paths (lines 858-862, 1034, 1571-1572) β€” verified working, untouched - run_pipeline.py edits (none needed β€” Step 7.5 already runs gate_alternatives.py) ## Files affected - `scripts/gate_alternatives.py` (single file edited β€” A22 Danger Zone, single-writer, ~25 lines additive) - `scripts/mde_health_check.py` (CHECK 62 extended, ~5 lines additive) - `TASKS.md` (1 new follow-up task for the 15 unfixable SM L1s) - `CHANGELOG.md` (entry on ship) - `references/BUILD_gate_builder_l1_dropdown_completion_20260429.md` (this plan) ## Steps ### Phase 1 β€” Diagnose + Fix (REVERSIBLE) 1. **[Read-only]** Confirm `_L1_MPS_BY_NAME` is loaded and populated at module level (Session 172 s …[truncated at 3072B β€” open file for full content]
[BUILD] Scheduled cron framework Phase 1deprioβ–Ύ
β”” BUILD_scheduled_cron_framework_20260505.md
# BUILD: Scheduled Cron Framework β€” Phase 1 (Shadow Log Daily) Created: 2026-05-05 Status: SEALED β€” pending risk-check --- ## Goal Build a reusable, observable Windows Task Scheduler framework for unattended scheduled scripts. Phase 1 ships **daily shadow logging** (the immediate gap β€” script not in pipeline, currently 6 days dormant). Phases 2+ extend the same scaffold to fetch_control_group, ratio_pull, finviz_pull on weekly cadences. All runs must be visible at next session start regardless of whether they succeeded, failed, or were skipped (machine off / on battery). ## North Star Alignment GOALS.md Q3 (signal quality) + Q4 (automation/speed). Shadow snapshots are unrecoverable per-day data points; missing days = lost validation evidence. Cron + visibility makes daily capture the default rather than a manual chore. ## Scope ### In - `scripts/cron/` directory + reusable PowerShell wrapper for any scheduled job - Per-job `.xml` Task Scheduler definitions (declarative, version-controlled) - One-shot `install_cron.ps1` that registers all defined jobs (idempotent) - Per-job log files in `logs/cron/<job_name>.log` (rolling, append) - A small `cron_status.py` reader that surfaces "last run / status / age" for each registered job - Session-start visibility: hook injection or session_digest section showing cron heartbeat - Phase 1 job: `Investments_ShadowLog_Daily` (daily 2:30am) - Skip-guard in wrapper: abort + log warning if `gated_ranks.csv` is >7 days old (stale prereq) ### Out (explicitly deferred to later phases) - Phase 2: `Investments_FetchControlPrices_Daily` (after market close β€” but skip-guard if pipeline didn't run that day) - Phase 3: `Investments_RatioPull_Weekly` + `Investments_FinvizPull_Weekly` - Phase 4: Cloud-based scheduling (GitHub Actions / VPS) for laptop-independence - PushNotification on failure (deferred β€” CHECK 57 + cron_status surface gaps adequately for v1) - Auto-restart of pipeline after shadow logs (manual decision per session) ## Files Affected ### Created - `scripts/cron/install_cron.ps1` β€” registers all defined tasks, idempotent (delete-then-create per task) - `scripts/cron/run_cron_job.ps1` β€” generic wrapper: cd to project, run script, log stdout/stderr/exitcode/duration - `scripts/cron/jobs/shadow_log_daily.xml` β€” Task Scheduler XML for Phase 1 job - `scripts/cron/cron_registry.csv` β€” single source of truth: job_name, script, schedule, max_age_hours, prereq_check - `scripts/cron_status.py` β€” reads `logs/cron/*.log` + cron_registry.csv, outputs status table; called by session_digest - `logs/cron/.gitkeep` β€” placeholder - `references/CRON_FRAMEWORK.md` β€” operator doc: how to add a new cron job, recovery path, design notes ### Edited - `scripts/session_digest.py` β€” add CRON HEARTBEAT section (calls cron_status.py) - `metric_discovery_engine/scripts/mde_health_check.py` β€” extend CHECK 57 (or add new CHECK) to read cron_registry.csv and warn per-job if last_run > max_age_hours - `AUTOMATION.md` β€” add A39 (Cron Framework) entry + Hook-Dependent Files note - `PROJECT_MAP.md` β€” regi …[truncated at 3072B β€” open file for full content]
SIL Output Quality + Audit Trail Closure (two streams)β–Ύ
β”” BUILD_sil_audit_and_quality_20260522.md
# BUILD: SIL Output Quality + Audit Trail Closure (two streams) Created: 2026-05-22 Status: SEALED β€” pending risk-check > **Supersedes:** `BUILD_sil_intent_vs_actual_closure_20260516_v2.md` (v2 + v2.1 patches). That plan is retired in favor of this scope after user direction 2026-05-22 dropped Phases 2, 3, 4-tuning, and 5-autonomous in favor of focused output-quality + audit-trail work. Predecessor plans `BUILD_sil_p2_enforcement_20260508.md` and `BUILD_sil_trusted_brain_20260423.md` remain SUPERSEDED (UNHOOK_LOG entries to be added in Stream 1 Phase A). ## Goal Make SIL's daily output decision-useful (Stream 2 β€” output quality) and make every new SIL deposit audit-trailable (Stream 1 β€” citation infrastructure). Ship in that order β€” output quality first so audit trail isn't "better filing on bad content." ## Scope **In scope:** **Stream 2 β€” Output quality pass (~1-2h, LOW risk):** - Fix 4-star-confidence boilerplate bug in SIL output (every ADD candidate insight text says "has 4-star confidence" regardless of actual stars β€” verified in `sil_grand_summary.json` 2026-05-22). - Rewrite ADD-candidate insight template to include real evidence (ctrl_d value + n, BF rank, MPS grade) instead of star-count restatement. - Investigate direction-flip threshold-clustering (14 warnings all firing at exactly 10 consecutive opposing runs β€” mass-trip suggests threshold needs raising or signal-strength differentiation). - Audit CSV-escaping in `sil_learnings.csv` writer β€” multi-line insight text with unescaped commas breaks readers parsing as plain CSV. **Stream 1 β€” Audit-trail infrastructure (~2.5h, LOW risk):** - Phase A: finish audit-trail plumbing (snapshot, ground-truth count, retroactive magnitude-guard unit test, deposit-writer wiring for evidence_refs/threshold_for_action/expiry_sessions, one-shot backfill, UNHOOK_LOG entries for 2 superseded predecessor plans, CHANGELOG + PROJECT_MAP). - Phase B: flip P2 WARNβ†’BLOCK in `sil_charter.py` after β‰₯2 clean pipeline runs, new CHECK 73 enforces P2 BLOCK + rejects uncited deposits. - Housekeeping: update `sil_charter.py:240-267` AUTHORITY_RULES `_status` from "PLACEHOLDER β€” wired in Phase 4" to "DEFERRED β€” scoring diversity preserved per user 2026-05-22". **Out of scope (DROPPED from prior plan):** - Authority hierarchy refactor / AUTHORITY_RULES wiring into advisors (Phase 2 of prior v2.1) β€” user wants MPS/Cohen/Control/BF scoring diversity preserved. - `decision_lineage.csv` writer (Phase 3 of prior v2.1) β€” duplicates CHANGELOG without Phase 2 authority context. - Synthesis pattern tuning (Phase 4 of prior v2.1) β€” 76 `sil_synthesis` rows already deposited, patterns are firing. - Autonomous output badges (Phase 5 of prior v2.1) β€” digest already surfaces ADD candidates + warnings at `session_digest.py:920`. - Mobile SIL card decision β€” separate ~2-line edit, not gated on this plan. ## Files affected **Edited:** *Stream 2:* - `scripts/signal_intelligence.py` β€” fix 4-star boilerplate in `generate_ideas()` / synthesis-pattern deposit text (find the f-string template hard-coding …[truncated at 3072B β€” open file for full content]

⏸ PARKED (15 +1 deprio)

[BUILD] Surface unshipped build plans in session digestβ–Ύ
(no additional detail)
[BUILD] Gate-size agnosticism refactorβ–Ύ
(no additional detail)
[GOVERNANCE] Convert file discoverability + governance doc creation from process control to machine controldeprioβ–Ύ
(no additional detail)
Retire Sheets Finance β€” Phase A+ (PARKED β€” design pivot to standalone momentum_pull)β–Ύ
β”” BUILD_beta_finviz_sheets_finance_retire_20260430_v2.md
# BUILD: Retire Sheets Finance β€” Phase A+ (PARKED β€” design pivot to standalone momentum_pull) Created: 2026-04-30 Status: πŸ…Ώ **PARKED** β€” design pivot mid-flight; resume requires user answers to Q1–Q3 below Predecessors: - `BUILD_beta_finviz_sheets_finance_retire_20260425.md` β€” v1 (Phase A only, Beta into finviz_pull) - `BUILD_beta_finviz_sheets_finance_retire_20260429.md` β€” v2 (Phase A+ scope, additive to finviz_pull) - `BUILD_beta_finviz_sheets_finance_retire_20260430.md` β€” v3 (additive plan, sealed + risk-checked GREEN/ULTRA-SAFE; not executed) --- ## Why parked User reviewed v3 (which extended `finviz_pull.py` additively, scored 0/ULTRA-SAFE) and pivoted the design 2026-04-30: > "needs to be its own run, just like finviz pull and ratio pull are their own, i want this to also be its own, can call them momentum pull maybe" Implication: instead of adding 3 columns to `finviz_pull.py`, build a **separate sibling script** (working name `momentum_pull.py`) β€” its own scrape run, its own checkpoint, its own output CSV, its own skill invocation. v3 plan invalidated as written. User also retracted the RSI-only / held-symbols-only quick-pull follow-up. Smoke-test gate retained. The pivot raises 3 open scope questions that **must be answered before resume**, plus several governance additions a standalone-script plan needs that the v3 additive plan didn't. --- ## Open questions (BLOCKING β€” must resolve to resume) ### Q1 β€” Scope mode for `momentum_pull.py` The new script would scrape the same Finviz snapshot pages that `finviz_pull.py` already loads (Beta, NPM, Sales Q/Q all live on the per-ticker snapshot). If both run on the full ~5,635-ticker universe, that's duplicate HTTP work for the same data. Three viable design modes: | Option | Behavior | Tradeoff | |---|---|---| | **A. Held-only default + `--symbols all` flag** | Default run = ~50–100 held tickers, ~2 min wall. Universe mode exists but rarely used. | **Recommended.** Effectively the RSI-only quick-pull idea repurposed for the momentum metric set. Real new capability (sub-2-min refresh anytime), minimal duplicate HTTP. | | **B. Universe pull, different cadence** | Full ~5,635 tickers but runs monthly (Beta is slow-moving) instead of weekly. | Reduces duplicate-scrape cost over time. Sales Q/Q updates quarterly anyway, so monthly cadence is fine. Loses the quick-refresh capability of A. | | **C. Naive sibling** | Full ~5,635 tickers, same weekly cadence as finviz_pull. | Cleanest mental model. But ~1h 53min of pure HTTP duplication per cycle + 2Γ— Finviz request volume on overlap days. Pushed back on as wasteful. | **Default recommendation:** **Option A**. Decision deferred to user. ### Q2 β€” Script name Working name `momentum_pull.py`. Confirm or propose alternative (e.g., `quick_pull.py`, `held_pull.py`, `metrics_pull.py`). ### Q3 β€” Skill name Working name `/momentum-pull`, parallel to existing `/finviz-pull` and `/ratio-pull`. Confirm or propose alternative. --- ## Tentative scope (assuming Q1 = Option A) **In scope (when resumed):** - New file: `s …[truncated at 3072B β€” open file for full content]
Fix CHANGELOG `**Closes:**` enforcement β€” hook bypass + Check 3 BLOCK promotionβ–Ύ
β”” BUILD_changelog_closes_hook_bypass_fix_20260429.md
# BUILD: Fix CHANGELOG `**Closes:**` enforcement β€” hook bypass + Check 3 BLOCK promotion Created: 2026-04-29 Status: SEALED β€” pending risk-check Supersedes (different scope): `references/BUILD_changelog_tasks_reconciliation_20260429.md` (PARKED β€” that plan was a fuzzy-matcher rebuild; /sweep surfaced Session 169 contemporaneous decision against fuzzy matching + 22% actual coverage vs 8.7% claimed. Premise rejected. This plan is the correct response: tune existing enforcement instead of building new detector.) --- ## Goal Close the bypass in `~/.claude/hooks/enforce_changelog_closes.py` AND wire `close_audit.py` Check 3's existing exit-code into a hard BLOCK at /close Phase 4. Tune existing infrastructure; do not build new fuzzy detection. --- ## Investigation findings (anchor for plan) - Hook lives since 2026-04-26 with bypass `if headers == 0: return True` β€” gives free pass when an Edit's diff doesn't contain a `### ` header. Multi-Edit composition during /close routinely bypasses. - Check 3 in `close_audit.py` already exits 1 when findings exist, but `~/.claude/skills/close/SKILL.md` Step 4 calls it without checking exit code. The "advisory" status is a missing wrapper, not missing logic. - 78% miss rate confirmed: 1,216 CHANGELOG entries / 267 `**Closes:**` lines = 22% coverage. - Session 174 (today) added Checks 6–10 + Step 0a/0b/4 split β€” orthogonal. Did not touch the hook, did not promote Check 3. - No prior incident postmortem on the bypass. UNHOOK_LOG.md has no entry. Bypass was BY DESIGN in original 2026-04-18 spec ("count headers in new content"); never documented as a failure mode. --- ## Scope ### In - Replace `enforce_changelog_closes.py` `check(text)` (diff-only) with `check_file()` β€” reads CHANGELOG.md after Edit, finds today's `## YYYY-MM-DD` block, counts `### ` headers vs `**Closes:**` substring matches. - Fail-closed default with documented escape: `try/except` wrapper; on crash β†’ BLOCK + stderr "Hook crashed; fix or set HOOK_BYPASS=1 to skip." - Add 6 test fixture payloads (`references/TEST_enforce_changelog_closes.json`) + validation script β€” machine-verified per `feedback_user_never_verifies.md`. - `close/SKILL.md` Phase 4: wrap `close_audit.py --phase post` in exit-code handler. Reconcile prior text "audit can never block close" β†’ "Phase 4 (Closes-line audit) is the only blocking gate; all other audit phases are advisory." - Phase 3 retro-fix: surface and retro-fix the 14 historical `[x]` tasks lacking Closes lines (TASKS.md L1273) BEFORE Phase 2 BLOCK ships β€” without this, first /close after eviction trips on legacy debt. - Round-trip end-to-end test: hook β†’ Check 3 β†’ `--scan-done` β†’ eviction. ### Out - ~~New fuzzy CHANGELOG↔TASKS matcher~~ β€” Path A; rejected by /sweep. - ~~New `/reconcile-tasks` skill~~ β€” same. - ~~Auto-mark TASKS.md `[x]` from CHANGELOG~~ β€” TASKS.md L1275; orthogonal future build (`BUILD_tasks_md_simplification_20260426.md` Phase 2 owns). - ~~Backfill of all 949 historical entries lacking Closes~~ β€” separate one-shot project, Phase B+ candidate. --- ## Files aff …[truncated at 3072B β€” open file for full content]
CHANGELOG β†’ TASKS.md Auto-Close Scannerβ–Ύ
β”” BUILD_changelog_closes_scanner_20260418.md
# BUILD: CHANGELOG β†’ TASKS.md Auto-Close Scanner **Created:** 2026-04-18 **Status:** APPROVED β€” ready to build **Task:** L872 HIGH β€” [BUILD] CHANGELOG β†’ TASKS.md completion scanner **Risk:** LOW β€” additive only, suggestions-only output, no auto-close path --- ## Context The task list has 140+ open tasks requiring manual archaeology each session to close completed work. `task_hygiene.py` already has a `find_done_not_marked()` function that reads CHANGELOG, but it was disabled due to keyword-matching false positives β€” "building toward X" and "X is built" look identical to a keyword scanner. The root problem: tasks are closed manually by Claude after spotting the match. A task list that can't update itself becomes a permanent backlog. **Chosen approach:** Add a structured `**Closes:**` line to CHANGELOG entries at write-time. The scanner reads this explicit field β€” no NLP, no ambiguity, zero false positives. Machine control at write-time (Claude writes the reference) + machine detection at read-time (scanner surfaces the match). --- ## What We're Building ### Part 1 β€” CHANGELOG entry format extension (write-time) Add an optional `**Closes:**` line to CHANGELOG entry format. Claude writes it whenever a CHANGELOG entry resolves a TASKS.md item. **Format:** ``` **Closes:** [FIX] combo dashboard ctrl_n display and sort order ``` - Value = the task title text (copy from TASKS.md `**[TAG] title**`, strip `**` markers) - Multiple closes on one entry: one `**Closes:**` line per task, or comma-separated - Optional β€” not every CHANGELOG entry closes a task (pipeline runs, data pulls, etc.) - Enforce via CLAUDE.md standing rule (Part 3 below) ### Part 2 β€” Scanner in task_hygiene.py (read-time) Add `scan_changelog_closes(tasks_path, changelog_path)` function: 1. Parse CHANGELOG.md for all `**Closes:** <text>` lines (full file, not just top 200) 2. For each close reference, match against open tasks by: - Tag match: `[FIX]` in closes text β†’ search `[FIX]` open tasks - Title overlap: 3+ specific words from closes text appear in task title (use `_specific_words()`) 3. Skip tasks already marked `[x]` β€” no re-surfacing of already-closed items 4. Return only `HIGH` confidence matches (tag + 3+ words). Drop MEDIUM/LOW β€” too noisy. 5. Output format (extend `--scan-done` flag): ``` SUSPECTED DONE (from CHANGELOG **Closes:** entries): [HIGH] [FIX] combo dashboard ctrl_n display β€” matched "combo dashboard ctrl_n" β†’ Close this task? Run with --auto-close to mark done, or close manually. ``` **Key guardrails:** - Never auto-marks tasks done β€” suggestions only - HIGH confidence threshold only (tag + 3+ words) - Skips CRITICAL tier tasks entirely (too risky to suggest-close automatically) - Skips `[x]` tasks (no re-surfacing) - Run on demand: `py scripts/task_hygiene.py --scan-done` - Optionally wire into session digest (after validation β€” not at first build) ### Part 3 β€” CLAUDE.md rule (process enforcement) Add to `investments/CLAUDE.md` under Standing Rules (after the session-event triggers table): > **Standin …[truncated at 3072B β€” open file for full content]
CHANGELOG ↔ TASKS reconciliation β€” recurring audit commandβ–Ύ
β”” BUILD_changelog_tasks_reconciliation_20260429.md
# BUILD: CHANGELOG ↔ TASKS reconciliation β€” recurring audit command Created: 2026-04-29 Status: SEALED β€” pending /risk-check + user approval Companion (deferred to Path B, separate build): session-close machine control that BLOCKS/WARNs when a CHANGELOG entry is added without a `**Closes:**` line for an open task it textually overlaps with. --- ## Goal Make CHANGELOG↔TASKS.md reconciliation a recurring, low-false-positive audit command so already-completed tasks stop accumulating in TASKS.md. User-observed symptom (2026-04-29 Session 173): cruise-candidate tasks that were "quite sure all also completed" β€” system never surfaced them. Hard data: 1,214 CHANGELOG entries, only 106 (8.7%) carry the `**Closes:**` field that `--scan-done` reads. The fuzzy scanner that would catch the other 91% (`find_done_not_marked` at `task_hygiene.py:558`) **already exists but is explicitly disabled** at line 826 due to false positives ("CHANGELOG vocabulary overlaps too much with open task titles"). Path A (this build) = re-enable + tighten the fuzzy scanner; ship it behind a tiered-confidence command. Path B (deferred) = forward-looking machine control β€” see Companion above. --- ## Scope ### In - Strengthen `find_done_not_marked()` β€” replace single-line scan with **paragraph-window scan** scoped to recent CHANGELOG entries, scored by: - count of `_specific_words` matches (existing β€” already strips `_DOMAIN_STOP`) - **rare-word weighting** β€” add a corpus-frequency penalty so high-recurrence words ("phase", "gate", "shadow") don't trigger; rare words ("CHECK 64", "STEP_OUTPUTS", "Phase 5a") count more - co-occurrence with done verb (`done|complete|built|closed|fixed|added|created|wired|live|shipped|ships`) - **3-tier confidence**: HIGH (β‰₯4 rare-weighted matches + done verb in same entry), MEDIUM (β‰₯3), LOW (β‰₯2 + done verb within 3-line window) - Wire as new flag: `task_hygiene.py --reconcile` β€” prints HIGH-confidence by default; `--reconcile --include-medium` and `--reconcile --include-low` for wider sweeps - Output format: per-task block β€” task title, matching CHANGELOG entry header, confidence, 1-line evidence ("matched: STEP_OUTPUTS, CHECK 64, Phase 5a, banner"). Advisory only β€” never modifies TASKS.md. - Slash skill: `~/.claude/skills/reconcile-tasks/SKILL.md` β€” wraps the command; default = HIGH-confidence; documents `--include-medium` for periodic deeper sweeps. - Update `references/TASK_HYGIENE_LOGIC.md` β€” add a "Reconciliation" section describing the 3-tier model. ### Out β€” DEFERRED ENTIRELY (Path B, separate build) - ~~Session-close machine control that BLOCKS/WARNs on CHANGELOG entries missing `**Closes:**`~~ β€” needs its own /risk-check (touches close skill + governance flow). File as separate task. - ~~Auto-marking `[ ] β†’ [x]` based on reconciliation matches~~ β€” duplicates Phase 2 of `BUILD_tasks_md_simplification_20260426.md`. Reconciliation is suggestion-only; that build owns the apply path. - ~~Wiring into session_digest at session start~~ β€” start as on-demand command. Promote to digest only after 2+ weeks o …[truncated at 3072B β€” open file for full content]
/projects skill β€” terminal print + mobile drill-downβ–Ύ
β”” BUILD_projects_skill_20260429.md
# BUILD: /projects skill β€” terminal print + mobile drill-down Created: 2026-04-29 Status: SEALED β€” pending risk-check --- ## Goal One terminal command (`/projects`) that prints all in-flight, parked, blocked, built-not-verified, and unscoped work in clean emoji-prefixed sections β€” so the user can see the full project board at a glance. Phase 2 adds a mobile dashboard with click-through drill-down to full build/project scope detail. --- ## Scope ### In scope (Phase 1 β€” terminal) - New skill: `~/.claude/skills/projects/SKILL.md` - New script: `projects/investments/scripts/print_project_view.py` - Reads (read-only): `TASKS.md`, `references/BUILD_*.md` filenames, `CHANGELOG.md` (last 30d), `CURRENT.md`, `PROJECT_MAP.md` - 7 categories with emoji headers + counts - Fuzzy filename match between TASKS.md text and `BUILD_*.md` filenames (first 4 keywords) - DEPRIORITIZED items appear but capped at **max 1 per category** to avoid old-build flooding - Sort within sections by tier (CRITICAL β†’ HIGH β†’ VERY HIGH β†’ MEDIUM β†’ LOW β†’ VERY LOW β†’ NEEDS REVIEW β†’ DEPRIORITIZED) - "Needs scope" filter: CRITICAL / HIGH / VERY HIGH only - "Built not verified" filter: suppress items shipped >30d ago - PROJECT_MAP.md row registering the new script ### In scope (Phase 2 β€” mobile, deferred 2 weeks) - New script section in `generate_mobile.py::generate_projects_card` - New file: `mobile/projects.html` - Collapsible sections matching terminal categories - **Drill-down:** clicking an item opens its full detail β€” `BUILD_*.md` content rendered for plan-backed items, full task-text + tier + age for task-only items - Pipeline wiring deferred (manual refresh first; promote per `feedback_shadow_investments_surfacing.md` after 2 weeks reliability observation) ### Out of scope - No edits to `TASKS.md`, `CURRENT.md`, `CHANGELOG.md`, or any shared CSV - No pipeline wiring in Phase 1 - No desktop HTML dashboard - No auto-promote / auto-close logic β€” display only - No new CHECK in `mde_health_check.py` (read-only skill needs no validator) --- ## Files affected ### Created (Phase 1) - `C:/Users/jjwat/.claude/skills/projects/SKILL.md` β€” skill definition + invocation block - `C:/Users/jjwat/OneDrive/Claude Code_All/Claude Code Terminal/projects/investments/scripts/print_project_view.py` β€” printer (~200 lines) ### Edited (Phase 1) - `C:/Users/jjwat/OneDrive/Claude Code_All/Claude Code Terminal/projects/investments/PROJECT_MAP.md` β€” register new script + this BUILD plan ### Created (Phase 2 β€” separate session) - `C:/Users/jjwat/OneDrive/Claude Code_All/Claude Code Terminal/projects/investments/mobile/projects.html` - New function in `projects/investments/scripts/generate_mobile.py` --- ## Categories β€” final detection logic | # | Category | Emoji | Detection | Cap | |---|---|---|---|---| | 1 | In the works | 🚧 | `BUILD_*.md` exists AND CHANGELOG has partial-ship entry (e.g. "Phase N SHIPPED" but plan defines more phases), OR text appears in CURRENT.md Interrupted/Open block | none + 1 deprio | | 2 | Parked | ⏸ | `TASKS.md` PARKED section + plans flag …[truncated at 3072B β€” open file for full content]
Type 2 Separation Pilot (separation_calc.py + mobile Build Lab integration)β–Ύ
β”” BUILD_separation_pilot_20260425.md
# BUILD β€” Type 2 Separation Pilot (separation_calc.py + mobile Build Lab integration) **Date:** 2026-04-25 **Session:** 153 **Sources:** - User feedback post Wave 3b Phase 2 deploy: questioned `lift_pct` semantics, identified Type 1 vs Type 2 separation distinction - Parallel Session 156 build plan: `references/BUILD_separation_pp_universal_20260425.md` (PARKED) - User multi-source insight: *"should have shadow + control + treatment + sold ticker β€” have everything β€” limiting our signal here"* **Relationship to parked Universal plan:** Pilot complements, does NOT duplicate. Pilot generates empirical evidence to un-park Universal by answering its 4 open questions through measurement. **Status:** Plan committed; /risk-check fired LOW; SIL deposit done; user "go" given. --- ## 1. Intent Build a reusable utility module for combo-level Type 2 separation (return-based sep_pp), wire it into the mobile Build Lab card as a pilot, and produce a methodology doc that anchors the Universal plan when it un-parks. **Type 1 (current BF):** held=1/sold=0 binary classifier lift over baseline. **Type 2 (this pilot adds at combo level):** avg actual return of combo passers βˆ’ avg actual return of combo failers. Per-metric Type 2 already exists (`ctrl_sep_pp` in `control_lab_direction_signals.csv`). Combo-level Type 2 does not exist anywhere. ## 2. Why pilot, not full standardization - Universal plan has 4 open questions; pilot answers them empirically by running. - Pilot scope (mobile-only) is throwaway-cheap; data it generates is high-value signal. - Reusable module = leverage when Universal un-parks. - User explicit framing: *"more experiment, prototype and nothing to lose situation."* ## 3. Scope **IN scope:** - New `scripts/separation_calc.py` reusable utility module - New `references/SEPARATION_METHODOLOGY.md` explanation doc - Multi-source returns blending: FORMAL > SHADOW > control > holdings (priority order) - Per-source attribution surfaced (so user can sanity-check coverage) - Coverage_pct flag if <30% of combo passers have return data - Mobile Build Lab card displays `sep_pp_real` alongside existing `lift_pct` - Top 10 L2 combos + top 10 L1+L2 hybrid combos get the new field - CLI for standalone testing: `py scripts/separation_calc.py --combo "57,504"` **OUT of scope (intentional):** - Desktop combo dashboard updates (deferred to Universal plan when un-parked) - BF engine modification (`mde_04_brute_force.py` UNCHANGED) - run_pipeline.py wiring (deferred β€” JSON refreshes via existing pipeline call) - Column rename collisions (Universal Phase 4) ## 4. Source Files & Multi-Source Returns Strategy **Returns data sources (priority order):** 1. `data/processed/recommendation_events.csv` β€” FORMAL recs with `return_pct` populated 2. `data/processed/recommendation_events.csv` β€” SHADOW recs with `return_pct` populated (skip if PENDING per Session 153 CSL finding) 3. `data/processed/control_group.csv` β€” `excess_vs_spy` for ~500 tickers 4. `data/processed/holdings_vs_control.csv` β€” return for held positions **Dedupe by tic …[truncated at 3072B β€” open file for full content]
Universal Return-Separation-PP Sweep + Naming Standardβ–Ύ
β”” BUILD_separation_pp_universal_20260425.md
# BUILD β€” Universal Return-Separation-PP Sweep + Naming Standard **Created:** 2026-04-25 **Last Revised:** 2026-04-25 (Revision 3 β€” Phase 1b sort flip folded into Phase 1 after 2nd /risk-check; user approved combined ship) **Status:** EXECUTING β€” Phase 0 + Phase 1 (now including sort flip) approved + in-flight. Phases 1.5 / 2 / 3 / 3.5 DEFERRED β€” revisit after Phase 1 lands + 1 week observation. **Priority classification:** HIGH (data-clarity growth lever, not a CRITICAL data-integrity bug). **Owner:** Claude (under user direction) --- ## File Discoverability (per CLAUDE.md standing rule) 1. **Who needs this and when?** Claude at build time, on every session that touches BF / gate alts / control lab / dashboards / METRIC_FORMULAS until build is complete. 2. **How will they find it?** Linked from CURRENT.md "In Progress" row; referenced in TASKS.md task entry; this file lives in `references/` (governance-discoverable). 3. **Right location?** Yes β€” multi-phase build plan, references/BUILD_*.md is canonical per memory `feedback_build_plan_location.md`. 4. **Existing file covers this?** No. METRIC_FORMULAS.md and SYSTEM_STANDARDS.md touch metric quality but not return-separation methodology. 5. **Process or machine control?** Phase 0 produces a governance doc (process); Phases 1–3 add machine-enforced columns surfaced in pipeline output (machine control). Phase 4 (rename collisions) is deferred. --- ## North Star Tie-In This build serves the causal chain directly: **separation power IS the mechanism by which gate strength becomes returns** (per GOALS.md). Today the system measures separation at the per-metric L1/L2 level (`ctrl_sep_pp`) but **not at the combo or gate level** β€” meaning gate composition decisions are flying half-blind on the most important quality signal. Fixing this is North-Star-aligned. --- ## The Problem (one paragraph) The user's preferred metric β€” `return_separation_pp` (avg return of tickers above threshold MINUS avg return below threshold, direction-aware) β€” is computed today only in `control_lab_direction_signals.csv` as `ctrl_sep_pp`, per individual metric. It does **not exist at the combo level** in BF, gate alternatives, or anywhere else. Worse, two existing column names collide: BF's `return_spread_pct` is a held/sold *classifier lift* (not a return separation), and the registry's `distance_pct` is a *threshold-to-median weight* (also not a return separation). Both currently live in dashboards under names that imply they ARE return separation. This makes the system foggy on its most important signal. --- ## Definitions Lock (canonical β€” to be enshrined in METRIC_LANGUAGE_STANDARD.md) | Term | Definition | Where computed today | |---|---|---| | `win_rate` | Of tickers passing the threshold, % that beat baseline (precision). | BF `win_rate_pct`, control lab | | `win_rate_recall` *(optional)* | Of all winners, % that sit above threshold (recall, direction-aware). | NOT computed | | `return_separation_pp` ⭐ | Avg return(above threshold) βˆ’ Avg return(below threshold), direction-aware. …[truncated at 3072B β€” open file for full content]
SIL β€” Intent-vs-Actual Closure Planβ–Ύ
β”” BUILD_sil_intent_vs_actual_closure_20260516.md
# BUILD: SIL β€” Intent-vs-Actual Closure Plan Created: 2026-05-16 Status: SEALED β€” pending risk-check > Supersedes (folds in): `BUILD_sil_p2_enforcement_20260508.md` (β†’ Phases 0+1) and `BUILD_sil_trusted_brain_20260423.md` Phases 0-4 (β†’ reframed as Phases 0-3 here). Phase 6 of trusted_brain (Decision Memory + Outcome Tracking) deferred until after this plan ships. --- ## Goal Bring the Signal Intelligence Layer from its current state ("scoring reporter running in parallel to decision logic") to its declared intent in `SIGNAL_INTELLIGENCE_LAYER.md` + `SIL_CHARTER.md` ("trusted brain that informs decisions, with audit-trailed evidence"). Six sequenced phases, each with a hard acceptance gate. ## Scope **In scope:** - Fix the `signal_intelligence.py:443-445` magnitude-guard chokepoint contaminating 11+ consumers. - Ship P2 (evidence_refs) enforcement end-to-end: writer wiring, historical backfill, WARNβ†’BLOCK promotion. - Activate P6 authority hierarchy by refactoring `gate_advisor.py` and `direction_advisor.py` to consume `AUTHORITY_RULES` instead of hardcoded weights. - Wire P3 decision lineage: persist `decision_lineage.csv` populated by `capture_session_decisions()`. - Activate synthesis output (SYSTEM rows) + surface `sil_grand_summary.json` content in session digest + resolve mobile/dashboard discoverability of SIL. - Promote SIL from advisory β†’ autonomous powers (auto-ADD candidates, direction-flip warnings, VALIDATED SIGNAL surfacing) with one-time user sign-off. **Out of scope:** - Gate Alternatives SIL-Driven Fix v1/v2 specifics (per user direction this session). - Phase 6 of trusted_brain plan (Decision Memory + Outcome Tracking) β€” revisit after this plan completes. - New SIL mobile/dashboard cards beyond re-promoting or retiring the existing one. - Phase 7 (reserved / not yet detailed in any doc). ## Files affected **Edited:** - `scripts/signal_intelligence.py` β€” magnitude guard (L443-445 region + import), writer wiring for evidence_refs/threshold_for_action/expiry_sessions, surface `capture_session_decisions()` output. - `scripts/sil_charter.py` β€” flip P2 WARNβ†’BLOCK; promote AUTHORITY_RULES from PLACEHOLDER β†’ ENFORCED. - `scripts/mde_gate_advisor.py` β€” refactor `compute_evidence_score()` (~L274) to consume AUTHORITY_RULES. - `scripts/direction_advisor.py` (or equivalent file β€” confirm name in Phase 2) β€” refactor to read SIL confidence per AUTHORITY_RULES at decision time, not display-only at L59-60. - `scripts/mde_health_check.py` β€” add CHECK NN (P6 advisor compliance: grep advisors for hardcoded weights β†’ 0 hits), CHECK NN+1 (P3 decision_lineage.csv freshness + row schema), CHECK 51 (P4 synthesis tripwire). - `scripts/session_digest.py` β€” surface `sil_grand_summary.json` content as 🧠 SIL GRAND SUMMARY block. - `mobile/mobile_registry.py` β€” flip SIL entry `nav: True` OR retire with reason logged in UNHOOK_LOG.md. - `metric_discovery_engine/scripts/run_pipeline.py` β€” confirm SIL step ordering still valid; no new step expected. **Created:** - `scripts/backfill_sil_evidence_refs.py` β€” one-shot migratio …[truncated at 3072B β€” open file for full content]
SIL β€” Intent-vs-Actual Closure Plan (v2.1 β€” post-/sweep re-validation)β–Ύ
β”” BUILD_sil_intent_vs_actual_closure_20260516_v2.md
# BUILD: SIL β€” Intent-vs-Actual Closure Plan (v2.1 β€” post-/sweep re-validation) Created: 2026-05-16 (v2) Β· Patched: 2026-05-22 (v2.1) Status: SEALED v2.1 β€” un-parked 2026-05-22, pending /risk-check before Phase 0 first Edit > **v2.1 patch notes (2026-05-22 β€” post-/sweep re-validation after un-park):** > - **[Ξ”1] CHECK number collision fixed:** CHECK 51/52/53/54/55 were ALL already claimed (Gate Alts 51-53, Control Lab 54, GDE 55). Renumbered to **73/74/75/76/77** (next free range, CHECK 72 added 2026-05-22). Mapping: P4 synthesis tripwire β†’ **73**, P2 BLOCK enforcement β†’ **74**, P6 hardcoded-weights audit β†’ **75**, P3 decision_lineage freshness β†’ **76**, P5 autonomous output guard β†’ **77**. > - **[Ξ”2] Phase 0 partial-ship recorded:** > - Step 0.1+0.2 magnitude guard βœ… **SHIPPED 2026-05-21** at `signal_intelligence.py:451` (load_rec_events) + `:500` (load_shadow_rec_events), import at `:80`. Note: actual line numbers shifted from plan's original `L443-445` to `L451`. > - Step 0.6 (5 bare `os.replace()` β†’ `_atomic_replace()`) βœ… **SHIPPED** β€” grep for `os.replace(` in `signal_intelligence.py` returns 0 hits. CHECK 42 passes. > - Remaining Phase 0 work: 0.0a snapshot, 0.0b ground-truth count, 0.2b unit test (new), 0.3+0.4 evidence_refs deposit writer + backfill, 0.7 UNHOOK_LOG entries, 0.8 CHANGELOG, 0.9 PROJECT_MAP. > - **[Ξ”3] New Step 0.2b:** create `scripts/test_sil_magnitude_guard.py` (~10 lines) to satisfy Step 0.1+0.2 acceptance retroactively. 1 fixture row with `return_pct="0.0"` β†’ assert row skipped. Smoke runs <2s. > - **[Ξ”4] Line-ref drift refreshed:** > - `mde_gate_advisor.py` hardcoded weights: plan said `L70-72` β†’ actual `L62-65` (MPS_WEIGHT=40, COHENS_D_WEIGHT=20, CONTROL_WEIGHT=20, BF_WEIGHT=20). > - All other line refs (synthesize_learnings L1330-1450, capture_session_decisions L1475+, AUTHORITY_RULES L240-267) verified intact. > - **[Ξ”5] Governance hooks added:** > - Phase 0 Step 0.0a first Edit gated on `/risk-check` pass (explicit). > - Per-phase: visible Pre-Fix checklist (Steps 1–6) before first Edit; CURRENT.md live update after each ship; `py scripts/refresh_command_center.py` after every CHANGELOG edit. > - Phase 4.4: DASHBOARD_REGISTRY entry required for `session_digest 🧠 SIL GRAND SUMMARY` block. > - AUTHORITY_RULES (Phase 2) clarified as data-driven const: Q1 user input β†’ edit `sil_charter.py:240-267` only, no consumer code edits required. > > **v2 deltas (vs v1 sealed earlier 2026-05-16):** Folded in all πŸ”΄ BLOCKING + 🟑 SHOULD-FIX gaps surfaced by /sweep. Phase 0 gains pre-mutation snapshot, ground-truth re-measurement of P2 violation count, migration of 5 bare `os.replace()` calls, and explicit UNHOOK_LOG entries. Phase 3 gains an explicit "wire capture_session_decisions to disk" step + new schema module. CHECK numbers assigned (51, 52, 53, 54, 55 β€” superseded by v2.1 to 73-77). All file paths corrected (`mde_direction_advisor.py`). Unit tests added per phase. CHANGELOG action made explicit per phase acceptance signal. AUTOMATION.md A43 + AUDIT_REGISTRY ent …[truncated at 3072B β€” open file for full content]
SIL Phase 1 β€” P2 Enforcement (evidence_refs end-to-end)β–Ύ
β”” BUILD_sil_p2_enforcement_20260508.md
# BUILD: SIL Phase 1 β€” P2 Enforcement (evidence_refs end-to-end) **Created:** 2026-05-08 **Status:** SEALED β€” pending risk-check **Supersedes:** `BUILD_sil_p2_enforcement_20260424.md` (2026-04-24, never executed β€” incorporated wholesale below with 2026-05-08 deltas marked) **Tier:** HIGH **Estimated effort:** ~2.5h shipping (single session, must not split) + 2 days observation before P2β†’BLOCK **Risk:** LOW (additive fields, supersede semantics already exist, atomic write covered) --- ## Goal Close the SIL P2 prerequisite gap: every auto-deposited row in `sil_learnings.csv` must carry `evidence_refs` (and the other 5 Phase-1 fields) at write time, so SIL output becomes auditable and can later drive autonomous decisioning. One sentence: **make CHECK 50 P2 stop firing on every active row by populating evidence_refs at write time and back-filling the 114 historical rows that lack it.** --- ## Why this build exists (carried from 2026-04-24) CHECK 50 P2 currently fires on **100% of active SIL rows** (114/114 in the 2026-04-24 baseline; today's /inspect run surfaced 10 fresh warnings, but the underlying violation count is unchanged). A health check that fires on every row is broken signal β€” it tells the user/Claude to "remember to ignore it." **Root cause:** `signal_intelligence.py:deposit_sil_learnings()` (line ~914) builds every auto-deposit row with only the original 7 fields and skips the 6 Phase-1 columns added in Session 147 β€” including `evidence_refs`. The schema has the column; the writer ignores it. Charter at `sil_charter.py:315–332` correctly flags the violation. **Decision context (2026-04-24, reaffirmed 2026-05-08):** User wants SIL output to drive more systems beyond pinned alts. P2 enforcement is the prerequisite β€” without `evidence_refs` populated, every SIL-driven decision is unauditable. Memory `project_sil_autonomous_direction.md` records this as the gating precondition for any new autonomous wiring. **2026-05-08 additions:** Phase 3 Mobile cards + SIL deposit injection (TASKS.md HIGH line 845) is explicitly DEFERRED waiting for this β€” every day of delay extends the block. --- ## Scope (in / out) ### In scope - **Piece 1:** Writer wiring in `signal_intelligence.py` β€” populate all 6 Phase-1 fields at every `new_rows.append(row)` site in `deposit_sil_learnings()` - **Piece 2:** One-shot backfill script `migrate_sil_p2_backfill.py` for the 114 historical rows - **Piece 3:** P2 WARNβ†’BLOCK promotion in `sil_charter.py:145` after β‰₯2 clean pipeline runs - P5 fields (`threshold_for_action`, `expiry_sessions`) populated as a **side effect** of Piece 1 (no extra work β€” they're written together) ### Out of scope (deferred) - **P5 promotion to BLOCK** β€” separate decision after observation; today's plan only populates the fields, does not flip P5 severity - P1 enforcement (no dashboard restatements) β€” separate task; needs `is_dashboard_template` regex tested against current rows first - Any specific SIL output β†’ autonomous wiring β€” that's the *next* decision after this build clears the prerequisite - An …[truncated at 3072B β€” open file for full content]
Sub-Project Framework v3a β€” Plug-and-Play + Sync + Unified Mobile Hub (v2)β–Ύ
β”” BUILD_subproject_framework_v3a_20260510_v2.md
# BUILD: Sub-Project Framework v3a β€” Plug-and-Play + Sync + Unified Mobile Hub (v2) **Created:** 2026-05-10 **Status:** ⏸ PARKED β€” 2026-05-10. /sweep + /risk-check surfaced strong evidence that framework is premature: B2 dormant 37 days; 2 prior framework plans (2026-04-19, 2026-05-09) never shipped; cost-benefit NET NEGATIVE if PE is sole consumer (-13 hr at sub-project #2; payoff at sub-project #3-4); Phase 9 mobile registry not actually additive (Hard Rule 1 violated); v3a alone ships scaffold without UX (v3b is 2-week prereq for "PE-focused session"); 20-25 hr realistic effort vs 6-8 hr for PE one-off path. **Revisit trigger:** when sub-project #2 actually arrives (concrete user intent, not aspirational projection). Replaced by `BUILD_pe_dashboard_oneoff_20260510.md` for the immediate PE work. Original sealed pending status preserved below for the eventual revisit. **Original status:** SEALED β€” pending /risk-check **Supersedes:** `BUILD_subproject_framework_v3a_20260510.md` (v1, same session) β€” folds in 5 user-context additions: v3b scope clarification, /refresh-template skill (evergreen template), new-system-detection mode B, mobile hub section config, additivity reinforcement **Companion task split:** v3a (this plan β€” framework + cloning + sync + mobile hub) | v3b (separate future plan β€” /main + /<slug> switcher commands + project-aware skill refactor across 31 skills + 5 hooks) **Related stale doc:** `DECISION_pe_sub_folder_scope_20260510.md` β€” framework decisions superseded; PE-domain notes carry forward to a future `BUILD_pe_subproject_spinup_*` plan --- ## Goal Build a parent-owned framework that lets the investments project clone, govern, and continuously sync sub-projects with mirrored infrastructure β€” and do so additively, with zero interference to existing systems β€” so any new sub-project gets investments-grade governance out of the box, the master template stays evergreen, and existing sub-projects can both detect drift AND detect newly-added canonical systems they don't yet have. **Non-goal (deferred to v3b):** Custom slash-commands for switching sub-project context (`/main`, `/<slug>`), `.active_project` state file, refactor of 31 existing skills + 5 global hooks to be project-aware. This v3a plan delivers the **framework + cloning + sync + mobile hub**; v3b delivers **navigation between projects in a session**. Independent; either can ship first; v3a unblocks PE so it's prioritized. --- ## Guiding Constraint β€” Additivity (HARD RULES, user requirement 2026-05-10) **This build must be very low risk, very additive, functional, and evergreen. It must NOT interfere with current systems.** Four hard rules every phase must satisfy: 1. **No modification of existing logic in any current script.** Edits to existing files (run_pipeline.py, mobile_registry.py, mde_health_check.py, CLAUDE.md, settings.json) are restricted to APPENDING new code/sections. Existing functions, classes, steps, CHECKs, standing rules, and hook entries stay byte-identical. 2. **Failure of any new component must not affect an …[truncated at 3072B β€” open file for full content]
Sub-Project Navigation v2 β€” Write-Guard + Minimal Scaffold (Option C)β–Ύ
β”” BUILD_subproject_navigation_20260509_v2.md
# BUILD: Sub-Project Navigation v2 β€” Write-Guard + Minimal Scaffold (Option C) Created: 2026-05-09 Status: SEALED β€” pending risk-check Supersedes: `BUILD_subproject_navigation_20260509.md` (v1 β€” 42/100 SAFE but premise half-wrong per /sweep) --- ## What changed from v1 v1 tried to do four things at once: navigation skills, registry/state, hook generalization, write-guard, scaffold, governance cloning. /sweep surfaced 4 BLOCKING gaps: 1. `.active_project` is unused by 31/38 skills + 5 global hooks β†’ write safety not actually delivered 2. session_context.py SessionStart fires before `/b2` can run β†’ cold-start always wrong context 3. Cloning investments governance imports 70–85% rule noise into PE/home/work-items domains 4. Existing 2026-04-19 v1 plan at TASKS.md:1301 (β‰ˆ80% same scope) was never executed **v2 reframes around the actual user need:** "prevent overlap and overwrite of wrong CHANGELOG/CURRENT/TASKS in sub-projects." The real safety is at write-time, not at navigation-time. v2 ships a write-guard hook + minimal scaffold + filesystem-discovery `/projects-help`. No registry, no state file, no skill refactors, no governance clone. ~3 hours work, near-zero risk. User accepted Option C 2026-05-09 with a known-incomplete caveat: "this is not close to where I need it to be β€” add a task to get this better." That follow-up task is added to TASKS.md alongside this plan. --- ## Goal Deliver cross-project file-write safety + discovery of sub-projects with the smallest possible footprint. Existing B2 keyword UX preserved unchanged. Future, larger nav refactor tracked as a separate task. --- ## Scope **In:** - 1 PreToolUse hook: `~/.claude/hooks/subproject_write_guard.py` - 2 skills: `~/.claude/skills/new-subproject/SKILL.md`, `~/.claude/skills/projects-help/SKILL.md` - Minimal 3-file template at `~/.claude/skills/new-subproject/template/`: `CURRENT.md`, `TASKS.md`, `CHANGELOG.md` only - `~/.claude/settings.json` β€” add PreToolUse entry - `restore_claude_setup.py` β€” register the new hook + 2 skills (single edit, single phase) - CHANGELOG entries per phase ship **Out:** - `/main`, `/b2`-style explicit nav slash-commands (existing B2 keyword hook works fine) - `.active_project` state file - `~/.claude/project_registry.json` - `project_session_detector.py` (b2_session_detector.py stays) - Refactor of any existing skill or hook - Governance cloning (no GOALS/SYSTEM_STANDARDS/CLAUDE.md/PROJECT_MAP scaffolded) - Workspace-level rollup files - Mobile registry changes --- ## Files affected ### Created - `~/.claude/hooks/subproject_write_guard.py` β€” PreToolUse hook (~40 LOC) - `~/.claude/skills/new-subproject/SKILL.md` - `~/.claude/skills/new-subproject/template/CURRENT.md` - `~/.claude/skills/new-subproject/template/TASKS.md` - `~/.claude/skills/new-subproject/template/CHANGELOG.md` - `~/.claude/skills/projects-help/SKILL.md` - This plan file ### Edited - `~/.claude/settings.json` β€” add PreToolUse hook entry - `restore_claude_setup.py` β€” single addition: hook constant + skill scaffold writes - `investments/CHANGEL …[truncated at 3072B β€” open file for full content]
TASKS.md Self-Maintaining Closure Loopβ–Ύ
β”” BUILD_tasks_md_simplification_20260426.md
# BUILD β€” TASKS.md Self-Maintaining Closure Loop **Date:** 2026-04-26 **Author:** Session 170 (long-term plan track) **Status:** Draft v3 β€” final design after governance + history + code audit. Awaiting user approval + /risk-check before Phase 1. **Companion to:** parallel-session tactical work (170c/f/h/i/j) β€” already shipped, complementary, out of scope here. --- ## 1. Context β€” the value frame TASKS.md should be a **healthy, self-updating machine** β€” when work completes, the file reflects it automatically, with no manual `[ ] β†’ [x]`, no manual eviction, no per-task cleanup. Every other property (cap math, tier flow, funnel stages) is supportive plumbing. **This plan exists to close the completion loop.** ### Design constraints (user-stated, non-negotiable) 1. **Long funnel is fine β€” even good.** 9 sections, more if needed. Don't simplify section count. 2. **DEPRIORITIZED is a parking lot, not a graveyard.** Items there are reviewable + refillable. **Never deleted, never auto-evicted.** 3. **Only `[x]` (truly completed) work gets evicted.** No other state ever leaves the active surface. 4. **`/task-hygiene`, `/buckets`, `/task-promote`, `/close`, `/align` all keep working.** Zero command rewiring. 5. **The matcher (Session 169 exact-prefix logic) is not touched.** It works. ### What's already shipped today (parallel sessions, OUT OF SCOPE here) | Session | Ship | Effect | |---|---|---| | 170 | `enforce_changelog_closes.py` hook | Blocks CHANGELOG writes without `**Closes:**` line | | 170c | `--archive-stale-review N=21` ran | 27 NEEDS REVIEW β†’ DEPRIORITIZED | | 170f | `task_hygiene.py` UTF-8 stdout wrapper | Fixed UnicodeEncodeError crash | | 170h | `_DEMOTION_CASCADE β†’ DEPRIORITIZED` extension | 100 items demoted; **all tiers within cap** | | 170i | `--refill-review N` flag | Pulls items DEPRIORITIZED β†’ NEEDS REVIEW | | 170j | `close_audit.py` Check 3 fix (multi-session capture + closure-note strip) | False positives killed | **Current `/buckets` state β€” ZERO overcap.** CRITICAL 1/2 Β· VERY HIGH 4/5 Β· HIGH 6/8 Β· MEDIUM 14/15 Β· LOW 10/12 Β· VERY LOW 10/10 Β· NEEDS REVIEW 40/40 Β· DEPRIORITIZED 174 Β· BLOCKED 2. ### The remaining gap Closure flow is still half-manual: `--scan-done` is advisory; user manually edits `[ ] β†’ [x]`; closed `[x]` items accumulate in tier sections forever. **That's what this plan fixes.** --- ## 2. Architecture review (governance + history + code, audited via 3 parallel Explore agents) The 9-section funnel is **load-bearing** per Session 116's Task CRM Overhaul: - **NEEDS REVIEW** = entry inbox (cap 40, drains via `--archive-stale-review` + cascade). - **DEPRIORITIZED** = uncapped overflow + parking lot. Refillable via `--refill-review N` (170i). - **CRITICAL** = protected (never auto-demoted) per explicit user decision after a prior cascade incident. - **`_DEMOTION_CASCADE`** terminates at DEPRIORITIZED (170h). - **`MIN_PROMO_SLOTS=3`** dead-band requires multi-tier granularity. 7+ scripts hardcode tier name literals (`task_hygiene.py`, `buckets.py`, `refresh_command_center.py`, …[truncated at 3072B β€” open file for full content]

βœ… BUILT, NOT VERIFIED (0)

β€” shipped within 30d, no [x] yet
(none)

🚫 BLOCKED (0 +1 deprio)

[DECISION] [BLOCKED on Session 156 sep_pp_real] Rebalance gate compositedeprioβ–Ύ
(no additional detail)

πŸ”¬ NEEDS RESEARCH (10 +1 deprio)

[INVESTIGATE] Why is ROIC-EBITDA Quality Composite score so bad?β–Ύ
(no additional detail)
[INVESTIGATE] Why does FORMAL recs (-7.9%) underperform Gate-Filtered Random (+26%) by ~33pp?β–Ύ
(no additional detail)
[INVESTIGATE] CHECK 71A real driver breakdownβ–Ύ
(no additional detail)
[INVESTIGATE] Why does Random Control (all 500 random tickers) beat SPY by +5.38%?β–Ύ
(no additional detail)
[INVESTIGATE] Control Lab gate-recommendations excess (βˆ’8%) contradicts gate-score cohort (4/6 & 5/6 = +15%)β–Ύ
(no additional detail)
[INVESTIGATE] Mobile dash Gate Discovery card not workingβ–Ύ
(no additional detail)
[INVESTIGATE] GDEβ–Ύ
(no additional detail)
[INVESTIGATE] Recover metric vocabulary build plan from terminated sessionβ–Ύ
(no additional detail)
[INVESTIGATE] BF universe scopeβ–Ύ
(no additional detail)
[INVESTIGATE] CSL surfaces suspicious combined treatment win_rate (4.13%) vs control (77.13%)β–Ύ
(no additional detail)
[INVESTIGATE] finviz_pull.py same-class checkpoint-replay risk auditdeprioβ–Ύ
(no additional detail)

πŸ“ NEEDS SCOPE (8)

β€” CRITICAL/HIGH/VERY HIGH only
[BUILD] SIL Output Quality + Audit Trail Closureβ–Ύ
(no additional detail)
[BUILD] Wire SHADOW gate-accuracy into Gate Alternatives composite_score (7th component)β–Ύ
(no additional detail)
[BUILD] Disk audit + smart-prune systemβ–Ύ
(no additional detail)
[FIX] User: fix #VALUE! in Google Sheet col BJ rows 2670 + 2671 β†’ re-export β†’ re-enable Alts 8 + 9β–Ύ
(no additional detail)
[BUILD] Auto-retune scripts_dist weights when registry distance_pct drifts beyond thresholdβ–Ύ
(no additional detail)
[BUILD] Batch 2 of A22 master planβ–Ύ
(no additional detail)
[FIX] seed_control_group.py:280β–Ύ
(no additional detail)
[FIX] Session digest mis-signals SHADOW statusβ–Ύ
(no additional detail)

πŸ“ TASK-ONLY, NO PLAN (3)

(top 3)
[GOVERNANCE] PROJECT_MAP.md orphan-BUILD backfillNEWβ–Ύ
(no additional detail)
[FIX] Refresh outdated metric dataNEWβ–Ύ
(no additional detail)
[FIX] Standardize Hub buttons across all desktop dashboardsNEWβ–Ύ
(no additional detail)
← Hub