Download canon/technical.md from PYTHAI/SAVANTE: direct link, hf CLI and curl.
- Browser
- Download file 12.4 kB
-
https://huggingface.co/PYTHAI/SAVANTE/resolve/main/canon/technical.md
- Command line
-
hf download hf://PYTHAI/SAVANTE/canon/technical.md
-
curl -L -o technical.md https://huggingface.co/PYTHAI/SAVANTE/resolve/main/canon/technical.md
technical.md β how Savante runs
The complete mechanics: file formats, harness behavior, the verdict contract as a parseable API, and the wiring for each service mode.
1. Repository layout
.claude/agents/savante.md the charter β canonical, installable
.claude/skills/sagi/SKILL.md the /sagi skill β canonical, installable
savante.md top-level mirror of the charter (readable copy)
sAGI.md the sAGI definition + full skill text
README.md Β· explanation.md Β· technical.md Β· usage.md Β· SAVANTE_AS_A_SERVICE.md
The two .claude/ files are the only functional artifacts. Everything
else is documentation. If the top-level mirrors and the .claude/ files ever
disagree, the .claude/ files win β they are what the harness executes.
2. The agent file format
.claude/agents/savante.md is a Claude Code subagent definition: YAML
frontmatter + markdown body.
---
name: savante # the agent type name used by the Agent tool
description: > # WHEN to delegate β the orchestrator reads this
SAVANTE (SAGI) β chairman-tier strategic oversight ...
tools: Read, Grep, Glob, Bash # tool allowlist β the authority boundary
---
# body = the agent's entire system prompt
Harness behavior that matters:
- Registration: Claude Code scans
.claude/agents/*.md(project) and~/.claude/agents/*.md(user) at session start. A file created mid-session registers for the next session β hence the skill's fallback path. - Tool allowlist:
Read, Grep, Glob, Bashgives Savante full read access plus the ability to run verification (tests, builds,git log, greps). No Edit, no Write, no Agent β read-only oversight is enforced by the harness, not by the prompt. Bash can still mutate in principle; the charter forbids it and the allowlist removes every purpose-built write tool. - Context isolation: the subagent gets its own context window. It can read an entire repository and return only the verdict; the caller's context receives nothing else.
- Model inheritance: no
model:key β Savante runs on whatever model the session runs on (frontier or local). This is deliberate: the doctrine forbids model pinning; the charter must be model-portable.
3. The skill file format
.claude/skills/sagi/SKILL.md: YAML frontmatter (name, description β the
description doubles as the trigger index) + markdown body of instructions the
orchestrator follows when the skill is invoked via /sagi or a trigger
phrase. The body encodes the launch procedure, the fallback (charter-adoption
by a general-purpose agent when savante is unregistered), the verification
mandate ("run the tests... actual results only"), and the relay obligation
(subagent reports are invisible to the user; the orchestrator must restate
the verdict).
4. The verdict contract (parseable API)
Every review returns, in order:
FINDINGS evidence per load-bearing claim (file:line), plus
"not yet known" entries each naming the deciding experiment
VERDICT: APPROVE | APPROVE_WITH_CONDITIONS | REJECT | DEFER
RATIONALE: 2β5 sentences, board-minute style
CONDITIONS: numbered; each independently verifiable
RISKS WATCHED: one or two named risks
Machine consumption: the verdict line is grep-stable β
result=$(claude -p "..." )
echo "$result" | grep -qE '^\*{0,2}VERDICT\*{0,2}: *APPROVE' || exit 1
DEFER is reserved for decisions requiring the operator (Professor /
OVERLORD) signature β treat it as "block and page a human," not as failure.
5. Service-mode wiring
Interactive β /sagi <target> or "have savante review " inside a
Claude Code session. Nothing to wire.
Headless / CI gate β GitHub Actions sketch:
- name: Savante review gate
run: |
out=$(claude -p "Invoke the sagi skill: review the diff of this branch
against main. Print ONLY the verdict block." \
--allowedTools "Read,Grep,Glob,Bash")
echo "$out"
echo "$out" | grep -qE 'VERDICT.*: *APPROVE' # WITH_CONDITIONS also matches APPROVE_
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
Tighten the grep to APPROVE$ if conditions must block. Post CONDITIONS as
PR comments in a follow-up step if desired.
Agent SDK / API endpoint β load the charter body (strip frontmatter) as
the system prompt; run an agentic tool loop restricted to read-only
filesystem tools over the target checkout; require the verdict contract as
output. Load the charter from disk at request time so service and repo never
drift. A natural mindX home: POST /savante/review {target, question} on the
backend, emitting a savante.verdict catalogue event.
Scheduled β cron a headless run over the week's diff; one verdict per subsystem. The standing-audit mode: rarely intervenes, always watching.
6. Duplication procedure
git clone https://github.com/cryptoAGI/savante
cp savante/.claude/agents/savante.md <target>/.claude/agents/
cp -r savante/.claude/skills/sagi <target>/.claude/skills/
Adapt only the charter's "Canon you measure against" section to the
target repo's doctrine documents (the skill's fallback line reads the
repo-relative .claude/agents/savante.md; change it only if you install the
charter elsewhere β never to an absolute path, see Β§7 step 1). The
epistemology, verdict contract, and standing constraints are the invariant
core. With no canon listed, Savante still functions β it measures claims
against the code itself.
7. The persona, the ledger, and the binder
These binding files sit beside the two .claude/ artifacts (eight of them on
2026-09-03; the list below is as of 2026-09-14).
None of them changes Β§1: the two .claude/ files remain the only functional
artifacts of the service, and if a top-level mirror ever disagrees with them
the .claude/ copy wins (Β§1, lines 16β18 above).
savante.persona SOURCE OF TRUTH β the mindX persona; carries the
`token` block (:186) and the `task` block (:565);
shape expanded from the draiml.persona founder template (:7)
savante.agentcard.json DERIVED β the EIP-721 / ERC-8004 card
savante.commitments.json DERIVED β the digest ledger (sha256, CIDv1, doctrine root)
savante.thot.json DERIVED β the THOT manifest (sagi.thot_manifest/1)
bind/savante_bind.py the OPERATOR's binder: writes the three derived files
(card, ledger, manifest)
bind/savante_verify.py the holder's checker: recomputes and compares
bind/savante_publish.py offline: prints mint parameters from the verified
bundle; signs, uploads and writes nothing
bind/verdict_record.schema.json
JSON Schema for a ledger entry; `verdict` is a
four-value enum
sAGI.agent Β· sAGI.model the two authored mindX blockchain-agent facets
(savante === sAGI.agent; the persona is the third)
sAGI.prompt Β· sAGI.tool DERIVED facets, checked by the binder (step 6 below)
sAGI.voaice Β· sAGI.faice embodiment facets, validated by the binder (step 7)
Deviations from the implementing spec, recorded. Two persona sub-keys
are not in the spec's file plan: token.standards_note (savante.persona:190)
and task.battery_note (savante.persona:610). Both are loader-inert β
corpus.persona_task copies only name, one_thing, battery and
confirmed_when (mindX/mindx/godel/mindxtrain/corpus.py:376-386). And
task.confirmed_when.imprint_delta_gt is the integer 0 where the spec wrote
0.0: preflight P2 is whole-document and would fail closed on a float, and
hf_client.py:2127 coerces the value with float() before comparing.
Precedence. savante.persona is authored; savante.agentcard.json and
savante.commitments.json are derived from it by bind/savante_bind.py,
regenerable at any time, and never hand-edited β each opens with a $comment
saying so. A hand edit to a derived file is a defect, not a customization:
the next binder run overwrites it. Derived values never flow back: the
persona's token.bindings slots are permanently null by rule, because
writing an agentId into the persona would change its bytes and invalidate
the digest a registry would hold (savante.commitments.json,
bindings_rule).
Boundary. The binder is the operator's tool. Savante audits
bind/ β reads it, runs the verifier, grades the ledger β and never runs the
binder, because oversight that acts is oversight no longer, and that includes
minting (savante.persona:562). A mint is a visibility-or-publication
decision and a treasury action, two of the defer triggers at
savante.persona:136; the office's own verdict on it is DEFER
(savante.persona:560). The binder does no network I/O and writes nothing
on chain (savante.commitments.json, mint_reason).
Not part of the product. bind/ is not part of the duplication in Β§6.
cp of the charter and the skill still conveys the whole office; a copier
receives the office and not the ledger, and should know which is which. The
ledger answers a different question β is this the persona the author
committed to? β and needs savante.persona plus, for keccak256 only,
pycryptodome or eth_utils (bind/savante_bind.py:16); sha256 and the
CID use the standard library. The verifier needs no network for steps 1β5
and never trusts the author: it recomputes every digest from raw bytes.
Order of operations. The sequence that produced the current files is load-bearing, and it is the order any regeneration must keep:
- Fix
.claude/skills/sagi/SKILL.mdfirst. Its fallback path (line 33) carried a machine-specific absolute path,/home/hacker/mindX/...(visible ingit diffagainstHEAD); it now reads the repo-relative.claude/agents/savante.md. A digest computed before that fix would have frozen one machine's home directory into the authenticity commitment of a duplication-first product, permanently. - Edit
savante.persona. - Mirror it byte-for-byte to
/home/hacker/mindX/mindx/godel/mindxtrain/personas/savante.persona. They are separate inodes and only the mindX copy is on the corpus loader's path; an edit landing in one place splits the identity and splits the document the ledger commits to. - Validate:
python3 personas/persona_project.py --all --checkinmindx/godel/mindxtrain/must exit 0. - Mirror any charter edit to
savante.md(Β§1 precedence). - Derive the derived facets.
sAGI.promptis the charter body verbatim andsAGI.toolis the allowlist plus the grant mask; the binder regenerates both and fails closed on drift, printing the offending byte offset and the regeneration command. A charter edit that skips this step is caught here rather than shipping two disagreeing copies of the system prompt. - Validate the embodiment facets.
sAGI.voaiceandsAGI.faicemust satisfy the honest-null rule:measuredand the print are null together or present together, and an unmeasured facet carries both a reason and its deciding experiment. A plausible-looking value here would fill a doctrine-protected embodiment null (pointer 14) with something nobody earned. - Then, and only then, run
python3 bind/savante_bind.py. It fails closed on a mirror md5 mismatch (bind/savante_bind.py, the mirror check) and on the preflight β every property name ASCII, every number an integer β that makes its canonical bytes equal RFC 8785 output (:19-22). It writes the card, the ledger, andsavante.thot.json. A facet change is a new generation (sagiengine/THOT_MANIFEST.mdΒ§7): bind it with--parent-commit <commit of the most recent published manifest> --parent-reason '<what changed>'. Without them the binder carries the manifest committed at HEAD forward and refuses a facet change (G5). - Nothing else. A mint is deferred.
Regeneration is idempotent: two consecutive binder runs over an unchanged
tree produce byte-identical card, ledger and manifest (checked with cmp;
first on 2026-09-03 for the card and ledger, and again on 2026-09-11 once the
manifest joined them).