@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.
- package/.github/workflows/ci.yml +63 -0
- package/LICENSE +21 -0
- package/README.md +37 -0
- package/docs/prov-spec/.github/workflows/ci.yml +68 -0
- package/docs/prov-spec/CHANGELOG.md +69 -0
- package/docs/prov-spec/CODE_OF_CONDUCT.md +129 -0
- package/docs/prov-spec/CONFORMANCE_LEVELS.md +223 -0
- package/docs/prov-spec/CONTRIBUTING.md +145 -0
- package/docs/prov-spec/IMPLEMENTER_CHECKLIST.md +137 -0
- package/docs/prov-spec/LICENSE +21 -0
- package/docs/prov-spec/PRESS_RELEASE.md +74 -0
- package/docs/prov-spec/README.md +182 -0
- package/docs/prov-spec/SETUP.md +135 -0
- package/docs/prov-spec/WHY.md +86 -0
- package/docs/prov-spec/examples/artifact.example.json +14 -0
- package/docs/prov-spec/examples/artifact.ref.example.json +9 -0
- package/docs/prov-spec/examples/evidence.example.json +6 -0
- package/docs/prov-spec/examples/mcp.envelope.example.json +97 -0
- package/docs/prov-spec/examples/mcp.request.example.json +28 -0
- package/docs/prov-spec/examples/prov.record.example.json +35 -0
- package/docs/prov-spec/interop/PROOF_NODE_ENGINE.md +114 -0
- package/docs/prov-spec/spec/MCP_COMPATIBILITY.md +241 -0
- package/docs/prov-spec/spec/PROV_METHODS_CATALOG.md +142 -0
- package/docs/prov-spec/spec/PROV_METHODS_SPEC.md +397 -0
- package/docs/prov-spec/spec/methods.json +213 -0
- package/docs/prov-spec/spec/schemas/artifact.ref.schema.v0.1.json +58 -0
- package/docs/prov-spec/spec/schemas/artifact.schema.v0.1.json +61 -0
- package/docs/prov-spec/spec/schemas/assist.request.schema.v0.1.json +52 -0
- package/docs/prov-spec/spec/schemas/assist.response.schema.v0.1.json +70 -0
- package/docs/prov-spec/spec/schemas/cli.error.schema.v0.1.json +78 -0
- package/docs/prov-spec/spec/schemas/evidence.schema.v0.1.json +37 -0
- package/docs/prov-spec/spec/schemas/mcp.envelope.schema.v0.1.json +141 -0
- package/docs/prov-spec/spec/schemas/mcp.request.schema.v0.1.json +79 -0
- package/docs/prov-spec/spec/schemas/methods.schema.json +93 -0
- package/docs/prov-spec/spec/schemas/prov-capabilities.schema.json +122 -0
- package/docs/prov-spec/spec/schemas/prov.record.schema.v0.1.json +133 -0
- package/docs/prov-spec/spec/vectors/adapter.wrap.envelope_v0_1/expected.json +4 -0
- package/docs/prov-spec/spec/vectors/adapter.wrap.envelope_v0_1/input.json +1 -0
- package/docs/prov-spec/spec/vectors/adapter.wrap.envelope_v0_1/negative/double_wrapped.json +14 -0
- package/docs/prov-spec/spec/vectors/adapter.wrap.envelope_v0_1/negative/wrong_schema_version.json +11 -0
- package/docs/prov-spec/spec/vectors/engine.extract.evidence.json_pointer/expected.json +24 -0
- package/docs/prov-spec/spec/vectors/engine.extract.evidence.json_pointer/input.json +8 -0
- package/docs/prov-spec/spec/vectors/integrity.digest.sha256/expected.json +7 -0
- package/docs/prov-spec/spec/vectors/integrity.digest.sha256/input.json +1 -0
- package/docs/prov-spec/spec/vectors/integrity.digest.sha256/negative/non_hex_chars.json +16 -0
- package/docs/prov-spec/spec/vectors/integrity.digest.sha256/negative/uppercase_hex.json +16 -0
- package/docs/prov-spec/spec/vectors/integrity.digest.sha256/negative/wrong_length.json +16 -0
- package/docs/prov-spec/spec/vectors/method_id_syntax/negative/hyphen_separator.json +8 -0
- package/docs/prov-spec/spec/vectors/method_id_syntax/negative/reserved_namespace.json +8 -0
- package/docs/prov-spec/spec/vectors/method_id_syntax/negative/starts_with_digit.json +8 -0
- package/docs/prov-spec/spec/vectors/method_id_syntax/negative/uppercase.json +8 -0
- package/docs/prov-spec/spec/vectors/method_id_syntax/positive/valid_ids.json +18 -0
- package/docs/prov-spec/tools/python/prov_validator.py +428 -0
- package/examples/a11y-demo-site/.github/workflows/a11y-artifacts.yml +81 -0
- package/examples/a11y-demo-site/.github/workflows/a11y.yml +34 -0
- package/examples/a11y-demo-site/CODE_OF_CONDUCT.md +129 -0
- package/examples/a11y-demo-site/CONTRIBUTING.md +83 -0
- package/examples/a11y-demo-site/LICENSE +21 -0
- package/examples/a11y-demo-site/README.md +155 -0
- package/examples/a11y-demo-site/html/contact.html +15 -0
- package/examples/a11y-demo-site/html/index.html +20 -0
- package/examples/a11y-demo-site/scripts/a11y.sh +20 -0
- package/package.json +26 -0
- package/src/a11y-assist/.github/workflows/publish.yml +52 -0
- package/src/a11y-assist/.github/workflows/test.yml +30 -0
- package/src/a11y-assist/A11Y_ASSIST_TEST_COVERAGE_REQUIREMENTS.md +104 -0
- package/src/a11y-assist/CODE_OF_CONDUCT.md +129 -0
- package/src/a11y-assist/CONTRIBUTING.md +98 -0
- package/src/a11y-assist/ENGINE.md +363 -0
- package/src/a11y-assist/LICENSE +21 -0
- package/src/a11y-assist/PRESS_RELEASE.md +71 -0
- package/src/a11y-assist/QUICKSTART.md +101 -0
- package/src/a11y-assist/README.md +192 -0
- package/src/a11y-assist/RELEASE_NOTES.md +319 -0
- package/src/a11y-assist/a11y_assist/__init__.py +3 -0
- package/src/a11y-assist/a11y_assist/cli.py +599 -0
- package/src/a11y-assist/a11y_assist/from_cli_error.py +149 -0
- package/src/a11y-assist/a11y_assist/guard.py +444 -0
- package/src/a11y-assist/a11y_assist/ingest.py +407 -0
- package/src/a11y-assist/a11y_assist/methods.py +137 -0
- package/src/a11y-assist/a11y_assist/parse_raw.py +71 -0
- package/src/a11y-assist/a11y_assist/profiles/__init__.py +29 -0
- package/src/a11y-assist/a11y_assist/profiles/cognitive_load.py +245 -0
- package/src/a11y-assist/a11y_assist/profiles/cognitive_load_render.py +86 -0
- package/src/a11y-assist/a11y_assist/profiles/dyslexia.py +144 -0
- package/src/a11y-assist/a11y_assist/profiles/dyslexia_render.py +77 -0
- package/src/a11y-assist/a11y_assist/profiles/plain_language.py +119 -0
- package/src/a11y-assist/a11y_assist/profiles/plain_language_render.py +66 -0
- package/src/a11y-assist/a11y_assist/profiles/screen_reader.py +348 -0
- package/src/a11y-assist/a11y_assist/profiles/screen_reader_render.py +89 -0
- package/src/a11y-assist/a11y_assist/render.py +95 -0
- package/src/a11y-assist/a11y_assist/schemas/assist.request.schema.v0.1.json +52 -0
- package/src/a11y-assist/a11y_assist/schemas/assist.response.schema.v0.1.json +70 -0
- package/src/a11y-assist/a11y_assist/schemas/cli.error.schema.v0.1.json +78 -0
- package/src/a11y-assist/a11y_assist/storage.py +31 -0
- package/src/a11y-assist/pyproject.toml +60 -0
- package/src/a11y-assist/tests/__init__.py +1 -0
- package/src/a11y-assist/tests/fixtures/base_inputs/cli_error_high.json +18 -0
- package/src/a11y-assist/tests/fixtures/base_inputs/cli_error_medium.json +16 -0
- package/src/a11y-assist/tests/fixtures/base_inputs/raw_text_low.txt +3 -0
- package/src/a11y-assist/tests/fixtures/cli_error_good.json +9 -0
- package/src/a11y-assist/tests/fixtures/cli_error_missing_id.json +7 -0
- package/src/a11y-assist/tests/fixtures/cli_error_string_format.json +7 -0
- package/src/a11y-assist/tests/fixtures/expected/cognitive_load_high.txt +20 -0
- package/src/a11y-assist/tests/fixtures/expected/dyslexia_high.txt +20 -0
- package/src/a11y-assist/tests/fixtures/expected/lowvision_high.txt +18 -0
- package/src/a11y-assist/tests/fixtures/expected/plain_language_high.txt +14 -0
- package/src/a11y-assist/tests/fixtures/expected/screen_reader_high.txt +19 -0
- package/src/a11y-assist/tests/fixtures/golden_screen_reader_cli_error.txt +16 -0
- package/src/a11y-assist/tests/fixtures/golden_screen_reader_raw_no_id.txt +14 -0
- package/src/a11y-assist/tests/fixtures/golden_screen_reader_raw_with_id.txt +14 -0
- package/src/a11y-assist/tests/fixtures/raw_good.txt +11 -0
- package/src/a11y-assist/tests/fixtures/raw_no_id.txt +2 -0
- package/src/a11y-assist/tests/test_cognitive_load.py +469 -0
- package/src/a11y-assist/tests/test_dyslexia.py +337 -0
- package/src/a11y-assist/tests/test_explain.py +74 -0
- package/src/a11y-assist/tests/test_golden.py +127 -0
- package/src/a11y-assist/tests/test_guard.py +819 -0
- package/src/a11y-assist/tests/test_guard_integration.py +457 -0
- package/src/a11y-assist/tests/test_ingest.py +311 -0
- package/src/a11y-assist/tests/test_methods_metadata.py +236 -0
- package/src/a11y-assist/tests/test_plain_language.py +348 -0
- package/src/a11y-assist/tests/test_render.py +117 -0
- package/src/a11y-assist/tests/test_screen_reader.py +703 -0
- package/src/a11y-assist/tests/test_storage_last.py +61 -0
- package/src/a11y-assist/tests/test_triage.py +86 -0
- package/src/a11y-ci/.github/workflows/ci.yml +43 -0
- package/src/a11y-ci/.github/workflows/test.yml +30 -0
- package/src/a11y-ci/A11Y_CI_TEST_COVERAGE_REQUIREMENTS.md +94 -0
- package/src/a11y-ci/CODE_OF_CONDUCT.md +129 -0
- package/src/a11y-ci/CONTRIBUTING.md +142 -0
- package/src/a11y-ci/LICENSE +21 -0
- package/src/a11y-ci/README.md +105 -0
- package/src/a11y-ci/a11y_ci/__init__.py +3 -0
- package/src/a11y-ci/a11y_ci/allowlist.py +83 -0
- package/src/a11y-ci/a11y_ci/cli.py +145 -0
- package/src/a11y-ci/a11y_ci/gate.py +131 -0
- package/src/a11y-ci/a11y_ci/render.py +48 -0
- package/src/a11y-ci/a11y_ci/schemas/allowlist.schema.json +24 -0
- package/src/a11y-ci/a11y_ci/scorecard.py +99 -0
- package/src/a11y-ci/npm/package.json +35 -0
- package/src/a11y-ci/pyproject.toml +64 -0
- package/src/a11y-ci/tests/__init__.py +1 -0
- package/src/a11y-ci/tests/fixtures/allowlist_expired.json +10 -0
- package/src/a11y-ci/tests/fixtures/allowlist_ok.json +10 -0
- package/src/a11y-ci/tests/fixtures/baseline_ok.json +7 -0
- package/src/a11y-ci/tests/fixtures/current_fail.json +6 -0
- package/src/a11y-ci/tests/fixtures/current_ok.json +6 -0
- package/src/a11y-ci/tests/fixtures/current_regresses.json +7 -0
- package/src/a11y-ci/tests/test_gate.py +134 -0
- package/src/a11y-evidence-engine/.github/workflows/ci.yml +53 -0
- package/src/a11y-evidence-engine/CODE_OF_CONDUCT.md +129 -0
- package/src/a11y-evidence-engine/CONTRIBUTING.md +128 -0
- package/src/a11y-evidence-engine/LICENSE +21 -0
- package/src/a11y-evidence-engine/README.md +71 -0
- package/src/a11y-evidence-engine/bin/a11y-engine.js +11 -0
- package/src/a11y-evidence-engine/fixtures/bad/button-no-name.html +30 -0
- package/src/a11y-evidence-engine/fixtures/bad/img-missing-alt.html +19 -0
- package/src/a11y-evidence-engine/fixtures/bad/input-missing-label.html +26 -0
- package/src/a11y-evidence-engine/fixtures/bad/missing-lang.html +11 -0
- package/src/a11y-evidence-engine/fixtures/good/index.html +29 -0
- package/src/a11y-evidence-engine/package-lock.json +109 -0
- package/src/a11y-evidence-engine/package.json +45 -0
- package/src/a11y-evidence-engine/src/cli.js +74 -0
- package/src/a11y-evidence-engine/src/evidence/canonicalize.js +52 -0
- package/src/a11y-evidence-engine/src/evidence/json_pointer.js +34 -0
- package/src/a11y-evidence-engine/src/evidence/prov_emit.js +153 -0
- package/src/a11y-evidence-engine/src/fswalk.js +56 -0
- package/src/a11y-evidence-engine/src/html_parse.js +117 -0
- package/src/a11y-evidence-engine/src/ids.js +53 -0
- package/src/a11y-evidence-engine/src/rules/document_missing_lang.js +50 -0
- package/src/a11y-evidence-engine/src/rules/form_control_missing_label.js +105 -0
- package/src/a11y-evidence-engine/src/rules/img_missing_alt.js +77 -0
- package/src/a11y-evidence-engine/src/rules/index.js +37 -0
- package/src/a11y-evidence-engine/src/rules/interactive_missing_name.js +129 -0
- package/src/a11y-evidence-engine/src/scan.js +128 -0
- package/src/a11y-evidence-engine/test/scan.test.js +149 -0
- package/src/a11y-evidence-engine/test/vectors.test.js +200 -0
- package/src/a11y-lint/.github/workflows/ci.yml +46 -0
- package/src/a11y-lint/.github/workflows/test.yml +34 -0
- package/src/a11y-lint/CODE_OF_CONDUCT.md +129 -0
- package/src/a11y-lint/CONTRIBUTING.md +70 -0
- package/src/a11y-lint/GOVERNANCE.md +57 -0
- package/src/a11y-lint/LICENSE +21 -0
- package/src/a11y-lint/PRESS_RELEASE.md +50 -0
- package/src/a11y-lint/README.md +276 -0
- package/src/a11y-lint/RELEASE_NOTES.md +57 -0
- package/src/a11y-lint/RELEASING.md +57 -0
- package/src/a11y-lint/a11y_lint/__init__.py +64 -0
- package/src/a11y-lint/a11y_lint/cli.py +319 -0
- package/src/a11y-lint/a11y_lint/errors.py +252 -0
- package/src/a11y-lint/a11y_lint/render.py +293 -0
- package/src/a11y-lint/a11y_lint/report_md.py +289 -0
- package/src/a11y-lint/a11y_lint/scan_cli_text.py +434 -0
- package/src/a11y-lint/a11y_lint/schemas/cli.error.schema.v0.1.json +83 -0
- package/src/a11y-lint/a11y_lint/scorecard.py +244 -0
- package/src/a11y-lint/a11y_lint/validate.py +225 -0
- package/src/a11y-lint/pyproject.toml +75 -0
- package/src/a11y-lint/tests/__init__.py +1 -0
- package/src/a11y-lint/tests/test_cli.py +200 -0
- package/src/a11y-lint/tests/test_errors.py +188 -0
- package/src/a11y-lint/tests/test_render.py +202 -0
- package/src/a11y-lint/tests/test_report_md.py +188 -0
- package/src/a11y-lint/tests/test_scan_cli_text.py +290 -0
- package/src/a11y-lint/tests/test_scorecard.py +195 -0
- package/src/a11y-lint/tests/test_validate.py +257 -0
- package/src/a11y-mcp-tools/.github/workflows/ci.yml +53 -0
- package/src/a11y-mcp-tools/CODE_OF_CONDUCT.md +129 -0
- package/src/a11y-mcp-tools/CONTRIBUTING.md +136 -0
- package/src/a11y-mcp-tools/LICENSE +21 -0
- package/src/a11y-mcp-tools/PROV_METHODS_CATALOG.md +104 -0
- package/src/a11y-mcp-tools/README.md +168 -0
- package/src/a11y-mcp-tools/bin/cli.js +452 -0
- package/src/a11y-mcp-tools/bin/server.js +244 -0
- package/src/a11y-mcp-tools/fixtures/requests/a11y.diagnose.ok.json +27 -0
- package/src/a11y-mcp-tools/fixtures/requests/a11y.evidence.ok.json +25 -0
- package/src/a11y-mcp-tools/fixtures/responses/a11y.diagnose.ok.json +139 -0
- package/src/a11y-mcp-tools/fixtures/responses/a11y.diagnose.provenance_fail.json +13 -0
- package/src/a11y-mcp-tools/fixtures/responses/a11y.evidence.ok.json +88 -0
- package/src/a11y-mcp-tools/package-lock.json +189 -0
- package/src/a11y-mcp-tools/package.json +49 -0
- package/src/a11y-mcp-tools/src/envelope.js +197 -0
- package/src/a11y-mcp-tools/src/index.js +9 -0
- package/src/a11y-mcp-tools/src/schemas/artifact.js +85 -0
- package/src/a11y-mcp-tools/src/schemas/diagnosis.schema.v0.1.json +137 -0
- package/src/a11y-mcp-tools/src/schemas/envelope.schema.v0.1.json +108 -0
- package/src/a11y-mcp-tools/src/schemas/evidence.bundle.schema.v0.1.json +129 -0
- package/src/a11y-mcp-tools/src/schemas/evidence.js +97 -0
- package/src/a11y-mcp-tools/src/schemas/index.js +11 -0
- package/src/a11y-mcp-tools/src/schemas/provenance.js +140 -0
- package/src/a11y-mcp-tools/src/schemas/tools/a11y.diagnose.request.schema.v0.1.json +77 -0
- package/src/a11y-mcp-tools/src/schemas/tools/a11y.diagnose.response.schema.v0.1.json +50 -0
- package/src/a11y-mcp-tools/src/schemas/tools/a11y.evidence.request.schema.v0.1.json +120 -0
- package/src/a11y-mcp-tools/src/schemas/tools/a11y.evidence.response.schema.v0.1.json +50 -0
- package/src/a11y-mcp-tools/src/tools/diagnose.js +597 -0
- package/src/a11y-mcp-tools/src/tools/evidence.js +481 -0
- package/src/a11y-mcp-tools/src/tools/index.js +10 -0
- package/src/a11y-mcp-tools/test/contract.test.mjs +154 -0
- package/src/a11y-mcp-tools/test/diagnose.test.js +485 -0
- package/src/a11y-mcp-tools/test/evidence.test.js +183 -0
- 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
|