@openwop/openwop-conformance 2.0.4 → 2.0.6

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/requirements.json CHANGED
@@ -3,10 +3,10 @@
3
3
  "generatedFrom": "src/scenarios/*.test.ts",
4
4
  "counts": {
5
5
  "files": 565,
6
- "tests": 2150,
7
- "withStableId": 2149,
8
- "interpolatedTitles": 1,
9
- "explicitIds": 2058
6
+ "tests": 2151,
7
+ "withStableId": 2151,
8
+ "interpolatedTitles": 0,
9
+ "explicitIds": 2106
10
10
  },
11
11
  "records": [
12
12
  {
@@ -7388,19 +7388,16 @@
7388
7388
  "explicitId": "openwop.it.chain-produced-var-roundtrip.emits-declared-producedvariables-into-variables-name-type-no-value",
7389
7389
  "citations": [
7390
7390
  {
7391
- "section": null,
7392
- "requirement": "§2.3 — one run-scoped variable emitted",
7393
- "interpolated": true
7391
+ "section": "workflow-chain-packs.md §\"Produced (run-scoped) variables (RFC 0133)\"",
7392
+ "requirement": "§2.3 — one run-scoped variable emitted"
7394
7393
  },
7395
7394
  {
7396
- "section": null,
7397
- "requirement": "§2.3 — no author-time value (distinct from parameters)",
7398
- "interpolated": true
7395
+ "section": "workflow-chain-packs.md §\"Produced (run-scoped) variables (RFC 0133)\"",
7396
+ "requirement": "§2.3 — no author-time value (distinct from parameters)"
7399
7397
  },
7400
7398
  {
7401
- "section": null,
7402
- "requirement": "§2.3 — no default value (a produced var is written during the run)",
7403
- "interpolated": true
7399
+ "section": "workflow-chain-packs.md §\"Produced (run-scoped) variables (RFC 0133)\"",
7400
+ "requirement": "§2.3 — no default value (a produced var is written during the run)"
7404
7401
  }
7405
7402
  ]
7406
7403
  },
@@ -7412,9 +7409,8 @@
7412
7409
  "explicitId": "openwop.it.chain-produced-var-roundtrip.validates-a-variable-read-of-a-declared-producedvariables-name",
7413
7410
  "citations": [
7414
7411
  {
7415
- "section": null,
7416
- "requirement": "§2.2 — declared read is closed-world valid",
7417
- "interpolated": true
7412
+ "section": "workflow-chain-packs.md §\"Produced (run-scoped) variables (RFC 0133)\"",
7413
+ "requirement": "§2.2 — declared read is closed-world valid"
7418
7414
  }
7419
7415
  ]
7420
7416
  },
@@ -7426,19 +7422,16 @@
7426
7422
  "explicitId": "openwop.it.chain-produced-var-roundtrip.rejects-a-variable-read-of-an-undeclared-name-variable-undeclared",
7427
7423
  "citations": [
7428
7424
  {
7429
- "section": null,
7430
- "requirement": "§2.2 — undeclared read MUST reject",
7431
- "interpolated": true
7425
+ "section": "workflow-chain-packs.md §\"Produced (run-scoped) variables (RFC 0133)\"",
7426
+ "requirement": "§2.2 — undeclared read MUST reject"
7432
7427
  },
7433
7428
  {
7434
- "section": null,
7435
- "requirement": "wire code variable_undeclared",
7436
- "interpolated": true
7429
+ "section": "workflow-chain-packs.md §\"Produced (run-scoped) variables (RFC 0133)\"",
7430
+ "requirement": "wire code variable_undeclared"
7437
7431
  },
7438
7432
  {
7439
- "section": null,
7440
- "requirement": "names the offending variable",
7441
- "interpolated": true
7433
+ "section": "workflow-chain-packs.md §\"Produced (run-scoped) variables (RFC 0133)\"",
7434
+ "requirement": "names the offending variable"
7442
7435
  }
7443
7436
  ]
7444
7437
  },
@@ -7450,14 +7443,12 @@
7450
7443
  "explicitId": "openwop.it.chain-produced-var-roundtrip.rejects-a-producedvariables-whose-producedby-names-a-non-existent-node-produced",
7451
7444
  "citations": [
7452
7445
  {
7453
- "section": null,
7454
- "requirement": "§2.2 — producedBy MUST be a real fragment node",
7455
- "interpolated": true
7446
+ "section": "workflow-chain-packs.md §\"Produced (run-scoped) variables (RFC 0133)\"",
7447
+ "requirement": "§2.2 — producedBy MUST be a real fragment node"
7456
7448
  },
7457
7449
  {
7458
- "section": null,
7459
- "requirement": "distinct wire code",
7460
- "interpolated": true
7450
+ "section": "workflow-chain-packs.md §\"Produced (run-scoped) variables (RFC 0133)\"",
7451
+ "requirement": "distinct wire code"
7461
7452
  }
7462
7453
  ]
7463
7454
  },
@@ -7469,9 +7460,8 @@
7469
7460
  "explicitId": "openwop.it.chain-produced-var-roundtrip.rejects-a-producedvariables-name-that-collides-with-a-parameter-channels-must-be",
7470
7461
  "citations": [
7471
7462
  {
7472
- "section": null,
7473
- "requirement": "§2.2 — a produced var colliding with a parameter name MUST reject",
7474
- "interpolated": true
7463
+ "section": "workflow-chain-packs.md §\"Produced (run-scoped) variables (RFC 0133)\"",
7464
+ "requirement": "§2.2 — a produced var colliding with a parameter name MUST reject"
7475
7465
  }
7476
7466
  ]
7477
7467
  },
@@ -7483,14 +7473,12 @@
7483
7473
  "explicitId": "openwop.it.chain-produced-var-roundtrip.validates-a-read-of-a-materialized-parameter-name-params-produced-vars-compose",
7484
7474
  "citations": [
7485
7475
  {
7486
- "section": null,
7487
- "requirement": "§2.2 — a materialized-parameter read validates",
7488
- "interpolated": true
7476
+ "section": "workflow-chain-packs.md §\"Produced (run-scoped) variables (RFC 0133)\"",
7477
+ "requirement": "§2.2 — a materialized-parameter read validates"
7489
7478
  },
7490
7479
  {
7491
- "section": null,
7492
- "requirement": "§2.2 — same read with no matching param still rejects",
7493
- "interpolated": true
7480
+ "section": "workflow-chain-packs.md §\"Produced (run-scoped) variables (RFC 0133)\"",
7481
+ "requirement": "§2.2 — same read with no matching param still rejects"
7494
7482
  }
7495
7483
  ]
7496
7484
  },
@@ -7502,19 +7490,16 @@
7502
7490
  "explicitId": "openwop.it.chain-subchain-cycle-rejected.rejects-a-chain-that-transitively-composes-itself-sub-chain-cycle",
7503
7491
  "citations": [
7504
7492
  {
7505
- "section": null,
7506
- "requirement": "self-composition MUST reject",
7507
- "interpolated": true
7493
+ "section": "workflow-chain-packs.md §\"Sub-chain composition (RFC 0133)\"",
7494
+ "requirement": "self-composition MUST reject"
7508
7495
  },
7509
7496
  {
7510
- "section": null,
7511
- "requirement": "wire code sub_chain_cycle",
7512
- "interpolated": true
7497
+ "section": "workflow-chain-packs.md §\"Sub-chain composition (RFC 0133)\"",
7498
+ "requirement": "wire code sub_chain_cycle"
7513
7499
  },
7514
7500
  {
7515
- "section": null,
7516
- "requirement": "HTTP 400",
7517
- "interpolated": true
7501
+ "section": "workflow-chain-packs.md §\"Sub-chain composition (RFC 0133)\"",
7502
+ "requirement": "HTTP 400"
7518
7503
  }
7519
7504
  ]
7520
7505
  },
@@ -7526,19 +7511,16 @@
7526
7511
  "explicitId": "openwop.it.chain-subchain-cycle-rejected.rejects-nesting-past-maxsubchaindepth-with-a-distinct-sub-chain-max-depth-exceed",
7527
7512
  "citations": [
7528
7513
  {
7529
- "section": null,
7530
- "requirement": "depth breach MUST reject (bounded recursion)",
7531
- "interpolated": true
7514
+ "section": "workflow-chain-packs.md §\"Sub-chain composition (RFC 0133)\"",
7515
+ "requirement": "depth breach MUST reject (bounded recursion)"
7532
7516
  },
7533
7517
  {
7534
- "section": null,
7535
- "requirement": "distinct wire code",
7536
- "interpolated": true
7518
+ "section": "workflow-chain-packs.md §\"Sub-chain composition (RFC 0133)\"",
7519
+ "requirement": "distinct wire code"
7537
7520
  },
7538
7521
  {
7539
- "section": null,
7540
- "requirement": "a depth breach is NOT a cycle",
7541
- "interpolated": true
7522
+ "section": "workflow-chain-packs.md §\"Sub-chain composition (RFC 0133)\"",
7523
+ "requirement": "a depth breach is NOT a cycle"
7542
7524
  }
7543
7525
  ]
7544
7526
  },
@@ -7550,9 +7532,8 @@
7550
7532
  "explicitId": "openwop.it.chain-subchain-cycle-rejected.expands-an-acyclic-tree-within-the-bound-cleanly-guard-rejects-bombs-not-benign",
7551
7533
  "citations": [
7552
7534
  {
7553
- "section": null,
7554
- "requirement": "benign acyclic tree within the bound expands",
7555
- "interpolated": true
7535
+ "section": "workflow-chain-packs.md §\"Sub-chain composition (RFC 0133)\"",
7536
+ "requirement": "benign acyclic tree within the bound expands"
7556
7537
  }
7557
7538
  ]
7558
7539
  },
@@ -7564,9 +7545,8 @@
7564
7545
  "explicitId": "openwop.it.chain-subchain-cycle-rejected.rejects-a-subchainref-that-resolves-to-no-sibling-chain-sub-chain-unresolved",
7565
7546
  "citations": [
7566
7547
  {
7567
- "section": null,
7568
- "requirement": "§1.1 — unresolvable ref rejects distinctly",
7569
- "interpolated": true
7548
+ "section": "workflow-chain-packs.md §\"Sub-chain composition (RFC 0133)\"",
7549
+ "requirement": "§1.1 — unresolvable ref rejects distinctly"
7570
7550
  }
7571
7551
  ]
7572
7552
  },
@@ -7643,19 +7623,16 @@
7643
7623
  "explicitId": "openwop.it.chain-subchain-sibling.co-registers-the-referenced-sibling-as-its-own-workflow",
7644
7624
  "citations": [
7645
7625
  {
7646
- "section": null,
7647
- "requirement": "§1.3 step 2 — one distinct sibling ref ⇒ one co-registered child",
7648
- "interpolated": true
7626
+ "section": "workflow-chain-packs.md §\"Sub-chain composition (RFC 0133)\"",
7627
+ "requirement": "§1.3 step 2 — one distinct sibling ref ⇒ one co-registered child"
7649
7628
  },
7650
7629
  {
7651
- "section": null,
7652
- "requirement": "child carries the composed chainId",
7653
- "interpolated": true
7630
+ "section": "workflow-chain-packs.md §\"Sub-chain composition (RFC 0133)\"",
7631
+ "requirement": "child carries the composed chainId"
7654
7632
  },
7655
7633
  {
7656
- "section": null,
7657
- "requirement": "child is a fully expanded fragment (its own registered workflow)",
7658
- "interpolated": true
7634
+ "section": "workflow-chain-packs.md §\"Sub-chain composition (RFC 0133)\"",
7635
+ "requirement": "child is a fully expanded fragment (its own registered workflow)"
7659
7636
  }
7660
7637
  ]
7661
7638
  },
@@ -7667,14 +7644,12 @@
7667
7644
  "explicitId": "openwop.it.chain-subchain-sibling.mints-a-deterministic-tenant-scoped-version-pinned-child-id",
7668
7645
  "citations": [
7669
7646
  {
7670
- "section": null,
7671
- "requirement": "§1.3 step 2 — deterministic (tenantId, childChainId, version) id",
7672
- "interpolated": true
7647
+ "section": "workflow-chain-packs.md §\"Sub-chain composition (RFC 0133)\"",
7648
+ "requirement": "§1.3 step 2 — deterministic (tenantId, childChainId, version) id"
7673
7649
  },
7674
7650
  {
7675
- "section": null,
7676
- "requirement": "repeat instantiation in-tenant converges",
7677
- "interpolated": true
7651
+ "section": "workflow-chain-packs.md §\"Sub-chain composition (RFC 0133)\"",
7652
+ "requirement": "repeat instantiation in-tenant converges"
7678
7653
  }
7679
7654
  ]
7680
7655
  },
@@ -7686,14 +7661,12 @@
7686
7661
  "explicitId": "openwop.it.chain-subchain-sibling.scopes-the-child-id-per-tenant-two-tenants-never-collide-on-the-global-registry",
7687
7662
  "citations": [
7688
7663
  {
7689
- "section": null,
7690
- "requirement": "tenant-a mints an id",
7691
- "interpolated": true
7664
+ "section": "workflow-chain-packs.md §\"Sub-chain composition (RFC 0133)\"",
7665
+ "requirement": "tenant-a mints an id"
7692
7666
  },
7693
7667
  {
7694
- "section": null,
7695
- "requirement": "§1.3 SECURITY sub-chain-child-tenant-scoped — distinct tenants ⇒ distinct child ids, no cross-tenant collision",
7696
- "interpolated": true
7668
+ "section": "workflow-chain-packs.md §\"Sub-chain composition (RFC 0133)\"",
7669
+ "requirement": "§1.3 SECURITY sub-chain-child-tenant-scoped — distinct tenants ⇒ distinct child ids, no cross-tenant collision"
7697
7670
  }
7698
7671
  ]
7699
7672
  },
@@ -7705,14 +7678,12 @@
7705
7678
  "explicitId": "openwop.it.chain-subchain-sibling.registers-a-child-referenced-twice-exactly-once-dedup-by-deterministic-id",
7706
7679
  "citations": [
7707
7680
  {
7708
- "section": null,
7709
- "requirement": "§1.3 step 2 — a shared child registers once",
7710
- "interpolated": true
7681
+ "section": "workflow-chain-packs.md §\"Sub-chain composition (RFC 0133)\"",
7682
+ "requirement": "§1.3 step 2 — a shared child registers once"
7711
7683
  },
7712
7684
  {
7713
- "section": null,
7714
- "requirement": "both build-0 + build-1 collapse to one child",
7715
- "interpolated": true
7685
+ "section": "workflow-chain-packs.md §\"Sub-chain composition (RFC 0133)\"",
7686
+ "requirement": "both build-0 + build-1 collapse to one child"
7716
7687
  }
7717
7688
  ]
7718
7689
  },
@@ -7724,19 +7695,16 @@
7724
7695
  "explicitId": "openwop.it.chain-subchain-sibling.rewrites-config-subchainref-the-minted-child-config-workflowid",
7725
7696
  "citations": [
7726
7697
  {
7727
- "section": null,
7728
- "requirement": "both dispatch nodes present",
7729
- "interpolated": true
7698
+ "section": "workflow-chain-packs.md §\"Sub-chain composition (RFC 0133)\"",
7699
+ "requirement": "both dispatch nodes present"
7730
7700
  },
7731
7701
  {
7732
- "section": null,
7733
- "requirement": "§1.3 step 3 — subChainRef rewritten to minted child id",
7734
- "interpolated": true
7702
+ "section": "workflow-chain-packs.md §\"Sub-chain composition (RFC 0133)\"",
7703
+ "requirement": "§1.3 step 3 — subChainRef rewritten to minted child id"
7735
7704
  },
7736
7705
  {
7737
- "section": null,
7738
- "requirement": "§1.3 step 3 — transient subChainRef key dropped from the runtime config",
7739
- "interpolated": true
7706
+ "section": "workflow-chain-packs.md §\"Sub-chain composition (RFC 0133)\"",
7707
+ "requirement": "§1.3 step 3 — transient subChainRef key dropped from the runtime config"
7740
7708
  }
7741
7709
  ]
7742
7710
  },
@@ -7748,9 +7716,8 @@
7748
7716
  "explicitId": "openwop.it.chain-subchain-sibling.preserves-the-child-reference-at-runtime-concrete-workflowid-unlike-inline-mode",
7749
7717
  "citations": [
7750
7718
  {
7751
- "section": null,
7752
- "requirement": "parent HOLDS the co-registered child at runtime",
7753
- "interpolated": true
7719
+ "section": "workflow-chain-packs.md §\"Sub-chain composition (RFC 0133)\"",
7720
+ "requirement": "parent HOLDS the co-registered child at runtime"
7754
7721
  }
7755
7722
  ]
7756
7723
  },
@@ -12267,15 +12234,14 @@
12267
12234
  "file": "era-key-stamped-v1.test.ts",
12268
12235
  "line": 75,
12269
12236
  "title": "a run the host just created carries eventLogSchemaVersion",
