@1aboveio/skills 0.19.3 → 0.20.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 (206) hide show
  1. package/README.md +9 -4
  2. package/package.json +1 -1
  3. package/runtime/skills/distribution/generated/recipes.json +54 -48
  4. package/runtime/skills/distribution/scripts/bundles.mjs +113 -7
  5. package/runtime/skills/engineering/engineering-runtime/scripts/workflow-coherence.mjs +4 -6
  6. package/runtime/skills/engineering/engineering-runtime/scripts/workflow-policy.mjs +3 -36
  7. package/skills/cicd-pipeline/cloud-build/SKILL.md +6 -6
  8. package/skills/cicd-pipeline/mergify/SKILL.md +1 -1
  9. package/skills/engineering/engineering-runtime/coherence/workflow.json +15 -84
  10. package/skills/engineering/engineering-runtime/scripts/workflow-coherence.mjs +4 -6
  11. package/skills/engineering/engineering-runtime/scripts/workflow-policy.mjs +3 -36
  12. package/skills/engineering/rush-release/SKILL.md +46 -25
  13. package/skills/engineering/rush-release/evals/evals.json +22 -8
  14. package/skills/engineering/rush-release/references/cut.md +21 -4
  15. package/skills/engineering/rush-release/references/preflight.md +25 -6
  16. package/skills/engineering/rush-release/references/promotion.md +70 -0
  17. package/skills/engineering/rush-release/references/publish.md +49 -16
  18. package/skills/engineering/rush-release/scripts/plan.mjs +33 -7
  19. package/skills/engineering/smoke/SKILL.md +4 -4
  20. package/skills/engineering/smoke/references/manifest.md +3 -3
  21. package/skills/payment/payment-analysis/SKILL.md +5 -3
  22. package/skills/payment/tld-detection/SKILL.md +163 -0
  23. package/skills/payment/tld-detection/agents/openai.yaml +9 -0
  24. package/skills/payment/tld-detection/evals/evals.json +107 -0
  25. package/skills/payment/tld-detection/references/clean.md +51 -0
  26. package/skills/payment/tld-detection/references/clustering.md +219 -0
  27. package/skills/payment/tld-detection/references/decision.md +85 -0
  28. package/skills/payment/tld-detection/references/report-template.md +169 -0
  29. package/skills/payment/tld-detection/references/terminology.md +69 -0
  30. package/skills/payment/tld-detection/references/workflow.md +78 -0
  31. package/skills/payment/tld-detection/scripts/detect_ladders.py +390 -0
  32. package/skills/payment/tld-detection/tests/test_detect_ladders.py +132 -0
  33. package/skills/engineering/resolve-issues/SKILL.md +0 -168
  34. package/skills/engineering/resolve-issues/agents/openai.yaml +0 -9
  35. package/skills/engineering/resolve-issues/generated/workflow-repair-policy.json +0 -499
  36. package/skills/engineering/resolve-issues/references/breaker.md +0 -82
  37. package/skills/engineering/resolve-issues/references/deliverables.md +0 -27
  38. package/skills/engineering/resolve-issues/references/delivery.md +0 -108
  39. package/skills/engineering/resolve-issues/references/evidence-lane.md +0 -21
  40. package/skills/engineering/resolve-issues/references/exact-head-ci.md +0 -287
  41. package/skills/engineering/resolve-issues/references/fan-out.md +0 -33
  42. package/skills/engineering/resolve-issues/references/finalization.md +0 -68
  43. package/skills/engineering/resolve-issues/references/guarantees.md +0 -10
  44. package/skills/engineering/resolve-issues/references/high-risk.md +0 -29
  45. package/skills/engineering/resolve-issues/references/incidents/848/README.md +0 -156
  46. package/skills/engineering/resolve-issues/references/intake.md +0 -86
  47. package/skills/engineering/resolve-issues/references/integration-gate.md +0 -53
  48. package/skills/engineering/resolve-issues/references/interference.md +0 -87
  49. package/skills/engineering/resolve-issues/references/loop.md +0 -134
  50. package/skills/engineering/resolve-issues/references/model-catalog.md +0 -9
  51. package/skills/engineering/resolve-issues/references/postmortem.md +0 -27
  52. package/skills/engineering/resolve-issues/references/pre-flight-model-slots.md +0 -41
  53. package/skills/engineering/resolve-issues/references/pre-flight-recording-and-checkout.md +0 -48
  54. package/skills/engineering/resolve-issues/references/pre-flight.md +0 -41
  55. package/skills/engineering/resolve-issues/references/regression-checklist.md +0 -26
  56. package/skills/engineering/resolve-issues/references/run-state.md +0 -288
  57. package/skills/engineering/resolve-issues/references/sandboxed-testing.md +0 -48
  58. package/skills/engineering/resolve-issues/references/spawn-contract.md +0 -96
  59. package/skills/engineering/resolve-issues/references/terminal-evidence-journal.md +0 -40
  60. package/skills/engineering/resolve-issues/references/why.md +0 -653
  61. package/skills/engineering/resolve-issues/schemas/fix-round.schema.json +0 -49
  62. package/skills/engineering/resolve-issues/scripts/combine-and-verify.mjs +0 -721
  63. package/skills/engineering/resolve-issues/scripts/component-candidate.mjs +0 -962
  64. package/skills/engineering/resolve-issues/scripts/contract-revision.mjs +0 -220
  65. package/skills/engineering/resolve-issues/scripts/detect-delivery-mode.mjs +0 -420
  66. package/skills/engineering/resolve-issues/scripts/detect-target-branch.mjs +0 -256
  67. package/skills/engineering/resolve-issues/scripts/detect-workspace-mode.mjs +0 -168
  68. package/skills/engineering/resolve-issues/scripts/discover-models.mjs +0 -9
  69. package/skills/engineering/resolve-issues/scripts/doctrine.mjs +0 -62
  70. package/skills/engineering/resolve-issues/scripts/evidence-lifecycle-contract.mjs +0 -191
  71. package/skills/engineering/resolve-issues/scripts/exact-head-ci.mjs +0 -413
  72. package/skills/engineering/resolve-issues/scripts/exact-head-github-provider.mjs +0 -332
  73. package/skills/engineering/resolve-issues/scripts/finalize.mjs +0 -488
  74. package/skills/engineering/resolve-issues/scripts/fix-rounds.mjs +0 -3307
  75. package/skills/engineering/resolve-issues/scripts/fixtures/evidence-lifecycle-circular-1001.json +0 -16
  76. package/skills/engineering/resolve-issues/scripts/fixtures/evidence-lifecycle-valid-sequencing.json +0 -51
  77. package/skills/engineering/resolve-issues/scripts/fixtures/fmm-express-830-component-candidate.json +0 -17
  78. package/skills/engineering/resolve-issues/scripts/fixtures/head-check-set-1081.json +0 -166
  79. package/skills/engineering/resolve-issues/scripts/gate-value-series.mjs +0 -92
  80. package/skills/engineering/resolve-issues/scripts/guide-index.mjs +0 -73
  81. package/skills/engineering/resolve-issues/scripts/head-check-set.mjs +0 -159
  82. package/skills/engineering/resolve-issues/scripts/interference.mjs +0 -427
  83. package/skills/engineering/resolve-issues/scripts/model-catalog.mjs +0 -9
  84. package/skills/engineering/resolve-issues/scripts/next-operations.mjs +0 -419
  85. package/skills/engineering/resolve-issues/scripts/postmortem.mjs +0 -909
  86. package/skills/engineering/resolve-issues/scripts/preflight-questions.mjs +0 -345
  87. package/skills/engineering/resolve-issues/scripts/reconcile-contained-unit-prs.mjs +0 -415
  88. package/skills/engineering/resolve-issues/scripts/release-state-contract.mjs +0 -697
  89. package/skills/engineering/resolve-issues/scripts/report.mjs +0 -494
  90. package/skills/engineering/resolve-issues/scripts/required-check-plan.mjs +0 -172
  91. package/skills/engineering/resolve-issues/scripts/round-metadata.mjs +0 -79
  92. package/skills/engineering/resolve-issues/scripts/run-state-review6-cases.mjs +0 -334
  93. package/skills/engineering/resolve-issues/scripts/run-state.mjs +0 -4792
  94. package/skills/engineering/resolve-issues/scripts/sandbox-selftest.mjs +0 -395
  95. package/skills/engineering/resolve-issues/scripts/spawn-contract.mjs +0 -290
  96. package/skills/engineering/resolve-issues/scripts/terminal-dispositions.mjs +0 -170
  97. package/skills/engineering/resolve-issues/scripts/terminal-evidence-journal.mjs +0 -293
  98. package/skills/engineering/resolve-issues/scripts/unit-kind.mjs +0 -197
  99. package/skills/engineering/resolve-issues/scripts/unit-lifecycle.mjs +0 -127
  100. package/skills/engineering/resolve-issues/scripts/watch-delivery.mjs +0 -893
  101. package/skills/engineering/resolve-issues/scripts/workspaces.mjs +0 -829
  102. package/skills/engineering/resolve-issues/workflows/independent-review.workflow.js +0 -290
  103. package/skills/engineering/resolve-issues/workflows/prior-art-scan.workflow.js +0 -80
  104. package/skills/engineering/resolve-issues/workflows/workflow-smoke.mjs +0 -102
  105. package/skills/engineering/resolve-release/LICENSE +0 -3
  106. package/skills/engineering/resolve-release/SKILL.md +0 -113
  107. package/skills/engineering/resolve-release/agents/openai.yaml +0 -9
  108. package/skills/engineering/resolve-release/references/assembly.md +0 -137
  109. package/skills/engineering/resolve-release/references/auto-when-green.md +0 -56
  110. package/skills/engineering/resolve-release/references/candidate.md +0 -167
  111. package/skills/engineering/resolve-release/references/exposure.md +0 -178
  112. package/skills/engineering/resolve-release/references/handoff.md +0 -24
  113. package/skills/engineering/resolve-release/references/postmortem.md +0 -230
  114. package/skills/engineering/resolve-release/references/preflight.md +0 -208
  115. package/skills/engineering/resolve-release/references/principles.md +0 -94
  116. package/skills/engineering/resolve-release/references/regression-checklist.md +0 -36
  117. package/skills/engineering/resolve-release/references/related-skills.md +0 -13
  118. package/skills/engineering/resolve-release/references/routing.md +0 -149
  119. package/skills/engineering/resolve-release/references/verified-sha-github-flow.md +0 -285
  120. package/skills/engineering/resolve-release/references/versioning.md +0 -202
  121. package/skills/engineering/resolve-release/references/why.md +0 -53
  122. package/skills/engineering/resolve-release/scripts/adapter-completion-artifact.mjs +0 -389
  123. package/skills/engineering/resolve-release/scripts/build-changes.mjs +0 -209
  124. package/skills/engineering/resolve-release/scripts/candidate-hygiene.mjs +0 -407
  125. package/skills/engineering/resolve-release/scripts/candidate-identity.mjs +0 -904
  126. package/skills/engineering/resolve-release/scripts/candidate-traffic.mjs +0 -81
  127. package/skills/engineering/resolve-release/scripts/checked-adapter-loader.mjs +0 -612
  128. package/skills/engineering/resolve-release/scripts/close-attempt.mjs +0 -135
  129. package/skills/engineering/resolve-release/scripts/closeout-release.mjs +0 -161
  130. package/skills/engineering/resolve-release/scripts/doctrine.mjs +0 -106
  131. package/skills/engineering/resolve-release/scripts/durable-processing.mjs +0 -522
  132. package/skills/engineering/resolve-release/scripts/ensure-target-green.mjs +0 -659
  133. package/skills/engineering/resolve-release/scripts/evidence-bundle.mjs +0 -1014
  134. package/skills/engineering/resolve-release/scripts/finalize-release.mjs +0 -526
  135. package/skills/engineering/resolve-release/scripts/fixtures/durable-processing-adapter.mjs +0 -169
  136. package/skills/engineering/resolve-release/scripts/green-gate.mjs +0 -599
  137. package/skills/engineering/resolve-release/scripts/isolated-adapter-evaluator.mjs +0 -752
  138. package/skills/engineering/resolve-release/scripts/metadata-pr-status.mjs +0 -56
  139. package/skills/engineering/resolve-release/scripts/metadata-sync.mjs +0 -1538
  140. package/skills/engineering/resolve-release/scripts/postmortem.mjs +0 -381
  141. package/skills/engineering/resolve-release/scripts/preflight-probes.mjs +0 -510
  142. package/skills/engineering/resolve-release/scripts/production-endpoints.mjs +0 -326
  143. package/skills/engineering/resolve-release/scripts/rc-circuit-breaker.mjs +0 -272
  144. package/skills/engineering/resolve-release/scripts/report.mjs +0 -417
  145. package/skills/engineering/resolve-release/scripts/reprobe-credentials.mjs +0 -114
  146. package/skills/engineering/resolve-release/scripts/revalidate-candidate.mjs +0 -238
  147. package/skills/engineering/resolve-release/scripts/review-packet.mjs +0 -503
  148. package/skills/engineering/resolve-release/scripts/rollback-floor.mjs +0 -263
  149. package/skills/engineering/resolve-release/scripts/version-assert.mjs +0 -339
  150. package/skills/engineering/resolve-release/scripts/version-postmortem.mjs +0 -485
  151. package/skills/engineering/resolve-release/scripts/version.mjs +0 -1199
  152. package/skills/engineering/resolve-release/scripts/watch-candidate-delivery.mjs +0 -449
  153. package/skills/engineering/resolve-release/vendor/ACORN-LICENSE +0 -21
  154. package/skills/engineering/resolve-release/vendor/README.md +0 -60
  155. package/skills/engineering/resolve-release/vendor/acorn.mjs +0 -6233
  156. package/skills/engineering/resolve-release/vendor/quickjs/core/LICENSE +0 -21
  157. package/skills/engineering/resolve-release/vendor/quickjs/core/README.md +0 -341
  158. package/skills/engineering/resolve-release/vendor/quickjs/core/README.template.md +0 -70
  159. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-TAV5CUKK.mjs +0 -2
  160. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-TAV5CUKK.mjs.map +0 -1
  161. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-V2S4ZYJR.mjs +0 -7
  162. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-V2S4ZYJR.mjs.map +0 -1
  163. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.d.mts +0 -2033
  164. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.d.ts +0 -2033
  165. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.js +0 -7
  166. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.js.map +0 -1
  167. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.mjs +0 -2
  168. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.mjs.map +0 -1
  169. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-ES6BEMUI.mjs +0 -2
  170. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-ES6BEMUI.mjs.map +0 -1
  171. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-asyncify-2EFITU5U.mjs +0 -2
  172. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-asyncify-2EFITU5U.mjs.map +0 -1
  173. package/skills/engineering/resolve-release/vendor/quickjs/core/package.json +0 -49
  174. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/LICENSE +0 -21
  175. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/README.md +0 -5
  176. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.d.mts +0 -549
  177. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.d.ts +0 -549
  178. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.js +0 -2
  179. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.js.map +0 -1
  180. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.mjs +0 -2
  181. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.mjs.map +0 -1
  182. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/package.json +0 -36
  183. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/LICENSE +0 -47
  184. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/README.md +0 -82
  185. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.browser.d.ts +0 -11
  186. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.browser.mjs +0 -22
  187. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cjs +0 -21
  188. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cloudflare.cjs +0 -21
  189. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cloudflare.d.ts +0 -11
  190. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.d.ts +0 -11
  191. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.mjs +0 -25
  192. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.wasm +0 -0
  193. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.d.mts +0 -85
  194. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.d.ts +0 -85
  195. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.js +0 -2
  196. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.js.map +0 -1
  197. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.mjs +0 -2
  198. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.mjs.map +0 -1
  199. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.d.mts +0 -20
  200. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.d.ts +0 -20
  201. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.js +0 -2
  202. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.js.map +0 -1
  203. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.mjs +0 -2
  204. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.mjs.map +0 -1
  205. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/package.json +0 -61
  206. /package/skills/{engineering/resolve-issues → payment/tld-detection}/LICENSE +0 -0
