---
cycle: 379
type: alpha-closeout
date: "2026-05-19"
author: alpha@cdd.cnos
---

# α Close-out — #379

## Summary

Created `src/packages/cnos.core/skills/agent/activate/SKILL.md` (485 lines) as the canonical agent-activation skill (Kernel → CA skills → Persona → Operator → hub state → identity confirmation; three-tier body-capability matrix; paste-testable README router template; cdd/activation disambiguation). Evolved `src/go/internal/activate/activate.go` so `writePrompt` iterates a `readFirst []readFirstItem` slice parsed from the skill's §4.1 marker-bounded block by `loadActivateSkillOrdering` / `parseReadFirstOrderBlock`; the prior in-Go ordering literals are gone. Extended `activate_test.go` with `TestSkillIsSourceOfTruthForReadFirstOrder` (two-phase edit-then-swap with `out1 != out2` coherence assertion), `TestSkillFallback_NotVendored`, and parser unit tests; two pre-existing tests were updated to the new canonical ordering. R1 APPROVED with zero findings at any severity. Merge at `a3bf7892` on `main`.

## Implementation observations

- **AC7 source-of-truth test written in the strong form on first pass.** The cycle's "everything is a skill" claim hinges on this test being content-driven, not file-exists. γ scaffold failure-mode 6 named the weaker-shape risk explicitly. The shape that shipped — phase 1 vendors a fixture skill with `kernel` before `persona` and asserts the order in renderer output; phase 2 swaps the two and asserts the swap propagates plus `out1 != out2` — is the form the issue body literally describes. No β nudge required to upgrade it from a weaker oracle.
- **SKILL.md authored section-by-section with HTML-comment manifest.** 485 lines, eleven commits during authoring. Per `CDD.md` §1.4 large-file authoring rule; no stream-timeout discard observed across the eleven incremental commits. The manifest header (`section-manifest: planned: [...] completed: [...]`) doubled as resumption state — if a commit had failed mid-section, the manifest would have named the next section to start from.
- **Self-coherence.md authored section-by-section per α/SKILL.md §2.5.** Five commits (§Gap; §Skills; §ACs; §Self-check + §Debt + §CDD Trace; §Review-readiness). Each section pushed to `origin/cycle/379` before starting the next.
- **Renderer fallback (`canonicalReadFirstOrdering`) duplicates the skill's §4.1 ordering as in-Go constants.** Surfaced as `self-coherence.md` §Debt 3. Today's mitigation is structural (skill preferred whenever vendored, fallback only when bundle absent, fallback path tested, §4.3 names the skill canonical on drift). The durable fix is `//go:embed`-ing the skill into the binary so the renderer carries the canonical source rather than a transcription of it; deferred to a future cycle.
- **Observable-output delta in `cn activate` `## Read first` ordering.** Persona/operator/kernel → kernel/CA-skills/persona/operator/hub-state/identity. Intended consequence of AC3 + AC7. Surfaced as §Debt 2 with the impact split named: consumers parsing by section header (`## Read first`, `## Kernel`, …) are unaffected; consumers string-matching within `## Read first` see different content. Two pre-existing tests (`TestReadFirstSection_OrderedSigma`, `TestReadFirstSection_InitOnlyOrdered`) were updated to the new canonical order — appropriate, not silent.
- **Interpolation surface made explicit in the skill.** SKILL.md §4.2 names the token → hub-state-field mapping (e.g. `{hub_persona_path}`, `{hub_latest_reflection}`) one-to-one with `renderReadFirstLine`'s switch cases. Implementation guidance from the issue body (avoid implicit substitution that drifts) shipped as a section, not just as code.

## Friction log

- **Worktree identity inheritance from γ scaffold session.** The cycle worktree's `.git/config.worktree` carried γ's `gamma@cdd.cnos` from the scaffold session start; the first three α commits inherited it before α-side inspection caught the drift. α/SKILL.md §2.6 row 14 path (a) was exercised: `git config --worktree user.email "alpha@cdd.cnos" && git rebase ad9c03f9 --exec 'git commit --amend --reset-author --no-edit' && git push --force-with-lease origin cycle/379` rewrote the six α commits with the canonical alpha email; γ's scaffold commit at `ad9c03f9` was the rebase base and was not amended, preserving γ's authorship. Same root failure mode as cycle #287 R1 F3 (session-start git config drift surviving the pre-review-gate); the row-14 executable check authored in #287 was the surface that caught it here in time. β observed an identical worktree-local config leak on its session start (worktree shared with α) and recovered via β/SKILL.md row-1 worktree-scope re-assertion.
- **Pre-existing tests updated, not duplicated.** Two `TestReadFirstSection_*` tests asserted the prior persona/operator/kernel ordering. The temptation was to add new assertions for the new ordering and leave the old ones for some "fallback" or "compatibility" case — but the prior ordering was hardcoded, not contract; once the skill is the source of truth, there is no "prior" anymore, only a stale assertion. Updated in place rather than duplicated. β confirmed the update was the right call (review N3).
- **γ scaffold failure-mode catalogue as α-side checklist.** Ten failure modes pre-flagged by γ in `gamma-scaffold.md` (file-read oracle masquerading as source-of-truth; missing tier (a)-preferred labeling; cdd/activation path typo; CLI surface drift; etc.). Read by α before authoring as a constraint list, not just by β after the fact. Each was held during authoring; β cross-checked the same ten at review. Pattern surfaced as observation 1 below — pre-flagged failure modes that are visible to α at authoring time get held more cheaply than the same failure modes discovered only at review.

