@coderifts/agent-guard 8.1.1 → 8.2.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/README.md +83 -4
- package/dist/cjs/commit-observation.d.ts +50 -0
- package/dist/cjs/commit-observation.d.ts.map +1 -0
- package/dist/cjs/commit-observation.js +188 -0
- package/dist/cjs/commit-observation.js.map +1 -0
- package/dist/cjs/conditional-write.d.ts +2 -0
- package/dist/cjs/conditional-write.d.ts.map +1 -1
- package/dist/cjs/conditional-write.js +15 -4
- package/dist/cjs/conditional-write.js.map +1 -1
- package/dist/cjs/enforcement-gate.d.ts.map +1 -1
- package/dist/cjs/enforcement-gate.js +2 -1
- package/dist/cjs/enforcement-gate.js.map +1 -1
- package/dist/cjs/execute-tool-call.d.ts.map +1 -1
- package/dist/cjs/execute-tool-call.js +16 -0
- package/dist/cjs/execute-tool-call.js.map +1 -1
- 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 +8 -0
- package/dist/cjs/execution-proof.js.map +1 -1
- package/dist/cjs/final-answer-proof.d.ts.map +1 -1
- package/dist/cjs/final-answer-proof.js +19 -0
- package/dist/cjs/final-answer-proof.js.map +1 -1
- package/dist/cjs/guard.d.ts.map +1 -1
- package/dist/cjs/guard.js +61 -28
- package/dist/cjs/guard.js.map +1 -1
- package/dist/cjs/index.d.ts +2 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +8 -4
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/read-decision.d.ts +3 -1
- package/dist/cjs/read-decision.d.ts.map +1 -1
- package/dist/cjs/read-decision.js +44 -23
- package/dist/cjs/read-decision.js.map +1 -1
- package/dist/cjs/types.d.ts +25 -2
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/cjs/with-coderifts.d.ts +9 -2
- package/dist/cjs/with-coderifts.d.ts.map +1 -1
- package/dist/cjs/with-coderifts.js +6 -0
- package/dist/cjs/with-coderifts.js.map +1 -1
- package/dist/esm/commit-observation.d.ts +50 -0
- package/dist/esm/commit-observation.d.ts.map +1 -0
- package/dist/esm/commit-observation.js +185 -0
- package/dist/esm/commit-observation.js.map +1 -0
- package/dist/esm/conditional-write.d.ts +2 -0
- package/dist/esm/conditional-write.d.ts.map +1 -1
- package/dist/esm/conditional-write.js +15 -4
- package/dist/esm/conditional-write.js.map +1 -1
- package/dist/esm/enforcement-gate.d.ts.map +1 -1
- package/dist/esm/enforcement-gate.js +2 -1
- package/dist/esm/enforcement-gate.js.map +1 -1
- package/dist/esm/execute-tool-call.d.ts.map +1 -1
- package/dist/esm/execute-tool-call.js +16 -0
- package/dist/esm/execute-tool-call.js.map +1 -1
- 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 +8 -0
- package/dist/esm/execution-proof.js.map +1 -1
- package/dist/esm/final-answer-proof.d.ts.map +1 -1
- package/dist/esm/final-answer-proof.js +19 -0
- package/dist/esm/final-answer-proof.js.map +1 -1
- package/dist/esm/guard.d.ts.map +1 -1
- package/dist/esm/guard.js +61 -28
- package/dist/esm/guard.js.map +1 -1
- package/dist/esm/index.d.ts +2 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +3 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/read-decision.d.ts +3 -1
- package/dist/esm/read-decision.d.ts.map +1 -1
- package/dist/esm/read-decision.js +44 -23
- package/dist/esm/read-decision.js.map +1 -1
- package/dist/esm/types.d.ts +25 -2
- package/dist/esm/types.d.ts.map +1 -1
- package/dist/esm/with-coderifts.d.ts +9 -2
- package/dist/esm/with-coderifts.d.ts.map +1 -1
- package/dist/esm/with-coderifts.js +6 -0
- package/dist/esm/with-coderifts.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Fail-closed guard for AI agent tool calls — preflight contract changes before they execute.
|
|
4
4
|
|
|
5
|
-
Security core **FROZEN** (agent-guard-api v1.0). Built on [`@coderifts/sdk`](https://www.npmjs.com/package/@coderifts/sdk) `^
|
|
5
|
+
Security core **FROZEN** (agent-guard-api v1.0). Built on [`@coderifts/sdk`](https://www.npmjs.com/package/@coderifts/sdk) `^3.0.0`.
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
8
|
npm install @coderifts/agent-guard @coderifts/sdk
|
|
@@ -123,6 +123,44 @@ Honesty: default enforce **refuses on observed execution-state drift**. It does
|
|
|
123
123
|
close TOCTOU proper — measurement-to-commit and host-side unconditional writes remain;
|
|
124
124
|
see Guarantees.
|
|
125
125
|
|
|
126
|
+
#### `requireCommitObservation` — T3 post-commit observation (guard@8.2 default ON)
|
|
127
|
+
|
|
128
|
+
T2 looks at the target immediately **before** the write. T3 looks at it **after**. Once the host
|
|
129
|
+
write returns, the guard re-reads the target and compares it to the authorized `after`:
|
|
130
|
+
|
|
131
|
+
- **filesystem adapters** — re-read the file through `node:fs`, sha256 it, compare to the
|
|
132
|
+
authorized `after` content.
|
|
133
|
+
- **API / DB / Registry adapters** — call the same `current_token()` reader that
|
|
134
|
+
`executeIfUnchanged` already requires, and compare it to the intended post-write token.
|
|
135
|
+
|
|
136
|
+
The result lands on every `GuardOutcome` arm and on `GuardExecutionProof` as
|
|
137
|
+
`commit_observation`, with one of four statuses:
|
|
138
|
+
|
|
139
|
+
| `status` | Meaning |
|
|
140
|
+
| --- | --- |
|
|
141
|
+
| `not_observed` | No reader was available, or observation was switched off. |
|
|
142
|
+
| `observed_match` | Content re-read after the write matched the authorized `after`. |
|
|
143
|
+
| `observed_drift` | What is there now is not what was authorized. |
|
|
144
|
+
| `observed_token_match` | Token-only adapter: the version token matched. Content was not compared. |
|
|
145
|
+
|
|
146
|
+
On content drift the guard re-runs preflight against the **observed** state and reports the
|
|
147
|
+
result under `commit_observation.blast`. `host_attestation` (`absent`,
|
|
148
|
+
`host_attested_committed`, `host_attested_refused`, `conflict`) is a **label the host supplies
|
|
149
|
+
on top of** the measurement — a host that says `committed` while the guard observed drift is
|
|
150
|
+
recorded as `conflict`, not as a pass.
|
|
151
|
+
|
|
152
|
+
**`enforced` is unchanged by T3.** `enforced` remains a pre-write fact: receipt-verified
|
|
153
|
+
`ALLOW`/`MONITOR` plus the T2 recheck. The drift event `commit_observed_drift` is
|
|
154
|
+
**report-only — it is not a permission gate.**
|
|
155
|
+
|
|
156
|
+
Default ON. Opt out with `requireCommitObservation: false`, which emits
|
|
157
|
+
`commit_observation_check_disabled`. Measured cost: **+0.087 ms/call** on filesystem adapters;
|
|
158
|
+
preflight re-runs only on drift.
|
|
159
|
+
|
|
160
|
+
Honesty (verbatim, and also on the machine proof as
|
|
161
|
+
`limits.commit_observation_is_observed_at_t3_not_atomic: true`):
|
|
162
|
+
`commit_observation is observed at T3, not atomic: another writer may act between write and observation; token-only adapters compare version token not content; host attestation is a host claim layered on the measurement`.
|
|
163
|
+
|
|
126
164
|
> **Supply `artifacts[]` with content.** If the guard detects a contract change (e.g. from
|
|
127
165
|
> `filesTouched`/`diff`) but you did **not** supply `artifacts[]` with `before`/`after`, it fails
|
|
128
166
|
> closed **locally** with `outcome.verdict.cause === 'MISSING_ARTIFACT_CONTENT'` — the tool does not
|
|
@@ -165,6 +203,12 @@ const { tools, registry_report, composition_assurance } = withCodeRifts({
|
|
|
165
203
|
// the guard — the composition can only protect the table it returns.
|
|
166
204
|
```
|
|
167
205
|
|
|
206
|
+
> **An absent `profile` is not `ENFORCING_STRICT`.** This entry-point call runs today's
|
|
207
|
+
> defaults: freshness, conditional-write and complete-coverage stay **opt-in**. Nothing here
|
|
208
|
+
> locks the fail-closed conjunction — see
|
|
209
|
+
> [Production enforcement](#production-enforcement-enforcing_strict--freshness--cas) for
|
|
210
|
+
> `profile: 'ENFORCING_STRICT'`, which locks those flags and aborts on a conflicting opt-down.
|
|
211
|
+
|
|
168
212
|
Optional guard-policy fields on the same input are forwarded **unchanged** onto `GuardConfig` when
|
|
169
213
|
present (absent = today’s defaults — no behavior change): `onEvent`, `monitoringSinkWired`,
|
|
170
214
|
`resolvePriorContent`, `requireFreshness`, `allowStaleContext`, `requireConditionalWrite`, and
|
|
@@ -174,12 +218,47 @@ opt-down. Not TOCTOU closure (see **`requireExecutionStateMatch`** above).
|
|
|
174
218
|
|
|
175
219
|
**`profile?: 'ENFORCING_STRICT'`** (guard@8.1, opt-in). Locks the fail-closed conjunction
|
|
176
220
|
(`requireCoverage: 'COMPLETE'`, `requireFreshness: true`, `requireExecutionStateMatch: true`,
|
|
177
|
-
`requireConditionalWrite: true`, `
|
|
221
|
+
`requireConditionalWrite: true`, `requireCommitObservation: true`, `failOnUnguardedMutator: true`,
|
|
222
|
+
`unknownToolPolicy: 'mutating'`).
|
|
178
223
|
A conflicting opt-down **aborts construction** (`ENFORCING_STRICT cannot be weakened: <flag> conflicts`).
|
|
179
224
|
Requires `resolvePriorContent` at construction. Does **not** claim host cannot register raw tools
|
|
180
225
|
outside the returned table — residual `calls_outside_guarded_path_invisible`. Adapters
|
|
181
226
|
(`withCodeRiftsOpenAI` / Anthropic / Gemini / LangGraph) still emit only the guarded list.
|
|
182
227
|
|
|
228
|
+
### Production enforcement (`ENFORCING_STRICT` + freshness / CAS)
|
|
229
|
+
|
|
230
|
+
The `withCodeRifts` example above is the **entry point** (absent profile: freshness and
|
|
231
|
+
conditional-write stay opt-in). For production, lock the fail-closed conjunction with
|
|
232
|
+
`profile: 'ENFORCING_STRICT'` (shipped guard@8.1.0; current package 8.2.0). Construction
|
|
233
|
+
**aborts** if you opt down any locked flag or omit `resolvePriorContent`.
|
|
234
|
+
|
|
235
|
+
```typescript
|
|
236
|
+
import { withCodeRifts } from '@coderifts/agent-guard';
|
|
237
|
+
|
|
238
|
+
const { tools, registry_report, composition_assurance, receipt_thread } = withCodeRifts({
|
|
239
|
+
tools: rawTools,
|
|
240
|
+
client,
|
|
241
|
+
operation: 'merge',
|
|
242
|
+
profile: 'ENFORCING_STRICT',
|
|
243
|
+
// Required under STRICT (abort at construction if missing). Host measures prior
|
|
244
|
+
// bytes for write-style freshness. The composition core does not read the filesystem;
|
|
245
|
+
// the FS token resolver and the T3 commit-observation adapters do (node:fs).
|
|
246
|
+
resolvePriorContent: ({ artifactId }) => readPrior(artifactId),
|
|
247
|
+
});
|
|
248
|
+
// register ONLY `tools`. Receipt carry-forward is default-on (`receipt_thread`).
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
Honesty (do not over-claim):
|
|
252
|
+
|
|
253
|
+
- **Freshness** is ACTIVE only because STRICT sets `requireFreshness` **and** you supplied
|
|
254
|
+
`resolvePriorContent`. A resolver that returns stale or empty bytes is still your measurement.
|
|
255
|
+
- **CAS / conditional write** is a **host assertion** (`conditional_write: true` on the write).
|
|
256
|
+
This package never writes and cannot verify the swap. `requireConditionalWrite` refuses
|
|
257
|
+
`enforced: true` when the host does not report it. No atomic CAS at commit; T3 observes the
|
|
258
|
+
result after the write (not atomic).
|
|
259
|
+
- Host-invoked raw tools outside the returned table remain invisible
|
|
260
|
+
(`calls_outside_guarded_path_invisible`). `composition_assurance.inescapable_runtime` stays false.
|
|
261
|
+
|
|
183
262
|
### Final-answer proof block (ID645)
|
|
184
263
|
|
|
185
264
|
When a call produces a machine `GuardExecutionProof` (`outcome.proof`), you can embed a
|
|
@@ -773,8 +852,8 @@ Pass both on `withCodeRifts({ …, onEvent, monitoringSinkWired: true })`, or on
|
|
|
773
852
|
token) — this package never writes, and reports `conditional_write` as a host assertion it
|
|
774
853
|
cannot verify. **`requireExecutionStateMatch`** (default `true`) refuses on observed
|
|
775
854
|
execution-state drift (`EXECUTION_STATE_DRIFT`) or unmeasurable T2
|
|
776
|
-
(`EXECUTION_STATE_UNMEASURABLE`). Opt-down: `'warn'` / `false`.
|
|
777
|
-
|
|
855
|
+
(`EXECUTION_STATE_UNMEASURABLE`). Opt-down: `'warn'` / `false`. No atomic CAS at commit;
|
|
856
|
+
T3 observes the result after the write (not atomic). See the subsection above.
|
|
778
857
|
- **Retry-safe** — `executionAttempted` is the only safe-to-retry signal; a post-authorization throw
|
|
779
858
|
is `executionAttempted:true` (the remote side effect may have landed).
|
|
780
859
|
- **`enforced:true` only on a LIVE, receipt-verified `ALLOW`/`MONITOR`** — never on cached/LKG,
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export declare function hashObservedContent(v: unknown): string;
|
|
2
|
+
export type CommitObservationStatus = 'not_observed' | 'observed_match' | 'observed_drift' | 'observed_token_match';
|
|
3
|
+
export type CommitHostAttestation = 'absent' | 'host_attested_committed' | 'host_attested_refused' | 'conflict';
|
|
4
|
+
export type CommitObservationBlast = {
|
|
5
|
+
compared: 'content' | 'token';
|
|
6
|
+
decision?: string;
|
|
7
|
+
execution_action?: string;
|
|
8
|
+
decision_id?: string | null;
|
|
9
|
+
unavailable?: boolean;
|
|
10
|
+
cause?: string;
|
|
11
|
+
};
|
|
12
|
+
export type CommitObservation = {
|
|
13
|
+
status: CommitObservationStatus;
|
|
14
|
+
observed_fp?: string;
|
|
15
|
+
expected_fp?: string;
|
|
16
|
+
token?: string;
|
|
17
|
+
observed_at: string;
|
|
18
|
+
host_attestation?: CommitHostAttestation;
|
|
19
|
+
blast?: CommitObservationBlast;
|
|
20
|
+
};
|
|
21
|
+
export type ObserveCommitCall = {
|
|
22
|
+
arguments?: unknown;
|
|
23
|
+
artifacts?: ReadonlyArray<{
|
|
24
|
+
id?: string;
|
|
25
|
+
after?: unknown;
|
|
26
|
+
}>;
|
|
27
|
+
filesTouched?: string[];
|
|
28
|
+
};
|
|
29
|
+
export type ObserveCommitPreflight = (artifacts: Array<{
|
|
30
|
+
id?: string;
|
|
31
|
+
type?: string;
|
|
32
|
+
before?: unknown;
|
|
33
|
+
after?: unknown;
|
|
34
|
+
}>) => Promise<{
|
|
35
|
+
ok: true;
|
|
36
|
+
response: unknown;
|
|
37
|
+
} | {
|
|
38
|
+
ok: false;
|
|
39
|
+
cause: string;
|
|
40
|
+
}>;
|
|
41
|
+
export type ObserveCommitInput = {
|
|
42
|
+
enabled: boolean;
|
|
43
|
+
call: ObserveCommitCall;
|
|
44
|
+
result?: unknown;
|
|
45
|
+
now: string;
|
|
46
|
+
preflightOnObserved?: ObserveCommitPreflight;
|
|
47
|
+
};
|
|
48
|
+
/** T3 measurement. Never throws. Does not write. Does not flip enforced. */
|
|
49
|
+
export declare function observeCommit(input: ObserveCommitInput): Promise<CommitObservation>;
|
|
50
|
+
//# sourceMappingURL=commit-observation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit-observation.d.ts","sourceRoot":"","sources":["../../src/commit-observation.ts"],"names":[],"mappings":"AAqBA,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAEtD;AAED,MAAM,MAAM,uBAAuB,GAC/B,cAAc,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,sBAAsB,CAAC;AAClF,MAAM,MAAM,qBAAqB,GAC7B,QAAQ,GAAG,yBAAyB,GAAG,uBAAuB,GAAG,UAAU,CAAC;AAChF,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1E,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACvC,CAAC;AACF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,uBAAuB,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,qBAAqB,CAAC;IACzC,KAAK,CAAC,EAAE,sBAAsB,CAAC;CAChC,CAAC;AACF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,aAAa,CAAC;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC5D,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB,CAAC;AACF,MAAM,MAAM,sBAAsB,GAAG,CACnC,SAAS,EAAE,KAAK,CAAC;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,KAChF,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAC7E,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,iBAAiB,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IACzE,mBAAmB,CAAC,EAAE,sBAAsB,CAAC;CAC9C,CAAC;AAkEF,4EAA4E;AAC5E,wBAAsB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CASzF"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* T3 post-commit observation (ID781). Re-read after the host write; compare to
|
|
3
|
+
* authorized `after` (content) or intended post token (token-only adapters).
|
|
4
|
+
* OBSERVED — never verified/atomic. Does not change `enforced`. Host attestation
|
|
5
|
+
* is a label on the measurement, never a substitute.
|
|
6
|
+
*/
|
|
7
|
+
'use strict';
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.hashObservedContent = hashObservedContent;
|
|
10
|
+
exports.observeCommit = observeCommit;
|
|
11
|
+
const node_crypto_1 = require("node:crypto");
|
|
12
|
+
const node_fs_1 = require("node:fs");
|
|
13
|
+
const fs_js_1 = require("./cas-adapters/fs.js");
|
|
14
|
+
const api_js_1 = require("./cas-adapters/api.js");
|
|
15
|
+
const db_js_1 = require("./cas-adapters/db.js");
|
|
16
|
+
const registry_js_1 = require("./cas-adapters/registry.js");
|
|
17
|
+
const conditional_write_js_1 = require("./conditional-write.js");
|
|
18
|
+
/** Same specStr as execution-time-fingerprint.ts:25 (crbundle.v1 after-slot). */
|
|
19
|
+
function specStr(v) {
|
|
20
|
+
if (v == null)
|
|
21
|
+
return '';
|
|
22
|
+
return typeof v === 'string' ? v : JSON.stringify(v);
|
|
23
|
+
}
|
|
24
|
+
function hashObservedContent(v) {
|
|
25
|
+
return 'sha256:' + (0, node_crypto_1.createHash)('sha256').update(specStr(v), 'utf8').digest('hex');
|
|
26
|
+
}
|
|
27
|
+
function unobserved(now, host = 'absent') {
|
|
28
|
+
return { status: 'not_observed', observed_at: now, host_attestation: host };
|
|
29
|
+
}
|
|
30
|
+
function casStatus(result) {
|
|
31
|
+
const s = result && typeof result === 'object' ? result.status : null;
|
|
32
|
+
return s === 'committed' || s === 'refused' || s === 'committed_stale_detected' ? s : null;
|
|
33
|
+
}
|
|
34
|
+
function hostLabel(cas, drifted) {
|
|
35
|
+
if (cas == null)
|
|
36
|
+
return 'absent';
|
|
37
|
+
if (cas === 'refused')
|
|
38
|
+
return 'host_attested_refused';
|
|
39
|
+
if (cas === 'committed' && drifted)
|
|
40
|
+
return 'conflict';
|
|
41
|
+
if (cas === 'committed_stale_detected')
|
|
42
|
+
return drifted ? 'conflict' : 'host_attested_committed';
|
|
43
|
+
return 'host_attested_committed';
|
|
44
|
+
}
|
|
45
|
+
function casInner(result) {
|
|
46
|
+
if (!result || typeof result !== 'object')
|
|
47
|
+
return null;
|
|
48
|
+
const o = result;
|
|
49
|
+
if (o.status === 'committed' || o.status === 'committed_stale_detected') {
|
|
50
|
+
return o.result && typeof o.result === 'object' ? o.result : null;
|
|
51
|
+
}
|
|
52
|
+
return o;
|
|
53
|
+
}
|
|
54
|
+
function inferPath(call, result) {
|
|
55
|
+
const args = call.arguments && typeof call.arguments === 'object'
|
|
56
|
+
? call.arguments : {};
|
|
57
|
+
if (typeof args.path === 'string' && args.path)
|
|
58
|
+
return args.path;
|
|
59
|
+
if (Array.isArray(call.filesTouched) && typeof call.filesTouched[0] === 'string' && call.filesTouched[0]) {
|
|
60
|
+
return call.filesTouched[0];
|
|
61
|
+
}
|
|
62
|
+
const inner = casInner(result);
|
|
63
|
+
return inner && typeof inner.path === 'string' && inner.path ? inner.path : null;
|
|
64
|
+
}
|
|
65
|
+
function casObservedToken(result) {
|
|
66
|
+
if (!result || typeof result !== 'object')
|
|
67
|
+
return null;
|
|
68
|
+
const o = result;
|
|
69
|
+
if (typeof o.observed_token === 'string' && o.observed_token)
|
|
70
|
+
return o.observed_token;
|
|
71
|
+
if (typeof o.post_commit_token === 'string' && o.post_commit_token)
|
|
72
|
+
return o.post_commit_token;
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
function intendedPostToken(result) {
|
|
76
|
+
const inner = casInner(result);
|
|
77
|
+
if (!inner)
|
|
78
|
+
return null;
|
|
79
|
+
if (typeof inner.new_etag === 'string' && inner.new_etag.trim())
|
|
80
|
+
return (0, api_js_1.createApiVersionToken)(inner.new_etag);
|
|
81
|
+
if (inner.new_version != null && String(inner.new_version).trim()) {
|
|
82
|
+
return (0, db_js_1.createDbVersionToken)(inner.new_version);
|
|
83
|
+
}
|
|
84
|
+
if (inner.new_token != null && String(inner.new_token).trim()) {
|
|
85
|
+
return (0, registry_js_1.createRegistryVersionToken)(inner.new_token);
|
|
86
|
+
}
|
|
87
|
+
if (typeof inner.written_content_hash === 'string' && /^[a-f0-9]{64}$/.test(inner.written_content_hash)) {
|
|
88
|
+
return inner.written_content_hash;
|
|
89
|
+
}
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
function authorizedAfter(artifacts) {
|
|
93
|
+
if (!Array.isArray(artifacts))
|
|
94
|
+
return undefined;
|
|
95
|
+
for (const a of artifacts) {
|
|
96
|
+
if (a && a.after !== undefined && a.after !== null)
|
|
97
|
+
return a.after;
|
|
98
|
+
}
|
|
99
|
+
return undefined;
|
|
100
|
+
}
|
|
101
|
+
/** T3 measurement. Never throws. Does not write. Does not flip enforced. */
|
|
102
|
+
async function observeCommit(input) {
|
|
103
|
+
const cas = casStatus(input.result);
|
|
104
|
+
const host0 = hostLabel(cas, false);
|
|
105
|
+
if (input.enabled !== true)
|
|
106
|
+
return unobserved(input.now, 'absent');
|
|
107
|
+
try {
|
|
108
|
+
return await observeInner(input, cas, host0);
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return unobserved(input.now, host0);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
async function observeInner(input, cas, host0) {
|
|
115
|
+
const now = input.now;
|
|
116
|
+
const expectedAfter = authorizedAfter(input.call.artifacts);
|
|
117
|
+
const filePath = inferPath(input.call, input.result);
|
|
118
|
+
let observedContent = null;
|
|
119
|
+
let token;
|
|
120
|
+
if (filePath && expectedAfter !== undefined) {
|
|
121
|
+
const fsTok = await (0, fs_js_1.createFsVersionToken)(filePath);
|
|
122
|
+
token = fsTok;
|
|
123
|
+
observedContent = fsTok === fs_js_1.FS_ABSENT_TOKEN ? '' : await node_fs_1.promises.readFile(filePath, 'utf8');
|
|
124
|
+
}
|
|
125
|
+
if (observedContent !== null && expectedAfter !== undefined) {
|
|
126
|
+
const observed_fp = hashObservedContent(observedContent);
|
|
127
|
+
const expected_fp = hashObservedContent(expectedAfter);
|
|
128
|
+
const match = observed_fp === expected_fp;
|
|
129
|
+
const obs = {
|
|
130
|
+
status: match ? 'observed_match' : 'observed_drift',
|
|
131
|
+
observed_fp, expected_fp, token, observed_at: now,
|
|
132
|
+
host_attestation: hostLabel(cas, !match),
|
|
133
|
+
};
|
|
134
|
+
if (!match)
|
|
135
|
+
obs.blast = await contentBlast(input, observedContent);
|
|
136
|
+
return obs;
|
|
137
|
+
}
|
|
138
|
+
const observedTok = casObservedToken(input.result);
|
|
139
|
+
const intended = intendedPostToken(input.result);
|
|
140
|
+
if (observedTok && intended) {
|
|
141
|
+
const tokenMatch = intended.length === 64 && !intended.includes(':')
|
|
142
|
+
? (0, fs_js_1.fsTokenContentHash)(observedTok) === intended
|
|
143
|
+
: (0, conditional_write_js_1.tokensEqual)(observedTok, intended);
|
|
144
|
+
const obs = {
|
|
145
|
+
status: tokenMatch ? 'observed_token_match' : 'observed_drift',
|
|
146
|
+
token: observedTok, observed_at: now, host_attestation: hostLabel(cas, !tokenMatch),
|
|
147
|
+
};
|
|
148
|
+
if (!tokenMatch) {
|
|
149
|
+
obs.observed_fp = observedTok;
|
|
150
|
+
obs.expected_fp = intended;
|
|
151
|
+
obs.blast = { compared: 'token' };
|
|
152
|
+
}
|
|
153
|
+
return obs;
|
|
154
|
+
}
|
|
155
|
+
if (observedTok)
|
|
156
|
+
return { status: 'not_observed', token: observedTok, observed_at: now, host_attestation: host0 };
|
|
157
|
+
return unobserved(now, host0);
|
|
158
|
+
}
|
|
159
|
+
async function contentBlast(input, observedContent) {
|
|
160
|
+
const pf = input.preflightOnObserved;
|
|
161
|
+
if (typeof pf !== 'function')
|
|
162
|
+
return { compared: 'content' };
|
|
163
|
+
const arts = Array.isArray(input.call.artifacts)
|
|
164
|
+
? input.call.artifacts.map((a) => ({ ...a, after: observedContent }))
|
|
165
|
+
: [{ after: observedContent }];
|
|
166
|
+
try {
|
|
167
|
+
const r = await pf(arts);
|
|
168
|
+
if (!r.ok)
|
|
169
|
+
return { compared: 'content', unavailable: true, cause: r.cause };
|
|
170
|
+
const raw = r.response;
|
|
171
|
+
const env = raw && typeof raw === 'object' && raw.decision_result
|
|
172
|
+
&& typeof raw.decision_result === 'object'
|
|
173
|
+
? raw.decision_result
|
|
174
|
+
: (raw && typeof raw === 'object' ? raw : null);
|
|
175
|
+
if (!env)
|
|
176
|
+
return { compared: 'content', unavailable: true };
|
|
177
|
+
return {
|
|
178
|
+
compared: 'content',
|
|
179
|
+
decision: typeof env.decision === 'string' ? env.decision : undefined,
|
|
180
|
+
execution_action: typeof env.execution_action === 'string' ? env.execution_action : undefined,
|
|
181
|
+
decision_id: typeof env.decision_id === 'string' ? env.decision_id : null,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
catch (err) {
|
|
185
|
+
return { compared: 'content', unavailable: true, cause: err instanceof Error ? err.message : 'preflight_threw' };
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=commit-observation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit-observation.js","sourceRoot":"","sources":["../../src/commit-observation.ts"],"names":[],"mappings":"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"}
|
|
@@ -101,6 +101,7 @@ export type ExecuteIfUnchangedOutcome<T> = {
|
|
|
101
101
|
status: 'committed';
|
|
102
102
|
result: T;
|
|
103
103
|
version_token: VersionToken;
|
|
104
|
+
observed_token?: VersionToken | null;
|
|
104
105
|
} | {
|
|
105
106
|
status: 'refused';
|
|
106
107
|
reason: 'stale_version_token';
|
|
@@ -112,6 +113,7 @@ export type ExecuteIfUnchangedOutcome<T> = {
|
|
|
112
113
|
result: T;
|
|
113
114
|
expected_token: VersionToken;
|
|
114
115
|
post_commit_token: VersionToken | null;
|
|
116
|
+
observed_token?: VersionToken | null;
|
|
115
117
|
};
|
|
116
118
|
/**
|
|
117
119
|
* Thrown from write() when the adapter aborts BEFORE applying the mutation
|
|
@@ -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,oDAAoD;IACpD,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,2BAA2B,GAAG;IACxC,iBAAiB,CAAC,EAAE,sBAAsB,CAAC;IAC3C,oBAAoB,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC3C,kEAAkE;IAClE,iBAAiB,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC7C,CAAC;AAEF,0EAA0E;AAC1E,wBAAgB,WAAW,CACzB,CAAC,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,EAClC,CAAC,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,GACjC,OAAO,CAIT;AASD;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IAChD,UAAU,EAAE,OAAO,CAAC;IACpB,uBAAuB,EAAE,OAAO,CAAC;IACjC,GAAG,CAAC,EAAE,2BAA2B,GAAG,IAAI,CAAC;CAC1C,GAAG;IACF,KAAK,EAAE,qBAAqB,CAAC;IAC7B,mDAAmD;IACnD,UAAU,CAAC,EAAE,4BAA4B,CAAC;CAC3C,CAgCA;AAED,yFAAyF;AACzF,eAAO,MAAM,4BAA4B,iDAAiD,CAAC;AAE3F;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE;IAC9C,uBAAuB,EAAE,OAAO,CAAC;IACjC,UAAU,EAAE,OAAO,CAAC;IACpB,gBAAgB,EAAE,sBAAsB,CAAC;CAC1C,GAAG,MAAM,GAAG,IAAI,CAKhB;AAMD;;;;;;;GAOG;AACH,MAAM,MAAM,yBAAyB,CAAC,CAAC,IACnC;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,CAAC,CAAC;IAAC,aAAa,EAAE,YAAY,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"conditional-write.d.ts","sourceRoot":"","sources":["../../src/conditional-write.ts"],"names":[],"mappings":"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"}
|
|
@@ -148,20 +148,31 @@ async function executeIfUnchanged(args) {
|
|
|
148
148
|
}
|
|
149
149
|
throw err;
|
|
150
150
|
}
|
|
151
|
+
// T3: always re-read current_token after write (same host reader executeIfUnchanged already required).
|
|
152
|
+
// Detection (opt-in) reuses this read — not a second I/O. Observation failure must not fail the write.
|
|
153
|
+
let observed_token = null;
|
|
154
|
+
try {
|
|
155
|
+
observed_token = await args.current_token();
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
if (args.detect_stale_during_commit === true)
|
|
159
|
+
throw err;
|
|
160
|
+
observed_token = null;
|
|
161
|
+
}
|
|
151
162
|
// Post-commit detection (best-effort honesty, not prevention).
|
|
152
163
|
if (args.detect_stale_during_commit === true && typeof args.expected_after_commit === 'function') {
|
|
153
164
|
const want = await args.expected_after_commit(result);
|
|
154
|
-
|
|
155
|
-
if (!tokensEqual(want, post)) {
|
|
165
|
+
if (!tokensEqual(want, observed_token)) {
|
|
156
166
|
return {
|
|
157
167
|
status: 'committed_stale_detected',
|
|
158
168
|
reason: 'stale_during_commit',
|
|
159
169
|
result,
|
|
160
170
|
expected_token: expected,
|
|
161
|
-
post_commit_token:
|
|
171
|
+
post_commit_token: observed_token,
|
|
172
|
+
observed_token,
|
|
162
173
|
};
|
|
163
174
|
}
|
|
164
175
|
}
|
|
165
|
-
return { status: 'committed', result, version_token: expected };
|
|
176
|
+
return { status: 'committed', result, version_token: expected, observed_token };
|
|
166
177
|
}
|
|
167
178
|
//# sourceMappingURL=conditional-write.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conditional-write.js","sourceRoot":"","sources":["../../src/conditional-write.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,YAAY,CAAC;;;AAkDb,kCAOC;AAkBD,gEAwCC;AASD,4DASC;
|
|
1
|
+
{"version":3,"file":"conditional-write.js","sourceRoot":"","sources":["../../src/conditional-write.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enforcement-gate.d.ts","sourceRoot":"","sources":["../../src/enforcement-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG3D,KAAK,MAAM,GAAG,UAAU,GAAG,0BAA0B,GAAG,kBAAkB,GAAG,MAAM,CAAC;AAoBpF,wGAAwG;AACxG,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,CAMnE;AAED,6FAA6F;AAC7F,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,CAKtE;AAED,MAAM,MAAM,UAAU,GAClB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,OAAO,GAAG,SAAS,CAAA;CAAE,GAC/C;IAAE,OAAO,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,OAAO,GAAG,kBAAkB,CAAA;CAAE,GACnE;IAAE,OAAO,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,cAAc,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvE;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,eAAe,EAAE,MAAM,GAAG,MAAM,EAChC,aAAa,EAAE,QAAQ,EAAE,GACxB,UAAU,
|
|
1
|
+
{"version":3,"file":"enforcement-gate.d.ts","sourceRoot":"","sources":["../../src/enforcement-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG3D,KAAK,MAAM,GAAG,UAAU,GAAG,0BAA0B,GAAG,kBAAkB,GAAG,MAAM,CAAC;AAoBpF,wGAAwG;AACxG,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,CAMnE;AAED,6FAA6F;AAC7F,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,CAKtE;AAED,MAAM,MAAM,UAAU,GAClB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,OAAO,GAAG,SAAS,CAAA;CAAE,GAC/C;IAAE,OAAO,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,OAAO,GAAG,kBAAkB,CAAA;CAAE,GACnE;IAAE,OAAO,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,cAAc,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvE;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,eAAe,EAAE,MAAM,GAAG,MAAM,EAChC,aAAa,EAAE,QAAQ,EAAE,GACxB,UAAU,CAqEZ"}
|
|
@@ -69,7 +69,8 @@ function computeBundleFingerprint(artifacts) {
|
|
|
69
69
|
function evaluateEnvelope(response, envelope, executionAction, sentArtifacts) {
|
|
70
70
|
const top = (response && typeof response === 'object') ? response : {};
|
|
71
71
|
// 0. PRESENT-but-unrecognised action — before any decision map or reconciliation.
|
|
72
|
-
// Missing action is not handled here (readDecision maps legacy missing → closed Action
|
|
72
|
+
// Missing action is not handled here (readDecision maps legacy 1.0 missing → closed Action;
|
|
73
|
+
// v2 / unspecified missing EA is UNREADABLE_DECISION in readDecision, before this gate).
|
|
73
74
|
const candidates = [executionAction, envelope.execution_action, top.execution_action];
|
|
74
75
|
for (const cand of candidates) {
|
|
75
76
|
if (cand === undefined || cand === null || cand === '')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enforcement-gate.js","sourceRoot":"","sources":["../../src/enforcement-gate.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;AA2BH,sDAMC;AAGD,4DAKC;AAuBD,
|
|
1
|
+
{"version":3,"file":"enforcement-gate.js","sourceRoot":"","sources":["../../src/enforcement-gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute-tool-call.d.ts","sourceRoot":"","sources":["../../src/execute-tool-call.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAgB,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACrF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAEL,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EACjC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,KAAK,6BAA6B,EAClC,KAAK,6BAA6B,EACnC,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAEL,KAAK,0BAA0B,EAC/B,KAAK,gCAAgC,EACtC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,KAAK,6BAA6B,EAClC,KAAK,8BAA8B,EACpC,MAAM,yBAAyB,CAAC;AAIjC;;;GAGG;AACH,MAAM,MAAM,uBAAuB,GAC/B,SAAS,aAAa,EAAE,GACxB;IAAE,KAAK,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IAAC,eAAe,CAAC,EAAE,SAAS,aAAa,EAAE,CAAA;CAAE,CAAC;AA+BrF,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,YAAY,CAAC,OAAO,CAAC,CAWrE;
|
|
1
|
+
{"version":3,"file":"execute-tool-call.d.ts","sourceRoot":"","sources":["../../src/execute-tool-call.ts"],"names":[],"mappings":"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"}
|
|
@@ -79,6 +79,13 @@ const CW_NOT_REPORTED = Object.freeze({
|
|
|
79
79
|
require_conditional_write: false,
|
|
80
80
|
write_style: false,
|
|
81
81
|
});
|
|
82
|
+
function notObserved() {
|
|
83
|
+
return {
|
|
84
|
+
status: 'not_observed',
|
|
85
|
+
observed_at: new Date().toISOString(),
|
|
86
|
+
host_attestation: 'absent',
|
|
87
|
+
};
|
|
88
|
+
}
|
|
82
89
|
/**
|
|
83
90
|
* Unknown tool name — typed refusal via binder no-result path.
|
|
84
91
|
* Uses CONFIG_ERROR integrity UNAVAILABLE (not a fabricated ALLOW).
|
|
@@ -94,12 +101,14 @@ function unknownToolOutcome(toolName) {
|
|
|
94
101
|
decisionMissing: true,
|
|
95
102
|
unavailableCount: 1,
|
|
96
103
|
};
|
|
104
|
+
const commit_observation = notObserved();
|
|
97
105
|
const proof = (0, execution_proof_js_1.buildExecutionProof)({
|
|
98
106
|
preflighted: false,
|
|
99
107
|
executionAttempted: false,
|
|
100
108
|
executed: false,
|
|
101
109
|
enforced: false,
|
|
102
110
|
verdict,
|
|
111
|
+
commitObservation: commit_observation,
|
|
103
112
|
});
|
|
104
113
|
// Annotate verdict for body text; proof already has verdict_kind.
|
|
105
114
|
void toolName;
|
|
@@ -112,6 +121,7 @@ function unknownToolOutcome(toolName) {
|
|
|
112
121
|
proof,
|
|
113
122
|
freshness: FRESHNESS_NOT_CONFIGURED,
|
|
114
123
|
conditional_write: CW_NOT_REPORTED,
|
|
124
|
+
commit_observation,
|
|
115
125
|
};
|
|
116
126
|
}
|
|
117
127
|
/**
|
|
@@ -125,6 +135,7 @@ function wrapRawAsOutcome(result) {
|
|
|
125
135
|
signals: ['dispatcher_passthrough'],
|
|
126
136
|
detectorVersion: 'execute-tool-call',
|
|
127
137
|
};
|
|
138
|
+
const commit_observation = notObserved();
|
|
128
139
|
const proof = (0, execution_proof_js_1.buildExecutionProof)({
|
|
129
140
|
preflighted: false,
|
|
130
141
|
executionAttempted: true,
|
|
@@ -132,6 +143,7 @@ function wrapRawAsOutcome(result) {
|
|
|
132
143
|
enforced: false,
|
|
133
144
|
verdict,
|
|
134
145
|
result,
|
|
146
|
+
commitObservation: commit_observation,
|
|
135
147
|
});
|
|
136
148
|
return {
|
|
137
149
|
executionAttempted: true,
|
|
@@ -143,6 +155,7 @@ function wrapRawAsOutcome(result) {
|
|
|
143
155
|
proof,
|
|
144
156
|
freshness: FRESHNESS_NOT_CONFIGURED,
|
|
145
157
|
conditional_write: CW_NOT_REPORTED,
|
|
158
|
+
commit_observation,
|
|
146
159
|
};
|
|
147
160
|
}
|
|
148
161
|
function wrapThrownAsOutcome(error) {
|
|
@@ -152,6 +165,7 @@ function wrapThrownAsOutcome(error) {
|
|
|
152
165
|
signals: ['dispatcher_passthrough_throw'],
|
|
153
166
|
detectorVersion: 'execute-tool-call',
|
|
154
167
|
};
|
|
168
|
+
const commit_observation = notObserved();
|
|
155
169
|
const proof = (0, execution_proof_js_1.buildExecutionProof)({
|
|
156
170
|
preflighted: false,
|
|
157
171
|
executionAttempted: true,
|
|
@@ -159,6 +173,7 @@ function wrapThrownAsOutcome(error) {
|
|
|
159
173
|
enforced: false,
|
|
160
174
|
verdict,
|
|
161
175
|
error,
|
|
176
|
+
commitObservation: commit_observation,
|
|
162
177
|
});
|
|
163
178
|
return {
|
|
164
179
|
executionAttempted: true,
|
|
@@ -170,6 +185,7 @@ function wrapThrownAsOutcome(error) {
|
|
|
170
185
|
proof,
|
|
171
186
|
freshness: FRESHNESS_NOT_CONFIGURED,
|
|
172
187
|
conditional_write: CW_NOT_REPORTED,
|
|
188
|
+
commit_observation,
|
|
173
189
|
};
|
|
174
190
|
}
|
|
175
191
|
// ── Core: execute through table → GuardOutcome ───────────────────────────────
|