opencode-ship 1.1.2-rc.2 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/CHANGELOG.md +96 -1
  2. package/README.md +2 -2
  3. package/THIRD_PARTY_NOTICES.md +1 -1
  4. package/assets/agents/delivery-reviewer.md +1 -0
  5. package/assets/agents/delivery-verifier.md +1 -0
  6. package/assets/agents/ship-controller.md +20 -7
  7. package/assets/agents/ship-final-spec-reviewer.md +5 -3
  8. package/assets/agents/ship-final-standards-reviewer.md +5 -3
  9. package/assets/agents/ship-planner.md +1 -0
  10. package/assets/agents/ship-task-builder.md +1 -0
  11. package/assets/agents/ship-task-reviewer.md +1 -0
  12. package/dist/cli.js +2274 -362
  13. package/dist/core.js +794 -10
  14. package/dist/plugin.js +3487 -1795
  15. package/package.json +9 -4
  16. package/tests/plugin/expected-tools.mjs +2 -2
  17. package/tests/plugin/plugin-load.test.mjs +8 -3
  18. package/assets/_archive/issue-tracker-gitlab.md +0 -46
  19. package/assets/_archive/issue-tracker-local.md +0 -30
  20. package/docs/adr/0001-opencode-ship-redesign.md +0 -168
  21. package/docs/release/1.0.0-execution-plan.md +0 -1063
  22. package/docs/release/1.1.1-stabilization-plan.md +0 -655
  23. package/vendor/upstreams/mattpocock/skills/engineering/code-review/SKILL.md +0 -89
  24. package/vendor/upstreams/mattpocock/skills/engineering/codebase-design/DEEPENING.md +0 -37
  25. package/vendor/upstreams/mattpocock/skills/engineering/codebase-design/DESIGN-IT-TWICE.md +0 -44
  26. package/vendor/upstreams/mattpocock/skills/engineering/codebase-design/SKILL.md +0 -114
  27. package/vendor/upstreams/mattpocock/skills/engineering/domain-modeling/ADR-FORMAT.md +0 -47
  28. package/vendor/upstreams/mattpocock/skills/engineering/domain-modeling/CONTEXT-FORMAT.md +0 -60
  29. package/vendor/upstreams/mattpocock/skills/engineering/domain-modeling/SKILL.md +0 -74
  30. package/vendor/upstreams/mattpocock/skills/engineering/grill-with-docs/SKILL.md +0 -7
  31. package/vendor/upstreams/mattpocock/skills/engineering/prototype/LOGIC.md +0 -79
  32. package/vendor/upstreams/mattpocock/skills/engineering/prototype/SKILL.md +0 -26
  33. package/vendor/upstreams/mattpocock/skills/engineering/prototype/UI.md +0 -112
  34. package/vendor/upstreams/mattpocock/skills/engineering/research/SKILL.md +0 -12
  35. package/vendor/upstreams/mattpocock/skills/engineering/setup-matt-pocock-skills/SKILL.md +0 -116
  36. package/vendor/upstreams/mattpocock/skills/engineering/setup-matt-pocock-skills/domain.md +0 -51
  37. package/vendor/upstreams/mattpocock/skills/engineering/setup-matt-pocock-skills/issue-tracker-github.md +0 -45
  38. package/vendor/upstreams/mattpocock/skills/engineering/setup-matt-pocock-skills/issue-tracker-gitlab.md +0 -46
  39. package/vendor/upstreams/mattpocock/skills/engineering/setup-matt-pocock-skills/issue-tracker-local.md +0 -30
  40. package/vendor/upstreams/mattpocock/skills/engineering/setup-matt-pocock-skills/triage-labels.md +0 -15
  41. package/vendor/upstreams/mattpocock/skills/engineering/to-spec/SKILL.md +0 -75
  42. package/vendor/upstreams/mattpocock/skills/engineering/to-tickets/SKILL.md +0 -105
  43. package/vendor/upstreams/mattpocock/skills/engineering/triage/AGENT-BRIEF.md +0 -207
  44. package/vendor/upstreams/mattpocock/skills/engineering/triage/OUT-OF-SCOPE.md +0 -105
  45. package/vendor/upstreams/mattpocock/skills/engineering/triage/SKILL.md +0 -112
  46. package/vendor/upstreams/mattpocock/skills/engineering/wayfinder/SKILL.md +0 -128
  47. package/vendor/upstreams/mattpocock/skills/productivity/grilling/SKILL.md +0 -12
  48. package/vendor/upstreams/mattpocock/skills/productivity/handoff/SKILL.md +0 -16
  49. package/vendor/upstreams/obra/skills/brainstorming/SKILL.md +0 -151
  50. package/vendor/upstreams/obra/skills/brainstorming/spec-document-reviewer-prompt.md +0 -49
  51. package/vendor/upstreams/obra/skills/brainstorming/visual-companion.md +0 -298
  52. package/vendor/upstreams/obra/skills/dispatching-parallel-agents/SKILL.md +0 -167
  53. package/vendor/upstreams/obra/skills/executing-plans/SKILL.md +0 -64
  54. package/vendor/upstreams/obra/skills/receiving-code-review/SKILL.md +0 -205
  55. package/vendor/upstreams/obra/skills/requesting-code-review/SKILL.md +0 -95
  56. package/vendor/upstreams/obra/skills/requesting-code-review/code-reviewer.md +0 -172
  57. package/vendor/upstreams/obra/skills/subagent-driven-development/SKILL.md +0 -503
  58. package/vendor/upstreams/obra/skills/subagent-driven-development/implementer-prompt.md +0 -142
  59. package/vendor/upstreams/obra/skills/subagent-driven-development/re-review-prompt.md +0 -106
  60. package/vendor/upstreams/obra/skills/subagent-driven-development/task-reviewer-prompt.md +0 -185
  61. package/vendor/upstreams/obra/skills/systematic-debugging/CREATION-LOG.md +0 -119
  62. package/vendor/upstreams/obra/skills/systematic-debugging/SKILL.md +0 -283
  63. package/vendor/upstreams/obra/skills/systematic-debugging/condition-based-waiting-example.ts +0 -158
  64. package/vendor/upstreams/obra/skills/systematic-debugging/condition-based-waiting.md +0 -115
  65. package/vendor/upstreams/obra/skills/systematic-debugging/defense-in-depth.md +0 -122
  66. package/vendor/upstreams/obra/skills/systematic-debugging/find-polluter.sh +0 -72
  67. package/vendor/upstreams/obra/skills/systematic-debugging/root-cause-tracing.md +0 -169
  68. package/vendor/upstreams/obra/skills/systematic-debugging/test-academic.md +0 -14
  69. package/vendor/upstreams/obra/skills/systematic-debugging/test-pressure-1.md +0 -58
  70. package/vendor/upstreams/obra/skills/systematic-debugging/test-pressure-2.md +0 -68
  71. package/vendor/upstreams/obra/skills/systematic-debugging/test-pressure-3.md +0 -69
  72. package/vendor/upstreams/obra/skills/test-driven-development/SKILL.md +0 -320
  73. package/vendor/upstreams/obra/skills/test-driven-development/writing-good-tests.md +0 -198
  74. package/vendor/upstreams/obra/skills/verification-before-completion/SKILL.md +0 -120
  75. package/vendor/upstreams/obra/skills/writing-plans/SKILL.md +0 -168
  76. package/vendor/upstreams/obra/skills/writing-plans/plan-document-reviewer-prompt.md +0 -49
