@mmnto/cli 1.57.0 → 1.58.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/dist/commands/config-drift.test.js +0 -1
- package/dist/commands/config-drift.test.js.map +1 -1
- package/dist/commands/shield.d.ts.map +1 -1
- package/dist/commands/shield.js +7 -1
- package/dist/commands/shield.js.map +1 -1
- package/dist/commands/spec.d.ts.map +1 -1
- package/dist/commands/spec.js +5 -1
- package/dist/commands/spec.js.map +1 -1
- package/dist/orchestrators/conformance.test.js +56 -0
- package/dist/orchestrators/conformance.test.js.map +1 -1
- package/dist/orchestrators/orchestrator.d.ts +13 -1
- package/dist/orchestrators/orchestrator.d.ts.map +1 -1
- package/dist/orchestrators/orchestrator.js.map +1 -1
- package/dist/services/run-artifacts.d.ts +4 -0
- package/dist/services/run-artifacts.d.ts.map +1 -1
- package/dist/services/run-artifacts.js +46 -1
- package/dist/services/run-artifacts.js.map +1 -1
- package/dist/services/run-artifacts.test.js +82 -0
- package/dist/services/run-artifacts.test.js.map +1 -1
- package/dist/utils.d.ts +17 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +165 -14
- package/dist/utils.js.map +1 -1
- package/dist/utils.test.js +472 -0
- package/dist/utils.test.js.map +1 -1
- package/package.json +2 -2
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
* (#2103+), never a core primitive.
|
|
17
17
|
*/
|
|
18
18
|
import * as path from 'node:path';
|
|
19
|
-
import { calculateDeterministicHash, loadRunArtifact, TotemOrchestratorError } from '@mmnto/totem';
|
|
19
|
+
import { ADMISSION_COMPLETION_ONLY, calculateDeterministicHash, loadRunArtifact, TotemOrchestratorError, } from '@mmnto/totem';
|
|
20
20
|
import { runOrchestrator } from '../utils.js';
|
|
21
21
|
/**
|
|
22
22
|
* Replay a recorded run against its recorded backend with zero input drift.
|
|
@@ -44,6 +44,24 @@ export async function rerunArtifact(opts) {
|
|
|
44
44
|
...(source.backend.temperature !== undefined
|
|
45
45
|
? { temperature: source.backend.temperature }
|
|
46
46
|
: {}),
|
|
47
|
+
// ── Admission replay (mmnto-ai/totem#2102) ──
|
|
48
|
+
// The recorded contract replays verbatim: an elevated class re-enters the
|
|
49
|
+
// admission gate (a `self_grounding_agent` rerun must fail loud when the
|
|
50
|
+
// capability is no longer declared, never silently downgrade — Tenet 4).
|
|
51
|
+
// `completion_only` stays omitted: the default IS the constant, keeping a
|
|
52
|
+
// slice-1 rerun byte-identical to today (invariant 7).
|
|
53
|
+
...(source.backend.admissionClass !== ADMISSION_COMPLETION_ONLY
|
|
54
|
+
? { backendAdmissionClass: source.backend.admissionClass }
|
|
55
|
+
: {}),
|
|
56
|
+
...(source.admission?.outputContract !== undefined
|
|
57
|
+
? { outputContract: source.admission.outputContract }
|
|
58
|
+
: {}),
|
|
59
|
+
...(source.admission?.contextPolicy !== undefined
|
|
60
|
+
? { contextPolicy: source.admission.contextPolicy }
|
|
61
|
+
: {}),
|
|
62
|
+
...(source.admission?.runMetadata !== undefined
|
|
63
|
+
? { runMetadata: source.admission.runMetadata }
|
|
64
|
+
: {}),
|
|
47
65
|
artifact: {
|
|
48
66
|
// The rerun makes no new grounding claim — identity carried verbatim,
|
|
49
67
|
// including the per-item bundle when the source artifact has one (mmnto-ai/totem#2101).
|
|
@@ -78,6 +96,30 @@ const BACKEND_FIELDS = [
|
|
|
78
96
|
'taskProfile',
|
|
79
97
|
'temperature',
|
|
80
98
|
];
|
|
99
|
+
/**
|
|
100
|
+
* Admission members compared one by one (mmnto-ai/totem#2102) — mirrors
|
|
101
|
+
* {@link BACKEND_FIELDS}. Compile-time exhaustive against the artifact
|
|
102
|
+
* `admission` group (mmnto-ai/totem#2148 round-1): `satisfies Record<AdmissionField, true>`
|
|
103
|
+
* fails tsc when the schema gains a member this map doesn't name (missing
|
|
104
|
+
* key) AND when this map names a member the schema lost (excess key) — a
|
|
105
|
+
* schema field can never silently fall out of the compare delta.
|
|
106
|
+
*/
|
|
107
|
+
const ADMISSION_FIELD_SET = {
|
|
108
|
+
outputContract: true,
|
|
109
|
+
contextPolicy: true,
|
|
110
|
+
runMetadata: true,
|
|
111
|
+
};
|
|
112
|
+
const ADMISSION_FIELDS = Object.keys(ADMISSION_FIELD_SET);
|
|
113
|
+
/**
|
|
114
|
+
* Structural member equality via the deterministic hash (key-order
|
|
115
|
+
* independent — the same identity primitive the artifacts use). Absent on
|
|
116
|
+
* both sides is equal; absent on one side is a NAMED delta, never hidden.
|
|
117
|
+
*/
|
|
118
|
+
function sameAdmissionMember(a, b) {
|
|
119
|
+
if (a === undefined || b === undefined)
|
|
120
|
+
return a === b;
|
|
121
|
+
return calculateDeterministicHash(a) === calculateDeterministicHash(b);
|
|
122
|
+
}
|
|
81
123
|
/** Numeric delta honoring honest-absent: null in, null out — never NaN. */
|
|
82
124
|
function tokenDelta(a, b) {
|
|
83
125
|
if (typeof a !== 'number' || typeof b !== 'number')
|
|
@@ -90,6 +132,7 @@ function tokenDelta(a, b) {
|
|
|
90
132
|
*/
|
|
91
133
|
export function compareRunArtifacts(a, b) {
|
|
92
134
|
const backendDelta = BACKEND_FIELDS.filter((field) => a.backend[field] !== b.backend[field]);
|
|
135
|
+
const admissionDelta = ADMISSION_FIELDS.filter((field) => !sameAdmissionMember(a.admission?.[field], b.admission?.[field]));
|
|
93
136
|
const sameOutput = a.output.content === b.output.content;
|
|
94
137
|
// Short-circuit the second sha256 pass when the contents are byte-identical
|
|
95
138
|
// (Greptile review on #2114) — the equal-outputs fast path is explicit.
|
|
@@ -101,6 +144,8 @@ export function compareRunArtifacts(a, b) {
|
|
|
101
144
|
a.grounding.provenanceSummary === b.grounding.provenanceSummary,
|
|
102
145
|
sameBackend: backendDelta.length === 0,
|
|
103
146
|
backendDelta,
|
|
147
|
+
sameAdmission: admissionDelta.length === 0,
|
|
148
|
+
admissionDelta,
|
|
104
149
|
sameOutput,
|
|
105
150
|
outputDelta: { contentHashA, contentHashB },
|
|
106
151
|
metricsDelta: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-artifacts.js","sourceRoot":"","sources":["../../src/services/run-artifacts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAGlC,OAAO,
|
|
1
|
+
{"version":3,"file":"run-artifacts.js","sourceRoot":"","sources":["../../src/services/run-artifacts.ts"],"names":[],"mappings":"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"}
|
|
@@ -106,6 +106,45 @@ describe('rerunArtifact', () => {
|
|
|
106
106
|
await expect(rerunArtifact({ hash: 'e'.repeat(64), config: config(), cwd: tmpDir })).rejects.toThrow();
|
|
107
107
|
expect(mockedRunOrchestrator).not.toHaveBeenCalled();
|
|
108
108
|
});
|
|
109
|
+
// ─── Admission replay (mmnto-ai/totem#2102) ──
|
|
110
|
+
it('replays a recorded admission group + elevated class verbatim — no silent downgrade (invariant 7)', async () => {
|
|
111
|
+
const admission = {
|
|
112
|
+
outputContract: { citationsRequired: true, verifyFallback: true },
|
|
113
|
+
contextPolicy: { budget: 16_000 },
|
|
114
|
+
runMetadata: { caller: 'spec', command: 'spec' },
|
|
115
|
+
};
|
|
116
|
+
const elevatedHash = saveRunArtifact(path.join(tmpDir, '.totem'), artifact({
|
|
117
|
+
backend: {
|
|
118
|
+
provider: 'gemini',
|
|
119
|
+
model: 'gemini-3.1-pro-preview',
|
|
120
|
+
qualifiedModel: 'gemini:gemini-3.1-pro-preview',
|
|
121
|
+
admissionClass: 'self_grounding_agent',
|
|
122
|
+
taskProfile: 'Spec',
|
|
123
|
+
},
|
|
124
|
+
admission,
|
|
125
|
+
})).hash;
|
|
126
|
+
await rerunArtifact({ hash: elevatedHash, config: config(), cwd: tmpDir });
|
|
127
|
+
const call = mockedRunOrchestrator.mock.calls[0][0];
|
|
128
|
+
expect(call.backendAdmissionClass).toBe('self_grounding_agent');
|
|
129
|
+
expect(call.outputContract).toEqual(admission.outputContract);
|
|
130
|
+
expect(call.contextPolicy).toEqual(admission.contextPolicy);
|
|
131
|
+
expect(call.runMetadata).toEqual(admission.runMetadata);
|
|
132
|
+
});
|
|
133
|
+
it('rerunning an artifact without an admission group stays byte-identical to today (invariant 7)', async () => {
|
|
134
|
+
await rerunArtifact({ hash: sourceHash, config: config(), cwd: tmpDir });
|
|
135
|
+
const call = mockedRunOrchestrator.mock.calls[0][0];
|
|
136
|
+
// None of the #2102 keys appear — a slice-1 rerun is today's call shape.
|
|
137
|
+
for (const key of [
|
|
138
|
+
'task',
|
|
139
|
+
'groundingBundle',
|
|
140
|
+
'backendAdmissionClass',
|
|
141
|
+
'contextPolicy',
|
|
142
|
+
'outputContract',
|
|
143
|
+
'runMetadata',
|
|
144
|
+
]) {
|
|
145
|
+
expect(call).not.toHaveProperty(key);
|
|
146
|
+
}
|
|
147
|
+
});
|
|
109
148
|
});
|
|
110
149
|
describe('compareRunArtifacts', () => {
|
|
111
150
|
it('reports identical artifacts as identical with zero metric deltas', () => {
|
|
@@ -164,5 +203,48 @@ describe('compareRunArtifacts', () => {
|
|
|
164
203
|
const b = artifact({ output: { content: 'y', metrics: { durationMs: 1 } } });
|
|
165
204
|
expect(compareRunArtifacts(a, b)).toEqual(compareRunArtifacts(a, b));
|
|
166
205
|
});
|
|
206
|
+
// ─── Admission comparison (mmnto-ai/totem#2102) ──
|
|
207
|
+
it('two slice-1 artifacts (no admission group) compare as sameAdmission with an empty delta (invariant 6)', () => {
|
|
208
|
+
const cmp = compareRunArtifacts(artifact(), artifact());
|
|
209
|
+
expect(cmp.sameAdmission).toBe(true);
|
|
210
|
+
expect(cmp.admissionDelta).toEqual([]);
|
|
211
|
+
});
|
|
212
|
+
it('artifacts differing only in the admission group compare sameAdmission: false with a named delta (invariant 8)', () => {
|
|
213
|
+
const a = artifact({
|
|
214
|
+
admission: { contextPolicy: { budget: 8000 }, runMetadata: { caller: 'spec' } },
|
|
215
|
+
});
|
|
216
|
+
const b = artifact({
|
|
217
|
+
admission: { contextPolicy: { budget: 16_000 }, runMetadata: { caller: 'spec' } },
|
|
218
|
+
});
|
|
219
|
+
const cmp = compareRunArtifacts(a, b);
|
|
220
|
+
expect(cmp.sameAdmission).toBe(false);
|
|
221
|
+
expect(cmp.admissionDelta).toEqual(['contextPolicy']);
|
|
222
|
+
// Everything else is untouched — the delta is admission-only and NAMED.
|
|
223
|
+
expect(cmp.sameInput).toBe(true);
|
|
224
|
+
expect(cmp.sameGrounding).toBe(true);
|
|
225
|
+
expect(cmp.sameBackend).toBe(true);
|
|
226
|
+
expect(cmp.sameOutput).toBe(true);
|
|
227
|
+
});
|
|
228
|
+
it('admission-group presence vs absence names every present member in the delta', () => {
|
|
229
|
+
const withGroup = artifact({
|
|
230
|
+
admission: {
|
|
231
|
+
outputContract: { citationsRequired: true },
|
|
232
|
+
runMetadata: { caller: 'spec' },
|
|
233
|
+
},
|
|
234
|
+
});
|
|
235
|
+
const cmp = compareRunArtifacts(withGroup, artifact());
|
|
236
|
+
expect(cmp.sameAdmission).toBe(false);
|
|
237
|
+
expect(cmp.admissionDelta).toEqual(expect.arrayContaining(['outputContract', 'runMetadata']));
|
|
238
|
+
expect(cmp.admissionDelta).not.toContain('contextPolicy');
|
|
239
|
+
});
|
|
240
|
+
it('identical admission groups compare sameAdmission: true', () => {
|
|
241
|
+
const admission = {
|
|
242
|
+
outputContract: { citationsRequired: true, verifyFallback: false },
|
|
243
|
+
contextPolicy: { budget: 4096 },
|
|
244
|
+
};
|
|
245
|
+
const cmp = compareRunArtifacts(artifact({ admission }), artifact({ admission }));
|
|
246
|
+
expect(cmp.sameAdmission).toBe(true);
|
|
247
|
+
expect(cmp.admissionDelta).toEqual([]);
|
|
248
|
+
});
|
|
167
249
|
});
|
|
168
250
|
//# sourceMappingURL=run-artifacts.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-artifacts.test.js","sourceRoot":"","sources":["../../src/services/run-artifacts.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"run-artifacts.test.js","sourceRoot":"","sources":["../../src/services/run-artifacts.test.ts"],"names":[],"mappings":"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"}
|
package/dist/utils.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { CustomSecret, GroundingBundle, SearchResult, TotemConfig } from '@mmnto/totem';
|
|
1
|
+
import type { BackendAdmissionClass, ContextPolicy, CustomSecret, GroundingBundle, OutputContract, RunMetadata, SearchResult, TotemConfig } from '@mmnto/totem';
|
|
2
2
|
import { CONFIG_FILES } from '@mmnto/totem';
|
|
3
3
|
/** execFileSync on Windows can't resolve executables without `shell: true`. */
|
|
4
4
|
export declare const IS_WIN: boolean;
|
|
@@ -142,5 +142,21 @@ export declare function runOrchestrator(opts: {
|
|
|
142
142
|
* failure warns and never fails the run. Omitted = today's behavior.
|
|
143
143
|
*/
|
|
144
144
|
artifact?: RunArtifactRequest;
|
|
145
|
+
/** Neutral task identity — records to `backend.taskProfile` as `task ?? tag` (`tag` stays the UI/cache/TTL key). */
|
|
146
|
+
task?: string;
|
|
147
|
+
/**
|
|
148
|
+
* The delivered grounding identity, reconciled with `artifact.bundle`:
|
|
149
|
+
* one supplied serves both roles; both supplied must hash-agree, else a
|
|
150
|
+
* hard ambiguous-grounding-identity error before any invoke.
|
|
151
|
+
*/
|
|
152
|
+
groundingBundle?: GroundingBundle;
|
|
153
|
+
/** Requested admission class — gated against `orchestrator.capabilities.admissionClasses` before EACH invoke. Defaults to `completion_only`. */
|
|
154
|
+
backendAdmissionClass?: BackendAdmissionClass;
|
|
155
|
+
/** Advisory context policy (budget unit: input tokens) — recorded into the artifact `admission` group. */
|
|
156
|
+
contextPolicy?: ContextPolicy;
|
|
157
|
+
/** Caller-declared output contract — recorded; #2103 post-checks enforce. */
|
|
158
|
+
outputContract?: OutputContract;
|
|
159
|
+
/** Caller identity metadata — recorded verbatim into the artifact `admission` group. */
|
|
160
|
+
runMetadata?: RunMetadata;
|
|
145
161
|
}): Promise<string | undefined>;
|
|
146
162
|
//# sourceMappingURL=utils.d.ts.map
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EAEf,YAAY,EACZ,WAAW,EACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EAIL,YAAY,EAOb,MAAM,cAAc,CAAC;AAUtB,+EAA+E;AAC/E,eAAO,MAAM,MAAM,SAA+B,CAAC;AAEnD,yCAAyC;AACzC,eAAO,MAAM,aAAa,QAAS,CAAC;AAEpC;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAKzC;AAGD,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;AAElD,wFAAwF;AACxF,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAoBvE;AAED,oFAAoF;AACpF,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAIhF;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAuDzE;AAGD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AA+BhD;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAAwB,GACjC,OAAO,CAAC,MAAM,CAAC,CA8BjB;AAMD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,GACf,MAAM,CAaR;AAID,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAUnE;AAKD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAKxC,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAOzD,wBAAgB,aAAa,CAC3B,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,OAAO,GAClB,MAAM,CAqBR;AAID,iFAAiF;AACjF,eAAO,MAAM,wBAAwB,OAAQ,CAAC;AAE9C;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,YAAY,EAAE,EACxB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf;IAAE,OAAO,EAAE,YAAY,EAAE,CAAC;IAAC,KAAK,EAAE,YAAY,EAAE,CAAA;CAAE,CAIpD;AAKD;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,YAAY,EAAE,EACvB,QAAQ,GAAE,MAAiC,EAC3C,SAAS,CAAC,EAAE,OAAO,GAClB,MAAM,CAqBR;AAID,MAAM,WAAW,sBAAsB;IACrC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
package/dist/utils.js
CHANGED
|
@@ -275,6 +275,13 @@ const DEFAULT_TTLS = {
|
|
|
275
275
|
* delimiters between every field so boundary-case inputs (e.g. `prompt="AB",
|
|
276
276
|
* systemPrompt=""` vs `prompt="A", systemPrompt="B"`) produce distinct keys.
|
|
277
277
|
*
|
|
278
|
+
* When at least one admission-contract field is present (mmnto-ai/totem#2148
|
|
279
|
+
* round-1), a deterministic serialization of the contract joins the hash
|
|
280
|
+
* input so calls differing only in contract fields key separately. When
|
|
281
|
+
* every field is absent the hash input is BYTE-IDENTICAL to the legacy shape
|
|
282
|
+
* — invariant 1 (the mmnto/totem#1291 additive precedent): legacy callers'
|
|
283
|
+
* cache entries stay warm.
|
|
284
|
+
*
|
|
278
285
|
* Used by both the read path (lookup) and write path (store) inside
|
|
279
286
|
* `runOrchestrator` to guarantee the keys are identical — extracted as a
|
|
280
287
|
* pure helper after the mmnto/totem#1292 review (mmnto/totem#1291) caught a
|
|
@@ -282,16 +289,33 @@ const DEFAULT_TTLS = {
|
|
|
282
289
|
* leaving the write path on the legacy `prompt + model` shape and making
|
|
283
290
|
* fresh cache entries unreachable on subsequent runs.
|
|
284
291
|
*/
|
|
285
|
-
function buildResponseCacheHash(prompt, systemPrompt, qualifiedModel) {
|
|
286
|
-
|
|
292
|
+
function buildResponseCacheHash(prompt, systemPrompt, qualifiedModel, contract) {
|
|
293
|
+
const hash = crypto
|
|
287
294
|
.createHash('sha256')
|
|
288
295
|
.update(prompt)
|
|
289
296
|
.update('\0')
|
|
290
297
|
.update(systemPrompt ?? '')
|
|
291
298
|
.update('\0')
|
|
292
|
-
.update(qualifiedModel)
|
|
293
|
-
|
|
294
|
-
|
|
299
|
+
.update(qualifiedModel);
|
|
300
|
+
// Conditional spreads: an absent field contributes NO key, so the
|
|
301
|
+
// all-absent contract is an empty object and the legacy branch below.
|
|
302
|
+
const contractFields = {
|
|
303
|
+
...(contract?.groundingBundle !== undefined
|
|
304
|
+
? { groundingBundleHash: calculateDeterministicHash(contract.groundingBundle) }
|
|
305
|
+
: {}),
|
|
306
|
+
...(contract?.backendAdmissionClass !== undefined
|
|
307
|
+
? { backendAdmissionClass: contract.backendAdmissionClass }
|
|
308
|
+
: {}),
|
|
309
|
+
...(contract?.outputContract !== undefined ? { outputContract: contract.outputContract } : {}),
|
|
310
|
+
...(contract?.contextPolicy !== undefined ? { contextPolicy: contract.contextPolicy } : {}),
|
|
311
|
+
...(contract?.runMetadata !== undefined ? { runMetadata: contract.runMetadata } : {}),
|
|
312
|
+
};
|
|
313
|
+
if (Object.keys(contractFields).length > 0) {
|
|
314
|
+
// calculateDeterministicHash is key-order independent — the same identity
|
|
315
|
+
// primitive the artifacts use, so the serialization is deterministic.
|
|
316
|
+
hash.update('\0').update(calculateDeterministicHash(contractFields));
|
|
317
|
+
}
|
|
318
|
+
return hash.digest('hex').slice(0, 16);
|
|
295
319
|
}
|
|
296
320
|
/**
|
|
297
321
|
* Assemble the grounding bundle for the spec/review retrieval shape
|
|
@@ -309,6 +333,29 @@ export function buildRetrievalGroundingBundle(context) {
|
|
|
309
333
|
...context.lessons.map((result) => ({ sourceType: 'lesson', result })),
|
|
310
334
|
]);
|
|
311
335
|
}
|
|
336
|
+
/**
|
|
337
|
+
* Admission gate (mmnto-ai/totem#2102, strategy#474 slice 3): a requested
|
|
338
|
+
* class above `completion_only` must be declared in
|
|
339
|
+
* `orchestrator.capabilities.admissionClasses`. The declaration is
|
|
340
|
+
* CONFIG-LEVEL — scoped to the base provider — so this check alone is not
|
|
341
|
+
* per-resolved-backend: `resolveOrchestrator` can route a provider-qualified
|
|
342
|
+
* model (primary or fallback) to a different provider. It is therefore
|
|
343
|
+
* paired with a cross-provider denial on BOTH paths (mmnto-ai/totem#2148
|
|
344
|
+
* round-1 added the primary's): an elevated class whose resolved provider differs from the
|
|
345
|
+
* base config's fails loud. Together they decide admission per RESOLVED
|
|
346
|
+
* backend before EACH invoke, BEFORE any tokens are spent — a denied run
|
|
347
|
+
* emits no artifact. Declaration is a capability claim only; output
|
|
348
|
+
* enforcement is caller-side (mmnto-ai/totem#2103).
|
|
349
|
+
*/
|
|
350
|
+
function assertAdmissionDeclared(requested, orchestrator) {
|
|
351
|
+
if (requested === ADMISSION_COMPLETION_ONLY)
|
|
352
|
+
return;
|
|
353
|
+
// Absent declaration = ['completion_only'] — factually true of every backend today.
|
|
354
|
+
const declared = orchestrator.capabilities?.admissionClasses ?? [ADMISSION_COMPLETION_ONLY];
|
|
355
|
+
if (!declared.includes(requested)) {
|
|
356
|
+
throw new TotemConfigError(`Admission denied: requested backend admission class '${requested}' is not declared in orchestrator.capabilities.admissionClasses.`, "Declare the class in your orchestrator config (capabilities: { admissionClasses: ['self_grounding_agent'] }) or drop the backendAdmissionClass request.", 'CONFIG_INVALID');
|
|
357
|
+
}
|
|
358
|
+
}
|
|
312
359
|
/**
|
|
313
360
|
* Validate orchestrator config, then either output raw context (--raw) or
|
|
314
361
|
* invoke the configured orchestrator provider and return the LLM content.
|
|
@@ -348,6 +395,46 @@ export async function runOrchestrator(opts) {
|
|
|
348
395
|
throw new TotemConfigError('No orchestrator configured.', "Add an 'orchestrator' block to totem.config.ts.\n" +
|
|
349
396
|
"Example:\n orchestrator: {\n provider: 'shell',\n command: 'gemini --model {model} -e none < {file}',\n defaultModel: 'gemini-2.5-pro',\n }", 'CONFIG_INVALID');
|
|
350
397
|
}
|
|
398
|
+
// ── Grounding identity reconciliation (mmnto-ai/totem#2102) ──
|
|
399
|
+
// One identity, two seams: when both are supplied they must agree; when
|
|
400
|
+
// only one is supplied it serves both roles (invoke-seam transport +
|
|
401
|
+
// artifact record).
|
|
402
|
+
if (opts.groundingBundle !== undefined &&
|
|
403
|
+
opts.artifact?.bundle !== undefined &&
|
|
404
|
+
calculateDeterministicHash(opts.groundingBundle) !==
|
|
405
|
+
calculateDeterministicHash(opts.artifact.bundle)) {
|
|
406
|
+
throw new TotemConfigError('Ambiguous grounding identity: groundingBundle and artifact.bundle were both supplied with mismatched deterministic hashes.', 'Supply only one of the two, or make them agree.', 'CONFIG_INVALID');
|
|
407
|
+
}
|
|
408
|
+
// mmnto-ai/totem#2148 round-1, VERIFY-AND-REJECT (never recompute — this seam records,
|
|
409
|
+
// never re-derives): when the artifact's bundle role is adopted from
|
|
410
|
+
// `opts.groundingBundle` (no `artifact.bundle` supplied), the caller-attested
|
|
411
|
+
// `artifact.groundingHash` must recompute from that adopted bundle —
|
|
412
|
+
// otherwise the artifact would persist a grounding.hash that does not match
|
|
413
|
+
// its recorded grounding.bundle.
|
|
414
|
+
if (opts.artifact !== undefined &&
|
|
415
|
+
opts.groundingBundle !== undefined &&
|
|
416
|
+
opts.artifact.bundle === undefined &&
|
|
417
|
+
calculateDeterministicHash(opts.groundingBundle) !== opts.artifact.groundingHash) {
|
|
418
|
+
throw new TotemConfigError('Ambiguous grounding identity: artifact.groundingHash does not match the deterministic hash of the adopted groundingBundle.', 'Supply artifact.groundingHash as calculateDeterministicHash(groundingBundle), or make them agree.', 'CONFIG_INVALID');
|
|
419
|
+
}
|
|
420
|
+
const groundingBundle = opts.groundingBundle ?? opts.artifact?.bundle;
|
|
421
|
+
// #2102: caller-supplied wins over the defaults; the defaults reproduce
|
|
422
|
+
// today's behavior exactly (taskProfile = tag, class = completion_only).
|
|
423
|
+
const requestedAdmissionClass = opts.backendAdmissionClass ?? ADMISSION_COMPLETION_ONLY;
|
|
424
|
+
const taskProfile = opts.task ?? tag;
|
|
425
|
+
// mmnto-ai/totem#2148 round-1: the contract fields participating in the response-cache
|
|
426
|
+
// key. Built ONCE from the caller-supplied (not defaulted) values plus the
|
|
427
|
+
// reconciled bundle, and passed to BOTH the read and write paths so the
|
|
428
|
+
// keys stay identical. All-absent = empty object = legacy key (invariant 1).
|
|
429
|
+
const cacheContract = {
|
|
430
|
+
...(groundingBundle !== undefined ? { groundingBundle } : {}),
|
|
431
|
+
...(opts.backendAdmissionClass !== undefined
|
|
432
|
+
? { backendAdmissionClass: opts.backendAdmissionClass }
|
|
433
|
+
: {}),
|
|
434
|
+
...(opts.outputContract !== undefined ? { outputContract: opts.outputContract } : {}),
|
|
435
|
+
...(opts.contextPolicy !== undefined ? { contextPolicy: opts.contextPolicy } : {}),
|
|
436
|
+
...(opts.runMetadata !== undefined ? { runMetadata: opts.runMetadata } : {}),
|
|
437
|
+
};
|
|
351
438
|
const baseProvider = config.orchestrator.provider;
|
|
352
439
|
const baseInvoke = createOrchestrator(config.orchestrator);
|
|
353
440
|
const tagKey = tag.toLowerCase();
|
|
@@ -359,12 +446,28 @@ export async function runOrchestrator(opts) {
|
|
|
359
446
|
let model = resolved.parsed.model;
|
|
360
447
|
let qualifiedModel = resolved.qualifiedModel;
|
|
361
448
|
let invoke = resolved.invoke;
|
|
449
|
+
// ── Admission gate, primary path (mmnto-ai/totem#2102) ──
|
|
450
|
+
// Decided per RESOLVED backend BEFORE the invoke (and before the response
|
|
451
|
+
// cache: a denied class must not be served a replay either). No tokens are
|
|
452
|
+
// spent and no artifact is emitted for a denied run.
|
|
453
|
+
assertAdmissionDeclared(requestedAdmissionClass, config.orchestrator);
|
|
454
|
+
// mmnto-ai/totem#2148 round-1: `resolveOrchestrator` can route a provider-qualified
|
|
455
|
+
// PRIMARY model to a DIFFERENT provider than the base config, and the
|
|
456
|
+
// capability declaration is config-level (base-provider scoped) — so an
|
|
457
|
+
// elevated class that passed the declaration check must still be denied
|
|
458
|
+
// when the primary resolves cross-provider, same conservative slice-3 rule
|
|
459
|
+
// as the quota-fallback path below. Per-provider capability declarations
|
|
460
|
+
// are the future relaxation.
|
|
461
|
+
if (requestedAdmissionClass !== ADMISSION_COMPLETION_ONLY &&
|
|
462
|
+
resolved.parsed.provider !== baseProvider) {
|
|
463
|
+
throw new TotemConfigError(`Admission denied: model '${rawModel}' resolves to provider '${resolved.parsed.provider}' (base config: '${baseProvider}') while admission class '${requestedAdmissionClass}' is requested — cross-provider routing is not admitted above '${ADMISSION_COMPLETION_ONLY}' until per-provider capability declarations exist.`, 'Use a model on the base provider, or drop the elevated backendAdmissionClass request.', 'CONFIG_INVALID');
|
|
464
|
+
}
|
|
362
465
|
log.info(tag, `Model: ${bold(rawModel)}`);
|
|
363
466
|
const ttlSeconds = config.orchestrator.cacheTtls?.[tagKey] ?? DEFAULT_TTLS[tagKey] ?? 0;
|
|
364
467
|
const useCache = ttlSeconds > 0 && !options.fresh;
|
|
365
468
|
let cachePath = '';
|
|
366
469
|
if (useCache) {
|
|
367
|
-
const hash = buildResponseCacheHash(prompt, systemPrompt, qualifiedModel);
|
|
470
|
+
const hash = buildResponseCacheHash(prompt, systemPrompt, qualifiedModel, cacheContract);
|
|
368
471
|
const cacheDir = path.join(configRoot, config.totemDir, 'cache');
|
|
369
472
|
cachePath = path.join(cacheDir, `${tagKey}-${hash}.json`);
|
|
370
473
|
if (fs.existsSync(cachePath)) {
|
|
@@ -424,6 +527,20 @@ export async function runOrchestrator(opts) {
|
|
|
424
527
|
// and undefined-safe — providers fall back to today's behavior when unset.
|
|
425
528
|
const enableContextCaching = config.orchestrator.enableContextCaching;
|
|
426
529
|
const cacheTTL = config.orchestrator.cacheTTL;
|
|
530
|
+
// #2102 transport: thread the adopted field names verbatim when supplied.
|
|
531
|
+
// Conditional spreads keep the omit-everything invoke payload byte-identical
|
|
532
|
+
// to today (#1291 additive precedent, invariant 1). Providers transport
|
|
533
|
+
// these, never read them this slice.
|
|
534
|
+
const admissionTransport = {
|
|
535
|
+
...(opts.task !== undefined ? { task: opts.task } : {}),
|
|
536
|
+
...(groundingBundle !== undefined ? { groundingBundle } : {}),
|
|
537
|
+
...(opts.backendAdmissionClass !== undefined
|
|
538
|
+
? { backendAdmissionClass: opts.backendAdmissionClass }
|
|
539
|
+
: {}),
|
|
540
|
+
...(opts.contextPolicy !== undefined ? { contextPolicy: opts.contextPolicy } : {}),
|
|
541
|
+
...(opts.outputContract !== undefined ? { outputContract: opts.outputContract } : {}),
|
|
542
|
+
...(opts.runMetadata !== undefined ? { runMetadata: opts.runMetadata } : {}),
|
|
543
|
+
};
|
|
427
544
|
let result;
|
|
428
545
|
try {
|
|
429
546
|
result = await invoke({
|
|
@@ -436,6 +553,7 @@ export async function runOrchestrator(opts) {
|
|
|
436
553
|
temperature: opts.temperature,
|
|
437
554
|
...(enableContextCaching !== undefined ? { enableContextCaching } : {}),
|
|
438
555
|
...(cacheTTL !== undefined ? { cacheTTL } : {}),
|
|
556
|
+
...admissionTransport,
|
|
439
557
|
});
|
|
440
558
|
}
|
|
441
559
|
catch (err) {
|
|
@@ -444,6 +562,21 @@ export async function runOrchestrator(opts) {
|
|
|
444
562
|
if (rawFallback && rawModel !== rawFallback) {
|
|
445
563
|
log.warn(tag, `Quota exhausted for ${rawModel}. Retrying with fallback model: ${bold(rawFallback)}...`);
|
|
446
564
|
const fallbackResolved = resolveOrchestrator(rawFallback, baseProvider, baseInvoke);
|
|
565
|
+
// ── Admission gate, fallback path (mmnto-ai/totem#2102) ──
|
|
566
|
+
// `resolveOrchestrator` can route a provider-qualified fallbackModel
|
|
567
|
+
// to a DIFFERENT provider, and a single config-level declaration
|
|
568
|
+
// cannot honestly cover backends with different real capabilities.
|
|
569
|
+
// Slice-3 rule, conservative and deterministic: an elevated class
|
|
570
|
+
// admits the fallback only when it resolves to the SAME provider as
|
|
571
|
+
// the primary — cross-provider fails loud BEFORE the fallback invoke,
|
|
572
|
+
// reporting the primary and admission errors together. Per-provider
|
|
573
|
+
// capability declarations are the future relaxation.
|
|
574
|
+
if (requestedAdmissionClass !== ADMISSION_COMPLETION_ONLY &&
|
|
575
|
+
fallbackResolved.parsed.provider !== resolved.parsed.provider) {
|
|
576
|
+
throw new TotemOrchestratorError(`Primary model '${rawModel}' failed and the quota fallback '${rawFallback}' was denied admission.\n\n` +
|
|
577
|
+
`Primary error:\n${err.message}\n\n` +
|
|
578
|
+
`Admission error:\nfallback resolves to provider '${fallbackResolved.parsed.provider}' (primary: '${resolved.parsed.provider}') while admission class '${requestedAdmissionClass}' is requested — a cross-provider fallback is not admitted above '${ADMISSION_COMPLETION_ONLY}'.`, 'Use a same-provider fallbackModel, or drop the elevated backendAdmissionClass request.', err);
|
|
579
|
+
}
|
|
447
580
|
try {
|
|
448
581
|
result = await fallbackResolved.invoke({
|
|
449
582
|
prompt: safePrompt,
|
|
@@ -455,6 +588,7 @@ export async function runOrchestrator(opts) {
|
|
|
455
588
|
temperature: opts.temperature,
|
|
456
589
|
...(enableContextCaching !== undefined ? { enableContextCaching } : {}),
|
|
457
590
|
...(cacheTTL !== undefined ? { cacheTTL } : {}),
|
|
591
|
+
...admissionTransport,
|
|
458
592
|
});
|
|
459
593
|
// Update model/invoke so telemetry and cache log the correct values
|
|
460
594
|
model = fallbackResolved.parsed.model;
|
|
@@ -486,7 +620,7 @@ export async function runOrchestrator(opts) {
|
|
|
486
620
|
// resolution that may have happened above. Uses the same helper as the
|
|
487
621
|
// read path so the keys are guaranteed identical (mmnto/totem#1291
|
|
488
622
|
// mmnto/totem#1292 review fix from GCA + CodeRabbit).
|
|
489
|
-
const cacheHash = buildResponseCacheHash(prompt, systemPrompt, qualifiedModel);
|
|
623
|
+
const cacheHash = buildResponseCacheHash(prompt, systemPrompt, qualifiedModel, cacheContract);
|
|
490
624
|
const cacheDir = path.join(configRoot, config.totemDir, 'cache');
|
|
491
625
|
const finalCachePath = path.join(cacheDir, `${tagKey}-${cacheHash}.json`);
|
|
492
626
|
fs.mkdirSync(cacheDir, { recursive: true });
|
|
@@ -526,18 +660,19 @@ export async function runOrchestrator(opts) {
|
|
|
526
660
|
hash: opts.artifact.groundingHash,
|
|
527
661
|
provenanceSummary: opts.artifact.provenanceSummary,
|
|
528
662
|
// Verbatim passthrough — the bundle was assembled and hashed by the
|
|
529
|
-
// caller (mmnto-ai/totem#2101); this seam records, never re-derives
|
|
530
|
-
|
|
663
|
+
// caller (mmnto-ai/totem#2101); this seam records, never re-derives
|
|
664
|
+
// or upgrades. Post-reconciliation (#2102): a caller-supplied
|
|
665
|
+
// `groundingBundle` serves this role when `artifact.bundle` is absent.
|
|
666
|
+
...(groundingBundle !== undefined ? { bundle: groundingBundle } : {}),
|
|
531
667
|
},
|
|
532
668
|
backend: {
|
|
533
669
|
provider: resolved.parsed.provider,
|
|
534
670
|
model,
|
|
535
671
|
qualifiedModel,
|
|
536
|
-
//
|
|
537
|
-
//
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
taskProfile: tag,
|
|
672
|
+
// #2102: caller-supplied wins; the default reproduces the slice-1
|
|
673
|
+
// constant — every undeclared backend is factually completion-only.
|
|
674
|
+
admissionClass: requestedAdmissionClass,
|
|
675
|
+
taskProfile,
|
|
541
676
|
...(opts.temperature !== undefined ? { temperature: opts.temperature } : {}),
|
|
542
677
|
},
|
|
543
678
|
output: {
|
|
@@ -552,6 +687,22 @@ export async function runOrchestrator(opts) {
|
|
|
552
687
|
...(result.finishReason !== undefined ? { finishReason: result.finishReason } : {}),
|
|
553
688
|
},
|
|
554
689
|
},
|
|
690
|
+
// #2102: the admitted contract group is recorded ONLY when the caller
|
|
691
|
+
// supplied at least one member — an omitted contract stays an omitted
|
|
692
|
+
// key, never an empty object (additive 1.x, slice-1 artifacts unchanged).
|
|
693
|
+
...(opts.outputContract !== undefined ||
|
|
694
|
+
opts.contextPolicy !== undefined ||
|
|
695
|
+
opts.runMetadata !== undefined
|
|
696
|
+
? {
|
|
697
|
+
admission: {
|
|
698
|
+
...(opts.outputContract !== undefined
|
|
699
|
+
? { outputContract: opts.outputContract }
|
|
700
|
+
: {}),
|
|
701
|
+
...(opts.contextPolicy !== undefined ? { contextPolicy: opts.contextPolicy } : {}),
|
|
702
|
+
...(opts.runMetadata !== undefined ? { runMetadata: opts.runMetadata } : {}),
|
|
703
|
+
},
|
|
704
|
+
}
|
|
705
|
+
: {}),
|
|
555
706
|
createdAt: new Date().toISOString(),
|
|
556
707
|
};
|
|
557
708
|
const saved = saveRunArtifact(path.join(configRoot, config.totemDir), runArtifact);
|