@mmnto/totem 1.114.0 → 1.116.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/attribution-sense.d.ts +119 -0
- package/dist/attribution-sense.d.ts.map +1 -0
- package/dist/attribution-sense.js +167 -0
- package/dist/attribution-sense.js.map +1 -0
- package/dist/attribution-sense.test.d.ts +21 -0
- package/dist/attribution-sense.test.d.ts.map +1 -0
- package/dist/attribution-sense.test.js +277 -0
- package/dist/attribution-sense.test.js.map +1 -0
- package/dist/errors.d.ts +6 -2
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/fs-atomic.d.ts +63 -0
- package/dist/fs-atomic.d.ts.map +1 -0
- package/dist/fs-atomic.js +114 -0
- package/dist/fs-atomic.js.map +1 -0
- package/dist/fs-atomic.test.d.ts +2 -0
- package/dist/fs-atomic.test.d.ts.map +1 -0
- package/dist/fs-atomic.test.js +162 -0
- package/dist/fs-atomic.test.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/ingest/pipeline.d.ts.map +1 -1
- package/dist/ingest/pipeline.js +5 -5
- package/dist/ingest/pipeline.js.map +1 -1
- package/dist/orchestration-resolver.d.ts +19 -0
- package/dist/orchestration-resolver.d.ts.map +1 -1
- package/dist/orchestration-resolver.js +5 -1
- package/dist/orchestration-resolver.js.map +1 -1
- package/dist/recurrence-stats.d.ts +16 -14
- package/dist/recurrence-stats.d.ts.map +1 -1
- package/dist/recurrence-stats.js +1 -0
- package/dist/recurrence-stats.js.map +1 -1
- package/dist/recurrence-stats.test.js +6 -0
- package/dist/recurrence-stats.test.js.map +1 -1
- package/dist/retrospect.d.ts +54 -54
- package/dist/retrospect.d.ts.map +1 -1
- package/dist/retrospect.js +1 -0
- package/dist/retrospect.js.map +1 -1
- package/dist/seat-lifecycle.d.ts +118 -0
- package/dist/seat-lifecycle.d.ts.map +1 -0
- package/dist/seat-lifecycle.js +197 -0
- package/dist/seat-lifecycle.js.map +1 -0
- package/dist/seat-lifecycle.test.d.ts +11 -0
- package/dist/seat-lifecycle.test.d.ts.map +1 -0
- package/dist/seat-lifecycle.test.js +210 -0
- package/dist/seat-lifecycle.test.js.map +1 -0
- package/dist/selection-manifest.d.ts +466 -0
- package/dist/selection-manifest.d.ts.map +1 -0
- package/dist/selection-manifest.js +498 -0
- package/dist/selection-manifest.js.map +1 -0
- package/dist/selection-manifest.test.d.ts +26 -0
- package/dist/selection-manifest.test.d.ts.map +1 -0
- package/dist/selection-manifest.test.js +433 -0
- package/dist/selection-manifest.test.js.map +1 -0
- package/dist/spine/ledgers.d.ts +12 -12
- package/dist/verification-outcomes.d.ts.map +1 -1
- package/dist/verification-outcomes.js +6 -12
- package/dist/verification-outcomes.js.map +1 -1
- package/dist/worktree-registry.d.ts.map +1 -1
- package/dist/worktree-registry.js +4 -4
- package/dist/worktree-registry.js.map +1 -1
- package/package.json +15 -11
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Writer + schema tests for the selection-manifest instrument
|
|
3
|
+
* (mmnto-ai/totem#2468 — the Prop 308 / strategy#467 M1 emitter substrate).
|
|
4
|
+
*
|
|
5
|
+
* The invariants under test come verbatim from the design doc
|
|
6
|
+
* (.totem/specs/2468-selection-manifests.md):
|
|
7
|
+
*
|
|
8
|
+
* - the schema is strict at BOTH levels — the structural refute-condition
|
|
9
|
+
* guard (Prop 308 F1: no shared score field can appear silently);
|
|
10
|
+
* - a fingerprint covers exactly the considered bytes: stable on identical
|
|
11
|
+
* content, changed on changed content, ABSENT (with a named warning) on
|
|
12
|
+
* hash failure — never fabricated;
|
|
13
|
+
* - attribution is stamped absence: no env/seat/session → fields absent,
|
|
14
|
+
* never guessed;
|
|
15
|
+
* - emission is a pure sensor: a failed append leaves the caller unbroken
|
|
16
|
+
* and the failure named on the accounting channel; a schema-invalid row
|
|
17
|
+
* THROWS from the writer (emitter programming error) and is converted to
|
|
18
|
+
* a warning by the sense wrapper;
|
|
19
|
+
* - a `.totem`-less cwd is a silent normal-state skip that materialises no
|
|
20
|
+
* directory.
|
|
21
|
+
*
|
|
22
|
+
* The EACCES induced-failure uses vi.spyOn on `node:fs` (accounting-branch
|
|
23
|
+
* coverage, same scoping rationale as qbd/record.test.ts documents).
|
|
24
|
+
*/
|
|
25
|
+
import * as os from 'node:os';
|
|
26
|
+
import * as path from 'node:path';
|
|
27
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
28
|
+
// Mock node:fs so spyOn works in ESM — same pattern as qbd/record.test.ts.
|
|
29
|
+
vi.mock('node:fs', async () => {
|
|
30
|
+
const actual = await vi.importActual('node:fs');
|
|
31
|
+
return { ...actual, default: actual };
|
|
32
|
+
});
|
|
33
|
+
import * as fs from 'node:fs';
|
|
34
|
+
import { TotemError } from './errors.js';
|
|
35
|
+
import { appendSelectionManifest, buildMeasuredCandidate, buildSelectionManifestRow, fingerprintContent, measureCandidateCost, readSelectionManifests, SELECTION_COST_BASIS, SELECTION_MANIFESTS_FILE, SelectionCandidateSchema, SelectionManifestRowSchema, senseSelectionManifest, } from './selection-manifest.js';
|
|
36
|
+
import { cleanTmpDir } from './test-utils.js';
|
|
37
|
+
const T0 = Date.parse('2026-08-10T03:00:00.000Z');
|
|
38
|
+
const SESSION_A = '550e8400-e29b-41d4-a716-446655440000';
|
|
39
|
+
let tmpDir;
|
|
40
|
+
let totemDir;
|
|
41
|
+
function baseCandidate(over = {}) {
|
|
42
|
+
return {
|
|
43
|
+
id: 'docs/example.md',
|
|
44
|
+
disposition: 'selected',
|
|
45
|
+
reason: 'test-policy: selected',
|
|
46
|
+
...over,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function baseInput(over = {}) {
|
|
50
|
+
return {
|
|
51
|
+
totemDir,
|
|
52
|
+
emitter: 'search_knowledge',
|
|
53
|
+
context: { query: 'q' },
|
|
54
|
+
universe: 'test-pool',
|
|
55
|
+
candidates: [baseCandidate()],
|
|
56
|
+
nowMs: T0,
|
|
57
|
+
env: {},
|
|
58
|
+
...over,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function manifestPath() {
|
|
62
|
+
return path.join(totemDir, 'ledger', SELECTION_MANIFESTS_FILE);
|
|
63
|
+
}
|
|
64
|
+
beforeEach(() => {
|
|
65
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'sel-manifest-'));
|
|
66
|
+
totemDir = path.join(tmpDir, '.totem');
|
|
67
|
+
fs.mkdirSync(totemDir, { recursive: true });
|
|
68
|
+
});
|
|
69
|
+
afterEach(() => {
|
|
70
|
+
vi.restoreAllMocks();
|
|
71
|
+
cleanTmpDir(tmpDir);
|
|
72
|
+
});
|
|
73
|
+
// ─── Measurement helpers ────────────────────────────────
|
|
74
|
+
describe('fingerprintContent / measureCandidateCost', () => {
|
|
75
|
+
it('is stable across identical content and changes when content changes', () => {
|
|
76
|
+
expect(fingerprintContent('same bytes')).toBe(fingerprintContent('same bytes'));
|
|
77
|
+
expect(fingerprintContent('same bytes')).not.toBe(fingerprintContent('same bytes!'));
|
|
78
|
+
expect(fingerprintContent('same bytes')).toMatch(/^[0-9a-f]{16}$/);
|
|
79
|
+
});
|
|
80
|
+
it('string and Buffer forms of the same bytes fingerprint identically', () => {
|
|
81
|
+
const s = 'café content';
|
|
82
|
+
expect(fingerprintContent(s)).toBe(fingerprintContent(Buffer.from(s, 'utf-8')));
|
|
83
|
+
});
|
|
84
|
+
it('measures UTF-8 bytes (not chars) and declares tokens as ceil(bytes/4)', () => {
|
|
85
|
+
const s = 'éé'; // 2 chars, 4 UTF-8 bytes
|
|
86
|
+
expect(measureCandidateCost(s)).toEqual({ bytes: 4, approxTokens: 1 });
|
|
87
|
+
expect(measureCandidateCost('12345')).toEqual({ bytes: 5, approxTokens: 2 });
|
|
88
|
+
expect(measureCandidateCost('')).toEqual({ bytes: 0, approxTokens: 0 });
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
describe('buildMeasuredCandidate', () => {
|
|
92
|
+
it('measures and fingerprints content the policy actually read', () => {
|
|
93
|
+
const { candidate, warning } = buildMeasuredCandidate({
|
|
94
|
+
id: 'a.md',
|
|
95
|
+
content: 'hello',
|
|
96
|
+
disposition: 'selected',
|
|
97
|
+
reason: 'r',
|
|
98
|
+
});
|
|
99
|
+
expect(warning).toBeUndefined();
|
|
100
|
+
expect(candidate).toMatchObject({
|
|
101
|
+
id: 'a.md',
|
|
102
|
+
bytes: 5,
|
|
103
|
+
approxTokens: 2,
|
|
104
|
+
fingerprint: fingerprintContent('hello'),
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
it('is TOTAL over bad content: non-string/non-Buffer degrades to an id-only row + warning, never a throw or a NaN (leg round 1, H-7)', () => {
|
|
108
|
+
for (const bad of [undefined, null, 42, {}]) {
|
|
109
|
+
const { candidate, warning } = buildMeasuredCandidate({
|
|
110
|
+
id: 'bad.md',
|
|
111
|
+
content: bad,
|
|
112
|
+
disposition: 'selected',
|
|
113
|
+
reason: 'r',
|
|
114
|
+
});
|
|
115
|
+
expect(warning).toContain('bad.md');
|
|
116
|
+
expect(candidate.bytes).toBeUndefined();
|
|
117
|
+
expect(candidate.approxTokens).toBeUndefined();
|
|
118
|
+
expect(candidate.fingerprint).toBeUndefined();
|
|
119
|
+
// The degraded row is still schema-valid inside a manifest — the whole
|
|
120
|
+
// point: one malformed hit must not cost the row (H-7's failure shape).
|
|
121
|
+
expect(SelectionCandidateSchema.safeParse(candidate).success).toBe(true);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
// ─── Schema strictness (the refute-condition guard) ─────
|
|
126
|
+
describe('schema strictness', () => {
|
|
127
|
+
it('rejects an unknown top-level field (e.g. a shared score)', () => {
|
|
128
|
+
const row = buildSelectionManifestRow(baseInput());
|
|
129
|
+
const poisoned = { ...row, sharedRelevanceScore: 0.9 };
|
|
130
|
+
expect(SelectionManifestRowSchema.safeParse(poisoned).success).toBe(false);
|
|
131
|
+
});
|
|
132
|
+
it('rejects an unknown per-candidate field', () => {
|
|
133
|
+
const row = buildSelectionManifestRow(baseInput());
|
|
134
|
+
const poisoned = {
|
|
135
|
+
...row,
|
|
136
|
+
candidates: [{ ...row.candidates[0], commonWeight: 1 }],
|
|
137
|
+
};
|
|
138
|
+
expect(SelectionManifestRowSchema.safeParse(poisoned).success).toBe(false);
|
|
139
|
+
});
|
|
140
|
+
it('rejects a row whose costBasis does not name the ruled aggregation', () => {
|
|
141
|
+
const row = buildSelectionManifestRow(baseInput());
|
|
142
|
+
const poisoned = { ...row, costBasis: { bytes: 'utf8-length', approxTokens: 'measured' } };
|
|
143
|
+
expect(SelectionManifestRowSchema.safeParse(poisoned).success).toBe(false);
|
|
144
|
+
});
|
|
145
|
+
it('rejects a shared score smuggled through CONTEXT — the key space is closed (PR #2625 CR round)', () => {
|
|
146
|
+
const row = buildSelectionManifestRow(baseInput());
|
|
147
|
+
const poisoned = { ...row, context: { ...row.context, sharedRelevanceScore: 0.9 } };
|
|
148
|
+
expect(SelectionManifestRowSchema.safeParse(poisoned).success).toBe(false);
|
|
149
|
+
const weighted = { ...row, context: { ...row.context, commonWeight: 1 } };
|
|
150
|
+
expect(SelectionManifestRowSchema.safeParse(weighted).success).toBe(false);
|
|
151
|
+
});
|
|
152
|
+
it('rejects partial measurement states — the trio travels together (PR #2625 CR round)', () => {
|
|
153
|
+
// bytes without fingerprint
|
|
154
|
+
expect(SelectionCandidateSchema.safeParse(baseCandidate({ bytes: 5, approxTokens: 2 })).success).toBe(false);
|
|
155
|
+
// fingerprint without cost
|
|
156
|
+
expect(SelectionCandidateSchema.safeParse(baseCandidate({ fingerprint: 'c'.repeat(16) })).success).toBe(false);
|
|
157
|
+
});
|
|
158
|
+
it('rejects deliveredBytes outside a truncated row, and a delivery larger than the measurement', () => {
|
|
159
|
+
expect(SelectionCandidateSchema.safeParse(baseCandidate({ disposition: 'excluded', deliveredBytes: 4 })).success).toBe(false);
|
|
160
|
+
expect(SelectionCandidateSchema.safeParse(baseCandidate({
|
|
161
|
+
disposition: 'truncated',
|
|
162
|
+
bytes: 10,
|
|
163
|
+
approxTokens: 3,
|
|
164
|
+
fingerprint: 'd'.repeat(16),
|
|
165
|
+
deliveredBytes: 11,
|
|
166
|
+
})).success).toBe(false);
|
|
167
|
+
});
|
|
168
|
+
it('accepts a fully-populated row round-trip', () => {
|
|
169
|
+
const row = buildSelectionManifestRow(baseInput({
|
|
170
|
+
finalTruncation: { cap: 10_000, totalChars: 12_345, applied: true },
|
|
171
|
+
candidates: [
|
|
172
|
+
baseCandidate({ bytes: 5, approxTokens: 2, fingerprint: 'a'.repeat(16) }),
|
|
173
|
+
baseCandidate({
|
|
174
|
+
id: 'b.md',
|
|
175
|
+
disposition: 'truncated',
|
|
176
|
+
reason: 'display-cap 250 lines',
|
|
177
|
+
bytes: 100,
|
|
178
|
+
approxTokens: 25,
|
|
179
|
+
fingerprint: 'b'.repeat(16),
|
|
180
|
+
deliveredBytes: 40,
|
|
181
|
+
}),
|
|
182
|
+
baseCandidate({ id: 'c.md', disposition: 'excluded', reason: 'recency-policy' }),
|
|
183
|
+
],
|
|
184
|
+
}));
|
|
185
|
+
const parsed = SelectionManifestRowSchema.safeParse(JSON.parse(JSON.stringify(row)));
|
|
186
|
+
expect(parsed.success).toBe(true);
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
// ─── Attribution ────────────────────────────────────────
|
|
190
|
+
describe('attribution', () => {
|
|
191
|
+
it('stamps absence when env and session pointer are absent — never guesses', () => {
|
|
192
|
+
const row = buildSelectionManifestRow(baseInput());
|
|
193
|
+
expect(row.session_id).toBeUndefined();
|
|
194
|
+
expect(row.agent_source).toBeUndefined();
|
|
195
|
+
expect(row.costBasis).toEqual(SELECTION_COST_BASIS);
|
|
196
|
+
expect(row.timestamp).toBe(new Date(T0).toISOString());
|
|
197
|
+
});
|
|
198
|
+
it('stamps seat and session when both are present', () => {
|
|
199
|
+
fs.mkdirSync(path.join(totemDir, 'ledger'), { recursive: true });
|
|
200
|
+
fs.writeFileSync(path.join(totemDir, 'ledger', '.session-id'), SESSION_A, 'utf-8');
|
|
201
|
+
const row = buildSelectionManifestRow(baseInput({ env: { TOTEM_SELF_AGENT: 'totem-claude' } }));
|
|
202
|
+
expect(row.session_id).toBe(SESSION_A);
|
|
203
|
+
expect(row.agent_source).toBe('totem-claude');
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
// ─── Attribution provenance + fail-closed conflict (mmnto-ai/totem#2629) ──
|
|
207
|
+
describe('attribution provenance (#2629)', () => {
|
|
208
|
+
const SESSION_B = '550e8400-e29b-41d4-a716-446655440009';
|
|
209
|
+
/** Pointer at SESSION_A, minted by `mintSeat` — the contamination fixture. */
|
|
210
|
+
function pointerMintedBy(mintSeat) {
|
|
211
|
+
fs.mkdirSync(path.join(totemDir, 'ledger'), { recursive: true });
|
|
212
|
+
fs.writeFileSync(path.join(totemDir, 'ledger', '.session-id'), SESSION_A, 'utf-8');
|
|
213
|
+
fs.writeFileSync(path.join(totemDir, 'ledger', 'events.ndjson'), JSON.stringify({
|
|
214
|
+
timestamp: '2026-08-12T03:03:00.000Z',
|
|
215
|
+
type: 'session_start',
|
|
216
|
+
activity_name: 'SessionStart',
|
|
217
|
+
source: 'bot',
|
|
218
|
+
justification: '',
|
|
219
|
+
session_id: SESSION_A,
|
|
220
|
+
agent_source: mintSeat,
|
|
221
|
+
}) + '\n', 'utf-8');
|
|
222
|
+
}
|
|
223
|
+
it('stamps provenance on every row — the env/absent biconditional', () => {
|
|
224
|
+
expect(buildSelectionManifestRow(baseInput()).agent_source_provenance).toBe('absent');
|
|
225
|
+
const seated = buildSelectionManifestRow(baseInput({ env: { TOTEM_SELF_AGENT: 'totem-claude' } }));
|
|
226
|
+
expect(seated.agent_source).toBe('totem-claude');
|
|
227
|
+
expect(seated.agent_source_provenance).toBe('env');
|
|
228
|
+
});
|
|
229
|
+
it('FAIL-CLOSED: env seat ≠ pointer minting seat → stamp neither, name both — and the row is still written', () => {
|
|
230
|
+
pointerMintedBy('totem-claude');
|
|
231
|
+
const result = appendSelectionManifest(baseInput({ env: { TOTEM_SELF_AGENT: 'totem-gemini' } }));
|
|
232
|
+
expect(result.written).toBe(true); // fail-closed scopes to attribution, never the operation
|
|
233
|
+
const rows = readSelectionManifests(totemDir);
|
|
234
|
+
expect(rows).toHaveLength(1);
|
|
235
|
+
expect(rows[0].agent_source).toBeUndefined();
|
|
236
|
+
expect(rows[0].agent_source_provenance).toBe('absent');
|
|
237
|
+
expect(rows[0].session_id).toBe(SESSION_A);
|
|
238
|
+
expect(rows[0].attribution_conflict).toEqual({
|
|
239
|
+
env_seat: 'totem-gemini',
|
|
240
|
+
minting_seat: 'totem-claude',
|
|
241
|
+
pointer_session_id: SESSION_A,
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
it('a self-minted row never RUNS the probe — asserted on the fs, not just the outcome', () => {
|
|
245
|
+
pointerMintedBy('totem-claude');
|
|
246
|
+
// Outcome-only assertion would pass even if the probe ran and was ignored
|
|
247
|
+
// (leg finding on this PR) — so assert the events.ndjson read never fires.
|
|
248
|
+
const realRead = fs.readFileSync.bind(fs);
|
|
249
|
+
const eventsReads = [];
|
|
250
|
+
vi.spyOn(fs, 'readFileSync').mockImplementation(((target, ...rest) => {
|
|
251
|
+
if (String(target).endsWith('events.ndjson'))
|
|
252
|
+
eventsReads.push(String(target));
|
|
253
|
+
return realRead(target, ...rest);
|
|
254
|
+
}));
|
|
255
|
+
const row = buildSelectionManifestRow(baseInput({ env: { TOTEM_SELF_AGENT: 'totem-gemini' }, sessionId: SESSION_B }));
|
|
256
|
+
expect(eventsReads).toEqual([]);
|
|
257
|
+
expect(row.session_id).toBe(SESSION_B);
|
|
258
|
+
expect(row.agent_source).toBe('totem-gemini');
|
|
259
|
+
expect(row.agent_source_provenance).toBe('env');
|
|
260
|
+
expect(row.attribution_conflict).toBeUndefined();
|
|
261
|
+
});
|
|
262
|
+
it('a failed conflict probe keeps the env stamp and names itself on the row, the returned warnings, AND onWarn', () => {
|
|
263
|
+
pointerMintedBy('totem-claude');
|
|
264
|
+
const realRead = fs.readFileSync.bind(fs);
|
|
265
|
+
vi.spyOn(fs, 'readFileSync').mockImplementation(((target, ...rest) => {
|
|
266
|
+
if (String(target).endsWith('events.ndjson')) {
|
|
267
|
+
const err = new Error('EACCES: permission denied');
|
|
268
|
+
err.code = 'EACCES';
|
|
269
|
+
throw err;
|
|
270
|
+
}
|
|
271
|
+
return realRead(target, ...rest);
|
|
272
|
+
}));
|
|
273
|
+
// Through the SENSE wrapper deliberately: the leg on this PR proved the
|
|
274
|
+
// row-only assertion passes with onWarn never firing (a builder-appended
|
|
275
|
+
// warning lived only on the persisted row). All three surfaces asserted —
|
|
276
|
+
// and with a caller-supplied warning in play, EXACT shape: the re-adopt
|
|
277
|
+
// must neither drop nor duplicate it (its truncate-and-refill is the
|
|
278
|
+
// guard; this pins it).
|
|
279
|
+
const surfaced = [];
|
|
280
|
+
const result = senseSelectionManifest(baseInput({ env: { TOTEM_SELF_AGENT: 'totem-gemini' }, warnings: ['pre-existing'] }), (w) => surfaced.push(w));
|
|
281
|
+
expect(result.written).toBe(true);
|
|
282
|
+
expect(result.warnings).toHaveLength(2);
|
|
283
|
+
expect(result.warnings[0]).toBe('pre-existing');
|
|
284
|
+
expect(result.warnings[1]).toContain('attribution conflict probe failed');
|
|
285
|
+
expect(surfaced).toEqual(result.warnings);
|
|
286
|
+
const rows = readSelectionManifests(totemDir);
|
|
287
|
+
expect(rows).toHaveLength(1);
|
|
288
|
+
expect(rows[0].agent_source).toBe('totem-gemini');
|
|
289
|
+
expect(rows[0].agent_source_provenance).toBe('env');
|
|
290
|
+
expect(rows[0].attribution_probe_error).toContain('EACCES');
|
|
291
|
+
});
|
|
292
|
+
it('pre-sensor rows stay parseable — the additive-optional migration shape', () => {
|
|
293
|
+
const modern = buildSelectionManifestRow(baseInput());
|
|
294
|
+
const legacy = JSON.parse(JSON.stringify(modern));
|
|
295
|
+
delete legacy.agent_source_provenance;
|
|
296
|
+
expect(SelectionManifestRowSchema.safeParse(legacy).success).toBe(true);
|
|
297
|
+
});
|
|
298
|
+
it('the conflict disclosure is strict — no field can be smuggled into it', () => {
|
|
299
|
+
pointerMintedBy('totem-claude');
|
|
300
|
+
const row = buildSelectionManifestRow(baseInput({ env: { TOTEM_SELF_AGENT: 'totem-gemini' } }));
|
|
301
|
+
const poisoned = {
|
|
302
|
+
...row,
|
|
303
|
+
attribution_conflict: { ...row.attribution_conflict, sharedRelevanceScore: 0.9 },
|
|
304
|
+
};
|
|
305
|
+
expect(SelectionManifestRowSchema.safeParse(poisoned).success).toBe(false);
|
|
306
|
+
});
|
|
307
|
+
});
|
|
308
|
+
// ─── Writer ─────────────────────────────────────────────
|
|
309
|
+
describe('appendSelectionManifest', () => {
|
|
310
|
+
it('writes a schema-valid NDJSON row that readSelectionManifests round-trips', () => {
|
|
311
|
+
const result = appendSelectionManifest(baseInput());
|
|
312
|
+
expect(result.written).toBe(true);
|
|
313
|
+
expect(result.warnings).toEqual([]);
|
|
314
|
+
const rows = readSelectionManifests(totemDir);
|
|
315
|
+
expect(rows).toHaveLength(1);
|
|
316
|
+
expect(rows[0]).toMatchObject({
|
|
317
|
+
schemaVersion: 1,
|
|
318
|
+
emitter: 'search_knowledge',
|
|
319
|
+
universe: 'test-pool',
|
|
320
|
+
});
|
|
321
|
+
});
|
|
322
|
+
it('skips silently (no directory materialised) outside an instrumented project', () => {
|
|
323
|
+
const bare = path.join(tmpDir, 'not-a-project', '.totem');
|
|
324
|
+
const result = appendSelectionManifest(baseInput({ totemDir: bare }));
|
|
325
|
+
expect(result).toMatchObject({ written: false, skipped: true, warnings: [] });
|
|
326
|
+
expect(fs.existsSync(bare)).toBe(false);
|
|
327
|
+
});
|
|
328
|
+
it('THROWS the contract error on a schema-invalid row instead of persisting it', () => {
|
|
329
|
+
const input = baseInput({
|
|
330
|
+
candidates: [baseCandidate({ reason: '' })], // violates min(1)
|
|
331
|
+
});
|
|
332
|
+
expect(() => appendSelectionManifest(input)).toThrowError(TotemError);
|
|
333
|
+
try {
|
|
334
|
+
appendSelectionManifest(input);
|
|
335
|
+
}
|
|
336
|
+
catch (err) {
|
|
337
|
+
expect(err.code).toBe('SELECTION_MANIFEST_CONTRACT');
|
|
338
|
+
}
|
|
339
|
+
expect(fs.existsSync(manifestPath())).toBe(false);
|
|
340
|
+
});
|
|
341
|
+
it('degrades to a NAMED warning when the append itself fails (EACCES)', () => {
|
|
342
|
+
const spy = vi.spyOn(fs, 'appendFileSync').mockImplementation(() => {
|
|
343
|
+
const err = new Error('EACCES: permission denied');
|
|
344
|
+
err.code = 'EACCES';
|
|
345
|
+
throw err;
|
|
346
|
+
});
|
|
347
|
+
const result = appendSelectionManifest(baseInput());
|
|
348
|
+
spy.mockRestore();
|
|
349
|
+
expect(result.written).toBe(false);
|
|
350
|
+
expect(result.warnings.some((w) => w.includes('append failed') && w.includes('EACCES'))).toBe(true);
|
|
351
|
+
});
|
|
352
|
+
});
|
|
353
|
+
// ─── Sensor wrapper (Tenet 13) ──────────────────────────
|
|
354
|
+
describe('senseSelectionManifest', () => {
|
|
355
|
+
it('converts the contract throw into a warning and never propagates', () => {
|
|
356
|
+
const warnings = [];
|
|
357
|
+
const result = senseSelectionManifest(baseInput({ candidates: [baseCandidate({ reason: '' })] }), (w) => warnings.push(w));
|
|
358
|
+
expect(result.written).toBe(false);
|
|
359
|
+
expect(warnings.some((w) => w.includes('selection-manifest sensor failed'))).toBe(true);
|
|
360
|
+
});
|
|
361
|
+
it('surfaces writer warnings through onWarn on the degraded path', () => {
|
|
362
|
+
const spy = vi.spyOn(fs, 'appendFileSync').mockImplementation(() => {
|
|
363
|
+
throw new Error('disk full');
|
|
364
|
+
});
|
|
365
|
+
const warnings = [];
|
|
366
|
+
const result = senseSelectionManifest(baseInput(), (w) => warnings.push(w));
|
|
367
|
+
spy.mockRestore();
|
|
368
|
+
expect(result.written).toBe(false);
|
|
369
|
+
expect(warnings.some((w) => w.includes('append failed'))).toBe(true);
|
|
370
|
+
});
|
|
371
|
+
it('healthy control: writes clean, no warnings surfaced', () => {
|
|
372
|
+
const warnings = [];
|
|
373
|
+
const result = senseSelectionManifest(baseInput(), (w) => warnings.push(w));
|
|
374
|
+
expect(result.written).toBe(true);
|
|
375
|
+
expect(warnings).toEqual([]);
|
|
376
|
+
});
|
|
377
|
+
it('contains a THROWING onWarn sink — the accounting channel can never fail the command (PR #2625 CR round)', () => {
|
|
378
|
+
const spy = vi.spyOn(fs, 'appendFileSync').mockImplementation(() => {
|
|
379
|
+
throw new Error('disk full');
|
|
380
|
+
});
|
|
381
|
+
const result = senseSelectionManifest(baseInput(), () => {
|
|
382
|
+
throw new Error('sink exploded');
|
|
383
|
+
});
|
|
384
|
+
spy.mockRestore();
|
|
385
|
+
// No throw escaped, and the warning survives in the returned array.
|
|
386
|
+
expect(result.written).toBe(false);
|
|
387
|
+
expect(result.warnings.some((w) => w.includes('append failed'))).toBe(true);
|
|
388
|
+
});
|
|
389
|
+
});
|
|
390
|
+
// ─── Probe failures (PR #2625 CR round) ─────────────────
|
|
391
|
+
describe('instrumented-project probe', () => {
|
|
392
|
+
it('a non-ENOENT probe failure (EACCES) is a NAMED skip, never a silent not-a-project', () => {
|
|
393
|
+
const spy = vi.spyOn(fs, 'statSync').mockImplementation(() => {
|
|
394
|
+
const err = new Error('EACCES: permission denied');
|
|
395
|
+
err.code = 'EACCES';
|
|
396
|
+
throw err;
|
|
397
|
+
});
|
|
398
|
+
const warnings = [];
|
|
399
|
+
const result = senseSelectionManifest(baseInput(), (w) => warnings.push(w));
|
|
400
|
+
spy.mockRestore();
|
|
401
|
+
expect(result).toMatchObject({ written: false, skipped: true });
|
|
402
|
+
expect(warnings.some((w) => w.includes('.totem probe failed'))).toBe(true);
|
|
403
|
+
});
|
|
404
|
+
});
|
|
405
|
+
// ─── Session override (PR #2625 CR round, partial) ──────
|
|
406
|
+
describe('sessionId override', () => {
|
|
407
|
+
it('a minting emitter stamps its own UUID instead of the shared pointer', () => {
|
|
408
|
+
fs.mkdirSync(path.join(totemDir, 'ledger'), { recursive: true });
|
|
409
|
+
fs.writeFileSync(path.join(totemDir, 'ledger', '.session-id'), SESSION_A, 'utf-8');
|
|
410
|
+
const other = '550e8400-e29b-41d4-a716-446655440009';
|
|
411
|
+
const row = buildSelectionManifestRow(baseInput({ sessionId: other }));
|
|
412
|
+
expect(row.session_id).toBe(other);
|
|
413
|
+
// Without the override the pointer still governs.
|
|
414
|
+
expect(buildSelectionManifestRow(baseInput()).session_id).toBe(SESSION_A);
|
|
415
|
+
});
|
|
416
|
+
});
|
|
417
|
+
// ─── Reader ─────────────────────────────────────────────
|
|
418
|
+
describe('readSelectionManifests', () => {
|
|
419
|
+
it('returns [] on ENOENT and skips malformed / schema-invalid lines, reporting the malformed count', () => {
|
|
420
|
+
expect(readSelectionManifests(totemDir)).toEqual([]);
|
|
421
|
+
appendSelectionManifest(baseInput());
|
|
422
|
+
fs.appendFileSync(manifestPath(), 'not json\n{"schemaVersion":99}\n', 'utf-8');
|
|
423
|
+
const warnings = [];
|
|
424
|
+
const rows = readSelectionManifests(totemDir, (w) => warnings.push(w));
|
|
425
|
+
expect(rows).toHaveLength(1);
|
|
426
|
+
// One AGGREGATE warning for the malformed-JSON line — never a firehose
|
|
427
|
+
// (PR #2625 CR round); the schema-invalid-but-parseable line stays under
|
|
428
|
+
// the generic-consumer skip contract.
|
|
429
|
+
expect(warnings.filter((w) => w.includes('malformed'))).toHaveLength(1);
|
|
430
|
+
expect(warnings[0]).toContain('1 malformed line(s)');
|
|
431
|
+
});
|
|
432
|
+
});
|
|
433
|
+
//# sourceMappingURL=selection-manifest.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection-manifest.test.js","sourceRoot":"","sources":["../src/selection-manifest.test.ts"],"names":[],"mappings":"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"}
|
package/dist/spine/ledgers.d.ts
CHANGED
|
@@ -370,14 +370,14 @@ export declare const ClassifierLedgerEntrySchema: z.ZodObject<{
|
|
|
370
370
|
*/
|
|
371
371
|
stage4Outcome: z.ZodOptional<z.ZodEnum<["confirmed", "untested-no-matches", "archived-out-of-scope", "compile-rejected"]>>;
|
|
372
372
|
}, "strip", z.ZodTypeAny, {
|
|
373
|
-
candidateRef: string;
|
|
374
373
|
disposition: "structural" | "behavioral";
|
|
374
|
+
candidateRef: string;
|
|
375
375
|
stage4Confirmed: boolean;
|
|
376
376
|
dispositionSource: "classified" | "error-default" | "authored-whitelist";
|
|
377
377
|
stage4Outcome?: "confirmed" | "untested-no-matches" | "archived-out-of-scope" | "compile-rejected" | undefined;
|
|
378
378
|
}, {
|
|
379
|
-
candidateRef: string;
|
|
380
379
|
disposition: "structural" | "behavioral";
|
|
380
|
+
candidateRef: string;
|
|
381
381
|
stage4Confirmed: boolean;
|
|
382
382
|
dispositionSource: "classified" | "error-default" | "authored-whitelist";
|
|
383
383
|
stage4Outcome?: "confirmed" | "untested-no-matches" | "archived-out-of-scope" | "compile-rejected" | undefined;
|
|
@@ -420,30 +420,30 @@ export declare const ClassifierLedgerSchema: z.ZodObject<{
|
|
|
420
420
|
*/
|
|
421
421
|
stage4Outcome: z.ZodOptional<z.ZodEnum<["confirmed", "untested-no-matches", "archived-out-of-scope", "compile-rejected"]>>;
|
|
422
422
|
}, "strip", z.ZodTypeAny, {
|
|
423
|
-
candidateRef: string;
|
|
424
423
|
disposition: "structural" | "behavioral";
|
|
424
|
+
candidateRef: string;
|
|
425
425
|
stage4Confirmed: boolean;
|
|
426
426
|
dispositionSource: "classified" | "error-default" | "authored-whitelist";
|
|
427
427
|
stage4Outcome?: "confirmed" | "untested-no-matches" | "archived-out-of-scope" | "compile-rejected" | undefined;
|
|
428
428
|
}, {
|
|
429
|
-
candidateRef: string;
|
|
430
429
|
disposition: "structural" | "behavioral";
|
|
430
|
+
candidateRef: string;
|
|
431
431
|
stage4Confirmed: boolean;
|
|
432
432
|
dispositionSource: "classified" | "error-default" | "authored-whitelist";
|
|
433
433
|
stage4Outcome?: "confirmed" | "untested-no-matches" | "archived-out-of-scope" | "compile-rejected" | undefined;
|
|
434
434
|
}>, "many">;
|
|
435
435
|
}, "strip", z.ZodTypeAny, {
|
|
436
436
|
entries: {
|
|
437
|
-
candidateRef: string;
|
|
438
437
|
disposition: "structural" | "behavioral";
|
|
438
|
+
candidateRef: string;
|
|
439
439
|
stage4Confirmed: boolean;
|
|
440
440
|
dispositionSource: "classified" | "error-default" | "authored-whitelist";
|
|
441
441
|
stage4Outcome?: "confirmed" | "untested-no-matches" | "archived-out-of-scope" | "compile-rejected" | undefined;
|
|
442
442
|
}[];
|
|
443
443
|
}, {
|
|
444
444
|
entries: {
|
|
445
|
-
candidateRef: string;
|
|
446
445
|
disposition: "structural" | "behavioral";
|
|
446
|
+
candidateRef: string;
|
|
447
447
|
stage4Confirmed: boolean;
|
|
448
448
|
dispositionSource: "classified" | "error-default" | "authored-whitelist";
|
|
449
449
|
stage4Outcome?: "confirmed" | "untested-no-matches" | "archived-out-of-scope" | "compile-rejected" | undefined;
|
|
@@ -894,30 +894,30 @@ export declare const MinerLedgersSchema: z.ZodObject<{
|
|
|
894
894
|
*/
|
|
895
895
|
stage4Outcome: z.ZodOptional<z.ZodEnum<["confirmed", "untested-no-matches", "archived-out-of-scope", "compile-rejected"]>>;
|
|
896
896
|
}, "strip", z.ZodTypeAny, {
|
|
897
|
-
candidateRef: string;
|
|
898
897
|
disposition: "structural" | "behavioral";
|
|
898
|
+
candidateRef: string;
|
|
899
899
|
stage4Confirmed: boolean;
|
|
900
900
|
dispositionSource: "classified" | "error-default" | "authored-whitelist";
|
|
901
901
|
stage4Outcome?: "confirmed" | "untested-no-matches" | "archived-out-of-scope" | "compile-rejected" | undefined;
|
|
902
902
|
}, {
|
|
903
|
-
candidateRef: string;
|
|
904
903
|
disposition: "structural" | "behavioral";
|
|
904
|
+
candidateRef: string;
|
|
905
905
|
stage4Confirmed: boolean;
|
|
906
906
|
dispositionSource: "classified" | "error-default" | "authored-whitelist";
|
|
907
907
|
stage4Outcome?: "confirmed" | "untested-no-matches" | "archived-out-of-scope" | "compile-rejected" | undefined;
|
|
908
908
|
}>, "many">;
|
|
909
909
|
}, "strip", z.ZodTypeAny, {
|
|
910
910
|
entries: {
|
|
911
|
-
candidateRef: string;
|
|
912
911
|
disposition: "structural" | "behavioral";
|
|
912
|
+
candidateRef: string;
|
|
913
913
|
stage4Confirmed: boolean;
|
|
914
914
|
dispositionSource: "classified" | "error-default" | "authored-whitelist";
|
|
915
915
|
stage4Outcome?: "confirmed" | "untested-no-matches" | "archived-out-of-scope" | "compile-rejected" | undefined;
|
|
916
916
|
}[];
|
|
917
917
|
}, {
|
|
918
918
|
entries: {
|
|
919
|
-
candidateRef: string;
|
|
920
919
|
disposition: "structural" | "behavioral";
|
|
920
|
+
candidateRef: string;
|
|
921
921
|
stage4Confirmed: boolean;
|
|
922
922
|
dispositionSource: "classified" | "error-default" | "authored-whitelist";
|
|
923
923
|
stage4Outcome?: "confirmed" | "untested-no-matches" | "archived-out-of-scope" | "compile-rejected" | undefined;
|
|
@@ -1201,8 +1201,8 @@ export declare const MinerLedgersSchema: z.ZodObject<{
|
|
|
1201
1201
|
};
|
|
1202
1202
|
classifier: {
|
|
1203
1203
|
entries: {
|
|
1204
|
-
candidateRef: string;
|
|
1205
1204
|
disposition: "structural" | "behavioral";
|
|
1205
|
+
candidateRef: string;
|
|
1206
1206
|
stage4Confirmed: boolean;
|
|
1207
1207
|
dispositionSource: "classified" | "error-default" | "authored-whitelist";
|
|
1208
1208
|
stage4Outcome?: "confirmed" | "untested-no-matches" | "archived-out-of-scope" | "compile-rejected" | undefined;
|
|
@@ -1267,8 +1267,8 @@ export declare const MinerLedgersSchema: z.ZodObject<{
|
|
|
1267
1267
|
};
|
|
1268
1268
|
classifier: {
|
|
1269
1269
|
entries: {
|
|
1270
|
-
candidateRef: string;
|
|
1271
1270
|
disposition: "structural" | "behavioral";
|
|
1271
|
+
candidateRef: string;
|
|
1272
1272
|
stage4Confirmed: boolean;
|
|
1273
1273
|
dispositionSource: "classified" | "error-default" | "authored-whitelist";
|
|
1274
1274
|
stage4Outcome?: "confirmed" | "untested-no-matches" | "archived-out-of-scope" | "compile-rejected" | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verification-outcomes.d.ts","sourceRoot":"","sources":["../src/verification-outcomes.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"verification-outcomes.d.ts","sourceRoot":"","sources":["../src/verification-outcomes.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB,qFAK9B,CAAC;AAYH;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B;IACzC;;;;OAIG;;IAEH,oEAAoE;;IAEpE,sDAAsD;;IAEtD,yEAAyE;;IAEzE,kEAAkE;;IAElE;;;;OAIG;;;;;;;;;;;;;;;;EAEH,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,8BAA8B;;;QA7BzC;;;;WAIG;;QAEH,oEAAoE;;QAEpE,sDAAsD;;QAEtD,yEAAyE;;QAEzE,kEAAkE;;QAElE;;;;WAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAcH,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAC3E,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC;AACtF,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC;AAEtF;;;;;;;;GAQG;AACH,MAAM,MAAM,yBAAyB,GAAG,wBAAwB,CAAC,UAAU,CAAC,CAAC;AAI7E;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAC7B,yBAAyB,CA8C3B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,yBAAyB,GAClC,IAAI,CAYN"}
|
|
@@ -2,6 +2,7 @@ import * as fs from 'node:fs';
|
|
|
2
2
|
import * as path from 'node:path';
|
|
3
3
|
import { z } from 'zod';
|
|
4
4
|
import { canonicalStringify } from './compile-manifest.js';
|
|
5
|
+
import { writeFileAtomicSync } from './fs-atomic.js';
|
|
5
6
|
/**
|
|
6
7
|
* Stage 4 outcome literals serialized into `.totem/verification-outcomes.json`
|
|
7
8
|
* (mmnto-ai/totem#1684, ADR-091 § Bootstrap CI-first). Mirrors the
|
|
@@ -133,17 +134,10 @@ export function writeVerificationOutcomes(filePath, outcomes) {
|
|
|
133
134
|
fs.mkdirSync(dir, { recursive: true });
|
|
134
135
|
const file = { version: 1, outcomes };
|
|
135
136
|
const json = `${canonicalStringify(file, 2)}\n`;
|
|
136
|
-
//
|
|
137
|
-
//
|
|
138
|
-
//
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
fs.writeFileSync(tmpPath, json, 'utf-8');
|
|
142
|
-
fs.renameSync(tmpPath, filePath);
|
|
143
|
-
}
|
|
144
|
-
finally {
|
|
145
|
-
if (fs.existsSync(tmpPath))
|
|
146
|
-
fs.rmSync(tmpPath, { force: true });
|
|
147
|
-
}
|
|
137
|
+
// Per-write unique temp naming (two concurrent lint processes must not
|
|
138
|
+
// clobber each other's in-flight write — CR mmnto-ai/totem#1787 R1) and
|
|
139
|
+
// failure-path temp cleanup are the shared corollary helper's contract
|
|
140
|
+
// (mmnto-ai/totem#2620).
|
|
141
|
+
writeFileAtomicSync(filePath, json);
|
|
148
142
|
}
|
|
149
143
|
//# sourceMappingURL=verification-outcomes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verification-outcomes.js","sourceRoot":"","sources":["../src/verification-outcomes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"verification-outcomes.js","sourceRoot":"","sources":["../src/verification-outcomes.ts"],"names":[],"mappings":"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"}
|