@@ -11,9 +11,7 @@ export const WORKFLOW_OWNED_MEMBERS = deepFreeze([
11
11
  'ensure-coverage',
12
12
  'implement-and-pr',
13
13
  'rush-issues',
14
- 'resolve-issues',
15
14
  'rush-release',
16
- 'resolve-release',
17
15
  'review-pr',
18
16
  'smoke',
19
17
  'engineering-runtime',
@@ -66,23 +64,7 @@ export const WORKFLOW_TRUSTED_DEPENDENCY_CLOSURES = deepFreeze([
66
64
  ],
67
65
  generatedIdentities: [],
68
66
  },
69
- {
70
- invokedSkill: 'resolve-issues',
71
- members: [
72
- 'tdd',
73
- 'harness-runtime',
74
- 'e2e-test',
75
- 'ensure-coverage',
76
- 'implement-and-pr',
77
- 'resolve-issues',
78
- 'review-pr',
79
- 'smoke',
80
- 'engineering-runtime',
81
- ],
82
- generatedIdentities: [
83
- { member: 'resolve-issues', path: 'generated/workflow-repair-policy.json' },
84
- ],
85
- },
67
+
86
68
  {
87
69
  invokedSkill: 'rush-release',
88
70
  members: [
@@ -91,22 +73,7 @@ export const WORKFLOW_TRUSTED_DEPENDENCY_CLOSURES = deepFreeze([
91
73
  ],
92
74
  generatedIdentities: [],
93
75
  },
94
- {
95
- invokedSkill: 'resolve-release',
96
- members: [
97
- 'harness-runtime',
98
- 'e2e-test',
99
- 'ensure-coverage',
100
- 'resolve-issues',
101
- 'resolve-release',
102
- 'review-pr',
103
- 'smoke',
104
- 'engineering-runtime',
105
- ],
106
- generatedIdentities: [
107
- { member: 'resolve-issues', path: 'generated/workflow-repair-policy.json' },
108
- ],
109
- },
76
+
110
77
  ]);
111
78
 
112
79
  // First-party content is distributed as an exact public npm release, so its identity is the package
@@ -119,7 +86,7 @@ export const WORKFLOW_TRUSTED_SOURCES = deepFreeze({
119
86
  id: 'first-party',
120
87
  type: 'first-party',
121
88
  package: '@1aboveio/skills',
122
- version: '0.19.3',
89
+ version: '0.20.2',
123
90
  },
124
91
  matt: {
125
92
  id: 'matt-pocock',
@@ -361,7 +361,7 @@ gcloud builds triggers create github --name="{service}-prod" \
361
361
 
362
362
  So under GitHub Flow the SHA-keyed staging verdict is a **pre-filter, not the release gate**. The gate is the prod candidate at 0% traffic, which validates the *exact shipped SHA* on real infrastructure before any user reaches it. That is sound precisely because of the 0%-candidate design — under a deploy-then-smoke pipeline the same topology would ship unvalidated commits straight to users.
363
363
 
364
- **Order is forced: merge first, then tag.** `version.mjs tag` refuses a SHA that is not an ancestor of the production branch, so the release branch cannot be rc-tagged before it lands on `main`. Merge the release PR, then mint the rc on the merge commit. Release-lane sequencing: `resolve-release` step 1.
364
+ **Order is forced: merge first, then tag.** The release tag must name a SHA on the production branch, so the release branch cannot be rc-tagged before it lands on `main`. Merge the release PR, then mint the rc on the merge commit. `rush-release` owns this sequencing.
365
365
 
366
366
  ## Build Notifications
367
367
 
@@ -377,8 +377,8 @@ A "deploy SUCCESS" only proves the revision is `Ready` — not that the real bui
377
377
 
378
378
  **Where it blocks depends on who the environment serves.** The blocking placement protects *users*, so it belongs on the **production** path. An integration environment (`dev`) has no users to protect — there, a blocking smoke only converts small bugs and infra flakes into failed builds and full rebuild cycles. So the same seam cuts differently per fork, and each fork's contract output is different:
379
379
 
380
- - **`dev` output: a SHA-keyed verdict.** Deploy at 100%, smoke as a non-blocking recorder, publish the verdict as a commit status. Nothing is gated here; the verdict blocks later, at the dev→main promotion, where the release lane pins its candidate to a validated SHA (`resolve-release` principle 11).
381
- - **prod output: a 0%-traffic candidate revision.** Deploy with `--no-traffic`, surface the revision name and candidate URL, and **stop**. The build does not smoke it and does not shift traffic — `resolve-release` does both.
380
+ - **`dev` output: a SHA-keyed verdict.** Deploy at 100%, smoke as a non-blocking recorder, and publish the verdict as a commit status. When configured as required CI, it helps `rush-release` select the newest green trunk SHA; the production candidate smoke remains the definitive release gate.
381
+ - **prod output: a 0%-traffic candidate revision.** Deploy with `--no-traffic`, surface the revision name and candidate URL, and **stop**. The build does not smoke it and does not shift traffic — `rush-release` does both.
382
382
 
383
383
  **Why the prod gate moved out of the build.** The gate did not disappear; it moved to where it can be operated:
384
384
 
@@ -397,7 +397,7 @@ The prod fork's entire contract is three facts:
397
397
  ```
398
398
  tag v*-rc.* → build → deploy --no-traffic --tag candidate → publish {revision, url} → END
399
399
 
400
- resolve-release: smoke --profile prod-preview (read-only) ──┤
400
+ rush-release: smoke --profile prod-preview (read-only) ──┤
401
401
  ALIVE → update-traffic 100%, tag v<version>
402
402
  DEAD → delete the 0% revision (traffic never moved)
403
403
  ```
@@ -468,7 +468,7 @@ Because traffic never moved, a DEAD verdict is not a rollback and has no user im
468
468
  cat /workspace/candidate.json
469
469
  ```
470
470
 
471
- **The `candidate` tag moves; the revision name does not.** Each prod build re-points `--tag=candidate` at its own new revision, so the tag URL always means "the newest candidate," not "the candidate I built." That is why the published JSON carries the **revision name** and why the release lane deletes a failed candidate **by name** and it is a second reason `resolve-release` principle 7 serializes releases: two candidates in flight would leave the earlier one addressable only by revision, its URL silently repointed at the later build.
471
+ **The `candidate` tag moves; the revision name does not.** Each prod build re-points `--tag=candidate` at its own new revision, so the tag URL always means "the newest candidate," not "the candidate I built." That is why the published JSON carries the **revision name** and why the release lane deletes a failed candidate **by name**. `rush-release` therefore refuses a second release in flight: its moving URL would silently point the earlier release at the later build.
472
472
 
473
473
  **Surface the coordinates as a GCS object keyed by the RC tag, not as log output.** The release lane already knows the tag it pushed, so it can fetch `candidates/{service}-<rc-tag>.json` without knowing the build ID — no build lookup, no log scraping, and the object outlives log retention. The `cat` at the end is a convenience for humans reading the build, not the interface. Derive the URL from `gcloud run services describe` rather than from `gcloud run deploy` output: the tag URL lives in `status.traffic[]`, and describing the service after the deploy also proves the tag actually landed (the guard above fails the build if it did not).
474
474
 
@@ -535,7 +535,7 @@ availableSecrets:
535
535
  ```
536
536
 
537
537
  - After traffic shifts, **confirm the serving revision is running this commit's image**, then run smoke against the live service URL. Capture the exit code instead of letting it fail the step. Compare **images, not revision names** — Cloud Run names revisions from its own counter, so a name-based check silently never matches and degrades to no check at all. On a mismatch, publish `failure` and **run no smoke**: traffic is on older code, so any verdict it produced would be a green light keyed to a SHA that never served.
538
- - **Publish the verdict as a commit status on the SHA** (context `dev-smoke`, state `success`/`failure`, description naming the broken path on DEAD). This is the artifact the release lane reads: `resolve-release` pins its release candidate to a SHA with green CI **and** `dev-smoke` ALIVE. The image for a SHA is immutable, so the recorded verdict stays valid after `dev` moves on no re-run at release time.
538
+ - **Publish the verdict as a commit status on the SHA** (context `dev-smoke`, state `success`/`failure`, description naming the broken path on DEAD). When branch protection requires that status, it is part of the green CI set from which `rush-release` selects its trunk SHA. The image for a SHA is immutable, so the recorded verdict stays useful after `dev` moves on; production still gets its own `prod-preview` gate.
539
539
  - The step then **exits 0 regardless of verdict**: a DEAD verdict marks the SHA unpromotable; it must not block the next dev iteration.
540
540
  - **Non-blocking must not mean silent.** On DEAD, still notify (a Pub/Sub message from the step, or a webhook on the `dev-smoke` status change) so a broken dev is known in minutes, not discovered at release time.
541
541
 
@@ -128,7 +128,7 @@ conflict, never hold the batch window open. Mechanics and the grouping rule
128
128
 
129
129
  - [cloud-build](../cloud-build/SKILL.md) — the CI the queue gates on
130
130
  - [cloud-debug](../cloud-debug/SKILL.md) — when the CI job itself is failing
131
- - [resolve-issues](../../engineering/resolve-issues/SKILL.md) — consumes this skill's delivery
131
+ - [rush-issues](../../engineering/rush-issues/SKILL.md) — consumes this skill's delivery
132
132
  watch contract when it delivers merge-ready PRs through Mergify
133
133
  - `mergify-config`, `mergify-merge-queue`, `mergify-merge-protections`, `mergify-ci`,
134
134
  `mergify-stack` (vendor plugin skills) — reference for raw CLI invocation. They document
@@ -6,9 +6,7 @@
6
6
  "ensure-coverage",
7
7
  "implement-and-pr",
8
8
  "rush-issues",
9
- "resolve-issues",
10
9
  "rush-release",
11
- "resolve-release",
12
10
  "review-pr",
13
11
  "smoke",
14
12
  "engineering-runtime"
@@ -58,26 +56,6 @@
58
56
  ],
59
57
  "generatedIdentities": []
60
58
  },
61
- {
62
- "invokedSkill": "resolve-issues",
63
- "members": [
64
- "tdd",
65
- "harness-runtime",
66
- "e2e-test",
67
- "ensure-coverage",
68
- "implement-and-pr",
69
- "resolve-issues",
70
- "review-pr",
71
- "smoke",
72
- "engineering-runtime"
73
- ],
74
- "generatedIdentities": [
75
- {
76
- "member": "resolve-issues",
77
- "path": "generated/workflow-repair-policy.json"
78
- }
79
- ]
80
- },
81
59
  {
82
60
  "invokedSkill": "rush-release",
83
61
  "members": [
@@ -85,25 +63,6 @@
85
63
  "engineering-runtime"
86
64
  ],
87
65
  "generatedIdentities": []
88
- },
89
- {
90
- "invokedSkill": "resolve-release",
91
- "members": [
92
- "harness-runtime",
93
- "e2e-test",
94
- "ensure-coverage",
95
- "resolve-issues",
96
- "resolve-release",
97
- "review-pr",
98
- "smoke",
99
- "engineering-runtime"
100
- ],
101
- "generatedIdentities": [
102
- {
103
- "member": "resolve-issues",
104
- "path": "generated/workflow-repair-policy.json"
105
- }
106
- ]
107
66
  }
108
67
  ],
109
68
  "digestAlgorithm": "sha256-path-content-v2",
@@ -383,7 +342,7 @@
383
342
  "id": "first-party",
384
343
  "type": "first-party",
385
344
  "package": "@1aboveio/skills",
386
- "version": "0.19.3"
345
+ "version": "0.20.2"
387
346
  },
