@mmnto/totem 1.103.0 → 1.104.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.
@@ -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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAMH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB;;;;;GAKG;AACH,eAAO,MAAM,+BAA+B,IAAI,CAAC;AAIjD;;;;;;;;;GASG;AACH,eAAO,MAAM,wBAAwB,mEAInC,CAAC;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAI1E;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,uJA0BxB,CAAC;AACX,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzE;;;;;GAKG;AACH,eAAO,MAAM,aAAa,sDAAuD,CAAC;AAClF,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAiEzD;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,yBAAyB,EAAE,MAAM,CAAC;IAClC,YAAY,EAAE,kBAAkB,CAAC;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,gFAAgF;IAChF,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,kDAAkD;AAClD,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,cAAc,EAAE,CAAC;CAC7B;AAID;;;;;;;;;GASG;AACH,MAAM,MAAM,wBAAwB,GAChC;IAAE,MAAM,EAAE,gBAAgB,CAAA;CAAE,GAC5B;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzC;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,IAAI,EAAE,MAAM,GACX,wBAAwB,CAgB1B;AAkBD;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,yBAAyB,GACjC;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,MAAM,EAAE,oBAAoB,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAA;CAAE,CAAC;AAE/C;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,yBAAyB,CA+C/E;AAgED;;;;;;GAMG;AACH,MAAM,MAAM,wBAAwB,GAChC;IAAE,MAAM,EAAE,gBAAgB,CAAA;CAAE,GAC5B;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,MAAM,EAAE,oBAAoB,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACrE;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7D,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,IAAI,EAAE,MAAM,GACX,wBAAwB,CA4B1B"}
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) {