# α Close-Out — Cycle #251 (PR #252)

## Cycle summary

| | |
|---|---|
| Issue | #251 — refactor: split kata framework from CDD content |
| PR | #252 — squash-merged to main as `2b5611b` |
| Ships in | 3.55.0 (per β release decision: no new tag from this merge; rides next feature-release cycle) |
| Review rounds | 2 (Round 1 RC → Round 2 A — within target of ≤2) |
| Findings total | 3 (F1 C/judgment, F2 C/mechanical, F3 B/judgment) |
| Mechanical ratio | 1 of 3 = **33%** (> 20% threshold → §9.1 trigger fires) |
| Diff shape | L7 (architecture boundary moved: framework vs content) |
| Cycle process level | **L5** (mechanical finding reached review; per §9.1 "level = lowest miss") |

## Findings

### Finding A: §2.5b check 6 admits addition-only audits

β's F2 surfaced that `M0-gap/kata.md` and `M4-full-cycle/kata.md` ended up with *both* the legacy `Kata Class: method` prose (from pre-existing content) AND the new canonical `**Class:** method` line I added in the normalization step. My §2.5b self-coherence narrative recorded "kata.md class-line normalization touched 2 files (M0, M4)" — but I only verified the *addition* was consistent across the 5 M-files, not that the *removal* of the now-superseded legacy prose line was complete.

Pattern: when adding a canonical form that supersedes a prior form, the schema/shape audit must verify the prior form is removed, not just that the canonical form is present. "Single canonical source" (CDD §3.2) is a deletion-positive property, not an addition-only one. §2.5b check 6 as currently worded ("schema/shape audit") does not name this distinction, so an addition-only audit can pass the check while leaving dual-source in place.

Triage candidate: **MCA** — small skill patch. Rewrite §2.5b check 6 to something like: _"Schema/shape audit: when introducing or changing a canonical form, verify (a) the new form is present across all relevant files AND (b) any superseded form has been removed. Cite the verifying command (e.g. a grep that should return exactly one match per file)."_ Two-line CDD.md edit plus loader sync. Would have mechanically prevented F2.

### Finding B: PR body surface not re-audited after mid-cycle code patch

F1 was a conflict between two authority surfaces: the PR body's CDD Trace "Invariants touched" row claimed `katas/` was "a directory convention, not a new content class" — but the I1-fix commit (`b116b56`) that I pushed after initial PR-open *had* added `"katas"` to `pkgbuild/build.go`'s `ContentClasses` set. The PR body was correct when originally authored; it became incorrect after the CI-driven mid-cycle patch, and I did not re-audit the body.

Pattern: when a code patch is added mid-cycle (especially reactive ones to fix CI or reviewer feedback on a different axis), the PR body's CDD Trace rows can silently become stale. Nothing in §2.5b prompts "re-audit PR body against final HEAD before marking ready-for-review."

Triage candidate: **MCI** → potential **MCA**. Candidate MCA: add a §2.5b check item for "Post-patch re-audit: after any mid-cycle code change, re-read the PR body top-to-bottom and verify every CDD-Trace / invariant / self-coherence row still matches HEAD." Can't be fully mechanized (judgment task) but can be added as a gate item. Worth γ triage.

### Finding C: CI-coverage scope defaulted to "preserve what was tested"

F3 was that `kata-tier2` only invoked the class-bulk path (`cn kata-run --class runtime`) — the drop-in replacement for the pre-existing `cn kata-runtime` call. I did not extend CI to cover the *new* command surface (`kata-list` cross-package discovery, single-kata dispatch, method-class dispatch + bundle shape, `kata-judge` honest-stub output). My mental model was "preserve what was tested" for an L7 refactor; β's was correctly "an L7 refactor that multiplies the command surface must CI-gate every new command, not just the replaced one."

Pattern: for refactors that *add* command surfaces (as opposed to changing behavior of existing ones), default CI coverage should follow the *new* surface, not the old one. "Preserve-what-was-tested" is a correctness floor; "cover-what-was-introduced" is the L7-appropriate ceiling.

Triage candidate: **MCA candidate** — `eng/testing` skill addition: _"For L7 refactors that introduce new commands or new public APIs, each new surface element requires at least one CI-gated assertion before ready-for-review. 'Existing CI still passes' is not sufficient coverage for a multiplicative-surface change."_ Worth γ triage.

