agentversion 0.2.2__tar.gz → 0.2.3__tar.gz

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 (127) hide show
  1. agentversion-0.2.3/.gitignore +52 -0
  2. {agentversion-0.2.2 → agentversion-0.2.3}/CHANGELOG.md +28 -11
  3. {agentversion-0.2.2 → agentversion-0.2.3}/CONFORMANCE.md +3 -9
  4. {agentversion-0.2.2 → agentversion-0.2.3}/PKG-INFO +38 -23
  5. {agentversion-0.2.2 → agentversion-0.2.3}/README.md +36 -21
  6. {agentversion-0.2.2 → agentversion-0.2.3}/agentversion/compatibility.py +7 -1
  7. {agentversion-0.2.2 → agentversion-0.2.3}/agentversion/contract.py +4 -4
  8. {agentversion-0.2.2 → agentversion-0.2.3}/agentversion/diff.py +5 -7
  9. {agentversion-0.2.2 → agentversion-0.2.3}/agentversion/manifest.py +2 -2
  10. {agentversion-0.2.2 → agentversion-0.2.3}/compatibility-tests/environment-region-change/after.json +2 -2
  11. {agentversion-0.2.2/compatibility-tests/skill-registry-skill-removed → agentversion-0.2.3/compatibility-tests/environment-region-change}/before.json +2 -2
  12. {agentversion-0.2.2 → agentversion-0.2.3}/compatibility-tests/environment-region-change/expected-diff.json +2 -2
  13. {agentversion-0.2.2 → agentversion-0.2.3}/compatibility-tests/model-runtime-provider-change/after.json +2 -2
  14. {agentversion-0.2.2/compatibility-tests/environment-region-change → agentversion-0.2.3/compatibility-tests/model-runtime-provider-change}/before.json +2 -2
  15. {agentversion-0.2.2 → agentversion-0.2.3}/compatibility-tests/model-runtime-provider-change/expected-diff.json +2 -2
  16. {agentversion-0.2.2 → agentversion-0.2.3}/compatibility-tests/output-schema-change/after.json +1 -1
  17. {agentversion-0.2.2 → agentversion-0.2.3}/compatibility-tests/output-schema-change/before.json +1 -1
  18. {agentversion-0.2.2 → agentversion-0.2.3}/compatibility-tests/output-schema-change/expected-diff.json +2 -2
  19. {agentversion-0.2.2 → agentversion-0.2.3}/compatibility-tests/prompt-stack-edit/after.json +2 -2
  20. {agentversion-0.2.2 → agentversion-0.2.3}/compatibility-tests/prompt-stack-edit/before.json +2 -2
  21. {agentversion-0.2.2 → agentversion-0.2.3}/compatibility-tests/prompt-stack-edit/expected-diff.json +2 -2
  22. {agentversion-0.2.2 → agentversion-0.2.3}/compatibility-tests/skill-registry-skill-removed/after.json +2 -2
  23. {agentversion-0.2.2/compatibility-tests/model-runtime-provider-change → agentversion-0.2.3/compatibility-tests/skill-registry-skill-removed}/before.json +2 -2
  24. {agentversion-0.2.2 → agentversion-0.2.3}/compatibility-tests/skill-registry-skill-removed/expected-diff.json +2 -2
  25. {agentversion-0.2.2 → agentversion-0.2.3}/compatibility-tests/subagent-handoff-change/after.json +1 -1
  26. {agentversion-0.2.2 → agentversion-0.2.3}/compatibility-tests/subagent-handoff-change/before.json +1 -1
  27. {agentversion-0.2.2 → agentversion-0.2.3}/compatibility-tests/subagent-handoff-change/expected-diff.json +2 -2
  28. {agentversion-0.2.2 → agentversion-0.2.3}/compatibility-tests/tool-rename/after.json +1 -1
  29. {agentversion-0.2.2 → agentversion-0.2.3}/compatibility-tests/tool-rename/before.json +1 -1
  30. {agentversion-0.2.2 → agentversion-0.2.3}/compatibility-tests/tool-rename/expected-diff.json +2 -2
  31. {agentversion-0.2.2 → agentversion-0.2.3}/compatibility-tests/workflow-graph-change/after.json +2 -2
  32. agentversion-0.2.3/compatibility-tests/workflow-graph-change/before.json +73 -0
  33. {agentversion-0.2.2 → agentversion-0.2.3}/compatibility-tests/workflow-graph-change/expected-diff.json +2 -2
  34. {agentversion-0.2.2 → agentversion-0.2.3}/examples/integrations/decimalai_bridge.py +2 -2
  35. {agentversion-0.2.2 → agentversion-0.2.3}/pyproject.toml +31 -4
  36. {agentversion-0.2.2 → agentversion-0.2.3}/spec/attestation.md +1 -1
  37. {agentversion-0.2.2 → agentversion-0.2.3}/spec/compatibility-batch.md +2 -2
  38. {agentversion-0.2.2 → agentversion-0.2.3}/spec/compatibility-decision.md +2 -2
  39. {agentversion-0.2.2 → agentversion-0.2.3}/spec/compatibility-policy.md +9 -5
  40. {agentversion-0.2.2 → agentversion-0.2.3}/spec/data-classification.md +3 -2
  41. {agentversion-0.2.2 → agentversion-0.2.3}/spec/environment.md +1 -1
  42. {agentversion-0.2.2 → agentversion-0.2.3}/spec/ids.md +1 -1
  43. {agentversion-0.2.2 → agentversion-0.2.3}/spec/reference.md +28 -2
  44. {agentversion-0.2.2 → agentversion-0.2.3}/spec/refs.md +1 -1
  45. {agentversion-0.2.2 → agentversion-0.2.3}/spec/replay-determinism.md +1 -1
  46. {agentversion-0.2.2 → agentversion-0.2.3}/spec/versioning-policy.md +2 -2
  47. {agentversion-0.2.2 → agentversion-0.2.3}/tests/fixtures/frozen_hash_vectors.json +3 -3
  48. {agentversion-0.2.2 → agentversion-0.2.3}/tests/test_audit_v020.py +2 -2
  49. {agentversion-0.2.2 → agentversion-0.2.3}/tests/test_behavioral_policy.py +1 -1
  50. {agentversion-0.2.2 → agentversion-0.2.3}/tests/test_cli.py +26 -8
  51. {agentversion-0.2.2 → agentversion-0.2.3}/tests/test_component_surface_map.py +1 -1
  52. agentversion-0.2.3/tests/test_conformance.py +137 -0
  53. {agentversion-0.2.2 → agentversion-0.2.3}/tests/test_contract.py +4 -4
  54. {agentversion-0.2.2 → agentversion-0.2.3}/tests/test_extension_hatch.py +1 -1
  55. {agentversion-0.2.2 → agentversion-0.2.3}/tests/test_frozen_hash_vectors.py +5 -5
  56. {agentversion-0.2.2 → agentversion-0.2.3}/tests/test_trust_observability.py +2 -2
  57. {agentversion-0.2.2 → agentversion-0.2.3}/tests/test_validator.py +1 -1
  58. agentversion-0.2.2/.github/dependabot.yml +0 -19
  59. agentversion-0.2.2/.github/workflows/ci.yml +0 -64
  60. agentversion-0.2.2/.github/workflows/publish.yml +0 -75
  61. agentversion-0.2.2/.gitignore +0 -32
  62. agentversion-0.2.2/CONTRIBUTING.md +0 -66
  63. agentversion-0.2.2/RELEASING.md +0 -63
  64. agentversion-0.2.2/adrs/0000-template.md +0 -43
  65. agentversion-0.2.2/adrs/0001-version-spec-core.md +0 -64
  66. agentversion-0.2.2/compatibility-tests/workflow-graph-change/before.json +0 -73
  67. agentversion-0.2.2/pyrightconfig.json +0 -13
  68. agentversion-0.2.2/scripts/release.sh +0 -70
  69. agentversion-0.2.2/tests/test_conformance.py +0 -66
  70. {agentversion-0.2.2 → agentversion-0.2.3}/LICENSE +0 -0
  71. {agentversion-0.2.2 → agentversion-0.2.3}/agentversion/__init__.py +0 -0
  72. {agentversion-0.2.2 → agentversion-0.2.3}/agentversion/_shared.py +0 -0
  73. {agentversion-0.2.2 → agentversion-0.2.3}/agentversion/a2a.py +0 -0
  74. {agentversion-0.2.2 → agentversion-0.2.3}/agentversion/cli.py +0 -0
  75. {agentversion-0.2.2 → agentversion-0.2.3}/agentversion/constants.py +0 -0
  76. {agentversion-0.2.2 → agentversion-0.2.3}/agentversion/dataset.py +0 -0
  77. {agentversion-0.2.2 → agentversion-0.2.3}/agentversion/decision.py +0 -0
  78. {agentversion-0.2.2 → agentversion-0.2.3}/agentversion/hasher.py +0 -0
  79. {agentversion-0.2.2 → agentversion-0.2.3}/agentversion/ids.py +0 -0
  80. {agentversion-0.2.2 → agentversion-0.2.3}/agentversion/py.typed +0 -0
  81. {agentversion-0.2.2 → agentversion-0.2.3}/agentversion/refs.py +0 -0
  82. {agentversion-0.2.2 → agentversion-0.2.3}/agentversion/replay.py +0 -0
  83. {agentversion-0.2.2 → agentversion-0.2.3}/agentversion/validator.py +0 -0
  84. {agentversion-0.2.2 → agentversion-0.2.3}/examples/.gitkeep +0 -0
  85. {agentversion-0.2.2 → agentversion-0.2.3}/examples/integrations/langgraph_example.py +0 -0
  86. {agentversion-0.2.2 → agentversion-0.2.3}/examples/integrations/otel_mapping.md +0 -0
  87. {agentversion-0.2.2 → agentversion-0.2.3}/examples/manifest/finance-agent-v1.json +0 -0
  88. {agentversion-0.2.2 → agentversion-0.2.3}/examples/manifest/finance-agent-v2.json +0 -0
  89. {agentversion-0.2.2 → agentversion-0.2.3}/examples/scenarios/tool-rename-drift.md +0 -0
  90. {agentversion-0.2.2 → agentversion-0.2.3}/examples/scenarios/walkthrough.py +0 -0
  91. {agentversion-0.2.2 → agentversion-0.2.3}/schemas/.gitkeep +0 -0
  92. {agentversion-0.2.2 → agentversion-0.2.3}/schemas/agent-manifest.schema.json +0 -0
  93. {agentversion-0.2.2 → agentversion-0.2.3}/schemas/compatibility-batch.schema.json +0 -0
  94. {agentversion-0.2.2 → agentversion-0.2.3}/schemas/compatibility-decision.schema.json +0 -0
  95. {agentversion-0.2.2 → agentversion-0.2.3}/schemas/compatibility-policy.schema.json +0 -0
  96. {agentversion-0.2.2 → agentversion-0.2.3}/schemas/compatibility-report.schema.json +0 -0
  97. {agentversion-0.2.2 → agentversion-0.2.3}/schemas/dataset-snapshot.schema.json +0 -0
  98. {agentversion-0.2.2 → agentversion-0.2.3}/schemas/episode.schema.json +0 -0
  99. {agentversion-0.2.2 → agentversion-0.2.3}/schemas/manifest-diff.schema.json +0 -0
  100. {agentversion-0.2.2 → agentversion-0.2.3}/schemas/replay-job.schema.json +0 -0
  101. {agentversion-0.2.2 → agentversion-0.2.3}/schemas/replay-result.schema.json +0 -0
  102. {agentversion-0.2.2 → agentversion-0.2.3}/schemas/step.schema.json +0 -0
  103. {agentversion-0.2.2 → agentversion-0.2.3}/schemas/task.schema.json +0 -0
  104. {agentversion-0.2.2 → agentversion-0.2.3}/spec/a2a-mapping.md +0 -0
  105. {agentversion-0.2.2 → agentversion-0.2.3}/spec/behavioral-policy.md +0 -0
  106. {agentversion-0.2.2 → agentversion-0.2.3}/spec/dataset.md +0 -0
  107. {agentversion-0.2.2 → agentversion-0.2.3}/spec/diff.md +0 -0
  108. {agentversion-0.2.2 → agentversion-0.2.3}/spec/evaluation.md +0 -0
  109. {agentversion-0.2.2 → agentversion-0.2.3}/spec/hashing.md +0 -0
  110. {agentversion-0.2.2 → agentversion-0.2.3}/spec/lifecycle.md +0 -0
  111. {agentversion-0.2.2 → agentversion-0.2.3}/spec/manifest.md +0 -0
  112. {agentversion-0.2.2 → agentversion-0.2.3}/spec/otel-mapping.md +0 -0
  113. {agentversion-0.2.2 → agentversion-0.2.3}/spec/replay.md +0 -0
  114. {agentversion-0.2.2 → agentversion-0.2.3}/tests/test_a2a_mapping.py +0 -0
  115. {agentversion-0.2.2 → agentversion-0.2.3}/tests/test_audit_v030.py +0 -0
  116. {agentversion-0.2.2 → agentversion-0.2.3}/tests/test_dataset.py +0 -0
  117. {agentversion-0.2.2 → agentversion-0.2.3}/tests/test_decision_replay.py +0 -0
  118. {agentversion-0.2.2 → agentversion-0.2.3}/tests/test_diff.py +0 -0
  119. {agentversion-0.2.2 → agentversion-0.2.3}/tests/test_environment.py +0 -0
  120. {agentversion-0.2.2 → agentversion-0.2.3}/tests/test_evaluation.py +0 -0
  121. {agentversion-0.2.2 → agentversion-0.2.3}/tests/test_examples_runnable.py +0 -0
  122. {agentversion-0.2.2 → agentversion-0.2.3}/tests/test_hasher.py +0 -0
  123. {agentversion-0.2.2 → agentversion-0.2.3}/tests/test_ids.py +0 -0
  124. {agentversion-0.2.2 → agentversion-0.2.3}/tests/test_lifecycle.py +0 -0
  125. {agentversion-0.2.2 → agentversion-0.2.3}/tests/test_manifest.py +0 -0
  126. {agentversion-0.2.2 → agentversion-0.2.3}/tests/test_refs.py +0 -0
  127. {agentversion-0.2.2 → agentversion-0.2.3}/tests/test_reproducible_replay.py +0 -0