12270
- "explicitId": null,
12237
+ "explicitId": "openwop.requirement.version-negotiation.era-key-stamped",
12271
12238
  "citations": [
12272
12239
  {
12273
- "section": null,
12274
- "requirement": "every persisted run document MUST carry an eventLogSchemaVersion — the field is prose-only (run-snapshot.schema.json requires just runId, workflowId and status), so a snapshot without it validates cleanly and only this check can see its absence",
12275
- "interpolated": true
12240
+ "section": "spec/v1/version-negotiation.md §Stamping",
12241
+ "requirement": "every persisted run document MUST carry an eventLogSchemaVersion — the field is prose-only (run-snapshot.schema.json requires just runId, workflowId and status), so a snapshot without it validates cleanly and only this check can see its absence"
12276
12242
  },
12277
12243
  {
12278
- "section": null,
12244
+ "section": "spec/v1/version-negotiation.md §Stamping",
12279
12245
  "requirement": null,
12280
12246
  "interpolated": true
12281
12247
  }
@@ -12286,7 +12252,7 @@
12286
12252
  "file": "era-key-stamped-v1.test.ts",
12287
12253
  "line": 98,
12288
12254
  "title": "a freshly created run is not classified legacy by the host's own rule",
12289
- "explicitId": null,
12255
+ "explicitId": "openwop.requirement.version-negotiation.era-key-not-legacy",
12290
12256
  "citations": [
12291
12257
  {
12292
12258
  "section": "spec/v1/version-negotiation.md §Legacy detection",
@@ -12300,15 +12266,14 @@
12300
12266
  "file": "era-key-stamped-v1.test.ts",
12301
12267
  "line": 124,
12302
12268
  "title": "a run the host just created carries engineVersion — the legacy escape cannot reach it",
12303
- "explicitId": null,
12269
+ "explicitId": "openwop.requirement.version-negotiation.engine-version-stamped",
12304
12270
  "citations": [
12305
12271
  {
12306
- "section": null,
12307
- "requirement": "every persisted run document MUST carry engineVersion; the \"MAY omit\" escape applies only to legacy runs that predate the contract, and this run was created moments ago",
12308
- "interpolated": true
12272
+ "section": "spec/v1/version-negotiation.md §Stamping",
12273
+ "requirement": "every persisted run document MUST carry engineVersion; the \"MAY omit\" escape applies only to legacy runs that predate the contract, and this run was created moments ago"
12309
12274
  },
12310
12275
  {
12311
- "section": null,
12276
+ "section": "spec/v1/version-negotiation.md §Stamping",
12312
12277
  "requirement": null,
12313
12278
  "interpolated": true
12314
12279
  }
@@ -16391,7 +16356,7 @@
16391
16356
  {
16392
16357
  "id": "openwop.it.memory-attribution-replay-stable.a-replay-mode-fork-introduces-no-memory-written-with-a-new-memoryid",
16393
16358
  "file": "memory-attribution-replay-stable.test.ts",
16394
- "line": 52,
16359
+ "line": 76,
16395
16360
  "title": "a replay-mode fork introduces no memory.written with a new memoryId",
16396
16361
  "explicitId": "openwop.it.memory-attribution-replay-stable.a-replay-mode-fork-introduces-no-memory-written-with-a-new-memoryid",
16397
16362
  "citations": [
@@ -18732,14 +18697,12 @@
18732
18697
  "explicitId": "openwop.it.pause-resume.pause-transitions-to-paused-resume-returns-the-run-to-running",
18733
18698
  "citations": [
18734
18699
  {
18735
- "section": null,
18736
- "requirement": ":pause MUST return 202 on a pausable run",
18737
- "interpolated": true
18700
+ "section": "rest-endpoints.md POST /v1/runs/{runId}:pause",
18701
+ "requirement": ":pause MUST return 202 on a pausable run"
18738
18702
  },
18739
18703
  {
18740
- "section": null,
18741
- "requirement": ":resume MUST return 202 on a paused run",
18742
- "interpolated": true
18704
+ "section": "rest-endpoints.md POST /v1/runs/{runId}:resume",
18705
+ "requirement": ":resume MUST return 202 on a paused run"
18743
18706
  }
18744
18707
  ]
18745
18708
  },
@@ -18751,14 +18714,12 @@
18751
18714
  "explicitId": "openwop.it.pause-resume.resuming-a-running-not-paused-run-returns-409-with-details-runstatus",
18752
18715
  "citations": [
18753
18716
  {
18754
- "section": null,
18755
- "requirement": ":resume on a non-paused run MUST return 409",
18756
- "interpolated": true
18717
+ "section": "rest-endpoints.md POST /v1/runs/{runId}:resume",
18718
+ "requirement": ":resume on a non-paused run MUST return 409"
18757
18719
  },
18758
18720
  {
18759
- "section": null,
18760
- "requirement": "the 409 MUST carry details.runStatus with the actual state",
18761
- "interpolated": true
18721
+ "section": "rest-endpoints.md POST /v1/runs/{runId}:resume",
18722
+ "requirement": "the 409 MUST carry details.runStatus with the actual state"
18762
18723
  }
18763
18724
  ]
18764
18725
  },
@@ -18770,29 +18731,24 @@
18770
18731
  "explicitId": "openwop.it.pause-resume.pause-on-an-already-paused-run-returns-409-with-details-runstatus-paused-unless",
18771
18732
  "citations": [
18772
18733
  {
18773
- "section": null,
18774
- "requirement": ":pause MUST return 202 on a pausable run",
18775
- "interpolated": true
18734
+ "section": "rest-endpoints.md POST /v1/runs/{runId}:pause",
18735
+ "requirement": ":pause MUST return 202 on a pausable run"
18776
18736
  },
18777
18737
  {
18778
- "section": null,
18779
- "requirement": ":pause on an already-paused run without a matching Idempotency-Key MUST return 409",
18780
- "interpolated": true
18738
+ "section": "rest-endpoints.md POST /v1/runs/{runId}:pause",
18739
+ "requirement": ":pause on an already-paused run without a matching Idempotency-Key MUST return 409"
18781
18740
  },
18782
18741
  {
18783
- "section": null,
18784
- "requirement": "the 409 MUST carry details.runStatus: paused",
18785
- "interpolated": true
18742
+ "section": "rest-endpoints.md POST /v1/runs/{runId}:pause",
18743
+ "requirement": "the 409 MUST carry details.runStatus: paused"
18786
18744
  },
18787
18745
  {
18788
- "section": null,
18789
- "requirement": ":pause with an Idempotency-Key MUST return 202 on a pausable run",
18790
- "interpolated": true
18746
+ "section": "rest-endpoints.md POST /v1/runs/{runId}:pause",
18747
+ "requirement": ":pause with an Idempotency-Key MUST return 202 on a pausable run"
18791
18748
  },
18792
18749
  {
18793
- "section": null,
18794
- "requirement": "a :pause carrying the original Idempotency-Key MUST return 202 with the cached response, not 409",
18795
- "interpolated": true
18750
+ "section": "rest-endpoints.md POST /v1/runs/{runId}:pause",
18751
+ "requirement": "a :pause carrying the original Idempotency-Key MUST return 202 with the cached response, not 409"
18796
18752
  }
18797
18753
  ]
18798
18754
  },
@@ -18804,9 +18760,8 @@
18804
18760
  "explicitId": "openwop.it.pause-resume.pause-on-a-completed-cancelled-failed-run-must-return-409",
18805
18761
  "citations": [
18806
18762
  {
18807
- "section": null,
18808
- "requirement": ":pause on a terminal run MUST return 409",
18809
- "interpolated": true
18763
+ "section": "rest-endpoints.md POST /v1/runs/{runId}:pause",
18764
+ "requirement": ":pause on a terminal run MUST return 409"
18810
18765
  }
18811
18766
  ]
18812
18767
  },
@@ -18818,12 +18773,11 @@
18818
18773
  "explicitId": "openwop.it.pause-resume.under-drain-current-node-node-completed-precedes-run-paused-in-the-log",
18819
18774
  "citations": [
18820
18775
  {
18821
- "section": null,
18822
- "requirement": ":pause with drainPolicy drain-current-node MUST return 202 (pause requested)",
18823
- "interpolated": true
18776
+ "section": "rest-endpoints.md POST /v1/runs/{runId}:pause",
18777
+ "requirement": ":pause with drainPolicy drain-current-node MUST return 202 (pause requested)"
18824
18778
  },
18825
18779
  {
18826
- "section": null,
18780
+ "section": "rest-endpoints.md POST /v1/runs/{runId}:pause",
18827
18781
  "requirement": null,
18828
18782
  "interpolated": true
18829
18783
  }
@@ -18837,14 +18791,12 @@
18837
18791
  "explicitId": "openwop.it.pause-resume.pause-must-not-silently-override-an-active-interrupt-suspend",
18838
18792
  "citations": [
18839
18793
  {
18840
- "section": null,
18841
- "requirement": ":pause-during-suspend MUST surface the active waiting-* status in the conflict envelope",
18842
- "interpolated": true
18794
+ "section": "rest-endpoints.md POST /v1/runs/{runId}:pause",
18795
+ "requirement": ":pause-during-suspend MUST surface the active waiting-* status in the conflict envelope"
18843
18796
  },
18844
18797
  {
18845
- "section": null,
18846
- "requirement": ":pause-during-suspend MUST NOT silently discard the active interrupt",
18847
- "interpolated": true
18798
+ "section": "rest-endpoints.md POST /v1/runs/{runId}:pause",
18799
+ "requirement": ":pause-during-suspend MUST NOT silently discard the active interrupt"
18848
18800
  }
18849
18801
  ]
18850
18802
  },
@@ -23240,9 +23192,8 @@
23240
23192
  "explicitId": "openwop.it.safefetch-live-audit.a-blocked-real-run-safefetch-emits-the-durable-agent-toolcalled-agent-toolreturn",
23241
23193
  "citations": [
23242
23194
  {
23243
- "section": null,
23244
- "requirement": "the safe-fetch-run seam MUST return the runId of the real run it executed the safeFetch in",
23245
- "interpolated": true
23195
+ "section": "host-capabilities.md §host.http",
23196
+ "requirement": "the safe-fetch-run seam MUST return the runId of the real run it executed the safeFetch in"
23246
23197
  }
23247
23198
  ]
23248
23199
  },
@@ -23254,9 +23205,8 @@
23254
23205
  "explicitId": "openwop.it.safefetch-live-audit.a-fetched-real-run-safefetch-also-emits-the-durable-pair-success-path-coverage-s",
23255
23206
  "citations": [
23256
23207
  {
23257
- "section": null,
23258
- "requirement": "the safe-fetch-run seam MUST return the runId of the real run it executed the fetch in",
23259
- "interpolated": true
23208
+ "section": "host-capabilities.md §host.http",
23209
+ "requirement": "the safe-fetch-run seam MUST return the runId of the real run it executed the fetch in"
23260
23210
  }
23261
23211
  ]
23262
23212
  },
@@ -25849,10 +25799,10 @@
25849
25799
  "file": "v2-advertised-fixtures-exist.test.ts",
25850
25800
  "line": 62,
25851
25801
  "title": "a sampled advertised fixture is actually creatable, not just listed",
25852
- "explicitId": null,
25802
+ "explicitId": "openwop.requirement.0168.advertised-fixtures-exist",
25853
25803
  "citations": [
25854
25804
  {
25855
- "section": null,
25805
+ "section": "spec/v2/core/conformance.md §Fixtures",
25856
25806
  "requirement": null,
25857
25807
  "interpolated": true
25858
25808
  }
@@ -25863,17 +25813,16 @@
25863
25813
  "file": "v2-advertised-path-space-served.test.ts",
25864
25814
  "line": 107,
25865
25815
  "title": "a host advertising major 2 reaches the surfaces it already serves under /v1",
25866
- "explicitId": null,
25816
+ "explicitId": "openwop.requirement.0172.advertised-path-space-served",
25867
25817
  "citations": [
25868
25818
  {
25869
- "section": null,
25819
+ "section": "spec/v2/core/versioning.md §1.2",
25870
25820
  "requirement": null,
25871
25821
  "interpolated": true
25872
25822
  },
25873
25823
  {
25874
- "section": null,
25875
- "requirement": "at least one non-well-known surface MUST be reachable under major 2, or the advertisement rests entirely on the one resource the header selects",
25876
- "interpolated": true
25824
+ "section": "spec/v2/core/versioning.md §1.2",
25825
+ "requirement": "at least one non-well-known surface MUST be reachable under major 2, or the advertisement rests entirely on the one resource the header selects"
25877
25826
  }
25878
25827
  ]
25879
25828
  },
@@ -25920,14 +25869,13 @@
25920
25869
  "explicitId": "openwop.requirement.0170.assurance-downgrade-audited.refused",
25921
25870
  "citations": [
25922
25871
  {
25923
- "section": null,
25872
+ "section": "spec/v2/core/identity.md §2.3",
25924
25873
  "requirement": null,
25925
25874
  "interpolated": true
25926
25875
  },
25927
25876
  {
25928
- "section": null,
25929
- "requirement": "the refusal code MUST be sender_constraint_missing",
25930
- "interpolated": true
25877
+ "section": "spec/v2/core/identity.md §2.3",
25878
+ "requirement": "the refusal code MUST be sender_constraint_missing"
25931
25879
  }
25932
25880
  ]
25933
25881
  },
@@ -25939,12 +25887,12 @@
25939
25887
  "explicitId": "openwop.requirement.0170.assurance-downgrade-audited.audited",
25940
25888
  "citations": [
25941
25889
  {
25942
- "section": null,
25890
+ "section": "spec/v2/core/identity.md §2.3",
25943
25891
  "requirement": null,
25944
25892
  "interpolated": true
25945
25893
  },
25946
25894
  {
25947
- "section": null,
25895
+ "section": "spec/v2/core/identity.md §2.3",
25948
25896
  "requirement": null,
25949
25897
  "interpolated": true
25950
25898
  }
@@ -25958,14 +25906,13 @@
25958
25906
  "explicitId": "openwop.requirement.0168.bundle-v3-signed.schema-closed-root",
25959
25907
  "citations": [
25960
25908
  {
25961
- "section": null,
25909
+ "section": "conformance.md §\"Bundle v3\" (RFC 0168 §E)",
25962
25910
  "requirement": null,
25963
25911
  "interpolated": true
25964
25912
  },
25965
25913
  {
25966
- "section": null,
25967
- "requirement": "the v3 root is closed — an unknown root key MUST be rejected (RFC 0168 §E.1)",
25968
- "interpolated": true
25914
+ "section": "conformance.md §\"Bundle v3\" (RFC 0168 §E)",
25915
+ "requirement": "the v3 root is closed — an unknown root key MUST be rejected (RFC 0168 §E.1)"
25969
25916
  }
25970
25917
  ]
25971
25918
  },
@@ -25977,24 +25924,21 @@
25977
25924
  "explicitId": "openwop.requirement.0168.bundle-v3-signed.witness-digest",
25978
25925
  "citations": [
25979
25926
  {
25980
- "section": null,
25927
+ "section": "conformance.md §\"Bundle v3\" (RFC 0168 §E)",
25981
25928
  "requirement": null,
25982
25929
  "interpolated": true
25983
25930
  },
25984
25931
  {
25985
- "section": null,
25986
- "requirement": "the Ed25519 attestation MUST verify under the host key",
25987
- "interpolated": true
25932
+ "section": "conformance.md §\"Bundle v3\" (RFC 0168 §E)",
25933
+ "requirement": "the Ed25519 attestation MUST verify under the host key"
25988
25934
  },
25989
25935
  {
25990
- "section": null,
25991
- "requirement": "a witnessSha256 that is not the digest of the rows MUST be refused with witness-digest (RFC 0148 §C)",
25992
- "interpolated": true
25936
+ "section": "conformance.md §\"Bundle v3\" (RFC 0168 §E)",
25937
+ "requirement": "a witnessSha256 that is not the digest of the rows MUST be refused with witness-digest (RFC 0148 §C)"
25993
25938
  },
25994
25939
  {
25995
- "section": null,
25996
- "requirement": "the attestation covers witnessSha256, so a flipped digest MUST NOT verify under the host key",
25997
- "interpolated": true
25940
+ "section": "conformance.md §\"Bundle v3\" (RFC 0168 §E)",
25941
+ "requirement": "the attestation covers witnessSha256, so a flipped digest MUST NOT verify under the host key"
25998
25942
  }
25999
25943
  ]
26000
25944
  },
@@ -26006,24 +25950,21 @@
26006
25950
  "explicitId": "openwop.requirement.0168.bundle-v3-signed.independent-self-signed",
26007
25951
  "citations": [
26008
25952
  {
26009
- "section": null,
26010
- "requirement": "an independent claim whose verifier key id equals the host key id MUST be refused with independent-self-signed (RFC 0148 R5)",
26011
- "interpolated": true
25953
+ "section": "conformance.md §\"Bundle v3\" (RFC 0168 §E)",
25954
+ "requirement": "an independent claim whose verifier key id equals the host key id MUST be refused with independent-self-signed (RFC 0148 R5)"
26012
25955
  },
26013
25956
  {
26014
- "section": null,
26015
- "requirement": "a refused independent claim MUST NOT certify",
26016
- "interpolated": true
25957
+ "section": "conformance.md §\"Bundle v3\" (RFC 0168 §E)",
25958
+ "requirement": "a refused independent claim MUST NOT certify"
26017
25959
  },
26018
25960
  {
26019
- "section": null,
25961
+ "section": "conformance.md §\"Bundle v3\" (RFC 0168 §E)",
26020
25962
  "requirement": null,
26021
25963
  "interpolated": true
26022
25964
  },
26023
25965
  {
26024
- "section": null,
26025
- "requirement": "the verifier attestation MUST verify under the verifier key",
26026
- "interpolated": true
25966
+ "section": "conformance.md §\"Bundle v3\" (RFC 0168 §E)",
25967
+ "requirement": "the verifier attestation MUST verify under the verifier key"
26027
25968
  }
26028
25969
  ]
26029
25970
  },
@@ -26035,7 +25976,7 @@
26035
25976
  "explicitId": "openwop.requirement.0169.capabilities-root-closed.valid",
26036
25977
  "citations": [
26037
25978
  {
26038
- "section": null,
25979
+ "section": "spec/v2/core/capabilities.md §3",
26039
25980
  "requirement": null,
26040
25981
  "interpolated": true
26041
25982
  }
@@ -26049,9 +25990,8 @@
26049
25990
  "explicitId": "openwop.requirement.0169.capabilities-root-closed.unknown-root-key",
26050
25991
  "citations": [
26051
25992
  {
26052
- "section": null,
26053
- "requirement": "any root key that is not a metadata key, a declared family, or `extensions` MUST fail validation",
26054
- "interpolated": true
25993
+ "section": "spec/v2/core/capabilities.md §3",
25994
+ "requirement": "any root key that is not a metadata key, a declared family, or `extensions` MUST fail validation"
26055
25995
  }
26056
25996
  ]
26057
25997
  },
@@ -26063,9 +26003,8 @@
26063
26003
  "explicitId": "openwop.requirement.0169.capabilities-root-closed.dotted-key",
26064
26004
  "citations": [
26065
26005
  {
26066
- "section": null,
26067
- "requirement": "a dotted key (the v1 `host.<family>` mirror) MUST fail validation at the closed root",
26068
- "interpolated": true
26006
+ "section": "spec/v2/core/capabilities.md §3",
26007
+ "requirement": "a dotted key (the v1 `host.<family>` mirror) MUST fail validation at the closed root"
26069
26008
  }
26070
26009
  ]
