---
mode: CREATE
adr_id: ADR-0.0.67
branch: main
timestamp: "2026-06-08T00:35:55Z"
agent: claude-code
obpi_id: OBPI-0.0.67-01
session_id:
continues_from: .gzkit/handoffs/20260607T222626Z-adr0067-obpi02-complete.md
---

<!-- Handoff document for ADR-0.0.67 — created by claude-code at 2026-06-08T00:35:55Z -->

## ⚠️ 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

OBPI-0.0.67-03-delete-deprecated-lock-aliases is **attested_completed and
synced** (commit `da071037`, pushed to origin/main). The full
`gz-obpi-pipeline` ran end-to-end through Stage 5: plan-audit PASS, implement
(3 implementer dispatches + 6 reviewer dispatches), verify, operator
attestation ("attest completed", Jeffry Babb), and the two-sync accounting.

ADR-0.0.67 is now at **2/3 OBPIs done** (02 and 03 attested_completed; 01
still `pending`/`draft`). ADR closeout is correctly BLOCKED on OBPI-01.

The remaining work is **OBPI-0.0.67-01-recursive-verb-path-enumeration**, the
foundation-port keystone. Per ADR § Decision (1) it is **already implemented in
the working tree** (the `_known_cli_verb_paths()` recursion + regression test
landed ahead of the brief); the brief's job is to *ratify* that implementation,
not author it fresh. Per the ADR sequencing note, OBPI-01 lands **last** because
its recursion is what makes the deleted multi-word aliases visible to the orphan
audit — which is why 02 and 03 were audit-neutral until now.

## Important Context

- **Sequencing is load-bearing.** OBPI-03 (this session) deleted the 3 `obpi
  lock-*` hyphen aliases. While the skill-alignment audit was top-level-only,
  those aliases were invisible to it. OBPI-01's recursion (`_known_cli_verb_paths`)
  is what closes that visibility gap — so it MUST land after the deletions, not
  before, or the audit would have flagged the aliases mid-flight.
