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