26071
26010
  },
@@ -26077,9 +26016,8 @@
26077
26016
  "explicitId": "openwop.requirement.0169.capabilities-root-closed.wrapper",
26078
26017
  "citations": [
26079
26018
  {
26080
- "section": null,
26081
- "requirement": "the v1 `capabilities` wrapper MUST fail validation at the closed root (migration row C2.1)",
26082
- "interpolated": true
26019
+ "section": "spec/v2/core/capabilities.md §3",
26020
+ "requirement": "the v1 `capabilities` wrapper MUST fail validation at the closed root (migration row C2.1)"
26083
26021
  }
26084
26022
  ]
26085
26023
  },
@@ -26104,22 +26042,22 @@
26104
26042
  "explicitId": "openwop.requirement.0169.capability-record-shape.required-fields",
26105
26043
  "citations": [
26106
26044
  {
26107
- "section": null,
26045
+ "section": "spec/v2/core/capabilities.md §2",
26108
26046
  "requirement": null,
26109
26047
  "interpolated": true
26110
26048
  },
26111
26049
  {
26112
- "section": null,
26050
+ "section": "spec/v2/core/capabilities.md §2",
26113
26051
  "requirement": null,
26114
26052
  "interpolated": true
26115
26053
  },
26116
26054
  {
26117
- "section": null,
26055
+ "section": "spec/v2/core/capabilities.md §2",
26118
26056
  "requirement": null,
26119
26057
  "interpolated": true
26120
26058
  },
26121
26059
  {
26122
- "section": null,
26060
+ "section": "spec/v2/core/capabilities.md §2",
26123
26061
  "requirement": null,
26124
26062
  "interpolated": true
26125
26063
  }
@@ -26133,12 +26071,12 @@
26133
26071
  "explicitId": "openwop.requirement.0169.capability-record-shape.until-iff-not-stable",
26134
26072
  "citations": [
26135
26073
  {
26136
- "section": null,
26074
+ "section": "spec/v2/core/capabilities.md §2",
26137
26075
  "requirement": null,
26138
26076
  "interpolated": true
26139
26077
  },
26140
26078
  {
26141
- "section": null,
26079
+ "section": "spec/v2/core/capabilities.md §2",
26142
26080
  "requirement": null,
26143
26081
  "interpolated": true
26144
26082
  }
@@ -26166,14 +26104,13 @@
26166
26104
  "explicitId": "openwop.requirement.0177.chain-pin-exact.range-refused",
26167
26105
  "citations": [
26168
26106
  {
26169
- "section": null,
26107
+ "section": "workflow-chain-packs.md §\"Exact pins\" (RFC 0177 §E.1)",
26170
26108
  "requirement": null,
26171
26109
  "interpolated": true
26172
26110
  },
26173
26111
  {
26174
- "section": null,
26175
- "requirement": "the refusal MUST carry an error code in the canonical envelope",
26176
- "interpolated": true
26112
+ "section": "workflow-chain-packs.md §\"Exact pins\" (RFC 0177 §E.1)",
26113
+ "requirement": "the refusal MUST carry an error code in the canonical envelope"
26177
26114
  }
26178
26115
  ]
26179
26116
  },
@@ -26185,7 +26122,7 @@
26185
26122
  "explicitId": "openwop.requirement.0177.chain-pin-exact.exact-accepted",
26186
26123
  "citations": [
26187
26124
  {
26188
- "section": null,
26125
+ "section": "workflow-chain-packs.md §\"Exact pins\" (RFC 0177 §E.1)",
26189
26126
  "requirement": null,
26190
26127
  "interpolated": true
26191
26128
  }
@@ -26199,27 +26136,26 @@
26199
26136
  "explicitId": "openwop.requirement.0168.coherence-not-in-bundle.disjoint-by-construction",
26200
26137
  "citations": [
26201
26138
  {
26202
- "section": null,
26203
- "requirement": "the corpus ledger MUST carry at least one requirement id",
26204
- "interpolated": true
26139
+ "section": "conformance.md §\"Two products, two ledgers\" (RFC 0168 §D.1)",
26140
+ "requirement": "the corpus ledger MUST carry at least one requirement id"
26205
26141
  },
26206
26142
  {
26207
- "section": null,
26143
+ "section": "conformance.md §\"Two products, two ledgers\" (RFC 0168 §D.1)",
26208
26144
  "requirement": null,
26209
26145
  "interpolated": true
26210
26146
  },
26211
26147
  {
26212
- "section": null,
26148
+ "section": "conformance.md §\"Two products, two ledgers\" (RFC 0168 §D.1)",
26213
26149
  "requirement": null,
26214
26150
  "interpolated": true
26215
26151
  },
26216
26152
  {
26217
- "section": null,
26153
+ "section": "conformance.md §\"Two products, two ledgers\" (RFC 0168 §D.1)",
26218
26154
  "requirement": null,
26219
26155
  "interpolated": true
26220
26156
  },
26221
26157
  {
26222
- "section": null,
26158
+ "section": "conformance.md §\"Two products, two ledgers\" (RFC 0168 §D.1)",
26223
26159
  "requirement": null,
26224
26160
  "interpolated": true
26225
26161
  }
@@ -26233,14 +26169,13 @@
26233
26169
  "explicitId": "openwop.requirement.0168.coherence-not-in-bundle.schema-forbids-coherence-ids",
26234
26170
  "citations": [
26235
26171
  {
26236
- "section": null,
26172
+ "section": "conformance.md §\"Two products, two ledgers\" (RFC 0168 §D.1)",
26237
26173
  "requirement": null,
26238
26174
  "interpolated": true
26239
26175
  },
26240
26176
  {
26241
- "section": null,
26242
- "requirement": "a v3 bundle carrying an openwop.it.spec-corpus-validity. id MUST be rejected by the bundle schema",
26243
- "interpolated": true
26177
+ "section": "conformance.md §\"Two products, two ledgers\" (RFC 0168 §D.1)",
26178
+ "requirement": "a v3 bundle carrying an openwop.it.spec-corpus-validity. id MUST be rejected by the bundle schema"
26244
26179
  }
26245
26180
  ]
26246
26181
  },
@@ -26303,24 +26238,20 @@
26303
26238
  "explicitId": "openwop.requirement.0171.configurable-closed.schema",
26304
26239
  "citations": [
26305
26240
  {
26306
- "section": null,
26307
- "requirement": "{ version: 1 } is the smallest valid configurable (version REQUIRED, const 1)",
26308
- "interpolated": true
26241
+ "section": "spec/v2/core/runs.md §configurable",
26242
+ "requirement": "{ version: 1 } is the smallest valid configurable (version REQUIRED, const 1)"
26309
26243
  },
26310
26244
  {
26311
- "section": null,
26312
- "requirement": "a dotted key (`ai.provider` as a string key) MUST fail the closed nested schema",
26313
- "interpolated": true
26245
+ "section": "spec/v2/core/runs.md §configurable",
26246
+ "requirement": "a dotted key (`ai.provider` as a string key) MUST fail the closed nested schema"
26314
26247
  },
26315
26248
  {
26316
- "section": null,
26317
- "requirement": "an unknown root key MUST fail the closed schema (additionalProperties: false in the standalone artifact)",
26318
- "interpolated": true
26249
+ "section": "spec/v2/core/runs.md §configurable",
26250
+ "requirement": "an unknown root key MUST fail the closed schema (additionalProperties: false in the standalone artifact)"
26319
26251
  },
26320
26252
  {
26321
- "section": null,
26322
- "requirement": "a configurable without `version` MUST fail",
26323
- "interpolated": true
26253
+ "section": "spec/v2/core/runs.md §configurable",
26254
+ "requirement": "a configurable without `version` MUST fail"
26324
26255
  }
26325
26256
  ]
26326
26257
  },
@@ -26332,14 +26263,12 @@
26332
26263
  "explicitId": "openwop.requirement.0171.configurable-closed.dotted-key",
26333
26264
  "citations": [
26334
26265
  {
26335
- "section": null,
26336
- "requirement": "a dotted key inside a section MUST be rejected with 400",
26337
- "interpolated": true
26266
+ "section": "spec/v2/core/runs.md §configurable",
26267
+ "requirement": "a dotted key inside a section MUST be rejected with 400"
26338
26268
  },
26339
26269
  {
26340
- "section": null,
26341
- "requirement": "the refusal code MUST be validation_error",
26342
- "interpolated": true
26270
+ "section": "spec/v2/core/runs.md §configurable",
26271
+ "requirement": "the refusal code MUST be validation_error"
26343
26272
  }
26344
26273
  ]
26345
26274
  },
@@ -26351,14 +26280,12 @@
26351
26280
  "explicitId": "openwop.requirement.0171.configurable-closed.unknown-key",
26352
26281
  "citations": [
26353
26282
  {
26354
- "section": null,
26355
- "requirement": "an unknown root key MUST be rejected with 400",
26356
- "interpolated": true
26283
+ "section": "spec/v2/core/runs.md §configurable",
26284
+ "requirement": "an unknown root key MUST be rejected with 400"
26357
26285
  },
26358
26286
  {
26359
- "section": null,
26360
- "requirement": "the refusal code MUST be validation_error",
26361
- "interpolated": true
26287
+ "section": "spec/v2/core/runs.md §configurable",
26288
+ "requirement": "the refusal code MUST be validation_error"
26362
26289
  }
26363
26290
  ]
26364
26291
  },
@@ -26367,7 +26294,7 @@
26367
26294
  "file": "v2-created-run-readable.test.ts",
26368
26295
  "line": 63,
26369
26296
  "title": "a run created at this base is readable and pollable at this base by the id it returned, and its links stay on this base",
26370
- "explicitId": null,
26297
+ "explicitId": "openwop.requirement.0172.created-run-readable",
26371
26298
  "citations": [
26372
26299
  {
26373
26300
  "section": "spec/v2/core/identity.md §5",
@@ -26375,7 +26302,7 @@
26375
26302
  "interpolated": true
26376
26303
  },
26377
26304
  {
26378
- "section": null,
26305
+ "section": "spec/v2/core/runs.md §Create",
26379
26306
  "requirement": null,
26380
26307
  "interpolated": true
26381
26308
  },
@@ -26385,12 +26312,12 @@
26385
26312
  "interpolated": true
26386
26313
  },
26387
26314
  {
26388
- "section": null,
26315
+ "section": "spec/v2/core/runs.md §Create",
26389
26316
  "requirement": null,
26390
26317
  "interpolated": true
26391
26318
  },
26392
26319
  {
26393
- "section": null,
26320
+ "section": "spec/v2/core/runs.md §Create",
26394
26321
  "requirement": null,
26395
26322
  "interpolated": true
26396
26323
  }
@@ -26430,19 +26357,16 @@
26430
26357
  "explicitId": "openwop.requirement.0172.dual-stack-negotiation.unlisted-major",
26431
26358
  "citations": [
26432
26359
  {
26433
- "section": null,
26434
- "requirement": "a header naming a major not in protocolVersions[] MUST be answered 406",
26435
- "interpolated": true
26360
+ "section": "spec/v2/core/versioning.md §1.3",
26361
+ "requirement": "a header naming a major not in protocolVersions[] MUST be answered 406"
26436
26362
  },
26437
26363
  {
26438
- "section": null,
26439
- "requirement": "the refusal code MUST be protocol_version_unsupported",
26440
- "interpolated": true
26364
+ "section": "spec/v2/core/versioning.md §1.3",
26365
+ "requirement": "the refusal code MUST be protocol_version_unsupported"
26441
26366
  },
26442
26367
  {
26443
- "section": null,
26444
- "requirement": "details.protocolVersions[] MUST echo the advertised list",
26445
- "interpolated": true
26368
+ "section": "spec/v2/core/versioning.md §1.3",
26369
+ "requirement": "details.protocolVersions[] MUST echo the advertised list"
26446
26370
  }
26447
26371
  ]
26448
26372
  },
@@ -26454,14 +26378,12 @@
26454
26378
  "explicitId": "openwop.requirement.0172.dual-stack-negotiation.v1-path-mismatch",
26455
26379
  "citations": [
26456
26380
  {
26457
- "section": null,
26458
- "requirement": "a /v1/… path with OpenWOP-Version other than 1 MUST be answered 400",
26459
- "interpolated": true
26381
+ "section": "spec/v2/core/versioning.md §1.3",
26382
+ "requirement": "a /v1/… path with OpenWOP-Version other than 1 MUST be answered 400"
26460
26383
  },
26461
26384
  {
26462
- "section": null,
26463
- "requirement": "the refusal code MUST be protocol_version_mismatch",
26464
- "interpolated": true
26385
+ "section": "spec/v2/core/versioning.md §1.3",
26386
+ "requirement": "the refusal code MUST be protocol_version_mismatch"
26465
26387
  }
26466
26388
  ]
26467
26389
  },
@@ -26637,19 +26559,18 @@
26637
26559
  "explicitId": "openwop.requirement.0171.enum-growth-rule.unknown-member-accepted",
26638
26560
  "citations": [
26639
26561
  {
26640
- "section": null,
26562
+ "section": "spec/v2/core/events.md §Types (Growth)",
26641
26563
  "requirement": null,
26642
26564
  "interpolated": true
26643
26565
  },
26644
26566
  {
26645
- "section": null,
26567
+ "section": "spec/v2/core/events.md §Types (Growth)",
26646
26568
  "requirement": null,
26647
26569
  "interpolated": true
26648
26570
  },
26649
26571
  {
26650
- "section": null,
26651
- "requirement": "the vendor branch admits an optional third segment (<org>.<domain>.<name>)",
26652
- "interpolated": true
26572
+ "section": "spec/v2/core/events.md §Types (Growth)",
26573
+ "requirement": "the vendor branch admits an optional third segment (<org>.<domain>.<name>)"
26653
26574
  }
26654
26575
  ]
26655
26576
  },
@@ -26661,19 +26582,16 @@
26661
26582
  "explicitId": "openwop.requirement.0171.enum-growth-rule.reserved-rejected",
26662
26583
  "citations": [
26663
26584
  {
26664
- "section": null,
26665
- "requirement": "openwop. is the only reserved prefix; a type under it that is not in the enum MUST fail",
26666
- "interpolated": true
26585
+ "section": "spec/v2/core/events.md §Types (Growth)",
26586
+ "requirement": "openwop. is the only reserved prefix; a type under it that is not in the enum MUST fail"
26667
26587
  },
26668
26588
  {
26669
- "section": null,
26670
- "requirement": "a member outside the positive pattern (upper-case) MUST fail",
26671
- "interpolated": true
26589
+ "section": "spec/v2/core/events.md §Types (Growth)",
26590
+ "requirement": "a member outside the positive pattern (upper-case) MUST fail"
26672
26591
  },
26673
26592
  {
26674
- "section": null,
26675
- "requirement": "a single-segment member MUST fail — every type is <domain>.<name> or <org>.<name>",
26676
- "interpolated": true
26593
+ "section": "spec/v2/core/events.md §Types (Growth)",
26594
+ "requirement": "a single-segment member MUST fail — every type is <domain>.<name> or <org>.<name>"
26677
26595
  }
26678
26596
  ]
26679
26597
  },
@@ -26682,25 +26600,25 @@
26682
26600
  "file": "v2-era-2-append-vocabulary.test.ts",
26683
26601
  "line": 48,
26684
26602
  "title": "a host append to an open era-2 run keeps the log in v1 vocabulary, so the whole log still reads",
26685
- "explicitId": null,
26603
+ "explicitId": "openwop.requirement.0176.era-2-append-vocabulary",
26686
26604
  "citations": [
26687
26605
  {
26688
- "section": null,
26606
+ "section": "spec/v2/core/persistence.md §The writer rule",
26689
26607
  "requirement": null,
26690
26608
  "interpolated": true
26691
26609
  },
26692
26610
  {
26693
- "section": null,
26611
+ "section": "spec/v2/core/persistence.md §The writer rule",
26694
26612
  "requirement": null,
26695
26613
  "interpolated": true
26696
26614
  },
26697
26615
  {
26698
- "section": null,
26616
+ "section": "spec/v2/core/persistence.md §The writer rule",
26699
26617
  "requirement": null,
26700
26618
  "interpolated": true
26701
26619
  },
26702
26620
  {
26703
- "section": null,
26621
+ "section": "spec/v2/core/persistence.md §The writer rule",
26704
26622
  "requirement": null,
26705
26623
  "interpolated": true
26706
26624
  }
@@ -26711,10 +26629,10 @@
26711
26629
  "file": "v2-era-2-append-vocabulary.test.ts",
26712
26630
  "line": 133,
26713
26631
  "title": "the run keeps the era it was created with; an append does not promote it to era 3",
26714
- "explicitId": null,
26632
+ "explicitId": "openwop.requirement.0176.era-2-append-vocabulary",
26715
26633
  "citations": [
26716
26634
  {
26717
- "section": null,
26635
+ "section": "spec/v2/core/persistence.md §The writer rule",
26718
26636
  "requirement": null,
26719
26637
  "interpolated": true
26720
26638
  }
@@ -26728,12 +26646,11 @@
26728
26646
  "explicitId": "openwop.requirement.0176.era-key",
26729
26647
  "citations": [
26730
26648
  {
26731
- "section": null,
26732
- "requirement": "eventLogSchemaVersion is REQUIRED on every run snapshot (run-snapshot.schema.json) — the era key is never absent on a run a v2 host created",
26733
- "interpolated": true
26649
+ "section": "spec/v2/core/persistence.md §The era key",
26650
+ "requirement": "eventLogSchemaVersion is REQUIRED on every run snapshot (run-snapshot.schema.json) — the era key is never absent on a run a v2 host created"
26734
26651
  },
26735
26652
  {
26736
- "section": null,
26653
+ "section": "spec/v2/core/persistence.md §The era key",
26737
26654
  "requirement": null,
26738
26655
  "interpolated": true
26739
26656
  }
@@ -26757,9 +26674,8 @@
26757
26674
  "interpolated": true
26758
26675
  },
26759
26676
  {
26760
- "section": null,
26761
- "requirement": "the value stamped on a run created now MUST equal the value discovery advertises",
26762
- "interpolated": true
26677
+ "section": "spec/v2/core/persistence.md §The era key",
26678
+ "requirement": "the value stamped on a run created now MUST equal the value discovery advertises"
26763
26679
  }
26764
26680
  ]
26765
26681
  },
