---
mode: CREATE
adr_id: ADR-0.0.67
branch: main
timestamp: "2026-06-07T20:02:47Z"
agent: claude-code
obpi_id: OBPI-0.0.67-02
session_id:
continues_from:
---

<!-- Handoff document for ADR-0.0.67 — created by claude-code at 2026-06-07T20:02:47Z -->

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

Foundation/Heavy **ADR-0.0.67-tool-skill-invariant1-enforcement** (anchors GHI
#588) is **authored, validated, and committed** at `be9d6cdc` on `main` (local
only — NOT pushed). The ADR plus its 3 OBPI briefs are on disk and registered in
the ledger graph (ADR with 3 OBPI children). Brief validation is green:
authored-readiness PASS x3, `gz validate --req-kind-discipline` clean for 0.0.67,
`gz validate --brief-headings` clean.

No implementation has been committed. The build (the actual code wiring/deletion)
is the next session's job, to be done from the briefs.

Origin trail: a denied direct `gh issue create` was re-routed through `/ghi-author`
(filed GHI #588); the prior-art lookup revealed the first-draft framing was wrong
(Invariant 1 IS enforced, but top-level-only); a no-vibes evidence pass on all
orphan verbs produced the homing plan; the operator escalated to MAXX (no waivers,
full compliance), which this ADR governs.

## Important Context

- **The defect:** `audit_skill_alignment` (`gz validate --skill-alignment`,
  Invariant 1) enumerated only top-level verbs via `_known_cli_verbs()`
  (`src/gzkit/governance/trust_audits/cli.py:125-136`) — never recursing into
  nested subparsers. 32 multi-word subcommands passed green by invisibility. Of
  those, 13 were true orphans (no skill, non-waived group).
- **MAXX mandate (operator, binding):** NO waivers. Every verb genuinely wielded
  by a skill, or (for the 3 deprecated aliases) deleted. `_NO_SKILL_VERBS` is not
  a dumping ground.
- **Headline win:** `gz obpi audit` (`src/gzkit/commands/obpi_audit_cmd.py:13`,
  240 LOC) becomes the deterministic engine of gz-obpi-reconcile Phase 1,
  replacing ad-hoc agent Read/Grep/Bash. Verified: the verb's ledger entry schema
  (`obpi_audit_cmd._build_entry`) matches the skill's documented Ledger Schema v1
  (`.gzkit/skills/gz-obpi-reconcile/SKILL.md` Ledger Schema section).
- **`obpi withdraw` is live, not dead:** wired into the ledger graph
  (`src/gzkit/ledger.py:670` applies withdrawal metadata; `src/gzkit/commands/state.py:86`
  hides withdrawn OBPIs). Wiring it gives reconcile remediation teeth for GHI
  #584's 233 phantom `obpi_created` events.
- **`arb ty` is NOT an alias of `arb typecheck`** — distinct handler
  `arb_ty_cmd` (`src/gzkit/cli/parser_arb.py:142`), a raw `uvx ty` passthrough.
- **The 3 deprecated lock aliases** (`obpi lock-claim/-release/-status`,
  `src/gzkit/cli/parser_artifacts.py:1454-1505`) dispatch to the SAME handlers as
  the canonical space forms and are author-declared deprecated ("OBPI-03 will
  remove these after skill migration"); migration is done — execute the deletion.
- **Coupled-surface caution:** `_known_cli_verbs()` (top-level) is also consumed
  by `audit_cli_alignment`. OBPI-01 adds a NEW `_known_cli_verb_paths()` and
  leaves `_known_cli_verbs()` untouched — keep it that way.

## Decisions Made

- **Decision:** Govern this as a foundation/Heavy ADR with 3 OBPIs, not a cowboy
  commit. **Rationale:** CLI-contract deletions + 6 skill surfaces + tests exceed
  direct-fix thresholds; gzkit doctrine = governance-as-power. **Alternatives
  rejected:** single direct commit (contract change, too large); pool ADR (this
  is invariant-enforcement, foundation per the invariance test).
- **Decision:** Wire the 10 live orphan verbs into skills; do NOT waive them.
  **Rationale:** waiving silences the exact defect signal the invariant raises
  (the anti-vibe failure the operator flagged). **Alternatives rejected:** extend
  `_NO_SKILL_VERBS` (rejected by operator); top-level-only enforcement (leaves
  multi-word blind); delete-all (most verbs are live).
- **Decision:** Delete the 3 deprecated lock aliases (not waive, not wire).
  **Rationale:** source self-declares them deprecated and scheduled for removal;
  migration complete. **Alternatives rejected:** waive as deprecated (entombs dead
  code); wire (would point a skill at a deprecated form).
- **Decision:** Implementation order **02 -> 03 -> 01** (recursion is the
  keystone, lands last). **Rationale:** under the no-waivers mandate, landing
  recursion first makes the audit RED on 13 orphans; wiring/deletion are
  audit-neutral while enumeration is still top-level-only, so they land green
  first, and recursion flips everything green in one step.
- **Decision:** Commit authoring; leave the in-flight `cli.py` + test as an
  uncommitted head-start. **Rationale:** operator choice; preserves verified
  recursion; no waivers committed to the repo.

## Immediate Next Steps

> ADVISORY ONLY — present to the operator and obtain authorization before acting.

1. **Build OBPI-0.0.67-02** (wire 10 verbs into 6 skills). Read
   `docs/design/adr/foundation/ADR-0.0.67-tool-skill-invariant1-enforcement/obpis/OBPI-0.0.67-02-wire-orphan-verbs-into-skills.md`.
   Headline: make gz-obpi-reconcile Phase 1 invoke `gz obpi audit` / `gz obpi audit --adr`.
   Add unit coverage for `obpi_audit_cmd` and `obpi_withdraw_cmd`. Remove the 13
   stop-gap waivers from `cli.py`. Bump `skill-version` + `last_reviewed` per
   edited skill, then `uv run gz agent sync control-surfaces`. Entry:
   `uv run gz obpi pipeline OBPI-0.0.67-02`.
2. **Build OBPI-0.0.67-03** (delete the 3 deprecated lock aliases + doc cascade:
   parser, 3 manpages, `config/doc-coverage.json`, `mkdocs.yml` nav, behave
   scenario `features/obpi_lock.feature` line ~65). Keep `gz cli audit` and
   `uv run mkdocs build --strict` green.
3. **Build OBPI-0.0.67-01** (keystone, last): land recursion + group-cascade +
   tests; confirm `uv run gz validate --skill-alignment` green across all 107
   verbs with zero `_NO_SKILL_VERBS` entries for the 13.
4. **Close out ADR-0.0.67** via the closeout ceremony (Gate 5 human attestation;
   create `ADR-CLOSEOUT-FORM.md` if absent), then close GHI #588.
5. **Decide push/sync** of `be9d6cdc` and the implementation commits via
   `uv run gz git-sync --apply --lint --test`.

## Pending Work / Open Loops

- **Not pushed:** `be9d6cdc` is local on `main`. Operator decides push/sync.
- **Head-start is uncommitted:** `src/gzkit/governance/trust_audits/cli.py` and
  `tests/governance/test_promoted_advisory_audits.py` carry the recursion
  machinery + enumeration test + the 13 stop-gap waivers. OBPI-02 removes the
  waivers; OBPI-01 ratifies the recursion. The working tree is green via those
  waivers.
- **Closeout form absent:** `gz plan create` did not scaffold `ADR-CLOSEOUT-FORM.md`;
  create it at closeout.
- **Parked — pre-existing defect (not this ADR):** `gz validate --brief-command-shape`
  flags a compound `&&` command in
  `docs/design/adr/foundation/ADR-0.0.37-constitutional-invariant-composition/obpis/OBPI-0.0.37-27-migration-disposition-doctrine-refresh-orientation-index.md`.
  Candidate one-line direct-fix.
- **Phase 2 (noted in ADR Q&A):** sweep the existing 24 single-token
  `_NO_SKILL_VERBS` waivers; some look stale (e.g. `init` is waived but gz-init
  declares `gz_command: init`).

## Verification Checklist

- [ ] Branch matches: `git branch --show-current` returns `main`
- [ ] HEAD is `be9d6cdc` (authoring commit) or a descendant
- [ ] `uv run gz obpi validate --adr ADR-0.0.67 --authored` passes 3/3
- [ ] `uv run gz validate --req-kind-discipline` clean for 0.0.67
- [ ] `uv run gz adr report` shows ADR-0.0.67 Pending HEAVY 0/3
- [ ] Working tree shows uncommitted `cli.py` + `test_promoted_advisory_audits.py` (the head-start)
- [ ] `uv run gz validate --skill-alignment` is green (via the head-start waivers, pre-build)

## Evidence / Artifacts

- `docs/design/adr/foundation/ADR-0.0.67-tool-skill-invariant1-enforcement/ADR-0.0.67-tool-skill-invariant1-enforcement.md` — the foundation ADR (intent, decision, homing table, alternatives, forcing functions)
- `docs/design/adr/foundation/ADR-0.0.67-tool-skill-invariant1-enforcement/obpis/OBPI-0.0.67-01-recursive-verb-path-enumeration.md` — keystone recursion brief
- `docs/design/adr/foundation/ADR-0.0.67-tool-skill-invariant1-enforcement/obpis/OBPI-0.0.67-02-wire-orphan-verbs-into-skills.md` — wiring brief (build first)
- `docs/design/adr/foundation/ADR-0.0.67-tool-skill-invariant1-enforcement/obpis/OBPI-0.0.67-03-delete-deprecated-lock-aliases.md` — deletion brief
- `src/gzkit/governance/trust_audits/cli.py` — head-start: recursion + `_verb_path_waived` + `audit_skill_alignment` rewrite + 13 stop-gap waivers (uncommitted)
- `tests/governance/test_promoted_advisory_audits.py` — head-start: enumeration regression test (uncommitted)
- `src/gzkit/commands/obpi_audit_cmd.py` — the deterministic audit engine OBPI-02 wires into reconcile
- `src/gzkit/commands/obpi_cmd.py` — `obpi_withdraw_cmd` (ledger-integrated)
- `src/gzkit/cli/parser_artifacts.py` — deprecated lock-alias block (lines 1454-1505) OBPI-03 deletes
- `.gzkit/skills/gz-obpi-reconcile/SKILL.md` — Phase 1 target for the `obpi audit` wiring

## Environment State

- Platform: Windows 11, PowerShell + Bash; Python 3.13 via uv.
- All `gz` invocations use `uv run`; never prefix with `PYTHONUTF8=1`.
- Skill edits: edit `.gzkit/` canonical first, bump version + `last_reviewed`, then `uv run gz agent sync control-surfaces` (never hand-edit `.claude/`, `.agents/`, `.github/`, `src/gzkit/skills/` mirrors).