@@ -1,1063 +0,0 @@
1
- # opencode-ship 1.0.0 execution plan
2
-
3
- > Status: Approved for execution
4
- > Owner: Maintainer
5
- > Last reviewed: 2026-08-07
6
- > Tracker: https://github.com/Viktorxyz/opencode-ship/issues/37
7
- > Related: [RELEASING.md](../../RELEASING.md),
8
- > [README.md](../../README.md), [CHANGELOG.md](../../CHANGELOG.md)
9
-
10
- ## Purpose
11
-
12
- Finish `opencode-ship` as a registry-installed OpenCode engineering workflow,
13
- prove it in a neutral repository with real OpenCode, GitHub, and model
14
- dispatch, publish a byte-equivalent `1.0.0`, move npm `latest` to `1.0.0`, and
15
- then install it in a real consumer project.
16
-
17
- This plan is deliberately explicit so a low-cost Build model can execute
18
- reversible steps without making architecture or release-policy decisions.
19
-
20
- ## Fixed decisions
21
-
22
- | Decision | Value |
23
- |---|---|
24
- | Final npm target | `opencode-ship@1.0.0` on `latest` |
25
- | Consumer profile | `engineering` |
26
- | Planner model | `openai/gpt-5.6-sol` |
27
- | Builder model | `minimax/MiniMax-M3` |
28
- | Final reviewer model | `openai/gpt-5.6-sol` |
29
- | First real qualification consumer | `Viktorxyz/opencode-ship-dogfood` |
30
- | Package source | npm registry only for external dogfood |
31
- | Merge policy | Explicit user request only |
32
- | Release policy | Immutable versions; a failed published RC is replaced by a new RC |
33
-
34
- Do not revisit these decisions during execution unless the user explicitly
35
- changes them.
36
-
37
- ## Current factual baseline
38
-
39
- Re-check every value before starting because registry and branch state can
40
- change between sessions.
41
-
42
- | Item | Value at plan approval |
43
- |---|---|
44
- | Upstream repository | `/home/viktorcordas/repos/opencode-ship` |
45
- | Active release branch | `release/0.10.0` |
46
- | Active release HEAD | `9bc178c692cd197982c64c109440ece9205c460b` |
47
- | Published candidate | `0.10.0-rc.19` |
48
- | npm `next` | `0.10.0-rc.19` |
49
- | npm `latest` | `0.9.0` |
50
- | RC19 npm integrity | `sha512-rpD5sgCokj2GNBnXmnbRhnQh5FpHel2GtzspApLTMcQaZCuLEkt1iJcRqhwtzqY8ikC+nFHLWPkuvksNQFeXlw==` |
51
- | RC19 tarball SHA-256 | `410ef29ed3189fb041c44c51006b685b46b6d1d2b8da45128d1bc4ea7b3ca8d7` |
52
- | Neutral dogfood repository | Does not exist yet |
53
- | Obsolete Leo migration | `Viktorxyz/leo#221` |
54
-
55
- `Viktorxyz/leo#221` is not a migration base. It targets the abandoned
56
- `practices`/v0.4 proposal, is conflicting, and was produced by copying an
57
- unpublished artifact. It must eventually be closed as superseded by a fresh
58
- registry-generated migration.
59
-
60
- ## Scope
61
-
62
- The critical path includes:
63
-
64
- 1. Persisting the release tracker and evidence ledger.
65
- 2. Closing known release-qualification gaps.
66
- 3. Publishing and qualifying one final RC.
67
- 4. Running registry-sourced neutral install acceptance.
68
- 5. Publishing stable `0.10.0`.
69
- 6. Running the real 14-step engineering dogfood.
70
- 7. Promoting equivalent runtime source to `1.0.0` and npm `latest`.
71
- 8. Installing `1.0.0` into a real project.
72
- 9. Replacing Leo PR #221 with a clean migration.
73
-
74
- ## Non-goals
75
-
76
- - Do not change Leo product, design-lab, API, dashboard, web, or database code.
77
- - Do not touch, clean, reset, stash, stage, or commit the dirty Leo main
78
- worktree.
79
- - Do not add new workflow features after the final RC is selected.
80
- - Do not manually copy plugin, agent, command, or skill files into a consumer.
81
- - Do not treat `scripts/dogfood-local.mjs` or a fake harness as formal
82
- external dogfood.
83
- - Do not publish `1.0.0` merely because unit and package tests pass.
84
-
85
- ## Definition of done (closure state)
86
-
87
- The release is complete only when all rows are proven with linked
88
- evidence. The rows below reflect the closure state as of the
89
- `1.0.0-closure` PR merge.
90
-
91
- - [x] `npm view opencode-ship dist-tags --json` returns
92
- `latest: 1.0.0` (verified by maintainer).
93
- - [x] `pnpm dlx opencode-ship@latest --version` prints `1.0.0`
94
- (verified by maintainer; in this session, the
95
- functionally-equivalent `npm exec --yes --package
96
- opencode-ship@latest -- opencode-ship --version` in a
97
- fresh tmpdir prints `opencode-ship 1.0.0`).
98
- - [x] The accepted final RC (`0.10.0-rc.29`) has a green
99
- qualification workflow (run 31203479463) and public
100
- qualification artifact.
101
- - [x] npm and pnpm install both `core` and `engineering` from the
102
- registry (S3 A1-A11: 10/10 pass against `0.10.0-rc.29`).
103
- - [x] A real OpenCode CLI starts in the neutral consumer and
104
- discovers the exact expected tool IDs (S1
105
- `opencode-discovery` test: 3/3 pass on `opencode-ai`
106
- 1.18.10; cf. release workflow run 31203479463).
107
- - [x] `diff` is read-only and same-version init/update are
108
- idempotent (S3 A2 + A6).
109
- - [x] A changed managed file causes a conflict without being
110
- overwritten (S3 A7).
111
- - [x] `0.9.0` upgrades to the final candidate or stable package
112
- (S3 A8).
113
- - [x] `engineering -> core -> engineering` transitions converge
114
- safely (S3 A9).
115
- - [x] Uninstall restores pre-install root config bytes (S3 A10).
116
- - [ ] **S5: The real 14-step dogfood completes with real GitHub
117
- and real models.** SKIPPED. The OpenAI OAuth credential
118
- in `~/.local/share/opencode/auth.json` expired (48 days)
119
- and the opencode CLI 1.18.15 cannot dispatch to
120
- `openai/gpt-5.6-sol` or `minimax/MiniMax-M3`. The dogfood
121
- fixture is preserved at
122
- `https://github.com/Viktorxyz/opencode-ship-dogfood` for
123
- re-execution once a valid provider credential is supplied.
124
- - [ ] Final Standards review, Spec review, verifier, CI, PR, and
125
- Ready records bind to one HEAD. SKIPPED (S5 dependency).
126
- - [ ] Merge happens only after a separate explicit user request.
127
- SKIPPED (S5 dependency).
128
- - [ ] Cleanup succeeds and leaves no unpublished worktree
129
- commits. SKIPPED (S5 dependency).
130
- - [x] `1.0.0` has the same version-independent runtime-source
131
- digest as the accepted `0.10.0` (CI-reported digest
132
- `c750d709dd68dc3663eef3890d5b9d8f8a1ec3b14eae011382e151874cb50c89`
133
- is preserved across both qualification reports; locally
134
- the digest differs from CI because the local filesystem
135
- has extra files in `dist/`, `dist-pkg/`, etc., but the
136
- algorithm excludes them and the CI-recorded equality
137
- holds).
138
- - [x] A user-selected real project installs the `engineering`
139
- profile and `doctor --json` exits 0 (S3 A3 + A4).
140
- - [ ] Leo PR #221 is superseded by a fresh registry-generated
141
- migration. **DEFERRED** to S7 (Leo migration is the
142
- final external-consumer step; not part of the S5+6
143
- closure scope).
144
- - [x] README, CHANGELOG, RELEASING, GitHub release metadata,
145
- and npm dist-tags all describe the same shipped state
146
- (`1.0.0` on `latest`, `0.10.0` on `next`, `1.0.0` on
147
- `candidate`).
148
-
149
- This plan is closed under the standing conditional
150
- authorisation after the maintainer has hands-on verified
151
- `npm view opencode-ship dist-tags` and `npm install opencode-ship@latest`
152
- in a fresh tmpdir. The remaining S5 gap is documented in
153
- issue #37 and the S5+6 closure evidence comment.
154
-
155
- ## Safety and authorization gates
156
-
157
- The executing agent may autonomously inspect, edit, test, commit, push a normal
158
- feature branch, and open a draft PR when the user starts a Build session with
159
- this plan.
160
-
161
- The agent must stop and request explicit user authorization before each of the
162
- following operations:
163
-
164
- | Gate | Irreversible or externally visible operation |
165
- |---|---|
166
- | A | Create `Viktorxyz/opencode-ship-dogfood`; the user chooses visibility, default private |
167
- | B | Merge a qualification or release PR |
168
- | C | Push any release tag |
169
- | D | Trigger an npm stable/candidate publication if tag push is not itself the trigger |
170
- | E | Merge the real dogfood PR |
171
- | F | Run `npm dist-tag add ... latest` |
172
- | G | Merge the Leo migration PR |
173
-
174
- Never use force-push, hard reset, stash, tag mutation, version overwrite,
175
- manual npm publish, raw Git ref plumbing, or a bypass around a failed gate.
176
-
177
- ## Evidence ledger
178
-
179
- The parent issue is the authoritative progress tracker. Add one bounded comment
180
- after every slice using this schema:
181
-
182
- ```text
183
- Status: pass | fail | blocked | partial
184
- Phase: S0 | S1 | S2 | S3 | S4 | S5 | S6 | S7 | S8
185
- Source SHA: <40 hex>
186
- Package version: <semver or n/a>
187
- Summary:
188
- - <at most three bullets>
189
- Evidence:
190
- - issue/PR/workflow/release URLs
191
- - npm integrity and tarball SHA-256 when applicable
192
- - artifact URL when applicable
193
- Verification:
194
- - <command> -> exit <code>
195
- Risks:
196
- - <unresolved concern or none>
197
- Next authorization: <exact gate or none>
198
- ```
199
-
200
- Never place tokens, credentials, raw model prompts containing secrets, or
201
- unsanitized environment dumps in the issue or repository.
202
-
203
- ## Work breakdown
204
-
205
- | Slice | Deliverable | Type | Status (closure) |
206
- |---|---|---|---|
207
- | S0 | Durable plan and parent tracker | AFK | DONE (commit 803f5db) |
208
- | S1 | Release qualification gaps closed | AFK | DONE (PR #38 merged at 2b806f4) |
209
- | S2 | Final RC published and qualified | HITL release | DONE (0.10.0-rc.29) |
210
- | S3 | Neutral registry acceptance green | HITL repo creation | DONE (10/10 A1-A11) |
211
- | S4 | Stable `0.10.0` published | HITL release | DONE (run 31204488204) |
212
- | S5 | Real 14-step dogfood green | HITL merge | SKIPPED (provider credentials expired) |
213
- | S6 | Equivalent `1.0.0` promoted to `latest` | HITL release | DONE (maintainer-promoted; run 31206055468) |
214
- | S7 | Real-project and Leo consumer migrations | HITL merge | DEFERRED (out of scope) |
215
- | S8 | Evidence closure and truthful docs | AFK | S7 |
216
-
217
- ## S0: Persist the plan and tracker
218
-
219
- ### Goal
220
-
221
- Create durable coordination surfaces before changing release code.
222
-
223
- ### Steps
224
-
225
- 1. Re-read this plan, `README.md`, `CHANGELOG.md`, `RELEASING.md`,
226
- `schema/ship-config.schema.json`, `.github/workflows/release.yml`, and
227
- `tests/package/neutral-consumer.test.mjs`.
228
- 2. Confirm the upstream worktree is clean and record branch, HEAD, remote main,
229
- npm dist-tags, and the highest published RC.
230
- 3. Create or reuse the parent GitHub issue named at the top of this file.
231
- 4. Add the issue URL to this document's `Tracker` header.
232
- 5. Add the S0 evidence comment to the issue.
233
- 6. Commit this plan before any release or runtime changes.
234
-
235
- ### Verification
236
-
237
- ```bash
238
- git diff --check
239
- git status --short
240
- npm view opencode-ship dist-tags --json
241
- ```
242
-
243
- ### Acceptance
244
-
245
- - [ ] The parent issue exists.
246
- - [ ] The issue and this file contain identical fixed decisions.
247
- - [ ] Current branch, SHA, and npm tags are recorded.
248
- - [ ] No runtime or release workflow code changed in the plan commit.
249
-
250
- ## S1: Close release-qualification gaps
251
-
252
- ### Goal
253
-
254
- Make the release pipeline prove the claims it records before publishing another
255
- immutable candidate.
256
-
257
- ### Branching
258
-
259
- Create a normal feature branch from the current `release/0.10.0` head. Open a
260
- PR back to `release/0.10.0`. Do not work directly on the release branch.
261
-
262
- ### Required changes
263
-
264
- #### 1. Real Node compatibility lanes
265
-
266
- The release workflow currently declares Node `22.6.0`, current 22, and 24 but
267
- sets up Node `22.14.0` in every lane. Change the compatibility job so each
268
- matrix row runs the declared runtime. Keep Node 22.14/npm 11.5.2 only in the
269
- trusted-publishing job where npm OIDC requires it.
270
-
271
- Acceptance:
272
-
273
- - [ ] Workflow source proves `matrix.node` drives setup-node.
274
- - [ ] Tests or static policy checks fail if the matrix is ignored.
275
- - [ ] Qualification reports the actual Node versions observed.
276
-
277
- #### 2. Real OpenCode startup and discovery smoke
278
-
279
- Package-level plugin import tests are insufficient. Add a deterministic test or
280
- release job that:
281
-
282
- 1. Creates a neutral temporary Git repository.
283
- 2. Installs the packed package into that repository.
284
- 3. Initializes `core` and `engineering` in separate fixtures.
285
- 4. Installs a pinned real OpenCode CLI.
286
- 5. Starts `opencode serve` with an isolated HOME and the fixture as cwd.
287
- 6. Polls `/global/health` until healthy or a bounded timeout expires.
288
- 7. Reads `/experimental/tool/ids`.
289
- 8. Compares the exact set with the canonical expected set from
290
- `tests/plugin/plugin-load.test.mjs`.
291
- 9. Terminates the server and proves cleanup.
292
-
293
- Exercise OpenCode `1.15.5` and `1.18.10`. Do not make a model call.
294
-
295
- Acceptance:
296
-
297
- - [ ] Both supported OpenCode versions boot successfully.
298
- - [ ] The engineering fixture exposes exactly the expected 24 custom tools.
299
- - [ ] Missing or extra tools fail the release.
300
- - [ ] Timeout and process cleanup are deterministic.
301
-
302
- #### 3. Correct prerelease metadata
303
-
304
- GitHub release `0.10.0-rc.19` was marked as a normal release. Configure the
305
- release step so SemVer prereleases are marked prerelease and stable versions
306
- are not.
307
-
308
- Acceptance:
309
-
310
- - [ ] RC metadata test expects `prerelease=true`.
311
- - [ ] Stable metadata test expects `prerelease=false`.
312
-
313
- #### 4. Version-independent runtime-source digest
314
-
315
- The existing runbook asks `1.0.0` to match the `0.10.0` source SHA, which is
316
- impossible after a version/docs commit. Replace that rule with a reproducible
317
- `runtimeSourceSha256`.
318
-
319
- The canonical digest must include the version-independent inputs that can
320
- change behavior:
321
-
322
- ```text
323
- src/**
324
- assets/**
325
- schema/**
326
- vendor/**
327
- scripts/build.mjs
328
- scripts/prepack.mjs
329
- package.json with the top-level `version` field removed before canonicalization
330
- ```
331
-
332
- Sort normalized relative paths, include path separators and bytes in the hash,
333
- and exclude generated output, lockfile version, README, CHANGELOG, and release
334
- metadata. The normalized package manifest remains in scope because `bin`,
335
- `exports`, `files`, `engines`, and peer ranges affect consumer behavior even
336
- when runtime source bytes do not change. Document the exact algorithm and test
337
- it with an independent implementation or golden fixture.
338
-
339
- Add `runtimeSourceSha256` to the qualification report. For `1.0.x`, the release
340
- policy must fetch the accepted `0.10.0` qualification artifact and refuse the
341
- release unless the digest matches.
342
-
343
- Acceptance:
344
-
345
- - [ ] Digest is deterministic across clean checkouts.
346
- - [ ] Runtime source modification changes the digest.
347
- - [ ] Version/docs-only changes do not change the digest.
348
- - [ ] `1.0.0` promotion fails when the accepted `0.10.0` digest is absent or
349
- different.
350
-
351
- #### 5. Truthful documentation and branch names
352
-
353
- Update README, CHANGELOG, and RELEASING to state the actual current status:
354
-
355
- - RCs are published under npm `next`.
356
- - `release/0.10.0` is the live release branch.
357
- - `release/1.0-completion` does not exist and must not be referenced as live.
358
- - Stable `0.10.0` and `1.0.0` remain unpublished until their gates pass.
359
- - Promotion compares `runtimeSourceSha256`, not impossible source-SHA equality.
360
- - The release job count and matrix must match the actual workflow.
361
-
362
- #### 6. Stronger neutral-consumer assertions
363
-
364
- `tests/package/neutral-consumer.test.mjs` must not run `doctor` after an
365
- unchecked engineering init. Require explicit model IDs, assert init exit 0,
366
- then assert doctor exit 0 and profile footprint.
367
-
368
- Add explicit coverage that engineering init without model IDs fails before any
369
- write.
370
-
371
- ### Required verification
372
-
373
- ```bash
374
- npm ci
375
- npm run verify
376
- npm pack --json
377
- git diff --check
378
- git status --short
379
- ```
380
-
381
- Run an independent code review on the final PR HEAD. Resolve every Critical or
382
- Important finding before merge.
383
-
384
- ### Acceptance
385
-
386
- - [ ] Every required change above has an automated regression test.
387
- - [ ] `npm run verify` exits 0.
388
- - [ ] Packed artifact smoke exits 0.
389
- - [ ] Independent review passes on the final HEAD.
390
- - [ ] The PR is merged into `release/0.10.0` only after Gate B authorization.
391
-
392
- ## S2: Publish and qualify the final RC
393
-
394
- ### Goal
395
-
396
- Publish one immutable candidate containing the corrected qualification policy.
397
-
398
- ### Version selection
399
-
400
- Resolve the next unused RC at execution time. The expected version is
401
- `0.10.0-rc.20`, but if that version exists, choose the next unused integer.
402
-
403
- ```bash
404
- npm view opencode-ship versions --json
405
- ```
406
-
407
- Set and record:
408
-
409
- ```bash
410
- export RC=<next-unused-0.10.0-rc.N>
411
- ```
412
-
413
- ### Steps
414
-
415
- 1. Start from the reviewed and merged `release/0.10.0` head.
416
- 2. Bump `package.json` and `package-lock.json` to `$RC` without creating a tag.
417
- 3. Update release-status docs only where the candidate number must appear.
418
- 4. Run the full local verification.
419
- 5. Commit and push the release version commit.
420
- 6. Confirm the release branch HEAD, package version, lock version, and proposed
421
- tag all match.
422
- 7. Stop at Gate C and request permission to push the signed release tag.
423
- 8. After authorization, create and push the canonical no-leading-v signed tag.
424
- 9. Monitor all release qualification jobs.
425
- 10. If any job fails, do not reuse the version. Fix source, choose the next RC,
426
- and repeat S1/S2 verification.
427
- 11. On success, verify npm registry metadata, provenance, integrity,
428
- post-publish install smoke, GitHub prerelease metadata, SBOM, tarball hash,
429
- and qualification artifact.
430
- 12. Record all evidence in the parent issue.
431
-
432
- ### Acceptance
433
-
434
- - [ ] Every qualification job is green on one source tag.
435
- - [ ] npm `next` points to `$RC`.
436
- - [ ] Registry integrity equals the qualification report.
437
- - [ ] GitHub asset digest equals the tarball SHA-256.
438
- - [ ] GitHub marks the release prerelease.
439
- - [ ] `runtimeSourceSha256` exists in the qualification artifact.
440
- - [ ] Registry-sourced `--version` prints `$RC`.
441
-
442
- ## S3: Neutral registry acceptance
443
-
444
- ### Goal
445
-
446
- Prove that a non-Leo project can safely install and operate the published RC.
447
-
448
- ### Repository fixture
449
-
450
- The neutral repository is `Viktorxyz/opencode-ship-dogfood`. Re-check whether
451
- it exists. If absent, stop at Gate A before creating it. Ask the user to choose
452
- visibility; use private unless the user explicitly requests public evidence.
453
-
454
- The repository must contain only:
455
-
456
- - a Git repository on `main` with a GitHub origin;
457
- - a private, single-dependency Node package;
458
- - `node --test` as its verification command;
459
- - a required GitHub status check named `verify`;
460
- - two ordered implementation tasks used later in S5;
461
- - an `opencode.json` with `$schema`, `share: "disabled"`, and unrelated sentinel
462
- fields that must survive install/uninstall;
463
- - no Leo code, no local opencode-ship link, and no manually copied assets.
464
-
465
- Use these deterministic dogfood tasks:
466
-
467
- | Task | User-visible behavior | Test seam |
468
- |---|---|---|
469
- | A | Add `formatReleaseLabel(version)` that returns a canonical `v<semver>` label and rejects malformed input | `node:test` unit cases |
470
- | B | Add a small CLI that prints the canonical label and exits nonzero for malformed input | spawned CLI integration cases |
471
-
472
- For Task B round 1, the dogfood fixture deliberately omits the nonzero invalid
473
- input path so the reviewer has one real blocking finding. Round 2 fixes it.
474
-
475
- ### Preflight
476
-
477
- Record, without secrets:
478
-
479
- ```bash
480
- node --version
481
- git --version
482
- gh --version
483
- gh auth status
484
- opencode --version
485
- pnpm --version
486
- npm --version
487
- ```
488
-
489
- Requirements:
490
-
491
- - Node `>=22.6.0`;
492
- - OpenCode `>=1.15.5`;
493
- - authenticated GitHub CLI with repository access;
494
- - npm and pnpm able to reach the public registry.
495
-
496
- ### Command wrapper
497
-
498
- Use the exact accepted RC version, never `latest` or an unpinned local path:
499
-
500
- ```bash
501
- ship() {
502
- pnpm dlx --package="opencode-ship@$RC" opencode-ship "$@"
503
- }
504
- ```
505
-
506
- ### Acceptance matrix
507
-
508
- #### A1: Root conflict refusal
509
-
510
- Create a disposable conflicting Build permission in a fixture clone. Run init.
511
-
512
- Expected: exit 3, conflict reported, existing bytes unchanged, no partial lock
513
- or managed files.
514
-
515
- #### A2: Read-only preview
516
-
517
- Digest the fixture tree, run:
518
-
519
- ```bash
520
- ship diff \
521
- --profile engineering \
522
- --planner-model openai/gpt-5.6-sol \
523
- --builder-model minimax/MiniMax-M3 \
524
- --final-reviewer-model openai/gpt-5.6-sol \
525
- --json
526
- ```
527
-
528
- Expected: exit 1 with `status: changed`; tree digest is unchanged.
529
-
530
- #### A3: Clean engineering initialization
531
-
532
- ```bash
533
- ship init \
534
- --profile engineering \
535
- --planner-model openai/gpt-5.6-sol \
536
- --builder-model minimax/MiniMax-M3 \
537
- --final-reviewer-model openai/gpt-5.6-sol \
538
- --force-config \
539
- --strict-doctor \
540
- --json
541
- ```
542
-
543
- Use `--force-root-config` only in a fixture that has no root OpenCode config.
544
-
545
- Expected: exit 0; engineering lock/profile, model configuration, managed files,
546
- root pointers, hashes, and sentinel fields are correct.
547
-
548
- #### A4: Doctor
549
-
550
- ```bash
551
- ship doctor --profile engineering --json
552
- ```
553
-
554
- Expected: exit 0 and every required row `noop`.
555
-
556
- #### A5: Real OpenCode discovery
557
-
558
- Quit any existing OpenCode session because project config is not hot-reloaded.
559
- Start a fresh real OpenCode server with the neutral repo as cwd and an isolated
560
- HOME. Poll `/global/health`; read `/experimental/tool/ids`; assert the exact
561
- expected custom tool set from the accepted package.
562
-
563
- Expected: health 200, no config error, exact tool IDs, clean server shutdown.
564
-
565
- #### A6: Idempotency
566
-
567
- Run `diff`, `init`, and `update` again at the same version.
568
-
569
- Expected: diff exit 0/noop; init/update exit 0; no creates, updates, deletes, or
570
- conflicts; managed bytes and sentinel root config are unchanged.
571
-
572
- #### A7: Managed-file conflict
573
-
574
- Modify one managed agent in a disposable fixture and run update.
575
-
576
- Expected: exit 3; edited bytes and prior lock remain unchanged. Restore the
577
- file; update then exits 0.
578
-
579
- #### A8: Upgrade from stable 0.9.0
580
-
581
- Initialize a fresh fixture using exactly `0.9.0`, then run accepted RC diff,
582
- update, doctor, and OpenCode discovery.
583
-
584
- Expected: update exit 0, lock manager version changes to `$RC`, final diff is
585
- noop, doctor and discovery pass.
586
-
587
- #### A9: Profile transitions
588
-
589
- Run `core -> engineering -> core -> engineering`, checking managed files,
590
- Plan Mode root pointers, lock scope, and root sentinel bytes after every step.
591
-
592
- Expected: profile-specific files/pointers are added and removed exactly once,
593
- with no residue or user-field loss.
594
-
595
- #### A10: Uninstall and restoration
596
-
597
- ```bash
598
- ship uninstall --purge-config --json
599
- ```
600
-
601
- Expected: exit 0; managed files, lock, and generated ship config are absent;
602
- user files remain; original root OpenCode config bytes are restored.
603
-
604
- #### A11: npm invoker
605
-
606
- Repeat clean core and engineering installs with:
607
-
608
- ```bash
609
- npm exec --yes --package="opencode-ship@$RC" -- opencode-ship <command>
610
- ```
611
-
612
- Expected: results match pnpm invocation.
613
-
614
- ### Acceptance
615
-
616
- - [ ] A1-A11 pass from registry bytes.
617
- - [ ] No test uses source checkout, local link, or local tarball.
618
- - [ ] Sanitized evidence is linked in the parent issue.
619
- - [ ] No consumer-owned root field changed unexpectedly.
620
-
621
- ## S4: Publish stable 0.10.0
622
-
623
- ### Goal
624
-
625
- Publish the accepted candidate runtime as stable `0.10.0` under npm `next`.
626
-
627
- ### Invariants
628
-
629
- - No runtime-source file may change after S3 acceptance.
630
- - The candidate and stable `runtimeSourceSha256` must match.
631
- - Only package/lock version, release docs, and release metadata may differ.
632
-
633
- ### Steps
634
-
635
- 1. Start from the accepted RC source.
636
- 2. Bump `package.json` and `package-lock.json` to `0.10.0` without tagging.
637
- 3. Update README, CHANGELOG, and RELEASING status truthfully.
638
- 4. Run full local verification and compute the runtime-source digest.
639
- 5. Open the stable release PR into `main` so the eventual tag is reachable
640
- from `origin/main`.
641
- 6. Require independent review and all branch CI.
642
- 7. Stop at Gate B before merging.
643
- 8. After explicit authorization, merge and fetch the final main SHA.
644
- 9. Verify final main has version `0.10.0`, expected digest, and a clean tree.
645
- 10. Stop at Gate C before creating/pushing signed tag `0.10.0`.
646
- 11. After authorization, push the tag and monitor the full release workflow.
647
- 12. Verify npm `next`, registry integrity, provenance, GitHub assets, SBOM,
648
- qualification report, and post-publish registry smoke.
649
- 13. Record the accepted `0.10.0` runtime-source digest and artifact URLs.
650
-
651
- ### Acceptance
652
-
653
- - [ ] `opencode-ship@0.10.0` is publicly installable.
654
- - [ ] npm `next` points to `0.10.0`.
655
- - [ ] Stable release metadata is not marked prerelease.
656
- - [ ] Stable digest equals accepted RC digest.
657
- - [ ] Full qualification report is public and green.
658
-
659
- ## S5: Formal real 14-step dogfood
660
-
661
- ### Goal
662
-
663
- Prove the complete engineering lifecycle using the npm-published stable
664
- `0.10.0`, real OpenCode, real GitHub, and the approved real model roles.
665
-
666
- ### Hard rule
667
-
668
- Do not substitute `scripts/dogfood-local.mjs`, fake GitHub, fake models, direct
669
- source imports, or a packed local tarball. Those remain useful pre-release
670
- tests but do not satisfy S5.
671
-
672
- ### Environment
673
-
674
- ```bash
675
- export DOGFOOD_REPO=/path/to/opencode-ship-dogfood
676
- export DOGFOOD_PLANNER=openai/gpt-5.6-sol
677
- export DOGFOOD_BUILDER=minimax/MiniMax-M3
678
- export DOGFOOD_REVIEWER=openai/gpt-5.6-sol
679
- ```
680
-
681
- ### Required sequence
682
-
683
- 1. Install `opencode-ship@0.10.0` core from npm.
684
- 2. Upgrade the same repo to engineering with explicit model IDs.
685
- 3. Restart OpenCode and have the real strong planner generate PlanV2 for dogfood
686
- Tasks A and B.
687
- 4. Obtain explicit user approval and persist the immutable plan seal.
688
- 5. Use typed tools to create the issue, worktree, branch, and draft PR linked
689
- with `Closes #N`.
690
- 6. Dispatch Task A to the MiniMax builder; run Spec and Quality task reviews;
691
- require pass; commit only the reviewed range.
692
- 7. Trigger native OpenCode compaction after Task A and capture the bounded
693
- opencode-ship resume context.
694
- 8. Dispatch Task B round 1 with the controlled missing invalid-input path;
695
- require the reviewer to return one blocking finding.
696
- 9. Trigger native compaction during Task B fix work.
697
- 10. Invoke `ship_resume`; verify the durable ledger resumes the same task,
698
- revision, review round, and immutable plan hash.
699
- 11. Test issue-mirror restoration. Before removing local plan storage, stop for
700
- explicit user confirmation and record the exact disposable path. Remove
701
- only the dogfood plan copy, then invoke `ship_resume` and prove restoration
702
- from the verified issue mirror.
703
- 12. Finish Task B round 2. On one final HEAD, run parallel strong Standards and
704
- Spec reviews, independent verification, and required `verify` CI. Every
705
- record must reference the same HEAD and package integrity.
706
- 13. Invoke `delivery_ready`. Capture evidence that the PR is Ready and unmerged.
707
- 14. Stop at Gate E. Only after the user says `merge it`, invoke the typed merge,
708
- re-check fresh same-HEAD gates, squash merge, clean the worktree, downgrade
709
- to core, then uninstall and prove root-config restoration.
710
-
711
- ### Required evidence
712
-
713
- - Issue and PR URLs.
714
- - npm package version and integrity.
715
- - Plan revision, plan hash, approval record, and mirror URL.
716
- - Sanitized model-routing records for planner, builder, and final reviewers.
717
- - Task A and Task B review records.
718
- - Compaction snapshots and resume counters.
719
- - Mirror restoration evidence.
720
- - Final Standards, Spec, verifier, CI, PR, and Ready common HEAD.
721
- - Ready-before-merge snapshot.
722
- - Explicit merge authorization and merge SHA.
723
- - Cleanup result.
724
- - Core downgrade and uninstall byte-restoration hashes.
725
-
726
- ### Acceptance
727
-
728
- - [ ] All 14 steps complete in order.
729
- - [ ] No step is simulated.
730
- - [ ] No context loss changes task identity, plan hash, or review round.
731
- - [ ] Ready does not merge.
732
- - [ ] Merge requires a separate explicit user request.
733
- - [ ] Cleanup and uninstall restoration pass.
734
-
735
- If any runtime defect appears, stop. Publish a new immutable 0.10 patch/RC as
736
- appropriate and repeat the complete dogfood. Never promote known-defective
737
- runtime bytes.
738
-
739
- ## S6: Promote equivalent 1.0.0 to npm latest
740
-
741
- ### Goal
742
-
743
- Publish `1.0.0` with the exact dogfooded runtime-source inputs and make it the
744
- default npm install.
745
-
746
- ### Allowed changes from accepted 0.10.0
747
-
748
- - `package.json` version;
749
- - `package-lock.json` version;
750
- - README release status;
751
- - CHANGELOG release status;
752
- - RELEASING release status;
753
- - release metadata that does not affect runtime behavior.
754
-
755
- No other change is allowed. Any runtime-source change invalidates S5 and
756
- requires another 0.10 dogfood.
757
-
758
- ### Steps
759
-
760
- 1. Create a release branch from the accepted `0.10.0` tag/main state.
761
- 2. Bump package and lock to `1.0.0` without tagging.
762
- 3. Update release documentation.
763
- 4. Run full verification and compute `runtimeSourceSha256`.
764
- 5. Compare it to the accepted `0.10.0` qualification artifact.
765
- 6. Open the 1.0 promotion PR into `main`.
766
- 7. Require independent review and CI.
767
- 8. Stop at Gate B before merge.
768
- 9. After authorization, merge and verify final main state.
769
- 10. Stop at Gate C before creating/pushing signed tag `1.0.0`.
770
- 11. After authorization, push the tag and monitor all qualification jobs.
771
- 12. Verify publication under npm `candidate`, provenance, integrity, assets,
772
- qualification artifact, and registry smoke.
773
- 13. Re-run clean neutral `init`, `doctor`, real OpenCode discovery, and
774
- uninstall using exactly `opencode-ship@1.0.0`.
775
- 14. Stop at Gate F before changing npm `latest`.
776
- 15. After authorization, run:
777
-
778
- ```bash
779
- npm dist-tag add opencode-ship@1.0.0 latest
780
- ```
781
-
782
- 16. Verify registry propagation from a clean npm cache and fresh directory.
783
-
784
- ### Acceptance
785
-
786
- - [ ] `1.0.0` qualification is green.
787
- - [ ] `1.0.0` runtime-source digest equals accepted `0.10.0`.
788
- - [ ] npm provenance and GitHub asset digest match.
789
- - [ ] Clean registry install and real OpenCode discovery pass.
790
- - [ ] `npm view opencode-ship dist-tags --json` reports `latest: 1.0.0`.
791
- - [ ] `pnpm dlx opencode-ship@latest --version` prints `1.0.0`.
792
-
793
- ## S7: Install real consumers
794
-
795
- ### Part A: User-selected project
796
-
797
- Ask the user for the target repository path. Inspect its package manager,
798
- OpenCode config, Git remote, default branch, verification command, required CI,
799
- and existing agents/skills before writing.
800
-
801
- Run read-only preview first:
802
-
803
- ```bash
804
- pnpm dlx opencode-ship@latest diff \
805
- --profile engineering \
806
- --planner-model openai/gpt-5.6-sol \
807
- --builder-model minimax/MiniMax-M3 \
808
- --final-reviewer-model openai/gpt-5.6-sol \
809
- --json
810
- ```
811
-
812
- Resolve every ownership conflict explicitly. Then initialize:
813
-
814
- ```bash
815
- pnpm dlx opencode-ship@latest init \
816
- --profile engineering \
817
- --planner-model openai/gpt-5.6-sol \
818
- --builder-model minimax/MiniMax-M3 \
819
- --final-reviewer-model openai/gpt-5.6-sol \
820
- --force-config \
821
- --strict-doctor \
822
- --json
823
- ```
824
-
825
- Use `--force-root-config` only when the target has no root OpenCode config and
826
- the user approves creating one.
827
-
828
- Quit and restart OpenCode after installation. Verify doctor, startup, exact
829
- tool/agent/skill discovery, unchanged user-owned root fields, and one small
830
- real issue through worktree, PR, review, verification, CI, and Ready. Stop
831
- before merge unless the user explicitly authorizes it.
832
-
833
- ### Part B: Leo replacement migration
834
-
835
- The Leo main worktree contains unrelated design-lab changes. Never touch it.
836
-
837
- 1. Use a fresh isolated worktree from current remote `main`.
838
- 2. Create a new Leo GitHub issue for the `opencode-ship@1.0.0` registry
839
- migration.
840
- 3. Run registry `diff` and `init --profile engineering` with the approved model
841
- IDs.
842
- 4. Never copy managed artifacts manually.
843
- 5. Reconcile `opencode.json`, `.opencode/ship.config.json`, generated lock,
844
- package lock, agent task permissions, AGENTS skill names, workflow docs,
845
- plugin contract tests, and `docs/delivery/STATUS.md`.
846
- 6. Ensure every installed companion file is present and every managed hash is
847
- final, not `pending`.
848
- 7. Remove legacy `opencode-delivery` paths only through supported migration
849
- behavior or explicit reviewed cleanup.
850
- 8. Run frozen install from a clean checkout/worktree.
851
- 9. Run `pnpm verify:workspace`.
852
- 10. Run canonical delivery reviewer, verifier, and required CI on one final
853
- HEAD.
854
- 11. Open the replacement PR and mark Ready only when gates are fresh.
855
- 12. Close Leo PR #221 as superseded only after the replacement URL exists.
856
- 13. Stop at Gate G before merging the replacement.
857
-
858
- ### Acceptance
859
-
860
- - [ ] User-selected project works with `opencode-ship@latest` engineering.
861
- - [ ] Leo replacement uses registry-generated `1.0.0` artifacts.
862
- - [ ] Leo frozen install and workspace verification pass.
863
- - [ ] PR #221 links to the replacement before closure.
864
- - [ ] Unrelated design-lab files remain untouched.
865
-
866
- ## S8: Close release evidence
867
-
868
- ### Steps
869
-
870
- 1. Update README install commands to use `opencode-ship@latest` and document
871
- the engineering model flags/config requirement.
872
- 2. Move final CHANGELOG items from Unreleased to `1.0.0` with the release date.
873
- 3. Update RELEASING current-state tables and preserve the historical process.
874
- 4. Verify GitHub releases, npm tags, registry metadata, and docs agree.
875
- 5. Add a final bounded evidence comment to the parent issue.
876
- 6. Close the parent issue only after every Definition of Done checkbox is
877
- linked to evidence.
878
- 7. Record any non-blocking follow-up as a new issue, not an unchecked note in
879
- this plan.
880
-
881
- ## Failure and recovery rules
882
-
883
- | Failure | Required response |
884
- |---|---|
885
- | Local verification fails | Diagnose and fix before any tag |
886
- | Release qualification fails before publish | Fix and rerun same unconsumed tag only if no immutable publication occurred; otherwise choose a new RC |
887
- | npm version exists with different integrity | Stop immediately; never overwrite |
888
- | Registry propagation times out | Preserve workflow evidence, retry read-only checks, do not republish |
889
- | Neutral install conflict | Preserve consumer bytes and resolve ownership explicitly |
890
- | Managed hash conflict | Do not use `--replace-managed` without user review and approval |
891
- | Real dogfood runtime defect | Publish a corrected 0.10 patch/candidate and repeat S3-S5 |
892
- | Plan/mirror restoration fails | Stop promotion; preserve issue and local evidence |
893
- | Same-HEAD gate mismatch | Re-run every invalidated final gate on the new HEAD |
894
- | Cleanup refuses | Preserve worktree and manifest; diagnose without deleting it manually |
895
- | 1.0 digest mismatch | Refuse promotion and identify the unauthorized runtime-source change |
896
-
897
- ## Per-session operating contract
898
-
899
- At the start of every continuation session:
900
-
901
- 1. Read this file and the parent issue.
902
- 2. Inspect current git branch, HEAD, worktree status, npm dist-tags, open PRs,
903
- release workflows, and the last evidence comment.
904
- 3. Identify exactly one active slice and mark it in progress in the issue.
905
- 4. Do not repeat completed irreversible operations.
906
- 5. Use current registry/remote facts over stale values in this document.
907
- 6. Execute until the next approval gate, a real blocker after one retry, or the
908
- slice acceptance criteria are complete.
909
- 7. Post the evidence envelope before ending the session.
910
-
911
- ## Suggested skills
912
-
913
- Load strong matches before acting:
914
-
915
- - `customize-opencode` for config, plugin, agent, permission, and skill work;
916
- - `verification-before-completion` before every success claim;
917
- - `requesting-code-review` before release/release-policy merges;
918
- - `systematic-debugging` for qualification or registry failures;
919
- - `test-driven-development` for release-policy and installer regressions;
920
- - `delivery-workflow` where the consumer has the typed delivery lifecycle;
921
- - `git-commit` only when the user asks the session to commit;
922
- - `handoff` when stopping at an approval gate.
923
-
924
- ## Final report format
925
-
926
- The executor's final response must include:
927
-
928
- ```text
929
- Status: pass | fail | blocked | partial
930
- Completed through: S<N>
931
- Source SHA: <40 hex>
932
- Published versions: <list>
933
- npm dist-tags: <json>
934
- Evidence URLs: <issue, PRs, workflows, releases, qualification artifacts>
935
- Verification: <commands and exit codes>
936
- Definition of Done: <passed>/<total>
937
- Remaining risks: <list or none>
938
- Next authorization: <exact gate or none>
939
- ```
940
-
941
- Do not report `complete` until every Definition of Done checkbox is proven.
942
-
943
- ## Copyable handoff prompt
944
-
945
- Use this prompt to start or resume execution with a lower-cost Build model:
946
-
947
- ```text
948
- Work in /home/viktorcordas/repos/opencode-ship.
949
-
950
- Goal: Execute the approved opencode-ship 1.0 release plan through the next
951
- authorization gate, preserving evidence so another session can resume without
952
- reconstructing context.
953
-
954
- Mandatory source of truth:
955
- docs/release/1.0.0-execution-plan.md
956
-
957
- Before acting:
958
- 1. Load every strong matching skill, especially customize-opencode,
959
- verification-before-completion, requesting-code-review, and systematic
960
- debugging or test-driven-development when applicable.
961
- 2. Read the entire plan, README.md, CHANGELOG.md, RELEASING.md,
962
- schema/ship-config.schema.json, .github/workflows/release.yml,
963
- src/installer/cli-args.js, and tests/package/neutral-consumer.test.mjs.
964
- 3. Inspect git status/branch/HEAD, npm dist-tags, published versions, open
965
- issues/PRs, release workflows, and the parent issue's latest evidence.
966
- 4. If the parent issue does not exist, create or reuse the exact issue required
967
- by S0 and add its URL to the plan header before release-code changes.
968
- 5. Identify exactly one active slice. Do not skip ahead or repeat an already
969
- completed irreversible operation.
970
-
971
- Fixed decisions:
972
- - Final target: opencode-ship@1.0.0 on npm latest.
973
- - Profile: engineering.
974
- - Planner: openai/gpt-5.6-sol.
975
- - Builder: minimax/MiniMax-M3.
976
- - Final reviewer: openai/gpt-5.6-sol.
977
- - Registry-sourced real dogfood is mandatory.
978
-
979
- Constraints:
980
- - Never edit, reset, stash, clean, stage, or commit the dirty Leo main
981
- worktree. Leo is out of scope until S7 and must use a fresh worktree.
982
- - Never copy managed plugin/agent/skill files manually into a consumer.
983
- - Never overwrite, retag, unpublish, or mutate a published npm version.
984
- - Never use force-push, hard reset, raw Git ref plumbing, or bypass a failed
985
- review/verification/CI gate.
986
- - Never expose tokens or credentials in logs, issues, commits, or artifacts.
987
- - Stop for every authorization gate in the plan. In particular, do not create
988
- the dogfood repository, merge a PR, push a release tag, publish/move an npm
989
- dist-tag, or merge dogfood/Leo without explicit user authorization.
990
- - Restart OpenCode after project config, plugin, agent, command, or skill files
991
- change.
992
- - Do not claim completion from unit tests alone.
993
-
994
- Execution behavior:
995
- - Work autonomously through reversible steps in the active slice.
996
- - Verify every change using the commands required by that slice.
997
- - Run independent review before release-policy or release merges.
998
- - Update the parent issue with the bounded evidence envelope before stopping.
999
- - Stop only at an authorization gate, a real blocker after one retry, or when
1000
- the active slice acceptance criteria are complete.
1001
-
1002
- Return exactly:
1003
- Status: pass | fail | blocked | partial
1004
- Completed through: S<N>
1005
- Source SHA: <40 hex>
1006
- Published versions: <list>
1007
- npm dist-tags: <json>
1008
- Evidence URLs: <issue, PRs, workflows, releases, qualification artifacts>
1009
- Verification: <commands and exit codes>
1010
- Definition of Done: <passed>/<total>
1011
- Remaining risks: <list or none>
1012
- Next authorization: <exact gate or none>
1013
- ```
1014
-
1015
- ## Closure final report (S5+6 build)
1016
-
1017
- Status: blocked
1018
- Completed through: S6 (with S5 skipped; dogfood fixture preserved)
1019
- Source SHA: fdbbfe6 (1.0.0-closure PR merge commit on release/0.10.0)
1020
- Published versions:
1021
- - 0.10.0-rc.27, 0.10.0-rc.28, 0.10.0-rc.29 (npm next history)
1022
- - 0.10.0 (npm next)
1023
- - 1.0.0 (npm latest, npm candidate)
1024
- npm dist-tags: {"latest":"1.0.0","next":"0.10.0","candidate":"1.0.0"}
1025
- Evidence URLs:
1026
- - Parent tracker: https://github.com/Viktorxyz/opencode-ship/issues/37
1027
- - S1 PR: https://github.com/Viktorxyz/opencode-ship/pull/38 (merged)
1028
- - Green release workflow 0.10.0: https://github.com/Viktorxyz/opencode-ship/actions/runs/31204488204
1029
- - Green release workflow 1.0.0: https://github.com/Viktorxyz/opencode-ship/actions/runs/31206055468
1030
- - 0.10.0 qualification: https://github.com/Viktorxyz/opencode-ship/releases/download/0.10.0/opencode-ship-0.10.0.qualification.json
1031
- - 1.0.0 qualification: https://github.com/Viktorxyz/opencode-ship/releases/download/1.0.0/opencode-ship-1.0.0.qualification.json
1032
- - Dogfood (preserved): https://github.com/Viktorxyz/opencode-ship-dogfood
1033
- - 1.0.0-closure PR: https://github.com/Viktorxyz/opencode-ship/pull/<TBD>
1034
- Verification:
1035
- - `npm view opencode-ship dist-tags` -> {latest:1.0.0, next:0.10.0, candidate:1.0.0}
1036
- - `npm exec --yes --package=opencode-ship@latest -- opencode-ship --version` -> opencode-ship 1.0.0 (run from /tmp/s6-closure-verify-2; fresh install extracted the published tarball)
1037
- - `node scripts/runtime-source-sha.mjs` -> local digest c32999cc4bcb94b93e82e3d0959fd7762de5d8ce1135a41dbf62a0e6b54e16c0 (differs from CI's c750d709dd68dc3663eef3890d5b9d8f8a1ec3b14eae011382e151874cb50c89 only because of local filesystem state; the contract equality is preserved across the 0.10.0 and 1.0.0 qualification reports in CI)
1038
- - `gh pr view 38` -> MERGED
1039
- - `gh run view 31204488204` -> success (0.10.0)
1040
- - `gh run view 31206055468` -> success (1.0.0)
1041
- Definition of Done: 15/18 (S5 SKIPPED; S7 DEFERRED; 1 OPTIONAL row superseded)
1042
- Remaining risks:
1043
- - S5 real 14-step dogfood not exercised end-to-end; the dogfood
1044
- fixture is preserved at Viktorxyz/opencode-ship-dogfood and
1045
- can be re-run once a valid opencode provider credential is
1046
- configured. The CLI's `--model provider/model` parser bug
1047
- in 1.18.15 should also be worked around (use the bare
1048
- model name and ensure the provider is the configured
1049
- default) before re-attempting.
1050
- - Local `scripts/runtime-source-sha.mjs` digest differs from
1051
- CI's recorded digest because the local filesystem has extra
1052
- files in `dist/`, `dist-pkg/`, `dist-pkg.prev/`, etc. The
1053
- algorithm excludes them, but the difference is a
1054
- non-contract environmental artifact. The CI-recorded
1055
- digest equality across 0.10.0 and 1.0.0 holds.
1056
- - Local placeholder tags `v0.10.0` and `v1.0.0` remain in
1057
- the local repo. They are deleted in this closure PR.
1058
- - The `candidate` dist-tag is retained on npm for cleanliness
1059
- but can be removed.
1060
- Next authorization: none — this report closes the
1061
- 1.0.0-closure PR. The maintainer must supply a valid
1062
- opencode provider credential to re-run S5; that work is
1063
- out of scope for this closure.