# α Close-Out — Cycle #266 (PR #267)

## Cycle summary

| | |
|---|---|
| Issue | #266 — *CDD process: committed dist/ + main-side package edits = merge race (L7 MCA candidate)*. Filed by β during close-out of #262 (`3e850f3`) with three candidate MCAs (A/B/C) for γ triage. Closed by PR #267 (`Closes #266`, auto-closed on merge). |
| PR | #267 — *dist: move dist/ out of git — eliminate the rebase-race class (#266)*. Squash-merged to main as `a05af27`. |
| Dispatch | γ → α: project `cnos`, issue #266, Tier 3 skills `eng/go`, `eng/design`. Branch `claude/alpha-tier-3-skills-0OOu5`. |
| Work shape | Substantial architecture/CI/docs (MCA). 14 files · 281+ / 105− · 3 commits on-branch (`b07ca39`, `9f162dc`, `43f5a89`). No code change: 10 file deletions under `dist/packages/`, `.gitignore` broadened `dist/bin/` → `dist/`, `.github/workflows/coherence.yml` I3 job removed, `docs/alpha/package-system/BUILD-AND-DIST.md` §Migration step 2 marked accomplished, `docs/alpha/package-system/DESIGN-266-dist-out-of-git.md` created (270 lines, primary branch artifact). |
| Tier 2 skills applied | `eng/go` (§2.12 peer/harness audit), `eng/process-economics` (§2.6 lightest alternative, §2.13 challenge), `eng/write`, `eng/rca`. |
| Tier 3 skills applied | `eng/go` (peer enumeration), `design` (§3.2 one source of truth, §3.6 registry normalization), `cdd/design` (§2.3 impact graph before closure, §3.1 output format). |
| MCA selection | Three candidates named in the issue: **A** (move dist/ out of git), **B** (GitHub merge queue), **C** (freeze main-side src/packages/ edits). I added two more for completeness — **D** (I3 advisory only), **E** (manifest-only in git, tarballs out) — and chose **A**. Rationale in `DESIGN-266 §Alternatives Considered`. Key observation: `BUILD-AND-DIST.md §Migration step 2` already named *"Add `dist/` to `.gitignore`"* as a planned step; A was restoring a documented-but-deferred target state, not a net-new design. |
| Review rounds | **3** — R1 APPROVED + 3 findings (F1/F2/F3); R2 REQUEST CHANGES narrow, F3-bis filed after incomplete R1 F3 fix; R3 APPROVED final. β merged at `a05af27`. |
| Findings against α | 4 total — F1 (C, mechanical, base-drift claim stale), F2 (B, mechanical, CI-green checkbox unticked), F3 (A, mechanical, tarball count off-by-one in one site), F3-bis (A, mechanical, two further sites of same error + `.gitignore` line-count A-polish). All resolved on-branch per review §7.0. No code or semantic finding. |
| Mechanical ratio | 4/4 = 100% (all findings mechanical). N=4 < §9.1 10-finding floor, so not an automatic process-debt trigger. |
| Local verification | `go test ./...` green (11 packages); `go vet ./...` clean; INVARIANTS T-002 dispatch-boundary check clean; `scripts/kata/run-all.sh` green end-to-end (init → status → doctor → build → install); kata-tier2 replay end-to-end (`cn build` → `cn init` → `cn setup` → `cn deps lock` → `cn deps restore` → `cn kata run --class runtime` — 4/4 runtime katas pass); framework surface (`cn kata list` runtime=4 method=5, `cn kata run M0-gap --mode cdd` → valid stub bundle, `cn kata judge` → `not-yet-implemented` verdict). CI on merged head `43f5a89`: 7/7 green (go, kata-tier1, kata-tier2, I1, I2, 2× notify). `dist-source-sync` (I3) correctly absent from the check set post-merge. |
| Concurrent main activity | 3 commits landed during review (`96453db`, `02cdb35`, `f85d0c3`, all in `src/packages/cnos.cdd/skills/cdd/`), 4 more between approval and merge (`2fd8864`, `6013328`, `f381ceb`, `8b564d5`). None touched workflows, `dist/`, or Go sources. The MCA was exercised on its own purpose: main moved in src/packages/ during this very cycle, and post-merge no committed-dist diff exists for those moves to disagree with. |

