Ready
Press Next event to begin.
Scenario Runner · deterministic · manual advance
Choose how many agents join, which files they want, and whether they hand work to each other, then step through what Rally records at each moment.
One engine computes every run from your choices alone, with no randomness, so the same choices always give the same result. It produces the agents, their worktrees, their file claims, and an ordered list of Rally facts. The room shown after each fact is computed from those facts, not drawn by hand. Every fact goes to the room. A targeted handoff can also be queued for the receiver's session with rally inject when Rally manages that session. Other agents see it when they next read the room.
Rules were read from Rally source at commit 89be57d. Modeled from source at 89be57d. The installed binary predates rally setup, rally routes, and the parent lease split, so those events are Observed in source and tests, not in a live session.
Watch for: Two presence facts, one room, two claims on distinct paths that both proceed.
Shared checkout · branch main · one filesystem
Ready
Press Next event to begin.
Counts come from the events above. No coordination score exists. Waits are a modeled cooperative choice, not something Rally enforces. Time and token savings are Unknown until a matched measurement exists.
running rallyd socket (.rally/rallyd.sock) to facts.db, one writer
automatic activation needed an approved setup plan (rally setup --component coordinator --apply); an operator's explicit rally daemon start stays available
Canonical record: .rally/log JSONL ledger. This toggle never changes the events or the counts.
rallyd never decides, schedules, launches, or executes work. It owns the disposable cache and serializes access to it.
| Agent | Tool | Worktree | File | Session kind |
|---|
| Seq | Kind | Actor | Status | Fact |
|---|
| Rule | Statement | Source at 89be57d |
|---|---|---|
one-room | All linked worktrees in one clone resolve one Rally room through the git common directory. | RALLY.md:326-327; crates/rally-cli/src/run_worktree.rs:7-9 |
worktree-default | rally run provisions a per-agent linked worktree by default and fails closed if it cannot create one. Shared checkout is a deliberate opt-out (--shared or --no-worktree). | crates/rally-cli/src/run_worktree.rs:4-34,81-131 |
shared-hazard | In a shared checkout, Rally checks and claims make overlap visible but do not provide filesystem isolation. A commit by one agent lands on the branch the others are on. | crates/rally-cli/src/run_worktree.rs:3-6; session observation 2026-09-12 (shared-branch-hazard risk facts) |
narrow-parallel | Distinct narrow claims proceed in parallel. | NORTH_STAR.md:32-33 (one owner per path; work is never blocked); crates/rally-cli/src/store.rs:5391-5411 |
overlap-refused | For agents claiming the same path, one claim is accepted and later overlapping claims are refused at append time. This refuses the coordination record, not an operating system file write. | crates/rally-cli/src/store.rs:5391-5411; docs/TURN-LOOP.md:66-69 |
worktree-isolation | Separate worktrees keep simultaneous edits out of one checkout, but they do not guarantee a conflict-free Git integration when agents change the same lines. | crates/rally-cli/src/run_worktree.rs:4-21 (isolation); Git merge semantics, not a Rally guarantee |
handoff-receipt | A handoff is not accepted until the receiver authors an eligible receipt, resolve, or artifact. Receipt is not task completion or verification. | crates/rally-cli/src/store.rs:7413-7470,7431-7433 |
managed-inject | rally inject <session> --handoff <event-id> queues a recorded handoff for the receiver's session when the receiver is a live session Rally manages; it may reach the terminal, and reached_target and queued say which. The delivery is a pane write, not proof the receiver read it. Acceptance still requires target-authored evidence. | re-checked: README.md:211 (rally inject); crates/rally-cli/src/backends.rs:1226 (a successful write is recorded as sent_unverified) |
unmanaged-wake | A handoff to a receiver Rally does not manage is recorded, not pushed. The receiver sees it when it next reads the room or its inbox, or when a host hook reads for it. | re-checked: docs/COMMAND-SEMANTICS.md:110 (rally inbox); earlier: crates/rally-cli/tests/referenced_handoff_targeting.rs:1336-1355 (ledger_only, delivered false, at 89be57d) |
ack-deadline | --ack-within 10m records a reply deadline. When the sender next runs rally next after the deadline with no receiver answer, the handoff is listed as overdue and one no-response risk fact is written. There is no timer; nothing happens until the sender runs rally next. | re-checked: docs/ACK-DEADLINE-ESCALATION.md:35-39,43 |
daemon | rallyd owns the disposable facts.db cache and serializes access over a Unix socket. The JSONL ledger stays canonical. rallyd never decides, schedules, launches, or executes work. Without it, each process opens the cache directly (fail open). | RALLY.md:320-330,420-452 |
presence-write | Presence is a fact an agent writes about itself. Reading the room is a separate, pull-based act. | crates/rally-cli/src/store.rs:527,601,631; docs/COMMAND-SEMANTICS.md:28-29 |
leases | A single-file claim carries a 30 minute lease renewed by the owner's own activity; coarser scopes 120 minutes. | crates/rally-cli/src/decay.rs:39-47,90-113 |
naming | rally run auto-numbers managed sessions: claude-01 with tool claude_code:01 is documented; codex-01 with tool codex:01 follows the same pattern and is inferred. The name is self-asserted and unsigned. | RALLY.md:47-49,264-266; docs/HANDOFFS-AND-LAUNCHING-AGENTS.md:27 (pattern) |
advisory-check | rally check before-write is read-only and advisory unless --strict, which exits 4 on a stop finding. | crates/rally-cli/src/check.rs:53-91; RALLY.md:37-40 |
route-states | A route is one projection row per session binding. States: polling_only (a squad with presence but no managed transport), blocked (transport or backend check failed), testing_required (transport ok, no fresh receiver proof), ready (transport ok and proof succeeded). | crates/rally-cli/src/runtime_routes.rs:206-232,214-227,426 |
transport-challenge | rally routes --probe issues a transport-only challenge: a random RALLY_ROUTE_DELIVERY token whose digest is ledgered while the raw token rides only the live injection. The route is ready only when the exact receiver echoes the raw token as evidence, with the nonce and lead epoch. Proof expires after 300 seconds. Polling the ledger cannot produce the token. | crates/rally-cli/src/runtime_routes.rs:69,196-199,293-310; crates/rally-cli/src/lib.rs:9247-9256,9797-9805; tests/runtime/test_route_probe_transport.py:190-193 |
sent-unverified | A successful backend write is at most sent_unverified. Screen-echo verification was removed; only a receiver-authored fact upgrades it. Route readiness never means task or build success. | crates/rally-cli/src/backends.rs (3ee2925); crates/rally-cli/src/runtime_routes.rs:310 |
parent-lease | An exported session id without RALLY_MANAGED_SESSION_MODE mints a stable parent lease, sess:parent:<id>#live, shared by that session's child processes. It supports claims and referenced handoffs, has no transport claim, and inject to it reports delivery_path ledger_only, delivered false. | crates/rally-cli/src/session_identity.rs:108-141,441-453,509-549; crates/rally-cli/tests/referenced_handoff_targeting.rs:1294-1380; docs/HANDOFFS-AND-LAUNCHING-AGENTS.md:16-42 |
approved-setup | Automatic coordinator (rallyd) activation requires an approved runtime setup plan: rally setup --component coordinator --apply, confirmed by the user or an explicit --approve-plan <plan_id>. Without it the CLI reports permission_required and does not start the daemon. rallyd itself still only records, serves, and derives. | crates/rally-cli/src/runtime_setup.rs:131-147,447-451,557-579; crates/rally-cli/src/lib.rs:10717-10723; docs/ANY-AGENT-ONBOARDING.md:47-49; docs/SETUP-AND-ROUTING.md:28-30 |
Installed binary on the authoring machine: rally 0.2.7+ad9c910. Modeled from source at 89be57d. The installed binary predates rally setup, rally routes, and the parent lease split, so those events are Observed in source and tests, not in a live session.