@mcptoolshop/accessibility-suite 0.1.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 (241) hide show
  1. package/.github/workflows/ci.yml +63 -0
  2. package/LICENSE +21 -0
  3. package/README.md +37 -0
  4. package/docs/prov-spec/.github/workflows/ci.yml +68 -0
  5. package/docs/prov-spec/CHANGELOG.md +69 -0
  6. package/docs/prov-spec/CODE_OF_CONDUCT.md +129 -0
  7. package/docs/prov-spec/CONFORMANCE_LEVELS.md +223 -0
  8. package/docs/prov-spec/CONTRIBUTING.md +145 -0
  9. package/docs/prov-spec/IMPLEMENTER_CHECKLIST.md +137 -0
  10. package/docs/prov-spec/LICENSE +21 -0
  11. package/docs/prov-spec/PRESS_RELEASE.md +74 -0
  12. package/docs/prov-spec/README.md +182 -0
  13. package/docs/prov-spec/SETUP.md +135 -0
  14. package/docs/prov-spec/WHY.md +86 -0
  15. package/docs/prov-spec/examples/artifact.example.json +14 -0
  16. package/docs/prov-spec/examples/artifact.ref.example.json +9 -0
  17. package/docs/prov-spec/examples/evidence.example.json +6 -0
  18. package/docs/prov-spec/examples/mcp.envelope.example.json +97 -0
  19. package/docs/prov-spec/examples/mcp.request.example.json +28 -0
  20. package/docs/prov-spec/examples/prov.record.example.json +35 -0
  21. package/docs/prov-spec/interop/PROOF_NODE_ENGINE.md +114 -0
  22. package/docs/prov-spec/spec/MCP_COMPATIBILITY.md +241 -0
  23. package/docs/prov-spec/spec/PROV_METHODS_CATALOG.md +142 -0
  24. package/docs/prov-spec/spec/PROV_METHODS_SPEC.md +397 -0
  25. package/docs/prov-spec/spec/methods.json +213 -0
  26. package/docs/prov-spec/spec/schemas/artifact.ref.schema.v0.1.json +58 -0
  27. package/docs/prov-spec/spec/schemas/artifact.schema.v0.1.json +61 -0
  28. package/docs/prov-spec/spec/schemas/assist.request.schema.v0.1.json +52 -0
  29. package/docs/prov-spec/spec/schemas/assist.response.schema.v0.1.json +70 -0
  30. package/docs/prov-spec/spec/schemas/cli.error.schema.v0.1.json +78 -0
  31. package/docs/prov-spec/spec/schemas/evidence.schema.v0.1.json +37 -0
  32. package/docs/prov-spec/spec/schemas/mcp.envelope.schema.v0.1.json +141 -0
  33. package/docs/prov-spec/spec/schemas/mcp.request.schema.v0.1.json +79 -0
  34. package/docs/prov-spec/spec/schemas/methods.schema.json +93 -0
  35. package/docs/prov-spec/spec/schemas/prov-capabilities.schema.json +122 -0
  36. package/docs/prov-spec/spec/schemas/prov.record.schema.v0.1.json +133 -0
  37. package/docs/prov-spec/spec/vectors/adapter.wrap.envelope_v0_1/expected.json +4 -0
  38. package/docs/prov-spec/spec/vectors/adapter.wrap.envelope_v0_1/input.json +1 -0
  39. package/docs/prov-spec/spec/vectors/adapter.wrap.envelope_v0_1/negative/double_wrapped.json +14 -0
  40. package/docs/prov-spec/spec/vectors/adapter.wrap.envelope_v0_1/negative/wrong_schema_version.json +11 -0
  41. package/docs/prov-spec/spec/vectors/engine.extract.evidence.json_pointer/expected.json +24 -0
  42. package/docs/prov-spec/spec/vectors/engine.extract.evidence.json_pointer/input.json +8 -0
  43. package/docs/prov-spec/spec/vectors/integrity.digest.sha256/expected.json +7 -0
  44. package/docs/prov-spec/spec/vectors/integrity.digest.sha256/input.json +1 -0
  45. package/docs/prov-spec/spec/vectors/integrity.digest.sha256/negative/non_hex_chars.json +16 -0
  46. package/docs/prov-spec/spec/vectors/integrity.digest.sha256/negative/uppercase_hex.json +16 -0
  47. package/docs/prov-spec/spec/vectors/integrity.digest.sha256/negative/wrong_length.json +16 -0
  48. package/docs/prov-spec/spec/vectors/method_id_syntax/negative/hyphen_separator.json +8 -0
  49. package/docs/prov-spec/spec/vectors/method_id_syntax/negative/reserved_namespace.json +8 -0
  50. package/docs/prov-spec/spec/vectors/method_id_syntax/negative/starts_with_digit.json +8 -0
  51. package/docs/prov-spec/spec/vectors/method_id_syntax/negative/uppercase.json +8 -0
  52. package/docs/prov-spec/spec/vectors/method_id_syntax/positive/valid_ids.json +18 -0
  53. package/docs/prov-spec/tools/python/prov_validator.py +428 -0
  54. package/examples/a11y-demo-site/.github/workflows/a11y-artifacts.yml +81 -0
  55. package/examples/a11y-demo-site/.github/workflows/a11y.yml +34 -0
  56. package/examples/a11y-demo-site/CODE_OF_CONDUCT.md +129 -0
  57. package/examples/a11y-demo-site/CONTRIBUTING.md +83 -0
  58. package/examples/a11y-demo-site/LICENSE +21 -0
  59. package/examples/a11y-demo-site/README.md +155 -0
  60. package/examples/a11y-demo-site/html/contact.html +15 -0
  61. package/examples/a11y-demo-site/html/index.html +20 -0
  62. package/examples/a11y-demo-site/scripts/a11y.sh +20 -0
  63. package/package.json +26 -0
  64. package/src/a11y-assist/.github/workflows/publish.yml +52 -0
  65. package/src/a11y-assist/.github/workflows/test.yml +30 -0
  66. package/src/a11y-assist/A11Y_ASSIST_TEST_COVERAGE_REQUIREMENTS.md +104 -0
  67. package/src/a11y-assist/CODE_OF_CONDUCT.md +129 -0
  68. package/src/a11y-assist/CONTRIBUTING.md +98 -0
  69. package/src/a11y-assist/ENGINE.md +363 -0
  70. package/src/a11y-assist/LICENSE +21 -0
  71. package/src/a11y-assist/PRESS_RELEASE.md +71 -0
  72. package/src/a11y-assist/QUICKSTART.md +101 -0
  73. package/src/a11y-assist/README.md +192 -0
  74. package/src/a11y-assist/RELEASE_NOTES.md +319 -0
  75. package/src/a11y-assist/a11y_assist/__init__.py +3 -0
  76. package/src/a11y-assist/a11y_assist/cli.py +599 -0
  77. package/src/a11y-assist/a11y_assist/from_cli_error.py +149 -0
  78. package/src/a11y-assist/a11y_assist/guard.py +444 -0
  79. package/src/a11y-assist/a11y_assist/ingest.py +407 -0
  80. package/src/a11y-assist/a11y_assist/methods.py +137 -0
  81. package/src/a11y-assist/a11y_assist/parse_raw.py +71 -0
  82. package/src/a11y-assist/a11y_assist/profiles/__init__.py +29 -0
  83. package/src/a11y-assist/a11y_assist/profiles/cognitive_load.py +245 -0
  84. package/src/a11y-assist/a11y_assist/profiles/cognitive_load_render.py +86 -0
  85. package/src/a11y-assist/a11y_assist/profiles/dyslexia.py +144 -0
  86. package/src/a11y-assist/a11y_assist/profiles/dyslexia_render.py +77 -0
  87. package/src/a11y-assist/a11y_assist/profiles/plain_language.py +119 -0
  88. package/src/a11y-assist/a11y_assist/profiles/plain_language_render.py +66 -0
  89. package/src/a11y-assist/a11y_assist/profiles/screen_reader.py +348 -0
  90. package/src/a11y-assist/a11y_assist/profiles/screen_reader_render.py +89 -0
  91. package/src/a11y-assist/a11y_assist/render.py +95 -0
  92. package/src/a11y-assist/a11y_assist/schemas/assist.request.schema.v0.1.json +52 -0
  93. package/src/a11y-assist/a11y_assist/schemas/assist.response.schema.v0.1.json +70 -0
  94. package/src/a11y-assist/a11y_assist/schemas/cli.error.schema.v0.1.json +78 -0
  95. package/src/a11y-assist/a11y_assist/storage.py +31 -0
  96. package/src/a11y-assist/pyproject.toml +60 -0
  97. package/src/a11y-assist/tests/__init__.py +1 -0
  98. package/src/a11y-assist/tests/fixtures/base_inputs/cli_error_high.json +18 -0
  99. package/src/a11y-assist/tests/fixtures/base_inputs/cli_error_medium.json +16 -0
  100. package/src/a11y-assist/tests/fixtures/base_inputs/raw_text_low.txt +3 -0
  101. package/src/a11y-assist/tests/fixtures/cli_error_good.json +9 -0
  102. package/src/a11y-assist/tests/fixtures/cli_error_missing_id.json +7 -0
  103. package/src/a11y-assist/tests/fixtures/cli_error_string_format.json +7 -0
  104. package/src/a11y-assist/tests/fixtures/expected/cognitive_load_high.txt +20 -0
  105. package/src/a11y-assist/tests/fixtures/expected/dyslexia_high.txt +20 -0
  106. package/src/a11y-assist/tests/fixtures/expected/lowvision_high.txt +18 -0
  107. package/src/a11y-assist/tests/fixtures/expected/plain_language_high.txt +14 -0
  108. package/src/a11y-assist/tests/fixtures/expected/screen_reader_high.txt +19 -0
  109. package/src/a11y-assist/tests/fixtures/golden_screen_reader_cli_error.txt +16 -0
  110. package/src/a11y-assist/tests/fixtures/golden_screen_reader_raw_no_id.txt +14 -0
  111. package/src/a11y-assist/tests/fixtures/golden_screen_reader_raw_with_id.txt +14 -0
  112. package/src/a11y-assist/tests/fixtures/raw_good.txt +11 -0
  113. package/src/a11y-assist/tests/fixtures/raw_no_id.txt +2 -0
  114. package/src/a11y-assist/tests/test_cognitive_load.py +469 -0
  115. package/src/a11y-assist/tests/test_dyslexia.py +337 -0
  116. package/src/a11y-assist/tests/test_explain.py +74 -0
  117. package/src/a11y-assist/tests/test_golden.py +127 -0
  118. package/src/a11y-assist/tests/test_guard.py +819 -0
  119. package/src/a11y-assist/tests/test_guard_integration.py +457 -0
  120. package/src/a11y-assist/tests/test_ingest.py +311 -0
  121. package/src/a11y-assist/tests/test_methods_metadata.py +236 -0
  122. package/src/a11y-assist/tests/test_plain_language.py +348 -0
  123. package/src/a11y-assist/tests/test_render.py +117 -0
  124. package/src/a11y-assist/tests/test_screen_reader.py +703 -0
  125. package/src/a11y-assist/tests/test_storage_last.py +61 -0
  126. package/src/a11y-assist/tests/test_triage.py +86 -0
  127. package/src/a11y-ci/.github/workflows/ci.yml +43 -0
  128. package/src/a11y-ci/.github/workflows/test.yml +30 -0
  129. package/src/a11y-ci/A11Y_CI_TEST_COVERAGE_REQUIREMENTS.md +94 -0
  130. package/src/a11y-ci/CODE_OF_CONDUCT.md +129 -0
  131. package/src/a11y-ci/CONTRIBUTING.md +142 -0
  132. package/src/a11y-ci/LICENSE +21 -0
  133. package/src/a11y-ci/README.md +105 -0
  134. package/src/a11y-ci/a11y_ci/__init__.py +3 -0
  135. package/src/a11y-ci/a11y_ci/allowlist.py +83 -0
  136. package/src/a11y-ci/a11y_ci/cli.py +145 -0
  137. package/src/a11y-ci/a11y_ci/gate.py +131 -0
  138. package/src/a11y-ci/a11y_ci/render.py +48 -0
  139. package/src/a11y-ci/a11y_ci/schemas/allowlist.schema.json +24 -0
  140. package/src/a11y-ci/a11y_ci/scorecard.py +99 -0
  141. package/src/a11y-ci/npm/package.json +35 -0
  142. package/src/a11y-ci/pyproject.toml +64 -0
  143. package/src/a11y-ci/tests/__init__.py +1 -0
  144. package/src/a11y-ci/tests/fixtures/allowlist_expired.json +10 -0
  145. package/src/a11y-ci/tests/fixtures/allowlist_ok.json +10 -0
  146. package/src/a11y-ci/tests/fixtures/baseline_ok.json +7 -0
  147. package/src/a11y-ci/tests/fixtures/current_fail.json +6 -0
  148. package/src/a11y-ci/tests/fixtures/current_ok.json +6 -0
  149. package/src/a11y-ci/tests/fixtures/current_regresses.json +7 -0
  150. package/src/a11y-ci/tests/test_gate.py +134 -0
  151. package/src/a11y-evidence-engine/.github/workflows/ci.yml +53 -0
  152. package/src/a11y-evidence-engine/CODE_OF_CONDUCT.md +129 -0
  153. package/src/a11y-evidence-engine/CONTRIBUTING.md +128 -0
  154. package/src/a11y-evidence-engine/LICENSE +21 -0
  155. package/src/a11y-evidence-engine/README.md +71 -0
  156. package/src/a11y-evidence-engine/bin/a11y-engine.js +11 -0
  157. package/src/a11y-evidence-engine/fixtures/bad/button-no-name.html +30 -0
  158. package/src/a11y-evidence-engine/fixtures/bad/img-missing-alt.html +19 -0
  159. package/src/a11y-evidence-engine/fixtures/bad/input-missing-label.html +26 -0
  160. package/src/a11y-evidence-engine/fixtures/bad/missing-lang.html +11 -0
  161. package/src/a11y-evidence-engine/fixtures/good/index.html +29 -0
  162. package/src/a11y-evidence-engine/package-lock.json +109 -0
  163. package/src/a11y-evidence-engine/package.json +45 -0
  164. package/src/a11y-evidence-engine/src/cli.js +74 -0
  165. package/src/a11y-evidence-engine/src/evidence/canonicalize.js +52 -0
  166. package/src/a11y-evidence-engine/src/evidence/json_pointer.js +34 -0
  167. package/src/a11y-evidence-engine/src/evidence/prov_emit.js +153 -0
  168. package/src/a11y-evidence-engine/src/fswalk.js +56 -0
  169. package/src/a11y-evidence-engine/src/html_parse.js +117 -0
  170. package/src/a11y-evidence-engine/src/ids.js +53 -0
  171. package/src/a11y-evidence-engine/src/rules/document_missing_lang.js +50 -0
  172. package/src/a11y-evidence-engine/src/rules/form_control_missing_label.js +105 -0
  173. package/src/a11y-evidence-engine/src/rules/img_missing_alt.js +77 -0
  174. package/src/a11y-evidence-engine/src/rules/index.js +37 -0
  175. package/src/a11y-evidence-engine/src/rules/interactive_missing_name.js +129 -0
  176. package/src/a11y-evidence-engine/src/scan.js +128 -0
  177. package/src/a11y-evidence-engine/test/scan.test.js +149 -0
  178. package/src/a11y-evidence-engine/test/vectors.test.js +200 -0
  179. package/src/a11y-lint/.github/workflows/ci.yml +46 -0
  180. package/src/a11y-lint/.github/workflows/test.yml +34 -0
  181. package/src/a11y-lint/CODE_OF_CONDUCT.md +129 -0
  182. package/src/a11y-lint/CONTRIBUTING.md +70 -0
  183. package/src/a11y-lint/GOVERNANCE.md +57 -0
  184. package/src/a11y-lint/LICENSE +21 -0
  185. package/src/a11y-lint/PRESS_RELEASE.md +50 -0
  186. package/src/a11y-lint/README.md +276 -0
  187. package/src/a11y-lint/RELEASE_NOTES.md +57 -0
  188. package/src/a11y-lint/RELEASING.md +57 -0
  189. package/src/a11y-lint/a11y_lint/__init__.py +64 -0
  190. package/src/a11y-lint/a11y_lint/cli.py +319 -0
  191. package/src/a11y-lint/a11y_lint/errors.py +252 -0
  192. package/src/a11y-lint/a11y_lint/render.py +293 -0
  193. package/src/a11y-lint/a11y_lint/report_md.py +289 -0
  194. package/src/a11y-lint/a11y_lint/scan_cli_text.py +434 -0
  195. package/src/a11y-lint/a11y_lint/schemas/cli.error.schema.v0.1.json +83 -0
  196. package/src/a11y-lint/a11y_lint/scorecard.py +244 -0
  197. package/src/a11y-lint/a11y_lint/validate.py +225 -0
  198. package/src/a11y-lint/pyproject.toml +75 -0
  199. package/src/a11y-lint/tests/__init__.py +1 -0
  200. package/src/a11y-lint/tests/test_cli.py +200 -0
  201. package/src/a11y-lint/tests/test_errors.py +188 -0
  202. package/src/a11y-lint/tests/test_render.py +202 -0
  203. package/src/a11y-lint/tests/test_report_md.py +188 -0
  204. package/src/a11y-lint/tests/test_scan_cli_text.py +290 -0
  205. package/src/a11y-lint/tests/test_scorecard.py +195 -0
  206. package/src/a11y-lint/tests/test_validate.py +257 -0
  207. package/src/a11y-mcp-tools/.github/workflows/ci.yml +53 -0
  208. package/src/a11y-mcp-tools/CODE_OF_CONDUCT.md +129 -0
  209. package/src/a11y-mcp-tools/CONTRIBUTING.md +136 -0
  210. package/src/a11y-mcp-tools/LICENSE +21 -0
  211. package/src/a11y-mcp-tools/PROV_METHODS_CATALOG.md +104 -0
  212. package/src/a11y-mcp-tools/README.md +168 -0
  213. package/src/a11y-mcp-tools/bin/cli.js +452 -0
  214. package/src/a11y-mcp-tools/bin/server.js +244 -0
  215. package/src/a11y-mcp-tools/fixtures/requests/a11y.diagnose.ok.json +27 -0
  216. package/src/a11y-mcp-tools/fixtures/requests/a11y.evidence.ok.json +25 -0
  217. package/src/a11y-mcp-tools/fixtures/responses/a11y.diagnose.ok.json +139 -0
  218. package/src/a11y-mcp-tools/fixtures/responses/a11y.diagnose.provenance_fail.json +13 -0
  219. package/src/a11y-mcp-tools/fixtures/responses/a11y.evidence.ok.json +88 -0
  220. package/src/a11y-mcp-tools/package-lock.json +189 -0
  221. package/src/a11y-mcp-tools/package.json +49 -0
  222. package/src/a11y-mcp-tools/src/envelope.js +197 -0
  223. package/src/a11y-mcp-tools/src/index.js +9 -0
  224. package/src/a11y-mcp-tools/src/schemas/artifact.js +85 -0
  225. package/src/a11y-mcp-tools/src/schemas/diagnosis.schema.v0.1.json +137 -0
  226. package/src/a11y-mcp-tools/src/schemas/envelope.schema.v0.1.json +108 -0
  227. package/src/a11y-mcp-tools/src/schemas/evidence.bundle.schema.v0.1.json +129 -0
  228. package/src/a11y-mcp-tools/src/schemas/evidence.js +97 -0
  229. package/src/a11y-mcp-tools/src/schemas/index.js +11 -0
  230. package/src/a11y-mcp-tools/src/schemas/provenance.js +140 -0
  231. package/src/a11y-mcp-tools/src/schemas/tools/a11y.diagnose.request.schema.v0.1.json +77 -0
  232. package/src/a11y-mcp-tools/src/schemas/tools/a11y.diagnose.response.schema.v0.1.json +50 -0
  233. package/src/a11y-mcp-tools/src/schemas/tools/a11y.evidence.request.schema.v0.1.json +120 -0
  234. package/src/a11y-mcp-tools/src/schemas/tools/a11y.evidence.response.schema.v0.1.json +50 -0
  235. package/src/a11y-mcp-tools/src/tools/diagnose.js +597 -0
  236. package/src/a11y-mcp-tools/src/tools/evidence.js +481 -0
  237. package/src/a11y-mcp-tools/src/tools/index.js +10 -0
  238. package/src/a11y-mcp-tools/test/contract.test.mjs +154 -0
  239. package/src/a11y-mcp-tools/test/diagnose.test.js +485 -0
  240. package/src/a11y-mcp-tools/test/evidence.test.js +183 -0
  241. package/src/a11y-mcp-tools/test/schema.test.js +327 -0
