core/docs/adr/ADR-0246-induced-identity-action-and-path-integrity.md
Shay d44c39c35c docs: accept ADR-0246, 0247, 0248 and update packet
Approved via explicit human ratification.
2026-07-18 11:18:51 -07:00

282 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ADR-0246: Induced Identity Action and Path Integrity
**Status**: **Accepted**
**Date**: 2026-07-18
**Authors**: Joshua Shay + multi-model R&D (Fable 5 scaffold → Opus 4.8 adversarial audit + hardening → Sonnet 5/Fable 5 completion; per-model provenance in §9)
**Preflight**: `docs/briefs/ADR-0246-induced-identity-action-and-path-integrity-preflight.md` (locked decisions §3, non-goals §7 — all honored; execution log §0a)
**Depends on**: ADR-0244 (operator-preservation identity gate, Accepted), ADR-0245 (mechanical sympathy + semantic rigor, Accepted)
**Related**: slice-0 evidence `docs/audit/adr-0246-slice0-mismatch-diagnostic-2026-07-17.md` (merged, quarantined diagnostic); Opus audit `docs/audit/adr-0246-slice1-opus-audit-and-hardening.md`
---
## 1. Context and problem
D4 (ADR-0244) built the per-turn operator-preservation floor: does the live
cognitive versor `F` preserve the frozen identity frame `I = span(a₁…aₙ)`,
measured by per-axis subspace leakage `ℓᵢ` and signed self-alignment `sᵢ`? Two
gaps were deliberately left open (preflight §2):
1. **Lawfulness inside the span** — leakage is blind to in-span reshuffles: a
rotor permuting `e1→e2` or inverting `e1→e1` has `≈0` yet is not the
identity-preserving action.
2. **Accumulation across turns** — per-turn thresholds cannot see slow drift:
many individually-admissible small rotations compose into a large one.
This ADR closes both with the **induced action** `A(F)` on the frame, two
never-collapsed diagnostics (`d_orth`, `d_stab`), a locked lawful-stabilizer
policy `H_id={I}`, typed residual channels, a lawful-only path ledger with hard
breaks, a per-turn admit surface, and full per-turn/per-session telemetry — all
flag-gated default-off at serve.
**Claims language (binding, §10 #9 of the preflight):** everything this ADR
instruments is **lawfulness relative to the declared frozen frame**. It does
NOT establish, and must never be quoted as establishing, any semantic
inalienability of the value labels themselves — the shipped axes
(`truthfulness=e1`, `coherence=e2`, `reverence=e3`) remain placeholder
orthonormal directions with no demonstrated dynamical or semantic grounding
(see §6, §7).
## 2. Decisions (as implemented; preflight §3 locked decisions honored)
### 2.1 Induced action matrix `A(F)`
`A_kj(F) = (G⁻¹)_km ⟨a_m, F a_j F̃⟩₀` — the full in-subspace action of the
versor on the frame (`core/physics/identity_manifold.py::IdentityManifoldGeometry.induced_action`).
Raw/unnormalized: a boost's cosh-stretch shows in column norms and in `d_orth`,
never hidden. Bit-exactness against an independent re-derivation was verified
in the Opus audit (max discrepancy 0.00e+00).
### 2.2 Two diagnostics, never collapsed
- `d_orth(F) = ‖A(F)ᵀ G A(F) G‖_F` (`orthogonality_defect`) — G-isometry /
numerical-integrity check. **Not** an authorization policy.
- `d_stab(F) = min_{H∈H_id} ‖A(F) H‖_G` (`identity_action.py::stabilizer_defect`)
— the lawfulness distance from the permitted identity actions.
**Norm convention (ruling requested — §7 item 1):** `‖M‖_G ≡ ‖G^{1/2} M G^{-1/2}‖_F`,
computed via `eigh` of the SPD Gram; reduces exactly to Frobenius at `G=I`
(the only shipped pack). This is the metric-consistent choice (invariant under
G-orthogonal reparameterization of the axes); ratifying this ADR ratifies the
convention.
### 2.3 Lawful stabilizer — locked singleton
`H_id = {I}` (`IdentityStabilizer.singleton`), hardcoded in the path-advance
(no enlargement parameter exists). `I`, permutations, `O(n)`/`SO(n)`
rotations, and reweightings are excluded; enlarging `H_id` is a future explicit
reviewed pack/policy change. No soft-projection of an unlawful `A` onto `I`
exists anywhere (grep-audited; pinned by tests).
### 2.4 Path integrity — lawful-only composition (F1 semantics, ratification-relevant)
`advance_identity_path` (§3.4/§3.5) composes the session path
`A_path = A_T ⋯ A_1` from **only** the turns certified lawful, where lawful ≡
**admitted by the per-turn policy (§3.4 step 2)** AND `d_stab(A_t) ≤ ε_turn`.
Refused or ill-conditioned turns insert a **break marker** and are excluded —
never a soft-projected `I` masquerading as a pass; the raw product is exposed
only as `raw_path_product` (forensic; a test fails if it ever equals the lawful
path in a mixed sequence).
**F1 composition semantics (audit finding, hereby put to ratification):** a
lawful turn composes its *actual certified action* `A_t`, not a literal element
of `H_id`. This is required, not convenience — composing literal `I`s would
make `A_path ≡ I` and blind the ledger to exactly the slow drift it exists to
catch. "Compose lawful `H_t`" in preflight §3.4-step-4 is READ as "compose the
per-turn actions that were certified lawful."
**Hard breaks (§3.5):** a new chain (fresh `chain_id`, path not continued)
starts on any change of pack content digest / geometry version / gate+policy
version / session — each dimension is pinned by a test. **Turn ownership at a
hard break (ruling requested — §7 item 3):** the boundary turn belongs to the
NEW chain (it composes into the fresh path if lawful). Biography holonomy stays
a separate process; nothing here rewrites identity axes.
**Budgets:** `d_stab(A_t) ≤ ε_turn` per turn and `d_stab(A_path) ≤ ε_session`
per session — both ε are **UNCERTIFIED placeholders** (§5), so the session
verdict (`session_admit`) is telemetry only.
### 2.5 Typed residual channels — pinned blade map
On each axis rejection `r = F a F̃ P_I(F a F̃)` (`typed_residual_energy`),
energy splits into: `null_or_conformal` (e4 = grade-1 index **4**),
`boost_like` (e5 = grade-1 index **5**), `spatial_foreign` (grade-1 spatial
slots **1/2/3** outside the pack's axis support), `unclassified` (everything
else — fail-closed, **no correction policy ever attaches to it**). Blade
indices are pinned against `algebra.cl41.basis_vector` in tests
(`test_blade_index_constants_match_algebra`). For the default full-span pack,
`spatial_foreign` is **tautologically zero** (the rejection is orthogonal to
the whole spatial block); it fires correctly for reduced-support packs —
resolved and pinned (§7 item 2).
### 2.6 Per-turn admit surface (§3.7) — admit-or-abstain only
`evaluate_admission(geometry, F, policy)` admits iff `d_orth ≤ orth_tol` AND
`d_stab ≤ ε_turn` AND `leakage_rms ≤ γ_id` AND `max ℓᵢ ≤ τ_max` AND
`min sᵢ ≥ s_min` AND no boundary breach AND no unclassified-channel firing;
otherwise refuses naming every failed condition. **No geometric `C_id`
corrector exists** — the egress model remains D4's
`conjugate_correct(refuse=True)` abstention. A malformed versor raises
`MalformedVersorError` (fail-closed; never a silent legacy fallback when a
wave field was supplied).
### 2.7 Serve wiring — flag-gated, default-off, byte-identical off
- New `RuntimeConfig.identity_action_surface: bool = False` (separate from
`identity_wave_gate`; acts only when the wave gate is also on).
- `chat/runtime.py → IdentityCheck.check(admission_policy=…) → _wave_field_score`:
a §3.7 refusal folds into `flagged`, so the existing `would_violate` egress
abstains. `IdentityScore` gains `action_surface_active`/`d_orth`/`d_stab`/
`action_record` with legacy defaults — flag-off is byte-identical (all D4
gate surfaces green unchanged; smoke green post-wiring).
- The session path ledger is advanced per wave-path turn under the same flags,
**observe-only** (`advance_session_identity_path`): `session_admit` is
telemetry, never an egress decision, because `ε_session` is uncertified and
live activation remains unauthorized.
### 2.8 Telemetry (§4.1/§4.2/§4.3)
- `IdentityActionRecord` (schema `identity_action_v1`): turn/trajectory/pack
ids, **full-SHA-256** pack-content digest + `field_digest` (LE f64 bytes) +
`record_digest` (canonical JSON, no `default=str`), geometry/gate/policy
versions (`policy_version = AdmissionPolicy.version_id()`, full SHA-256 of
the exact threshold set), `A_raw`, `d_orth`, `d_stab`, leakage/self-align
vectors, typed channels, `admitted`, `refusal_reason` (all failed conditions
joined with `;` — a deliberate widening of the preflight's singular field so
multi-condition refusals lose nothing), `lawful_action ∈ {"I","none"}`
(never a matrix), `path_break`.
- `IdentityPathLedger` (schema `identity_path_v1`): `chain_id` (full SHA-256
of scope + chain index), lawful path, `d_stab_path`, composed/break counts,
`session_admit`, `ledger_digest`.
- The JSONL turn serializer emits `identity_d_*`/`identity_action_*`/
`identity_path_*` keys **only when the respective path ran** — the flag-off
wire format is byte-identical (pinned by tests).
## 3. Evidence — §6 eval matrix (all green) and the honest discrimination result
- **§6.1 synthetic geometric suite** (9 cases) + **§6.2 path/holonomy suite**
(5 cases): `evals/adr_0246_geometric_suite` — 14/14; every construction in
the preflight tables pinned individually (identity versor, π-inversion
`s=1`, 90° permutation `s=0`, mild drift, e14 tilt, e15 boost,
near-singular Gram → `ManifoldConditioningError`, malformed F → typed error;
lawful sequence, accumulation-to-session-refusal, interleaved breaks,
pack-change hard break, raw≠lawful forensic).
- **§6.3 discrimination report** (`evals/adr_0246_discrimination`;
live benign n=13, adversarial n=8, synthetic-near-identity control n=5;
artifact `docs/audit/artifacts/adr-0246-slice1-discrimination-report.json`):
| benign pass | false refusal | adversarial detect | control pass | d_stab AUC (95% CI) |
|---|---|---|---|---|
| **0.00** | **1.00** | 1.00 | **1.00** | **0.375** [0.15, 0.62] |
**Honest finding:** on the declared placeholder frame the admit surface
refuses benign and adversarial versors **alike** — benign cognition sits
~18× farther from the frame (mean `d_stab` 27.8) than the crafted attacks
(1.55), so `d_stab` discriminates *below chance*. The near-identity control
passing 100% proves the mechanism is sound; the failure is entirely that
benign cognition does not live near the declared frame. A refuse-everything
gate trivially "detects" attacks but is **not a discriminator**.
- **§11 grounding-feasibility study** (`evals/adr_0246_grounding_feasibility`;
artifact `docs/audit/artifacts/adr-0246-grounding-feasibility-report.json`):
fixed TRAIN (live benign, n=13) / HELD-OUT (independent paraphrase cohort,
n=12) / ADVERSARIAL (n=8) splits; bivector-block generator proxy (numpy-only;
exact for simple rotors/boosts, first-order otherwise); sample-size-calibrated
null distribution (200 trials of independent pure-noise cohort pairs at the
real n) with a shared-basis positive recovery control; precision pairs
(f64↔f32) and per-plane generator-energy analysis.
**Result: NULL, with the method itself validated.** The positive control
(two independent cohorts sharing one true rank-2 subspace) recovers at
cosine 0.9995 — the 100th percentile of the same-sample-size null (p95 =
0.60) — so the instrument can find real structure at n=12. The real cohorts
do not show it: TRAIN→HELD-OUT top-2 cosine 0.52 sits at only the **87th
percentile of pure chance** (need ≥ 95th); residual-based discrimination is
AUC **0.49** (chance; CI [0.21, 0.77]); generator energy is spread across
all 10 bivector planes in both cohorts; precision transport is immaterial
(max bivector delta 6.9e-7). Benign cognition has no small, stable,
cohort-independent generator subspace detectable at this sample size — the
D4/slice-0/§6.3 finding now holds at the GENERATOR level too. Threshold
tuning cannot produce a discriminating gate; a revised implementation
contract is not justified on this evidence. The full `honest_finding` text
in the artifact is binding for any downstream claim; a much larger,
pre-registered cohort would be needed to rule out a subtle real effect.
## 4. Operational status (machine-readable)
```yaml
identity_action_surface:
implementation: proposed # this ADR; code merged flag-off
live_activation: not_authorized # D4 ratified limitation carries over
default: off
blocker: >
§6.3 shows no benign/adversarial separation on the declared frame
(AUC 0.375, benign false-refusal 1.00); thresholds beyond gamma_id
are uncertified placeholders.
activation_requires:
- held-out-stable, safety-relevant grounding result (§11 programme)
- calibrated epsilon_turn/epsilon_session/tau_max/s_min certificates
- renewed discrimination evidence with acceptable benign refusal rate
- explicit human ratification
identity_wave_gate:
unchanged: true # ADR-0244 Accepted-with-limitation posture untouched
```
## 5. Uncertified placeholders (enumerated; never live defaults)
| Constant | Value | Status |
|---|---|---|
| `gamma_id` | 0.2126624458513829 | **CERTIFIED** (D4 Phase 3 Fibonacci certificate `0079b5f2…`); pinned equal to `identity._WAVE_LEAKAGE_BOUND` by test |
| `epsilon_turn` | 0.1 | placeholder |
| `epsilon_session` | 0.3 | placeholder |
| `tau_max` | = γ_id | placeholder |
| `s_min` | 0.0 | matches D4's fixed orientation floor (geometric invariant, not tuned) |
| `orth_tol` | 1e-6 | placeholder |
| `unclassified_tol` | 1e-6 | placeholder |
`AdmissionPolicy.placeholder_default()` carries `calibrated=False`; a serve
gate must never treat an uncalibrated policy as license to activate.
## 6. What this ADR does NOT do (preflight §7 non-goals — all honored)
No geometric `C_id`/corrector; no Ring-2 residual protocol; no semantic axis
grounding or pack redesign; no biography-holonomy merge; no atlas/VSWR work;
no analytic cast reactance; no grade-1 versor projection (proven vacuous); no
indefinite-norm leakage; no `H_id` enlargement; no soft-projection; no
default-on serve gate; no Smith-chart algebra; no status flip of ADR-0244/0245.
## 7. Resolved and open questions
1. **`‖·‖_G` convention** — implemented as `‖G^{1/2}MG^{-1/2}‖_F`; **ratify
with this ADR** (§2.2).
2. **`spatial_foreign` channel** — RESOLVED: tautologically zero for the
default full-span pack; fires correctly for reduced-support packs (pinned:
`test_spatial_foreign_channel_fires_for_reduced_support_pack`).
3. **Hard-break turn ownership** — implemented as new-chain; **ratify with
this ADR** (§2.4).
4. **Malformed-F/gate routing** — the D4 wave-path validator raises before the
admission surface runs; `MalformedVersorError` from the pure primitives
propagates fail-closed. No silent legacy fallback exists when a wave field
was supplied. Unifying the two typed errors is left to a future cleanup.
5. **OPEN (future ADR):** semantic axis grounding — blocked on a positive §11
result at adequate sample size; `ε` calibration; `H_id` policy products.
## 8. Consequences
- The identity organ now measures *everything* the preflight demanded —
in-span lawfulness, isometry integrity, typed foreign leakage, and
path accumulation — with serve byte-identity preserved and zero live policy
change. What it measures says, honestly: the declared frame is not the
structure live cognition preserves, so the gate stays off and the next
investment belongs to grounding, not thresholds.
- All future identity work inherits content-addressed, full-digest telemetry
(records + ledger) and a single pure source of truth for the §3 primitives.
## 9. Provenance
Fable 5: slice-0 diagnostic; §3 primitives + §3.4/3.5 ledger + §6.1/6.2 suites
(RED-first); this completion pass. Opus 4.8: adversarial audit (bit-exact math
re-derivation; H_id/soft-projection/scope-creep verification), F1 finding,
§3.7 surface + serve wiring, §6.3 discrimination report. Sonnet 5: §4.1/§4.2
telemetry records, `admitted` gate on the ledger (F1-adjacent §3.4-step-2
compliance), path serve integration (observe-only), §11 feasibility study
design. Every stage: local-first CI (smoke + targeted suites) before commit;
no self-Accept at any point.