docs: runtime_contracts + eval_methodology + papers + session log (audit #3) (#122)

Closes the documentation audit. All four lower-priority surfaces from
the earlier scan now reflect the post-ADR-0110 reality.

New:
- docs/sessions/SESSION-2026-05-22-contract-layer-arc.md: full
  narrative of the ADR-0103 -> ADR-0110 arc, including the
  refused/amended/succeeded narrative, infrastructure bridges, and
  ledger state at session close. Pairs with the 2026-05-21
  articulation-arc session log.

Extended (additive, no rewrites):
- docs/runtime_contracts.md: new 'Expert-Demo Promotion Contract
  (ADR-0106 + ADR-0109)' section. Surfaces ledger_report() shape,
  reviewer-yaml schema, lane-shape registry, replay invariant,
  fail-closed registry behavior, and trust boundary.
- docs/eval_methodology.md: new 'Lane-shape registry (ADR-0109)'
  section. Documents what to do when adding a new eval lane:
  pick a shape or amend ADR-0109. Notes the holdout-runner gating
  (cases_plaintext.jsonl vs sealed). Header bumped to 2026-05-22.
- docs/Whitepaper.md: new section XIII 'Evidence-Governed Domain
  Layer' between XII (Forward Semantic Control) and the
  Extensions/closing. Narrates the contract chain at the
  philosophical / external-reader level. The original §XIII
  becomes §XIV.
- docs/Yellowpaper.md: new section XII 'Ratification Contract
  (ADR-0091 + ADR-0106 + ADR-0109)'. Formal specification of the
  nine predicates, the promotion predicate (with explicit logical
  form), the digest function, and the lane-shape registry table.
  The original §XII becomes §XIII.

No code, no tests, no contract changes.
This commit is contained in:
Shay 2026-05-22 13:28:03 -07:00 committed by GitHub
parent 95d3b4a45a
commit bc90622e53
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 427 additions and 4 deletions

View file

@ -357,7 +357,64 @@ characterization), `docs/evals/phase6_comparative_demo.md`
--- ---
### XIII. Extensions ### XIII. Evidence-Governed Domain Layer
Substrate alone does not make a claim credible. The Whitepaper's first
twelve sections describe what CORE *is*. This section describes how the
project distinguishes *what it has demonstrated* from *what its
substrate makes possible* — a distinction that the architecture made
visible only after the substrate stabilized.
The discipline is encoded as a chain of accepted Architecture
Decision Records (ADR-0091 through ADR-0110):
1. **Contract.** ADR-0091 defines nine predicate checks every ratified
pack must satisfy: lemma coverage, operator-chain counts, intent-shape
coverage, holdout discipline, reviewer resolution, and others. A pack
that satisfies all nine earns a `reasoning-capable` ledger row.
2. **Trust root.** ADR-0092 introduces a YAML-anchored reviewer registry.
Pack ratification cites a registered reviewer; the registry is the
only trust root.
3. **Fabrication control.** ADR-0096 defines a negative-control eval
lane. Phantom endpoints, cross-pack non-bridges, and sibling
collapses must all *refuse*. A pack that confabulates on any
refusal class fails ratification.
4. **Promotion gate.** ADR-0106 introduces the second status above
`reasoning-capable`: `expert_demo`. Promotion requires a reviewer-
signed `expert_demo_claims` entry whose evidence-bundle SHA-256
reproduces byte-for-byte from on-disk lane results. The signer must
resolve to the registry; the signed lanes must be attached to the
domain's ratified packs.
5. **Shape registry.** ADR-0109 amends ADR-0106 with explicit per-shape
threshold rules (cognition, accuracy, inference, refusal,
symbolic-logic). Unknown lanes fail closed.
The contract is load-bearing because it has *refused*. ADR-0107 records
the first promotion attempt — `mathematics_logic` — being honestly
refused on two named blockers. ADR-0109 amended the threshold rules
without weakening the discipline. ADR-0110 then promoted
`mathematics_logic` as the first domain at `expert_demo=true`, with the
signed claim digest reproducing from disk.
The architectural commitment is: a system cannot claim to *do*
something it has not been seen to do. A transformer LLM does not have
a place to attach this commitment — its outputs are generated under
sampling, not from a replay-deterministic trace bound to a signed
evidence bundle. CORE makes the commitment first-class.
External readers can inspect the ledger
(`core capability ledger` / `docs/decisions/README.md` table) to see
which domains are *contract-passing* and which are *demonstrated*. As
of acceptance: one domain demonstrated (`mathematics_logic`); three
ratified domains pending their own promotion ADRs.
Full evidence chain: `docs/decisions/README.md` (index + frontier),
`docs/decisions/ADR-0091-domain-pack-contract-v1.md` through
`ADR-0110-mathematics-logic-expert-demo-promotion.md`.
---
### XIV. Extensions
**CORE-Logos** — The language articulation subsystem. Specified in the companion Yellow and White Addenda inherited from `core-ai`. The Logos defines the vocabulary manifold, the token projection law, the holonomy encoder, and the termination condition. **CORE-Logos** — The language articulation subsystem. Specified in the companion Yellow and White Addenda inherited from `core-ai`. The Logos defines the vocabulary manifold, the token projection law, the holonomy encoder, and the termination condition.

