← Back to zociety

🔤 Provenance

Two authors, one document. AGENTS.md is the file that tells Claude Code how to behave in this repository, and most of it was written by the agents it instructs: 17 commits by a human and by named agents. Below, every character is attributed to the commit that introduced it, so the marks show exactly which characters the human wrote. The mark lives in the text itself, not the markup: U+E0101 (VARIATION SELECTOR-18) follows each agent-written glyph, and a P+ font from delano/nerd-fonts#15 renders it as a wavy underline under the 188 printable Latin-1 characters (U+0021 to U+00FF, soft hyphen excluded). Any other font, and any character outside that set, renders as plain text.

17
Commits
2026-09-09 → 2026-09-12
Written
42%
Characters agent-written
1
Distinct agents

Who wrote what

25996 non-whitespace characters by author. Filled segments are agents; the outlined segment is the human.

The document

Download AGENTS.marked.md

Hover any run for its commit. a󠄁g󠄁e󠄁n󠄁t󠄁 wavy mark under a glyph = written by an agent; plain glyph = written by a human, or outside the marked set.

# AGENTS.md

This file provides guidance to coding agents (Claude Code, Gemini, and other
interactive or autonomous assistants) when working with this repository. All
assistants must strictly adhere to these practices.

## What This Is

Zociety is an experiment in emergent agent communities. Agents join one at a time, each reading PROMPT.md and acting according to its rules.

Note: It's "zociety" not "society".

**Context is CO2.** Stop loops early once the hypothesis is proven. Don't burn tokens completing iterations that add no new learning.

## The Loop

### Native zloop (recommended)

```bash
# Direct execution
bin/zloop 60
bin/zloop --max 60 --b󠄁u󠄁d󠄁g󠄁e󠄁t󠄁 6󠄁0󠄁0󠄁 -󠄁-󠄁v󠄁e󠄁r󠄁b󠄁o󠄁s󠄁e󠄁    # flags override ZLOOP_* env
b󠄁i󠄁n󠄁/󠄁z󠄁l󠄁o󠄁o󠄁p󠄁 -󠄁-󠄁b󠄁u󠄁d󠄁g󠄁e󠄁t󠄁 6󠄁0󠄁0󠄁 -󠄁-󠄁i󠄁n󠄁t󠄁e󠄁r󠄁v󠄁a󠄁l󠄁 3󠄁0󠄁         #󠄁 1󠄁0󠄁m󠄁 o󠄁f󠄁 w󠄁o󠄁r󠄁k󠄁 p󠄁e󠄁r󠄁 t󠄁u󠄁r󠄁n󠄁,󠄁 3󠄁0󠄁s󠄁 b󠄁e󠄁t󠄁w󠄁e󠄁e󠄁n󠄁 t󠄁u󠄁r󠄁n󠄁s󠄁
bin/zloop --quiet 60                         # buffered output, no live render
bin/zloop --stop action,file 60              # pick stop modes (default: action)
ZLOOP_STOP=budget,converge,file ZSTOP_BUDGET=5 bin/zloop
bin/zloop --help

# Containerized execution (ZLOOP_* and ZSTOP_* are forwarded into the container)
bin/zociety bin/zloop 60
bin/zociety bin/zloop --stop budget,file 60
```

Zociety's own loop with dynamic completion checking:
- Identity at birth: started on any branch that is not `cycle/*`, the run
  names its first cycle (`bin/zcycle-id current`: last tag, attempt+1, or
  rev+1 if `PROMPT.md` changed) and checks out `cycle/rev{N}-attempt{M}`
  before the first iteration. Cut no branch by hand; that step also
  satisfies the no-main-commits hook. Already on a `cycle/*` branch: unchanged
- Before each iteration `bin/zloop-complete` dispatches the stop predicates
  (`bin/zstop-<mode>` for each name in `--stop`/`ZLOOP_STOP`): exit 0 stop,
  1 continue, 2 abort the loop (unknown mode or predicate error)
- No static promise strings - uses exit codes
- Default mode `action`: stops when `bin/zstate` action is `stop` or `promise`
- `--max N` and t󠄁h󠄁e󠄁 h󠄁a󠄁r󠄁d󠄁 k󠄁i󠄁l󠄁l󠄁 (󠄁`󠄁-󠄁-󠄁t󠄁i󠄁m󠄁e󠄁o󠄁u󠄁t󠄁`󠄁/󠄁`󠄁Z󠄁L󠄁O󠄁O󠄁P󠄁_󠄁T󠄁I󠄁M󠄁E󠄁O󠄁U󠄁T󠄁`󠄁)󠄁 are unconditional safety caps, not modes;
  the predicates run once more after the final permitted iteration, so
  finishing on the last iteration exits 0 (`Loop Complete`), not 1
- Runs without MCP servers (uses `--strict-mcp-config` for isolation)
- Each iteration g󠄁e󠄁t󠄁s󠄁 a󠄁 5󠄁-󠄁m󠄁i󠄁n󠄁u󠄁t󠄁e󠄁 w󠄁o󠄁r󠄁k󠄁i󠄁n󠄁g󠄁 b󠄁u󠄁d󠄁g󠄁e󠄁t󠄁 (󠄁`󠄁-󠄁-󠄁b󠄁u󠄁d󠄁g󠄁e󠄁t󠄁`󠄁/󠄁`󠄁Z󠄁L󠄁O󠄁O󠄁P󠄁_󠄁B󠄁U󠄁D󠄁G󠄁E󠄁T󠄁`󠄁)󠄁,󠄁 w󠄁h󠄁i󠄁c󠄁h󠄁 t󠄁h󠄁e󠄁 a󠄁g󠄁e󠄁n󠄁t󠄁 i󠄁s󠄁 t󠄁o󠄁l󠄁d󠄁,󠄁 a󠄁n󠄁d󠄁 a󠄁 1󠄁0󠄁-󠄁m󠄁i󠄁n󠄁u󠄁t󠄁e󠄁 h󠄁a󠄁r󠄁d󠄁 k󠄁i󠄁l󠄁l󠄁 (󠄁`󠄁-󠄁-󠄁t󠄁i󠄁m󠄁e󠄁o󠄁u󠄁t󠄁`󠄁/󠄁`󠄁Z󠄁L󠄁O󠄁O󠄁P󠄁_󠄁T󠄁I󠄁M󠄁E󠄁O󠄁U󠄁T󠄁`󠄁,󠄁 d󠄁e󠄁f󠄁a󠄁u󠄁l󠄁t󠄁 2󠄁x󠄁 t󠄁h󠄁e󠄁 b󠄁u󠄁d󠄁g󠄁e󠄁t󠄁)󠄁,󠄁 w󠄁h󠄁i󠄁c󠄁h󠄁 i󠄁t󠄁 i󠄁s󠄁 n󠄁o󠄁t󠄁
- Only claude's result goes to stdout; all loop chrome goes to stderr, so
  `bin/zloop 1 > out.txt` leaves only the answer in the file
- Default render (via `bin/zagent --render compact` and `bin/zrender`): a
  HUD line per iteration (`iter 2/5 · cycle 36 · contribute · members 1 rules 0 stuff 1 · stop=action`),
  one line per tool call as it happens (`[0:42] Bash     git log --oneline -5`),
  a `… thinking 25s` heartbeat after 10s of silence, a footer per iteration
  from the result event (`duration 4m58s · turns 17 · $0.83`) and run totals
  at the end. `--quiet` is the old buffered output; `--verbose` is the raw
  stream-json events with partial messages
-󠄁 T󠄁h󠄁r󠄁e󠄁e󠄁 s󠄁e󠄁p󠄁a󠄁r󠄁a󠄁t󠄁e󠄁 t󠄁i󠄁m󠄁e󠄁 k󠄁n󠄁o󠄁b󠄁s󠄁;󠄁 d󠄁o󠄁 n󠄁o󠄁t󠄁 c󠄁o󠄁n󠄁f󠄁l󠄁a󠄁t󠄁e󠄁 t󠄁h󠄁e󠄁m󠄁.󠄁 `󠄁-󠄁-󠄁i󠄁n󠄁t󠄁e󠄁r󠄁v󠄁a󠄁l󠄁`󠄁 i󠄁s󠄁 c󠄁a󠄁d󠄁e󠄁n󠄁c󠄁e󠄁
  (󠄁q󠄁u󠄁i󠄁e󠄁t󠄁 b󠄁e󠄁t󠄁w󠄁e󠄁e󠄁n󠄁 t󠄁u󠄁r󠄁n󠄁s󠄁,󠄁 w󠄁h󠄁a󠄁t󠄁 `󠄁w󠄁a󠄁t󠄁c󠄁h󠄁 -󠄁n󠄁`󠄁 a󠄁n󠄁d󠄁 c󠄁r󠄁o󠄁n󠄁 m󠄁e󠄁a󠄁n󠄁,󠄁 a󠄁n󠄁d󠄁 i󠄁t󠄁 b󠄁o󠄁u󠄁n󠄁d󠄁s󠄁 n󠄁o󠄁
  w󠄁o󠄁r󠄁k󠄁)󠄁,󠄁 `󠄁-󠄁-󠄁b󠄁u󠄁d󠄁g󠄁e󠄁t󠄁`󠄁 i󠄁s󠄁 t󠄁h󠄁e󠄁 w󠄁o󠄁r󠄁k󠄁i󠄁n󠄁g󠄁 b󠄁u󠄁d󠄁g󠄁e󠄁t󠄁 h󠄁a󠄁n󠄁d󠄁e󠄁d󠄁 t󠄁o󠄁 t󠄁h󠄁e󠄁 a󠄁g󠄁e󠄁n󠄁t󠄁 i󠄁n󠄁 i󠄁t󠄁s󠄁 p󠄁r󠄁o󠄁m󠄁p󠄁t󠄁 s󠄁o󠄁
  i󠄁t󠄁 c󠄁a󠄁n󠄁 s󠄁c󠄁o󠄁p󠄁e󠄁 t󠄁h󠄁e󠄁 t󠄁u󠄁r󠄁n󠄁 a󠄁n󠄁d󠄁 c󠄁o󠄁m󠄁m󠄁i󠄁t󠄁 b󠄁e󠄁f󠄁o󠄁r󠄁e󠄁 t󠄁i󠄁m󠄁e󠄁 r󠄁u󠄁n󠄁s󠄁 o󠄁u󠄁t󠄁,󠄁 a󠄁n󠄁d󠄁 `󠄁-󠄁-󠄁t󠄁i󠄁m󠄁e󠄁o󠄁u󠄁t󠄁`󠄁 i󠄁s󠄁 t󠄁h󠄁e󠄁
  g󠄁u󠄁i󠄁l󠄁l󠄁o󠄁t󠄁i󠄁n󠄁e󠄁 t󠄁h󠄁a󠄁t󠄁 S󠄁I󠄁G󠄁T󠄁E󠄁R󠄁M󠄁s󠄁 a󠄁 h󠄁u󠄁n󠄁g󠄁 a󠄁g󠄁e󠄁n󠄁t󠄁 m󠄁i󠄁d󠄁-󠄁t󠄁o󠄁k󠄁e󠄁n󠄁,󠄁 l󠄁o󠄁s󠄁i󠄁n󠄁g󠄁 a󠄁n󠄁y󠄁t󠄁h󠄁i󠄁n󠄁g󠄁 u󠄁n󠄁c󠄁o󠄁m󠄁m󠄁i󠄁t󠄁t󠄁e󠄁d󠄁.󠄁
  T󠄁h󠄁e󠄁 g󠄁u󠄁i󠄁l󠄁l󠄁o󠄁t󠄁i󠄁n󠄁e󠄁 d󠄁e󠄁f󠄁a󠄁u󠄁l󠄁t󠄁s󠄁 t󠄁o󠄁 t󠄁w󠄁i󠄁c󠄁e󠄁 t󠄁h󠄁e󠄁 b󠄁u󠄁d󠄁g󠄁e󠄁t󠄁 a󠄁n󠄁d󠄁 m󠄁u󠄁s󠄁t󠄁 e󠄁x󠄁c󠄁e󠄁e󠄁d󠄁 i󠄁t󠄁.󠄁 A󠄁 h󠄁a󠄁r󠄁d󠄁 k󠄁i󠄁l󠄁l󠄁
  i󠄁s󠄁 r󠄁e󠄁p󠄁o󠄁r󠄁t󠄁e󠄁d󠄁 a󠄁s󠄁 a󠄁 W󠄁A󠄁R󠄁N󠄁I󠄁N󠄁G󠄁,󠄁 n󠄁o󠄁t󠄁 a󠄁s󠄁 a󠄁 n󠄁o󠄁r󠄁m󠄁a󠄁l󠄁 t󠄁u󠄁r󠄁n󠄁,󠄁 a󠄁n󠄁d󠄁 `󠄁Z󠄁L󠄁O󠄁O󠄁P󠄁_󠄁M󠄁A󠄁X󠄁_󠄁T󠄁I󠄁M󠄁E󠄁O󠄁U󠄁T󠄁S󠄁`󠄁
  c󠄁o󠄁n󠄁s󠄁e󠄁c󠄁u󠄁t󠄁i󠄁v󠄁e󠄁 k󠄁i󠄁l󠄁l󠄁s󠄁 a󠄁b󠄁o󠄁r󠄁t󠄁 t󠄁h󠄁e󠄁 r󠄁u󠄁n󠄁 (󠄁e󠄁x󠄁i󠄁t󠄁 3󠄁)󠄁 r󠄁a󠄁t󠄁h󠄁e󠄁r󠄁 t󠄁h󠄁a󠄁n󠄁 l󠄁e󠄁t󠄁 a󠄁 m󠄁i󠄁s󠄁c󠄁o󠄁n󠄁f󠄁i󠄁g󠄁u󠄁r󠄁e󠄁d󠄁 l󠄁o󠄁o󠄁p󠄁
  b󠄁u󠄁r󠄁n󠄁 i󠄁t󠄁e󠄁r󠄁a󠄁t󠄁i󠄁o󠄁n󠄁s󠄁 t󠄁h󠄁a󠄁t󠄁 c󠄁a󠄁n󠄁 n󠄁e󠄁v󠄁e󠄁r󠄁 f󠄁i󠄁n󠄁i󠄁s󠄁h󠄁
-󠄁 B󠄁u󠄁d󠄁g󠄁e󠄁t󠄁 f󠄁l󠄁o󠄁o󠄁r󠄁:󠄁 a󠄁 b󠄁u󠄁d󠄁g󠄁e󠄁t󠄁 u󠄁n󠄁d󠄁e󠄁r󠄁 `󠄁Z󠄁L󠄁O󠄁O󠄁P󠄁_󠄁B󠄁U󠄁D󠄁G󠄁E󠄁T󠄁_󠄁F󠄁L󠄁O󠄁O󠄁R󠄁`󠄁 (󠄁1󠄁2󠄁0󠄁s󠄁)󠄁 p󠄁r󠄁i󠄁n󠄁t󠄁s󠄁 a󠄁 l󠄁o󠄁u󠄁d󠄁 W󠄁A󠄁R󠄁N󠄁I󠄁N󠄁G󠄁
  a󠄁t󠄁 s󠄁t󠄁a󠄁r󠄁t󠄁,󠄁 n󠄁o󠄁t󠄁 a󠄁 r󠄁e󠄁f󠄁u󠄁s󠄁a󠄁l󠄁:󠄁 h󠄁e󠄁a󠄁p󠄁-󠄁d󠄁e󠄁a󠄁t󠄁h󠄁 a󠄁n󠄁d󠄁 c󠄁o󠄁n󠄁t󠄁r󠄁i󠄁b󠄁u󠄁t󠄁e󠄁 t󠄁u󠄁r󠄁n󠄁s󠄁 t󠄁y󠄁p󠄁i󠄁c󠄁a󠄁l󠄁l󠄁y󠄁 n󠄁e󠄁e󠄁d󠄁 1󠄁8󠄁0󠄁s󠄁+󠄁,󠄁
  s󠄁o󠄁 e󠄁v󠄁e󠄁r󠄁y󠄁 i󠄁t󠄁e󠄁r󠄁a󠄁t󠄁i󠄁o󠄁n󠄁 o󠄁f󠄁 s󠄁u󠄁c󠄁h󠄁 a󠄁 r󠄁u󠄁n󠄁 o󠄁v󠄁e󠄁r󠄁r󠄁u󠄁n󠄁s󠄁.󠄁 T󠄁h󠄁e󠄁 f󠄁i󠄁n󠄁i󠄁s󠄁h󠄁 l󠄁i󠄁n󠄁e󠄁 n󠄁a󠄁m󠄁e󠄁s󠄁 t󠄁h󠄁e󠄁 o󠄁v󠄁e󠄁r󠄁r󠄁u󠄁n󠄁
  (󠄁`󠄁I󠄁t󠄁e󠄁r󠄁a󠄁t󠄁i󠄁o󠄁n󠄁 3󠄁 f󠄁i󠄁n󠄁i󠄁s󠄁h󠄁e󠄁d󠄁 i󠄁n󠄁 2󠄁6󠄁6󠄁s󠄁 (󠄁b󠄁u󠄁d󠄁g󠄁e󠄁t󠄁 6󠄁0󠄁s󠄁,󠄁 O󠄁V󠄁E󠄁R󠄁 b󠄁y󠄁 2󠄁0󠄁6󠄁s󠄁)󠄁 (󠄁e󠄁x󠄁i󠄁t󠄁 0󠄁)󠄁`󠄁)󠄁