@@ -0,0 +1,142 @@
1
+ # Provenance Methods Catalog (PROV / MCP)
2
+
3
+ **Status:** Normative (v0.1+)
4
+ This document defines the stable method identifiers used in:
5
+ - `prov.record.v0.1.methods[]`
6
+ - optional `evidence.v0.1.method`
7
+
8
+ Method IDs are:
9
+ - **append-only**
10
+ - **stable once published**
11
+ - **not user-facing UI**
12
+
13
+ If you need to change the meaning of an existing method ID, that is a **breaking change**.
14
+
15
+ ---
16
+
17
+ ## 1. Conventions
18
+
19
+ ### 1.1 Namespacing
20
+ Use dotted, lowercase identifiers:
21
+
22
+ - `adapter.*` — envelope wrapping, transport, execution wrappers
23
+ - `engine.*` — evidence extraction, normalization, provenance construction
24
+ - `integrity.*` — hashing, signatures, verification
25
+ - `lineage.*` — parent linking and graph operations
26
+
27
+ ### 1.2 Emission rules
28
+ - Emit only methods actually applied in the run.
29
+ - Prefer coarse-grained IDs to avoid noisy logs.
30
+ - IDs may be omitted if provenance capture is disabled.
31
+
32
+ ### 1.3 Stability rules
33
+ - Add new IDs freely (non-breaking).
34
+ - Never rename IDs.
35
+ - Never change semantics without a major bump.
36
+
37
+ ---
38
+
39
+ ## 2. Adapter methods
40
+
41
+ ### `adapter.wrap.envelope_v0_1`
42
+ **Meaning:** Wrapped a legacy tool payload into `mcp.envelope.v0.1`.
43
+ **When to emit:** Adapter created an envelope around non-envelope output.
44
+
45
+ ### `adapter.pass_through.envelope_v0_1`
46
+ **Meaning:** Tool returned an envelope already; adapter returned it unchanged.
47
+ **When to emit:** Adapter performed pass-through without wrapping.
48
+
49
+ ### `adapter.provenance.attach_record_v0_1`
50
+ **Meaning:** Adapter attached a `prov.record.v0.1` record to the envelope.
51
+ **When to emit:** Envelope contains a provenance record generated by adapter logic.
52
+
53
+ ### `adapter.errors.capture`
54
+ **Meaning:** Adapter captured an execution failure and emitted `errors[]` in the envelope.
55
+ **When to emit:** Tool failed and adapter populated standardized envelope errors.
56
+
57
+ ### `adapter.warnings.capture`
58
+ **Meaning:** Adapter captured non-fatal warnings and emitted `warnings[]` in the envelope.
59
+ **When to emit:** Partial results, degraded mode, etc.
60
+
61
+ ---
62
+
63
+ ## 3. Engine methods (provenance construction)
64
+
65
+ ### `engine.prov.record_v0_1.build`
66
+ **Meaning:** Constructed a `prov.record.v0.1` record.
67
+ **When to emit:** Provenance record created by engine/adapter.
68
+
69
+ ### `engine.prov.artifact.register_input`
70
+ **Meaning:** Registered one or more input artifacts in provenance.
71
+ **When to emit:** Inputs list populated (regardless of digest presence).
72
+
73
+ ### `engine.prov.artifact.register_output`
74
+ **Meaning:** Registered one or more output artifacts in provenance.
75
+ **When to emit:** Outputs list populated.
76
+
77
+ ### `engine.extract.evidence.json_pointer`
78
+ **Meaning:** Evidence anchors were derived using JSON pointer-style fragments (e.g., `#json:/fix/1`).
79
+ **When to emit:** Evidence anchors include `#json:/...`.
80
+
81
+ ### `engine.extract.evidence.text_lines`
82
+ **Meaning:** Evidence anchors were derived using text line ranges (e.g., `#text:line:12-14`).
83
+ **When to emit:** Evidence anchors include `#text:line:...`.
84
+
85
+ ### `engine.coerce.evidence.v0_1`
86
+ **Meaning:** Converted or normalized tool-provided evidence into `evidence.v0.1`.
87
+ **When to emit:** Tool evidence was adapted into the canonical evidence schema.
88
+
89
+ ---
90
+
91
+ ## 4. Integrity methods
92
+
93
+ ### `integrity.digest.sha256`
94
+ **Meaning:** Computed sha256 digest(s) for one or more artifacts.
95
+ **When to emit:** Any artifact digest uses sha256 and was computed during this run.
96
+
97
+ ### `integrity.digest.sha512`
98
+ **Meaning:** Computed sha512 digest(s) for one or more artifacts.
99
+ **When to emit:** Any artifact digest uses sha512 and was computed during this run.
100
+
101
+ ### `integrity.digest.blake3`
102
+ **Meaning:** Computed blake3 digest(s) for one or more artifacts.
103
+ **When to emit:** Any artifact digest uses blake3 and was computed during this run.
104
+
105
+ ### `integrity.record_digest.compute`
106
+ **Meaning:** Computed `integrity.record_digest` for the provenance record.
107
+ **When to emit:** `prov.record.integrity.record_digest` is populated.
108
+
109
+ ### `integrity.signature.create`
110
+ **Meaning:** Created a signature over the provenance record digest.
111
+ **When to emit:** `prov.record.integrity.signature` is populated (signing performed).
112
+
113
+ ### `integrity.signature.verify`
114
+ **Meaning:** Verified a provenance record signature successfully.
115
+ **When to emit:** `provenance.verify` tool confirms signature validity.
116
+
117
+ ---
118
+
119
+ ## 5. Lineage methods
120
+
121
+ ### `lineage.parent.link`
122
+ **Meaning:** Linked this provenance record to one or more parent runs via `parents[]`.
123
+ **When to emit:** `parents[]` populated to indicate dependency.
124
+
125
+ ### `lineage.graph.build`
126
+ **Meaning:** Built a lineage graph from one or more provenance records.
127
+ **When to emit:** A graph/DAG representation was constructed.
128
+
129
+ ---
130
+
131
+ ## 6. Guidance for adding new method IDs
132
+
133
+ Add a new ID when:
134
+ - a new envelope/provenance capability is introduced, or
135
+ - a new evidence anchor format becomes supported, or
136
+ - a new integrity mechanism is added.
137
+
138
+ Do not add IDs for trivial internal refactors.
139
+
140
+ All new IDs must be:
141
+ - documented here
142
+ - covered by at least one test or example
@@ -0,0 +1,397 @@
1
+ # Provenance Methods Specification (prov-spec)
2
+
3
+ ```
4
+ Version: 0.1.0
5
+ Status: Stable
6
+ Published: 2025-01-26
7
+ ```
8
+
9
+ **This specification defines the grammar, semantics, and conformance requirements for provenance method identifiers used in `prov.record.v0.1`.**
10
+
11
+ ---
12
+
13
+ ## 0. Change Control
14
+
15
+ This section defines the rules for evolving this specification.
16
+
17
+ ### Allowed Changes by Version Type
18
+
19
+ | Change Type | Patch (0.1.x) | Minor (0.x.0) | Major (x.0.0) |
20
+ |-------------|---------------|---------------|---------------|
21
+ | Typo fixes, clarifications | YES | YES | YES |
22
+ | New method IDs | NO | YES | YES |
23
+ | New optional fields | NO | YES | YES |
24
+ | Normative requirement changes | NO | YES | YES |
25
+ | Grammar changes | NO | NO | YES |
26
+ | Canonicalization changes | NO | NO | YES |
27
+ | Breaking semantic changes | NO | NO | YES |
28
+
29
+ ### Stability Guarantee
30
+
31
+ > **Method IDs marked `stable` are append-only and will never change semantics.**
32
+ > **Compatibility is guaranteed within a major version.**
33
+
34
+ ### Deprecation Policy
35
+
36
+ - Deprecated methods remain valid forever
37
+ - Deprecated methods MUST have `superseded_by` in the catalog
38
+ - Implementations SHOULD emit warnings for deprecated methods
39
+ - Implementations MUST NOT reject deprecated methods
40
+
41
+ ---
42
+
43
+ ## 1. Scope
44
+
45
+ This specification covers:
46
+ - Method ID syntax and grammar
47
+ - Semantic contracts for each method namespace
48
+ - Versioning and compatibility rules
49
+ - Canonicalization requirements
50
+ - Conformance and compliance
51
+
52
+ It does NOT cover:
53
+ - Transport protocols
54
+ - Authentication/authorization
55
+ - Storage formats beyond JSON
56
+
57
+ ---
58
+
59
+ ## 2. Terminology
60
+
61
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in [RFC 2119](https://www.rfc-editor.org/rfc/rfc2119).
62
+
63
+ | Term | Definition |
64
+ |------|------------|
65
+ | **Method ID** | A stable, namespaced identifier describing a processing step applied during provenance construction |
66
+ | **Record** | A `prov.record.v0.1` JSON object documenting a tool invocation |
67
+ | **Evidence** | An `evidence.v0.1` object linking an output field to its source |
68
+ | **Artifact** | An `artifact.v0.1` object representing an input or output with optional digest |
69
+ | **Digest** | A cryptographic hash of artifact content |
70
+ | **Envelope** | An `mcp.envelope.v0.1` wrapper containing result and optional provenance |
71
+
72
+ ---
73
+
74
+ ## 3. Method ID Grammar
75
+
76
+ ### 3.1 Syntax
77
+
78
+ Method IDs MUST conform to the following ABNF grammar:
79
+
80
+ ```abnf
81
+ method-id = namespace *("." segment) [version-suffix]
82
+ namespace = segment
83
+ segment = ALPHA *(ALPHA / DIGIT / "_")
84
+ version-suffix = "_v" major "_" minor
85
+ major = 1*DIGIT
86
+ minor = 1*DIGIT
87
+ ALPHA = %x61-7A ; lowercase a-z only
88
+ DIGIT = %x30-39 ; 0-9
89
+ ```
90
+
91
+ ### 3.2 Regular Expression
92
+
93
+ For validation, use:
94
+
95
+ ```regex
96
+ ^[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)*(_v[0-9]+_[0-9]+)?$
97
+ ```
98
+
99
+ ### 3.3 Examples
100
+
101
+ Valid:
102
+ - `adapter.wrap.envelope_v0_1`
103
+ - `integrity.digest.sha256`
104
+ - `engine.extract.evidence.json_pointer`
105
+ - `lineage.parent.link`
106
+
107
+ Invalid:
108
+ - `Adapter.Wrap` (uppercase)
109
+ - `adapter-wrap` (hyphen instead of dot)
110
+ - `adapter.wrap.v0.1` (version uses dots)
111
+ - `123.method` (starts with digit)
112
+
113
+ ---
114
+
115
+ ## 4. Namespaces
116
+
117
+ ### 4.1 Defined Namespaces
118
+
119
+ | Namespace | Purpose | Owner |
120
+ |-----------|---------|-------|
121
+ | `adapter.*` | Envelope wrapping, transport, execution | Adapter implementations |
122
+ | `engine.*` | Evidence extraction, normalization, provenance construction | Processing engines |
123
+ | `integrity.*` | Hashing, signatures, verification | Cryptographic operations |
124
+ | `lineage.*` | Parent linking, graph operations | Provenance chain management |
125
+
126
+ ### 4.2 Reserved Namespaces (Future)
127
+
128
+ The following namespaces are RESERVED for future use:
129
+
130
+ | Namespace | Intended Purpose |
131
+ |-----------|------------------|
132
+ | `policy.*` | Access control, retention policies |
133
+ | `attestation.*` | Third-party attestations, compliance claims |
134
+ | `execution.*` | Runtime environment, resource usage |
135
+ | `audit.*` | Audit trail operations |
136
+
137
+ Implementations MUST NOT use reserved namespaces until formally specified.
138
+
139
+ ---
140
+
141
+ ## 5. Semantic Contracts
142
+
143
+ When a provenance record claims a method ID, the record MUST satisfy that method's semantic contract.
144
+
145
+ ### 5.1 Adapter Methods
146
+
147
+ #### `adapter.wrap.envelope_v0_1`
148
+ **Contract:** Record was created by wrapping a non-envelope payload.
149
+ - Record MUST be inside an `mcp.envelope.v0.1`
150
+ - Original payload MUST be preserved in `envelope.result`
151
+
152
+ #### `adapter.pass_through.envelope_v0_1`
153
+ **Contract:** Tool returned an envelope; adapter passed it through unchanged.
154
+ - Envelope MUST NOT be double-wrapped
155
+ - Original provenance (if any) MUST be preserved
156
+
157
+ #### `adapter.provenance.attach_record_v0_1`
158
+ **Contract:** Adapter attached a `prov.record.v0.1` to the envelope.
159
+ - `envelope.provenance` MUST be a valid `prov.record.v0.1`
160
+ - `provenance.tool.adapter` SHOULD identify the adapter
161
+
162
+ #### `adapter.errors.capture`
163
+ **Contract:** Adapter captured execution failure.
164
+ - `envelope.errors` MUST contain at least one error entry
165
+ - Error entry MUST have `code` and `message` fields
166
+
167
+ #### `adapter.warnings.capture`
168
+ **Contract:** Adapter captured non-fatal warnings.
169
+ - `envelope.warnings` MUST contain at least one warning entry
170
+
171
+ ### 5.2 Engine Methods
172
+
173
+ #### `engine.prov.record_v0_1.build`
174
+ **Contract:** Constructed a provenance record.
175
+ - Record MUST have `schema_version: "prov.record.v0.1"`
176
+ - Record MUST have valid `run_id`, `tool`, `inputs`, `outputs`, `methods`, `evidence`, `parents`
177
+
178
+ #### `engine.prov.artifact.register_input`
179
+ **Contract:** Registered input artifact(s).
180
+ - `provenance.inputs` MUST contain at least one artifact
181
+ - Each artifact MUST have `artifact_id` and `media_type`
182
+
183
+ #### `engine.prov.artifact.register_output`
184
+ **Contract:** Registered output artifact(s).
185
+ - `provenance.outputs` MUST contain at least one artifact
186
+ - Each artifact MUST have `artifact_id` and `media_type`
187
+
188
+ #### `engine.extract.evidence.json_pointer`
189
+ **Contract:** Evidence uses JSON pointer fragments.
190
+ - At least one evidence entry MUST have `source` containing `#json:/`
191
+ - Fragment MUST be a valid JSON Pointer (RFC 6901)
192
+
193
+ #### `engine.extract.evidence.text_lines`
194
+ **Contract:** Evidence uses text line ranges.
195
+ - At least one evidence entry MUST have `source` containing `#text:line:`
196
+ - Format: `#text:line:<start>[-<end>]`
197
+
198
+ #### `engine.coerce.evidence.v0_1`
199
+ **Contract:** Normalized evidence to canonical schema.
200
+ - All evidence entries MUST have `schema_version: "evidence.v0.1"`
201
+
202
+ ### 5.3 Integrity Methods
203
+
204
+ #### `integrity.digest.sha256`
205
+ **Contract:** Computed SHA-256 digest(s).
206
+ - At least one artifact MUST have `digest.alg == "sha256"`
207
+ - `digest.value` MUST be lowercase hex, 64 characters
208
+ - Content MUST be canonicalized per Section 6
209
+
210
+ #### `integrity.digest.sha512`
211
+ **Contract:** Computed SHA-512 digest(s).
212
+ - At least one artifact MUST have `digest.alg == "sha512"`
213
+ - `digest.value` MUST be lowercase hex, 128 characters
214
+
215
+ #### `integrity.digest.blake3`
216
+ **Contract:** Computed BLAKE3 digest(s).
217
+ - At least one artifact MUST have `digest.alg == "blake3"`
218
+ - `digest.value` MUST be lowercase hex, 64 characters
219
+
220
+ #### `integrity.record_digest.compute`
221
+ **Contract:** Computed digest of the provenance record itself.
222
+ - `provenance.integrity.record_digest` MUST be present
223
+ - Digest computed over canonical JSON of record (excluding `integrity` field)
224
+
225
+ #### `integrity.signature.create`
226
+ **Contract:** Created cryptographic signature.
227
+ - `provenance.integrity.signature` MUST be present
228
+ - Signature MUST cover `integrity.record_digest`
229
+
230
+ #### `integrity.signature.verify`
231
+ **Contract:** Verified existing signature.
232
+ - Signature verification MUST have succeeded
233
+ - This method is typically claimed by verification tools, not producers
234
+
235
+ ### 5.4 Lineage Methods
236
+
237
+ #### `lineage.parent.link`
238
+ **Contract:** Linked to parent provenance record(s).
239
+ - `provenance.parents` MUST contain at least one `run_id`
240
+ - Parent records SHOULD be retrievable
241
+
242
+ #### `lineage.graph.build`
243
+ **Contract:** Constructed provenance graph.
244
+ - Multiple records were linked into a DAG structure
245
+ - This method is typically claimed by graph-building tools
246
+
247
+ ---
248
+
249
+ ## 6. Canonicalization
250
+
251
+ ### 6.1 JSON Canonicalization
252
+
253
+ For digest computation, JSON content MUST be canonicalized as follows:
254
+
255
+ 1. **Encoding:** UTF-8, no BOM
256
+ 2. **Keys:** Sorted lexicographically (Unicode code point order)
257
+ 3. **Whitespace:** No whitespace between tokens (compact form)
258
+ 4. **Numbers:** No leading zeros, no trailing zeros after decimal, no positive sign
259
+ 5. **Strings:** Minimal escaping (only required escapes)
260
+ 6. **Separators:** `,` between elements, `:` between key-value
261
+
262
+ This is compatible with [JCS (RFC 8785)](https://www.rfc-editor.org/rfc/rfc8785) subset.
263
+
264
+ ### 6.2 Implementation
265
+
266
+ ```python
267
+ import json
268
+
269
+ def canonical_json(obj):
270
+ return json.dumps(obj, sort_keys=True, separators=(',', ':'), ensure_ascii=False)
271
+ ```
272
+
273
+ ### 6.3 Digest Computation
274
+
275
+ To compute a digest:
276
+ 1. Canonicalize the content per Section 6.1
277
+ 2. Encode as UTF-8 bytes
278
+ 3. Apply the hash algorithm
279
+ 4. Encode result as lowercase hexadecimal
280
+
281
+ ---
282
+
283
+ ## 7. Versioning and Compatibility
284
+
285
+ ### 7.1 Method ID Versioning
286
+
287
+ Method IDs MAY include a version suffix (`_vMAJOR_MINOR`).
288
+
289
+ - **Unversioned IDs** (e.g., `integrity.digest.sha256`): Semantics are stable and MUST NOT change.
290
+ - **Versioned IDs** (e.g., `adapter.wrap.envelope_v0_1`): Semantics are frozen for that version.
291
+
292
+ ### 7.2 Allowed Changes
293
+
294
+ | Change Type | Allowed? |
295
+ |-------------|----------|
296
+ | Add new method ID | YES |
297
+ | Add new namespace | YES |
298
+ | Deprecate method ID | YES (with `superseded_by`) |
299
+ | Remove method ID | NO |
300
+ | Rename method ID | NO |
301
+ | Change semantics of existing ID | NO |
302
+
303
+ ### 7.3 Deprecation
304
+
305
+ To deprecate a method ID:
306
+ 1. Mark status as `deprecated` in catalog
307
+ 2. Add `superseded_by` pointing to replacement
308
+ 3. Continue supporting deprecated ID indefinitely
309
+
310
+ ### 7.4 Breaking Changes
311
+
312
+ If semantics MUST change:
313
+ 1. Create a new method ID (with new version suffix if applicable)
314
+ 2. Deprecate the old ID
315
+ 3. Document migration path
316
+
317
+ ---
318
+
319
+ ## 8. Security Considerations
320
+
321
+ ### 8.1 Digest Integrity
322
+
323
+ - Digests SHOULD be computed by the producing system
324
+ - Consumers SHOULD verify digests when artifacts are retrieved
325
+ - Digest algorithm MUST be explicitly stated (no default assumptions)
326
+
327
+ ### 8.2 Signature Trust
328
+
329
+ - Signatures attest to record integrity, not content truthfulness
330
+ - Signature verification requires trusted key distribution (out of scope)
331
+ - Unsigned records are valid but offer no integrity guarantee
332
+
333
+ ### 8.3 Method ID Spoofing
334
+
335
+ - Claiming a method ID without satisfying its contract is a conformance violation
336
+ - Validators SHOULD check semantic contracts, not just syntax
337
+ - Malicious actors could claim methods falsely; consumers MUST NOT trust claims blindly
338
+
339
+ ---
340
+
341
+ ## 9. Conformance
342
+
343
+ ### 9.1 Conformance Levels
344
+
345
+ | Level | Requirements |
346
+ |-------|--------------|
347
+ | **Syntax-Conformant** | Method IDs match grammar (Section 3) |
348
+ | **Semantics-Conformant** | Method claims satisfy contracts (Section 5) |
349
+ | **Fully-Conformant** | Syntax + Semantics + Canonicalization (Section 6) |
350
+
351
+ ### 9.2 Conformance Declaration
352
+
353
+ Implementations MAY declare conformance by shipping a `prov-capabilities.json` manifest:
354
+
355
+ ```json
356
+ {
357
+ "schema": "prov-capabilities@v0.1",
358
+ "engine": {
359
+ "name": "example-engine",
360
+ "version": "1.0.0"
361
+ },
362
+ "implements": [
363
+ "adapter.wrap.envelope_v0_1",
364
+ "integrity.digest.sha256"
365
+ ],
366
+ "conformance_level": "fully-conformant",
367
+ "canonicalization": "jcs-subset"
368
+ }
369
+ ```
370
+
371
+ ### 9.3 Test Vectors
372
+
373
+ Implementations SHOULD validate against published test vectors in `spec/vectors/`.
374
+
375
+ ---
376
+
377
+ ## 10. References
378
+
379
+ - [RFC 2119](https://www.rfc-editor.org/rfc/rfc2119) - Key words for RFCs
380
+ - [RFC 6901](https://www.rfc-editor.org/rfc/rfc6901) - JSON Pointer
381
+ - [RFC 8785](https://www.rfc-editor.org/rfc/rfc8785) - JSON Canonicalization Scheme
382
+ - `PROV_METHODS_CATALOG.md` - Stable method ID registry
383
+ - `MCP_COMPATIBILITY.md` - Envelope compatibility policy
384
+
385
+ ---
386
+
387
+ ## Appendix A: Method Catalog
388
+
389
+ See `PROV_METHODS_CATALOG.md` for the complete registry of stable method IDs.
390
+
391
+ ## Appendix B: Schema Files
392
+
393
+ - `prov.record.schema.v0.1.json` - Provenance record schema
394
+ - `evidence.schema.v0.1.json` - Evidence anchor schema
395
+ - `artifact.schema.v0.1.json` - Artifact metadata schema
396
+ - `mcp.envelope.schema.v0.1.json` - Envelope wrapper schema
397
+ - `prov-capabilities.schema.json` - Capability manifest schema