Development record
abcd launch --dry-run (and ship) in a NON-plugin-payload repo dies with a raw 'include config not found: .abcd/config/launch-payload.json' (LoadIncludes preflight in internal/core/launch/includes.go), giving the operator no idea WHY. launch preview/ship is a plugin-payload-repo feature (it needs launch-payload.json, and ship additionally needs .claude-plugin/plugin.json); a repo that ships no plugin bundle legitimately has neither and should be told so, not handed a missing-file error. Fix (loud-staging/legibility): when the launch config is absent AND the repo is not a plugin-payload repo, the dry-run should explain 'launch preview/ship applies to plugin-payload repos; this repo's release path is launch scaffold + the CHANGELOG roll + auto-release' rather than reporting a raw missing include config. Surfaced from a Testimony (non-plugin repo) onboarding session.
abcd launch --dry-run (and ship) in a NON-plugin-payload repo dies with a raw 'include config not found: .abcd/config/launch-payload.json' (LoadIncludes preflight in internal/core/launch/includes.go), giving the operator no idea WHY. launch preview/ship is a plugin-payload-repo feature (it needs launch-payload.json, and ship additionally needs .claude-plugin/plugin.json); a repo that ships no plugin bundle legitimately has neither and should be told so, not handed a missing-file error. Fix (loud-staging/legibility): when the launch config is absent AND the repo is not a plugin-payload repo, the dry-run should explain 'launch preview/ship applies to plugin-payload repos; this repo's release path is launch scaffold + the CHANGELOG roll + auto-release' rather than reporting a raw missing include config. Surfaced from a Testimony (non-plugin repo) onboarding session.
Corroboration (2026-09-10, autonomous-run field experiment in managed repositories). Reproduced twice more, and in one case it blocked the task outright rather than merely confusing the operator.
First reproduction: an operator ran the bare verb and was sent down a two-step
dead end. abcd launch answered "pass --dry-run to preview the bundle
(publishing is not wired at this stage)", advertising a flag without checking
whether this repo can run it; abcd launch --dry-run then answered "include
config not found: .abcd/config/launch-payload.json" and stopped. Neither message
says the thing the operator needs: this repository does not use abcd launch,
its releases are cut by a changelog-driven workflow, and the correct move is to
roll a dated heading and merge. The repo is not misconfigured — abcd launch scaffold exists precisely to install that changelog-driven gate, and this repo
has one and it works — so the tool routed an operator away from the mechanism
its own sibling verb installed.
Second reproduction: a session could not run the release preview at all, on a
repository that had already cut releases through abcd (0.3.1 and 0.4.0 headings
stand in its CHANGELOG). Nothing in --help, abcd lint or abcd ahoy names
the missing include file or says how to create one, and launch scaffold
documents only the workflows and the runbook. The preview was abandoned.
Two remedies beyond the one already recorded here. Have the bare invocation detect a changelog-driven gate and name it, rather than advertising a flag that cannot run. And consider whether the dry run needs a payload include at all — the gates and the changelog composer do not — in which case the preview should run without one.
Grounds
- pursued: an operator in a non-plugin repository reads why the preview does not apply and where their releases come from; a preview there that still ends in the raw 'include config not found' would show it wrong.
Correction, 2026-09-29
The resolution was true when it was written, and one of the two tests it names
is not in the tree. 950218be8 ("feat(launch): read the declared artefact kind
in every launch verb") made the dry run refuse a repository that declares no
artefact kind, naming .abcd/config/artefact.json and the kinds it accepts, so
the release-path message this record added applies to a repository that
declares the plugin kind and has no launch payload. The same commit replaced
TestLaunchDryRunInANonPayloadRepoNamesTheReleasePath with
TestLaunchDryRunInANonPayloadPluginNamesTheReleasePath (this record's case)
and TestLaunchDryRunWithNoDeclarationNamesItsHome (the undeclared case), both
in internal/surface/cli/launch_nopayload_test.go. TestMissingPayloadConfigIsNamed
still stands.
Frontmatter
| id | iss-2608270559313719 |
|---|---|
| type | issue |
| lifecycle | resolved |
| severity | minor |
.abcd/work/issues/resolved/iss-2608270559313719-abcd-launch-dry-run-and-ship-in-a-non.md
open on GitHub ↗ · commit history ↗
mentions4
- at-every-refusal-emit-what-the-tool-knowsAt every refusal, emit what the tool knows
- dcn-26092300000000122026-09-23 — "At every refusal, emit what the tool knows" is a principle (product thinker, ruling on iss-2609100509531349, grading the claim that record from the 2026-09-09/10 field run made): a refusal names the allowed values, the value it had, and the condition it checked. It lives at principles/at-every-refusal-emit-what-the-tool-knows.md. Five open records are breaches of it (iss-2608290810037524, iss-2609100506265392, iss-2608270559313719, iss-2609100508570527, iss-2609100508566033), and the record that proposed it is resolved by the promotion.
- iss-2609100506255436Sharpens iss-2608270559313719, which reports that abcd's release flow cannot serve a managed repo that is not a plugin. That record lists the symptoms; this one names the single line that causes most of them, and shows that abcd already solved the neighbouring problem, so the fix has a precedent inside the same file.
- iss-2609100509531349The record verbs are sound; the failures were all at the edges, where the tool knows something and does not say it.