Cadora · design spec
Everything needed to render or extend the proof pack — the exact tokens, the verify verdict's anatomy, what the pack contains, the checksums line format, and every verdict state. The rendered components are live HTML; edit them here or lift the specs into Figma.
Semantic first · green proves, red warns, amber asks for a second look
--scr-green · #16c784Verified · hashes OK · VALID--scr-red · #fb7185Tampered · mismatch · INVALID--scr-amber · #ffd08aUnsigned · confirm fingerprint--scr-blue · #6ba5f0Paths · directories--scr-bg · #0f172aCard ground--scr-canvas · #111c2fInset · state cards--scr-panel2 · #162237Raised surface--scr-line · #334158Borders--scr-text · #f5f7fbPrimary · run id · path--scr-muted · #9aa8bcLabels · captionsMonospace is the instrument voice — the pack is read at the shell
| Role | Family | Size / weight | Notes |
|---|---|---|---|
| Verdict line | mono | 12.5px / 400 | The three lines of cadora verify |
| Bottom line | mono | 12.5px / 700 | => VERIFIED green · => NOT VERIFIED red |
| Hash | mono | green | 64 hex chars; truncate with … only in dense views |
| Path | mono | text | Relative to the run dir — the cwd for shasum -c |
| Fingerprint | mono | amber | SHA256: + base64; amber until confirmed out of band |
| Metric | Value | Metric | Value |
|---|---|---|---|
| Card radius | 10px | Semantic accent | 4px left border |
| Verdict line-height | 1.85 | Tree line-height | 1.85 |
| Card padding | 14px 16px | State padding | 11px 13px |
| Checksums separator | two spaces | Signature namespace | cadora-evidence |
The one component a recipient reads to trust the pack
Verified · hashes hold, signature checks out
Tampered · one hash no longer matches
Green and red are the same component with one token swapped — the left accent and the marks (✓ / ✗). A single mismatch turns the whole verdict red; there is no partial pass.
What cadora report writes, and what cadora sign adds
The report/ directory is skipped when its own checksums are computed, so the pack never tries to hash itself. The two amber files appear only after signing — an unsigned pack is the same tree without them.
One line per file — the format shasum -c reads
5172112d9749df7211e5b70711830af7d0f4d63d6ea698c73cd5903142d3b410 design/aidlc-docs/aidlc-state.md<64-hex sha-256> · two spaces (highlighted) · <path relative to the run dir>. The two-space separator is exactly what shasum -a 256 -c and sha256sum -c expect, so the same file verifies by hand with no Cadora installed. The last line always hashes report.json.
Every verdict the pack can produce
Verified
Hash mismatch · tampered
Unsigned · checksummed only
Signature invalid
Unsigned still verifies. The hash floor is always-on and independent of the signature: a pack that was never signed is tamper-evident (green verdict) but not attributable — the amber signature line says so. Signing only ever adds a claim; it never weakens the hash check.
Three verbs · report seals, sign attributes, verify judges
| Command | Writes | Effect |
|---|---|---|
| cadora report <run> | report.html · report.json · checksums.txt | Seals the pack. Tamper-evident, not yet signed. |
| cadora sign <run> --key | checksums.txt.sig · signature.json | Adds a detached SSH signature. Now attributable. Builds the pack first if it isn't there. |
| cadora verify <run> | — (reads only) | Recomputes every hash, then checks any signature. Prints the verdict; exit 0 verified, 1 not. |
| Line | Verified (green) | Failed / warned |
|---|---|---|
| hashes | N file(s) OK | MISMATCH: <paths> · <path> (missing) |
| signature | VALID — <signer> · <trust> | INVALID — <reason> · none (checksummed, not signed) |
| bottom line | => VERIFIED | => NOT VERIFIED |
The verdict is evidence, not applause
| Do | Not |
|---|---|
| State the count — 23 file(s) OK | “All good” |
| Name the trust basis — self-attested — confirm … out of band | “Trusted ✓” |
| Show the fingerprint — SHA256:u4yCok… | Hide who signed it |
| Keep the exact glyphs — => VERIFIED / => NOT VERIFIED | “Success!” / “Failed” |