@openwop/spec-artifacts 2.35.1 → 2.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/CORPUS-STAMP.json +103 -89
  2. package/api/openapi.yaml +325 -4
  3. package/api/seams-v2.yaml +342 -1
  4. package/api/v2/asyncapi.yaml +1 -1
  5. package/api/v2/openapi.yaml +564 -8
  6. package/package.json +1 -1
  7. package/schemas/a2a-task-state.schema.json +3 -3
  8. package/schemas/artifact-type-pack-manifest.schema.json +3 -3
  9. package/schemas/capabilities.schema.json +34 -1
  10. package/schemas/connection-pack-manifest.schema.json +14 -0
  11. package/schemas/debug-bundle.schema.json +20 -0
  12. package/schemas/dispatch-config.schema.json +1 -1
  13. package/schemas/localized-content-language-settings.schema.json +3 -3
  14. package/schemas/localized-content-page.schema.json +2 -2
  15. package/schemas/localized-content-section.schema.json +3 -3
  16. package/schemas/run-event-payloads.schema.json +4 -2
  17. package/schemas/suspend-request.schema.json +61 -4
  18. package/schemas/v2/a2a-task-state.schema.json +10 -9
  19. package/schemas/v2/agent-deployment-transition.schema.json +4 -4
  20. package/schemas/v2/agent-deployment.schema.json +7 -7
  21. package/schemas/v2/agent-eval-suite.schema.json +10 -10
  22. package/schemas/v2/agent-inventory-response.schema.json +8 -2
  23. package/schemas/v2/artifact-type-pack-manifest.schema.json +3 -3
  24. package/schemas/v2/artifact.schema.json +84 -0
  25. package/schemas/v2/capabilities.schema.json +82 -8
  26. package/schemas/v2/certification-bundle.schema.json +1 -1
  27. package/schemas/v2/channel-presence-payload.schema.json +3 -3
  28. package/schemas/v2/connection-pack-manifest.schema.json +14 -0
  29. package/schemas/v2/conversation-event.schema.json +9 -2
  30. package/schemas/v2/conversation-turn.schema.json +19 -12
  31. package/schemas/v2/dispatch-config.schema.json +1 -1
  32. package/schemas/v2/envelopes/ui.a2ui-surface.schema.json +920 -22
  33. package/schemas/v2/error-envelope.schema.json +11 -1
  34. package/schemas/v2/eval-summary.schema.json +1 -2
  35. package/schemas/v2/goal.schema.json +4 -4
  36. package/schemas/v2/localized-content-language-settings.schema.json +3 -3
  37. package/schemas/v2/localized-content-page.schema.json +2 -2
  38. package/schemas/v2/localized-content-section.schema.json +3 -3
  39. package/schemas/v2/node-pack-manifest.schema.json +105 -0
  40. package/schemas/v2/part.schema.json +81 -0
  41. package/schemas/v2/proposal.schema.json +6 -6
  42. package/schemas/v2/run-event-payloads.schema.json +5 -3
  43. package/schemas/v2/self-hosted-runner-dispatch-frame.schema.json +2 -2
  44. package/schemas/v2/self-hosted-runner-result-frame.schema.json +1 -1
  45. package/schemas/v2/suspend-request.schema.json +251 -6
  46. package/schemas/v2/tool-descriptor.schema.json +246 -2
  47. package/schemas/v2/trigger-event.schema.json +1 -2
  48. package/schemas/v2/trigger-subscription.schema.json +1 -2
  49. package/schemas/v2/webhook-verification.schema.json +22 -0
  50. package/schemas/v2/workflow-definition.schema.json +25 -25
  51. package/spec/v1/alias-detectors.json +13 -1
  52. package/spec/v1/core-standard-manifest.json +2 -2
  53. package/spec/v1/deprecations.json +45 -1
  54. package/spec/v1/deprecations.schema.json +119 -4
  55. package/spec/v1/gaps.json +1925 -4
  56. package/spec/v2/README.md +5 -2
  57. package/spec/v2/core/capabilities.md +13 -26
  58. package/spec/v2/core/conformance.md +5 -8
  59. package/spec/v2/core/connection-packs.md +1 -1
  60. package/spec/v2/core/conversation.md +1 -1
  61. package/spec/v2/core/errors.md +8 -3
  62. package/spec/v2/core/events.md +8 -20
  63. package/spec/v2/core/form-content-packs.md +2 -2
  64. package/spec/v2/core/headers.md +5 -4
  65. package/spec/v2/core/host-services.md +6 -2
  66. package/spec/v2/core/idempotency.md +1 -1
  67. package/spec/v2/core/identity.md +23 -12
  68. package/spec/v2/core/interop.md +34 -4
  69. package/spec/v2/core/interrupt.md +6 -3
  70. package/spec/v2/core/node-pack-runtimes.md +20 -0
  71. package/spec/v2/core/oauth.md +32 -0
  72. package/spec/v2/core/overview.md +19 -6
  73. package/spec/v2/core/packs.md +4 -6
  74. package/spec/v2/core/persistence.md +20 -55
  75. package/spec/v2/core/replay.md +5 -11
  76. package/spec/v2/core/runs.md +9 -8
  77. package/spec/v2/core/security-defaults.md +18 -20
  78. package/spec/v2/core/tool-catalog.md +22 -0
  79. package/spec/v2/core/versioning.md +10 -28
  80. package/spec/v2/core/webhooks.md +16 -4
  81. package/spec/v2/core/workflow-chain-packs.md +1 -1
  82. package/spec/v2/corrections.json +32 -0
  83. package/spec/v2/corrections.schema.json +49 -0
  84. package/spec/v2/declaration.json +18 -13
  85. package/spec/v2/declaration.schema.json +3 -1
  86. package/spec/v2/errors.json +46 -1
  87. package/spec/v2/ext/a2uiSurface/README.md +131 -17
  88. package/spec/v2/ext/dataIntegration/README.md +5 -0
  89. package/spec/v2/facets/a2a.schema.json +4 -0
  90. package/spec/v2/facets/auth.schema.json +24 -0
  91. package/spec/v2/facets/mcp.schema.json +4 -0
  92. package/spec/v2/facets/oauth.schema.json +70 -0
  93. package/spec/v2/facets/webhooks.schema.json +23 -2
  94. package/spec/v2/id-field-bindings.json +2 -0
  95. package/spec/v2/interop-map.json +639 -0
  96. package/spec/v2/interop-map.schema.json +458 -0
  97. package/spec/v2/migrations.json +7 -0
  98. package/spec/v2/migrations.schema.json +58 -0
  99. package/spec/v2/path-manifest.json +6 -1
  100. package/spec/v2/release.json +3 -3
  101. package/spec/v2/surface-baseline.json +7981 -0
package/spec/v1/gaps.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "./gaps.schema.json",
3
3
  "version": 1,
4
- "updated": "2026-09-19",
4
+ "updated": "2026-09-23",
5
5
  "witnessClasses": [
6
6
  "witnessable-unaided",
7
7
  "witnessable-gated",
@@ -3624,8 +3624,8 @@
3624
3624
  "surface": "`localizations` keys + write `locale` use the subset `^[a-z]{2}(-[A-Z]{2})?$`, not the annex's full BCP-47 pattern. Confirm or widen (widening is additive).",
3625
3625
  "witness": "unclassified",
3626
3626
  "requirementId": null,
3627
- "disposition": "carried",
3628
- "target": "openwop.gap.0103.5",
3627
+ "disposition": "transferred",
3628
+ "target": "rfc-0206",
3629
3629
  "sources": [
3630
3630
  {
3631
3631
  "file": "RFCS/registers/0103-localized-content-surface.gaps.md",
@@ -4624,7 +4624,7 @@
4624
4624
  "rfc": "0114",
4625
4625
  "local": "G4",
4626
4626
  "section": "Conformance",
4627
- "surface": "No host advertises `ui.a2ui-surface.deltaUpdates` yet",
4627
+ "surface": "`a2uiSurface.deltaTransport` has one witness (openwop-app, 2026-07-06), now implemented behind an env flag and not advertised on the live host (observed 2026-09-22, INTEROP-MATRIX); no second host advertises it",
4628
4628
  "witness": "unclassified",
4629
4629
  "requirementId": null,
4630
4630
  "disposition": "carried",
@@ -10671,6 +10671,1927 @@
10671
10671
  }
10672
10672
  ]
10673
10673
  },
