@openwop/openwop-conformance 2.45.14 → 2.45.15

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 (43) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +2 -2
  3. package/dist/spec-artifacts.lock.json +2 -2
  4. package/package.json +2 -2
  5. package/requirements.json +1391 -4
  6. package/scenario-majors.json +65 -2
  7. package/schemas/CORPUS-STAMP.json +9 -9
  8. package/src/lib/backpressure-witness.ts +2 -2
  9. package/src/lib/budget-witness.ts +3 -3
  10. package/src/lib/envelope-schema-static.ts +166 -0
  11. package/src/lib/exhaustion-facet-witness.ts +1 -1
  12. package/src/lib/family-advert-witness.ts +212 -0
  13. package/src/lib/i18n-double.ts +99 -0
  14. package/src/lib/i18n-negotiation-witness.ts +173 -0
  15. package/src/lib/localized-content-witness.ts +49 -0
  16. package/src/lib/model-capability-insufficient-witness.ts +121 -0
  17. package/src/lib/prompt-double.ts +217 -0
  18. package/src/lib/prompt-events-witness.ts +211 -0
  19. package/src/lib/prompt-library-witness.ts +406 -0
  20. package/src/lib/run-bounds-witness.ts +111 -0
  21. package/src/lib/scratch-host.ts +4 -1
  22. package/src/lib/table-schema-witness.ts +3 -1
  23. package/src/scenarios/v2-ai-envelope-shape-static.test.ts +93 -0
  24. package/src/scenarios/v2-ai-providers-advertisement.test.ts +94 -0
  25. package/src/scenarios/v2-envelope-reasoning-shape.test.ts +81 -0
  26. package/src/scenarios/v2-envelope-tier-one-subset-static.test.ts +77 -0
  27. package/src/scenarios/v2-envelope-variant-discriminator-static.test.ts +57 -0
  28. package/src/scenarios/v2-envelopes-advertisement.test.ts +85 -0
  29. package/src/scenarios/v2-i18n-negotiation.test.ts +91 -0
  30. package/src/scenarios/v2-limits-envelope-caps-advertisement.test.ts +61 -0
  31. package/src/scenarios/v2-localized-content-delivery.test.ts +136 -0
  32. package/src/scenarios/v2-media-inline-cap-static.test.ts +59 -0
  33. package/src/scenarios/v2-model-capabilities-advertisement.test.ts +61 -0
  34. package/src/scenarios/v2-model-capability-insufficient.test.ts +63 -0
  35. package/src/scenarios/v2-prompt-all-four-kinds-events.test.ts +69 -0
  36. package/src/scenarios/v2-prompt-end-to-end-events.test.ts +71 -0
  37. package/src/scenarios/v2-prompt-list-and-fetch.test.ts +103 -0
  38. package/src/scenarios/v2-prompt-mutable-lifecycle.test.ts +130 -0
  39. package/src/scenarios/v2-prompt-pack-install.test.ts +78 -0
  40. package/src/scenarios/v2-prompt-render-deterministic.test.ts +87 -0
  41. package/src/scenarios/v2-prompt-resolution-chain-event.test.ts +46 -0
  42. package/src/scenarios/v2-prompt-template-shape.test.ts +112 -0
  43. package/src/scenarios/v2-run-execution-bounds.test.ts +67 -0
package/requirements.json CHANGED
@@ -2,11 +2,11 @@
2
2
  "$comment": "GENERATED by conformance/scripts/generate-requirement-registry.mjs — do not edit. One record per it()/test() in src/scenarios. Ids: openwop.it.<file-stem>.<title-slug>[~n] (src/lib/requirement-ids.ts). A record with id null has an interpolated title; its run-time row is keyed by the rendered title and maps here by file+line only. Renamed ids need a row in requirement-aliases.json.",
3
3
  "generatedFrom": "src/scenarios/*.test.ts",
4
4
  "counts": {
5
- "files": 669,
6
- "tests": 2565,
7
- "withStableId": 2565,
5
+ "files": 690,
6
+ "tests": 2652,
7
+ "withStableId": 2652,
8
8
  "interpolatedTitles": 0,
9
- "explicitIds": 2442
9
+ "explicitIds": 2529
10
10
  },
11
11
  "records": [
12
12
  {
@@ -28252,6 +28252,169 @@
28252
28252
  }
28253
28253
  ]
28254
28254
  },
28255
+ {
28256
+ "id": "openwop.it.v2-ai-envelope-shape-static.ai-envelope-schema-json-compiles-under-ajv-2020",
28257
+ "file": "v2-ai-envelope-shape-static.test.ts",
28258
+ "line": 58,
28259
+ "title": "ai-envelope.schema.json compiles under Ajv 2020",
28260
+ "explicitId": "openwop.requirement.ai-envelope.schemas-compile",
28261
+ "citations": [
28262
+ {
28263
+ "section": "events.md §AI envelopes: E1–E5",
28264
+ "requirement": "schemas/v2/ai-envelope.schema.json MUST compile"
28265
+ }
28266
+ ]
28267
+ },
28268
+ {
28269
+ "id": "openwop.requirement.ai-envelope.schemas-compile",
28270
+ "file": "v2-ai-envelope-shape-static.test.ts",
28271
+ "line": 63,
28272
+ "title": null,
28273
+ "explicitId": "openwop.requirement.ai-envelope.schemas-compile",
28274
+ "citations": [
28275
+ {
28276
+ "section": "events.md §AI envelopes: E1–E5",
28277
+ "requirement": null,
28278
+ "interpolated": true
28279
+ }
28280
+ ]
28281
+ },
28282
+ {
28283
+ "id": "openwop.it.v2-ai-envelope-shape-static.accepts-a-well-formed-envelope-carrying-correlationid-and-meta-source",
28284
+ "file": "v2-ai-envelope-shape-static.test.ts",
28285
+ "line": 72,
28286
+ "title": "accepts a well-formed envelope carrying correlationId and meta.source",
28287
+ "explicitId": "openwop.requirement.ai-envelope.well-formed-accepted",
28288
+ "citations": [
28289
+ {
28290
+ "section": "events.md §AI envelopes: E1–E5",
28291
+ "requirement": null,
28292
+ "interpolated": true
28293
+ }
28294
+ ]
28295
+ },
28296
+ {
28297
+ "id": "openwop.it.v2-ai-envelope-shape-static.rejects-an-envelope-missing-meta",
28298
+ "file": "v2-ai-envelope-shape-static.test.ts",
28299
+ "line": 77,
28300
+ "title": "rejects an envelope missing meta",
28301
+ "explicitId": "openwop.requirement.ai-envelope.meta-required",
28302
+ "citations": [
28303
+ {
28304
+ "section": "events.md §AI envelopes: E1–E5",
28305
+ "requirement": "an envelope without meta MUST be rejected"
28306
+ }
28307
+ ]
28308
+ },
28309
+ {
28310
+ "id": "openwop.it.v2-ai-envelope-shape-static.rejects-an-envelope-with-an-unknown-top-level-property",
28311
+ "file": "v2-ai-envelope-shape-static.test.ts",
28312
+ "line": 81,
28313
+ "title": "rejects an envelope with an unknown top-level property",
28314
+ "explicitId": "openwop.requirement.ai-envelope.top-level-closed",
28315
+ "citations": [
28316
+ {
28317
+ "section": "schemas/v2/ai-envelope.schema.json",
28318
+ "requirement": "the envelope is closed: an unknown top-level property MUST be rejected"
28319
+ }
28320
+ ]
28321
+ },
28322
+ {
28323
+ "id": "openwop.it.v2-ai-envelope-shape-static.rejects-an-envelope-missing-correlationid",
28324
+ "file": "v2-ai-envelope-shape-static.test.ts",
28325
+ "line": 85,
28326
+ "title": "rejects an envelope missing correlationId",
28327
+ "explicitId": "openwop.requirement.ai-envelope.correlation-id-required",
28328
+ "citations": [
28329
+ {
28330
+ "section": "events.md §AI envelopes: E1–E5",
28331
+ "requirement": "correlationId is REQUIRED on every envelope at v2 — an envelope without it MUST be rejected, never synthesized"
28332
+ }
28333
+ ]
28334
+ },
28335
+ {
28336
+ "id": "openwop.it.v2-ai-envelope-shape-static.rejects-an-envelope-whose-meta-carries-no-source",
28337
+ "file": "v2-ai-envelope-shape-static.test.ts",
28338
+ "line": 89,
28339
+ "title": "rejects an envelope whose meta carries no source",
28340
+ "explicitId": "openwop.requirement.ai-envelope.meta-source-required",
28341
+ "citations": [
28342
+ {
28343
+ "section": "events.md §AI envelopes: E1–E5",
28344
+ "requirement": "meta.source is REQUIRED on every envelope at v2 — an envelope without it MUST be rejected"
28345
+ }
28346
+ ]
28347
+ },
28348
+ {
28349
+ "id": "openwop.it.v2-ai-providers-advertisement.the-aiproviders-record-validates-against-its-capabilities-schema-seat",
28350
+ "file": "v2-ai-providers-advertisement.test.ts",
28351
+ "line": 55,
28352
+ "title": "the aiProviders record validates against its capabilities-schema seat",
28353
+ "explicitId": "openwop.requirement.ai-providers.advert-record-schema",
28354
+ "citations": [
28355
+ {
28356
+ "section": null,
28357
+ "requirement": null,
28358
+ "interpolated": true
28359
+ }
28360
+ ]
28361
+ },
28362
+ {
28363
+ "id": "openwop.it.v2-ai-providers-advertisement.aiproviders-selfhosted-is-one-boolean",
28364
+ "file": "v2-ai-providers-advertisement.test.ts",
28365
+ "line": 63,
28366
+ "title": "aiProviders.selfHosted is one boolean",
28367
+ "explicitId": "openwop.requirement.ai-providers.self-hosted-boolean",
28368
+ "citations": [
28369
+ {
28370
+ "section": null,
28371
+ "requirement": null,
28372
+ "interpolated": true
28373
+ }
28374
+ ]
28375
+ },
28376
+ {
28377
+ "id": "openwop.it.v2-ai-providers-advertisement.aiproviders-authmodes-is-one-flat-list-of-modes",
28378
+ "file": "v2-ai-providers-advertisement.test.ts",
28379
+ "line": 71,
28380
+ "title": "aiProviders.authModes is one flat list of modes",
28381
+ "explicitId": "openwop.requirement.ai-providers.auth-modes-flat-list",
28382
+ "citations": [
28383
+ {
28384
+ "section": null,
28385
+ "requirement": null,
28386
+ "interpolated": true
28387
+ }
28388
+ ]
28389
+ },
28390
+ {
28391
+ "id": "openwop.it.v2-ai-providers-advertisement.aiproviders-maxinlinemediabytes-is-an-integer-of-at-least-1",
28392
+ "file": "v2-ai-providers-advertisement.test.ts",
28393
+ "line": 79,
28394
+ "title": "aiProviders.maxInlineMediaBytes is an integer of at least 1",
28395
+ "explicitId": "openwop.requirement.ai-providers.max-inline-media-bytes",
28396
+ "citations": [
28397
+ {
28398
+ "section": null,
28399
+ "requirement": null,
28400
+ "interpolated": true
28401
+ }
28402
+ ]
28403
+ },
28404
+ {
28405
+ "id": "openwop.it.v2-ai-providers-advertisement.aiproviders-promptprefixcache-is-one-boolean",
28406
+ "file": "v2-ai-providers-advertisement.test.ts",
28407
+ "line": 87,
28408
+ "title": "aiProviders.promptPrefixCache is one boolean",
28409
+ "explicitId": "openwop.requirement.ai-providers.prompt-prefix-cache-boolean",
28410
+ "citations": [
28411
+ {
28412
+ "section": null,
28413
+ "requirement": null,
28414
+ "interpolated": true
28415
+ }
28416
+ ]
28417
+ },
28255
28418
  {
28256
28419
  "id": "openwop.it.v2-approval-reject-disposition.a-rejected-gate-with-no-routing-edge-fails-the-run-with-approval-rejected",
28257
28420
  "file": "v2-approval-reject-disposition.test.ts",
@@ -30120,6 +30283,234 @@
30120
30283
  }
