# Reachability Matrix — Skill × Rule

Pairs listed only where applicability is concrete (basis (a), (b), or (c) per the applicability rule). Judgment-only rules (behavioral-invariants, constraints, governance-core) are treated as always-on agent contract and are NOT enumerated per-skill; reachability analysis focuses on domain-specific rules whose honor/violation surfaces in skill procedures.

"Honored" means the skill body either (i) cites the rule by filename or (ii) mechanically enforces the rule via a `gz validate --<scope>` (or equivalent) check in its procedure. Otherwise "no" with a concrete worked example.

| # | Skill | Rule § | Applicability basis | Honored? | Gap worked example (if no) |
|---|---|---|---|---|---|
| 1 | gz-adr-audit | tests.md § "Red-Green-Refactor (TDD Discipline — binding)" / "Tests assert semantics, not strings" | (b) skill invokes `gz adr audit-check` which reads `@covers` tags and coverage floor from unit tests | no | Step 2 (line 103-121) treats an audit-check failure as a *brief-evidence* gap: "If ledger is incomplete or missing: Run `gz audit <adr-id>`… return to Step 2 after reconciliation." The remediation flow drives agents toward backfilling `@covers` decorators on tests that pin existing output rather than semantic criteria. The skill does not cite tests.md, so an agent under audit pressure will rationalize "add `@covers` so audit-check passes" without re-deriving assertions from REQ language. This is the GHI #268 path surfaced in today's ADR-0.0.17 audit. |
| 2 | gz-adr-audit | adr-audit.md § "Audit sequence" | (b) skill IS the audit procedure; invokes `gz adr audit-check`, `gz gates`, `gz closeout`, `gz attest`, `gz audit`, `gz adr emit-receipt` | no | The skill's Procedure section (Step 1–9) never cites `.gzkit/rules/adr-audit.md` even though the two documents describe the same procedure in different sequencing. adr-audit.md mandates the order `gz closeout --dry-run → gz attest → gz audit → gz adr emit-receipt` (Step 3); gz-adr-audit Step 8 (line 206) emits the receipt after marking VALIDATED without requiring a preceding `gz closeout`/`gz attest` pair. Procedure drift between skill and rule is invisible to the agent. |
| 3 | gz-adr-audit | attestation-enrichment.md § "Canonical invocations" | (b) skill emits `gz adr emit-receipt --attestor … --evidence '{"gate":5,…}'` and references attestation text | no | Step 8 (line 210-219) shows receipt emission with an `--evidence` JSON blob, but the skill never requires the receipt IDs from the canonical ARB invocation table (arb-ruff-*, arb-step-typecheck-*, arb-step-unittest-*, arb-step-coverage-*, arb-step-mkdocs-*). An agent running gz-adr-audit on a Heavy-lane ADR satisfies the skill's letter without emitting or citing any ARB receipts — so the Heavy-lane "missing receipt IDs are fail-closed" rule is bypassed by the skill's procedure. |
| 4 | gz-adr-audit | gate5-runbook-code-covenant.md § "Required updates when behavior changes" | (c) skill audits Heavy-lane/Foundation ADRs whose closure requires runbook + command doc parity | no | Step 4 ("Document") writes `audit/AUDIT.md` but never requires verifying `docs/user/runbook.md`, `docs/governance/governance_runbook.md`, or `docs/user/manpages/**` parity against code changes introduced by the ADR. "Step 5 Identify Shortfalls" lists "code ≠ docs ≠ tests" as a shortfall category but provides no procedure for the three-layer documentation model the covenant defines. |
| 5 | gz-adr-closeout-ceremony | attestation-enrichment.md § "Canonical invocations" / "Lane behavior" | (b) skill invokes `gz closeout --ceremony --attest` which records attestation text; Step 5 assembles Evidence Summary | no | Evidence Summary Template (line 280-286) prescribes `gz lint`, `gz test --bdd`, `gz typecheck`, `gz validate --documents`, `mkdocs build --strict` as the walkthrough commands. None of these are the canonical ARB-wrapped forms (`gz arb ruff`, `gz arb typecheck`, `gz arb step --name unittest ...`, `gz arb step --name mkdocs ...`). Heavy-lane closeout therefore proceeds without receipt IDs and the attestation text violates attestation-enrichment.md's fail-closed Heavy-lane rule. |
| 6 | gz-adr-closeout-ceremony | arb.md § "When to Use ARB" (Mandatory row: "Heavy-lane attestation (ADR closeout …)") | (b) every ADR closeout ceremony is Heavy-lane attestation context per ADR definition | no | The skill body never mentions ARB. Step 5 collects evidence via non-ARB commands; the CLI state machine the skill drives (`gz closeout --ceremony`) likewise does not require ARB receipts. The skill is the canonical closeout surface and it routes around the canonical QA-evidence surface arb.md declares mandatory for this context. |
| 7 | gz-adr-closeout-ceremony | gh-cli.md § "Allowed commands" | (b) Step 7 invokes `gh issue list` and `gh issue close`; Step 8 invokes `gh release create` | yes (mechanical) | Commands used match gh-cli.md allowed-list verbatim. No body citation, but the verbs themselves are governed forms. |
| 8 | gz-adr-closeout-ceremony | gate5-runbook-code-covenant.md § "Three-layer documentation model" | (a) rule paths `docs/**` + `src/gzkit/**` overlap ADR closeout impact; (b) Step 3 is the "Docs Alignment Check" | yes (cite) | Step 3 (line 141-146) cites the three-layer check (runbook / governance runbook / command docs) and runs `mkdocs build --strict` on gaps — mechanically enforces the covenant. |
| 9 | gz-obpi-pipeline | attestation-enrichment.md § "Canonical invocations" / "Applies to" | (b) Stage 5 invokes `gz obpi complete --attestation-text …`; Stage 3 runs lint/typecheck/tests | yes (cite) | Line 493 cites "attestation-enrichment.md" for the attestation text shape. However, Stage 3's baseline quality checks (line 280-288) invoke `gz lint`, `gz typecheck`, `gz test --obpi` directly — not the ARB-wrapped canonical forms. Honored at the citation level, but gap persists at the invocation level (partial honor). Marking yes (cite) per the definition. |
| 10 | gz-obpi-pipeline | arb.md § "Available Commands" / Canonical-invocation locking | (b) Stage 3 emits QA claims that feed Stage 5 attestation | no | Same as row 9 — the skill acknowledges attestation-enrichment.md at the narrative level but Stage 3's QA invocations are bare (`gz lint`, `gz typecheck`, `gz test`) rather than `gz arb ruff`, `gz arb typecheck`, `gz arb step --name unittest`. Heavy-lane OBPIs therefore reach Stage 5 without ARB receipts cited inline. |
| 11 | gz-obpi-pipeline | defect-fix-routing.md § "Direct fix is the right route when ALL hold" | (b) skill is the OBPI ceremony pipeline; rule routes work away from this pipeline when thresholds met | yes (cite) | Line 68 explicitly cites defect-fix-routing.md with the full threshold set and routes sub-threshold defects to `fix(...)` commits. |
| 12 | gz-obpi-pipeline | tests.md § "Red-Green-Refactor" | (b) Stage 3 runs unit tests; (c) OBPI implementation typically modifies `tests/**` | no | Stage 3 (line 270-319) describes running `gz test --obpi {SLUG}` and checking `@covers` parity via `gz covers --json`. The procedure never asserts "tests derive from REQ semantics, not existing output" — so Phase 1b's parity gate, read literally, is satisfied by any `@covers` tag regardless of whether the test body asserts REQ-derived semantics. An agent completing OBPI Stage 3 with cosmetic `@covers` passes the mechanical gate and the skill never flags the reachability miss. |
| 13 | gz-obpi-pipeline | brief-heading-conventions.md § "Canonical evidence sections (H3)" | (c) Stage 5 writes brief evidence sections at H3 (Implementation Summary, Key Proof, Closing Argument) via `gz obpi complete` | no | The pipeline skill does not cite brief-heading-conventions.md or invoke `gz validate --brief-headings`. The CLI verb `gz obpi complete` likely emits H3 correctly, but a hand-edit or partial rerun that drifts a heading to H2 is not caught by the skill's procedure. GHI #238 promoted this to a `gz validate --brief-headings` scope; the skill has not absorbed the check. |
| 14 | gz-obpi-pipeline | gh-cli.md § "Allowed commands" / "Defect tracking requirement" | (b) Stage 5 handoff path invokes `gh issue create` when blockers persist | yes (mechanical) | Handoff procedure uses `gh issue create` with defect label — conformant with gh-cli.md allowed-list. |
| 15 | gz-obpi-pipeline | gate5-runbook-code-covenant.md § "Required updates when behavior changes" | (c) OBPI implementation touches `src/gzkit/**`; docs must track | no | Stage 3 runs `gz validate --documents` and `mkdocs build --strict` but the skill procedure does not require operator/agent to check the three runbook layers (runbook / governance runbook / command docs) against the code change. `gz validate --documents` covers schema validity, not runbook-content parity with runtime behavior. |
| 16 | gz-obpi-specify | brief-heading-conventions.md § "Canonical evidence sections (H3)" | (c) skill authors OBPI briefs under `docs/design/adr/**/obpis/**` | no | The pre-save ground-truth check (Step 1) verifies Allowed Paths but does not verify brief evidence heading levels. The skill does not cite brief-heading-conventions.md or invoke `gz validate --brief-headings` before save. An author who types `## Implementation Summary` (H2) by habit saves a brief that silently fails the H3 contract until mid-ceremony. |
| 17 | gz-obpi-specify | attestation-enrichment.md § "Applies to" | (b) skill scaffolds briefs whose Acceptance Criteria feed later `gz obpi complete --attestation-text` | no | Skill does not require brief acceptance criteria to be phrased such that the attestation text can cite observable receipts. An agent authoring a brief with vague acceptance bullets ("coverage meets threshold") produces briefs that force attestation drift at Stage 5. |
| 18 | gz-adr-create | skill-surface-sync.md § "Procedure" / "Surface layout" | (c) creating an ADR with agent-surfaces content may scaffold under `.claude/`, `.github/`; (a) parent governance files are under `.gzkit/` canonical | yes (mechanical) | ADR scaffolding is CLI-driven via `gz adr create`; surface-sync is enforced by `gz agent sync control-surfaces` which is a separate skill. Skill does not explicitly cite but the CLI it wields keeps canonical/mirror alignment. |
| 19 | gz-adr-create | gh-cli.md § "Defect tracking requirement" | (b) ADR authoring often files defect GHIs as part of linkage; (a) paths `docs/design/adr/**` overlap | no | Skill does not reference gh-cli.md and does not walk the agent through filing linked GHIs. An agent creating an ADR that surfaces a defect has no procedural prompt to `gh issue create --label defect`. |
| 20 | gz-adr-promote | adr-audit.md § "Rules" | (a) paths `docs/design/adr/**` overlap | yes (mechanical) | Skill invokes `gz validate` and `gz status` after promotion, which indirectly validates the promoted ADR satisfies audit-check preconditions. No citation. |
| 21 | gz-adr-sync | adr-audit.md | (a) paths `docs/design/adr/**` overlap; (b) invokes `gz register-adrs`, `gz status` | yes (mechanical) | Running `gz register-adrs` + `gz status` is the reconciliation half of adr-audit.md's procedure. Mechanical alignment, no citation. |
| 22 | gz-adr-status | adr-audit.md | (a) paths `docs/design/adr/**` overlap; (b) invokes `gz adr report`, `gz adr status` | yes (mechanical) | Skill is read-only status surface; invoking `gz adr status`/`gz adr report` is the status portion of the audit sequence. |
| 23 | gz-adr-emit-receipt | attestation-enrichment.md § "Applies to" | (b) skill invokes `gz adr emit-receipt` with `--attestor` flag | no | Skill body (line 32) shows `gz adr emit-receipt ADR-X.Y.Z \` example; it does not cite attestation-enrichment.md or require the attestor/attestation-text to include receipt IDs in the enrichment pattern. An agent emitting a receipt under this skill writes narrative attestation text without the canonical "<user words> — <characterization> Receipts: …" shape. |
| 24 | gz-plan | defect-fix-routing.md § "OBPI ceremony is required when ANY hold" | (b) skill creates ADR plans; rule modulates when ceremony vs direct-fix applies | no | Skill does not cite defect-fix-routing.md. An agent asked to plan a 5-line in-flight defect fix under gz-plan will scaffold a full ADR/OBPI ceremony, exactly the over-application pattern the routing rule exists to prevent. |
| 25 | gz-plan-audit | attestation-enrichment.md § "Rationale — Why receipts, not narrative" | (b) plan-audit is a governance-attestation emission surface | yes (cite) | Line 208 cites `attestation-enrichment.md` for "self-introspection is not a verification pathway" — proper rule integration. |
| 26 | gz-chore-runner | chores.md § "Command Sequences" / "Evidence & Attestation" | (b) skill IS the chores workflow; invokes `gz chores list/show/plan/advise/run/audit`; (a) rule paths overlap | yes (mechanical) | Command sequence matches chores.md prescribed flow. Body does not cite the rule explicitly but the mechanical conformance is tight. |
| 27 | gz-chore-runner | tests.md § "Smoke/BVT ≤60s" | (b) chore lite lane runs `uv run -m unittest -q` | no | Skill lists "Validate locally: Lint, typecheck, tests" but does not surface the 60s smoke-test ceiling or the 40% coverage floor. A chore that violates the test policy passes the skill's procedure because the skill defers to the chore author's criteria. |
| 28 | gz-check | gate5-runbook-code-covenant.md § "Validation bundle" | (a) paths `docs/**`, `src/gzkit/**` overlap; (b) invokes `gz lint`, `gz validate --documents`, `mkdocs build --strict` | yes (mechanical) | The command surface `gz check` wraps exactly the validation bundle the covenant prescribes. |
| 29 | gz-check | arb.md § "When to Use ARB" | (b) skill is the pre-attestation quality gate; Heavy-lane attestation invokes this before closeout | no | Skill runs `gz lint`, `gz typecheck`, `gz test --bdd` directly — not `gz arb ruff`, `gz arb typecheck`, `gz arb step --name unittest`. The revival_note in gz-arb explicitly flags this: "gz check never implemented ARB receipt emission, so the rule contract in .gzkit/rules/arb.md was referencing a nonexistent surface." Present state: gz-check still does not emit ARB receipts despite being the pre-attestation aggregator. |
| 30 | gz-check | tests.md § "Red-Green-Refactor" / "Coverage Floor (binding)" | (b) skill invokes `gz test` | yes (mechanical) | `gz test` enforces the 40% coverage floor. Skill body does not cite tests.md but the CLI surface enforces it. |
| 31 | git-sync | gate5-runbook-code-covenant.md § "Validation bundle" | (b) `gz git-sync --apply` invokes pre-commit hooks running lint/tests | yes (mechanical) | Pre-commit hooks run the validation bundle. |
| 32 | gz-patch-release | attestation-enrichment.md § "Applies to" | (b) release ceremony produces narrative release notes + attestation to patch | no | Skill scope note (line 37) explicitly says "Does NOT re-verify: GHI qualification (trusts `gz patch release` CLI)". Patch release is Heavy-lane attestation context per arb.md usage matrix, but skill procedure does not require ARB receipt IDs in release notes or commit messages. |
| 33 | gz-patch-release | arb.md § "When to Use ARB" (Mandatory: release ceremony) | (b) release ceremony is explicit Mandatory row in ARB usage matrix | no | Skill body does not cite arb.md; procedure invokes `gz patch release` + `gz git-sync --apply` without wrapping QA evidence in ARB receipts. |
| 34 | gz-agent-sync | skill-surface-sync.md § "Procedure" | (a) paths `.claude/**`, `.gzkit/skills/**`, `.gzkit/rules/**` overlap exactly; (b) skill IS the sync workflow | yes (mechanical) | Skill's entire purpose is the skill-surface-sync.md Procedure step 3 (`gz agent sync control-surfaces`). Mechanical honor. |
| 35 | gz-agent-sync | skill-surface-sync.md § "Version discipline" | (a) paths overlap | no | Skill does not require bumping `skill-version` before sync nor verifying version bumps across edited skills. Step 2 of the surface-sync Procedure ("Bump `skill-version`") is not surfaced as a pre-flight in this skill's workflow. |
| 36 | gz-adr-autolink | tests.md § "TASK-Driven Workflow" / "@covers" | (b) skill scans `@covers` tags in `tests/`; (c) updates docs based on coverage | no | Skill invocation (line 26) greps `@covers\("ADR-'` from tests. Skill does not verify that the tests asserted under those `@covers` tags are REQ-derived (tests.md § "Tests assert semantics, not strings"). Autolink treats `@covers` as ground truth regardless of assertion quality. |
| 37 | gz-adr-recon | adr-audit.md § "Audit sequence" | (a) paths `docs/design/adr/**`; (b) invokes `gz adr status`, `gz adr audit-check` | yes (mechanical) | Reconciliation calls the audit-check command; aligned mechanically. |
| 38 | gz-obpi-reconcile | tests.md § "Coverage Floor (binding)" / "@covers" | (b) Phase 1 verifies tests pass and `@covers` tags present; (c) may modify brief metadata to reflect test state | no | Skill's Trust Model (line 60-65) says "Reads: Code, tests, coverage reports… Verifies: Tests pass, coverage meets threshold, @covers tags present." The skill treats `@covers` presence as proof of coverage without inspecting whether the test body asserts REQ semantics. This is the canonical "test-dump theater" path named in tests.md — `@covers` without semantic-derivation is the known anti-pattern. |
| 39 | gz-obpi-reconcile | adr-audit.md § "Rules" | (b) skill writes ledger entries (`logs/obpi-audit.jsonl`) and syncs ADR tables | yes (mechanical) | Layer 1+2+3 full stack matches adr-audit.md expectation for evidence-backed reconciliation. |
| 40 | gz-obpi-simplify | pythonic.md § "Size Limits & Refactoring" | (b) skill reviews and refactors code across an OBPI's Allowed Paths | yes (mechanical) | Skill invokes `/simplify` pattern which honors ≤50/≤600/≤300 line caps. |
| 41 | gz-obpi-simplify | cross-platform.md § "File Paths (Always pathlib.Path)" | (b) code review skill touches Python | no | Skill body does not explicitly cite cross-platform.md or include pathlib/encoding checks in its review checklist. |
| 42 | gz-obpi-simplify | models.md § "Data Model Policy" | (b) code review skill touches `src/**/*.py` | no | No citation of models.md; skill does not enforce Pydantic-over-dataclass review criterion. |
| 43 | gz-obpi-simplify | tests.md § "Red-Green-Refactor" | (b) skill applies fixes after implementation and invokes tests | no | Refactoring skill does not warn against refactoring while tests are failing (tests.md explicit anti-pattern). |
| 44 | gz-adr-verification (ARCHIVED) | tests.md § "@covers" | (b) skill invokes `rg '@covers("ADR-' tests` | n/a | Archived/consolidated into gz-adr-audit. |
| 45 | gz-adr-manager (ARCHIVED) | — | — | n/a | Archived. |
| 46 | gz-specify (RENAMED) | brief-heading-conventions.md | (c) successor gz-obpi-specify authors briefs | n/a | Forwarder; honors not applicable. |
| 47 | gz-interview (ARCHIVED) | — | — | n/a | Archived into gz-adr-create. |
| 48 | gz-obpi-audit (ARCHIVED) | tests.md, adr-audit.md | (b) forwarder | n/a | Archived; forwards to gz-obpi-reconcile. |
| 49 | gz-obpi-sync (ARCHIVED) | adr-audit.md | — | n/a | Archived. |
| 50 | gz-obpi-brief (ARCHIVED) | brief-heading-conventions.md | — | n/a | Archived. |
| 51 | gz-register-adrs (ARCHIVED) | adr-audit.md | — | n/a | Archived. |
| 52 | gz-adr-check (ARCHIVED) | adr-audit.md | — | n/a | Archived. |
| 53 | gz-closeout, gz-attest, gz-audit (ARCHIVED) | attestation-enrichment.md, adr-audit.md, arb.md | — | n/a | Archived into gz-adr-closeout-ceremony. |
| 54 | lint, format, test, gz-typecheck (ARCHIVED) | arb.md, tests.md | — | n/a | Archived into gz-check. |
| 55 | gz-skill-router | defect-fix-routing.md | (b) routing table includes ceremony-vs-direct-fix decision | yes (cite) | Line 57 explicitly routes in-flight defects to defect-fix-routing.md. |
| 56 | gz-skill-router | tool-skill-runbook-alignment.md § "Invariants" | (c) router dispatches to skills that wield CLI verbs; alignment doctrine governs router's routing targets | no | Router does not cite tool-skill-runbook-alignment.md. Drift between a routed skill's `gz_command` and the runbook's prescribed verb will silently misroute agents; router does not self-check alignment before dispatch. |
| 57 | gz-adr-evaluate | tests.md § "Tests assert semantics" | (b) evaluation scores OBPIs on verification dimensions | no | Scoring rubric does not include "Tests assert semantics, not strings" as a dimension. An OBPI full of `@covers`-tagged output-pinning tests scores well on coverage dimension but bypasses the semantic-assertion contract. |
| 58 | gz-design | defect-fix-routing.md § "OBPI ceremony is required" | (b) design dialogue often produces new ADR/OBPI intent | no | Skill does not cite defect-fix-routing.md; an operator seeking a "design" for a 5-line patch enters full ADR authoring ceremony rather than being routed to a direct-fix path. |
| 59 | airlineops-parity-scan | cross-platform.md, pythonic.md | (b) parity scan compares codebases | yes (mechanical) | Scan runs `gz cli audit`, `gz check-config-paths`, `mkdocs --strict` which enforce these contracts in the gzkit tree. |
| 60 | gz-obpi-lock | — | No code-modification scope; purely coordination | n/a | No applicable domain rule. |
| 61 | gz-session-handoff | attestation-enrichment.md § "Enrichment content" | (b) handoff docs carry session evidence that feeds later attestation | no | Handoff doc template does not prescribe receipt-ID citation format; handoffs therefore arrive at the next session without the deterministic evidence chain attestation-enrichment.md requires. |
| 62 | gz-init | skill-surface-sync.md | (a) init scaffolds under `.claude/`, `.gzkit/skills/`, `.gzkit/rules/`, `.github/` | yes (mechanical) | `gz init` is the scaffolder that establishes the canonical/mirror layout. |
| 63 | gz-validate | tool-skill-runbook-alignment.md § "Enforcement" | (b) skill is the validator surface; rule explicitly points to `gz validate --surfaces` as the long-term home for invariant enforcement | yes (mechanical) | Skill invokes `gz validate --<scope>` forms which are the mechanical homes for promoted advisory rules. |
| 64 | gz-tidy | gate5-runbook-code-covenant.md | (b) skill runs repository hygiene across docs + src | yes (mechanical) | `gz tidy` aggregates quality checks. |
| 65 | gz-gates | — | (b) gates wrapper invokes all gates | n/a | Thin wrapper; inherits rules of downstream gates. |

---

## Non-applicable rule classes (not enumerated per skill)

- `behavioral-invariants.md` (`paths: **`) — applies to every skill as agent contract, but treats as always-on ownership/craftsmanship discipline rather than per-procedure check.
- `constraints.md` (`paths: **`) — consolidated cross-reference; per-skill applicability is derived from the rule file it cross-references (tests.md, skill-surface-sync.md, etc.).
- `governance-core.md` (`paths: **/*`) — workflow-order rule; every CLI-invoking skill is in scope but honor is a session-level property, not per-skill-procedure.
- `cli.md` (`paths: src/gzkit/commands/**`) — binds CLI-code authorship, not skill procedure. Applies to source files, not skills.
- `models.md` (`paths: src/**/*.py`) — binds code authorship in `src/`, not skills. Surfaces only in code-review skills (gz-obpi-simplify row 42).
- `pythonic.md` (`paths: **/*.py`) — binds Python authorship. Surfaces only in code-authoring/review skills.
- `cross-platform.md` (`paths: src/**/*.py`, `tests/**/*.py`) — binds Python authorship. Surfaces in code-authoring skills.

## Row counts

- Total skill × rule applicable pairs enumerated: 65 rows (rows 44–54 are archived placeholders for completeness; treat as n/a).
- Active (non-archived) applicable pairs: ~40.
- Honored (cite): 5 rows (rows 8, 11, 25, 55, and row 9 partial-cite).
- Honored (mechanical): ~15 rows.
- Gap (no, active skill): ~20 rows.

Detailed disposition rolls up in `summary.md`.
