---
id: OBPI-0.0.36-05-skill-prose-sweep-self-close
parent: ADR-0.0.36-universal-obpi-attestation
item: 5
lane: Heavy
status: Completed
---

# OBPI-0.0.36-05-skill-prose-sweep-self-close: Skill Prose Sweep — Self-Close

## ADR Item

- **Source ADR:** `docs/design/adr/foundation/ADR-0.0.36-universal-obpi-attestation/ADR-0.0.36-universal-obpi-attestation.md`
- **Checklist Item:** #5 — "Skill prose sweep across `gz-obpi-pipeline`, `gz-obpi-reconcile`, `ghi-close`, `gz-adr-closeout-ceremony` plus rules grep + sync to vendor mirrors"

**Status:** Completed

## Objective

Sweep every skill body and rule file under `.gzkit/skills/**/SKILL.md`, `.gzkit/rules/**/*.md`, and the canonical CLAUDE/AGENTS rule mirrors for any reference to the deleted lite-lane self-close path, replace with universal-attestation language consistent with ADR-0.0.36, bump skill+rule version markers per `.gzkit/rules/skill-surface-sync.md`, then run `uv run gz agent sync control-surfaces` to propagate to all vendor mirrors and verify mirror parity.

## Lane

**Heavy** — touches the agent control surface (skills + rules) on which every agent's per-turn contract depends. Drift between canon and mirrors after this sweep would re-introduce the GHI #332 doctrine smell through whichever surface an agent reads next. Mirror propagation is itself a fail-closed gate — partial sync is a Heavy-lane Gate 3 failure.

## Allowed Paths

- `.gzkit/skills/gz-obpi-pipeline/SKILL.md` — primary pipeline skill referencing OBPI completion attestation
- `.gzkit/skills/gz-obpi-reconcile/SKILL.md` — reconciliation skill referencing brief-status attestation
- `.gzkit/skills/ghi-close/SKILL.md` — already updated this ADR's authoring session to v2.3.0; sweep confirms no remaining self-close references and that the universal-attestation reference is consistent
- `.gzkit/skills/gz-adr-closeout-ceremony/SKILL.md` — closeout-ceremony skill referencing lane-conditional attestation
- `.gzkit/skills/**/SKILL.md` — any other skill under canon discovered by grep to reference the deleted self-close path
- `.gzkit/rules/*.md` — any rule file referencing lite-lane self-close (per grep)
- `.claude/skills/**/SKILL.md`, `.claude/rules/**/*.md` — Claude vendor mirrors (regenerated by sync; not edited directly per `.gzkit/rules/skill-surface-sync.md`)
- `.github/skills/**/SKILL.md`, `.github/instructions/**/*.md` — Copilot vendor mirrors (regenerated by sync)
- `.agents/skills/**/SKILL.md` — Codex vendor mirrors (regenerated by sync)
- `tests/governance/test_skill_self_close_drift.py` — new test module asserting zero remaining references to the deleted self-close path across canon and mirror surfaces

## Denied Paths

- `AGENTS.md` and all directory `**/AGENTS.md` mirrors — doctrine surface owned by OBPI-0.0.36-01
- `src/gzkit/commands/adr_audit.py` — runtime gate is OBPI-0.0.36-02
- `src/gzkit/governance/trust_audits.py`, `src/gzkit/validate_pkg/**` — validator scope is OBPI-0.0.36-03
- `data/historical_self_close_waivers.json`, `src/gzkit/models/historical_waiver.py` — waiver list is OBPI-0.0.36-04
- New runtime dependencies; CI files; lockfiles
- Direct edits to vendor-mirror files (`.claude/`, `.github/`, `.agents/`) — sync is the only legitimate authoring path per skill-surface-sync rule

## Requirements (FAIL-CLOSED)

