-
Notifications
You must be signed in to change notification settings - Fork 1
docs(aurora): AgencySignature × Layered Actor Identity integration writeup for Amara (2026-04-29) #853
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
docs(aurora): AgencySignature × Layered Actor Identity integration writeup for Amara (2026-04-29) #853
Changes from all commits
d07530c
9246fc8
64d35bb
b9c1d59
e4d4b04
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,241 @@ | ||||||||||||||||||||||||||
| # AgencySignature × Layered Actor Identity — integration writeup | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| **For**: Amara | ||||||||||||||||||||||||||
| **From**: Aaron + Otto (Claude Code coordinator) | ||||||||||||||||||||||||||
| **Date**: 2026-04-29 | ||||||||||||||||||||||||||
| **Status**: research-grade only; not operational; not absorbed into doctrine yet | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| --- | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| ## TL;DR | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| Five reviewers (Deepseek / Gemini / Ani / Alexa / Claude.ai) flagged the same gap on the v3 public-intake design: `actor_id` strings are spoofable. *"Identity needs binding."* Your v4 synthesis names this and reorders rollout: identity → capabilities → claims → reconciler → public intake → dry run. | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| The integration question Aaron raised: **does this need to be built from scratch, or does it compose with the AgencySignature work we already shipped?** | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| Short answer: **it composes cleanly.** AgencySignature v1 (per-commit trailer schema, ferry-7 spec, ferry-9/10/11/12 corrections, tasks #298 + #299 enforcement instruments) is *already the binding mechanism Claude.ai called for.* The v4 actor-identity model is a **structured principal layer** on top of the AgencySignature trailers — not a parallel system. | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
| Short answer: **it composes cleanly.** AgencySignature v1 (per-commit trailer schema, ferry-7 spec, ferry-9/10/11/12 corrections, tasks #298 + #299 enforcement instruments) is *already the binding mechanism Claude.ai called for.* The v4 actor-identity model is a **structured principal layer** on top of the AgencySignature trailers — not a parallel system. | |
| Short answer: **it composes cleanly.** AgencySignature v1 (per-commit trailer schema, ferry-7 spec, ferry-9/12 corrections, tasks #298 + #299 enforcement instruments) is *already the binding mechanism Claude.ai called for.* The v4 actor-identity model is a **structured principal layer** on top of the AgencySignature trailers — not a parallel system. |
Copilot
AI
Apr 29, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As written, Trust-Domain: zeta and Actor: zeta://... both encode the trust domain, which may create ambiguity about which is authoritative if they ever differ. If both are intentionally present (e.g., for indexing/search or legacy parsing), it would help to state the invariant explicitly (e.g., Trust-Domain MUST equal the Actor scheme/authority) and define what happens on mismatch (reject vs ignore one field).
| Future trailer (v2 — during the migration window, keep `Agent:` alongside the new `Actor:` field so the v2 trailer remains a strict field superset for v1-era readers; once all consumers are v2-aware, drop the dual emission): | |
| ```text | |
| Agency-Signature-Version: 2 | |
| Trust-Domain: zeta | |
| Agent: claude-code-coordinator # retained for v1-reader compat during migration | |
| Actor: zeta://aaron-mac/claude-code/coordinator | |
| Future trailer (v2 — during the migration window, keep `Agent:` alongside the new `Actor:` field so the v2 trailer remains a strict field superset for v1-era readers; once all consumers are v2-aware, drop the dual emission. `Trust-Domain:` is retained as an explicit indexing/search field, but it is not independent of `Actor:`: the trust domain encoded by `Actor:` MUST exactly equal `Trust-Domain:`. Verifiers MUST reject the trailer if the two values differ): | |
| ```text | |
| Agency-Signature-Version: 2 | |
| Trust-Domain: zeta # MUST exactly match the trust domain encoded by Actor | |
| Agent: claude-code-coordinator # retained for v1-reader compat during migration | |
| Actor: zeta://aaron-mac/claude-code/coordinator # scheme/authority trust domain MUST equal Trust-Domain; reject on mismatch |
Copilot
AI
Apr 29, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The signature scheme is underspecified, which can lead to verification ambiguity and security gaps (different tools signing/verifying different bytes). Please define (even at a high level) the canonicalization rules: exact byte range being signed (does it include/exclude Signed-By: itself), newline normalization, field ordering, whitespace rules, and encoding for ed25519:... (raw, hex, base64, multibase, etc.). Explicitly stating these rules in the writeup will make the proposed Signed-By: field implementable and interoperable.
Copilot
AI
Apr 29, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As written, Trust-Domain: zeta and Actor: zeta://... both encode the trust domain, which may create ambiguity about which is authoritative if they ever differ. If both are intentionally present (e.g., for indexing/search or legacy parsing), it would help to state the invariant explicitly (e.g., Trust-Domain MUST equal the Actor scheme/authority) and define what happens on mismatch (reject vs ignore one field).
| The `Actor:` field is the path-style principal Claude.ai recommended (SPIFFE / IAM-shaped). The `Trust-Domain:` prefix gives explicit namespace. The `Capabilities:` field is the new primitive (replaces implicit role grants). The `Claim:` field carries the active claim identifier (`claim_id`), which has its own allowlist + freshness invariant. The `Task:` field remains the task / ticket pointer (preserves v1 meaning — Task references the upstream issue / TaskList ID; Claim references the orchestra claim record). `Agent:` is retained during the migration window so the v1 validator continues to accept the trailer set; it can be dropped once all consumers have moved to v2 (per the rollout sequence below). The `Signed-By:` field provides the binding that Claude.ai called out as missing. | |
| The `Actor:` field is the path-style principal Claude.ai recommended (SPIFFE / IAM-shaped) and is the canonical principal identifier. The `Trust-Domain:` field is retained as an explicit namespace / indexing field, but it is not independent: `Trust-Domain:` **MUST** equal the trust-domain component encoded by `Actor:` (for example, `Trust-Domain: zeta` with `Actor: zeta://aaron-mac/claude-code/coordinator`). Any mismatch is an invalid actor assertion and **MUST** be rejected by the validator; validators should not try to guess which field is authoritative. The `Capabilities:` field is the new primitive (replaces implicit role grants). The `Claim:` field carries the active claim identifier (`claim_id`), which has its own allowlist + freshness invariant. The `Task:` field remains the task / ticket pointer (preserves v1 meaning — Task references the upstream issue / TaskList ID; Claim references the orchestra claim record). `Agent:` is retained during the migration window so the v1 validator continues to accept the trailer set; it can be dropped once all consumers have moved to v2 (per the rollout sequence below). The `Signed-By:` field provides the binding that Claude.ai called out as missing. |
Copilot
AI
Apr 29, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The signature scheme is underspecified, which can lead to verification ambiguity and security gaps (different tools signing/verifying different bytes). Please define (even at a high level) the canonicalization rules: exact byte range being signed (does it include/exclude Signed-By: itself), newline normalization, field ordering, whitespace rules, and encoding for ed25519:... (raw, hex, base64, multibase, etc.). Explicitly stating these rules in the writeup will make the proposed Signed-By: field implementable and interoperable.
Copilot
AI
Apr 29, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The writeup cites “ferry-9/10/11/12 corrections” but the referenced research-doc list only includes ferry-9 and ferry-12 (plus rule-7 and the Gemini doc). To avoid confusing the reader (especially since this is meant to be pasted to Amara), either (a) add the missing ferry-10/11 references to the list, or (b) remove “10/11” from the earlier summary so the citations match what’s actually linked.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Correct capitalization of “Deepseek” to “DeepSeek” (proper noun).