388
347
  "contentDigest": "eff6c7b5931bce5b2265a619bccddd371a89df6ce7bc2edc74f11d00060a71dd",
389
348
  "digestExcludes": []
@@ -396,7 +355,7 @@
396
355
  "id": "first-party",
397
356
  "type": "first-party",
398
357
  "package": "@1aboveio/skills",
399
- "version": "0.19.3"
358
+ "version": "0.20.2"
400
359
  },
401
360
  "contentDigest": "d97abeff7bdc5ae2e4be2f631d09dba46d4753ce1e67334793364329af59f066",
402
361
  "digestExcludes": []
@@ -409,7 +368,7 @@
409
368
  "id": "first-party",
410
369
  "type": "first-party",
411
370
  "package": "@1aboveio/skills",
412
- "version": "0.19.3"
371
+ "version": "0.20.2"
413
372
  },
414
373
  "contentDigest": "00cfdd3e5bfbc3e37b1369ad93aae91161e671829760a8867ea9be25047ba461",
415
374
  "digestExcludes": []
@@ -422,7 +381,7 @@
422
381
  "id": "first-party",
423
382
  "type": "first-party",
424
383
  "package": "@1aboveio/skills",
425
- "version": "0.19.3"
384
+ "version": "0.20.2"
426
385
  },