View file

@ -637,7 +637,106 @@ cargo test
--- ---
### XII. What Was Deleted and Why ### XII. Ratification Contract (ADR-0091 + ADR-0106 + ADR-0109)
The runtime contracts in §I§XI describe the engine's algebraic
behavior. The ratification contract describes the discipline under
which the *capability ledger* is allowed to make claims about a
domain.
#### Domain Pack Contract v1 (ADR-0091)
A pack manifest at `language_packs/data/<pack_id>/manifest.json`
satisfies the contract iff all nine predicates hold:
1. **lemma_coverage** — declared lemmas resolve in `lexicon.jsonl`.
2. **gloss_coverage_above_floor** — mount-eligible if gloss coverage
crosses the per-pack floor.
3. **operator_chain_count** — declared operator families each carry
at least `_CHAINS_PER_OPERATOR_DOMAIN` chains.
4. **intent_shape_coverage** — at least three intent shapes present.
5. **holdout_present**`evals/<lane>/holdouts/` exists with sealed
or dev-mode-plaintext cases.
6. **eval_lanes_uniform** — all packs in a multi-pack domain declare
identical lane sets.
7. **fabrication_control_passing** — phantom / cross-pack / sibling
refusal classes all clean.
8. **reviewer_resolution** — provenance reviewer id resolves in
`docs/reviewers.yaml`.
9. **deterministic_replay** — the canonical eval reports reproduce
under `core test --suite cognition`.
A pack passing all nine earns `status = reasoning-capable` in the
generated ledger row.
#### Expert-Demo Promotion (ADR-0106 + ADR-0109)
The promotion to `status = expert-demo` is contract-gated. The
promotion predicate (`core/capability/expert_demo.py::evaluate_expert_demo`)
requires:
```text
reasoning_capable(D)
∧ ∃ claim ∈ ReviewerRegistry.expert_demo_claims
: claim.domain_id == D
∧ ReviewerRegistry.can_review(claim.signed_by, D, scope="eval")
∧ claim.evidence_lanes ⊆ ratified_lanes(D)
∧ ∀ lane ∈ claim.evidence_lanes, split ∈ {public, holdout} :
shape_checker(lane)(result(lane, v1, split))
∧ derive_evidence_digest(D, claim.evidence_revision,
claim.evidence_lanes, lane_results)
== claim.claim_digest
```
The digest function:
```text
derive_evidence_digest(D, rev, lanes, results) =
SHA-256(JSON.canonicalize({
domain_id: D,
evidence_revision: rev,
evidence_lanes: sort(lanes),
lane_metrics: {lane: {public: results[lane].public,
holdout: results[lane].holdout}
for lane in sort(lanes)}
}))
```
Canonicalization rules: sorted keys, compact separators,
`ensure_ascii=False`. The same lane results must reproduce the same
digest byte-for-byte; this is what makes the gate replay-deterministic.
#### Lane-Shape Registry (ADR-0109)
Threshold dispatch is per-lane-shape, not lane-uniform:
| Shape | Required keys | Pass condition |
|---|---|---|
| `cognition_shape` | `surface_groundedness`, `term_capture_rate`, `intent_accuracy`, `versor_closure_rate` | `≥ 0.95 ∧ ≥ 0.85 ∧ ≥ 0.95 ∧ == 1.0` |
| `accuracy_shape` | `accuracy` *or* `(passed, total)` | `accuracy ≥ 0.95` (computed as `passed/total` if `accuracy` absent) |
| `inference_shape` | `all_pass_rate`, `replay_determinism`, `overall_pass` | `≥ 0.95 ∧ == 1.0 ∧ True` |
| `refusal_shape` | `by_class[*].n`, `.refused`, `.fabricated` | `∀ bucket: refused == n ∧ fabricated == 0` |
| `symbolic_logic_shape` | `accuracy` | `≥ 0.95` |
Lane id → shape resolution is by registry lookup, not metric
introspection. Unknown lanes fail closed.
#### Fail-Closed Discipline
- Unloadable reviewer registry → zero claims → no domain promotes.
- Unregistered lane id → promotion fails with named reason.
- Claim digest drift → promotion refused; ledger row demotes to
`reasoning-capable`.
- Signer outside `eval` scope → promotion refused.
This is the algebraic specification of the contract layer the
Whitepaper §XIII narrates. The substrate makes both refusal and
promotion first-class; the ratification contract makes the
distinction visible to external readers.
---
### XIII. What Was Deleted and Why
The formal record is in `docs/DELETION_LOG.md`. The summary: The formal record is in `docs/DELETION_LOG.md`. The summary:

