@coderifts/agent-guard 12.0.0 → 14.0.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 +1 -1
- package/dist/cjs/atomic-profile.d.ts +61 -0
- package/dist/cjs/atomic-profile.d.ts.map +1 -0
- package/dist/cjs/atomic-profile.js +119 -0
- package/dist/cjs/atomic-profile.js.map +1 -0
- package/dist/cjs/cas-adapters/fs-default-wire.d.ts +40 -10
- package/dist/cjs/cas-adapters/fs-default-wire.d.ts.map +1 -1
- package/dist/cjs/cas-adapters/fs-default-wire.js +46 -18
- package/dist/cjs/cas-adapters/fs-default-wire.js.map +1 -1
- package/dist/cjs/cas-adapters/fs.d.ts +49 -0
- package/dist/cjs/cas-adapters/fs.d.ts.map +1 -1
- package/dist/cjs/cas-adapters/fs.js +167 -13
- package/dist/cjs/cas-adapters/fs.js.map +1 -1
- package/dist/cjs/cas-attestation.d.ts +23 -3
- package/dist/cjs/cas-attestation.d.ts.map +1 -1
- package/dist/cjs/cas-attestation.js +28 -0
- package/dist/cjs/cas-attestation.js.map +1 -1
- package/dist/cjs/conditional-write.d.ts +55 -0
- package/dist/cjs/conditional-write.d.ts.map +1 -1
- package/dist/cjs/conditional-write.js +6 -0
- package/dist/cjs/conditional-write.js.map +1 -1
- package/dist/cjs/deploy-gate.d.ts +15 -3
- package/dist/cjs/deploy-gate.d.ts.map +1 -1
- package/dist/cjs/deploy-gate.js +15 -3
- package/dist/cjs/deploy-gate.js.map +1 -1
- package/dist/cjs/execution-grant.d.ts +2 -0
- package/dist/cjs/execution-grant.d.ts.map +1 -1
- package/dist/cjs/execution-grant.js.map +1 -1
- package/dist/cjs/execution-proof.d.ts.map +1 -1
- package/dist/cjs/execution-proof.js +3 -1
- package/dist/cjs/execution-proof.js.map +1 -1
- package/dist/cjs/guard.d.ts.map +1 -1
- package/dist/cjs/guard.js +35 -7
- package/dist/cjs/guard.js.map +1 -1
- package/dist/cjs/index.d.ts +9 -5
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +18 -3
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/monitoring-delivery.d.ts +1 -1
- package/dist/cjs/monitoring-delivery.d.ts.map +1 -1
- package/dist/cjs/tool-registry.d.ts.map +1 -1
- package/dist/cjs/tool-registry.js +15 -2
- package/dist/cjs/tool-registry.js.map +1 -1
- package/dist/cjs/types.d.ts +1 -1
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/cjs/with-coderifts.d.ts +50 -5
- package/dist/cjs/with-coderifts.d.ts.map +1 -1
- package/dist/cjs/with-coderifts.js +49 -6
- package/dist/cjs/with-coderifts.js.map +1 -1
- package/dist/esm/atomic-profile.d.ts +61 -0
- package/dist/esm/atomic-profile.d.ts.map +1 -0
- package/dist/esm/atomic-profile.js +111 -0
- package/dist/esm/atomic-profile.js.map +1 -0
- package/dist/esm/cas-adapters/fs-default-wire.d.ts +40 -10
- package/dist/esm/cas-adapters/fs-default-wire.d.ts.map +1 -1
- package/dist/esm/cas-adapters/fs-default-wire.js +45 -19
- package/dist/esm/cas-adapters/fs-default-wire.js.map +1 -1
- package/dist/esm/cas-adapters/fs.d.ts +49 -0
- package/dist/esm/cas-adapters/fs.d.ts.map +1 -1
- package/dist/esm/cas-adapters/fs.js +162 -12
- package/dist/esm/cas-adapters/fs.js.map +1 -1
- package/dist/esm/cas-attestation.d.ts +23 -3
- package/dist/esm/cas-attestation.d.ts.map +1 -1
- package/dist/esm/cas-attestation.js +28 -0
- package/dist/esm/cas-attestation.js.map +1 -1
- package/dist/esm/conditional-write.d.ts +55 -0
- package/dist/esm/conditional-write.d.ts.map +1 -1
- package/dist/esm/conditional-write.js +6 -0
- package/dist/esm/conditional-write.js.map +1 -1
- package/dist/esm/deploy-gate.d.ts +15 -3
- package/dist/esm/deploy-gate.d.ts.map +1 -1
- package/dist/esm/deploy-gate.js +15 -3
- package/dist/esm/deploy-gate.js.map +1 -1
- package/dist/esm/execution-grant.d.ts +2 -0
- package/dist/esm/execution-grant.d.ts.map +1 -1
- package/dist/esm/execution-grant.js.map +1 -1
- package/dist/esm/execution-proof.d.ts.map +1 -1
- package/dist/esm/execution-proof.js +3 -1
- package/dist/esm/execution-proof.js.map +1 -1
- package/dist/esm/guard.d.ts.map +1 -1
- package/dist/esm/guard.js +36 -8
- package/dist/esm/guard.js.map +1 -1
- package/dist/esm/index.d.ts +9 -5
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +4 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/monitoring-delivery.d.ts +1 -1
- package/dist/esm/monitoring-delivery.d.ts.map +1 -1
- package/dist/esm/tool-registry.d.ts.map +1 -1
- package/dist/esm/tool-registry.js +16 -3
- package/dist/esm/tool-registry.js.map +1 -1
- package/dist/esm/types.d.ts +1 -1
- package/dist/esm/types.d.ts.map +1 -1
- package/dist/esm/with-coderifts.d.ts +50 -5
- package/dist/esm/with-coderifts.d.ts.map +1 -1
- package/dist/esm/with-coderifts.js +47 -6
- package/dist/esm/with-coderifts.js.map +1 -1
- package/package.json +3 -2
|
@@ -45,8 +45,11 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
45
45
|
};
|
|
46
46
|
})();
|
|
47
47
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
-
exports.tokensEqual = exports.FS_ABSENT_TOKEN = exports.FS_VERSION_TOKEN_PREFIX = void 0;
|
|
48
|
+
exports.tokensEqual = exports.UnsafeCasPathError = exports.FS_ABSENT_TOKEN = exports.FS_VERSION_TOKEN_PREFIX = void 0;
|
|
49
49
|
exports.fsTokenContentHash = fsTokenContentHash;
|
|
50
|
+
exports.assertSafeCasPath = assertSafeCasPath;
|
|
51
|
+
exports.fsObjectIdentity = fsObjectIdentity;
|
|
52
|
+
exports.identitiesEqual = identitiesEqual;
|
|
50
53
|
exports.createFsVersionToken = createFsVersionToken;
|
|
51
54
|
exports.readVersionedFile = readVersionedFile;
|
|
52
55
|
exports.writeFileIfUnchanged = writeFileIfUnchanged;
|
|
@@ -79,15 +82,118 @@ function fsTokenContentHash(token) {
|
|
|
79
82
|
const hash = rest.slice(colon + 1);
|
|
80
83
|
return /^[a-f0-9]{64}$/.test(hash) ? hash : null;
|
|
81
84
|
}
|
|
85
|
+
/**
|
|
86
|
+
* Refuse a path this adapter must not treat as a CAS target.
|
|
87
|
+
*
|
|
88
|
+
* MEASURED ABSENT before this existed (2026-08-27): `..` was silently resolved and the write landed
|
|
89
|
+
* outside the intended directory, and a symlinked target was followed by stat/readFile while the
|
|
90
|
+
* rename replaced the LINK — so the check and the write referred to DIFFERENT objects. That object
|
|
91
|
+
* mismatch is the other half of the TOCTOU: a path interpreted twice can have a symlink swapped in
|
|
92
|
+
* between the two interpretations.
|
|
93
|
+
*
|
|
94
|
+
* Three refusals, each for a different escape:
|
|
95
|
+
* - a literal `..` segment in the caller's own path (traversal, judged BEFORE resolution),
|
|
96
|
+
* - a symlinked final component (lstat — the object we would check is not the one we would write).
|
|
97
|
+
*
|
|
98
|
+
* The parent directory is CANONICALISED rather than rejected. Requiring realpath(dir) === dir was
|
|
99
|
+
* written first and measured wrong within the hour: on macOS /var is itself a symlink, so every
|
|
100
|
+
* path under a normal temp directory was refused. A symlinked ancestor is not the danger — an
|
|
101
|
+
* ancestor that CHANGES between the check and the write is, and that is closed by the inode/device
|
|
102
|
+
* identity re-check in writeFileIfUnchanged, not by refusing ordinary filesystems. Resolving the
|
|
103
|
+
* parent once and building the target from it means both the check and the write name one object.
|
|
104
|
+
*/
|
|
105
|
+
class UnsafeCasPathError extends Error {
|
|
106
|
+
reason;
|
|
107
|
+
casPath;
|
|
108
|
+
constructor(reason, casPath) {
|
|
109
|
+
super(`unsafe CAS path (${reason}): ${casPath}`);
|
|
110
|
+
this.name = 'UnsafeCasPathError';
|
|
111
|
+
this.reason = reason;
|
|
112
|
+
this.casPath = casPath;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
exports.UnsafeCasPathError = UnsafeCasPathError;
|
|
116
|
+
async function assertSafeCasPath(filePath) {
|
|
117
|
+
// 1. Traversal is judged on what the CALLER wrote, not on the resolved form — resolution is
|
|
118
|
+
// exactly what makes `sub/../escaped` look innocent.
|
|
119
|
+
const segments = filePath.split(/[\\/]+/);
|
|
120
|
+
if (segments.includes('..'))
|
|
121
|
+
throw new UnsafeCasPathError('path_traversal', filePath);
|
|
122
|
+
const resolved = path.resolve(filePath);
|
|
123
|
+
// 2. Canonicalise the PARENT once, then rebuild the target from it, so every later use names the
|
|
124
|
+
// same directory object. realpath on the parent only — never on the target itself, because
|
|
125
|
+
// that would follow exactly the final-component symlink step 3 exists to refuse.
|
|
126
|
+
const dir = path.dirname(resolved);
|
|
127
|
+
let canonicalDir = dir;
|
|
128
|
+
try {
|
|
129
|
+
canonicalDir = await node_fs_1.promises.realpath(dir);
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
const code = err && typeof err === 'object' && 'code' in err ? String(err.code) : '';
|
|
133
|
+
if (code !== 'ENOENT')
|
|
134
|
+
throw err;
|
|
135
|
+
// Parent does not exist yet — a create under mkdir -p. Keep the resolved form.
|
|
136
|
+
}
|
|
137
|
+
const target = path.join(canonicalDir, path.basename(resolved));
|
|
138
|
+
// 3. The final component must not be a symlink. lstat does NOT follow; stat would, which is the
|
|
139
|
+
// whole bug: stat/readFile measured the TARGET while rename replaced the LINK, so the check
|
|
140
|
+
// and the write referred to different objects. ENOENT is fine — create-if-absent is legitimate.
|
|
141
|
+
try {
|
|
142
|
+
const lst = await node_fs_1.promises.lstat(target);
|
|
143
|
+
if (lst.isSymbolicLink())
|
|
144
|
+
throw new UnsafeCasPathError('symlink_target', filePath);
|
|
145
|
+
}
|
|
146
|
+
catch (err) {
|
|
147
|
+
if (err instanceof UnsafeCasPathError)
|
|
148
|
+
throw err;
|
|
149
|
+
const code = err && typeof err === 'object' && 'code' in err ? String(err.code) : '';
|
|
150
|
+
if (code !== 'ENOENT')
|
|
151
|
+
throw err;
|
|
152
|
+
}
|
|
153
|
+
return target;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Identity of the object CURRENTLY at a path, read through a FILE DESCRIPTOR.
|
|
157
|
+
*
|
|
158
|
+
* Opening once and fstat-ing the handle is what makes this an identity rather than another path
|
|
159
|
+
* interpretation: the fd names the object, so a symlink swapped in afterwards cannot redirect it.
|
|
160
|
+
* null when the path does not exist.
|
|
161
|
+
*/
|
|
162
|
+
async function fsObjectIdentity(filePath) {
|
|
163
|
+
let fh;
|
|
164
|
+
try {
|
|
165
|
+
fh = await node_fs_1.promises.open(filePath, 'r');
|
|
166
|
+
const st = await fh.stat();
|
|
167
|
+
return { dev: st.dev, ino: st.ino };
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
const code = err && typeof err === 'object' && 'code' in err ? String(err.code) : '';
|
|
171
|
+
if (code === 'ENOENT')
|
|
172
|
+
return null;
|
|
173
|
+
throw err;
|
|
174
|
+
}
|
|
175
|
+
finally {
|
|
176
|
+
if (fh)
|
|
177
|
+
await fh.close().catch(() => { });
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
function identitiesEqual(a, b) {
|
|
181
|
+
if (!a || !b)
|
|
182
|
+
return false;
|
|
183
|
+
return a.dev === b.dev && a.ino === b.ino;
|
|
184
|
+
}
|
|
82
185
|
/**
|
|
83
186
|
* Build a VersionToken from path: mtime (ms) + sha256 of file bytes.
|
|
84
187
|
* Throws on I/O errors other than callers may catch. ENOENT → returns FS_ABSENT_TOKEN
|
|
85
188
|
* so hosts can CAS create vs create-raced.
|
|
86
189
|
*/
|
|
87
190
|
async function createFsVersionToken(filePath) {
|
|
88
|
-
|
|
191
|
+
// ONE open, then stat AND read from the same handle. Previously this was stat(path) followed by
|
|
192
|
+
// readFile(path) — two interpretations of the same string, so a swap between them produced a
|
|
193
|
+
// token describing neither object exactly. The fd names the object for both reads.
|
|
194
|
+
let fh;
|
|
89
195
|
try {
|
|
90
|
-
|
|
196
|
+
fh = await node_fs_1.promises.open(filePath, 'r');
|
|
91
197
|
}
|
|
92
198
|
catch (err) {
|
|
93
199
|
const code = err && typeof err === 'object' && 'code' in err
|
|
@@ -97,14 +203,20 @@ async function createFsVersionToken(filePath) {
|
|
|
97
203
|
return exports.FS_ABSENT_TOKEN;
|
|
98
204
|
throw err;
|
|
99
205
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
206
|
+
try {
|
|
207
|
+
const st = await fh.stat();
|
|
208
|
+
if (!st.isFile()) {
|
|
209
|
+
// Directories / specials are not content CAS targets for this adapter.
|
|
210
|
+
throw new Error(`createFsVersionToken: not a regular file: ${filePath}`);
|
|
211
|
+
}
|
|
212
|
+
const buf = await fh.readFile();
|
|
213
|
+
const hash = sha256hex(buf);
|
|
214
|
+
const mtimeMs = Math.trunc(st.mtimeMs);
|
|
215
|
+
return `${exports.FS_VERSION_TOKEN_PREFIX}${mtimeMs}:${hash}`;
|
|
216
|
+
}
|
|
217
|
+
finally {
|
|
218
|
+
await fh.close().catch(() => { });
|
|
103
219
|
}
|
|
104
|
-
const buf = await node_fs_1.promises.readFile(filePath);
|
|
105
|
-
const hash = sha256hex(buf);
|
|
106
|
-
const mtimeMs = Math.trunc(st.mtimeMs);
|
|
107
|
-
return `${exports.FS_VERSION_TOKEN_PREFIX}${mtimeMs}:${hash}`;
|
|
108
220
|
}
|
|
109
221
|
/**
|
|
110
222
|
* Read file content + version token for VersionedContent (host reporting / preflight prior).
|
|
@@ -135,9 +247,29 @@ async function readVersionedFile(filePath) {
|
|
|
135
247
|
* Wired through executeIfUnchanged — not a parallel path.
|
|
136
248
|
*/
|
|
137
249
|
async function writeFileIfUnchanged(args) {
|
|
138
|
-
|
|
250
|
+
// Refuse traversal / symlink / mounted-over-parent BEFORE any token is measured. A CAS over an
|
|
251
|
+
// object the caller did not name is not a weaker guarantee, it is a wrong one.
|
|
252
|
+
const target = await assertSafeCasPath(args.path);
|
|
139
253
|
const body = typeof args.content === 'string' ? Buffer.from(args.content, 'utf8') : args.content;
|
|
140
254
|
const writtenHash = sha256hex(body);
|
|
255
|
+
// Identity of the object the CHECK is about, captured through an fd (null when creating).
|
|
256
|
+
const checkedIdentity = await fsObjectIdentity(target);
|
|
257
|
+
// T1 identity claim: if the caller measured one at authorization time, the object must still be
|
|
258
|
+
// that object BEFORE we do anything. Captured-here identity cannot see a swap that predates this
|
|
259
|
+
// call, which is exactly the case the token also cannot see.
|
|
260
|
+
const hasT1Identity = Object.prototype.hasOwnProperty.call(args, 'expected_identity');
|
|
261
|
+
if (hasT1Identity) {
|
|
262
|
+
const t1 = args.expected_identity ?? null;
|
|
263
|
+
const held = t1 === null ? checkedIdentity === null : identitiesEqual(t1, checkedIdentity);
|
|
264
|
+
if (!held) {
|
|
265
|
+
return {
|
|
266
|
+
status: 'refused',
|
|
267
|
+
reason: 'stale_version_token',
|
|
268
|
+
expected_token: args.expected_token,
|
|
269
|
+
current_token: await createFsVersionToken(target).catch(() => null),
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
}
|
|
141
273
|
return (0, conditional_write_js_1.executeIfUnchanged)({
|
|
142
274
|
expected_token: args.expected_token,
|
|
143
275
|
current_token: () => createFsVersionToken(target),
|
|
@@ -160,7 +292,22 @@ async function writeFileIfUnchanged(args) {
|
|
|
160
292
|
const tmp = path.join(dir, `.coderifts-cas-${path.basename(target)}-${process.pid}-${(0, node_crypto_1.randomBytes)(6).toString('hex')}.tmp`);
|
|
161
293
|
try {
|
|
162
294
|
await node_fs_1.promises.writeFile(tmp, body);
|
|
163
|
-
// Close pre-rename window
|
|
295
|
+
// Close pre-rename window on BOTH facts. Content equality alone cannot see an object swap:
|
|
296
|
+
// a symlink or a replaced inode with identical bytes passes a token check and is still a
|
|
297
|
+
// different object. Identity is checked first because it is the stronger statement.
|
|
298
|
+
const stillIdentity = await fsObjectIdentity(target);
|
|
299
|
+
const identityHeld = checkedIdentity === null
|
|
300
|
+
? stillIdentity === null // create-if-absent: nothing may have appeared
|
|
301
|
+
: identitiesEqual(checkedIdentity, stillIdentity);
|
|
302
|
+
if (!identityHeld) {
|
|
303
|
+
try {
|
|
304
|
+
await node_fs_1.promises.unlink(tmp);
|
|
305
|
+
}
|
|
306
|
+
catch {
|
|
307
|
+
/* ignore */
|
|
308
|
+
}
|
|
309
|
+
throw new conditional_write_js_1.StaleVersionTokenAbort(await createFsVersionToken(target).catch(() => null));
|
|
310
|
+
}
|
|
164
311
|
const still = await createFsVersionToken(target);
|
|
165
312
|
if (!(0, conditional_write_js_1.tokensEqual)(args.expected_token, still)) {
|
|
166
313
|
try {
|
|
@@ -186,7 +333,14 @@ async function writeFileIfUnchanged(args) {
|
|
|
186
333
|
}
|
|
187
334
|
throw err;
|
|
188
335
|
}
|
|
189
|
-
|
|
336
|
+
// Evidence: which OBJECT was checked, not merely which path string.
|
|
337
|
+
return {
|
|
338
|
+
path: target,
|
|
339
|
+
bytes: body.length,
|
|
340
|
+
written_content_hash: writtenHash,
|
|
341
|
+
checked_identity: checkedIdentity,
|
|
342
|
+
committed_identity: await fsObjectIdentity(target),
|
|
343
|
+
};
|
|
190
344
|
},
|
|
191
345
|
});
|
|
192
346
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../../../src/cas-adapters/fs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6Bb,gDAQC;AAOD,
|
|
1
|
+
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../../../src/cas-adapters/fs.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import type { ExecutorKeyRegistry } from '@coderifts/sdk';
|
|
15
15
|
import type { GuardExecutionProof, ExecutionResultHash } from './execution-proof.js';
|
|
16
|
-
import type { ExecuteIfUnchangedOutcome, VersionToken } from './conditional-write.js';
|
|
16
|
+
import type { ExecuteIfUnchangedOutcome, IndeterminateReason, VersionToken } from './conditional-write.js';
|
|
17
17
|
/** Machine-readable schema id — mirrors EXECUTION_PROOF_SPEC style. */
|
|
18
18
|
export declare const CAS_ATTESTATION_SPEC: "cas-attestation.v1";
|
|
19
19
|
/**
|
|
@@ -51,6 +51,16 @@ export type CasAttestationCas = {
|
|
|
51
51
|
reason: 'stale_during_commit';
|
|
52
52
|
expected_token: VersionToken;
|
|
53
53
|
post_commit_token: VersionToken | null;
|
|
54
|
+
} | {
|
|
55
|
+
status: 'indeterminate';
|
|
56
|
+
/**
|
|
57
|
+
* 'unknown' is a THIRD value, never a default to false. Collapsing it to false would say the
|
|
58
|
+
* write did not run, which is a claim we do not have; collapsing it to true would say it did.
|
|
59
|
+
*/
|
|
60
|
+
write_ran: 'unknown';
|
|
61
|
+
reason: IndeterminateReason;
|
|
62
|
+
expected_token: VersionToken;
|
|
63
|
+
observed_token: VersionToken | null;
|
|
54
64
|
};
|
|
55
65
|
/**
|
|
56
66
|
* Frozen cas-attestation.v1 record.
|
|
@@ -73,12 +83,22 @@ export type CasAttestation = {
|
|
|
73
83
|
* (clean commit only — committed_stale_detected is NOT this flag).
|
|
74
84
|
*/
|
|
75
85
|
authorized_and_committed: boolean;
|
|
86
|
+
/**
|
|
87
|
+
* ATOMIC / v2 only: host-reported commit. Never co-named with authorized_and_committed.
|
|
88
|
+
* Absent on non-ATOMIC records (byte-identical 9.0.0 derived).
|
|
89
|
+
*/
|
|
90
|
+
authorized_and_host_reported_committed?: boolean;
|
|
76
91
|
/** Write mutation ran: committed or committed_stale_detected. */
|
|
77
92
|
write_ran: boolean;
|
|
78
93
|
/** outcome.status === 'committed_stale_detected'. */
|
|
79
94
|
stale_during_commit: boolean;
|
|
80
95
|
/** outcome.status === 'refused'. */
|
|
81
96
|
refused: boolean;
|
|
97
|
+
/**
|
|
98
|
+
* outcome.status === 'indeterminate'. Downstream MUST block on this: it is not a pass, and it
|
|
99
|
+
* is not a failure either. Reconciliation is required before anything may proceed.
|
|
100
|
+
*/
|
|
101
|
+
indeterminate: boolean;
|
|
82
102
|
};
|
|
83
103
|
/**
|
|
84
104
|
* Observation-side CAS evidence class (S2-F2a R3). Never a verdict/preimage field.
|
|
@@ -112,10 +132,10 @@ export type EvaluateCasEvidenceOpts = {
|
|
|
112
132
|
receipt_digest?: string;
|
|
113
133
|
} | null;
|
|
114
134
|
/** Strict-only tightening of derived.authorized_and_committed. Absent = 9.0.0 formula. */
|
|
115
|
-
profile?: 'ENFORCING_STRICT';
|
|
135
|
+
profile?: 'ENFORCING_STRICT' | 'ENFORCING_ATOMIC';
|
|
116
136
|
};
|
|
117
137
|
/** Existing CasAttestation.derived name and its honest sibling — not a parallel taxonomy. */
|
|
118
|
-
export type CommitLabel = 'authorized_and_committed' | 'authorized_not_committed';
|
|
138
|
+
export type CommitLabel = 'authorized_and_committed' | 'authorized_not_committed' | 'authorized_and_host_reported_committed';
|
|
119
139
|
export declare const COMMIT_EVIDENCE_MISSING: "commit_evidence_missing";
|
|
120
140
|
export type StrictCommitObservation = {
|
|
121
141
|
commit_label: CommitLabel;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cas-attestation.d.ts","sourceRoot":"","sources":["../../src/cas-attestation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAErF,OAAO,KAAK,EAAE,yBAAyB,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"cas-attestation.d.ts","sourceRoot":"","sources":["../../src/cas-attestation.ts"],"names":[],"mappings":"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"}
|
|
@@ -195,6 +195,13 @@ function isExecuteIfUnchangedOutcome(x) {
|
|
|
195
195
|
const s = x;
|
|
196
196
|
return s.reason === 'stale_during_commit' && typeof s.expected_token === 'string';
|
|
197
197
|
}
|
|
198
|
+
if (o.status === 'indeterminate') {
|
|
199
|
+
const i = x;
|
|
200
|
+
return (i.reason === 'response_lost'
|
|
201
|
+
|| i.reason === 'ambiguous_provider_reply'
|
|
202
|
+
|| i.reason === 'observation_failed')
|
|
203
|
+
&& typeof i.expected_token === 'string';
|
|
204
|
+
}
|
|
198
205
|
return false;
|
|
199
206
|
}
|
|
200
207
|
function freezeExecutionResultHash(h) {
|
|
@@ -217,6 +224,15 @@ function projectCas(outcome) {
|
|
|
217
224
|
current_token: outcome.current_token == null ? null : outcome.current_token,
|
|
218
225
|
});
|
|
219
226
|
}
|
|
227
|
+
if (outcome.status === 'indeterminate') {
|
|
228
|
+
return Object.freeze({
|
|
229
|
+
status: 'indeterminate',
|
|
230
|
+
write_ran: 'unknown',
|
|
231
|
+
reason: outcome.reason,
|
|
232
|
+
expected_token: outcome.expected_token,
|
|
233
|
+
observed_token: outcome.observed_token == null ? null : outcome.observed_token,
|
|
234
|
+
});
|
|
235
|
+
}
|
|
220
236
|
// committed_stale_detected
|
|
221
237
|
return Object.freeze({
|
|
222
238
|
status: 'committed_stale_detected',
|
|
@@ -246,8 +262,10 @@ function buildCasAttestation(proof, outcome, opts = {}) {
|
|
|
246
262
|
const write_ran = cas.write_ran === true;
|
|
247
263
|
const stale_during_commit = cas.status === 'committed_stale_detected';
|
|
248
264
|
const refused = cas.status === 'refused';
|
|
265
|
+
const indeterminate = cas.status === 'indeterminate';
|
|
249
266
|
const cas_evidence = evaluateCasEvidence(outcome, opts);
|
|
250
267
|
let authorized_and_committed = receipt_verified && cas.status === 'committed';
|
|
268
|
+
let authorized_and_host_reported_committed = false;
|
|
251
269
|
// ENFORCING_STRICT: the existing derived name now requires executor_attested + kernel
|
|
252
270
|
// cross-check. Non-strict keeps the 9.0.0 formula (receipt verified + clean commit).
|
|
253
271
|
if (opts.profile === 'ENFORCING_STRICT') {
|
|
@@ -255,6 +273,12 @@ function buildCasAttestation(proof, outcome, opts = {}) {
|
|
|
255
273
|
authorized_and_committed = authorized_and_committed
|
|
256
274
|
&& obs.commit_label === 'authorized_and_committed';
|
|
257
275
|
}
|
|
276
|
+
if (opts.profile === 'ENFORCING_ATOMIC') {
|
|
277
|
+
const executorOk = cas_evidence.class === 'executor_attested';
|
|
278
|
+
const hostClaimed = cas_evidence.class === 'host_claimed';
|
|
279
|
+
authorized_and_host_reported_committed = receipt_verified && cas.status === 'committed' && hostClaimed;
|
|
280
|
+
authorized_and_committed = receipt_verified && cas.status === 'committed' && executorOk;
|
|
281
|
+
}
|
|
258
282
|
const attestation = {
|
|
259
283
|
attestation_spec: exports.CAS_ATTESTATION_SPEC,
|
|
260
284
|
references: Object.freeze({
|
|
@@ -270,6 +294,10 @@ function buildCasAttestation(proof, outcome, opts = {}) {
|
|
|
270
294
|
write_ran,
|
|
271
295
|
stale_during_commit,
|
|
272
296
|
refused,
|
|
297
|
+
indeterminate,
|
|
298
|
+
...(opts.profile === 'ENFORCING_ATOMIC'
|
|
299
|
+
? { authorized_and_host_reported_committed }
|
|
300
|
+
: {}),
|
|
273
301
|
}),
|
|
274
302
|
cas_evidence,
|
|
275
303
|
limits: LIMITS,
|
|
@@ -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":";AAAA;;;;;;;;;;;;GAYG;;;AA+KH,0DAeC;AAmBD,0EAYC;AAqBD,kDAyDC;AAGD,sDAQC;AAGD,kEAuBC;AAgDD,kDAkEC;AAhcD,wCAA4D;AAG5D,6DAA4D;AAG5D,uEAAuE;AAC1D,QAAA,oBAAoB,GAAG,oBAA6B,CAAC;AAqBlE,MAAM,MAAM,GAAyB,MAAM,CAAC,MAAM,CAAC;IACjD,iCAAiC,EAAE,IAAI;IACvC,mDAAmD,EAAE,IAAI;IACzD,sCAAsC,EAAE,IAAI;IAC5C,qDAAqD,EAAE,IAAI;IAC3D,iCAAiC,EAAE,IAAI;IACvC,oCAAoC,EAAE,IAAI;CAC3C,CAAC,CAAC;AAkHU,QAAA,uBAAuB,GAAG,yBAAkC,CAAC;AAO1E,SAAS,uBAAuB,CAAC,OAAgB,EAAE,IAA6B;IAC9E,MAAM,IAAI,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7D,IAAI,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7D,IAAI,IAAI,CAAC,cAAc,IAAI,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/E,IAAI,IAAI,CAAC,cAAc,IAAI,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/E,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC;IAC7B,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,UAAU,IAAI,EAAE,CAAC,cAAc,CAAC;QAAE,OAAO,IAAI,CAAC;IACtE,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,SAAgB,uBAAuB,CACrC,OAAgB,EAChB,QAAiC,EACjC,OAAgC,EAAE;IAElC,MAAM,YAAY,GAAG,QAAQ,IAAI,IAAI;WAChC,QAAQ,CAAC,KAAK,KAAK,mBAAmB;WACtC,uBAAuB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC5C,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,EAAE,YAAY,EAAE,0BAA0B,EAAE,CAAC;IACtD,CAAC;IACD,OAAO;QACL,YAAY,EAAE,0BAA0B;QACxC,sBAAsB,EAAE,+BAAuB;KAChD,CAAC;AACJ,CAAC;AAED,MAAM,eAAe,GAAgB,MAAM,CAAC,MAAM,CAAC;IACjD,KAAK,EAAE,QAAQ;IACf,aAAa,EAAE,IAAI;IACnB,YAAY,EAAE,IAAI;IAClB,SAAS,EAAE,IAAI;CAChB,CAAC,CAAC;AAEH,SAAS,WAAW,CAAC,MAAqB,EAAE,GAAkB,EAAE,GAAkB;IAChF,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,KAAK,EAAE,cAAc;QACrB,aAAa,EAAE,MAAM;QACrB,YAAY,EAAE,GAAG;QACjB,SAAS,EAAE,GAAG;KACf,CAAC,CAAC;AACL,CAAC;AAED,qFAAqF;AACrF,SAAgB,+BAA+B,CAAC,OAAgB;IAC9D,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzD,MAAM,CAAC,GAAG,OAAkC,CAAC;IAC7C,IAAI,OAAO,CAAC,CAAC,oBAAoB,KAAK,QAAQ,IAAI,CAAC,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpF,OAAO,CAAC,CAAC,oBAAoB,CAAC;IAChC,CAAC;IACD,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACnB,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAI,CAA6B,CAAC,oBAAoB,CAAC;QAChE,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC;IAC5D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAgB;IAC3C,MAAM,QAAQ,GAAgD,EAAE,CAAC;IACjE,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC7D,MAAM,CAAC,GAAG,OAAkC,CAAC;IAC7C,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAE,CAAC,CAAC,MAAkC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/F,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;SAC3E,IAAI,OAAO,CAAC,CAAC,eAAe,KAAK,QAAQ,IAAI,CAAC,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/E,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,eAAe,CAAC;IACrC,CAAC;IACD,IAAI,OAAO,CAAC,CAAC,cAAc,KAAK,QAAQ,IAAI,CAAC,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxE,QAAQ,CAAC,cAAc,GAAG,CAAC,CAAC,cAAc,CAAC;IAC7C,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,SAAgB,mBAAmB,CACjC,OAAgB,EAChB,OAAgC,EAAE;IAElC,IAAI,CAAC,2BAA2B,CAAC,OAAO,CAAC;QAAE,OAAO,eAAe,CAAC;IAClE,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,eAAe,CAAC;IAEzD,MAAM,KAAK,GAAG,+BAA+B,CAAC,OAAO,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC/B,MAAM,WAAW,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,WAAW,CAAC,KAAK,IAAI,IAAI,CAAC;IACtD,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,IAAI,WAAW,CAAC,cAAc,IAAI,IAAI,CAAC;IACjF,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC;IAE/C,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/C,OAAO,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC;IACD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,QAAQ,GAIV,EAAE,CAAC;IACP,IAAI,KAAK;QAAE,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC;IAClC,IAAI,cAAc;QAAE,QAAQ,CAAC,cAAc,GAAG,cAAc,CAAC;IAC7D,IAAI,YAAY;QAAE,QAAQ,CAAC,YAAY,GAAG,YAAY,CAAC;IACvD,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAEvD,IAAI,QAAQ,CAAC;IACb,IAAI,CAAC;QACH,QAAQ,GAAG,IAAA,gCAA0B,EAAC,KAAK,EAAE;YAC3C,QAAQ;YACR,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACvC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,WAAW,CAAC,kBAAkB,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,IAAI,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ;QACtE,CAAC,CAAC,QAAQ,CAAC,OAAkC;QAC7C,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,GAAG,GAAG,OAAO,IAAI,OAAO,OAAO,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9F,MAAM,GAAG,GAAG,OAAO,IAAI,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IAExF,IAAI,QAAQ,CAAC,KAAK,KAAK,IAAI;WACpB,CAAC,QAAQ,CAAC,MAAM,KAAK,cAAc,IAAI,QAAQ,CAAC,MAAM,KAAK,mCAAmC,CAAC,EAAE,CAAC;QACvG,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,KAAK,EAAE,mBAAmB;YAC1B,aAAa,EAAE,QAAQ,CAAC,MAAM;YAC9B,YAAY,EAAE,GAAG;YACjB,SAAS,EAAE,GAAG;SACf,CAAC,CAAC;IACL,CAAC;IACD,OAAO,WAAW,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAChD,CAAC;AAED,2DAA2D;AAC3D,SAAgB,qBAAqB,CAAC,CAAU;IAC9C,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC9C,MAAM,CAAC,GAAG,CAAiF,CAAC;IAC5F,OAAO,CAAC,CAAC,UAAU,KAAK,yCAAoB;WACvC,CAAC,CAAC,OAAO,IAAI,IAAI;WACjB,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ;WAC7B,CAAC,CAAC,qBAAqB,IAAI,IAAI;WAC/B,OAAO,CAAC,CAAC,qBAAqB,KAAK,QAAQ,CAAC;AACnD,CAAC;AAED,iFAAiF;AACjF,SAAgB,2BAA2B,CAAC,CAAU;IACpD,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC9C,MAAM,CAAC,GAAG,CAAyB,CAAC;IACpC,IAAI,CAAC,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAgC,CAAC;QAC3C,OAAO,OAAO,CAAC,CAAC,aAAa,KAAK,QAAQ,CAAC;IAC7C,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,CAAmD,CAAC;QAC9D,OAAO,CAAC,CAAC,MAAM,KAAK,qBAAqB,IAAI,OAAO,CAAC,CAAC,cAAc,KAAK,QAAQ,CAAC;IACpF,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,KAAK,0BAA0B,EAAE,CAAC;QAC5C,MAAM,CAAC,GAAG,CAAmD,CAAC;QAC9D,OAAO,CAAC,CAAC,MAAM,KAAK,qBAAqB,IAAI,OAAO,CAAC,CAAC,cAAc,KAAK,QAAQ,CAAC;IACpF,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,KAAK,eAAe,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,CAAmD,CAAC;QAC9D,OAAO,CAAC,CAAC,CAAC,MAAM,KAAK,eAAe;eAC/B,CAAC,CAAC,MAAM,KAAK,0BAA0B;eACvC,CAAC,CAAC,MAAM,KAAK,oBAAoB,CAAC;eAClC,OAAO,CAAC,CAAC,cAAc,KAAK,QAAQ,CAAC;IAC5C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,yBAAyB,CAAC,CAAsB;IACvD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,CAAwB,CAAC;AACxD,CAAC;AAED,SAAS,UAAU,CAAC,OAA2C;IAC7D,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACnC,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,MAAM,EAAE,WAAW;YACnB,SAAS,EAAE,IAAa;YACxB,aAAa,EAAE,OAAO,CAAC,aAAa;SACrC,CAAC,CAAC;IACL,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,KAAc;YACzB,MAAM,EAAE,qBAA8B;YACtC,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa;SAC5E,CAAC,CAAC;IACL,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,eAAe,EAAE,CAAC;QACvC,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,MAAM,EAAE,eAAe;YACvB,SAAS,EAAE,SAAkB;YAC7B,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc;SAC/E,CAAC,CAAC;IACL,CAAC;IACD,2BAA2B;IAC3B,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,MAAM,EAAE,0BAA0B;QAClC,SAAS,EAAE,IAAa;QACxB,MAAM,EAAE,qBAA8B;QACtC,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB;KACxF,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,SAAgB,mBAAmB,CACjC,KAA0B,EAC1B,OAA2C,EAC3C,OAAgC,EAAE;IAElC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,SAAS,CACjB,+FAA+F;cAC7F,kDAAkD,CACrD,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,2BAA2B,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,SAAS,CACjB,yFAAyF;cACvF,4EAA4E,CAC/E,CAAC;IACJ,CAAC;IAED,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC;IACzD,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAChC,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC;IACzC,MAAM,mBAAmB,GAAG,GAAG,CAAC,MAAM,KAAK,0BAA0B,CAAC;IACtE,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC;IACzC,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,KAAK,eAAe,CAAC;IACrD,MAAM,YAAY,GAAG,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACxD,IAAI,wBAAwB,GAAG,gBAAgB,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW,CAAC;IAC9E,IAAI,sCAAsC,GAAG,KAAK,CAAC;IACnD,sFAAsF;IACtF,qFAAqF;IACrF,IAAI,IAAI,CAAC,OAAO,KAAK,kBAAkB,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,uBAAuB,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;QACjE,wBAAwB,GAAG,wBAAwB;eAC9C,GAAG,CAAC,YAAY,KAAK,0BAA0B,CAAC;IACvD,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,KAAK,kBAAkB,EAAE,CAAC;QACxC,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,KAAK,mBAAmB,CAAC;QAC9D,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,KAAK,cAAc,CAAC;QAC1D,sCAAsC,GAAG,gBAAgB,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW,IAAI,WAAW,CAAC;QACvG,wBAAwB,GAAG,gBAAgB,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW,IAAI,UAAU,CAAC;IAC1F,CAAC;IAED,MAAM,WAAW,GAAmB;QAClC,gBAAgB,EAAE,4BAAoB;QACtC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC;YACxB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,SAAS,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;YACnE,SAAS,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;YACnE,qBAAqB,EAAE,yBAAyB,CAAC,KAAK,CAAC,qBAAqB,CAAC;YAC7E,gBAAgB;SACjB,CAAC;QACF,GAAG;QACH,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC;YACrB,wBAAwB;YACxB,SAAS;YACT,mBAAmB;YACnB,OAAO;YACP,aAAa;YACb,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,kBAAkB;gBACrC,CAAC,CAAC,EAAE,sCAAsC,EAAE;gBAC5C,CAAC,CAAC,EAAE,CAAC;SACR,CAAC;QACF,YAAY;QACZ,MAAM,EAAE,MAAM;KACf,CAAC;IAEF,OAAO,iBAAiB,CAAC,WAAW,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,iBAAiB,CAAC,CAAiB;IAC1C,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -32,6 +32,36 @@ export type VersionedContent = {
|
|
|
32
32
|
* (absent ≠ 0 ≠ null ≠ unknown).
|
|
33
33
|
*/
|
|
34
34
|
export type ConditionalWriteReport = true | false | 'not_reported';
|
|
35
|
+
/**
|
|
36
|
+
* HOW STRONG the atomicity guarantee was — claim language on the mutation side, worded the way the
|
|
37
|
+
* four claim levels are: each class says what it ASSERTS and what it DOES NOT.
|
|
38
|
+
*
|
|
39
|
+
* SAME_TRANSACTION
|
|
40
|
+
* ASSERTS: the check and the mutation committed inside ONE transaction of the same system, so no
|
|
41
|
+
* interleaving is possible — the provider, not us, enforces it.
|
|
42
|
+
* DOES NOT ASSERT: that the transaction was correct, that it was the right row, or anything about
|
|
43
|
+
* any resource outside that transaction.
|
|
44
|
+
*
|
|
45
|
+
* CONDITIONAL_EXTERNAL
|
|
46
|
+
* ASSERTS: a SINGLE conditional claim was made against a provider that supports CAS or
|
|
47
|
+
* idempotency (if-match, expected-version, expected-old-sha), and the result was read back.
|
|
48
|
+
* DOES NOT ASSERT: atomicity across the check and the mutation. Two systems were involved and the
|
|
49
|
+
* provider's own compare-and-set is what closed the window — a Redis SETNX followed by a separate
|
|
50
|
+
* HTTP call is NOT this class and is NOT a transaction, because the claim and the mutation are two
|
|
51
|
+
* claims against two systems.
|
|
52
|
+
*
|
|
53
|
+
* NON_ATOMIC
|
|
54
|
+
* ASSERTS: the mutation was applied.
|
|
55
|
+
* DOES NOT ASSERT: that anything guarded it. The provider lacked the capability, or no
|
|
56
|
+
* authorization-time token was available, so the write was unconditional. This is the honest
|
|
57
|
+
* class for "we wrote it and cannot say more", and it must never be reported as either of the
|
|
58
|
+
* two above.
|
|
59
|
+
*/
|
|
60
|
+
export type ConditionalWriteGuarantee = 'SAME_TRANSACTION' | 'CONDITIONAL_EXTERNAL' | 'NON_ATOMIC';
|
|
61
|
+
/**
|
|
62
|
+
* Why an outcome is INDETERMINATE. The claim is strictly "we do not know", never "it failed".
|
|
63
|
+
*/
|
|
64
|
+
export type IndeterminateReason = 'response_lost' | 'ambiguous_provider_reply' | 'observation_failed';
|
|
35
65
|
/**
|
|
36
66
|
* Per-call forensic basis for conditional write (on every GuardOutcome).
|
|
37
67
|
* Survives replay unchanged when recorded.
|
|
@@ -52,6 +82,12 @@ export type ConditionalWriteBasis = {
|
|
|
52
82
|
* Independent of artifacts[]: carrying both sides of a change does not make the commit atomic.
|
|
53
83
|
*/
|
|
54
84
|
mutating: boolean;
|
|
85
|
+
/**
|
|
86
|
+
* HOW STRONG the guarantee was, when the host reported one. Absent when conditional_write is
|
|
87
|
+
* not_reported — "we were not told" is not a guarantee class. `conditional_write: true` with
|
|
88
|
+
* guarantee NON_ATOMIC is a coherent and important combination: the host conditioned nothing.
|
|
89
|
+
*/
|
|
90
|
+
guarantee?: ConditionalWriteGuarantee;
|
|
55
91
|
};
|
|
56
92
|
/**
|
|
57
93
|
* Values the RUNNER collected / host reported before the pure guard path.
|
|
@@ -62,6 +98,8 @@ export type ConditionalWriteCallContext = {
|
|
|
62
98
|
conditioned_on_token?: VersionToken | null;
|
|
63
99
|
/** Optional versioned content for token carry (equality only). */
|
|
64
100
|
versioned_content?: VersionedContent | null;
|
|
101
|
+
/** Host-reported strength of the guarantee. Carried, never inferred. */
|
|
102
|
+
guarantee?: ConditionalWriteGuarantee;
|
|
65
103
|
};
|
|
66
104
|
/** Equality compare only — never semantic interpretation of the token. */
|
|
67
105
|
export declare function tokensEqual(a: VersionToken | null | undefined, b: VersionToken | null | undefined): boolean;
|
|
@@ -124,6 +162,23 @@ export type ExecuteIfUnchangedOutcome<T> = {
|
|
|
124
162
|
reason: 'stale_version_token';
|
|
125
163
|
expected_token: VersionToken;
|
|
126
164
|
current_token: VersionToken | null;
|
|
165
|
+
} | {
|
|
166
|
+
/**
|
|
167
|
+
* FIRST-CLASS UNKNOWN. The mutation may or may not have been applied — we sent it and could
|
|
168
|
+
* not observe the result. Distinct from 'refused' (we know it did not land) and from
|
|
169
|
+
* 'committed' (we know it did).
|
|
170
|
+
*
|
|
171
|
+
* The rule is strict and is the whole point of the class:
|
|
172
|
+
* - NEVER blindly retry. A retry of a write that already landed is a second mutation.
|
|
173
|
+
* - Reconciliation is REQUIRED: read the resource and establish which state holds.
|
|
174
|
+
* - Downstream MUST block until it is resolved. An indeterminate write is not a pass.
|
|
175
|
+
*/
|
|
176
|
+
status: 'indeterminate';
|
|
177
|
+
reason: IndeterminateReason;
|
|
178
|
+
expected_token: VersionToken;
|
|
179
|
+
/** What we managed to observe, if anything. null when observation itself failed. */
|
|
180
|
+
observed_token?: VersionToken | null;
|
|
181
|
+
detail?: string;
|
|
127
182
|
} | {
|
|
128
183
|
status: 'committed_stale_detected';
|
|
129
184
|
reason: 'stale_during_commit';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conditional-write.d.ts","sourceRoot":"","sources":["../../src/conditional-write.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,2EAA2E;AAC3E,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC;AAElC;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,YAAY,CAAC;CAC7B,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,sBAAsB,GAAG,IAAI,GAAG,KAAK,GAAG,cAAc,CAAC;AAEnE;;;GAGG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,iBAAiB,EAAE,sBAAsB,CAAC;IAC1C;;;OAGG;IACH,oBAAoB,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC3C,6DAA6D;IAC7D,yBAAyB,EAAE,OAAO,CAAC;IACnC,+FAA+F;IAC/F,WAAW,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,QAAQ,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"conditional-write.d.ts","sourceRoot":"","sources":["../../src/conditional-write.ts"],"names":[],"mappings":"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"}
|
|
@@ -70,6 +70,12 @@ function buildConditionalWriteBasis(input) {
|
|
|
70
70
|
write_style,
|
|
71
71
|
mutating,
|
|
72
72
|
};
|
|
73
|
+
// Guarantee carry: reported only, never inferred from the report being true.
|
|
74
|
+
if (ctx.guarantee === 'SAME_TRANSACTION'
|
|
75
|
+
|| ctx.guarantee === 'CONDITIONAL_EXTERNAL'
|
|
76
|
+
|| ctx.guarantee === 'NON_ATOMIC') {
|
|
77
|
+
basis.guarantee = ctx.guarantee;
|
|
78
|
+
}
|
|
73
79
|
// Token carry: prefer explicit conditioned_on_token, else versioned_content.version_token.
|
|
74
80
|
if (conditional_write === true) {
|
|
75
81
|
if (typeof ctx.conditioned_on_token === 'string') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conditional-write.js","sourceRoot":"","sources":["../../src/conditional-write.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,YAAY,CAAC;;;
|
|
1
|
+
{"version":3,"file":"conditional-write.js","sourceRoot":"","sources":["../../src/conditional-write.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,9 +13,21 @@
|
|
|
13
13
|
*
|
|
14
14
|
* The three deploy-specific binds are the whole point: T7 (a MERGE — or operation-less — receipt can
|
|
15
15
|
* never deploy), environment binding (a staging ALLOW never authorizes production), and artifact
|
|
16
|
-
* binding (an old artifact's ALLOW never deploys a newer one). Scope honesty
|
|
17
|
-
*
|
|
18
|
-
*
|
|
16
|
+
* binding (an old artifact's ALLOW never deploys a newer one). Scope honesty follows the merge gate's
|
|
17
|
+
* SHAPE (a conjunction, fail-closed on any gap) but NOT its conjuncts — see below.
|
|
18
|
+
*
|
|
19
|
+
* `inescapable_deploy` is true ONLY when every conjunct holds: ENFORCING ∧ ¬bypass_possible ∧
|
|
20
|
+
* fingerprint rebound. Missing any conjunct → FALSE (fail-closed); the check may still be `success`
|
|
21
|
+
* for visibility, with the residual named.
|
|
22
|
+
*
|
|
23
|
+
* WHAT THAT DOES NOT SAY, stated because the field name is stronger than the fact. The first two
|
|
24
|
+
* conjuncts are the HOST's observation of its own CD config (`DeployRequiredContext.enforcement`),
|
|
25
|
+
* consumed by this pure gate, not verified by it — so `inescapable_deploy: true` reports that the
|
|
26
|
+
* host said its pipeline enforces and cannot be bypassed, plus a fingerprint we did rebind. Note
|
|
27
|
+
* also that this gate carries NO issuer-binding conjunct at all, unlike `inescapable_merge`: where a
|
|
28
|
+
* provider check supplies the enforcing signal, binding it to an App id proves the check came from
|
|
29
|
+
* that provider's Actions app, NOT that CodeRifts produced it — anyone who can edit the workflow
|
|
30
|
+
* definition can post under the same issuer. Closing that needs workflow-SHA pinning.
|
|
19
31
|
*
|
|
20
32
|
* Public source (ships in the npm package): references only receipt/target/enforcement fields and
|
|
21
33
|
* generic deploy-gate concepts — no scoring logic, weights, thresholds, pattern names, endpoints, or
|