@mmnto/totem 1.103.0 → 1.105.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.
Files changed (50) hide show
  1. package/dist/config-schema.d.ts +52 -0
  2. package/dist/config-schema.d.ts.map +1 -1
  3. package/dist/config-schema.js +30 -0
  4. package/dist/config-schema.js.map +1 -1
  5. package/dist/embedders/embedder.d.ts +8 -0
  6. package/dist/embedders/embedder.d.ts.map +1 -1
  7. package/dist/embedders/embedder.js +9 -1
  8. package/dist/embedders/embedder.js.map +1 -1
  9. package/dist/errors.d.ts +1 -1
  10. package/dist/errors.d.ts.map +1 -1
  11. package/dist/errors.js.map +1 -1
  12. package/dist/index.d.ts +3 -3
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +2 -2
  15. package/dist/index.js.map +1 -1
  16. package/dist/orchestration-resolver.d.ts.map +1 -1
  17. package/dist/orchestration-resolver.js +5 -1
  18. package/dist/orchestration-resolver.js.map +1 -1
  19. package/dist/orchestration-resolver.test.js +2 -2
  20. package/dist/orchestration-resolver.test.js.map +1 -1
  21. package/dist/pack-manifest-writer.test.js +1 -0
  22. package/dist/pack-manifest-writer.test.js.map +1 -1
  23. package/dist/parity-detect.d.ts +86 -0
  24. package/dist/parity-detect.d.ts.map +1 -1
  25. package/dist/parity-detect.js +595 -0
  26. package/dist/parity-detect.js.map +1 -1
  27. package/dist/parity-detect.network-posture.test.d.ts +19 -0
  28. package/dist/parity-detect.network-posture.test.d.ts.map +1 -0
  29. package/dist/parity-detect.network-posture.test.js +534 -0
  30. package/dist/parity-detect.network-posture.test.js.map +1 -0
  31. package/dist/parity-manifest.d.ts +8 -0
  32. package/dist/parity-manifest.d.ts.map +1 -1
  33. package/dist/parity-manifest.js +11 -0
  34. package/dist/parity-manifest.js.map +1 -1
  35. package/dist/parity-manifest.test.js +19 -0
  36. package/dist/parity-manifest.test.js.map +1 -1
  37. package/dist/store/lance-search.d.ts.map +1 -1
  38. package/dist/store/lance-search.js +29 -4
  39. package/dist/store/lance-search.js.map +1 -1
  40. package/dist/store/lance-search.test.js +76 -0
  41. package/dist/store/lance-search.test.js.map +1 -1
  42. package/dist/store/lance-store.d.ts.map +1 -1
  43. package/dist/store/lance-store.js +34 -3
  44. package/dist/store/lance-store.js.map +1 -1
  45. package/dist/store/lance-store.test.js +93 -0
  46. package/dist/store/lance-store.test.js.map +1 -1
  47. package/dist/types.d.ts +36 -0
  48. package/dist/types.d.ts.map +1 -1
  49. package/dist/types.js.map +1 -1
  50. package/package.json +1 -1
