---
mode: CREATE
adr_id: ADR-0.0.71
branch: main
timestamp: "2026-06-13T10:54:14Z"
agent: claude-code
obpi_id:
session_id:
continues_from: .gzkit/handoffs/20260613T084823Z-OBPI-0.0.71-02-completed.md
---

<!-- Handoff document for ADR-0.0.71 — created by claude-code at 2026-06-13T10:54:14Z -->

## ⚠️ This handoff ADVISES next moves — it is NOT authorization to execute them

**Read this before anything else.** A handoff records a *proposed* plan and its
context. It is **NOT** a clearance to unilaterally execute that plan. On resume —
at **every** freshness level, Fresh included — you MUST:

1. Present the advised next steps and current state to the operator.
2. **Obtain explicit operator authorization before executing any of them** — no
   file mutation, no `gz` ceremony, no migration until the operator says go.
3. Treat the human-as-final-witness doctrine as binding from the first step: you
   advise; the operator rules; you note variance and stop.

Barreling into execution from this document is the exact failure this handoff
exists to prevent. The plan is the destination; operator authorization is the
ignition.

## Current State Summary

**ADR-0.0.71-completion-repudiation closeout is COMPLETE and attested.** The
`gz-adr-closeout-ceremony` ran end to end: scope review → docs alignment →
value walkthrough + live demo (13 tests pass) → independent spec/quality review →
all heavy-lane gates green (ARB receipts captured) → human attestation
("attest completed" — Jeffry Babb) → closeout pipeline (ADR status → Completed,
status index regenerated, 97 ADRs) → GitHub-issue review → two-sync (pushed).

Two fresh-context review concerns were surfaced and routed (operator-directed):

- **Concern 1 (MAJOR):** `gz validate --req-kind-discipline` reports clean while a
  `[structural-fence]` REQ's proof channel is unanchored — the resolver checks
  only `## Boundary Invariants` heading PRESENCE, never a per-REQ anchor. This is
  the explicitly-deferred Phase 2 of GHI #538 (closed 2026-06-11 by ADR-0.0.69,
  reopened this session with sized evidence).
- **Concern 2 (MINOR):** REQ-0.0.71-01-05's test asserts raw ledger-graph
  membership, not the actual `gz state` filter; appended as evidence to GHI #571.

The ADR-0.0.71 instance of Concern 1 was corrected this session (commit
`330daa2b`): Boundary Invariant 6 added to anchor REQ-0.0.71-01-07, brief
citation re-pointed; validators and `mkdocs --strict` clean. Working tree is
clean and `main` is synced (last commit `b6ab0acf`).

## Important Context

- **#538 is a routing artifact, NOT an implementation tracker.** Per
  `ghi-author` § Doctrine, it routes the observation; it does not track the build
  to completion. Its honest current state is open-with-blocker (a comment posted
  this session records that), pending an operator destination decision. Do not
  reframe it as "the Phase-2 tracker."
- **There is no open parent ADR for the fence-anchor-enforcement surface.**
  ADR-0.0.59 (req-scope-discipline) and ADR-0.0.69 (channels-first-closeout-proof)
  are both Completed/Validated. A standalone OBPI cannot home this work — an OBPI
  requires a parent ADR.