## Findings (α-side observations)

### Finding F1 — pre-review gate claim stale at review time (C, mechanical)

**What happened.** PR body §Pre-Review Gate row 1 read *"Rebased on current `main` (branch based at `3e850f3`, which is current `origin/main`)"*. The claim was accurate at push time (`10:41Z`, `origin/main == 3e850f3`) but became false by review time (`10:50Z`, `origin/main == f85d0c3`, 3 commits of drift all in `src/packages/cnos.cdd/skills/cdd/`).

**Pattern.** Pre-review-gate rows that carry transient truth (base SHA, CI state, mergeable_state) are valid at the moment they are written but not automatically at re-request time. I wrote the gate once at PR-open and did not re-validate its first row before β read the PR. The other gate rows (PR body structure, AC mapping, known debt) are not transient — once written they stay true.

**Meta-observation.** F1 is exactly the failure class the PR is filed to eliminate. Main moving on `src/packages/cnos.cdd/skills/cdd/*.md` during review is the same signal that, under the pre-PR regime, would have broken `cn build` re-runs on the PR's committed `dist/`. Post-merge this class of drift is structurally silent; pre-merge it still surfaced as a pre-review-gate honesty gap.

**Resolution chosen.** β filed F1 with two paths: (a) rebase onto new main and re-run CI, (b) amend the gate row to record the actual state honestly. I took (b) — the PR's thesis is that α shouldn't need to run the race one more time to win; forcing a rebase perpetuates the class one more cycle to eliminate it. Amended row reads: base SHA, current-main SHA, drift-scope file list, `mergeable_state: clean`, merge-tree clean, + the leverage-preservation rationale inline.

**Surfaces involved.** `alpha/SKILL.md §2.6` pre-review-gate list; `alpha/SKILL.md §2.7` re-request semantics.

---

### Finding F2 — CI-green checkbox unticked despite 7/7 green (B, mechanical)

**What happened.** PR body §Pre-Review Gate row 8 opened as `- [ ] CI green on head commit — PR opens with CI pending; will confirm before requesting β review formally`. β review posted with 7/7 green on `b07ca39` (go, kata-tier1, kata-tier2, I1, I2, 2× notify). I subscribed to PR activity but did not return to re-tick the gate box before β read the PR.

**Pattern.** Same class as F1 — a pre-review-gate row written as "will confirm" needs an explicit return-to-tick step. Alpha SKILL §2.7 bullets mention "request β review" but do not embed "re-tick transient gate rows" as part of that sub-step.

**Resolution.** Ticked in the same PR-body update that carried F1; noted that `dist-source-sync` (I3) is correctly absent from the check set because this PR deletes the job — the absence is evidence, not a miss.

**Surfaces involved.** `alpha/SKILL.md §2.6` (gate row 10 "CI green"); `alpha/SKILL.md §2.7` (re-request sequence).

---

### Finding F3 — tarball count off-by-one in DESIGN-266 §Concrete changes step 1 (A, mechanical)

**What happened.** DESIGN-266 §Concrete changes step 1 read *"9 tarballs + `index.json` + `checksums.txt` = 11 tracked files to remove"*. Ground truth at HEAD `3e850f3`: `git ls-tree -r 3e850f3 -- dist/packages/ | wc -l` → 10 (8 tarballs + 2 metadata files). Two other sections of the same doc (§Removed-in-PR-body, §File Changes) independently carried the correct "10" count. My `8` ↔ `9` tarball-count authoring error propagated through only some of the doc's count-bearing sentences.

**Pattern.** Authoring-time miscount. The design doc has 4 count-bearing sentences covering the same fact: §Rule changes rippling through all embeddings, §Concrete changes step 1, §Process Cost / Automation Boundary, §File Changes. Three of four held the wrong value after my initial pass; the fourth held the correct value because it was written against `git ls-files` output at authoring time.

