# α Close-Out — Cycle #253 (PR #258)

## Cycle summary

| | |
|---|---|
| Issue | #253 — ContentClasses divergence: filesystem (8) vs manifest (5) |
| PR | #258 — approved Round 2, released as 3.56.1 |
| Review rounds | 2 (= target, not exceeded) |
| Findings total | 1 (F1, B, mechanical) |
| Mechanical ratio | 100% (1/1) |
| Diff shape | L7 convergence — single canonical list + single filesystem predicate shared by `cn build --check` and `cn status`; eliminates the class of "which surface is authoritative?" question |
| Cycle process level | **L5** (L6 not met — intra-doc coherence drift `§1.1` ↔ `§1.2` reached review) |

## Findings

| # | Finding | Severity | Type | Disposition |
|---|---------|----------|------|-------------|
| F1 | `PACKAGE-SYSTEM.md §1.2` "Directory tree copy" enumeration omitted `katas` while `§1.1` (added by this PR) declared it as directory-tree copy mode. Internal doc incoherence widened by the same PR that updated §1.1. | B | mechanical | Fixed on-branch in `507e1e8`; β narrowing round (R2) closed. |

## Cycle Iteration

§9.1 triggers fired:

- [ ] review rounds > 2 (actual: 2, at target)
- [x] mechanical ratio > 20% (actual: 100%)
- [ ] avoidable tooling/environmental failure
- [x] loaded skill failed to prevent a finding (CDD §5.3 row 7a "schema/shape audit across all touched files when contracts change" — the §1.1 table change altered copy-mode semantics for `katas`; the audit scope should have included every §1.x subsection that enumerates copy modes, not only the table row itself)

### Friction log

The pre-review audit (CDD §5.3 row 7a) verified:
- new form (`katas`) present in `§1.1` table ✓
- superseded forms (old `pkgbuild.ContentClasses`, `FullPackageManifest.ContentClasses()`) removed ✓
- grep audit for stale references across `src/go` ✓

But it did not verify:
- every _peer subsection_ of the edited table that enumerates the same columns (here: `§1.2` "Directory tree copy" bullet enumerates the copy-mode column of `§1.1`)

F1 landed in the review surface, not the authoring surface. The finding was cheap to fix (1 line) but expensive in process terms — it meant a second review round, a second CI run, and a §9.1 trigger.

### Root cause

Skill gap — the row-7a audit checklist reads "all touched files" which operationally became "all files in the diff" rather than "all files/sections that make a claim about the changed axis". The edited doc has an internal pointer structure (§1.1 table → §1.2 bullet list enumerates the same column) that a strict file-boundary audit misses.

### Skill impact

CDD §5.3 row 7a ("schema/shape audit across all touched files when contracts change") is the loaded skill that covers this class. It was loaded and run. It passed F1.

The gap is not that the check was skipped — it's that the check's scope is underspecified when the changed form is a _table column_ and peer sections enumerate the same column in prose. Proposed patch scope (γ triage):

> **Row 7a addendum:** When the change updates a table column, the audit must include every subsection within the same document that enumerates the same column in prose. Mechanical form: `grep -n "<column-value-1>.*<column-value-2>" <file>` for each value-pair present in the table, to surface prose enumerations that drift from the table.

### MCA

Candidate immediate output for γ triage: sharpen CDD §5.3 row 7a schema-audit scope per the "peer-enumeration" rule above. One-line addendum in `src/packages/cnos.cdd/skills/cdd/CDD.md` row 7a.

### Cycle level

**L5** (L6 cap — doc-internal coherence drift reached review).

Justification: Code was locally correct (compile, vet, tests, `cn build --check` all green pre-push); L5 earned cleanly on the code side. But the touched docs surface had an internal coherence gap (§1.1 claimed a copy mode for a class; §1.2 failed to list that class under the same copy mode) — cross-surface drift of the kind L6 explicitly calls out as a miss. Cycle caps at L5.

The _diff shape_ is L7 (shared canonical list + shared predicate = class-of-friction eliminated for future content classes), but the cycle level tracks _process_, not diff shape. Lowest miss wins.

## What worked

1. **Convergence direction** was unambiguous. Canonical doctrine (`PACKAGE-SYSTEM.md §3`: "Content classes are discovered by directory presence") pre-decided the authority — filesystem, not manifest JSON. The manifest heuristic was the wrong authority to begin with. Deleting `FullPackageManifest.ContentClasses()` rather than patching it was the cleaner MCA.

2. **`providers` correctly identified as not-a-content-class.** `POLYGLOT-PACKAGES-AND-PROVIDERS.md` declares providers a runtime capability surface, orthogonal to the content-class model. Removing it from the detection surface closes a category mistake that the old JSON heuristic had codified.

3. **Doctrine sync in the same PR.** `PACKAGE-SYSTEM.md §1.1` was updated to include `katas` (operationalized in 3.55.0 but not previously in canonical doctrine). Keeping the code change and doctrine update in one diff prevents a "code says 8, doctrine says 7" drift window.

4. **β's narrowing round was efficient.** F1 fix was 1 line. Round 2 had no new findings.

## Summary for γ triage

| Item | Severity | Candidate |
|------|----------|-----------|
| F1 root cause — row 7a schema-audit scope underspecified for table-column / peer-enumeration pairs | B | Skill patch: one-line addendum to `cdd/CDD.md §5.3` row 7a. **MCA**. |
| OCaml `cn_build.ml` `source_decl` still carries 7 fields (no `katas`) — legacy surface, not on live `cn build` path | N/A (not a finding) | Separate cycle; note carried forward. |
| `PACKAGE-AUTHORING.md` "katas as commands" phrasing not cross-linked to §1.1 | cosmetic | Not filed. |

α recommendation: ship the row-7a addendum as an immediate output this cycle (§10.1). Everything else is already converged in the released diff.

— alpha@cdd.cnos