30121
30284
  ]
30122
30285
  },
30286
+ {
30287
+ "id": "openwop.requirement.envelopes.reasoning-declared-optional-string",
30288
+ "file": "v2-envelope-reasoning-shape.test.ts",
30289
+ "line": 45,
30290
+ "title": null,
30291
+ "explicitId": "openwop.requirement.envelopes.reasoning-declared-optional-string",
30292
+ "citations": [
30293
+ {
30294
+ "section": "events.md §envelopes",
30295
+ "requirement": null,
30296
+ "interpolated": true
30297
+ },
30298
+ {
30299
+ "section": "events.md §envelopes",
30300
+ "requirement": null,
30301
+ "interpolated": true
30302
+ },
30303
+ {
30304
+ "section": "events.md §envelopes",
30305
+ "requirement": null,
30306
+ "interpolated": true
30307
+ }
30308
+ ]
30309
+ },
30310
+ {
30311
+ "id": "openwop.it.v2-envelope-reasoning-shape.schema-response-does-not-declare-reasoning-a-side-channel-ack",
30312
+ "file": "v2-envelope-reasoning-shape.test.ts",
30313
+ "line": 55,
30314
+ "title": "schema.response does not declare reasoning (a side-channel ack)",
30315
+ "explicitId": "openwop.requirement.envelopes.reasoning-omitted-from-schema-response",
30316
+ "citations": [
30317
+ {
30318
+ "section": "RFC 0030 §A",
30319
+ "requirement": "schemas/v2/envelopes/schema.response.schema.json MUST exist"
30320
+ },
30321
+ {
30322
+ "section": "RFC 0030 §A",
30323
+ "requirement": "schema.response MUST NOT declare reasoning"
30324
+ }
30325
+ ]
30326
+ },
30327
+ {
30328
+ "id": "openwop.requirement.envelopes.reasoning-absent-accepted",
30329
+ "file": "v2-envelope-reasoning-shape.test.ts",
30330
+ "line": 67,
30331
+ "title": null,
30332
+ "explicitId": "openwop.requirement.envelopes.reasoning-absent-accepted",
30333
+ "citations": [
30334
+ {
30335
+ "section": "events.md §envelopes",
30336
+ "requirement": null,
30337
+ "interpolated": true
30338
+ }
30339
+ ]
30340
+ },
30341
+ {
30342
+ "id": "openwop.requirement.envelopes.reasoning-present-accepted",
30343
+ "file": "v2-envelope-reasoning-shape.test.ts",
30344
+ "line": 72,
30345
+ "title": null,
30346
+ "explicitId": "openwop.requirement.envelopes.reasoning-present-accepted",
30347
+ "citations": [
30348
+ {
30349
+ "section": "events.md §envelopes",
30350
+ "requirement": null,
30351
+ "interpolated": true
30352
+ }
30353
+ ]
30354
+ },
30355
+ {
30356
+ "id": "openwop.requirement.envelopes.reasoning-non-string-rejected",
30357
+ "file": "v2-envelope-reasoning-shape.test.ts",
30358
+ "line": 77,
30359
+ "title": null,
30360
+ "explicitId": "openwop.requirement.envelopes.reasoning-non-string-rejected",
30361
+ "citations": [
30362
+ {
30363
+ "section": "events.md §envelopes",
30364
+ "requirement": null,
30365
+ "interpolated": true
30366
+ }
30367
+ ]
30368
+ },
30369
+ {
30370
+ "id": "openwop.requirement.envelopes.tier-one-load-bearing-universal-kinds",
30371
+ "file": "v2-envelope-tier-one-subset-static.test.ts",
30372
+ "line": 46,
30373
+ "title": null,
30374
+ "explicitId": "openwop.requirement.envelopes.tier-one-load-bearing-universal-kinds",
30375
+ "citations": [
30376
+ {
30377
+ "section": "RFC 0030 §B",
30378
+ "requirement": null,
30379
+ "interpolated": true
30380
+ },
30381
+ {
30382
+ "section": "RFC 0030 §B",
30383
+ "requirement": null,
30384
+ "interpolated": true
30385
+ }
30386
+ ]
30387
+ },
30388
+ {
30389
+ "id": "openwop.it.v2-envelope-tier-one-subset-static.a-host-advertising-tieronesubsetcompliance-strict-has-advertised-kinds-whose-cor",
30390
+ "file": "v2-envelope-tier-one-subset-static.test.ts",
30391
+ "line": 56,
30392
+ "title": "a host advertising tierOneSubsetCompliance strict has advertised kinds whose corpus schemas satisfy the Tier-1 intersection",
30393
+ "explicitId": "openwop.requirement.envelopes.tier-one-strict-advertised-kinds",
30394
+ "citations": [
30395
+ {
30396
+ "section": "capabilities.schema.json §envelopes.tierOneSubsetCompliance",
30397
+ "requirement": null,
30398
+ "interpolated": true
30399
+ }
30400
+ ]
30401
+ },
30402
+ {
30403
+ "id": "openwop.it.v2-envelope-variant-discriminator-static.schemas-v2-envelopes-carries-a-payload-schema-for-each-universal-kind",
30404
+ "file": "v2-envelope-variant-discriminator-static.test.ts",
30405
+ "line": 42,
30406
+ "title": "schemas/v2/envelopes carries a payload schema for each universal kind",
30407
+ "explicitId": "openwop.requirement.envelopes.payload-schemas-present",
30408
+ "citations": [
30409
+ {
30410
+ "section": "RFC 0031 §A",
30411
+ "requirement": null,
30412
+ "interpolated": true
30413
+ }
30414
+ ]
30415
+ },
30416
+ {
30417
+ "id": "openwop.requirement.envelopes.variant-no-oneof",
30418
+ "file": "v2-envelope-variant-discriminator-static.test.ts",
30419
+ "line": 47,
30420
+ "title": null,
30421
+ "explicitId": "openwop.requirement.envelopes.variant-no-oneof",
30422
+ "citations": [
30423
+ {
30424
+ "section": "RFC 0031 §A",
30425
+ "requirement": null,
30426
+ "interpolated": true
30427
+ }
30428
+ ]
30429
+ },
30430
+ {
30431
+ "id": "openwop.requirement.envelopes.variant-anyof-discriminated",
30432
+ "file": "v2-envelope-variant-discriminator-static.test.ts",
30433
+ "line": 52,
30434
+ "title": null,
30435
+ "explicitId": "openwop.requirement.envelopes.variant-anyof-discriminated",
30436
+ "citations": [
30437
+ {
30438
+ "section": "RFC 0031 §A",
30439
+ "requirement": null,
30440
+ "interpolated": true
30441
+ }
30442
+ ]
30443
+ },
30444
+ {
30445
+ "id": "openwop.it.v2-envelopes-advertisement.the-envelopes-record-validates-against-its-capabilities-schema-seat",
30446
+ "file": "v2-envelopes-advertisement.test.ts",
30447
+ "line": 46,
30448
+ "title": "the envelopes record validates against its capabilities-schema seat",
30449
+ "explicitId": "openwop.requirement.envelopes.advert-record-schema",
30450
+ "citations": [
30451
+ {
30452
+ "section": null,
30453
+ "requirement": null,
30454
+ "interpolated": true
30455
+ }
30456
+ ]
30457
+ },
30458
+ {
30459
+ "id": "openwop.it.v2-envelopes-advertisement.envelopes-reasoning-promptdirective-is-mandatory-advisory-or-off",
30460
+ "file": "v2-envelopes-advertisement.test.ts",
30461
+ "line": 54,
30462
+ "title": "envelopes.reasoning.promptDirective is mandatory, advisory or off",
30463
+ "explicitId": "openwop.requirement.envelopes.reasoning-advert-shape",
30464
+ "citations": [
30465
+ {
30466
+ "section": null,
30467
+ "requirement": null,
30468
+ "interpolated": true
30469
+ }
30470
+ ]
30471
+ },
30472
+ {
30473
+ "id": "openwop.it.v2-envelopes-advertisement.envelopes-tieronesubsetcompliance-is-strict-warn-or-off",
30474
+ "file": "v2-envelopes-advertisement.test.ts",
30475
+ "line": 62,
30476
+ "title": "envelopes.tierOneSubsetCompliance is strict, warn or off",
30477
+ "explicitId": "openwop.requirement.envelopes.tier-one-subset-compliance-value",
30478
+ "citations": [
30479
+ {
30480
+ "section": null,
30481
+ "requirement": null,
30482
+ "interpolated": true
30483
+ }
30484
+ ]
30485
+ },
30486
+ {
30487
+ "id": "openwop.it.v2-envelopes-advertisement.envelopes-reliability-events-lists-only-reliability-events-and-includes-retry-ex",
30488
+ "file": "v2-envelopes-advertisement.test.ts",
30489
+ "line": 70,
30490
+ "title": "envelopes.reliability.events lists only reliability events and includes retry-exhausted and refusal",
30491
+ "explicitId": "openwop.requirement.envelopes.reliability-events-advert",
30492
+ "citations": [
30493
+ {
30494
+ "section": null,
30495
+ "requirement": null,
30496
+ "interpolated": true
30497
+ }
30498
+ ]
30499
+ },
30500
+ {
30501
+ "id": "openwop.it.v2-envelopes-advertisement.envelopes-reliability-completion-distinguishestruncation-is-a-boolean",
30502
+ "file": "v2-envelopes-advertisement.test.ts",
30503
+ "line": 78,
30504
+ "title": "envelopes.reliability.completion.distinguishesTruncation is a boolean",
30505
+ "explicitId": "openwop.requirement.envelopes.completion-advert-shape",
30506
+ "citations": [
30507
+ {
30508
+ "section": null,
30509
+ "requirement": null,
30510
+ "interpolated": true
30511
+ }
30512
+ ]
30513
+ },
30123
30514
  {
30124
30515
  "id": "openwop.it.v2-era-2-append-vocabulary.a-host-append-to-an-open-era-2-run-keeps-the-log-in-v1-vocabulary-so-the-whole-l",
30125
30516
  "file": "v2-era-2-append-vocabulary.test.ts",
@@ -30745,6 +31136,67 @@
30745
31136
  }
