Generated from HELIX docs. Source:docs/helix/02-design/claim-system.md. Edit the source, not this file orsite/HTML.
Source frontmatter
ddx:
id: aibadge.design.claim-system
type: solution-design
links:
- target: aibadge.prd
kind: informed_by
- target: aibadge.design.attestation-prior-art
kind: informed_by
- target: aibadge.design-system
kind: informed_by
status: draft
activity: 02-design
created: 2026-07-22
Claim System: Colophon, Storage, Signing
Solution-level design for composition declaration and optional attestation. Normative field names here are design intent; freeze in a Contract before implementing the CLI.
Prior art stance: in-toto-shaped subject/predicate; PGP/DKIM-shaped long-lived keys; TOFU key discovery for v1; optional later WoT cross-signs. Details: attestation-prior-art.md.
Goals
| Goal | Source |
|---|---|
| Typed colophon with named tools (Claude, sloptimizer, …) | PRD FR-1–4, FR-4a |
| Sign content hash + bill + issuer | PRD FR-9–12 |
| Docs-friendly storage (no media embed required) | UC-AI-docs |
| Social-safe mark without claim-in-file | UC-human-social |
| Not a detector; edit ≠ human-authored | Principles, FR-4a |
Naming
| Term | Meaning | ||
|---|---|---|---|
| Colophon (colo) | Declared recipe of how the work was made (composition + ingredients); short form colo | ||
| Composition | Coarse state: human-authored \ | mixed \ | model-primary |
| Ingredient | One tool, model, or human role line item | ||
| Claim | JSON document: subjects + colophon + metadata (unsigned or to-be-signed body) | ||
| Attestation | Claim body + signature by an issuer key | ||
| Issuer | Person or house key that signs | ||
| Subject | Content unit identified by digest (and optional URI) | ||
| Seal / mark | Visual Innsigle badge; valid signed or unsigned (see DESIGN.md) | ||
| Maker | Publisher/operator who applies the seal (not human-author-only) | ||
| Sigil | Bounded synonym for the mark as recognition surface; not occult | ||
| Signet | Optional act of cryptographically signing; not always-on chrome |
Avoid public "credentials" for the product object (C2PA collision). Internal type URIs may still say attestation.
Colophon schema (draft v1)
Conceptual model
Colophon
composition: enum
ingredients[]: Ingredient
notes?: string # short free text; not a loophole for hiding models
provenance?: { # optional pointer to session provenance (L2)
kind: "session"
digest: { alg, value }
uri?: string
}
schema_version: "1"
Ingredient
kind: model | tool | human | other
name: string # "Claude", "sloptimizer", "Erik LaBianca"
role?: string # "draft", "edit", "structure", "rewrite"
version?: string # model id or tool version when known
uri?: string # optional link to product/docs
Detailed machine history (prompt counts, skill runs, compact timeline) lives in a session provenance document—see session-provenance.md and FEAT-004. The colo stays short; L2 is optional and linked by digest.
Composition enum
| Value | When to use |
|---|---|
human-authored | Substantive prose/media produced by humans; models not primary authors |
mixed | Material human and model authorship both present |
model-primary | Model(s) produced most of the substantive content; humans may edit/structure |
Rule (FR-4a): Running sloptimizer (or similar) on model output does not by itself change model-primary → human-authored. List sloptimizer as kind: tool, role: rewrite (or similar).
Claim document (unsigned body)
{
"innsigle": "1",
"type": "https://innsigle.dev/claim/colophon/v1",
"issued_at": "2026-07-22T18:00:00Z",
"issuer": {
"id": "azgaard",
"name": "Azgaard",
"key_id": "ed25519:BASE64URL_FINGERPRINT",
"key_url": "https://azgaard.net/.well-known/innsigle/keys.json"
},
"subjects": [
{
"uri": "https://example.com/docs/page/",
"digest": {
"alg": "sha256",
"value": "hex-or-base64url"
}
}
],
"colophon": {
"schema_version": "1",
"composition": "model-primary",
"ingredients": [
{
"kind": "model",
"name": "Claude",
"role": "draft",
"version": null
},
{
"kind": "tool",
"name": "sloptimizer",
"role": "rewrite",
"uri": "https://github.com/easel/easel-skills"
},
{
"kind": "human",
"name": "Erik",
"role": "structure-edit"
}
],
"notes": null
}
}
Aligns with in-toto mentally: subjects ≈ subject digests; colophon ≈ predicate; type ≈ predicateType. v1 may ship this JSON without full DSSE.
Canonical content hashing
| Content | v1 approach |
|---|---|
| Single file | SHA-256 of raw bytes |
| HTML page | SHA-256 of canonical bytes defined by CLI (document exact rules in Contract): prefer raw file as published, or normalized UTF-8 without volatile fields |
| Multi-page site | Per-page claims, or one claim with multiple subjects (release set) |
Open: strip HTML comments / CDN query strings? Prefer: hash the artifact the operator points at; document foot-guns.
Storage mechanisms
Design constraints
- Docs sites: static hosting, no required DB.
- Social: no reliance on platform-preserved metadata.
- Verify: offline possible given claim + content + pubkey.
v1 stores
| Store | What lives there | Channel |
|---|---|---|
| A. Sidecar file | page.innsigle.json next to content or in /.well-known/innsigle/claims/… | Docs |
| B. Embedded link | Footer mark links to claim URL or #innsigle fragment page | Docs |
| C. Inline unsigned bill | Human-readable bill in HTML (optional duplicate of JSON fields) | Docs |
| D. Mark asset only | SVG/PNG + link to profile/colo explainer; no per-post signature | Social |
| E. Key document | keys.json (public keys, key_id, optional revoke) | Discovery |
Not v1 (parked)
| Store | Why park |
|---|---|
| C2PA embed in JPEG/PNG | Social strip; media-first |
| Central claim database | Scope |
| DNS TXT for full claim | Size; use for key selectors later (DKIM-like) |
| Blockchain / always-on transparency log | Optional later (Sigstore Rekor-class) |
Recommended layouts
Docs (signed page):
site/
docs/foo/index.html # footer → seal + link
.well-known/innsigle/
keys.json
claims/docs-foo.json # attestation (claim + sig)
Social:
mark: innsigle-human.svg (or PNG)
bio: https://azgaard.net/innsigle
# no per-tweet claim file required in v1
Signing and attestation
Algorithms (v1 proposal)
| Choice | Proposal | Rationale |
|---|---|---|
| Sign | Ed25519 | Small keys, modern default, wide support |
| Hash | SHA-256 | Universal |
| Key encode | JWK or raw base64url in keys.json | Simple; OpenPGP packets optional later |
ADR to freeze.
Attestation envelope (v1 simple)
{
"payload": { /* claim body as above */ },
"payload_encoding": "json",
"signatures": [
{
"key_id": "ed25519:…",
"alg": "ed25519",
"sig": "base64url",
"signed_at": "2026-07-22T18:00:01Z"
}
]
}
Signed bytes: canonical JSON of payload (rules in Contract: key sort, UTF-8, no insignificant whitespace) or hash of payload then sign hash. Pick one in Contract; prefer sign-over-hash of canonical payload.
Later (P2): DSSE envelope + in-toto statement for cosign/SLSA ecosystem alignment.
Verify algorithm
- Fetch attestation JSON.
- Load issuer key by
key_idfromkey_urlor local pin. - Verify signature over payload (canonical).
- Recompute digest of local/canonical content; match
subjects[].digest. - Report:
valid|bad_signature|content_mismatch|unknown_key|revoked. - Display colophon fields regardless of validity, with clear banner if invalid.
Never report "this is 80% AI."
Key lifecycle (v1)
| Operation | Behavior |
|---|---|
| Generate | CLI creates Ed25519 keypair; private key local file; never log |
| Publish | Public key in keys.json at HTTPS URL |
| Rotate | New key_id; old optional revoked_at; new claims use new key |
| Discover | Absolute HTTPS key_url inside signed claim (ADR-003); fetch issuer document from any durable host (not only self-hosted) |
| Social bootstrap | Issuer card on profiles (fingerprint + keys URL); corroboration only (ADR-003 D7) |
| WoT | Optional key-endorsement attestations listed on issuer document (ADR-003) |
Trust policy (verifier) — ADR-003
| Level | Meaning |
|---|---|
| Crypto valid | Signature + content match; key_url integrity included in signed payload |
| Issuer recognized | Pin of key_id, and/or path of crypto-valid key-endorsements from a pin (transitive WoT) |
| Policy accept | User/org treats that recognized issuer as trusted for this class of content |
SLSA lesson: separate crypto success from policy trust.
Identity fields: issuer.id = non-unique display slug. Cryptographic identity = key_id. Discovery channel = absolute key_url (signed). See ADR-003.
CLI surface (intent only; Contract later)
| Command intent | Result |
|---|---|
colo example / edit | Write colophon fields |
claim build | Bind subjects + colo → claim payload |
sign | Attach signature with local key |
verify | Path or URL to attestation + content |
keygen / key publish-template | Key material + sample keys.json |
Exact flags belong in Contract, not here.
Alignment matrix
| Prior art | Innsigle v1 choice |
|---|---|
| PGP WoT | ADR-003: signed key-endorsements published at issuer URL; transitive path optional |
| DKIM | Steal domain/URL-published pubkey + sig over content |
| in-toto | Steal subject + predicate typing |
| SLSA | Steal provenance ≠ truth; policy separate |
| Sigstore | Optional later keyless/transparency |
| C2PA | Optional export; not primary store |
| SBOM | Steal typed ingredients discipline |
| Sloptimizer | Ingredient tool, not composition flip |
Security notes
- Private keys never in claims or site static files.
key_urlmust be HTTPS in production guidance.- Treat claim
notesas untrusted display text (escape HTML). - Unsigned bills are allowed; UI must not look "more true" than signed ones
without labeling signed/unsigned clearly.
Open questions
- [x] Freeze Ed25519 + canonicalization in ADR → ADR-001 accepted
- [x] Claim/CLI normative surface → CONTRACT-001 (+ JSON Schema)
- [x] Absolute issuer
key_urlin every signature + WoT endorsements → ADR-003 - [ ] Type URI host (
innsigle.devvs azgaard.net path) when domain bought - [ ] Multi-subject release claims for whole site versions (schema allows array)
- [ ] Whether
mixedneeds sub-ratios (human-led vs model-led) - [ ] P2: map ingredients to IPTC digitalSourceType / C2PA assertions
Implementation sequence (suggested)
- ~~Schema JSON Schema + examples~~
- ~~ADR + Contract freeze~~ (ADR-001, CONTRACT-001, ADR-003)
- ~~Keygen + hash + sign + verify CLI~~ (
src/cli.mjs,npm test) - ~~Golden test vectors~~ (
tests/vectors/,tests/vectors.test.mjs) - ~~Docs footer + sample claim~~ (
docs/sample/) - ~~Mark exploration pack~~ (
docs/sample/assets/marks/) - ~~Brand explainer / public site~~ (docs-driven microsite + Pages)
- Feature specs FEAT-001–003 + walkthroughs
- CLI: HTTPS fetch keys + WoT path check; optional in-toto/DSSE export
- Session provenance capture skill +
provenance build/ propose-colo (FEAT-004)