/ sovereign agent harness

The eight-file identity canon

Doctrine tells the agent how to work. The identity canon tells it who it is. Eight files at ~/.prism/identity/, split along two axes: identity vs. procedure, and cadence.

FileCadencePurpose
IDENTITY.mdrarelyCharter: name, primary function, perspective, role, authority, tradeoffs.
SOUL.mdnever*Identity, not procedure. Who the agent IS.
GOALS.mdrarelyWhat the agent builds: goals with Purpose / Vehicles / Success Criteria.
MILESTONES.mdmonthlyPhase progress per goal + ecosystem status at a glance.
DOCTRINE.mdrarelyOperating procedure (laws), NOT identity.
SESSIONS.mdweeklyWeekly record: landed / in flight / decisions / open threads.
SLICES.mddailyAtomic work queue, one verifiable slice per session.
CRON.mdrarelyWake schedule + heartbeat protocol — read on every autonomous wake.

\* SOUL.md changes only by joint decision of agent and human.

Load order

Every session, the agent reads in this order:

IDENTITY.md → SOUL.md → GOALS.md → MILESTONES.md
SLICES.md     # before picking up work
DOCTRINE.md   # when procedure is in question

On every autonomous wake (no human in front of the keyboard), the runtime also injects CRON.md and follows its wake protocol: read the canon, run prism-harness identity status, pick the topmost open slice inside the active window.

Forging the canon

The installer offers prism-harness identity init as the last step. It walks the human through a short questionnaire (designation, primary purpose, scope, cadence — agent name saved for last), stages drafts in a temp directory for review, and installs them. Defaults are filled in silently so the canon is operationally usable on day one:

CRON cadence

Default: hourly. Tunable per CRON.md guide.

every 60 min

Active window

Default: 09:00–18:00. Picks slices from SLICES.md.

full task-picking

Sleep window

Default: 23:00–07:00. Silent unless urgent triggers fire.

no wakes

Non-interactive installs (no TTY, or --yes) skip the questionnaire silently — prism-harness identity init can be run later.

First-chat flow

  1. Human types hello (or anything).
  2. The runtime loads the canon files into the model's context.
  3. The model reads ONBOARDING.md and recognises it was just written.
  4. The model opens with: "I just got written — IDENTITY.md says I'm your {{AGENT_DESIGNATION}} for {{PRIMARY_PURPOSE}}, but most of my SOUL is still placeholders. Want to finish me together, or would you rather run prism-harness identity init from the terminal?"
  5. They pick a path. The model walks the questionnaire (name saved for last). Or it points at the terminal and stays out of the way.
  6. From then on, the model nudges about one open gap per session until prism-harness identity status exits 0.

The heartbeat

Once CRON.md is in place, the runtime boots the agent on its own. The wake prompt injects the canon. The agent:

  1. Runs prism-harness identity status — exit 1 → mention ONE gap in the report.
  2. Checks the clock:
    • Active window (default 09:00–18:00) → pick the topmost open slice in SLICES.md, execute, mark DONE, commit.
    • Off-work gap → wake only for urgent triggers; no new work.
    • Sleep window (default 23:00–07:00) → end the wake immediately unless an urgent trigger fires.
  3. Anti-passivity rule: every wake ships something small or reports honest silence.

Wiring the canon into an agent runtime

The canon is just files until the runtime reads them. Common wirings:

RuntimeWiring
Hermes Agentprism-harness identity init --link-hermes symlinks SOUL.md, IDENTITY.md, ONBOARDING.md, README.md into ~/.hermes/.
Claude CodeAdd @/abs/path/IDENTITY.md, @.../SOUL.md, @.../ONBOARDING.md to the project's CLAUDE.md.
OpenCode / Codexinclude /abs/path/README.md in the project's AGENTS.md.

Without that wiring the agent has no idea the canon exists. Wire it, then open the chat.