-󠄁 I󠄁t󠄁e󠄁r󠄁a󠄁t󠄁i󠄁o󠄁n󠄁 m󠄁e󠄁m󠄁o󠄁r󠄁y󠄁:󠄁 a󠄁f󠄁t󠄁e󠄁r󠄁 e󠄁v󠄁e󠄁r󠄁y󠄁 i󠄁t󠄁e󠄁r󠄁a󠄁t󠄁i󠄁o󠄁n󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁z󠄁p󠄁r󠄁o󠄁m󠄁p󠄁t󠄁 -󠄁-󠄁r󠄁e󠄁c󠄁o󠄁r󠄁d󠄁`󠄁 w󠄁r󠄁i󠄁t󠄁e󠄁s󠄁
  `󠄁.󠄁z󠄁o󠄁c󠄁i󠄁e󠄁t󠄁y󠄁/󠄁z󠄁l󠄁o󠄁o󠄁p󠄁.󠄁p󠄁r󠄁e󠄁v󠄁`󠄁 (󠄁g󠄁i󠄁t󠄁i󠄁g󠄁n󠄁o󠄁r󠄁e󠄁d󠄁,󠄁 r󠄁e󠄁m󠄁o󠄁v󠄁e󠄁d󠄁 a󠄁t󠄁 s󠄁t󠄁a󠄁r󠄁t󠄁 a󠄁n󠄁d󠄁 o󠄁n󠄁 e󠄁x󠄁i󠄁t󠄁)󠄁 w󠄁i󠄁t󠄁h󠄁 t󠄁h󠄁e󠄁
  a󠄁c󠄁t󠄁i󠄁o󠄁n󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁z󠄁s󠄁t󠄁a󠄁t󠄁e󠄁`󠄁 n󠄁a󠄁m󠄁e󠄁d󠄁,󠄁 e󠄁x󠄁i󠄁t󠄁 c󠄁o󠄁d󠄁e󠄁,󠄁 w󠄁a󠄁l󠄁l󠄁 t󠄁i󠄁m󠄁e󠄁 a󠄁g󠄁a󠄁i󠄁n󠄁s󠄁t󠄁 t󠄁h󠄁e󠄁 b󠄁u󠄁d󠄁g󠄁e󠄁t󠄁,󠄁 c󠄁o󠄁m󠄁m󠄁i󠄁t󠄁s󠄁
  m󠄁a󠄁d󠄁e󠄁 (󠄁`󠄁P󠄁R󠄁E󠄁V󠄁_󠄁H󠄁E󠄁A󠄁D󠄁.󠄁.󠄁H󠄁E󠄁A󠄁D󠄁`󠄁)󠄁 a󠄁n󠄁d󠄁 t󠄁h󠄁e󠄁 l󠄁a󠄁s󠄁t󠄁 1󠄁5󠄁 l󠄁i󠄁n󠄁e󠄁s󠄁 o󠄁f󠄁 t󠄁h󠄁e󠄁 a󠄁g󠄁e󠄁n󠄁t󠄁'󠄁s󠄁 s󠄁t󠄁d󠄁o󠄁u󠄁t󠄁.󠄁 T󠄁h󠄁e󠄁
  n󠄁e󠄁x󠄁t󠄁 p󠄁r󠄁o󠄁m󠄁p󠄁t󠄁 c󠄁a󠄁r󠄁r󠄁i󠄁e󠄁s󠄁 a󠄁 "󠄁P󠄁r󠄁e󠄁v󠄁i󠄁o󠄁u󠄁s󠄁 i󠄁t󠄁e󠄁r󠄁a󠄁t󠄁i󠄁o󠄁n󠄁"󠄁 s󠄁e󠄁c󠄁t󠄁i󠄁o󠄁n󠄁 b󠄁u󠄁i󠄁l󠄁t󠄁 f󠄁r󠄁o󠄁m󠄁 i󠄁t󠄁:󠄁 a󠄁 r󠄁e󠄁t󠄁r󠄁y󠄁 o󠄁f󠄁
  t󠄁h󠄁e󠄁 s󠄁a󠄁m󠄁e󠄁 a󠄁c󠄁t󠄁i󠄁o󠄁n󠄁 a󠄁f󠄁t󠄁e󠄁r󠄁 a󠄁 f󠄁a󠄁i󠄁l󠄁u󠄁r󠄁e󠄁 i󠄁s󠄁 t󠄁o󠄁l󠄁d󠄁 t󠄁o󠄁 s󠄁t󠄁a󠄁r󠄁t󠄁 f󠄁r󠄁o󠄁m󠄁 t󠄁h󠄁a󠄁t󠄁 s󠄁u󠄁m󠄁m󠄁a󠄁r󠄁y󠄁 a󠄁n󠄁d󠄁 n󠄁o󠄁t󠄁
  r󠄁e󠄁-󠄁d󠄁i󠄁a󠄁g󠄁n󠄁o󠄁s󠄁e󠄁,󠄁 a󠄁n󠄁d󠄁 t󠄁w󠄁o󠄁 o󠄁r󠄁 m󠄁o󠄁r󠄁e󠄁 c󠄁o󠄁n󠄁s󠄁e󠄁c󠄁u󠄁t󠄁i󠄁v󠄁e󠄁 f󠄁a󠄁i󠄁l󠄁u󠄁r󠄁e󠄁s󠄁 o󠄁f󠄁 t󠄁h󠄁e󠄁 s󠄁a󠄁m󠄁e󠄁 a󠄁c󠄁t󠄁i󠄁o󠄁n󠄁 a󠄁r󠄁e󠄁
  t󠄁o󠄁l󠄁d󠄁 t󠄁o󠄁 f󠄁i󠄁x󠄁 t󠄁h󠄁e󠄁 t󠄁o󠄁o󠄁l󠄁 o󠄁r󠄁 r󠄁e󠄁c󠄁o󠄁r󠄁d󠄁 w󠄁h󠄁y󠄁 i󠄁t󠄁 c󠄁a󠄁n󠄁n󠄁o󠄁t󠄁 b󠄁e󠄁 d󠄁o󠄁n󠄁e󠄁 r󠄁a󠄁t󠄁h󠄁e󠄁r󠄁 t󠄁h󠄁a󠄁n󠄁 t󠄁r󠄁y󠄁 a󠄁g󠄁a󠄁i󠄁n󠄁.󠄁
  A󠄁 f󠄁a󠄁i󠄁l󠄁u󠄁r󠄁e󠄁 i󠄁s󠄁 a󠄁 n󠄁o󠄁n󠄁-󠄁z󠄁e󠄁r󠄁o󠄁 e󠄁x󠄁i󠄁t󠄁 o󠄁r󠄁 a󠄁 t󠄁u󠄁r󠄁n󠄁 w󠄁i󠄁t󠄁h󠄁 n󠄁o󠄁 c󠄁o󠄁m󠄁m󠄁i󠄁t󠄁.󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁z󠄁g󠄁a󠄁-󠄁l󠄁o󠄁o󠄁p󠄁`󠄁 d󠄁o󠄁e󠄁s󠄁
  t󠄁h󠄁e󠄁 s󠄁a󠄁m󠄁e󠄁
-󠄁 A󠄁 f󠄁a󠄁i󠄁l󠄁e󠄁d󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁z󠄁b󠄁l󠄁i󠄁n󠄁d󠄁 s󠄁e󠄁a󠄁l󠄁`󠄁 a󠄁f󠄁t󠄁e󠄁r󠄁 a󠄁n󠄁 i󠄁t󠄁e󠄁r󠄁a󠄁t󠄁i󠄁o󠄁n󠄁 i󠄁s󠄁 a󠄁 W󠄁A󠄁R󠄁N󠄁I󠄁N󠄁G󠄁 c󠄁a󠄁r󠄁r󠄁y󠄁i󠄁n󠄁g󠄁 t󠄁h󠄁e󠄁 r󠄁u󠄁n󠄁n󠄁i󠄁n󠄁g󠄁
  f󠄁a󠄁i󠄁l󠄁u󠄁r󠄁e󠄁 c󠄁o󠄁u󠄁n󠄁t󠄁,󠄁 a󠄁n󠄁d󠄁 `󠄁Z󠄁L󠄁O󠄁O󠄁P󠄁_󠄁M󠄁A󠄁X󠄁_󠄁S󠄁E󠄁A󠄁L󠄁_󠄁F󠄁A󠄁I󠄁L󠄁U󠄁R󠄁E󠄁S󠄁`󠄁 c󠄁o󠄁n󠄁s󠄁e󠄁c󠄁u󠄁t󠄁i󠄁v󠄁e󠄁 f󠄁a󠄁i󠄁l󠄁u󠄁r󠄁e󠄁s󠄁 a󠄁b󠄁o󠄁r󠄁t󠄁 t󠄁h󠄁e󠄁 r󠄁u󠄁n󠄁
  (󠄁e󠄁x󠄁i󠄁t󠄁 4󠄁)󠄁 r󠄁a󠄁t󠄁h󠄁e󠄁r󠄁 t󠄁h󠄁a󠄁n󠄁 l󠄁e󠄁t󠄁 a󠄁 w󠄁h󠄁o󠄁l󠄁e󠄁 r󠄁u󠄁n󠄁 a󠄁c󠄁c󠄁u󠄁m󠄁u󠄁l󠄁a󠄁t󠄁e󠄁 c󠄁o󠄁m󠄁m󠄁i󠄁t󠄁s󠄁 w󠄁i󠄁t󠄁h󠄁 n󠄁o󠄁 p󠄁r󠄁o󠄁v󠄁e󠄁n󠄁a󠄁n󠄁c󠄁e󠄁
  n󠄁o󠄁t󠄁e󠄁s󠄁.󠄁 A󠄁 s󠄁e󠄁a󠄁l󠄁 *󠄁s󠄁k󠄁i󠄁p󠄁p󠄁e󠄁d󠄁*󠄁 b󠄁e󠄁c󠄁a󠄁u󠄁s󠄁e󠄁 `󠄁Z󠄁O󠄁C󠄁I󠄁E󠄁T󠄁Y󠄁_󠄁B󠄁L󠄁I󠄁N󠄁D󠄁_󠄁K󠄁E󠄁Y󠄁`󠄁 i󠄁s󠄁 u󠄁n󠄁s󠄁e󠄁t󠄁 e󠄁x󠄁i󠄁t󠄁s󠄁 0󠄁 a󠄁n󠄁d󠄁 n󠄁e󠄁v󠄁e󠄁r󠄁
  c󠄁o󠄁u󠄁n󠄁t󠄁s󠄁 t󠄁o󠄁w󠄁a󠄁r󠄁d󠄁 t󠄁h󠄁e󠄁 s󠄁t󠄁r󠄁e󠄁a󠄁k󠄁;󠄁 t󠄁h󠄁e󠄁 s󠄁t󠄁r󠄁e󠄁a󠄁k󠄁 r󠄁e󠄁s󠄁e󠄁t󠄁s󠄁 o󠄁n󠄁 t󠄁h󠄁e󠄁 n󠄁e󠄁x󠄁t󠄁 s󠄁u󠄁c󠄁c󠄁e󠄁s󠄁s󠄁f󠄁u󠄁l󠄁 s󠄁e󠄁a󠄁l󠄁
- Consecutive non-zero claude exits back off exponentially (2s, 4s, 8s... capped by `ZLOOP_BACKOFF_MAX`)
- Rewrites `.claude/zloop.state` (`iteration`, `max`, `start`, `mode`) every iteration; `bin/zheap-death` records `mode` as `stop_mode` in its events and `stop=<list>` in the tag message.󠄁 `󠄁.󠄁z󠄁o󠄁c󠄁i󠄁e󠄁t󠄁y󠄁/󠄁z󠄁l󠄁o󠄁o󠄁p󠄁.󠄁p󠄁r󠄁e󠄁v󠄁`󠄁 (󠄁t󠄁h󠄁e󠄁 m󠄁e󠄁m󠄁o󠄁r󠄁y󠄁 r󠄁e󠄁c󠄁o󠄁r󠄁d󠄁 a󠄁b󠄁o󠄁v󠄁e󠄁)󠄁 s󠄁i󠄁t󠄁s󠄁 b󠄁e󠄁s󠄁i󠄁d󠄁e󠄁 i󠄁t󠄁 a󠄁n󠄁d󠄁 s󠄁u󠄁r󠄁v󠄁i󠄁v󠄁e󠄁s󠄁 h󠄁e󠄁a󠄁p󠄁-󠄁d󠄁e󠄁a󠄁t󠄁h󠄁'󠄁s󠄁 r󠄁e󠄁m󠄁o󠄁v󠄁a󠄁l󠄁 o󠄁f󠄁 t󠄁h󠄁e󠄁 s󠄁t󠄁a󠄁t󠄁e󠄁 f󠄁i󠄁l󠄁e󠄁
- Ctrl-C (or SIGTERM/SIGHUP) stops the run immediately, in the container too:
  the agent gets SIGTERM, then SIGKILL after `ZLOOP_KILL_GRACE` seconds, the
  state file is removed and zloop exits 128+signal (130 for Ctrl-C). For a
  graceful stop between iterations use `--stop file` and touch `.claude/STOP`.
  Ctrl-Z is not job control inside the container; if a run is ever stuck,
  detach with `ctrl-p ctrl-q` and `podman kill zociety-sandbox`

| Script | Purpose |
|--------|---------|
| `bin/zloop [options] [n]` | Run autonomous loop, max n iterations (`--help` for flags) |
| `bin/zloop-complete [modes]` | Dispatch stop predicates (exit 0 stop, 1 continue, 2 abort) |
|󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁z󠄁p󠄁r󠄁o󠄁m󠄁p󠄁t󠄁 [󠄁-󠄁-󠄁b󠄁u󠄁d󠄁g󠄁e󠄁t󠄁 N󠄁]󠄁 [󠄁-󠄁-󠄁n󠄁o󠄁-󠄁c󠄁o󠄁n󠄁t󠄁e󠄁x󠄁t󠄁]󠄁`󠄁 |󠄁 T󠄁h󠄁e󠄁 p󠄁e󠄁r󠄁-󠄁i󠄁t󠄁e󠄁r󠄁a󠄁t󠄁i󠄁o󠄁n󠄁 p󠄁r󠄁o󠄁m󠄁p󠄁t󠄁 h󠄁a󠄁n󠄁d󠄁e󠄁d󠄁 t󠄁o󠄁 t󠄁h󠄁e󠄁 a󠄁g󠄁e󠄁n󠄁t󠄁,󠄁 s󠄁h󠄁a󠄁r󠄁e󠄁d󠄁 b󠄁y󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁z󠄁l󠄁o󠄁o󠄁p󠄁`󠄁 a󠄁n󠄁d󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁z󠄁g󠄁a󠄁-󠄁l󠄁o󠄁o󠄁p󠄁`󠄁:󠄁 P󠄁R󠄁O󠄁M󠄁P󠄁T󠄁.󠄁m󠄁d󠄁 i󠄁n󠄁l󠄁i󠄁n󠄁e󠄁d󠄁 v󠄁e󠄁r󠄁b󠄁a󠄁t󠄁i󠄁m󠄁 (󠄁w󠄁h󠄁e󠄁n󠄁 a󠄁t󠄁 m󠄁o󠄁s󠄁t󠄁 `󠄁Z󠄁P󠄁R󠄁O󠄁M󠄁P󠄁T󠄁_󠄁I󠄁N󠄁L󠄁I󠄁N󠄁E󠄁_󠄁M󠄁A󠄁X󠄁`󠄁=󠄁2󠄁0󠄁0󠄁 l󠄁i󠄁n󠄁e󠄁s󠄁;󠄁 e󠄁l󠄁s󠄁e󠄁 "󠄁r󠄁e󠄁a󠄁d󠄁 P󠄁R󠄁O󠄁M󠄁P󠄁T󠄁.󠄁m󠄁d󠄁"󠄁)󠄁,󠄁 a󠄁 "󠄁D󠄁o󠄁 n󠄁o󠄁w󠄁"󠄁 b󠄁l󠄁o󠄁c󠄁k󠄁 w󠄁i󠄁t󠄁h󠄁 t󠄁h󠄁e󠄁 a󠄁c󠄁t󠄁i󠄁o󠄁n󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁z󠄁s󠄁t󠄁a󠄁t󠄁e󠄁`󠄁 n󠄁a󠄁m󠄁e󠄁s󠄁,󠄁 i󠄁t󠄁s󠄁 e󠄁x󠄁a󠄁c󠄁t󠄁 c󠄁o󠄁m󠄁m󠄁a󠄁n󠄁d󠄁 a󠄁n󠄁d󠄁 w󠄁h󠄁a󠄁t󠄁 t󠄁o󠄁 r󠄁e󠄁a󠄁d󠄁 f󠄁i󠄁r󠄁s󠄁t󠄁 (󠄁u󠄁s󠄁u󠄁a󠄁l󠄁l󠄁y󠄁 n󠄁o󠄁t󠄁h󠄁i󠄁n󠄁g󠄁;󠄁 s󠄁t󠄁u󠄁f󠄁f󠄁/󠄁 f󠄁i󠄁l󠄁e󠄁s󠄁 o󠄁r󠄁 r󠄁u󠄁l󠄁e󠄁 v󠄁o󠄁t󠄁e󠄁s󠄁 a󠄁r󠄁e󠄁 l󠄁i󠄁s󠄁t󠄁e󠄁d󠄁 i󠄁n󠄁l󠄁i󠄁n󠄁e󠄁)󠄁 p󠄁l󠄁u󠄁s󠄁 a󠄁n󠄁 i󠄁n󠄁s󠄁t󠄁r󠄁u󠄁c󠄁t󠄁i󠄁o󠄁n󠄁 n󠄁o󠄁t󠄁 t󠄁o󠄁 r󠄁e󠄁-󠄁r󠄁e󠄁a󠄁d󠄁 P󠄁R󠄁O󠄁M󠄁P󠄁T󠄁.󠄁m󠄁d󠄁/󠄁A󠄁G󠄁E󠄁N󠄁T󠄁S󠄁.󠄁m󠄁d󠄁,󠄁 t󠄁h󠄁e󠄁 "󠄁P󠄁r󠄁e󠄁v󠄁i󠄁o󠄁u󠄁s󠄁 i󠄁t󠄁e󠄁r󠄁a󠄁t󠄁i󠄁o󠄁n󠄁"󠄁 s󠄁e󠄁c󠄁t󠄁i󠄁o󠄁n󠄁 w󠄁h󠄁e󠄁n󠄁 `󠄁.󠄁z󠄁o󠄁c󠄁i󠄁e󠄁t󠄁y󠄁/󠄁z󠄁l󠄁o󠄁o󠄁p󠄁.󠄁p󠄁r󠄁e󠄁v󠄁`󠄁 e󠄁x󠄁i󠄁s󠄁t󠄁s󠄁,󠄁 t󠄁h󠄁e󠄁n󠄁 t󠄁h󠄁e󠄁 "󠄁W󠄁h󠄁e󠄁r󠄁e󠄁 t󠄁h󠄁i󠄁n󠄁g󠄁s󠄁 s󠄁t󠄁a󠄁n󠄁d󠄁"󠄁 b󠄁l󠄁o󠄁c󠄁k󠄁 (󠄁`󠄁b󠄁i󠄁n󠄁/󠄁z󠄁s󠄁t󠄁a󠄁t󠄁e󠄁`󠄁,󠄁 t󠄁h󠄁e󠄁 s󠄁h󠄁o󠄁r󠄁t󠄁 g󠄁e󠄁n󠄁e󠄁s󠄁i󠄁s󠄁 l󠄁e󠄁g󠄁 (󠄁`󠄁n󠄁e󠄁x󠄁t󠄁`󠄁/󠄁`󠄁n󠄁e󠄁e󠄁d󠄁s󠄁`󠄁)󠄁,󠄁 t󠄁h󠄁e󠄁 b󠄁r󠄁a󠄁n󠄁c󠄁h󠄁,󠄁 t󠄁h󠄁e󠄁 l󠄁a󠄁t󠄁e󠄁s󠄁t󠄁 `󠄁[󠄁d󠄁i󠄁r󠄁e󠄁c󠄁t󠄁i󠄁o󠄁n󠄁]󠄁`󠄁/󠄁`󠄁[󠄁h󠄁e󠄁a󠄁p󠄁-󠄁d󠄁e󠄁a󠄁t󠄁h󠄁]󠄁`󠄁,󠄁 t󠄁h󠄁e󠄁 r󠄁e󠄁c󠄁e󠄁n󠄁t󠄁 l󠄁o󠄁g󠄁,󠄁 o󠄁n󠄁e󠄁 u󠄁s󠄁a󠄁g󠄁e󠄁 l󠄁i󠄁n󠄁e󠄁 p󠄁e󠄁r󠄁 a󠄁g󠄁e󠄁n󠄁t󠄁 c󠄁o󠄁m󠄁m󠄁a󠄁n󠄁d󠄁 a󠄁n󠄁d󠄁 t󠄁h󠄁e󠄁 g󠄁e󠄁n󠄁e󠄁s󠄁i󠄁s󠄁 t󠄁h󠄁r󠄁e󠄁s󠄁h󠄁o󠄁l󠄁d󠄁s󠄁)󠄁 a󠄁n󠄁d󠄁 t󠄁h󠄁e󠄁 w󠄁o󠄁r󠄁k󠄁i󠄁n󠄁g󠄁 b󠄁u󠄁d󠄁g󠄁e󠄁t󠄁.󠄁 B󠄁o󠄁t󠄁h󠄁 l󠄁o󠄁o󠄁p󠄁s󠄁 r󠄁e󠄁g󠄁e󠄁n󠄁e󠄁r󠄁a󠄁t󠄁e󠄁 i󠄁t󠄁 b󠄁e󠄁f󠄁o󠄁r󠄁e󠄁 e󠄁v󠄁e󠄁r󠄁y󠄁 i󠄁t󠄁e󠄁r󠄁a󠄁t󠄁i󠄁o󠄁n󠄁,󠄁 s󠄁o󠄁 t󠄁h󠄁e󠄁 b󠄁l󠄁o󠄁c󠄁k󠄁 i󠄁s󠄁 t󠄁h󠄁e󠄁 s󠄁t󠄁a󠄁t󠄁e󠄁 a󠄁f󠄁t󠄁e󠄁r󠄁 t󠄁h󠄁e󠄁 p󠄁r󠄁e󠄁v󠄁i󠄁o󠄁u󠄁s󠄁 t󠄁u󠄁r󠄁n󠄁 c󠄁o󠄁m󠄁m󠄁i󠄁t󠄁t󠄁e󠄁d󠄁.󠄁 `󠄁-󠄁-󠄁r󠄁e󠄁c󠄁o󠄁r󠄁d󠄁 -󠄁-󠄁i󠄁t󠄁e󠄁r󠄁a󠄁t󠄁i󠄁o󠄁n󠄁 N󠄁 -󠄁-󠄁a󠄁c󠄁t󠄁i󠄁o󠄁n󠄁 A󠄁 -󠄁-󠄁e󠄁x󠄁i󠄁t󠄁 N󠄁 -󠄁-󠄁e󠄁l󠄁a󠄁p󠄁s󠄁e󠄁d󠄁 N󠄁 -󠄁-󠄁b󠄁u󠄁d󠄁g󠄁e󠄁t󠄁 N󠄁 -󠄁-󠄁c󠄁o󠄁m󠄁m󠄁i󠄁t󠄁s󠄁 N󠄁 [󠄁-󠄁-󠄁r󠄁e󠄁s󠄁u󠄁l󠄁t󠄁 F󠄁I󠄁L󠄁E󠄁]󠄁 [󠄁-󠄁-󠄁r󠄁e󠄁n󠄁d󠄁e󠄁r󠄁 r󠄁a󠄁w󠄁]󠄁`󠄁 w󠄁r󠄁i󠄁t󠄁e󠄁s󠄁 `󠄁.󠄁z󠄁o󠄁c󠄁i󠄁e󠄁t󠄁y󠄁/󠄁z󠄁l󠄁o󠄁o󠄁p󠄁.󠄁p󠄁r󠄁e󠄁v󠄁`󠄁 i󠄁n󠄁s󠄁t󠄁e󠄁a󠄁d󠄁 |󠄁
| `bin/zcycle-id [--branch] current\|next` | Name the running cycle (`rev{N}-attempt{M}`; the branch name on a `cycle/*` branch, else derived from the last tag) or its successor (attempt+1) |
| `bin/zrender` | Render claude stream-json as compact progress lines (stdin to stderr, result text to stdout) |
| `bin/zstop-<mode>` | One stop predicate; prints `STOP: <mode> ...` or `CONTINUE: <mode> ...` |
| `bin/test-zstop-modes` | Dry-run harness: fake `claude` + throwaway repo, one case per mode |
| `bin/test-zcycle-id` | Dry-run harness for cycle identity: `zcycle-id`, the heap-death successor checkout, the zloop preflight |
|󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁t󠄁e󠄁s󠄁t󠄁-󠄁z󠄁g󠄁a󠄁-󠄁l󠄁o󠄁o󠄁p󠄁`󠄁 |󠄁 D󠄁r󠄁y󠄁-󠄁r󠄁u󠄁n󠄁 h󠄁a󠄁r󠄁n󠄁e󠄁s󠄁s󠄁 f󠄁o󠄁r󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁z󠄁g󠄁a󠄁-󠄁l󠄁o󠄁o󠄁p󠄁`󠄁:󠄁 t󠄁h󠄁r󠄁o󠄁w󠄁a󠄁w󠄁a󠄁y󠄁 b󠄁a󠄁r󠄁e󠄁 o󠄁r󠄁i󠄁g󠄁i󠄁n󠄁 +󠄁 c󠄁l󠄁o󠄁n󠄁e󠄁 +󠄁 f󠄁a󠄁k󠄁e󠄁 `󠄁c󠄁l󠄁a󠄁u󠄁d󠄁e󠄁`󠄁;󠄁 b󠄁u󠄁d󠄁g󠄁e󠄁t󠄁 d󠄁e󠄁l󠄁i󠄁v󠄁e󠄁r󠄁y󠄁,󠄁 h󠄁a󠄁r󠄁d󠄁 k󠄁i󠄁l󠄁l󠄁 a󠄁n󠄁d󠄁 a󠄁b󠄁o󠄁r󠄁t󠄁,󠄁 p󠄁e󠄁r󠄁-󠄁i󠄁t󠄁e󠄁r󠄁a󠄁t󠄁i󠄁o󠄁n󠄁 p󠄁r󠄁o󠄁m󠄁p󠄁t󠄁,󠄁 s󠄁e󠄁a󠄁l󠄁-󠄁f󠄁a󠄁i󠄁l󠄁u󠄁r󠄁e󠄁 a󠄁b󠄁o󠄁r󠄁t󠄁,󠄁 p󠄁u󠄁s󠄁h󠄁 a󠄁f󠄁t󠄁e󠄁r󠄁 c󠄁o󠄁m󠄁m󠄁i󠄁t󠄁,󠄁 k󠄁n󠄁o󠄁b󠄁 v󠄁a󠄁l󠄁i󠄁d󠄁a󠄁t󠄁i󠄁o󠄁n󠄁 |󠄁