## Cycle Iteration (§9.1 triggered — mechanical ratio 33% > 20%)

### Triggers fired

- [ ] review rounds > 2 (actual: 2 — within target)
- [x] mechanical ratio > 20% (actual: **33%** — 1 of 3 findings; F2 was mechanical)
- [ ] avoidable tooling/environmental failure
- [x] loaded skill failed to prevent a finding (`cdd` §2.5b check 6 was active, failed to catch F2)

### Friction log

One C-level mechanical finding (F2) reached review. The legacy prose `Kata Class: method` lines in `M0-gap/kata.md` and `M4-full-cycle/kata.md` were left in place when I added the canonical `**Class:** method` line required by the new discovery regex. The files compiled, tests passed, `cn kata-list` correctly discovered all 5 method katas — but the files disagreed with their M1/M2/M3 siblings, which is a §2.2.1 sibling-consistency miss.

Round 1 also surfaced F1 (PR body staleness after mid-cycle code patch) and F3 (CI coverage scope for an L7 refactor). Those are judgment findings, not mechanical. Both fixed in Round 2 (`32d096d` + PR body edit) in one narrowing round; β approved.

### Root cause

**Skill gap** for F2: §2.5b check 6 admits addition-only shape audits. Primary cause of the cycle's L5 cap.

Secondary: F3 is arguably also a skill gap (no explicit "L7 refactor → new-surface CI coverage" rule). F1 is a skill gap in different form (no "post-patch re-audit" prompt).

### Skill impact

Active skills for this cycle: `eng/tool-writing`, `eng/testing`, `eng/ship`, `cdd`.

- `cdd` §2.5b check 6 was loaded, fired, and passed — **failed to prevent F2**. Wording gap (addition-only audit permitted).
- `eng/testing` was loaded — **did not prevent F3**. No explicit rule on L7-refactor CI coverage scope.
- `cdd` §2.5b as a whole — **did not prevent F1**. No post-patch re-audit step.

### MCA

Three candidates ranked by mechanizability:

1. **MCA, high-confidence** — Rewrite CDD §2.5b check 6 to require deletion-verification: _"When introducing a canonical form, verify (a) new form present AND (b) superseded form removed. Cite the verifying command."_ This would have mechanically caught F2. ~2 lines of CDD.md; loader sync; trivial.
2. **MCA candidate** — Add `eng/testing` skill rule: _"L7 refactors that add commands/APIs require one CI-gated assertion per new surface element before ready-for-review."_ Would have prevented F3. Small skill addition.
3. **MCI** (no clean mechanization yet) — Post-patch re-audit rule. Proposed as §2.5b addendum but requires judgment, so it's more prompt than gate. Worth γ triage call on whether to ship as a check item or defer.

"Won't repeat" without a mechanism is explicitly not an MCA per §9.1; these are all mechanism patches.

### Cycle level

**L5** (process cap, per §9.1: "If mechanical errors reached review, L5 was not met. Cycle caps at L5").

Justification: F2 was tagged mechanical by β (Round 1 review) — dual-source lines in M0/M4 kata.md. The diff achieves L7 *shape* (framework/content boundary moved, class of future work eliminated — β confirmed "The L7 claim is earned"), but the cycle's *process execution* hit L5 because mechanical error reached review. Honest read of §9.1: diff shape ≠ cycle level; cycle level is execution quality. One mechanical slip caps the cycle at L5 regardless of artifact ambition.

This is the right signal — if the cycle had been L5-clean, F2 would have been caught pre-review and the cycle would have reached L7 (two-round narrowing on judgment-only findings, L7-shape MCA shipped). The target for cycles of this shape is L7; this cycle hit L5.

---

## Summary for γ triage

| Finding | Severity | Mechanization | Candidate |
|---------|----------|---------------|-----------|
| A — §2.5b check 6 addition-only audit | C / skill-gap | high | **MCA** — rewrite check 6 (deletion-verification required) |
| B — PR body staleness after mid-cycle patch | C / skill-gap | low | **MCI** → possible §2.5b check addition |
| C — CI coverage scope for L7 refactors | B / skill-gap | medium | **MCA candidate** — `eng/testing` rule for L7+new-surface |

α recommendation: ship Finding A's MCA (skill patch to §2.5b check 6) as an immediate output this cycle — it is the highest-confidence mechanization and it directly addresses the cap on this cycle's level. Findings B and C defer to γ triage.

— alpha@cdd.cnos