@@ -0,0 +1,52 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+ *.egg
7
+ *.egg-info/
8
+ .eggs/
9
+ build/
10
+ dist/
11
+
12
+ # Virtual environments
13
+ .venv/
14
+ venv/
15
+ env/
16
+
17
+ # Test, lint and type-check caches
18
+ .pytest_cache/
19
+ .ruff_cache/
20
+ .mypy_cache/
21
+ .benchmarks/
22
+ .deepeval/
23
+ .coverage
24
+ .coverage.*
25
+ coverage.xml
26
+ coverage/
27
+ htmlcov/
28
+
29
+ # Node
30
+ node_modules/
31
+ .next/
32
+ *.log
33
+
34
+ # Environment files. Real credentials never belong in the tree;
35
+ # .env.example is the tracked template, so it is re-included.
36
+ .env
37
+ .env.*
38
+ !.env.example
39
+
40
+ # Editors
41
+ .idea/
42
+ .vscode/
43
+ *.swp
44
+ *.swo
45
+ *~
46
+
47
+ # OS
48
+ .DS_Store
49
+ Thumbs.db
50
+
51
+ # Local agent/tool state
52
+ .claude/settings.local.json
@@ -7,6 +7,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  > **Package version ≠ spec version.** This file tracks the **package** version. The on-the-wire `spec_version` is independent and frozen at `1.0.0`; a pre-1.0 package can implement a stable 1.0 spec, which is exactly the situation today.
9
9
 