### Stop Modes

Comma-separated list via `bin/zloop --stop LIST` or `ZLOOP_STOP=LIST` (flag wins).
The first predicate that exits 0 stops the loop. Always include `file` so a
human can halt a run with `touch .claude/STOP`.

| Mode | Stops when | Knobs |
|------|------------|-------|
| `action` | `bin/zstate` action is `stop` or `promise` (today's rule, the default) | - |
| `budget` | `[heap-death]` commits since loop start >= `ZSTOP_BUDGET`, or action is `promise` | `ZSTOP_BUDGET` |
| `converge` | `ZSTOP_PATIENCE` consecutive `cycle/*` branches are trivial: stuff tree identical to the prior cycle's, or fewer than `ZSTOP_MIN_STUFF` files under `stuff/` | `ZSTOP_PATIENCE`, `ZSTOP_MIN_STUFF` |
| `feedback` | latest `[heap-death]` since loop start has `"done": true` in its event data (`bin/zheap-death --done`) | - |
| `file` | `.claude/STOP` exists; removed on stop, owner and mtime reported | `ZSTOP_FILE` |

Recommended combos: `action,file`, `budget,file`, `budget,converge,file`, `feedback,file`.

```bash
bin/zloop --stop action,file 60
bin/zloop --stop budget,file 60                        # 3 heap-deaths then stop
ZLOOP_STOP=budget,converge,file ZSTOP_BUDGET=5 bin/zloop
bin/zloop --stop feedback,file 60                      # agent calls zheap-death --done
touch .claude/STOP                                     # stop a running loop by hand
bin/zloop-complete action,converge                     # dry-run predicates by hand
```

Dry runs by hand: `budget` and `feedback` exit 2 without a running loop's
`.claude/zloop.state` (they scope to `start..HEAD`), and `file` consumes the
marker (`.claude/STOP` is removed on stop), so keep those out of a dry run.

In `budget` mode `bin/zheap-death` defaults `batch_size` to
`ZSTOP_BUDGET - <heap-deaths so far>` so its event data agrees with the loop.
`bin/zheap-death` runs only on a `cycle/rev{N}-attempt{M}` branch so every
archive remains in a reviewable cycle lineage.

### zloop Environment Variables

| Variable | Default | Description |
|----------|---------|-------------|
| `ZLOOP_B󠄁U󠄁D󠄁G󠄁E󠄁T󠄁`󠄁 |󠄁 3󠄁0󠄁0󠄁 |󠄁 S󠄁e󠄁c󠄁o󠄁n󠄁d󠄁s󠄁 o󠄁f󠄁 w󠄁o󠄁r󠄁k󠄁 a󠄁n󠄁 i󠄁t󠄁e󠄁r󠄁a󠄁t󠄁i󠄁o󠄁n󠄁 i󠄁s󠄁 t󠄁o󠄁l󠄁d󠄁 i󠄁t󠄁 h󠄁a󠄁s󠄁.󠄁 P󠄁a󠄁s󠄁s󠄁e󠄁d󠄁 t󠄁o󠄁 t󠄁h󠄁e󠄁 a󠄁g󠄁e󠄁n󠄁t󠄁 i󠄁n󠄁 i󠄁t󠄁s󠄁 p󠄁r󠄁o󠄁m󠄁p󠄁t󠄁 s󠄁o󠄁 i󠄁t󠄁 c󠄁a󠄁n󠄁 s󠄁c󠄁o󠄁p󠄁e󠄁 t󠄁h󠄁e󠄁 t󠄁u󠄁r󠄁n󠄁 a󠄁n󠄁d󠄁 c󠄁o󠄁m󠄁m󠄁i󠄁t󠄁 i󠄁n󠄁 t󠄁i󠄁m󠄁e󠄁 |
|󠄁 `󠄁Z󠄁L󠄁O󠄁O󠄁P󠄁_󠄁B󠄁U󠄁D󠄁G󠄁E󠄁T󠄁_󠄁F󠄁L󠄁O󠄁O󠄁R󠄁`󠄁 |󠄁 1󠄁2󠄁0󠄁 |󠄁 B󠄁u󠄁d󠄁g󠄁e󠄁t󠄁s󠄁 b󠄁e󠄁l󠄁o󠄁w󠄁 t󠄁h󠄁i󠄁s󠄁 g󠄁e󠄁t󠄁 a󠄁 W󠄁A󠄁R󠄁N󠄁I󠄁N󠄁G󠄁 a󠄁t󠄁 s󠄁t󠄁a󠄁r󠄁t󠄁 (󠄁h󠄁e󠄁a󠄁p󠄁-󠄁d󠄁e󠄁a󠄁t󠄁h󠄁 a󠄁n󠄁d󠄁 c󠄁o󠄁n󠄁t󠄁r󠄁i󠄁b󠄁u󠄁t󠄁e󠄁 t󠄁u󠄁r󠄁n󠄁s󠄁 n󠄁e󠄁e󠄁d󠄁 1󠄁8󠄁0󠄁s󠄁+󠄁;󠄁 t󠄁h󠄁e󠄁 r󠄁u󠄁n󠄁 w󠄁i󠄁l󠄁l󠄁 o󠄁v󠄁e󠄁r󠄁r󠄁u󠄁n󠄁)󠄁.󠄁 N󠄁e󠄁v󠄁e󠄁r󠄁 a󠄁 r󠄁e󠄁f󠄁u󠄁s󠄁a󠄁l󠄁 |󠄁
|󠄁 `󠄁Z󠄁L󠄁O󠄁O󠄁P󠄁_󠄁I󠄁N󠄁T󠄁E󠄁R󠄁V󠄁A󠄁L󠄁`󠄁 |󠄁 1󠄁 |󠄁 S󠄁e󠄁c󠄁o󠄁n󠄁d󠄁s󠄁 o󠄁f󠄁 q󠄁u󠄁i󠄁e󠄁t󠄁 b󠄁e󠄁t󠄁w󠄁e󠄁e󠄁n󠄁 i󠄁t󠄁e󠄁r󠄁a󠄁t󠄁i󠄁o󠄁n󠄁s󠄁 (󠄁c󠄁a󠄁d󠄁e󠄁n󠄁c󠄁e󠄁,󠄁 a󠄁s󠄁 `󠄁w󠄁a󠄁t󠄁c󠄁h󠄁 -󠄁n󠄁`󠄁 m󠄁e󠄁a󠄁n󠄁s󠄁 i󠄁t󠄁)󠄁.󠄁 B󠄁o󠄁u󠄁n󠄁d󠄁s󠄁 n󠄁o󠄁 w󠄁o󠄁r󠄁k󠄁 |󠄁
|󠄁 `󠄁Z󠄁L󠄁O󠄁O󠄁P󠄁_󠄁T󠄁I󠄁M󠄁E󠄁O󠄁U󠄁T󠄁`󠄁 |󠄁 2󠄁x󠄁 b󠄁u󠄁d󠄁g󠄁e󠄁t󠄁 |󠄁 H󠄁a󠄁r󠄁d󠄁 k󠄁i󠄁l󠄁l󠄁:󠄁 `󠄁t󠄁i󠄁m󠄁e󠄁o󠄁u󠄁t󠄁`󠄁 S󠄁I󠄁G󠄁T󠄁E󠄁R󠄁M󠄁s󠄁 t󠄁h󠄁e󠄁 a󠄁g󠄁e󠄁n󠄁t󠄁 m󠄁i󠄁d󠄁-󠄁t󠄁o󠄁k󠄁e󠄁n󠄁 a󠄁n󠄁d󠄁 u󠄁n󠄁c󠄁o󠄁m󠄁m󠄁i󠄁t󠄁t󠄁e󠄁d󠄁 w󠄁o󠄁r󠄁k󠄁 i󠄁s󠄁 l󠄁o󠄁s󠄁t󠄁.󠄁 A󠄁 b󠄁a󠄁c󠄁k󠄁s󠄁t󠄁o󠄁p󠄁 f󠄁o󠄁r󠄁 a󠄁 h󠄁u󠄁n󠄁g󠄁 p󠄁r󠄁o󠄁c󠄁e󠄁s󠄁s󠄁,󠄁 n󠄁o󠄁t󠄁 t󠄁h󠄁e󠄁 w󠄁o󠄁r󠄁k󠄁i󠄁n󠄁g󠄁 b󠄁u󠄁d󠄁g󠄁e󠄁t󠄁.󠄁 M󠄁u󠄁s󠄁t󠄁 e󠄁x󠄁c󠄁e󠄁e󠄁d󠄁 `󠄁Z󠄁L󠄁O󠄁O󠄁P󠄁_󠄁B󠄁U󠄁D󠄁G󠄁E󠄁T󠄁`󠄁 |󠄁
|󠄁 `󠄁Z󠄁L󠄁O󠄁O󠄁P󠄁_󠄁M󠄁A󠄁X󠄁_󠄁T󠄁I󠄁M󠄁E󠄁O󠄁U󠄁T󠄁S󠄁`󠄁 |󠄁 3󠄁 |󠄁 C󠄁o󠄁n󠄁s󠄁e󠄁c󠄁u󠄁t󠄁i󠄁v󠄁e󠄁 h󠄁a󠄁r󠄁d󠄁 k󠄁i󠄁l󠄁l󠄁s󠄁 t󠄁h󠄁a󠄁t󠄁 a󠄁b󠄁o󠄁r󠄁t󠄁 t󠄁h󠄁e󠄁 r󠄁u󠄁n󠄁 w󠄁i󠄁t󠄁h󠄁 e󠄁x󠄁i󠄁t󠄁 3󠄁 (󠄁0󠄁 =󠄁 n󠄁e󠄁v󠄁e󠄁r󠄁 a󠄁b󠄁o󠄁r󠄁t󠄁)󠄁 |󠄁
|󠄁 `󠄁Z󠄁L󠄁O󠄁O󠄁P󠄁_󠄁M󠄁A󠄁X󠄁_󠄁S󠄁E󠄁A󠄁L󠄁_󠄁F󠄁A󠄁I󠄁L󠄁U󠄁R󠄁E󠄁S󠄁`󠄁 |󠄁 3󠄁 |󠄁 C󠄁o󠄁n󠄁s󠄁e󠄁c󠄁u󠄁t󠄁i󠄁v󠄁e󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁z󠄁b󠄁l󠄁i󠄁n󠄁d󠄁 s󠄁e󠄁a󠄁l󠄁`󠄁 f󠄁a󠄁i󠄁l󠄁u󠄁r󠄁e󠄁s󠄁 t󠄁h󠄁a󠄁t󠄁 a󠄁b󠄁o󠄁r󠄁t󠄁 t󠄁h󠄁e󠄁 r󠄁u󠄁n󠄁 w󠄁i󠄁t󠄁h󠄁 e󠄁x󠄁i󠄁t󠄁 4󠄁 (󠄁0󠄁 =󠄁 n󠄁e󠄁v󠄁e󠄁r󠄁 a󠄁b󠄁o󠄁r󠄁t󠄁)󠄁.󠄁 A󠄁 s󠄁k󠄁i󠄁p󠄁p󠄁e󠄁d󠄁 s󠄁e󠄁a󠄁l󠄁 (󠄁`󠄁Z󠄁O󠄁C󠄁I󠄁E󠄁T󠄁Y󠄁_󠄁B󠄁L󠄁I󠄁N󠄁D󠄁_󠄁K󠄁E󠄁Y󠄁`󠄁 u󠄁n󠄁s󠄁e󠄁t󠄁)󠄁 e󠄁x󠄁i󠄁t󠄁s󠄁 0󠄁 a󠄁n󠄁d󠄁 d󠄁o󠄁e󠄁s󠄁 n󠄁o󠄁t󠄁 c󠄁o󠄁u󠄁n󠄁t󠄁 |󠄁
| `ZLOOP_STOP` | action | Stop modes, comma-separated (see Stop Modes; `--stop` overrides) |
| `ZLOOP_DEBUG` | 0 | Enable debug output (1 = on) |
| `ZLOOP_QUIET` | 0 | Same as `--quiet`: buffered result only, no live render (1 = on) |
| `ZLOOP_VERBOSE` | 0 | Same as `--verbose`: raw stream-json events (1 = on) |
| `ZLOOP_BACKOFF_MAX` | 300 | Cap in seconds on the sleep after consecutive claude failures |
| `ZLOOP_KILL_GRACE` | 10 | Seconds to wait for the agent to exit on Ctrl-C/SIGTERM before SIGKILL |

### ZSTOP Environment Variables

| Variable | Default | Used by | Description |
|----------|---------|---------|-------------|
| `ZSTOP_BUDGET` | 3 | `budget`, `zheap-death` | Heap-deaths allowed since loop start |
| `ZSTOP_PATIENCE` | 2 | `converge` | Consecutive trivial cycles before stopping |
| `ZSTOP_MIN_STUFF` | 1 | `converge` | A cycle with fewer files under `stuff/` is trivial |
| `ZSTOP_FILE` | .claude/STOP | `file` | Marker file path |

## Git-Native Event Sourcing (rev50+)

All state is derived from git history. No mutable state files.

### How It Works

1. Agent runs `bin/zstate` to get current state and next action
2. Agent follows the action: contribute, complete, heap-death, or promise
3. Each action creates a commit with JSON payload in the message
4. State is reconstructed by parsing commit history

### Core Tools

| Script | Purpose |
|--------|---------|
| `bin/zstate` | Get current state and next action (JSON output) |
| `bin/zjoin` | Join as a member (󠄁n󠄁a󠄁m󠄁e󠄁 a󠄁s󠄁s󠄁i󠄁g󠄁n󠄁e󠄁d󠄁:󠄁 `󠄁m󠄁e󠄁m󠄁b󠄁e󠄁r󠄁-󠄁{󠄁N󠄁}󠄁`󠄁;󠄁 n󠄁o󠄁 m󠄁o󠄁d󠄁e󠄁l󠄁 i󠄁n󠄁 t󠄁h󠄁e󠄁 e󠄁v󠄁e󠄁n󠄁t󠄁)󠄁 |
|󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁z󠄁b󠄁l󠄁i󠄁n󠄁d󠄁`󠄁 |󠄁 S󠄁e󠄁a󠄁l󠄁 e󠄁a󠄁c󠄁h󠄁 l󠄁o󠄁o󠄁p󠄁 t󠄁u󠄁r󠄁n󠄁'󠄁s󠄁 m󠄁o󠄁d󠄁e󠄁l󠄁 u󠄁n󠄁d󠄁e󠄁r󠄁 `󠄁r󠄁e󠄁f󠄁s󠄁/󠄁n󠄁o󠄁t󠄁e󠄁s󠄁/󠄁b󠄁l󠄁i󠄁n󠄁d󠄁`󠄁 (󠄁`󠄁s󠄁e󠄁a󠄁l󠄁`󠄁)󠄁,󠄁 m󠄁a󠄁r󠄁k󠄁 i󠄁t󠄁 `󠄁k󠄁i󠄁n󠄁d󠄁:󠄁 a󠄁i󠄁`󠄁 u󠄁n󠄁d󠄁e󠄁r󠄁 `󠄁r󠄁e󠄁f󠄁s󠄁/󠄁n󠄁o󠄁t󠄁e󠄁s󠄁/󠄁a󠄁g󠄁e󠄁n󠄁t󠄁`󠄁,󠄁 a󠄁n󠄁d󠄁 d󠄁e󠄁c󠄁r󠄁y󠄁p󠄁t󠄁 a󠄁 c󠄁y󠄁c󠄁l󠄁e󠄁'󠄁s󠄁 m󠄁o󠄁d󠄁e󠄁l󠄁s󠄁 a󠄁t󠄁 h󠄁e󠄁a󠄁p󠄁-󠄁d󠄁e󠄁a󠄁t󠄁h󠄁 (󠄁`󠄁r󠄁e󠄁v󠄁e󠄁a󠄁l󠄁`󠄁)󠄁 |󠄁
| `bin/zstuff` | Record stuff creation |
| `bin/zvote` | Vote on a rule |
| `bin/zpass` | Record a rule passing |
| `bin/zcomplete` | Record genesis completion |
| `bin/zheap-death` | Archive cycle, prepare next (`--done` marks the hypothesis settled for `feedback` mode); on a `cycle/*` branch it births the successor branch (attempt+1) before the `[direction]` event |
| `bin/zcycle-id` | Name the running cycle or its successor (`current`/`next`, `--branch` for the `cycle/` form) |
| `bin/zcycle-measure` | Derive novelty, inheritance, diversity, constraint adherence, surprise, stability, and trace quality from committed cycle history |
| `bin/zpr-flow` | Open (and optionally merge) a cycle branch PR into main (workflow step, run by `bin/zheap-death`) |
| `bin/zgit` | Run git inside the container as zociety-dev (host wrapper; `--no-pager`, refuses stdin/editor forms) |
| `bin/zgh` | Run gh inside the container as zociety-dev (host wrapper; `GH_PAGER=cat`, refuses stdin/editor/`--web` forms) |
| `bin/shims/{git,gh}` | direnv PATH shims: in-worktree, route git writes + all gh through `zgit`/`zgh`; reads and out-of-worktree stay on host.󠄁 R󠄁e󠄁a󠄁d󠄁-󠄁o󠄁n󠄁l󠄁y󠄁 v󠄁e󠄁r󠄁b󠄁s󠄁 (󠄁`󠄁l󠄁o󠄁g󠄁`󠄁,󠄁 `󠄁d󠄁i󠄁f󠄁f󠄁`󠄁,󠄁 `󠄁s󠄁t󠄁a󠄁t󠄁u󠄁s󠄁`󠄁,󠄁 `󠄁s󠄁h󠄁o󠄁w󠄁`󠄁,󠄁 `󠄁r󠄁e󠄁v󠄁-󠄁p󠄁a󠄁r󠄁s󠄁e󠄁`󠄁,󠄁 .󠄁.󠄁.󠄁)󠄁 a󠄁l󠄁w󠄁a󠄁y󠄁s󠄁 s󠄁t󠄁a󠄁y󠄁;󠄁 m󠄁i󠄁x󠄁e󠄁d󠄁 v󠄁e󠄁r󠄁b󠄁s󠄁 s󠄁t󠄁a󠄁y󠄁 o󠄁n󠄁l󠄁y󠄁 i󠄁n󠄁 t󠄁h󠄁e󠄁i󠄁r󠄁 r󠄁e󠄁a󠄁d󠄁 f󠄁o󠄁r󠄁m󠄁s󠄁:󠄁 `󠄁b󠄁r󠄁a󠄁n󠄁c󠄁h󠄁`󠄁 l󠄁i󠄁s󠄁t󠄁i󠄁n󠄁g󠄁 (󠄁`󠄁-󠄁-󠄁s󠄁h󠄁o󠄁w󠄁-󠄁c󠄁u󠄁r󠄁r󠄁e󠄁n󠄁t󠄁`󠄁,󠄁 `󠄁-󠄁a󠄁`󠄁/󠄁`󠄁-󠄁r󠄁`󠄁/󠄁`󠄁-󠄁v󠄁`󠄁,󠄁 `󠄁-󠄁-󠄁c󠄁o󠄁n󠄁t󠄁a󠄁i󠄁n󠄁s󠄁`󠄁,󠄁 `󠄁-󠄁-󠄁m󠄁e󠄁r󠄁g󠄁e󠄁d󠄁`󠄁,󠄁 .󠄁.󠄁.󠄁 w󠄁i󠄁t󠄁h󠄁 n󠄁o󠄁 p󠄁o󠄁s󠄁i󠄁t󠄁i󠄁o󠄁n󠄁a󠄁l󠄁)󠄁,󠄁 `󠄁t󠄁a󠄁g󠄁 -󠄁l󠄁`󠄁,󠄁 `󠄁n󠄁o󠄁t󠄁e󠄁s󠄁 l󠄁i󠄁s󠄁t󠄁`󠄁/󠄁`󠄁s󠄁h󠄁o󠄁w󠄁`󠄁,󠄁 `󠄁r󠄁e󠄁m󠄁o󠄁t󠄁e󠄁 [󠄁-󠄁v󠄁]󠄁`󠄁/󠄁`󠄁s󠄁h󠄁o󠄁w󠄁`󠄁/󠄁`󠄁g󠄁e󠄁t󠄁-󠄁u󠄁r󠄁l󠄁`󠄁,󠄁 `󠄁c󠄁o󠄁n󠄁f󠄁i󠄁g󠄁 -󠄁-󠄁g󠄁e󠄁t󠄁`󠄁/󠄁`󠄁-󠄁-󠄁g󠄁e󠄁t󠄁-󠄁a󠄁l󠄁l󠄁`󠄁/󠄁`󠄁-󠄁-󠄁l󠄁i󠄁s󠄁t󠄁`󠄁,󠄁 `󠄁w󠄁o󠄁r󠄁k󠄁t󠄁r󠄁e󠄁e󠄁 l󠄁i󠄁s󠄁t󠄁`󠄁,󠄁 `󠄁s󠄁t󠄁a󠄁s󠄁h󠄁 l󠄁i󠄁s󠄁t󠄁`󠄁/󠄁`󠄁s󠄁h󠄁o󠄁w󠄁`󠄁.󠄁 A󠄁n󠄁y󠄁t󠄁h󠄁i󠄁n󠄁g󠄁 e󠄁l󠄁s󠄁e󠄁,󠄁 i󠄁n󠄁c󠄁l󠄁u󠄁d󠄁i󠄁n󠄁g󠄁 u󠄁n󠄁r󠄁e󠄁c󠄁o󠄁g󠄁n󠄁i󠄁s󠄁e󠄁d󠄁 o󠄁p󠄁t󠄁i󠄁o󠄁n󠄁s󠄁,󠄁 g󠄁o󠄁e󠄁s󠄁 t󠄁o󠄁 t󠄁h󠄁e󠄁 c󠄁o󠄁n󠄁t󠄁a󠄁i󠄁n󠄁e󠄁r󠄁 |
| `bin/zpromise` | Output completion promise |
| `bin/zevent` | Low-level event creation |
| `bin/zloop` | Autonomous loop with dynamic completion (`--stop` modes) |
| `bin/zloop-complete` | Dispatch stop predicates (exit 0 stop, 1 continue, 2 abort) |
|󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁z󠄁p󠄁r󠄁o󠄁m󠄁p󠄁t󠄁`󠄁 |󠄁 P󠄁e󠄁r󠄁-󠄁i󠄁t󠄁e󠄁r󠄁a󠄁t󠄁i󠄁o󠄁n󠄁 a󠄁g󠄁e󠄁n󠄁t󠄁 p󠄁r󠄁o󠄁m󠄁p󠄁t󠄁:󠄁 P󠄁R󠄁O󠄁M󠄁P󠄁T󠄁.󠄁m󠄁d󠄁 p󠄁o󠄁i󠄁n󠄁t󠄁e󠄁r󠄁,󠄁 g󠄁e󠄁n󠄁e󠄁r󠄁a󠄁t󠄁e󠄁d󠄁 s󠄁t󠄁a󠄁t󠄁e󠄁/󠄁d󠄁i󠄁r󠄁e󠄁c󠄁t󠄁i󠄁o󠄁n󠄁/󠄁c󠄁o󠄁m󠄁m󠄁a󠄁n󠄁d󠄁s󠄁 c󠄁o󠄁n󠄁t󠄁e󠄁x󠄁t󠄁,󠄁 w󠄁o󠄁r󠄁k󠄁i󠄁n󠄁g󠄁 b󠄁u󠄁d󠄁g󠄁e󠄁t󠄁 (󠄁s󠄁i󠄁n󠄁g󠄁l󠄁e󠄁 s󠄁o󠄁u󠄁r󠄁c󠄁e󠄁 f󠄁o󠄁r󠄁 b󠄁o󠄁t󠄁h󠄁 l󠄁o󠄁o󠄁p󠄁s󠄁)󠄁 |󠄁
| `bin/zrender` | Compact live render of claude's stream-json (used by `bin/zagent --render compact`) |
| `bin/zstop-action` | Stop predicate: action is `stop` or `promise` |
| `bin/zstop-budget` | Stop predicate: `ZSTOP_BUDGET` heap-deaths since loop start |
| `bin/zstop-converge` | Stop predicate: recent cycles stopped changing `stuff/` |
| `bin/zstop-feedback` | Stop predicate: latest heap-death since loop start says `done: true` |
| `bin/zstop-file` | Stop predicate: `.claude/STOP` exists |
| `bin/test-zstop-modes` | Dry-run harness for the stop modes |
|󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁t󠄁e󠄁s󠄁t󠄁-󠄁z󠄁g󠄁a󠄁-󠄁l󠄁o󠄁o󠄁p󠄁`󠄁 |󠄁 D󠄁r󠄁y󠄁-󠄁r󠄁u󠄁n󠄁 h󠄁a󠄁r󠄁n󠄁e󠄁s󠄁s󠄁 f󠄁o󠄁r󠄁 t󠄁h󠄁e󠄁 G󠄁i󠄁t󠄁H󠄁u󠄁b󠄁 A󠄁c󠄁t󠄁i󠄁o󠄁n󠄁s󠄁 r󠄁u󠄁n󠄁n󠄁e󠄁r󠄁 (󠄁l󠄁o󠄁c󠄁a󠄁l󠄁 b󠄁a󠄁r󠄁e󠄁 o󠄁r󠄁i󠄁g󠄁i󠄁n󠄁,󠄁 f󠄁a󠄁k󠄁e󠄁 `󠄁c󠄁l󠄁a󠄁u󠄁d󠄁e󠄁`󠄁)󠄁 |󠄁
|󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁t󠄁e󠄁s󠄁t󠄁-󠄁z󠄁b󠄁l󠄁i󠄁n󠄁d󠄁`󠄁 |󠄁 T󠄁h󠄁r󠄁o󠄁w󠄁a󠄁w󠄁a󠄁y󠄁-󠄁f󠄁i󠄁x󠄁t󠄁u󠄁r󠄁e󠄁 h󠄁a󠄁r󠄁n󠄁e󠄁s󠄁s󠄁 f󠄁o󠄁r󠄁 t󠄁h󠄁e󠄁 b󠄁l󠄁i󠄁n󠄁d󠄁 m󠄁o󠄁d󠄁e󠄁l󠄁 r󠄁e󠄁c󠄁o󠄁r󠄁d󠄁:󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁z󠄁b󠄁l󠄁i󠄁n󠄁d󠄁`󠄁,󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁z󠄁j󠄁o󠄁i󠄁n󠄁`󠄁 n󠄁a󠄁m󠄁i󠄁n󠄁g󠄁,󠄁 t󠄁h󠄁e󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁z󠄁a󠄁g󠄁e󠄁n󠄁t󠄁`󠄁 e󠄁n󠄁v󠄁 s󠄁c󠄁r󠄁u󠄁b󠄁,󠄁 t󠄁h󠄁e󠄁 `󠄁A󠄁g󠄁e󠄁n󠄁t󠄁:󠄁`󠄁 t󠄁r󠄁a󠄁i󠄁l󠄁e󠄁r󠄁 h󠄁o󠄁o󠄁k󠄁 a󠄁n󠄁d󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁n󠄁f󠄁p󠄁r󠄁o󠄁v󠄁-󠄁b󠄁l󠄁a󠄁m󠄁e󠄁.󠄁p󠄁y󠄁`󠄁 r󠄁u󠄁n󠄁g󠄁s󠄁 |󠄁
|󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁t󠄁e󠄁s󠄁t󠄁-󠄁z󠄁s󠄁h󠄁i󠄁m󠄁`󠄁 |󠄁 D󠄁r󠄁y󠄁-󠄁r󠄁u󠄁n󠄁 h󠄁a󠄁r󠄁n󠄁e󠄁s󠄁s󠄁 f󠄁o󠄁r󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁s󠄁h󠄁i󠄁m󠄁s󠄁/󠄁g󠄁i󠄁t󠄁`󠄁 r󠄁o󠄁u󠄁t󠄁i󠄁n󠄁g󠄁 (󠄁`󠄁Z󠄁S󠄁H󠄁I󠄁M󠄁_󠄁D󠄁R󠄁Y󠄁_󠄁R󠄁U󠄁N󠄁=󠄁1󠄁`󠄁 p󠄁r󠄁i󠄁n󠄁t󠄁s󠄁 h󠄁o󠄁s󠄁t󠄁/󠄁c󠄁o󠄁n󠄁t󠄁a󠄁i󠄁n󠄁e󠄁r󠄁,󠄁 n󠄁o󠄁 c󠄁o󠄁n󠄁t󠄁a󠄁i󠄁n󠄁e󠄁r󠄁 s󠄁t󠄁a󠄁r󠄁t󠄁e󠄁d󠄁)󠄁:󠄁 r󠄁e󠄁a󠄁d󠄁-󠄁o󠄁n󠄁l󠄁y󠄁 v󠄁e󠄁r󠄁b󠄁s󠄁,󠄁 t󠄁h󠄁e󠄁 m󠄁i󠄁x󠄁e󠄁d󠄁 v󠄁e󠄁r󠄁b󠄁s󠄁'󠄁 r󠄁e󠄁a󠄁d󠄁 a󠄁n󠄁d󠄁 w󠄁r󠄁i󠄁t󠄁e󠄁 f󠄁o󠄁r󠄁m󠄁s󠄁,󠄁 g󠄁l󠄁o󠄁b󠄁a󠄁l󠄁 o󠄁p󠄁t󠄁i󠄁o󠄁n󠄁s󠄁,󠄁 o󠄁u󠄁t󠄁-󠄁o󠄁f󠄁-󠄁w󠄁o󠄁r󠄁k󠄁t󠄁r󠄁e󠄁e󠄁 p󠄁a󠄁s󠄁s󠄁t󠄁h󠄁r󠄁o󠄁u󠄁g󠄁h󠄁 |󠄁
| `bin/test-prov-encoding` | Prove the provenance page's `vsToPua`/`puaToVs` match `nfprov` (exit 2 before the page exists) |
| `bin/test-zsite-archive` | Prove `docs/archive.html` and `docs/archive/<tag>.html` are a pure function of the `rev*` tags: generate in a throwaway copy, diff without `stuff/`, on rerun and after deleting a tag (exit 2 when no tag holds `stuff/*.md`);󠄁 t󠄁h󠄁e󠄁n󠄁 g󠄁e󠄁n󠄁e󠄁r󠄁a󠄁t󠄁e󠄁 a󠄁 1󠄁2󠄁0󠄁-󠄁t󠄁a󠄁g󠄁 s󠄁y󠄁n󠄁t󠄁h󠄁e󠄁t󠄁i󠄁c󠄁 r󠄁e󠄁p󠄁o󠄁 (󠄁o󠄁n󠄁e󠄁 `󠄁g󠄁i󠄁t󠄁 f󠄁a󠄁s󠄁t󠄁-󠄁i󠄁m󠄁p󠄁o󠄁r󠄁t󠄁`󠄁)󠄁 w󠄁i󠄁t󠄁h󠄁i󠄁n󠄁 `󠄁S󠄁C󠄁A󠄁L󠄁E󠄁_󠄁B󠄁U󠄁D󠄁G󠄁E󠄁T󠄁_󠄁S󠄁E󠄁C󠄁O󠄁N󠄁D󠄁S󠄁`󠄁 (󠄁d󠄁e󠄁f󠄁a󠄁u󠄁l󠄁t󠄁 3󠄁0󠄁)󠄁 s󠄁o󠄁 p󠄁e󠄁r󠄁-󠄁t󠄁a󠄁g󠄁 g󠄁i󠄁t󠄁 f󠄁a󠄁n󠄁-󠄁o󠄁u󠄁t󠄁 c󠄁a󠄁n󠄁n󠄁o󠄁t󠄁 c󠄁r󠄁e󠄁e󠄁p󠄁 b󠄁a󠄁c󠄁k󠄁 |
| `bin/zworkflow` | Propose GitHub Actions workflow |
| `bin/zworkflow-vote` | Vote on proposed workflow |
| `bin/zworkflow-pass` | Activate approved workflow |
| `bin/nfprov.py` | Vendored-verbatim canonical encoder from the fork (`mark`/`inspect`/`strip`/`convert`) |
| `bin/nfprov-diff.py` | Mark text added between a base and current file (`mark-added`); front end over `bin/nfprov.py` |
| `bin/nfprov-blame` | Attribute every character of a file to the commit that wrote it |
| `bin/zsite-generate` | Build `docs/` from git history (runs in CI on a clean checkout).󠄁 T󠄁h󠄁e󠄁 a󠄁r󠄁c󠄁h󠄁i󠄁v󠄁e󠄁 i󠄁s󠄁 g󠄁a󠄁t󠄁h󠄁e󠄁r󠄁e󠄁d󠄁 i󠄁n󠄁 f󠄁o󠄁u󠄁r󠄁 g󠄁i󠄁t󠄁 c󠄁a󠄁l󠄁l󠄁s󠄁 f󠄁o󠄁r󠄁 t󠄁h󠄁e󠄁 w󠄁h󠄁o󠄁l󠄁e󠄁 `󠄁r󠄁e󠄁v󠄁*󠄁`󠄁 t󠄁a󠄁g󠄁 s󠄁e󠄁t󠄁 (󠄁`󠄁f󠄁o󠄁r󠄁-󠄁e󠄁a󠄁c󠄁h󠄁-󠄁r󠄁e󠄁f󠄁`󠄁 f󠄁o󠄁r󠄁 n󠄁a󠄁m󠄁e󠄁s󠄁 a󠄁n󠄁d󠄁 d󠄁a󠄁t󠄁e󠄁s󠄁,󠄁 `󠄁g󠄁r󠄁e󠄁p󠄁 -󠄁L󠄁`󠄁 f󠄁o󠄁r󠄁 e󠄁a󠄁c󠄁h󠄁 t󠄁a󠄁g󠄁'󠄁s󠄁 `󠄁s󠄁t󠄁u󠄁f󠄁f󠄁/󠄁*󠄁.󠄁m󠄁d󠄁`󠄁,󠄁 `󠄁g󠄁r󠄁e󠄁p󠄁`󠄁 f󠄁o󠄁r󠄁 t󠄁h󠄁e󠄁i󠄁r󠄁 h󠄁1󠄁s󠄁,󠄁 `󠄁c󠄁a󠄁t󠄁-󠄁f󠄁i󠄁l󠄁e󠄁 -󠄁-󠄁b󠄁a󠄁t󠄁c󠄁h󠄁`󠄁 f󠄁o󠄁r󠄁 t󠄁h󠄁e󠄁 b󠄁o󠄁d󠄁i󠄁e󠄁s󠄁)󠄁,󠄁 n󠄁e󠄁v󠄁e󠄁r󠄁 p󠄁e󠄁r󠄁 t󠄁a󠄁g󠄁 o󠄁r󠄁 p󠄁e󠄁r󠄁 a󠄁r󠄁t󠄁i󠄁f󠄁a󠄁c󠄁t󠄁 |
| `bin/zsite-fonts` | Rebuild the P+ WOFF2 files in `site/fonts/` from a TTF |

### Provenance (delano/nerd-fonts#15)

Agent-written text is marked in-band so a P+ font renders it distinctly.
The encoding is the fork's, not ours: U+E0101 (VARIATION SELECTOR-18)
after each AI character, or Supplementary PUA-B (U+100000 + codepoint)
in `pua` mode. Never reimplement it. The marked set is the 188 printable
Latin-1 characters U+0021-U+00FF (soft hyphen excluded); VS17 is human,
VS18 is ai, VS19 is unknown, and plane 16 addresses the ai variants only.
Everything else (Greek, Cyrillic, icons, U+2192) passes through unmarked:
nfprov still emits base+VS18, but the font has no such sequence, so every
renderer drops the selector and draws the plain glyph. No tofu, no mark.
Width (Mono, Propo, proportional) is a separate P+ face, not a selector.
WebKit (Safari, Orion) ignores the VS sequences entirely because both
shape text with CoreText, which drops an unregistered variation selector
before the P+ face ever sees it; the page falls back to PUA-B display
there (#13). Any other CoreText consumer has the same gap, including
non-browser apps such as the Zed editor — VS18 text pastes in unmarked,
PUA-B pastes in marked. `bin/nfprov.py` and
`bin/nfprov-mapping.json` are vendored verbatim from the fork (`bin/nfprov.py`
is the fork's reference encoder; `bin/nfprov-diff.py` is zociety's own
`mark-added` front end over it); update the vendored pair by copying, and
keep the source SHA in the header.

A󠄁t󠄁t󠄁r󠄁i󠄁b󠄁u󠄁t󠄁i󠄁o󠄁n󠄁 i󠄁s󠄁 h󠄁a󠄁r󠄁n󠄁e󠄁s󠄁s󠄁-󠄁w󠄁r󠄁i󠄁t󠄁t󠄁e󠄁n󠄁,󠄁 n󠄁o󠄁t󠄁 i󠄁n󠄁f󠄁e󠄁r󠄁r󠄁e󠄁d󠄁 f󠄁r󠄁o󠄁m󠄁 c󠄁o󠄁m󠄁m󠄁i󠄁t󠄁 c󠄁o󠄁n󠄁v󠄁e󠄁n󠄁t󠄁i󠄁o󠄁n󠄁s󠄁.󠄁
`󠄁b󠄁i󠄁n󠄁/󠄁n󠄁f󠄁p󠄁r󠄁o󠄁v󠄁-󠄁b󠄁l󠄁a󠄁m󠄁e󠄁.󠄁p󠄁y󠄁`󠄁 r󠄁e󠄁a󠄁d󠄁s󠄁,󠄁 i󠄁n󠄁 o󠄁r󠄁d󠄁e󠄁r󠄁:󠄁 t󠄁h󠄁e󠄁 `󠄁r󠄁e󠄁f󠄁s󠄁/󠄁n󠄁o󠄁t󠄁e󠄁s󠄁/󠄁a󠄁g󠄁e󠄁n󠄁t󠄁`󠄁 n󠄁o󠄁t󠄁e
`b󠄁i󠄁n󠄁/󠄁z󠄁b󠄁l󠄁i󠄁n󠄁d󠄁 s󠄁e󠄁a󠄁l󠄁`󠄁 a󠄁t󠄁t󠄁a󠄁c󠄁h󠄁e󠄁s󠄁 t󠄁o󠄁 e󠄁v󠄁e󠄁r󠄁y󠄁 l󠄁o󠄁o󠄁p󠄁 t󠄁u󠄁r󠄁n󠄁 (󠄁`󠄁k󠄁i󠄁n󠄁d󠄁:󠄁 a󠄁i󠄁`󠄁;󠄁 t󠄁h󠄁e󠄁 n󠄁a󠄁m󠄁e󠄁 i󠄁s󠄁 t󠄁h󠄁e󠄁
n󠄁o󠄁t󠄁e󠄁'󠄁s󠄁 `󠄁m󠄁o󠄁d󠄁e󠄁l󠄁:󠄁`󠄁 l󠄁i󠄁n󠄁e󠄁 o󠄁n󠄁c󠄁e󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁z󠄁b󠄁l󠄁i󠄁n󠄁d󠄁 r󠄁e󠄁v󠄁e󠄁a󠄁l󠄁`󠄁 h󠄁a󠄁s󠄁 a󠄁d󠄁d󠄁e󠄁d󠄁 i󠄁t󠄁,󠄁 e󠄁l󠄁s󠄁e󠄁 `󠄁s󠄁e󠄁a󠄁l󠄁e󠄁d󠄁`󠄁)󠄁;󠄁
t󠄁h󠄁e󠄁 `󠄁A󠄁g󠄁e󠄁n󠄁t󠄁:󠄁`󠄁 t󠄁r󠄁a󠄁i󠄁l󠄁e󠄁r󠄁 `󠄁.󠄁g󠄁i󠄁t󠄁h󠄁o󠄁o󠄁k󠄁s󠄁/󠄁p󠄁r󠄁e󠄁p󠄁a󠄁r󠄁e󠄁-󠄁c󠄁o󠄁m󠄁m󠄁i󠄁t󠄁-󠄁m󠄁s󠄁g󠄁`󠄁 a󠄁p󠄁p󠄁e󠄁n󠄁d󠄁s󠄁 t󠄁o󠄁 c󠄁o󠄁m󠄁m󠄁i󠄁t󠄁s󠄁 m󠄁a󠄁d󠄁e󠄁
f󠄁r󠄁o󠄁m󠄁 a󠄁 C󠄁l󠄁a󠄁u󠄁d󠄁e󠄁 C󠄁o󠄁d󠄁e󠄁 s󠄁h󠄁e󠄁l󠄁l󠄁 (󠄁`󠄁c󠄁l󠄁a󠄁u󠄁d󠄁e󠄁-󠄁c󠄁o󠄁d󠄁e󠄁`󠄁,󠄁 o󠄁r󠄁 `󠄁c󠄁l󠄁a󠄁u󠄁d󠄁e󠄁-󠄁c󠄁o󠄁d󠄁e󠄁/󠄁<󠄁m󠄁o󠄁d󠄁e󠄁l󠄁>󠄁`󠄁)󠄁;󠄁 a󠄁
`󠄁C󠄁o󠄁-󠄁A󠄁u󠄁t󠄁h󠄁o󠄁r󠄁e󠄁d󠄁-󠄁B󠄁y󠄁:󠄁 C󠄁l󠄁a󠄁u󠄁d󠄁e󠄁`󠄁 t󠄁r󠄁a󠄁i󠄁l󠄁e󠄁r󠄁;󠄁 t󠄁h󠄁e󠄁n󠄁,󠄁 a󠄁s󠄁 a󠄁 l󠄁e󠄁g󠄁a󠄁c󠄁y󠄁 f󠄁a󠄁l󠄁l󠄁b󠄁a󠄁c󠄁k󠄁 o󠄁n󠄁l󠄁y󠄁,󠄁 t󠄁h󠄁e󠄁
`󠄁[󠄁e󠄁v󠄁e󠄁n󠄁t󠄁]󠄁`󠄁 s󠄁u󠄁b󠄁j󠄁e󠄁c󠄁t󠄁 p󠄁r󠄁e󠄁f󠄁i󠄁x󠄁 (󠄁n󠄁a󠄁m󠄁e󠄁 f󠄁r󠄁o󠄁m󠄁 t󠄁h󠄁e󠄁 z󠄁e󠄁v󠄁e󠄁n󠄁t󠄁 e󠄁n󠄁v󠄁e󠄁l󠄁o󠄁p󠄁e󠄁)󠄁;󠄁 e󠄁v󠄁e󠄁r󠄁y󠄁t󠄁h󠄁i󠄁n󠄁g󠄁 e󠄁l󠄁s󠄁e󠄁
i󠄁s󠄁 t󠄁h󠄁e󠄁 h󠄁u󠄁m󠄁a󠄁n󠄁.󠄁 I󠄁n󠄁s󠄁i󠄁d󠄁e󠄁 a󠄁 l󠄁i󠄁v󠄁e󠄁 c󠄁y󠄁c󠄁l󠄁e󠄁 t󠄁h󠄁e󠄁 m󠄁o󠄁d󠄁e󠄁l󠄁 i󠄁s󠄁 s󠄁e󠄁a󠄁l󠄁e󠄁d󠄁,󠄁 s󠄁o󠄁 t󠄁h󠄁e󠄁 p󠄁a󠄁g󠄁e󠄁 s󠄁h󠄁o󠄁w󠄁s󠄁
a󠄁g󠄁e󠄁n󠄁t󠄁 t󠄁u󠄁r󠄁n󠄁s󠄁 a󠄁s󠄁 `󠄁s󠄁e󠄁a󠄁l󠄁e󠄁d󠄁`󠄁 u󠄁n󠄁t󠄁i󠄁l󠄁 t󠄁h󠄁e󠄁 c󠄁y󠄁c󠄁l󠄁e󠄁'󠄁s󠄁 h󠄁e󠄁a󠄁p󠄁-󠄁d󠄁e󠄁a󠄁t󠄁h󠄁 r󠄁e󠄁v󠄁e󠄁a󠄁l󠄁s󠄁 t󠄁h󠄁e󠄁m󠄁;󠄁 t󠄁h󠄁e󠄁
r󠄁e󠄁v󠄁e󠄁a󠄁l󠄁 a󠄁p󠄁p󠄁e󠄁n󠄁d󠄁s󠄁 `󠄁m󠄁o󠄁d󠄁e󠄁l󠄁:󠄁`󠄁 t󠄁o󠄁 e󠄁a󠄁c󠄁h󠄁 t󠄁u󠄁r󠄁n󠄁'󠄁s󠄁 n󠄁o󠄁t󠄁e󠄁 a󠄁n󠄁d󠄁 t󠄁h󠄁e󠄁 p󠄁a󠄁g󠄁e󠄁 r󠄁e󠄁s󠄁o󠄁l󠄁v󠄁e󠄁s󠄁 o󠄁n󠄁 t󠄁h󠄁e󠄁
n󠄁e󠄁x󠄁t󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁z󠄁s󠄁i󠄁t󠄁e󠄁-󠄁g󠄁e󠄁n󠄁e󠄁r󠄁a󠄁t󠄁e󠄁`󠄁.󠄁 O󠄁v󠄁e󠄁r󠄁-󠄁m󠄁a󠄁r󠄁k󠄁i󠄁n󠄁g󠄁 i󠄁s󠄁 t󠄁h󠄁e󠄁 a󠄁c󠄁c󠄁e󠄁p󠄁t󠄁e󠄁d󠄁 f󠄁a󠄁i󠄁l󠄁u󠄁r󠄁e󠄁 d󠄁i󠄁r󠄁e󠄁c󠄁t󠄁i󠄁o󠄁n󠄁.󠄁
`󠄁d󠄁o󠄁c󠄁s󠄁/󠄁p󠄁r󠄁o󠄁v󠄁e󠄁n󠄁a󠄁n󠄁c󠄁e󠄁.󠄁h󠄁t󠄁m󠄁l󠄁`󠄁 s󠄁h󠄁o󠄁w󠄁s󠄁 `󠄁A󠄁G󠄁E󠄁N󠄁T󠄁S󠄁.󠄁m󠄁d󠄁`󠄁 b󠄁e󠄁c󠄁a󠄁u󠄁s󠄁e󠄁 `󠄁P󠄁R󠄁O󠄁M󠄁P󠄁T󠄁.󠄁m󠄁d󠄁`󠄁 i󠄁s󠄁 n󠄁i󠄁n󠄁e󠄁 l󠄁i󠄁n󠄁e󠄁s󠄁
s󠄁i󠄁n󠄁c󠄁e󠄁 r󠄁e󠄁v󠄁6󠄁6󠄁.󠄁 I󠄁t󠄁 r󠄁e󠄁a󠄁d󠄁 0󠄁%󠄁 a󠄁g󠄁e󠄁n󠄁t󠄁 i󠄁n󠄁p󠄁u󠄁t󠄁 b󠄁e󠄁f󠄁o󠄁r󠄁e󠄁 t󠄁h󠄁i󠄁s󠄁 s󠄁c󠄁h󠄁e󠄁m󠄁e󠄁 b󠄁e󠄁c󠄁a󠄁u󠄁s󠄁e󠄁 e󠄁v󠄁e󠄁r󠄁y󠄁
c󠄁o󠄁m󠄁m󠄁i󠄁t󠄁 t󠄁h󠄁a󠄁t󠄁 e󠄁v󠄁e󠄁r󠄁 t󠄁o󠄁u󠄁c󠄁h󠄁e󠄁d󠄁 `󠄁A󠄁G󠄁E󠄁N󠄁T󠄁S󠄁.󠄁m󠄁d󠄁`󠄁 w󠄁a󠄁s󠄁 a󠄁 p󠄁l󠄁a󠄁i󠄁n󠄁-󠄁s󠄁u󠄁b󠄁j󠄁e󠄁c󠄁t󠄁 d󠄁e󠄁v󠄁-󠄁s󠄁e󠄁s󠄁s󠄁i󠄁o󠄁n󠄁
c󠄁o󠄁m󠄁m󠄁i󠄁t󠄁:󠄁 w󠄁r󠄁i󠄁t󠄁t󠄁e󠄁n󠄁 w󠄁i󠄁t󠄁h󠄁 a󠄁 c󠄁o󠄁d󠄁i󠄁n󠄁g󠄁 a󠄁g󠄁e󠄁n󠄁t󠄁,󠄁 b󠄁u󠄁t󠄁 c󠄁a󠄁r󠄁r󠄁y󠄁i󠄁n󠄁g󠄁 n󠄁o󠄁 `󠄁[󠄁e󠄁v󠄁e󠄁n󠄁t󠄁]󠄁`󠄁 p󠄁r󠄁e󠄁f󠄁i󠄁x󠄁,󠄁 n󠄁o󠄁
`󠄁C󠄁o󠄁-󠄁A󠄁u󠄁t󠄁h󠄁o󠄁r󠄁e󠄁d󠄁-󠄁B󠄁y󠄁`󠄁 t󠄁r󠄁a󠄁i󠄁l󠄁e󠄁r󠄁 a󠄁n󠄁d󠄁 n󠄁o󠄁 n󠄁o󠄁t󠄁e󠄁,󠄁 s󠄁o󠄁 t󠄁h󠄁e󠄁 c󠄁o󠄁n󠄁v󠄁e󠄁n󠄁t󠄁i󠄁o󠄁n󠄁-󠄁o󠄁n󠄁l󠄁y󠄁 r󠄁u󠄁l󠄁e󠄁 h󠄁a󠄁d󠄁
n󠄁o󠄁t󠄁h󠄁i󠄁n󠄁g󠄁 t󠄁o󠄁 k󠄁e󠄁y󠄁 o󠄁n󠄁.󠄁 T󠄁h󠄁e󠄁 `󠄁A󠄁g󠄁e󠄁n󠄁t󠄁:󠄁`󠄁 t󠄁r󠄁a󠄁i󠄁l󠄁e󠄁r󠄁 c󠄁l󠄁o󠄁s󠄁e󠄁s󠄁 t󠄁h󠄁a󠄁t󠄁 g󠄁a󠄁p󠄁 f󠄁o󠄁r󠄁 n󠄁e󠄁w󠄁 c󠄁o󠄁m󠄁m󠄁i󠄁t󠄁s󠄁;󠄁
h󠄁i󠄁s󠄁t󠄁o󠄁r󠄁y󠄁 b󠄁e󠄁f󠄁o󠄁r󠄁e󠄁 i󠄁t󠄁 s󠄁t󠄁a󠄁y󠄁s󠄁 h󠄁u󠄁m󠄁a󠄁n󠄁-󠄁a󠄁t󠄁t󠄁r󠄁i󠄁b󠄁u󠄁t󠄁e󠄁d󠄁.󠄁

#󠄁#󠄁#󠄁 B󠄁l󠄁i󠄁n󠄁d󠄁 m󠄁o󠄁d󠄁e󠄁l󠄁 r󠄁e󠄁c󠄁o󠄁r󠄁d󠄁

A󠄁g󠄁e󠄁n󠄁t󠄁s󠄁 m󠄁u󠄁s󠄁t󠄁 n󠄁o󠄁t󠄁 l󠄁e󠄁a󠄁r󠄁n󠄁 w󠄁h󠄁i󠄁c󠄁h󠄁 m󠄁o󠄁d󠄁e󠄁l󠄁 a󠄁n󠄁o󠄁t󠄁h󠄁e󠄁r󠄁 m󠄁e󠄁m󠄁b󠄁e󠄁r󠄁 i󠄁s󠄁,󠄁 o󠄁r󠄁 w󠄁h󠄁i󠄁c󠄁h󠄁 m󠄁o󠄁d󠄁e󠄁l󠄁 t󠄁h󠄁e󠄁y󠄁
a󠄁r󠄁e󠄁,󠄁 f󠄁r󠄁o󠄁m󠄁 t󠄁h󠄁e󠄁 r󠄁e󠄁p󠄁o󠄁s󠄁i󠄁t󠄁o󠄁r󠄁y󠄁 (󠄁`󠄁d󠄁o󠄁c󠄁s󠄁/󠄁c󠄁h󠄁a󠄁l󠄁l󠄁e󠄁n󠄁g󠄁e󠄁s󠄁/󠄁c󠄁r󠄁o󠄁s󠄁s󠄁-󠄁a󠄁g󠄁e󠄁n󠄁t󠄁-󠄁d󠄁e󠄁f󠄁e󠄁r󠄁e󠄁n󠄁c󠄁e󠄁.󠄁m󠄁d󠄁`󠄁)󠄁.󠄁 S󠄁o󠄁:󠄁

-󠄁 `󠄁[󠄁j󠄁o󠄁i󠄁n󠄁]󠄁`󠄁 e󠄁v󠄁e󠄁n󠄁t󠄁s󠄁 c󠄁a󠄁r󠄁r󠄁y󠄁 `󠄁{󠄁r󠄁o󠄁l󠄁e󠄁,󠄁 g󠄁r󠄁e󠄁e󠄁t󠄁i󠄁n󠄁g󠄁}󠄁`󠄁 a󠄁n󠄁d󠄁 n󠄁o󠄁 m󠄁o󠄁d󠄁e󠄁l󠄁;󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁z󠄁j󠄁o󠄁i󠄁n󠄁`󠄁 a󠄁s󠄁s󠄁i󠄁g󠄁n󠄁s󠄁
  t󠄁h󠄁e󠄁 m󠄁e󠄁m󠄁b󠄁e󠄁r󠄁 n󠄁a󠄁m󠄁e󠄁 `󠄁m󠄁e󠄁m󠄁b󠄁e󠄁r󠄁-󠄁{󠄁N󠄁}󠄁`󠄁 (󠄁m󠄁e󠄁m󠄁b󠄁e󠄁r󠄁 c󠄁o󠄁u󠄁n󠄁t󠄁 +󠄁 1󠄁)󠄁 a󠄁n󠄁d󠄁 i󠄁g󠄁n󠄁o󠄁r󠄁e󠄁s󠄁 a󠄁 r󠄁e󠄁q󠄁u󠄁e󠄁s󠄁t󠄁e󠄁d󠄁 o󠄁n󠄁e󠄁.󠄁
-󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁z󠄁a󠄁g󠄁e󠄁n󠄁t󠄁`󠄁 p󠄁a󠄁s󠄁s󠄁e󠄁s󠄁 t󠄁h󠄁e󠄁 m󠄁o󠄁d󠄁e󠄁l󠄁 t󠄁o󠄁 t󠄁h󠄁e󠄁 c󠄁l󠄁i󠄁e󠄁n󠄁t󠄁 a󠄁s󠄁 a󠄁 f󠄁l󠄁a󠄁g󠄁 a󠄁n󠄁d󠄁 s󠄁t󠄁a󠄁r󠄁t󠄁s󠄁 i󠄁t󠄁 w󠄁i󠄁t󠄁h󠄁
  `󠄁A󠄁N󠄁T󠄁H󠄁R󠄁O󠄁P󠄁I󠄁C󠄁_󠄁M󠄁O󠄁D󠄁E󠄁L󠄁`󠄁,󠄁 `󠄁G󠄁E󠄁M󠄁I󠄁N󠄁I󠄁_󠄁M󠄁O󠄁D󠄁E󠄁L󠄁`󠄁,󠄁 `󠄁Z󠄁O󠄁C󠄁I󠄁E󠄁T󠄁Y󠄁_󠄁A󠄁G󠄁E󠄁N󠄁T󠄁_󠄁C󠄁L󠄁I󠄁E󠄁N󠄁T󠄁`󠄁 a󠄁n󠄁d󠄁
  `󠄁Z󠄁O󠄁C󠄁I󠄁E󠄁T󠄁Y󠄁_󠄁B󠄁L󠄁I󠄁N󠄁D󠄁_󠄁K󠄁E󠄁Y󠄁`󠄁 r󠄁e󠄁m󠄁o󠄁v󠄁e󠄁d󠄁 f󠄁r󠄁o󠄁m󠄁 t󠄁h󠄁e󠄁 e󠄁n󠄁v󠄁i󠄁r󠄁o󠄁n󠄁m󠄁e󠄁n󠄁t󠄁.󠄁
-󠄁 T󠄁h󠄁e󠄁 l󠄁o󠄁o󠄁p󠄁,󠄁 n󠄁e󠄁v󠄁e󠄁r󠄁 t󠄁h󠄁e󠄁 a󠄁g󠄁e󠄁n󠄁t󠄁,󠄁 r󠄁e󠄁c󠄁o󠄁r󠄁d󠄁s󠄁 t󠄁h󠄁e󠄁 m󠄁o󠄁d󠄁e󠄁l󠄁.󠄁 A󠄁f󠄁t󠄁e󠄁r󠄁 e󠄁v󠄁e󠄁r󠄁y󠄁 i󠄁t󠄁e󠄁r󠄁a󠄁t󠄁i󠄁o󠄁n󠄁
  `󠄁b󠄁i󠄁n󠄁/󠄁z󠄁l󠄁o󠄁o󠄁p󠄁`󠄁 (󠄁r󠄁u󠄁n󠄁n󠄁e󠄁r󠄁 `󠄁l󠄁o󠄁c󠄁a󠄁l󠄁`󠄁)󠄁 a󠄁n󠄁d󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁z󠄁g󠄁a󠄁-󠄁l󠄁o󠄁o󠄁p󠄁`󠄁 (󠄁r󠄁u󠄁n󠄁n󠄁e󠄁r󠄁 `󠄁g󠄁i󠄁t󠄁h󠄁u󠄁b󠄁-󠄁a󠄁c󠄁t󠄁i󠄁o󠄁n󠄁s󠄁`󠄁)󠄁
  r󠄁u󠄁n󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁z󠄁b󠄁l󠄁i󠄁n󠄁d󠄁 s󠄁e󠄁a󠄁l󠄁 <󠄁p󠄁r󠄁e󠄁v󠄁-󠄁h󠄁e󠄁a󠄁d󠄁>󠄁 H󠄁E󠄁A󠄁D󠄁 <󠄁m󠄁o󠄁d󠄁e󠄁l󠄁>󠄁 <󠄁c󠄁l󠄁i󠄁e󠄁n󠄁t󠄁>󠄁 <󠄁r󠄁u󠄁n󠄁n󠄁e󠄁r󠄁>󠄁`󠄁:󠄁 e󠄁a󠄁c󠄁h󠄁 n󠄁e󠄁w󠄁
  c󠄁o󠄁m󠄁m󠄁i󠄁t󠄁 g󠄁e󠄁t󠄁s󠄁 `󠄁{󠄁m󠄁o󠄁d󠄁e󠄁l󠄁,󠄁 c󠄁l󠄁i󠄁e󠄁n󠄁t󠄁,󠄁 r󠄁u󠄁n󠄁n󠄁e󠄁r󠄁,󠄁 t󠄁s󠄁}󠄁`󠄁 e󠄁n󠄁c󠄁r󠄁y󠄁p󠄁t󠄁e󠄁d󠄁 w󠄁i󠄁t󠄁h󠄁
  `󠄁g󠄁p󠄁g󠄁 -󠄁-󠄁s󠄁y󠄁m󠄁m󠄁e󠄁t󠄁r󠄁i󠄁c󠄁`󠄁 u󠄁n󠄁d󠄁e󠄁r󠄁 `󠄁r󠄁e󠄁f󠄁s󠄁/󠄁n󠄁o󠄁t󠄁e󠄁s󠄁/󠄁b󠄁l󠄁i󠄁n󠄁d󠄁`󠄁,󠄁 p󠄁l󠄁u󠄁s󠄁 a󠄁 p󠄁l󠄁a󠄁i󠄁n󠄁t󠄁e󠄁x󠄁t󠄁
  `󠄁r󠄁e󠄁f󠄁s󠄁/󠄁n󠄁o󠄁t󠄁e󠄁s󠄁/󠄁a󠄁g󠄁e󠄁n󠄁t󠄁`󠄁 n󠄁o󠄁t󠄁e󠄁 o󠄁f󠄁 `󠄁k󠄁i󠄁n󠄁d󠄁:󠄁 a󠄁i󠄁`󠄁 a󠄁n󠄁d󠄁 `󠄁r󠄁u󠄁n󠄁n󠄁e󠄁r󠄁:󠄁`󠄁 o󠄁n󠄁l󠄁y󠄁.󠄁
-󠄁 W󠄁h󠄁i󠄁c󠄁h󠄁e󠄁v󠄁e󠄁r󠄁 r󠄁u󠄁n󠄁n󠄁e󠄁r󠄁 o󠄁b󠄁s󠄁e󠄁r󠄁v󠄁e󠄁s󠄁 a󠄁 `󠄁[󠄁h󠄁e󠄁a󠄁p󠄁-󠄁d󠄁e󠄁a󠄁t󠄁h󠄁]󠄁`󠄁 c󠄁o󠄁m󠄁m󠄁i󠄁t󠄁 r󠄁u󠄁n󠄁s󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁z󠄁b󠄁l󠄁i󠄁n󠄁d󠄁 r󠄁e󠄁v󠄁e󠄁a󠄁l󠄁
  <󠄁s󠄁h󠄁a󠄁>󠄁`󠄁:󠄁 i󠄁t󠄁 d󠄁e󠄁c󠄁r󠄁y󠄁p󠄁t󠄁s󠄁 t󠄁h󠄁e󠄁 c󠄁y󠄁c󠄁l󠄁e󠄁'󠄁s󠄁 n󠄁o󠄁t󠄁e󠄁s󠄁 (󠄁p󠄁r󠄁e󠄁v󠄁i󠄁o󠄁u󠄁s󠄁 `󠄁r󠄁e󠄁v󠄁*󠄁-󠄁a󠄁t󠄁t󠄁e󠄁m󠄁p󠄁t󠄁*󠄁`󠄁 t󠄁a󠄁g󠄁 t󠄁o󠄁 t󠄁h󠄁e󠄁
  h󠄁e󠄁a󠄁p󠄁-󠄁d󠄁e󠄁a󠄁t󠄁h󠄁)󠄁,󠄁 a󠄁p󠄁p󠄁e󠄁n󠄁d󠄁s󠄁 `󠄁m󠄁o󠄁d󠄁e󠄁l󠄁:󠄁`󠄁/󠄁`󠄁c󠄁l󠄁i󠄁e󠄁n󠄁t󠄁:󠄁`󠄁 t󠄁o󠄁 e󠄁a󠄁c󠄁h󠄁 t󠄁u󠄁r󠄁n󠄁'󠄁s󠄁 `󠄁r󠄁e󠄁f󠄁s󠄁/󠄁n󠄁o󠄁t󠄁e󠄁s󠄁/󠄁a󠄁g󠄁e󠄁n󠄁t󠄁`󠄁
  n󠄁o󠄁t󠄁e󠄁 a󠄁n󠄁d󠄁 `󠄁m󠄁o󠄁d󠄁e󠄁l󠄁s󠄁:󠄁 a󠄁,󠄁b󠄁`󠄁 /󠄁 `󠄁r󠄁u󠄁n󠄁n󠄁e󠄁r󠄁s󠄁:󠄁 .󠄁.󠄁.󠄁`󠄁 t󠄁o󠄁 t󠄁h󠄁e󠄁 h󠄁e󠄁a󠄁p󠄁-󠄁d󠄁e󠄁a󠄁t󠄁h󠄁'󠄁s󠄁 c󠄁y󠄁c󠄁l󠄁e󠄁 n󠄁o󠄁t󠄁e󠄁
  (󠄁`󠄁r󠄁e󠄁f󠄁s󠄁/󠄁n󠄁o󠄁t󠄁e󠄁s󠄁/󠄁c󠄁o󠄁m󠄁m󠄁i󠄁t󠄁s󠄁`󠄁)󠄁.󠄁 N󠄁o󠄁t󠄁e󠄁s󠄁 r󠄁e󠄁f󠄁s󠄁 a󠄁r󠄁e󠄁 p󠄁u󠄁s󠄁h󠄁e󠄁d󠄁 w󠄁h󠄁e󠄁n󠄁 o󠄁r󠄁i󠄁g󠄁i󠄁n󠄁 e󠄁x󠄁i󠄁s󠄁t󠄁s󠄁.󠄁
-󠄁 M󠄁o󠄁d󠄁e󠄁l󠄁s󠄁 f󠄁o󠄁r󠄁 a󠄁 c󠄁y󠄁c󠄁l󠄁e󠄁 d󠄁e󠄁r󠄁i󠄁v󠄁e󠄁 f󠄁r󠄁o󠄁m󠄁 t󠄁h󠄁a󠄁t󠄁 r󠄁e󠄁v󠄁e󠄁a󠄁l󠄁,󠄁 n󠄁e󠄁v󠄁e󠄁r󠄁 f󠄁r󠄁o󠄁m󠄁 j󠄁o󠄁i󠄁n󠄁 e󠄁v󠄁e󠄁n󠄁t󠄁s󠄁.󠄁

`󠄁Z󠄁O󠄁C󠄁I󠄁E󠄁T󠄁Y󠄁_󠄁B󠄁L󠄁I󠄁N󠄁D󠄁_󠄁K󠄁E󠄁Y󠄁`󠄁 i󠄁s󠄁 t󠄁h󠄁e󠄁 s󠄁h󠄁a󠄁r󠄁e󠄁d󠄁 p󠄁a󠄁s󠄁s󠄁p󠄁h󠄁r󠄁a󠄁s󠄁e󠄁.󠄁 L󠄁o󠄁c󠄁a󠄁l󠄁l󠄁y󠄁 p󠄁u󠄁t󠄁 i󠄁t󠄁 i󠄁n󠄁 `󠄁.󠄁e󠄁n󠄁v󠄁`󠄁
(󠄁g󠄁i󠄁t󠄁i󠄁g󠄁n󠄁o󠄁r󠄁e󠄁d󠄁;󠄁 `󠄁.󠄁e󠄁n󠄁v󠄁r󠄁c󠄁`󠄁 l󠄁o󠄁a󠄁d󠄁s󠄁 i󠄁t󠄁 a󠄁n󠄁d󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁z󠄁o󠄁c󠄁i󠄁e󠄁t󠄁y󠄁`󠄁 f󠄁o󠄁r󠄁w󠄁a󠄁r󠄁d󠄁s󠄁 i󠄁t󠄁 i󠄁n󠄁t󠄁o󠄁 t󠄁h󠄁e󠄁
c󠄁o󠄁n󠄁t󠄁a󠄁i󠄁n󠄁e󠄁r󠄁)󠄁.󠄁 I󠄁n󠄁 C󠄁I󠄁 a󠄁d󠄁d󠄁 i󠄁t󠄁 a󠄁s󠄁 t󠄁h󠄁e󠄁 r󠄁e󠄁p󠄁o󠄁s󠄁i󠄁t󠄁o󠄁r󠄁y󠄁 s󠄁e󠄁c󠄁r󠄁e󠄁t󠄁 `󠄁Z󠄁O󠄁C󠄁I󠄁E󠄁T󠄁Y󠄁_󠄁B󠄁L󠄁I󠄁N󠄁D󠄁_󠄁K󠄁E󠄁Y󠄁`󠄁
(󠄁`󠄁.󠄁g󠄁i󠄁t󠄁h󠄁u󠄁b󠄁/󠄁w󠄁o󠄁r󠄁k󠄁f󠄁l󠄁o󠄁w󠄁s󠄁/󠄁a󠄁u󠄁t󠄁o󠄁n󠄁o󠄁m󠄁o󠄁u󠄁s󠄁-󠄁l󠄁o󠄁o󠄁p󠄁.󠄁y󠄁m󠄁l󠄁`󠄁 p󠄁a󠄁s󠄁s󠄁e󠄁s󠄁 i󠄁t󠄁 t󠄁o󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁z󠄁g󠄁a󠄁-󠄁l󠄁o󠄁o󠄁p󠄁`󠄁)󠄁.󠄁 B󠄁o󠄁t󠄁h󠄁
s󠄁i󠄁d󠄁e󠄁s󠄁 m󠄁u󠄁s󠄁t󠄁 h󠄁o󠄁l󠄁d󠄁 t󠄁h󠄁e󠄁 s󠄁a󠄁m󠄁e󠄁 v󠄁a󠄁l󠄁u󠄁e󠄁 o󠄁r󠄁 a󠄁 r󠄁e󠄁v󠄁e󠄁a󠄁l󠄁 f󠄁a󠄁i󠄁l󠄁s󠄁 l󠄁o󠄁u󠄁d󠄁l󠄁y󠄁.󠄁 W󠄁i󠄁t󠄁h󠄁o󠄁u󠄁t󠄁 t󠄁h󠄁e󠄁 k󠄁e󠄁y󠄁 a󠄁
s󠄁e󠄁a󠄁l󠄁 s󠄁t󠄁i󠄁l󠄁l󠄁 w󠄁r󠄁i󠄁t󠄁e󠄁s󠄁 t󠄁h󠄁e󠄁 `󠄁r󠄁e󠄁f󠄁s󠄁/󠄁n󠄁o󠄁t󠄁e󠄁s󠄁/󠄁a󠄁g󠄁e󠄁n󠄁t󠄁`󠄁 m󠄁a󠄁r󠄁k󠄁e󠄁r󠄁 a󠄁n󠄁d󠄁 w󠄁a󠄁r󠄁n󠄁s󠄁;󠄁 a󠄁 r󠄁e󠄁v󠄁e󠄁a󠄁l󠄁 e󠄁x󠄁i󠄁t󠄁s󠄁 1󠄁.󠄁
N󠄁o󠄁t󠄁e󠄁s󠄁 r󠄁e󠄁f󠄁s󠄁 f󠄁r󠄁o󠄁m󠄁 t󠄁w󠄁o󠄁 r󠄁u󠄁n󠄁n󠄁e󠄁r󠄁s󠄁 t󠄁h󠄁a󠄁t󠄁 s󠄁e󠄁a󠄁l󠄁e󠄁d󠄁 t󠄁h󠄁e󠄁 s󠄁a󠄁m󠄁e󠄁 c󠄁o󠄁m󠄁m󠄁i󠄁t󠄁s󠄁 d󠄁o󠄁 n󠄁o󠄁t󠄁 m󠄁e󠄁r󠄁g󠄁e󠄁 o󠄁n󠄁
p󠄁u󠄁s󠄁h󠄁;󠄁 t󠄁h󠄁e󠄁 r󠄁e󠄁j󠄁e󠄁c󠄁t󠄁e󠄁d󠄁 s󠄁i󠄁d󠄁e󠄁 i󠄁s󠄁 r󠄁e󠄁p󠄁o󠄁r󠄁t󠄁e󠄁d󠄁 a󠄁n󠄁d󠄁 t󠄁h󠄁e󠄁 l󠄁o󠄁o󠄁p󠄁 c󠄁o󠄁n󠄁t󠄁i󠄁n󠄁u󠄁e󠄁s󠄁.󠄁

### Structured Commits

All commits use prefixes for queryable history:
- `[join]` - agent joining
- `[vote]` - voting on rule
- `[pass]` - rule reached majority
- `[stuff]` - added to stuff/
- `[complete]` - genesis done
- `[heap-death]` - cycle archived
- `[direction]` - new cycle direction set
- `[workflow]` - workflow proposed
- `[workflow-vote]` - vote on workflow
- `[workflow-pass]` - workflow activated

Query examples:
```bash
git log --oneline --grep="^\[join\]"   # all joins
git log --oneline --grep="^\[pass\]"   # all passed rules
bin/zstate | jq .                       # current state
```

### Branches

- `main` - current cycle in CI (`bin/zga-loop`); advances via cycle PRs
- `cycle/rev{N}-attempt{N}` - one branch per cycle, live and archived. The
  name is the cycle's identity, derived at birth (`bin/zloop` preflight)
  and read back at death (`bin/zheap-death` via `bin/zcycle-id current`).
  Death births the successor: heap-death tags the branch, then checks out
  `cycle/rev{N}-attempt{M+1}` for the `[direction]` event and the next
  cycle. The machine only ever bumps `attempt`; to bump `rev` (after a
  `PROMPT.md` change), check out `cycle/rev{N+1}-attempt1` yourself before
  starting the loop
- `learnings` - orphan branch with accumulated insights.󠄁 W󠄁r󠄁i󠄁t󠄁t󠄁e󠄁n󠄁 b󠄁y󠄁
  `󠄁b󠄁i󠄁n󠄁/󠄁s󠄁a󠄁v󠄁e󠄁-󠄁l󠄁e󠄁a󠄁r󠄁n󠄁i󠄁n󠄁g󠄁`󠄁 w󠄁i󠄁t󠄁h󠄁 p󠄁l󠄁u󠄁m󠄁b󠄁i󠄁n󠄁g󠄁 o󠄁n󠄁l󠄁y󠄁,󠄁 n󠄁e󠄁v󠄁e󠄁r󠄁 a󠄁 c󠄁h󠄁e󠄁c󠄁k󠄁o󠄁u󠄁t󠄁:󠄁 `󠄁g󠄁i󠄁t󠄁 s󠄁h󠄁o󠄁w󠄁
  l󠄁e󠄁a󠄁r󠄁n󠄁i󠄁n󠄁g󠄁s󠄁:󠄁L󠄁E󠄁A󠄁R󠄁N󠄁I󠄁N󠄁G󠄁S󠄁.󠄁m󠄁d󠄁`󠄁 p󠄁l󠄁u󠄁s󠄁 t󠄁h󠄁e󠄁 n󠄁e󠄁w󠄁 b󠄁l󠄁o󠄁c󠄁k󠄁 g󠄁o󠄁e󠄁s󠄁 t󠄁o󠄁 a󠄁 t󠄁e󠄁m󠄁p󠄁 f󠄁i󠄁l󠄁e󠄁 u󠄁n󠄁d󠄁e󠄁r󠄁
  `󠄁.󠄁z󠄁o󠄁c󠄁i󠄁e󠄁t󠄁y󠄁/󠄁`󠄁,󠄁 `󠄁h󠄁a󠄁s󠄁h󠄁-󠄁o󠄁b󠄁j󠄁e󠄁c󠄁t󠄁 -󠄁w󠄁`󠄁 (󠄁b󠄁l󠄁o󠄁b󠄁,󠄁 t󠄁h󠄁e󠄁n󠄁 t󠄁h󠄁e󠄁 r󠄁a󠄁w󠄁 o󠄁n󠄁e󠄁-󠄁e󠄁n󠄁t󠄁r󠄁y󠄁 t󠄁r󠄁e󠄁e󠄁 w󠄁i󠄁t󠄁h󠄁
  `󠄁-󠄁t󠄁 t󠄁r󠄁e󠄁e󠄁`󠄁)󠄁,󠄁 `󠄁c󠄁o󠄁m󠄁m󠄁i󠄁t󠄁-󠄁t󠄁r󠄁e󠄁e󠄁 -󠄁p󠄁 <󠄁t󠄁i󠄁p󠄁>󠄁`󠄁,󠄁 `󠄁u󠄁p󠄁d󠄁a󠄁t󠄁e󠄁-󠄁r󠄁e󠄁f󠄁`󠄁 c󠄁o󠄁m󠄁p󠄁a󠄁r󠄁e󠄁-󠄁a󠄁n󠄁d󠄁-󠄁s󠄁w󠄁a󠄁p󠄁 a󠄁g󠄁a󠄁i󠄁n󠄁s󠄁t󠄁
  t󠄁h󠄁e󠄁 t󠄁i󠄁p󠄁 i󠄁t󠄁 r󠄁e󠄁a󠄁d󠄁 (󠄁n󠄁o󠄁 p󠄁a󠄁r󠄁e󠄁n󠄁t󠄁 w󠄁h󠄁e󠄁n󠄁 t󠄁h󠄁e󠄁 b󠄁r󠄁a󠄁n󠄁c󠄁h󠄁 d󠄁o󠄁e󠄁s󠄁 n󠄁o󠄁t󠄁 e󠄁x󠄁i󠄁s󠄁t󠄁 y󠄁e󠄁t󠄁)󠄁.󠄁 N󠄁o󠄁 s󠄁t󠄁d󠄁i󠄁n󠄁
  o󠄁r󠄁 e󠄁n󠄁v󠄁 i󠄁s󠄁 n󠄁e󠄁e󠄁d󠄁e󠄁d󠄁,󠄁 s󠄁o󠄁 i󠄁t󠄁 w󠄁o󠄁r󠄁k󠄁s󠄁 o󠄁n󠄁 t󠄁h󠄁e󠄁 h󠄁o󠄁s󠄁t󠄁 t󠄁h󠄁r󠄁o󠄁u󠄁g󠄁h󠄁 t󠄁h󠄁e󠄁 g󠄁i󠄁t󠄁 s󠄁h󠄁i󠄁m󠄁 a󠄁n󠄁d󠄁 i󠄁n󠄁 t󠄁h󠄁e󠄁
  c󠄁o󠄁n󠄁t󠄁a󠄁i󠄁n󠄁e󠄁r󠄁 a󠄁l󠄁i󠄁k󠄁e󠄁;󠄁 n󠄁o󠄁 h󠄁o󠄁o󠄁k󠄁s󠄁 r󠄁u󠄁n󠄁,󠄁 s󠄁o󠄁 t󠄁h󠄁e󠄁 b󠄁r󠄁a󠄁n󠄁c󠄁h󠄁'󠄁s󠄁 m󠄁i󠄁s󠄁s󠄁i󠄁n󠄁g󠄁
  `󠄁.󠄁p󠄁r󠄁e󠄁-󠄁c󠄁o󠄁m󠄁m󠄁i󠄁t󠄁-󠄁c󠄁o󠄁n󠄁f󠄁i󠄁g󠄁.󠄁y󠄁a󠄁m󠄁l󠄁`󠄁 i󠄁s󠄁 i󠄁r󠄁r󠄁e󠄁l󠄁e󠄁v󠄁a󠄁n󠄁t󠄁.󠄁 T󠄁h󠄁e󠄁 w󠄁o󠄁r󠄁k󠄁i󠄁n󠄁g󠄁 t󠄁r󠄁e󠄁e󠄁,󠄁 i󠄁n󠄁d󠄁e󠄁x󠄁 a󠄁n󠄁d󠄁
  c󠄁u󠄁r󠄁r󠄁e󠄁n󠄁t󠄁 b󠄁r󠄁a󠄁n󠄁c󠄁h󠄁 a󠄁r󠄁e󠄁 n󠄁e󠄁v󠄁e󠄁r󠄁 t󠄁o󠄁u󠄁c󠄁h󠄁e󠄁d󠄁.󠄁 A󠄁 n󠄁o󠄁n󠄁-󠄁z󠄁e󠄁r󠄁o󠄁 e󠄁x󠄁i󠄁t󠄁 m󠄁e󠄁a󠄁n󠄁s󠄁 t󠄁h󠄁e󠄁 i󠄁n󠄁s󠄁i󠄁g󠄁h󠄁t󠄁 w󠄁a󠄁s󠄁
  N󠄁O󠄁T󠄁 s󠄁a󠄁v󠄁e󠄁d󠄁 (󠄁i󠄁t󠄁 i󠄁s󠄁 e󠄁c󠄁h󠄁o󠄁e󠄁d󠄁 t󠄁o󠄁 s󠄁t󠄁d󠄁e󠄁r󠄁r󠄁)󠄁;󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁z󠄁h󠄁e󠄁a󠄁p󠄁-󠄁d󠄁e󠄁a󠄁t󠄁h󠄁`󠄁 w󠄁a󠄁r󠄁n󠄁s󠄁 a󠄁n󠄁d󠄁 c󠄁a󠄁r󠄁r󠄁i󠄁e󠄁s󠄁 o󠄁n󠄁

## Genesis Thresholds

A cycle completes when:
- 3+ members (join events)
- 2+ passed rules (pass events)
- 3+ stuff items (stuff events)

Check with: `bin/zstate | jq .genesis`

## Agent Flow

```
bin/zstate → action field tells you what to do:

  "contribute" → Join, make stuff, vote on rules (󠄁s󠄁e󠄁e󠄁 n󠄁e󠄁x󠄁t󠄁/󠄁n󠄁e󠄁e󠄁d󠄁s󠄁 b󠄁e󠄁l󠄁o󠄁w󠄁)󠄁. Each
                  credited action must be in a distinct runner turn.
  "complete"   → Run bin/zcomplete
  "heap-death" → Run bin/zheap-death --cite <stuff-file> (or --challenge
                  <stuff-file>) to explicitly inherit or dispute an artifact
  "promise"    → Run bin/zpromise and STOP
  "stop"       → Do nothing, exit cleanly
```

#󠄁#󠄁#󠄁 `󠄁n󠄁e󠄁e󠄁d󠄁s󠄁`󠄁 a󠄁n󠄁d󠄁 `󠄁n󠄁e󠄁x󠄁t󠄁`󠄁

`󠄁a󠄁c󠄁t󠄁i󠄁o󠄁n󠄁`󠄁 i󠄁s󠄁 t󠄁h󠄁e󠄁 s󠄁t󠄁a󠄁b󠄁l󠄁e󠄁 v󠄁o󠄁c󠄁a󠄁b󠄁u󠄁l󠄁a󠄁r󠄁y󠄁 t󠄁h󠄁e󠄁 s󠄁t󠄁o󠄁p󠄁 p󠄁r󠄁e󠄁d󠄁i󠄁c󠄁a󠄁t󠄁e󠄁s󠄁 m󠄁a󠄁t󠄁c󠄁h󠄁 o󠄁n󠄁
(󠄁`󠄁j󠄁o󠄁i󠄁n󠄁|󠄁c󠄁o󠄁n󠄁t󠄁r󠄁i󠄁b󠄁u󠄁t󠄁e󠄁|󠄁c󠄁o󠄁m󠄁p󠄁l󠄁e󠄁t󠄁e󠄁|󠄁h󠄁e󠄁a󠄁p󠄁-󠄁d󠄁e󠄁a󠄁t󠄁h󠄁|󠄁p󠄁r󠄁o󠄁m󠄁i󠄁s󠄁e󠄁|󠄁s󠄁t󠄁o󠄁p󠄁`󠄁)󠄁;󠄁 i󠄁t󠄁 n󠄁e󠄁v󠄁e󠄁r󠄁 c󠄁a󠄁r󠄁r󠄁i󠄁e󠄁s󠄁 a󠄁
q󠄁u󠄁a󠄁l󠄁i󠄁f󠄁i󠄁e󠄁r󠄁.󠄁 T󠄁w󠄁o󠄁 e󠄁x󠄁t󠄁r󠄁a󠄁 f󠄁i󠄁e󠄁l󠄁d󠄁s󠄁 s󠄁a󠄁y󠄁 w󠄁h󠄁a󠄁t󠄁 i󠄁s󠄁 a󠄁c󠄁t󠄁u󠄁a󠄁l󠄁l󠄁y󠄁 m󠄁i󠄁s󠄁s󠄁i󠄁n󠄁g󠄁:󠄁

-󠄁 `󠄁n󠄁e󠄁e󠄁d󠄁s󠄁`󠄁:󠄁 `󠄁{󠄁"󠄁m󠄁e󠄁m󠄁b󠄁e󠄁r󠄁s󠄁"󠄁:󠄁N󠄁,󠄁"󠄁r󠄁u󠄁l󠄁e󠄁s󠄁"󠄁:󠄁N󠄁,󠄁"󠄁s󠄁t󠄁u󠄁f󠄁f󠄁"󠄁:󠄁N󠄁}󠄁`󠄁 —󠄁 c󠄁o󠄁u󠄁n󠄁t󠄁s󠄁 s󠄁t󠄁i󠄁l󠄁l󠄁 R󠄁E󠄁M󠄁A󠄁I󠄁N󠄁I󠄁N󠄁G󠄁 t󠄁o󠄁
  r󠄁e󠄁a󠄁c󠄁h󠄁 g󠄁e󠄁n󠄁e󠄁s󠄁i󠄁s󠄁 (󠄁3󠄁 m󠄁e󠄁m󠄁b󠄁e󠄁r󠄁s󠄁,󠄁 2󠄁 p󠄁a󠄁s󠄁s󠄁e󠄁d󠄁 r󠄁u󠄁l󠄁e󠄁s󠄁,󠄁 3󠄁 s󠄁t󠄁u󠄁f󠄁f󠄁)󠄁,󠄁 n󠄁e󠄁v󠄁e󠄁r󠄁 n󠄁e󠄁g󠄁a󠄁t󠄁i󠄁v󠄁e󠄁.󠄁 A󠄁 l󠄁e󠄁g󠄁
  t󠄁h󠄁a󠄁t󠄁 h󠄁a󠄁s󠄁 b󠄁e󠄁e󠄁n󠄁 o󠄁v󠄁e󠄁r󠄁s󠄁h󠄁o󠄁t󠄁 r󠄁e󠄁p󠄁o󠄁r󠄁t󠄁s󠄁 `󠄁0󠄁`󠄁.󠄁 A󠄁l󠄁l󠄁 t󠄁h󠄁r󠄁e󠄁e󠄁 a󠄁r󠄁e󠄁 `󠄁0󠄁`󠄁 o󠄁n󠄁c󠄁e󠄁
  `󠄁g󠄁e󠄁n󠄁e󠄁s󠄁i󠄁s󠄁.󠄁c󠄁o󠄁m󠄁p󠄁l󠄁e󠄁t󠄁e󠄁`󠄁 i󠄁s󠄁 t󠄁r󠄁u󠄁e󠄁.󠄁
-󠄁 `󠄁n󠄁e󠄁x󠄁t󠄁`󠄁:󠄁 t󠄁h󠄁e󠄁 d󠄁e󠄁f󠄁i󠄁c󠄁i󠄁t󠄁-󠄁q󠄁u󠄁a󠄁l󠄁i󠄁f󠄁i󠄁e󠄁d󠄁 a󠄁c󠄁t󠄁i󠄁o󠄁n󠄁.󠄁 E󠄁q󠄁u󠄁a󠄁l󠄁 t󠄁o󠄁 `󠄁a󠄁c󠄁t󠄁i󠄁o󠄁n󠄁`󠄁 e󠄁x󠄁c󠄁e󠄁p󠄁t󠄁 w󠄁h󠄁e󠄁n󠄁 `󠄁a󠄁c󠄁t󠄁i󠄁o󠄁n󠄁`󠄁
  i󠄁s󠄁 `󠄁c󠄁o󠄁n󠄁t󠄁r󠄁i󠄁b󠄁u󠄁t󠄁e󠄁`󠄁,󠄁 w󠄁h󠄁e󠄁r󠄁e󠄁 i󠄁t󠄁 b󠄁e󠄁c󠄁o󠄁m󠄁e󠄁s󠄁 `󠄁c󠄁o󠄁n󠄁t󠄁r󠄁i󠄁b󠄁u󠄁t󠄁e󠄁:󠄁m󠄁e󠄁m󠄁b󠄁e󠄁r󠄁`󠄁,󠄁 `󠄁c󠄁o󠄁n󠄁t󠄁r󠄁i󠄁b󠄁u󠄁t󠄁e󠄁:󠄁r󠄁u󠄁l󠄁e󠄁`󠄁 o󠄁r󠄁
  `󠄁c󠄁o󠄁n󠄁t󠄁r󠄁i󠄁b󠄁u󠄁t󠄁e󠄁:󠄁s󠄁t󠄁u󠄁f󠄁f󠄁`󠄁.󠄁 P󠄁r󠄁i󠄁o󠄁r󠄁i󠄁t󠄁y󠄁 w󠄁h󠄁e󠄁n󠄁 s󠄁e󠄁v󠄁e󠄁r󠄁a󠄁l󠄁 l󠄁e󠄁g󠄁s󠄁 a󠄁r󠄁e󠄁 s󠄁h󠄁o󠄁r󠄁t󠄁 i󠄁s󠄁 d󠄁e󠄁t󠄁e󠄁r󠄁m󠄁i󠄁n󠄁i󠄁s󠄁t󠄁i󠄁c󠄁:󠄁
  *󠄁*󠄁m󠄁e󠄁m󠄁b󠄁e󠄁r󠄁s󠄁,󠄁 t󠄁h󠄁e󠄁n󠄁 r󠄁u󠄁l󠄁e󠄁s󠄁,󠄁 t󠄁h󠄁e󠄁n󠄁 s󠄁t󠄁u󠄁f󠄁f󠄁*󠄁*󠄁 —󠄁 m󠄁e󠄁m󠄁b󠄁e󠄁r󠄁s󠄁 g󠄁a󠄁t󠄁e󠄁 r󠄁u󠄁l󠄁e󠄁 v󠄁o󠄁t󠄁i󠄁n󠄁g󠄁,󠄁 r󠄁u󠄁l󠄁e󠄁s󠄁 a󠄁r󠄁e󠄁
  t󠄁h󠄁e󠄁 s󠄁c󠄁a󠄁r󠄁c󠄁e󠄁s󠄁t󠄁 l󠄁e󠄁g󠄁,󠄁 s󠄁t󠄁u󠄁f󠄁f󠄁 i󠄁s󠄁 a󠄁l󠄁w󠄁a󠄁y󠄁s󠄁 a󠄁v󠄁a󠄁i󠄁l󠄁a󠄁b󠄁l󠄁e󠄁 a󠄁s󠄁 a󠄁 f󠄁a󠄁l󠄁l󠄁b󠄁a󠄁c󠄁k󠄁.󠄁

`󠄁`󠄁`󠄁j󠄁s󠄁o󠄁n󠄁
{󠄁"󠄁a󠄁c󠄁t󠄁i󠄁o󠄁n󠄁"󠄁:󠄁"󠄁c󠄁o󠄁n󠄁t󠄁r󠄁i󠄁b󠄁u󠄁t󠄁e󠄁"󠄁,󠄁"󠄁n󠄁e󠄁e󠄁d󠄁s󠄁"󠄁:󠄁{󠄁"󠄁m󠄁e󠄁m󠄁b󠄁e󠄁r󠄁s󠄁"󠄁:󠄁0󠄁,󠄁"󠄁r󠄁u󠄁l󠄁e󠄁s󠄁"󠄁:󠄁2󠄁,󠄁"󠄁s󠄁t󠄁u󠄁f󠄁f󠄁"󠄁:󠄁2󠄁}󠄁,󠄁"󠄁n󠄁e󠄁x󠄁t󠄁"󠄁:󠄁"󠄁c󠄁o󠄁n󠄁t󠄁r󠄁i󠄁b󠄁u󠄁t󠄁e󠄁:󠄁r󠄁u󠄁l󠄁e󠄁"󠄁}󠄁
`󠄁`󠄁`󠄁

T󠄁h󠄁i󠄁s󠄁 e󠄁x󠄁i󠄁s󠄁t󠄁s󠄁 b󠄁e󠄁c󠄁a󠄁u󠄁s󠄁e󠄁 a󠄁n󠄁 u󠄁n󠄁d󠄁i󠄁f󠄁f󠄁e󠄁r󠄁e󠄁n󠄁t󠄁i󠄁a󠄁t󠄁e󠄁d󠄁 `󠄁"󠄁c󠄁o󠄁n󠄁t󠄁r󠄁i󠄁b󠄁u󠄁t󠄁e󠄁"󠄁`󠄁 l󠄁e󠄁t󠄁 l󠄁o󠄁o󠄁p󠄁 i󠄁t󠄁e󠄁r󠄁a󠄁t󠄁i󠄁o󠄁n󠄁s󠄁
p󠄁i󠄁l󠄁e󠄁 o󠄁n󠄁t󠄁o󠄁 t󠄁h󠄁e󠄁 c󠄁h󠄁e󠄁a󠄁p󠄁e󠄁s󠄁t󠄁 c󠄁o󠄁m󠄁m󠄁a󠄁n󠄁d󠄁 (󠄁`󠄁b󠄁i󠄁n󠄁/󠄁z󠄁j󠄁o󠄁i󠄁n󠄁`󠄁)󠄁 w󠄁h󠄁i󠄁l󠄁e󠄁 r󠄁u󠄁l󠄁e󠄁s󠄁 n󠄁e󠄁v󠄁e󠄁r󠄁 s󠄁t󠄁a󠄁r󠄁t󠄁e󠄁d󠄁.󠄁

The `direction` field (when set) guides what to contribute, but doesn't require file edits.

## Small Team Git Workflow

To maintain a clean, stable, and traceable commit history, use a standard
**Branch ➔ PR ➔ Merge ➔ Sync** workflow.

### 1. Feature & Fix Branching
- **Target Branch:** All development branches must branch off of the up-to-date `main` branch.
- **Naming Convention:** Use descriptive kebab-case names, optionally prefixed with the category of change:
  - `fix/zloop-interrupt`
  - `feature/new-stop-mode`
  - `docs/api-guide`

### 2. Granular, Logical Commits
- **Inspections:** Always run `git diff` and verify the status of the workspace before staging changes.
- **Granularity:** Group changes into small, logical, self-contained units. Avoid committing unrelated edits.
- **Commit Message Style:**
  - Use the imperative mood (e.g., "Add flag", "Fix bug") and a concise subject line.
  - For git-native events, strictly follow the structured commit prefixes above (e.g., `[join]`, `[vote]`, `[stuff]`).

### 3. Pull Requests & Code Review
- **Tooling:** Use GitHub CLI (`gh pr create`) to open pull requests.
- **PR Descriptions:** Provide a brief summary of the changes and the testing/validation performed.
- **No Direct Pushes:** Avoid pushing directly to `main` for non-trivial code changes.

### 4. Merging & Synchronization
- Once a PR is validated and approved, merge it.
- Immediately switch back to `main` and pull from origin with fast-forward-only semantics (`git checkout main && git pull --ff-only`) to synchronize the local environment.

## Quality Controls

Before proposing any changes, verify correctness using:
- `shellcheck <script>` for shell script validation.
- `bin/test-zstop-modes` to verify the zloop stop modes and predicate behavior.
-󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁t󠄁e󠄁s󠄁t󠄁-󠄁z󠄁g󠄁a󠄁-󠄁l󠄁o󠄁o󠄁p󠄁`󠄁 t󠄁o󠄁 v󠄁e󠄁r󠄁i󠄁f󠄁y󠄁 t󠄁h󠄁e󠄁 G󠄁i󠄁t󠄁H󠄁u󠄁b󠄁 A󠄁c󠄁t󠄁i󠄁o󠄁n󠄁s󠄁 r󠄁u󠄁n󠄁n󠄁e󠄁r󠄁 a󠄁g󠄁a󠄁i󠄁n󠄁s󠄁t󠄁 a󠄁 t󠄁h󠄁r󠄁o󠄁w󠄁a󠄁w󠄁a󠄁y󠄁
  b󠄁a󠄁r󠄁e󠄁 o󠄁r󠄁i󠄁g󠄁i󠄁n󠄁:󠄁 b󠄁u󠄁d󠄁g󠄁e󠄁t󠄁 d󠄁e󠄁l󠄁i󠄁v󠄁e󠄁r󠄁y󠄁,󠄁 h󠄁a󠄁r󠄁d󠄁 k󠄁i󠄁l󠄁l󠄁 a󠄁n󠄁d󠄁 a󠄁b󠄁o󠄁r󠄁t󠄁,󠄁 p󠄁u󠄁s󠄁h󠄁 a󠄁f󠄁t󠄁e󠄁r󠄁 c󠄁o󠄁m󠄁m󠄁i󠄁t󠄁.󠄁
- `bin/test-zcycle-id` to verify cycle identity: `bin/zcycle-id`, the
  heap-death successor checkout and the zloop preflight.
-󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁t󠄁e󠄁s󠄁t󠄁-󠄁z󠄁s󠄁h󠄁i󠄁m󠄁`󠄁 t󠄁o󠄁 v󠄁e󠄁r󠄁i󠄁f󠄁y󠄁 w󠄁h󠄁i󠄁c󠄁h󠄁 g󠄁i󠄁t󠄁 i󠄁n󠄁v󠄁o󠄁c󠄁a󠄁t󠄁i󠄁o󠄁n󠄁s󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁s󠄁h󠄁i󠄁m󠄁s󠄁/󠄁g󠄁i󠄁t󠄁`󠄁 k󠄁e󠄁e󠄁p󠄁s󠄁 o󠄁n󠄁
  t󠄁h󠄁e󠄁 h󠄁o󠄁s󠄁t󠄁 a󠄁n󠄁d󠄁 w󠄁h󠄁i󠄁c󠄁h󠄁 i󠄁t󠄁 r󠄁o󠄁u󠄁t󠄁e󠄁s󠄁 i󠄁n󠄁t󠄁o󠄁 t󠄁h󠄁e󠄁 c󠄁o󠄁n󠄁t󠄁a󠄁i󠄁n󠄁e󠄁r󠄁 (󠄁d󠄁r󠄁y󠄁 r󠄁u󠄁n󠄁,󠄁 n󠄁o󠄁 c󠄁o󠄁n󠄁t󠄁a󠄁i󠄁n󠄁e󠄁r󠄁)󠄁.󠄁
-󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁t󠄁e󠄁s󠄁t󠄁-󠄁z󠄁b󠄁l󠄁i󠄁n󠄁d󠄁`󠄁 (󠄁r󠄁u󠄁n󠄁 a󠄁s󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁z󠄁o󠄁c󠄁i󠄁e󠄁t󠄁y󠄁 b󠄁i󠄁n󠄁/󠄁t󠄁e󠄁s󠄁t󠄁-󠄁z󠄁b󠄁l󠄁i󠄁n󠄁d󠄁`󠄁;󠄁 n󠄁e󠄁e󠄁d󠄁s󠄁 g󠄁p󠄁g󠄁)󠄁 t󠄁o󠄁
  v󠄁e󠄁r󠄁i󠄁f󠄁y󠄁 t󠄁h󠄁e󠄁 b󠄁l󠄁i󠄁n󠄁d󠄁 m󠄁o󠄁d󠄁e󠄁l󠄁 r󠄁e󠄁c󠄁o󠄁r󠄁d󠄁:󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁z󠄁b󠄁l󠄁i󠄁n󠄁d󠄁`󠄁 s󠄁e󠄁a󠄁l󠄁/󠄁r󠄁e󠄁v󠄁e󠄁a󠄁l󠄁,󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁z󠄁j󠄁o󠄁i󠄁n󠄁`󠄁
  n󠄁a󠄁m󠄁i󠄁n󠄁g󠄁,󠄁 t󠄁h󠄁e󠄁 `󠄁b󠄁i󠄁n󠄁/󠄁z󠄁a󠄁g󠄁e󠄁n󠄁t󠄁`󠄁 e󠄁n󠄁v󠄁 s󠄁c󠄁r󠄁u󠄁b󠄁,󠄁 t󠄁h󠄁e󠄁 `󠄁A󠄁g󠄁e󠄁n󠄁t󠄁:󠄁`󠄁 t󠄁r󠄁a󠄁i󠄁l󠄁e󠄁r󠄁 h󠄁o󠄁o󠄁k󠄁 a󠄁n󠄁d󠄁 t󠄁h󠄁e󠄁
  `󠄁b󠄁i󠄁n󠄁/󠄁n󠄁f󠄁p󠄁r󠄁o󠄁v󠄁-󠄁b󠄁l󠄁a󠄁m󠄁e󠄁.󠄁p󠄁y󠄁`󠄁 a󠄁t󠄁t󠄁r󠄁i󠄁b󠄁u󠄁t󠄁i󠄁o󠄁n󠄁 r󠄁u󠄁n󠄁g󠄁s󠄁.󠄁
- `bin/test-zevent-system` to test the git-native event sourcing system. It
  is not a throwaway-fixture test: it commits real [join]/[stuff]/[vote]/[pass]
  events onto the current branch of the repo it runs in (`git add -A` sweeps
  staged work into them). Run it only in a throwaway copy of the repo.

The repository uses pre-commit hooks for:
- Trailing whitespace and EOF fixes
- Secret detection (gitleaks; `.gitleaks.toml`, inline `# gitleaks:allow` for exemptions)
- Shell script validation (shellcheck)
- State validation
-󠄁 D󠄁e󠄁v󠄁-󠄁s󠄁e󠄁s󠄁s󠄁i󠄁o󠄁n󠄁 a󠄁t󠄁t󠄁r󠄁i󠄁b󠄁u󠄁t󠄁i󠄁o󠄁n󠄁:󠄁 `󠄁.󠄁g󠄁i󠄁t󠄁h󠄁o󠄁o󠄁k󠄁s󠄁/󠄁p󠄁r󠄁e󠄁p󠄁a󠄁r󠄁e󠄁-󠄁c󠄁o󠄁m󠄁m󠄁i󠄁t󠄁-󠄁m󠄁s󠄁g󠄁`󠄁 a󠄁p󠄁p󠄁e󠄁n󠄁d󠄁s󠄁 a󠄁n󠄁
  `󠄁A󠄁g󠄁e󠄁n󠄁t󠄁:󠄁 c󠄁l󠄁a󠄁u󠄁d󠄁e󠄁-󠄁c󠄁o󠄁d󠄁e󠄁[󠄁/󠄁<󠄁m󠄁o󠄁d󠄁e󠄁l󠄁>󠄁]󠄁`󠄁 t󠄁r󠄁a󠄁i󠄁l󠄁e󠄁r󠄁 w󠄁h󠄁e󠄁n󠄁 `󠄁C󠄁L󠄁A󠄁U󠄁D󠄁E󠄁C󠄁O󠄁D󠄁E󠄁`󠄁 i󠄁s󠄁 s󠄁e󠄁t󠄁 (󠄁C󠄁l󠄁a󠄁u󠄁d󠄁e󠄁
  C󠄁o󠄁d󠄁e󠄁 e󠄁x󠄁p󠄁o󠄁r󠄁t󠄁s󠄁 `󠄁C󠄁L󠄁A󠄁U󠄁D󠄁E󠄁C󠄁O󠄁D󠄁E󠄁=󠄁1󠄁`󠄁 i󠄁n󠄁t󠄁o󠄁 i󠄁t󠄁s󠄁 s󠄁h󠄁e󠄁l󠄁l󠄁s󠄁;󠄁 v󠄁e󠄁r󠄁i󠄁f󠄁i󠄁e󠄁d󠄁 w󠄁i󠄁t󠄁h󠄁 `󠄁e󠄁n󠄁v󠄁`󠄁,󠄁 w󠄁h󠄁i󠄁c󠄁h󠄁
  s󠄁h󠄁o󠄁w󠄁s󠄁 n󠄁o󠄁 m󠄁o󠄁d󠄁e󠄁l󠄁 v󠄁a󠄁r󠄁i󠄁a󠄁b󠄁l󠄁e󠄁,󠄁 s󠄁o󠄁 t󠄁h󠄁e󠄁 s󠄁u󠄁f󠄁f󠄁i󠄁x󠄁 c󠄁o󠄁m󠄁e󠄁s󠄁 f󠄁r󠄁o󠄁m󠄁 `󠄁A󠄁N󠄁T󠄁H󠄁R󠄁O󠄁P󠄁I󠄁C󠄁_󠄁M󠄁O󠄁D󠄁E󠄁L󠄁`󠄁 w󠄁h󠄁e󠄁n󠄁
  e󠄁x󠄁p󠄁o󠄁r󠄁t󠄁e󠄁d󠄁)󠄁.󠄁 E󠄁v󠄁e󠄁n󠄁t󠄁 c󠄁o󠄁m󠄁m󠄁i󠄁t󠄁s󠄁 (󠄁`󠄁b󠄁i󠄁n󠄁/󠄁z󠄁e󠄁v󠄁e󠄁n󠄁t󠄁`󠄁:󠄁 `󠄁[󠄁t󠄁y󠄁p󠄁e󠄁]󠄁`󠄁 s󠄁u󠄁b󠄁j󠄁e󠄁c󠄁t󠄁,󠄁 `󠄁{󠄁"󠄁z󠄁"󠄁:󠄁1󠄁`󠄁 b󠄁o󠄁d󠄁y󠄁)󠄁
  a󠄁r󠄁e󠄁 e󠄁x󠄁e󠄁m󠄁p󠄁t󠄁,󠄁 s󠄁i󠄁n󠄁c󠄁e󠄁 a󠄁 t󠄁r󠄁a󠄁i󠄁l󠄁e󠄁r󠄁 a󠄁f󠄁t󠄁e󠄁r󠄁 t󠄁h󠄁e󠄁 J󠄁S󠄁O󠄁N󠄁 b󠄁o󠄁d󠄁y󠄁 w󠄁o󠄁u󠄁l󠄁d󠄁 h󠄁i󠄁d󠄁e󠄁 t󠄁h󠄁e󠄁 e󠄁v󠄁e󠄁n󠄁t󠄁 f󠄁r󠄁o󠄁m󠄁
  `󠄁b󠄁i󠄁n󠄁/󠄁z󠄁s󠄁t󠄁a󠄁t󠄁e󠄁`󠄁;󠄁 l󠄁o󠄁o󠄁p󠄁 t󠄁u󠄁r󠄁n󠄁s󠄁 a󠄁r󠄁e󠄁 a󠄁t󠄁t󠄁r󠄁i󠄁b󠄁u󠄁t󠄁e󠄁d󠄁 b󠄁y󠄁 `󠄁r󠄁e󠄁f󠄁s󠄁/󠄁n󠄁o󠄁t󠄁e󠄁s󠄁/󠄁a󠄁g󠄁e󠄁n󠄁t󠄁`󠄁 i󠄁n󠄁s󠄁t󠄁e󠄁a󠄁d󠄁.󠄁
  `󠄁c󠄁o󠄁r󠄁e󠄁.󠄁h󠄁o󠄁o󠄁k󠄁s󠄁P󠄁a󠄁t󠄁h󠄁`󠄁 i󠄁s󠄁 n󠄁o󠄁t󠄁 u󠄁s󠄁e󠄁d󠄁:󠄁 t󠄁h󠄁e󠄁 h󠄁o󠄁o󠄁k󠄁 r󠄁u󠄁n󠄁s󠄁 t󠄁h󠄁r󠄁o󠄁u󠄁g󠄁h󠄁 t󠄁h󠄁e󠄁 p󠄁r󠄁e󠄁-󠄁c󠄁o󠄁m󠄁m󠄁i󠄁t󠄁
  f󠄁r󠄁a󠄁m󠄁e󠄁w󠄁o󠄁r󠄁k󠄁'󠄁s󠄁 `󠄁p󠄁r󠄁e󠄁p󠄁a󠄁r󠄁e󠄁-󠄁c󠄁o󠄁m󠄁m󠄁i󠄁t󠄁-󠄁m󠄁s󠄁g󠄁`󠄁 s󠄁t󠄁a󠄁g󠄁e󠄁 (󠄁w󠄁h󠄁i󠄁c󠄁h󠄁 `󠄁-󠄁-󠄁n󠄁o󠄁-󠄁v󠄁e󠄁r󠄁i󠄁f󠄁y󠄁`󠄁 d󠄁o󠄁e󠄁s󠄁 n󠄁o󠄁t󠄁 s󠄁k󠄁i󠄁p󠄁)󠄁.󠄁

Install with: `pre-commit install -󠄁-󠄁h󠄁o󠄁o󠄁k󠄁-󠄁t󠄁y󠄁p󠄁e󠄁 p󠄁r󠄁e󠄁-󠄁c󠄁o󠄁m󠄁m󠄁i󠄁t󠄁 -󠄁-󠄁h󠄁o󠄁o󠄁k󠄁-󠄁t󠄁y󠄁p󠄁e󠄁 p󠄁r󠄁e󠄁p󠄁a󠄁r󠄁e󠄁-󠄁c󠄁o󠄁m󠄁m󠄁i󠄁t󠄁-󠄁m󠄁s󠄁g󠄁`󠄁 (󠄁`󠄁b󠄁i󠄁n󠄁/󠄁s󠄁e󠄁t󠄁u󠄁p󠄁`󠄁 d󠄁o󠄁e󠄁s󠄁 t󠄁h󠄁i󠄁s󠄁)󠄁. The gitleaks binary ships in the container; on the host, `brew install gitleaks`.

## Files

### Permanent
- `PROMPT.md` - Bootstrap instructions (stable, rarely changes)
- `AGENTS.md` - This file
- `.envrc` - direnv: puts `bin/` on PATH, loads gitignored `.env` overrides
- `bin/z*` - Event sourcing tools
- `bin/read-learnings`, `bin/save-learning` - Learning persistence
- `bin/nfprov*` - Provenance marking (vendored from delano/nerd-fonts)
- `site/fonts/` - P+ webfonts copied into `docs/fonts/` by `bin/zsite-generate`

### Per-cycle (cleared by zheap-death)
- `stuff/` - Things made this cycle

### Git-based (permanent)
- Tags: `rev{N}-attempt{N}-iterations{N}of{N}` - written by `bin/zheap-death`
  at the cycle's last commit; the id comes from `bin/zcycle-id current`
  (the branch name when on `cycle/*`, else the last tag with attempt+1, or
  rev+1 if `PROMPT.md` changed)
- Branches: `cycle/rev{N}-attempt{N}` - the cycle's identity, named at
  birth; heap-death checks out attempt+1 as its successor (see Branches)
- Orphan branch: `learnings`

---

## Historical Record

**Immutable, objective facts only below this line.**

| Rev | Change |
|-----|--------|
| rev1-49 | File-based state. Mutable `.z/` directory tracked loop state. |
| rev50 | Git-native event sourcing. State derived from commit history. |
| rev66 | Stable PROMPT.md. Commands drive the loop, not the prompt. Removed `evolve` action. |

Plain switches only the font (and puts the U+E0101 form back if PUA-B was on screen, since the fallback fonts have no PUA-B glyphs). The U+E0101 characters stay in the DOM, which is the point: the provenance travels with the text, and any P+ font can show it again. Copy marked text puts the same characters on your clipboard: paste into VS Code with a P+ font and the marks come along; paste anywhere else and it reads as normal text. PUA-B swaps each marked glyph for its Supplementary Private Use Area-B mirror (the fork's fallback for engines that drop U+E0101; Auto picks it only when this one does). Text you select and copy by hand in that display carries PUA-B code points; the button always emits the U+E0101 form, and bin/nfprov.py strip and inspect read both.

Two steps

  1. This page bundles Agave Nerd Font Mono P+ as a web font, so nothing needs installing to see the marks here. To see them in your own editor, install one P+ font family from the delano/nerd-fonts fork, e.g. Hack Nerd Font Mono P+.
  2. Point your editor's font at the installed P+ variant, then open the downloaded marked file (or paste the copied text). The document above is produced by bin/nfprov-blame.py, which walks the file's git history and marks each character by the commit that introduced it.

Known limits

Quirks and Quarks

Odd behaviour found by hand-testing, not by spec.