core/docs/adr/ADR-0095-miner-sourced-teaching-proposals.md
Shay 54e6bfc0d0
docs: reorganize docs landscape
Implements the 4-phase documentation reorganization master plan.

- Consolidation: Merged brief/, handoff/, planning/, and decisions/ into briefs/, handoffs/, plans/, and adr/ respectively (101 ADRs relocated)
- Root Cleanup: Relocated HANDOFF-gpt55-*.md and key top-level docs (runtime_contracts.md, etc.) to canonical folders. Added superseded alerts.
- Indices & Navigation: Created docs/README.md navigation document, docs/sessions/README.md index, docs/adr/README.md index
- Note: Also includes prior commit adding ADR-0200+ corpus hygiene governance (ADR-0225, dependency map, backfilled cross-references)
2026-06-30 16:59:36 -07:00

141 lines
5.7 KiB
Markdown

# ADR-0095 — Miner-Sourced Teaching Proposals
**Status:** Accepted
**Date:** 2026-05-21
**Accepted:** 2026-05-22
**Author:** CORE agents + reviewers
**Depends on:** ADR-0094
---
## Acceptance evidence
Accepted after miner-sourced proposals were wired through the reviewed teaching pipeline with a deterministic, SHA-pinned closure lane:
- `teaching/from_miner.py` converts contemplation miner outputs into `PackMutationProposal` / `TeachingProposal` records carrying `ProposalSource(kind="miner", source_id=<miner_id>, ...)`.
- `evals/miner_loop_closure/runner.py` and `evals/miner_loop_closure/contract.md` define the closure lane; `evals/miner_loop_closure/results/v1_dev.json` is the canonical report.
- `tests/test_miner_proposals.py` exercises miner-to-proposal conversion, source-tagging, replay determinism, and review-gate parity with operator-sourced proposals.
- `scripts/verify_lane_shas.py` pins `miner_loop_closure` at SHA `9f071733abe7dcacf759f928548ce738fb639af3fd6e4c621a651b306d7e77ce`; verified locally and by the `lane-shas` workflow on `main`.
---
## Context
Phase 5 of the contemplation arc landed three miners under
`core/contemplation/miners/`:
- `articulation_quality.py` (closed the articulation loop signal)
- `contradiction_detection.py`
- `frontier_compare.py`
Each miner emits observations. None of them currently produce
`PackMutationProposal` candidates. The loop is one-way: contemplation
sees the gap, but the only way to close it is for an operator to
read the miner output and manually file a proposal. That breaks the
"learn from reviewed correction" arc CLAUDE.md names as load-bearing:
> listen → comprehend → recall → think → articulate → learn from reviewed correction → replay deterministically
This ADR closes the loop without weakening the reviewed-teaching
discipline. The doctrine constraint is sharp: there must be exactly
one correction path, and miner-sourced proposals must traverse it.
---
## Decision
Introduce `teaching/proposals/from_miner.py` that translates miner
observations into `PackMutationProposal` candidates with
`source = ProposalSource(kind="miner", source_id=<miner_id>, …)` from
ADR-0094.
### Hard constraints
1. **Single review path.** Miner-sourced proposals enter
`teaching/review.py` via the same entry point as operator proposals.
No parallel reviewer, no auto-acceptance, no shortened review path.
2. **Default status `speculative`.** Miner-sourced proposals are never
coherent at emission.
3. **Identity-pack defense.** Proposals touching identity-pack axes are
rejected at proposal-construction time (before review), not at
review time. This prevents the miner from ever filing an identity
override candidate, even one that would fail review. ADR-0027's
identity-override rejection rule extends upstream.
4. **Replay-equivalence pre-gate.** Before a miner-sourced proposal is
review-eligible, replay the originating turn under the proposed
mutation. If `trace_hash` changes on any non-target turn in the
lane, the proposal is rejected at construction.
5. **Deterministic emission.** Same miner observations + same head SHA
→ byte-identical proposal stream. Proposal IDs are SHA-256 of
`(miner_id, observation_canonical, emitted_at_revision)`.
### What miners do not gain
- Direct write access to packs.
- Ability to mark proposals coherent.
- Ability to mutate identity, safety, or ethics packs at all.
### Telemetry
Miner-sourced proposals emit a `"type": "proposal_emitted"` event to
the existing telemetry sink (ADR-0040), carrying the redacted
`source.serialize()` string and proposal ID. Content is redacted by
default per ADR-0040.
---
## Invariant
`miner_proposal_replay_equivalence` — for every miner-sourced proposal
that reaches review eligibility, replaying the originating lane with
the proposed mutation applied yields identical `trace_hash` on every
non-target turn. The lane gate refuses proposals that violate this.
`miner_proposal_single_review_path` — grep gate refuses any code path
that promotes a miner-sourced proposal to coherent outside
`teaching/review.py`.
---
## Lane
`evals/miner_loop_closure/` (new):
- positive: legitimate articulation gap → proposal emitted → reviewable
- negative: identity-override attempt via miner → rejected at construction
- negative: proposal that breaks replay-equivalence → rejected at construction
- negative: malformed miner observation → typed error, no proposal
- coincidence: random/noise observation → no proposal under threshold
- determinism: same observations across two runs → identical proposal stream
---
## Trust Boundary
Miners read turn telemetry only; they do not read user-controlled text
directly. The miner-to-proposal boundary sanitizes `source_id` via
`safe_pack_id` traversal rejection. The replay-equivalence gate is a
filesystem-only operation against the existing eval runners; no network
or shell.
---
## Consequences
- Phase 5 contemplation becomes a closed loop in code, not just in
doctrine.
- The capability ledger gains a new evidence row class: "miner-sourced
proposal accepted into coherent" — measurable, replayable.
- Learning-scale claims (the deferred 10k harness) become eventually
defensible because every replayed proposal will have a real
provenance, not a synthetic one.
---
## PR Checklist
- Capability added: closed contemplation loop through reviewed teaching.
- Invariants proved: `miner_proposal_replay_equivalence`, `miner_proposal_single_review_path`.
- Lane proving it: `evals/miner_loop_closure/`.
- Hidden normalization / stochastic fallback / approximate recall / unreviewed mutation: none. Single review path enforced by grep gate.
- Trust boundary: miner reads telemetry, never user text; identity-pack rejection at construction.