core/docs/assessment/20-component-cards/surface-selection.md
Claude 3650331b5b
docs(assessment): re-stamp the eight cards this arc touched, and post the board
§9.8 of the plan — "every card carries a verified_at no older than the last arc
that touched its layer" — is a maintenance contract this directory holds itself
to, and today's arc moved MV, M3, M4, M2, M6 and three component cards. A card
whose stamp falls behind a load-bearing arc is testimony, not evidence, which is
the failure mode the directory exists to replace.

Each card gains a Re-verified stamp at 39331dbc plus an arc note saying what
actually changed under it, not merely that something did:

  MV   PR-4 + PR-6 landed; G-7/G-9 closed. The layer's finding is sharper than
       the card stated: the recurring defect is not ABSENT pins but PINS THAT
       EXIST AND DO NOT RUN — four found this arc, each indistinguishable from
       coverage in any document.
  M3   §5 run to NO-GO, settling the successor-path question. New measurement
       G-21: the reader decides 5 of 500 holdout_dev/v1 cases. H-8e corrected.
  M4   H-13 fixed — the served-marker honesty contract held where it leaked.
  M2   PR-7's table: two boundaries already met, THREE CLOSED as category
       differences, one real delta (no audit record per rejection).
  M6   PR-9 — the accrual backstop counts and names what it absorbs.
  realize-phase / always-on-process / surface-selection — the component-level
       versions of the same three.

Plan §Status replaced with the actual board: what landed, what each remaining
item is blocked on, and the six findings this arc added that the assessment did
not have (N-8, N-9, G-21, H-13, H-14, H-8e). README carries the same summary at
the directory's entry point.

The status block says plainly what has NOT moved: comprehension breadth and
proof-of-life. The reader is still 19 constructions wide and decides 1.0% of the
held-out corpus; the 5000-beat soak is still prose with no pinned digest.
Everything landed this arc is enforcement and evidence machinery. Capability
moves in PR-11/PR-12/PR-14/Track B, all four ruling-gated.

Docs only.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Wcw2pnMBwyvmNyQg4uPEt4
2026-07-28 04:36:13 +00:00

5.2 KiB
Raw Blame History

surface-selection — the arms and the resolver

Kind: component (mechanism spanning chat/runtime.py + core/cognition/surface_resolution.py) · Parent: M4 · Assessor: Fable 5 (Phase 3) Re-verified: 39331dbc (2026-07-28) — see the arc note below. Verified at: 8927c563 (2026-07-27) Liveness: live-serving · Fitness: strained — refined from Phase 2 · Topology role: runtime boundary

Arc note — 2026-07-28 (39331dbc). H-13: the speculative-marker cache over-evicted. A COHERENT proposal released index tokens it never claimed, stripping the marker from an unrelated proposal still awaiting review — unreviewed material served without its disclosure prefix. Now claimant-tracked; a token dies only when the subject that claimed it is reviewed.

The mechanism that decides which of several candidate surfaces the user actually reads. Every truth property CORE claims converges here.

Correction/refinement to the Phase 2 M4 card

Phase 2 recorded "no single place states the precedence order as an executable rule." Partially wrong. core/cognition/surface_resolution.py (494 lines) is a declared-precedence resolver — resolve_surface plus _base_runtime_surface ("select the runtime-owned base surface by declared precedence": served response_surface always wins; then pre_decoration_surface; then canonical_surface), _truth_path_base (canonical-first, the register-invariant identity folded into trace_hash — deliberately the reverse preference of the served base, each serving its own invariant), _abstention_resolution, _grounded_open_hedge_resolution (with an explicit admissibility predicate), and _substrate_supreme. The historical note in its docstring says why it exists: "historically these mutated one string in evaluation order."

What remains true: the resolver governs the pipeline seam (base/truth-path/abstention/hedge/fold axes). The composer arms upstream in ChatRuntime.respond are still ordered branches, verified at their call sites:

Arm Site Gate
deduction_grounded_surface chat/runtime.py:1834 deduction_serving_enabled (ON, ratified)
curriculum_grounded_surface :1850 curriculum_serving_enabled (OFF)
pack_grounded_comparison :1871 pack-grounding conditions
narrative_grounded_surface :1898
example_grounded_surface :1915
pack relation-confirmation :1936
determination override (Step B-2) _surface_determination:1303 accrue_realized_knowledge (OFF)
disclosed estimate (Step E) _surface_estimate:13121340 estimation_enabled (OFF) + earned SERVE license
unknown-domain gate stub :188 _UNKNOWN_DOMAIN_SURFACE gate fires
grounded-open hedge (ADR-0254) via resolver admissibility
register decoration (ADR-0071/0077) post-selection never moves trace_hash
logos-morph override pipeline :526 answer-authority seam

So the true architecture is two strata: ordered composer branches choose the candidate; the declared-precedence resolver reconciles runtime vs pipeline vs abstention vs hedge. The Phase 2 Third-Door candidate refines to: extend the resolver's declared-precedence pattern upstream to the composer stratum, rather than "create a resolver" — half the work is already done and proves the pattern fits this codebase.

Contract & evidence

  • Served-bytes-wins and its rationale are documented with the falsifiable contract that catches regression: preferring canonical would strip the register axis while trace_hash stays green — "the register-tour claims are the falsifiable contract that catches it" (surface_resolution.py:113116). This is the sabotage test applied prospectively, in-code — worth naming as a model.
  • Estimate arm: govern_response returns STRICT for an unlicensed class → surface unchanged; shape_surface guarantees the [approximate] prefix because a converse guess is UNVERIFIED_POSSIBLE, never in APPROXIMATE's admissible set — "a wrong estimate is always a DISCLOSED wrong" (:13121340).
  • Selection-not-rewrite: determination and gate arms replace(response, surface=…), retaining articulation/walk surfaces as evidence.

Judgment

Fitness: strained — but more tractably than Phase 2 suggested. The resolver stratum is well-designed and self-documenting; the composer stratum is where arms accrete. With only deduction ON today, the live branch complexity is modest; the strain is prospective (each new capability adds an arm ahead of any declared order).

Honest wrinkles: the composer arms and the resolver are in different packages with different owners (chat/ vs core/cognition/), so nothing structurally prevents a new arm from bypassing the resolver's disciplines. The M4 empty-string refusal wrinkle (typed refusal discarded at the public str boundary) sits in this same mechanism and remains the sharpest single dishonesty on the serving path — not because anything lies, but because the truth that exists goes unserved.

Open questions: declarative composer-arm precedence (→ Phase 4 Third-Door, refined); materialise refusal_reason (→ ruling, plumbing already landed).