10
+ ## [0.2.3] - 2026-08-14
11
+
12
+ Packaging and documentation only. **No code, schema, or `spec_version` change** — the
13
+ on-the-wire spec stays frozen at 1.0.0 and every hash vector is unchanged.
14
+
15
+ ### Fixed
16
+ - **The source distribution now builds a wheel.** The sdist previously packed whatever the
17
+ working tree happened to contain, and omitted `schemas/`, `spec/`, `examples/` and
18
+ `compatibility-tests/` — the directories the wheel pulls in via `force-include`. The sdist
19
+ itself still built, so the gap only surfaced one step later: building a **wheel from that
20
+ sdist** failed, which is exactly what `uv build` and downstream packagers do. The sdist now
21
+ ships an explicit allow-list covering those sources.
22
+ - **The conformance fixtures now validate against the published schema.** They had drifted
23
+ from the schema shipped in the package, so a consumer validating the fixtures as a
24
+ self-check would see spurious failures.
25
+
26
+ ### Changed
27
+ - Spec wording and README claims tightened to match what the package actually implements.
28
+
10
29
  ## [0.2.2] - 2026-07-15
11
30
 
12
31
  ### Changed
@@ -27,7 +46,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
27
46
  - **`contract_from_components` now emits the `behavioral_policy` and
28
47
  `environment` surfaces.** 0.2.0 added the models, surface keys, and diff
29
48
  classifiers, but the shared flat-components → contract assembler silently
30
- dropped both — so a producer (the DecimalAI SDK / the platform) could never
49
+ dropped both — so a producer (e.g. an SDK exporter) could never
31
50
  actually populate them from components. They are now assembled verbatim from
32
51
  each component's `schema_json`. Additive-only: a manifest that doesn't declare
33
52
  them is unchanged (same `overall_hash`).
@@ -57,7 +76,7 @@ byte-identically and is pinned to this assembly by its conformance test.
57
76
  - **Extension hatch** (`AgentContract` is now `extra="allow"`): a custom / emerging contract surface
58
77
  (RAG corpus, MCP server registry, memory policy, vendor extension) is hashed by the hasher and diffed
59
78
  by the engine, and now also **survives `model_validate`** — previously it was silently dropped, so a
60
- validate→re-serialize→re-hash round-trip changed `overall_hash` (a moat-breaking non-determinism). The
79
+ validate→re-serialize→re-hash round-trip changed `overall_hash` (a hash-determinism break). The
61
80
  surface set can grow without forking the model. ASCII/known-surface hashes are unchanged.
62
81
  - **`COMPONENT_TYPE_TO_SURFACE` + `surface_key_for_component()`** — the canonical routing from a
63
82
  producer's flat `component_type` to the contract surface key it lands in (incl. the singular→plural
@@ -65,17 +84,15 @@ byte-identically and is pinned to this assembly by its conformance test.
65
84
  translator) share one source of truth instead of hand-copying the map — closing a cross-stack drift
66
85
  class where the rename had to be applied independently in every translator copy.
67
86
  - **`contract.contract_from_components()`** — the single source of truth for assembling a contract block
68
- (every surface, in canonical shape) from a producer's flat component list. Both the DecimalAI SDK
69
- exporter and the platform's hash path route through it, so they compute the *same* `jcs-sha256`
70
- identity hash for the same agent — the platform can now make the canonical hash authoritative and a
71
- customer reproduces the stored hash with the OSS CLI. Closes audit X-2 (two hand-written translators
72
- with no shared code/test).
87
+ (every surface, in canonical shape) from a producer's flat component list, so any producer computes the
88
+ same `jcs-sha256` identity hash for the same agent and a manifest's stored hash reproduces with the
89
+ OSS CLI.
73
90
 
74
91
  ### Fixed (hash-determinism + trust)
75
92
  - **Canonical-hash domain** (`hasher.py`): NFC-normalize every string (keys + values) and reject
76
93
  non-finite floats (`NaN`/`±Infinity`) **before** JCS canonicalization. JCS canonicalizes bytes but
77
94
  does not Unicode-normalize, so a composed `"café"` and a decomposed `"café"` previously produced a
78
- different `overall_hash` for the same agent (a cross-language reproduction break in the moat); and a
95
+ different `overall_hash` for the same agent (a cross-language reproduction break); and a
79
96
  `NaN` raised an opaque `jcs` error instead of a clear domain error. NFC of ASCII is a no-op, so
80
97
  **existing manifest hashes are unchanged** (frozen vectors still pass). Documented in `spec/hashing.md`.
81
98
  - **Attestation integrity** (`validator.py`): an attestation's `signed_payload_hash` must equal the
@@ -137,7 +154,7 @@ byte-identically and is pinned to this assembly by its conformance test.
137
154
 
138
155
  **First published release** — the first `agentversion` release on PyPI.
139
156
 
140
- The package ships pre-1.0 on purpose. The spec it implements is stable (`spec_version 1.0.0`, with a frozen wire format and conformance suite), but the Python package API hasn't earned its own 1.0 promise yet — so it enters at `0.1.0` (`Development Status :: 4 - Beta`). Feature-wise it's complete against the original audit roadmap; that work landed across the internal milestones listed further below, none of which were ever published.
157
+ The package ships pre-1.0 on purpose. The spec it implements is stable (`spec_version 1.0.0`, with a frozen wire format and conformance suite), but the Python package API hasn't earned its own 1.0 promise yet — so it enters at `0.1.0` (`Development Status :: 4 - Beta`). Feature-wise it's complete against the original capability roadmap; that work landed across the internal milestones listed further below, none of which were ever published.
141
158
 
142
159
  ### Changed — Project renamed to **AgentVersion**
143
160
 
@@ -160,7 +177,7 @@ The entries below were development milestones tracked in-repo on the way to feat
160
177
 
161
178
  ### 1.0.0 - 2026-05-12 (internal milestone)
162
179
 