@@ -0,0 +1,534 @@
1
+ /**
2
+ * Tests for the Prop 296 §14 network-read-only posture detector family
3
+ * (`detectNetworkPostureContract`, strategy#962).
4
+ *
5
+ * The detector is pure + synchronous + NEVER-networks: every test injects
6
+ * PRE-FETCHED canned snapshots (the CLI-edge fetch is not exercised here) and,
7
+ * for row-2, a canned declaration via the `readFile` seam. Zero live network,
8
+ * zero gh/git spawns.
9
+ *
10
+ * Coverage (per the build brief): each row's pass; both-direction drift (missing
11
+ * context / stale extra); the contributing-ruleset-bypass case (union passes but
12
+ * a contributing ruleset is evaluate-mode / has bypass_actors → warn); a
13
+ * 200-without-fields → unknown; no-transport → skip; declaration-file-absent →
14
+ * skip; multi-repo mixed outcomes render per-repo; consumers-scoping;
15
+ * nonzero approving-count → warn; a zero-rule / copilot-class ruleset never
16
+ * satisfies presence.
17
+ */
18
+ import { describe, expect, it } from 'vitest';
19
+ import { detectNetworkPostureContract, } from './parity-detect.js';
20
+ // ─── Fixtures ───────────────────────────────────────────
21
+ function mkContract(id, consumers) {
22
+ return {
23
+ id,
24
+ dimension: 'enforcement',
25
+ canonicalSource: null,
26
+ detectionMethod: 'network-read-only probe',
27
+ expectedValueOrDerivation: 'posture holds',
28
+ tractability: 'mechanical',
29
+ trackingIssue: 'mmnto-ai/totem-strategy#482',
30
+ manifestation: 'capability-probe',
31
+ probeClass: 'network-read-only',
32
+ ...(consumers !== undefined ? { consumers } : {}),
33
+ };
34
+ }
35
+ const okRepoSettings = {
36
+ outcome: 'ok',
37
+ data: {
38
+ allow_squash_merge: true,
39
+ allow_merge_commit: false,
40
+ allow_rebase_merge: false,
41
+ squash_merge_commit_message: 'BLANK',
42
+ squash_merge_commit_title: 'PR_TITLE',
43
+ delete_branch_on_merge: true,
44
+ },
45
+ };
46
+ /** A conformant required-status-checks ruleset carrying the given contexts. */
47
+ function statusCheckRuleset(name, contexts, overrides = {}) {
48
+ return {
49
+ id: name.length,
50
+ name,
51
+ enforcement: 'active',
52
+ conditions: { ref_name: { include: ['~DEFAULT_BRANCH'], exclude: [] } },
53
+ bypass_actors: [],
54
+ rules: [
55
+ {
56
+ type: 'required_status_checks',
57
+ parameters: {
58
+ required_status_checks: contexts.map((c) => ({ context: c })),
59
+ strict_required_status_checks_policy: false,
60
+ },
61
+ },
62
+ ],
63
+ ...overrides,
64
+ };
65
+ }
66
+ const CANONICAL_CONTEXTS = ['Totem Lint', 'Build & Lint (ubuntu-latest)'];
67
+ const declarationJson = JSON.stringify({
68
+ 'schema-version': 1,
69
+ 'ruleset-name': 'main-required-checks',
70
+ enforcement: 'active',
71
+ bypass_actors: [],
72
+ required_status_checks: {
73
+ strict_required_status_checks_policy: false,
74
+ contexts: CANONICAL_CONTEXTS,
75
+ },
76
+ });
77
+ const okBranchProtection = {
78
+ outcome: 'ok',
79
+ data: {
80
+ required_pull_request_reviews: { required_approving_review_count: 0 },
81
+ enforce_admins: { enabled: true },
82
+ allow_force_pushes: { enabled: false },
83
+ allow_deletions: { enabled: false },
84
+ },
85
+ };
86
+ function snapshot(repoSlug, repoId, surfaces) {
87
+ return { repoSlug, repoId, surfaces };
88
+ }
89
+ /** row-2 ctx with a canned declaration read (default = the conformant canonical). */
90
+ function checksCtx(repos, declaration = declarationJson) {
91
+ return {
92
+ row: 'repo-required-checks-posture',
93
+ repos,
94
+ declarationPath: '/repo/.totem/rulesets/main.json',
95
+ readFile: () => declaration,
96
+ };
97
+ }
98
+ // ─── Row 1: repo-merge-posture ──────────────────────────
99
+ describe('repo-merge-posture', () => {
100
+ const contract = mkContract('repo-merge-posture');
101
+ it('passes on squash-only + BLANK body + PR_TITLE title', () => {
102
+ const lines = detectNetworkPostureContract(contract, {
103
+ row: 'repo-merge-posture',
104
+ repos: [snapshot('mmnto-ai/totem', 'totem', { repoSettings: okRepoSettings })],
105
+ });
106
+ expect(lines).toHaveLength(1);
107
+ expect(lines[0]?.verdict.status).toBe('pass');
108
+ expect(lines[0]?.lineName).toContain('mmnto-ai/totem');
109
+ });
110
+ it('warns on merge-commit + non-BLANK body drift', () => {
111
+ const drifted = {
112
+ outcome: 'ok',
113
+ data: {
114
+ allow_squash_merge: true,
115
+ allow_merge_commit: true,
116
+ allow_rebase_merge: false,
117
+ squash_merge_commit_message: 'COMMIT_MESSAGES',
118
+ squash_merge_commit_title: 'PR_TITLE',
119
+ },
120
+ };
121
+ const lines = detectNetworkPostureContract(contract, {
122
+ row: 'repo-merge-posture',
123
+ repos: [snapshot('mmnto-ai/totem', 'totem', { repoSettings: drifted })],
124
+ });
125
+ expect(lines[0]?.verdict.status).toBe('warn');
126
+ expect(lines[0]?.verdict.message).toContain('allow_merge_commit');
127
+ expect(lines[0]?.verdict.message).toContain('squash_merge_commit_message');
128
+ });
129
+ it('is unknown (auth-class) on a 200 without the posture fields', () => {
130
+ const shy = { outcome: 'ok', data: { full_name: 'mmnto-ai/totem' } };
131
+ const lines = detectNetworkPostureContract(contract, {
132
+ row: 'repo-merge-posture',
133
+ repos: [snapshot('mmnto-ai/totem', 'totem', { repoSettings: shy })],
134
+ });
135
+ expect(lines[0]?.verdict.status).toBe('unknown');
136
+ expect(lines[0]?.verdict.message).toContain('auth-class');
137
+ });
138
+ it('skips on no-transport (offline)', () => {
139
+ const lines = detectNetworkPostureContract(contract, {
140
+ row: 'repo-merge-posture',
141
+ repos: [snapshot('mmnto-ai/totem', 'totem', { repoSettings: { outcome: 'no-transport' } })],
142
+ });
143
+ expect(lines[0]?.verdict.status).toBe('skip');
144
+ expect(lines[0]?.verdict.message).toContain('§14 clause 4');
145
+ });
146
+ it('is unknown on an auth-class outcome (never a drift verdict)', () => {
147
+ const lines = detectNetworkPostureContract(contract, {
148
+ row: 'repo-merge-posture',
149
+ repos: [
150
+ snapshot('mmnto-ai/totem', 'totem', {
151
+ repoSettings: { outcome: 'auth', detail: 'HTTP 401' },
152
+ }),
153
+ ],
154
+ });
155
+ expect(lines[0]?.verdict.status).toBe('unknown');
156
+ expect(lines[0]?.verdict.message).not.toContain('drift');
157
+ });
158
+ it('renders per-repo lines with mixed outcomes across a multi-repo roster', () => {
159
+ const lines = detectNetworkPostureContract(contract, {
160
+ row: 'repo-merge-posture',
161
+ repos: [
162
+ snapshot('mmnto-ai/totem', 'totem', { repoSettings: okRepoSettings }),
163
+ snapshot('mmnto-ai/totem-strategy', 'totem-strategy', {
164
+ repoSettings: { outcome: 'auth', detail: 'HTTP 403' },
165
+ }),
166
+ ],
167
+ });
168
+ expect(lines).toHaveLength(2);
169
+ expect(lines[0]?.verdict.status).toBe('pass');
170
+ expect(lines[1]?.verdict.status).toBe('unknown');
171
+ expect(lines[1]?.lineName).toContain('mmnto-ai/totem-strategy');
172
+ });
173
+ });
174
+ // ─── Row 2: repo-required-checks-posture ────────────────
175
+ describe('repo-required-checks-posture', () => {
176
+ const contract = mkContract('repo-required-checks-posture', ['totem']);
177
+ function rulesetsOk(details) {
178
+ return { rulesets: { outcome: 'ok', data: details } };
179
+ }
180
+ it('passes when the active-ruleset union set-equals the canonical list', () => {
181
+ const repos = [
182
+ snapshot('mmnto-ai/totem', 'totem', rulesetsOk([statusCheckRuleset('main-required-checks', CANONICAL_CONTEXTS)])),
183
+ ];
184
+ const lines = detectNetworkPostureContract(contract, checksCtx(repos));
185
+ expect(lines).toHaveLength(1);
186
+ expect(lines[0]?.verdict.status).toBe('pass');
187
+ });
188
+ it('unions checks across TWO rulesets (a second ruleset must not be invisible)', () => {
189
+ const repos = [
190
+ snapshot('mmnto-ai/totem', 'totem', rulesetsOk([
191
+ statusCheckRuleset('rs-1', ['Totem Lint']),
192
+ statusCheckRuleset('rs-2', ['Build & Lint (ubuntu-latest)']),
193
+ ])),
194
+ ];
195
+ const lines = detectNetworkPostureContract(contract, checksCtx(repos));
196
+ expect(lines[0]?.verdict.status).toBe('pass');
197
+ });
198
+ it('warns on a MISSING canonical check (re-opens the gated vector)', () => {
199
+ const repos = [
200
+ snapshot('mmnto-ai/totem', 'totem', rulesetsOk([statusCheckRuleset('rs', ['Totem Lint'])])),
201
+ ];
202
+ const lines = detectNetworkPostureContract(contract, checksCtx(repos));
203
+ expect(lines[0]?.verdict.status).toBe('warn');
204
+ expect(lines[0]?.verdict.message).toContain('missing required check');
205
+ expect(lines[0]?.verdict.message).toContain('Build & Lint (ubuntu-latest)');
206
+ });
207
+ it('warns on a STALE EXTRA required check (silent merge-block)', () => {
208
+ const repos = [
209
+ snapshot('mmnto-ai/totem', 'totem', rulesetsOk([statusCheckRuleset('rs', [...CANONICAL_CONTEXTS, 'Retired Check'])])),
210
+ ];
211
+ const lines = detectNetworkPostureContract(contract, checksCtx(repos));
212
+ expect(lines[0]?.verdict.status).toBe('warn');
213
+ expect(lines[0]?.verdict.message).toContain('stale extra');
214
+ expect(lines[0]?.verdict.message).toContain('Retired Check');
215
+ });
216
+ it('returns unknown (never pass) when a contributing ruleset omits strict_required_status_checks_policy', () => {
217
+ const repos = [
218
+ snapshot('mmnto-ai/totem', 'totem', rulesetsOk([
219
+ statusCheckRuleset('rs-shy', CANONICAL_CONTEXTS, {
220
+ rules: [
221
+ {
222
+ type: 'required_status_checks',
223
+ parameters: {
224
+ required_status_checks: CANONICAL_CONTEXTS.map((c) => ({ context: c })),
225
+ },
226
+ },
227
+ ],
228
+ }),
229
+ ])),
230
+ ];
231
+ const lines = detectNetworkPostureContract(contract, checksCtx(repos));
232
+ expect(lines[0]?.verdict.status).toBe('unknown');
233
+ expect(lines[0]?.verdict.message).toContain('strict_required_status_checks_policy');
234
+ expect(lines[0]?.verdict.message).toContain('auth-class');
235
+ });
236
+ it('returns unknown (never pass) when a contributing ruleset detail omits bypass_actors', () => {
237
+ const repos = [
238
+ snapshot('mmnto-ai/totem', 'totem', rulesetsOk([
239
+ statusCheckRuleset('rs-no-bypass-field', CANONICAL_CONTEXTS, {
240
+ bypass_actors: undefined,
241
+ }),
242
+ ])),
243
+ ];
244
+ const lines = detectNetworkPostureContract(contract, checksCtx(repos));
245
+ expect(lines[0]?.verdict.status).toBe('unknown');
246
+ expect(lines[0]?.verdict.message).toContain('bypass_actors');
247
+ });
248
+ it('observed drift OUTRANKS a field-shy sibling (warn wins over unknown)', () => {
249
+ const repos = [
250
+ snapshot('mmnto-ai/totem', 'totem', rulesetsOk([
251
+ statusCheckRuleset('rs-shy', ['Totem Lint'], { bypass_actors: undefined }),
252
+ statusCheckRuleset('rs-evaluate', ['Build & Lint (ubuntu-latest)'], {
253
+ enforcement: 'evaluate',
254
+ }),
255
+ ])),
256
+ ];
257
+ const lines = detectNetworkPostureContract(contract, checksCtx(repos));
258
+ expect(lines[0]?.verdict.status).toBe('warn');
259
+ expect(lines[0]?.verdict.message).toContain('rs-evaluate');
260
+ });
261
+ it('warns when a contributing ruleset is EVALUATE-mode (union passes but is bypassable)', () => {
262
+ const repos = [
263
+ snapshot('mmnto-ai/totem', 'totem', rulesetsOk([
264
+ statusCheckRuleset('rs-active', ['Totem Lint']),
265
+ statusCheckRuleset('rs-evaluate', ['Build & Lint (ubuntu-latest)'], {
266
+ enforcement: 'evaluate',
267
+ }),
268
+ ])),
269
+ ];
270
+ const lines = detectNetworkPostureContract(contract, checksCtx(repos));
271
+ expect(lines[0]?.verdict.status).toBe('warn');
272
+ expect(lines[0]?.verdict.message).toContain('rs-evaluate');
273
+ expect(lines[0]?.verdict.message).toContain('enforcement=evaluate');
274
+ });
275
+ it('warns when a contributing ruleset has BYPASS_ACTORS (union passes but bypassable)', () => {
276
+ const repos = [
277
+ snapshot('mmnto-ai/totem', 'totem', rulesetsOk([
278
+ statusCheckRuleset('rs-bypass', CANONICAL_CONTEXTS, {
279
+ bypass_actors: [{ actor_id: 5, actor_type: 'Team' }],
280
+ }),
281
+ ])),
282
+ ];
283
+ const lines = detectNetworkPostureContract(contract, checksCtx(repos));
284
+ expect(lines[0]?.verdict.status).toBe('warn');
285
+ expect(lines[0]?.verdict.message).toContain('bypassable');
286
+ });
287
+ it('warns on a strict-policy mismatch on a contributing ruleset', () => {
288
+ const repos = [
289
+ snapshot('mmnto-ai/totem', 'totem', rulesetsOk([
290
+ statusCheckRuleset('rs', CANONICAL_CONTEXTS, {
291
+ rules: [
292
+ {
293
+ type: 'required_status_checks',
294
+ parameters: {
295
+ required_status_checks: CANONICAL_CONTEXTS.map((c) => ({ context: c })),
296
+ strict_required_status_checks_policy: true,
297
+ },
298
+ },
299
+ ],
300
+ }),
301
+ ])),
302
+ ];
303
+ const lines = detectNetworkPostureContract(contract, checksCtx(repos));
304
+ expect(lines[0]?.verdict.status).toBe('warn');
305
+ expect(lines[0]?.verdict.message).toContain('strict_required_status_checks_policy');
306
+ });
307
+ it('a zero-rule / copilot-class ruleset never satisfies presence', () => {
308
+ const copilotClass = {
309
+ id: 9,
310
+ name: 'copilot-review',
311
+ enforcement: 'active',
312
+ conditions: { ref_name: { include: ['~DEFAULT_BRANCH'], exclude: [] } },
313
+ bypass_actors: [],
314
+ rules: [{ type: 'code_scanning', parameters: {} }],
315
+ };
316
+ const repos = [snapshot('mmnto-ai/totem', 'totem', rulesetsOk([copilotClass]))];
317
+ const lines = detectNetworkPostureContract(contract, checksCtx(repos));
318
+ expect(lines[0]?.verdict.status).toBe('warn');
319
+ expect(lines[0]?.verdict.message).toContain('missing required check');
320
+ });
321
+ it('skips when the canonical declaration file is absent', () => {
322
+ const repos = [
323
+ snapshot('mmnto-ai/totem', 'totem', rulesetsOk([statusCheckRuleset('rs', CANONICAL_CONTEXTS)])),
324
+ ];
325
+ // readFile returns undefined = the declaration file is not on disk yet.
326
+ const lines = detectNetworkPostureContract(contract, {
327
+ row: 'repo-required-checks-posture',
328
+ repos,
329
+ declarationPath: '/repo/.totem/rulesets/main.json',
330
+ readFile: () => undefined,
331
+ });
332
+ expect(lines[0]?.verdict.status).toBe('skip');
333
+ expect(lines[0]?.verdict.message).toContain('not yet committed');
334
+ });
335
+ it('is unknown when the declaration is unparseable (canonical underivable)', () => {
336
+ const repos = [
337
+ snapshot('mmnto-ai/totem', 'totem', rulesetsOk([statusCheckRuleset('rs', CANONICAL_CONTEXTS)])),
338
+ ];
339
+ const lines = detectNetworkPostureContract(contract, checksCtx(repos, '{ not json'));
340
+ expect(lines[0]?.verdict.status).toBe('unknown');
341
+ });
342
+ it('skips (cohort permits absence) when no roster repo is in the consumers scope', () => {
343
+ const repos = [snapshot('mmnto-ai/totem-status', 'totem-status', rulesetsOk([]))];
344
+ const lines = detectNetworkPostureContract(contract, checksCtx(repos));
345
+ expect(lines).toHaveLength(1);
346
+ expect(lines[0]?.verdict.status).toBe('skip');
347
+ expect(lines[0]?.verdict.message).toContain('totem');
348
+ });
349
+ it('skips the rulesets surface on no-transport even with a present declaration', () => {
350
+ const repos = [snapshot('mmnto-ai/totem', 'totem', { rulesets: { outcome: 'no-transport' } })];
351
+ const lines = detectNetworkPostureContract(contract, checksCtx(repos));
352
+ expect(lines[0]?.verdict.status).toBe('skip');
353
+ });
354
+ });
355
+ // ─── Row 3: repo-branch-protection-posture ──────────────
356
+ describe('repo-branch-protection-posture', () => {
357
+ const contract = mkContract('repo-branch-protection-posture', ['totem']);
358
+ it('emits TWO lines per repo (classic + rulesets) and passes both when conformant', () => {
359
+ const lines = detectNetworkPostureContract(contract, {
360
+ row: 'repo-branch-protection-posture',
361
+ repos: [
362
+ snapshot('mmnto-ai/totem', 'totem', {
363
+ branchProtection: okBranchProtection,
364
+ rulesets: { outcome: 'ok', data: [] },
365
+ }),
366
+ ],
367
+ });
368
+ expect(lines).toHaveLength(2);
369
+ expect(lines[0]?.lineName).toContain('classic');
370
+ expect(lines[1]?.lineName).toContain('rulesets');
371
+ expect(lines[0]?.verdict.status).toBe('pass');
372
+ expect(lines[1]?.verdict.status).toBe('pass');
373
+ });
374
+ it('warns on a NONZERO approving-review-count (drift from ruled 0)', () => {
375
+ const drifted = {
376
+ outcome: 'ok',
377
+ data: {
378
+ required_pull_request_reviews: { required_approving_review_count: 1 },
379
+ enforce_admins: { enabled: true },
380
+ allow_force_pushes: { enabled: false },
381
+ allow_deletions: { enabled: false },
382
+ },
383
+ };
384
+ const lines = detectNetworkPostureContract(contract, {
385
+ row: 'repo-branch-protection-posture',
386
+ repos: [
387
+ snapshot('mmnto-ai/totem', 'totem', {
388
+ branchProtection: drifted,
389
+ rulesets: { outcome: 'ok', data: [] },
390
+ }),
391
+ ],
392
+ });
393
+ const classic = lines.find((l) => l.lineName.includes('classic'));
394
+ expect(classic?.verdict.status).toBe('warn');
395
+ expect(classic?.verdict.message).toContain('required_approving_review_count=1');
396
+ });
397
+ it('warns when the direct-push vector opens (force pushes / deletions allowed)', () => {
398
+ const drifted = {
399
+ outcome: 'ok',
400
+ data: {
401
+ required_pull_request_reviews: { required_approving_review_count: 0 },
402
+ enforce_admins: { enabled: false },
403
+ allow_force_pushes: { enabled: true },
404
+ allow_deletions: { enabled: true },
405
+ },
406
+ };
407
+ const lines = detectNetworkPostureContract(contract, {
408
+ row: 'repo-branch-protection-posture',
409
+ repos: [
410
+ snapshot('mmnto-ai/totem', 'totem', {
411
+ branchProtection: drifted,
412
+ rulesets: { outcome: 'ok', data: [] },
413
+ }),
414
+ ],
415
+ });
416
+ const classic = lines.find((l) => l.lineName.includes('classic'));
417
+ expect(classic?.verdict.status).toBe('warn');
418
+ expect(classic?.verdict.message).toContain('enforce_admins');
419
+ expect(classic?.verdict.message).toContain('allow_force_pushes');
420
+ expect(classic?.verdict.message).toContain('allow_deletions');
421
+ });
422
+ it('is unknown (auth-class) on a 200 without the protection toggles', () => {
423
+ const shy = { outcome: 'ok', data: { url: 'x' } };
424
+ const lines = detectNetworkPostureContract(contract, {
425
+ row: 'repo-branch-protection-posture',
426
+ repos: [
427
+ snapshot('mmnto-ai/totem', 'totem', {
428
+ branchProtection: shy,
429
+ rulesets: { outcome: 'ok', data: [] },
430
+ }),
431
+ ],
432
+ });
433
+ const classic = lines.find((l) => l.lineName.includes('classic'));
434
+ expect(classic?.verdict.status).toBe('unknown');
435
+ expect(classic?.verdict.message).toContain('auth-class');
436
+ });
437
+ it('is unknown on a 404 classic surface (indistinguishable from under-privilege)', () => {
438
+ const lines = detectNetworkPostureContract(contract, {
439
+ row: 'repo-branch-protection-posture',
440
+ repos: [
441
+ snapshot('mmnto-ai/totem', 'totem', {
442
+ branchProtection: { outcome: 'not-found', detail: 'HTTP 404' },
443
+ rulesets: { outcome: 'ok', data: [] },
444
+ }),
445
+ ],
446
+ });
447
+ const classic = lines.find((l) => l.lineName.includes('classic'));
448
+ expect(classic?.verdict.status).toBe('unknown');
449
+ expect(classic?.verdict.message).not.toContain('drift');
450
+ });
451
+ it('warns on the rulesets surface when a push/PR ruleset is bypassable', () => {
452
+ const bypassablePr = {
453
+ id: 3,
454
+ name: 'pr-gate',
455
+ enforcement: 'active',
456
+ conditions: { ref_name: { include: ['~DEFAULT_BRANCH'], exclude: [] } },
457
+ bypass_actors: [{ actor_id: 1, actor_type: 'OrganizationAdmin' }],
458
+ rules: [{ type: 'pull_request', parameters: {} }],
459
+ };
460
+ const lines = detectNetworkPostureContract(contract, {
461
+ row: 'repo-branch-protection-posture',
462
+ repos: [
463
+ snapshot('mmnto-ai/totem', 'totem', {
464
+ branchProtection: okBranchProtection,
465
+ rulesets: { outcome: 'ok', data: [bypassablePr] },
466
+ }),
467
+ ],
468
+ });
469
+ const rulesetLine = lines.find((l) => l.lineName.includes('rulesets'));
470
+ expect(rulesetLine?.verdict.status).toBe('warn');
471
+ expect(rulesetLine?.verdict.message).toContain('pr-gate');
472
+ expect(rulesetLine?.verdict.message).toContain('bypassable');
473
+ });
474
+ it('warns on the rulesets surface when a push/PR ruleset is evaluate-mode', () => {
475
+ const evaluatePr = {
476
+ id: 4,
477
+ name: 'pr-evaluate',
478
+ enforcement: 'evaluate',
479
+ conditions: { ref_name: { include: ['~DEFAULT_BRANCH'], exclude: [] } },
480
+ bypass_actors: [],
481
+ rules: [{ type: 'non_fast_forward', parameters: {} }],
482
+ };
483
+ const lines = detectNetworkPostureContract(contract, {
484
+ row: 'repo-branch-protection-posture',
485
+ repos: [
486
+ snapshot('mmnto-ai/totem', 'totem', {
487
+ branchProtection: okBranchProtection,
488
+ rulesets: { outcome: 'ok', data: [evaluatePr] },
489
+ }),
490
+ ],
491
+ });
492
+ const rulesetLine = lines.find((l) => l.lineName.includes('rulesets'));
493
+ expect(rulesetLine?.verdict.status).toBe('warn');
494
+ expect(rulesetLine?.verdict.message).toContain('enforcement=evaluate');
495
+ });
496
+ it('returns unknown on the rulesets surface when a push/PR ruleset detail omits bypass_actors', () => {
497
+ const shyPr = {
498
+ id: 5,
499
+ name: 'pr-shy',
500
+ enforcement: 'active',
501
+ conditions: { ref_name: { include: ['~DEFAULT_BRANCH'], exclude: [] } },
502
+ rules: [{ type: 'pull_request', parameters: {} }],
503
+ };
504
+ const lines = detectNetworkPostureContract(contract, {
505
+ row: 'repo-branch-protection-posture',
506
+ repos: [
507
+ snapshot('mmnto-ai/totem', 'totem', {
508
+ branchProtection: okBranchProtection,
509
+ rulesets: { outcome: 'ok', data: [shyPr] },
510
+ }),
511
+ ],
512
+ });
513
+ const rulesetLine = lines.find((l) => l.lineName.includes('rulesets'));
514
+ expect(rulesetLine?.verdict.status).toBe('unknown');
515
+ expect(rulesetLine?.verdict.message).toContain('pr-shy');
516
+ expect(rulesetLine?.verdict.message).toContain('bypass_actors');
517
+ });
518
+ it('renders classic + rulesets independently when one surface cannot verify', () => {
519
+ const lines = detectNetworkPostureContract(contract, {
520
+ row: 'repo-branch-protection-posture',
521
+ repos: [
522
+ snapshot('mmnto-ai/totem', 'totem', {
523
+ branchProtection: okBranchProtection,
524
+ rulesets: { outcome: 'auth', detail: 'HTTP 403' },
525
+ }),
526
+ ],
527
+ });
528
+ const classic = lines.find((l) => l.lineName.includes('classic'));
529
+ const rulesetLine = lines.find((l) => l.lineName.includes('rulesets'));
530
+ expect(classic?.verdict.status).toBe('pass');
531
+ expect(rulesetLine?.verdict.status).toBe('unknown');
532
+ });
533
+ });
534
+ //# sourceMappingURL=parity-detect.network-posture.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parity-detect.network-posture.test.js","sourceRoot":"","sources":["../src/parity-detect.network-posture.test.ts"],"names":[],"mappings":"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"}
@@ -131,6 +131,14 @@ export interface ParityContract {
131
131
  vendorAdapter?: string[];
132
132
  /** Optional one-line legitimate role-based manifestation difference (§6(c)). */
133
133
  repoRoleVariance?: string;
134
+ /**
135
+ * Optional Prop 296 §14 probe sub-class tag (`network-read-only`) on a
136
+ * capability-probe row. Open string for the same manifest-wide-outage reason
137
+ * as {@link manifestation}: an unrecognized value rides verbatim, never a
138
+ * dark manifest. Forward-compat metadata — routing narrows on the contract-id
139
+ * registry (CLI edge), not on this field.
140
+ */
141
+ probeClass?: string;
134
142
  }
