@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.
- package/README.md +9 -4
- package/package.json +1 -1
- package/runtime/skills/distribution/generated/recipes.json +54 -48
- package/runtime/skills/distribution/scripts/bundles.mjs +113 -7
- package/runtime/skills/engineering/engineering-runtime/scripts/workflow-coherence.mjs +4 -6
- package/runtime/skills/engineering/engineering-runtime/scripts/workflow-policy.mjs +3 -36
- package/skills/cicd-pipeline/cloud-build/SKILL.md +6 -6
- package/skills/cicd-pipeline/mergify/SKILL.md +1 -1
- package/skills/engineering/engineering-runtime/coherence/workflow.json +15 -84
- package/skills/engineering/engineering-runtime/scripts/workflow-coherence.mjs +4 -6
- package/skills/engineering/engineering-runtime/scripts/workflow-policy.mjs +3 -36
- package/skills/engineering/rush-release/SKILL.md +46 -25
- package/skills/engineering/rush-release/evals/evals.json +22 -8
- package/skills/engineering/rush-release/references/cut.md +21 -4
- package/skills/engineering/rush-release/references/preflight.md +25 -6
- package/skills/engineering/rush-release/references/promotion.md +70 -0
- package/skills/engineering/rush-release/references/publish.md +49 -16
- package/skills/engineering/rush-release/scripts/plan.mjs +33 -7
- package/skills/engineering/smoke/SKILL.md +4 -4
- package/skills/engineering/smoke/references/manifest.md +3 -3
- package/skills/payment/payment-analysis/SKILL.md +5 -3
- package/skills/payment/tld-detection/SKILL.md +163 -0
- package/skills/payment/tld-detection/agents/openai.yaml +9 -0
- package/skills/payment/tld-detection/evals/evals.json +107 -0
- package/skills/payment/tld-detection/references/clean.md +51 -0
- package/skills/payment/tld-detection/references/clustering.md +219 -0
- package/skills/payment/tld-detection/references/decision.md +85 -0
- package/skills/payment/tld-detection/references/report-template.md +169 -0
- package/skills/payment/tld-detection/references/terminology.md +69 -0
- package/skills/payment/tld-detection/references/workflow.md +78 -0
- package/skills/payment/tld-detection/scripts/detect_ladders.py +390 -0
- package/skills/payment/tld-detection/tests/test_detect_ladders.py +132 -0
- package/skills/engineering/resolve-issues/SKILL.md +0 -168
- package/skills/engineering/resolve-issues/agents/openai.yaml +0 -9
- package/skills/engineering/resolve-issues/generated/workflow-repair-policy.json +0 -499
- package/skills/engineering/resolve-issues/references/breaker.md +0 -82
- package/skills/engineering/resolve-issues/references/deliverables.md +0 -27
- package/skills/engineering/resolve-issues/references/delivery.md +0 -108
- package/skills/engineering/resolve-issues/references/evidence-lane.md +0 -21
- package/skills/engineering/resolve-issues/references/exact-head-ci.md +0 -287
- package/skills/engineering/resolve-issues/references/fan-out.md +0 -33
- package/skills/engineering/resolve-issues/references/finalization.md +0 -68
- package/skills/engineering/resolve-issues/references/guarantees.md +0 -10
- package/skills/engineering/resolve-issues/references/high-risk.md +0 -29
- package/skills/engineering/resolve-issues/references/incidents/848/README.md +0 -156
- package/skills/engineering/resolve-issues/references/intake.md +0 -86
- package/skills/engineering/resolve-issues/references/integration-gate.md +0 -53
- package/skills/engineering/resolve-issues/references/interference.md +0 -87
- package/skills/engineering/resolve-issues/references/loop.md +0 -134
- package/skills/engineering/resolve-issues/references/model-catalog.md +0 -9
- package/skills/engineering/resolve-issues/references/postmortem.md +0 -27
- package/skills/engineering/resolve-issues/references/pre-flight-model-slots.md +0 -41
- package/skills/engineering/resolve-issues/references/pre-flight-recording-and-checkout.md +0 -48
- package/skills/engineering/resolve-issues/references/pre-flight.md +0 -41
- package/skills/engineering/resolve-issues/references/regression-checklist.md +0 -26
- package/skills/engineering/resolve-issues/references/run-state.md +0 -288
- package/skills/engineering/resolve-issues/references/sandboxed-testing.md +0 -48
- package/skills/engineering/resolve-issues/references/spawn-contract.md +0 -96
- package/skills/engineering/resolve-issues/references/terminal-evidence-journal.md +0 -40
- package/skills/engineering/resolve-issues/references/why.md +0 -653
- package/skills/engineering/resolve-issues/schemas/fix-round.schema.json +0 -49
- package/skills/engineering/resolve-issues/scripts/combine-and-verify.mjs +0 -721
- package/skills/engineering/resolve-issues/scripts/component-candidate.mjs +0 -962
- package/skills/engineering/resolve-issues/scripts/contract-revision.mjs +0 -220
- package/skills/engineering/resolve-issues/scripts/detect-delivery-mode.mjs +0 -420
- package/skills/engineering/resolve-issues/scripts/detect-target-branch.mjs +0 -256
- package/skills/engineering/resolve-issues/scripts/detect-workspace-mode.mjs +0 -168
- package/skills/engineering/resolve-issues/scripts/discover-models.mjs +0 -9
- package/skills/engineering/resolve-issues/scripts/doctrine.mjs +0 -62
- package/skills/engineering/resolve-issues/scripts/evidence-lifecycle-contract.mjs +0 -191
- package/skills/engineering/resolve-issues/scripts/exact-head-ci.mjs +0 -413
- package/skills/engineering/resolve-issues/scripts/exact-head-github-provider.mjs +0 -332
- package/skills/engineering/resolve-issues/scripts/finalize.mjs +0 -488
- package/skills/engineering/resolve-issues/scripts/fix-rounds.mjs +0 -3307
- package/skills/engineering/resolve-issues/scripts/fixtures/evidence-lifecycle-circular-1001.json +0 -16
- package/skills/engineering/resolve-issues/scripts/fixtures/evidence-lifecycle-valid-sequencing.json +0 -51
- package/skills/engineering/resolve-issues/scripts/fixtures/fmm-express-830-component-candidate.json +0 -17
- package/skills/engineering/resolve-issues/scripts/fixtures/head-check-set-1081.json +0 -166
- package/skills/engineering/resolve-issues/scripts/gate-value-series.mjs +0 -92
- package/skills/engineering/resolve-issues/scripts/guide-index.mjs +0 -73
- package/skills/engineering/resolve-issues/scripts/head-check-set.mjs +0 -159
- package/skills/engineering/resolve-issues/scripts/interference.mjs +0 -427
- package/skills/engineering/resolve-issues/scripts/model-catalog.mjs +0 -9
- package/skills/engineering/resolve-issues/scripts/next-operations.mjs +0 -419
- package/skills/engineering/resolve-issues/scripts/postmortem.mjs +0 -909
- package/skills/engineering/resolve-issues/scripts/preflight-questions.mjs +0 -345
- package/skills/engineering/resolve-issues/scripts/reconcile-contained-unit-prs.mjs +0 -415
- package/skills/engineering/resolve-issues/scripts/release-state-contract.mjs +0 -697
- package/skills/engineering/resolve-issues/scripts/report.mjs +0 -494
- package/skills/engineering/resolve-issues/scripts/required-check-plan.mjs +0 -172
- package/skills/engineering/resolve-issues/scripts/round-metadata.mjs +0 -79
- package/skills/engineering/resolve-issues/scripts/run-state-review6-cases.mjs +0 -334
- package/skills/engineering/resolve-issues/scripts/run-state.mjs +0 -4792
- package/skills/engineering/resolve-issues/scripts/sandbox-selftest.mjs +0 -395
- package/skills/engineering/resolve-issues/scripts/spawn-contract.mjs +0 -290
- package/skills/engineering/resolve-issues/scripts/terminal-dispositions.mjs +0 -170
- package/skills/engineering/resolve-issues/scripts/terminal-evidence-journal.mjs +0 -293
- package/skills/engineering/resolve-issues/scripts/unit-kind.mjs +0 -197
- package/skills/engineering/resolve-issues/scripts/unit-lifecycle.mjs +0 -127
- package/skills/engineering/resolve-issues/scripts/watch-delivery.mjs +0 -893
- package/skills/engineering/resolve-issues/scripts/workspaces.mjs +0 -829
- package/skills/engineering/resolve-issues/workflows/independent-review.workflow.js +0 -290
- package/skills/engineering/resolve-issues/workflows/prior-art-scan.workflow.js +0 -80
- package/skills/engineering/resolve-issues/workflows/workflow-smoke.mjs +0 -102
- package/skills/engineering/resolve-release/LICENSE +0 -3
- package/skills/engineering/resolve-release/SKILL.md +0 -113
- package/skills/engineering/resolve-release/agents/openai.yaml +0 -9
- package/skills/engineering/resolve-release/references/assembly.md +0 -137
- package/skills/engineering/resolve-release/references/auto-when-green.md +0 -56
- package/skills/engineering/resolve-release/references/candidate.md +0 -167
- package/skills/engineering/resolve-release/references/exposure.md +0 -178
- package/skills/engineering/resolve-release/references/handoff.md +0 -24
- package/skills/engineering/resolve-release/references/postmortem.md +0 -230
- package/skills/engineering/resolve-release/references/preflight.md +0 -208
- package/skills/engineering/resolve-release/references/principles.md +0 -94
- package/skills/engineering/resolve-release/references/regression-checklist.md +0 -36
- package/skills/engineering/resolve-release/references/related-skills.md +0 -13
- package/skills/engineering/resolve-release/references/routing.md +0 -149
- package/skills/engineering/resolve-release/references/verified-sha-github-flow.md +0 -285
- package/skills/engineering/resolve-release/references/versioning.md +0 -202
- package/skills/engineering/resolve-release/references/why.md +0 -53
- package/skills/engineering/resolve-release/scripts/adapter-completion-artifact.mjs +0 -389
- package/skills/engineering/resolve-release/scripts/build-changes.mjs +0 -209
- package/skills/engineering/resolve-release/scripts/candidate-hygiene.mjs +0 -407
- package/skills/engineering/resolve-release/scripts/candidate-identity.mjs +0 -904
- package/skills/engineering/resolve-release/scripts/candidate-traffic.mjs +0 -81
- package/skills/engineering/resolve-release/scripts/checked-adapter-loader.mjs +0 -612
- package/skills/engineering/resolve-release/scripts/close-attempt.mjs +0 -135
- package/skills/engineering/resolve-release/scripts/closeout-release.mjs +0 -161
- package/skills/engineering/resolve-release/scripts/doctrine.mjs +0 -106
- package/skills/engineering/resolve-release/scripts/durable-processing.mjs +0 -522
- package/skills/engineering/resolve-release/scripts/ensure-target-green.mjs +0 -659
- package/skills/engineering/resolve-release/scripts/evidence-bundle.mjs +0 -1014
- package/skills/engineering/resolve-release/scripts/finalize-release.mjs +0 -526
- package/skills/engineering/resolve-release/scripts/fixtures/durable-processing-adapter.mjs +0 -169
- package/skills/engineering/resolve-release/scripts/green-gate.mjs +0 -599
- package/skills/engineering/resolve-release/scripts/isolated-adapter-evaluator.mjs +0 -752
- package/skills/engineering/resolve-release/scripts/metadata-pr-status.mjs +0 -56
- package/skills/engineering/resolve-release/scripts/metadata-sync.mjs +0 -1538
- package/skills/engineering/resolve-release/scripts/postmortem.mjs +0 -381
- package/skills/engineering/resolve-release/scripts/preflight-probes.mjs +0 -510
- package/skills/engineering/resolve-release/scripts/production-endpoints.mjs +0 -326
- package/skills/engineering/resolve-release/scripts/rc-circuit-breaker.mjs +0 -272
- package/skills/engineering/resolve-release/scripts/report.mjs +0 -417
- package/skills/engineering/resolve-release/scripts/reprobe-credentials.mjs +0 -114
- package/skills/engineering/resolve-release/scripts/revalidate-candidate.mjs +0 -238
- package/skills/engineering/resolve-release/scripts/review-packet.mjs +0 -503
- package/skills/engineering/resolve-release/scripts/rollback-floor.mjs +0 -263
- package/skills/engineering/resolve-release/scripts/version-assert.mjs +0 -339
- package/skills/engineering/resolve-release/scripts/version-postmortem.mjs +0 -485
- package/skills/engineering/resolve-release/scripts/version.mjs +0 -1199
- package/skills/engineering/resolve-release/scripts/watch-candidate-delivery.mjs +0 -449
- package/skills/engineering/resolve-release/vendor/ACORN-LICENSE +0 -21
- package/skills/engineering/resolve-release/vendor/README.md +0 -60
- package/skills/engineering/resolve-release/vendor/acorn.mjs +0 -6233
- package/skills/engineering/resolve-release/vendor/quickjs/core/LICENSE +0 -21
- package/skills/engineering/resolve-release/vendor/quickjs/core/README.md +0 -341
- package/skills/engineering/resolve-release/vendor/quickjs/core/README.template.md +0 -70
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-TAV5CUKK.mjs +0 -2
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-TAV5CUKK.mjs.map +0 -1
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-V2S4ZYJR.mjs +0 -7
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-V2S4ZYJR.mjs.map +0 -1
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.d.mts +0 -2033
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.d.ts +0 -2033
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.js +0 -7
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.js.map +0 -1
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.mjs +0 -2
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.mjs.map +0 -1
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-ES6BEMUI.mjs +0 -2
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-ES6BEMUI.mjs.map +0 -1
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-asyncify-2EFITU5U.mjs +0 -2
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-asyncify-2EFITU5U.mjs.map +0 -1
- package/skills/engineering/resolve-release/vendor/quickjs/core/package.json +0 -49
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/LICENSE +0 -21
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/README.md +0 -5
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.d.mts +0 -549
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.d.ts +0 -549
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.js +0 -2
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.js.map +0 -1
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.mjs +0 -2
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.mjs.map +0 -1
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/package.json +0 -36
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/LICENSE +0 -47
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/README.md +0 -82
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.browser.d.ts +0 -11
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.browser.mjs +0 -22
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cjs +0 -21
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cloudflare.cjs +0 -21
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cloudflare.d.ts +0 -11
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.d.ts +0 -11
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.mjs +0 -25
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.wasm +0 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.d.mts +0 -85
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.d.ts +0 -85
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.js +0 -2
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.js.map +0 -1
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.mjs +0 -2
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.mjs.map +0 -1
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.d.mts +0 -20
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.d.ts +0 -20
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.js +0 -2
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.js.map +0 -1
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.mjs +0 -2
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.mjs.map +0 -1
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/package.json +0 -61
- /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
|
-
}
|