diff --git a/docs/Whitepaper.md b/docs/Whitepaper.md index afe726d8..895721e8 100644 --- a/docs/Whitepaper.md +++ b/docs/Whitepaper.md @@ -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. diff --git a/docs/Yellowpaper.md b/docs/Yellowpaper.md index 9c62f1b5..62bc3bfd 100644 --- a/docs/Yellowpaper.md +++ b/docs/Yellowpaper.md @@ -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//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//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: diff --git a/docs/eval_methodology.md b/docs/eval_methodology.md index c8c8fdaa..a71b0f7d 100644 --- a/docs/eval_methodology.md +++ b/docs/eval_methodology.md @@ -1,7 +1,7 @@ # Eval Methodology — Benchmark Discipline Contract -**Status:** Accepted (ADR-0016) -**Last updated:** 2026-05-15 +**Status:** Accepted (ADR-0016, extended by ADR-0109) +**Last updated:** 2026-05-22 (lane-shape registry section added) 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 @@ -102,3 +102,61 @@ A lane without a `contract.md` does not run. - ADR-0016: Capability Roadmap - `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 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//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) diff --git a/docs/runtime_contracts.md b/docs/runtime_contracts.md index b3e4da82..cadff382 100644 --- a/docs/runtime_contracts.md +++ b/docs/runtime_contracts.md @@ -341,3 +341,112 @@ Content-addressing rules (binding across the whole pipeline): See `formation/hashing.py`, `formation/cache.py`, and `formation/forge.py` 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 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. diff --git a/docs/sessions/SESSION-2026-05-22-contract-layer-arc.md b/docs/sessions/SESSION-2026-05-22-contract-layer-arc.md new file mode 100644 index 00000000..3335c0f8 --- /dev/null +++ b/docs/sessions/SESSION-2026-05-22-contract-layer-arc.md @@ -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`