427
386
  "contentDigest": "58b0556228a9271cf9e33727a05fc08a4fdfd29512ec0936b169f0a55d60e6ef",
428
387
  "digestExcludes": []
@@ -435,24 +394,11 @@
435
394
  "id": "first-party",
436
395
  "type": "first-party",
437
396
  "package": "@1aboveio/skills",
438
- "version": "0.19.3"
397
+ "version": "0.20.2"
439
398
  },
440
399
  "contentDigest": "4664873230f22de2fcf46b7b529570cfedabdc850620031d8f96baf89fcdc5b4",
441
400
  "digestExcludes": []
442
401
  },
443
- {
444
- "installName": "resolve-issues",
445
- "ownership": "owned",
446
- "sourcePath": "skills/engineering/resolve-issues",
447
- "expectedSource": {
448
- "id": "first-party",
449
- "type": "first-party",
450
- "package": "@1aboveio/skills",
451
- "version": "0.19.3"
452
- },
453
- "contentDigest": "3016f025b4acf3b7f61628ff3043ca55e680d0fabc7cf9fb4b4c46424d9b22ed",
454
- "digestExcludes": []
455
- },
456
402
  {
457
403
  "installName": "rush-release",
458
404
  "ownership": "owned",
@@ -461,22 +407,9 @@
461
407
  "id": "first-party",
462
408
  "type": "first-party",
463
409
  "package": "@1aboveio/skills",
464
- "version": "0.19.3"
465
- },
466
- "contentDigest": "01c192d8b4fd416af4ea02e8000e5fce0cee723a6ac2f8c0c48372087e1a262e",
467
- "digestExcludes": []
468
- },
469
- {
470
- "installName": "resolve-release",
471
- "ownership": "owned",
472
- "sourcePath": "skills/engineering/resolve-release",
473
- "expectedSource": {
474
- "id": "first-party",
475
- "type": "first-party",
476
- "package": "@1aboveio/skills",
477
- "version": "0.19.3"
410
+ "version": "0.20.2"
478
411
  },
479
- "contentDigest": "ffba0c83491676794c74721f4c6dbae430f5bc186e5a55f0764e29eaeb13829b",
412
+ "contentDigest": "cd9f398f6d8d1df7c2d944d3bec014e788535638014f327783f074757bfb4f49",
480
413
  "digestExcludes": []
481
414
  },