163
- **Feature-complete milestone** (never published). The audit roadmap reached feature-completeness at this internal version; the stability promise it anticipated now lives on the spec, which is frozen at `1.0.0`.
180
+ **Feature-complete milestone** (never published). The capability roadmap reached feature-completeness at this internal version; the stability promise it anticipated now lives on the spec, which is frozen at `1.0.0`.
164
181
 
165
182
  ### What v1.0 looks like
166
183
 
@@ -206,7 +223,7 @@ Trust + observability + governance batch. The last three §3 items.
206
223
  - avs total: **295 passing** (was 278, net +17).
207
224
 
208
225
  ### Phase 3 complete
209
- All 14 missing-capability items from the original audit §3 are now shipped (or, in the case of §3l, were folded into Phase 2). The spec is feature-complete for the audit roadmap. Next milestone: **v1.0** — tighten enforcement (drop permissive ID pattern, drop bare-ID manifest_refs), publish to PyPI.
226
+ All 14 capability items (§3a–§3n) are now shipped, except §3l, which ships no standalone surface of its own. The spec is feature-complete for that roadmap. Next milestone: **v1.0** — tighten enforcement (drop permissive ID pattern, drop bare-ID manifest_refs), publish to PyPI.
210
227
 
211
228
  ### 0.8.0 - 2026-05-12
212
229
 
@@ -23,20 +23,14 @@ Located under [`compatibility-tests/`](./compatibility-tests/). Each subdirector
23
23
 
24
24
  ```
25
25
  compatibility-tests/
26
- tool-rename/
26
+ <scenario-name>/
27
27
  before.json # input manifest A
28
28
  after.json # input manifest B
29
29
  expected-diff.json # ManifestDiff produced by a conforming implementation
30
- output-schema-change/
31
- before.json
32
- after.json
33
- expected-diff.json
34
- subagent-handoff-change/
35
- before.json
36
- after.json
37
- expected-diff.json
38
30
  ```
39
31
 
32
+ Every subdirectory of `compatibility-tests/` is a scenario and all of them are normative — run the directory, not a fixed list.
33
+
40
34
  The Python reference verifies conformance via `tests/test_conformance.py`. To verify an implementation in another language:
41
35
 
42
36
  1. For each scenario, load `before.json` and `after.json`.
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: agentversion
3
- Version: 0.2.2
3
+ Version: 0.2.3
4
4
  Summary: An open specification for versioning agent runtimes and keeping datasets valid.
5
5
  Project-URL: Homepage, https://github.com/decimal-labs/agentversion
6
6
  Project-URL: Documentation, https://github.com/decimal-labs/agentversion/tree/main/spec
@@ -35,12 +35,16 @@ Description-Content-Type: text/markdown
35
35
 
36
36
  # AgentVersion
37
37
 
