@openwop/openwop-conformance 2.42.8 → 2.43.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/CHANGELOG.md +21 -0
- package/README.md +3 -3
- package/coverage.md +1 -1
- package/dist/cli.js +3 -4
- package/dist/spec-artifacts.lock.json +2 -2
- package/fixtures.md +2 -1
- package/package.json +2 -2
- package/requirements.json +374 -33
- package/scenario-majors.json +17 -5
- package/schemas/CORPUS-STAMP.json +37 -36
- package/src/cli.ts +3 -4
- package/src/lib/auditIntegrity.ts +45 -0
- package/src/lib/mock-ai-budgets.ts +26 -0
- package/src/lib/mock-node-lock.ts +66 -0
- package/src/scenarios/audit-anomaly-shape.test.ts +100 -0
- package/src/scenarios/audit-checkpoint-signature.test.ts +14 -15
- package/src/scenarios/audit-log-integrity.test.ts +102 -46
- package/src/scenarios/byok-roundtrip.test.ts +21 -7
- package/src/scenarios/envelope-completion-distinguishes-truncation.test.ts +17 -8
- package/src/scenarios/envelope-retry-attempted.test.ts +4 -0
- package/src/scenarios/envelope-truncated.test.ts +16 -16
- package/src/scenarios/v2-approval-reject-disposition.test.ts +162 -0
- package/src/scenarios/v2-registry-lifecycle.test.ts +232 -0
- package/src/scenarios/v2-webhook-delivery-shape.test.ts +5 -0
package/requirements.json
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
"$comment": "GENERATED by conformance/scripts/generate-requirement-registry.mjs — do not edit. One record per it()/test() in src/scenarios. Ids: openwop.it.<file-stem>.<title-slug>[~n] (src/lib/requirement-ids.ts). A record with id null has an interpolated title; its run-time row is keyed by the rendered title and maps here by file+line only. Renamed ids need a row in requirement-aliases.json.",
|
|
3
3
|
"generatedFrom": "src/scenarios/*.test.ts",
|
|
4
4
|
"counts": {
|
|
5
|
-
"files":
|
|
6
|
-
"tests":
|
|
7
|
-
"withStableId":
|
|
5
|
+
"files": 645,
|
|
6
|
+
"tests": 2481,
|
|
7
|
+
"withStableId": 2481,
|
|
8
8
|
"interpolatedTitles": 0,
|
|
9
|
-
"explicitIds":
|
|
9
|
+
"explicitIds": 2367
|
|
10
10
|
},
|
|
11
11
|
"records": [
|
|
12
12
|
{
|
|
@@ -5425,15 +5425,72 @@
|
|
|
5425
5425
|
}
|
|
5426
5426
|
]
|
|
5427
5427
|
},
|
|
5428
|
+
{
|
|
5429
|
+
"id": "openwop.it.audit-anomaly-shape.every-anomaly-kind-validates-in-its-own-shape",
|
|
5430
|
+
"file": "audit-anomaly-shape.test.ts",
|
|
5431
|
+
"line": 74,
|
|
5432
|
+
"title": "every anomaly kind validates in its own shape",
|
|
5433
|
+
"explicitId": "openwop.requirement.0218.anomaly-shape",
|
|
5434
|
+
"citations": [
|
|
5435
|
+
{
|
|
5436
|
+
"section": "RFC 0218 §C · spec/v1/auth-profiles.md §\"Audit-log integrity\" 4",
|
|
5437
|
+
"requirement": null,
|
|
5438
|
+
"interpolated": true
|
|
5439
|
+
},
|
|
5440
|
+
{
|
|
5441
|
+
"section": "RFC 0218 §C · spec/v1/auth-profiles.md §\"Audit-log integrity\" 4",
|
|
5442
|
+
"requirement": null,
|
|
5443
|
+
"interpolated": true
|
|
5444
|
+
}
|
|
5445
|
+
]
|
|
5446
|
+
},
|
|
5447
|
+
{
|
|
5448
|
+
"id": "openwop.it.audit-anomaly-shape.an-anomaly-outside-its-kind-s-shape-is-refused",
|
|
5449
|
+
"file": "audit-anomaly-shape.test.ts",
|
|
5450
|
+
"line": 84,
|
|
5451
|
+
"title": "an anomaly outside its kind's shape is refused",
|
|
5452
|
+
"explicitId": "openwop.requirement.0218.anomaly-shape",
|
|
5453
|
+
"citations": [
|
|
5454
|
+
{
|
|
5455
|
+
"section": "RFC 0218 §C · spec/v1/auth-profiles.md §\"Audit-log integrity\" 4",
|
|
5456
|
+
"requirement": null,
|
|
5457
|
+
"interpolated": true
|
|
5458
|
+
}
|
|
5459
|
+
]
|
|
5460
|
+
},
|
|
5461
|
+
{
|
|
5462
|
+
"id": "openwop.it.audit-anomaly-shape.chainvalid-is-false-exactly-when-anomalies-is-non-empty",
|
|
5463
|
+
"file": "audit-anomaly-shape.test.ts",
|
|
5464
|
+
"line": 92,
|
|
5465
|
+
"title": "chainValid is false exactly when anomalies is non-empty",
|
|
5466
|
+
"explicitId": "openwop.requirement.0218.anomaly-shape",
|
|
5467
|
+
"citations": [
|
|
5468
|
+
{
|
|
5469
|
+
"section": "RFC 0218 §C · spec/v1/auth-profiles.md §\"Audit-log integrity\" 4",
|
|
5470
|
+
"requirement": null,
|
|
5471
|
+
"interpolated": true
|
|
5472
|
+
},
|
|
5473
|
+
{
|
|
5474
|
+
"section": "RFC 0218 §C · spec/v1/auth-profiles.md §\"Audit-log integrity\" 4",
|
|
5475
|
+
"requirement": null,
|
|
5476
|
+
"interpolated": true
|
|
5477
|
+
},
|
|
5478
|
+
{
|
|
5479
|
+
"section": "RFC 0218 §C · spec/v1/auth-profiles.md §\"Audit-log integrity\" 4",
|
|
5480
|
+
"requirement": null,
|
|
5481
|
+
"interpolated": true
|
|
5482
|
+
}
|
|
5483
|
+
]
|
|
5484
|
+
},
|
|
5428
5485
|
{
|
|
5429
5486
|
"id": "openwop.it.audit-checkpoint-signature.every-checkpoint-get-v1-audit-verify-returns-verifies-under-the-advertised-key",
|
|
5430
5487
|
"file": "audit-checkpoint-signature.test.ts",
|
|
5431
|
-
"line":
|
|
5488
|
+
"line": 29,
|
|
5432
5489
|
"title": "every checkpoint GET /v1/audit/verify returns verifies under the advertised key",
|
|
5433
5490
|
"explicitId": "openwop.requirement.0218.checkpoint-signature-over-root",
|
|
5434
5491
|
"citations": [
|
|
5435
5492
|
{
|
|
5436
|
-
"section": "RFC 0218 · spec/v1/auth-profiles.md §\"Audit-log integrity\" 3",
|
|
5493
|
+
"section": "RFC 0218 · spec/v1/auth-profiles.md §\"Audit-log integrity\" 3; spec/v2/core/security-defaults.md §\"Audit-log integrity\" (RFC 0224)",
|
|
5437
5494
|
"requirement": null,
|
|
5438
5495
|
"interpolated": true
|
|
5439
5496
|
}
|
|
@@ -5534,10 +5591,19 @@
|
|
|
5534
5591
|
{
|
|
5535
5592
|
"id": "openwop.it.audit-log-integrity.host-that-claims-the-profile-advertises-required-capability-fields",
|
|
5536
5593
|
"file": "audit-log-integrity.test.ts",
|
|
5537
|
-
"line":
|
|
5594
|
+
"line": 80,
|
|
5538
5595
|
"title": "host that claims the profile advertises required capability fields",
|
|
5539
5596
|
"explicitId": "openwop.it.audit-log-integrity.host-that-claims-the-profile-advertises-required-capability-fields",
|
|
5540
5597
|
"citations": [
|
|
5598
|
+
{
|
|
5599
|
+
"section": "security-defaults.md §\"Audit-log integrity\"",
|
|
5600
|
+
"requirement": null,
|
|
5601
|
+
"interpolated": true
|
|
5602
|
+
},
|
|
5603
|
+
{
|
|
5604
|
+
"section": "security-defaults.md §\"Audit-log integrity\"",
|
|
5605
|
+
"requirement": "auditLogIntegrity.checkpointPublicKey MUST be an Ed25519 SubjectPublicKeyInfo, base64"
|
|
5606
|
+
},
|
|
5541
5607
|
{
|
|
5542
5608
|
"section": "auth-profiles.md §\"Audit-log integrity\"",
|
|
5543
5609
|
"requirement": "openwop-audit-log-integrity profile MUST advertise auditLogIntegrity.hashChain: true"
|
|
@@ -5551,13 +5617,14 @@
|
|
|
5551
5617
|
{
|
|
5552
5618
|
"id": "openwop.it.audit-log-integrity.get-v1-audit-verify-on-a-recent-range-reports-chainvalid-true",
|
|
5553
5619
|
"file": "audit-log-integrity.test.ts",
|
|
5554
|
-
"line":
|
|
5620
|
+
"line": 111,
|
|
5555
5621
|
"title": "GET /v1/audit/verify on a recent range reports chainValid: true",
|
|
5556
5622
|
"explicitId": "openwop.it.audit-log-integrity.get-v1-audit-verify-on-a-recent-range-reports-chainvalid-true",
|
|
5557
5623
|
"citations": [
|
|
5558
5624
|
{
|
|
5559
5625
|
"section": "auth-profiles.md §\"Audit-log integrity\" §\"Verification endpoint\"",
|
|
5560
|
-
"requirement":
|
|
5626
|
+
"requirement": null,
|
|
5627
|
+
"interpolated": true
|
|
5561
5628
|
},
|
|
5562
5629
|
{
|
|
5563
5630
|
"section": "audit-verify-result.schema.json",
|
|
@@ -5574,6 +5641,29 @@
|
|
|
5574
5641
|
}
|
|
5575
5642
|
]
|
|
5576
5643
|
},
|
|
5644
|
+
{
|
|
5645
|
+
"id": "openwop.it.audit-log-integrity.verify-lists-every-checkpoint-ascending-no-more-than-checkpointintervalentries-a",
|
|
5646
|
+
"file": "audit-log-integrity.test.ts",
|
|
5647
|
+
"line": 163,
|
|
5648
|
+
"title": "verify lists every checkpoint ascending, no more than checkpointIntervalEntries apart",
|
|
5649
|
+
"explicitId": "openwop.requirement.0224.checkpoint-cadence",
|
|
5650
|
+
"citations": [
|
|
5651
|
+
{
|
|
5652
|
+
"section": "security-defaults.md §\"Audit-log integrity\"",
|
|
5653
|
+
"requirement": "every checkpoint MUST carry an integer atSequence"
|
|
5654
|
+
},
|
|
5655
|
+
{
|
|
5656
|
+
"section": "security-defaults.md §\"Audit-log integrity\"",
|
|
5657
|
+
"requirement": null,
|
|
5658
|
+
"interpolated": true
|
|
5659
|
+
},
|
|
5660
|
+
{
|
|
5661
|
+
"section": "security-defaults.md §\"Audit-log integrity\"",
|
|
5662
|
+
"requirement": null,
|
|
5663
|
+
"interpolated": true
|
|
5664
|
+
}
|
|
5665
|
+
]
|
|
5666
|
+
},
|
|
5577
5667
|
{
|
|
5578
5668
|
"id": "openwop.it.auth-api-key-rotation.host-claiming-rotation-profile-advertises-required-fields",
|
|
5579
5669
|
"file": "auth-api-key-rotation.test.ts",
|
|
@@ -6731,7 +6821,7 @@
|
|
|
6731
6821
|
{
|
|
6732
6822
|
"id": "openwop.it.byok-roundtrip.the-canary-fixture-run-must-resolve-a-host-provisioned-secret-and-emit-sha-256-h",
|
|
6733
6823
|
"file": "byok-roundtrip.test.ts",
|
|
6734
|
-
"line":
|
|
6824
|
+
"line": 51,
|
|
6735
6825
|
"title": "the canary fixture run MUST resolve a host-provisioned secret and emit SHA-256 hex",
|
|
6736
6826
|
"explicitId": "openwop.it.byok-roundtrip.the-canary-fixture-run-must-resolve-a-host-provisioned-secret-and-emit-sha-256-h",
|
|
6737
6827
|
"citations": [
|
|
@@ -6756,7 +6846,7 @@
|
|
|
6756
6846
|
{
|
|
6757
6847
|
"id": "openwop.it.byok-roundtrip.byok-fixture-run-must-emit-a-node-completed-event-for-the-resolve-step",
|
|
6758
6848
|
"file": "byok-roundtrip.test.ts",
|
|
6759
|
-
"line":
|
|
6849
|
+
"line": 116,
|
|
6760
6850
|
"title": "BYOK fixture run MUST emit a node.completed event for the resolve step",
|
|
6761
6851
|
"explicitId": "openwop.it.byok-roundtrip.byok-fixture-run-must-emit-a-node-completed-event-for-the-resolve-step",
|
|
6762
6852
|
"citations": [
|
|
@@ -6769,7 +6859,7 @@
|
|
|
6769
6859
|
{
|
|
6770
6860
|
"id": "openwop.it.byok-roundtrip.byok-fixture-run-event-log-must-not-echo-the-resolved-secret-value-redaction",
|
|
6771
6861
|
"file": "byok-roundtrip.test.ts",
|
|
6772
|
-
"line":
|
|
6862
|
+
"line": 143,
|
|
6773
6863
|
"title": "BYOK fixture run event log MUST NOT echo the resolved secret value (redaction)",
|
|
6774
6864
|
"explicitId": "openwop.it.byok-roundtrip.byok-fixture-run-event-log-must-not-echo-the-resolved-secret-value-redaction",
|
|
6775
6865
|
"citations": [
|
|
@@ -11541,7 +11631,7 @@
|
|
|
11541
11631
|
{
|
|
11542
11632
|
"id": "openwop.it.envelope-completion-distinguishes-truncation.capabilities-envelopes-reliability-completion-when-present-conforms-to-rfc-0033",
|
|
11543
11633
|
"file": "envelope-completion-distinguishes-truncation.test.ts",
|
|
11544
|
-
"line":
|
|
11634
|
+
"line": 108,
|
|
11545
11635
|
"title": "capabilities.envelopes.reliability.completion (when present) conforms to RFC 0033 §E",
|
|
11546
11636
|
"explicitId": "openwop.it.envelope-completion-distinguishes-truncation.capabilities-envelopes-reliability-completion-when-present-conforms-to-rfc-0033",
|
|
11547
11637
|
"citations": [
|
|
@@ -11558,7 +11648,7 @@
|
|
|
11558
11648
|
{
|
|
11559
11649
|
"id": "openwop.it.envelope-completion-distinguishes-truncation.truncation-emits-envelope-truncated-envelope-retry-attempted-with-reason-truncat",
|
|
11560
11650
|
"file": "envelope-completion-distinguishes-truncation.test.ts",
|
|
11561
|
-
"line":
|
|
11651
|
+
"line": 131,
|
|
11562
11652
|
"title": "truncation: emits envelope.truncated + envelope.retry.attempted with reason: \"truncation\"",
|
|
11563
11653
|
"explicitId": "openwop.it.envelope-completion-distinguishes-truncation.truncation-emits-envelope-truncated-envelope-retry-attempted-with-reason-truncat",
|
|
11564
11654
|
"citations": [
|
|
@@ -11579,20 +11669,21 @@
|
|
|
11579
11669
|
{
|
|
11580
11670
|
"id": "openwop.it.envelope-completion-distinguishes-truncation.truncation-retry-budget-strictly-greater-than-initial-rfc-0033-b-truncationbudge",
|
|
11581
11671
|
"file": "envelope-completion-distinguishes-truncation.test.ts",
|
|
11582
|
-
"line":
|
|
11672
|
+
"line": 156,
|
|
11583
11673
|
"title": "truncation: retry budget strictly greater than initial (RFC 0033 §B truncationBudgetMultiplier)",
|
|
11584
11674
|
"explicitId": "openwop.it.envelope-completion-distinguishes-truncation.truncation-retry-budget-strictly-greater-than-initial-rfc-0033-b-truncationbudge",
|
|
11585
11675
|
"citations": [
|
|
11586
11676
|
{
|
|
11587
11677
|
"section": "RFCS/0033-envelope-completion-contract.md §B",
|
|
11588
|
-
"requirement":
|
|
11678
|
+
"requirement": null,
|
|
11679
|
+
"interpolated": true
|
|
11589
11680
|
}
|
|
11590
11681
|
]
|
|
11591
11682
|
},
|
|
11592
11683
|
{
|
|
11593
11684
|
"id": "openwop.it.envelope-completion-distinguishes-truncation.schema-violation-no-envelope-truncated-envelope-retry-attempted-reason-schema-vi",
|
|
11594
11685
|
"file": "envelope-completion-distinguishes-truncation.test.ts",
|
|
11595
|
-
"line":
|
|
11686
|
+
"line": 185,
|
|
11596
11687
|
"title": "schema-violation: NO envelope.truncated; envelope.retry.attempted reason ∈ {schema-violation, parse-error}",
|
|
11597
11688
|
"explicitId": "openwop.it.envelope-completion-distinguishes-truncation.schema-violation-no-envelope-truncated-envelope-retry-attempted-reason-schema-vi",
|
|
11598
11689
|
"citations": [
|
|
@@ -11609,7 +11700,7 @@
|
|
|
11609
11700
|
{
|
|
11610
11701
|
"id": "openwop.it.envelope-completion-distinguishes-truncation.schema-violation-retry-budget-unchanged-from-initial-no-budget-multiplication-on",
|
|
11611
11702
|
"file": "envelope-completion-distinguishes-truncation.test.ts",
|
|
11612
|
-
"line":
|
|
11703
|
+
"line": 215,
|
|
11613
11704
|
"title": "schema-violation: retry budget UNCHANGED from initial (no budget multiplication on this path)",
|
|
11614
11705
|
"explicitId": "openwop.it.envelope-completion-distinguishes-truncation.schema-violation-retry-budget-unchanged-from-initial-no-budget-multiplication-on",
|
|
11615
11706
|
"citations": [
|
|
@@ -12261,7 +12352,7 @@
|
|
|
12261
12352
|
{
|
|
12262
12353
|
"id": "openwop.it.envelope-retry-attempted.when-mock-llm-emits-invalid-envelope-on-attempt-1-then-valid-on-attempt-2-exactl",
|
|
12263
12354
|
"file": "envelope-retry-attempted.test.ts",
|
|
12264
|
-
"line":
|
|
12355
|
+
"line": 162,
|
|
12265
12356
|
"title": "when mock LLM emits invalid envelope on attempt 1 then valid on attempt 2, exactly one `envelope.retry.attempted` event fires before the second attempt",
|
|
12266
12357
|
"explicitId": "openwop.it.envelope-retry-attempted.when-mock-llm-emits-invalid-envelope-on-attempt-1-then-valid-on-attempt-2-exactl",
|
|
12267
12358
|
"citations": [
|
|
@@ -12274,7 +12365,7 @@
|
|
|
12274
12365
|
{
|
|
12275
12366
|
"id": "openwop.it.envelope-retry-attempted.event-payload-carries-attempt-2-1-indexed-first-attempt-does-not-emit",
|
|
12276
12367
|
"file": "envelope-retry-attempted.test.ts",
|
|
12277
|
-
"line":
|
|
12368
|
+
"line": 183,
|
|
12278
12369
|
"title": "event payload carries `attempt: 2` (1-indexed; first attempt does not emit)",
|
|
12279
12370
|
"explicitId": "openwop.it.envelope-retry-attempted.event-payload-carries-attempt-2-1-indexed-first-attempt-does-not-emit",
|
|
12280
12371
|
"citations": [
|
|
@@ -12291,7 +12382,7 @@
|
|
|
12291
12382
|
{
|
|
12292
12383
|
"id": "openwop.it.envelope-retry-attempted.reason-is-one-of-the-spec-reserved-closed-enum-values-or-matches-the-x-host-host",
|
|
12293
12384
|
"file": "envelope-retry-attempted.test.ts",
|
|
12294
|
-
"line":
|
|
12385
|
+
"line": 201,
|
|
12295
12386
|
"title": "`reason` is one of the spec-reserved closed-enum values OR matches the `x-host-<host>-<key>` extension pattern",
|
|
12296
12387
|
"explicitId": "openwop.it.envelope-retry-attempted.reason-is-one-of-the-spec-reserved-closed-enum-values-or-matches-the-x-host-host",
|
|
12297
12388
|
"citations": [
|
|
@@ -12304,7 +12395,7 @@
|
|
|
12304
12395
|
{
|
|
12305
12396
|
"id": "openwop.it.envelope-retry-attempted.eventual-success-records-normally-via-envelope-acceptance-downstream-runeventdoc",
|
|
12306
12397
|
"file": "envelope-retry-attempted.test.ts",
|
|
12307
|
-
"line":
|
|
12398
|
+
"line": 221,
|
|
12308
12399
|
"title": "eventual success records normally via envelope acceptance + downstream RunEventDoc",
|
|
12309
12400
|
"explicitId": "openwop.it.envelope-retry-attempted.eventual-success-records-normally-via-envelope-acceptance-downstream-runeventdoc",
|
|
12310
12401
|
"citations": [
|
|
@@ -12317,7 +12408,7 @@
|
|
|
12317
12408
|
{
|
|
12318
12409
|
"id": "openwop.it.envelope-retry-attempted.previouserror-when-populated-must-not-contain-prompt-or-response-substring-excer",
|
|
12319
12410
|
"file": "envelope-retry-attempted.test.ts",
|
|
12320
|
-
"line":
|
|
12411
|
+
"line": 240,
|
|
12321
12412
|
"title": "`previousError` (when populated) MUST NOT contain prompt or response substring excerpts — limit to validator output",
|
|
12322
12413
|
"explicitId": "openwop.it.envelope-retry-attempted.previouserror-when-populated-must-not-contain-prompt-or-response-substring-excer",
|
|
12323
12414
|
"citations": [
|
|
@@ -12428,7 +12519,7 @@
|
|
|
12428
12519
|
{
|
|
12429
12520
|
"id": "openwop.it.envelope-truncated.when-mock-returns-stopreason-max-tokens-on-attempt-1-exactly-one-envelope-trunca",
|
|
12430
12521
|
"file": "envelope-truncated.test.ts",
|
|
12431
|
-
"line":
|
|
12522
|
+
"line": 59,
|
|
12432
12523
|
"title": "when mock returns stopReason: max_tokens on attempt 1, exactly one envelope.truncated event fires with stopReason: max_tokens",
|
|
12433
12524
|
"explicitId": "openwop.it.envelope-truncated.when-mock-returns-stopreason-max-tokens-on-attempt-1-exactly-one-envelope-trunca",
|
|
12434
12525
|
"citations": [
|
|
@@ -12441,7 +12532,7 @@
|
|
|
12441
12532
|
{
|
|
12442
12533
|
"id": "openwop.it.envelope-truncated.payload-includes-nodeid-provider-model-partialpayloadavailable-boolean",
|
|
12443
12534
|
"file": "envelope-truncated.test.ts",
|
|
12444
|
-
"line":
|
|
12535
|
+
"line": 85,
|
|
12445
12536
|
"title": "payload includes nodeId + provider + model + partialPayloadAvailable boolean",
|
|
12446
12537
|
"explicitId": "openwop.it.envelope-truncated.payload-includes-nodeid-provider-model-partialpayloadavailable-boolean",
|
|
12447
12538
|
"citations": [
|
|
@@ -12454,13 +12545,14 @@
|
|
|
12454
12545
|
{
|
|
12455
12546
|
"id": "openwop.it.envelope-truncated.retry-attempt-receives-a-maxtokens-value-strictly-greater-than-the-previous-atte",
|
|
12456
12547
|
"file": "envelope-truncated.test.ts",
|
|
12457
|
-
"line":
|
|
12548
|
+
"line": 104,
|
|
12458
12549
|
"title": "retry attempt receives a maxTokens value strictly greater than the previous attempt (RFC 0033 §B truncationBudgetMultiplier)",
|
|
12459
12550
|
"explicitId": "openwop.it.envelope-truncated.retry-attempt-receives-a-maxtokens-value-strictly-greater-than-the-previous-atte",
|
|
12460
12551
|
"citations": [
|
|
12461
12552
|
{
|
|
12462
12553
|
"section": "RFCS/0033-envelope-completion-contract.md §B",
|
|
12463
|
-
"requirement":
|
|
12554
|
+
"requirement": null,
|
|
12555
|
+
"interpolated": true
|
|
12464
12556
|
}
|
|
12465
12557
|
]
|
|
12466
12558
|
},
|
|
@@ -27711,6 +27803,95 @@
|
|
|
27711
27803
|
}
|
|
27712
27804
|
]
|
|
27713
27805
|
},
|
|
27806
|
+
{
|
|
27807
|
+
"id": "openwop.it.v2-approval-reject-disposition.a-rejected-gate-with-no-routing-edge-fails-the-run-with-approval-rejected",
|
|
27808
|
+
"file": "v2-approval-reject-disposition.test.ts",
|
|
27809
|
+
"line": 103,
|
|
27810
|
+
"title": "a rejected gate with no routing edge fails the run with approval_rejected",
|
|
27811
|
+
"explicitId": null,
|
|
27812
|
+
"citations": [
|
|
27813
|
+
{
|
|
27814
|
+
"section": "spec/v2/core/interrupt.md §Rejection (RFC 0223)",
|
|
27815
|
+
"requirement": null,
|
|
27816
|
+
"interpolated": true
|
|
27817
|
+
},
|
|
27818
|
+
{
|
|
27819
|
+
"section": null,
|
|
27820
|
+
"requirement": "the terminal snapshot error.code MUST be approval_rejected",
|
|
27821
|
+
"interpolated": true
|
|
27822
|
+
},
|
|
27823
|
+
{
|
|
27824
|
+
"section": "spec/v2/core/interrupt.md §Rejection (RFC 0223)",
|
|
27825
|
+
"requirement": "run.failed.error.code MUST be approval_rejected"
|
|
27826
|
+
}
|
|
27827
|
+
]
|
|
27828
|
+
},
|
|
27829
|
+
{
|
|
27830
|
+
"id": "openwop.it.v2-approval-reject-disposition.interrupt-resolved-records-action-reject-and-decision-rejected",
|
|
27831
|
+
"file": "v2-approval-reject-disposition.test.ts",
|
|
27832
|
+
"line": 114,
|
|
27833
|
+
"title": "interrupt.resolved records action reject and decision rejected",
|
|
27834
|
+
"explicitId": null,
|
|
27835
|
+
"citations": [
|
|
27836
|
+
{
|
|
27837
|
+
"section": null,
|
|
27838
|
+
"requirement": "the reject MUST be recorded as interrupt.resolved",
|
|
27839
|
+
"interpolated": true
|
|
27840
|
+
},
|
|
27841
|
+
{
|
|
27842
|
+
"section": null,
|
|
27843
|
+
"requirement": "interrupt.resolved MUST carry action \"reject\" and decision \"rejected\"",
|
|
27844
|
+
"interpolated": true
|
|
27845
|
+
}
|
|
27846
|
+
]
|
|
27847
|
+
},
|
|
27848
|
+
{
|
|
27849
|
+
"id": "openwop.it.v2-approval-reject-disposition.the-gate-node-fails-with-approval-rejected-not-retryable-and-run-failed-names-it",
|
|
27850
|
+
"file": "v2-approval-reject-disposition.test.ts",
|
|
27851
|
+
"line": 127,
|
|
27852
|
+
"title": "the gate node fails with approval_rejected, not retryable, and run.failed names it",
|
|
27853
|
+
"explicitId": null,
|
|
27854
|
+
"citations": [
|
|
27855
|
+
{
|
|
27856
|
+
"section": "spec/v2/core/interrupt.md §Rejection (RFC 0223)",
|
|
27857
|
+
"requirement": "the gate that does not turn the rejection into an output MUST emit node.failed"
|
|
27858
|
+
},
|
|
27859
|
+
{
|
|
27860
|
+
"section": "spec/v2/core/interrupt.md §Rejection (RFC 0223)",
|
|
27861
|
+
"requirement": "node.failed.error MUST carry code approval_rejected and retryable false"
|
|
27862
|
+
},
|
|
27863
|
+
{
|
|
27864
|
+
"section": "spec/v2/core/interrupt.md §Rejection (RFC 0223)",
|
|
27865
|
+
"requirement": "run.failed.failedNodeId MUST name the gate"
|
|
27866
|
+
}
|
|
27867
|
+
]
|
|
27868
|
+
},
|
|
27869
|
+
{
|
|
27870
|
+
"id": "openwop.it.v2-approval-reject-disposition.a-majority-reject-decides-the-quorum-gate-on-the-deciding-vote-and-fails-the-run",
|
|
27871
|
+
"file": "v2-approval-reject-disposition.test.ts",
|
|
27872
|
+
"line": 140,
|
|
27873
|
+
"title": "a majority reject decides the quorum gate on the deciding vote and fails the run with approval_rejected",
|
|
27874
|
+
"explicitId": null,
|
|
27875
|
+
"citations": [
|
|
27876
|
+
{
|
|
27877
|
+
"section": "spec/v2/core/interrupt.md §Rejection (RFC 0223)",
|
|
27878
|
+
"requirement": "one reject of three under majority does not decide the gate: the run MUST stay waiting-approval"
|
|
27879
|
+
},
|
|
27880
|
+
{
|
|
27881
|
+
"section": "spec/v2/core/interrupt.md §Rejection (RFC 0223)",
|
|
27882
|
+
"requirement": "a vote that does not decide the gate MUST NOT emit interrupt.resolved"
|
|
27883
|
+
},
|
|
27884
|
+
{
|
|
27885
|
+
"section": "spec/v2/core/interrupt.md §Rejection (RFC 0223)",
|
|
27886
|
+
"requirement": null,
|
|
27887
|
+
"interpolated": true
|
|
27888
|
+
},
|
|
27889
|
+
{
|
|
27890
|
+
"section": "spec/v2/core/interrupt.md §Rejection (RFC 0223)",
|
|
27891
|
+
"requirement": "the terminal snapshot error.code MUST be approval_rejected"
|
|
27892
|
+
}
|
|
27893
|
+
]
|
|
27894
|
+
},
|
|
27714
27895
|
{
|
|
27715
27896
|
"id": "openwop.it.v2-approver-enforced.a-resolver-outside-approverslist-is-refused-at-resolve-time",
|
|
27716
27897
|
"file": "v2-approver-enforced.test.ts",
|
|
@@ -32592,6 +32773,56 @@
|
|
|
32592
32773
|
}
|
|
32593
32774
|
]
|
|
32594
32775
|
},
|
|
32776
|
+
{
|
|
32777
|
+
"id": "openwop.it.v2-registry-lifecycle.a-yanked-version-is-never-latest-while-an-unyanked-one-exists-the-flags-agree-ac",
|
|
32778
|
+
"file": "v2-registry-lifecycle.test.ts",
|
|
32779
|
+
"line": 130,
|
|
32780
|
+
"title": "a yanked version is never latest while an unyanked one exists, the flags agree across index and manifest, and a yanked version stays served",
|
|
32781
|
+
"explicitId": "openwop.requirement.0222.yanked-version-lifecycle",
|
|
32782
|
+
"citations": [
|
|
32783
|
+
{
|
|
32784
|
+
"section": "RFC 0222 · packs.md §\"Version manifests\"",
|
|
32785
|
+
"requirement": null,
|
|
32786
|
+
"interpolated": true
|
|
32787
|
+
},
|
|
32788
|
+
{
|
|
32789
|
+
"section": "RFC 0222 · packs.md §\"Version manifests\"",
|
|
32790
|
+
"requirement": "the per-pack index MUST NOT name a yanked version latest while an unyanked one exists, and the index MUST agree with each version manifest"
|
|
32791
|
+
},
|
|
32792
|
+
{
|
|
32793
|
+
"section": "RFC 0222 · packs.md §\"Version manifests\"",
|
|
32794
|
+
"requirement": null,
|
|
32795
|
+
"interpolated": true
|
|
32796
|
+
}
|
|
32797
|
+
]
|
|
32798
|
+
},
|
|
32799
|
+
{
|
|
32800
|
+
"id": "openwop.it.v2-registry-lifecycle.every-served-version-names-a-listed-key-whose-permittednamespaces-admit-it-and-i",
|
|
32801
|
+
"file": "v2-registry-lifecycle.test.ts",
|
|
32802
|
+
"line": 177,
|
|
32803
|
+
"title": "every served version names a listed key whose permittedNamespaces admit it, and its signature verifies — whatever the key status",
|
|
32804
|
+
"explicitId": "openwop.requirement.0222.signing-keys-cover-served-versions",
|
|
32805
|
+
"citations": [
|
|
32806
|
+
{
|
|
32807
|
+
"section": "RFC 0222 · packs.md §Signing",
|
|
32808
|
+
"requirement": null,
|
|
32809
|
+
"interpolated": true
|
|
32810
|
+
},
|
|
32811
|
+
{
|
|
32812
|
+
"section": "RFC 0222 · packs.md §Signing",
|
|
32813
|
+
"requirement": "every signingKeys[] entry MUST carry keyId, publicKeyUrl, status and permittedNamespaces"
|
|
32814
|
+
},
|
|
32815
|
+
{
|
|
32816
|
+
"section": "RFC 0222 · packs.md §Signing",
|
|
32817
|
+
"requirement": "the v2 tree MUST serve at least one version manifest to witness"
|
|
32818
|
+
},
|
|
32819
|
+
{
|
|
32820
|
+
"section": "RFC 0222 · packs.md §Signing",
|
|
32821
|
+
"requirement": null,
|
|
32822
|
+
"interpolated": true
|
|
32823
|
+
}
|
|
32824
|
+
]
|
|
32825
|
+
},
|
|
32595
32826
|
{
|
|
32596
32827
|
"id": "openwop.it.v2-relaxation-recorded.a-bundle-recording-a-relaxation-cannot-certify-the-relaxed-profile",
|
|
32597
32828
|
"file": "v2-relaxation-recorded.test.ts",
|
|
@@ -33869,13 +34100,18 @@
|
|
|
33869
34100
|
{
|
|
33870
34101
|
"section": "spec/v2/core/webhooks.md §Delivery",
|
|
33871
34102
|
"requirement": "a major-2 owner echo carries tenant and subject"
|
|
34103
|
+
},
|
|
34104
|
+
{
|
|
34105
|
+
"section": "spec/v2/core/webhooks.md §Delivery",
|
|
34106
|
+
"requirement": null,
|
|
34107
|
+
"interpolated": true
|
|
33872
34108
|
}
|
|
33873
34109
|
]
|
|
33874
34110
|
},
|
|
33875
34111
|
{
|
|
33876
34112
|
"id": "openwop.it.v2-webhook-delivery-shape.a-major-1-subscriber-still-receives-the-v1-rendering-the-v1-wire-does-not-move-m",
|
|
33877
34113
|
"file": "v2-webhook-delivery-shape.test.ts",
|
|
33878
|
-
"line":
|
|
34114
|
+
"line": 244,
|
|
33879
34115
|
"title": "a major-1 subscriber still receives the v1 rendering — the v1 wire does not move mid-overlap",
|
|
33880
34116
|
"explicitId": "openwop.requirement.0171.webhook-delivery-shape",
|
|
33881
34117
|
"citations": [
|
|
@@ -33893,7 +34129,7 @@
|
|
|
33893
34129
|
{
|
|
33894
34130
|
"id": "openwop.it.v2-webhook-delivery-shape.a-seeded-era-2-run-is-delivered-projected-too-the-fan-out-branch-a-fresh-run-can",
|
|
33895
34131
|
"file": "v2-webhook-delivery-shape.test.ts",
|
|
33896
|
-
"line":
|
|
34132
|
+
"line": 268,
|
|
33897
34133
|
"title": "a seeded era-2 run is delivered projected too — the fan-out branch a fresh run cannot reach (seam-gated)",
|
|
33898
34134
|
"explicitId": "openwop.requirement.0171.webhook-delivery-shape",
|
|
33899
34135
|
"citations": [
|
|
@@ -42154,7 +42390,7 @@
|
|
|
42154
42390
|
{
|
|
42155
42391
|
"id": "openwop.it.v2-error-registry-prose-parity.errors-md-states-the-registry-count-it-was-generated-from-and-renders-every-code",
|
|
42156
42392
|
"file": "v2-error-registry-prose-parity.test.ts",
|
|
42157
|
-
"line":
|
|
42393
|
+
"line": 35,
|
|
42158
42394
|
"title": "errors.md states the registry count it was generated from and renders every code",
|
|
42159
42395
|
"explicitId": "openwop.requirement.0171.error-registry-prose-parity",
|
|
42160
42396
|
"citations": [
|
|
@@ -42174,6 +42410,34 @@
|
|
|
42174
42410
|
}
|
|
42175
42411
|
]
|
|
42176
42412
|
},
|
|
42413
|
+
{
|
|
42414
|
+
"id": "openwop.it.v2-error-registry-prose-parity.approval-rejected-is-a-registered-422-not-retriable-and-interrupt-md-rejection-n",
|
|
42415
|
+
"file": "v2-error-registry-prose-parity.test.ts",
|
|
42416
|
+
"line": 67,
|
|
42417
|
+
"title": "approval_rejected is a registered 422, not retriable, and interrupt.md §Rejection names it",
|
|
42418
|
+
"explicitId": "openwop.requirement.0223.code-registered",
|
|
42419
|
+
"citations": [
|
|
42420
|
+
{
|
|
42421
|
+
"section": "spec/v2/errors.json",
|
|
42422
|
+
"requirement": null,
|
|
42423
|
+
"interpolated": true
|
|
42424
|
+
},
|
|
42425
|
+
{
|
|
42426
|
+
"section": "spec/v2/errors.json",
|
|
42427
|
+
"requirement": null,
|
|
42428
|
+
"interpolated": true
|
|
42429
|
+
},
|
|
42430
|
+
{
|
|
42431
|
+
"section": "spec/v2/core/interrupt.md §Rejection",
|
|
42432
|
+
"requirement": null,
|
|
42433
|
+
"interpolated": true
|
|
42434
|
+
},
|
|
42435
|
+
{
|
|
42436
|
+
"section": "schemas/v2/suspend-request.schema.json ApprovalData.onTimeout",
|
|
42437
|
+
"requirement": "onTimeout MUST exist and declare no default — absent means reject by prose (RFC 0223)"
|
|
42438
|
+
}
|
|
42439
|
+
]
|
|
42440
|
+
},
|
|
42177
42441
|
{
|
|
42178
42442
|
"id": "openwop.it.v2-event-naming-rule.every-closed-enum-v2-event-type-is-two-kebab-segments-and-every-recorded-artifac",
|
|
42179
42443
|
"file": "v2-event-naming-rule.test.ts",
|
|
@@ -43022,9 +43286,86 @@
|
|
|
43022
43286
|
]
|
|
43023
43287
|
},
|
|
43024
43288
|
{
|
|
43025
|
-
"id": "openwop.it.v2-surface-monotone-gate.
|
|
43289
|
+
"id": "openwop.it.v2-surface-monotone-gate.positive-control-a-required-under-a-then-selecting-only-enum-members-this-diff-a",
|
|
43026
43290
|
"file": "v2-surface-monotone-gate.test.ts",
|
|
43027
43291
|
"line": 156,
|
|
43292
|
+
"title": "POSITIVE CONTROL — a `required` under a `then` selecting only enum members this diff adds is additive",
|
|
43293
|
+
"explicitId": "openwop.requirement.0197.no-reshape",
|
|
43294
|
+
"citations": [
|
|
43295
|
+
{
|
|
43296
|
+
"section": "spec/v2/core/overview.md §0a (RFC 0197 §A.1)",
|
|
43297
|
+
"requirement": null,
|
|
43298
|
+
"interpolated": true
|
|
43299
|
+
},
|
|
43300
|
+
{
|
|
43301
|
+
"section": "spec/v2/core/overview.md §0a (RFC 0197 §A.1)",
|
|
43302
|
+
"requirement": "the gate must say it admitted the conditional, not pass it silently"
|
|
43303
|
+
}
|
|
43304
|
+
]
|
|
43305
|
+
},
|
|
43306
|
+
{
|
|
43307
|
+
"id": "openwop.it.v2-surface-monotone-gate.a-required-under-a-then-an-existing-enum-value-selects-is-refused-b-6",
|
|
43308
|
+
"file": "v2-surface-monotone-gate.test.ts",
|
|
43309
|
+
"line": 171,
|
|
43310
|
+
"title": "a `required` under a `then` an EXISTING enum value selects is REFUSED (§B.6)",
|
|
43311
|
+
"explicitId": "openwop.requirement.0197.no-reshape",
|
|
43312
|
+
"citations": [
|
|
43313
|
+
{
|
|
43314
|
+
"section": "spec/v2/core/overview.md §0a (RFC 0197 §A.1)",
|
|
43315
|
+
"requirement": null,
|
|
43316
|
+
"interpolated": true
|
|
43317
|
+
},
|
|
43318
|
+
{
|
|
43319
|
+
"section": "spec/v2/core/overview.md §0a (RFC 0197 §A.1)",
|
|
43320
|
+
"requirement": "the refusal must name the property and the object"
|
|
43321
|
+
}
|
|
43322
|
+
]
|
|
43323
|
+
},
|
|
43324
|
+
{
|
|
43325
|
+
"id": "openwop.it.v2-surface-monotone-gate.a-then-pinning-only-a-pre-existing-value-or-pinning-nothing-required-licenses-no",
|
|
43326
|
+
"file": "v2-surface-monotone-gate.test.ts",
|
|
43327
|
+
"line": 186,
|
|
43328
|
+
"title": "a `then` pinning only a PRE-EXISTING value, or pinning nothing required, licenses nothing",
|
|
43329
|
+
"explicitId": "openwop.requirement.0197.no-reshape",
|
|
43330
|
+
"citations": [
|
|
43331
|
+
{
|
|
43332
|
+
"section": "spec/v2/core/overview.md §0a (RFC 0197 §A.1)",
|
|
43333
|
+
"requirement": null,
|
|
43334
|
+
"interpolated": true
|
|
43335
|
+
},
|
|
43336
|
+
{
|
|
43337
|
+
"section": "spec/v2/core/overview.md §0a (RFC 0197 §A.1)",
|
|
43338
|
+
"requirement": null,
|
|
43339
|
+
"interpolated": true
|
|
43340
|
+
},
|
|
43341
|
+
{
|
|
43342
|
+
"section": "spec/v2/core/overview.md §0a (RFC 0197 §A.1)",
|
|
43343
|
+
"requirement": "the refusal must name the property and the object"
|
|
43344
|
+
}
|
|
43345
|
+
]
|
|
43346
|
+
},
|
|
43347
|
+
{
|
|
43348
|
+
"id": "openwop.it.v2-surface-monotone-gate.a-new-value-conditional-does-not-launder-an-unconditional-required-beside-it",
|
|
43349
|
+
"file": "v2-surface-monotone-gate.test.ts",
|
|
43350
|
+
"line": 204,
|
|
43351
|
+
"title": "a new-value conditional does not launder an UNCONDITIONAL `required` beside it",
|
|
43352
|
+
"explicitId": "openwop.requirement.0197.no-reshape",
|
|
43353
|
+
"citations": [
|
|
43354
|
+
{
|
|
43355
|
+
"section": "spec/v2/core/overview.md §0a (RFC 0197 §A.1)",
|
|
43356
|
+
"requirement": null,
|
|
43357
|
+
"interpolated": true
|
|
43358
|
+
},
|
|
43359
|
+
{
|
|
43360
|
+
"section": "spec/v2/core/overview.md §0a (RFC 0197 §A.1)",
|
|
43361
|
+
"requirement": "the refusal must name the unconditional property"
|
|
43362
|
+
}
|
|
43363
|
+
]
|
|
43364
|
+
},
|
|
43365
|
+
{
|
|
43366
|
+
"id": "openwop.it.v2-surface-monotone-gate.an-open-object-closed-to-additionalproperties-false-is-refused-b-6",
|
|
43367
|
+
"file": "v2-surface-monotone-gate.test.ts",
|
|
43368
|
+
"line": 218,
|
|
43028
43369
|
"title": "an OPEN object closed to `additionalProperties: false` is REFUSED (§B.6)",
|
|
43029
43370
|
"explicitId": "openwop.requirement.0197.no-reshape",
|
|
43030
43371
|
"citations": [
|
|
@@ -43042,7 +43383,7 @@
|
|
|
43042
43383
|
{
|
|
43043
43384
|
"id": "openwop.it.v2-surface-monotone-gate.a-narrowed-type-is-refused-a-1-add-the-new-shape-beside-the-old-one",
|
|
43044
43385
|
"file": "v2-surface-monotone-gate.test.ts",
|
|
43045
|
-
"line":
|
|
43386
|
+
"line": 225,
|
|
43046
43387
|
"title": "a narrowed `type` is REFUSED (§A.1 — add the new shape beside the old one)",
|
|
43047
43388
|
"explicitId": "openwop.requirement.0197.no-reshape",
|
|
43048
43389
|
"citations": [
|
|
@@ -43060,7 +43401,7 @@
|
|
|
43060
43401
|
{
|
|
43061
43402
|
"id": "openwop.it.v2-surface-monotone-gate.a-removed-operation-is-refused-a-path-manifest-row-is-a-surface-too",
|
|
43062
43403
|
"file": "v2-surface-monotone-gate.test.ts",
|
|
43063
|
-
"line":
|
|
43404
|
+
"line": 232,
|
|
43064
43405
|
"title": "a removed OPERATION is REFUSED (a path-manifest row is a surface too)",
|
|
43065
43406
|
"explicitId": "openwop.requirement.0197.no-reshape",
|
|
43066
43407
|
"citations": [
|