- **Coupled-surface lesson from this session:** deleting a CLI verb touches more
  than the parser. OBPI-03 also had to remove the verb's manpage, its
  `doc-coverage.json` entries, its behave scenario, AND its `_NO_SKILL_VERBS`
  stale waiver in `src/gzkit/governance/trust_audits/cli.py`. The stale waiver
  was missed initially and broke 3 skill-alignment tests at full-suite scope —
  caught only by auditing ARB receipt exit codes (the first sweeps were piped
  through `| tail`, which masked the non-zero unittest exit behind tail's exit 0).
  **When verifying a full suite, never trust a `| tail`-piped exit code — read
  the ARB receipt's `exit_status` or capture stdout/stderr to a file.**
- **OBPI-01 verification surfaces** (already green this session, should stay green):
  `tests/governance/test_promoted_advisory_audits.py::PromotedAdvisoryAudits.test_skill_alignment_invariant_1`
  and `test_skill_alignment_enumerates_multiword_subcommands`, plus
  `tests/commands/test_skill_alignment_10verbs.py`.
- **REQ-kind discipline:** SUPPORT-kind REQs (doc/ledger-proved) must NOT get
  cosmetic `@covers` decorators; behave gaps for them use
  `data/behave_coverage_waivers.json` waivers with operator authorization.

## Decisions Made

- **Decision:** Deleted `docs/user/manpages/obpi-lock-status.md` rather than
  keeping it (the plan-audit initially over-corrected to "keep all 3 manpages").
  **Rationale:** It was a redundant orphan — its content duplicated the canonical
  `obpi-lock-list.md` (which covers `gz obpi lock list`) under the dead-alias
  filename. `obpi-lock-claim.md` and `obpi-lock-release.md` ARE canonical and
  were kept. **Alternatives rejected:** Renaming status.md → list.md (rejected —
  list.md already exists); keeping status.md (rejected — orphan fails cli audit).
- **Decision:** Removed the 3 `_NO_SKILL_VERBS` waivers in `trust_audits/cli.py`
  and added that file to the brief allowlist. **Rationale:** Coupled-surface
  coherence — a waiver naming an unregistered verb fails the stale-waiver check
  (ADR § Decision (1) named this). **Alternatives rejected:** Leaving the waivers
  (rejected — breaks 3 tests).
- **Decision:** Registered an operator-authorized behave-coverage waiver for
  REQ-03-01/02/03. **Rationale:** REQ-01's positive half is behave-covered by
  existing scenarios and its negative half is unit-tested; REQ-02/03 are SUPPORT
  with no behave channel. **Alternatives rejected:** Authoring a behave scenario
  for the deleted verb (rejected — re-introduces a dead `gz obpi lock-claim`
  command-shape the operator-doc-verb-resolution validator rejects).

## Immediate Next Steps

<!-- ADVISORY ONLY — present to operator and await authorization before acting. -->

1. Run `/gz-obpi-pipeline OBPI-0.0.67-01-recursive-verb-path-enumeration` to
   execute the keystone. Because the implementation already exists in the working
   tree (per ADR § Decision (1)), the brief ratifies it — expect the plan-audit
   and Stage 2 to confirm the existing `_known_cli_verb_paths()` + regression
   test rather than author new code.
2. During Stage 1, verify the brief reconciles clean (`gz brief reconcile
   OBPI-0.0.67-01-recursive-verb-path-enumeration`); fix any discovery/req_count
   drift before the runtime will accept pipeline entry (this session hit both).
3. After OBPI-01 completes, run the ADR-0.0.67 closeout ceremony
   (`/gz-adr-closeout-ceremony ADR-0.0.67-tool-skill-invariant1-enforcement`) —
   the full `features/` behave sweep runs at closeout to catch cross-OBPI
   interactions deferred from per-OBPI Stage 3.
4. Confirm `uv run gz validate --skill-alignment` stays clean across the full
   surface once recursion is the enforcement path.

## Pending Work / Open Loops

- **OBPI-0.0.67-01-recursive-verb-path-enumeration** — not started; the only
  remaining OBPI under ADR-0.0.67. Brief status `draft`, runtime state `pending`.
- **ADR-0.0.67 closeout** — BLOCKED until OBPI-01 lands; currently
  `pre_closeout` / 2-of-3 done. The status table also flags "01 ledger proof of
  completion is missing" (expected — OBPI-01 not yet completed).
- **GHI #588** — the anchor issue for ADR-0.0.67; close at ADR closeout, not
  per-OBPI.

## Verification Checklist

- [ ] `git branch --show-current` returns `main`
- [ ] `git log -1 --format=%h` shows `da071037` (or later) — OBPI-03 completion synced
- [ ] `uv run gz adr status ADR-0.0.67-tool-skill-invariant1-enforcement` shows 03 attested_completed
- [ ] `uv run gz validate --skill-alignment` clean
- [ ] `uv run gz cli audit` reports 104/104 fully covered
- [ ] `uv run -m unittest -q` passes (5961 tests, 1 skip, 0 fail as of this handoff)

## Evidence / Artifacts

- `docs/design/adr/foundation/ADR-0.0.67-tool-skill-invariant1-enforcement/obpis/OBPI-0.0.67-03-delete-deprecated-lock-aliases.md` — completed brief (status Completed, attestation recorded)
- `tests/commands/test_obpi_lock_aliases_removed.py` — 3-test regression guard (alias absence, canonical presence, no stale waiver)
- `src/gzkit/cli/parser_artifacts.py` — deprecated-alias parser block removed
- `src/gzkit/governance/trust_audits/cli.py` — 3 stale `_NO_SKILL_VERBS` waivers removed
- `config/doc-coverage.json` — 3 deprecated verb entries removed
- `features/obpi_lock.feature` — deprecated-alias scenario removed
- `data/behave_coverage_waivers.json` — operator-authorized REQ-03 waiver
- `.claude/plans/OBPI-0.0.67-03-delete-deprecated-lock-aliases.md` — approved plan
- `.claude/plans/.plan-audit-receipt-OBPI-0.0.67-03-delete-deprecated-lock-aliases.json` — PASS receipt

## Environment State

- Platform: win32; Python 3.13; branch `main`, clean tree at handoff time.
- ADR-0.0.67 lane: heavy, kind: foundation.