## Patterns observed

1. **γ-side pre-flagged failure modes shift authoring posture, not just review posture.** When γ's scaffold names ten ways the cycle could fail-quietly (e.g. file-read oracle, path typos, surface-containment slippage), α reads the list as constraints to author against, not as a β-side checklist. This cycle's round count was 1 with zero findings; the contributing factors were γ scaffolding (specific failure-mode list, peer enumeration, AC posture), α/SKILL.md §2.5 incremental authoring discipline, and the issue body's explicit AC7 source-of-truth test specification. Pattern: pre-flagged failure modes are a forcing function on α-side authoring, not just on β-side judgment.
2. **Single-knob procedure-in-code → skill-as-source-of-truth migrations stay narrow.** Activation was the one cnos procedure still living in Go literals; the migration touched two files (`activate.go`, `activate_test.go`) plus the new skill. No call-site fan-out beyond `writePrompt` because the canonical ordering was already concentrated in a single function. Pattern: when the "everything is a skill" invariant has exactly one violator in a module, the restoration diff stays roughly the size of the violator plus the new skill, not bigger. The cycle's surface containment (five files total) reflects that geometry.
3. **In-Go fallback duplication is the price of preserving manifest-only behavior across a `cn deps restore`-required boundary.** `cn activate` must remain useful before `cn deps restore` (i.e. before any `cnos.core` packages are vendored). That forces a fallback path inside the binary. The fallback necessarily transcribes some content from the skill — here, the §4.1 ordering — and that transcription is a peer of the skill, governed by the rule that the skill is canonical on drift. Pattern: cross-boundary single-source-of-truth claims always carry a "but the runtime needs an in-binary fallback for the boundary case" debt item; the durable retire is compile-time embedding (`//go:embed` in Go's case), not source-time discipline.
4. **§4.1 marker-bounded numbered-list schema is parseable, forward-compatible, and human-editable.** `parseReadFirstOrderBlock` is line-oriented, accepts both em-dash (U+2014) and ASCII `--` separators, requires a digit prefix to skip prose lines, and emits `(unknown token: X)` plus continue for unknown tokens. Pattern: when a markdown artifact has to be both human-readable doctrine and machine-readable input, a marker-bounded numbered list (`<!-- read-first-order:begin -->` … `<!-- read-first-order:end -->`) gives both surfaces without coupling parse failure to renderer panic; the parser stays small (~35 LOC) and the schema can absorb new tokens at the rendering layer without re-versioning the markers.

## CDD Trace evidence

- §Gap: `.cdd/unreleased/379/self-coherence.md` §Gap.
- γ scaffold: `.cdd/unreleased/379/gamma-scaffold.md` (commit `ad9c03f9`).
- Implementation commits: `fb306d1b` (SKILL.md frontmatter + Define), `9f8965b7` (SKILL.md §2.1 + §2.2), `04700240` (SKILL.md §2.3 + §2.4), `22bba0f4` (SKILL.md §3 + §4 + §5–§8), `15ea6bfd` (activate.go renderer evolution), `cae34bd2` (activate_test.go source-of-truth + fallback + parser tests). All authored as `alpha@cdd.cnos` after the row-14 path (a) rebase.
- Self-coherence commits: `67900223` (§Gap), `44027d28` (§Skills), `0716027b` (§ACs), `7a9d1bd5` (§Self-check + §Debt + §CDD Trace), `e78aa982` (§Review-readiness — ready for β).
- Pre-review gate evidence: `self-coherence.md` §Review-readiness rows 1–14.
- β R1 verdict: APPROVED at `e3b925db` — zero findings at any severity, single review round, no fix-round triggered.
- Merge: `a3bf7892` (`Closes #379`).
- β close-out: `132e0003` (β post-merge close-out).

No undeclared debt. The five items in `self-coherence.md` §Debt (router not yet adopted in any hub; observable-output delta in `cn activate` `## Read first`; renderer fallback duplicates §4.1; no `cn doctor` enforcement of activation-invariants; `cnos.xyz/activate/<hub>` deferred) are all named in the issue body's Scope / Non-goals section as deferred follow-ons. β agreed with α's framing on all five and added no debt items of its own (β close-out §Release notes for γ / δ).
