@coderifts/agent-guard 8.5.0 → 9.1.0
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 +37 -23
- package/dist/cjs/cas-attestation.d.ts +22 -0
- package/dist/cjs/cas-attestation.d.ts.map +1 -1
- package/dist/cjs/cas-attestation.js +49 -3
- package/dist/cjs/cas-attestation.js.map +1 -1
- package/dist/cjs/deploy-bind.d.ts +9 -7
- package/dist/cjs/deploy-bind.d.ts.map +1 -1
- package/dist/cjs/deploy-bind.js +9 -3
- package/dist/cjs/deploy-bind.js.map +1 -1
- package/dist/cjs/deploy-gate.d.ts +54 -6
- package/dist/cjs/deploy-gate.d.ts.map +1 -1
- package/dist/cjs/deploy-gate.js +73 -12
- package/dist/cjs/deploy-gate.js.map +1 -1
- package/dist/cjs/deploy-receipt-token.d.ts +59 -0
- package/dist/cjs/deploy-receipt-token.d.ts.map +1 -0
- package/dist/cjs/deploy-receipt-token.js +245 -0
- package/dist/cjs/deploy-receipt-token.js.map +1 -0
- package/dist/cjs/execution-proof.d.ts +11 -0
- package/dist/cjs/execution-proof.d.ts.map +1 -1
- package/dist/cjs/execution-proof.js +6 -0
- package/dist/cjs/execution-proof.js.map +1 -1
- package/dist/cjs/final-answer-proof.d.ts +1 -1
- package/dist/cjs/final-answer-proof.d.ts.map +1 -1
- package/dist/cjs/final-answer-proof.js +18 -1
- package/dist/cjs/final-answer-proof.js.map +1 -1
- package/dist/cjs/guard.d.ts.map +1 -1
- package/dist/cjs/guard.js +19 -6
- package/dist/cjs/guard.js.map +1 -1
- package/dist/cjs/index.d.ts +6 -4
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +10 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/types.d.ts +7 -0
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/esm/cas-attestation.d.ts +22 -0
- package/dist/esm/cas-attestation.d.ts.map +1 -1
- package/dist/esm/cas-attestation.js +47 -2
- package/dist/esm/cas-attestation.js.map +1 -1
- package/dist/esm/deploy-bind.d.ts +9 -7
- package/dist/esm/deploy-bind.d.ts.map +1 -1
- package/dist/esm/deploy-bind.js +9 -3
- package/dist/esm/deploy-bind.js.map +1 -1
- package/dist/esm/deploy-gate.d.ts +54 -6
- package/dist/esm/deploy-gate.d.ts.map +1 -1
- package/dist/esm/deploy-gate.js +70 -12
- package/dist/esm/deploy-gate.js.map +1 -1
- package/dist/esm/deploy-receipt-token.d.ts +59 -0
- package/dist/esm/deploy-receipt-token.d.ts.map +1 -0
- package/dist/esm/deploy-receipt-token.js +241 -0
- package/dist/esm/deploy-receipt-token.js.map +1 -0
- package/dist/esm/execution-proof.d.ts +11 -0
- package/dist/esm/execution-proof.d.ts.map +1 -1
- package/dist/esm/execution-proof.js +6 -0
- package/dist/esm/execution-proof.js.map +1 -1
- package/dist/esm/final-answer-proof.d.ts +1 -1
- package/dist/esm/final-answer-proof.d.ts.map +1 -1
- package/dist/esm/final-answer-proof.js +18 -1
- package/dist/esm/final-answer-proof.js.map +1 -1
- package/dist/esm/guard.d.ts.map +1 -1
- package/dist/esm/guard.js +20 -7
- package/dist/esm/guard.js.map +1 -1
- package/dist/esm/index.d.ts +6 -4
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +3 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/types.d.ts +7 -0
- package/dist/esm/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -257,7 +257,10 @@ Honesty (do not over-claim):
|
|
|
257
257
|
- **CAS / conditional write** is a **host assertion** (`conditional_write: true` on the write).
|
|
258
258
|
This package never writes and cannot verify the swap. `requireConditionalWrite` refuses
|
|
259
259
|
`enforced: true` when the host does not report it. No atomic CAS at commit; T3 observes the
|
|
260
|
-
result after the write (not atomic).
|
|
260
|
+
result after the write (not atomic). Under `ENFORCING_STRICT`, `enforced` remains that
|
|
261
|
+
pre-write fact; the final success name is `authorized_and_committed` only when
|
|
262
|
+
`cas_evidence` is `executor_attested` and the attestation cross-checks grant/receipt —
|
|
263
|
+
otherwise `authorized_not_committed` (`commit_evidence_missing`).
|
|
261
264
|
- Host-invoked raw tools outside the returned table remain invisible
|
|
262
265
|
(`calls_outside_guarded_path_invisible`). `composition_assurance.inescapable_runtime` stays false.
|
|
263
266
|
|
|
@@ -570,30 +573,46 @@ honest, so the composition hands the caller the piece it owns and stops.
|
|
|
570
573
|
|
|
571
574
|
#### `deployGate` and deploy-time `bindDeploy`
|
|
572
575
|
|
|
573
|
-
`deployGate` is the pure decision. **`bindDeploy`** is the pure **caller** at the
|
|
574
|
-
|
|
575
|
-
|
|
576
|
+
`deployGate` is the pure decision. **`bindDeploy`** is the pure **caller** at the
|
|
577
|
+
moment of deploying. Two **explicit, non-guessable** receipt input modes (9.0.0;
|
|
578
|
+
P0 / audit 2026-08-24):
|
|
576
579
|
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
580
|
+
**(a) TOKEN mode (recommended).** Pass the signed chain_receipt token plus
|
|
581
|
+
`{ registry | pinnedKeyPem }` and the decision envelope. The guard verifies
|
|
582
|
+
**locally** (Ed25519, kid / retired window, body-hash, ID104 leeway). No
|
|
583
|
+
HTTP — SDK 3.4.0 `client.verifyReceipt` is I/O and is not used here.
|
|
584
|
+
|
|
585
|
+
**(b) VERIFIED-VIEW mode.** Pass `{ view_spec: 'deploy-receipt-view.v1',
|
|
586
|
+
verified: true, verify_status, currently_authorized, bounds… }` produced by a
|
|
587
|
+
verification the host attributes. Stamp with `asVerifiedDeployReceiptView`.
|
|
588
|
+
The marker is the same idiom as `proof_spec` / `attestation_spec`.
|
|
589
|
+
|
|
590
|
+
A bare `{ currently_authorized: true }` with **no** `view_spec` and **no**
|
|
591
|
+
token is DENY `unverified_receipt_view` — not `receipt_not_authorized`.
|
|
592
|
+
|
|
593
|
+
`g.verification = { mode, verify_status }` is observation (not a preimage).
|
|
594
|
+
The environment name remains a **host assertion**
|
|
595
|
+
(`environment.provenance: 'host_asserted'`).
|
|
582
596
|
|
|
583
597
|
```typescript
|
|
584
|
-
import { bindDeploy } from '@coderifts/agent-guard';
|
|
598
|
+
import { bindDeploy, asVerifiedDeployReceiptView, deployGate } from '@coderifts/agent-guard';
|
|
599
|
+
|
|
600
|
+
// TOKEN (recommended)
|
|
601
|
+
const g = deployGate({
|
|
602
|
+
deployTarget: { environment: 'production', artifact_id: digest },
|
|
603
|
+
token: { token, decision_result, registry }, // or pinnedKeyPem
|
|
604
|
+
requiredContext: { operation: 'deploy', enforcement: { enforcement: 'ENFORCING', bypass_possible: false } },
|
|
605
|
+
});
|
|
606
|
+
// g.verification.mode === 'token'
|
|
585
607
|
|
|
608
|
+
// VERIFIED-VIEW (host already verified)
|
|
586
609
|
const r = bindDeploy({
|
|
587
610
|
environment: { name: 'production', provenance: 'host_asserted' },
|
|
588
611
|
artifact_id: digest,
|
|
589
|
-
receipt:
|
|
612
|
+
receipt: asVerifiedDeployReceiptView(computedView, 'VERIFIED_CURRENT'),
|
|
590
613
|
pipeline_enforcement: { enforcement: 'ENFORCING', bypass_possible: false },
|
|
591
614
|
});
|
|
592
|
-
|
|
593
|
-
// r.pipeline_action — always 'not_observed' (we did not block or run the pipeline)
|
|
594
|
-
// r.environment.provenance — always 'host_asserted'
|
|
595
|
-
// r.inescapable_deploy — only true under ENFORCING ∧ ¬bypass (from the gate, not a host flag)
|
|
596
|
-
if (!r.decision_allows_deploy) process.exit(1); // host pipeline chooses to honour
|
|
615
|
+
if (!r.decision_allows_deploy) process.exit(1);
|
|
597
616
|
```
|
|
598
617
|
|
|
599
618
|
#### `deployGate` is also the publish / register gate
|
|
@@ -606,24 +625,19 @@ verdict, enforcement residual). Prefer **`bindDeploy`** at the live step; raw `d
|
|
|
606
625
|
for hosts that already build the full input.
|
|
607
626
|
|
|
608
627
|
```typescript
|
|
609
|
-
import { deployGate } from '@coderifts/agent-guard';
|
|
628
|
+
import { deployGate, asVerifiedDeployReceiptView } from '@coderifts/agent-guard';
|
|
610
629
|
|
|
611
|
-
// npm publish — same gate, operation label 'publish'
|
|
612
630
|
const g = deployGate({
|
|
613
631
|
deployTarget: {
|
|
614
632
|
environment: 'npm',
|
|
615
633
|
artifact_id: 'sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
|
|
616
634
|
},
|
|
617
|
-
|
|
618
|
-
// bound_environment / bound_artifact_id are NOT server-emitted signed fields — the caller
|
|
619
|
-
// supplies them on this view alongside the token (deploy-gate's "view of the finished receipt").
|
|
620
|
-
receipt,
|
|
635
|
+
receipt: asVerifiedDeployReceiptView(publishView, 'VERIFIED_CURRENT'),
|
|
621
636
|
requiredContext: {
|
|
622
637
|
operation: 'publish',
|
|
623
638
|
enforcement: { enforcement: 'ENFORCING', bypass_possible: false },
|
|
624
639
|
},
|
|
625
640
|
});
|
|
626
|
-
// g.deploy_allowed — decision flag (name is historical; see caveat)
|
|
627
641
|
```
|
|
628
642
|
|
|
629
643
|
MCP **register** is the same shape: set `operation: 'register'` and put the **manifest digest** in
|
|
@@ -105,7 +105,29 @@ export type EvaluateCasEvidenceOpts = {
|
|
|
105
105
|
registry?: ExecutorKeyRegistry | null;
|
|
106
106
|
grant?: string | null;
|
|
107
107
|
receipt_digest?: string | null;
|
|
108
|
+
grant_fields?: {
|
|
109
|
+
jti?: string;
|
|
110
|
+
scope_hash?: string;
|
|
111
|
+
state_nonce?: string;
|
|
112
|
+
receipt_digest?: string;
|
|
113
|
+
} | null;
|
|
114
|
+
/** Strict-only tightening of derived.authorized_and_committed. Absent = 9.0.0 formula. */
|
|
115
|
+
profile?: 'ENFORCING_STRICT';
|
|
108
116
|
};
|
|
117
|
+
/** Existing CasAttestation.derived name and its honest sibling — not a parallel taxonomy. */
|
|
118
|
+
export type CommitLabel = 'authorized_and_committed' | 'authorized_not_committed';
|
|
119
|
+
export declare const COMMIT_EVIDENCE_MISSING: "commit_evidence_missing";
|
|
120
|
+
export type StrictCommitObservation = {
|
|
121
|
+
commit_label: CommitLabel;
|
|
122
|
+
commit_evidence_reason?: typeof COMMIT_EVIDENCE_MISSING;
|
|
123
|
+
};
|
|
124
|
+
/**
|
|
125
|
+
* ENFORCING_STRICT success name. authorized_and_committed only when the evidence class is
|
|
126
|
+
* executor_attested AND a kernel binding (grant jti / scope_hash / receipt_digest) was supplied
|
|
127
|
+
* so the attestation actually cross-checked this outcome. Otherwise authorized_not_committed
|
|
128
|
+
* with reason commit_evidence_missing. Observation-side — does not change enforced.
|
|
129
|
+
*/
|
|
130
|
+
export declare function strictCommitObservation(outcome: unknown, evidence: CasEvidence | undefined, opts?: EvaluateCasEvidenceOpts): StrictCommitObservation;
|
|
109
131
|
/** Pull the attestation token from the CAS outcome or the mutation response body. */
|
|
110
132
|
export declare function extractExecutorAttestationToken(outcome: unknown): string | null;
|
|
111
133
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cas-attestation.d.ts","sourceRoot":"","sources":["../../src/cas-attestation.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"cas-attestation.d.ts","sourceRoot":"","sources":["../../src/cas-attestation.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,7 +13,8 @@
|
|
|
13
13
|
* widening the proof spec.
|
|
14
14
|
*/
|
|
15
15
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
-
exports.CAS_ATTESTATION_SPEC = void 0;
|
|
16
|
+
exports.COMMIT_EVIDENCE_MISSING = exports.CAS_ATTESTATION_SPEC = void 0;
|
|
17
|
+
exports.strictCommitObservation = strictCommitObservation;
|
|
17
18
|
exports.extractExecutorAttestationToken = extractExecutorAttestationToken;
|
|
18
19
|
exports.evaluateCasEvidence = evaluateCasEvidence;
|
|
19
20
|
exports.isGuardExecutionProof = isGuardExecutionProof;
|
|
@@ -31,6 +32,40 @@ const LIMITS = Object.freeze({
|
|
|
31
32
|
does_not_claim_host_cannot_bypass: true,
|
|
32
33
|
does_not_claim_governance_redecision: true,
|
|
33
34
|
});
|
|
35
|
+
exports.COMMIT_EVIDENCE_MISSING = 'commit_evidence_missing';
|
|
36
|
+
function bindingIntendedSupplied(outcome, opts) {
|
|
37
|
+
const from = intendedFromOutcome(outcome);
|
|
38
|
+
if (opts.grant && String(opts.grant).length > 0)
|
|
39
|
+
return true;
|
|
40
|
+
if (from.grant && String(from.grant).length > 0)
|
|
41
|
+
return true;
|
|
42
|
+
if (opts.receipt_digest && String(opts.receipt_digest).length > 0)
|
|
43
|
+
return true;
|
|
44
|
+
if (from.receipt_digest && String(from.receipt_digest).length > 0)
|
|
45
|
+
return true;
|
|
46
|
+
const gf = opts.grant_fields;
|
|
47
|
+
if (gf && (gf.jti || gf.scope_hash || gf.receipt_digest))
|
|
48
|
+
return true;
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* ENFORCING_STRICT success name. authorized_and_committed only when the evidence class is
|
|
53
|
+
* executor_attested AND a kernel binding (grant jti / scope_hash / receipt_digest) was supplied
|
|
54
|
+
* so the attestation actually cross-checked this outcome. Otherwise authorized_not_committed
|
|
55
|
+
* with reason commit_evidence_missing. Observation-side — does not change enforced.
|
|
56
|
+
*/
|
|
57
|
+
function strictCommitObservation(outcome, evidence, opts = {}) {
|
|
58
|
+
const crossChecked = evidence != null
|
|
59
|
+
&& evidence.class === 'executor_attested'
|
|
60
|
+
&& bindingIntendedSupplied(outcome, opts);
|
|
61
|
+
if (crossChecked) {
|
|
62
|
+
return { commit_label: 'authorized_and_committed' };
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
commit_label: 'authorized_not_committed',
|
|
66
|
+
commit_evidence_reason: exports.COMMIT_EVIDENCE_MISSING,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
34
69
|
const ABSENT_EVIDENCE = Object.freeze({
|
|
35
70
|
class: 'absent',
|
|
36
71
|
attest_status: null,
|
|
@@ -91,6 +126,7 @@ function evaluateCasEvidence(outcome, opts = {}) {
|
|
|
91
126
|
const fromOutcome = intendedFromOutcome(outcome);
|
|
92
127
|
const grant = opts.grant || fromOutcome.grant || null;
|
|
93
128
|
const receipt_digest = opts.receipt_digest || fromOutcome.receipt_digest || null;
|
|
129
|
+
const grant_fields = opts.grant_fields || null;
|
|
94
130
|
if (!registry || !Array.isArray(registry.keys)) {
|
|
95
131
|
return hostClaimed(null, null, null);
|
|
96
132
|
}
|
|
@@ -102,6 +138,8 @@ function evaluateCasEvidence(outcome, opts = {}) {
|
|
|
102
138
|
intended.grant = grant;
|
|
103
139
|
if (receipt_digest)
|
|
104
140
|
intended.receipt_digest = receipt_digest;
|
|
141
|
+
if (grant_fields)
|
|
142
|
+
intended.grant_fields = grant_fields;
|
|
105
143
|
const wantsIntended = Object.keys(intended).length > 0;
|
|
106
144
|
let verified;
|
|
107
145
|
try {
|
|
@@ -208,7 +246,15 @@ function buildCasAttestation(proof, outcome, opts = {}) {
|
|
|
208
246
|
const write_ran = cas.write_ran === true;
|
|
209
247
|
const stale_during_commit = cas.status === 'committed_stale_detected';
|
|
210
248
|
const refused = cas.status === 'refused';
|
|
211
|
-
const
|
|
249
|
+
const cas_evidence = evaluateCasEvidence(outcome, opts);
|
|
250
|
+
let authorized_and_committed = receipt_verified && cas.status === 'committed';
|
|
251
|
+
// ENFORCING_STRICT: the existing derived name now requires executor_attested + kernel
|
|
252
|
+
// cross-check. Non-strict keeps the 9.0.0 formula (receipt verified + clean commit).
|
|
253
|
+
if (opts.profile === 'ENFORCING_STRICT') {
|
|
254
|
+
const obs = strictCommitObservation(outcome, cas_evidence, opts);
|
|
255
|
+
authorized_and_committed = authorized_and_committed
|
|
256
|
+
&& obs.commit_label === 'authorized_and_committed';
|
|
257
|
+
}
|
|
212
258
|
const attestation = {
|
|
213
259
|
attestation_spec: exports.CAS_ATTESTATION_SPEC,
|
|
214
260
|
references: Object.freeze({
|
|
@@ -225,7 +271,7 @@ function buildCasAttestation(proof, outcome, opts = {}) {
|
|
|
225
271
|
stale_during_commit,
|
|
226
272
|
refused,
|
|
227
273
|
}),
|
|
228
|
-
cas_evidence
|
|
274
|
+
cas_evidence,
|
|
229
275
|
limits: LIMITS,
|
|
230
276
|
};
|
|
231
277
|
return freezeAttestation(attestation);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cas-attestation.js","sourceRoot":"","sources":["../../src/cas-attestation.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;
|
|
1
|
+
{"version":3,"file":"cas-attestation.js","sourceRoot":"","sources":["../../src/cas-attestation.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,15 +11,15 @@
|
|
|
11
11
|
* signed evidence; the deploy target's environment string is not verified by us.
|
|
12
12
|
* A host can claim "staging" while deploying to production. The output says so.
|
|
13
13
|
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
14
|
+
* TOKEN mode: bindDeploy forwards `token` to deployGate, which verifies locally
|
|
15
|
+
* (no HTTP). VERIFIED-VIEW must carry the guard-defined view_spec. pipeline_action
|
|
16
|
+
* is always 'not_observed'. inescapable_deploy still comes only from deployGate.
|
|
17
17
|
*
|
|
18
18
|
* External note: coderifts-app CLI `deploy-gate` historically inlined a similar bind
|
|
19
19
|
* (deployBind). That is a consumer; this is the package-local pure entry hosts should
|
|
20
20
|
* call so the decision logic has a first-class caller in-repo.
|
|
21
21
|
*/
|
|
22
|
-
import { type DeployEnforcementState, type DeployGateDecision, type DeployGateReason, type DeployReceiptView, type GateStatusState } from './deploy-gate.js';
|
|
22
|
+
import { type DeployEnforcementState, type DeployGateDecision, type DeployGateReason, type DeployReceiptView, type GateStatusState, type DeployTokenReceipt } from './deploy-gate.js';
|
|
23
23
|
/** Reasons a fresh re-preflight for this { env, artifact } can repair. */
|
|
24
24
|
declare const REPAIRABLE: ReadonlySet<DeployGateReason>;
|
|
25
25
|
/**
|
|
@@ -45,10 +45,12 @@ export type BindDeployInput = {
|
|
|
45
45
|
service?: string;
|
|
46
46
|
pipeline_run_id?: string;
|
|
47
47
|
/**
|
|
48
|
-
*
|
|
49
|
-
*
|
|
48
|
+
* VERIFIED-VIEW (must carry view_spec) or null. TOKEN mode: pass `token` instead.
|
|
49
|
+
* A bare currently_authorized boolean is denied as unverified_receipt_view.
|
|
50
50
|
*/
|
|
51
|
-
receipt
|
|
51
|
+
receipt?: DeployReceiptView | null;
|
|
52
|
+
/** TOKEN mode: signed chain_receipt + registry | pinnedKeyPem. Guard verifies. */
|
|
53
|
+
token?: DeployTokenReceipt;
|
|
52
54
|
/**
|
|
53
55
|
* Host-observed pipeline enforcement (CD config / step policy). Same role as
|
|
54
56
|
* ProtectionState for merge — an input, not a package discovery.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy-bind.d.ts","sourceRoot":"","sources":["../../src/deploy-bind.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAEL,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EAEtB,KAAK,eAAe,
|
|
1
|
+
{"version":3,"file":"deploy-bind.d.ts","sourceRoot":"","sources":["../../src/deploy-bind.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAEL,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EAEtB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACxB,MAAM,kBAAkB,CAAC;AAE1B,0EAA0E;AAC1E,QAAA,MAAM,UAAU,EAAE,WAAW,CAAC,gBAAgB,CAc5C,CAAC;AAEH;;;;;;GAMG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,UAAU,EAAE,eAAe,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B;;;OAGG;IACH,WAAW,EAAE,MAAM,GAAG,uBAAuB,CAAC;IAC9C,iFAAiF;IACjF,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,OAAO,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACnC,kFAAkF;IAClF,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B;;;OAGG;IACH,oBAAoB,EAAE,sBAAsB,CAAC;IAC7C,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,+EAA+E;IAC/E,IAAI,EAAE,kBAAkB,CAAC;IACzB;;;OAGG;IACH,sBAAsB,EAAE,OAAO,CAAC;IAChC,4DAA4D;IAC5D,mBAAmB,EAAE,eAAe,CAAC;IACrC,8DAA8D;IAC9D,MAAM,EAAE,gBAAgB,CAAC;IACzB,6DAA6D;IAC7D,iBAAiB,EAAE,OAAO,CAAC;IAC3B;;;OAGG;IACH,WAAW,EAAE,uBAAuB,CAAC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,eAAe,EAAE,cAAc,CAAC;IAChC;;;;OAIG;IACH,kBAAkB,EAAE,OAAO,CAAC;CAC7B,CAAC;AAWF;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,CAoDnE;AAED,OAAO,EAAE,UAAU,IAAI,yBAAyB,EAAE,CAAC"}
|
package/dist/cjs/deploy-bind.js
CHANGED
|
@@ -12,9 +12,9 @@
|
|
|
12
12
|
* signed evidence; the deploy target's environment string is not verified by us.
|
|
13
13
|
* A host can claim "staging" while deploying to production. The output says so.
|
|
14
14
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
15
|
+
* TOKEN mode: bindDeploy forwards `token` to deployGate, which verifies locally
|
|
16
|
+
* (no HTTP). VERIFIED-VIEW must carry the guard-defined view_spec. pipeline_action
|
|
17
|
+
* is always 'not_observed'. inescapable_deploy still comes only from deployGate.
|
|
18
18
|
*
|
|
19
19
|
* External note: coderifts-app CLI `deploy-gate` historically inlined a similar bind
|
|
20
20
|
* (deployBind). That is a consumer; this is the package-local pure entry hosts should
|
|
@@ -34,6 +34,11 @@ const REPAIRABLE = new Set([
|
|
|
34
34
|
'body_hash_mismatch',
|
|
35
35
|
'no_receipt',
|
|
36
36
|
'inputs_incomplete',
|
|
37
|
+
'unverified_receipt_view',
|
|
38
|
+
'invalid_signature',
|
|
39
|
+
'expired',
|
|
40
|
+
'unknown_key',
|
|
41
|
+
'retired_key',
|
|
37
42
|
]);
|
|
38
43
|
exports.DEPLOY_REPAIRABLE_REASONS = REPAIRABLE;
|
|
39
44
|
function asHostAssertedEnvironment(env) {
|
|
@@ -90,6 +95,7 @@ function bindDeploy(input) {
|
|
|
90
95
|
const gate = (0, deploy_gate_js_1.deployGate)({
|
|
91
96
|
deployTarget,
|
|
92
97
|
receipt: input.receipt,
|
|
98
|
+
token: input.token,
|
|
93
99
|
requiredContext,
|
|
94
100
|
...(input.allowPending != null ? { allowPending: input.allowPending } : {}),
|
|
95
101
|
...(input.allowWarnDeploy != null ? { allowWarnDeploy: input.allowWarnDeploy } : {}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy-bind.js","sourceRoot":"","sources":["../../src/deploy-bind.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;;;
|
|
1
|
+
{"version":3,"file":"deploy-bind.js","sourceRoot":"","sources":["../../src/deploy-bind.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,9 +4,12 @@
|
|
|
4
4
|
* receipt and the observed pipeline-enforcement state?"
|
|
5
5
|
*
|
|
6
6
|
* Same shape as the merge gate, different operation. It is a PURE function — NO I/O, NO CD-API call
|
|
7
|
-
* (pipeline enforcement is an INPUT, observed by the host and passed in).
|
|
8
|
-
*
|
|
9
|
-
*
|
|
7
|
+
* (pipeline enforcement is an INPUT, observed by the host and passed in). TOKEN mode verifies a
|
|
8
|
+
* chain-receipt locally (Ed25519 + registry/pinned PEM; no HTTP). VERIFIED-VIEW mode accepts a
|
|
9
|
+
* host-attributed view ONLY with the guard-defined provenance marker. A bare
|
|
10
|
+
* `currently_authorized: true` is not proof (P0 / external audit 2026-08-24). Same
|
|
11
|
+
* inputs → same output (D9). Observation `verification.{mode,verify_status}` is recorded on the
|
|
12
|
+
* outcome; it does not enter any fingerprint preimage.
|
|
10
13
|
*
|
|
11
14
|
* The three deploy-specific binds are the whole point: T7 (a MERGE — or operation-less — receipt can
|
|
12
15
|
* never deploy), environment binding (a staging ALLOW never authorizes production), and artifact
|
|
@@ -19,8 +22,16 @@
|
|
|
19
22
|
* secrets.
|
|
20
23
|
*/
|
|
21
24
|
import type { GateStatusState, EnforcementState } from './merge-gate.js';
|
|
25
|
+
import { type DeployTokenReceipt } from './deploy-receipt-token.js';
|
|
22
26
|
export type { GateStatusState, EnforcementState } from './merge-gate.js';
|
|
23
|
-
|
|
27
|
+
export type { DeployTokenReceipt } from './deploy-receipt-token.js';
|
|
28
|
+
/**
|
|
29
|
+
* Guard-defined VERIFIED-VIEW provenance marker (same idiom as `proof_spec` /
|
|
30
|
+
* `attestation_spec`). A host that already verified (CLI, etc.) MUST set this —
|
|
31
|
+
* `currently_authorized: true` alone is untrusted input.
|
|
32
|
+
*/
|
|
33
|
+
export declare const DEPLOY_RECEIPT_VIEW_SPEC: "deploy-receipt-view.v1";
|
|
34
|
+
/** Deploy-gate reason codes (§1.1 + change-set residual + 9.0.0 verification). Success uses allow_current_deploy;
|
|
24
35
|
* enforcement_not_configured / bypass_open / change_set_not_rebound name honesty residuals on an
|
|
25
36
|
* otherwise-green check; fingerprint_mismatch is a hard failure (not a residual). */
|
|
26
37
|
export type DeployGateReason = 'allow_current_deploy' | 'no_receipt' | 'receipt_not_authorized' | 'operation_mismatch' | 'env_mismatch' | 'stale_artifact' | 'fingerprint_mismatch' | 'body_hash_mismatch' | 'target_mismatch' | 'decision_not_allow' | 'inputs_incomplete' | 'enforcement_not_configured' | 'bypass_open'
|
|
@@ -30,7 +41,13 @@ export type DeployGateReason = 'allow_current_deploy' | 'no_receipt' | 'receipt_
|
|
|
30
41
|
* fingerprint_mismatch (hard failure when a re-bind WAS requested and disagreed).
|
|
31
42
|
* deploy_allowed may stay true.
|
|
32
43
|
*/
|
|
33
|
-
| 'change_set_not_rebound'
|
|
44
|
+
| 'change_set_not_rebound'
|
|
45
|
+
/**
|
|
46
|
+
* Caller handed a receipt view with currently_authorized (or bounds) but no TOKEN and no
|
|
47
|
+
* guard-defined view_spec provenance. Distinct from receipt_not_authorized: "you didn't prove
|
|
48
|
+
* it" ≠ "verification says no".
|
|
49
|
+
*/
|
|
50
|
+
| 'unverified_receipt_view' | 'invalid_signature' | 'expired' | 'unknown_key' | 'retired_key';
|
|
34
51
|
/** What is being deployed — all fields are INPUTS (the pure function performs no discovery). */
|
|
35
52
|
export type DeployTarget = {
|
|
36
53
|
environment: string;
|
|
@@ -55,7 +72,28 @@ export type DeployReceiptView = {
|
|
|
55
72
|
body_hash?: string;
|
|
56
73
|
target_id?: string;
|
|
57
74
|
signature_valid?: boolean;
|
|
75
|
+
/**
|
|
76
|
+
* VERIFIED-VIEW provenance. Must equal DEPLOY_RECEIPT_VIEW_SPEC together with
|
|
77
|
+
* `verified: true` or the gate denies unverified_receipt_view.
|
|
78
|
+
*/
|
|
79
|
+
view_spec?: string;
|
|
80
|
+
verified?: boolean;
|
|
81
|
+
verify_status?: string;
|
|
58
82
|
};
|
|
83
|
+
/** VERIFIED-VIEW: host-attributed, guard-defined marker required. */
|
|
84
|
+
export type VerifiedDeployReceiptView = DeployReceiptView & {
|
|
85
|
+
view_spec: typeof DEPLOY_RECEIPT_VIEW_SPEC;
|
|
86
|
+
verified: true;
|
|
87
|
+
verify_status: string;
|
|
88
|
+
};
|
|
89
|
+
export type DeployVerificationMode = 'token' | 'verified_view' | 'unverified' | 'none';
|
|
90
|
+
export type DeployVerificationObservation = {
|
|
91
|
+
mode: DeployVerificationMode;
|
|
92
|
+
verify_status: string | null;
|
|
93
|
+
};
|
|
94
|
+
/** Stamp a computed view so deployGate will accept it as VERIFIED-VIEW (not TOKEN). */
|
|
95
|
+
export declare function asVerifiedDeployReceiptView(view: DeployReceiptView, verify_status?: string): VerifiedDeployReceiptView;
|
|
96
|
+
export declare function isVerifiedDeployReceiptView(r: DeployReceiptView | null | undefined): r is VerifiedDeployReceiptView;
|
|
59
97
|
/** Pipeline-enforcement observation (from the host's CD-config read — the pure gate consumes it). */
|
|
60
98
|
export type DeployEnforcementState = {
|
|
61
99
|
enforcement: EnforcementState;
|
|
@@ -79,7 +117,13 @@ export type DeployRequiredContext = {
|
|
|
79
117
|
};
|
|
80
118
|
export type DeployGateInput = {
|
|
81
119
|
deployTarget: DeployTarget;
|
|
82
|
-
|
|
120
|
+
/**
|
|
121
|
+
* VERIFIED-VIEW (or null). A bare currently_authorized boolean is untrusted.
|
|
122
|
+
* TOKEN mode uses `token` instead (recommended).
|
|
123
|
+
*/
|
|
124
|
+
receipt?: DeployReceiptView | VerifiedDeployReceiptView | null;
|
|
125
|
+
/** TOKEN mode: signed chain_receipt + registry | pinnedKeyPem. Guard verifies locally. */
|
|
126
|
+
token?: DeployTokenReceipt;
|
|
83
127
|
requiredContext: DeployRequiredContext;
|
|
84
128
|
/** Incomplete/no-receipt → pending when true, else failure (default false). */
|
|
85
129
|
allowPending?: boolean;
|
|
@@ -112,6 +156,10 @@ export type DeployGateDecision = {
|
|
|
112
156
|
bound_artifact_id: string | null;
|
|
113
157
|
operation: string | null;
|
|
114
158
|
};
|
|
159
|
+
/**
|
|
160
|
+
* Observation: which input mode ran and the verify_status. Not a preimage field.
|
|
161
|
+
*/
|
|
162
|
+
verification: DeployVerificationObservation;
|
|
115
163
|
};
|
|
116
164
|
/**
|
|
117
165
|
* §1.4 — the normative, first-match-wins deploy decision. Pure; no I/O; deterministic.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy-gate.d.ts","sourceRoot":"","sources":["../../src/deploy-gate.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"deploy-gate.d.ts","sourceRoot":"","sources":["../../src/deploy-gate.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/deploy-gate.js
CHANGED
|
@@ -5,9 +5,12 @@
|
|
|
5
5
|
* receipt and the observed pipeline-enforcement state?"
|
|
6
6
|
*
|
|
7
7
|
* Same shape as the merge gate, different operation. It is a PURE function — NO I/O, NO CD-API call
|
|
8
|
-
* (pipeline enforcement is an INPUT, observed by the host and passed in).
|
|
9
|
-
*
|
|
10
|
-
*
|
|
8
|
+
* (pipeline enforcement is an INPUT, observed by the host and passed in). TOKEN mode verifies a
|
|
9
|
+
* chain-receipt locally (Ed25519 + registry/pinned PEM; no HTTP). VERIFIED-VIEW mode accepts a
|
|
10
|
+
* host-attributed view ONLY with the guard-defined provenance marker. A bare
|
|
11
|
+
* `currently_authorized: true` is not proof (P0 / external audit 2026-08-24). Same
|
|
12
|
+
* inputs → same output (D9). Observation `verification.{mode,verify_status}` is recorded on the
|
|
13
|
+
* outcome; it does not enter any fingerprint preimage.
|
|
11
14
|
*
|
|
12
15
|
* The three deploy-specific binds are the whole point: T7 (a MERGE — or operation-less — receipt can
|
|
13
16
|
* never deploy), environment binding (a staging ALLOW never authorizes production), and artifact
|
|
@@ -20,7 +23,31 @@
|
|
|
20
23
|
* secrets.
|
|
21
24
|
*/
|
|
22
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.DEPLOY_RECEIPT_VIEW_SPEC = void 0;
|
|
27
|
+
exports.asVerifiedDeployReceiptView = asVerifiedDeployReceiptView;
|
|
28
|
+
exports.isVerifiedDeployReceiptView = isVerifiedDeployReceiptView;
|
|
23
29
|
exports.deployGate = deployGate;
|
|
30
|
+
const deploy_receipt_token_js_1 = require("./deploy-receipt-token.js");
|
|
31
|
+
/**
|
|
32
|
+
* Guard-defined VERIFIED-VIEW provenance marker (same idiom as `proof_spec` /
|
|
33
|
+
* `attestation_spec`). A host that already verified (CLI, etc.) MUST set this —
|
|
34
|
+
* `currently_authorized: true` alone is untrusted input.
|
|
35
|
+
*/
|
|
36
|
+
exports.DEPLOY_RECEIPT_VIEW_SPEC = 'deploy-receipt-view.v1';
|
|
37
|
+
/** Stamp a computed view so deployGate will accept it as VERIFIED-VIEW (not TOKEN). */
|
|
38
|
+
function asVerifiedDeployReceiptView(view, verify_status = 'VERIFIED_CURRENT') {
|
|
39
|
+
return {
|
|
40
|
+
...view,
|
|
41
|
+
view_spec: exports.DEPLOY_RECEIPT_VIEW_SPEC,
|
|
42
|
+
verified: true,
|
|
43
|
+
verify_status,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function isVerifiedDeployReceiptView(r) {
|
|
47
|
+
return !!r
|
|
48
|
+
&& r.view_spec === exports.DEPLOY_RECEIPT_VIEW_SPEC
|
|
49
|
+
&& r.verified === true;
|
|
50
|
+
}
|
|
24
51
|
// ── helpers (pure) ────────────────────────────────────────────────────────────────────────────────
|
|
25
52
|
function norm(s) {
|
|
26
53
|
return String(s == null ? '' : s).trim().toLowerCase();
|
|
@@ -73,29 +100,62 @@ function deployGate(input) {
|
|
|
73
100
|
const allowPending = input.allowPending ?? rc.allowPending ?? false;
|
|
74
101
|
const allowWarnDeploy = input.allowWarnDeploy ?? rc.allowWarnDeploy ?? false;
|
|
75
102
|
const allowPrefix = input.allowPrefixCompare ?? rc.allowPrefixCompare ?? false;
|
|
76
|
-
|
|
77
|
-
|
|
103
|
+
let verification = { mode: 'none', verify_status: null };
|
|
104
|
+
let receipt = input.receipt;
|
|
105
|
+
const detailOf = (r) => ({
|
|
78
106
|
environment: norm(target.environment),
|
|
79
107
|
artifact_id: norm(target.artifact_id),
|
|
80
|
-
bound_environment:
|
|
81
|
-
bound_artifact_id:
|
|
82
|
-
operation:
|
|
83
|
-
};
|
|
108
|
+
bound_environment: r && r.bound_environment != null ? norm(r.bound_environment) : null,
|
|
109
|
+
bound_artifact_id: r && r.bound_artifact_id != null ? norm(r.bound_artifact_id) : null,
|
|
110
|
+
operation: r && r.operation != null ? String(r.operation) : null,
|
|
111
|
+
});
|
|
84
112
|
const deny = (state, reason) => ({
|
|
85
113
|
deploy_allowed: false, state, reason, enforcement_state, inescapable_deploy: false,
|
|
86
114
|
residuals: [],
|
|
87
|
-
detail,
|
|
115
|
+
detail: detailOf(receipt),
|
|
116
|
+
verification,
|
|
88
117
|
});
|
|
89
118
|
// 0) incomplete target → pending/failure (fail-closed on missing evaluation input).
|
|
90
119
|
if (!target.environment || String(target.environment).trim() === ''
|
|
91
120
|
|| !target.artifact_id || String(target.artifact_id).trim() === '') {
|
|
92
121
|
return deny(allowPending ? 'pending' : 'failure', 'inputs_incomplete');
|
|
93
122
|
}
|
|
94
|
-
//
|
|
123
|
+
// TOKEN mode (recommended): guard verifies locally. Wins over a sibling receipt view.
|
|
124
|
+
const tokenInput = input.token;
|
|
125
|
+
if (tokenInput && typeof tokenInput.token === 'string' && tokenInput.token.length > 0) {
|
|
126
|
+
const tv = (0, deploy_receipt_token_js_1.verifyDeployReceiptToken)(tokenInput, {
|
|
127
|
+
operation: opRequired,
|
|
128
|
+
environment: target.environment,
|
|
129
|
+
artifact_id: target.artifact_id,
|
|
130
|
+
});
|
|
131
|
+
verification = { mode: 'token', verify_status: tv.status };
|
|
132
|
+
if (tv.denyReason) {
|
|
133
|
+
receipt = tv.view;
|
|
134
|
+
return deny('failure', tv.denyReason);
|
|
135
|
+
}
|
|
136
|
+
receipt = tv.view;
|
|
137
|
+
}
|
|
138
|
+
else if (receipt === null || receipt === undefined) {
|
|
139
|
+
// 1) no receipt and no token → fail-closed (D4).
|
|
140
|
+
return deny(allowPending ? 'pending' : 'failure', 'no_receipt');
|
|
141
|
+
}
|
|
142
|
+
else if (isVerifiedDeployReceiptView(receipt)) {
|
|
143
|
+
verification = {
|
|
144
|
+
mode: 'verified_view',
|
|
145
|
+
verify_status: typeof receipt.verify_status === 'string' ? receipt.verify_status : null,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
// Bare currently_authorized (or any view without the guard-defined marker).
|
|
150
|
+
verification = { mode: 'unverified', verify_status: null };
|
|
151
|
+
return deny('failure', 'unverified_receipt_view');
|
|
152
|
+
}
|
|
95
153
|
if (receipt === null || receipt === undefined) {
|
|
96
154
|
return deny(allowPending ? 'pending' : 'failure', 'no_receipt');
|
|
97
155
|
}
|
|
98
156
|
// 2) lifecycle authorization — a valid signature alone is NOT sufficient (D5).
|
|
157
|
+
// In TOKEN mode currently_authorized was COMPUTED; in VERIFIED-VIEW it is host-attributed
|
|
158
|
+
// behind view_spec (not a sneaked boolean).
|
|
99
159
|
if (receipt.currently_authorized !== true) {
|
|
100
160
|
return deny('failure', 'receipt_not_authorized');
|
|
101
161
|
}
|
|
@@ -168,7 +228,8 @@ function deployGate(input) {
|
|
|
168
228
|
inescapable_deploy,
|
|
169
229
|
residuals,
|
|
170
230
|
...(residual ? { residual } : {}),
|
|
171
|
-
detail,
|
|
231
|
+
detail: detailOf(receipt),
|
|
232
|
+
verification,
|
|
172
233
|
};
|
|
173
234
|
}
|
|
174
235
|
//# sourceMappingURL=deploy-gate.js.map
|