@@ -26768,20 +26684,20 @@
26768
26684
  "file": "v2-era-stamp-universal.test.ts",
26769
26685
  "line": 40,
26770
26686
  "title": "discovery advertises an era the host actually writes, and a new run carries it",
26771
- "explicitId": null,
26687
+ "explicitId": "openwop.requirement.0176.era-stamp-universal",
26772
26688
  "citations": [
26773
26689
  {
26774
- "section": null,
26690
+ "section": "spec/v2/core/persistence.md §The era key",
26775
26691
  "requirement": null,
26776
26692
  "interpolated": true
26777
26693
  },
26778
26694
  {
26779
- "section": null,
26695
+ "section": "spec/v2/core/persistence.md §The era key",
26780
26696
  "requirement": null,
26781
26697
  "interpolated": true
26782
26698
  },
26783
26699
  {
26784
- "section": null,
26700
+ "section": "spec/v2/core/persistence.md §The era key",
26785
26701
  "requirement": null,
26786
26702
  "interpolated": true
26787
26703
  }
@@ -26792,12 +26708,11 @@
26792
26708
  "file": "v2-era-stamp-universal.test.ts",
26793
26709
  "line": 80,
26794
26710
  "title": "a v2-era host stamps 3, so its new runs are never read as the v1 era",
26795
- "explicitId": null,
26711
+ "explicitId": "openwop.requirement.0176.era-stamp-universal",
26796
26712
  "citations": [
26797
26713
  {
26798
- "section": null,
26799
- "requirement": "a host advertising era 3 MUST stamp 3 on every run it creates — an unstamped run made after the cut is indistinguishable from a pre-cut run and every reader translates it as era 2, which is a silent wrong read rather than an error",
26800
- "interpolated": true
26714
+ "section": "spec/v2/core/persistence.md §The era key",
26715
+ "requirement": "a host advertising era 3 MUST stamp 3 on every run it creates — an unstamped run made after the cut is indistinguishable from a pre-cut run and every reader translates it as era 2, which is a silent wrong read rather than an error"
26801
26716
  }
26802
26717
  ]
26803
26718
  },
@@ -26809,12 +26724,12 @@
26809
26724
  "explicitId": "openwop.requirement.0171.error-registry.envelope",
26810
26725
  "citations": [
26811
26726
  {
26812
- "section": null,
26727
+ "section": "spec/v2/core/errors.md §The envelope",
26813
26728
  "requirement": null,
26814
26729
  "interpolated": true
26815
26730
  },
26816
26731
  {
26817
- "section": null,
26732
+ "section": "spec/v2/core/errors.md §The envelope",
26818
26733
  "requirement": null,
26819
26734
  "interpolated": true
26820
26735
  }
@@ -26858,7 +26773,7 @@
26858
26773
  "explicitId": "openwop.requirement.0171.event-type-closed.type",
26859
26774
  "citations": [
26860
26775
  {
26861
- "section": null,
26776
+ "section": "spec/v2/core/events.md §Types",
26862
26777
  "requirement": null,
26863
26778
  "interpolated": true
26864
26779
  }
@@ -26890,17 +26805,17 @@
26890
26805
  "explicitId": "openwop.requirement.0176.fork-a-v1-run.prefix",
26891
26806
  "citations": [
26892
26807
  {
26893
- "section": null,
26808
+ "section": "spec/v2/core/replay.md §Forking a v1 run",
26894
26809
  "requirement": null,
26895
26810
  "interpolated": true
26896
26811
  },
26897
26812
  {
26898
- "section": null,
26813
+ "section": "spec/v2/core/replay.md §Forking a v1 run",
26899
26814
  "requirement": null,
26900
26815
  "interpolated": true
26901
26816
  },
26902
26817
  {
26903
- "section": null,
26818
+ "section": "spec/v2/core/replay.md §Forking a v1 run",
26904
26819
  "requirement": null,
26905
26820
  "interpolated": true
26906
26821
  },
@@ -26919,9 +26834,8 @@
26919
26834
  "explicitId": "openwop.requirement.0176.fork-a-v1-run.legacy-subject",
26920
26835
  "citations": [
26921
26836
  {
26922
- "section": null,
26923
- "requirement": "the fork's log MUST carry run.started at its head",
26924
- "interpolated": true
26837
+ "section": "spec/v2/core/replay.md §Forking a v1 run",
26838
+ "requirement": "the fork's log MUST carry run.started at its head"
26925
26839
  },
26926
26840
  {
26927
26841
  "section": "spec/v2/core/identity.md §1.2",
@@ -26947,19 +26861,17 @@
26947
26861
  "explicitId": "openwop.requirement.0177.form-when-reuses-edge-conditions",
26948
26862
  "citations": [
26949
26863
  {
26950
- "section": null,
26864
+ "section": "form-content-packs.md §\"Conditional visibility\" (RFC 0177 §E.4)",
26951
26865
  "requirement": null,
26952
26866
  "interpolated": true
26953
26867
  },
26954
26868
  {
26955
- "section": null,
26956
- "requirement": "a `when` outside the edge-condition grammar (a second expression language) MUST be rejected",
26957
- "interpolated": true
26869
+ "section": "form-content-packs.md §\"Conditional visibility\" (RFC 0177 §E.4)",
26870
+ "requirement": "a `when` outside the edge-condition grammar (a second expression language) MUST be rejected"
26958
26871
  },
26959
26872
  {
26960
- "section": null,
26961
- "requirement": "an operator outside expression|equals|notEquals|contains|regex|truthy|falsy MUST be rejected",
26962
- "interpolated": true
26873
+ "section": "form-content-packs.md §\"Conditional visibility\" (RFC 0177 §E.4)",
26874
+ "requirement": "an operator outside expression|equals|notEquals|contains|regex|truthy|falsy MUST be rejected"
26963
26875
  }
26964
26876
  ]
26965
26877
  },
@@ -26971,7 +26883,7 @@
26971
26883
  "explicitId": "openwop.requirement.0171.header-scheme.no-legacy-headers",
26972
26884
  "citations": [
26973
26885
  {
26974
- "section": null,
26886
+ "section": "spec/v2/core/headers.md §Removed in v2",
26975
26887
  "requirement": null,
26976
26888
  "interpolated": true
26977
26889
  }
@@ -27004,12 +26916,12 @@
27004
26916
  "explicitId": "openwop.requirement.0170.id-grammar.snapshot",
27005
26917
  "citations": [
27006
26918
  {
27007
- "section": null,
26919
+ "section": "spec/v2/core/identity.md §5",
27008
26920
  "requirement": null,
27009
26921
  "interpolated": true
27010
26922
  },
27011
26923
  {
27012
- "section": null,
26924
+ "section": "spec/v2/core/identity.md §5",
27013
26925
  "requirement": null,
27014
26926
  "interpolated": true
27015
26927
  }
@@ -27023,14 +26935,13 @@
27023
26935
  "explicitId": "openwop.requirement.0170.id-grammar.events",
27024
26936
  "citations": [
27025
26937
  {
27026
- "section": null,
26938
+ "section": "spec/v2/core/identity.md §5",
27027
26939
  "requirement": null,
27028
26940
  "interpolated": true
27029
26941
  },
27030
26942
  {
27031
- "section": null,
27032
- "requirement": "every event MUST carry the run's own runId",
27033
- "interpolated": true
26943
+ "section": "spec/v2/core/identity.md §5",
26944
+ "requirement": "every event MUST carry the run's own runId"
27034
26945
  }
27035
26946
  ]
27036
26947
  },
@@ -27042,12 +26953,12 @@
27042
26953
  "explicitId": "openwop.requirement.0170.id-grammar.tenant-binding",
27043
26954
  "citations": [
27044
26955
  {
27045
- "section": null,
26956
+ "section": "spec/v2/core/identity.md §5",
27046
26957
  "requirement": null,
27047
26958
  "interpolated": true
27048
26959
  },
27049
26960
  {
27050
- "section": null,
26961
+ "section": "spec/v2/core/identity.md §5",
27051
26962
  "requirement": null,
27052
26963
  "interpolated": true
27053
26964
  },
@@ -27065,14 +26976,12 @@
27065
26976
  "explicitId": "openwop.requirement.0170.idempotency-key-grammar.valid-accepted",
27066
26977
  "citations": [
27067
26978
  {
27068
- "section": null,
27069
- "requirement": "the suite's key MUST itself be inside ^[A-Za-z0-9._~-]{22,128}$",
27070
- "interpolated": true
26979
+ "section": "spec/v2/core/idempotency.md §Layer 1",
26980
+ "requirement": "the suite's key MUST itself be inside ^[A-Za-z0-9._~-]{22,128}$"
27071
26981
  },
27072
26982
  {
27073
- "section": null,
27074
- "requirement": "a UUIDv4-strength key in base64url form satisfies the grammar and MUST NOT be refused as idempotency_key_invalid",
27075
- "interpolated": true
26983
+ "section": "spec/v2/core/idempotency.md §Layer 1",
26984
+ "requirement": "a UUIDv4-strength key in base64url form satisfies the grammar and MUST NOT be refused as idempotency_key_invalid"
27076
26985
  }
27077
26986
  ]
27078
26987
  },
@@ -27084,14 +26993,12 @@
27084
26993
  "explicitId": "openwop.requirement.0170.idempotency-key-grammar.invalid-refused",
27085
26994
  "citations": [
27086
26995
  {
27087
- "section": null,
27088
- "requirement": "a host MUST reject an Idempotency-Key outside ^[A-Za-z0-9._~-]{22,128}$ with 400",
27089
- "interpolated": true
26996
+ "section": "spec/v2/core/idempotency.md §Layer 1",
26997
+ "requirement": "a host MUST reject an Idempotency-Key outside ^[A-Za-z0-9._~-]{22,128}$ with 400"
27090
26998
  },
27091
26999
  {
27092
- "section": null,
27093
- "requirement": "the refusal code MUST be idempotency_key_invalid",
27094
- "interpolated": true
27000
+ "section": "spec/v2/core/idempotency.md §Layer 1",
27001
+ "requirement": "the refusal code MUST be idempotency_key_invalid"
27095
27002
  }
27096
27003
  ]
27097
27004
  },
@@ -27103,7 +27010,7 @@
27103
27010
  "explicitId": "openwop.requirement.0170.interrupt-token-scheme.unprefixed-refused",
27104
27011
  "citations": [
27105
27012
  {
27106
- "section": null,
27013
+ "section": "spec/v2/core/identity.md §4",
27107
27014
  "requirement": null,
27108
27015
  "interpolated": true
27109
27016
  },
@@ -27122,14 +27029,12 @@
27122
27029
  "explicitId": "openwop.requirement.0170.interrupt-token-scheme.unheld-kid-refused",
27123
27030
  "citations": [
27124
27031
  {
27125
- "section": null,
27126
- "requirement": "a host MUST refuse a token whose kid it does not hold with 401",
27127
- "interpolated": true
27032
+ "section": "spec/v2/core/identity.md §4",
27033
+ "requirement": "a host MUST refuse a token whose kid it does not hold with 401"
27128
27034
  },
27129
27035
  {
27130
- "section": null,
27131
- "requirement": "the refusal code MUST be interrupt_token_invalid (one code per state — never not_found for a token the host cannot verify)",
27132
- "interpolated": true
27036
+ "section": "spec/v2/core/identity.md §4",
27037
+ "requirement": "the refusal code MUST be interrupt_token_invalid (one code per state — never not_found for a token the host cannot verify)"
27133
27038
  }
27134
27039
  ]
27135
27040
  },
@@ -27141,7 +27046,7 @@
27141
27046
  "explicitId": "openwop.requirement.0170.lane-issuer-advertised.members",
27142
27047
  "citations": [
27143
27048
  {
27144
- "section": null,
27049
+ "section": "spec/v2/core/identity.md §2.1",
27145
27050
  "requirement": null,
27146
27051
  "interpolated": true
27147
27052
  },
@@ -27219,14 +27124,14 @@
27219
27124
  ]
27220
27125
  },
27221
27126
  {
27222
- "id": null,
27127
+ "id": "openwop.requirement.0172.malformed-body-envelope",
27223
27128
  "file": "v2-malformed-body-envelope.test.ts",
27224
27129
  "line": 53,
27225
27130
  "title": null,
27226
- "explicitId": null,
27131
+ "explicitId": "openwop.requirement.0172.malformed-body-envelope",
27227
27132
  "citations": [
27228
27133
  {
27229
- "section": null,
27134
+ "section": "spec/v2/core/versioning.md §1.4",
27230
27135
  "requirement": null,
27231
27136
  "interpolated": true
27232
27137
  },
@@ -27259,14 +27164,12 @@
27259
27164
  "explicitId": "openwop.requirement.0177.manifest-ceiling-refused.unbounded",
27260
27165
  "citations": [
27261
27166
  {
27262
- "section": null,
27263
- "requirement": "an unbounded range does not admit protocol major 2 and MUST be refused with 400 pack_engine_unsupported",
27264
- "interpolated": true
27167
+ "section": "packs.md §\"The engine range\" (RFC 0177 §A.1)",
27168
+ "requirement": "an unbounded range does not admit protocol major 2 and MUST be refused with 400 pack_engine_unsupported"
27265
27169
  },
27266
27170
  {
27267
- "section": null,
27268
- "requirement": "the refusal code MUST be pack_engine_unsupported (not pack_runtime_requirement_unmet)",
27269
- "interpolated": true
27171
+ "section": "packs.md §\"The engine range\" (RFC 0177 §A.1)",
27172
+ "requirement": "the refusal code MUST be pack_engine_unsupported (not pack_runtime_requirement_unmet)"
27270
27173
  }
27271
27174
  ]
27272
27175
  },
@@ -27278,14 +27181,12 @@
27278
27181
  "explicitId": "openwop.requirement.0177.manifest-ceiling-refused.v1-ceiling",
27279
27182
  "citations": [
27280
27183
  {
27281
- "section": null,
27282
- "requirement": "a <2.0.0 ceiling does not admit protocol major 2 and MUST be refused with 400 pack_engine_unsupported",
27283
- "interpolated": true
27184
+ "section": "packs.md §\"The engine range\" (RFC 0177 §A.1)",
27185
+ "requirement": "a <2.0.0 ceiling does not admit protocol major 2 and MUST be refused with 400 pack_engine_unsupported"
27284
27186
  },
27285
27187
  {
27286
- "section": null,
27287
- "requirement": "the refusal code MUST be pack_engine_unsupported",
27288
- "interpolated": true
27188
+ "section": "packs.md §\"The engine range\" (RFC 0177 §A.1)",
27189
+ "requirement": "the refusal code MUST be pack_engine_unsupported"
27289
27190
  }
27290
27191
  ]
27291
27192
  },
@@ -27297,7 +27198,7 @@
27297
27198
  "explicitId": "openwop.requirement.0177.manifest-ceiling-refused.v2-installs",
27298
27199
  "citations": [
27299
27200
  {
27300
- "section": null,
27201
+ "section": "packs.md §\"The engine range\" (RFC 0177 §A.1)",
27301
27202
  "requirement": null,
27302
27203
  "interpolated": true
27303
27204
  }
@@ -27311,7 +27212,7 @@
27311
27212
  "explicitId": "openwop.requirement.0177.manifest-hatch-carried.agents-x-field",
27312
27213
  "citations": [
27313
27214
  {
27314
- "section": null,
27215
+ "section": "packs.md §\"The manifest schema family\" (RFC 0177 §C.2)",
27315
27216
  "requirement": null,
27316
27217
  "interpolated": true
27317
27218
  }
@@ -27325,7 +27226,7 @@
27325
27226
  "explicitId": "openwop.requirement.0177.manifest-hatch-carried.prompt-template-x-field",
27326
27227
  "citations": [
27327
27228
  {
27328
- "section": null,
27229
+ "section": "packs.md §\"The manifest schema family\" (RFC 0177 §C.2)",
27329
27230
  "requirement": null,
27330
27231
  "interpolated": true
27331
27232
  }
@@ -27339,14 +27240,12 @@
27339
27240
  "explicitId": "openwop.requirement.0172.min-client-version",
27340
27241
  "citations": [
27341
27242
  {
27342
- "section": null,
27343
- "requirement": "minClientVersion MUST use the <major>.<minor> grammar (axis 15, as axis 1)",
27344
- "interpolated": true
27243
+ "section": "spec/v2/core/versioning.md §1.5",
27244
+ "requirement": "minClientVersion MUST use the <major>.<minor> grammar (axis 15, as axis 1)"
27345
27245
  },
27346
27246
  {
27347
- "section": null,
27348
- "requirement": "a 426 refusal MUST carry client_version_unsupported",
27349
- "interpolated": true
27247
+ "section": "spec/v2/core/versioning.md §1.5",
27248
+ "requirement": "a 426 refusal MUST carry client_version_unsupported"
27350
27249
  },
27351
27250
  {
27352
27251
  "section": "spec/v2/core/errors.md §The envelope",
@@ -27488,19 +27387,17 @@
27488
27387
  "explicitId": "openwop.requirement.0170.owner-subject-required.subject",
27489
27388
  "citations": [
27490
27389
  {
27491
- "section": null,
27492
- "requirement": "RunSnapshot.owner.subject is REQUIRED",
27493
- "interpolated": true
27390
+ "section": "spec/v2/core/identity.md §1.1",
27391
+ "requirement": "RunSnapshot.owner.subject is REQUIRED"
27494
27392
  },
27495
27393
  {
27496
- "section": null,
27394
+ "section": "spec/v2/core/identity.md §1.1",
27497
27395
  "requirement": null,
27498
27396
  "interpolated": true
27499
27397
  },
27500
27398
  {
27501
- "section": null,
27502
- "requirement": "RunSnapshot.owner.tenant is REQUIRED",
27503
- "interpolated": true
27399
+ "section": "spec/v2/core/identity.md §1.1",
27400
+ "requirement": "RunSnapshot.owner.tenant is REQUIRED"
27504
27401
  }
27505
27402
  ]
27506
27403
  },
@@ -27512,19 +27409,16 @@
27512
27409
  "explicitId": "openwop.requirement.0170.owner-subject-required.no-principal",
27513
27410
  "citations": [
27514
27411
  {
27515
- "section": null,
27516
- "requirement": "`principal` is removed from RunSnapshot.owner — subject.subjectId carries it",
27517
- "interpolated": true
27412
+ "section": "spec/v2/core/identity.md §1.1",
27413
+ "requirement": "`principal` is removed from RunSnapshot.owner — subject.subjectId carries it"
27518
27414
  },
27519
27415
  {
27520
- "section": null,
27521
- "requirement": "`principalKind` is removed from RunSnapshot.owner — subject.kind carries it",
27522
- "interpolated": true
27416
+ "section": "spec/v2/core/identity.md §1.1",
27417
+ "requirement": "`principalKind` is removed from RunSnapshot.owner — subject.kind carries it"
27523
27418
  },
27524
27419
  {
27525
- "section": null,
27526
- "requirement": "owner is the closed block { tenant, workspace?, subject }",
27527
- "interpolated": true
27420
+ "section": "spec/v2/core/identity.md §1.1",
27421
+ "requirement": "owner is the closed block { tenant, workspace?, subject }"
27528
27422
  }
27529
27423
  ]
27530
27424
  },
@@ -27637,12 +27531,12 @@
27637
27531
  "explicitId": "openwop.requirement.0171.payload-registry-closed",
27638
27532
  "citations": [
27639
27533
  {
27640
- "section": null,
27534
+ "section": "spec/v2/core/events.md §Payloads",
27641
27535
  "requirement": null,
27642
27536
  "interpolated": true
27643
27537
  },
27644
27538
  {
27645
- "section": null,
27539
+ "section": "spec/v2/core/events.md §Payloads",
27646
27540
  "requirement": null,
27647
27541
  "interpolated": true
27648
27542
  }
@@ -27656,14 +27550,12 @@
27656
27550
  "explicitId": "openwop.requirement.0177.peer-dependency-declared.undefined-key",
27657
27551
  "citations": [
27658
27552
  {
27659
- "section": null,
27660
- "requirement": "a key absent from spec/v2/declaration.json MUST be refused with 400 pack_peer_dependency_undefined",
27661
- "interpolated": true
27553
+ "section": "packs.md §\"Peer-dependency identifiers\" (RFC 0177 §B.1)",
27554
+ "requirement": "a key absent from spec/v2/declaration.json MUST be refused with 400 pack_peer_dependency_undefined"
27662
27555
  },
27663
27556
  {
27664
- "section": null,
27665
- "requirement": "the refusal code MUST be pack_peer_dependency_undefined",
27666
- "interpolated": true
27557
+ "section": "packs.md §\"Peer-dependency identifiers\" (RFC 0177 §B.1)",
27558
+ "requirement": "the refusal code MUST be pack_peer_dependency_undefined"
27667
27559
  }
27668
27560
  ]
27669
27561
  },
@@ -27689,14 +27581,13 @@
27689
27581
  "explicitId": "openwop.requirement.0176.pinned-run-disposition.cancelled",
27690
27582
  "citations": [
27691
27583
  {
27692
- "section": null,
27584
+ "section": "spec/v2/core/persistence.md §Runs pinned to v1",
27693
27585
  "requirement": null,
27694
27586
  "interpolated": true
27695
27587
  },
27696
27588
  {
27697
- "section": null,
27698
- "requirement": "the cancellation MUST be an event on the run's own log (run.cancelled), not a silent status flip",
27699
- "interpolated": true
27589
+ "section": "spec/v2/core/persistence.md §Runs pinned to v1",
27590
+ "requirement": "the cancellation MUST be an event on the run's own log (run.cancelled), not a silent status flip"
27700
27591
  },
27701
27592
  {
27702
27593
  "section": "run-event-payloads.schema.json runCancelled.reason",
@@ -27709,14 +27600,12 @@
27709
27600
  "interpolated": true
27710
27601
  },
27711
27602
  {
27712
- "section": null,
27713
- "requirement": "the version.pinned row MUST survive the cancellation — the log is preserved (adversarial review 4)",
27714
- "interpolated": true
27603
+ "section": "spec/v2/core/persistence.md §Runs pinned to v1",
27604
+ "requirement": "the version.pinned row MUST survive the cancellation — the log is preserved (adversarial review 4)"
27715
27605
  },
27716
27606
  {
27717
- "section": null,
27718
- "requirement": "version.pinned is never rewritten: the pin still names the change id it was seeded with",
27719
- "interpolated": true
27607
+ "section": "spec/v2/core/persistence.md §Runs pinned to v1",
27608
+ "requirement": "version.pinned is never rewritten: the pin still names the change id it was seeded with"
27720
27609
  }
27721
27610
  ]
27722
27611
  },
@@ -27728,19 +27617,18 @@
27728
27617
  "explicitId": "openwop.requirement.0176.pinned-run-disposition.continued",
27729
27618
  "citations": [
27730
27619
  {
27731
- "section": null,
27620
+ "section": "spec/v2/core/persistence.md §Runs pinned to v1",
27732
27621
  "requirement": null,
27733
27622
  "interpolated": true
27734
27623
  },
27735
27624
  {
27736
- "section": null,
27625
+ "section": "spec/v2/core/persistence.md §Runs pinned to v1",
27737
27626
  "requirement": null,
27738
27627
  "interpolated": true
27739
27628
  },
27740
27629
  {
27741
- "section": null,
27742
- "requirement": "the pin is honoured verbatim — version.pinned reads back with the seeded changeId and version",
27743
- "interpolated": true
27630
+ "section": "spec/v2/core/persistence.md §Runs pinned to v1",
27631
+ "requirement": "the pin is honoured verbatim — version.pinned reads back with the seeded changeId and version"
27744
27632
  }
27745
27633
  ]
27746
27634
  },
@@ -27752,44 +27640,36 @@
27752
27640
  "explicitId": "openwop.requirement.0171.poll-cursor-v2.shape",
27753
27641
  "citations": [
27754
27642
  {
27755
- "section": null,
27756
- "requirement": "pollRunEvents MUST answer 200",
27757
- "interpolated": true
27643
+ "section": "spec/v2/core/events.md §Poll",
27644
+ "requirement": "pollRunEvents MUST answer 200"
27758
27645
  },
27759
27646
  {
27760
- "section": null,
27761
- "requirement": "the poll response MUST be exactly { runId, events, lastSequence, status, isTerminal } (closed)",
27762
- "interpolated": true
27647
+ "section": "spec/v2/core/events.md §Poll",
27648
+ "requirement": "the poll response MUST be exactly { runId, events, lastSequence, status, isTerminal } (closed)"
27763
27649
  },
27764
27650
  {
27765
- "section": null,
27766
- "requirement": "runId MUST echo the polled run",
27767
- "interpolated": true
27651
+ "section": "spec/v2/core/events.md §Poll",
27652
+ "requirement": "runId MUST echo the polled run"
27768
27653
  },
27769
27654
  {
27770
- "section": null,
27771
- "requirement": "events MUST be an array",
27772
- "interpolated": true
27655
+ "section": "spec/v2/core/events.md §Poll",
27656
+ "requirement": "events MUST be an array"
27773
27657
  },
27774
27658
  {
27775
- "section": null,
27776
- "requirement": "lastSequence is the highest sequence in the log (−1 when empty)",
27777
- "interpolated": true
27659
+ "section": "spec/v2/core/events.md §Poll",
27660
+ "requirement": "lastSequence is the highest sequence in the log (−1 when empty)"
27778
27661
  },
27779
27662
  {
27780
- "section": null,
27781
- "requirement": "status is the snapshot status",
27782
- "interpolated": true
27663
+ "section": "spec/v2/core/events.md §Poll",
27664
+ "requirement": "status is the snapshot status"
27783
27665
  },
27784
27666
  {
27785
- "section": null,
27786
- "requirement": "isTerminal is a boolean",
27787
- "interpolated": true
27667
+ "section": "spec/v2/core/events.md §Poll",
27668
+ "requirement": "isTerminal is a boolean"
27788
27669
  },
27789
27670
  {
27790
- "section": null,
27791
- "requirement": "lastSequence MUST equal the highest sequence returned when the response carries the whole log",
27792
- "interpolated": true
27671
+ "section": "spec/v2/core/events.md §Poll",
27672
+ "requirement": "lastSequence MUST equal the highest sequence returned when the response carries the whole log"
27793
27673
  }
27794
27674
  ]
27795
27675
  },
@@ -27801,9 +27681,8 @@
27801
27681
  "explicitId": "openwop.requirement.0171.poll-cursor-v2.from-first",
27802
27682
  "citations": [
27803
27683
  {
27804
- "section": null,
27805
- "requirement": "omission of afterSequence means \"from the first event\": the first returned sequence MUST be 0",
27806
- "interpolated": true
27684
+ "section": "spec/v2/core/events.md §Poll",
27685
+ "requirement": "omission of afterSequence means \"from the first event\": the first returned sequence MUST be 0"
27807
27686
  }
27808
27687
  ]
27809
27688
  },
@@ -27815,19 +27694,17 @@
27815
27694
  "explicitId": "openwop.requirement.0171.poll-cursor-v2.after-sequence",
27816
27695
  "citations": [
27817
27696
  {
27818
- "section": null,
27819
- "requirement": "afterSequence is an integer ≥ 0 and MUST be accepted",
27820
- "interpolated": true
27697
+ "section": "spec/v2/core/events.md §Poll",
27698
+ "requirement": "afterSequence is an integer ≥ 0 and MUST be accepted"
27821
27699
  },
27822
27700
  {
27823
- "section": null,
27701
+ "section": "spec/v2/core/events.md §Poll",
27824
27702
  "requirement": null,
27825
27703
  "interpolated": true
27826
27704
  },
27827
27705
  {
27828
- "section": null,
27829
- "requirement": "the cursor is exclusive and the log is not renumbered: afterSequence=first yields exactly the rest of the log",
27830
- "interpolated": true
27706
+ "section": "spec/v2/core/events.md §Poll",
27707
+ "requirement": "the cursor is exclusive and the log is not renumbered: afterSequence=first yields exactly the rest of the log"
27831
27708
  }
27832
27709
  ]
27833
27710
  },
@@ -27839,14 +27716,12 @@
27839
27716
  "explicitId": "openwop.requirement.0171.poll-cursor-v2.past-end",
27840
27717
  "citations": [
27841
27718
  {
27842
- "section": null,
27843
- "requirement": "a cursor past the end of the log MUST return 200",
27844
- "interpolated": true
27719
+ "section": "spec/v2/core/events.md §Poll",
27720
+ "requirement": "a cursor past the end of the log MUST return 200"
27845
27721
  },
27846
27722
  {
27847
- "section": null,
27848
- "requirement": "a cursor past the end of the log MUST return an empty events array",
27849
- "interpolated": true
27723
+ "section": "spec/v2/core/events.md §Poll",
27724
+ "requirement": "a cursor past the end of the log MUST return an empty events array"
27850
27725
  }
27851
27726
  ]
27852
27727
  },