30746
31137
  ]
30747
31138
  },
31139
+ {
31140
+ "id": "openwop.it.v2-i18n-negotiation.the-advertised-i18n-record-is-well-formed-and-lists-its-default-locale",
31141
+ "file": "v2-i18n-negotiation.test.ts",
31142
+ "line": 59,
31143
+ "title": "the advertised i18n record is well-formed and lists its default locale",
31144
+ "explicitId": "openwop.requirement.i18n.record-shape",
31145
+ "citations": [
31146
+ {
31147
+ "section": "schemas/v2/capabilities.schema.json §i18n",
31148
+ "requirement": null,
31149
+ "interpolated": true
31150
+ },
31151
+ {
31152
+ "section": null,
31153
+ "requirement": null,
31154
+ "interpolated": true
31155
+ }
31156
+ ]
31157
+ },
31158
+ {
31159
+ "id": "openwop.it.v2-i18n-negotiation.an-unsupported-accept-language-falls-back-and-content-language-never-lies",
31160
+ "file": "v2-i18n-negotiation.test.ts",
31161
+ "line": 68,
31162
+ "title": "an unsupported Accept-Language falls back and Content-Language never lies",
31163
+ "explicitId": "openwop.requirement.i18n.unsupported-locale-falls-back",
31164
+ "citations": [
31165
+ {
31166
+ "section": null,
31167
+ "requirement": null,
31168
+ "interpolated": true
31169
+ }
31170
+ ]
31171
+ },
31172
+ {
31173
+ "id": "openwop.it.v2-i18n-negotiation.a-malformed-accept-language-does-not-cause-400",
31174
+ "file": "v2-i18n-negotiation.test.ts",
31175
+ "line": 76,
31176
+ "title": "a malformed Accept-Language does not cause 400",
31177
+ "explicitId": "openwop.requirement.i18n.malformed-accept-language-not-400",
31178
+ "citations": [
31179
+ {
31180
+ "section": null,
31181
+ "requirement": null,
31182
+ "interpolated": true
31183
+ }
31184
+ ]
31185
+ },
31186
+ {
31187
+ "id": "openwop.it.v2-i18n-negotiation.the-error-code-and-details-keys-are-identical-under-every-negotiated-locale",
31188
+ "file": "v2-i18n-negotiation.test.ts",
31189
+ "line": 84,
31190
+ "title": "the error code and details keys are identical under every negotiated locale",
31191
+ "explicitId": "openwop.requirement.i18n.error-code-locale-invariant",
31192
+ "citations": [
31193
+ {
31194
+ "section": null,
31195
+ "requirement": null,
31196
+ "interpolated": true
31197
+ }
31198
+ ]
31199
+ },
30748
31200
  {
30749
31201
  "id": "openwop.it.v2-id-grammar.every-id-on-the-run-snapshot-matches-its-ids-schema-json-kind",
30750
31202
  "file": "v2-id-grammar.test.ts",
@@ -31350,6 +31802,215 @@
31350
31802
  }
31351
31803
  ]
31352
31804
  },
