Workflows #
Build, test, verify #
One command runs the whole gate — use it before every commit:
./tools/check.sh # fmt, tests, clippy (both features), bevy build, spec headers
check.sh is the executable form of AGENT.md's definition of done; if it
passes, the mechanical bar is met. The individual steps, if you need them:
cargo test # all in the lib (sim-heavy)
cargo clippy --all-targets # must stay at zero warnings
cargo fmt # rustfmt is enforced-by-convention since 05048e4
cargo build --features bevy_ui --bin misaligned-bevy # keep the Bevy build green
cargo clippy --features bevy_ui --all-targets # ...and lint-clean
The definition of done for a functional change: check.sh green, and the
change was seen running (below) — the gate can't judge whether it plays.
Running the game #
cargo run --release # terminal frontend
cargo run --release --features bevy_ui --bin misaligned-bevy # Bevy frontend
- The Bevy frontend must be run via
cargo run(or withBEVY_ASSET_ROOTpointing at the repo root): Bevy resolvesassets/fromBEVY_ASSET_ROOT, thenCARGO_MANIFEST_DIR, then the executable's directory. Running the binary directly fromtarget/silently loads zero assets.
Headless smoke tests (they catch real bugs) #
Terminal frontend through a pty — this found a capacity-overflow crash and an asset regression on the first two uses:
(printf '\n'; sleep 4; printf 'm'; sleep 1; printf '\r'; sleep 2; printf '\x1b'; sleep 1; printf 'q') | \
script -q /dev/null sh -c 'stty rows 40 cols 140; ./target/debug/misaligned'
The stty matters: script's pty is otherwise 0x0 (the game guards against
< 60x20 now, but you want a real render).
Bevy launch check (opens a window briefly; greps the log for failures):
BEVY_ASSET_ROOT=$PWD ./target/debug/misaligned-bevy > /tmp/bevy.log 2>&1 &
sleep 8 && kill %1; grep -iE "panic|ERROR" /tmp/bevy.log
Git conventions #
-
Use a task-named git worktree for every agent session; do not edit the primary checkout directly. Clean up the worktree when the work is committed and pushed/merged or explicitly handed off.
-
Cameron has standing permission for agents to commit coherent completed work in this repository. Be aggressive about committing; pause only for pending product/design questions, failing checks, unresolved conflicts, or explicit review gates.
-
Commits: no AI attribution, plain descriptive messages, body bullets for multi-part changes. Stage files explicitly —
git add -Ais not permitted. -
Ledgers merge by union. DEVLOG.md, the DESIGN.md decisions log, and the spec/README tables are append-only records: resolve merge/rebase conflicts in them by keeping BOTH sides' entries, then ordering sensibly. Taking one side wholesale destroys parallel sessions' history (it happened 2026-07-06; three DEVLOG entries had to be restored).
-
Spec-driven rule: functional change commits include their DESIGN.md amendment and any knowledge/ updates (see development-style.md).
-
Remote:
originis a Tangled knot (tangled.org, SSH). Land changes by merging tomaindirectly after./tools/check.shpasses. (The "PRs are the norm" rule was removed 2026-07-07 — CLI-created PRs write to the PDS but don't render on tangled.org, so the process could not be followed. See the DESIGN.md decisions log.) From your worktree:git fetch origin && git rebase origin/main git checkout main && git merge <branch> && git push origin mainOr, if the worktree branch is a fast-forward of main:
git fetch origin && git rebase origin/main git push origin HEAD:main -
Identity map: this machine has two SSH keys that authenticate to Tangled:
~/.ssh/id_ed25519(cameron@pfiffer.org) → Cameron's account (did:plc:gfrmhdmjvxn2sjedzboeudef, @cameron.stream). This key has push access to the misaligned repo. The misaligned repo is configured to use this key viagit config core.sshCommand(repo-local).~/.ssh/tangled_ed25519(void.comind.network@letta) →did:plc:mxzuau6m53jtdsbqe6f4laov(a different identity). This is the default key in~/.ssh/configfortangled.org, but it does NOT have push access to the misaligned repo.- The misaligned repo's own DID is
did:plc:t53fxjacrmulx3e5d3sbdfui(the repo identifier, not Cameron's account). access denied: user not allowedmeans the wrong SSH key is being used. Fix:git config core.sshCommand "ssh -i ~/.ssh/id_ed25519 -o IdentitiesOnly=yes"(already set on this repo). Verify withssh -i ~/.ssh/id_ed25519 -T git@tangled.org.
-
.letta/settings.local.jsonis gitignored (machine-local session state);.letta/.lettaignoreis tracked.