fix(trace): emit the TRACE v0.2 profile URI - #3454
Conversation
AGT emitted tag:agentrust.io,2026:trace-v0.1. RFC 4151 permits a tag URI only where the minting authority controlled the named domain on the date in the URI, and agentrust.io was never controlled by the TRACE project; it resolves to third-party parked addresses. The identifier asserted authority over a name belonging to someone else. TRACE v0.2 corrects it to tag:agentrust-io.com,2026:trace-v0.2 and changes nothing else about the record format, so this is one constant plus its tests. ADR-0032 gets an amendment rather than an edit, per the ADR immutability convention: the original Decision text and the v01 file name stay. Records AGT has already emitted remain verifiable as v0.1 records against agentrust-trace-tests 0.3.x, which stays published. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Imran Siddique <imran.siddique@opaque.co>
Dependency ReviewThe following issues were found:
License Issuesagent-governance-python/agent-governance-toolkit-core/pyproject.toml
OpenSSF Scorecard
Scanned Files
|
🤖 AI Agent: security-scanner — View details
No security issues found. |
🤖 AI Agent: breaking-change-detector — API Compatibility
API Compatibility
|
🤖 AI Agent: docs-sync-checker — Docs Sync
Docs Sync
Please ensure the |
🤖 AI Agent: code-reviewer — View details
TL;DR: 0 blockers, 1 warning. Change is sound but requires downstream verifier updates.
Action items: None (no blockers). Warnings: fine as follow-up PRs. |
🤖 AI Agent: test-generator — `agent-mesh/src/agentmesh/governance/trace_model.py`
|
PR Review Summary
Verdict: AI review comments are untrusted advisory output. The summary reports workflow-generated completion status only, not model-authored pass/fail claims. |
|
🟡 Contributor Check: MEDIUM
Automated check by AGT Contributor Check. |
There was a problem hiding this comment.
Pull request overview
TL;DR: 0 blockers, 1 warning (docs reference/formatting). Fine as a follow-up.
| # | Sev | Issue | Where |
|---|---|---|---|
| 1 | Warn | ADR references/heading formatting drift from stated upstream versions | docs/adr/0032-...md |
Updates AGT’s TRACE Trust Record emission to use the corrected TRACE v0.2 eat_profile tag URI, aligning emitted records and tests with the spec cutover described in ADR-0032.
Changes:
- Update emitted
eat_profileconstant totag:agentrust-io.com,2026:trace-v0.2. - Update unit tests asserting the emitted
eat_profile. - Amend ADR-0032 with rationale for the URI correction while preserving the original decision text.
Reviewed changes
Copilot reviewed 5 out of 5 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
docs/adr/0032-agt-emits-trace-v01-trust-records.md |
Adds an amendment explaining the v0.2 profile URI cutover and rationale. |
agent-governance-python/agent-mesh/src/agentmesh/governance/trace_sink.py |
Updates the emitted trust record eat_profile value. |
agent-governance-python/agent-mesh/src/agentmesh/governance/trace_model.py |
Updates the model config default eat_profile value. |
agent-governance-python/agent-mesh/tests/governance/test_trace_sink.py |
Updates sink/emission tests to assert the new profile URI. |
agent-governance-python/agent-mesh/tests/governance/test_trace_model.py |
Updates model mapping test to assert the new profile URI. |
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 5 out of 5 changed files in this pull request and generated 1 comment.
Comments suppressed due to low confidence (1)
agent-governance-python/agent-mesh/src/agentmesh/governance/trace_sink.py:93
eat_profileis now hardcoded here, but the same URI is also hardcoded as the default inTraceModelConfig(trace_model.py). Having two independent literals for the same protocol identifier makes future cutovers easy to miss and can cause the two TRACE emission paths to diverge. Consider centralizing this into a single constant (or flowing it through config) and referencing it from both places.
record: dict[str, Any] = {
"eat_profile": "tag:agentrust-io.com,2026:trace-v0.2",
"iat": iat,
The emitter change alone failed CI: ValidationError: 1 validation error for TrustRecord eat_profile Both packages pinned agentrust-trace>=0.2.0,<0.3.0, whose TrustRecord Literal still requires the v0.1 profile, so emitting v0.2 could not validate. Pins move to >=0.5.0,<0.6.0. Also records the pin change in the amendment rather than editing the References section, which cites v0.2.0 because that is what the ADR was accepted against. That section is a historical record, not a statement of the current pin. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Imran Siddique <imran.siddique@opaque.co>
1e4869b to
0ce3f3d
Compare
📦 Dependency diff (SBOM)Comparing main → fix/trace-v0.2-profile-uri. ✅ No dependency changes detected. |
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 7 out of 7 changed files in this pull request and generated 1 comment.
Comments suppressed due to low confidence (1)
agent-governance-python/agent-mesh/src/agentmesh/governance/trace_sink.py:93
- The TRACE profile URI is now hard-coded here, while
TraceModelConfig(intrace_model.py) also carries aneat_profiledefault. Keeping the URI literal in multiple places increases drift risk the next time TRACE revises the identifier. Consider centralizing it as a single constant (and reusing it from bothtrace_sink.pyandtrace_model.py, plus tests).
record: dict[str, Any] = {
"eat_profile": "tag:agentrust-io.com,2026:trace-v0.2",
"iat": iat,
MohammadHaroonAbuomar
left a comment
There was a problem hiding this comment.
- The agentrust-trace >=0.5,<0.6 bump breaks CI on every leg: 4 tests in tests/governance/test_trace_sink.py fail with pydantic ValidationError because upstream now requires transparency min_length=1 while AGT still emits "transparency": "" at agent-governance-python/agent-mesh/src/agentmesh/governance/trace_sink.py:120 and trace_model.py:98. Populate transparency with the spec-required value for no-registry emitters; this is what turns ci-complete/docker-compose-test/test(agent-mesh 3.11-3.13) green.
- docs/adr/0032-agt-emits-trace-v01-trust-records.md (amendment): disclose that the 0.2->0.5 library jump also adopts 0.3.0's BREAKING RFC 8785/JCS canonicalization: AGT records signed after this bump are not cross-verifiable with 0.2.0-era verifiers. "One constant and its tests" undersells the cutover, and CI falsifies it.
Minor:
- PR body says old records verify against agentrust-trace-tests 0.3.x while upstream #107 says agentrust-trace 0.4.x; align for precision. Also FYI: the SBOM-diff bot reported no dependency changes and missed the pyproject range bump, a repo tooling gap worth a separate look.
Review feedback from @MohammadHaroonAbuomar, and he is right. The amendment said the jump "changes nothing else about the record format ... one constant and its tests". That is true of the specification change and false of the library jump. AGT moves agentrust-trace 0.2.0 to 0.5.x, which crosses 0.3.0, whose changelog reads: BREAKING: Canonicalization is now RFC 8785 (JCS). Trust records are NOT cross-verifiable with 0.2.0. So records AGT signs after this bump cannot be verified by a 0.2.0-era verifier: the signature covers a different byte sequence. Disclosed, along with a second consequence he did not mention, that 0.3.0 also stopped self-verifying from the embedded cnf.jwk by default, so anything verifying AGT records by trusting the key inside them needs updating. 0.4.0 is additive only and imposes nothing. Also makes the version references precise. agentrust-trace 0.4.x (the library) and agentrust-trace-tests 0.3.x (the conformance suite) are different packages on different version lines, and citing one of each read as an inconsistency. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Imran Siddique <imran.siddique@opaque.co>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 7 out of 7 changed files in this pull request and generated no new comments.
Comments suppressed due to low confidence (4)
docs/adr/0032-agt-emits-trace-v01-trust-records.md:187
- The amendment says the
transparency=Nonechange requiresagentrust-trace0.5.1+ (line 195), but the dependency bump in this amendment still states>=0.5.0,<0.6.0. This is internally inconsistent and could mislead readers about the minimum compatible version; align the stated range with the minimum actually required.
AGT's `agentrust-trace` dependency moves from `>=0.2.0,<0.3.0` to
`>=0.5.0,<0.6.0`.
agent-governance-python/agent-mesh/pyproject.toml:62
- The ADR amendment states
transparency=Nonerequiresagentrust-trace0.5.1+ (docs/adr/0032-agt-emits-trace-v01-trust-records.md:195-196). With the current lower bound>=0.5.0, installations could select 0.5.0 and fail validation at runtime if that version still requires a non-emptytransparency. Bump the minimum to 0.5.1 to match the documented requirement.
# TRACE Trust Record emission (ADR-0032)
"agentrust-trace>=0.5.0,<0.6.0",
agent-governance-python/agent-governance-toolkit-core/pyproject.toml:54
- The ADR amendment states
transparency=Nonerequiresagentrust-trace0.5.1+ (docs/adr/0032-agt-emits-trace-v01-trust-records.md:195-196). With the current lower bound>=0.5.0, dependency resolution may choose 0.5.0 and break TRACE emission/validation if 0.5.0 still requires a non-emptytransparency. Bump the minimum to 0.5.1 to match the documented requirement.
"python-dateutil>=2.8.0,<3.0",
"jsonschema>=4.0.0,<5.0",
"agentrust-trace>=0.5.0,<0.6.0",
]
agent-governance-python/agent-mesh/src/agentmesh/governance/trace_model.py:103
tool_transcript.call_countis currently derived from onlytool_invocationevents (trace_model.py:83), but ADR-0032 defines it as “total number of entries in the chain” (docs/adr/0032-agt-emits-trace-v01-trust-records.md:61-63) and the TRACE sink implementation/test use the total entry count (trace_sink.py:110-111; test_trace_sink.py:106-113). This inconsistency means the two mappers produce different records for the same audit stream; please aligncall_countsemantics across implementations.
transparency=None,
tool_transcript={"hash": _jcs_hash(entries), "call_count": call_count},
MohammadHaroonAbuomar
left a comment
There was a problem hiding this comment.
- agent-governance-python/agent-mesh/pyproject.toml: the ADR itself says transparency=None requires agentrust-trace 0.5.1+ (trace-spec#109), but both pyprojects still pin >=0.5.0,<0.6.0: a 0.5.0 resolve reintroduces the exact ValidationError this PR fixes. Bump the floor to >=0.5.1 in both.
- agent-governance-python/agent-mesh/src/agentmesh/governance/trace_sink.py:188: stale install hint still says pip install agentrust-trace>=0.2.0.
- PR body: still claims "changes nothing else about the record format ... one constant and its tests", falsified by the branch's own transparency change; refresh.
Minor:
- the ADR disclosure is done and high quality, the transparency emitter fix landed at both sites and the agent-mesh legs are green; approve once the floor bump lands and the pending checks (docker-compose-test etc.) complete green.
|
MohammadHaroonAbuomar all three of your points are addressed and CI is fully green: 91 successes, no failures, no pending. 1. 2. The 0.3.0 canonicalization break. You were right and I was wrong. "One constant and its tests" was accurate about the specification change and false about the library jump. The ADR amendment now discloses that 0.2.0 to 0.5.x crosses 0.3.0's BREAKING move to RFC 8785 (JCS), so records AGT signs after this bump are not cross-verifiable with 0.2.0-era verifiers, since the signature covers a different byte sequence. I added a second consequence you did not mention: 0.3.0 also stopped self-verifying from the embedded 3. Version references. These were two different packages rather than an inconsistency: the library 4. SBOM-diff bot missing the pyproject range bump. Agreed that is a repo tooling gap and worth its own issue rather than riding along here. Any chance you could take a look and merge before the MCP Release Party today? I cannot self-merge here. Happy to keep iterating if anything above does not sit right, and no rush intended if today does not work. |
Review feedback from @MohammadHaroonAbuomar and Copilot, all of it fair. The EAT profile URI was duplicated between trace_model.py and trace_sink.py, and this PR had to edit six literals to move it, which is the drift cost demonstrated rather than argued. It is now TRACE_EAT_PROFILE in trace_model.py, imported by trace_sink.py. The tests keep asserting the literal string on purpose: a test comparing against the constant would pass even if the constant were changed wrongly, and this is a wire-format value. The ImportError guidance still told users to install agentrust-trace>=0.2.0, which after the pin bump points at a version that cannot satisfy the dependency and produces a confusing second failure. It now names the real range. Two ADR points: The amendment heading used a double-spaced separator. I had believed that was house style, but it is the convention in agent-manifest, not here; in this repo it was the only heading of its kind, so Copilot was right and it is normalized. The References entry citing agentrust-trace v0.2.0 stays, because that is what this ADR was accepted against and rewriting it would claim otherwise. Annotated instead, so a reader is not sent to an uninstallable version, and pointed at the amendment for what changed in between. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Imran Siddique <imran.siddique@opaque.co>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 7 out of 7 changed files in this pull request and generated no new comments.
Comments suppressed due to low confidence (8)
docs/adr/0032-agt-emits-trace-v01-trust-records.md:191
- The amendment says the dependency moves to
>=0.5.0,<0.6.0, but later in the same amendment it says 0.5.1+ is required. Update this minimum version so the amendment is internally consistent.
AGT's `agentrust-trace` dependency moves from `>=0.2.0,<0.3.0` to
`>=0.5.0,<0.6.0`.
agent-governance-python/agent-mesh/tests/governance/test_trace_sink.py:176
- Since this PR changes emitted records to use
transparency=None, it would be good for the integration-style emit test to assert the serialized JSON containsnullfortransparency(not an empty string). This protects the on-disk wire output from silently drifting.
def test_emit_file_is_valid_trust_record(self, tmp_path):
log = _make_audit_log()
cfg = TraceConfig(str(tmp_path) + "/")
sink = TRACEAuditSink(cfg, _AGENT_DID, _policy_hash(_POLICY_YAML))
path = sink.emit(log)
data = json.loads(Path(path).read_text())
assert data["eat_profile"] == "tag:agentrust-io.com,2026:trace-v0.2"
assert data["subject"] == _AGENT_DID
docs/adr/0032-agt-emits-trace-v01-trust-records.md:149
- The earlier “Implementation” section still says the runtime dependency is
agentrust-trace>=0.2.0(line 97), which is now out of date after this cutover. Please update that bullet too so the ADR doesn’t give two different minimum versions.
## Amendment 2026-07-28: the profile URI moves to TRACE v0.2
**Resolved by:** agentrust-io/trace-spec#107.
The Decision section above specifies `eat_profile` as the constant
`"tag:agentrust.io,2026:trace-v0.1"`. That URI is no longer correct, and it was
never valid.
agent-governance-python/agent-mesh/pyproject.toml:62
- The ADR amendment in this PR states TRACE emission needs
agentrust-trace0.5.1+ (because 0.5.1 relaxed thetransparencyrequirement), but the dev dependency range still allows 0.5.0. If 0.5.0 is installed, TRACE emission/validation may fail at runtime.
# TRACE Trust Record emission (ADR-0032)
"agentrust-trace>=0.5.0,<0.6.0",
agent-governance-python/agent-governance-toolkit-core/pyproject.toml:53
- This package dependency range allows
agentrust-trace0.5.0, but the ADR amendment added in this PR says 0.5.1+ is required for Level 0/1 records withtransparency=None. To avoid installing a version that rejects emitted records, bump the lower bound to 0.5.1.
"python-dateutil>=2.8.0,<3.0",
"jsonschema>=4.0.0,<5.0",
"agentrust-trace>=0.5.0,<0.6.0",
]
agent-governance-python/agent-mesh/src/agentmesh/governance/trace_sink.py:189
- The RuntimeError install hint suggests
agentrust-trace>=0.5.0, but this PR also changes emitted records to usetransparency=Noneand the ADR amendment says that requires 0.5.1+. Suggest updating the hint so users don't install a version that may reject emitted records.
raise RuntimeError(
"agentrust-trace is required for TRACE emission. "
"Install it with: pip install 'agentrust-trace>=0.5.0,<0.6.0'"
) from exc
docs/adr/0032-agt-emits-trace-v01-trust-records.md:139
- This paragraph says the current pin is
>=0.5.0,<0.6.0, but a few lines later the amendment states TRACE emission needsagentrust-trace0.5.1+. These should be consistent to avoid readers installing an incompatible minimum version.
This issue also appears on line 190 of the same file.
That is the version this ADR was accepted against, kept as the historical record.
Do not install it: the current pin is `>=0.5.0,<0.6.0`, and the 2026-07-28
amendment below explains what changed in between, including a breaking
canonicalization change.
agent-governance-python/agent-mesh/tests/governance/test_trace_sink.py:75
- TRACE emission now sets
transparencyto None (null in JSON). The updated tests only assert the neweat_profile, so they won’t catch a regression back to the empty-string value described in ADR-0032. Add an explicit assertion here to lock in the new behavior.
This issue also appears on line 168 of the same file.
def test_eat_profile_sentinel(self):
log = _make_audit_log()
record = session_to_trust_record(
_AGENT_DID, log, _policy_hash(_POLICY_YAML), TraceConfig("./out/")
)
assert record["eat_profile"] == "tag:agentrust-io.com,2026:trace-v0.2"
|
All five inline comments addressed in Profile URI hoisted into one constant (MohammadHaroonAbuomar and Copilot both raised this). One deliberate exception: the tests still assert the literal string rather than importing the constant. A test comparing against the constant would pass even if the constant were changed wrongly, and for a wire-format value that is the one place a hardcoded copy earns its keep. Stale install guidance fixed. Amendment heading normalized. Copilot flagged the double-spaced separator as a typo. I initially thought it was house style and reverted an autofix that changed it, which was my error: that convention is in References entry to The SBOM-diff bot gap you noted is untouched here and worth its own issue. Still hoping to land this before the MCP Release Party if you get a window. Everything is green and I cannot self-merge. |
MohammadHaroonAbuomar
left a comment
There was a problem hiding this comment.
Minor:
- the constant hoist and install-guidance rewrite landed, and CI is now settled green; this is the last blocking item.
@MohammadHaroonAbuomar caught a floor that admits a broken version. Both pyprojects pinned >=0.5.0,<0.6.0 while the ADR states transparency=None needs 0.5.1 or later. 0.5.0 still required a non-empty transparency, so any resolve landing on it rejects the None this PR emits and reproduces the exact ValidationError the PR exists to fix. CI passed only because it happened to install the latest. Verified rather than assumed: installed 0.5.0 in a clean venv and model_validate rejects transparency=None; 0.5.1 accepts it. Floors raised in agent-mesh and agent-governance-toolkit-core, and in the runtime install hint at trace_sink.py:189, which quoted the same too-low range. The ADR's two statements of the pin move with them and now say why the floor is 0.5.1, so the next person does not relax it back. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Imran Siddique <imran.siddique@opaque.co>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 7 out of 7 changed files in this pull request and generated no new comments.
Comments suppressed due to low confidence (2)
agent-governance-python/agent-mesh/src/agentmesh/governance/trace_model.py:17
- The module doc comment says the “single source of truth” is
trace_sink.py, butTRACE_EAT_PROFILEis defined here and imported bytrace_sink.py(and used as the default forTraceModelConfig). This is backwards/misleading for future maintainers.
#: TRACE EAT profile URI emitted by AGT. Single source of truth: trace_sink.py
#: imports this rather than repeating the literal, because a wire-format constant
#: duplicated across modules drifts one call site at a time. See ADR-0032 and its
#: 2026-07-28 amendment for why the v0.1 URI was replaced.
agent-governance-python/agent-mesh/src/agentmesh/governance/trace_sink.py:125
- The PR description states AGT’s change is “one constant and its tests” because TRACE v0.2 “changes nothing else”, but this hunk also changes the emitted record content (
transparencyfrom "" to null/None). That’s an observable wire-format change for AGT emitters/consumers and should be explicitly called out in the PR title/description (or reverted if truly out of scope).
# None, not "": this sink does not anchor to a transparency log, so there
# is no receipt URI. An empty string looks populated and resolves to
# nothing. Conformance requires this at Level 2 only, where TR-ANC runs.
"transparency": None,
}
|
Good catch, and it was a real defect rather than a nit. Fixed in You were right that a 0.5.0 resolve reintroduces the exact failure. I verified it rather than taking it on faith, installing each version in a clean venv: So the floor was admitting a version that cannot run this code. CI passed only because it happened to resolve the latest, which is exactly the kind of green that hides a broken constraint from anyone installing later. Raised to I also moved the ADR's two statements of the pin, since one of them still said That should be everything. Ready when you are, and still hoping for the party window. |
There was a problem hiding this comment.
Review details
Comments suppressed due to low confidence (1)
agent-governance-python/agent-mesh/src/agentmesh/governance/trace_sink.py:190
- The pip install command in the RuntimeError uses single quotes. That works in POSIX shells/PowerShell, but not in Windows cmd.exe where single quotes are treated literally, leading to install failures if users copy/paste the message. Prefer double quotes for cross-shell compatibility (the quotes are still needed to prevent
</>redirection in POSIX shells).
raise RuntimeError(
"agentrust-trace is required for TRACE emission. "
"Install it with: pip install 'agentrust-trace>=0.5.1,<0.6.0'"
) from exc
- Files reviewed: 7/7 changed files
- Comments generated: 0 new
- Review effort level: Low
* fix(trace): emit the TRACE v0.2 profile URI AGT emitted tag:agentrust.io,2026:trace-v0.1. RFC 4151 permits a tag URI only where the minting authority controlled the named domain on the date in the URI, and agentrust.io was never controlled by the TRACE project; it resolves to third-party parked addresses. The identifier asserted authority over a name belonging to someone else. TRACE v0.2 corrects it to tag:agentrust-io.com,2026:trace-v0.2 and changes nothing else about the record format, so this is one constant plus its tests. ADR-0032 gets an amendment rather than an edit, per the ADR immutability convention: the original Decision text and the v01 file name stay. Records AGT has already emitted remain verifiable as v0.1 records against agentrust-trace-tests 0.3.x, which stays published. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Imran Siddique <imran.siddique@opaque.co> * fix(deps): bump agentrust-trace to the v0.2-profile release The emitter change alone failed CI: ValidationError: 1 validation error for TrustRecord eat_profile Both packages pinned agentrust-trace>=0.2.0,<0.3.0, whose TrustRecord Literal still requires the v0.1 profile, so emitting v0.2 could not validate. Pins move to >=0.5.0,<0.6.0. Also records the pin change in the amendment rather than editing the References section, which cites v0.2.0 because that is what the ADR was accepted against. That section is a historical record, not a statement of the current pin. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Imran Siddique <imran.siddique@opaque.co> * fix(trace): emit transparency as None when unanchored Both emitters hardcoded transparency="". agentrust-trace 0.5.0 rejects it, so every TRACE record raised ValidationError and the agent-mesh and docker-compose suites failed. ADR-0032 chose the empty string for Phase 1 because SCITT anchoring is out of scope there. None is the honest form of that same choice: a Level 0 or Level 1 record has no receipt URI to name, and an empty string looks populated while resolving to nothing. Conformance requires transparency at Level 2 only, where TR-ANC runs, so a Phase 1 record stays conformant at the level it claims. The library was also stricter than the spec's own schema and conformance suite; that is fixed in agentrust-trace 0.5.1 (agentrust-io/trace-spec#109), which this branch's pin already admits. Two emitters, not one: trace_model.py and trace_sink.py both built the field, and only running the tests surfaced the second. Also moves the two verifier.agentrust.io test fixtures to agentrust-io.com, which is the same wrong-domain correction as the profile URI in this branch. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Imran Siddique <imran.siddique@opaque.co> * docs(adr): disclose the canonicalization break in the library jump Review feedback from @MohammadHaroonAbuomar, and he is right. The amendment said the jump "changes nothing else about the record format ... one constant and its tests". That is true of the specification change and false of the library jump. AGT moves agentrust-trace 0.2.0 to 0.5.x, which crosses 0.3.0, whose changelog reads: BREAKING: Canonicalization is now RFC 8785 (JCS). Trust records are NOT cross-verifiable with 0.2.0. So records AGT signs after this bump cannot be verified by a 0.2.0-era verifier: the signature covers a different byte sequence. Disclosed, along with a second consequence he did not mention, that 0.3.0 also stopped self-verifying from the embedded cnf.jwk by default, so anything verifying AGT records by trusting the key inside them needs updating. 0.4.0 is additive only and imposes nothing. Also makes the version references precise. agentrust-trace 0.4.x (the library) and agentrust-trace-tests 0.3.x (the conformance suite) are different packages on different version lines, and citing one of each read as an inconsistency. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Imran Siddique <imran.siddique@opaque.co> * refactor(trace): hoist the profile URI; correct stale install guidance Review feedback from @MohammadHaroonAbuomar and Copilot, all of it fair. The EAT profile URI was duplicated between trace_model.py and trace_sink.py, and this PR had to edit six literals to move it, which is the drift cost demonstrated rather than argued. It is now TRACE_EAT_PROFILE in trace_model.py, imported by trace_sink.py. The tests keep asserting the literal string on purpose: a test comparing against the constant would pass even if the constant were changed wrongly, and this is a wire-format value. The ImportError guidance still told users to install agentrust-trace>=0.2.0, which after the pin bump points at a version that cannot satisfy the dependency and produces a confusing second failure. It now names the real range. Two ADR points: The amendment heading used a double-spaced separator. I had believed that was house style, but it is the convention in agent-manifest, not here; in this repo it was the only heading of its kind, so Copilot was right and it is normalized. The References entry citing agentrust-trace v0.2.0 stays, because that is what this ADR was accepted against and rewriting it would claim otherwise. Annotated instead, so a reader is not sent to an uninstallable version, and pointed at the amendment for what changed in between. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Imran Siddique <imran.siddique@opaque.co> * fix(deps): raise the agentrust-trace floor to 0.5.1 @MohammadHaroonAbuomar caught a floor that admits a broken version. Both pyprojects pinned >=0.5.0,<0.6.0 while the ADR states transparency=None needs 0.5.1 or later. 0.5.0 still required a non-empty transparency, so any resolve landing on it rejects the None this PR emits and reproduces the exact ValidationError the PR exists to fix. CI passed only because it happened to install the latest. Verified rather than assumed: installed 0.5.0 in a clean venv and model_validate rejects transparency=None; 0.5.1 accepts it. Floors raised in agent-mesh and agent-governance-toolkit-core, and in the runtime install hint at trace_sink.py:189, which quoted the same too-low range. The ADR's two statements of the pin move with them and now say why the floor is 0.5.1, so the next person does not relax it back. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Imran Siddique <imran.siddique@opaque.co> --------- Signed-off-by: Imran Siddique <imran.siddique@opaque.co> Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: SemTiOne <emphyst80@gmail.com>
AGT emits
tag:agentrust.io,2026:trace-v0.1as itseat_profileconstant. That identifier was never valid.RFC 4151 permits a tag URI only where the minting authority controlled the named domain on the date in the URI.
agentrust.iowas never controlled by the TRACE project; it resolves to third-party parked addresses. So the identifier asserted authority over a name belonging to someone else, who could publish a conflicting definition at it at any time.TRACE v0.2 corrects it to
tag:agentrust-io.com,2026:trace-v0.2and changes nothing else about the record format. No field added, removed, or re-typed, so AGT's side is one constant and its tests.Upstream: agentrust-io/trace-spec#107, released as
agentrust-trace0.5.0 andagentrust-trace-tests0.4.0.Cutover, not a transition window
A v0.2 verifier requires the new URI and rejects the old one. A verifier accepting both would keep the invalid identifier live indefinitely, which is the thing being corrected.
Records AGT has already emitted do not become invalid retroactively: they are v0.1 records and remain verifiable against
agentrust-trace-tests0.3.x, which stays published.ADR-0032
Amended rather than edited, per the ADR immutability convention in this repo. The original Decision text stays, and the file name keeps
v01, with an amendment section recording why the constant changed. Same pattern as the existing amendments on ADR-0006.Note
I have push and triage on this repo but cannot self-merge, so this needs a maintainer. Commit is DCO signed off.