@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
@@ -1,238 +0,0 @@
1
- #!/usr/bin/env node
2
- // One-shot recovery from a stale prod-preview verdict.
3
- //
4
- // Between 4a and the traffic shift, the credential can expire and the verdict can age out of
5
- // the envelope's freshness window. The correct recovery is not to paper over the window or
6
- // to shift on stale evidence; it is to re-probe the credential, re-run the prod-preview
7
- // deployment verifier, write a fresh verdict artifact, and run `green-gate.mjs shift` to
8
- // confirm the fresh evidence is still within the window.
9
- //
10
- // This script performs exactly that sequence, fail-closed at each step:
11
- // 1. credential liveness (reprobe-credentials semantics)
12
- // 2. verifier command (e.g. smoke.mjs verdict --profile prod-preview --out smoke-verdict.json)
13
- // 3. load the verdict artifact the verifier wrote
14
- // 4. run green-gate's shift evaluation against the run manifest
15
- //
16
- // Exit 0 means the candidate is re-validated and the shift gate would fire. Exit 1 means hold
17
- // — credential blocked, verifier did not produce a verdict, or the shift gate holds. Exit 2
18
- // means usage / unreadable manifest.
19
- import fs from 'node:fs'
20
- import path from 'node:path'
21
- import { fileURLToPath } from 'node:url'
22
- import { classifyCredential, DEFAULT_CREDENTIAL_COMMAND, sh } from './preflight-probes.mjs'
23
- import { evaluateShift } from './green-gate.mjs'
24
- import { isMainModule } from '../../engineering-runtime/scripts/main-module.mjs'
25
-
26
- const SCRIPT_DIR = path.dirname(fileURLToPath(import.meta.url))
27
-
28
- export function evaluateCredential(command = DEFAULT_CREDENTIAL_COMMAND, timeout = 60_000) {
29
- const result = sh(command, timeout)
30
- return classifyCredential(result)
31
- }
32
-
33
- function takeValue(argv, i, flagName, args, key) {
34
- const val = argv[++i]
35
- if (val === undefined || val.startsWith('-')) {
36
- if (val !== undefined) i-- // push flag-like token back so it is parsed as a flag/unknown
37
- args.missing.push(flagName)
38
- return i
39
- }
40
- args[key] = val
41
- return i
42
- }
43
-
44
- function takeNumber(argv, i, flagName, args, key) {
45
- const val = argv[++i]
46
- if (val === undefined || val.startsWith('-')) {
47
- if (val !== undefined) i--
48
- args.missing.push(flagName)
49
- return i
50
- }
51
- const n = Number(val)
52
- if (!Number.isFinite(n)) {
53
- args.missing.push(flagName)
54
- return i
55
- }
56
- args[key] = n
57
- return i
58
- }
59
-
60
- function parseArgs(argv) {
61
- const args = { credentialTimeoutSeconds: 60, verifierTimeoutSeconds: 300, unknown: [], missing: [] }
62
- for (let i = 0; i < argv.length; i += 1) {
63
- const a = argv[i]
64
- if (a === '--manifest') i = takeValue(argv, i, '--manifest', args, 'manifest')
65
- else if (a === '--verifier') i = takeValue(argv, i, '--verifier', args, 'verifier')
66
- else if (a === '--verdict') i = takeValue(argv, i, '--verdict', args, 'verdict')
67
- else if (a === '--credential-command') i = takeValue(argv, i, '--credential-command', args, 'credentialCommand')
68
- else if (a === '--credential-timeout') i = takeNumber(argv, i, '--credential-timeout', args, 'credentialTimeoutSeconds')
69
- else if (a === '--verifier-timeout') i = takeNumber(argv, i, '--verifier-timeout', args, 'verifierTimeoutSeconds')
70
- else if (a === '--json') args.json = true
71
- else if (a === '--help' || a === '-h') args.help = true
72
- else if (a !== undefined) args.unknown.push(a)
73
- }
74
- return args
75
- }
76
-
77
- function help() {
78
- return `revalidate-candidate — one-shot recovery from a stale prod-preview verdict.
79
-
80
- Usage:
81
- revalidate-candidate --manifest <run-manifest.json> --verifier "<command>" --verdict <path>
82
-
83
- Options:
84
- --manifest <file> resolve-release run manifest (required)
85
- --verifier <command> shell command that re-runs the prod-preview deployment verifier
86
- and writes the verdict artifact (required)
87
- --verdict <path> path to the verdict artifact the verifier produces (required)
88
- --credential-command <cmd> credential liveness probe (default: ${DEFAULT_CREDENTIAL_COMMAND})
89
- --credential-timeout <sec> credential probe timeout (default: 60)
90
- --verifier-timeout <sec> verifier timeout (default: 300)
91
- --json machine-readable summary
92
-
93
- Exit codes:
94
- 0 re-validation passes — fresh ALIVE verdict on the candidate URL, noMutations, in window
95
- 1 HOLD — credential blocked/unknown, verifier did not produce a verdict, or green-gate shift holds
96
- 2 usage / unreadable manifest
97
-
98
- The verifier command is expected to write the verdict artifact to --verdict. A non-zero
99
- verifier exit is allowed (e.g. a DEAD/EMPTY smoke verdict still writes the artifact), but if
100
- the artifact is missing after the command finishes the run is a HOLD.`
101
- }
102
-
103
- function loadManifest(file) {
104
- if (!file) return { error: 'usage: --manifest <run-manifest.json> is required' }
105
- let raw
106
- try {
107
- raw = fs.readFileSync(file, 'utf8')
108
- } catch (e) {
109
- return { error: `manifest not readable: ${file} — ${e.message}` }
110
- }
111
- let manifest
112
- try {
113
- manifest = JSON.parse(raw)
114
- } catch (e) {
115
- return { error: `manifest is not valid JSON: ${file} — ${e.message}` }
116
- }
117
- if (!manifest || typeof manifest !== 'object' || !manifest.envelope) {
118
- return { error: `not a resolve-release run manifest (no authorization envelope): ${file}` }
119
- }
120
- return { manifest }
121
- }
122
-
123
- function loadVerdict(file) {
124
- let raw
125
- try {
126
- raw = fs.readFileSync(file, 'utf8')
127
- } catch (e) {
128
- return { error: `verdict artifact not readable: ${file} — ${e.message}` }
129
- }
130
- try {
131
- return { verdict: JSON.parse(raw) }
132
- } catch (e) {
133
- return { error: `verdict artifact is not valid JSON: ${file} — ${e.message}` }
134
- }
135
- }
136
-
137
- export function main(argv) {
138
- const args = parseArgs(argv)
139
- if (args.help) {
140
- console.log(help())
141
- return 0
142
- }
143
- if (args.unknown.length > 0) {
144
- console.error(`revalidate-candidate: unknown argument(s): ${args.unknown.join(', ')}`)
145
- return 2
146
- }
147
- if (args.missing.length > 0) {
148
- console.error(`revalidate-candidate: missing or invalid value for: ${args.missing.join(', ')}`)
149
- return 2
150
- }
151
- if (!args.manifest || !args.verifier || !args.verdict) {
152
- console.error('revalidate-candidate: usage: --manifest <file> --verifier <command> --verdict <path>')
153
- return 2
154
- }
155
- if (!Number.isFinite(args.credentialTimeoutSeconds) || args.credentialTimeoutSeconds <= 0) {
156
- console.error('revalidate-candidate: --credential-timeout must be a positive number')
157
- return 2
158
- }
159
- if (!Number.isFinite(args.verifierTimeoutSeconds) || args.verifierTimeoutSeconds <= 0) {
160
- console.error('revalidate-candidate: --verifier-timeout must be a positive number')
161
- return 2
162
- }
163
-
164
- const manifestLoad = loadManifest(args.manifest)
165
- if (manifestLoad.error) {
166
- console.error(`revalidate-candidate: ${manifestLoad.error}`)
167
- return 2
168
- }
169
-
170
- // 1. Re-probe the credential first.
171
- const credential = evaluateCredential(args.credentialCommand || DEFAULT_CREDENTIAL_COMMAND, args.credentialTimeoutSeconds * 1000)
172
- if (credential.state !== 'ok') {
173
- const output = {
174
- credential: { state: credential.state, id: credential.id, detail: credential.detail, remedy: credential.remedy },
175
- decision: 'hold',
176
- reason: 'credential-not-ok',
177
- }
178
- if (args.json) {
179
- console.log(JSON.stringify(output, null, 2))
180
- } else {
181
- console.error(`revalidate-candidate: credential ${credential.state}: ${credential.detail}`)
182
- if (credential.remedy) console.error(`remedy: ${credential.remedy}`)
183
- }
184
- return 1
185
- }
186
-
187
- // 2. Run the verifier. Remove the requested verdict path first so that any verdict
188
- // loaded afterwards must have been produced by this verifier invocation; a stale
189
- // artifact left from a previous run cannot be mistaken for fresh evidence.
190
- try { fs.unlinkSync(args.verdict) } catch (e) { if (e.code !== 'ENOENT') throw e }
191
- const verifierResult = sh(args.verifier, args.verifierTimeoutSeconds * 1000)
192
-
193
- // 3. Load the verdict the verifier wrote in this invocation.
194
- const verdictLoad = loadVerdict(args.verdict)
195
- if (verdictLoad.error) {
196
- const output = {
197
- credential: { state: credential.state, id: credential.id },
198
- decision: 'hold',
199
- reason: 'verdict-missing',
200
- verifier: { ok: verifierResult.ok, stdout: verifierResult.stdout, stderr: verifierResult.stderr },
201
- error: verdictLoad.error,
202
- }
203
- if (args.json) {
204
- console.log(JSON.stringify(output, null, 2))
205
- } else {
206
- console.error(`revalidate-candidate: ${verdictLoad.error}`)
207
- if (!verifierResult.ok) {
208
- console.error('verifier output:')
209
- if (verifierResult.stdout) console.error(verifierResult.stdout)
210
- if (verifierResult.stderr) console.error(verifierResult.stderr)
211
- }
212
- }
213
- return 1
214
- }
215
-
216
- // 4. Run the green-gate shift evaluation against the fresh verdict.
217
- const shift = evaluateShift(manifestLoad.manifest, verdictLoad.verdict)
218
- const output = {
219
- credential: { state: credential.state, id: credential.id },
220
- decision: shift.decision,
221
- phase: shift.phase,
222
- failed: shift.failed,
223
- evidence: shift.evidence,
224
- }
225
-
226
- if (args.json) {
227
- console.log(JSON.stringify(output, null, 2))
228
- } else if (shift.decision === 'fire') {
229
- console.log('revalidate-candidate: FIRE — fresh prod-preview verdict, shift gate passes')
230
- } else {
231
- console.error(`revalidate-candidate: HOLD — ${shift.failed.join(', ')}`)
232
- }
233
- return shift.decision === 'fire' ? 0 : 1
234
- }
235
-
236
- if (isMainModule(import.meta.url)) {
237
- process.exitCode = main(process.argv.slice(2))
238
- }