View file

@ -1,7 +1,7 @@
# Eval Methodology — Benchmark Discipline Contract # Eval Methodology — Benchmark Discipline Contract
**Status:** Accepted (ADR-0016) **Status:** Accepted (ADR-0016, extended by ADR-0109)
**Last updated:** 2026-05-15 **Last updated:** 2026-05-22 (lane-shape registry section added)
This document defines the five rules that govern every eval lane in the CORE This document defines the five rules that govern every eval lane in the CORE
capability roadmap. No exceptions per phase. A lane that does not satisfy these capability roadmap. No exceptions per phase. A lane that does not satisfy these
@ -102,3 +102,61 @@ A lane without a `contract.md` does not run.
- ADR-0016: Capability Roadmap - ADR-0016: Capability Roadmap
- `docs/capability_roadmap.md`: Full phased plan - `docs/capability_roadmap.md`: Full phased plan
---
## Lane-shape registry (ADR-0109)
ADR-0091's Domain Pack Contract v1 introduced a `dev/public/holdout`
discipline that every ratified pack must declare. ADR-0106 added a
reviewer-signed expert-demo promotion gate that consults those same
lane outputs at the ledger level. ADR-0109 then formalized the rule
that **threshold dispatch is lane-shape-aware**, not lane-uniform.
### What this means for new lanes
Adding a new eval lane requires deciding which shape it reports:
| Shape | Required metrics | Threshold |
|---|---|---|
| `cognition_shape` | `surface_groundedness`, `term_capture_rate`, `intent_accuracy`, `versor_closure_rate` | 0.95 / 0.85 / 0.95 / 1.0 |
| `accuracy_shape` | `accuracy` (or `passed`/`total` fallback) | ≥ 0.95 |
| `inference_shape` | `all_pass_rate`, `replay_determinism`, `overall_pass` | 0.95 / 1.0 / true |
| `refusal_shape` | `by_class[*].n`, `by_class[*].refused`, `by_class[*].fabricated` | refused == n, fabricated == 0 |
| `symbolic_logic_shape` | `accuracy` | ≥ 0.95 |
A lane that does not fit any existing shape **must not be silently
broadened**. The path is:
1. Open an ADR amending ADR-0109 to add the new shape.
2. Add the shape checker to `SHAPE_CHECKERS` in
`core/capability/expert_demo.py`.
3. Add the lane → shape mapping to `LANE_SHAPE_REGISTRY`.
A lane id absent from the registry is **fail-closed** at the
expert-demo gate (reason:
`lane <id> has no registered shape — introduce via ADR amendment`).
Unregistered lanes can still run as exploration; they just cannot
contribute evidence to a `reviewer-signed expert_demo` promotion.
### Holdout-runner gating (ADR-0105)
`split='holdout'` runs go through `evals.holdout_runner._decrypt_holdout`,
which expects either:
- `holdouts/v1/cases.jsonl.age` (sealed, requires `CORE_HOLDOUT_KEY`), **or**
- `holdouts/v1/cases_plaintext.jsonl` (dev-mode fallback, no key required).
A bare `holdouts/v1/cases.jsonl` is invisible to the runner. Lanes
authored before ADR-0105 must either rename their plaintext file or
seal it against an age recipient to be runnable on the `holdout`
split.
---
## References
- ADR-0091: Domain Pack Contract v1 (`evals/<lane>/holdouts/` discipline)
- ADR-0105: Sealed-holdout encryption (dev-mode fallback preserved)
- ADR-0106: Expert-demo promotion contract (consumes lane results)
- ADR-0109: Lane-shape-aware thresholds (this section's authority)

View file

@ -341,3 +341,112 @@ Content-addressing rules (binding across the whole pipeline):
See `formation/hashing.py`, `formation/cache.py`, and `formation/forge.py` See `formation/hashing.py`, `formation/cache.py`, and `formation/forge.py`
for the implementation of each rule. for the implementation of each rule.
---
## Expert-Demo Promotion Contract (ADR-0106 + ADR-0109)
Adds a domain-aware, reviewer-signed promotion gate to the capability
ledger surface (`ledger_report()`). Distinct from the runtime/turn
contracts above: this contract governs *what the ledger is allowed to
claim about a domain*, not what the runtime does on any single turn.
Per ADR-0108, the contract has been demonstrated end-to-end —
refused once (ADR-0107), amended once (ADR-0109), succeeded once
(ADR-0110).
### Surface
`ledger_report()` returns a `domains` list. Each row carries:
```text
status ∈ {blocked, seeded, grounded, reasoning-capable, expert-demo}
predicates.expert_demo bool
expert_demo_reason str (one-line legibility for operators)
```
A row carries `expert_demo=True` iff **all** of:
1. `reasoning_capable == True` (the ADR-0091 nine-predicate gate).
2. A signed `ExpertDemoClaim` exists in `docs/reviewers.yaml` for the
domain.
3. The signer named in `claim.signed_by` has `eval` scope for the
domain per `ReviewerRegistry.can_review` (ADR-0092).
4. Every lane in `claim.evidence_lanes` is attached to at least one of
the domain's ratified packs (no cross-domain bleed).
5. Every named lane's public + holdout metrics meet the threshold for
that lane's registered shape (ADR-0109; see §"Lane-shape registry"
below).
6. The canonical evidence-bundle SHA-256 reproduces `claim.claim_digest`
byte-for-byte.
Any failure leaves the row at `reasoning-capable` with
`expert_demo_reason` populated.
### Schema
`docs/reviewers.yaml` additively gains an `expert_demo_claims` block:
```yaml
expert_demo_claims:
- domain_id: mathematics_logic
evidence_lanes:
- elementary_mathematics_ood
- inference_closure
- fabrication_control
evidence_revision: "adr-0110:reviewed:2026-05-22"
signed_by: shay-j
claim_digest: "94d74781..."
```
The block is optional; absence yields zero promotions. Schema
validation is loud: unknown signer ids, malformed digests, and
duplicate `domain_id` values are all rejected at load time
(`core.capability.reviewers.load_reviewer_registry`).
### Lane-shape registry (ADR-0109)
Threshold rules dispatch by lane shape, not uniformly. Registry in
`core/capability/expert_demo.py`:
| Lane id | Shape | Threshold |
|---|---|---|
| `cognition` | `cognition_shape` | surface_groundedness ≥ 0.95, term_capture_rate ≥ 0.85, intent_accuracy ≥ 0.95, versor_closure_rate == 1.0 |
| `elementary_mathematics_ood` | `accuracy_shape` | accuracy ≥ 0.95 (passed/total fallback) |
| `foundational_physics_ood` | `accuracy_shape` | same |
| `symbolic_logic` | `symbolic_logic_shape` | same as `accuracy_shape` |
| `hebrew_fluency` | `accuracy_shape` | same |
| `koine_greek_fluency` | `accuracy_shape` | same |
| `inference_closure` | `inference_shape` | all_pass_rate ≥ 0.95, replay_determinism == 1.0, overall_pass == True |
| `fabrication_control` | `refusal_shape` | every `by_class` bucket: refused == n, fabricated == 0 |
**Unknown lane ids fail closed** with reason
`lane <id> has no registered shape — introduce via ADR amendment`.
Adding a lane to the expert-demo surface requires an explicit registry
entry, which requires an ADR amendment.
### Replay invariant
`core.capability.expert_demo.derive_evidence_digest` is deterministic
in field order (sorted keys, compact separators). Re-running it
against the on-disk lane results at the same `evidence_revision`
reproduces `claim_digest` byte-for-byte. Drift in any lane result
demotes the row back to `reasoning-capable` until re-signed.
### Fail-closed registry
If `docs/reviewers.yaml` fails to parse,
`reporting._load_registry_for_expert_demo` returns an empty registry
(zero reviewers, zero claims) rather than raising. Every domain row
falls back to `expert_demo=false`. A broken registry must never
silently grant `expert_demo=true`.
### Trust boundary
- Pack mutation remains proposal-only (ADR-0029/0064 discipline).
- A reviewer signature in `expert_demo_claims` does not authorize
pack mutation — only a ledger-row promotion. The two paths remain
separate.
- `evidence_revision` may be a labeled string (e.g.
`adr-0110:reviewed:2026-05-22`) or a raw git sha. The load-bearing
invariant is replay byte-equality, not git-sha format.

