Skip to content

docs(adr): T-057 — the tenant signs what it asserts, the platform attests it - #137

Merged
beyondnetPeru merged 1 commit into
developfrom
docs/adr-t057-signing-identities
Aug 3, 2026
Merged

docs(adr): T-057 — the tenant signs what it asserts, the platform attests it#137
beyondnetPeru merged 1 commit into
developfrom
docs/adr-t057-signing-identities

Conversation

@beyondnetPeru

Copy link
Copy Markdown
Contributor

Records the owner's decision on GT-588 key custody — adopting the proposal for one of the two signing identities, and refusing it for the other.

The proposal, and where it lands

"Each tenant should be responsible for its own signing mechanism, in tenant configuration."

Identity Whose key In tenant config?
Issuer"this tenant approved this gate" The tenant Yes. It is the tenant's own claim. Sits alongside the gate matrix and the artifact overlay — same shape, same reason (T-056).
Transparency Service"this was recorded and not altered" The platform No. A tenant signing its own receipt could rewrite its history and re-sign it.

Per-tenant keys make custody harder, not easier — N keys to store and rotate rather than one. That cost is accepted deliberately: it is what makes each tenant independent.

Why the second one is refused

RFC 9943 puts that authority in a separate entity, and MerkleTransparencyService already carries both as distinct fields with a comment explaining it: a statement and a receipt produced with the same key are "a self-assertion with added ceremony". The signature would still catch an accident — and would stop proving anything to a third party, which is the case that matters here.

The third point, written down because both mistakes are easy

Neither key makes the trail immutable. That is the append-only audit table (MakeAuditEntriesAppendOnly). The signature adds attributable provenance, not immutability — so unsigned-but-append-only is not untrustworthy, and signed-but-mutable is not proof.

Today's state is stated rather than left implicit: until per-tenant issuer keys exist, the platform signs for everyone, which is weaker than this decision.

One thing worth knowing about this repo

The doc inventory derives its decision count from DECISIONS.md, not from the ADR files — so an ADR that is not registered there is invisible to it. --check passed with the file present and unregistered. Registered in both languages; generated blocks regenerated (57 decisions).

🤖 Generated with Claude Code

…ests it

Records the owner's decision on GT-588 key custody, adopting their proposal for
one of the two signing identities and refusing it for the other.

The proposal was that each tenant own its signing mechanism, in tenant
configuration. That is coherent with T-056 and it is adopted for the ISSUER key:
"this tenant approved this gate" is the tenant's own claim, so it is the tenant's
key, alongside the gate matrix and the artifact overlay. Per-tenant keys make
custody HARDER, not easier -- N keys to store and rotate -- and that cost is
accepted deliberately, because it is what makes each tenant independent.

It is refused for the TRANSPARENCY SERVICE key. RFC 9943 puts that authority in a
separate entity, and `MerkleTransparencyService` already carries both as distinct
fields with a comment saying why: a statement and a receipt produced with the
same key are "a self-assertion with added ceremony". A tenant signing its own
receipt could rewrite its history and re-sign it -- the signature would still
catch an accident and would stop proving anything to a third party, which is the
case the owner said matters.

Third point, written down because both mistakes are easy: NEITHER key is what
makes the trail immutable. That is the append-only audit table
(`MakeAuditEntriesAppendOnly`). The signature adds attributable provenance, not
immutability -- so unsigned-but-append-only is not untrustworthy, and
signed-but-mutable is not proof.

Today's state is stated rather than left implicit: until per-tenant issuer keys
exist, the platform signs for everyone, which is weaker than this decision.

Registered in DECISIONS.md/.es.md -- the inventory derives the count from that
registry, not from the ADR files, so an ADR that is not registered there is
invisible to it. The generated blocks were regenerated (57 decisions).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@beyondnetPeru
beyondnetPeru merged commit 7c54a45 into develop Aug 3, 2026
5 checks passed
@beyondnetPeru
beyondnetPeru deleted the docs/adr-t057-signing-identities branch August 3, 2026 22:11
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.

1 participant