@@ -27858,19 +27733,17 @@
27858
27733
  "explicitId": "openwop.requirement.0172.preferred-version-default.member",
27859
27734
  "citations": [
27860
27735
  {
27861
- "section": null,
27862
- "requirement": "preferredVersion is REQUIRED root metadata with the <major>.<minor> grammar",
27863
- "interpolated": true
27736
+ "section": "spec/v2/core/versioning.md §1.1",
27737
+ "requirement": "preferredVersion is REQUIRED root metadata with the <major>.<minor> grammar"
27864
27738
  },
27865
27739
  {
27866
- "section": null,
27740
+ "section": "spec/v2/core/versioning.md §1.1",
27867
27741
  "requirement": null,
27868
27742
  "interpolated": true
27869
27743
  },
27870
27744
  {
27871
- "section": null,
27872
- "requirement": "on a host serving a single major, preferredVersion MUST equal protocolVersion (RFC 0179 §A.1)",
27873
- "interpolated": true
27745
+ "section": "spec/v2/core/versioning.md §1.1",
27746
+ "requirement": "on a host serving a single major, preferredVersion MUST equal protocolVersion (RFC 0179 §A.1)"
27874
27747
  }
27875
27748
  ]
27876
27749
  },
@@ -27927,9 +27800,8 @@
27927
27800
  "explicitId": "openwop.requirement.0169.profiles-derived-only.no-root-profiles",
27928
27801
  "citations": [
27929
27802
  {
27930
- "section": null,
27931
- "requirement": "no `profiles[]` exists at the v2 root; a profile is a derived predicate, never a wire field (row C2.10)",
27932
- "interpolated": true
27803
+ "section": "spec/v2/core/capabilities.md §7",
27804
+ "requirement": "no `profiles[]` exists at the v2 root; a profile is a derived predicate, never a wire field (row C2.10)"
27933
27805
  }
27934
27806
  ]
27935
27807
  },
@@ -27941,24 +27813,22 @@
27941
27813
  "explicitId": "openwop.requirement.0169.profiles-derived-only.derivable",
27942
27814
  "citations": [
27943
27815
  {
27944
- "section": null,
27945
- "requirement": "spec/v2/profiles.json MUST list at least one profile",
27946
- "interpolated": true
27816
+ "section": "spec/v2/core/capabilities.md §7",
27817
+ "requirement": "spec/v2/profiles.json MUST list at least one profile"
27947
27818
  },
27948
27819
  {
27949
- "section": null,
27820
+ "section": "spec/v2/core/capabilities.md §7",
27950
27821
  "requirement": null,
27951
27822
  "interpolated": true
27952
27823
  },
27953
27824
  {
27954
- "section": null,
27825
+ "section": "spec/v2/core/capabilities.md §7",
27955
27826
  "requirement": null,
27956
27827
  "interpolated": true
27957
27828
  },
27958
27829
  {
27959
- "section": null,
27960
- "requirement": "openwop-discovery-core (metadata protocolVersions + preferredVersion, both REQUIRED at the root) MUST derive true from every valid v2 document",
27961
- "interpolated": true
27830
+ "section": "spec/v2/core/capabilities.md §7",
27831
+ "requirement": "openwop-discovery-core (metadata protocolVersions + preferredVersion, both REQUIRED at the root) MUST derive true from every valid v2 document"
27962
27832
  }
27963
27833
  ]
27964
27834
  },
@@ -27970,19 +27840,17 @@
27970
27840
  "explicitId": "openwop.requirement.0177.provider-conflict.fail-closed",
27971
27841
  "citations": [
27972
27842
  {
27973
- "section": null,
27843
+ "section": "connection-packs.md §\"Provider identity\" (RFC 0177 §D.1)",
27974
27844
  "requirement": null,
27975
27845
  "interpolated": true
27976
27846
  },
27977
27847
  {
27978
- "section": null,
27979
- "requirement": "the later registration of a bare provider id MUST NOT install (no version precedence)",
27980
- "interpolated": true
27848
+ "section": "connection-packs.md §\"Provider identity\" (RFC 0177 §D.1)",
27849
+ "requirement": "the later registration of a bare provider id MUST NOT install (no version precedence)"
27981
27850
  },
27982
27851
  {
27983
- "section": null,
27984
- "requirement": "the later registration MUST be refused with connection_provider_conflict",
27985
- "interpolated": true
27852
+ "section": "connection-packs.md §\"Provider identity\" (RFC 0177 §D.1)",
27853
+ "requirement": "the later registration MUST be refused with connection_provider_conflict"
27986
27854
  }
27987
27855
  ]
27988
27856
  },
@@ -28111,27 +27979,27 @@
28111
27979
  "explicitId": "openwop.requirement.0170.revocation-honored",