31805
+ {
31806
+ "id": "openwop.it.v2-limits-envelope-caps-advertisement.limits-clarificationrounds-is-present-and-a-non-negative-integer",
31807
+ "file": "v2-limits-envelope-caps-advertisement.test.ts",
31808
+ "line": 38,
31809
+ "title": "limits.clarificationRounds is present and a non-negative integer",
31810
+ "explicitId": "openwop.requirement.limits.clarification-rounds-advertised",
31811
+ "citations": [
31812
+ {
31813
+ "section": null,
31814
+ "requirement": null,
31815
+ "interpolated": true
31816
+ }
31817
+ ]
31818
+ },
31819
+ {
31820
+ "id": "openwop.it.v2-limits-envelope-caps-advertisement.limits-schemarounds-is-present-and-a-non-negative-integer",
31821
+ "file": "v2-limits-envelope-caps-advertisement.test.ts",
31822
+ "line": 46,
31823
+ "title": "limits.schemaRounds is present and a non-negative integer",
31824
+ "explicitId": "openwop.requirement.limits.schema-rounds-advertised",
31825
+ "citations": [
31826
+ {
31827
+ "section": null,
31828
+ "requirement": null,
31829
+ "interpolated": true
31830
+ }
31831
+ ]
31832
+ },
31833
+ {
31834
+ "id": "openwop.it.v2-limits-envelope-caps-advertisement.limits-envelopesperturn-is-present-and-a-non-negative-integer",
31835
+ "file": "v2-limits-envelope-caps-advertisement.test.ts",
31836
+ "line": 54,
31837
+ "title": "limits.envelopesPerTurn is present and a non-negative integer",
31838
+ "explicitId": "openwop.requirement.limits.envelopes-per-turn-advertised",
31839
+ "citations": [
31840
+ {
31841
+ "section": null,
31842
+ "requirement": null,
31843
+ "interpolated": true
31844
+ }
31845
+ ]
31846
+ },
31847
+ {
31848
+ "id": "openwop.it.v2-localized-content-delivery.the-v2-content-record-requires-baselocale-and-supportedlocales-and-has-no-suppor",
31849
+ "file": "v2-localized-content-delivery.test.ts",
31850
+ "line": 62,
31851
+ "title": "the v2 content record requires baseLocale and supportedLocales and has no supported seat",
31852
+ "explicitId": "openwop.requirement.content.capability-record-shape",
31853
+ "citations": [
31854
+ {
31855
+ "section": "schemas/v2/capabilities.schema.json §content",
31856
+ "requirement": "content MUST require baseLocale and supportedLocales"
31857
+ },
31858
+ {
31859
+ "section": "spec/v2/core/capabilities.md (presence is the claim)",
31860
+ "requirement": "the v2 content record MUST NOT declare a supported seat"
31861
+ },
31862
+ {
31863
+ "section": "schemas/v2/capabilities.schema.json §content",
31864
+ "requirement": "a conforming content record MUST validate"
31865
+ },
31866
+ {
31867
+ "section": "schemas/v2/capabilities.schema.json §content",
31868
+ "requirement": "a content record carrying supported MUST be rejected (closed record)"
31869
+ }
31870
+ ]
31871
+ },
31872
+ {
31873
+ "id": "openwop.it.v2-localized-content-delivery.a-conforming-section-validates-a-non-canonical-or-underscore-locale-key-a-missin",
31874
+ "file": "v2-localized-content-delivery.test.ts",
31875
+ "line": 73,
31876
+ "title": "a conforming section validates; a non-canonical or underscore locale key, a missing status, or an unknown status is rejected",
31877
+ "explicitId": "openwop.requirement.content.section-schema",
31878
+ "citations": [
31879
+ {
31880
+ "section": "spec/v2/core/i18n.md §Localized content",
31881
+ "requirement": null,
31882
+ "interpolated": true
31883
+ },
31884
+ {
31885
+ "section": "RFC 0206 §A.1",
31886
+ "requirement": null,
31887
+ "interpolated": true
31888
+ },
31889
+ {
31890
+ "section": "RFC 0206 §A.1",
31891
+ "requirement": null,
31892
+ "interpolated": true
31893
+ },
31894
+ {
31895
+ "section": "spec/v2/core/i18n.md §Localized content",
31896
+ "requirement": "status is REQUIRED"
31897
+ },
31898
+ {
31899
+ "section": "spec/v2/core/i18n.md §Localized content",
31900
+ "requirement": "status MUST be draft or published"
31901
+ },
31902
+ {
31903
+ "section": "spec/v2/core/i18n.md §Localized content",
31904
+ "requirement": "a section is a closed record"
31905
+ }
31906
+ ]
31907
+ },
31908
+ {
31909
+ "id": "openwop.it.v2-localized-content-delivery.a-conforming-page-validates-and-a-bad-slug-is-rejected",
31910
+ "file": "v2-localized-content-delivery.test.ts",
31911
+ "line": 87,
31912
+ "title": "a conforming page validates and a bad slug is rejected",
31913
+ "explicitId": "openwop.requirement.content.page-schema",
31914
+ "citations": [
31915
+ {
31916
+ "section": "spec/v2/core/i18n.md §Localized content",
31917
+ "requirement": null,
31918
+ "interpolated": true
31919
+ },
31920
+ {
31921
+ "section": "spec/v2/core/i18n.md §Localized content",
31922
+ "requirement": "slug MUST match ^[a-z][a-z0-9-]*$"
31923
+ }
31924
+ ]
31925
+ },
31926
+ {
31927
+ "id": "openwop.it.v2-localized-content-delivery.a-conforming-language-settings-document-validates",
31928
+ "file": "v2-localized-content-delivery.test.ts",
31929
+ "line": 93,
31930
+ "title": "a conforming language-settings document validates",
31931
+ "explicitId": "openwop.requirement.content.language-settings-schema",
31932
+ "citations": [
31933
+ {
31934
+ "section": "spec/v2/core/i18n.md §Localized content",
31935
+ "requirement": null,
31936
+ "interpolated": true
31937
+ },
31938
+ {
31939
+ "section": "spec/v2/core/i18n.md §Localized content",
31940
+ "requirement": "baseLocale MUST be a canonical BCP 47 key"
31941
+ }
31942
+ ]
31943
+ },
31944
+ {
31945
+ "id": "openwop.it.v2-localized-content-delivery.a-conforming-page-response-validates",
31946
+ "file": "v2-localized-content-delivery.test.ts",
31947
+ "line": 99,
31948
+ "title": "a conforming page response validates",
31949
+ "explicitId": "openwop.requirement.content.page-response-schema",
31950
+ "citations": [
31951
+ {
31952
+ "section": "spec/v2/core/i18n.md §Localized content",
31953
+ "requirement": null,
31954
+ "interpolated": true
31955
+ },
31956
+ {
31957
+ "section": "spec/v2/core/i18n.md §Localized content",
31958
+ "requirement": "a delivered section carries resolved data, never its localizations"
31959
+ }
31960
+ ]
31961
+ },
31962
+ {
31963
+ "id": "openwop.it.v2-localized-content-delivery.exact-tag-then-script-family-then-language-then-data-a-shallow-overlay",
31964
+ "file": "v2-localized-content-delivery.test.ts",
31965
+ "line": 111,
31966
+ "title": "exact tag, then script family, then language, then data — a shallow overlay",
31967
+ "explicitId": "openwop.requirement.content.section-merge",
31968
+ "citations": [
31969
+ {
31970
+ "section": "spec/v2/core/i18n.md §Localized content",
31971
+ "requirement": "an exact hit MUST overlay its fields onto data"
31972
+ },
31973
+ {
31974
+ "section": "spec/v2/core/i18n.md §Localized content",
31975
+ "requirement": "a field the overlay lacks MUST fall through to data"
31976
+ },
31977
+ {
31978
+ "section": "spec/v2/core/i18n.md §Localized content",
31979
+ "requirement": "pt-BR MUST fall back to the pt language overlay"
31980
+ },
31981
+ {
31982
+ "section": "spec/v2/core/i18n.md §Localized content",
31983
+ "requirement": "zh-Hant-TW MUST take the zh-Hant script family before zh"
31984
+ },
31985
+ {
31986
+ "section": "spec/v2/core/i18n.md §Localized content",
31987
+ "requirement": "no overlay MUST resolve to data alone"
31988
+ },
31989
+ {
31990
+ "section": "spec/v2/core/i18n.md §Localized content",
31991
+ "requirement": "baseLocale MUST resolve to data"
31992
+ }
31993
+ ]
31994
+ },
31995
+ {
31996
+ "id": "openwop.it.v2-localized-content-delivery.the-advertised-content-record-is-coherent-with-the-advertised-i18n-record",
31997
+ "file": "v2-localized-content-delivery.test.ts",
31998
+ "line": 123,
31999
+ "title": "the advertised content record is coherent with the advertised i18n record",
32000
+ "explicitId": "openwop.requirement.content.advertisement-coherent",
32001
+ "citations": [
32002
+ {
32003
+ "section": "schemas/v2/capabilities.schema.json §content",
32004
+ "requirement": null,
32005
+ "interpolated": true
32006
+ },
32007
+ {
32008
+ "section": null,
32009
+ "requirement": null,
32010
+ "interpolated": true
32011
+ }
32012
+ ]
32013
+ },
31353
32014
  {
31354
32015
  "id": "openwop.requirement.0172.malformed-body-envelope",
31355
32016
  "file": "v2-malformed-body-envelope.test.ts",
@@ -32344,6 +33005,74 @@
32344
33005
  }
