.rally/log/<engagement>.jsonl append-only · one fact per line · committed with the code · merge=union canonical reads room
writes a fact reads the record back the host's own work, which Rally never enters
rally whoami reads · writes nothing

Self-locate before acting. Returns the host runtime, repo root, repo id, worktree, build id, and cwd.

Writes
nothing
Reads
room state, presence roster
Watch for
host_runtime.ambiguous — stop and resolve which host you are before acting; never guess
rally enter --tool <t> writes · presence

Registers this session in the room and returns the mission, the current lead, and whether an acknowledgement is still owed.

Writes
presence
Idempotent
per protocol session — an existing presence for the same tool and from_session_id is a no-op
Watch for
duplicate-active-squad-id — re-enter with a distinct agent id rather than reusing the tool id
rally ack --tool <t> writes · ack

Confirms you ingested the rules, guardrails, lead, and mission. The coordination mandate treats an unacknowledged agent as one that has not really joined.

Writes
acknowledgement
Reads
doctrine, mission, lead seat
Order
after enter, before doing work
rally next --tool <t> --json reads the room · writes a wake intent

Asks what to do. This is the wake-intent check — there is no push path, so an agent that never pulls is never woken.

Returns
actionable · requires_human · stop_reason · suggested_claims · suggested_commands · completion
Rule
if actionable is false, do not invent work from room state
Caveat
it recommends one action, so an empty answer is not proof the room is empty — read `rally room`
rally say claim --scope <type:id> writes · claim

Reserves a resource before touching it. A claim covers far more than a file: eleven resource types across four access modes.

Writes
claim
Types
workspace · repo · file · dir · branch · commit · port · process · service · task · cross-repo
Modes
exclusive · shared_read · advisory · namespace
On conflict
the append is refused with exit 2 and the message names the holder
rally check before-write --path <p> reads · advisory by default

Asks whether another live agent already claimed this path. Path-based only — it builds a file: scope, so it cannot see a database or a port.

Writes
nothing (may record an audit fact)
--strict
exits 4 on a stop finding, so a harness aborts the write
Default
warns and lets the edit through; every hook exits 0 even when Rally is broken
the host edits Rally never enters this step

The actual work. Rally has no arrow into or out of this box, and that is the charter, not an omission.

Writes
nothing to the ledger
Owner
the coding host
Charter
Rally records and advises; it never gates, grants, schedules, spawns, retries, or executes
the host verifies Rally never enters this step

Tests, builds, whatever proves the change. Rally stores the evidence string you choose to record; it does not judge the work.

Writes
nothing to the ledger
Owner
the coding host
Next
record the outcome with `say artifact --evidence`
rally say <kind> writes · artifact, handoff, decision, blocker…

Records what happened so a peer, or your own restarted session, can read it back instead of asking a human.

Writes
any of the 16 fact kinds
Auto-presence
a caller with no presence yet commits one first — which is why a refused claim can exit 1 instead of 2
Handoff rule
complete only when the receiving agent writes its own acknowledgement
Every step but two touches the same file. Presence, acknowledgement, claims, and outputs go down into the log; whoami, next, and check before-write read it back before advising. edit and verify have no arrow in either direction — that is the charter drawn as geometry: Rally never gates, spawns, schedules, or executes.