View file

@ -0,0 +1,100 @@
# Session 2026-05-22 — Contract Layer Arc (ADR-0103 → ADR-0110)
**Date:** 2026-05-22
**Owner:** Joshua Shay (`shay-j`)
**Pair:** Claude (Opus 4.7)
**Outcome:** Evidence-Governed Domain Layer demonstrated end-to-end; first `expert_demo` promotion landed.
---
## Arc summary
The session opened with three in-flight Codex-drafted PRs (ADR-0103 fluency-lane attachment, ADR-0104 curriculum-sourced proposals, ADR-0105 sealed-holdout encryption) needing reconciliation and merge. It closed with the entire ADR-0091 evidence-governed domain chain demonstrated end-to-end, the first reviewer-signed `expert_demo` promotion landed on `mathematics_logic`, and the docs backfilled to reflect the work.
Net merged: **15 PRs** (106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121).
### Chronological sequence
1. **Codex reconciliation (PRs #106 / #107 / #108).** Fixed stale `curriculum_loop_closure` SHA pin; corrected pyrage API misuse (`Identity.from_str`, not `from_file`); resolved README rebase conflicts. All three merged.
2. **ADR-0106 — Expert-Demo Promotion Contract (proposed → accepted).** Domain-aware, reviewer-signed, replay-deterministic gate. Closes the cognition-lane bleed at `core/capability/reporting.py:418`. PRs #109 (proposed) + #113 (implementation).
3. **ADR-0108 — Proposed-ADR sequencing (meta).** Made the post-ADR-0105 frontier ordering explicit and revisable. PRs #111 + #112.
4. **ADR-0107 — `mathematics_logic` expert-demo deferred.** First worked attempt at the new contract; honestly refused on two named blockers (metric-shape uniformity assumption + `inference_closure` substantively failing at 40%). PR #114.
5. **ADR-0109 — Lane-shape-aware threshold amendment.** Five shapes (`cognition_shape`, `accuracy_shape`, `inference_shape`, `refusal_shape`, `symbolic_logic_shape`), 8 lane ids in the registry, unknown lanes fail-closed; cognition-shape thresholds preserved bit-identical. PRs #115 + #116.
6. **PR #117 — `_CORRECTION_CUE_PREFIX_RE` guard.** Investigation revealed `inference_closure` had regressed from 100% to 40% between 2026-05-17 and 2026-05-22; root cause was the declarative-relation regex swallowing "Actually X precedes Y." into VERIFICATION instead of CORRECTION. Premise-emit path is gated on CORRECTION, so non-`is` relations stopped producing `PackMutationProposal` records.
7. **ADR-0110 — `mathematics_logic` expert-demo promotion.** Surfaced and bridged a third transition gap (sealed-holdout dev-mode fallback files missing; `fabrication_control` holdout cases absent; top-level `by_class` not folded into metrics). Signed `expert_demo_claims` entry added to `docs/reviewers.yaml` with digest `94d74781e103854230c1a71590e4df2287f5d2e87832f1c29b8ec4618853c04b`. **First domain at `expert_demo=true`.** PR #118.
8. **ADR-0080 — Contemplation Loop Phase 1.** Delegated to Codex during ADR-0107/0109 investigation; merged in parallel as PR #119. Read-only frontier-compare miner, `SPECULATIVE`-only findings.
9. **Documentation audit (#1 + #2).** PR #120 fixed the README broken `evals/CLAIMS.md` link and added an Evidence-Governed Domain Layer section. PR #121 backfilled `docs/PROGRESS.md` + `docs/capability_roadmap.md` with Phase 6 plus retroactive coverage of ADR-0027..0089.
---
## The contract demonstration narrative
ADR-0106's value is precisely that it can refuse. Two refusals happened in this session:
- **First refusal (ADR-0107).** The contract as written required cognition-pack-shape metrics uniformly across every attached lane. Math lanes produce `accuracy` / `all_pass_rate` / `by_class`, not `surface_groundedness`. The contract refused promotion by absence-of-key. This was the right answer; the wrong contract would have either silently failed-true or been mis-stretched to fit.
- **Amendment (ADR-0109).** Lane-shape registry dispatches thresholds by shape. Unknown lanes fail-closed (introducing a new shape requires an ADR amendment, not a silent broadening). The amendment was small and self-contained because ADR-0106's other invariants (§1.1/§1.3/§1.4/§1.5) didn't need to move.
- **First successful promotion (ADR-0110).** Math passes the now-amended contract honestly. Public + holdout meet thresholds across all three attached lanes; signed claim digest reproduces byte-for-byte; production ledger shows `mathematics_logic` at `status=expert-demo`.
The arc is intentionally visible. "ADR-0106 → refused → amended → succeeded" is the legibility upgrade.
---
## Infrastructure bridges landed under ADR-0110 (not contract changes)
ADR-0107 named two blockers; ADR-0110 surfaced a third — the sealed-holdout transition gap. Three small bridges:
1. `cases_plaintext.jsonl` dev-mode fallback copied into `evals/elementary_mathematics_ood/holdouts/v1/` and `evals/inference_closure/holdouts/v1/` (matches ADR-0105 dev-mode convention exactly).
2. Authored 9 `fabrication_control` holdout cases across all three refusal classes (`phantom_endpoint`, `cross_pack_non_bridge`, `sibling_collapse`) — the lane's holdout file had previously been empty.
3. `core/capability/reporting.py:_fetch_lane_split` folds top-level `by_class` into the metrics dict so `refusal_shape` sees a canonical layout regardless of lane-internal result-file shape.
These are not contract changes. ADR-0106 + ADR-0109 contract bodies are untouched.
---
## Tests / invariants pinned
- `tests/test_adr_0110_math_expert_demo.py` (4 cases): math at expert-demo, signed claim present, replay digest byte-equal, other domains unaffected.
- `tests/test_lane_shape_thresholds.py` (13 cases): lane-shape explicit, shape thresholds named, unknown lane fails closed, cognition shape unchanged under amendment, plus dead-shape and threshold-value gates.
- `tests/test_expert_demo_contract.py::TestProductionLedgerPromotionsAreSignedOnly`: rewritten from "no domain promoted" to "every promoted domain has a signed claim." Load-bearing invariant preserved.
- `tests/test_correction_cue_prefix_routing.py` (10 cases): pin the intent-classifier regression fix from PR #117 in both directions.
- `tests/test_adr_0107_deferral.py` retired (deferral resolved by ADR-0110).
- `tests/test_contemplation_loop.py` (41 cases, Codex): pin Phase 1 read-only emission invariants.
---
## Ledger state at session close
| Domain | Status |
|---|---|
| `mathematics_logic` | **`expert-demo`** ✓ (ADR-0110) |
| `physics` | `reasoning-capable` |
| `systems_software` | `reasoning-capable` |
| `hebrew_greek_textual_reasoning` | `reasoning-capable` |
| `philosophy_theology` | `reasoning-capable` |
---
## What this session does NOT do
- Promote any domain other than `mathematics_logic`. The other three ratified domains are eligible under the now-amended contract but each needs its own signed claim + promotion ADR.
- Implement ADR-0084 (definitional layer) or ADR-0087 (rhetorical style axis). Both remain Proposed per ADR-0108 sequencing.
- Migrate from labeled `evidence_revision` (`adr-0110:reviewed:2026-05-22`) to raw git-sha form. The labeled form is acceptable under ADR-0106; tightening to git-sha-only would be a future ADR amendment.
- Replace the plaintext holdout dev-mode fallback with sealed encryption. The dev-mode fallback is acceptable per ADR-0105's own §"Dev-mode fallback preserved" clause.
---
## References
- `docs/decisions/ADR-0103-fluency-lane-attachment-for-adr-0102.md`
- `docs/decisions/ADR-0104-curriculum-sourced-teaching-proposals.md`
- `docs/decisions/ADR-0105-sealed-holdout-encryption.md`
- `docs/decisions/ADR-0106-expert-demo-promotion-contract.md`
- `docs/decisions/ADR-0107-mathematics-logic-expert-demo-deferred.md`
- `docs/decisions/ADR-0108-proposed-adr-sequencing.md`
- `docs/decisions/ADR-0109-lane-shape-aware-thresholds.md`
- `docs/decisions/ADR-0110-mathematics-logic-expert-demo-promotion.md`
- `docs/decisions/ADR-0080-contemplation-loop.md`
- `docs/reviewers.yaml` (first signed `expert_demo_claims` entry)
- `core/capability/expert_demo.py`
- `core/capability/reviewers.py`
- `tests/test_adr_0110_math_expert_demo.py`