32345
33006
  ]
32346
33007
  },
33008
+ {
33009
+ "id": "openwop.requirement.media.payload-schemas-compile",
33010
+ "file": "v2-media-inline-cap-static.test.ts",
33011
+ "line": 37,
33012
+ "title": null,
33013
+ "explicitId": "openwop.requirement.media.payload-schemas-compile",
33014
+ "citations": [
33015
+ {
33016
+ "section": "host-services.md §aiProviders",
33017
+ "requirement": null,
33018
+ "interpolated": true
33019
+ }
33020
+ ]
33021
+ },
33022
+ {
33023
+ "id": "openwop.it.v2-media-inline-cap-static.accepts-a-url-reference-image-payload",
33024
+ "file": "v2-media-inline-cap-static.test.ts",
33025
+ "line": 42,
33026
+ "title": "accepts a URL-reference image payload",
33027
+ "explicitId": "openwop.requirement.media.url-reference-accepted",
33028
+ "citations": [
33029
+ {
33030
+ "section": "host-services.md §aiProviders",
33031
+ "requirement": null,
33032
+ "interpolated": true
33033
+ }
33034
+ ]
33035
+ },
33036
+ {
33037
+ "id": "openwop.it.v2-media-inline-cap-static.accepts-an-inline-base64-audio-payload",
33038
+ "file": "v2-media-inline-cap-static.test.ts",
33039
+ "line": 47,
33040
+ "title": "accepts an inline-base64 audio payload",
33041
+ "explicitId": "openwop.requirement.media.inline-base64-accepted",
33042
+ "citations": [
33043
+ {
33044
+ "section": "host-services.md §aiProviders",
33045
+ "requirement": null,
33046
+ "interpolated": true
33047
+ }
33048
+ ]
33049
+ },
33050
+ {
33051
+ "id": "openwop.it.v2-media-inline-cap-static.rejects-a-media-payload-missing-bytes",
33052
+ "file": "v2-media-inline-cap-static.test.ts",
33053
+ "line": 52,
33054
+ "title": "rejects a media payload missing bytes",
33055
+ "explicitId": "openwop.requirement.media.bytes-required",
33056
+ "citations": [
33057
+ {
33058
+ "section": "host-services.md §aiProviders",
33059
+ "requirement": "bytes is required on a media payload — it is what the inline cap is judged against"
33060
+ }
33061
+ ]
33062
+ },
33063
+ {
33064
+ "id": "openwop.it.v2-media-inline-cap-static.rejects-a-media-payload-with-an-unknown-property",
33065
+ "file": "v2-media-inline-cap-static.test.ts",
33066
+ "line": 56,
33067
+ "title": "rejects a media payload with an unknown property",
33068
+ "explicitId": "openwop.requirement.media.payload-closed",
33069
+ "citations": [
33070
+ {
33071
+ "section": "host-services.md §aiProviders",
33072
+ "requirement": "a media payload is closed: an unknown property MUST be rejected"
33073
+ }
33074
+ ]
33075
+ },
32347
33076
  {
32348
33077
  "id": "openwop.it.v2-memory-cross-tenant-isolation.a-second-tenant-listing-the-same-memoryref-sees-none-of-the-first-tenant-s-entri",
32349
33078
  "file": "v2-memory-cross-tenant-isolation.test.ts",
@@ -32428,6 +33157,76 @@
32428
33157
  }
32429
33158
  ]
32430
33159
  },
33160
+ {
33161
+ "id": "openwop.it.v2-model-capabilities-advertisement.the-modelcapabilities-record-validates-against-its-capabilities-schema-seat",
33162
+ "file": "v2-model-capabilities-advertisement.test.ts",
33163
+ "line": 38,
33164
+ "title": "the modelCapabilities record validates against its capabilities-schema seat",
33165
+ "explicitId": "openwop.requirement.model-capabilities.advert-record-schema",
33166
+ "citations": [
33167
+ {
33168
+ "section": null,
33169
+ "requirement": null,
33170
+ "interpolated": true
33171
+ }
33172
+ ]
33173
+ },
33174
+ {
33175
+ "id": "openwop.it.v2-model-capabilities-advertisement.modelcapabilities-advertised-names-only-spec-reserved-or-x-host-prefixed-identif",
33176
+ "file": "v2-model-capabilities-advertisement.test.ts",
33177
+ "line": 46,
33178
+ "title": "modelCapabilities.advertised names only spec-reserved or x-host- prefixed identifiers",
33179
+ "explicitId": "openwop.requirement.model-capabilities.advertised-identifiers",
33180
+ "citations": [
33181
+ {
33182
+ "section": null,
33183
+ "requirement": null,
33184
+ "interpolated": true
33185
+ }
33186
+ ]
33187
+ },
33188
+ {
33189
+ "id": "openwop.it.v2-model-capabilities-advertisement.modelcapabilities-substitutionsupported-is-a-boolean",
33190
+ "file": "v2-model-capabilities-advertisement.test.ts",
33191
+ "line": 54,
33192
+ "title": "modelCapabilities.substitutionSupported is a boolean",
33193
+ "explicitId": "openwop.requirement.model-capabilities.substitution-supported-boolean",
33194
+ "citations": [
33195
+ {
33196
+ "section": null,
33197
+ "requirement": null,
33198
+ "interpolated": true
33199
+ }
33200
+ ]
33201
+ },
33202
+ {
33203
+ "id": "openwop.it.v2-model-capability-insufficient.a-node-requiring-a-capability-no-model-offers-fails-capability-not-provided-afte",
33204
+ "file": "v2-model-capability-insufficient.test.ts",
33205
+ "line": 50,
33206
+ "title": "a node requiring a capability no model offers fails capability_not_provided after model.capability-insufficient",
33207
+ "explicitId": "openwop.requirement.model-capabilities.insufficient-refusal",
33208
+ "citations": [
33209
+ {
33210
+ "section": null,
33211
+ "requirement": null,
33212
+ "interpolated": true
33213
+ }
33214
+ ]
33215
+ },
33216
+ {
33217
+ "id": "openwop.it.v2-model-capability-insufficient.a-refused-dispatch-emits-no-node-completion-provider-usage-or-envelope-reliabili",
33218
+ "file": "v2-model-capability-insufficient.test.ts",
33219
+ "line": 57,
33220
+ "title": "a refused dispatch emits no node completion, provider usage or envelope-reliability event",
33221
+ "explicitId": "openwop.requirement.model-capabilities.insufficient-no-dispatch",
33222
+ "citations": [
33223
+ {
33224
+ "section": null,
33225
+ "requirement": null,
33226
+ "interpolated": true
33227
+ }
33228
+ ]
33229
+ },
32431
33230
  {
32432
33231
  "id": "openwop.it.v2-mrtr-rounds-ceiling.mcp-mrtr-maxrounds-is-an-integer-ceiling-in-1-16",
32433
33232
  "file": "v2-mrtr-rounds-ceiling.test.ts",
@@ -33471,6 +34270,552 @@
33471
34270
  }
33472
34271
  ]
33473
34272
  },