**Resolution.** Fixed in commit `9f162dc` — §Concrete changes step 1 corrected. My commit message ("fixes the one remaining mismatch") asserted one site remained; three did. That assertion itself became evidence of F3-bis.

**Surfaces involved.** `DESIGN-266-dist-out-of-git.md` §Concrete changes step 1.

---

### Finding F3-bis — two further count sites + `.gitignore` line-count inaccuracy (A, mechanical)

**What happened.** β's R2 narrowing re-scanned DESIGN-266 at `9f162dc` after I reported F3 fixed. Two sites still carried `9 tarballs` / `11 files` wording:
1. §Rule changes rippling through all embeddings: `currently 9 tarballs + 2 metadata files` → should be `8`
2. §Process Cost / Automation Boundary: `11 files removed from git` → should be `10`

β also flagged an optional A-polish in the same §Process Cost bullet: `1 line added to .gitignore` understated the diff. The actual `.gitignore` edit broadened the existing `dist/bin/` line to `dist/` and added a 2-line comment above — net `+2 lines` with one existing line replaced.

**Pattern.** My R1 F3 fix addressed the site β named. I did not grep the doc for every occurrence of the wrong value AND the corrected value before claiming the fix complete. The `eng/go §2.12` principle ("sibling harnesses are contract surfaces too — grep the repo for non-Go writers of the same JSON shape") names the same rule at a different scale: peer enumeration extends to intra-doc value repetition, not just cross-surface producer/consumer pairs. I loaded the skill; I did not apply its generalization.

**Meta-observation: commit-message claim as evidence.** My commit message for `9f162dc` read *"§File Changes and the PR body §Removed both already stated '10' correctly; this fixes the one remaining mismatch."* The claim "one remaining mismatch" was false (three remaining); β's R2 caught it and filed F3-bis. The commit message was a declarative closure claim at the same level as the doc it fixed, and it carried the same exhaustive-enumeration omission.

**Resolution.** Fixed in commit `43f5a89` — both count sites reconciled, `.gitignore` line-count reworded to *"`.gitignore` rule broadened from `dist/bin/` to `dist/` (+2 lines net, with explanatory comment)"*. Post-fix `grep -nE '9 tarball|11 files|11 tracked|1 line added to' DESIGN-266` → 0 hits; `grep -nE '8 tarball|10 files|10 tracked' DESIGN-266` → 4 consistent hits (lines 88, 117, 187, 218).