1. REQUIREMENT: Every skill file under `.gzkit/skills/**/SKILL.md` containing a reference to "self-clos", "Self-closeable", "self-close", "feature.*lite.*self", or related lite-lane self-close prose MUST be edited to remove the reference and reflect the universal-attestation rule from ADR-0.0.36.
2. REQUIREMENT: Every rule file under `.gzkit/rules/**/*.md` containing the same references MUST be edited identically.
3. REQUIREMENT: Every edited skill MUST bump its frontmatter `skill-version:` per the skill-surface-sync version-discipline table — this sweep is a "governance rule or procedure change" warranting a minor bump.
4. REQUIREMENT: Every edited rule MUST bump its body-level `<!-- rule-version: X.Y.Z -->` HTML comment AND update the visible `> **Rule version:** \`X.Y.Z\`` block quote per `.gzkit/rules/skill-surface-sync.md` v0.2.0 rule-marker convention.
5. REQUIREMENT: After all canon edits, `uv run gz agent sync control-surfaces` MUST be run, and `git diff --stat` MUST show coordinated edits across canon (`.gzkit/`) and mirror (`.claude/`, `.github/`, `.agents/`) surfaces. A canon edit without mirror propagation is a partial-sync failure.
6. REQUIREMENT: `tests/governance/test_skill_self_close_drift.py` MUST assert that grep for the deleted patterns across `.gzkit/skills/**`, `.gzkit/rules/**`, `.claude/skills/**`, `.claude/rules/**`, `.github/skills/**`, `.github/instructions/**`, and `.agents/skills/**` returns zero matches outside an explicit allow-list (the historical-rationale section in this OBPI brief itself, ADR-0.0.36's own narrative, the GHI #332 audit doc).
7. REQUIREMENT: `ghi-close` v2.3.0's "NEVER, EVER, EVER dead-letter" doctrine MUST be cross-referenced in `gz-obpi-pipeline` and `gz-adr-closeout-ceremony` where those skills discuss closure flow — this sweep is the opportunity to land the cross-reference, since both skills' next prose pass intersects with universal-attestation.

> STOP-on-BLOCKERS: if `gz agent sync control-surfaces` fails or reports stale mirror-only paths, halt and follow `/gz-agent-sync` skill recovery before continuing.

## Discovery Checklist

**Parent ADR (read first; order pinned — GHI #321):**

- [ ] **Parent ADR § Decision item #5 — quote verbatim into Implementation Summary** (the skill prose sweep).
- [ ] Parent ADR § Intent — why doctrine collapse must propagate to skill prose to be operative.
- [ ] Parent ADR file: `docs/design/adr/foundation/ADR-0.0.36-universal-obpi-attestation/ADR-0.0.36-universal-obpi-attestation.md`

> **STOP:** If you cannot quote the parent ADR § Decision item #5 that this OBPI implements, STOP and re-read.

**Governance (read once, cache):**

- [ ] `.gzkit/rules/skill-surface-sync.md` v0.2.0 — version-bump discipline; skill frontmatter vs rule body-level marker; sync command; conflict resolution
- [ ] `.gzkit/skills/gz-agent-sync/SKILL.md` — sync recovery procedures
- [ ] OBPI-0.0.36-01..04 briefs — sweep is downstream of doctrine, runtime, validator, waiver; the wording it propagates derives from those landed surfaces, not from this OBPI's authoring imagination

**Context:**

- [ ] Initial grep across canon: `rg "self-clos|Self-closeable" .gzkit/skills/ .gzkit/rules/ .claude/skills/ .claude/rules/ .github/`
- [ ] `.gzkit/skills/ghi-close/SKILL.md` v2.3.0 (already-edited reference for the universal-attestation language tone)
- [ ] AGENTS.md (canon, edited under OBPI-01) — the source the sweep aligns with

**Prerequisites (check existence, STOP if missing):**

- [ ] All four named skills exist: `gz-obpi-pipeline`, `gz-obpi-reconcile`, `ghi-close`, `gz-adr-closeout-ceremony` under `.gzkit/skills/`
- [ ] `gz agent sync control-surfaces` is functional (run a no-op pass first to confirm)
- [ ] OBPI-0.0.36-01..04 have landed (canon sources from which the prose sweep derives wording)

**Existing Code (understand current state):**

- [ ] Read each named skill's current SKILL.md to locate the self-close-referencing prose blocks
- [ ] Read `.gzkit/rules/skill-surface-sync.md` example version-bump format to match
- [ ] Read `tests/governance/` for existing skill/rule drift-test patterns to match in the new test module

## Quality Gates

### Gate 1: ADR

- [ ] Intent and scope recorded in this OBPI brief
- [ ] Parent ADR Decision item #5 quoted in Implementation Summary

### Gate 2: TDD (Red-Green-Refactor)

- [ ] RED: `tests/governance/test_skill_self_close_drift.py::test_zero_self_close_references_in_canon_and_mirrors` fails before sweep
- [ ] GREEN: same test passes after sweep + sync
- [ ] Tests pass: `uv run gz test`

### Code Quality

- [ ] Lint clean: `uv run gz lint`
- [ ] Type check clean: `uv run gz typecheck`

### Gate 3: Docs (Heavy)

- [ ] Docs build: `uv run mkdocs build --strict`
- [ ] All version markers updated; sync output reports zero divergent mirrors

### Gate 4: BDD (Heavy)

- [ ] Behave scenario tagged `@REQ-0.0.36-05-NN` asserting `gz validate --advisory-scorecard` (or skill drift test) returns clean after sweep; behave passes

### Gate 5: Human (Universal under this very ADR)

- [ ] Human attestation recorded with TTY+ATTEST under `gz obpi complete`

## Verification

```bash
# Canon and mirror grep — must return only allow-listed historical references
rg "self-clos|Self-closeable" .gzkit/skills/ .gzkit/rules/ .claude/skills/ .claude/rules/ .github/skills/ .github/instructions/ .agents/skills/

# Skill drift test
uv run -m unittest tests.governance.test_skill_self_close_drift -v

# Sync ceremony
uv run gz agent sync control-surfaces
git diff --stat

# Standard quality gates
uv run gz lint
uv run gz typecheck
uv run gz test
uv run mkdocs build --strict
uv run -m behave features/

# ARB receipts for Heavy-lane attestation
uv run gz arb ruff
uv run gz arb typecheck
uv run gz arb step --name unittest -- uv run -m unittest -q
uv run gz arb step --name mkdocs -- uv run mkdocs build --strict
```

## Acceptance Criteria

- [ ] REQ-0.0.36-05-01: Given the canonical skill files (`.gzkit/skills/gz-obpi-pipeline/SKILL.md`, `gz-obpi-reconcile/SKILL.md`, `ghi-close/SKILL.md`, `gz-adr-closeout-ceremony/SKILL.md`) after this OBPI, when grep searches for "self-clos" or "Self-closeable", then zero matches outside an explicit historical-rationale allow-list are returned.
- [ ] REQ-0.0.36-05-02: Given every edited skill after this OBPI, when its frontmatter is parsed, then `skill-version` has been incremented per the version-discipline table in `.gzkit/rules/skill-surface-sync.md`.
- [ ] REQ-0.0.36-05-03: Given every edited rule file after this OBPI, when its body is parsed, then both the `<!-- rule-version: X.Y.Z -->` HTML comment AND the visible `> **Rule version:** \`X.Y.Z\`` block quote have been incremented identically.
- [ ] REQ-0.0.36-05-04: Given the canonical surfaces and vendor mirrors after `uv run gz agent sync control-surfaces` runs, when each canon-mirror pair is diffed, then content is byte-identical (modulo intentional vendor-specific rendering); zero divergent mirrors.
- [ ] REQ-0.0.36-05-05: Given `tests/governance/test_skill_self_close_drift.py`, when run, then it asserts zero matches for the deleted patterns across canon AND every vendor-mirror surface, with an explicit allow-list for the historical-rationale references this OBPI brief, ADR-0.0.36, and the GHI #332 audit retain.
- [ ] REQ-0.0.36-05-06: Given `gz-obpi-pipeline/SKILL.md` and `gz-adr-closeout-ceremony/SKILL.md` after this OBPI, when read, then each cross-references `ghi-close` v2.3.0's "NEVER, EVER, EVER dead-letter" doctrine where closure-flow prose discusses GHI lifecycle.

## Completion Checklist

- [ ] **Gate 1 (ADR):** Intent recorded; Decision item #5 quoted in Implementation Summary
- [ ] **Gate 2 (TDD):** RGR cycle followed; drift test asserts REQ-derived semantics
- [ ] **Code Quality:** Lint, format, type checks clean
- [ ] **Gate 3 (Docs):** mkdocs --strict clean; sync reports zero divergent mirrors
- [ ] **Gate 4 (BDD):** behave scenarios tagged + passing
- [ ] **Gate 5 (Human):** TTY+ATTEST attestation recorded
- [ ] **Value Narrative:** Documented below
- [ ] **Key Proof:** Concrete grep output + sync diff below

> Universal attestation rule applies under ADR-0.0.36; Gate 5 fires regardless of lane.

## Evidence

### Gate 1 (ADR)

- [ ] Intent and scope recorded

### Gate 2 (TDD — Red-Green-Refactor)

```text
# Paste RED + GREEN test output here
```

### Code Quality

```text
# Paste lint/format/type check output here
```

### Gate 3 (Docs)

```text
# Paste mkdocs --strict + sync output here
```

### Gate 4 (BDD)

```text
# Paste behave output for tagged scenarios here
```

### Gate 5 (Human)

```text
# Record attestation text + TTY+ATTEST receipt here
```

### Value Narrative

Before this OBPI, the four named skills carried lane-conditional attestation prose that contradicted ADR-0.0.36's universal-attestation doctrine — agents reading the skill body would receive the deprecated rule, not the canon binding. After this OBPI, every skill body, rule file, and vendor mirror reflects the universal-attestation rule; a drift test asserts the absence of the deleted self-close path across canon and all mirrors. The doctrine is now operative through every per-turn surface an agent reads.

### Key Proof


```
$ uv run -m unittest tests.governance.test_skill_self_close_drift -v
test_canon_rule_files_have_no_self_close ... ok
test_canon_skill_files_have_no_self_close ... ok
test_edited_skills_have_bumped_version ... ok
test_pipeline_and_closeout_skills_cross_reference_dead_letter ... ok
test_vendor_mirrors_match_canonical_post_sync ... ok
test_zero_self_close_references_in_canon_and_mirrors ... ok
Ran 6 tests in 0.192s — OK

$ uv run gz covers OBPI-0.0.36-05-skill-prose-sweep-self-close
covered=6/6 — all REQs (REQ-01..REQ-06) covered

ARB receipts (Heavy lane):
- arb-ruff-c2a6f7fffca143758cac27b3748a8269 (clean)
- arb-step-typecheck-cc455857f76b45e1a3e15f87d684289f (clean)
- arb-step-unittest-859afb98d04f4976b12301d1ed003087 (5300/5300 pass)
- arb-step-mkdocs-22e47a98120549f593666987fead78dc (docs build --strict clean)
```

### Implementation Summary


- Canon edits: .gzkit/skills/gz-obpi-pipeline/SKILL.md (v6.16.0 → v6.17.0; removed Exception Mode SELF-CLOSE section, SVFR mode detection, exception task variant, exception-mode references in Stage 5 closure narrative; added ghi-close dead-letter cross-reference in Stage 5 Step 10), .gzkit/skills/gz-adr-closeout-ceremony/SKILL.md (v7.10.0 → v7.11.0; added ghi-close dead-letter cross-reference before the two-sync rationale), .gzkit/skills/gz-obpi-lock/SKILL.md (v6.0.2 → v6.1.0; removed SVFR concurrent-lock exception, replaced with per-OBPI concurrent-lock rule), .gzkit/rules/security-sensitivity.md (v0.2.0 → v0.3.0; replaced "never self-closeable" Invariant text with universal-attestation wording)
- Tests created: tests/governance/test_skill_self_close_drift.py (6-method drift module: REQ-01 canon-skill grep, REQ-02 canon-rule grep, REQ-03 version-bump verification, REQ-04 canon-mirror version parity, REQ-05 full 7-surface scan, REQ-06 dead-letter cross-reference presence)
- Tests modified: tests/governance/test_security_sensitivity_rule.py (version-assertion strings updated 0.2.0 → 0.3.0)
- Data edits: data/behave_coverage_waivers.json (added obpi-0.0.36-05-static-surface-sweep-unit-only rationale + OBPI-0.0.36-05 waiver entry — static-surface OBPI with no behavioral surface; unit tests are the appropriate verification tier)
- Vendor mirrors: regenerated by uv run gz agent sync control-surfaces across .claude/skills, .claude/rules, .github/skills, .github/instructions, .agents/skills, .agents/personas, src/gzkit/{skills,rules,personas}/
- Date completed: 2026-05-18
- Attestation: operator-verbatim "attest completed" recorded under universal attestation rule (ADR-0.0.36)
- Defects noted: none

## Tracked Defects

_No defects tracked._

## Human Attestation

- Attestor: `Jeffry Babb`
- Attestation: attest completed — ADR-0.0.36 OBPI-0.0.36-05 skill/rule prose sweep complete: gz-obpi-pipeline v6.17.0 (Exception Mode SELF-CLOSE removed), gz-adr-closeout-ceremony v7.11.0 (dead-letter cross-reference added), gz-obpi-lock v6.1.0 (SVFR concurrent-lock exception removed), security-sensitivity v0.3.0 (universal-attestation Invariant); 6/6 REQs covered by tests/governance/test_skill_self_close_drift.py (5300/5300 unittest pass); ARB receipts arb-ruff-c2a6f7fffca143758cac27b3748a8269, arb-step-typecheck-cc455857f76b45e1a3e15f87d684289f, arb-step-unittest-859afb98d04f4976b12301d1ed003087, arb-step-mkdocs-22e47a98120549f593666987fead78dc all clean.
- Date: 2026-05-18

---

**Brief Status:** Draft

**Date Completed:** 2026-05-18

**Evidence Hash:** -