10674
+ {
10675
+ "id": "openwop.gap.0197.1",
10676
+ "rfc": "0197",
10677
+ "local": "G1",
10678
+ "section": "§C.7",
10679
+ "surface": "MyndHyve's committed v2 bundle (suite 2.35.1, 2026-09-22) advertises 38 families `stable` that `spec/v2/declaration.json` calls `experimental`. §C makes that non-conforming for bundles cut on the first suite release that ships this RFC.",
10680
+ "witness": "unclassified",
10681
+ "requirementId": null,
10682
+ "disposition": "externally-gated",
10683
+ "target": "myndhyve-recut",
10684
+ "sources": [
10685
+ {
10686
+ "file": "RFCS/registers/0197-v2-surfaces-retired-never-reshaped.gaps.md",
10687
+ "token": "G1"
10688
+ }
10689
+ ]
10690
+ },
10691
+ {
10692
+ "id": "openwop.gap.0197.2",
10693
+ "rfc": "0197",
10694
+ "local": "G2",
10695
+ "section": "§A.2 R3",
10696
+ "surface": "The registry leg is only as good as `evidence/cross-repo-manifests.json`, which is generated from a sibling checkout the gate cannot see. A stale checkout undercounts. The local registry checkout is at `d0d4700` with CORPUS_TAG v2.2.3, 30+ minors behind. The 30-day freshness bound limits the damage, but it cannot prove the checkout was current when the census ran.",
10697
+ "witness": "unclassified",
10698
+ "requirementId": null,
10699
+ "disposition": "transferred",
10700
+ "target": "scripts/generate-cross-repo-evidence.mjs",
10701
+ "sources": [
10702
+ {
10703
+ "file": "RFCS/registers/0197-v2-surfaces-retired-never-reshaped.gaps.md",
10704
+ "token": "G2"
10705
+ }
10706
+ ]
10707
+ },
10708
+ {
10709
+ "id": "openwop.gap.0197.3",
10710
+ "rfc": "0197",
10711
+ "local": "G3",
10712
+ "section": "§A.1",
10713
+ "surface": "`spec/v2/surface-baseline.json` is regenerated by the release PR. A contributor who regenerates it by hand in a feature PR erases the diff the gate exists to see.",
10714
+ "witness": "unclassified",
10715
+ "requirementId": null,
10716
+ "disposition": "transferred",
10717
+ "target": "scripts/check-v2-surface-monotone.mjs",
10718
+ "sources": [
10719
+ {
10720
+ "file": "RFCS/registers/0197-v2-surfaces-retired-never-reshaped.gaps.md",
10721
+ "token": "G3"
10722
+ }
10723
+ ]
10724
+ },
10725
+ {
10726
+ "id": "openwop.gap.0197.4",
10727
+ "rfc": "0197",
10728
+ "local": "G4",
10729
+ "section": "§A.3",
10730
+ "surface": "The host half of \"readers keep accepting retired persisted shapes\" is unwitnessable: a black-box suite cannot put a pre-retirement member into a run log that it creates after the retirement. Only the schema half (the member stays, annotated) is gated.",
10731
+ "witness": "unclassified",
10732
+ "requirementId": null,
10733
+ "disposition": "transferred",
10734
+ "target": "api/seams-v2.yaml",
10735
+ "sources": [
10736
+ {
10737
+ "file": "RFCS/registers/0197-v2-surfaces-retired-never-reshaped.gaps.md",
10738
+ "token": "G4"
10739
+ }
10740
+ ]
10741
+ },
10742
+ {
10743
+ "id": "openwop.gap.0197.5",
10744
+ "rfc": "0197",
10745
+ "local": "G5",
10746
+ "section": "§A.2 R4/R5",
10747
+ "surface": "Envelope kinds appear in R4's defined-absence list but are blocked by R5 in practice: every kind is advertised under `supportedEnvelopes`, which is `stable`. The class is listed but empty.",
10748
+ "witness": "unclassified",
10749
+ "requirementId": null,
10750
+ "disposition": "transferred",
10751
+ "target": "scripts/check-v2-retirement.mjs",
10752
+ "sources": [
10753
+ {
10754
+ "file": "RFCS/registers/0197-v2-surfaces-retired-never-reshaped.gaps.md",
10755
+ "token": "G5"
10756
+ }
10757
+ ]
10758
+ },
10759
+ {
10760
+ "id": "openwop.gap.0197.6",
10761
+ "rfc": "0197",
10762
+ "local": "G6",
10763
+ "section": "§A.2 R6",
10764
+ "surface": "The tier-3 test reads two sources: the generated EoS clock (from bundles' `claimedProfiles[].evidenceTier`) and the INTEROP-MATRIX v2 table's Evidence-tier column (prose). A tier-3 host listed without a bundle appears only in the prose. Parsing that column is a prose-scrape, which Axiom 4 disfavours.",
10765
+ "witness": "unclassified",
10766
+ "requirementId": null,
10767
+ "disposition": "transferred",
10768
+ "target": "scripts/generate-v1-eos-clock.mjs",
10769
+ "sources": [
10770
+ {
10771
+ "file": "RFCS/registers/0197-v2-surfaces-retired-never-reshaped.gaps.md",
10772
+ "token": "G6"
10773
+ }
10774
+ ]
10775
+ },
10776
+ {
10777
+ "id": "openwop.gap.0197.7",
10778
+ "rfc": "0197",
10779
+ "local": "G7",
10780
+ "section": "§A.2 R2",
10781
+ "surface": "\"Two released minors\": whether a minor was released is read from `v2.*` tags. A shallow CI clone has no tags or history, so R2's `git log` anchoring cannot run there.",
10782
+ "witness": "unclassified",
10783
+ "requirementId": null,
10784
+ "disposition": "transferred",
10785
+ "target": "scripts/check-v2-retirement.mjs",
10786
+ "sources": [
10787
+ {
10788
+ "file": "RFCS/registers/0197-v2-surfaces-retired-never-reshaped.gaps.md",
10789
+ "token": "G7"
10790
+ }
10791
+ ]
10792
+ },
10793
+ {
10794
+ "id": "openwop.gap.0197.8",
10795
+ "rfc": "0197",
10796
+ "local": "G8",
10797
+ "section": "§B.5",
10798
+ "surface": "The consumer SHOULD (pin the schema version you validate with) has no delivery mechanism for SDK users, whose bundled schemas track the SDK version, not the host's minor.",
10799
+ "witness": "unclassified",
10800
+ "requirementId": null,
10801
+ "disposition": "transferred",
10802
+ "target": "openwop-sdks",
10803
+ "sources": [
10804
+ {
10805
+ "file": "RFCS/registers/0197-v2-surfaces-retired-never-reshaped.gaps.md",
10806
+ "token": "G8"
10807
+ }
10808
+ ]
10809
+ },
10810
+ {
10811
+ "id": "openwop.gap.0197.9",
10812
+ "rfc": "0197",
10813
+ "local": "G9",
10814
+ "section": "§A.1 / sequencing",
10815
+ "surface": "**A baseline committed mid-cycle would flag the batch's own in-cycle edits as removals** (RFC 0209's `anyOf` root and `$defs` rename, RFC 0199's `CredentialData` binding), because `spec/v2/release.json` still reads 2.35.0 and the baseline cannot be regenerated without a release bump (`review/arch-impl.md` R5).",
10816
+ "witness": "unclassified",
10817
+ "requirementId": null,
10818
+ "disposition": "closed",
10819
+ "target": null,
10820
+ "sources": [
10821
+ {
10822
+ "file": "RFCS/registers/0197-v2-surfaces-retired-never-reshaped.gaps.md",
10823
+ "token": "G9"
10824
+ }
10825
+ ]
10826
+ },
10827
+ {
10828
+ "id": "openwop.gap.0198.1",
10829
+ "rfc": "0198",
10830
+ "local": "G1",
10831
+ "section": "Conformance",
10832
+ "surface": "No v2 host serves an MCP server mount. v2-reference's committed `mcp` record has no `serverMount`, and MyndHyve and openwop-app advertise no `mcp` at major 2. Every behavioural row is therefore `inapplicable`.",
10833
+ "witness": "unclassified",
10834
+ "requirementId": null,
10835
+ "disposition": "externally-gated",
10836
+ "target": "v2-mcp-mount-host",
10837
+ "sources": [
10838
+ {
10839
+ "file": "RFCS/registers/0198-mcp-server-mount-tasks.gaps.md",
10840
+ "token": "G1"
10841
+ }
10842
+ ]
10843
+ },
10844
+ {
10845
+ "id": "openwop.gap.0198.2",
10846
+ "rfc": "0198",
10847
+ "local": "G2",
10848
+ "section": "Compatibility",
10849
+ "surface": "This RFC depends on RFC 0208, which creates `spec/v2/interop-map.json`, homes the mount (`tools/list`, `tools/call`, `mcp.mrtr`) and sets the incorporation and isolation rules §C.6 and §E.7 cite.",
10850
+ "witness": "unclassified",
10851
+ "requirementId": null,
10852
+ "disposition": "closed",
10853
+ "target": null,
10854
+ "sources": [
10855
+ {
10856
+ "file": "RFCS/registers/0198-mcp-server-mount-tasks.gaps.md",
10857
+ "token": "G2"
10858
+ }
10859
+ ]
10860
+ },
10861
+ {
10862
+ "id": "openwop.gap.0198.3",
10863
+ "rfc": "0198",
10864
+ "local": "G3",
10865
+ "section": "Security",
10866
+ "surface": "The external-effects rule in §G.12 has no invariant. The candidate is `mcp-request-bound-run-no-orphan`: a run owned by a request never outlives that request's cancellation. Its HTTP half is witnessable (`disconnect-cancels-run`). Its stdio half is not, because a network suite cannot drive stdio.",
10867
+ "witness": "unclassified",
10868
+ "requirementId": null,
10869
+ "disposition": "externally-gated",
10870
+ "target": "v2-mcp-mount-host",
10871
+ "sources": [
10872
+ {
10873
+ "file": "RFCS/registers/0198-mcp-server-mount-tasks.gaps.md",
10874
+ "token": "G3"
10875
+ }
10876
+ ]
10877
+ },
10878
+ {
10879
+ "id": "openwop.gap.0198.4",
10880
+ "rfc": "0198",
10881
+ "local": "G4",
10882
+ "section": "§C.5",
10883
+ "surface": "The 128-bit entropy rule binds only runs projected as tasks. `identity.md` §5 fixes the opaque segment's grammar at 16–128 characters of `[A-Za-z0-9._~-]` and says nothing about entropy. A host could therefore mint guessable ids for ordinary runs and random ones for tasked runs, but a run is minted before the host knows whether it will be tasked. In practice every run of an advertising host needs the entropy.",
10884
+ "witness": "unclassified",
10885
+ "requirementId": null,
10886
+ "disposition": "transferred",
10887
+ "target": "spec/v2/core/identity.md",
10888
+ "sources": [
10889
+ {
10890
+ "file": "RFCS/registers/0198-mcp-server-mount-tasks.gaps.md",
10891
+ "token": "G4"
10892
+ }
10893
+ ]
10894
+ },
10895
+ {
10896
+ "id": "openwop.gap.0198.5",
10897
+ "rfc": "0198",
10898
+ "local": "G5",
10899
+ "section": "Compatibility",
10900
+ "surface": "V1 disconnect semantics are still undefined. A v1 host that advertises the current MCP profile (`mcp-2026-07-28`) faces the same undefined outcome under the upstream MUST. v1 takes corrections only, and a v1 MUST would need a v1 witness.",
10901
+ "witness": "unclassified",
10902
+ "requirementId": null,
10903
+ "disposition": "transferred",
10904
+ "target": "spec/v1/mcp-integration.md",
10905
+ "sources": [
10906
+ {
10907
+ "file": "RFCS/registers/0198-mcp-server-mount-tasks.gaps.md",
10908
+ "token": "G5"
10909
+ }
10910
+ ]
10911
+ },
10912
+ {
10913
+ "id": "openwop.gap.0198.6",
10914
+ "rfc": "0198",
10915
+ "local": "G6",
10916
+ "section": "§B.3",
10917
+ "surface": "§B.3 removes the server's per-request choice between a task and blocking, and that choice is an upstream MAY. An MCP client that declares the extension but prefers blocking for short calls always receives a task when the run is not terminal at answer time.",
10918
+ "witness": "unclassified",
10919
+ "requirementId": null,
10920
+ "disposition": "externally-gated",
10921
+ "target": "implementer-feedback",
10922
+ "sources": [
10923
+ {
10924
+ "file": "RFCS/registers/0198-mcp-server-mount-tasks.gaps.md",
10925
+ "token": "G6"
10926
+ }
10927
+ ]
10928
+ },
10929
+ {
10930
+ "id": "openwop.gap.0198.7",
10931
+ "rfc": "0198",
10932
+ "local": "G7",
10933
+ "section": "§D",
10934
+ "surface": "Interrupt kinds that the MRTR `elicitation/create` form projection cannot carry (nested schemas, `refine`/`edit-accept`/`ask`, artifactData; verify-CD C-F4) are also carried in `input_required.inputRequests`. The URL-mode fallback and the credential kind belong to RFC 0199.",
10935
+ "witness": "unclassified",
10936
+ "requirementId": null,
10937
+ "disposition": "transferred",
10938
+ "target": "rfc-0199",
10939
+ "sources": [
10940
+ {
10941
+ "file": "RFCS/registers/0198-mcp-server-mount-tasks.gaps.md",
10942
+ "token": "G7"
10943
+ }
10944
+ ]
10945
+ },
10946
+ {
10947
+ "id": "openwop.gap.0198.8",
10948
+ "rfc": "0198",
10949
+ "local": "G8",
10950
+ "section": "§F.11",
10951
+ "surface": "The TTL rule is unwitnessable in a bounded suite run.",
10952
+ "witness": "unclassified",
10953
+ "requirementId": null,
10954
+ "disposition": "closed",
10955
+ "target": null,
10956
+ "sources": [
10957
+ {
10958
+ "file": "RFCS/registers/0198-mcp-server-mount-tasks.gaps.md",
10959
+ "token": "G8"
10960
+ }
10961
+ ]
10962
+ },
10963
+ {
10964
+ "id": "openwop.gap.0198.9",
10965
+ "rfc": "0198",
10966
+ "local": "G9",
10967
+ "section": "§A",
10968
+ "surface": "`mcp.features[]` stays open in v2, and `extensions` is reused as the signal. A host that lists `extensions` for some other MCP extension, and does not serve Tasks, is still correct: `server/discover` is the authoritative per-extension statement, and `features ∋ extensions` only says to look there.",
10969
+ "witness": "unclassified",
10970
+ "requirementId": null,
10971
+ "disposition": "closed",
10972
+ "target": null,
10973
+ "sources": [
10974
+ {
10975
+ "file": "RFCS/registers/0198-mcp-server-mount-tasks.gaps.md",
10976
+ "token": "G9"
10977
+ }
10978
+ ]
10979
+ },
10980
+ {
10981
+ "id": "openwop.gap.0199.1",
10982
+ "rfc": "0199",
10983
+ "local": "G1",
10984
+ "section": "§A, §C",
10985
+ "surface": "**No host witnesses §A or §C today.** MyndHyve is the only `oauth` host (tier-2; nine providers, `evidence/v2-host-bundles/myndhyve.json`). The existing `oauth-authorization-code-roundtrip` seam soft-skips on every committed host. v2-reference advertises no `oauth`.",
10986
+ "witness": "unclassified",
10987
+ "requirementId": null,
10988
+ "disposition": "externally-gated",
10989
+ "target": "oauth-seam-host",
10990
+ "sources": [
10991
+ {
10992
+ "file": "RFCS/registers/0199-outbound-oauth-client-and-credential-interrupt.gaps.md",
10993
+ "token": "G1"
10994
+ }
10995
+ ]
10996
+ },
10997
+ {
10998
+ "id": "openwop.gap.0199.2",
10999
+ "rfc": "0199",
11000
+ "local": "G2",
11001
+ "section": "§A.3, §C.3",
11002
+ "surface": "**The same-Subject check depends on how a host authenticates a browser callback.** The suite plays the user agent with a bearer, while a production callback carries a session cookie. A host that checks the bearer but not the cookie passes the scenario and fails in production.",
11003
+ "witness": "unclassified",
11004
+ "requirementId": null,
11005
+ "disposition": "transferred",
11006
+ "target": "SECURITY/threat-model-auth-profiles.md",
11007
+ "sources": [
11008
+ {
11009
+ "file": "RFCS/registers/0199-outbound-oauth-client-and-credential-interrupt.gaps.md",
11010
+ "token": "G2"
11011
+ }
11012
+ ]
11013
+ },
11014
+ {
11015
+ "id": "openwop.gap.0199.3",
11016
+ "rfc": "0199",
11017
+ "local": "G3",
11018
+ "section": "§D.2",
11019
+ "surface": "**No v2 host has an MCP server mount** (`review/arch-P3.md` ground rules; v2-reference is seam-gated with no `serverMount`). Today §D.2 can be exercised only on openwop-app's v1 mount (`/v1/host/openwop-app/mcp`), and a major-1 row can never satisfy `check-accepted-predicate` rule 4.",
11020
+ "witness": "unclassified",
11021
+ "requirementId": null,
11022
+ "disposition": "transferred",
11023
+ "target": "rfc-0208",
11024
+ "sources": [
11025
+ {
11026
+ "file": "RFCS/registers/0199-outbound-oauth-client-and-credential-interrupt.gaps.md",
11027
+ "token": "G3"
11028
+ }
11029
+ ]
11030
+ },
11031
+ {
11032
+ "id": "openwop.gap.0199.4",
11033
+ "rfc": "0199",
11034
+ "local": "G4",
11035
+ "section": "§B",
11036
+ "surface": "**The census of published `reach.mcp` connection packs** (§Compatibility C3). If a published pack lacks `provider.auth.issuer`, a schema conditional would reject a document that validates today.",
11037
+ "witness": "unclassified",
11038
+ "requirementId": null,
11039
+ "disposition": "closed",
11040
+ "target": null,
11041
+ "sources": [
11042
+ {
11043
+ "file": "RFCS/registers/0199-outbound-oauth-client-and-credential-interrupt.gaps.md",
11044
+ "token": "G4"
11045
+ }
11046
+ ]
11047
+ },
11048
+ {
11049
+ "id": "openwop.gap.0199.5",
11050
+ "rfc": "0199",
11051
+ "local": "G5",
11052
+ "section": "§C.6",
11053
+ "surface": "**The author-facing \"no interrupt solicits a secret\" rule is unwitnessable in general**, because whether a string field is a password is semantic. Only the `writeOnly` / `format: \"password\"` subset is checkable, and only at an MCP bridge.",
11054
+ "witness": "unclassified",
11055
+ "requirementId": null,
11056
+ "disposition": "closed",
11057
+ "target": null,
11058
+ "sources": [
11059
+ {
11060
+ "file": "RFCS/registers/0199-outbound-oauth-client-and-credential-interrupt.gaps.md",
11061
+ "token": "G5"
11062
+ }
11063
+ ]
11064
+ },
11065
+ {
11066
+ "id": "openwop.gap.0199.6",
11067
+ "rfc": "0199",
11068
+ "local": "G6",
11069
+ "section": "§D.2(b)",
11070
+ "surface": "**The client-without-URL-mode answer shape** (Unresolved question 1). MCP 2026-07-28 reserved `-32042`, which leaves no upstream error for \"URL mode required\".",
11071
+ "witness": "unclassified",
11072
+ "requirementId": null,
11073
+ "disposition": "transferred",
11074
+ "target": "rfc-0199-spec-pr",
11075
+ "sources": [
11076
+ {
11077
+ "file": "RFCS/registers/0199-outbound-oauth-client-and-credential-interrupt.gaps.md",
11078
+ "token": "G6"
11079
+ }
11080
+ ]
11081
+ },
11082
+ {
11083
+ "id": "openwop.gap.0199.7",
11084
+ "rfc": "0199",
11085
+ "local": "G7",
11086
+ "section": "§A.4",
11087
+ "surface": "**An issuer-less provider on a single-provider host.** RFC 9700 §4.4.2 waives mix-up defences for a client that talks to one authorization server. §A.4's distinct-redirect rule is then trivially met, which is correct, but the scenario cannot tell such a host from one that shares a redirect URI.",
11088
+ "witness": "unclassified",
11089
+ "requirementId": null,
11090
+ "disposition": "closed",
11091
+ "target": null,
11092
+ "sources": [
11093
+ {
11094
+ "file": "RFCS/registers/0199-outbound-oauth-client-and-credential-interrupt.gaps.md",
11095
+ "token": "G7"
11096
+ }
11097
+ ]
11098
+ },
11099
+ {
11100
+ "id": "openwop.gap.0199.8",
11101
+ "rfc": "0199",
11102
+ "local": "G8",
11103
+ "section": "Budget",
11104
+ "surface": "**Shared core headroom.** ≈ +162 net words. *Re-measured 2026-09-22 after the #1483 trim:* 24,446 / 29,000, shared with every RFC in the 0197–0209 batch (`review/arch-impl.md` §2; the old 27,275 base is stale).",
11105
+ "witness": "unclassified",
11106
+ "requirementId": null,
11107
+ "disposition": "transferred",
11108
+ "target": "scripts/check-core-budget.mjs",
11109
+ "sources": [
11110
+ {
11111
+ "file": "RFCS/registers/0199-outbound-oauth-client-and-credential-interrupt.gaps.md",
11112
+ "token": "G8"
11113
+ }
11114
+ ]
11115
+ },
11116
+ {
11117
+ "id": "openwop.gap.0199.9",
11118
+ "rfc": "0199",
11119
+ "local": "G9",
11120
+ "section": "§D.1, §D.2",
11121
+ "surface": "**Collision with RFC 0208's registry.** RFC 0208 (filed the same day) moves the v2 mappings into `spec/v2/interop-map.json`. Its first draft gave form mode to every waiting interrupt in `mcp.mrtr` and said \"no forward source\" for `TASK_STATE_AUTH_REQUIRED`, and its totality check keyed `a2a.taskState` on `RunSnapshot.status` alone, while a `credential` interrupt is `waiting-input` yet maps to `AUTH_REQUIRED`.",
11122
+ "witness": "unclassified",
11123
+ "requirementId": null,
11124
+ "disposition": "closed",
11125
+ "target": null,
11126
+ "sources": [
11127
+ {
11128
+ "file": "RFCS/registers/0199-outbound-oauth-client-and-credential-interrupt.gaps.md",
11129
+ "token": "G9"
11130
+ }
11131
+ ]
11132
+ },
11133
+ {
11134
+ "id": "openwop.gap.0199.10",
11135
+ "rfc": "0199",
11136
+ "local": "G10",
11137
+ "section": "§E.2",
11138
+ "surface": "**Six published packs lack `issuer`** (G4). Under the host-side rule a conforming host refuses to authorize them over MCP reach until they declare it.",
11139
+ "witness": "unclassified",
11140
+ "requirementId": null,
11141
+ "disposition": "externally-gated",
11142
+ "target": "openwop-registry",
11143
+ "sources": [
11144
+ {
11145
+ "file": "RFCS/registers/0199-outbound-oauth-client-and-credential-interrupt.gaps.md",
11146
+ "token": "G10"
11147
+ }
11148
+ ]
11149
+ },
11150
+ {
11151
+ "id": "openwop.gap.0200.1",
11152
+ "rfc": "0200",
11153
+ "local": "G1",
11154
+ "section": "§A, §B",
11155
+ "surface": "**MyndHyve is the only committed v2 host §A/§B bind** (an `oidc` lane with Firebase and Google issuers, `evidence/v2-host-bundles/myndhyve.json`). The row is witnessed only when MyndHyve serves PRM and challenges.",
11156
+ "witness": "unclassified",
11157
+ "requirementId": null,
11158
+ "disposition": "externally-gated",
11159
+ "target": "myndhyve-oidc-prm",
11160
+ "sources": [
11161
+ {
11162
+ "file": "RFCS/registers/0200-host-as-oauth-protected-resource.gaps.md",
11163
+ "token": "G1"
11164
+ }
11165
+ ]
11166
+ },
11167
+ {
11168
+ "id": "openwop.gap.0200.2",
11169
+ "rfc": "0200",
11170
+ "local": "G2",
11171
+ "section": "§A",
11172
+ "surface": "**openwop-app's v2 bundle omits the `oidc` lane that its v1 discovery advertises** (`openwop-auth-oidc-user-bearer`, issuer `securetoken.google.com/openwop-dev`, verify-EF #6). Its v2 advertisement is either incomplete or deliberately narrower.",
11173
+ "witness": "unclassified",
11174
+ "requirementId": null,
11175
+ "disposition": "externally-gated",
11176
+ "target": "openwop-app-v2-oidc-lane",
11177
+ "sources": [
11178
+ {
11179
+ "file": "RFCS/registers/0200-host-as-oauth-protected-resource.gaps.md",
11180
+ "token": "G2"
11181
+ }
11182
+ ]
11183
+ },
11184
+ {
11185
+ "id": "openwop.gap.0200.3",
11186
+ "rfc": "0200",
11187
+ "local": "G3",
11188
+ "section": "§A.3 / UQ1",
11189
+ "surface": "**`resource` (a URL) is not the `oidc` audience** (Firebase `aud` = project id). A PRM consumer that requests `resource=<url>` from Firebase cannot get a token the host accepts. PRM is correct but not *sufficient* for such hosts.",
11190
+ "witness": "unclassified",
11191
+ "requirementId": null,
11192
+ "disposition": "transferred",
11193
+ "target": "SECURITY/threat-model-auth-profiles.md",
11194
+ "sources": [
11195
+ {
11196
+ "file": "RFCS/registers/0200-host-as-oauth-protected-resource.gaps.md",
11197
+ "token": "G3"
11198
+ }
11199
+ ]
11200
+ },
11201
+ {
11202
+ "id": "openwop.gap.0200.4",
11203
+ "rfc": "0200",
11204
+ "local": "G4",
11205
+ "section": "§B.3",
11206
+ "surface": "**The list of non-disclosure 404 rules is enumerated by hand.** A future RFC that adds an identical-404 surface has to be added to the no-oracle scenario, or the invariant silently stops covering it.",
11207
+ "witness": "unclassified",
11208
+ "requirementId": null,
11209
+ "disposition": "transferred",
11210
+ "target": "conformance/src/scenarios/auth-challenge-no-oracle.test.ts",
11211
+ "sources": [
11212
+ {
11213
+ "file": "RFCS/registers/0200-host-as-oauth-protected-resource.gaps.md",
11214
+ "token": "G4"
11215
+ }
11216
+ ]
11217
+ },
11218
+ {
11219
+ "id": "openwop.gap.0200.5",
11220
+ "rfc": "0200",
11221
+ "local": "G5",
11222
+ "section": "§E",
11223
+ "surface": "**Body-borne credentials and DPoP proofs are unwitnessable in general** (falsifiability table). The canary legs witness only the header subset.",
11224
+ "witness": "unclassified",
11225
+ "requirementId": null,
11226
+ "disposition": "transferred",
11227
+ "target": "SECURITY/threat-model-secret-leakage.md",
11228
+ "sources": [
11229
+ {
11230
+ "file": "RFCS/registers/0200-host-as-oauth-protected-resource.gaps.md",
11231
+ "token": "G5"
11232
+ }
11233
+ ]
11234
+ },
11235
+ {
11236
+ "id": "openwop.gap.0200.6",
11237
+ "rfc": "0200",
11238
+ "local": "G6",
11239
+ "section": "§C",
11240
+ "surface": "**Overlap with Phase 2 P2-a** (§C.3). If P2-a's wording already states the wrong-audience rejection as a MUST, §C becomes a pointer, and the \"previously undefined\" framing belongs to P2-a.",
11241
+ "witness": "unclassified",
11242
+ "requirementId": null,
11243
+ "disposition": "transferred",
11244
+ "target": "rfc-0200-spec-pr",
11245
+ "sources": [
11246
+ {
11247
+ "file": "RFCS/registers/0200-host-as-oauth-protected-resource.gaps.md",
11248
+ "token": "G6"
11249
+ }
11250
+ ]
11251
+ },
11252
+ {
11253
+ "id": "openwop.gap.0200.7",
11254
+ "rfc": "0200",
11255
+ "local": "G7",
11256
+ "section": "§F",
11257
+ "surface": "**`derive-v2-api.py` has no rule for per-operation `security`** on the three operations it adds itself (`/host/effect-seams`, `/runs/{runId}/compensation`, `/runs/{runId}/effects`), and the scopes are not stated in `rest-endpoints.md`.",
11258
+ "witness": "unclassified",
11259
+ "requirementId": null,
11260
+ "disposition": "transferred",
11261
+ "target": "scripts/derive-v2-api.py",
11262
+ "sources": [
11263
+ {
11264
+ "file": "RFCS/registers/0200-host-as-oauth-protected-resource.gaps.md",
11265
+ "token": "G7"
11266
+ }
11267
+ ]
11268
+ },
11269
+ {
11270
+ "id": "openwop.gap.0200.8",
11271
+ "rfc": "0200",
11272
+ "local": "G8",
11273
+ "section": "§F",
11274
+ "surface": "**`deploy:*` and other extension scopes** in `rest-endpoints.md` (`POST /v1/agents/{agentId}/deployments`) are outside `auth.md` §Scopes. The gate needs a documented extension list, not a silent allowlist.",
11275
+ "witness": "unclassified",
11276
+ "requirementId": null,
11277
+ "disposition": "transferred",
11278
+ "target": "spec/v1/auth.md",
11279
+ "sources": [
11280
+ {
11281
+ "file": "RFCS/registers/0200-host-as-oauth-protected-resource.gaps.md",
11282
+ "token": "G8"
11283
+ }
11284
+ ]
11285
+ },
11286
+ {
11287
+ "id": "openwop.gap.0200.9",
11288
+ "rfc": "0200",
11289
+ "local": "G9",
11290
+ "section": "Budget",
11291
+ "surface": "≈ +152 net words. *Re-measured 2026-09-22 after the #1483 trim:* the shared base is 24,446 / 29,000 (`review/arch-impl.md` §2), not the old 1,725 headroom.",
11292
+ "witness": "unclassified",
11293
+ "requirementId": null,
11294
+ "disposition": "transferred",
11295
+ "target": "scripts/check-core-budget.mjs",
11296
+ "sources": [
11297
+ {
11298
+ "file": "RFCS/registers/0200-host-as-oauth-protected-resource.gaps.md",
11299
+ "token": "G9"
11300
+ }
11301
+ ]
11302
+ },
11303
+ {
11304
+ "id": "openwop.gap.0201.1",
11305
+ "rfc": "0201",
11306
+ "local": "G1",
11307
+ "section": "v2 text",
11308
+ "surface": "**Core word budget.** The v2 half adds about 238 words to `spec/v2/core/webhooks.md` and `headers.md` and homes no family (`webhooks` is already homed in `spec/v2/core/webhooks.md`, and none of the listed v1-dependent families is on this RFC's path). That is under the +300 hard ceiling and over the +0 target. It draws on the ~1,725-word headroom that every Phase 3 RFC shares (architect P3-H5).",
11309
+ "witness": "unclassified",
11310
+ "requirementId": null,
11311
+ "disposition": "transferred",
11312
+ "target": "scripts/check-core-budget.mjs",
11313
+ "sources": [
11314
+ {
11315
+ "file": "RFCS/registers/0201-standard-webhooks-signature-scheme.gaps.md",
11316
+ "token": "G1"
11317
+ }
11318
+ ]
11319
+ },
11320
+ {
11321
+ "id": "openwop.gap.0201.2",
11322
+ "rfc": "0201",
11323
+ "local": "G2",
11324
+ "section": "§D",
11325
+ "surface": "Standard Webhooks 1.0.0 defines **no** endpoint-verification step. The handshake here is OpenWOP's own design, justified by the flooding argument in §Motivation. The only external precedent is the MCP Triggers & Events draft, which RFC 0147 §A.10 forbids citing as alignment.",
11326
+ "witness": "unclassified",
11327
+ "requirementId": null,
11328
+ "disposition": "transferred",
11329
+ "target": "docs/WAIVER-RETROSPECTIVE-REGISTER.md",
11330
+ "sources": [
11331
+ {
11332
+ "file": "RFCS/registers/0201-standard-webhooks-signature-scheme.gaps.md",
11333
+ "token": "G2"
11334
+ }
11335
+ ]
11336
+ },
11337
+ {
11338
+ "id": "openwop.gap.0201.3",
11339
+ "rfc": "0201",
11340
+ "local": "G3",
11341
+ "section": "§B.6",
11342
+ "surface": "Requiring a **client-supplied** `whsec_` secret for opted-in subscriptions differs from v1's host-minted, returned-once secret. It is the only way the endpoint can authenticate the synchronous challenge. Hosts that mint secrets from a KMS may object.",
11343
+ "witness": "unclassified",
11344
+ "requirementId": null,
11345
+ "disposition": "externally-gated",
11346
+ "target": "host-report",
11347
+ "sources": [
11348
+ {
11349
+ "file": "RFCS/registers/0201-standard-webhooks-signature-scheme.gaps.md",
11350
+ "token": "G3"
11351
+ }
11352
+ ]
11353
+ },
11354
+ {
11355
+ "id": "openwop.gap.0201.4",
11356
+ "rfc": "0201",
11357
+ "local": "G4",
11358
+ "section": "§C.10",
11359
+ "surface": "\"Identical across a host restart\" can only be witnessed through the RFC 0158 test hook, and no production host mounts it (openwop-app records `inapplicable`).",
11360
+ "witness": "unclassified",
11361
+ "requirementId": null,
11362
+ "disposition": "closed",
11363
+ "target": null,
11364
+ "sources": [
11365
+ {
11366
+ "file": "RFCS/registers/0201-standard-webhooks-signature-scheme.gaps.md",
11367
+ "token": "G4"
11368
+ }
11369
+ ]
11370
+ },
11371
+ {
11372
+ "id": "openwop.gap.0201.5",
11373
+ "rfc": "0201",
11374
+ "local": "G5",
11375
+ "section": "v1 OpenAPI drift (pre-existing)",
11376
+ "surface": "`api/openapi.yaml` `registerWebhook` omits the `tenantId` body field that `spec/v1/webhooks.md` §Register requires, and its `201` omits `secret`/`secretFingerprint`, which the prose returns. RFC 0201's v1 body edit touches the same schema.",
11377
+ "witness": "unclassified",
11378
+ "requirementId": null,
11379
+ "disposition": "transferred",
11380
+ "target": "phase-2-parity-correction",
11381
+ "sources": [
11382
+ {
11383
+ "file": "RFCS/registers/0201-standard-webhooks-signature-scheme.gaps.md",
11384
+ "token": "G5"
11385
+ }
11386
+ ]
11387
+ },
11388
+ {
11389
+ "id": "openwop.gap.0201.6",
11390
+ "rfc": "0201",
11391
+ "local": "G6",
11392
+ "section": "§E",
11393
+ "surface": "The post-overlap retirement leg cannot run in a bounded suite when `overlapSeconds` is large. It records `partial-witness:`, not `executed-pass`.",
11394
+ "witness": "unclassified",
11395
+ "requirementId": null,
11396
+ "disposition": "closed",
11397
+ "target": null,
11398
+ "sources": [
11399
+ {
11400
+ "file": "RFCS/registers/0201-standard-webhooks-signature-scheme.gaps.md",
11401
+ "token": "G6"
11402
+ }
11403
+ ]
11404
+ },
11405
+ {
11406
+ "id": "openwop.gap.0201.7",
11407
+ "rfc": "0201",
11408
+ "local": "G7",
11409
+ "section": "Process",
11410
+ "surface": "The architect pass (P3) recommended that Phase 3 **not** repeat the RFC 0147 §A.6 override. The authoring rules for this batch instruct `Draft → Active` under the override.",
11411
+ "witness": "unclassified",
11412
+ "requirementId": null,
11413
+ "disposition": "closed",
11414
+ "target": null,
11415
+ "sources": [
11416
+ {
11417
+ "file": "RFCS/registers/0201-standard-webhooks-signature-scheme.gaps.md",
11418
+ "token": "G7"
11419
+ }
11420
+ ]
11421
+ },
11422
+ {
11423
+ "id": "openwop.gap.0202.1",
11424
+ "rfc": "0202",
11425
+ "local": "G1",
11426
+ "section": "§Normative text",
11427
+ "surface": "`agents` is not homed in v2. Its declared home is six v1 documents and 19 facets; the card rule written here is an `a2a` obligation in `interop.md`, which is already homed, so this RFC costs **+214** core words with no cap grant. A token v2 document naming 19 facets would pass the home gate and be the dishonest resolution RFC 0189's Motivation exists to end.",
11428
+ "witness": "unclassified",
11429
+ "requirementId": null,
11430
+ "disposition": "transferred",
11431
+ "target": "docs/normative-home-baseline.json",
11432
+ "sources": [
11433
+ {
11434
+ "file": "RFCS/registers/0202-per-agent-a2a-agent-cards.gaps.md",
11435
+ "token": "G1"
11436
+ }
11437
+ ]
11438
+ },
11439
+ {
11440
+ "id": "openwop.gap.0202.2",
11441
+ "rfc": "0202",
11442
+ "local": "G2",
11443
+ "section": "§Compatibility",
11444
+ "surface": "V1 gets no per-agent card. v1 `a2a-integration.md` §C and §E would carry the same rules, but every v1 MUST needs a v1 witness and no v1 host serves A2A 1.0 with a tenant-scoped inventory.",
11445
+ "witness": "unclassified",
11446
+ "requirementId": null,
11447
+ "disposition": "transferred",
11448
+ "target": "spec/v1/a2a-integration.md",
11449
+ "sources": [
11450
+ {
11451
+ "file": "RFCS/registers/0202-per-agent-a2a-agent-cards.gaps.md",
11452
+ "token": "G2"
11453
+ }
11454
+ ]
11455
+ },
11456
+ {
11457
+ "id": "openwop.gap.0202.3",
11458
+ "rfc": "0202",
11459
+ "local": "G3",
11460
+ "section": "§C",
11461
+ "surface": "Roster entries (RFC 0086) are the more natural A2A agent — their `workflows[]` portfolio is `skills[]` — but they are not covered.",
11462
+ "witness": "unclassified",
11463
+ "requirementId": null,
11464
+ "disposition": "transferred",
11465
+ "target": "spec/v1/agent-roster.md",
11466
+ "sources": [
11467
+ {
11468
+ "file": "RFCS/registers/0202-per-agent-a2a-agent-cards.gaps.md",
11469
+ "token": "G3"
11470
+ }
11471
+ ]
11472
+ },
11473
+ {
11474
+ "id": "openwop.gap.0202.4",
11475
+ "rfc": "0202",
11476
+ "local": "G4",
11477
+ "section": "§B.2",
11478
+ "surface": "\"`R` MUST NOT encode a tenant, workspace, or principal\" is only partly witnessable: the suite can look for identifiers the host discloses, not for ones it keeps private.",
11479
+ "witness": "unclassified",
11480
+ "requirementId": null,
11481
+ "disposition": "transferred",
11482
+ "target": "conformance/src/scenarios/v2-a2a-agent-cards.test.ts",
11483
+ "sources": [
11484
+ {
11485
+ "file": "RFCS/registers/0202-per-agent-a2a-agent-cards.gaps.md",
11486
+ "token": "G4"
11487
+ }
11488
+ ]
11489
+ },
11490
+ {
11491
+ "id": "openwop.gap.0202.5",
11492
+ "rfc": "0202",
11493
+ "local": "G5",
11494
+ "section": "§Invariant",
11495
+ "surface": "`agent-card-no-tenant-leak` is named, not registered: registration waits for a committed bundle with `.identical-refusal` at `executed-pass`.",
11496
+ "witness": "unclassified",
11497
+ "requirementId": null,
11498
+ "disposition": "transferred",
11499
+ "target": "SECURITY/invariants.yaml",
11500
+ "sources": [
11501
+ {
11502
+ "file": "RFCS/registers/0202-per-agent-a2a-agent-cards.gaps.md",
11503
+ "token": "G5"
11504
+ }
11505
+ ]
11506
+ },
11507
+ {
11508
+ "id": "openwop.gap.0202.6",
11509
+ "rfc": "0202",
11510
+ "local": "G6",
11511
+ "section": "§D.7",
11512
+ "surface": "No v2 host advertises both `a2a` and `agents`. The cross-tenant legs also need an operator-provisioned second principal and an agent only tenant B has.",
11513
+ "witness": "unclassified",
11514
+ "requirementId": null,
11515
+ "disposition": "externally-gated",
11516
+ "target": "host-work",
11517
+ "sources": [
11518
+ {
11519
+ "file": "RFCS/registers/0202-per-agent-a2a-agent-cards.gaps.md",
11520
+ "token": "G6"
11521
+ }
11522
+ ]
11523
+ },
11524
+ {
11525
+ "id": "openwop.gap.0202.7",
11526
+ "rfc": "0202",
11527
+ "local": "G7",
11528
+ "section": "§D.7",
11529
+ "surface": "Identical bodies are not identical latency; a timing channel remains. A2A v1.0.1 §13.1 is silent on it.",
11530
+ "witness": "unclassified",
11531
+ "requirementId": null,
11532
+ "disposition": "transferred",
11533
+ "target": "SECURITY/threat-model-interop.md",
11534
+ "sources": [
11535
+ {
11536
+ "file": "RFCS/registers/0202-per-agent-a2a-agent-cards.gaps.md",
11537
+ "token": "G7"
11538
+ }
11539
+ ]
11540
+ },
11541
+ {
11542
+ "id": "openwop.gap.0203.1",
11543
+ "rfc": "0203",
11544
+ "local": "G1",
11545
+ "section": "§A.2",
11546
+ "surface": "The subset is pinned to `server.json` `2025-12-11`. The registry's next dated release (a Draft already widens `url` to a leading template variable) may add members or loosen patterns; our closed subset then lags, and a publisher copying a newer record verbatim is refused.",
11547
+ "witness": "unclassified",
11548
+ "requirementId": null,
11549
+ "disposition": "transferred",
11550
+ "target": "schemas/v2/node-pack-manifest.schema.json",
11551
+ "sources": [
11552
+ {
11553
+ "file": "RFCS/registers/0203-remote-runtime-mcp-registry-record.gaps.md",
11554
+ "token": "G1"
11555
+ }
11556
+ ]
11557
+ },
11558
+ {
11559
+ "id": "openwop.gap.0203.2",
11560
+ "rfc": "0203",
11561
+ "local": "G2",
11562
+ "section": "§Compatibility",
11563
+ "surface": "V1 manifests do not gain `mcpServer`. The v1 tree is frozen through the overlap (`packs.md` §\"The registry tree\"), and a v1 field would need a v1 witness.",
11564
+ "witness": "unclassified",
11565
+ "requirementId": null,
11566
+ "disposition": "transferred",
11567
+ "target": "schemas/node-pack-manifest.schema.json",
11568
+ "sources": [
11569
+ {
11570
+ "file": "RFCS/registers/0203-remote-runtime-mcp-registry-record.gaps.md",
11571
+ "token": "G2"
11572
+ }
11573
+ ]
11574
+ },
11575
+ {
11576
+ "id": "openwop.gap.0203.3",
11577
+ "rfc": "0203",
11578
+ "local": "G3",
11579
+ "section": "§C.7",
11580
+ "surface": "The restated `wasm` MUSTs have witnesses only at major 1 (`wasm-pack-abi-version-rejection`, `-memory-cap`, `-load`, … in `conformance/scenario-majors.json`). The v2 home is now honest prose over a family whose behavioural witnesses do not run against v2 hosts.",
11581
+ "witness": "unclassified",
11582
+ "requirementId": null,
11583
+ "disposition": "transferred",
11584
+ "target": "conformance/scripts/generate-scenario-majors.mjs",
11585
+ "sources": [
11586
+ {
11587
+ "file": "RFCS/registers/0203-remote-runtime-mcp-registry-record.gaps.md",
11588
+ "token": "G3"
11589
+ }
11590
+ ]
11591
+ },
11592
+ {
11593
+ "id": "openwop.gap.0203.4",
11594
+ "rfc": "0203",
11595
+ "local": "G4",
11596
+ "section": "§A",
11597
+ "surface": "How a node `typeId` binds to an MCP tool `name` on the named server is unspecified in v1 and v2.",
11598
+ "witness": "unclassified",
11599
+ "requirementId": null,
11600
+ "disposition": "transferred",
11601
+ "target": "spec/v2/core/node-pack-runtimes.md",
11602
+ "sources": [
11603
+ {
11604
+ "file": "RFCS/registers/0203-remote-runtime-mcp-registry-record.gaps.md",
11605
+ "token": "G4"
11606
+ }
11607
+ ]
11608
+ },
11609
+ {
11610
+ "id": "openwop.gap.0203.5",
11611
+ "rfc": "0203",
11612
+ "local": "G5",
11613
+ "section": "§B.5",
11614
+ "surface": "\"SHOULD NOT treat `name` as a verified identity\" is a SHOULD because a host's trust decisions are not observable; a MUST here would be an unwitnessable core MUST, which RFC 0174 §E.2 sends to `ext/`.",
11615
+ "witness": "unclassified",
11616
+ "requirementId": null,
11617
+ "disposition": "transferred",
11618
+ "target": "SECURITY/threat-model-node-packs.md",
11619
+ "sources": [
11620
+ {
11621
+ "file": "RFCS/registers/0203-remote-runtime-mcp-registry-record.gaps.md",
11622
+ "token": "G5"
11623
+ }
11624
+ ]
11625
+ },
11626
+ {
11627
+ "id": "openwop.gap.0203.6",
11628
+ "rfc": "0203",
11629
+ "local": "G6",
11630
+ "section": "§Implementation notes",
11631
+ "surface": "No known host loads `remote` packs, so no host bundle will carry this RFC's rows; `Accepted` rests on the corpus and the registry validator.",
11632
+ "witness": "unclassified",
11633
+ "requirementId": null,
11634
+ "disposition": "externally-gated",
11635
+ "target": "remote-runtime-host",
11636
+ "sources": [
11637
+ {
11638
+ "file": "RFCS/registers/0203-remote-runtime-mcp-registry-record.gaps.md",
11639
+ "token": "G6"
11640
+ }
11641
+ ]
11642
+ },
11643
+ {
11644
+ "id": "openwop.gap.0204.1",
11645
+ "rfc": "0204",
11646
+ "local": "G1",
11647
+ "section": "§Normative text",
11648
+ "surface": "Net core cost is **+245** (445 added, one family homed), inside the +300 ceiling but not self-funding. `mcp` is already homed, so the `ctx.mcp` section grants nothing; homing `httpClient` would not help, because its v1 contract (six facets, `safeFetch`, the egress policy) costs more to restate than the 200-word grant it earns.",
11649
+ "witness": "unclassified",
11650
+ "requirementId": null,
11651
+ "disposition": "transferred",
11652
+ "target": "scripts/check-core-budget.mjs",
11653
+ "sources": [
11654
+ {
11655
+ "file": "RFCS/registers/0204-host-mcp-client-returns-mcp-results.gaps.md",
11656
+ "token": "G1"
11657
+ }
11658
+ ]
11659
+ },
11660
+ {
11661
+ "id": "openwop.gap.0204.2",
11662
+ "rfc": "0204",
11663
+ "local": "G2",
11664
+ "section": "§A.7",
11665
+ "surface": "V2 names the method `callTool`, while the v1 name `invokeTool` is what pack authors know. A host keeping `invokeTool` for ported packs is permitted (MAY) but not specified.",
11666
+ "witness": "unclassified",
11667
+ "requirementId": null,
11668
+ "disposition": "transferred",
11669
+ "target": "../openwop-sdks/sdk/typescript",
11670
+ "sources": [
11671
+ {
11672
+ "file": "RFCS/registers/0204-host-mcp-client-returns-mcp-results.gaps.md",
11673
+ "token": "G2"
11674
+ }
11675
+ ]
11676
+ },
11677
+ {
11678
+ "id": "openwop.gap.0204.3",
11679
+ "rfc": "0204",
11680
+ "local": "G3",
11681
+ "section": "§D.10",
11682
+ "surface": "The restated `toolCatalog` MUSTs are witnessed only at major 1 (`tool-catalog-projection`, `tool-catalog-compact-projection`, `tool-descriptor-shape` in `conformance/scenario-majors.json`).",
11683
+ "witness": "unclassified",
11684
+ "requirementId": null,
11685
+ "disposition": "transferred",
11686
+ "target": "conformance/scripts/generate-scenario-majors.mjs",
11687
+ "sources": [
11688
+ {
11689
+ "file": "RFCS/registers/0204-host-mcp-client-returns-mcp-results.gaps.md",
11690
+ "token": "G3"
11691
+ }
11692
+ ]
11693
+ },
11694
+ {
11695
+ "id": "openwop.gap.0204.4",
11696
+ "rfc": "0204",
11697
+ "local": "G4",
11698
+ "section": "§A",
11699
+ "surface": "No v2 host exposes `ctx.mcp` to packs through a fixture: v2-reference advertises `mcp` seam-gated with no pack-facing client; MyndHyve advertises `toolCatalog` but not `mcp` in v2; openwop-app neither.",
11700
+ "witness": "unclassified",
11701
+ "requirementId": null,
11702
+ "disposition": "externally-gated",
11703
+ "target": "host-work",
11704
+ "sources": [
11705
+ {
11706
+ "file": "RFCS/registers/0204-host-mcp-client-returns-mcp-results.gaps.md",
11707
+ "token": "G4"
11708
+ }
11709
+ ]
11710
+ },
11711
+ {
11712
+ "id": "openwop.gap.0204.5",
11713
+ "rfc": "0204",
11714
+ "local": "G5",
11715
+ "section": "§D.12",
11716
+ "surface": "`annotations-derived` is vacuous on a host that emits no `annotations`, and the row says so (`inapplicable`). Nothing requires a host to emit them.",
11717
+ "witness": "unclassified",
11718
+ "requirementId": null,
11719
+ "disposition": "transferred",
11720
+ "target": "spec/v2/core/tool-catalog.md",
11721
+ "sources": [
11722
+ {
11723
+ "file": "RFCS/registers/0204-host-mcp-client-returns-mcp-results.gaps.md",
11724
+ "token": "G5"
11725
+ }
11726
+ ]
11727
+ },
11728
+ {
11729
+ "id": "openwop.gap.0204.6",
11730
+ "rfc": "0204",
11731
+ "local": "G6",
11732
+ "section": "§D.11",
11733
+ "surface": "\"Not classified\" is host-internal: the suite can only drive it with a tool the host cannot have seen before (the fake server's `conformance_readonly_claim`). A host that pre-classifies suite tools by name could pass without the default being real.",
11734
+ "witness": "unclassified",
11735
+ "requirementId": null,
11736
+ "disposition": "transferred",
11737
+ "target": "conformance/src/scenarios/v2-tool-catalog-annotations.test.ts",
11738
+ "sources": [
11739
+ {
11740
+ "file": "RFCS/registers/0204-host-mcp-client-returns-mcp-results.gaps.md",
11741
+ "token": "G6"
11742
+ }
11743
+ ]
11744
+ },
11745
+ {
11746
+ "id": "openwop.gap.0204.7",
11747
+ "rfc": "0204",
11748
+ "local": "G7",
11749
+ "section": "§C",
11750
+ "surface": "`fetchMCP` stays defined in v1 with its own result convention; the note supersedes it for new packs but nothing retires it.",
11751
+ "witness": "unclassified",
11752
+ "requirementId": null,
11753
+ "disposition": "transferred",
11754
+ "target": "spec/v2/ext/dataIntegration/README.md",
11755
+ "sources": [
11756
+ {
11757
+ "file": "RFCS/registers/0204-host-mcp-client-returns-mcp-results.gaps.md",
11758
+ "token": "G7"
11759
+ }
11760
+ ]
11761
+ },
11762
+ {
11763
+ "id": "openwop.gap.0205.1",
11764
+ "rfc": "0205",
11765
+ "local": "G1",
11766
+ "section": "§C.12 / §E",
11767
+ "surface": "The v2 `artifactTypes` family is still homed in `spec/v1/artifact-type-packs.md`, so §C is written there and binds both majors. A full v2 home needs about 700 words: store/render/export/types, the binding, validate-before-emit, the schema `$id` namespace and bounded compilation. It is granted 200 words of cap.",
11768
+ "witness": "unclassified",
11769
+ "requirementId": null,
11770
+ "disposition": "transferred",
11771
+ "target": "spec/v2/declaration.json",
11772
+ "sources": [
11773
+ {
11774
+ "file": "RFCS/registers/0205-run-artifacts-and-turns-speak-a2a-parts.gaps.md",
11775
+ "token": "G1"
11776
+ }
11777
+ ]
11778
+ },
11779
+ {
11780
+ "id": "openwop.gap.0205.2",
11781
+ "rfc": "0205",
11782
+ "local": "G2",
11783
+ "section": "Conformance",
11784
+ "surface": "No host implements `getArtifact` end-to-end. `artifact-auth.test.ts`'s header says so, and no conformance fixture emits `artifact.created` with a readable id. `0205.artifact-a2a-shape` and `.artifact-id-matches-path` therefore stay `inapplicable` everywhere until a host ships both.",
11785
+ "witness": "unclassified",
11786
+ "requirementId": null,
11787
+ "disposition": "externally-gated",
11788
+ "target": "artifact-producing-fixture",
11789
+ "sources": [
11790
+ {
11791
+ "file": "RFCS/registers/0205-run-artifacts-and-turns-speak-a2a-parts.gaps.md",
11792
+ "token": "G2"
11793
+ }
11794
+ ]
11795
+ },
11796
+ {
11797
+ "id": "openwop.gap.0205.3",
11798
+ "rfc": "0205",
11799
+ "local": "G3",
11800
+ "section": "§A.3",
11801
+ "surface": "`0205.artifact-url-part-scoped` needs a host that emits `url` Parts and a second-tenant credential. Any host that emits only `data`/`text`/`raw` Parts makes the row vacuously inapplicable, which is honest but witnesses nothing.",
11802
+ "witness": "unclassified",
11803
+ "requirementId": null,
11804
+ "disposition": "externally-gated",
11805
+ "target": "host-emitting-url-parts",
11806
+ "sources": [
11807
+ {
11808
+ "file": "RFCS/registers/0205-run-artifacts-and-turns-speak-a2a-parts.gaps.md",
11809
+ "token": "G3"
11810
+ }
11811
+ ]
11812
+ },
11813
+ {
11814
+ "id": "openwop.gap.0205.4",
11815
+ "rfc": "0205",
11816
+ "local": "G4",
11817
+ "section": "§B.5",
11818
+ "surface": "A `system` turn has no A2A `Role`, so a turn with `role: system` and `parts` is A2A-*shaped* but not A2A-*projectable*.",
11819
+ "witness": "unclassified",
11820
+ "requirementId": null,
11821
+ "disposition": "transferred",
11822
+ "target": "rfc-0208",
11823
+ "sources": [
11824
+ {
11825
+ "file": "RFCS/registers/0205-run-artifacts-and-turns-speak-a2a-parts.gaps.md",
11826
+ "token": "G4"
11827
+ }
11828
+ ]
11829
+ },
11830
+ {
11831
+ "id": "openwop.gap.0205.5",
11832
+ "rfc": "0205",
11833
+ "local": "G5",
11834
+ "section": "Forward path",
11835
+ "surface": "The later emission MUST needs a gating facet. `getArtifact` belongs to no family, and minting a facet here would be premature, because no host has asked to advertise it.",
11836
+ "witness": "unclassified",
11837
+ "requirementId": null,
11838
+ "disposition": "transferred",
11839
+ "target": "phase-4-content-must-rfc",
11840
+ "sources": [
11841
+ {
11842
+ "file": "RFCS/registers/0205-run-artifacts-and-turns-speak-a2a-parts.gaps.md",
11843
+ "token": "G5"
11844
+ }
11845
+ ]
11846
+ },
11847
+ {
11848
+ "id": "openwop.gap.0205.6",
11849
+ "rfc": "0205",
11850
+ "local": "G6",
11851
+ "section": "§B.8",
11852
+ "surface": "The v1 turn gains no `parts`, so a v1 → v2 fork of a v1 run carries no A2A-shaped turns. That is correct because nothing is synthesized, but a cross-major replay is still unrenderable.",
11853
+ "witness": "unclassified",
11854
+ "requirementId": null,
11855
+ "disposition": "transferred",
11856
+ "target": "spec/v1/migrations.json",
11857
+ "sources": [
11858
+ {
11859
+ "file": "RFCS/registers/0205-run-artifacts-and-turns-speak-a2a-parts.gaps.md",
11860
+ "token": "G6"
11861
+ }
11862
+ ]
11863
+ },
11864
+ {
11865
+ "id": "openwop.gap.0205.7",
11866
+ "rfc": "0205",
11867
+ "local": "G7",
11868
+ "section": "§D",
11869
+ "surface": "The schemas are transcribed from `a2a.proto` by hand. Nothing detects a future A2A minor that adds a `Part` or `Artifact` field. The closed v2 objects would then reject a field a peer legitimately sends.",
11870
+ "witness": "unclassified",
11871
+ "requirementId": null,
11872
+ "disposition": "transferred",
11873
+ "target": "conformance/fixtures/upstream/a2a-v1.0.1",
11874
+ "sources": [
11875
+ {
11876
+ "file": "RFCS/registers/0205-run-artifacts-and-turns-speak-a2a-parts.gaps.md",
11877
+ "token": "G7"
11878
+ }
11879
+ ]
11880
+ },
11881
+ {
11882
+ "id": "openwop.gap.0205.8",
11883
+ "rfc": "0205",
11884
+ "local": "G8",
11885
+ "section": "§C.9",
11886
+ "surface": "Media-type parameters (`text/csv; charset=utf-8`) are refused by the pattern. A format that exists only as a parameterized type cannot be named.",
11887
+ "witness": "unclassified",
11888
+ "requirementId": null,
11889
+ "disposition": "externally-gated",
11890
+ "target": "pack-needs-media-type-parameters",
11891
+ "sources": [
11892
+ {
11893
+ "file": "RFCS/registers/0205-run-artifacts-and-turns-speak-a2a-parts.gaps.md",
11894
+ "token": "G8"
11895
+ }
11896
+ ]
11897
+ },
11898
+ {
11899
+ "id": "openwop.gap.0206.1",
11900
+ "rfc": "0206",
11901
+ "local": "G1",
11902
+ "section": "§D / Compatibility",
11903
+ "surface": "The v2 `content` and `i18n` families are still homed in `spec/v1/` (`spec/v2/declaration.json` `normativeText`). This RFC edits those v1 documents and writes no v2 core prose, so the v2 homing debt is unchanged and the core-word delta is 0. A full v2 home needs roughly 600 words: the §A coherence constraints, the section shape, `resolveSection`, the delivery endpoints and the §F security rules for `content`; `Accept-Language`, fallback and advertisement for `i18n`. The two families grant 400 words of cap, so homing both nets about +200.",
11904
+ "witness": "unclassified",
11905
+ "requirementId": null,
11906
+ "disposition": "transferred",
11907
+ "target": "spec/v2/declaration.json",
11908
+ "sources": [
11909
+ {
11910
+ "file": "RFCS/registers/0206-locale-keys-accept-negotiated-bcp47.gaps.md",
11911
+ "token": "G1"
11912
+ }
11913
+ ]
11914
+ },
11915
+ {
11916
+ "id": "openwop.gap.0206.2",
11917
+ "rfc": "0206",
11918
+ "local": "G2",
11919
+ "section": "§A.2",
11920
+ "surface": "The grammar excludes RFC 5646 variants (`de-CH-1996`, `ca-ES-valencia`), extensions (`-u-ca-buddhist`), private use (`-x-`), `extlang` (`zh-yue`) and grandfathered tags. A host that negotiates one of these still cannot author content for it.",
11921
+ "witness": "unclassified",
11922
+ "requirementId": null,
11923
+ "disposition": "externally-gated",
11924
+ "target": "host-needs-variant-tags",
11925
+ "sources": [
11926
+ {
11927
+ "file": "RFCS/registers/0206-locale-keys-accept-negotiated-bcp47.gaps.md",
11928
+ "token": "G2"
11929
+ }
11930
+ ]
11931
+ },
11932
+ {
11933
+ "id": "openwop.gap.0206.3",
11934
+ "rfc": "0206",
11935
+ "local": "G3",
11936
+ "section": "§C.6",
11937
+ "surface": "`capabilities.{i18n,content}` keep the case-insensitive pattern `^[a-zA-Z]{2,3}(-[a-zA-Z0-9]{2,8}){0,3}$`. A non-canonical advertisement such as `pt-br` validates and can never be a `localizations` key. The SHOULD makes the hazard visible but does not remove it.",
11938
+ "witness": "unclassified",
11939
+ "requirementId": null,
11940
+ "disposition": "transferred",
11941
+ "target": "COMPATIBILITY.md",
11942
+ "sources": [
11943
+ {
11944
+ "file": "RFCS/registers/0206-locale-keys-accept-negotiated-bcp47.gaps.md",
11945
+ "token": "G3"
11946
+ }
11947
+ ]
11948
+ },
11949
+ {
11950
+ "id": "openwop.gap.0206.4",
11951
+ "rfc": "0206",
11952
+ "local": "G4",
11953
+ "section": "Conformance",
11954
+ "surface": "`openwop.requirement.0206.delivery-extended-locale` is gated on a host advertising a content locale outside the old subset. No committed bundle does: openwop-app and MyndHyve both advertise `es`, `pt-BR` and `fr`.",
11955
+ "witness": "unclassified",
11956
+ "requirementId": null,
11957
+ "disposition": "externally-gated",
11958
+ "target": "host-extended-content-locale",
11959
+ "sources": [
11960
+ {
11961
+ "file": "RFCS/registers/0206-locale-keys-accept-negotiated-bcp47.gaps.md",
11962
+ "token": "G4"
11963
+ }
11964
+ ]
11965
+ },
11966
+ {
11967
+ "id": "openwop.gap.0206.5",
11968
+ "rfc": "0206",
11969
+ "local": "G5",
11970
+ "section": "§B.4",
11971
+ "surface": "`resolveSection` is \"shared verbatim\" between the spec pseudocode and the suite's TypeScript copy (`localized-content-delivery.test.ts:60`). Nothing mechanically checks that the two stay equivalent, and this RFC edits both.",
11972
+ "witness": "unclassified",
11973
+ "requirementId": null,
11974
+ "disposition": "transferred",
11975
+ "target": "conformance/src/lib",
11976
+ "sources": [
11977
+ {
11978
+ "file": "RFCS/registers/0206-locale-keys-accept-negotiated-bcp47.gaps.md",
11979
+ "token": "G5"
11980
+ }
11981
+ ]
11982
+ },
11983
+ {
11984
+ "id": "openwop.gap.0206.6",
11985
+ "rfc": "0206",
11986
+ "local": "G6",
11987
+ "section": "§A.1",
11988
+ "surface": "`seo.ogLocaleAlternates[]` is typed as a BCP 47 tag, but Open Graph's `og:locale` convention is `language_TERRITORY` (underscore). The old grammar also rejected underscores, so the mismatch is not new.",
11989
+ "witness": "unclassified",
11990
+ "requirementId": null,
11991
+ "disposition": "transferred",
11992
+ "target": "spec/v1/localized-content.md",
11993
+ "sources": [
11994
+ {
11995
+ "file": "RFCS/registers/0206-locale-keys-accept-negotiated-bcp47.gaps.md",
11996
+ "token": "G6"
11997
+ }
11998
+ ]
11999
+ },
12000
+ {
12001
+ "id": "openwop.gap.0206.7",
12002
+ "rfc": "0206",
12003
+ "local": "G7",
12004
+ "section": "Implementation",
12005
+ "surface": "The eight `spec-artifacts/` mirrors are exact-pinned by the conformance suite (`conformance/package.json`, `dist/spec-artifacts.lock.json`), so this change ships only in a coordinated `@openwop/spec-artifacts` + suite release. npm publish needs the steward's go.",
12006
+ "witness": "unclassified",
12007
+ "requirementId": null,
12008
+ "disposition": "externally-gated",
12009
+ "target": "steward-release-go",
12010
+ "sources": [
12011
+ {
12012
+ "file": "RFCS/registers/0206-locale-keys-accept-negotiated-bcp47.gaps.md",
12013
+ "token": "G7"
12014
+ }
12015
+ ]
12016
+ },
12017
+ {
12018
+ "id": "openwop.gap.0207.1",
12019
+ "rfc": "0207",
12020
+ "local": "G1",
12021
+ "section": "§Compatibility, §A",
12022
+ "surface": "**Which carrier does MyndHyve emit today?** MyndHyve is the only host advertising `multiAgent.executionModel.version >= 3`.",
12023
+ "witness": "unclassified",
12024
+ "requirementId": null,
12025
+ "disposition": "closed",
12026
+ "target": null,
12027
+ "sources": [
12028
+ {
12029
+ "file": "RFCS/registers/0207-trace-context-across-mcp-and-a2a.gaps.md",
12030
+ "token": "G1"
12031
+ }
12032
+ ]
12033
+ },
12034
+ {
12035
+ "id": "openwop.gap.0207.2",
12036
+ "rfc": "0207",
12037
+ "local": "G2",
12038
+ "section": "§C.11",
12039
+ "surface": "`schemas/v2/debug-bundle.schema.json` is an orphan: there is no v2 operation, no path-manifest entry and no major-2 scenario. The `production` family still declares a `debugBundle` facet with no read behind it.",
12040
+ "witness": "unclassified",
12041
+ "requirementId": null,
12042
+ "disposition": "transferred",
12043
+ "target": "/cleanup",
12044
+ "sources": [
12045
+ {
12046
+ "file": "RFCS/registers/0207-trace-context-across-mcp-and-a2a.gaps.md",
12047
+ "token": "G2"
12048
+ }
12049
+ ]
12050
+ },
12051
+ {
12052
+ "id": "openwop.gap.0207.3",
12053
+ "rfc": "0207",
12054
+ "local": "G3",
12055
+ "section": "v2 text",
12056
+ "surface": "**`multiAgent` is not homed.** The v2 carrier text is written in `interop.md` (the `a2a`/`mcp` home), not as `multiAgent` v2 text. Homing `multiAgent` means porting a 5,507-word v1 document. A small stub would claim the RFC 0190 budget grant without carrying the family's contract.",
12057
+ "witness": "unclassified",
12058
+ "requirementId": null,
12059
+ "disposition": "transferred",
12060
+ "target": "scripts/check-v2-normative-home.mjs",
12061
+ "sources": [
12062
+ {
12063
+ "file": "RFCS/registers/0207-trace-context-across-mcp-and-a2a.gaps.md",
12064
+ "token": "G3"
12065
+ }
12066
+ ]
12067
+ },
12068
+ {
12069
+ "id": "openwop.gap.0207.4",
12070
+ "rfc": "0207",
12071
+ "local": "G4",
12072
+ "section": "Conformance",
12073
+ "surface": "No v2 host drives an outbound MCP tool call or A2A message from a run against the suite's fake peers. v2-reference advertises `a2a`/`mcp` (seam-gated), but its tree has no `traceparent` handling, and no v2 fixture equivalent to `conformance-mcp-tool-roundtrip` is known to exist.",
12074
+ "witness": "unclassified",
12075
+ "requirementId": null,
12076
+ "disposition": "externally-gated",
12077
+ "target": "v2-reference-trace-fixture",
12078
+ "sources": [
12079
+ {
12080
+ "file": "RFCS/registers/0207-trace-context-across-mcp-and-a2a.gaps.md",
12081
+ "token": "G4"
12082
+ }
12083
+ ]
12084
+ },
12085
+ {
12086
+ "id": "openwop.gap.0207.5",
12087
+ "rfc": "0207",
12088
+ "local": "G5",
12089
+ "section": "§C",
12090
+ "surface": "No committed host emits a non-empty debug-bundle `spans[]`: all three v1 reference hosts return `[]`. `.debug-bundle-span-trace` is therefore `inapplicable` everywhere today.",
12091
+ "witness": "unclassified",
12092
+ "requirementId": null,
12093
+ "disposition": "externally-gated",
12094
+ "target": "host-emits-debug-spans",
12095
+ "sources": [
12096
+ {
12097
+ "file": "RFCS/registers/0207-trace-context-across-mcp-and-a2a.gaps.md",
12098
+ "token": "G5"
12099
+ }
12100
+ ]
12101
+ },
12102
+ {
12103
+ "id": "openwop.gap.0207.6",
12104
+ "rfc": "0207",
12105
+ "local": "G6",
12106
+ "section": "§D",
12107
+ "surface": "Upstream `mcp.session.id` is still defined against 2025-06-18 sessions, and upstream issue `open-telemetry/semantic-conventions-genai#437` is realigning it (review slice D F3). The §D MUST NOT on emitting it for 2026-07-28 exchanges may need revisiting if upstream redefines the attribute.",
12108
+ "witness": "unclassified",
12109
+ "requirementId": null,
12110
+ "disposition": "externally-gated",
12111
+ "target": "otel-semconv-mcp-stability",
12112
+ "sources": [
12113
+ {
12114
+ "file": "RFCS/registers/0207-trace-context-across-mcp-and-a2a.gaps.md",
12115
+ "token": "G6"
12116
+ }
12117
+ ]
12118
+ },
12119
+ {
12120
+ "id": "openwop.gap.0207.7",
12121
+ "rfc": "0207",
12122
+ "local": "G7",
12123
+ "section": "§A.3",
12124
+ "surface": "The inbound (host-as-MCP-server) leg needs an MCP server mount **and** OTLP export reaching the suite. No v2 host advertises `mcp.serverMount` today (architect P3), and hosts in a separate network namespace cannot call back (`REQUIRES_HOST_CALLBACK`).",
12125
+ "witness": "unclassified",
12126
+ "requirementId": null,
12127
+ "disposition": "closed",
12128
+ "target": null,
12129
+ "sources": [
12130
+ {
12131
+ "file": "RFCS/registers/0207-trace-context-across-mcp-and-a2a.gaps.md",
12132
+ "token": "G7"
12133
+ }
12134
+ ]
12135
+ },
12136
+ {
12137
+ "id": "openwop.gap.0207.8",
12138
+ "rfc": "0207",
12139
+ "local": "G8",
12140
+ "section": "Dependency",
12141
+ "surface": "Phase 1 P1-C corrects `debug-bundle.md`'s \"16-byte hex\" `spanId` prose in the same bullet list that §C.9 edits.",
12142
+ "witness": "unclassified",
12143
+ "requirementId": null,
12144
+ "disposition": "closed",
12145
+ "target": null,
12146
+ "sources": [
12147
+ {
12148
+ "file": "RFCS/registers/0207-trace-context-across-mcp-and-a2a.gaps.md",
12149
+ "token": "G8"
12150
+ }
12151
+ ]
12152
+ },
12153
+ {
12154
+ "id": "openwop.gap.0208.1",
12155
+ "rfc": "0208",
12156
+ "local": "G1",
12157
+ "section": "§A, Compatibility",
12158
+ "surface": "The registry carries about 1,470 words of normative `rule` text in `spec/v2/interop-map.json`, and `check-core-budget.mjs` does not measure it, because the gate counts `.md` only. The practice has precedent (`errors.json`, `event-codemap.json`), but those rows are mostly enumerations, while these rows carry RFC 2119 sentences.",
12159
+ "witness": "unclassified",
12160
+ "requirementId": null,
12161
+ "disposition": "closed",
12162
+ "target": null,
12163
+ "sources": [
12164
+ {
12165
+ "file": "RFCS/registers/0208-v2-a2a-mcp-operation-mappings.gaps.md",
12166
+ "token": "G1"
12167
+ }
12168
+ ]
12169
+ },
12170
+ {
12171
+ "id": "openwop.gap.0208.2",
12172
+ "rfc": "0208",
12173
+ "local": "G2",
12174
+ "section": "Compatibility",
12175
+ "surface": "The dual-major hazard. One A2A interface serves every OpenWOP major. v1 §D.2 requires `TaskNotFoundError` for a terminal task and v1 §D.7 pins the 1.0.0 statuses, while this RFC requires `UnsupportedOperationError` and 1.0.1. A dual-major host cannot satisfy both.",
12176
+ "witness": "unclassified",
12177
+ "requirementId": null,
12178
+ "disposition": "closed",
12179
+ "target": null,
12180
+ "sources": [
12181
+ {
12182
+ "file": "RFCS/registers/0208-v2-a2a-mcp-operation-mappings.gaps.md",
12183
+ "token": "G2"
12184
+ }
12185
+ ]
12186
+ },
12187
+ {
12188
+ "id": "openwop.gap.0208.3",
12189
+ "rfc": "0208",
12190
+ "local": "G3",
12191
+ "section": "Conformance",
12192
+ "surface": "No v2 host serves an A2A interface or an MCP server mount. Committed bundles show v2-reference advertising `a2a` and `mcp` for seam-driven negotiation only (no `agentCardUrl`, `profiles` or `serverMount`); MyndHyve and openwop-app advertise neither family at major 2. Every behavioural row is `inapplicable` today.",
12193
+ "witness": "unclassified",
12194
+ "requirementId": null,
12195
+ "disposition": "externally-gated",
12196
+ "target": "v2-a2a-mcp-interface-host",
12197
+ "sources": [
12198
+ {
12199
+ "file": "RFCS/registers/0208-v2-a2a-mcp-operation-mappings.gaps.md",
12200
+ "token": "G3"
12201
+ }
12202
+ ]
12203
+ },
12204
+ {
12205
+ "id": "openwop.gap.0208.4",
12206
+ "rfc": "0208",
12207
+ "local": "G4",
12208
+ "section": "§B, Conformance",
12209
+ "surface": "The six v1 current-profile MCP scenarios (`mcp-2026-07-28-discover`, `mcp-stateless-request`, `mcp-mrtr-roundtrip`, `mcp-cache-tenant-scope`, `mcp-extension-opacity`, `mcp-current-auth-boundary`) and the A2A 1.0 scenarios are major-1 only, and they cannot join `BOTH_MAJORS` because they gate on `.supported` seats. The invariants those scenarios witness (`mcp-cache-tenant-scoped`, `mcp-extension-no-authority`, `mcp-peer-no-authority-escalation`, `mcp-header-body-consistent`, `a2a-card-runtime-consistent`, `a2a-peer-no-authority-escalation`) have no major-2 test.",
12210
+ "witness": "unclassified",
12211
+ "requirementId": null,
12212
+ "disposition": "transferred",
12213
+ "target": "conformance/src/scenarios/v2-mcp-mount-map.test.ts",
12214
+ "sources": [
12215
+ {
12216
+ "file": "RFCS/registers/0208-v2-a2a-mcp-operation-mappings.gaps.md",
12217
+ "token": "G4"
12218
+ }
12219
+ ]
12220
+ },
12221
+ {
12222
+ "id": "openwop.gap.0208.5",
12223
+ "rfc": "0208",
12224
+ "local": "G5",
12225
+ "section": "Compatibility",
12226
+ "surface": "No v1-dependent family can be homed to offset the +297 words. `a2a` and `mcp` are already resolved (their home is `interop.md`). The nearest candidate, `multiAgent`, whose facet is `executionModel`, is unrelated to A2A/MCP composition, and homing it would add its own text. The net stays at +297, under the +300 ceiling.",
12227
+ "witness": "unclassified",
12228
+ "requirementId": null,
12229
+ "disposition": "closed",
12230
+ "target": null,
12231
+ "sources": [
12232
+ {
12233
+ "file": "RFCS/registers/0208-v2-a2a-mcp-operation-mappings.gaps.md",
12234
+ "token": "G5"
12235
+ }
12236
+ ]
12237
+ },
12238
+ {
12239
+ "id": "openwop.gap.0208.6",
12240
+ "rfc": "0208",
12241
+ "local": "G6",
12242
+ "section": "§C",
12243
+ "surface": "`ListTasks` binds to `listRuns`'s result set, and `listRuns` scopes by tenant segment only (RFC 0182 §A.2). A2A §13.1 allows finer, principal-level models. A host whose authorization is finer than tenant would expose more through `ListTasks` than its own model allows, while still satisfying the letter of §C.",
12244
+ "witness": "unclassified",
12245
+ "requirementId": null,
12246
+ "disposition": "transferred",
12247
+ "target": "SECURITY/threat-model-interop.md",
12248
+ "sources": [
12249
+ {
12250
+ "file": "RFCS/registers/0208-v2-a2a-mcp-operation-mappings.gaps.md",
12251
+ "token": "G6"
12252
+ }
12253
+ ]
12254
+ },
12255
+ {
12256
+ "id": "openwop.gap.0208.7",
12257
+ "rfc": "0208",
12258
+ "local": "G7",
12259
+ "section": "§A (`a2a.card`)",
12260
+ "surface": "Per-agent Agent Cards for the `/agents` inventory (RFC 0072/0074) carry their own isolation rules (public card vs tenant-scoped inventory). This RFC homes only the host card.",
12261
+ "witness": "unclassified",
12262
+ "requirementId": null,
12263
+ "disposition": "transferred",
12264
+ "target": "rfc-0202",
12265
+ "sources": [
12266
+ {
12267
+ "file": "RFCS/registers/0208-v2-a2a-mcp-operation-mappings.gaps.md",
12268
+ "token": "G7"
12269
+ }
12270
+ ]
12271
+ },
12272
+ {
12273
+ "id": "openwop.gap.0208.8",
12274
+ "rfc": "0208",
12275
+ "local": "G8",
12276
+ "section": "§E",
12277
+ "surface": "The gRPC column of `a2a.errors` is unwitnessable. The suite ships no gRPC client (`interop.md` §gRPC), so the column is registry data with no probe.",
12278
+ "witness": "unclassified",
12279
+ "requirementId": null,
12280
+ "disposition": "externally-gated",
12281
+ "target": "grpc-client-contributor",
12282
+ "sources": [
12283
+ {
12284
+ "file": "RFCS/registers/0208-v2-a2a-mcp-operation-mappings.gaps.md",
12285
+ "token": "G8"
12286
+ }
12287
+ ]
12288
+ },
12289
+ {
12290
+ "id": "openwop.gap.0208.9",
12291
+ "rfc": "0208",
12292
+ "local": "G9",
12293
+ "section": "§D",
12294
+ "surface": "\"Retained\" versus \"purged\" is host retention policy. The suite cannot purge a run, so the `TaskNotFoundError`-after-purge half is unwitnessable.",
12295
+ "witness": "unclassified",
12296
+ "requirementId": null,
12297
+ "disposition": "externally-gated",
12298
+ "target": "retention-test-hook",
12299
+ "sources": [
12300
+ {
12301
+ "file": "RFCS/registers/0208-v2-a2a-mcp-operation-mappings.gaps.md",
12302
+ "token": "G9"
12303
+ }
12304
+ ]
12305
+ },
12306
+ {
12307
+ "id": "openwop.gap.0208.10",
12308
+ "rfc": "0208",
12309
+ "local": "G10",
12310
+ "section": "§A (`mcp.meta`)",
12311
+ "surface": "The `traceparent` / `tracestate` / `baggage` row homes only the existing v1 named mapping (propagated; never used for authorization). The outbound carrier rule and the A2A carrier belong to RFC 0207.",
12312
+ "witness": "unclassified",
12313
+ "requirementId": null,
12314
+ "disposition": "transferred",
12315
+ "target": "rfc-0207",
12316
+ "sources": [
12317
+ {
12318
+ "file": "RFCS/registers/0208-v2-a2a-mcp-operation-mappings.gaps.md",
12319
+ "token": "G10"
12320
+ }
12321
+ ]
12322
+ },
12323
+ {
12324
+ "id": "openwop.gap.0208.11",
12325
+ "rfc": "0208",
12326
+ "local": "G11",
12327
+ "section": "§A (`mcp.mrtr`, `a2a.taskState`)",
12328
+ "surface": "RFC 0199 (filed the same day) adds the `credential` interrupt, which projects to A2A `TASK_STATE_AUTH_REQUIRED` and to MCP URL-mode elicitation, and forbids form-mode secrets. Before this pass the draft map gave form mode to every waiting interrupt and said \"no forward source\" for `AUTH_REQUIRED`.",
12329
+ "witness": "unclassified",
12330
+ "requirementId": null,
12331
+ "disposition": "transferred",
12332
+ "target": "rfc-0199",
12333
+ "sources": [
12334
+ {
12335
+ "file": "RFCS/registers/0208-v2-a2a-mcp-operation-mappings.gaps.md",
12336
+ "token": "G11"
12337
+ }
12338
+ ]
12339
+ },
12340
+ {
12341
+ "id": "openwop.gap.0209.1",
12342
+ "rfc": "0209",
12343
+ "local": "G1",
12344
+ "section": "Conformance",
12345
+ "surface": "Three things are missing before the four seam-gated rows (`version-selects-branch`, `fold-guarded`, `legacy-readable`, `taint-sticky`) can be witnessed. There is no v2 emit-surface seam: v1's lives in `host-sample-test-seams.md` and is major-1, and `api/seams-v2.yaml` has no A2UI seam. No v2 host renders or emits A2UI. And no committed v2 bundle carries the kind.",
12346
+ "witness": "unclassified",
12347
+ "requirementId": null,
12348
+ "disposition": "externally-gated",
12349
+ "target": "v2-a2ui-emit-seam",
12350
+ "sources": [
12351
+ {
12352
+ "file": "RFCS/registers/0209-v2-a2ui-surfaces-are-a2ui-v0-9.gaps.md",
12353
+ "token": "G1"
12354
+ }
12355
+ ]
12356
+ },
12357
+ {
12358
+ "id": "openwop.gap.0209.2",
12359
+ "rfc": "0209",
12360
+ "local": "G2",
12361
+ "section": "§B.6",
12362
+ "surface": "The profile excludes `Icon`, `List` (templated children), `Tabs`, `Modal`, `Slider`, and every `FunctionCall` except `required`. Some real surfaces will want these.",
12363
+ "witness": "unclassified",
12364
+ "requirementId": null,
12365
+ "disposition": "externally-gated",
12366
+ "target": "surface-author-demand",
12367
+ "sources": [
12368
+ {
12369
+ "file": "RFCS/registers/0209-v2-a2ui-surfaces-are-a2ui-v0-9.gaps.md",
12370
+ "token": "G2"
12371
+ }
12372
+ ]
12373
+ },
12374
+ {
12375
+ "id": "openwop.gap.0209.3",
12376
+ "rfc": "0209",
12377
+ "local": "G3",
12378
+ "section": "§C.9",
12379
+ "surface": "\"Exactly one `root` before render\" and \"no action before finalization\" are render-side rules that the server-oriented suite cannot see.",
12380
+ "witness": "unclassified",
12381
+ "requirementId": null,
12382
+ "disposition": "transferred",
12383
+ "target": "openwop-app:frontend/react/src/chat/a2ui/__tests__/a2ui-render-invariants.test.tsx",
12384
+ "sources": [
12385
+ {
12386
+ "file": "RFCS/registers/0209-v2-a2ui-surfaces-are-a2ui-v0-9.gaps.md",
12387
+ "token": "G3"
12388
+ }
12389
+ ]
12390
+ },
12391
+ {
12392
+ "id": "openwop.gap.0209.4",
12393
+ "rfc": "0209",
12394
+ "local": "G4",
12395
+ "section": "§D.14",
12396
+ "surface": "`ui` and `media` are still not listed in `spec/v2/declaration.json` `reservedOrgs`, so a vendor could apply to register either one and collide with the core kind families.",
12397
+ "witness": "unclassified",
12398
+ "requirementId": null,
12399
+ "disposition": "transferred",
12400
+ "target": "spec/v2/declaration.json",
12401
+ "sources": [
12402
+ {
12403
+ "file": "RFCS/registers/0209-v2-a2ui-surfaces-are-a2ui-v0-9.gaps.md",
12404
+ "token": "G4"
12405
+ }
12406
+ ]
12407
+ },
12408
+ {
12409
+ "id": "openwop.gap.0209.5",
12410
+ "rfc": "0209",
12411
+ "local": "G5",
12412
+ "section": "§D.15",
12413
+ "surface": "The deprecation row can say only `removeIn: \"3.0\"` until RFC 0197 adds a `v2-minor` removal trigger. `check-removal-dates.mjs` compares majors only (arch-P4 finding 5).",
12414
+ "witness": "unclassified",
12415
+ "requirementId": null,
12416
+ "disposition": "transferred",
12417
+ "target": "rfc-0197",
12418
+ "sources": [
12419
+ {
12420
+ "file": "RFCS/registers/0209-v2-a2ui-surfaces-are-a2ui-v0-9.gaps.md",
12421
+ "token": "G5"
12422
+ }
12423
+ ]
12424
+ },
12425
+ {
12426
+ "id": "openwop.gap.0209.6",
12427
+ "rfc": "0209",
12428
+ "local": "G6",
12429
+ "section": "§C.10",
12430
+ "surface": "The v1 `field.select` resume value is a string. The v0.9 `ChoicePicker` binds to a string array. So a workflow migrated through the informative codemap receives `[\"eu\"]` where it received `\"eu\"`.",
12431
+ "witness": "unclassified",
12432
+ "requirementId": null,
12433
+ "disposition": "closed",
12434
+ "target": null,
12435
+ "sources": [
12436
+ {
12437
+ "file": "RFCS/registers/0209-v2-a2ui-surfaces-are-a2ui-v0-9.gaps.md",
12438
+ "token": "G6"
12439
+ }
12440
+ ]
12441
+ },
12442
+ {
12443
+ "id": "openwop.gap.0209.7",
12444
+ "rfc": "0209",
12445
+ "local": "G7",
12446
+ "section": "§B.4",
12447
+ "surface": "The profile is pinned to the bytes a2ui.org served on 2026-09-22, which include the 0.9.1 patch and differ from the repository's `v0.9` git tag. If a2ui.org changes those files in place, the vendored copies drift from what upstream serves.",
12448
+ "witness": "unclassified",
12449
+ "requirementId": null,
12450
+ "disposition": "transferred",
12451
+ "target": "conformance/fixtures/upstream/a2ui-v0.9",
12452
+ "sources": [
12453
+ {
12454
+ "file": "RFCS/registers/0209-v2-a2ui-surfaces-are-a2ui-v0-9.gaps.md",
12455
+ "token": "G7"
12456
+ }
12457
+ ]
12458
+ },
12459
+ {
12460
+ "id": "openwop.gap.0209.8",
12461
+ "rfc": "0209",
12462
+ "local": "G8",
12463
+ "section": "Unresolved Q3",
12464
+ "surface": "A2A peers exchanging A2UI (`mediaType: \"application/a2ui+json\"` data Parts, the A2UI A2A extension URI) are outside this RFC.",
12465
+ "witness": "unclassified",
12466
+ "requirementId": null,
12467
+ "disposition": "transferred",
12468
+ "target": "rfc-0208",
12469
+ "sources": [
12470
+ {
12471
+ "file": "RFCS/registers/0209-v2-a2ui-surfaces-are-a2ui-v0-9.gaps.md",
12472
+ "token": "G8"
12473
+ }
12474
+ ]
12475
+ },
12476
+ {
12477
+ "id": "openwop.gap.0210.1",
12478
+ "rfc": "0210",
12479
+ "local": "G1",
12480
+ "section": "§D.10",
12481
+ "surface": "`identity.md` §2.2's `anonymous` row has `—` in the `revocation` column, while `auth.schema.json` REQUIRES `revocation` on every lane member. An `anonymous` lane therefore must advertise a value the table does not name; openwop-app advertises `next-request` (`evidence/v2-host-bundles/openwop-workflow-engine.json`). The §D.9 leg leaves `anonymous` unconstrained for exactly this reason, which is a hole in an assertion whose whole point is to have no holes.",
12482
+ "witness": "unclassified",
12483
+ "requirementId": null,
12484
+ "disposition": "transferred",
12485
+ "target": "spec/v2/core/identity.md",
12486
+ "sources": [
12487
+ {
12488
+ "file": "RFCS/registers/0210-lane-revocation-rule-is-measured.gaps.md",
12489
+ "token": "G1"
12490
+ }
12491
+ ]
12492
+ },
12493
+ {
12494
+ "id": "openwop.gap.0210.2",
12495
+ "rfc": "0210",
12496
+ "local": "G2",
12497
+ "section": "§E.11",
12498
+ "surface": "`revocation` has **no registry file**. Unlike `spec/v2/errors.json` and `spec/v2/event-codemap.json` it lives inline in the facet schema, so `overview.md` §0's \"adding a row to its registry and regenerating\" has no literal referent, and the unknown-member tolerance rule attaches to it only by RFC 0197 §A.2 R4's wording \"registry-backed **or advertised** enum\". §E.11 states the rule explicitly to close that reading; it does not create the file.",
12499
+ "witness": "unclassified",
12500
+ "requirementId": null,
12501
+ "disposition": "transferred",
12502
+ "target": "spec/v2/facets/auth.schema.json",
12503
+ "sources": [
12504
+ {
12505
+ "file": "RFCS/registers/0210-lane-revocation-rule-is-measured.gaps.md",
12506
+ "token": "G2"
12507
+ }
12508
+ ]
12509
+ },
12510
+ {
12511
+ "id": "openwop.gap.0210.3",
12512
+ "rfc": "0210",
12513
+ "local": "G3",
12514
+ "section": "Unresolved question 2",
12515
+ "surface": "`revocationWindowSeconds` is not conditionally REQUIRED by `auth.schema.json` — only by `identity.md` §2.2's prose and by one suite leg. A lane advertising `exp-and-recheck` with no window is schema-valid today and is caught only by the suite. This RFC does not fix it, for the same reason it keeps the full lane → rule binding out of the schema.",
12516
+ "witness": "unclassified",
12517
+ "requirementId": null,
12518
+ "disposition": "transferred",
12519
+ "target": "COMPATIBILITY.md",
12520
+ "sources": [
12521
+ {
12522
+ "file": "RFCS/registers/0210-lane-revocation-rule-is-measured.gaps.md",
12523
+ "token": "G3"
12524
+ }
12525
+ ]
12526
+ },
12527
+ {
12528
+ "id": "openwop.gap.0210.4",
12529
+ "rfc": "0210",
12530
+ "local": "G4",
12531
+ "section": "§B.4 / Conformance",
12532
+ "surface": "The `v2-lane-exp-only-bound` legs need an issuer the suite controls, so it can mint a correctly signed token with an arbitrary `iat`/`exp` pair against a JWKS the host trusts. That is the existing `OPENWOP_TEST_OIDC_ISSUER_URL` harness seam, which means the four §B rows are **harness-gated**, never unaided. A host that does not run the harness records them `inapplicable`.",
12533
+ "witness": "unclassified",
12534
+ "requirementId": null,
12535
+ "disposition": "externally-gated",
12536
+ "target": "host-runs-oidc-issuer-harness",
12537
+ "sources": [
12538
+ {
12539
+ "file": "RFCS/registers/0210-lane-revocation-rule-is-measured.gaps.md",
12540
+ "token": "G4"
12541
+ }
12542
+ ]
12543
+ },
12544
+ {
12545
+ "id": "openwop.gap.0210.5",
12546
+ "rfc": "0210",
12547
+ "local": "G5",
12548
+ "section": "§F.13",
12549
+ "surface": "MyndHyve's committed bundle (`evidence/v2-host-bundles/myndhyve.json:488`) advertises `short-lived` / 3600 on `oidc` while the host performs no revocation re-check, and `INTEROP-MATRIX.md` row 18 certifies that bundle for `openwop-discovery-core` **and** `openwop-core-standard`. The §D.9 leg fails that advertisement from the suite minor that ships it, so MyndHyve's next cut is red until the host is corrected.",
12550
+ "witness": "unclassified",
12551
+ "requirementId": null,
12552
+ "disposition": "externally-gated",
12553
+ "target": "myndhyve-revocation-correction",
12554
+ "sources": [
12555
+ {
12556
+ "file": "RFCS/registers/0210-lane-revocation-rule-is-measured.gaps.md",
12557
+ "token": "G5"
12558
+ }
12559
+ ]
12560
+ },
12561
+ {
12562
+ "id": "openwop.gap.0210.6",
12563
+ "rfc": "0210",
12564
+ "local": "G6",
12565
+ "section": "§Motivation 2",
12566
+ "surface": "openwop-app advertises `openwop-auth-oidc-user-bearer` at v1 (`routes/discovery.ts:436–442`) and omits the `oidc` lane at v2 — a **capability that disappears between majors on a truthful host**. `exp-only` removes the cause, but nothing in the corpus notices a v1 profile with no v2 lane, so the next vocabulary gap produces the same regression silently.",
12567
+ "witness": "unclassified",
12568
+ "requirementId": null,
12569
+ "disposition": "transferred",
12570
+ "target": "conformance/src/scenarios",
12571
+ "sources": [
12572
+ {
12573
+ "file": "RFCS/registers/0210-lane-revocation-rule-is-measured.gaps.md",
12574
+ "token": "G6"
12575
+ }
12576
+ ]
12577
+ },
12578
+ {
12579
+ "id": "openwop.gap.0210.7",
12580
+ "rfc": "0210",
12581
+ "local": "G7",
12582
+ "section": "§B.7",
12583
+ "surface": "The SHOULD ceiling of one hour is a judgement, not a derivation: no upstream document states a maximum access-token lifetime (RFC 9068, OAuth 2.1, MCP and RFC 9728 were read in full for one). One hour is Firebase's ID-token lifetime and the number both hosts would advertise, which makes it a description of current practice rather than a standard.",
12584
+ "witness": "unclassified",
12585
+ "requirementId": null,
12586
+ "disposition": "closed",
12587
+ "target": null,
12588
+ "sources": [
12589
+ {
12590
+ "file": "RFCS/registers/0210-lane-revocation-rule-is-measured.gaps.md",
12591
+ "token": "G7"
12592
+ }
12593
+ ]
12594
+ },
10674
12595
  {
10675
12596
  "id": "openwop.gap.spec.a2a-integration.g1",
10676
12597
  "rfc": "0152",