135
143
  /** A fully parsed + validated parity manifest. */
136
144
  export interface ParityManifest {
@@ -1 +1 @@
1
- {"version":3,"file":"parity-manifest.d.ts","sourceRoot":"","sources":["../src/parity-manifest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parity-manifest.d.ts","sourceRoot":"","sources":["../src/parity-manifest.ts"],"names":[],"mappings":"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"}
@@ -145,6 +145,15 @@ const RawParityContractSchema = z.object({
145
145
  senses: z.unknown().optional(),
146
146
  'vendor-adapter': z.unknown().optional(),
147
147
  'repo-role-variance': z.unknown().optional(),
148
+ // `probe-class` (Prop 296 §14, strategy#962) — forward-compat routing tag on a
149
+ // capability-probe row (`network-read-only` carves the authenticated-read
150
+ // sub-class out of the §12.5 never-network default). Max-tolerance boundary
151
+ // (`z.unknown()`) for the SAME manifest-wide-outage reason as the four
152
+ // promoted fields above: a closed enum would take every contract dark on one
153
+ // future value. Narrowed per-row in `mapContract` (mis-shaped → absent on that
154
+ // row, never a dark manifest). Routing keys PRIMARILY on the contract-id
155
+ // registry; this rides as metadata, never a verdict input.
156
+ 'probe-class': z.unknown().optional(),
148
157
  });
149
158
  /**
150
159
  * Internal Zod schema for the top-level manifest document. `schema-version`
@@ -287,6 +296,7 @@ function mapContract(raw) {
287
296
  const senses = narrowString(raw.senses);
288
297
  const vendorAdapter = narrowStringArray(raw['vendor-adapter']);
289
298
  const repoRoleVariance = narrowString(raw['repo-role-variance']);
299
+ const probeClass = narrowString(raw['probe-class']);
290
300
  return {
291
301
  id: raw.id,
292
302
  dimension: raw.dimension,
@@ -305,6 +315,7 @@ function mapContract(raw) {
305
315
  ...(senses !== undefined ? { senses } : {}),
306
316
  ...(vendorAdapter !== undefined ? { vendorAdapter } : {}),
307
317
  ...(repoRoleVariance !== undefined ? { repoRoleVariance } : {}),
318
+ ...(probeClass !== undefined ? { probeClass } : {}),
308
319
  };
309
320
  }
310
321
  export function loadParityManifest(configValue, root) {