π§ 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)