34273
+ {
34274
+ "id": "openwop.it.v2-prompt-all-four-kinds-events.each-kind-and-each-configured-ref-is-resolved-and-composed",
34275
+ "file": "v2-prompt-all-four-kinds-events.test.ts",
34276
+ "line": 58,
34277
+ "title": "each kind and each configured ref is resolved and composed",
34278
+ "explicitId": "openwop.requirement.prompts.all-four-kinds-events",
34279
+ "citations": [
34280
+ {
34281
+ "section": null,
34282
+ "requirement": null,
34283
+ "interpolated": true
34284
+ }
34285
+ ]
34286
+ },
34287
+ {
34288
+ "id": "openwop.it.v2-prompt-all-four-kinds-events.every-prompt-composed-follows-an-agent-prompt-resolved-for-its-node",
34289
+ "file": "v2-prompt-all-four-kinds-events.test.ts",
34290
+ "line": 64,
34291
+ "title": "every prompt.composed follows an agent.prompt-resolved for its node",
34292
+ "explicitId": "openwop.requirement.prompts.resolution-precedes-composition",
34293
+ "citations": [
34294
+ {
34295
+ "section": null,
34296
+ "requirement": null,
34297
+ "interpolated": true
34298
+ }
34299
+ ]
34300
+ },
34301
+ {
34302
+ "id": "openwop.it.v2-prompt-end-to-end-events.the-node-layer-wins-and-prompt-composed-carries-the-hash-with-bodies-only-under",
34303
+ "file": "v2-prompt-end-to-end-events.test.ts",
34304
+ "line": 60,
34305
+ "title": "the node layer wins, and prompt.composed carries the hash with bodies only under full",
34306
+ "explicitId": "openwop.requirement.prompts.end-to-end-resolution-and-composition",
34307
+ "citations": [
34308
+ {
34309
+ "section": null,
34310
+ "requirement": null,
34311
+ "interpolated": true
34312
+ }
34313
+ ]
34314
+ },
34315
+ {
34316
+ "id": "openwop.it.v2-prompt-end-to-end-events.agent-prompt-resolved-precedes-prompt-composed-for-the-node",
34317
+ "file": "v2-prompt-end-to-end-events.test.ts",
34318
+ "line": 66,
34319
+ "title": "agent.prompt-resolved precedes prompt.composed for the node",
34320
+ "explicitId": "openwop.requirement.prompts.resolution-precedes-composition",
34321
+ "citations": [
34322
+ {
34323
+ "section": null,
34324
+ "requirement": null,
34325
+ "interpolated": true
34326
+ }
34327
+ ]
34328
+ },
34329
+ {
34330
+ "id": "openwop.it.v2-prompt-list-and-fetch.get-prompts-answers-items-whose-every-entry-validates",
34331
+ "file": "v2-prompt-list-and-fetch.test.ts",
34332
+ "line": 56,
34333
+ "title": "GET /prompts answers items whose every entry validates",
34334
+ "explicitId": "openwop.requirement.prompts.list-shape",
34335
+ "citations": [
34336
+ {
34337
+ "section": null,
34338
+ "requirement": null,
34339
+ "interpolated": true
34340
+ }
34341
+ ]
34342
+ },
34343
+ {
34344
+ "id": "openwop.it.v2-prompt-list-and-fetch.the-kind-and-source-filters-narrow-the-list",
34345
+ "file": "v2-prompt-list-and-fetch.test.ts",
34346
+ "line": 64,
34347
+ "title": "the kind and source filters narrow the list",
34348
+ "explicitId": "openwop.requirement.prompts.list-filters",
34349
+ "citations": [
34350
+ {
34351
+ "section": null,
34352
+ "requirement": null,
34353
+ "interpolated": true
34354
+ }
34355
+ ]
34356
+ },
34357
+ {
34358
+ "id": "openwop.it.v2-prompt-list-and-fetch.a-listed-template-is-fetched-by-id",
34359
+ "file": "v2-prompt-list-and-fetch.test.ts",
34360
+ "line": 72,
34361
+ "title": "a listed template is fetched by id",
34362
+ "explicitId": "openwop.requirement.prompts.fetch-by-id",
34363
+ "citations": [
34364
+ {
34365
+ "section": null,
34366
+ "requirement": null,
34367
+ "interpolated": true
34368
+ }
34369
+ ]
34370
+ },
34371
+ {
34372
+ "id": "openwop.it.v2-prompt-list-and-fetch.an-etag-when-sent-revalidates-to-304",
34373
+ "file": "v2-prompt-list-and-fetch.test.ts",
34374
+ "line": 80,
34375
+ "title": "an ETag, when sent, revalidates to 304",
34376
+ "explicitId": "openwop.requirement.prompts.etag-revalidation",
34377
+ "citations": [
34378
+ {
34379
+ "section": null,
34380
+ "requirement": null,
34381
+ "interpolated": true
34382
+ }
34383
+ ]
34384
+ },
34385
+ {
34386
+ "id": "openwop.it.v2-prompt-list-and-fetch.an-unknown-templateid-answers-404-with-the-error-envelope",
34387
+ "file": "v2-prompt-list-and-fetch.test.ts",
34388
+ "line": 88,
34389
+ "title": "an unknown templateId answers 404 with the error envelope",
34390
+ "explicitId": "openwop.requirement.prompts.unknown-template-404",
34391
+ "citations": [
34392
+ {
34393
+ "section": null,
34394
+ "requirement": null,
34395
+ "interpolated": true
34396
+ }
34397
+ ]
34398
+ },
34399
+ {
34400
+ "id": "openwop.it.v2-prompt-list-and-fetch.with-endpointssupported-unadvertised-get-prompts-answers-404-not-found",
34401
+ "file": "v2-prompt-list-and-fetch.test.ts",
34402
+ "line": 96,
34403
+ "title": "with endpointsSupported unadvertised, GET /prompts answers 404 not_found",
34404
+ "explicitId": "openwop.requirement.prompts.endpoints-gate-off-404",
34405
+ "citations": [
34406
+ {
34407
+ "section": null,
34408
+ "requirement": null,
34409
+ "interpolated": true
34410
+ }
34411
+ ]
34412
+ },
34413
+ {
34414
+ "id": "openwop.it.v2-prompt-mutable-lifecycle.post-prompts-creates-a-user-template-with-201-and-a-location",
34415
+ "file": "v2-prompt-mutable-lifecycle.test.ts",
34416
+ "line": 69,
34417
+ "title": "POST /prompts creates a user template with 201 and a Location",
34418
+ "explicitId": "openwop.requirement.prompts.create-user-template",
34419
+ "citations": [
34420
+ {
34421
+ "section": null,
34422
+ "requirement": null,
34423
+ "interpolated": true
34424
+ }
34425
+ ]
34426
+ },
34427
+ {
34428
+ "id": "openwop.it.v2-prompt-mutable-lifecycle.the-created-template-reads-back-with-meta-source-user",
34429
+ "file": "v2-prompt-mutable-lifecycle.test.ts",
34430
+ "line": 75,
34431
+ "title": "the created template reads back with meta.source user",
34432
+ "explicitId": "openwop.requirement.prompts.created-template-source-user",
34433
+ "citations": [
34434
+ {
34435
+ "section": null,
34436
+ "requirement": null,
34437
+ "interpolated": true
34438
+ }
34439
+ ]
34440
+ },
34441
+ {
34442
+ "id": "openwop.it.v2-prompt-mutable-lifecycle.a-second-post-of-the-same-templateid-and-version-answers-409",
34443
+ "file": "v2-prompt-mutable-lifecycle.test.ts",
34444
+ "line": 81,
34445
+ "title": "a second POST of the same templateId and version answers 409",
34446
+ "explicitId": "openwop.requirement.prompts.duplicate-version-409",
34447
+ "citations": [
34448
+ {
34449
+ "section": null,
34450
+ "requirement": null,
34451
+ "interpolated": true
34452
+ }
34453
+ ]
34454
+ },
34455
+ {
34456
+ "id": "openwop.it.v2-prompt-mutable-lifecycle.put-with-a-greater-semver-replaces-the-template",
34457
+ "file": "v2-prompt-mutable-lifecycle.test.ts",
34458
+ "line": 87,
34459
+ "title": "PUT with a greater SemVer replaces the template",
34460
+ "explicitId": "openwop.requirement.prompts.update-greater-semver",
34461
+ "citations": [
34462
+ {
34463
+ "section": null,
34464
+ "requirement": null,
34465
+ "interpolated": true
34466
+ }
34467
+ ]
34468
+ },
34469
+ {
34470
+ "id": "openwop.it.v2-prompt-mutable-lifecycle.put-with-a-lower-semver-answers-409",
34471
+ "file": "v2-prompt-mutable-lifecycle.test.ts",
34472
+ "line": 93,
34473
+ "title": "PUT with a lower SemVer answers 409",
34474
+ "explicitId": "openwop.requirement.prompts.update-non-monotonic-409",
34475
+ "citations": [
34476
+ {
34477
+ "section": null,
34478
+ "requirement": null,
34479
+ "interpolated": true
34480
+ }
34481
+ ]
34482
+ },
34483
+ {
34484
+ "id": "openwop.it.v2-prompt-mutable-lifecycle.delete-answers-204-and-the-template-then-reads-404",
34485
+ "file": "v2-prompt-mutable-lifecycle.test.ts",
34486
+ "line": 99,
34487
+ "title": "DELETE answers 204 and the template then reads 404",
34488
+ "explicitId": "openwop.requirement.prompts.delete-user-template",
34489
+ "citations": [
34490
+ {
34491
+ "section": null,
34492
+ "requirement": null,
34493
+ "interpolated": true
34494
+ }
34495
+ ]
34496
+ },
34497
+ {
34498
+ "id": "openwop.it.v2-prompt-mutable-lifecycle.a-host-built-in-template-is-read-only-delete-answers-403",
34499
+ "file": "v2-prompt-mutable-lifecycle.test.ts",
34500
+ "line": 107,
34501
+ "title": "a host built-in template is read-only: DELETE answers 403",
34502
+ "explicitId": "openwop.requirement.prompts.builtin-read-only",
34503
+ "citations": [
34504
+ {
34505
+ "section": null,
34506
+ "requirement": null,
34507
+ "interpolated": true
34508
+ }
34509
+ ]
34510
+ },
34511
+ {
34512
+ "id": "openwop.it.v2-prompt-mutable-lifecycle.an-unauthenticated-write-is-refused-401",
34513
+ "file": "v2-prompt-mutable-lifecycle.test.ts",
34514
+ "line": 115,
34515
+ "title": "an unauthenticated write is refused 401",
34516
+ "explicitId": "openwop.requirement.prompts.writes-authenticated",
34517
+ "citations": [
34518
+ {
34519
+ "section": null,
34520
+ "requirement": null,
34521
+ "interpolated": true
34522
+ }
34523
+ ]
34524
+ },
34525
+ {
34526
+ "id": "openwop.it.v2-prompt-mutable-lifecycle.with-mutablelibrary-unadvertised-post-prompts-answers-404-not-found",
34527
+ "file": "v2-prompt-mutable-lifecycle.test.ts",
34528
+ "line": 123,
34529
+ "title": "with mutableLibrary unadvertised, POST /prompts answers 404 not_found",
34530
+ "explicitId": "openwop.requirement.prompts.mutable-gate-off-404",
34531
+ "citations": [
34532
+ {
34533
+ "section": null,
34534
+ "requirement": null,
34535
+ "interpolated": true
34536
+ }
34537
+ ]
34538
+ },
34539
+ {
34540
+ "id": "openwop.it.v2-prompt-pack-install.get-prompts-source-pack-lists-only-pack-templates-and-none-unless-packssupported",
34541
+ "file": "v2-prompt-pack-install.test.ts",
34542
+ "line": 55,
34543
+ "title": "GET /prompts?source=pack lists only pack templates, and none unless packsSupported",
34544
+ "explicitId": "openwop.requirement.prompts.pack-listing",
34545
+ "citations": [
34546
+ {
34547
+ "section": null,
34548
+ "requirement": null,
34549
+ "interpolated": true
34550
+ }
34551
+ ]
34552
+ },
34553
+ {
34554
+ "id": "openwop.it.v2-prompt-pack-install.every-pack-template-carries-meta-packname-and-meta-packversion",
34555
+ "file": "v2-prompt-pack-install.test.ts",
34556
+ "line": 63,
34557
+ "title": "every pack template carries meta.packName and meta.packVersion",
34558
+ "explicitId": "openwop.requirement.prompts.pack-template-stamps",
34559
+ "citations": [
34560
+ {
34561
+ "section": null,
34562
+ "requirement": null,
34563
+ "interpolated": true
34564
+ }
34565
+ ]
34566
+ },
34567
+ {
34568
+ "id": "openwop.it.v2-prompt-pack-install.the-reference-pack-template-is-fetched-by-id-and-keeps-its-pack-provenance",
34569
+ "file": "v2-prompt-pack-install.test.ts",
34570
+ "line": 71,
34571
+ "title": "the reference pack template is fetched by id and keeps its pack provenance",
34572
+ "explicitId": "openwop.requirement.prompts.reference-pack-fetch",
34573
+ "citations": [
34574
+ {
34575
+ "section": null,
34576
+ "requirement": null,
34577
+ "interpolated": true
34578
+ }
34579
+ ]
34580
+ },
34581
+ {
34582
+ "id": "openwop.it.v2-prompt-render-deterministic.identical-ref-and-variables-render-the-identical-hash-and-variablehashes",
34583
+ "file": "v2-prompt-render-deterministic.test.ts",
34584
+ "line": 56,
34585
+ "title": "identical ref and variables render the identical hash and variableHashes",
34586
+ "explicitId": "openwop.requirement.prompts.render-deterministic",
34587
+ "citations": [
34588
+ {
34589
+ "section": null,
34590
+ "requirement": null,
34591
+ "interpolated": true
34592
+ }
34593
+ ]
34594
+ },
34595
+ {
34596
+ "id": "openwop.it.v2-prompt-render-deterministic.a-changed-binding-changes-the-hash-and-its-variablehash",
34597
+ "file": "v2-prompt-render-deterministic.test.ts",
34598
+ "line": 64,
34599
+ "title": "a changed binding changes the hash and its variableHash",
34600
+ "explicitId": "openwop.requirement.prompts.render-binding-sensitive",
34601
+ "citations": [
34602
+ {
34603
+ "section": null,
34604
+ "requirement": null,
34605
+ "interpolated": true
34606
+ }
34607
+ ]
34608
+ },
34609
+ {
34610
+ "id": "openwop.it.v2-prompt-render-deterministic.hashes-are-sha256-hex-and-the-body-is-present-only-under-observability-full",
34611
+ "file": "v2-prompt-render-deterministic.test.ts",
34612
+ "line": 72,
34613
+ "title": "hashes are sha256 hex and the body is present only under observability full",
34614
+ "explicitId": "openwop.requirement.prompts.render-shape",
34615
+ "citations": [
34616
+ {
34617
+ "section": null,
34618
+ "requirement": null,
34619
+ "interpolated": true
34620
+ }
34621
+ ]
34622
+ },
34623
+ {
34624
+ "id": "openwop.it.v2-prompt-render-deterministic.an-unbound-required-variable-is-refused-400-validation-error",
34625
+ "file": "v2-prompt-render-deterministic.test.ts",
34626
+ "line": 80,
34627
+ "title": "an unbound required variable is refused 400 validation_error",
34628
+ "explicitId": "openwop.requirement.prompts.render-unbound-required-refused",
34629
+ "citations": [
34630
+ {
34631
+ "section": null,
34632
+ "requirement": null,
34633
+ "interpolated": true
34634
+ }
34635
+ ]
34636
+ },
34637
+ {
34638
+ "id": "openwop.it.v2-prompt-resolution-chain-event.every-agent-prompt-resolved-records-the-chain-it-walked-with-one-applied-layer-m",
34639
+ "file": "v2-prompt-resolution-chain-event.test.ts",
34640
+ "line": 37,
34641
+ "title": "every agent.prompt-resolved records the chain it walked, with one applied layer mirrored by resolved",
34642
+ "explicitId": "openwop.requirement.prompts.resolution-chain-record",
34643
+ "citations": [
34644
+ {
34645
+ "section": null,
34646
+ "requirement": null,
34647
+ "interpolated": true
34648
+ }
34649
+ ]
34650
+ },
34651
+ {
34652
+ "id": "openwop.it.v2-prompt-template-shape.prompt-kind-is-a-string-enum-of-exactly-the-four-kinds",
34653
+ "file": "v2-prompt-template-shape.test.ts",
34654
+ "line": 44,
34655
+ "title": "prompt-kind is a string enum of exactly the four kinds",
34656
+ "explicitId": "openwop.requirement.prompts.prompt-kind-enum",
34657
+ "citations": [
34658
+ {
34659
+ "section": "schemas/v2/prompt-kind.schema.json",
34660
+ "requirement": "prompt-kind MUST be type string"
34661
+ },
34662
+ {
34663
+ "section": "schemas/v2/prompt-kind.schema.json",
34664
+ "requirement": "prompt-kind MUST be exactly system, user, few-shot, schema-hint"
34665
+ }
34666
+ ]
34667
+ },
34668
+ {
34669
+ "id": "openwop.it.v2-prompt-template-shape.a-minimal-and-a-full-prompttemplate-validate-a-missing-text-a-non-semver-version",
34670
+ "file": "v2-prompt-template-shape.test.ts",
34671
+ "line": 50,
34672
+ "title": "a minimal and a full PromptTemplate validate; a missing text, a non-SemVer version, a bad templateId or kind, or a dashed variable name is rejected",
34673
+ "explicitId": "openwop.requirement.prompts.prompt-template-shape",
34674
+ "citations": [
34675
+ {
34676
+ "section": "schemas/v2/prompt-template.schema.json",
34677
+ "requirement": null,
34678
+ "interpolated": true
34679
+ },
34680
+ {
34681
+ "section": "schemas/v2/prompt-template.schema.json",
34682
+ "requirement": null,
34683
+ "interpolated": true
34684
+ },
34685
+ {
34686
+ "section": "schemas/v2/prompt-template.schema.json",
34687
+ "requirement": "text is REQUIRED"
34688
+ },
34689
+ {
34690
+ "section": "schemas/v2/prompt-template.schema.json",
34691
+ "requirement": "version MUST be SemVer"
34692
+ },
34693
+ {
34694
+ "section": "schemas/v2/ids.schema.json §templateId",
34695
+ "requirement": "templateId MUST match the templateId grammar (no /)"
34696
+ },
34697
+ {
34698
+ "section": "schemas/v2/prompt-template.schema.json",
34699
+ "requirement": "kind MUST be one of the four"
34700
+ },
34701
+ {
34702
+ "section": "schemas/v2/prompt-template.schema.json",
34703
+ "requirement": "a variable name MUST be a templating identifier (no dashes)"
34704
+ }
34705
+ ]
34706
+ },
34707
+ {
34708
+ "id": "openwop.it.v2-prompt-template-shape.prompttemplate-is-closed-an-unknown-property-is-rejected-an-extension-prefixed-o",
34709
+ "file": "v2-prompt-template-shape.test.ts",
34710
+ "line": 67,
34711
+ "title": "PromptTemplate is closed: an unknown property is rejected, an extension-prefixed one admitted, and a pack meta must carry its stamps",
34712
+ "explicitId": "openwop.requirement.prompts.prompt-template-closed",
34713
+ "citations": [
34714
+ {
34715
+ "section": "schemas/v2/prompt-template.schema.json",
34716
+ "requirement": "an unknown top-level property MUST be rejected"
34717
+ },
34718
+ {
34719
+ "section": null,
34720
+ "requirement": "an x- extension property MUST be admitted",
34721
+ "interpolated": true
34722
+ },
34723
+ {
34724
+ "section": "schemas/v2/prompt-template.schema.json",
34725
+ "requirement": "PromptVariable is closed"
34726
+ },
34727
+ {
34728
+ "section": "host-services.md §Library",
34729
+ "requirement": "a pack template MUST carry meta.packName and meta.packVersion"
34730
+ },
34731
+ {
34732
+ "section": "schemas/v2/prompt-template.schema.json",
34733
+ "requirement": "a stamped pack template MUST validate"
34734
+ }
34735
+ ]
34736
+ },
34737
+ {
34738
+ "id": "openwop.it.v2-prompt-template-shape.the-string-and-object-forms-validate-a-missing-prefix-a-non-semver-version-a-mis",
34739
+ "file": "v2-prompt-template-shape.test.ts",
34740
+ "line": 77,
34741
+ "title": "the string and object forms validate; a missing prefix, a non-SemVer version, a missing templateId or an unknown property is rejected",
34742
+ "explicitId": "openwop.requirement.prompts.prompt-ref-forms",
34743
+ "citations": [
34744
+ {
34745
+ "section": "schemas/v2/prompt-ref.schema.json",
34746
+ "requirement": null,
34747
+ "interpolated": true
34748
+ },
34749
+ {
34750
+ "section": "schemas/v2/prompt-ref.schema.json",
34751
+ "requirement": "the object form with templateId alone MUST validate"
34752
+ },
34753
+ {
34754
+ "section": "schemas/v2/prompt-ref.schema.json",
34755
+ "requirement": "the full object form MUST validate"
34756
+ },
34757
+ {
34758
+ "section": "schemas/v2/prompt-ref.schema.json",
34759
+ "requirement": "a string ref MUST start with prompt:"
34760
+ },
34761
+ {
34762
+ "section": "schemas/v2/prompt-ref.schema.json",
34763
+ "requirement": "a string ref version MUST be SemVer"
34764
+ },
34765
+ {
34766
+ "section": "schemas/v2/prompt-ref.schema.json",
34767
+ "requirement": "the object form MUST carry templateId"
34768
+ },
34769
+ {
34770
+ "section": "schemas/v2/prompt-ref.schema.json",
34771
+ "requirement": "the object form is closed"
34772
+ }
34773
+ ]
34774
+ },
34775
+ {
34776
+ "id": "openwop.it.v2-prompt-template-shape.a-kind-prompt-pack-validates-and-carries-no-nodes-or-chains",
34777
+ "file": "v2-prompt-template-shape.test.ts",
34778
+ "line": 91,
34779
+ "title": "a kind prompt pack validates and carries no nodes or chains",
34780
+ "explicitId": "openwop.requirement.prompts.prompt-pack-manifest-shape",
34781
+ "citations": [
34782
+ {
34783
+ "section": "schemas/v2/prompt-pack-manifest.schema.json",
34784
+ "requirement": null,
34785
+ "interpolated": true
34786
+ },
34787
+ {
34788
+ "section": "host-services.md §Library",
34789
+ "requirement": "a kind prompt pack MUST NOT carry nodes[]"
34790
+ },
34791
+ {
34792
+ "section": "host-services.md §Library",
34793
+ "requirement": "a kind prompt pack MUST NOT carry chains[]"
34794
+ },
34795
+ {
34796
+ "section": "schemas/v2/prompt-pack-manifest.schema.json",
34797
+ "requirement": "kind MUST be prompt"
34798
+ },
34799
+ {
34800
+ "section": "schemas/v2/prompt-pack-manifest.schema.json",
34801
+ "requirement": "a prompt pack MUST ship at least one template"
34802
+ }
34803
+ ]
34804
+ },
34805
+ {
34806
+ "id": "openwop.it.v2-prompt-template-shape.the-prompts-record-when-advertised-validates-against-the-v2-capabilities-schema",
34807
+ "file": "v2-prompt-template-shape.test.ts",
34808
+ "line": 102,
34809
+ "title": "the prompts record, when advertised, validates against the v2 capabilities schema",
34810
+ "explicitId": "openwop.requirement.prompts.capability-record-shape",
34811
+ "citations": [
34812
+ {
34813
+ "section": "schemas/v2/capabilities.schema.json §prompts",
34814
+ "requirement": null,
34815
+ "interpolated": true
34816
+ }
34817
+ ]
34818
+ },
33474
34819
  {
33475
34820
  "id": "openwop.it.v2-protected-resource-metadata.serves-rfc-9728-metadata-unauthenticated-at-the-uri-derived-from-its-resource-id",
33476
34821
  "file": "v2-protected-resource-metadata.test.ts",
@@ -34062,6 +35407,48 @@
34062
35407
  }
