@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,145 @@
|
|
|
1
|
+
# Contributing to prov-spec
|
|
2
|
+
|
|
3
|
+
Thank you for your interest in contributing to prov-spec! This is a formal specification for provenance method IDs, records, and validation.
|
|
4
|
+
|
|
5
|
+
## How to Contribute
|
|
6
|
+
|
|
7
|
+
### Reporting Issues
|
|
8
|
+
|
|
9
|
+
If you find a bug or have a suggestion:
|
|
10
|
+
|
|
11
|
+
1. Check if the issue already exists in [GitHub Issues](https://github.com/mcp-tool-shop-org/prov-spec/issues)
|
|
12
|
+
2. If not, create a new issue with:
|
|
13
|
+
- A clear, descriptive title
|
|
14
|
+
- Steps to reproduce (for bugs)
|
|
15
|
+
- Expected vs. actual behavior
|
|
16
|
+
- Your environment (Python version, OS)
|
|
17
|
+
|
|
18
|
+
### Contributing to the Specification
|
|
19
|
+
|
|
20
|
+
**Before proposing a new method ID:**
|
|
21
|
+
|
|
22
|
+
1. Open an issue describing:
|
|
23
|
+
- The real-world use case
|
|
24
|
+
- Why existing method IDs don't suffice
|
|
25
|
+
- Expected behavior and semantics
|
|
26
|
+
2. Wait for maintainer feedback
|
|
27
|
+
3. Method IDs require real-world justification — we don't speculatively add IDs
|
|
28
|
+
|
|
29
|
+
**Spec changes:**
|
|
30
|
+
|
|
31
|
+
1. Fork the repository and create a branch from `main`
|
|
32
|
+
2. Make your changes to files in `spec/`
|
|
33
|
+
3. Update `CHANGELOG.md` following [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
|
|
34
|
+
4. Submit a pull request with:
|
|
35
|
+
- Clear description of changes
|
|
36
|
+
- Rationale for the change
|
|
37
|
+
- Backward compatibility analysis
|
|
38
|
+
|
|
39
|
+
### Contributing Reference Tools
|
|
40
|
+
|
|
41
|
+
Reference tools in `tools/` are provided for convenience and are not normative.
|
|
42
|
+
|
|
43
|
+
1. **Python validator** (`tools/python/prov_validator.py`):
|
|
44
|
+
- Follow existing code style
|
|
45
|
+
- Add test cases for new features
|
|
46
|
+
- Ensure all test vectors pass
|
|
47
|
+
- Keep dependencies minimal
|
|
48
|
+
|
|
49
|
+
### Adding Test Vectors
|
|
50
|
+
|
|
51
|
+
Test vectors live in `spec/vectors/[method-id]/`:
|
|
52
|
+
|
|
53
|
+
1. Create a new directory for the method ID
|
|
54
|
+
2. Add `input.json` and `expected.json` files
|
|
55
|
+
3. Follow the format of existing vectors
|
|
56
|
+
4. Ensure deterministic behavior
|
|
57
|
+
5. Update the method's documentation
|
|
58
|
+
|
|
59
|
+
### Development Workflow
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
# Clone the repository
|
|
63
|
+
git clone https://github.com/mcp-tool-shop-org/prov-spec.git
|
|
64
|
+
cd prov-spec
|
|
65
|
+
|
|
66
|
+
# Verify installation
|
|
67
|
+
python tools/python/prov_validator.py --help
|
|
68
|
+
|
|
69
|
+
# List known methods
|
|
70
|
+
python tools/python/prov_validator.py list-methods
|
|
71
|
+
|
|
72
|
+
# Run a specific test vector
|
|
73
|
+
python tools/python/prov_validator.py check-vector integrity.digest.sha256
|
|
74
|
+
|
|
75
|
+
# Validate a provenance record
|
|
76
|
+
python tools/python/prov_validator.py validate-methods record.json --strict
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Specification Style Guide
|
|
80
|
+
|
|
81
|
+
- Use RFC 2119 keywords (MUST, SHOULD, MAY) consistently
|
|
82
|
+
- Include examples for every requirement
|
|
83
|
+
- Keep language precise and unambiguous
|
|
84
|
+
- Reference existing standards where applicable
|
|
85
|
+
- Use ABNF notation for grammar rules
|
|
86
|
+
|
|
87
|
+
### Versioning Policy
|
|
88
|
+
|
|
89
|
+
- **Spec version:** Semantic Versioning 2.0.0
|
|
90
|
+
- **Method catalog:** Append-only within major version
|
|
91
|
+
- **Schemas:** `additionalProperties: false` for forward compatibility
|
|
92
|
+
- **Method IDs marked `stable`:** Append-only, semantics never change
|
|
93
|
+
|
|
94
|
+
### Conformance Levels
|
|
95
|
+
|
|
96
|
+
When adding features, consider the conformance level:
|
|
97
|
+
|
|
98
|
+
| Level | Name | Requirements |
|
|
99
|
+
|-------|------|--------------|
|
|
100
|
+
| **1** | Integrity | `integrity.digest.*` methods |
|
|
101
|
+
| **2** | Engine | Level 1 + `engine.*` methods |
|
|
102
|
+
| **3** | Lineage | Level 2 + `lineage.*` methods |
|
|
103
|
+
|
|
104
|
+
See [CONFORMANCE_LEVELS.md](CONFORMANCE_LEVELS.md) for details.
|
|
105
|
+
|
|
106
|
+
### Reserved Namespaces
|
|
107
|
+
|
|
108
|
+
These namespaces are reserved for future use:
|
|
109
|
+
- `policy.*` - Access control, permissions
|
|
110
|
+
- `attestation.*` - Signed claims, witnesses
|
|
111
|
+
- `execution.*` - Runtime context, environments
|
|
112
|
+
- `audit.*` - Compliance, logging
|
|
113
|
+
|
|
114
|
+
### Code Review Process
|
|
115
|
+
|
|
116
|
+
1. Maintainers review for:
|
|
117
|
+
- Specification clarity
|
|
118
|
+
- Backward compatibility
|
|
119
|
+
- Real-world justification
|
|
120
|
+
- Test coverage
|
|
121
|
+
2. Address feedback promptly
|
|
122
|
+
3. Maintainers merge when approved
|
|
123
|
+
|
|
124
|
+
### Testing Requirements
|
|
125
|
+
|
|
126
|
+
- All test vectors must pass
|
|
127
|
+
- New method IDs require test vectors
|
|
128
|
+
- Schema changes require validation examples
|
|
129
|
+
- Reference tools must validate correctly
|
|
130
|
+
|
|
131
|
+
## Code of Conduct
|
|
132
|
+
|
|
133
|
+
Please note that this project is released with a [Code of Conduct](CODE_OF_CONDUCT.md). By participating, you agree to abide by its terms.
|
|
134
|
+
|
|
135
|
+
## Questions?
|
|
136
|
+
|
|
137
|
+
Open an issue or start a discussion. We're here to help!
|
|
138
|
+
|
|
139
|
+
## References
|
|
140
|
+
|
|
141
|
+
- [PROV_METHODS_SPEC.md](spec/PROV_METHODS_SPEC.md) — Normative specification
|
|
142
|
+
- [CONFORMANCE_LEVELS.md](CONFORMANCE_LEVELS.md) — Conformance tiers
|
|
143
|
+
- [Semantic Versioning](https://semver.org/)
|
|
144
|
+
- [Keep a Changelog](https://keepachangelog.com/)
|
|
145
|
+
- [RFC 2119](https://www.rfc-editor.org/rfc/rfc2119.html) — Key words for RFCs
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# prov-spec — Implementer Checklist (v0.1.0)
|
|
2
|
+
|
|
3
|
+
This checklist is for engineers implementing prov-spec–compliant provenance methods or validators.
|
|
4
|
+
|
|
5
|
+
**If you can check every box below, your implementation is compliant.**
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. Scope Check (before you write code)
|
|
10
|
+
|
|
11
|
+
- [ ] I am implementing **specific method IDs**, not "provenance in general"
|
|
12
|
+
- [ ] I understand that prov-spec standardizes **contracts**, not storage, transport, or policy
|
|
13
|
+
- [ ] I am **not adding behavior** that is not explicitly specified
|
|
14
|
+
|
|
15
|
+
> If you want flexibility, stop here—prov-spec is intentionally strict.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 2. Method Identification
|
|
20
|
+
|
|
21
|
+
- [ ] Every provenance record includes a valid `method_id`
|
|
22
|
+
- [ ] The `method_id` **exactly matches** an entry in `spec/methods.json`
|
|
23
|
+
- [ ] I do not invent or rename method IDs
|
|
24
|
+
- [ ] I treat method IDs as **stable contracts**, not strings of convenience
|
|
25
|
+
|
|
26
|
+
> **Rule:** If the ID is marked `stable`, its semantics must never change.
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## 3. Semantic Compliance (most important)
|
|
31
|
+
|
|
32
|
+
For each implemented method:
|
|
33
|
+
|
|
34
|
+
- [ ] I have read the method's normative requirements in `PROV_METHODS_SPEC.md`
|
|
35
|
+
- [ ] All **MUST** requirements are implemented
|
|
36
|
+
- [ ] All **MUST NOT** constraints are enforced
|
|
37
|
+
- [ ] Optional behavior is clearly optional and documented
|
|
38
|
+
|
|
39
|
+
> **Rule:** Passing tests without meeting semantics is non-compliant.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 4. Canonicalization & Integrity (if applicable)
|
|
44
|
+
|
|
45
|
+
If your method involves hashing, signing, or verification:
|
|
46
|
+
|
|
47
|
+
- [ ] I use the **exact canonicalization algorithm** specified
|
|
48
|
+
- [ ] I hash/sign the **canonical bytes**, not ad-hoc serialization
|
|
49
|
+
- [ ] I reject non-canonical or ambiguous inputs
|
|
50
|
+
- [ ] Digest values match expected length, encoding, and format exactly
|
|
51
|
+
|
|
52
|
+
> **Common failure:** Correct algorithm, wrong bytes.
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 5. Record Shape & Fields
|
|
57
|
+
|
|
58
|
+
- [ ] Output records include all required fields
|
|
59
|
+
- [ ] Field names, types, and nesting match the spec
|
|
60
|
+
- [ ] No required fields are omitted
|
|
61
|
+
- [ ] No forbidden fields are added
|
|
62
|
+
|
|
63
|
+
Validate against the JSON Schemas in `spec/schemas/`.
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 6. Test Vectors (mandatory)
|
|
68
|
+
|
|
69
|
+
For each implemented method:
|
|
70
|
+
|
|
71
|
+
- [ ] All **positive** test vectors pass
|
|
72
|
+
- [ ] All **negative** (must-fail) vectors fail correctly
|
|
73
|
+
- [ ] Failures are **explicit** (errors), not silent acceptance
|
|
74
|
+
|
|
75
|
+
> **Rule:** If a must-fail vector passes, the implementation is wrong.
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## 7. Capability Declaration (recommended)
|
|
80
|
+
|
|
81
|
+
If publishing an engine or tool:
|
|
82
|
+
|
|
83
|
+
- [ ] I provide a `prov-capabilities.json`
|
|
84
|
+
- [ ] Declared methods **exactly match** what is implemented
|
|
85
|
+
- [ ] The manifest validates against `prov-capabilities.schema.json`
|
|
86
|
+
|
|
87
|
+
This enables automated interoperability without code imports.
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## 8. Conformance Level
|
|
92
|
+
|
|
93
|
+
- [ ] I know which conformance level I meet:
|
|
94
|
+
- **Level 1:** Integrity
|
|
95
|
+
- **Level 2:** Engine
|
|
96
|
+
- **Level 3:** Lineage
|
|
97
|
+
- [ ] I do not claim a higher level than implemented
|
|
98
|
+
- [ ] Unsupported levels are not implied
|
|
99
|
+
|
|
100
|
+
> Partial compliance is acceptable—misrepresentation is not.
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## 9. Language & Tooling Neutrality
|
|
105
|
+
|
|
106
|
+
- [ ] My implementation does **not depend** on prov-spec reference tooling
|
|
107
|
+
- [ ] I treat the Python validator as **optional**
|
|
108
|
+
- [ ] I could replace the validator and still be compliant
|
|
109
|
+
|
|
110
|
+
> Authority lives in the spec and vectors, not in code.
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## 10. Versioning Discipline
|
|
115
|
+
|
|
116
|
+
- [ ] I record which spec version I target (e.g. `v0.1.0`)
|
|
117
|
+
- [ ] I do not assume future behavior
|
|
118
|
+
- [ ] I understand that stable method semantics **never change**
|
|
119
|
+
|
|
120
|
+
If the spec updates, re-run vectors before upgrading claims.
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Final Sanity Check
|
|
125
|
+
|
|
126
|
+
Ask yourself:
|
|
127
|
+
|
|
128
|
+
> *"Could someone else independently implement this method and produce the same result?"*
|
|
129
|
+
|
|
130
|
+
- If the answer is **yes**, you're done.
|
|
131
|
+
- If the answer is **maybe**, re-read the spec.
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
**prov-spec exists to make provenance verifiable without trusting the producer.**
|
|
136
|
+
|
|
137
|
+
**This checklist exists to make that practical.**
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 prov-spec contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# prov-spec v0.1.0 Released
|
|
2
|
+
|
|
3
|
+
**A formal, language-neutral specification for verifiable provenance**
|
|
4
|
+
|
|
5
|
+
*January 26, 2026*
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
Today marks the release of **prov-spec v0.1.0**, a formal, versioned specification and conformance suite for provenance method identifiers, records, and validation.
|
|
10
|
+
|
|
11
|
+
prov-spec defines a minimal, stable interoperability surface for provenance systems—focusing on **what can be verified**, not how systems are built. It is designed to be implementation-agnostic, language-neutral, and durable over time.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## What prov-spec provides
|
|
16
|
+
|
|
17
|
+
- Normative specification using RFC 2119 language
|
|
18
|
+
- Stable, append-only method identifiers with frozen semantics
|
|
19
|
+
- Machine-readable catalogs and JSON Schemas
|
|
20
|
+
- Positive and negative test vectors for deterministic validation
|
|
21
|
+
- Conformance levels for incremental adoption
|
|
22
|
+
- Reference validator tooling (optional, non-privileged)
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## What prov-spec does not do
|
|
27
|
+
|
|
28
|
+
prov-spec intentionally does **not** define:
|
|
29
|
+
|
|
30
|
+
- Storage formats
|
|
31
|
+
- Transport protocols
|
|
32
|
+
- User interfaces
|
|
33
|
+
- Policy or governance models
|
|
34
|
+
|
|
35
|
+
This restraint is deliberate. **prov-spec standardizes contracts, not implementations.**
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Proven interoperability
|
|
40
|
+
|
|
41
|
+
To demonstrate language neutrality, a zero-dependency Node.js provenance engine was implemented independently and validated against prov-spec test vectors **without importing any prov-spec code**. The engine passes all applicable vectors, confirming that the specification is executable and portable.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Stability guarantees
|
|
46
|
+
|
|
47
|
+
- Method identifiers marked `stable` are **append-only**
|
|
48
|
+
- Semantics for stable methods will **never change**
|
|
49
|
+
- Compatibility is guaranteed within a major version
|
|
50
|
+
|
|
51
|
+
**prov-spec v0.1.0 is considered stable.**
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Who this is for
|
|
56
|
+
|
|
57
|
+
- Provenance engine authors
|
|
58
|
+
- Tool and platform integrators
|
|
59
|
+
- Infrastructure and security teams
|
|
60
|
+
- Auditors and verification systems
|
|
61
|
+
- Anyone who needs provenance to remain verifiable beyond the lifetime of a single system
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Availability
|
|
66
|
+
|
|
67
|
+
prov-spec v0.1.0 is available now under the MIT license.
|
|
68
|
+
|
|
69
|
+
- Specification: [github.com/mcp-tool-shop-org/prov-spec](https://github.com/mcp-tool-shop-org/prov-spec)
|
|
70
|
+
- Node.js Reference Engine: [github.com/mcp-tool-shop-org/prov-engine-js](https://github.com/mcp-tool-shop-org/prov-engine-js)
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
> **prov-spec exists so provenance can outlive the systems that generate it.**
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
# prov-spec
|
|
2
|
+
|
|
3
|
+
**A formal, versioned specification and conformance suite for provenance method IDs, records, and validation.**
|
|
4
|
+
|
|
5
|
+
[](spec/PROV_METHODS_SPEC.md)
|
|
6
|
+
[](LICENSE)
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## What is this?
|
|
11
|
+
|
|
12
|
+
A normative specification defining:
|
|
13
|
+
- **Method IDs** — stable, namespaced identifiers for provenance operations
|
|
14
|
+
- **Provenance Records** — structured JSON documenting tool invocations
|
|
15
|
+
- **Conformance Levels** — testable compliance tiers
|
|
16
|
+
- **Test Vectors** — canonical inputs/outputs for interoperability
|
|
17
|
+
|
|
18
|
+
## What is this not?
|
|
19
|
+
|
|
20
|
+
- Not a framework
|
|
21
|
+
- Not an SDK
|
|
22
|
+
- Not MCP-specific
|
|
23
|
+
- Not Python-specific
|
|
24
|
+
|
|
25
|
+
## Who is it for?
|
|
26
|
+
|
|
27
|
+
- **Engine authors** — implement provenance in any language
|
|
28
|
+
- **Tool integrators** — wrap existing tools with provenance
|
|
29
|
+
- **Auditors** — verify provenance claims
|
|
30
|
+
- **Infrastructure builders** — build provenance-aware systems
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Stability Guarantee
|
|
35
|
+
|
|
36
|
+
> **Method IDs marked `stable` are append-only and will never change semantics.**
|
|
37
|
+
> **Compatibility is guaranteed within a major version.**
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Quick Start
|
|
42
|
+
|
|
43
|
+
### Verify in 10 seconds
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
# Clone and run a test vector
|
|
47
|
+
git clone https://github.com/prov-spec/prov-spec
|
|
48
|
+
cd prov-spec
|
|
49
|
+
python tools/python/prov_validator.py check-vector integrity.digest.sha256
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Expected output: `INFO: Test vector integrity.digest.sha256 passed`
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
### 1. Understand the spec
|
|
57
|
+
|
|
58
|
+
Read [`spec/PROV_METHODS_SPEC.md`](spec/PROV_METHODS_SPEC.md) — the normative specification.
|
|
59
|
+
|
|
60
|
+
### 2. Check the catalog
|
|
61
|
+
|
|
62
|
+
Browse [`spec/methods.json`](spec/methods.json) — machine-readable method registry.
|
|
63
|
+
|
|
64
|
+
### 3. Declare conformance
|
|
65
|
+
|
|
66
|
+
Ship a `prov-capabilities.json` in your project:
|
|
67
|
+
|
|
68
|
+
```json
|
|
69
|
+
{
|
|
70
|
+
"schema": "prov-capabilities@v0.1",
|
|
71
|
+
"engine": {
|
|
72
|
+
"name": "your-engine",
|
|
73
|
+
"version": "1.0.0"
|
|
74
|
+
},
|
|
75
|
+
"implements": [
|
|
76
|
+
"adapter.wrap.envelope_v0_1",
|
|
77
|
+
"integrity.digest.sha256"
|
|
78
|
+
],
|
|
79
|
+
"conformance_level": "fully-conformant"
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### 4. Validate (optional)
|
|
84
|
+
|
|
85
|
+
Use the reference validator:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
# List known methods
|
|
89
|
+
python -m prov_validator list-methods
|
|
90
|
+
|
|
91
|
+
# Validate a provenance record
|
|
92
|
+
python -m prov_validator validate-methods record.json --strict
|
|
93
|
+
|
|
94
|
+
# Run test vectors
|
|
95
|
+
python -m prov_validator check-vector integrity.digest.sha256
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Repository Structure
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
prov-spec/
|
|
104
|
+
├── spec/ # Normative specification
|
|
105
|
+
│ ├── PROV_METHODS_SPEC.md # Main specification document
|
|
106
|
+
│ ├── methods.json # Machine-readable method catalog
|
|
107
|
+
│ ├── schemas/ # JSON Schemas
|
|
108
|
+
│ │ ├── prov.record.schema.v0.1.json
|
|
109
|
+
│ │ ├── artifact.schema.v0.1.json
|
|
110
|
+
│ │ ├── evidence.schema.v0.1.json
|
|
111
|
+
│ │ ├── mcp.envelope.schema.v0.1.json
|
|
112
|
+
│ │ └── prov-capabilities.schema.json
|
|
113
|
+
│ └── vectors/ # Test vectors
|
|
114
|
+
│ ├── integrity.digest.sha256/
|
|
115
|
+
│ ├── adapter.wrap.envelope_v0_1/
|
|
116
|
+
│ └── ...
|
|
117
|
+
├── tools/ # Reference implementations (optional)
|
|
118
|
+
│ └── python/ # Python reference validator
|
|
119
|
+
├── examples/ # Example files
|
|
120
|
+
├── CONFORMANCE_LEVELS.md # Conformance tiers
|
|
121
|
+
└── CHANGELOG.md # Version history
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
**Note:** Reference tools are provided for convenience and are not required for conformance.
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## Conformance Levels
|
|
129
|
+
|
|
130
|
+
| Level | Name | Requirements |
|
|
131
|
+
|-------|------|--------------|
|
|
132
|
+
| **1** | Integrity | `integrity.digest.*` methods |
|
|
133
|
+
| **2** | Engine | Level 1 + `engine.*` methods |
|
|
134
|
+
| **3** | Lineage | Level 2 + `lineage.*` methods |
|
|
135
|
+
|
|
136
|
+
See [`CONFORMANCE_LEVELS.md`](CONFORMANCE_LEVELS.md) for details.
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## Method Namespaces
|
|
141
|
+
|
|
142
|
+
| Namespace | Purpose |
|
|
143
|
+
|-----------|---------|
|
|
144
|
+
| `adapter.*` | Envelope wrapping, transport |
|
|
145
|
+
| `engine.*` | Evidence extraction, provenance construction |
|
|
146
|
+
| `integrity.*` | Hashing, signatures, verification |
|
|
147
|
+
| `lineage.*` | Parent linking, graph operations |
|
|
148
|
+
|
|
149
|
+
Reserved for future use: `policy.*`, `attestation.*`, `execution.*`, `audit.*`
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## Versioning
|
|
154
|
+
|
|
155
|
+
- **Spec version:** `v0.1.0`
|
|
156
|
+
- **Method catalog:** append-only within major version
|
|
157
|
+
- **Schemas:** `additionalProperties: false` — forward-compatible within patch
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## Contributing
|
|
162
|
+
|
|
163
|
+
1. New method IDs: open an issue with use case
|
|
164
|
+
2. Spec clarifications: submit PR to `spec/`
|
|
165
|
+
3. Reference tools: submit PR to `tools/`
|
|
166
|
+
|
|
167
|
+
Method IDs require real-world justification. We don't speculatively add IDs.
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## License
|
|
172
|
+
|
|
173
|
+
MIT — see [LICENSE](LICENSE)
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## References
|
|
178
|
+
|
|
179
|
+
- [PROV_METHODS_SPEC.md](spec/PROV_METHODS_SPEC.md) — Normative specification
|
|
180
|
+
- [PROV_METHODS_CATALOG.md](spec/PROV_METHODS_CATALOG.md) — Human-readable catalog
|
|
181
|
+
- [CONFORMANCE_LEVELS.md](CONFORMANCE_LEVELS.md) — Conformance tiers
|
|
182
|
+
- [MCP_COMPATIBILITY.md](spec/MCP_COMPATIBILITY.md) — MCP envelope compatibility
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# Getting Started with prov-spec
|
|
2
|
+
|
|
3
|
+
This guide is for engineers who want to validate, implement, or integrate with prov-spec.
|
|
4
|
+
|
|
5
|
+
**You do not need to use any specific language or framework to comply.**
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Repository Structure
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
prov-spec/
|
|
13
|
+
├── spec/ # Normative specification, schemas, vectors
|
|
14
|
+
├── tools/python/ # Reference validator (optional)
|
|
15
|
+
├── interop/ # Interoperability proofs
|
|
16
|
+
├── WHY.md # Design intent and non-goals
|
|
17
|
+
└── CONFORMANCE_LEVELS.md
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**Only the `spec/` directory is normative.**
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Option A: Validate provenance records (recommended first step)
|
|
25
|
+
|
|
26
|
+
### Requirements
|
|
27
|
+
|
|
28
|
+
- Python 3.10+
|
|
29
|
+
|
|
30
|
+
### Run the reference validator
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
cd prov-spec
|
|
34
|
+
python tools/python/prov_validator.py --help
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Validate a provenance record
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
python tools/python/prov_validator.py \
|
|
41
|
+
validate-methods path/to/record.json --strict
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
This checks:
|
|
45
|
+
- Method IDs
|
|
46
|
+
- Required fields
|
|
47
|
+
- Semantic constraints
|
|
48
|
+
- Catalog compliance
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Option B: Validate against official test vectors
|
|
53
|
+
|
|
54
|
+
### Run a built-in vector check
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
python tools/python/prov_validator.py \
|
|
58
|
+
check-vector integrity.digest.sha256
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Vectors include **must-pass** and **must-fail** cases.
|
|
62
|
+
|
|
63
|
+
**Passing vectors is sufficient to demonstrate method compliance.**
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Option C: Declare engine capabilities (no imports required)
|
|
68
|
+
|
|
69
|
+
Third-party engines declare support using a capability manifest:
|
|
70
|
+
|
|
71
|
+
```json
|
|
72
|
+
{
|
|
73
|
+
"schema": "mcp-tool-shop/prov-capabilities@v0.1",
|
|
74
|
+
"engine": {
|
|
75
|
+
"name": "example-engine",
|
|
76
|
+
"version": "1.0.0"
|
|
77
|
+
},
|
|
78
|
+
"implements": [
|
|
79
|
+
"integrity.digest.sha256",
|
|
80
|
+
"adapter.wrap.envelope_v0_1"
|
|
81
|
+
]
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Validate the manifest
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
python tools/python/prov_validator.py \
|
|
89
|
+
validate-manifest prov-capabilities.json
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Option D: Implement prov-spec in any language
|
|
95
|
+
|
|
96
|
+
To implement a method:
|
|
97
|
+
|
|
98
|
+
1. Read its normative requirements in `spec/PROV_METHODS_SPEC.md`
|
|
99
|
+
2. Implement the method exactly as specified
|
|
100
|
+
3. Run the corresponding test vectors
|
|
101
|
+
4. (Optional) Publish a `prov-capabilities.json`
|
|
102
|
+
|
|
103
|
+
**No SDK, framework, or library is required.**
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## Reference tooling policy
|
|
108
|
+
|
|
109
|
+
The Python validator is provided for **convenience only**.
|
|
110
|
+
|
|
111
|
+
- It is **not required** for conformance
|
|
112
|
+
- Alternative validators and engines are encouraged
|
|
113
|
+
- All authority lives in the specification and vectors
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Versioning and upgrades
|
|
118
|
+
|
|
119
|
+
- v0.1.0 is **stable**
|
|
120
|
+
- Method IDs are **append-only**
|
|
121
|
+
- New behavior will only appear in new versions
|
|
122
|
+
- Existing records remain valid forever
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Where to start (TL;DR)
|
|
127
|
+
|
|
128
|
+
If you are new:
|
|
129
|
+
|
|
130
|
+
1. Run one vector check
|
|
131
|
+
2. Read `WHY.md`
|
|
132
|
+
3. Implement one method
|
|
133
|
+
4. Stop there
|
|
134
|
+
|
|
135
|
+
**prov-spec is intentionally small.**
|