@cotal-ai/core 0.12.0 → 0.13.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.
- package/dist/acls.d.ts +31 -7
- package/dist/acls.d.ts.map +1 -1
- package/dist/acls.js +105 -17
- package/dist/acls.js.map +1 -1
- package/dist/agent-file.js +1 -1
- package/dist/agent-file.js.map +1 -1
- package/dist/auth-provider.d.ts +8 -0
- package/dist/auth-provider.d.ts.map +1 -1
- package/dist/auth-provider.js.map +1 -1
- package/dist/backup.d.ts.map +1 -1
- package/dist/backup.js +6 -4
- package/dist/backup.js.map +1 -1
- package/dist/broker-floor.d.ts +34 -0
- package/dist/broker-floor.d.ts.map +1 -0
- package/dist/broker-floor.js +39 -0
- package/dist/broker-floor.js.map +1 -0
- package/dist/canonical.d.ts +24 -0
- package/dist/canonical.d.ts.map +1 -0
- package/dist/canonical.js +159 -0
- package/dist/canonical.js.map +1 -0
- package/dist/connector.d.ts +4 -0
- package/dist/connector.d.ts.map +1 -1
- package/dist/endpoint-action.d.ts +424 -0
- package/dist/endpoint-action.d.ts.map +1 -0
- package/dist/endpoint-action.js +910 -0
- package/dist/endpoint-action.js.map +1 -0
- package/dist/endpoint-binding.d.ts +344 -0
- package/dist/endpoint-binding.d.ts.map +1 -0
- package/dist/endpoint-binding.js +753 -0
- package/dist/endpoint-binding.js.map +1 -0
- package/dist/endpoint-checkpoint.d.ts +292 -0
- package/dist/endpoint-checkpoint.d.ts.map +1 -0
- package/dist/endpoint-checkpoint.js +818 -0
- package/dist/endpoint-checkpoint.js.map +1 -0
- package/dist/endpoint-cluster.d.ts +95 -0
- package/dist/endpoint-cluster.d.ts.map +1 -0
- package/dist/endpoint-cluster.js +194 -0
- package/dist/endpoint-cluster.js.map +1 -0
- package/dist/endpoint-contract-store.d.ts +90 -0
- package/dist/endpoint-contract-store.d.ts.map +1 -0
- package/dist/endpoint-contract-store.js +348 -0
- package/dist/endpoint-contract-store.js.map +1 -0
- package/dist/endpoint-envelope.d.ts +165 -0
- package/dist/endpoint-envelope.d.ts.map +1 -0
- package/dist/endpoint-envelope.js +346 -0
- package/dist/endpoint-envelope.js.map +1 -0
- package/dist/endpoint-grants.d.ts +123 -0
- package/dist/endpoint-grants.d.ts.map +1 -0
- package/dist/endpoint-grants.js +215 -0
- package/dist/endpoint-grants.js.map +1 -0
- package/dist/endpoint-guard.d.ts +222 -0
- package/dist/endpoint-guard.d.ts.map +1 -0
- package/dist/endpoint-guard.js +468 -0
- package/dist/endpoint-guard.js.map +1 -0
- package/dist/endpoint-handle.d.ts +176 -0
- package/dist/endpoint-handle.d.ts.map +1 -0
- package/dist/endpoint-handle.js +608 -0
- package/dist/endpoint-handle.js.map +1 -0
- package/dist/endpoint-journal.d.ts +225 -0
- package/dist/endpoint-journal.d.ts.map +1 -0
- package/dist/endpoint-journal.js +431 -0
- package/dist/endpoint-journal.js.map +1 -0
- package/dist/endpoint-receipt.d.ts +225 -0
- package/dist/endpoint-receipt.d.ts.map +1 -0
- package/dist/endpoint-receipt.js +417 -0
- package/dist/endpoint-receipt.js.map +1 -0
- package/dist/endpoint-records.d.ts +243 -0
- package/dist/endpoint-records.d.ts.map +1 -0
- package/dist/endpoint-records.js +591 -0
- package/dist/endpoint-records.js.map +1 -0
- package/dist/endpoint-serve.d.ts +176 -0
- package/dist/endpoint-serve.d.ts.map +1 -0
- package/dist/endpoint-serve.js +446 -0
- package/dist/endpoint-serve.js.map +1 -0
- package/dist/endpoint-service.d.ts +518 -0
- package/dist/endpoint-service.d.ts.map +1 -0
- package/dist/endpoint-service.js +973 -0
- package/dist/endpoint-service.js.map +1 -0
- package/dist/endpoint-session.d.ts +398 -0
- package/dist/endpoint-session.d.ts.map +1 -0
- package/dist/endpoint-session.js +834 -0
- package/dist/endpoint-session.js.map +1 -0
- package/dist/endpoint-signing.d.ts +105 -0
- package/dist/endpoint-signing.d.ts.map +1 -0
- package/dist/endpoint-signing.js +190 -0
- package/dist/endpoint-signing.js.map +1 -0
- package/dist/endpoint-subjects.d.ts +222 -0
- package/dist/endpoint-subjects.d.ts.map +1 -0
- package/dist/endpoint-subjects.js +381 -0
- package/dist/endpoint-subjects.js.map +1 -0
- package/dist/endpoint-supervisor.d.ts +19 -0
- package/dist/endpoint-supervisor.d.ts.map +1 -0
- package/dist/endpoint-supervisor.js +12 -0
- package/dist/endpoint-supervisor.js.map +1 -0
- package/dist/endpoint-traits.d.ts +225 -0
- package/dist/endpoint-traits.d.ts.map +1 -0
- package/dist/endpoint-traits.js +469 -0
- package/dist/endpoint-traits.js.map +1 -0
- package/dist/endpoint-verbs.d.ts +277 -0
- package/dist/endpoint-verbs.d.ts.map +1 -0
- package/dist/endpoint-verbs.js +576 -0
- package/dist/endpoint-verbs.js.map +1 -0
- package/dist/endpoint-virtual.d.ts +308 -0
- package/dist/endpoint-virtual.d.ts.map +1 -0
- package/dist/endpoint-virtual.js +440 -0
- package/dist/endpoint-virtual.js.map +1 -0
- package/dist/endpoint-work.d.ts +304 -0
- package/dist/endpoint-work.d.ts.map +1 -0
- package/dist/endpoint-work.js +728 -0
- package/dist/endpoint-work.js.map +1 -0
- package/dist/endpoint.d.ts +66 -22
- package/dist/endpoint.d.ts.map +1 -1
- package/dist/endpoint.js +289 -89
- package/dist/endpoint.js.map +1 -1
- package/dist/evict.d.ts +95 -32
- package/dist/evict.d.ts.map +1 -1
- package/dist/evict.js +193 -3
- package/dist/evict.js.map +1 -1
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -1
- package/dist/lease.d.ts +4 -0
- package/dist/lease.d.ts.map +1 -1
- package/dist/lease.js.map +1 -1
- package/dist/members.d.ts +4 -4
- package/dist/members.d.ts.map +1 -1
- package/dist/members.js +12 -12
- package/dist/members.js.map +1 -1
- package/dist/provision.d.ts +70 -18
- package/dist/provision.d.ts.map +1 -1
- package/dist/provision.js +194 -33
- package/dist/provision.js.map +1 -1
- package/dist/safe-pattern.d.ts +33 -0
- package/dist/safe-pattern.d.ts.map +1 -0
- package/dist/safe-pattern.js +486 -0
- package/dist/safe-pattern.js.map +1 -0
- package/dist/schema-profile.d.ts +93 -0
- package/dist/schema-profile.d.ts.map +1 -0
- package/dist/schema-profile.js +284 -0
- package/dist/schema-profile.js.map +1 -0
- package/dist/streams.d.ts +13 -8
- package/dist/streams.d.ts.map +1 -1
- package/dist/streams.js +35 -18
- package/dist/streams.js.map +1 -1
- package/dist/subjects.d.ts +100 -40
- package/dist/subjects.d.ts.map +1 -1
- package/dist/subjects.js +136 -60
- package/dist/subjects.js.map +1 -1
- package/dist/types.d.ts +9 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -1
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The GUARD CHECKPOINT (SPEC §13.6): the pre-effect authorization hook. A command carrying the
|
|
3
|
+
* governed `ai.cotal.guarded` trait MUST NOT effect until the guard endpoint named by the
|
|
4
|
+
* verified trait value answered ALLOW (class call). Answers: `allow | deny | hold` plus
|
|
5
|
+
* optional SIGNED obligations (attenuations the endpoint MUST apply; monotonic, §13.10 replay
|
|
6
|
+
* matrix: bound to the goal/request, reusable within it). `hold` converts the action to
|
|
7
|
+
* `waiting` on a checkpoint OWNED BY THE GUARD DECISION (the guard's authenticated responder
|
|
8
|
+
* is the checkpoint holder — only IT can release the hold). Timeout, an unreachable guard, a
|
|
9
|
+
* garbled answer, or an invalid obligation is DENY (fail closed). Ordering is
|
|
10
|
+
* guard-then-effect; side-effecting guards own their own reconciliation.
|
|
11
|
+
*
|
|
12
|
+
* This module is THE guard gate. There is exactly one: {@link runGuardGate} owns the guard
|
|
13
|
+
* call, the closed answer parse, and the D28 obligation verification, and BOTH production
|
|
14
|
+
* rails run through it — the ephemeral serve rail via `assertGovernedPreEffect` (which
|
|
15
|
+
* refuses hold, since an ephemeral request cannot wait) and the action composite via
|
|
16
|
+
* {@link gateGoalExecution} (which ROUTES hold into the checkpoint pause and a guard deny
|
|
17
|
+
* into the shared terminal commit). {@link reconcileGuardHold} is the durable backstop that
|
|
18
|
+
* converges a settled hold whose projection crashed mid-flight. The gate never guesses:
|
|
19
|
+
* every path that is not a well-formed, obligation-valid ALLOW or HOLD is a refusal.
|
|
20
|
+
*/
|
|
21
|
+
import { EpEnvelopeError } from "./endpoint-envelope.js";
|
|
22
|
+
import { canonicalJson } from "./canonical.js";
|
|
23
|
+
import { verifyArtifactSignature, resolveAnchorForUse, assertAnchorScopeCovers } from "./endpoint-signing.js";
|
|
24
|
+
import { mintCheckpoint, resumeCheckpoint, readCheckpointSpec, readCheckpointSettle, expireCheckpoint } from "./endpoint-checkpoint.js";
|
|
25
|
+
import { transitionGoal, commitGoalResult, projectGoalTerminal, readGoalSpec, readGoalStatus, readGoalResult, ownerCommitProof, claimGuardClearanceMint, snapshotRef } from "./endpoint-action.js";
|
|
26
|
+
const isRec = (v) => v !== null && typeof v === "object" && !Array.isArray(v);
|
|
27
|
+
/** THIS module is THE gate, so it claims the one-shot clearance mint at load: a guarded goal's
|
|
28
|
+
* edge into `running` opens only with a clearance minted here - by the gate's own allow,
|
|
29
|
+
* release, and reconcile arms, each of which verified the guard's answer or its recorded
|
|
30
|
+
* settlement first. No other module can claim the mint (the second claim throws). */
|
|
31
|
+
const mintGuardClearance = claimGuardClearanceMint();
|
|
32
|
+
/** The gate-VERIFIED obligation sets, branded so the durable HOLD ingress can require that its
|
|
33
|
+
* obligations came from {@link runGuardGate}'s verification (signature, anchor role/scope,
|
|
34
|
+
* windows, request binding) and not from a structurally shaped fake: {@link holdGuardedGoal}
|
|
35
|
+
* is a public composition seam, and an unverified set persisted there would return through
|
|
36
|
+
* release/reconcile under the same trusted type as a verified one. Entries are DEEP-FROZEN at
|
|
37
|
+
* verification, so a branded obligation cannot be mutated away from the bytes its signature
|
|
38
|
+
* verified over. */
|
|
39
|
+
const VERIFIED_OBLIGATIONS = new WeakSet();
|
|
40
|
+
function deepFreeze(v) {
|
|
41
|
+
if (v === null || typeof v !== "object")
|
|
42
|
+
return;
|
|
43
|
+
for (const k of Object.keys(v))
|
|
44
|
+
deepFreeze(v[k]);
|
|
45
|
+
Object.freeze(v);
|
|
46
|
+
}
|
|
47
|
+
function denyClosed(why) {
|
|
48
|
+
throw new EpEnvelopeError("permission-denied", `guard gate DENIES: ${why} (SPEC 13.6: timeout, an unreachable guard, or a garbled answer is deny; the gate fails closed, never open)`);
|
|
49
|
+
}
|
|
50
|
+
function parseObligation(raw, i) {
|
|
51
|
+
if (!isRec(raw))
|
|
52
|
+
denyClosed(`obligation[${i}] is not an object`);
|
|
53
|
+
const o = raw;
|
|
54
|
+
const allowed = new Set(["v", "space", "requestId", "signer", "attenuations", "iat", "exp", "sig"]);
|
|
55
|
+
for (const k of Object.keys(o))
|
|
56
|
+
if (!allowed.has(k))
|
|
57
|
+
denyClosed(`obligation[${i}] carries the unknown field "${k}" (closed schema)`);
|
|
58
|
+
if (o.v !== 1 || typeof o.space !== "string" || o.space.length === 0)
|
|
59
|
+
denyClosed(`obligation[${i}] has no version/space`);
|
|
60
|
+
if (typeof o.requestId !== "string" || o.requestId.length === 0)
|
|
61
|
+
denyClosed(`obligation[${i}] binds no requestId`);
|
|
62
|
+
if (!isRec(o.signer) || typeof o.signer.keyId !== "string")
|
|
63
|
+
denyClosed(`obligation[${i}] names no signer keyId`);
|
|
64
|
+
if (!Array.isArray(o.attenuations) || o.attenuations.length === 0 || !o.attenuations.every(isRec))
|
|
65
|
+
denyClosed(`obligation[${i}] carries no structured attenuations (an obligation that attenuates nothing is garbled)`);
|
|
66
|
+
for (const f of ["iat", "exp"])
|
|
67
|
+
if (typeof o[f] !== "number" || !Number.isSafeInteger(o[f]) || o[f] < 0)
|
|
68
|
+
denyClosed(`obligation[${i}] ${f} is not a non-negative safe integer`);
|
|
69
|
+
if (o.exp <= o.iat)
|
|
70
|
+
denyClosed(`obligation[${i}] exp is not after iat`);
|
|
71
|
+
if (typeof o.sig !== "string" || o.sig.length === 0)
|
|
72
|
+
denyClosed(`obligation[${i}] is unsigned`);
|
|
73
|
+
return o;
|
|
74
|
+
}
|
|
75
|
+
/** Race an await against the REMAINING guard budget: the whole gate (the guard call AND every
|
|
76
|
+
* obligation's anchor resolution) is ONE bounded operation, so a stuck registry after the
|
|
77
|
+
* guard answered cannot hang the gate. Timeout is DENY (SPEC 13.6: fail closed). Races
|
|
78
|
+
* `Promise.resolve(p)` unconditionally (a non-native thenable must not bypass the deadline). */
|
|
79
|
+
async function withGateBudget(p, remainingMs, what) {
|
|
80
|
+
if (remainingMs <= 0)
|
|
81
|
+
throw new EpEnvelopeError("permission-denied", `${what} found the guard budget already exhausted; the gate is one bounded operation and timeout is DENY (SPEC 13.6: fail closed)`);
|
|
82
|
+
let timer;
|
|
83
|
+
const deadline = new Promise((_, reject) => {
|
|
84
|
+
timer = setTimeout(() => reject(new EpEnvelopeError("permission-denied", `${what} did not answer within the remaining ${remainingMs}ms guard budget; timeout is DENY (SPEC 13.6: fail closed)`)), remainingMs);
|
|
85
|
+
});
|
|
86
|
+
try {
|
|
87
|
+
return await Promise.race([Promise.resolve(p), deadline]);
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
clearTimeout(timer);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/** Verify one obligation against the trust-anchor registry: D28 signature over the EXACT RAW
|
|
94
|
+
* artifact, `obligations` role, scope covering the GUARDED endpoint, anchor window at `iat`,
|
|
95
|
+
* obligation window at `now`, space + request binding. Any failure denies (fail closed), and
|
|
96
|
+
* the anchor resolution runs within the gate's REMAINING budget. */
|
|
97
|
+
async function verifyObligation(raw, ob, i, opts) {
|
|
98
|
+
if (ob.space !== opts.space)
|
|
99
|
+
denyClosed(`obligation[${i}] is bound to space ${ob.space}, not ${opts.space}`);
|
|
100
|
+
if (ob.requestId !== opts.requestId)
|
|
101
|
+
denyClosed(`obligation[${i}] binds requestId ${ob.requestId}, not this request's ${opts.requestId} (an obligation is bound to its goal/request)`);
|
|
102
|
+
if (opts.now < ob.iat || opts.now > ob.exp)
|
|
103
|
+
denyClosed(`obligation[${i}] is outside its validity window [${ob.iat}, ${ob.exp}] at now ${opts.now}`);
|
|
104
|
+
let anchor;
|
|
105
|
+
try {
|
|
106
|
+
anchor = await withGateBudget(resolveAnchorForUse(opts.resolveAnchor, { keyId: ob.signer.keyId, role: "obligations", at: ob.iat }), opts.remainingMs(), `obligation[${i}]'s anchor resolution`);
|
|
107
|
+
assertAnchorScopeCovers(anchor, "obligations", opts.endpoint, `obligation[${i}] for endpoint`);
|
|
108
|
+
verifyArtifactSignature(raw, anchor);
|
|
109
|
+
}
|
|
110
|
+
catch (e) {
|
|
111
|
+
denyClosed(`obligation[${i}] does not verify (${e.message})`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/** Parse the guard endpoint's raw answer body, CLOSED per decision. Anything else denies. */
|
|
115
|
+
function parseGuardAnswer(raw) {
|
|
116
|
+
if (!isRec(raw))
|
|
117
|
+
denyClosed("the guard answered with a non-object body");
|
|
118
|
+
const o = raw;
|
|
119
|
+
const allowed = new Set(["v", "decision", "reason", "token", "holdDeadlineMs", "obligations"]);
|
|
120
|
+
for (const k of Object.keys(o))
|
|
121
|
+
if (!allowed.has(k))
|
|
122
|
+
denyClosed(`the guard answer carries the unknown field "${k}" (closed schema)`);
|
|
123
|
+
if (o.v !== 1)
|
|
124
|
+
denyClosed("the guard answer version is not 1");
|
|
125
|
+
if (o.decision !== "allow" && o.decision !== "deny" && o.decision !== "hold")
|
|
126
|
+
denyClosed(`the guard decision ${JSON.stringify(o.decision)} is not allow|deny|hold`);
|
|
127
|
+
const rawObs = o.obligations === undefined ? [] : o.obligations;
|
|
128
|
+
if (!Array.isArray(rawObs))
|
|
129
|
+
denyClosed("the guard answer obligations is not an array");
|
|
130
|
+
if (o.decision === "deny") {
|
|
131
|
+
if (o.obligations !== undefined || o.token !== undefined || o.holdDeadlineMs !== undefined)
|
|
132
|
+
denyClosed("a deny answer carries allow/hold fields (garbled cross-variant answer)");
|
|
133
|
+
if (o.reason !== undefined && typeof o.reason !== "string")
|
|
134
|
+
denyClosed("the deny reason is not a string");
|
|
135
|
+
return { answer: { decision: "deny", ...(o.reason !== undefined ? { reason: o.reason } : {}) }, rawObligations: [] };
|
|
136
|
+
}
|
|
137
|
+
if (o.reason !== undefined)
|
|
138
|
+
denyClosed(`a ${o.decision} answer carries a deny reason (garbled cross-variant answer)`);
|
|
139
|
+
const obligations = rawObs.map((r, i) => parseObligation(r, i));
|
|
140
|
+
if (o.decision === "allow") {
|
|
141
|
+
if (o.token !== undefined || o.holdDeadlineMs !== undefined)
|
|
142
|
+
denyClosed("an allow answer carries hold fields (garbled cross-variant answer)");
|
|
143
|
+
return { answer: { decision: "allow", obligations }, rawObligations: rawObs };
|
|
144
|
+
}
|
|
145
|
+
if (typeof o.token !== "string" || o.token.length === 0)
|
|
146
|
+
denyClosed("a hold answer names no checkpoint token");
|
|
147
|
+
if (typeof o.holdDeadlineMs !== "number" || !Number.isSafeInteger(o.holdDeadlineMs) || o.holdDeadlineMs <= 0)
|
|
148
|
+
denyClosed("a hold answer has no positive integer holdDeadlineMs (deadlines are mandatory, SPEC 13.6)");
|
|
149
|
+
return { answer: { decision: "hold", token: o.token, holdDeadlineMs: o.holdDeadlineMs, obligations }, rawObligations: rawObs };
|
|
150
|
+
}
|
|
151
|
+
/** Run the §13.6 guard gate for one guarded request: call the guard endpoint (via the injected
|
|
152
|
+
* seam) within `deadlineMs`, and classify FAIL-CLOSED — the ONLY outcomes are a verified
|
|
153
|
+
* ALLOW, a verified HOLD (the caller then wires the pause via {@link holdGuardedGoal}), or a
|
|
154
|
+
* `permission-denied` throw. A timeout, transport failure, garbled answer, cross-variant
|
|
155
|
+
* fields, or an obligation that does not verify (signature, scope, window, request binding)
|
|
156
|
+
* all DENY. Ordering is guard-then-effect: call this BEFORE any effect. */
|
|
157
|
+
export async function runGuardGate(opts) {
|
|
158
|
+
if (typeof opts.guardEndpoint !== "string" || opts.guardEndpoint.length === 0)
|
|
159
|
+
denyClosed("the guarded trait names no guard endpoint");
|
|
160
|
+
if (!Number.isSafeInteger(opts.deadlineMs) || opts.deadlineMs <= 0)
|
|
161
|
+
throw new EpEnvelopeError("failed-precondition", `the guard deadline must be a positive integer; got ${JSON.stringify(opts.deadlineMs)}`);
|
|
162
|
+
if (!Number.isSafeInteger(opts.now) || opts.now < 0)
|
|
163
|
+
throw new EpEnvelopeError("failed-precondition", `now must be a non-negative safe integer; got ${JSON.stringify(opts.now)}`);
|
|
164
|
+
// ONE total gate budget: the guard call and every obligation verification share this clock,
|
|
165
|
+
// so a stuck anchor registry AFTER the guard answered is still a bounded DENY.
|
|
166
|
+
const gateDeadlineAt = Date.now() + opts.deadlineMs;
|
|
167
|
+
const remainingMs = () => gateDeadlineAt - Date.now();
|
|
168
|
+
let called;
|
|
169
|
+
try {
|
|
170
|
+
called = await withGateBudget(opts.callGuard({
|
|
171
|
+
guardEndpoint: opts.guardEndpoint,
|
|
172
|
+
endpoint: opts.request.endpoint,
|
|
173
|
+
...(opts.request.command !== undefined ? { command: opts.request.command } : {}),
|
|
174
|
+
requestId: opts.request.id,
|
|
175
|
+
caller: opts.request.caller,
|
|
176
|
+
}), remainingMs(), "the guard");
|
|
177
|
+
}
|
|
178
|
+
catch (e) {
|
|
179
|
+
if (e instanceof EpEnvelopeError && e.code === "permission-denied")
|
|
180
|
+
throw e;
|
|
181
|
+
denyClosed(`the guard call failed (${e?.message ?? String(e)})`);
|
|
182
|
+
}
|
|
183
|
+
if (!isRec(called))
|
|
184
|
+
denyClosed("the guard call seam returned no authenticated responder identity");
|
|
185
|
+
// SINGLE-READ the responder BEFORE any touch of the answer (security H3, both vectors): the
|
|
186
|
+
// `responder` PROPERTY itself is read exactly once into a local - an accessor on the seam
|
|
187
|
+
// result could otherwise answer the type-check with the authenticated identity and the
|
|
188
|
+
// capture with an attacker's - and the scalars are then read only from that one object,
|
|
189
|
+
// validated as read locals, and frozen before `called.answer` (whose serialization runs
|
|
190
|
+
// caller getters) is ever evaluated.
|
|
191
|
+
const rawResponder = called.responder;
|
|
192
|
+
if (!isRec(rawResponder))
|
|
193
|
+
denyClosed("the guard call seam returned no authenticated responder identity");
|
|
194
|
+
const responderId = rawResponder.id;
|
|
195
|
+
const responderUid = rawResponder.lifecycleUid;
|
|
196
|
+
if (typeof responderId !== "string" || responderId.length === 0 || typeof responderUid !== "string" || responderUid.length === 0)
|
|
197
|
+
denyClosed("the guard call seam returned no authenticated responder identity");
|
|
198
|
+
const responder = Object.freeze({ id: responderId, lifecycleUid: responderUid });
|
|
199
|
+
// SNAPSHOT the seam's answer to a DETACHED value BEFORE the parse and the anchor awaits: the
|
|
200
|
+
// obligation signatures verify over EXACTLY these bytes, so a caller that mutates the raw
|
|
201
|
+
// answer/obligations during the awaited anchor resolution can never split what was
|
|
202
|
+
// parsed/scoped from what the signature verifies (D28 consuming boundary).
|
|
203
|
+
let answerSnapshot;
|
|
204
|
+
try {
|
|
205
|
+
answerSnapshot = JSON.parse(canonicalJson(called.answer));
|
|
206
|
+
} // throws on non-interchangeable I-JSON; the detached tree is unreachable to the caller
|
|
207
|
+
catch (e) {
|
|
208
|
+
return denyClosed(`the guard answer is not interchangeable JSON (${e.message})`);
|
|
209
|
+
}
|
|
210
|
+
const { answer, rawObligations } = parseGuardAnswer(answerSnapshot);
|
|
211
|
+
if (answer.decision === "deny")
|
|
212
|
+
throw new EpEnvelopeError("permission-denied", `the guard denied this request${answer.reason !== undefined ? `: ${answer.reason}` : ""} (SPEC 13.6: guard-then-effect)`);
|
|
213
|
+
for (let i = 0; i < answer.obligations.length; i++)
|
|
214
|
+
await verifyObligation(rawObligations[i], answer.obligations[i], i, { resolveAnchor: opts.resolveAnchor, now: opts.now, space: opts.space, endpoint: opts.request.endpoint, requestId: opts.request.id, remainingMs });
|
|
215
|
+
// Brand + deep-freeze the VERIFIED set: from here on these exact objects (and only they)
|
|
216
|
+
// prove "verified by THIS gate" at the durable HOLD ingress, and cannot be mutated away
|
|
217
|
+
// from the bytes their signatures verified over.
|
|
218
|
+
for (const ob of answer.obligations) {
|
|
219
|
+
deepFreeze(ob);
|
|
220
|
+
VERIFIED_OBLIGATIONS.add(ob);
|
|
221
|
+
}
|
|
222
|
+
if (answer.decision === "allow")
|
|
223
|
+
return { decision: "allow", obligations: answer.obligations };
|
|
224
|
+
return { decision: "hold", token: answer.token, holdDeadlineMs: answer.holdDeadlineMs, obligations: answer.obligations, responder };
|
|
225
|
+
}
|
|
226
|
+
/** The ACTION composite's guard gate (§13.6): run by the OWNING instance for a guarded goal
|
|
227
|
+
* BEFORE any execution effect — the counterpart of the ephemeral rail's
|
|
228
|
+
* `assertGovernedPreEffect`, with hold ROUTED instead of refused. {@link runGuardGate} does
|
|
229
|
+
* the calling, parsing, and obligation verification; this seam projects the verdict onto the
|
|
230
|
+
* goal:
|
|
231
|
+
* - ALLOW: the goal transitions accepted → running under the owner's construction-bound
|
|
232
|
+
* proof (this projection is the owner's admission to execute) and the VERIFIED
|
|
233
|
+
* obligations return for the executor, which MUST apply them;
|
|
234
|
+
* - HOLD: {@link holdGuardedGoal} mints the guard-holder-bound checkpoint and projects
|
|
235
|
+
* `waiting`;
|
|
236
|
+
* - DENY (or ANY fail-closed gate refusal: timeout, garble, unverifiable obligation): the
|
|
237
|
+
* goal commits terminal `failed` at the shared commit point under the OWNER's
|
|
238
|
+
* construction-bound proof — the owner runs this gate, so the deny predicate is the
|
|
239
|
+
* owner's own refusal to execute, carrying the gate's reason in the terminal payload.
|
|
240
|
+
* Obligations bind to the GOAL id (§13.10: bound to its goal/request, reusable within it). */
|
|
241
|
+
export async function gateGoalExecution(ctx, args) {
|
|
242
|
+
const goal = snapshotRef(args.goal);
|
|
243
|
+
// The gate runs only on a goal whose ACCEPTED record binds THIS guard (SPEC 13.6/13.7): the
|
|
244
|
+
// record's binding is what transitionGoal enforces on the edge into running, so a goal with
|
|
245
|
+
// no recorded binding would pass the gate here yet stay publicly transitionable - an
|
|
246
|
+
// unrecorded guard is unenforceable, and a mismatched one gates against the wrong authority.
|
|
247
|
+
// Both are wiring defects, refused loudly before the guard is consulted.
|
|
248
|
+
const gateSpec = await readGoalSpec(ctx, goal);
|
|
249
|
+
if (gateSpec === undefined)
|
|
250
|
+
throw new EpEnvelopeError("failed-precondition", `goal "${goal.goalId}" is unknown; the gate runs on an accepted goal (SPEC 13.6)`);
|
|
251
|
+
if (gateSpec.value.guard !== args.guardEndpoint)
|
|
252
|
+
throw new EpEnvelopeError("failed-precondition", `goal "${goal.goalId}"'s accepted record ${gateSpec.value.guard === undefined ? "binds no guard" : `binds guard ${JSON.stringify(gateSpec.value.guard)}`} but the gate was asked to consult ${JSON.stringify(args.guardEndpoint)}; an unrecorded or mismatched guard binding is unenforceable and never gates (SPEC 13.6/13.7)`);
|
|
253
|
+
let verdict;
|
|
254
|
+
try {
|
|
255
|
+
verdict = await runGuardGate({
|
|
256
|
+
guardEndpoint: args.guardEndpoint,
|
|
257
|
+
request: { endpoint: goal.endpoint, id: goal.goalId, caller: goal.caller },
|
|
258
|
+
callGuard: args.callGuard,
|
|
259
|
+
deadlineMs: args.deadlineMs,
|
|
260
|
+
now: args.now,
|
|
261
|
+
space: ctx.space,
|
|
262
|
+
resolveAnchor: args.resolveAnchor,
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
catch (e) {
|
|
266
|
+
if (!(e instanceof EpEnvelopeError && e.code === "permission-denied"))
|
|
267
|
+
throw e; // wiring errors propagate; only the gate's fail-closed deny terminalizes
|
|
268
|
+
const res = await commitGoalResult(ctx, {
|
|
269
|
+
ref: goal, now: args.now, cause: "deny", denial: { kind: "owner", owner: ownerCommitProof(ctx) },
|
|
270
|
+
data: { code: "permission-denied", reason: e.message },
|
|
271
|
+
});
|
|
272
|
+
return { outcome: "denied", won: res.won, fact: res.fact, status: res.status };
|
|
273
|
+
}
|
|
274
|
+
if (verdict.decision === "hold") {
|
|
275
|
+
// The VERIFIED obligations ride the hold's durable record (§13.6/§13.10: MUST-apply,
|
|
276
|
+
// reusable within the goal) — verified-then-dropped would release the executor with zero
|
|
277
|
+
// attenuations after the pause.
|
|
278
|
+
const status = await holdGuardedGoal(ctx, {
|
|
279
|
+
goal, hold: { token: verdict.token, holdDeadlineMs: verdict.holdDeadlineMs, responder: verdict.responder, obligations: verdict.obligations },
|
|
280
|
+
instanceId: args.instanceId, epoch: args.epoch, now: args.now,
|
|
281
|
+
});
|
|
282
|
+
return { outcome: "waiting", hold: { token: verdict.token, holdDeadlineMs: verdict.holdDeadlineMs }, obligations: verdict.obligations, status };
|
|
283
|
+
}
|
|
284
|
+
const status = await transitionGoal(ctx, goal, "running", { owner: ownerCommitProof(ctx), clearance: mintGuardClearance(ctx, goal.goalId) });
|
|
285
|
+
return { outcome: "running", obligations: verdict.obligations, status };
|
|
286
|
+
}
|
|
287
|
+
/** The durable HOLD reconciler (§13.6): converge a goal whose guard-hold checkpoint SETTLED
|
|
288
|
+
* while the goal projection lags (a release or expiry crashed mid-flight, or the timer fire
|
|
289
|
+
* settled the checkpoint and the owner's projection is still owed). For a goal `waiting` on
|
|
290
|
+
* checkpoint T whose spec binds THIS goal:
|
|
291
|
+
* - settle RESUMED: finish the projection to `running` (idempotent);
|
|
292
|
+
* - settle EXPIRED: drive the terminal deny via {@link expireGuardHold} (idempotent);
|
|
293
|
+
* - still live: nothing to do — the timer plane owns the deadline.
|
|
294
|
+
* A goal not waiting, or waiting on a token whose checkpoint does not bind it, is left
|
|
295
|
+
* untouched: this reconciler converges exactly the holds this module minted. (The
|
|
296
|
+
* mint-then-no-wait partial state is recovered by RETRYING the gate — the mint is
|
|
297
|
+
* idempotent-if-identical and the transition completes; a dedicated repair arm was
|
|
298
|
+
* panel-adjudicated as insurance ahead of composition and deliberately not built.)
|
|
299
|
+
* A converged `running` carries the hold's RECORDED verified obligations (§13.6/§13.10:
|
|
300
|
+
* MUST-apply, reusable within the goal — the pause never launders them away). */
|
|
301
|
+
export async function reconcileGuardHold(ctx, args) {
|
|
302
|
+
const goal = snapshotRef(args.goal);
|
|
303
|
+
const status = await readGoalStatus(ctx, goal);
|
|
304
|
+
if (status === undefined || status.value.state !== "waiting" || status.value.checkpoint === undefined)
|
|
305
|
+
return { converged: "none" };
|
|
306
|
+
const token = status.value.checkpoint.token;
|
|
307
|
+
let obligations;
|
|
308
|
+
try {
|
|
309
|
+
({ obligations } = await bindCheckpointToGoal(ctx, goal, token));
|
|
310
|
+
}
|
|
311
|
+
catch {
|
|
312
|
+
return { converged: "none" };
|
|
313
|
+
} // a foreign/unknown token's wait is not this reconciler's to converge
|
|
314
|
+
const settle = await readCheckpointSettle(ctx.jsm, ctx.space, { endpoint: goal.endpoint, token });
|
|
315
|
+
if (settle === undefined)
|
|
316
|
+
return { converged: "none" };
|
|
317
|
+
if (settle.settle === "resumed") {
|
|
318
|
+
const cur = await readGoalStatus(ctx, goal);
|
|
319
|
+
if (cur?.value.state === "waiting" && cur.value.checkpoint?.token === token)
|
|
320
|
+
await transitionGoal(ctx, goal, "running", { owner: ownerCommitProof(ctx), clearance: mintGuardClearance(ctx, goal.goalId) });
|
|
321
|
+
return { converged: "running", obligations };
|
|
322
|
+
}
|
|
323
|
+
await expireGuardHold(ctx, { goal, token, now: args.now });
|
|
324
|
+
return { converged: "denied" };
|
|
325
|
+
}
|
|
326
|
+
/** Convert a HELD action to `waiting` on a checkpoint OWNED BY THE GUARD DECISION (§13.6): the
|
|
327
|
+
* checkpoint's holder is the guard's authenticated responder (only IT may resume), the
|
|
328
|
+
* deadline is the hold's (mandatory), and the goal's status projects `waiting` carrying the
|
|
329
|
+
* checkpoint coordinate. The mint is idempotent and the timer is armed through the mediated
|
|
330
|
+
* plane by the checkpoint module. */
|
|
331
|
+
export async function holdGuardedGoal(ctx, args) {
|
|
332
|
+
// The durable ingress admits ONLY gate-verified obligations (freelance HIGH): this is a
|
|
333
|
+
// public composition seam, and the store carries the persisted set as custody WITHOUT
|
|
334
|
+
// re-verifying (the gate verified at HOLD time) - so a structurally shaped set that never
|
|
335
|
+
// passed runGuardGate's verification must refuse HERE, or release/reconcile would later
|
|
336
|
+
// return it under the same trusted type as a verified one.
|
|
337
|
+
for (const [i, ob] of (args.hold.obligations ?? []).entries())
|
|
338
|
+
if (!VERIFIED_OBLIGATIONS.has(ob))
|
|
339
|
+
throw new EpEnvelopeError("permission-denied", `hold obligation[${i}] was not verified by THIS gate; obligations enter a hold only through runGuardGate's verification (signature, anchor role/scope, window, request binding) - a structurally shaped set never authorizes (SPEC 13.6/13.10)`);
|
|
340
|
+
await mintCheckpoint(ctx.kv, ctx.js, ctx.space, {
|
|
341
|
+
ref: { endpoint: args.goal.endpoint, token: args.hold.token },
|
|
342
|
+
instanceId: args.instanceId, epoch: args.epoch,
|
|
343
|
+
goal: { caller: args.goal.caller, goalId: args.goal.goalId },
|
|
344
|
+
...(args.hold.obligations !== undefined && args.hold.obligations.length > 0 ? { obligations: args.hold.obligations } : {}),
|
|
345
|
+
holder: args.hold.responder,
|
|
346
|
+
deadline: args.now + args.hold.holdDeadlineMs, now: args.now,
|
|
347
|
+
});
|
|
348
|
+
// The pause is OWNER-authored (the owner mints the checkpoint and records the wait), not a
|
|
349
|
+
// remote executor's progress step, so a target-pinned goal's hold does not require executor
|
|
350
|
+
// currency here — the guard responder, not a superseded executor, is the checkpoint holder.
|
|
351
|
+
// The authority is the CONSTRUCTION-BOUND owner proof from this context, never a raw flag.
|
|
352
|
+
return transitionGoal(ctx, args.goal, "waiting", { fields: { checkpoint: { token: args.hold.token, deadlineGeneration: 1 } }, owner: ownerCommitProof(ctx) });
|
|
353
|
+
}
|
|
354
|
+
/** Bind a hold's checkpoint token to THIS goal (§13.6): read the checkpoint's recorded spec and
|
|
355
|
+
* require its `goal` to be the exact goal being released/expired — a checkpoint pauses ONE
|
|
356
|
+
* recorded goal (holdGuardedGoal mints it with that binding), so a valid token for goal A must
|
|
357
|
+
* never drive a transition on unrelated goal B. Fail-closed: an unknown token, a spec with no
|
|
358
|
+
* goal binding, or a mismatched caller/goalId all refuse before any state is touched. */
|
|
359
|
+
async function bindCheckpointToGoal(ctx, goal, token) {
|
|
360
|
+
const spec = await readCheckpointSpec(ctx.kv, { endpoint: goal.endpoint, token });
|
|
361
|
+
if (spec === undefined)
|
|
362
|
+
throw new EpEnvelopeError("failed-precondition", `checkpoint "${token}" is unknown on endpoint "${goal.endpoint}"; a guard hold names a minted checkpoint (SPEC 13.6)`);
|
|
363
|
+
const g = spec.goal;
|
|
364
|
+
if (g === undefined)
|
|
365
|
+
throw new EpEnvelopeError("permission-denied", `checkpoint "${token}" records no goal binding; it does not pause goal "${goal.goalId}" and cannot drive its transition (SPEC 13.6)`);
|
|
366
|
+
if (g.goalId !== goal.goalId || g.caller.owner !== goal.caller.owner || g.caller.actor !== goal.caller.actor || g.caller.uid !== goal.caller.uid)
|
|
367
|
+
throw new EpEnvelopeError("permission-denied", `checkpoint "${token}" pauses goal "${g.goalId}" (${g.caller.owner}.${g.caller.actor}/${g.caller.uid}), not the presented goal "${goal.goalId}"; a hold's token is goal-bound, never a free release of any goal on the endpoint (SPEC 13.6)`);
|
|
368
|
+
// The hold's RECORDED verified obligations (persisted at mint; §13.6/§13.10 MUST-apply,
|
|
369
|
+
// reusable within the goal): release/reconcile return exactly this set, signatures intact.
|
|
370
|
+
return { obligations: (spec.obligations ?? []) };
|
|
371
|
+
}
|
|
372
|
+
/** Release a guard hold: the GUARD (the checkpoint's holder, presenting as itself) resumes the
|
|
373
|
+
* one-use checkpoint, and the goal leaves `waiting` back to `running`. The token is first bound
|
|
374
|
+
* to THIS goal (a valid token for another goal never releases it), THEN the resume seam
|
|
375
|
+
* enforces holder binding, one-use, and the deadline fence (a hold past its deadline drives
|
|
376
|
+
* the EXPIRED settlement there and refuses; an expired hold never releases).
|
|
377
|
+
*
|
|
378
|
+
* CRASH CONVERGENCE (the checkpoint settlement is the arbiter; the goal transition is its
|
|
379
|
+
* derived projection): a crash between the one-use resume and the goal transition leaves the
|
|
380
|
+
* checkpoint `resumed` and the goal `waiting` — the RETRY's resume loses `conflict`, so it
|
|
381
|
+
* OBSERVES the recorded settlement, requires it to be THIS presenter's own `resumed` (a
|
|
382
|
+
* foreign or expired settlement rethrows), and finishes the projection idempotently (a goal
|
|
383
|
+
* already `running` is the converged state, not an error). */
|
|
384
|
+
export async function releaseGuardHold(ctx, args) {
|
|
385
|
+
// Entry snapshots (single-read): the presenter is compared against the recorded settlement on
|
|
386
|
+
// the convergence path, and the FULL goal detaches ONCE here (MEDIUM) so bind, resume, and the
|
|
387
|
+
// projection all read this snapshot - a goal mutated across the resume await can never validate
|
|
388
|
+
// goal A's checkpoint and then project goal B.
|
|
389
|
+
const presenter = Object.freeze({ id: String(args.presenter.id), lifecycleUid: String(args.presenter.lifecycleUid) });
|
|
390
|
+
const goal = snapshotRef(args.goal);
|
|
391
|
+
const token = String(args.token);
|
|
392
|
+
const cpRef = { endpoint: goal.endpoint, token };
|
|
393
|
+
const { obligations } = await bindCheckpointToGoal(ctx, goal, token); // goal-binding BEFORE consuming the one-use resume
|
|
394
|
+
let settle;
|
|
395
|
+
try {
|
|
396
|
+
settle = await resumeCheckpoint(ctx.kv, ctx.js, ctx.jsm, ctx.space, { ref: cpRef, presenter, now: args.now });
|
|
397
|
+
}
|
|
398
|
+
catch (e) {
|
|
399
|
+
if (!(e instanceof EpEnvelopeError && e.code === "conflict"))
|
|
400
|
+
throw e;
|
|
401
|
+
// The one-use resume is already consumed: converge IFF the recorded settlement is THIS
|
|
402
|
+
// presenter's own resume (the crashed earlier attempt won); anything else rethrows.
|
|
403
|
+
const winner = await readCheckpointSettle(ctx.jsm, ctx.space, cpRef);
|
|
404
|
+
if (winner === undefined || winner.settle !== "resumed"
|
|
405
|
+
|| winner.holder?.id !== presenter.id || winner.holder?.lifecycleUid !== presenter.lifecycleUid)
|
|
406
|
+
throw e;
|
|
407
|
+
settle = winner;
|
|
408
|
+
}
|
|
409
|
+
// The goal returns from its owner-driven pause to running (the guard's holder-bound resume is
|
|
410
|
+
// the authority, verified by resumeCheckpoint; the proof is construction-bound), but ONLY if it
|
|
411
|
+
// is currently waiting on THIS hold's checkpoint (HIGH 1): a stale or replayed release of an OLD
|
|
412
|
+
// (already-resumed) hold must never move a goal that is now waiting on a DIFFERENT, live hold. An
|
|
413
|
+
// already-running goal is the converged crash state (idempotent); a goal waiting on another token
|
|
414
|
+
// (or terminal/unknown) refuses.
|
|
415
|
+
const current = await readGoalStatus(ctx, goal);
|
|
416
|
+
if (current?.value.state === "running")
|
|
417
|
+
return { settle, status: current.value, obligations };
|
|
418
|
+
const waitingToken = current?.value.state === "waiting" ? current.value.checkpoint?.token : undefined;
|
|
419
|
+
if (waitingToken !== token)
|
|
420
|
+
throw new EpEnvelopeError("failed-precondition", `goal "${goal.goalId}" is not waiting on checkpoint "${token}" (${current === undefined ? "unknown goal" : current.value.state === "waiting" ? `it waits on "${String(waitingToken)}"` : `it is ${current.value.state}`}); a release of an old hold never moves a goal paused on a newer one (SPEC 13.6)`);
|
|
421
|
+
const status = await transitionGoal(ctx, goal, "running", { owner: ownerCommitProof(ctx), clearance: mintGuardClearance(ctx, goal.goalId) });
|
|
422
|
+
return { settle, status, obligations };
|
|
423
|
+
}
|
|
424
|
+
/** Settle an EXPIRED guard hold onto the goal: an expired hold is DENY (fail closed). The token
|
|
425
|
+
* is first bound to THIS goal (an arbitrary token never terminal-fails an unrelated goal), then
|
|
426
|
+
* the CHECKPOINT is owner-expired (settling its status and stopping its timers, so no orphaned
|
|
427
|
+
* schedule lingers until the checkpoint's own deadline), and finally the goal commits terminal
|
|
428
|
+
* `failed` (permission-denied) at the shared commit point — where a racing completion or cancel
|
|
429
|
+
* may lawfully have won first (the caller observes the winner; the projection converges either
|
|
430
|
+
* way). Idempotent: an already-terminal goal returns its winner. */
|
|
431
|
+
export async function expireGuardHold(ctx, args) {
|
|
432
|
+
const goal = snapshotRef(args.goal); // detach the full goal ONCE (same discipline as release)
|
|
433
|
+
const token = String(args.token);
|
|
434
|
+
await bindCheckpointToGoal(ctx, goal, token); // goal-binding BEFORE terminalizing anything
|
|
435
|
+
const status = await readGoalStatus(ctx, goal);
|
|
436
|
+
if (status === undefined)
|
|
437
|
+
throw new EpEnvelopeError("failed-precondition", `goal "${goal.goalId}" is unknown; an expiry settles only an accepted goal (SPEC 13.6)`);
|
|
438
|
+
// Owner-expire the DUE checkpoint so its status settles and its timers stop (idempotent; an
|
|
439
|
+
// already-settled checkpoint returns its winner). The goal terminal is the authority for the
|
|
440
|
+
// caller, but the checkpoint must not be left waiting with a live timer.
|
|
441
|
+
const settled = await expireCheckpoint(ctx.kv, ctx.js, ctx.jsm, ctx.space, { ref: { endpoint: goal.endpoint, token }, now: args.now });
|
|
442
|
+
if (settled.settle === "resumed") {
|
|
443
|
+
// The hold was lawfully RELEASED before this expiry: a resumed hold never denies. A raced
|
|
444
|
+
// caller observes the goal's recorded terminal if one exists. If the release resumed the
|
|
445
|
+
// checkpoint but CRASHED before projecting the goal, the goal is still waiting on THIS token -
|
|
446
|
+
// FINISH that projection here (goal -> running) so it never hangs waiting forever (HIGH 4: a
|
|
447
|
+
// plain refusal is not crash recovery), then refuse (there is no terminal to return, and a
|
|
448
|
+
// resumed hold never denies). Idempotent: an already-running/re-held goal is not re-projected.
|
|
449
|
+
const fact = await readGoalResult(ctx, goal);
|
|
450
|
+
if (fact !== undefined)
|
|
451
|
+
return { won: false, fact, status: await projectGoalTerminal(ctx, goal) };
|
|
452
|
+
const cur = await readGoalStatus(ctx, goal);
|
|
453
|
+
if (cur?.value.state === "waiting" && cur.value.checkpoint?.token === token)
|
|
454
|
+
await transitionGoal(ctx, goal, "running", { owner: ownerCommitProof(ctx), clearance: mintGuardClearance(ctx, goal.goalId) });
|
|
455
|
+
throw new EpEnvelopeError("failed-precondition", `the guard hold "${token}" was RELEASED (resumed at ${settled.ts}), not expired; the goal projection is converged to running and a resumed hold never denies (SPEC 13.6)`);
|
|
456
|
+
}
|
|
457
|
+
// An expired hold is DENY (fail closed) → the goal commits terminal failed via the `deny`
|
|
458
|
+
// cause at the shared commit point, where a racing completion/cancel may win first. The
|
|
459
|
+
// denial carries its AUTHORITATIVE PREDICATE: the commit boundary itself re-verifies that
|
|
460
|
+
// the named checkpoint binds THIS goal and that its recorded one-use settlement is EXPIRED
|
|
461
|
+
// (the expiry recorded just above) — a bare deny cause proves nothing and is refused there.
|
|
462
|
+
const res = await commitGoalResult(ctx, {
|
|
463
|
+
ref: goal, now: args.now, cause: "deny", denial: { kind: "hold-expired", token },
|
|
464
|
+
data: { code: "permission-denied", reason: `the guard hold "${token}" expired without a release; timeout is deny (SPEC 13.6: fail closed)` },
|
|
465
|
+
});
|
|
466
|
+
return res;
|
|
467
|
+
}
|
|
468
|
+
//# sourceMappingURL=endpoint-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endpoint-guard.js","sourceRoot":"","sources":["../src/endpoint-guard.ts"],"names":[],"mappings":"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"}
|