34063
35408
  ]
34064
35409
  },
35410
+ {
35411
+ "id": "openwop.it.v2-run-execution-bounds.advertised-limits-maxrundurationms-and-maxloopiterations-are-well-formed",
35412
+ "file": "v2-run-execution-bounds.test.ts",
35413
+ "line": 46,
35414
+ "title": "advertised limits.maxRunDurationMs and maxLoopIterations are well-formed",
35415
+ "explicitId": "openwop.requirement.runs.limits-bounds-shape",
35416
+ "citations": [
35417
+ {
35418
+ "section": null,
35419
+ "requirement": null,
35420
+ "interpolated": true
35421
+ }
35422
+ ]
35423
+ },
35424
+ {
35425
+ "id": "openwop.it.v2-run-execution-bounds.an-out-of-range-runtimeoutms-is-refused-400-validation-error-at-create",
35426
+ "file": "v2-run-execution-bounds.test.ts",
35427
+ "line": 56,
35428
+ "title": "an out-of-range runTimeoutMs is refused 400 validation_error at create",
35429
+ "explicitId": "openwop.requirement.runs.run-timeout-out-of-range-refused",
35430
+ "citations": [
35431
+ {
35432
+ "section": null,
35433
+ "requirement": null,
35434
+ "interpolated": true
35435
+ }
35436
+ ]
35437
+ },
35438
+ {
35439
+ "id": "openwop.it.v2-run-execution-bounds.a-run-exceeding-runtimeoutms-fails-run-timeout-with-cap-breached-kind-run-durati",
35440
+ "file": "v2-run-execution-bounds.test.ts",
35441
+ "line": 62,
35442
+ "title": "a run exceeding runTimeoutMs fails run_timeout with cap.breached { kind: run-duration }",
35443
+ "explicitId": "openwop.requirement.runs.run-timeout-breach",
35444
+ "citations": [
35445
+ {
35446
+ "section": null,
35447
+ "requirement": null,
35448
+ "interpolated": true
35449
+ }
35450
+ ]
35451
+ },
34065
35452
  {
34066
35453
  "id": "openwop.it.v2-run-fork-ancestry.a-branch-fork-is-not-a-composition-child-its-ancestry-parent-is-null",
34067
35454
  "file": "v2-run-fork-ancestry.test.ts",