Skip to content

fix(lineage): require signed TRACE evidence for authenticated verification - #198

Merged
imran-siddique merged 1 commit into
mainfrom
fix/168-authenticated-lineage
Sep 24, 2026
Merged

imran-siddique merged 1 commit into
mainfrom
fix/168-authenticated-lineage

Conversation

@imran-siddique

Copy link
Copy Markdown
Member

The native verify-dag command reported verified: true for unsigned execution histories, including substitutions whose parent hashes had been recomputed around an unchanged valid credential chain. It now reports structural consistency separately. Authenticated lineage uses the existing signed TRACE path through the new verify-lineage command.

verify-lineage requires a credential chain and independently configured trusted root, verifies that chain before trusting delegate keys, verifies TRACE signatures and signed parent links, then cross-checks each hop against the chain. Native verify-dag success returns verified: false, structural_verified: true, code: UNAUTHENTICATED_LINEAGE, and exit 1. Explicit --structural-only permits exit 0 for diagnostics without changing the authenticity result. Examples, ACTION fixture assertions and migration documentation reflect this intentional CLI compatibility change.

Refs #168. Keep the issue open: this authenticates submitted signed declarations, not task completion, history completeness, uniqueness or continuity of a particular live request. The existing root TRACE record binds its delegate key but carries no credential ID. --at-time controls credential validity/revocation, not the TRACE clock. Unsigned Python helpers keep their structural-only contract and return types. No new signature format or automatic conversion of native records is introduced.

Validation: 747 unit/conformance tests passed, 2 skipped. The new 18-case suite covers valid signed paths, substituted native histories as expected refusals, CLI migration, signatures at every hop, credential mismatch, signed reparenting, untrusted roots and malformed input. Original CLI fails the native-success regression. Removing signature verification produces 3 targeted failures; removing the credential cross-check produces 1. Ruff, format checks, mypy (47 source files), Bandit and diff checks passed. Hardware paths were not exercised.

Please review the acceptance contract and compatibility change independently before merge.

…ucture

Signed-off-by: Imran Siddique <imran.siddique@opaque.co>
@codecov-commenter

Copy link
Copy Markdown

⚠️ Please install the 'codecov app svg image' to ensure uploads and comments are reliably processed by Codecov.

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@Qiang-Xu Qiang-Xu left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good.

@imran-siddique
imran-siddique merged commit 550fba9 into main Sep 24, 2026
16 checks passed
@imran-siddique
imran-siddique deleted the fix/168-authenticated-lineage branch September 24, 2026 05:05
imran-siddique added a commit that referenced this pull request Sep 25, 2026
Bump ca2a-runtime from 0.2.1, which never shipped, to 0.3.0. The minor
bump is for two breaking changes since 0.2.0: offline delegation
verification now requires an explicit trusted root (#132), and verify-dag
exits 1 on unsigned structure unless --structural-only is given (#198).

Close Unreleased into 0.3.0 and add the entries it was missing: #159,
#166/#167, #143, #119, #120. Point the site status line and the two
example READMEs that depend on #132 and #185 at 0.3.0.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants