core/docs/adr/ADR-0233-bound-practice-episode-sealing.md
Shay 484e8ff9fe docs+kernel: support bound practice episode sealing
Extends SealedPracticeTrace for externally bound candidate episodes per
ADR-0233. Adds candidate_attempt_binding_ids to trace identity, bound trace
input/seal entry points, and end-to-end bound episode tests without mutating
GeometricSearchRun.candidate_attempts.
2026-06-23 00:04:26 -07:00

123 lines
No EOL
2.8 KiB
Markdown

# ADR-0233: Bound Practice Episode Sealing
**Status:** Proposed
**Date:** 2026-06-23
**Scope:** Kernel diagnostics, immutable bound practice evidence, residual-gated practice loop
**Depends on:**
- ADR-0230 SealedPracticeTrace boundary
- ADR-0231 First Candidate Operator boundary
- ADR-0232 CandidateAttempt Run-Binding boundary
- PR #878 inert run-attempt binding shell
- PR #879 bound replay adapter input
## 1. Summary
This ADR authorizes bound practice episode sealing: the bridge from
`CandidateAttemptRunBinding` and bound replay evidence into
`SealedPracticeTrace`.
The bound spine is:
```text
GeometricSearchRun
-> CandidateOperatorResult
-> CandidateAttemptRunBinding
-> ReplayAdapterInput
-> ReplayAdapterResult | ReplayAdapterRefusal
-> SealedPracticeTrace
```
`CandidateAttemptRunBinding` is **membership evidence only**. It is not truth,
not proof, not replay success, and not serving authority.
Sealed traces must preserve binding evidence explicitly through:
```text
candidate_attempt_binding_ids
```
The bound path must **not** mutate `GeometricSearchRun.candidate_attempts`.
The bound path must **not** call candidate operators, search, replay input
builders, replay classifiers, or binding producers. It consumes only
already-built upstream records:
```text
GeometricSearchRun
CandidateAttemptRunBinding
CandidateOperatorResult
ReplayAdapterResult | ReplayAdapterRefusal
```
The bound path emits only:
```text
PracticeTraceInput | PracticeTraceRefusal
SealedPracticeTrace | PracticeTraceRefusal
```
This boundary is diagnostic and inert. It does not answer, rank, select, serve,
promote, repair, teach, mutate packs, mutate policy, mutate identity, or write
artifacts.
## 2. Decision
Extend `PracticeTraceInput` and `SealedPracticeTrace` with
`candidate_attempt_binding_ids`.
Add:
```text
build_bound_practice_trace_input(...)
seal_bound_practice_trace(...)
```
Legacy `build_practice_trace_input(...)` and `seal_practice_trace(...)` remain
unchanged in authority and continue to use `candidate_attempt_binding_ids=()`
for run-embedded attempts.
Canonical trace digests include binding IDs in:
```text
input_digest
trace_id
upstream_identity_chain
```
Identity chain order:
```text
problem_frame_digest
original_contract_assessment_id
residual_ids
search_gate_decision_id
compute_budget_id
geometric_search_run_id
candidate_attempt_ids
candidate_attempt_binding_ids
replay_result_ids
replay_refusal_ids
```
## 3. Authorized next PR
This ADR authorizes exactly one implementation PR:
```text
docs+kernel: support bound practice episode sealing
```
That PR may add only:
- binding-aware trace input construction
- binding-aware trace sealing
- tests for the bound episode path
- this ADR
It explicitly excludes candidate operators, Workbench, serving, ranking,
promotion, teaching mutation, pack/policy/identity mutation, runtime
integration, and artifact writing.