Skip to content

specs: publish the layered ANS specification#24

Open
scourtney-godaddy wants to merge 4 commits into
mainfrom
layered-specs
Open

specs: publish the layered ANS specification#24
scourtney-godaddy wants to merge 4 commits into
mainfrom
layered-specs

Conversation

@scourtney-godaddy

Copy link
Copy Markdown
Contributor

Summary

Publishes the layered ANS specification under spec/ and replaces DESIGN.md with a thin pointer.

What lands

  • spec/ans-0-identity-anchor.md: Identity anchor, IdentityClaim, AnchorResolver, FQDN/DID/LEI profiles.
  • spec/ans-1-registration.md: Registration aggregate, lifecycle, event set, Trust Card.
  • spec/ans-2-versioned-naming.md: ANSName URI form, Identity Certificate URI SAN binding, PriCC, Stable Aliases, mTLS.
  • spec/ans-3-dns-publication.md: DNS publication, record styles, DANE, anchor-conditional emission.
  • spec/ans-4-transparency.md: SCITT statements and receipts, Transparency Log, witness profiles.
  • spec/ans-5-integrity-monitoring.md: Verification worker, integrity reporting.
  • spec/examples/ans-1-examples.md: Worked registration request and event-payload examples.
  • README.md: points at the layered specs.
  • DESIGN.md: replaced with a pointer to spec/ and to draft-narajala-courtney-ansv2.

Companion documents unchanged

TRUST_INDEX_SPEC.md, MAESTRO.md, SENDER_VERIFICATION_SPEC.md, CONTRIBUTING.md, CODE_OF_CONDUCT.md, SECURITY.md, LICENSE, and pki/ remain as-is.

Authoritative source

The layered specs are maintained in the upstream registry repository and mirrored to this public repository. Future spec changes land upstream first, then mirror here.

Adds spec/ans-{0-5}-*.md plus spec/examples/ans-1-examples.md.
Updates README.md to point at the layered specs. Replaces DESIGN.md
with a thin pointer to spec/ and to the IETF draft.

TRUST_INDEX_SPEC.md, MAESTRO.md, SENDER_VERIFICATION_SPEC.md,
CONTRIBUTING.md, CODE_OF_CONDUCT.md, SECURITY.md, LICENSE, and pki/
are unchanged.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR publishes the layered ANS specification under spec/ (ANS-0 through ANS-5), adds a worked examples document for ANS-1, and replaces the previous long-form DESIGN.md with a short pointer to the new layered specs (plus the related IETF draft).

Changes:

  • Add six new spec documents under spec/ covering identity anchors, registration/lifecycle, versioned naming, DNS publication, transparency, and integrity monitoring.
  • Add non-normative worked examples for ANS-1 under spec/examples/.
  • Update README.md and replace DESIGN.md with links into the layered spec set.

Reviewed changes

Copilot reviewed 8 out of 9 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
spec/ans-0-identity-anchor.md Adds the ANS-0 identity anchor spec (IdentityClaim, AnchorResolver, profiles).
spec/ans-1-registration.md Adds the ANS-1 registration & lifecycle spec (aggregate, state machine, events, Trust Card).
spec/ans-2-versioned-naming.md Adds the ANS-2 versioned naming spec (ANSName, identity cert, PriCC, mTLS, aliases).
spec/ans-3-dns-publication.md Adds the ANS-3 DNS publication spec (SVCB/TXT styles, TLSA, emission rules).
spec/ans-4-transparency.md Adds the ANS-4 transparency spec (SCITT statements/receipts, witness profiles, API).
spec/ans-5-integrity-monitoring.md Adds the ANS-5 integrity monitoring spec (verification worker, check set, reporting).
spec/examples/ans-1-examples.md Provides non-normative JSON payload examples for ANS-1.
README.md Updates docs entrypoint to point at layered specs under spec/.
DESIGN.md Replaces prior long-form design doc with a pointer to spec/ and the IETF draft.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread spec/ans-1-registration.md Outdated
Comment thread spec/ans-5-integrity-monitoring.md Outdated
Comment thread spec/ans-5-integrity-monitoring.md Outdated
Comment thread spec/ans-4-transparency.md Outdated
@scourtney-godaddy

Copy link
Copy Markdown
Contributor Author

/copilot review

scourtney-godaddy and others added 2 commits June 4, 2026 15:00
- ans-1 §7.3 anchor link fixed (ANS-3 §6.2 now Status: Active).
- ans-5 §8 dropped reference to non-existent operating-cadence section.
- ans-4 and ans-5 Worked Examples appendices added with relative-path
  pointers; ans-4-examples.md and ans-5-examples.md added under
  spec/examples/.
- ans-1-examples §A.1, §A.2 realigned to the flat ANS-1 §6.1 event
  shape with claim sub-block (anchorType, resolvedId, publicKey,
  issuedAt). Replaces the prior nested 'agent' wrapper.
- ans-4-examples §A.3 revocation event realigned to the same flat
  shape.
- Vectors-planned conformance lines dropped from ans-0 §5,
  ans-3 §9, ans-4 §9, ans-5 §8.
- Worked-examples pointer in ans-1-registration §B uses relative path.
… lint

Field/format alignment of the layered specs (spec/ans-0..5 + examples) to the
authoritative API contracts, ahead of the reference implementation:

- RA request & Trust Card fields use the V1 RA names: agentDisplayName,
  agentDescription, version, identityCsrPEM, serverCsrPEM, metaDataUrl, and the
  new metaDataHash (SHA256:-prefixed).