- **Destination choice is operator-ruled and constrained.** A new pool ADR is the
  doctrine default but bumps **Architectural Boundary 2** ("Do not add more pool
  ADRs to the runtime track"); a campaign-scheduled foundation ADR is the
  alternative but pulling new foundation work is operator-ratified under the
  build-to-1.0 campaign sequencing. Agent does NOT mint a destination or tee up
  the decision unprompted (this was a course-correction this session — see
  Decisions Made and the logged insight).
- **Phase-2 sizing is settled:** 16 unanchored `[structural-fence]` REQs remain
  across 6 ADRs (ADR-0.0.41, 0.0.63, 0.0.64, 0.0.66, 0.0.70, 0.29.0); 6 are now
  anchored (ADR-0.0.68, 0.0.69 x2, 0.0.70-01, 0.0.71-01, 0.0.71-02). Land-order
  for any future fix: anchor sweep FIRST, validator tighten SECOND, same unit, or
  it fail-closes completed REQs.
- The fence-anchor convention in use: an invariant naming the REQ id or its
  OBPI-level prefix, e.g. ADR-0.0.71 Invariant 1 reads
  "(REQ-0.0.71-02 STRUCTURAL-FENCE — verified at ADR closeout via this invariant)".

## Decisions Made

- **Decision:** Reopen GHI #538 with Phase-2 evidence rather than file a fresh GHI.
  **Rationale:** `ghi-author` Step 0 — a ≤30-day close on the same root cause is
  reopened, never duplicated. Operator-selected.
  **Alternatives rejected:** fresh GHI (Related: #538); append to #547 (chosen as
  cross-link instead).
- **Decision:** Route Concern 2 to existing open #571 as evidence, not a new issue.
  **Rationale:** indirect-proxy test is squarely #571's class.
  **Alternatives rejected:** standalone defect GHI; leave untracked.
- **Decision:** Correct the ADR-0.0.71 instance by ADDING Boundary Invariant 6,
  not by re-seating REQ-01-07 to another kind.
  **Rationale:** the claim genuinely IS a structural fence (negative-existence
  boundary); the defect was a mis-pointed citation, not a wrong kind. Anchoring it
  also pre-clears ADR-0.0.71 from the Phase-2 fail-close set.
  **Alternatives rejected:** re-seat REQ-01-07 as BEHAVIOR/SUPPORT.
- **Decision (course-correction):** Stop at routed-and-blocker-stated for #538; do
  NOT offer to author a destination ADR or scope an OBPI.
  **Rationale:** operator caught a reflex to route every finding toward "something
  gets built", overriding ghi-author doctrine, open-with-blocker-is-terminal, and
  operator-ruled scheduling. Logged per Behavior Rule 11.
  **Alternatives rejected:** offering pool-vs-foundation destination choice
  (the rejected reflex).

## Immediate Next Steps

<!-- ADVISORY ONLY — present to operator; do not execute without authorization. -->

1. **Operator decision required:** select the destination for the #538 Phase-2
   capability — a new pool ADR (mind Architectural Boundary 2) vs. a
   build-to-1.0 campaign-scheduled foundation ADR. The agent should NOT mint
   either or pre-scope OBPIs until the operator rules.
2. Once a destination exists, close #538 (and cross-linked #547, likely #516)
   with `superseded` disposition citing the destination ID — per
   `ghi-close` dead-letter doctrine, only against a registered destination.
3. If/when the operator schedules the Phase-2 fix: anchor the 16 unanchored
   structural-fence REQs first, then tighten `resolve_fence_proof`
   (`src/gzkit/req_kind.py:88-104`) and `_check_structural_fence_req`
   (`src/gzkit/commands/validate_req_kind.py:97-119`) to require the per-REQ
   anchor — in that land-order, same unit.

## Pending Work / Open Loops

- **GHI #538** — open-with-blocker; awaiting operator destination decision. Not
  an agent action until the operator rules.
- **GHI #571** — open; carries Concern 2 evidence (REQ-0.0.71-01-05 indirect-proxy
  test) plus a recurrence-defense candidate. Part of the broader unit-test
  doctrine audit, not blocked on this session.
- **GHI #547** — open; cross-linked as the doctrine cut of the same fence-channel
  cluster.
- ADR-0.0.71 itself has no remaining work — it is Completed and attested. No open
  loop on the parent ADR.

## Verification Checklist

- [ ] `git branch --show-current` returns `main`
- [ ] `git status --short` is clean (session ended synced at `b6ab0acf`)
- [ ] `uv run gz adr status ADR-0.0.71` shows Lifecycle Completed
- [ ] `uv run gz validate --req-kind-discipline` exits 0 (passes — note this is
      the known presence-only blind spot, not proof of per-REQ anchoring)
- [ ] `python3 /tmp/fence_scan.py` (if regenerated) shows 6 anchored / 16
      fail-close — confirms ADR-0.0.71-01-07 anchored
- [ ] `gh issue view 538` shows state OPEN with the sizing + blocker comments

## Evidence / Artifacts

- `docs/design/adr/foundation/ADR-0.0.71-completion-repudiation/ADR-0.0.71-completion-repudiation.md` — ADR with new Boundary Invariant 6 (lines ~94-98)
- `docs/design/adr/foundation/ADR-0.0.71-completion-repudiation/obpis/OBPI-0.0.71-01-completion-repudiation-event.md` — brief with re-pointed REQ-01-07 citation (line 211)
- `tests/test_completion_repudiation.py` — 13-test suite (closeout live demo)
- `src/gzkit/req_kind.py` — `resolve_fence_proof` (lines 88-104), the presence-only resolver at the heart of #538 Phase 2
- `src/gzkit/commands/validate_req_kind.py` — `_check_structural_fence_req` (lines 97-119)
- `.gzkit/insights/agent-insights.jsonl` — course-correction improvement record appended this session
- `.gzkit/ceremonies/ADR-0.0.71-completion-repudiation.ceremony.json` — persisted ceremony state (attestation Completed)

## Environment State

- Branch `main`, synced (ahead=0 behind=0); HEAD `b6ab0acf`.
- Python 3.13 via uv; all pre-commit + pre-push gates (`gz check`) green on the last two commits.