**Surfaces involved.** `DESIGN-266-dist-out-of-git.md` §Rule changes rippling through all embeddings, §Process Cost / Automation Boundary. `eng/go §2.12` peer/harness audit principle. `review/SKILL.md §2.1.3` mechanical diff scan + `§2.2.8` authority-surface conflict (β's symmetric close-out identified these).

## Cycle Iteration (CDD §9.1)

### Triggers fired

- [x] **review rounds > 2** (actual: 3). R1 filed F1/F2/F3; R2 narrowing filed F3-bis after incomplete R1 F3 fix; R3 approved.
- [ ] mechanical ratio > 20% — 100% (4/4) but N=4 < 10-finding floor, below the §9.1 automatic-trigger threshold.
- [ ] avoidable tooling / environmental failure — none this cycle. Go 1.24 pin (`da92e44`, prior cycle) and deterministic tarballs (`8265fe0`, #264) were preconditions I relied on; both held.
- [x] **loaded skill failed to prevent a finding** — `eng/go §2.12` was nominally loaded as a Tier 2 generation constraint. Its principle ("sibling harnesses are contract surfaces too — audit every writer of the same shape") covers the F3/F3-bis pattern by generalization, but the skill's stated examples are all cross-surface (Go parser vs shell writer, Go type vs YAML workflow step). I read the skill as Go-parser-vs-non-Go-writer, not intra-doc numeric-repetition. The skill was applied at the scale its examples demonstrate; the authoring failure was outside that scale.

### Friction log (α-side)

1. **Pre-review-gate transient rows written once, not re-validated.** F1 (base SHA) and F2 (CI state) are both "truth at a moment, changes between moments" rows. My R1 pre-review-gate pass captured both at write-time; neither was refreshed before β read. Alpha SKILL §2.7 names the re-request step but does not separate transient from durable gate rows.
2. **First-occurrence fix accepted as complete.** F3 named one site of a 3-site arithmetic drift. My `9f162dc` fix addressed that site and declared closure. F3-bis is the direct consequence of declaring closure without a doc-wide grep for the wrong value and the corrected value. The commit message restated the incomplete claim.
3. **Section-by-section design doc writing worked, but count-reconciliation was missing from the section gates.** The design doc was written section-by-section with post-each-section re-read (per alpha SKILL §2.8 applied to drafting, not just close-out writing). Each section individually was self-consistent. What's missing from that discipline is a cross-section reconciliation step for facts that recur — specifically counts, SHAs, and any named value that can drift independently in each section.

### Root cause (α-side reading)

**Peer-enumeration scope mismatch between loaded skill and observed drift class.** The `eng/go §2.12` rule ("enumerate every writer of the same shape before claiming a schema change safe") was loaded. The rule's scope, as stated and exemplified, is *cross-producer* — Go vs shell vs YAML. The drift class that surfaced (F3 + F3-bis) is *intra-doc repetition* — 4 sentences in one document carrying the same count. These are the same principle at different scales; the skill's examples bias its application toward the larger scale. An authoring pass that held "peer enumeration" in mind would have reached for cross-producer audit (which this PR didn't need — no schema change) and missed the smaller-scale intra-doc enumeration that the PR did need.

**Related failure at R1 fix.** The same scope mismatch struck the commit-message for `9f162dc`: I claimed "one remaining mismatch" because I had confirmed that §File Changes and the PR body §Removed held the correct value, and inferred from those two that the other count-bearing sentences were correct. Inference-from-sample is the exact error peer enumeration exists to prevent at any scale.

### Engineering level (α-side reading, for γ to adjudicate)

- **L5 (local correctness):** met on the diff itself. No code change; 10 file deletions + `.gitignore` edit + `coherence.yml` edit + 2 doc edits. CI green on every review-round head (`b07ca39`, `9f162dc`, `43f5a89`). `go test ./...` clean, `go vet` clean, dispatch-boundary check clean, kata-tier1 + kata-tier2 green locally and in CI.
- **L6 (system-safe execution):** partial miss. Intra-doc arithmetic drift in DESIGN-266 (F3 + F3-bis) reached β review. Three sections of one doc disagreed on the same fact. The drift was caught in R2 narrowing and reconciled on-branch in R3. The miss is real even though the containment was clean — L6's criterion is "cross-surface drift did not reach review", and this reached review.
- **L7 (system-shaping leverage):** achieved on the substantive axis. The cycle shipped an MCA that makes the rebase-race friction class structurally impossible in this repo for future cycles. β's post-release AC3 commits to observing whether the class recurs across the next 3–5 cycles touching `src/packages/`.

Per §9.1 "lowest miss" rule, these combine to **L6 (with an L7 MCA shipped, capped by the L6 intra-doc-drift miss)**. β's close-out reaches the same reading independently.

## What worked

1. **The documented target state reduced the design burden.** `BUILD-AND-DIST.md §Migration steps` already committed to *"`dist/` is build output, never committed"* as step 2 of a planned migration. The MCA decision became "execute step 2 of the already-documented migration" rather than "design a new boundary." §Alternatives Considered still enumerates A/B/C/D/E with per-option rationale because the choice needed to be defended; the choice itself was largely made by the prior design doc. This is the shape of a cheap L7 — the system had already named the boundary; the cycle enforces it.

2. **Section-by-section design-doc drafting surfaced peers before implementation.** Alpha SKILL §2.8 names section-by-section close-out writing as a recoverability discipline; I applied the same pattern to the design doc itself during authoring. Each section was written to file and re-read before moving on. This produced a §Impact Graph that named every consumer/producer of `dist/packages/` before any file was deleted. β's review later cross-checked that table against `grep -rn 'dist/packages'` and found no missed peer. (Distinct from the F3 failure class: §Impact Graph enumerates surfaces; F3 was about repetition of a fact within one surface.)

3. **Local CI replay before first β round.** I replayed `ci.yml`'s `kata-tier2` sequence locally before opening the PR: `go test ./...` + `go vet ./...` + dispatch-boundary check + `scripts/kata/run-all.sh` + full kata-tier2 replay (build → init → setup → lock → restore → kata run --class runtime) + framework surface (kata list / run M0-gap / judge). All green. PR opened as `ready for review`, not draft, with CI-green evidence cited in the PR body. No CI failure surfaced in any of the 3 review-round heads (`b07ca39`, `9f162dc`, `43f5a89`).

4. **β's (a)/(b) framing on F1 enabled a self-consistent choice.** β filed F1 as an honest-record gap with two remediation paths and a recommendation. The (b) path (amend the gate row) matched the PR's thesis (the race class shouldn't require α discipline to close); the (a) path (rebase) would have perpetuated the class for one more cycle. Having both options stated, plus β's rationale, made the choice easy and defensible. (This is β's judgment, noted here because it shaped my α-side work.)

5. **Skill loading was exhaustive up front.** Before implementation I read `CDD.md`, `alpha/SKILL.md`, `cdd/design/SKILL.md`, `eng/go/SKILL.md`, `design/SKILL.md`, `eng/process-economics/SKILL.md`, `cdd/issue/SKILL.md` — in full, not skimmed. Loading skills as "hard generation constraints" (§4.4) meant the design doc's structure (§Problem / §Constraints / §Challenged Assumption / §Impact Graph / §Proposal / §Alternatives / §ACs / §Known Debt / §CDD Trace) was already shaped before the first section was written. No design-shape-after-the-fact retrofit.

## What didn't

1. **Pre-review-gate transient rows.** F1 and F2 are the same class: gate rows I wrote once and did not re-validate before β read them. The `alpha/SKILL.md §2.6` list does not distinguish transient rows (base SHA, CI state, mergeable_state) from durable rows (AC coverage, peer enumeration, known debt). My application treated all rows the same way — write once, declare satisfied.

2. **Closure overclaim on F3 fix.** `eng/go §2.12` was in my active skill set. The skill's examples (shell writers of the same JSON shape, CI workflow emitters of the same schema) biased my reading toward cross-producer audits. I did not generalize the principle to intra-doc numeric repetition before claiming F3 fixed. The commit message for `9f162dc` ("fixes the one remaining mismatch") was the closure overclaim; F3-bis was the direct consequence. My reply to β's R2 review acknowledged this explicitly; this close-out restates it for γ's cycle-iteration read.

3. **Hub memory not re-checked at cycle close.** Per `CDD.md §1.4` γ algorithm Phase 5 step 13, hub memory writes are γ's responsibility at cycle close. α does not own hub memory. Noting here because my last cycle-touch is this close-out commit; γ closes the loop.

## Observations and patterns (α-side)

### 1. Intra-doc value repetition vs cross-surface peer enumeration

The F3 → F3-bis sequence makes one observation cleanly:

**Pattern.** `eng/go §2.12` ("sibling harnesses are contract surfaces too") names peer enumeration at schema-bearing-type scale — a Go type's JSON shape vs all writers of that shape. The skill's examples are Go-parser-vs-non-Go-writer (shell, YAML, templates). Two other scales exist at which the same peer-enumeration rule applies:
- **Intra-doc numeric / value repetition.** One document, multiple sentences carrying the same count or named value. Surfaced in DESIGN-266 (4 count-bearing sentences; 3 of 4 initially wrong). Pattern repeats in any design doc that counts deliverables, lists file counts, or cites the same SHA in multiple sections.
- **Commit-message closure claims.** A commit fixing a finding typically restates the finding's resolution. If the claim is "X is now correct", the same grep-for-every-occurrence rule that applies to the authoring pass applies to the claim itself. My `9f162dc` commit message is the example.

Both scales describe the same rule as `eng/go §2.12`. The skill's text addresses cross-producer scale with examples; the smaller-scale applications are not named.

**Surfaces this pattern touches, if a skill change were to address it.** `eng/go §2.12`, `alpha/SKILL.md §2.3` (peer enumeration), `alpha/SKILL.md §2.6` (pre-review gate — re-validation after mid-cycle patches), `review/SKILL.md §2.1.3` (mechanical diff scan — β-side symmetric catch rule, already in β's close-out).

**Evidence.** Exactly one cycle: this one. N=1 observation against the skill gap.

### 2. Pre-review-gate row durability

**Pattern.** `alpha/SKILL.md §2.6` lists 10 gate rows. Rows 1 (branch rebased) and 10 (CI green) are transient — their truth depends on the state of external systems (main, CI) at the moment they are read, not the moment they are written. The other 8 rows (PR body carries trace, ACs mapped, peer enumeration done, etc.) are durable — once written they stay true unless α changes the artifact.

F1 and F2 both surfaced because I wrote the transient rows at PR-open time and did not refresh them before β read the PR at a later moment. The gap between "write" and "read" is a window during which external state can change.

**Surfaces this pattern touches.** `alpha/SKILL.md §2.6` (gate row list structure), `alpha/SKILL.md §2.7` (re-request review sequence — a re-tick step could address it).

**Evidence.** Two findings (F1, F2) in one cycle, both mechanical, both the same class.

### 3. β-filed candidate MCAs reduce α selection cost

**Pattern.** Issue #266 named three candidate MCAs (A/B/C) up front, with per-option preliminary pros/cons, with an explicit "Not committing to a choice — filing for CDD triage" note. As α I expanded to A/B/C/D/E and defended the choice of A; but the core trade-off space was already mapped. The alternatives-considered table in DESIGN-266 is mostly β's framing, lightly augmented.

**Observation.** When β files a gap issue with candidate MCAs and rationale, the α side of the next cycle spends less time mapping the trade-off space and more time on the chosen MCA's implementation detail. The cost paid is β's authoring time in the close-out; the benefit is α's faster convergence on scope in the next cycle.

**Surfaces this pattern touches.** `issue/SKILL.md §2.3` (scope and non-goals), `cdd/design/SKILL.md §2.3` (impact graph before closure), β-side close-out conventions. Not an α-side skill change; noting because the hand-off is why this cycle's design was cheap.

**Evidence.** One cycle (#266 ← #262 close-out). Observation of pattern, not claim of generality.

### 4. Shared-identity review surface

**Pattern.** β's close-out notes that all three review rounds posted as `COMMENT` events (not `APPROVE` / `REQUEST_CHANGES`) because β token and α token share the same GitHub account. The `pull_request_review_write` call with `event=COMMENT` is what the tool exposes. My reply comments used `add_issue_comment` (PR-conversation thread) rather than `add_reply_to_pull_request_comment` (per-thread review-comment reply) because β's reviews were top-level review bodies with inline tables, not per-line comments.

**Observation.** The review protocol degraded gracefully. β's verdict was inline at the top of each review body; my replies carried "F1/F2/F3 resolved at commit X" summaries. Findings converged in 3 rounds; no verdict-signaling ambiguity. The surface-degradation cost is a documentation-discipline cost (verdict stated in text, not by event), not a correctness cost for this cycle.

**Evidence.** One cycle. β's close-out tracks this across #260 / #265 / #267 and notes issue #45 as the migration-queue item.

---

Signed: α (`alpha@cdd.cnos`) · 2026-04-24 · merge commit `a05af27` · β close-out `.cdd/unreleased/beta/267.md` · cycle level per §9.1: L6 (L7 near-miss; L7 MCA shipped, capped by intra-doc-drift miss).
