docs(audit): ratchet v4 — audit complete (9/9), W-004 closed, W-015 (#253)

investigated, four new entries from L8

Audit milestone: all 9 substrate layers audited. L8 (PR #250) and
L9 (PR #249) merged to close the audit phase. The ratchet transitions
from "audit-driven entry addition" to "wiring-progress driven
closure."

Status updates:

- W-004  CLOSED via PR #251 (first non-trivial wiring closure from
  the audit). Vault recall now stamps E2 EnergyProfile per ADR-0006.
  Unlocks W-005 (energy-modulated readback now meaningful).
- W-015  INVESTIGATED via PR #252 (Sonnet). Verdict (c) confirmed
  with bimodal-distribution evidence across 4,138 samples. Root cause:
  _slerp_toward interpolates on S^31 but versor manifold is a proper
  subset. Fix in flight (rotor geodesic via Lie group exponential).

Four new W-NNN entries from L8 audit:

- W-016 — Contemplation operates without vault probe. Independent
  mechanical fix at ChatRuntime._emit_discovery_candidates call site.
- W-017 — Automated T1/T2 → T3 promotion absent (ADR-0055's own
  "what is missing"). Chained: needs W-009 (HITL async queue) +
  W-016 (vault probe) first.
- W-018 — ADR-0080 contemplation not autonomous. Chained: needs W-008
  (L10 runtime model) first.
- W-019 — from_miner.py / from_curriculum.py test-live only. Operator
  decision: CLI wiring (smallest), runtime invocation (via W-017), or
  document as offline-library-only.

L9 audit added no new W-NNN entries; the refusal-reason
materialization matrix consolidates prior findings (W-011, W-012)
from the verdict-surface side. Safety, opt-in ethics, default-audit
ethics, and hedge injection all CLOSED in the matrix per design.

Updated:
- Title v3 → v4
- Subtitle "L0-L7 + L10 scope" → "L0-L9 + L10 scope"
- Dependency graph: W-004 marked FIXED, W-015 marked INVESTIGATED,
  new entries placed in their dependency lanes
- Suggested next-ADR sequence reordered: W-015 fix leads (in flight),
  followed by W-011, W-012, W-016 as the quick-wins lane
- Items-deferred section transitioned from "L8-L9 pending" to "audit
  complete; future revisions are wiring-progress driven"

Tally so far: 5 of 19 W-NNN entries closed (W-001, W-002, W-004
fully closed; W-015 investigated and fix in flight; the rest of the
quick-wins lane is now safely dispatchable post-L9).
This commit is contained in:
Shay 2026-05-24 19:52:49 -07:00 committed by GitHub
parent cad24f12b1
commit bf3baa8bfa
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -1,4 +1,4 @@
# Substrate Liveness Ratchet — v3 (partial; informed by L0-L7 + L10 scope)
# Substrate Liveness Ratchet — v4 (audit complete; informed by L0-L9 + L10 scope)
**Scope:** [substrate-liveness-audit-scope](../decisions/substrate-liveness-audit-scope.md) (v2)
**Companion:** [substrate-liveness-registry](./substrate-liveness-registry.md)
@ -72,24 +72,24 @@ home (ADR-XXXX or new).
if the lattice's promotion gate isn't running).
- **Status:** ⏳ OPEN — audit-dependency on L10.
### W-004 — Vault re-thaw path specified-not-verified-live
### W-004 — Vault re-thaw path specified-not-verified-live (FIXED)
- **Surfaced by:** L2 audit (PR #238); L1 audit (PR #237) forward-noted
the same concern.
- **Gap:** ADR-0006 §"Integration Points" specifies "Vault recall
transiently raises region to E2, then lets it cool again." L2 audit
traced `vault.recall` callers and found that recall does NOT update
or re-raise the energy class/profile of recalled entries. The
re-thaw is design-only; nothing in code does it.
- **Dependency:** L1 (energy operator, live) — already in place. The
wiring is at L2's recall path, not at L1.
- **Cross-layer consequence:** L3 audit (PR #241) confirmed that
downstream language readback receives recalled-as-E0 regions and
silently treats them as if E2 — a load-bearing inconsistency
(W-005).
- **Proposed home:** new ADR — *"wire vault-recall energy re-thaw per
ADR-0006 integration spec"*. Small focused ADR; doesn't require L10.
- **Status:** ⏳ OPEN — can land independently of L10.
traced `vault.recall` callers and found that recall did NOT update
or re-raise the energy class/profile of recalled entries.
- **Resolution:** PR #251. `vault/store.py` now stamps each
`recall()` / `recall_batch()` result with a module-level
`_VAULT_RECALL_RETHAW_ENERGY` singleton (raw=0.50, E2 mid-band).
Cool-down remains downstream propagation's responsibility. 6 new
tests in `tests/test_vault_recall_rethaw.py` pin the contract; lane
SHAs preserved (byte-identity intact).
- **Unlocks:** W-005 — E0/E2 distinction now exists at the runtime
data shape, so energy-modulated surface readback becomes
meaningful.
- **Status:** ✅ CLOSED.
### W-005 — E0/E2 readback modulation absent
@ -278,7 +278,27 @@ home (ADR-XXXX or new).
consumer (evals); the question is whether it should be promoted to
runtime use.
### W-015 — `session/context.py` post-generation unitize undocumented
### W-015 — `session/context.py` post-generation unitize undocumented (INVESTIGATED → fix in flight)
**Investigation closed (PR #252).** Sonnet's investigation produced
verdict **(c) — upstream construction violation**, with mechanical
evidence: bimodal distribution across 4,138 samples (either
`vc < 1e-6` for near-identity slerp, or `vc >> 1e-3` with median 0.19
and max 38.58; nothing in `[1e-6, 1e-5)`). The `unitize_versor` at
`session/context.py:236` was repairing off-manifold state produced
by `_slerp_toward` (lines 38-64). Slerp interpolates on **S³¹**
(the 32D unit sphere) but the versor manifold (Spin group embedded
in Cl(4,1)) is a **proper subset** of S³¹ — the geodesic doesn't
stay on it.
**Recommended fix (in flight via Sonnet):** replace `_slerp_toward`
with proper rotor geodesic interpolation via the Lie group
exponential map — same approach `rotor_power` already uses at
`generate/stream.py:220`. That stays on the versor manifold by
construction; `unitize_versor` in `_anchor_pull` becomes unnecessary
and can be removed.
**Original ratchet entry (preserved for history):**
- **Surfaced by:** L6 audit (PR #246), answering L1 audit's forward
note (PR #237).
@ -309,6 +329,81 @@ home (ADR-XXXX or new).
- **Status:** ⏳ OPEN — discipline question; small ADR or small
refactor depending on investigation outcome.
### W-016 — Contemplation operates without vault probe
- **Surfaced by:** L8 audit (PR #250).
- **Gap:** `teaching.contemplation.contemplate` accepts an
`injectable vault_probe` parameter, and tests prove coherent vault
evidence can contribute to discovery candidate enrichment. But
`ChatRuntime._emit_discovery_candidates` calls `contemplate(c)`
with **no probe**. Inline contemplation therefore operates on pack
+ reviewed corpus only, ignoring the session vault — exactly the
Tier 1 evidence the four-tier model intends contemplation to
consume.
- **Dependency:** light — wire a vault probe at the
`ChatRuntime._emit_discovery_candidates` call site.
- **Proposed home:** small fix-PR. May benefit from a brief ADR note
documenting the probe contract.
- **Status:** ⏳ OPEN — independent, can land soon.
### W-017 — Automated T1/T2 → T3 promotion absent
- **Surfaced by:** L8 audit (PR #250); ADR-0055's own "what is
missing" section names this gap explicitly.
- **Gap:** The four-tier memory model (ADR-0055) specifies discovery
evidence from T1 (session vault) and T2 (turn-event audit) should
feed into proposed promotions to T3 (reviewed teaching corpus).
Today, discovery candidates ARE emitted (W-016 caveat aside) and
ARE written to disk via `DiscoveryMonthlyFileSink`, but no
automated path turns them into proposals. Promotion to T3 still
requires L7's synchronous operator `core teaching propose` command.
- **Dependency:** chained — depends on W-009 (HITL async queue) to
give automated promotion a place to deposit candidates without
blocking the engine, AND on W-016 (vault probe wired so candidates
carry T1 evidence).
- **Proposed home:** new ADR — *"automated T1/T2 → T3 promotion
pipeline"*. Sized after W-009 and W-016 commit.
- **Status:** ⏳ OPEN — chained: W-009 + W-016 → W-017.
### W-018 — ADR-0080 contemplation not autonomous
- **Surfaced by:** L8 audit (PR #250).
- **Gap:** ADR-0080 contemplation runs as a CLI operator command
(`core contemplation`) over explicit report files, not as an
autonomous runtime loop. Live plan contemplation exists in
`ChatRuntime` but is opt-in via
`RuntimeConfig.discourse_contemplation=True` (default off).
"Autonomous" contemplation that runs without operator invocation
doesn't exist.
- **Dependency:** chained — autonomous contemplation needs a runtime
shape to live in (W-008 — L10 runtime model), and an event source
(likely tied to W-017 promotion triggers).
- **Proposed home:** ADR amendment to ADR-0080 or new ADR — *"runtime-
resident autonomous contemplation"*. Sized after W-008 commits.
- **Status:** ⏳ OPEN — chained: W-008 → W-018.
### W-019 — `from_miner.py` / `from_curriculum.py` test-live only
- **Surfaced by:** L8 audit (PR #250).
- **Gap:** `teaching/from_miner.py` (370 lines) and
`teaching/from_curriculum.py` (275 lines) correctly build
source-stamped proposals per ADR-0094 / ADR-0095 / ADR-0104, but
no CLI command or live runtime path invokes them. Test-live
only — the miner and curriculum candidate-conversion paths exist
but produce nothing in production.
- **Dependency:** operator decision — wire to a CLI command (small),
invoke from a runtime path (medium, depends on W-008 / W-017), or
document as offline-only library code for evals.
- **Resolution paths:**
- **(a)** Wire CLI: `core teaching propose --from-miner <dir>` and
`--from-curriculum <dir>`. Small, no architectural commitment.
- **(b)** Wire into W-017's automated promotion pipeline when that
lands.
- **(c)** Leave as test-live library and document explicitly.
- **Recommended:** (a) first as the smallest reachability fix; (b)
follows naturally if W-017 materializes.
- **Status:** ⏳ OPEN — operator decision required.
---
## Dependency graph (Mermaid-style, ASCII)
@ -316,25 +411,31 @@ home (ADR-XXXX or new).
```
W-001 ✅ ──── (independent, FIXED)
W-002 ✅ ──── (independent, FIXED)
W-004 ⏳ ──── (independent) ────→ W-005 ⏳
W-006 ⏳ ──── (operator decision) ─────┘ (may merge / supersede)
W-004 ✅ ──── (independent, FIXED — PR #251) ────→ W-005 ⏳ (now unlocked)
W-006 ⏳ ──── (operator decision) ────────────────────────┘ (may merge / supersede)
W-011 ⏳ ──── (independent, mechanical)
W-012 ⏳ ──── (independent, mechanical) — sibling of W-011
W-012 ⏳ ──── (independent, mechanical) — sibling of W-011
W-010 ⏳ ──── (operator decision: intentional or wire L3 vocab)
W-013 ⏳ ──── (operator decision: wire, relocate, or delete)
W-014 ⏳ ──── (operator decision: lighter than W-013)
W-015 ⏳ ──── (discipline question: investigate root cause first)
W-015 ⏳ ──── INVESTIGATED (verdict c, PR #252); fix in flight via Sonnet
W-016 ⏳ ──── (independent, mechanical: wire vault probe)
W-019 ⏳ ──── (operator decision: CLI, runtime, or library-only)
W-008 (L10 ADR) ⏳
├──→ W-003 (VaultPromotionPolicy wiring) ⏳
│ └──→ recognizer-storage ADR
│ └──→ W-007 (recognizer integration) ⏳
└──→ W-009 (HITL async queue) ⏳
└──→ drop-off sibling ADR
├──→ W-009 (HITL async queue) ⏳
│ ├──→ drop-off sibling ADR
│ └──→ W-017 (automated T1/T2→T3 promotion) ⏳
│ ↑
│ ├── W-016 (vault probe)
│ └── W-019 (miner/curriculum wiring) — if path (b) chosen
└──→ W-018 (autonomous contemplation) ⏳
```
---
@ -347,53 +448,60 @@ the bigger L10 unit.**
### Quick wins — independent, mechanical, small diffs
1. **W-011 — Propagate recognition `refusal_reason` into
`CognitiveTurnResult`.** ~Small pipeline change. Closes a load-
bearing audit-trail gap in recognition.
2. **W-012 — Catch `InnerLoopExhaustion` in `ChatRuntime.chat()`.**
1. **W-015 fix — Replace `_slerp_toward` with rotor geodesic** (in
flight via Sonnet). Removes the `_anchor_pull` unitize, closes a
real construction violation. Smallest meaningful fix.
2. **W-011 — Propagate recognition `refusal_reason` into
`CognitiveTurnResult`.** Small pipeline change. Closes recognition
audit-trail gap.
3. **W-012 — Catch `InnerLoopExhaustion` in `ChatRuntime.chat()`.**
Sibling of W-011 — both about refusal materialization. Closes
ADR-0142 implementation debt #3.
3. **W-004 — Wire vault-recall energy re-thaw per ADR-0006.** No
runtime-model dependency. Closes the field/vault re-injection gap.
4. **W-016 — Wire vault probe into
`ChatRuntime._emit_discovery_candidates`.** New from L8. Light
wire-up.
### Operator-decision items — small either way, just need a call
4. **W-006 — Pack readback: wire or delete.** Per
[[feedback-cleanup-as-you-find]], operator decides; the audit is
waiting on the answer.
5. **W-013 / W-014 — `explain.py` / `provenance.py`: wire, relocate,
5. **W-006 — Pack readback: wire or delete.** Per
[[feedback-cleanup-as-you-find]], operator decides.
6. **W-013 / W-014 — `explain.py` / `provenance.py`: wire, relocate,
or delete.** Same shape as W-006.
6. **W-010 — L4 recognition vocabulary: token-level intentional, or
wire L3 vocab.** Operator decision; affects whether recognition
pulls in pack-resident domain types.
7. **W-015 — `session/context.py` unitize: ADR-sanction, remove, or
fix-upstream.** Investigate root cause first; resolution shape
depends on what's found.
7. **W-010 — L4 recognition vocabulary: token-level intentional, or
wire L3 vocab.** Affects whether recognition pulls in
pack-resident domain types.
8. **W-019 — `from_miner.py` / `from_curriculum.py`: CLI, runtime,
or library-only.** Smallest fix is CLI wiring (path a).
### Then user-observable second-order changes
### Then user-observable second-order changes (W-004 now unlocks W-005)
7. **W-005 — Energy-modulated surface readback.** Becomes user-
observable once W-004 is in place. Closes E0/E2 readback rot.
9. **W-005 — Energy-modulated surface readback.** Now meaningful
since W-004 closed (vault recall declares E2). Closes E0/E2
readback rot.
### Bigger units (gated on or co-evolving with L10)
8. **W-008 — Runtime model ADR (or cluster).** Largest unit. Gates
W-003, W-007, W-009. Scope landed (#236); spike + ADR next.
9. **W-003 — `VaultPromotionPolicy` wiring.** Small ADR once W-008
commits to process shape.
10. **Recognizer-storage ADR** — answers `recognizer-storage-scope.md`
10. **W-008 — Runtime model ADR (or cluster).** Largest unit. Gates
W-003, W-007, W-009, W-017, W-018. Scope landed (#236); spike +
ADR next.
11. **W-003 — `VaultPromotionPolicy` wiring.** Small ADR once W-008
commits to process shape.
12. **Recognizer-storage ADR** — answers `recognizer-storage-scope.md`
against W-008's process shape and W-003's wired promotion.
11. **W-007 — `DerivedRecognizer` integration into turn loop.** Small
13. **W-007 — `DerivedRecognizer` integration into turn loop.** Small
once the storage ADR commits.
12. **W-009 — HITL async queue.** Concurrent with or after W-008.
14. **W-009 — HITL async queue.** Concurrent with or after W-008.
15. **W-017 — Automated T1/T2 → T3 promotion.** After W-009 + W-016.
16. **W-018 — Autonomous contemplation.** After W-008.
This order is a suggestion. The operator decides; the ratchet records.
**Why quick wins first changed in v2:** v1 led with W-004 (a vault
fix). The L4/L5 audits surfaced W-011 and W-012, which are even
smaller and close load-bearing audit-trail gaps. Pulling them forward
gets early measurable progress with no architectural risk, and
demonstrates the audit-to-fix loop actually closes.
**Why the v4 reorder:** v3 led with W-004 (vault re-thaw); that
shipped (PR #251), so v4 leads with W-015 fix (in flight) as the next
smallest meaningful closure. The L8 audit added W-016 to the quick-
wins lane and W-017/W-018 to the L10-gated cluster, reflecting that
automated memory promotion and autonomous contemplation both depend
on the runtime model decision.
---
@ -403,8 +511,11 @@ demonstrates the audit-to-fix loop actually closes.
[[project-engine-identity-candidate]]. Trigger to un-shelve: L10
runtime-model ADR commits to cross-reboot identity verification as
a sub-question 3 requirement.
- **L8-L9 wiring debt.** L0-L7 audited (7 of 9 layers); L8-L9 pending.
Ratchet will be revised as remaining entries land.
- **Audit complete.** All 9/9 layers audited. L8 added W-016/W-017/
W-018/W-019; L9 confirmed W-011 and W-012 from the verdict-surface
side without adding new entries (the refusal-reason matrix is a
consolidation of prior findings, not new debt). Future ratchet
revisions are wiring-progress driven, not audit-driven.
- **Drop-off sibling ADR for recognizers.** Named in recognizer-
storage-scope v2; depends on W-008 + recognizer-storage ADR + W-009.
Not added to the ratchet as a standalone entry yet because it's a