@1aboveio/skills 0.19.3 → 0.20.1

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 (197) 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/mergify/SKILL.md +1 -1
  8. package/skills/engineering/engineering-runtime/coherence/workflow.json +14 -83
  9. package/skills/engineering/engineering-runtime/scripts/workflow-coherence.mjs +4 -6
  10. package/skills/engineering/engineering-runtime/scripts/workflow-policy.mjs +3 -36
  11. package/skills/engineering/smoke/SKILL.md +1 -1
  12. package/skills/payment/payment-analysis/SKILL.md +5 -3
  13. package/skills/payment/tld-detection/SKILL.md +163 -0
  14. package/skills/payment/tld-detection/agents/openai.yaml +9 -0
  15. package/skills/payment/tld-detection/evals/evals.json +107 -0
  16. package/skills/payment/tld-detection/references/clean.md +51 -0
  17. package/skills/payment/tld-detection/references/clustering.md +219 -0
  18. package/skills/payment/tld-detection/references/decision.md +85 -0
  19. package/skills/payment/tld-detection/references/report-template.md +169 -0
  20. package/skills/payment/tld-detection/references/terminology.md +69 -0
  21. package/skills/payment/tld-detection/references/workflow.md +78 -0
  22. package/skills/payment/tld-detection/scripts/detect_ladders.py +390 -0
  23. package/skills/payment/tld-detection/tests/test_detect_ladders.py +132 -0
  24. package/skills/engineering/resolve-issues/SKILL.md +0 -168
  25. package/skills/engineering/resolve-issues/agents/openai.yaml +0 -9
  26. package/skills/engineering/resolve-issues/generated/workflow-repair-policy.json +0 -499
  27. package/skills/engineering/resolve-issues/references/breaker.md +0 -82
  28. package/skills/engineering/resolve-issues/references/deliverables.md +0 -27
  29. package/skills/engineering/resolve-issues/references/delivery.md +0 -108
  30. package/skills/engineering/resolve-issues/references/evidence-lane.md +0 -21
  31. package/skills/engineering/resolve-issues/references/exact-head-ci.md +0 -287
  32. package/skills/engineering/resolve-issues/references/fan-out.md +0 -33
  33. package/skills/engineering/resolve-issues/references/finalization.md +0 -68
  34. package/skills/engineering/resolve-issues/references/guarantees.md +0 -10
  35. package/skills/engineering/resolve-issues/references/high-risk.md +0 -29
  36. package/skills/engineering/resolve-issues/references/incidents/848/README.md +0 -156
  37. package/skills/engineering/resolve-issues/references/intake.md +0 -86
  38. package/skills/engineering/resolve-issues/references/integration-gate.md +0 -53
  39. package/skills/engineering/resolve-issues/references/interference.md +0 -87
  40. package/skills/engineering/resolve-issues/references/loop.md +0 -134
  41. package/skills/engineering/resolve-issues/references/model-catalog.md +0 -9
  42. package/skills/engineering/resolve-issues/references/postmortem.md +0 -27
  43. package/skills/engineering/resolve-issues/references/pre-flight-model-slots.md +0 -41
  44. package/skills/engineering/resolve-issues/references/pre-flight-recording-and-checkout.md +0 -48
  45. package/skills/engineering/resolve-issues/references/pre-flight.md +0 -41
  46. package/skills/engineering/resolve-issues/references/regression-checklist.md +0 -26
  47. package/skills/engineering/resolve-issues/references/run-state.md +0 -288
  48. package/skills/engineering/resolve-issues/references/sandboxed-testing.md +0 -48
  49. package/skills/engineering/resolve-issues/references/spawn-contract.md +0 -96
  50. package/skills/engineering/resolve-issues/references/terminal-evidence-journal.md +0 -40
  51. package/skills/engineering/resolve-issues/references/why.md +0 -653
  52. package/skills/engineering/resolve-issues/schemas/fix-round.schema.json +0 -49
  53. package/skills/engineering/resolve-issues/scripts/combine-and-verify.mjs +0 -721
  54. package/skills/engineering/resolve-issues/scripts/component-candidate.mjs +0 -962
  55. package/skills/engineering/resolve-issues/scripts/contract-revision.mjs +0 -220
  56. package/skills/engineering/resolve-issues/scripts/detect-delivery-mode.mjs +0 -420
  57. package/skills/engineering/resolve-issues/scripts/detect-target-branch.mjs +0 -256
  58. package/skills/engineering/resolve-issues/scripts/detect-workspace-mode.mjs +0 -168
  59. package/skills/engineering/resolve-issues/scripts/discover-models.mjs +0 -9
  60. package/skills/engineering/resolve-issues/scripts/doctrine.mjs +0 -62
  61. package/skills/engineering/resolve-issues/scripts/evidence-lifecycle-contract.mjs +0 -191
  62. package/skills/engineering/resolve-issues/scripts/exact-head-ci.mjs +0 -413
  63. package/skills/engineering/resolve-issues/scripts/exact-head-github-provider.mjs +0 -332
  64. package/skills/engineering/resolve-issues/scripts/finalize.mjs +0 -488
  65. package/skills/engineering/resolve-issues/scripts/fix-rounds.mjs +0 -3307
  66. package/skills/engineering/resolve-issues/scripts/fixtures/evidence-lifecycle-circular-1001.json +0 -16
  67. package/skills/engineering/resolve-issues/scripts/fixtures/evidence-lifecycle-valid-sequencing.json +0 -51
  68. package/skills/engineering/resolve-issues/scripts/fixtures/fmm-express-830-component-candidate.json +0 -17
  69. package/skills/engineering/resolve-issues/scripts/fixtures/head-check-set-1081.json +0 -166
  70. package/skills/engineering/resolve-issues/scripts/gate-value-series.mjs +0 -92
  71. package/skills/engineering/resolve-issues/scripts/guide-index.mjs +0 -73
  72. package/skills/engineering/resolve-issues/scripts/head-check-set.mjs +0 -159
  73. package/skills/engineering/resolve-issues/scripts/interference.mjs +0 -427
  74. package/skills/engineering/resolve-issues/scripts/model-catalog.mjs +0 -9
  75. package/skills/engineering/resolve-issues/scripts/next-operations.mjs +0 -419
  76. package/skills/engineering/resolve-issues/scripts/postmortem.mjs +0 -909
  77. package/skills/engineering/resolve-issues/scripts/preflight-questions.mjs +0 -345
  78. package/skills/engineering/resolve-issues/scripts/reconcile-contained-unit-prs.mjs +0 -415
  79. package/skills/engineering/resolve-issues/scripts/release-state-contract.mjs +0 -697
  80. package/skills/engineering/resolve-issues/scripts/report.mjs +0 -494
  81. package/skills/engineering/resolve-issues/scripts/required-check-plan.mjs +0 -172
  82. package/skills/engineering/resolve-issues/scripts/round-metadata.mjs +0 -79
  83. package/skills/engineering/resolve-issues/scripts/run-state-review6-cases.mjs +0 -334
  84. package/skills/engineering/resolve-issues/scripts/run-state.mjs +0 -4792
  85. package/skills/engineering/resolve-issues/scripts/sandbox-selftest.mjs +0 -395
  86. package/skills/engineering/resolve-issues/scripts/spawn-contract.mjs +0 -290
  87. package/skills/engineering/resolve-issues/scripts/terminal-dispositions.mjs +0 -170
  88. package/skills/engineering/resolve-issues/scripts/terminal-evidence-journal.mjs +0 -293
  89. package/skills/engineering/resolve-issues/scripts/unit-kind.mjs +0 -197
  90. package/skills/engineering/resolve-issues/scripts/unit-lifecycle.mjs +0 -127
  91. package/skills/engineering/resolve-issues/scripts/watch-delivery.mjs +0 -893
  92. package/skills/engineering/resolve-issues/scripts/workspaces.mjs +0 -829
  93. package/skills/engineering/resolve-issues/workflows/independent-review.workflow.js +0 -290
  94. package/skills/engineering/resolve-issues/workflows/prior-art-scan.workflow.js +0 -80
  95. package/skills/engineering/resolve-issues/workflows/workflow-smoke.mjs +0 -102
  96. package/skills/engineering/resolve-release/LICENSE +0 -3
  97. package/skills/engineering/resolve-release/SKILL.md +0 -113
  98. package/skills/engineering/resolve-release/agents/openai.yaml +0 -9
  99. package/skills/engineering/resolve-release/references/assembly.md +0 -137
  100. package/skills/engineering/resolve-release/references/auto-when-green.md +0 -56
  101. package/skills/engineering/resolve-release/references/candidate.md +0 -167
  102. package/skills/engineering/resolve-release/references/exposure.md +0 -178
  103. package/skills/engineering/resolve-release/references/handoff.md +0 -24
  104. package/skills/engineering/resolve-release/references/postmortem.md +0 -230
  105. package/skills/engineering/resolve-release/references/preflight.md +0 -208
  106. package/skills/engineering/resolve-release/references/principles.md +0 -94
  107. package/skills/engineering/resolve-release/references/regression-checklist.md +0 -36
  108. package/skills/engineering/resolve-release/references/related-skills.md +0 -13
  109. package/skills/engineering/resolve-release/references/routing.md +0 -149
  110. package/skills/engineering/resolve-release/references/verified-sha-github-flow.md +0 -285
  111. package/skills/engineering/resolve-release/references/versioning.md +0 -202
  112. package/skills/engineering/resolve-release/references/why.md +0 -53
  113. package/skills/engineering/resolve-release/scripts/adapter-completion-artifact.mjs +0 -389
  114. package/skills/engineering/resolve-release/scripts/build-changes.mjs +0 -209
  115. package/skills/engineering/resolve-release/scripts/candidate-hygiene.mjs +0 -407
  116. package/skills/engineering/resolve-release/scripts/candidate-identity.mjs +0 -904
  117. package/skills/engineering/resolve-release/scripts/candidate-traffic.mjs +0 -81
  118. package/skills/engineering/resolve-release/scripts/checked-adapter-loader.mjs +0 -612
  119. package/skills/engineering/resolve-release/scripts/close-attempt.mjs +0 -135
  120. package/skills/engineering/resolve-release/scripts/closeout-release.mjs +0 -161
  121. package/skills/engineering/resolve-release/scripts/doctrine.mjs +0 -106
  122. package/skills/engineering/resolve-release/scripts/durable-processing.mjs +0 -522
  123. package/skills/engineering/resolve-release/scripts/ensure-target-green.mjs +0 -659
  124. package/skills/engineering/resolve-release/scripts/evidence-bundle.mjs +0 -1014
  125. package/skills/engineering/resolve-release/scripts/finalize-release.mjs +0 -526
  126. package/skills/engineering/resolve-release/scripts/fixtures/durable-processing-adapter.mjs +0 -169
  127. package/skills/engineering/resolve-release/scripts/green-gate.mjs +0 -599
  128. package/skills/engineering/resolve-release/scripts/isolated-adapter-evaluator.mjs +0 -752
  129. package/skills/engineering/resolve-release/scripts/metadata-pr-status.mjs +0 -56
  130. package/skills/engineering/resolve-release/scripts/metadata-sync.mjs +0 -1538
  131. package/skills/engineering/resolve-release/scripts/postmortem.mjs +0 -381
  132. package/skills/engineering/resolve-release/scripts/preflight-probes.mjs +0 -510
  133. package/skills/engineering/resolve-release/scripts/production-endpoints.mjs +0 -326
  134. package/skills/engineering/resolve-release/scripts/rc-circuit-breaker.mjs +0 -272
  135. package/skills/engineering/resolve-release/scripts/report.mjs +0 -417
  136. package/skills/engineering/resolve-release/scripts/reprobe-credentials.mjs +0 -114
  137. package/skills/engineering/resolve-release/scripts/revalidate-candidate.mjs +0 -238
  138. package/skills/engineering/resolve-release/scripts/review-packet.mjs +0 -503
  139. package/skills/engineering/resolve-release/scripts/rollback-floor.mjs +0 -263
  140. package/skills/engineering/resolve-release/scripts/version-assert.mjs +0 -339
  141. package/skills/engineering/resolve-release/scripts/version-postmortem.mjs +0 -485
  142. package/skills/engineering/resolve-release/scripts/version.mjs +0 -1199
  143. package/skills/engineering/resolve-release/scripts/watch-candidate-delivery.mjs +0 -449
  144. package/skills/engineering/resolve-release/vendor/ACORN-LICENSE +0 -21
  145. package/skills/engineering/resolve-release/vendor/README.md +0 -60
  146. package/skills/engineering/resolve-release/vendor/acorn.mjs +0 -6233
  147. package/skills/engineering/resolve-release/vendor/quickjs/core/LICENSE +0 -21
  148. package/skills/engineering/resolve-release/vendor/quickjs/core/README.md +0 -341
  149. package/skills/engineering/resolve-release/vendor/quickjs/core/README.template.md +0 -70
  150. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-TAV5CUKK.mjs +0 -2
  151. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-TAV5CUKK.mjs.map +0 -1
  152. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-V2S4ZYJR.mjs +0 -7
  153. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-V2S4ZYJR.mjs.map +0 -1
  154. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.d.mts +0 -2033
  155. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.d.ts +0 -2033
  156. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.js +0 -7
  157. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.js.map +0 -1
  158. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.mjs +0 -2
  159. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.mjs.map +0 -1
  160. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-ES6BEMUI.mjs +0 -2
  161. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-ES6BEMUI.mjs.map +0 -1
  162. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-asyncify-2EFITU5U.mjs +0 -2
  163. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-asyncify-2EFITU5U.mjs.map +0 -1
  164. package/skills/engineering/resolve-release/vendor/quickjs/core/package.json +0 -49
  165. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/LICENSE +0 -21
  166. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/README.md +0 -5
  167. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.d.mts +0 -549
  168. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.d.ts +0 -549
  169. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.js +0 -2
  170. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.js.map +0 -1
  171. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.mjs +0 -2
  172. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.mjs.map +0 -1
  173. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/package.json +0 -36
  174. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/LICENSE +0 -47
  175. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/README.md +0 -82
  176. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.browser.d.ts +0 -11
  177. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.browser.mjs +0 -22
  178. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cjs +0 -21
  179. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cloudflare.cjs +0 -21
  180. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cloudflare.d.ts +0 -11
  181. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.d.ts +0 -11
  182. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.mjs +0 -25
  183. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.wasm +0 -0
  184. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.d.mts +0 -85
  185. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.d.ts +0 -85
  186. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.js +0 -2
  187. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.js.map +0 -1
  188. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.mjs +0 -2
  189. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.mjs.map +0 -1
  190. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.d.mts +0 -20
  191. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.d.ts +0 -20
  192. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.js +0 -2
  193. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.js.map +0 -1
  194. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.mjs +0 -2
  195. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.mjs.map +0 -1
  196. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/package.json +0 -61
  197. /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
- }