482
415
  {
@@ -487,7 +420,7 @@
487
420
  "id": "first-party",
488
421
  "type": "first-party",
489
422
  "package": "@1aboveio/skills",
490
- "version": "0.19.3"
423
+ "version": "0.20.2"
491
424
  },
492
425
  "contentDigest": "f048fd00c69f2dc666fc7a3096cfeee6dfba73933bfb69602f3f0e26159798cc",
493
426
  "digestExcludes": []
@@ -500,9 +433,9 @@
500
433
  "id": "first-party",
501
434
  "type": "first-party",
502
435
  "package": "@1aboveio/skills",
503
- "version": "0.19.3"
436
+ "version": "0.20.2"
504
437
  },
505
- "contentDigest": "90a7c4e1ad6da1e632ea2c5259e4967ffebb84353adccbca8dfc5d6bc50b60c1",
438
+ "contentDigest": "d533684db4483cfc90be2aa7161980b6548057ef18a4b54f0cdbcd53c79dd46d",
506
439
  "digestExcludes": []
507
440
  },
508
441
  {
@@ -513,15 +446,15 @@
513
446
  "id": "first-party",
514
447
  "type": "first-party",
515
448
  "package": "@1aboveio/skills",
516
- "version": "0.19.3"
449
+ "version": "0.20.2"
517
450
  },