- TL event / badge / envelope examples use the V2 TL response format: ansId
  (distinct from the RA agentId by design), nested agent{host,name,version,
  providerId}, identityCerts[]/serverCerts[] arrays, dnsRecordsProvisioned[]
  objects, merkleProof, schemaVersion "V2", status {ACTIVE,REVOKED,DEPRECATED}.
- SHA256: hash prefixes throughout; PENDING -> PENDING_VALIDATION lifecycle;
  ansId identifier row added.
- ANS-5 schema-integrity check keyed off metaDataUrl + the TL metadataHashes map.
- Add .github/linters/.markdown-lint.yml and clear markdownlint issues repo-wide
  (table-delimiter padding, fence languages, heading levels, bare URL/email
  wrapping, list indentation).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

The AHP submits a registration request. The payload structure mirrors `RegisterInput` defined above plus a few fields the RA derives or fills in:

| Group | Field | Required | Description |

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Instead of giving these in a table, is there a json schema or CDDL that shows describes the input? ideally linking to the actual schema file so that someone can just import it and run with it.

Comment thread spec/ans-1-registration.md Outdated

## 3. The `RegistrationService` interface

The `RegistrationService` interface is the protocol contract for ANS-1; conformant implementations expose `register`, `verifyACME`, `getRegistration`, and the lifecycle event surface. ANS-1 carries the `LifecycleStatus` enum (`PENDING`, `PENDING_DNS`, `ACTIVE`, `DEPRECATED`, `REVOKED`, `EXPIRED`) and the registration fields `description`, `serverCsr`, `serverCertificatePEM`, and `echConfigList` on `RegisterInput`.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

instead of giving this in words, i think it would be clearly to just reference the json schema or openapi spec that describes what the interface needs to adhere to to be compliant.

| **On-chain (optional cross-anchor signal)** | `onChainId`, `ensName` | No | Persistent ledger identifiers, verified post-activation by ANS-5 |
| **Discovery (optional)** | `ansUrn` | No | URN alias for Agent Finder catalog entries (e.g., `urn:acme:agent:support`); not an identity anchor |

When `trustCardContent` is provided, the RA hashes it (SHA-256 over JCS-canonical bytes per ANS-4 §canonicalization) and seals the hash into the TL at activation. When omitted and the AHP hosts a Trust Card, ANS-5 computes the baseline hash on first successful fetch.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Are there steps somewhere that spells this out this process?

- The skill registration sub-profile, where artifacts register as catalog entries under a parent agent.
- Capability token discipline for ANS-registered agents issuing verifiable credentials to verifiers.

ANS-1 is **anchor-agnostic**: it reads identity through `IdentityClaim` only and never branches on the anchor type. A `RegistrationService` composes with any ANS-0 profile by configuration alone.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

is this relevant to mention for implementors?

Comment on lines +13 to +20
- The `RegistrationService` code-interface contract: register, verify-acme, verify-dns, deprecate, revoke.
- The registration aggregate's data shape and identifier set.
- The lifecycle state machine (PENDING → PENDING_DNS → ACTIVE → DEPRECATED → REVOKED, plus EXPIRED).
- The event set the RA emits to the Transparency Log (ANS-4) and event stream consumers.
- The cross-anchor `EquivalenceLink` event shape.
- Base-only registration handling, including the special-case rules around verification and uniqueness.
- The skill registration sub-profile, where artifacts register as catalog entries under a parent agent.
- Capability token discipline for ANS-registered agents issuing verifiable credentials to verifiers.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

i'm not sure if these points really add clarity, can it be just a 1-liner scope? Starting with all of these just confuses the reader before they really understand the purpose of the RA and it references other material, the cognitive load here is high..


### 12.2 Unstable payload fields

Some payload fields (`onChainId`, `ensName`, `ansUrn`) are advisory metadata at registration and verified post-activation by ANS-5. ANS-1 stores them but does not gate registration on their validity; an attacker who lies about an unrelated `onChainId` cannot prevent registration but produces a verification failure once ANS-5 catches up.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

this sounds like i can store whatever i want in a onChainId? i the the api schema would take care of this clarity and the words aren't really needed..

| Anchor expires (FQDN domain expires; LEI lapses to inactive; DID document removed) | Endpoint unreachable; subsequent re-validation fails | RA treats the anchor-proof failure as a security event and MUST emit `AGENT_REVOKED` |
| TL unavailable | New registrations queue; in-flight registrations retain `PENDING` status | RA MUST NOT activate without a sealed event (step (d) is the point of no return) |

## Appendix A: Trust Card and metadata (normative)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

i would carefully consider what is relevant in the appendix and what is superfluous and can be removed.


Conformant ANS-1 implementations MUST gate identity-cert issuance on the presence of an Identity CSR, not unconditionally on lifecycle entry. An implementation that requires a pending Identity CSR for every `verifyACME` call rejects all base-only DID and LEI registrations and is non-conformant.

### 4.4 The state machine

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

this helps


### 4.2 Stage 2 — activation

Activation requires four validations (all MUST pass):

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

probably a sequence or activity diagram would clarify this

| (a) Certificate issuance | RA obtains the Server Certificate from a Public CA (if CSR) or validates the BYOC certificate. **Conditional on `versionSelector` being present**, the RA also obtains the Identity Certificate from the Private CA per [ANS-2 §3](ans-2-versioned-naming.md). For base-only registrations, the Identity Certificate branch does not run |
| (b) DNS record generation | RA generates record set content per [ANS-3 §3](ans-3-dns-publication.md) |
| (c) Event payload | RA hashes Trust Card content (if submitted) and assembles the event payload |
| (d) Log sealing | RA submits signed event to ANS-4 TL. Point of no return |

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

i'm not sure what "log sealing" means in this context.

specs: align layered ANS specs with RA v1 / TL V2 contracts; markdown…
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.

4 participants