Skip to content

Bronze, Silver, and Gold

Ziggurat implements a Medallion pipeline in which each tier has a different writer and a different meaning.

ziggurat ingest decodes inbox Markdown as UTF-8, normalizes CRLF to LF, and stores the canonical text in a Bronze record under bronze/. It is the only Bronze writer and uses atomic no-overwrite creation. SHA-256 verification detects later body mutation; it does not make the filesystem physically immutable or prove that the source was honest.

Fresh captures default to sensitivity: restricted and pii: unknown. The original body is preserved as canonical text, hostile instructions included, because Bronze is evidence and not memory authority. A record whose privacy state is unresolved stays out of the model-readable evidence index.

Bronze records reject unknown frontmatter fields. A record carrying fields outside the documented set is reported by build as a rejected corpus entry and is treated as restricted, PII-unknown, and hash-unverified, so it stays out of every index.

ziggurat refine accepts strict RefinementDraft v1 JSON from a loopback endpoint. The host materializes strict stored Silver v2, validates it against live files, adds local audit metadata, and atomically persists it under .ziggurat/proposals/; the model does not write the file.

The host, not the model, reads Bronze. Each request carries a bounded reference block containing verified records’ canonical bodies as 1-based lines with source IDs, labelled content_role: reference and instruction_authority: none. At most 12 records are included, with at most 32 KiB of canonical Bronze body bytes per source and 256 KiB of combined canonical Bronze body bytes. JSON encoding, metadata, prompts, and optional target context add request bytes and share the separate 1 MiB request ceiling. Oversize records are omitted rather than truncated, because a truncated body would produce citations that fail validation for reasons no operator could diagnose. Every omission is reported with a reason.

The draft names only supplied source IDs and line ranges. The host derives exact quotes, hashes, candidate sources/confidence/schema version, and, for amend or contradict, the base-content hash from the existing page read through --target. The model cannot cite omitted sources, invent canonical hashes, or gain file access by returning a path.

A canonical Silver artifact contains:

  • a complete proposed page body and non-authoritative candidate metadata
  • exact Bronze citations and hashes
  • the operation and, for amend or contradict, the base-content hash
  • structured contradictions
  • confidence, affected paths, related paths, and unresolved questions

Silver candidates cannot contain status, reviewer, receipt, or admission metadata. Targets use lowercase top-level Markdown paths such as knowledge/topic.md, which keeps proposal, contradiction, authorization, and corpus identities identical on case-sensitive and case-insensitive filesystems.

Knowledge drafts are not Silver. Malformed proposal state fails closed.

A page enters the Gold index only when every eligibility check passes together:

  • reviewed status and retrieval eligibility
  • pii: false, an allowed sensitivity, and approved egress
  • current verification age
  • valid, non-empty, hash-verified Bronze lineage
  • no unresolved contradiction proposal
  • a valid detached Ed25519 receipt from a configured key

The deterministic receipt path for knowledge/topic.md is authorizations/topic.md.authorization.json. Stored version-1 Silver proposals and indexes are unsupported and must be restaged or rebuilt. This does not refer to model-facing RefinementDraft v1 or external authorization receipt v1; neither changes the stored v2 formats.

Gold bodies are served with CRLF and lone CR normalized to LF, matching the existing signed canonical representation. This applies to Gold in all three indexes and never rewrites knowledge or Bronze files. Bronze still normalizes CRLF only, preserving lone CR in its hashes and citations.

After updating, run ziggurat build for any vault whose indexed Gold bodies contain lone CR. Their chunk IDs and fingerprints change, so obtain new citations after rebuilding. LF/CRLF-only Gold chunks are unchanged. Live verification still refuses a post-build lone-CR representation change until rebuild; receipts and their signed bytes do not change. See the index compatibility details.

TransitionPerformed byRequires
inbox/ to BronzeingestA real regular file physically under inbox/
Bronze to SilverRefine hostStrict model draft, host materialization, and live validation of canonical citations against stored Bronze text
Silver review to a curated pageRecommended operator workflowIndependent citation review and page authoring; this is not a machine-proven admission prerequisite
Curated page to GoldbuildA valid configured-key receipt plus every eligibility check

There is no shipped Silver-to-knowledge apply transition. A page need not originate from Silver, and running review or committing to Git is not a Gold eligibility rule. Contradiction proposals are no-overwrite artifacts; an eligible page resolves one by listing its ID in the signed page.