38
+ *Part of [DecimalAI](https://decimal.ai). Most users want the Python SDK → [decimal-labs/decimalai-python](https://github.com/decimal-labs/decimalai-python).*
39
+
38
40
  **Your agent changed. Is your saved data still valid?**
39
41
 
40
42
  [![PyPI](https://img.shields.io/pypi/v/agentversion)](https://pypi.org/project/agentversion/)
43
+ [![Downloads](https://static.pepy.tech/badge/agentversion/month)](https://pepy.tech/project/agentversion)
44
+ [![CI](https://img.shields.io/github/actions/workflow/status/decimal-labs/agentversion/ci.yml?branch=main)](https://github.com/decimal-labs/agentversion/actions/workflows/ci.yml)
41
45
  [![Python](https://img.shields.io/badge/python-3.10%2B-blue)](https://pypi.org/project/agentversion/)
42
46
  [![Spec](https://img.shields.io/badge/spec-v1.0-success)](https://pypi.org/project/agentversion/)
43
- [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://pypi.org/project/agentversion/)
47
+ [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://github.com/decimal-labs/agentversion/blob/main/LICENSE)
44
48
 
45
49
  When you ship a new version of an agent, everything you collected against the old one — production traces, eval datasets, SFT (supervised fine-tuning) examples — quietly drifts out of date. There's no `package.json` to pin an agent's contract, and no `git diff` to tell you what changed.
46
50
 
@@ -148,7 +152,9 @@ A manifest is plain JSON. The top says *which* version this is; `contract` holds
148
152
 
149
153
  Each surface is hashed on its own, so the diff can say *"`tool_registry` changed, `prompt_stack` didn't"* instead of just *"the manifest changed."*
150
154
 
151
- > Try it yourself — both [`examples/manifest/`](https://pypi.org/project/agentversion/) manifests ship inside the `agentversion` wheel.
155
+ > Try it yourself — both [`examples/manifest/`](https://github.com/decimal-labs/agentversion/tree/main/examples/manifest)
156
+ > manifests ship inside the `agentversion` wheel as well as in the repo; the commands below use the
157
+ > repo-relative paths, so clone first.
152
158
 
153
159
  ---
154
160
 
@@ -158,7 +164,7 @@ You probably already have observability and a trace store. None of them answer *
158
164
 
159
165
  | You already have | What it gives you | What it doesn't |
160
166
  |---|---|---|
161
- | OpenTelemetry / LangSmith / Langfuse | rich execution traces | a versioned contract for the agent that produced them |
167
+ | OpenTelemetry and the tracing tools built on it | rich execution traces | a versioned contract for the agent that produced them |
162
168
  | A2A / ACP agent cards | runtime discovery + I/O types | version identity or data-compatibility |
163
169
  | OpenAI JSONL / SFT files | a training format | provenance — *which agent version* produced each row |
164
170
 
@@ -177,7 +183,7 @@ Apache-2.0, no config — just needs Python 3.10+.
177
183
  There are **two version numbers**, deliberately different:
178
184
 
179
185
  - the **wire spec** is frozen at **v1.0** (stable format + conformance suite — safe to build against);
180
- - this **Python package** is **0.1.0** — pre-1.0, so its API may still shift.
186
+ - this **Python package** is still **pre-1.0**, so its API may still shift.
181
187
 
182
188
  (The `spec-v1.0` and PyPI badges above show each one.)
183
189
 
@@ -201,9 +207,11 @@ agentversion hash manifest.json # a content hash that ignores key order an
201
207
  agentversion validate manifest.json # check it against the spec
202
208
  ```
203
209
 
204
- **3. Diff two versions** — runnable right now against the bundled examples (`--compat` adds the keep/repair/replay/drop recommendation; `--json` for machine output):
210
+ **3. Diff two versions** — against the bundled examples. The paths are relative, so run this from a
211
+ checkout (`--compat` adds the keep/repair/replay/drop recommendation; `--json` for machine output):
205
212
 
206
213
  ```bash
214
+ git clone https://github.com/decimal-labs/agentversion && cd agentversion
207
215
  agentversion diff examples/manifest/finance-agent-v1.json \
208
216
  examples/manifest/finance-agent-v2.json --compat
209
217
  ```
@@ -216,7 +224,7 @@ agentversion diff examples/manifest/finance-agent-v1.json \
216
224
  run: agentversion diff baseline-manifest.json current-manifest.json --fail-on-breaking
217
225
  ```
218
226
 
219
- **Use it from Python** — every line below is exercised by the test suite:
227
+ **Use it from Python** — every API below is covered by the test suite:
220
228
 
221
229
  ```python
222
230
  import json
@@ -224,17 +232,20 @@ from agentversion import AgentManifest, validate_manifest_file, hash_manifest
224
232
  from agentversion.diff import diff_manifests
225
233
  from agentversion.compatibility import classify_compatibility
226
234
 
227
- old = json.load(open("finance-agent-v1.json"))
228
- new = json.load(open("finance-agent-v2.json"))
235
+ old = json.load(open("examples/manifest/finance-agent-v1.json"))
236
+ new = json.load(open("examples/manifest/finance-agent-v2.json"))
229
237
 
230
238
  # Validate + identify a version
231
- assert validate_manifest_file("finance-agent-v2.json").valid
239
+ assert validate_manifest_file("examples/manifest/finance-agent-v2.json").valid
232
240
  m = AgentManifest.model_validate(new)
233
241
  print(m.agent_name, m.identity.overall_hash) # finance-agent sha256:767ebff1...
234
242
 
235
243
  # Diff, then ask what to do with old data
236
244
  result = diff_manifests(old, new)
237
245
  print(result.summary.breaking_surfaces) # 5
246
+
247
+ # Pass no policy and the built-in fallback rules apply. They are deliberately
248
+ # non-destructive: the worst they will ever recommend is replay, never drop.
238
249
  print(classify_compatibility(result).recommended_decision) # replay
239
250
  ```
240
251
 
@@ -267,10 +278,10 @@ The protocol is fully useful standalone:
267
278
 
268
279
  1. **Track versions locally** — `init` to scaffold, `hash` for a stable id, `diff` between any two. No account, fully offline.
269
280
  2. **Gate CI/CD** — `diff --fail-on-breaking` stops a breaking agent change from reaching production.
270
- 3. **Annotate traces** — stamp `identity.overall_hash` onto your OpenTelemetry spans as `agentversion.manifest_hash` for version-scoped filtering. See [`examples/integrations/otel_mapping.md`](https://pypi.org/project/agentversion/), bundled in the package.
281
+ 3. **Annotate traces** — stamp `identity.overall_hash` onto your OpenTelemetry spans as `agentversion.manifest_hash` for version-scoped filtering. See [`examples/integrations/otel_mapping.md`](https://github.com/decimal-labs/agentversion/blob/main/examples/integrations/otel_mapping.md), bundled in the package.
271
282
  4. **Classify data compatibility** — `diff --compat` (or `decision generate`) gives a per-episode keep / repair / replay / drop verdict you can act on.
272
283
 
273
- It interoperates with LangSmith, Langfuse, Phoenix, and W&B — annotate their traces/datasets with a manifest hash, or read/write compatibility decisions alongside your eval pipeline.
284
+ A manifest hash is just a string, so it drops into whatever trace store or eval tool you already run — put `identity.overall_hash` on the spans or dataset rows you keep, and the compatibility decisions sit alongside your eval pipeline as ordinary JSON.
274
285
 
275
286
  ---
276
287
 
@@ -278,13 +289,13 @@ It interoperates with LangSmith, Langfuse, Phoenix, and W&B — annotate their t
278
289
 
279
290
  `agentversion` is an open spec so any tool, in any language, can produce interoperable manifests and diffs:
280
291
 
281
- - [`spec/manifest.md`](https://pypi.org/project/agentversion/) — the agent manifest
282
- - [`spec/diff.md`](https://pypi.org/project/agentversion/) — surface diffs, breaking vs non-breaking
283
- - [`spec/compatibility-decision.md`](https://pypi.org/project/agentversion/) — keep / repair / replay / drop
284
- - [`spec/replay.md`](https://pypi.org/project/agentversion/) · [`spec/dataset.md`](https://pypi.org/project/agentversion/) — replay jobs and dataset objects with provenance
285
- - [`spec/reference.md`](https://pypi.org/project/agentversion/) — full schemas and validation rules · [`schemas/`](https://pypi.org/project/agentversion/) — JSON Schemas
292
+ - [`spec/manifest.md`](https://github.com/decimal-labs/agentversion/blob/main/spec/manifest.md) — the agent manifest
293
+ - [`spec/diff.md`](https://github.com/decimal-labs/agentversion/blob/main/spec/diff.md) — surface diffs, breaking vs non-breaking
294
+ - [`spec/compatibility-decision.md`](https://github.com/decimal-labs/agentversion/blob/main/spec/compatibility-decision.md) — keep / repair / replay / drop
295
+ - [`spec/replay.md`](https://github.com/decimal-labs/agentversion/blob/main/spec/replay.md) · [`spec/dataset.md`](https://github.com/decimal-labs/agentversion/blob/main/spec/dataset.md) — replay jobs and dataset objects with provenance
296
+ - [`spec/reference.md`](https://github.com/decimal-labs/agentversion/blob/main/spec/reference.md) — full schemas and validation rules · [`schemas/`](https://github.com/decimal-labs/agentversion/tree/main/schemas) — JSON Schemas
286
297
 
287
- The full spec and JSON Schemas ship inside the `agentversion` wheel. [`CONFORMANCE.md`](https://pypi.org/project/agentversion/) + [`compatibility-tests/`](https://pypi.org/project/agentversion/) are golden in/out pairs that any implementation must reproduce to claim conformance.
298
+ The full spec and JSON Schemas ship inside the `agentversion` wheel. [`CONFORMANCE.md`](https://github.com/decimal-labs/agentversion/blob/main/CONFORMANCE.md) + [`compatibility-tests/`](https://github.com/decimal-labs/agentversion/tree/main/compatibility-tests) are golden in/out pairs that any implementation must reproduce to claim conformance.
288
299
 
289
300
  ---
290
301
 
@@ -303,7 +314,7 @@ A manifest can carry the eval results that gated its release in `evaluation.gate
303
314
  }
304
315
  ```
305
316
 
306
- Those scores come from [`skillevaluation`](https://pypi.org/project/skillevaluation/), the sibling open spec for A/B benchmarking skills. `agentversion` records *what an agent version is*; `skillevaluation` measures *whether it's better*.
317
+ Those scores come from [`skillevaluation`](https://github.com/decimal-labs/skillevaluation), the sibling open spec: `agentversion` versions the agent runtime itself (what an agent version *is* and what changed), while `skillevaluation` A/B-benchmarks a single skill (whether it actually helps).
307
318
 
308
319
  The [`decimalai`](https://pypi.org/project/decimalai/) Python SDK builds on `agentversion` to add framework adapters (capture a manifest straight from your LangGraph/CrewAI app), trace capture, and managed replay — but you never need it to use the spec.
309
320
 
@@ -332,13 +343,13 @@ diff = diff_manifests(last_prod_manifest, manifest)
332
343
  print(classify_compatibility(diff).recommended_decision)
333
344
  ```
334
345
 
335
- This is the seam that makes `agentversion` the **open core** of the paid platform: the manifest the SDK captures *is* the format `agentversion diff` consumes, so you can reproduce the platform's diffs and verdicts entirely outside DecimalAI. A runnable version is in [`examples/integrations/decimalai_bridge.py`](https://pypi.org/project/agentversion/).
346
+ This is the seam that makes `agentversion` the **open core** of the paid platform: the manifest the SDK captures *is* the format `agentversion diff` consumes, so you can reproduce the platform's diffs and verdicts entirely outside DecimalAI. A runnable version is in [`examples/integrations/decimalai_bridge.py`](https://github.com/decimal-labs/agentversion/blob/main/examples/integrations/decimalai_bridge.py).
336
347
 
337
348
  ---
338
349
 
339
350
  ## Project
340
351
 
341
- The spec is frozen at v1.0; the package is pre-1.0 (see [Install](#install)). Design decisions are logged in [`adrs/`](https://pypi.org/project/agentversion/), releases in [`CHANGELOG.md`](https://pypi.org/project/agentversion/). Contributions — especially new conformance cases — are genuinely welcome; see [`CONTRIBUTING.md`](https://pypi.org/project/agentversion/):
352
+ The spec is frozen at v1.0; the package is pre-1.0 (see [Install](#install)). Design decisions are logged in [`adrs/`](https://github.com/decimal-labs/agentversion/tree/main/adrs), releases in [`CHANGELOG.md`](https://github.com/decimal-labs/agentversion/blob/main/CHANGELOG.md). Contributions — especially new conformance cases — are genuinely welcome; see [`CONTRIBUTING.md`](https://github.com/decimal-labs/agentversion/blob/main/CONTRIBUTING.md):
342
353
 
343
354
  ```bash
344
355
  pip install agentversion
@@ -348,4 +359,8 @@ git clone https://github.com/decimal-labs/agentversion && cd agentversion
348
359
  pip install -e ".[dev]" && pytest
349
360
  ```
350
361
 
351
- Licensed under [Apache 2.0](https://pypi.org/project/agentversion/).
362
+ Licensed under [Apache 2.0](https://github.com/decimal-labs/agentversion/blob/main/LICENSE).
363
+
364
+ ---
365
+
366
+ [Docs](https://docs.decimal.ai) · [Registry](https://app.decimal.ai/skills) · [SDK](https://github.com/decimal-labs/decimalai-python) · [skillevaluation](https://github.com/decimal-labs/skillevaluation) · [regression-check](https://github.com/decimal-labs/regression-check)
@@ -1,11 +1,15 @@
1
1
  # AgentVersion
2
2
 
3
+ *Part of [DecimalAI](https://decimal.ai). Most users want the Python SDK → [decimal-labs/decimalai-python](https://github.com/decimal-labs/decimalai-python).*
4
+
3
5
  **Your agent changed. Is your saved data still valid?**
4
6
 
5
7
  [![PyPI](https://img.shields.io/pypi/v/agentversion)](https://pypi.org/project/agentversion/)
8
+ [![Downloads](https://static.pepy.tech/badge/agentversion/month)](https://pepy.tech/project/agentversion)
9
+ [![CI](https://img.shields.io/github/actions/workflow/status/decimal-labs/agentversion/ci.yml?branch=main)](https://github.com/decimal-labs/agentversion/actions/workflows/ci.yml)
6
10
  [![Python](https://img.shields.io/badge/python-3.10%2B-blue)](https://pypi.org/project/agentversion/)
7
11
  [![Spec](https://img.shields.io/badge/spec-v1.0-success)](https://pypi.org/project/agentversion/)
8
- [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://pypi.org/project/agentversion/)
12
+ [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://github.com/decimal-labs/agentversion/blob/main/LICENSE)
9
13
 
10
14
  When you ship a new version of an agent, everything you collected against the old one — production traces, eval datasets, SFT (supervised fine-tuning) examples — quietly drifts out of date. There's no `package.json` to pin an agent's contract, and no `git diff` to tell you what changed.
11
15
 
@@ -113,7 +117,9 @@ A manifest is plain JSON. The top says *which* version this is; `contract` holds
113
117
 
114
118
  Each surface is hashed on its own, so the diff can say *"`tool_registry` changed, `prompt_stack` didn't"* instead of just *"the manifest changed."*
115
119
 
116
- > Try it yourself — both [`examples/manifest/`](https://pypi.org/project/agentversion/) manifests ship inside the `agentversion` wheel.
120
+ > Try it yourself — both [`examples/manifest/`](https://github.com/decimal-labs/agentversion/tree/main/examples/manifest)
121
+ > manifests ship inside the `agentversion` wheel as well as in the repo; the commands below use the
122
+ > repo-relative paths, so clone first.
117
123
 
118
124
  ---
119
125
 
@@ -123,7 +129,7 @@ You probably already have observability and a trace store. None of them answer *
123
129
 
124
130
  | You already have | What it gives you | What it doesn't |
125
131
  |---|---|---|
126
- | OpenTelemetry / LangSmith / Langfuse | rich execution traces | a versioned contract for the agent that produced them |
132
+ | OpenTelemetry and the tracing tools built on it | rich execution traces | a versioned contract for the agent that produced them |
127
133
  | A2A / ACP agent cards | runtime discovery + I/O types | version identity or data-compatibility |
128
134
  | OpenAI JSONL / SFT files | a training format | provenance — *which agent version* produced each row |
129
135
 
@@ -142,7 +148,7 @@ Apache-2.0, no config — just needs Python 3.10+.
142
148
  There are **two version numbers**, deliberately different:
143
149
 
144
150
  - the **wire spec** is frozen at **v1.0** (stable format + conformance suite — safe to build against);
145
- - this **Python package** is **0.1.0** — pre-1.0, so its API may still shift.
151
+ - this **Python package** is still **pre-1.0**, so its API may still shift.
146
152
 
147
153
  (The `spec-v1.0` and PyPI badges above show each one.)
148
154
 
@@ -166,9 +172,11 @@ agentversion hash manifest.json # a content hash that ignores key order an
166
172
  agentversion validate manifest.json # check it against the spec
167
173
  ```
168
174
 
169
- **3. Diff two versions** — runnable right now against the bundled examples (`--compat` adds the keep/repair/replay/drop recommendation; `--json` for machine output):
175
+ **3. Diff two versions** — against the bundled examples. The paths are relative, so run this from a
176
+ checkout (`--compat` adds the keep/repair/replay/drop recommendation; `--json` for machine output):
170
177
 
171
178
  ```bash
179
+ git clone https://github.com/decimal-labs/agentversion && cd agentversion
172
180
  agentversion diff examples/manifest/finance-agent-v1.json \
173
181
  examples/manifest/finance-agent-v2.json --compat
174
182
  ```
@@ -181,7 +189,7 @@ agentversion diff examples/manifest/finance-agent-v1.json \
181
189
  run: agentversion diff baseline-manifest.json current-manifest.json --fail-on-breaking
182
190
  ```
183
191
 
184
- **Use it from Python** — every line below is exercised by the test suite:
192
+ **Use it from Python** — every API below is covered by the test suite:
185
193
 
186
194
  ```python
187
195
  import json
@@ -189,17 +197,20 @@ from agentversion import AgentManifest, validate_manifest_file, hash_manifest
189
197
  from agentversion.diff import diff_manifests
190
198
  from agentversion.compatibility import classify_compatibility
191
199
 
192
- old = json.load(open("finance-agent-v1.json"))
193
- new = json.load(open("finance-agent-v2.json"))
200
+ old = json.load(open("examples/manifest/finance-agent-v1.json"))
201
+ new = json.load(open("examples/manifest/finance-agent-v2.json"))
194
202
 
195
203
  # Validate + identify a version
196
- assert validate_manifest_file("finance-agent-v2.json").valid
204
+ assert validate_manifest_file("examples/manifest/finance-agent-v2.json").valid
197
205
  m = AgentManifest.model_validate(new)
198
206
  print(m.agent_name, m.identity.overall_hash) # finance-agent sha256:767ebff1...
199
207
 
200
208
  # Diff, then ask what to do with old data
201
209
  result = diff_manifests(old, new)
202
210
  print(result.summary.breaking_surfaces) # 5
211
+
212
+ # Pass no policy and the built-in fallback rules apply. They are deliberately
213
+ # non-destructive: the worst they will ever recommend is replay, never drop.
203
214
  print(classify_compatibility(result).recommended_decision) # replay
204
215
  ```
205
216
 
@@ -232,10 +243,10 @@ The protocol is fully useful standalone:
232
243
 
233
244
  1. **Track versions locally** — `init` to scaffold, `hash` for a stable id, `diff` between any two. No account, fully offline.
234
245
  2. **Gate CI/CD** — `diff --fail-on-breaking` stops a breaking agent change from reaching production.
235
- 3. **Annotate traces** — stamp `identity.overall_hash` onto your OpenTelemetry spans as `agentversion.manifest_hash` for version-scoped filtering. See [`examples/integrations/otel_mapping.md`](https://pypi.org/project/agentversion/), bundled in the package.
246
+ 3. **Annotate traces** — stamp `identity.overall_hash` onto your OpenTelemetry spans as `agentversion.manifest_hash` for version-scoped filtering. See [`examples/integrations/otel_mapping.md`](https://github.com/decimal-labs/agentversion/blob/main/examples/integrations/otel_mapping.md), bundled in the package.
236
247
  4. **Classify data compatibility** — `diff --compat` (or `decision generate`) gives a per-episode keep / repair / replay / drop verdict you can act on.
237
248
 
238
- It interoperates with LangSmith, Langfuse, Phoenix, and W&B — annotate their traces/datasets with a manifest hash, or read/write compatibility decisions alongside your eval pipeline.
249
+ A manifest hash is just a string, so it drops into whatever trace store or eval tool you already run — put `identity.overall_hash` on the spans or dataset rows you keep, and the compatibility decisions sit alongside your eval pipeline as ordinary JSON.
239
250
 
240
251
  ---
241
252
 
@@ -243,13 +254,13 @@ It interoperates with LangSmith, Langfuse, Phoenix, and W&B — annotate their t
243
254
 
244
255
  `agentversion` is an open spec so any tool, in any language, can produce interoperable manifests and diffs:
245
256
 
246
- - [`spec/manifest.md`](https://pypi.org/project/agentversion/) — the agent manifest
247
- - [`spec/diff.md`](https://pypi.org/project/agentversion/) — surface diffs, breaking vs non-breaking
248
- - [`spec/compatibility-decision.md`](https://pypi.org/project/agentversion/) — keep / repair / replay / drop
249
- - [`spec/replay.md`](https://pypi.org/project/agentversion/) · [`spec/dataset.md`](https://pypi.org/project/agentversion/) — replay jobs and dataset objects with provenance
250
- - [`spec/reference.md`](https://pypi.org/project/agentversion/) — full schemas and validation rules · [`schemas/`](https://pypi.org/project/agentversion/) — JSON Schemas
257
+ - [`spec/manifest.md`](https://github.com/decimal-labs/agentversion/blob/main/spec/manifest.md) — the agent manifest
258
+ - [`spec/diff.md`](https://github.com/decimal-labs/agentversion/blob/main/spec/diff.md) — surface diffs, breaking vs non-breaking
259
+ - [`spec/compatibility-decision.md`](https://github.com/decimal-labs/agentversion/blob/main/spec/compatibility-decision.md) — keep / repair / replay / drop
260
+ - [`spec/replay.md`](https://github.com/decimal-labs/agentversion/blob/main/spec/replay.md) · [`spec/dataset.md`](https://github.com/decimal-labs/agentversion/blob/main/spec/dataset.md) — replay jobs and dataset objects with provenance
261
+ - [`spec/reference.md`](https://github.com/decimal-labs/agentversion/blob/main/spec/reference.md) — full schemas and validation rules · [`schemas/`](https://github.com/decimal-labs/agentversion/tree/main/schemas) — JSON Schemas
251
262
 
252
- The full spec and JSON Schemas ship inside the `agentversion` wheel. [`CONFORMANCE.md`](https://pypi.org/project/agentversion/) + [`compatibility-tests/`](https://pypi.org/project/agentversion/) are golden in/out pairs that any implementation must reproduce to claim conformance.
263
+ The full spec and JSON Schemas ship inside the `agentversion` wheel. [`CONFORMANCE.md`](https://github.com/decimal-labs/agentversion/blob/main/CONFORMANCE.md) + [`compatibility-tests/`](https://github.com/decimal-labs/agentversion/tree/main/compatibility-tests) are golden in/out pairs that any implementation must reproduce to claim conformance.
253
264
 
254
265
  ---
255
266
 
@@ -268,7 +279,7 @@ A manifest can carry the eval results that gated its release in `evaluation.gate
268
279
  }
269
280
  ```
270
281
 
271
- Those scores come from [`skillevaluation`](https://pypi.org/project/skillevaluation/), the sibling open spec for A/B benchmarking skills. `agentversion` records *what an agent version is*; `skillevaluation` measures *whether it's better*.
282
+ Those scores come from [`skillevaluation`](https://github.com/decimal-labs/skillevaluation), the sibling open spec: `agentversion` versions the agent runtime itself (what an agent version *is* and what changed), while `skillevaluation` A/B-benchmarks a single skill (whether it actually helps).
272
283
 
273
284
  The [`decimalai`](https://pypi.org/project/decimalai/) Python SDK builds on `agentversion` to add framework adapters (capture a manifest straight from your LangGraph/CrewAI app), trace capture, and managed replay — but you never need it to use the spec.
274
285
 
@@ -297,13 +308,13 @@ diff = diff_manifests(last_prod_manifest, manifest)
297
308
  print(classify_compatibility(diff).recommended_decision)
298
309
  ```
299
310
 
300
- This is the seam that makes `agentversion` the **open core** of the paid platform: the manifest the SDK captures *is* the format `agentversion diff` consumes, so you can reproduce the platform's diffs and verdicts entirely outside DecimalAI. A runnable version is in [`examples/integrations/decimalai_bridge.py`](https://pypi.org/project/agentversion/).
311
+ This is the seam that makes `agentversion` the **open core** of the paid platform: the manifest the SDK captures *is* the format `agentversion diff` consumes, so you can reproduce the platform's diffs and verdicts entirely outside DecimalAI. A runnable version is in [`examples/integrations/decimalai_bridge.py`](https://github.com/decimal-labs/agentversion/blob/main/examples/integrations/decimalai_bridge.py).
301
312
 
302
313
  ---
303
314
 
304
315
  ## Project
305
316
 
306
- The spec is frozen at v1.0; the package is pre-1.0 (see [Install](#install)). Design decisions are logged in [`adrs/`](https://pypi.org/project/agentversion/), releases in [`CHANGELOG.md`](https://pypi.org/project/agentversion/). Contributions — especially new conformance cases — are genuinely welcome; see [`CONTRIBUTING.md`](https://pypi.org/project/agentversion/):
317
+ The spec is frozen at v1.0; the package is pre-1.0 (see [Install](#install)). Design decisions are logged in [`adrs/`](https://github.com/decimal-labs/agentversion/tree/main/adrs), releases in [`CHANGELOG.md`](https://github.com/decimal-labs/agentversion/blob/main/CHANGELOG.md). Contributions — especially new conformance cases — are genuinely welcome; see [`CONTRIBUTING.md`](https://github.com/decimal-labs/agentversion/blob/main/CONTRIBUTING.md):
307
318
 
308
319
  ```bash
309
320
  pip install agentversion
@@ -313,4 +324,8 @@ git clone https://github.com/decimal-labs/agentversion && cd agentversion
313
324
  pip install -e ".[dev]" && pytest
314
325
  ```
315
326
 
316
- Licensed under [Apache 2.0](https://pypi.org/project/agentversion/).
327
+ Licensed under [Apache 2.0](https://github.com/decimal-labs/agentversion/blob/main/LICENSE).
328
+
329
+ ---
330
+
331
+ [Docs](https://docs.decimal.ai) · [Registry](https://app.decimal.ai/skills) · [SDK](https://github.com/decimal-labs/decimalai-python) · [skillevaluation](https://github.com/decimal-labs/skillevaluation) · [regression-check](https://github.com/decimal-labs/regression-check)
@@ -70,7 +70,13 @@ class CompatibilityPolicy(BaseModel):
70
70
  kind: Literal["compatibility_policy"] = "compatibility_policy"
71
71
  version: str = "0.1"
72
72
  name: str = "default"
73
- preset: Literal["strict", "default", "permissive", "custom"] | None = "default"
73
+ preset: Literal["strict", "default", "permissive", "custom"] | None = Field(
74
+ "default",
75
+ description=(
76
+ "Provenance label only — recorded, not evaluated. "
77
+ "Per-surface rule blocks drive every decision."
78
+ ),
79
+ )
74
80
 
75
81
  prompt_stack: SurfaceRules | None = None
76
82
  model_runtime: SurfaceRules | None = None
@@ -2,10 +2,10 @@
2
2
 
3
3
  The single source of truth for how a producer's *flat* components (one entry per
4
4
  tool / prompt / model / …) regroup into the contract-keyed surfaces the diff and
5
- the identity hash are computed from. Both the DecimalAI SDK exporter
6
- (``ManifestSnapshot.to_agentversion``) and the platform's diff translators call
7
- this, so a producer and a consumer can't drift on the mapping — and therefore
8
- compute the *same* ``jcs-sha256`` identity hash for the same agent.
5
+ the identity hash are computed from. The DecimalAI platform calls this directly;
6
+ the DecimalAI SDK exporter (``ManifestSnapshot.to_agentversion``) mirrors it and
7
+ is held byte-identical to it by a cross-implementation test — so a producer and a
8
+ consumer compute the *same* ``jcs-sha256`` identity hash for the same agent.
9
9
 
10
10
  Each component is a plain dict::
11
11
 
@@ -814,11 +814,9 @@ SURFACE_KEYS = [
814
814
  "behavioral_policy",
815
815
  ]
816
816
 
817
- # CANONICAL routing from a producer's flat `component_type` to the contract SURFACE_KEY it lands in.
818
- # This is the single source of truth for that mapping, so a producer (the SDK) and a consumer (the
819
- # platform's diff path) can't drift — notably the singular→plural `guardrail`→`guardrails` rename,
820
- # which previously had to be applied by hand in every translator copy (XC-1). An unknown component
821
- # type maps to itself (so a new/custom surface is diffed generically rather than dropped).
817
+ # Routing from a producer's flat `component_type` to the contract SURFACE_KEY it lands in,
818
+ # including the singular→plural `guardrail`→`guardrails` case. A component type with no entry
819
+ # here maps to itself (so a new/custom surface is diffed generically rather than dropped).
822
820
  COMPONENT_TYPE_TO_SURFACE: dict[str, str] = {
823
821
  "tool": "tool_registry",
824
822
  "skill": "skill_registry",
@@ -834,8 +832,8 @@ COMPONENT_TYPE_TO_SURFACE: dict[str, str] = {
834
832
  def surface_key_for_component(component_type: str) -> str:
835
833
  """The contract surface a flat ``component_type`` belongs to (identity for unknown types).
836
834
 
837
- Use this everywhere a producer's component is routed to an agentversion surface, so the routing
838
- (including ``guardrail``→``guardrails``) lives in exactly one place.
835
+ Looks ``component_type`` up in ``COMPONENT_TYPE_TO_SURFACE`` (for example
836
+ ``guardrail``→``guardrails``) and returns it unchanged when it has no entry.
839
837
  """
840
838
  return COMPONENT_TYPE_TO_SURFACE.get(component_type, component_type)
841
839
 
@@ -266,7 +266,7 @@ class BehavioralPolicy(BaseModel):
266
266
  """Versioned BEHAVIORAL-POLICY contract surface.
267
267
 
268
268
  Binds the agent to a named policy artifact — the rules it must hold to, e.g. a refund/escalation
269
- policy ("deny until the customer objects N times, then escalate; never admit liability"), a safety
269
+ policy ("auto-approve refunds under $50; escalate anything higher to a human"), a safety
270
270
  guardrail set, or an escalation SOP. The surface is document-agnostic: ``policy_hash`` is the stable
271
271
  identity (a hash of whatever policy artifact you bind), and the value carried is opaque to this
272
272
  model.
@@ -325,7 +325,7 @@ class Attestation(BaseModel):
325
325
  requires that attestations be well-formed and round-trip cleanly.
326
326
  """
327
327
 
328
- signer: str # e.g. "sigstore:github.com/decimalai/release-pipeline@main"
328
+ signer: str # e.g. "sigstore:github.com/decimal-labs/agentversion@main"
329
329
  algorithm: str # e.g. "cosign-rsa-sha256", "ssh-ed25519", "x509-rsa-pss-sha256"
330
330
  signature: str # base64-encoded
331
331
  signed_payload_hash: str # the canonical-hash value that was signed
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "spec_version": "1.0.0",
3
3
  "kind": "agent_manifest",
4
- "manifest_id": "amf_v2",
4
+ "manifest_id": "amf_01KZWEB6GAKHYPA3F40MXTXG21",
5
5
  "agent_name": "demo",
6
6
  "version_label": "v2",
7
7
  "created_at": "2026-05-12T00:00:00Z",
8
8
  "identity": {
9
- "overall_hash": "sha256:base",
9
+ "overall_hash": "sha256:498e5104253df5da9bc68ba6b50174e08d683616c3f879eafabfc02e1f4370d8",
10
10
  "hash_algorithm": "jcs-sha256"
11
11
  },
12
12
  "contract": {
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "spec_version": "1.0.0",
3
3
  "kind": "agent_manifest",
4
- "manifest_id": "amf_v1",
4
+ "manifest_id": "amf_01KZWEB6G8P3XE7ZQ3MQ06ZK3C",
5
5
  "agent_name": "demo",
6
6
  "version_label": "v1",
7
7
  "created_at": "2026-05-12T00:00:00Z",
8
8
  "identity": {
9
- "overall_hash": "sha256:base",
9
+ "overall_hash": "sha256:c0b9f791991e964464d5f0306d943cfb90e357bff7ed414be75a6ba87afa0c5e",
10
10
  "hash_algorithm": "jcs-sha256"
11
11
  },
12
12
  "contract": {