Development record
abcd-launch-cannot-set-up-the-release-flow-for-a-managed-rep
Summary
The design record for itd-2609150819432059, written from the nine decisions the
product thinker settled on 2026-09-20 (the intent's ## Decisions section).
Every choice below traces to one of them.
Scope
- The artefact declaration (decision 1, 2, 9): a new
.abcd/config/artefact.jsonwithkind(one ofplugin,binary,application),lockstep(a list of repo-relative files held in lockstep with theversion-location.jsonprimary), andsite(a boolean this spec reads but does not act on). The file is validated by one reader ininternal/core/launchthat every launch verb andahoyshare; an unknown kind or an unreadable lockstep path is a named refusal. - The ahoy gap (decision 3): a managed repository (marker block fired)
whose artefact file is absent raises a required, resolvable
artefact.missinggap;ahoy installprompts for the kind and writes the file. A plugin repository (a.claude-plugin/plugin.jsonpresent) takeskind: pluginwithout a prompt so the shipped shape adopts silently. - Lockstep by declaration (decision 2):
CheckLockstepreads the primary as today and the declared list in place of the pinned plugin-manifest table when the kind is notplugin; the plugin table stays forkind: plugin. - The kind-shaped scaffold (decisions 4, 5, 6, 7):
launch scaffoldlays, for a non-plugin kind,CHANGELOG.mdwith only the empty[Unreleased]anchor when absent, and.github/workflows/abcd-release-gate.yml: the verify, derive, changelog-ingest, receipt and tag steps abcd's ownrelease.ymltemplate carries, plus one named empty jobbuildwith a comment naming the output directory the publish step reads. An existing release workflow is never opened; the scaffold report names it as left alone and prints theworkflow_callstanza to add. All scaffolded files are drift-checked exactly as the plugin scaffold's are (--confirm). - The preview and the cut for a non-plugin kind (decision 8): with no
payload include config the bundle is the tree the release tag would
archive (
git archive's view of HEAD) with the record namespace denied by the sameDenyNamespaces; the identity scan runs over it; the report states which tree was scanned. The changelog derivation, the version derivation,GuardFindingsand the deferral read are unchanged and run for every kind.
Out of scope
The deferral write path (iss-2609181223260994); the build and publish
steps themselves (the repository's, in the empty job or its own workflow);
the site (itd-2609061543533170 builds on the site flag); a repository
that ships several artefacts.
Approach
Test-first, one lane per numbered piece above, in that order; pieces 1 and 2
land first because everything else reads the file. The scaffold template
for the gate workflow is derived from the plugin template by subtraction,
held to it by the existing scaffold parity test so a fix to the gate reaches
both. The Gropius repository's own release is the acceptance rehearsal: its
next cut runs through launch --dry-run and launch ship with the gate
enforced by the binary rather than by a session reading the ledger.
How the criteria are satisfied
Criteria 1 and 9 by the shared reader and the ahoy gap (pieces 1, 2); 2 by piece 3; 3, 4 and 5 by piece 4; 6 and 7 by the unchanged guard now reachable (piece 5); 8 by piece 5's archived-tree bundle.
Frontmatter
| id | spc-2609202019026366 |
|---|---|
| type | spec |
| lifecycle | closed |
.abcd/development/specs/closed/spc-2609202019026366-abcd-launch-cannot-set-up-the-release.md
open on GitHub ↗ · commit history ↗
References1
- itd-2609150819432059A managed repository that is not a plugin gets the same release gateimplements
mentions2
- iss-2609181223260994No verb writes the deferral keys a release cut reads. The principle pre-existing-is-not-a-defence names deferred_after and deferral_reason as the one sanctioned way past the release-cut guard for an open major or critical record, and changelog.GuardFindings reads them, but no capture sub-verb writes them: the ledger verbs are disposition, list, mentions, promote, resolve and wontfix, so a deferral is a hand edit of frontmatter that bypasses the validators every other transition carries (the anchor tag's shape, the reason's presence, the record being open and major). Relayed from the Gropius managed-repo session gropiusllm-56 on 2026-09-18 at v0.9.0, which wrote the two keys into six records by script in one day, across three release cuts. Wanted: abcd capture defer <iss-N> --after vX.Y.Z --reason "…", refusing a record that is not open, a tag that is not the current anchor, and an empty reason, and reporting the deferral in the same envelope shape as resolve. Note the gate that reads the keys lives in the launch verbs, which that repository cannot run (iss-2609061432214212), so the write path and the read path are missing together there; this record is the write half.
- itd-2609061543533170One verb takes a managed repository's site from the checkout to a live address