28112
27980
  "citations": [
28113
27981
  {
28114
- "section": null,
27982
+ "section": "spec/v2/core/identity.md §2.2",
28115
27983
  "requirement": null,
28116
27984
  "interpolated": true
28117
27985
  },
28118
27986
  {
28119
- "section": null,
27987
+ "section": "spec/v2/core/identity.md §2.2",
28120
27988
  "requirement": null,
28121
27989
  "interpolated": true
28122
27990
  },
28123
27991
  {
28124
- "section": null,
27992
+ "section": "spec/v2/core/identity.md §2.2",
28125
27993
  "requirement": null,
28126
27994
  "interpolated": true
28127
27995
  },
28128
27996
  {
28129
- "section": null,
27997
+ "section": "spec/v2/core/identity.md §2.2",
28130
27998
  "requirement": null,
28131
27999
  "interpolated": true
28132
28000
  },
28133
28001
  {
28134
- "section": null,
28002
+ "section": "spec/v2/core/identity.md §2.2",
28135
28003
  "requirement": null,
28136
28004
  "interpolated": true
28137
28005
  }
@@ -28142,10 +28010,10 @@
28142
28010
  "file": "v2-run-annotation-not-event.test.ts",
28143
28011
  "line": 40,
28144
28012
  "title": "an annotation is created and listed, and never enters the run's event log",
28145
- "explicitId": null,
28013
+ "explicitId": "openwop.requirement.0170.run-annotation-not-event",
28146
28014
  "citations": [
28147
28015
  {
28148
- "section": null,
28016
+ "section": "spec/v2/core/runs.md §Annotations, artifacts, eval summary",
28149
28017
  "requirement": null,
28150
28018
  "interpolated": true
28151
28019
  },
@@ -28155,22 +28023,20 @@
28155
28023
  "interpolated": true
28156
28024
  },
28157
28025
  {
28158
- "section": null,
28026
+ "section": "spec/v2/core/runs.md §Annotations, artifacts, eval summary",
28159
28027
  "requirement": null,
28160
28028
  "interpolated": true
28161
28029
  },
28162
28030
  {
28163
- "section": null,
28164
- "requirement": "listAnnotations MUST return the annotation just created (the control: a host that discards annotations must not pass the log assertion for free)",
28165
- "interpolated": true
28031
+ "section": "spec/v2/core/runs.md §Annotations, artifacts, eval summary",
28032
+ "requirement": "listAnnotations MUST return the annotation just created (the control: a host that discards annotations must not pass the log assertion for free)"
28166
28033
  },
28167
28034
  {
28168
- "section": null,
28169
- "requirement": "run.annotated is a live notification and MUST NOT enter the event log",
28170
- "interpolated": true
28035
+ "section": "spec/v2/core/runs.md §Annotations, artifacts, eval summary",
28036
+ "requirement": "run.annotated is a live notification and MUST NOT enter the event log"
28171
28037
  },
28172
28038
  {
28173
- "section": null,
28039
+ "section": "spec/v2/core/runs.md §Annotations, artifacts, eval summary",
28174
28040
  "requirement": null,
28175
28041
  "interpolated": true
28176
28042
  }
@@ -28181,20 +28047,19 @@
28181
28047
  "file": "v2-run-bulk-cancel.test.ts",
28182
28048
  "line": 48,
28183
28049
  "title": "101 ids are refused 400 validation_error with details.maxRunIds",
28184
- "explicitId": null,
28050
+ "explicitId": "openwop.requirement.0170.run-bulk-cancel",
28185
28051
  "citations": [
28186
28052
  {
28187
- "section": null,
28053
+ "section": "spec/v2/core/runs.md §Cancel",
28188
28054
  "requirement": null,
28189
28055
  "interpolated": true
28190
28056
  },
28191
28057
  {
28192
- "section": null,
28193
- "requirement": "the refusal MUST be validation_error",
28194
- "interpolated": true
28058
+ "section": "spec/v2/core/runs.md §Cancel",
28059
+ "requirement": "the refusal MUST be validation_error"
28195
28060
  },
28196
28061
  {
28197
- "section": null,
28062
+ "section": "spec/v2/core/runs.md §Cancel",
28198
28063
  "requirement": null,
28199
28064
  "interpolated": true
28200
28065
  }
@@ -28205,27 +28070,25 @@
28205
28070
  "file": "v2-run-bulk-cancel.test.ts",
28206
28071
  "line": 63,
28207
28072
  "title": "results[] come back in request order, each id processed independently, a foreign id refused in its entry and never as a top-level 403",
28208
- "explicitId": null,
28073
+ "explicitId": "openwop.requirement.0170.run-bulk-cancel",
28209
28074
  "citations": [
28210
28075
  {
28211
- "section": null,
28076
+ "section": "spec/v2/core/runs.md §Cancel",
28212
28077
  "requirement": null,
28213
28078
  "interpolated": true
28214
28079
  },
28215
28080
  {
28216
- "section": null,
28081
+ "section": "spec/v2/core/runs.md §Cancel",
28217
28082
  "requirement": null,
28218
28083
  "interpolated": true
28219
28084
  },
28220
28085
  {
28221
- "section": null,
28222
- "requirement": "results[] MUST be in request order",
28223
- "interpolated": true
28086
+ "section": "spec/v2/core/runs.md §Cancel",
28087
+ "requirement": "results[] MUST be in request order"
28224
28088
  },
28225
28089
  {
28226
- "section": null,
28227
- "requirement": "the foreign-tenant entry MUST be ok: false",
28228
- "interpolated": true
28090
+ "section": "spec/v2/core/runs.md §Cancel",
28091
+ "requirement": "the foreign-tenant entry MUST be ok: false"
28229
28092
  },
28230
28093
  {
28231
28094
  "section": "api/v2/openapi.yaml bulkCancelRuns results[].error",
@@ -28238,7 +28101,7 @@
28238
28101
  "interpolated": true
28239
28102
  },
28240
28103
  {
28241
- "section": null,
28104
+ "section": "spec/v2/core/runs.md §Cancel",
28242
28105
  "requirement": null,
28243
28106
  "interpolated": true
28244
28107
  }
@@ -28249,17 +28112,16 @@
28249
28112
  "file": "v2-run-cancel.test.ts",
28250
28113
  "line": 65,
28251
28114
  "title": "cancelling a terminal run is refused 409 run_terminal",
28252
- "explicitId": null,
28115
+ "explicitId": "openwop.requirement.0170.run-cancel",
28253
28116
  "citations": [
28254
28117
  {
28255
- "section": null,
28118
+ "section": "spec/v2/core/runs.md §Cancel",
28256
28119
  "requirement": null,
28257
28120
  "interpolated": true
28258
28121
  },
28259
28122
  {
28260
- "section": null,
28261
- "requirement": "the refusal MUST be run_terminal",
28262
- "interpolated": true
28123
+ "section": "spec/v2/core/runs.md §Cancel",
28124
+ "requirement": "the refusal MUST be run_terminal"
28263
28125
  }
28264
28126
  ]
28265
28127
  },
@@ -28268,25 +28130,24 @@
28268
28130
  "file": "v2-run-cancel.test.ts",
28269
28131
  "line": 79,
28270
28132
  "title": "cancelling a running run answers 200 with cancelling|cancelled, emits run.cancelled within 5 s, and the snapshot reads cancelled",
28271
- "explicitId": null,
28133
+ "explicitId": "openwop.requirement.0170.run-cancel",
28272
28134
  "citations": [
28273
28135
  {
28274
- "section": null,
28136
+ "section": "spec/v2/core/runs.md §Cancel",
28275
28137
  "requirement": null,
28276
28138
  "interpolated": true
28277
28139
  },
28278
28140
  {
28279
- "section": null,
28280
- "requirement": "the 200 body MUST carry the run's runId",
28281
- "interpolated": true
28141
+ "section": "spec/v2/core/runs.md §Cancel",
28142
+ "requirement": "the 200 body MUST carry the run's runId"
28282
28143
  },
28283
28144
  {
28284
- "section": null,
28145
+ "section": "spec/v2/core/runs.md §Cancel",
28285
28146
  "requirement": null,
28286
28147
  "interpolated": true
28287
28148
  },
28288
28149
  {
28289
- "section": null,
28150
+ "section": "spec/v2/core/runs.md §Cancel",
28290
28151
  "requirement": null,
28291
28152
  "interpolated": true
28292
28153
  },
@@ -28302,20 +28163,19 @@
28302
28163
  "file": "v2-run-completed-outputs.test.ts",
28303
28164
  "line": 72,
28304
28165
  "title": "the run.completed event of a run that completed carries an outputs object",
28305
- "explicitId": null,
28166
+ "explicitId": "openwop.requirement.0171.run-completed-outputs",
28306
28167
  "citations": [
28307
28168
  {
28308
- "section": null,
28309
- "requirement": "run.completed MUST carry a payload object",
28310
- "interpolated": true
28169
+ "section": "spec/v2/core/events.md §Payloads",
28170
+ "requirement": "run.completed MUST carry a payload object"
28311
28171
  },
28312
28172
  {
28313
- "section": null,
28173
+ "section": "spec/v2/core/events.md §Payloads",
28314
28174
  "requirement": null,
28315
28175
  "interpolated": true
28316
28176
  },
28317
28177
  {
28318
- "section": null,
28178
+ "section": "spec/v2/core/events.md §Payloads",
28319
28179
  "requirement": null,
28320
28180
  "interpolated": true
28321
28181
  }
@@ -28326,10 +28186,10 @@
28326
28186
  "file": "v2-run-diff-identical.test.ts",
28327
28187
  "line": 54,
28328
28188
  "title": "two identical logs diff to divergedAtSeq null and empty eventDiffs, in a response that validates and echoes both ids",
28329
- "explicitId": null,
28189
+ "explicitId": "openwop.requirement.0170.run-diff-identical",
28330
28190
  "citations": [
28331
28191
  {
28332
- "section": null,
28192
+ "section": "spec/v2/core/runs.md §Diff and ancestry",
28333
28193
  "requirement": null,
28334
28194
  "interpolated": true
28335
28195
  },
@@ -28339,22 +28199,20 @@
28339
28199
  "interpolated": true
28340
28200
  },
28341
28201
  {
28342
- "section": null,
28343
- "requirement": "the response MUST name the two runs it compared",
28344
- "interpolated": true
28202
+ "section": "spec/v2/core/runs.md §Diff and ancestry",
28203
+ "requirement": "the response MUST name the two runs it compared"
28345
28204
  },
28346
28205
  {
28347
- "section": null,
28206
+ "section": "spec/v2/core/runs.md §Diff and ancestry",
28348
28207
  "requirement": null,
28349
28208
  "interpolated": true
28350
28209
  },
28351
28210
  {
28352
- "section": null,
28353
- "requirement": "identical logs MUST yield empty eventDiffs",
28354
- "interpolated": true
28211
+ "section": "spec/v2/core/runs.md §Diff and ancestry",
28212
+ "requirement": "identical logs MUST yield empty eventDiffs"
28355
28213
  },
28356
28214
  {
28357
- "section": null,
28215
+ "section": "spec/v2/core/runs.md §Diff and ancestry",
28358
28216
  "requirement": null,
28359
28217
  "interpolated": true
28360
28218
  }
@@ -28363,9 +28221,9 @@
28363
28221
  {
28364
28222
  "id": "openwop.it.v2-run-fork-prefix.a-replay-fork-inherits-exactly-0-fromseq-the-event-at-fromseq-is-re-executed-nev",
28365
28223
  "file": "v2-run-fork-prefix.test.ts",
28366
- "line": 106,
28224
+ "line": 172,
28367
28225
  "title": "a replay fork inherits exactly [0, fromSeq): the event at fromSeq is re-executed, never carried over",
28368
- "explicitId": null,
28226
+ "explicitId": "openwop.requirement.0170.fork-prefix-boundary",
28369
28227
  "citations": [
28370
28228
  {
28371
28229
  "section": "spec/v2/core/runs.md §Fork",
@@ -28373,12 +28231,17 @@
28373
28231
  "interpolated": true
28374
28232
  },
28375
28233
  {
28376
- "section": null,
28234
+ "section": "spec/v2/core/replay.md §Endpoint",
28377
28235
  "requirement": null,
28378
28236
  "interpolated": true
28379
28237
  },
28380
28238
  {
28381
- "section": null,
28239
+ "section": "spec/v2/core/replay.md §Endpoint",
28240
+ "requirement": null,
28241
+ "interpolated": true
28242
+ },
28243
+ {
28244
+ "section": "spec/v2/core/replay.md §Byte-equivalence of the prefix",
28382
28245
  "requirement": null,
28383
28246
  "interpolated": true
28384
28247
  }
@@ -28389,42 +28252,38 @@
28389
28252
  "file": "v2-run-fork-refusals.test.ts",
28390
28253
  "line": 38,
28391
28254
  "title": "replay+overlay → 400; a fromSeq outside the log → 422 fork_point_invalid; a valid replay fork → 201 with the parent's owner verbatim",
28392
- "explicitId": null,
28255
+ "explicitId": "openwop.requirement.0170.run-fork-refusals",
28393
28256
  "citations": [
28394
28257
  {
28395
- "section": null,
28258
+ "section": "spec/v2/core/runs.md §Fork",
28396
28259
  "requirement": null,
28397
28260
  "interpolated": true
28398
28261
  },
28399
28262
  {
28400
- "section": null,
28263
+ "section": "spec/v2/core/runs.md §Fork",
28401
28264
  "requirement": null,
28402
28265
  "interpolated": true
28403
28266
  },
28404
28267
  {
28405
- "section": null,
28406
- "requirement": "the refusal MUST be fork_point_invalid",
28407
- "interpolated": true
28268
+ "section": "spec/v2/core/runs.md §Fork",
28269
+ "requirement": "the refusal MUST be fork_point_invalid"
28408
28270
  },
28409
28271
  {
28410
- "section": null,
28272
+ "section": "spec/v2/core/runs.md §Fork",
28411
28273
  "requirement": null,
28412
28274
  "interpolated": true
28413
28275
  },
28414
28276
  {
28415
- "section": null,
28416
- "requirement": "the 201 MUST name the parent as sourceRunId",
28417
- "interpolated": true
28277
+ "section": "spec/v2/core/runs.md §Fork",
28278
+ "requirement": "the 201 MUST name the parent as sourceRunId"
28418
28279
  },
28419
28280
  {
28420
- "section": null,
28421
- "requirement": "the 201 MUST echo the mode",
28422
- "interpolated": true
28281
+ "section": "spec/v2/core/runs.md §Fork",
28282
+ "requirement": "the 201 MUST echo the mode"
28423
28283
  },
28424
28284
  {
28425
- "section": null,
28426
- "requirement": "the 201 MUST carry runId and eventsUrl",
28427
- "interpolated": true
28285
+ "section": "spec/v2/core/runs.md §Fork",
28286
+ "requirement": "the 201 MUST carry runId and eventsUrl"
28428
28287
  },
28429
28288
  {
28430
28289
  "section": "RFCS/0170 §A.4",
@@ -28445,22 +28304,20 @@
28445
28304
  "file": "v2-run-options-limits.test.ts",
28446
28305
  "line": 56,
28447
28306
  "title": "odd-format tags and free-form metadata are accepted and surface unchanged on the snapshot",
28448
- "explicitId": null,
28307
+ "explicitId": "openwop.requirement.0171.run-options-limits",
28449
28308
  "citations": [
28450
28309
  {
28451
- "section": null,
28310
+ "section": "spec/v2/core/runs.md §Run options",
28452
28311
  "requirement": null,
28453
28312
  "interpolated": true
28454
28313
  },
28455
28314
  {
28456
- "section": null,
28457
- "requirement": "tags MUST surface unchanged on RunSnapshot",
28458
- "interpolated": true
28315
+ "section": "spec/v2/core/runs.md §Run options",
28316
+ "requirement": "tags MUST surface unchanged on RunSnapshot"
28459
28317
  },
28460
28318
  {
28461
- "section": null,
28462
- "requirement": "metadata MUST be persisted and surface unchanged on RunSnapshot",
28463
- "interpolated": true
28319
+ "section": "spec/v2/core/runs.md §Run options",
28320
+ "requirement": "metadata MUST be persisted and surface unchanged on RunSnapshot"
28464
28321
  }
28465
28322
  ]
28466
28323
  },
@@ -28469,25 +28326,25 @@
28469
28326
  "file": "v2-run-pause-resume.test.ts",
28470
28327
  "line": 59,
28471
28328
  "title": "pause and resume on a terminal run answer 409 with an error envelope",
28472
- "explicitId": null,
28329
+ "explicitId": "openwop.requirement.0170.run-pause-resume",
28473
28330
  "citations": [
28474
28331
  {
28475
- "section": null,
28332
+ "section": "spec/v2/core/runs.md §Pause and resume",
28476
28333
  "requirement": null,
28477
28334
  "interpolated": true
28478
28335
  },
28479
28336
  {
28480
- "section": null,
28337
+ "section": "spec/v2/core/runs.md §Pause and resume",
28481
28338
  "requirement": null,
28482
28339
  "interpolated": true
28483
28340
  },
28484
28341
  {
28485
- "section": null,
28342
+ "section": "spec/v2/core/runs.md §Pause and resume",
28486
28343
  "requirement": null,
28487
28344
  "interpolated": true
28488
28345
  },
28489
28346
  {
28490
- "section": null,
28347
+ "section": "spec/v2/core/runs.md §Pause and resume",
28491
28348
  "requirement": null,
28492
28349
  "interpolated": true
28493
28350
  }
@@ -28498,45 +28355,44 @@
28498
28355
  "file": "v2-run-pause-resume.test.ts",
28499
28356
  "line": 77,
28500
28357
  "title": "a running run pauses (202 paused), refuses a second pause (409), resumes (202 running), and the log carries run.paused then run.resumed",
28501
- "explicitId": null,
28358
+ "explicitId": "openwop.requirement.0170.run-pause-resume",
28502
28359
  "citations": [
28503
28360
  {
28504
- "section": null,
28361
+ "section": "spec/v2/core/runs.md §Pause and resume",
28505
28362
  "requirement": null,
28506
28363
  "interpolated": true
28507
28364
  },
28508
28365
  {
28509
- "section": null,
28510
- "requirement": "the 202 MUST carry the runId",
28511
- "interpolated": true
28366
+ "section": "spec/v2/core/runs.md §Pause and resume",
28367
+ "requirement": "the 202 MUST carry the runId"
28512
28368
  },
28513
28369
  {
28514
- "section": null,
28370
+ "section": "spec/v2/core/runs.md §Pause and resume",
28515
28371
  "requirement": null,
28516
28372
  "interpolated": true
28517
28373
  },
28518
28374
  {
28519
- "section": null,
28375
+ "section": "spec/v2/core/runs.md §Pause and resume",
28520
28376
  "requirement": null,
28521
28377
  "interpolated": true
28522
28378
  },
28523
28379
  {
28524
- "section": null,
28380
+ "section": "spec/v2/core/runs.md §Pause and resume",
28525
28381
  "requirement": null,
28526
28382
  "interpolated": true
28527
28383
  },
28528
28384
  {
28529
- "section": null,
28385
+ "section": "spec/v2/core/runs.md §Pause and resume",
28530
28386
  "requirement": null,
28531
28387
  "interpolated": true
28532
28388
  },
28533
28389
  {
28534
- "section": null,
28390
+ "section": "spec/v2/core/runs.md §Pause and resume",
28535
28391
  "requirement": null,
28536
28392
  "interpolated": true
28537
28393
  },
28538
28394
  {
28539
- "section": null,
28395
+ "section": "spec/v2/core/runs.md §Pause and resume",
28540
28396
  "requirement": null,
28541
28397
  "interpolated": true
28542
28398
  },
@@ -28546,12 +28402,12 @@
28546
28402
  "interpolated": true
28547
28403
  },
28548
28404
  {
28549
- "section": null,
28405
+ "section": "spec/v2/core/runs.md §Pause and resume",
28550
28406
  "requirement": null,
28551
28407
  "interpolated": true
28552
28408
  },
28553
28409
  {
28554
- "section": null,
28410
+ "section": "spec/v2/core/runs.md §Pause and resume",
28555
28411
  "requirement": null,
28556
28412
  "interpolated": true
28557
28413
  }
@@ -28562,15 +28418,15 @@
28562
28418
  "file": "v2-run-snapshot-etag.test.ts",
28563
28419
  "line": 34,
28564
28420
  "title": "a matching If-None-Match receives 304 with no body and the version header; a non-matching one receives 200",
28565
- "explicitId": null,
28421
+ "explicitId": "openwop.requirement.0170.run-snapshot-etag",
28566
28422
  "citations": [
28567
28423
  {
28568
- "section": null,
28424
+ "section": "spec/v2/core/runs.md §Snapshot",
28569
28425
  "requirement": null,
28570
28426
  "interpolated": true
28571
28427
  },
28572
28428
  {
28573
- "section": null,
28429
+ "section": "spec/v2/core/runs.md §Snapshot",
28574
28430
  "requirement": null,
28575
28431
  "interpolated": true
28576
28432
  },
@@ -28579,14 +28435,13 @@
28579
28435
  "requirement": "every response carries OpenWOP-Version, the 304 included"
28580
28436
  },
28581
28437
  {
28582
- "section": null,
28438
+ "section": "spec/v2/core/runs.md §Snapshot",
28583
28439
  "requirement": null,
28584
28440
  "interpolated": true
28585
28441
  },
28586
28442
  {
28587
- "section": null,
28588
- "requirement": "the 200 body is the snapshot",
28589
- "interpolated": true
28443
+ "section": "spec/v2/core/runs.md §Snapshot",
28444
+ "requirement": "the 200 body is the snapshot"
28590
28445
  }
28591
28446
  ]
28592
28447
  },
@@ -28595,70 +28450,67 @@
28595
28450
  "file": "v2-sse-last-event-id.test.ts",
28596
28451
  "line": 59,
28597
28452
  "title": "Last-Event-ID resumes at the next sequence, never re-emits the resumption point, loses nothing, and at the last id yields nothing",
28598
- "explicitId": null,
28453
+ "explicitId": "openwop.requirement.0171.sse-last-event-id",
28599
28454
  "citations": [
28600
28455
  {
28601
- "section": null,
28456
+ "section": "spec/v2/core/events.md §SSE frames",
28602
28457
  "requirement": null,
28603
28458
  "interpolated": true
28604
28459
  },
28605
28460
  {
28606
- "section": null,
28607
- "requirement": "the completed log MUST stream as at least one frame",
28608
- "interpolated": true
28461
+ "section": "spec/v2/core/events.md §SSE frames",
28462
+ "requirement": "the completed log MUST stream as at least one frame"
28609
28463
  },
28610
28464
  {
28611
- "section": null,
28465
+ "section": "spec/v2/core/events.md §SSE frames",
28612
28466
  "requirement": null,
28613
28467
  "interpolated": true
28614
28468
  },
28615
28469
  {
28616
- "section": null,
28470
+ "section": "spec/v2/core/events.md §SSE frames",
28617
28471
  "requirement": null,
28618
28472
  "interpolated": true
28619
28473
  },
28620
28474
  {
28621
- "section": null,
28622
- "requirement": "frames MUST arrive in log order",
28623
- "interpolated": true
28475
+ "section": "spec/v2/core/events.md §SSE frames",
28476
+ "requirement": "frames MUST arrive in log order"
28624
28477
  },
28625
28478
  {
28626
- "section": null,
28479
+ "section": "spec/v2/core/events.md §SSE frames",
28627
28480
  "requirement": null,
28628
28481
  "interpolated": true
28629
28482
  },
28630
28483
  {
28631
- "section": null,
28484
+ "section": "spec/v2/core/events.md §SSE frames",
28632
28485
  "requirement": null,
28633
28486
  "interpolated": true
28634
28487
  },
28635
28488
  {
28636
- "section": null,
28489
+ "section": "spec/v2/core/events.md §SSE frames",
28637
28490
  "requirement": null,
28638
28491
  "interpolated": true
28639
28492
  },
28640
28493
  {
28641
- "section": null,
28494
+ "section": "spec/v2/core/events.md §SSE frames",
28642
28495
  "requirement": null,
28643
28496
  "interpolated": true
28644
28497
  },
28645
28498
  {
28646
- "section": null,
28499
+ "section": "spec/v2/core/events.md §SSE frames",
28647
28500
  "requirement": null,
28648
28501
  "interpolated": true
28649
28502
  },
28650
28503
  {
28651
- "section": null,
28652
- "requirement": "the host MUST close the empty resume itself",
28653
- "interpolated": true
28504
+ "section": "spec/v2/core/events.md §SSE frames",
28505
+ "requirement": "the host MUST close the empty resume itself"
28654
28506
  },
28655
28507
  {
28656
- "section": null,
28508
+ "section": "spec/v2/core/events.md §SSE frames",
28657
28509
  "requirement": null,
28658
28510
  "interpolated": true
28659
28511
  },
28660
28512
  {
28661
- "section": null,
28513
+ "section": "spec/v2/core/events.md §SSE frames",
28662
28514
  "requirement": null,
28663
28515
  "interpolated": true
28664
28516
  }
@@ -28669,52 +28521,48 @@
28669
28521
  "file": "v2-stream-mode-refusal.test.ts",
28670
28522
  "line": 64,
28671
28523
  "title": "a value outside the pattern, a forbidden combination, and an unimplemented mode are refused 400 unsupported_stream_mode with details.supported — before content negotiation",
28672
- "explicitId": null,
28524
+ "explicitId": "openwop.requirement.0171.stream-mode-refusal",
28673
28525
  "citations": [
28674
28526
  {
28675
- "section": null,
28527
+ "section": "spec/v2/core/events.md §The events channel",
28676
28528
  "requirement": null,
28677
28529
  "interpolated": true
28678
28530
  },
28679
28531
  {
28680
- "section": null,
28681
- "requirement": "the refusal MUST be unsupported_stream_mode",
28682
- "interpolated": true
28532
+ "section": "spec/v2/core/events.md §The events channel",
28533
+ "requirement": "the refusal MUST be unsupported_stream_mode"
28683
28534
  },
28684
28535
  {
28685
- "section": null,
28536
+ "section": "spec/v2/core/events.md §The events channel",
28686
28537
  "requirement": null,
28687
28538
  "interpolated": true
28688
28539
  },
28689
28540
  {
28690
- "section": null,
28691
- "requirement": "a host MUST implement updates, so supported MUST list it",
28692
- "interpolated": true
28541
+ "section": "spec/v2/core/events.md §The events channel",
28542
+ "requirement": "a host MUST implement updates, so supported MUST list it"
28693
28543
  },
28694
28544
  {
28695
- "section": null,
28545
+ "section": "spec/v2/core/events.md §The events channel",
28696
28546
  "requirement": null,
28697
28547
  "interpolated": true
28698
28548
  },
28699
28549
  {
28700
- "section": null,
28550
+ "section": "spec/v2/core/events.md §The events channel",
28701
28551
  "requirement": null,
28702
28552
  "interpolated": true
28703
28553
  },
28704
28554
  {
28705
- "section": null,
28706
- "requirement": "the refusal MUST be unsupported_stream_mode",
28707
- "interpolated": true
28555
+ "section": "spec/v2/core/events.md §The events channel",
28556
+ "requirement": "the refusal MUST be unsupported_stream_mode"
28708
28557
  },
28709
28558
  {
28710
- "section": null,
28559
+ "section": "spec/v2/core/events.md §The events channel",
28711
28560
  "requirement": null,
28712
28561
  "interpolated": true
28713
28562
  },
28714
28563
  {
28715
- "section": null,
28716
- "requirement": "the refusal MUST be unsupported_stream_mode",
28717
- "interpolated": true
28564
+ "section": "spec/v2/core/events.md §The events channel",
28565
+ "requirement": "the refusal MUST be unsupported_stream_mode"
28718
28566
  }
28719
28567
  ]
28720
28568
  },
@@ -28723,10 +28571,10 @@
28723
28571
  "file": "v2-stream-mode-refusal.test.ts",
28724
28572
  "line": 95,
28725
28573
  "title": "updates streams 200 text/event-stream with frames; bufferMs yields at least one batch frame whose data is an array and loses nothing; without bufferMs no frame is batch",
28726
- "explicitId": null,
28574
+ "explicitId": "openwop.requirement.0171.stream-mode-refusal",
28727
28575
  "citations": [
28728
28576
  {
28729
- "section": null,
28577
+ "section": "spec/v2/core/events.md §The events channel",
28730
28578
  "requirement": null,
28731
28579
  "interpolated": true
28732
28580
  },
@@ -28768,7 +28616,7 @@
28768
28616
  "file": "v2-stream-sse-projection.test.ts",
28769
28617
  "line": 52,
28770
28618
  "title": "every data: frame on the major-2 stream carries the tenant-bound runId of the run it belongs to",
28771
- "explicitId": null,
28619
+ "explicitId": "openwop.requirement.0171.stream-sse-projection",
28772
28620
  "citations": [
28773
28621
  {
28774
28622
  "section": "spec/v2/core/identity.md §5",
@@ -28776,17 +28624,17 @@
28776
28624
  "interpolated": true
28777
28625
  },
28778
28626
  {
28779
- "section": null,
28627
+ "section": "spec/v2/core/events.md §SSE frames",
28780
28628
  "requirement": null,
28781
28629
  "interpolated": true
28782
28630
  },
28783
28631
  {
28784
- "section": null,
28632
+ "section": "spec/v2/core/events.md §SSE frames",
28785
28633
  "requirement": null,
28786
28634
  "interpolated": true
28787
28635
  },
28788
28636
  {
28789
- "section": null,
28637
+ "section": "spec/v2/core/events.md §SSE frames",
28790
28638
  "requirement": null,
28791
28639
  "interpolated": true
28792
28640
  }
@@ -28800,19 +28648,17 @@
28800
28648
  "explicitId": "openwop.requirement.0170.subject-link-record.shape",
28801
28649
  "citations": [
28802
28650
  {
28803
- "section": null,
28651
+ "section": "spec/v2/core/identity.md §3",
28804
28652
  "requirement": null,
28805
28653
  "interpolated": true
28806
28654
  },
28807
28655
  {
28808
- "section": null,
28809
- "requirement": "a link MUST join exactly two distinct subjects",
28810
- "interpolated": true
28656
+ "section": "spec/v2/core/identity.md §3",
28657
+ "requirement": "a link MUST join exactly two distinct subjects"
28811
28658
  },
28812
28659
  {
28813
- "section": null,
28814
- "requirement": "a freshly formed link carries no deniedAt",
28815
- "interpolated": true
28660
+ "section": "spec/v2/core/identity.md §3",
28661
+ "requirement": "a freshly formed link carries no deniedAt"
28816
28662
  }
28817
28663
  ]
28818
28664
  },
@@ -28824,36 +28670,34 @@
28824
28670
  "explicitId": "openwop.requirement.0170.subject-link-record.denied-at",
28825
28671
  "citations": [
28826
28672
  {
28827
- "section": null,
28673
+ "section": "spec/v2/core/identity.md §3",
28828
28674
  "requirement": null,
28829
28675
  "interpolated": true
28830
28676
  },
28831
28677
  {
28832
- "section": null,
28833
- "requirement": "deactivation MUST set deniedAt (date-time) on the link record",
28834
- "interpolated": true
28678
+ "section": "spec/v2/core/identity.md §3",
28679
+ "requirement": "deactivation MUST set deniedAt (date-time) on the link record"
28835
28680
  },
28836
28681
  {
28837
- "section": null,
28838
- "requirement": "after deniedAt is set the SAML decision path MUST deny the linked subject (the leaver contract)",
28839
- "interpolated": true
28682
+ "section": "spec/v2/core/identity.md §3",
28683
+ "requirement": "after deniedAt is set the SAML decision path MUST deny the linked subject (the leaver contract)"
28840
28684
  }
28841
28685
  ]
28842
28686
  },
28843
28687
  {
28844
28688
  "id": "openwop.it.v2-unmapped-type-refused.poll-over-a-log-with-an-unmapped-unprefixed-type-fails-with-500-event-type-unmap",
28845
28689
  "file": "v2-unmapped-type-refused.test.ts",
28846
- "line": 48,
28690
+ "line": 92,
28847
28691
  "title": "poll over a log with an unmapped, unprefixed type fails with 500 event_type_unmapped",
28848
28692
  "explicitId": "openwop.requirement.0176.unmapped-type-refused",
28849
28693
  "citations": [
28850
28694
  {
28851
- "section": null,
28695
+ "section": "spec/v2/core/persistence.md §The reader rule",
28852
28696
  "requirement": null,
28853
28697
  "interpolated": true
28854
28698
  },
28855
28699
  {
28856
- "section": null,
28700
+ "section": "spec/v2/core/persistence.md §The reader rule",
28857
28701
  "requirement": null,
28858
28702
  "interpolated": true
28859
28703
  },
@@ -28864,10 +28708,29 @@
28864
28708
  }
28865
28709
  ]
28866
28710
  },
28711
+ {
28712
+ "id": "openwop.it.v2-unmapped-type-refused.a-registered-vendor-type-the-codemap-does-not-name-is-read-under-its-own-name-un",
28713
+ "file": "v2-unmapped-type-refused.test.ts",
28714
+ "line": 117,
28715
+ "title": "a REGISTERED vendor type the codemap does not name is read under its own name, unchanged",
28716
+ "explicitId": "openwop.requirement.0176.vendor-type-passthrough",
28717
+ "citations": [
28718
+ {
28719
+ "section": "spec/v2/core/persistence.md §The codemap is data",
28720
+ "requirement": null,
28721
+ "interpolated": true
28722
+ },
28723
+ {
28724
+ "section": "spec/v2/core/persistence.md §The codemap is data",
28725
+ "requirement": null,
28726
+ "interpolated": true
28727
+ }
28728
+ ]
28729
+ },
28867
28730
  {
28868
28731
  "id": "openwop.it.v2-unmapped-type-refused.a-fork-of-the-same-log-is-refused-for-the-same-reason-the-rule-binds-every-reade",
28869
28732
  "file": "v2-unmapped-type-refused.test.ts",
28870
- "line": 71,
28733
+ "line": 143,
28871
28734
  "title": "a fork of the same log is refused for the same reason — the rule binds every reader",
28872
28735
  "explicitId": "openwop.requirement.0176.unmapped-type-refused.fork",
28873
28736
  "citations": [
@@ -28877,7 +28740,7 @@
28877
28740
  "interpolated": true
28878
28741
  },
28879
28742
  {
28880
- "section": null,
28743
+ "section": "spec/v2/core/persistence.md §The reader rule",
28881
28744
  "requirement": null,
28882
28745
  "interpolated": true
28883
28746
  }
@@ -28891,7 +28754,7 @@
28891
28754
  "explicitId": "openwop.requirement.0176.v1-events-translated.poll",
28892
28755
  "citations": [
28893
28756
  {
28894
- "section": null,
28757
+ "section": "spec/v2/core/persistence.md §The reader rule",
28895
28758
  "requirement": null,
28896
28759
  "interpolated": true
28897
28760
  }
@@ -28905,7 +28768,7 @@
28905
28768
  "explicitId": "openwop.requirement.0176.v1-events-translated.sse",
28906
28769
  "citations": [
28907
28770
  {
28908
- "section": null,
28771
+ "section": "spec/v2/core/persistence.md §The reader rule",
28909
28772
  "requirement": null,
28910
28773
  "interpolated": true
28911
28774
  }
@@ -28950,7 +28813,7 @@
28950
28813
  "explicitId": "openwop.requirement.0176.v1-signed-webhook-accepted",
28951
28814
  "citations": [
28952
28815
  {
28953
- "section": null,
28816
+ "section": "spec/v2/core/webhooks.md §Dual emission through the overlap",
28954
28817
  "requirement": null,
28955
28818
  "interpolated": true
28956
28819
  },
@@ -28965,17 +28828,15 @@
28965
28828
  "file": "v2-version-header-honored.test.ts",
28966
28829
  "line": 61,
28967
28830
  "title": "OpenWOP-Version is honored or refused — never ignored",
28968
- "explicitId": null,
28831
+ "explicitId": "openwop.requirement.0172.version-header-honored",
28969
28832
  "citations": [
28970
28833
  {
28971
- "section": null,
28972
- "requirement": "a host that does not serve major 2 MUST refuse with 406 protocol_version_unsupported, which it did",
28973
- "interpolated": true
28834
+ "section": "spec/v2/core/versioning.md §1.3",
28835
+ "requirement": "a host that does not serve major 2 MUST refuse with 406 protocol_version_unsupported, which it did"
28974
28836
  },
28975
28837
  {
28976
- "section": null,
28977
- "requirement": "answering 200 to OpenWOP-Version: 2.0 with a body byte-identical to the header-less fetch means the header was IGNORED, not honored — the host served v1 and called it v2. Refusing with 406 is the correct answer for a host that does not implement major 2; silently returning v1 is the one answer that no presence-gated scenario can detect, because an absent v2 shape records `inapplicable` whether the host refused or ignored",
28978
- "interpolated": true
28838
+ "section": "spec/v2/core/versioning.md §1.3",
28839
+ "requirement": "answering 200 to OpenWOP-Version: 2.0 with a body byte-identical to the header-less fetch means the header was IGNORED, not honored — the host served v1 and called it v2. Refusing with 406 is the correct answer for a host that does not implement major 2; silently returning v1 is the one answer that no presence-gated scenario can detect, because an absent v2 shape records `inapplicable` whether the host refused or ignored"
28979
28840
  }
28980
28841
  ]
28981
28842
  },
@@ -28984,20 +28845,19 @@
28984
28845
  "file": "v2-version-header-honored.test.ts",
28985
28846
  "line": 92,
28986
28847
  "title": "a host advertising two majors serves two different representations",
28987
- "explicitId": null,
28848
+ "explicitId": "openwop.requirement.0172.version-header-honored",
28988
28849
  "citations": [
28989
28850
  {
28990
- "section": null,
28851
+ "section": "spec/v2/core/versioning.md §1.3",
28991
28852
  "requirement": null,
28992
28853
  "interpolated": true
28993
28854
  },
28994
28855
  {
28995
- "section": null,
28996
- "requirement": "the v1 document and the closed v2 root differ by construction (capabilities.md §1), so a host advertising both majors returning identical bytes for both has advertised a major it does not actually serve",
28997
- "interpolated": true
28856
+ "section": "spec/v2/core/versioning.md §1.3",
28857
+ "requirement": "the v1 document and the closed v2 root differ by construction (capabilities.md §1), so a host advertising both majors returning identical bytes for both has advertised a major it does not actually serve"
28998
28858
  },
28999
28859
  {
29000
- "section": null,
28860
+ "section": "spec/v2/core/versioning.md §1.3",
29001
28861
  "requirement": null,
29002
28862
  "interpolated": true
29003
28863
  }
@@ -29064,39 +28924,35 @@
29064
28924
  "explicitId": "openwop.requirement.0176.well-known-one-resource",
29065
28925
  "citations": [
29066
28926
  {
29067
- "section": null,
28927
+ "section": "RFC 0176 §C.1 (one well-known resource)",
29068
28928
  "requirement": null,
29069
28929
  "interpolated": true
29070
28930
  },
29071
28931
  {
29072
- "section": null,
28932
+ "section": "RFC 0176 §C.1 (one well-known resource)",
29073
28933
  "requirement": null,
29074
28934
  "interpolated": true
29075
28935
  },
29076
28936
  {
29077
- "section": null,
29078
- "requirement": "both representations MUST be JSON objects",
29079
- "interpolated": true
28937
+ "section": "RFC 0176 §C.1 (one well-known resource)",
28938
+ "requirement": "both representations MUST be JSON objects"
29080
28939
  },
29081
28940
  {
29082
- "section": null,
29083
- "requirement": "the v1 representation MUST carry protocolVersions[] (RFC 0165 §A, additive) — a single fetch names the other major",
29084
- "interpolated": true
28941
+ "section": "RFC 0176 §C.1 (one well-known resource)",
28942
+ "requirement": "the v1 representation MUST carry protocolVersions[] (RFC 0165 §A, additive) — a single fetch names the other major"
29085
28943
  },
29086
28944
  {
29087
- "section": null,
29088
- "requirement": "the v2 representation MUST carry protocolVersions[]",
29089
- "interpolated": true
28945
+ "section": "RFC 0176 §C.1 (one well-known resource)",
28946
+ "requirement": "the v2 representation MUST carry protocolVersions[]"
29090
28947
  },
29091
28948
  {
29092
- "section": null,
28949
+ "section": "RFC 0176 §C.1 (one well-known resource)",
29093
28950
  "requirement": null,
29094
28951
  "interpolated": true
29095
28952
  },
29096
28953
  {
29097
- "section": null,
29098
- "requirement": "the header MUST select a representation — a host that serves one document for both majors is the charter's \"per-major sub-objects\" the RFC does not adopt (adversarial review 3)",
29099
- "interpolated": true
28954
+ "section": "RFC 0176 §C.1 (one well-known resource)",
28955
+ "requirement": "the header MUST select a representation — a host that serves one document for both majors is the charter's \"per-major sub-objects\" the RFC does not adopt (adversarial review 3)"
29100
28956
  }
29101
28957
  ]
29102
28958
  },
@@ -35372,7 +35228,7 @@
35372
35228
  "file": "v2-bundle-signature-attributable.test.ts",
35373
35229
  "line": 103,
35374
35230
  "title": "the v2 discovery root publishes signingKeys[] — the surface the RFC named",
35375
- "explicitId": null,
35231
+ "explicitId": "openwop.requirement.0168.bundle-signature-attributable.surface",
35376
35232
  "citations": [
35377
35233
  {
35378
35234
  "section": null,
@@ -35401,7 +35257,7 @@
35401
35257
  "file": "v2-bundle-signature-attributable.test.ts",
35402
35258
  "line": 134,
35403
35259
  "title": "the Front-door gate verifies the attestation instead of inspecting the string",
35404
- "explicitId": null,
35260
+ "explicitId": "openwop.requirement.0168.bundle-signature-attributable.verifies",
35405
35261
  "citations": [
35406
35262
  {
35407
35263
  "section": null,
@@ -35420,7 +35276,7 @@
35420
35276
  "file": "v2-bundle-signature-attributable.test.ts",
35421
35277
  "line": 149,
35422
35278
  "title": "the four signature outcomes stay distinct — collapsing any two restores the defect",
35423
- "explicitId": null,
35279
+ "explicitId": "openwop.requirement.0168.bundle-signature-attributable.outcomes",
35424
35280
  "citations": [
35425
35281
  {
35426
35282
  "section": null,
@@ -35434,7 +35290,7 @@
35434
35290
  "file": "v2-bundle-signature-attributable.test.ts",
35435
35291
  "line": 170,
35436
35292
  "title": "signingKeys[] is reachable from a v1 root too — a bundle is v3 regardless of major",
35437
- "explicitId": null,
35293
+ "explicitId": "openwop.requirement.0168.bundle-signature-attributable.v1-root",
35438
35294
  "citations": [
35439
35295
  {
35440
35296
  "section": null,
@@ -35448,10 +35304,10 @@
35448
35304
  "file": "v2-corpus-tag-pinned.test.ts",
35449
35305
  "line": 33,
35450
35306
  "title": "every vendoring consumer in the cross-repo inventory records a published corpus tag",
35451
- "explicitId": null,
35307
+ "explicitId": "openwop.requirement.0176.corpus-tag-pinned",
35452
35308
  "citations": [
35453
35309
  {
35454
- "section": null,
35310
+ "section": "RFC 0176 §E.1",
35455
35311
  "requirement": null,
35456
35312
  "interpolated": true
35457
35313
  }
@@ -35476,10 +35332,10 @@
35476
35332
  "file": "v2-eos-clock.test.ts",
35477
35333
  "line": 43,
35478
35334
  "title": "the clock file is current with the matrix and the public history",
35479
- "explicitId": null,
35335
+ "explicitId": "openwop.requirement.0174.v1-eos-clock",
35480
35336
  "citations": [
35481
35337
  {
35482
- "section": null,
35338
+ "section": "spec/v2/core/overview.md §v1 end-of-support",
35483
35339
  "requirement": null,
35484
35340
  "interpolated": true
35485
35341
  }
@@ -35490,17 +35346,16 @@
35490
35346
  "file": "v2-eos-clock.test.ts",
35491
35347
  "line": 49,
35492
35348
  "title": "check-removal-dates FAILS the v1-tree sources of v1-end-of-support rows once the clock has passed",
35493
- "explicitId": null,
35349
+ "explicitId": "openwop.requirement.0174.v1-eos-clock",
35494
35350
  "citations": [
35495
35351
  {
35496
- "section": null,
35352
+ "section": "spec/v2/core/overview.md §v1 end-of-support",
35497
35353
  "requirement": null,
35498
35354
  "interpolated": true
35499
35355
  },
35500
35356
  {
35501
- "section": null,
35502
- "requirement": "the failure MUST name the row and the source it found",
35503
- "interpolated": true
35357
+ "section": "spec/v2/core/overview.md §v1 end-of-support",
35358
+ "requirement": "the failure MUST name the row and the source it found"
35504
35359
  }
35505
35360
  ]
35506
35361
  },
@@ -35509,17 +35364,16 @@
35509
35364
  "file": "v2-eos-clock.test.ts",
35510
35365
  "line": 59,
35511
35366
  "title": "check-removal-dates PASSES under the same clock when today is before the date, and prints the clock state",
35512
- "explicitId": null,
35367
+ "explicitId": "openwop.requirement.0174.v1-eos-clock",
35513
35368
  "citations": [
35514
35369
  {
35515
- "section": null,
35370
+ "section": "spec/v2/core/overview.md §v1 end-of-support",
35516
35371
  "requirement": null,
35517
35372
  "interpolated": true
35518
35373
  },
35519
35374
  {
35520
- "section": null,
35521
- "requirement": "the script MUST print the clock state on a green run — \"not anchored\" and \"far away\" must not print the same nothing",
35522
- "interpolated": true
35375
+ "section": "spec/v2/core/overview.md §v1 end-of-support",
35376
+ "requirement": "the script MUST print the clock state on a green run — \"not anchored\" and \"far away\" must not print the same nothing"
35523
35377
  }
35524
35378
  ]
35525
35379
  },
@@ -35528,20 +35382,19 @@
35528
35382
  "file": "v2-error-registry-prose-parity.test.ts",
35529
35383
  "line": 26,
35530
35384
  "title": "errors.md states the registry count it was generated from and renders every code",
35531
- "explicitId": null,
35385
+ "explicitId": "openwop.requirement.0171.error-registry-prose-parity",
35532
35386
  "citations": [
35533
35387
  {
35534
- "section": null,
35388
+ "section": "spec/v2/core/errors.md",
35535
35389
  "requirement": null,
35536
35390
  "interpolated": true
35537
35391
  },
35538
35392
  {
35539
- "section": null,
35540
- "requirement": "errors.md states the registry size at least once, so the claim is checkable",
35541
- "interpolated": true
35393
+ "section": "spec/v2/core/errors.md",
35394
+ "requirement": "errors.md states the registry size at least once, so the claim is checkable"
35542
35395
  },
35543
35396
  {
35544
- "section": null,
35397
+ "section": "spec/v2/core/errors.md",
35545
35398
  "requirement": null,
35546
35399
  "interpolated": true
35547
35400
  }
@@ -35552,20 +35405,19 @@
35552
35405
  "file": "v2-event-naming-rule.test.ts",
35553
35406
  "line": 36,
35554
35407
  "title": "every closed-enum v2 event type is two kebab segments, and every recorded artifact exception is an enum member",
35555
- "explicitId": null,
35408
+ "explicitId": "openwop.requirement.0171.event-naming-rule",
35556
35409
  "citations": [
35557
35410
  {
35558
- "section": null,
35559
- "requirement": "run-event.schema.json properties.type.oneOf[0] MUST be the closed enum of v2 event types",
35560
- "interpolated": true
35411
+ "section": "RFC 0171 §A.2",
35412
+ "requirement": "run-event.schema.json properties.type.oneOf[0] MUST be the closed enum of v2 event types"
35561
35413
  },
35562
35414
  {
35563
- "section": null,
35415
+ "section": "RFC 0171 §A.2",
35564
35416
  "requirement": null,
35565
35417
  "interpolated": true
35566
35418
  },
35567
35419
  {
35568
- "section": null,
35420
+ "section": "RFC 0171 §A.2",
35569
35421
  "requirement": null,
35570
35422
  "interpolated": true
35571
35423
  }
@@ -35576,7 +35428,7 @@
35576
35428
  "file": "v2-event-naming-rule.test.ts",
35577
35429
  "line": 51,
35578
35430
  "title": "the closed enum and the vendor branch are disjoint: every registered type validates, and a typo of a registered domain does not",
35579
- "explicitId": null,
35431
+ "explicitId": "openwop.requirement.0171.event-naming-rule",
35580
35432
  "citations": [
35581
35433
  {
35582
35434
  "section": "RFC 0171 §A.1",
@@ -35631,7 +35483,7 @@
35631
35483
  "file": "v2-id-kinds-bound.test.ts",
35632
35484
  "line": 57,
35633
35485
  "title": "every v2 id field $refs its kind, and every *Id property is triaged",
35634
- "explicitId": null,
35486
+ "explicitId": "openwop.requirement.0170.id-kinds-bound",
35635
35487
  "citations": [
35636
35488
  {
35637
35489
  "section": "spec/v2/core/identity.md §5",
@@ -35645,37 +35497,31 @@
35645
35497
  "file": "v2-one-signing-scheme.test.ts",
35646
35498
  "line": 37,
35647
35499
  "title": "registry-version-manifest signing has exactly one scheme, ed25519-canonical-json, and no method / publicKeyRef",
35648
- "explicitId": null,
35500
+ "explicitId": "openwop.requirement.0177.one-signing-scheme",
35649
35501
  "citations": [
35650
35502
  {
35651
- "section": null,
35652
- "requirement": "registry-version-manifest.schema.json MUST define a `signing` object",
35653
- "interpolated": true
35503
+ "section": "RFC 0177 §C.3",
35504
+ "requirement": "registry-version-manifest.schema.json MUST define a `signing` object"
35654
35505
  },
35655
35506
  {
35656
- "section": null,
35657
- "requirement": "signing.scheme MUST be the single const `ed25519-canonical-json` — one scheme, not a menu",
35658
- "interpolated": true
35507
+ "section": "RFC 0177 §C.3",
35508
+ "requirement": "signing.scheme MUST be the single const `ed25519-canonical-json` — one scheme, not a menu"
35659
35509
  },
35660
35510
  {
35661
- "section": null,
35662
- "requirement": "signing MUST require `keyId` and `scheme`",
35663
- "interpolated": true
35511
+ "section": "RFC 0177 §C.3",
35512
+ "requirement": "signing MUST require `keyId` and `scheme`"
35664
35513
  },
35665
35514
  {
35666
- "section": null,
35667
- "requirement": "signing MUST be closed (additionalProperties: false) so a second scheme cannot be smuggled in",
35668
- "interpolated": true
35515
+ "section": "RFC 0177 §C.3",
35516
+ "requirement": "signing MUST be closed (additionalProperties: false) so a second scheme cannot be smuggled in"
35669
35517
  },
35670
35518
  {
35671
- "section": null,
35672
- "requirement": "signing.method is gone in v2 — it MUST NOT appear in the signing object",
35673
- "interpolated": true
35519
+ "section": "RFC 0177 §C.3",
35520
+ "requirement": "signing.method is gone in v2 — it MUST NOT appear in the signing object"
35674
35521
  },
35675
35522
  {
35676
- "section": null,
35677
- "requirement": "signing.publicKeyRef is gone in v2 — the key is addressed by keyId alone",
35678
- "interpolated": true
35523
+ "section": "RFC 0177 §C.3",
35524
+ "requirement": "signing.publicKeyRef is gone in v2 — the key is addressed by keyId alone"
35679
35525
  }
35680
35526
  ]
35681
35527
  },
@@ -35731,17 +35577,16 @@
35731
35577
  "file": "v2-retention-floors.test.ts",
35732
35578
  "line": 53,
35733
35579
  "title": "the registry validates and the script prints the floor state offline",
35734
- "explicitId": null,
35580
+ "explicitId": "openwop.requirement.0174.retention-floors",
35735
35581
  "citations": [
35736
35582
  {
35737
- "section": null,
35583
+ "section": "spec/v2/core/overview.md §Old-major retention floors",
35738
35584
  "requirement": null,
35739
35585
  "interpolated": true
35740
35586
  },
35741
35587
  {
35742
- "section": null,
35743
- "requirement": "the floor state MUST be printed on every run — \"not started\" and \"every version present\" must not print the same nothing",
35744
- "interpolated": true
35588
+ "section": "spec/v2/core/overview.md §Old-major retention floors",
35589
+ "requirement": "the floor state MUST be printed on every run — \"not started\" and \"every version present\" must not print the same nothing"
35745
35590
  }
35746
35591
  ]
35747
35592
  },
@@ -35750,17 +35595,16 @@
35750
35595
  "file": "v2-retention-floors.test.ts",
35751
35596
  "line": 60,
35752
35597
  "title": "a pinned old-major version missing from its registry while the floor is open FAILS, naming the artifact",
35753
- "explicitId": null,
35598
+ "explicitId": "openwop.requirement.0174.retention-floors",
35754
35599
  "citations": [
35755
35600
  {
35756
- "section": null,
35601
+ "section": "spec/v2/core/overview.md §Old-major retention floors",
35757
35602
  "requirement": null,
35758
35603
  "interpolated": true
35759
35604
  },
35760
35605
  {
35761
- "section": null,
35762
- "requirement": "the failure MUST name the artifact and the version",
35763
- "interpolated": true
35606
+ "section": "spec/v2/core/overview.md §Old-major retention floors",
35607
+ "requirement": "the failure MUST name the artifact and the version"
35764
35608
  }
35765
35609
  ]
35766
35610
  },
@@ -35769,17 +35613,16 @@
35769
35613
  "file": "v2-retention-floors.test.ts",
35770
35614
  "line": 67,
35771
35615
  "title": "the same probe with every pinned version present PASSES while the floor is open",
35772
- "explicitId": null,
35616
+ "explicitId": "openwop.requirement.0174.retention-floors",
35773
35617
  "citations": [
35774
35618
  {
35775
- "section": null,
35619
+ "section": "spec/v2/core/overview.md §Old-major retention floors",
35776
35620
  "requirement": null,
35777
35621
  "interpolated": true
35778
35622
  },
35779
35623
  {
35780
- "section": null,
35781
- "requirement": "the open floor MUST print its closing date",
35782
- "interpolated": true
35624
+ "section": "spec/v2/core/overview.md §Old-major retention floors",
35625
+ "requirement": "the open floor MUST print its closing date"
35783
35626
  }
35784
35627
  ]
35785
35628
  },
@@ -35802,30 +35645,27 @@
35802
35645
  "file": "v2-security-defaults-table.test.ts",
35803
35646
  "line": 33,
35804
35647
  "title": "the obligation table has a Witness column and no row is unwitnessable",
35805
- "explicitId": null,
35648
+ "explicitId": "openwop.requirement.0173.security-defaults-table",
35806
35649
  "citations": [
35807
35650
  {
35808
- "section": null,
35809
- "requirement": "spec/v2/core/security-defaults.md MUST exist — it is the obligation table RFC 0173 §A.1 names",
35810
- "interpolated": true
35651
+ "section": "RFC 0173 §A.1",
35652
+ "requirement": "spec/v2/core/security-defaults.md MUST exist — it is the obligation table RFC 0173 §A.1 names"
35811
35653
  },
35812
35654
  {
35813
- "section": null,
35814
- "requirement": "the obligation table MUST have a `Witness` column (surface · obligation · witness · invariant)",
35815
- "interpolated": true
35655
+ "section": "RFC 0173 §A.1",
35656
+ "requirement": "the obligation table MUST have a `Witness` column (surface · obligation · witness · invariant)"
35816
35657
  },
35817
35658
  {
35818
- "section": null,
35819
- "requirement": "the obligation table MUST list at least one obligation row",
35820
- "interpolated": true
35659
+ "section": "RFC 0173 §A.1",
35660
+ "requirement": "the obligation table MUST list at least one obligation row"
35821
35661
  },
35822
35662
  {
35823
- "section": null,
35663
+ "section": "RFC 0173 §A.1",
35824
35664
  "requirement": null,
35825
35665
  "interpolated": true
35826
35666
  },
35827
35667
  {
35828
- "section": null,
35668
+ "section": "RFC 0173 §A.1",
35829
35669
  "requirement": null,
35830
35670
  "interpolated": true
35831
35671
  }