518
- "contentDigest": "6ef7cf062d899835774d3010dbba511587b0d60835447417d4b74a5afe25b184",
451
+ "contentDigest": "f7f56f7e33b2b12c3043df0f4729447dfccd181daa79936ff62da38df91d5175",
519
452
  "digestExcludes": [
520
453
  "coherence/workflow.json"
521
454
  ]
522
455
  }
523
456
  ],
524
- "releaseIdentity": "63593db8810d932c5774b375f3403578b821c9df6ca6e8a866f12f2b8fc4fd47",
457
+ "releaseIdentity": "455424f618fddc62d553f7c89282887d6b449b278eb0335b72bf415f760f1b34",
525
458
  "lifecycleAuthority": "native-skills-cli",
526
459
  "repairRecipe": {
527
460
  "id": "engineering-workflow-dependency-first",
@@ -579,7 +512,7 @@
579
512
  "sourceId": "first-party",
580
513
  "sourceType": "first-party",
581
514
  "package": "@1aboveio/skills",
582
- "version": "0.19.3",
515
+ "version": "0.20.2",
583
516
  "installPath": null,
584
517
  "members": [
585
518
  "harness-runtime",
@@ -587,9 +520,7 @@
587
520
  "ensure-coverage",
588
521
  "implement-and-pr",
589
522
  "rush-issues",
590
- "resolve-issues",
591
523
  "rush-release",
592
- "resolve-release",
593
524
  "review-pr",
594
525
  "smoke",
595
526
  "engineering-runtime"
@@ -597,7 +528,7 @@
597
528
  "commands": [
598
529
  {
599
530
  "transport": "npm",
600
- "command": "npx @1aboveio/skills@0.19.3 install --group engineering-workflow --yes"
531
+ "command": "npx @1aboveio/skills@0.20.2 install --group engineering-workflow --yes"
601
532
  }
602
533
  ],
603
534
  "onFailure": {
@@ -288,7 +288,7 @@ function validateManifest(manifest) {
288
288
  add('digest-algorithm-invalid', 'engineering-runtime', 'The coherence digest algorithm is missing or unsupported.');
289
289
  }
290
290
  if (JSON.stringify(manifest.ownedMembers) !== JSON.stringify(WORKFLOW_OWNED_MEMBERS)) {
291
- add('owned-census-invalid', 'engineering-runtime', 'The exact ten-member Workflow ownership census is missing or malformed.');
291
+ add('owned-census-invalid', 'engineering-runtime', 'The exact eight-member Workflow ownership census is missing or malformed.');
292
292
  }
293
293
  if (JSON.stringify(manifest.dependencies) !== JSON.stringify([
294
294
  { groupId: 'matt-pocock-toolkit', members: MATT_DEPENDENCY_MEMBERS },
@@ -297,11 +297,9 @@ function validateManifest(manifest) {
297
297
  add('dependency-census-invalid', 'engineering-runtime', 'The exact Matt and harness runtime dependency census is missing or malformed.');
298
298
  }
299
299
  if (!exactContract(manifest.dependencyClosures, WORKFLOW_TRUSTED_DEPENDENCY_CLOSURES)) {
300
- const names = new Set(Array.isArray(manifest.dependencyClosures)
301
- ? manifest.dependencyClosures.map((closure) => closure?.invokedSkill)
302
- : []);
303
- const member = WORKFLOW_TRUSTED_DEPENDENCY_CLOSURES.find((closure) => !names.has(closure.invokedSkill))?.invokedSkill
304
- ?? 'resolve-issues';
300
+ const actual = Array.isArray(manifest.dependencyClosures) ? manifest.dependencyClosures : [];
301
+ const member = WORKFLOW_TRUSTED_DEPENDENCY_CLOSURES.find((closure, index) =>
302
+ !isDeepStrictEqual(actual[index], closure))?.invokedSkill ?? 'engineering-runtime';
305
303
  add('dependency-closure-invalid', member, 'The invoked-skill dependency closure is missing, weakened, reordered or malformed.');
306
304
  }
307
305
 
@@ -11,9 +11,7 @@ export const WORKFLOW_OWNED_MEMBERS = deepFreeze([
11
11
  'ensure-coverage',
12
12
  'implement-and-pr',
13
13
  'rush-issues',
14
- 'resolve-issues',
15
14
  'rush-release',
16
- 'resolve-release',
17
15
  'review-pr',
18
16
  'smoke',
19
17
  'engineering-runtime',
@@ -66,23 +64,7 @@ export const WORKFLOW_TRUSTED_DEPENDENCY_CLOSURES = deepFreeze([
66
64
  ],
67
65
  generatedIdentities: [],
68
66
  },
69
- {
70
- invokedSkill: 'resolve-issues',
71
- members: [
72
- 'tdd',
73
- 'harness-runtime',
74
- 'e2e-test',
75
- 'ensure-coverage',
76
- 'implement-and-pr',
77
- 'resolve-issues',
78
- 'review-pr',
79
- 'smoke',
80
- 'engineering-runtime',
81
- ],
82
- generatedIdentities: [
83
- { member: 'resolve-issues', path: 'generated/workflow-repair-policy.json' },
84
- ],
85
- },
67
+
86
68
  {
87
69
  invokedSkill: 'rush-release',
88
70
  members: [
@@ -91,22 +73,7 @@ export const WORKFLOW_TRUSTED_DEPENDENCY_CLOSURES = deepFreeze([
91
73
  ],
92
74
  generatedIdentities: [],
93
75
  },
94
- {
95
- invokedSkill: 'resolve-release',
96
- members: [
97
- 'harness-runtime',
98
- 'e2e-test',
99
- 'ensure-coverage',
100
- 'resolve-issues',
101
- 'resolve-release',
102
- 'review-pr',
103
- 'smoke',
104
- 'engineering-runtime',
105
- ],
106
- generatedIdentities: [
107
- { member: 'resolve-issues', path: 'generated/workflow-repair-policy.json' },
108
- ],
109
- },
76
+
110
77
  ]);
111
78
 
112
79
  // First-party content is distributed as an exact public npm release, so its identity is the package
@@ -119,7 +86,7 @@ export const WORKFLOW_TRUSTED_SOURCES = deepFreeze({
119
86
  id: 'first-party',
120
87
  type: 'first-party',
121
88
  package: '@1aboveio/skills',
122
- version: '0.19.3',
89
+ version: '0.20.2',
123
90
  },
124
91
  matt: {
125
92
  id: 'matt-pocock',
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rush-release
3
- description: "Slash/explicit-only (/rush-release). Cut a GitHub Flow release from main: freeze the latest CI-green trunk SHA, write the changelog, choose SemVer, merge the metadata cut through a verified PR, tag the exact merged main SHA, and watch Cloud Build or npm publish. Do not auto-select. Use only on explicit user/orchestrator invoke. NOT for GitFlow/release-branch/0%-traffic promotion (resolve-release) and NOT for implementing a spec (rush-issues)."
3
+ description: "Slash/explicit-only (/rush-release). Cut a GitHub Flow release from main: freeze the latest CI-green trunk SHA, write the changelog, choose SemVer, merge the metadata cut through a verified PR, publish npm artifacts, or validate a Cloud Run candidate at 0% before shifting it to 100%. One complete-plan confirmation covers the conditional release. Do not auto-select. Use only on explicit user/orchestrator invoke. NOT for GitFlow/release-branch promotion and NOT for implementing a spec (rush-issues)."
4
4
  disable-model-invocation: true
5
5
  ---
6
6
 
@@ -10,9 +10,10 @@ Cut a **GitHub Flow** release from **main**. Freeze one already-green trunk
10
10
  SHA, write a metadata-only version cut on that parent, merge it through a
11
11
  verified PR, tag the exact merged SHA on `main`, and watch the publisher.
12
12
 
13
- The orchestrator sequences local programs and one confirmation. It does not
14
- assemble a release branch, shift traffic, or verify production like
15
- `resolve-release`.
13
+ The orchestrator sequences local programs and exactly one user confirmation per
14
+ release plan. It does not assemble a long-lived release branch. For Cloud Run,
15
+ it owns one bounded candidate-at-0% -> validate -> shift-to-100% -> verify-live
16
+ sequence; the confirmation conditionally authorizes that whole sequence.
16
17
 
17
18
  ```text
18
19
  preflight (main + publisher)
@@ -21,8 +22,9 @@ preflight (main + publisher)
21
22
  -> confirm
22
23
  -> bump version files + commit the cut
23
24
  -> merge metadata PR + verify merged main SHA
24
- -> annotated tag on the merged SHA
25
- -> push tag -> watch Cloud Build or npm
25
+ -> npm: final tag -> watch publish
26
+ -> Cloud Run: rc tag -> candidate at 0% -> validate -> shift to 100%
27
+ -> verify live -> final tag
26
28
  ```
27
29
 
28
30
  This file is the workflow and index. Read the linked procedure immediately
@@ -33,7 +35,8 @@ before its stage; do not invent an unlinked substitute.
33
35
  | Trunk, publisher, version files | [references/preflight.md](references/preflight.md) |
34
36
  | Latest CI-green HEAD | [references/candidate.md](references/candidate.md) |
35
37
  | Changelog, SemVer, file bump, commit | [references/cut.md](references/cut.md) |
36
- | Tag, push, watch deploy | [references/publish.md](references/publish.md) |
38
+ | Tag, push, watch publisher | [references/publish.md](references/publish.md) |
39
+ | Cloud Run 0% -> 100%, verification, rollback | [references/promotion.md](references/promotion.md) |
37
40
 
38
41
  Run every script as
39
42
  `node <skillsRoot>/rush-release/scripts/<name>.mjs …` with the absolute skill
@@ -54,8 +57,22 @@ target repo and will not find these files.
54
57
  release tree's CI evidence.
55
58
  - Tags are immutable annotated `vMAJOR.MINOR.PATCH` names. Do not move, delete,
56
59
  or force-push a tag that reached a remote.
57
- - Show the plan and wait for confirmation before any git mutation or push.
58
- - A failed watch is a hand-back. This lane does not roll back production.
60
+ - A Cloud Run release uses one immutable `vMAJOR.MINOR.PATCH-rc.N` tag to build
61
+ the candidate at 0%. The final tag is created only after that exact candidate
62
+ serves 100% and passes live verification; it must not trigger another deploy.
63
+ - Ask once, on the complete plan, before any git mutation or push. That answer
64
+ authorizes the listed branch/commit, metadata PR delivery, candidate build,
65
+ conditional traffic shift, rollback, final tag, optional GitHub Release, and
66
+ publisher watch as one operation. Do not ask separate cut, merge, RC,
67
+ exposure, tag, finalization, or publish questions.
68
+ - Preflight facts are detected, not confirmed by the user. Fold any genuinely
69
+ missing choice into the one plan question instead of asking a preliminary
70
+ question. If the plan's frozen SHA, version/tag, metadata diff, publisher, or
71
+ outward actions later change, stop and present one replacement plan; otherwise
72
+ continue without re-confirming.
73
+ - A pre-exposure failure is a hand-back with production untouched. A known
74
+ post-exposure failure automatically restores and verifies the recorded
75
+ incumbent. Ambiguous production state is a stop for operator recovery.
59
76
  - The cut is metadata only (changelog + version identity files). Refuse a
60
77
  cut that changes product code.
61
78
 
@@ -63,8 +80,8 @@ target repo and will not find these files.
63
80
 
64
81
  ### 1. Preflight
65
82
 
66
- Confirm `main` is the trunk, detect whether the tag should fire Cloud Build,
67
- npm, or both, and list the files that carry the version. Details:
83
+ Verify `main` is the trunk, detect npm and/or the staged Cloud Run contract,
84
+ and list the files that carry the version. Details:
68
85
  [preflight.md](references/preflight.md).
69
86
 
70
87
  ### 2. Candidate
@@ -72,28 +89,32 @@ npm, or both, and list the files that carry the version. Details:
72
89
  Fetch `origin/main` and pick the newest green SHA. Freeze it. Details:
73
90
  [candidate.md](references/candidate.md).
74
91
 
75
- ### 3. Plan and confirm
92
+ ### 3. Plan and confirm once
76
93
 
77
- Derive the changelog and SemVer bump from `baselineTag..frozenSHA`. Show SHA,
78
- bump, version, tag, files, publisher, and notes. Do not mutate until the human
79
- confirms. Details: [cut.md](references/cut.md).
94
+ Derive the changelog and SemVer bump from `baselineTag..frozenSHA`. For Cloud
95
+ Run, pass `--cloud-run` so the plan also reserves the next unused RC tag. Show
96
+ SHA, bump, version, tags, files, publisher, notes, and every outward action. Ask one
97
+ question that both settles any unresolved choice and authorizes the whole listed
98
+ sequence. Do not mutate until the human confirms, and do not ask again while the
99
+ approved plan remains unchanged. Details: [cut.md](references/cut.md).
80
100
 
81
101
  ### 4. Cut
82
102
 
83
103
  Branch from the frozen SHA, apply the changelog and version files, commit.
84
104
  Keep the diff metadata-only.
85
105
 
86
- ### 5. Merge, tag, and watch
106
+ ### 5. Merge and publish
87
107
 
88
- Push the cut ref, merge its PR through the repository queue, verify the exact
89
- merged SHA on `main`, create the annotated tag on that SHA, push
90
- `refs/tags/<tag>` with hook-safe `--no-verify`, then watch Cloud Build and/or
91
- npm. Details: [publish.md](references/publish.md).
108
+ Push the cut ref, merge its PR through the repository queue, and verify the
109
+ exact merged SHA on `main`. An artifact-only release pushes the final tag and
110
+ watches npm. A staged Cloud Run release pushes its RC tag, executes
111
+ [promotion.md](references/promotion.md), and creates the final tag only after
112
+ live verification. Details: [publish.md](references/publish.md).
92
113
 
93
114
  ## Done
94
115
 
95
- Success is the confirmed version tagged at the verified merged `main` SHA, the tag visible on the
96
- remote, and the chosen publisher reporting that version (Cloud Build SUCCESS
97
- and/or `npm view <pkg>@<version>`). Hand back the cut SHA, merged SHA, tag,
98
- changelog excerpt, publisher evidence, and the merged metadata PR. A publisher failure hands back the same identities without claiming
99
- the version shipped to users.
116
+ Success is the confirmed version tagged at the verified merged `main` SHA and
117
+ visible on the remote. npm must report the version when selected. Cloud Run
118
+ must report the exact candidate serving 100%, the incumbent at 0%, and an ALIVE
119
+ `prod-active` verdict. Hand back the cut SHA, merged SHA, RC/final tags,
120
+ changelog excerpt, publisher and traffic evidence, and the merged metadata PR.
@@ -11,20 +11,21 @@
11
11
  "Proposes a minor SemVer bump to 1.5.0 because of feat: export csv.",
12
12
  "Includes changelog entries derived from both the feat and the fix.",
13
13
  "Tags only the queue-verified merged main SHA whose tree exactly equals the version-cut tree.",
14
- "Watches npm publish (npm view) and does not describe a 0% traffic candidate or GitFlow release branch."
14
+ "Watches npm publish (npm view) and does not describe a 0% traffic candidate or GitFlow release branch.",
15
+ "Presents one complete-plan confirmation covering cut, PR delivery, tag push, and publisher watch, with no staged confirmations."
15
16
  ]
16
17
  },
17
18
  {
18
19
  "id": 2,
19
- "prompt": "Dry-run only. Main is protected. Latest green HEAD is 2222222. Plan says v2.0.0 from a breaking change. The metadata PR merges through the queue as 3333333 and its tree exactly equals the approved cut. After you would push tag v2.0.0, Cloud Build returns FAILURE. What do you tag, how do you push it, and what happens after the failed watch? Assume cloudbuild.yaml is present.",
20
- "expected_output": "A dry-run that verifies 3333333 is on main and tree-identical to the cut, tags merged SHA 3333333 with annotated v2.0.0, pushes refs/tags/v2.0.0 with --no-verify, watches gcloud builds list, and on FAILURE leaves the tag in place, treats the version as burned, and hands back without deleting the tag or rolling back production.",
20
+ "prompt": "Dry-run only. Main is protected. Latest green HEAD is 2222222. Plan says v2.0.0 from a breaking change. The metadata PR merges through the queue as 3333333 and its tree exactly equals the approved cut. The repository has a verified Cloud Run staged contract: RC tags deploy immutable candidates with --no-traffic and final tags do not deploy. After you would push v2.0.0-rc.1, Cloud Build returns FAILURE. What do you tag, how do you push it, and what happens after the failed watch?",
21
+ "expected_output": "A dry-run that verifies 3333333 is on main and tree-identical to the cut, tags merged SHA 3333333 with annotated v2.0.0-rc.1, pushes that fully qualified ref with --no-verify, watches Cloud Build for the RC tag and exact SHA, then on FAILURE leaves the RC tag immutable, keeps v2.0.0 unused, and hands back with production untouched.",
21
22
  "files": [],
22
23
  "expectations": [
23
- "Creates an annotated v2.0.0 tag on the verified merged main SHA 3333333.",
24
- "Pushes the fully-qualified tag ref with --no-verify.",
25
- "Watches Cloud Build filtered by that tag.",
26
- "On FAILURE, does not move or delete the tag and does not roll back production.",
27
- "States the next attempt takes a new patch from a new green HEAD."
24
+ "Creates an annotated v2.0.0-rc.1 tag on the verified merged main SHA 3333333.",
25
+ "Pushes the fully-qualified RC tag ref with --no-verify.",
26
+ "Watches Cloud Build filtered by the RC tag and exact merged SHA.",
27
+ "On FAILURE, leaves the RC tag immutable and production untouched.",
28
+ "Does not create the final v2.0.0 tag or claim the final version is burned."
28
29
  ]
29
30
  },
30
31
  {
@@ -39,6 +40,19 @@
39
40
  "Restarts the changelog and SemVer plan from a new eligible main state before watching Cloud Build and npm.",
40
41
  "Does not squash-merge the metadata PR onto moved main."
41
42
  ]
43
+ },
44
+ {
45
+ "id": 4,
46
+ "prompt": "Dry-run only. One complete Cloud Run release plan was already confirmed. Candidate v1.8.0-rc.1 for merged SHA aaaaaaa is at 0%, incumbent revision old-42 is at 100%, and prod-preview is fresh, read-only, and ALIVE. Describe the rest of the release if the shift reaches candidate revision new-43 at 100% but prod-active is DEAD. Do not ask another question.",
47
+ "expected_output": "A dry-run that rechecks candidate identity and the 0/100 split, shifts under the existing authorization, observes the failed live smoke, automatically restores old-42 to 100%, verifies the restored incumbent with prod-active, leaves v1.8.0 final unused and the RC tag immutable, and hands back without another confirmation.",
48
+ "files": [],
49
+ "expectations": [
50
+ "Does not request a second exposure, rollback, or finalization confirmation.",
51
+ "Rechecks fresh ALIVE evidence, candidate identity, and candidate 0% / incumbent 100% immediately before shifting.",
52
+ "Treats prod-active DEAD after the shift as a post-exposure failure.",
53
+ "Automatically restores old-42 and verifies it at 100% with a prod-active ALIVE result.",
54
+ "Leaves the final v1.8.0 tag unused and v1.8.0-rc.1 immutable."
55
+ ]
42
56
  }
43
57
  ]
44
58
  }