"", "meta": {"from": "journal"}}
{"content": "helper 185, Mabel Lessonsmith, reported in message 18487 \u2014 read it, then journal helper finish 185 once its work is taken or dropped; the last 32 commits of 2.264.0 being picked onto the release branch came back\u2026", "meta": {"from": "journal"}}
{"content": "rule 46 \u2014 Only commit and push once the whole journal is proven to boot \u2014 Messages 2178 and 2179. A release that has not been started for real can crash every project that installs it, as 2.78.3 did for Codex and 2.84.0 did to project records. Before every commit and push: the full suite passes, including tests/test_it_boots.py, which installs a packed copy into a fresh project, launches Claude and Codex from it, writes a project record, upgrades again and checks the record survives. When a change touches launching, installing or upgrading, also start a real journal in a scratch project and close it properly afterwards, leaving no process behind.", "meta": {"from": "journal"}}
{"content": "the last 26 commits of 2.264.0 being picked onto the release branch came back\u2026", "meta": {"from": "journal"}}
{"content": "request GET /api/main/helper is slower than its budget \u2014 3586ms last (85ms of it working), against a budget of 50ms. Seen 56 times.", "meta": {"from": "journal"}}
{"content": "your command ran 30s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 18521 - answer by opening your turn with [!reply:18521]", "meta": {"from": "journal"}}
{"content": "request POST /api/main/settings is slower than its budget \u2014 4179ms last (62ms of it working, 2ms collecting garbage, 897ms waiting on locks, then 31ms more after it answered), against a budget of 50ms. Seen 2 times.", "meta": {"from": "journal"}}
{"content": "law L1 \u2014 Every subagent dispatch names its model and chooses the least\u2026 \u2014 Use a fast, economical model for mechanical work with a known answer, a capable general model for careful implementation, and the strongest model only when the task turns on difficult judgement. Inheriting the orchestrator's model is not a model choice. If the dispatch API cannot accept a model, that operation is exempt.; law L2 \u2014 Every subagent is bound to a concrete job; never dispatch a generic\u2026 \u2014 Use the most specific available agent type whose declared purpose matches the assignment. On providers without agent types, give the dispatch a concrete task name and bounded prompt. If no suitable specialization exists, keep the work in the main agent instead of manufacturing an unscoped helper.; request GET /api/main/dashboard is slower than its budget \u2014 1917ms last (135ms of it working, 2ms collecting garbage, then 5ms more after it answered), against a budget of 50ms. Seen 5 times.; request GET /api/manifest is slower than its budget \u2014 760ms last (60ms of it working, 2ms collecting garbage, then 79ms more after it answered), against a budget of 50ms. Seen 28 times.; law L4 \u2014 Related work goes back to the helper or subagent that already worked\u2026 \u2014 A helper or subagent that drew a design, wrote the code or ran the research keeps what it learned. When new work changes its work, is related to it or touches the same code, send it there with a message (SendMessage, journal helper say) rather than dispatching a new one that has to rediscover everything; start fresh only when the earlier one is gone or the new work is unrelated.", "meta": {"from": "journal"}}
{"content": "the reply tag does this in one step \u2014 [!reply:N] makes the turn itself the reply; it runs only when it opens the last text of your turn; law L5 \u2014 Every subagent dispatch names the agent - a human name, a little\u2026 \u2014 A name is how the user and the chat tell subagents apart and how they are messaged later; an id or a task line is not a name. Start the dispatch's description with the name, a colon, then the task, such as \"Dr. Einstein: profile the slow hooks\" or \"Coco Rams: draw the plan card\". A designer can borrow from famous designers, a researcher from famous scientists, mixed up for fun.; command message reply is slower than its budget \u2014 5696ms last (145ms of it working, 208ms waiting on locks), against a budget of 50ms. Seen 34 times.; request POST /api/run (message reply) is slower than its budget \u2014 5731ms last (147ms of it working, 4ms collecting garbage, 455ms waiting on locks, then 1094ms more after it answered), against a budget of 50ms. Seen 15 times.", "meta": {"from": "journal"}}
{"content": "fact 27 \u2014 Running src/journal.py against the live .journal root starts a\u2026 \u2014 Seen 2026-10-01: with VERSION bumped in the tree, src/journal.py --root .journal saw the live server as another build and started a new one on a new port (8431, 8432), and the user's tabs kept losing connection. Run source builds against a throwaway or demo root (~/projects/demo-crumb/.journal), never the live one, until the release is installed.", "meta": {"from": "journal"}}
{"content": "1 new message 18525 - answer by opening your turn with [!reply:18525]", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "rule 27 \u2014 Name a declaration with the word a reader already knows \u2014 An attribute, a variable or a field gets the ordinary programming word for what it holds, not an evocative one. was, heard and alone were poetry; aliases, notify_actions and urgent_actions are what they are. The test: could a reader who has never seen this codebase guess what it holds from the name alone? Prose belongs in the help text and the abstract, where it is read as prose. This does not license abbreviations \u2014 a plain word in full, not a short one.", "meta": {"from": "journal"}}
{"content": "Code Commandments \u2014 before you wrap up \u2014 you've changed 1 judged file since the\u2026 \u2014 Code Commandments \u2014 before you wrap up: you've changed 1 judged file since the last commit. Consider running `commandments judge --changes` to confirm they conform, and fix any sin at its SOURCE (don't launder a finding with a default/cast/null-check). This is a one-time nudge for this batch \u2014 if you've already judged, or these changes aren't worth a scan, just say so and carry on.", "meta": {"from": "journal"}}
{"content": "the last 24 commits of 2.264.0 being picked onto the release branch, and the\u2026; 1 new message 18526 - answer by opening your turn with [!reply:18526]", "meta": {"from": "journal"}}
{"content": "fact 20 \u2014 A slim supervisor holds the agent and a worker reloads on every build \u2014 Since 2.118.0 (2026-09-23). src/supervisor.py is standard library only and never reloads: journal claude hands its process over to it (os.execv), and it owns the pty and the agent process, relays the terminal, writes the printed and screen captures, listens on the typist socket, restarts the agent in the same session from a relaunch command written to its runtime folder while a restart is pending, and stops it with escalation while draining the pty (an agent cannot finish exiting on macOS while its output is unread). It starts the worker (src/worker.py, which runs runner/worker.py; engine/worker.py stays as an alias for supervisors started before 2.201) and starts it again whenever it exits: RELOAD on a new build, RELAUNCH to restart the agent, STOP to end, HEAL or a quick crash to roll back a build through journal heal. The worker holds everything else: seating the session, the start-up confirm typed through the typist, services, viewer, update check, check-in, and the one-time relaunch of sessions launched before agents/terminal.py LAUNCH. agents/terminal.py holds only journal-side helpers. The server (serve.py) still runs the engines and re-execs itself on a .py change. When the agent exits, the supervisor runs journal ended, which puts set-aside hooks back and stops the server when no session is left.; fact 34 \u2014 A hooks list in a checkout's .claude/settings.json stops every\u2026 \u2014 Seen 2026-10-08: since commit 707a82915 the committed .claude/settings.json held {\"hooks\": []}; current Claude Code answers a hooks value that is not an object with a SettingsWarning dialog, which a headless helper cannot answer, so helpers 183 and 184 exited before doing anything (their launch logs in .journal/runtime/launches/ show it). This repository's journal hooks live in settings.local.json; the committed settings.json stays {}.", "meta": {"from": "journal"}}
{"content": "helper 185, Mabel Lessonsmith, reported in message 18487 \u2014 read it, then journal helper finish 185 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your chat talked about the journal's workings - \"reply went out\" \u2014 the user sees replies, reactions, pills and reads themselves; say what the work is instead", "meta": {"from": "journal"}}
{"content": "work 2206, An open question is asked with choices whenever the choices are\u2026 \u2014 it was parked because: the open-question check is committed and goes in the release after 2.263.0. journal work resume 2206 picks it up again.", "meta": {"from": "journal"}}
{"content": "helper 197, Hedy Hostwell, reported in message 18531 \u2014 read it, then journal helper finish 197 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 34s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "Code Commandments \u2014 the edit you just made to `live_check.py` breaks a rule. Fi\u2026 \u2014 Code Commandments \u2014 the edit you just made to `live_check.py` breaks a rule. Fix it now, at its SOURCE, while the code is still in front of you: \u00b7 \u2022 redundant-python-else at /Users/jessegall/projects/agent-journal/src/features/live_check.py:2 \u00b7 LOAD the skill `commandments-python-flow` before fixing \u2014 load it even if you believe you already have. \u00b7 Run `commandments info <sin>` if a rule is not one you recognise. This check reads a file at a time, so it is not the whole picture \u2014 `judge` still is.", "meta": {"from": "journal"}}
{"content": "work 2206, An open question is asked with choices whenever the choices are\u2026 \u2014 it was parked because: the open-question check is committed and goes in the release after 2.263.0. journal work resume 2206 picks it up again.", "meta": {"from": "journal"}}
{"content": "helper 201, Linus Gridwright, reported in message 18533 \u2014 read it, then journal helper finish 201 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "sequence 10, Writing a report, step 1 of 6 - Add the report\u2019s section headings \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 10 --about report:92. Lead with the answer in the report's brief, then put every part you plan on the report before writing any of them: journal report section 92 \"<part>\" \"Being written.\" for each, in order: the evidence, what was already sound, what remains uncertain. Then journal sequence next 10 --about report:92.; the last six commits of 2.264.0 being picked, and the researcher's map of what\u2026; report 92 cites nothing it was built on \u2014 you read report:42, report:43, report:44 just now: journal report link 92 \"<ref>\" for whichever it came from", "meta": {"from": "journal"}}
{"content": "message 18535 file Screenshot 2026-10-08 at 17.31.40.png needs tags \u2014 inspect the attachment, then journal message tag 18535 \"Screenshot 2026-10-08 at 17.31.40.png\" \"<a few words describing what it shows>\"; 1 new message 18535 - answer by opening your turn with [!reply:18535]; message 18535 updated", "meta": {"from": "journal"}}
{"content": "sequence 10, Writing a report, step 2 of 6 - Write the report\u2019s sections \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 10 --about report:92. Write the parts one at a time and in order with journal report section 92 \"<part>\" \"<body>\"; the user sees each one appear where you are. Then journal sequence next 10 --about report:92.", "meta": {"from": "journal"}}
{"content": "rule 54 \u2014 Settings and feature switches are read at boot and on change, never\u2026 \u2014 The user, message 13349: the application boots, determines every feature and setting once, and re-evaluates only when something changes, such as a setting or a plugin. Never lazy-load settings.", "meta": {"from": "journal"}}
{"content": "helper 185, Mabel Lessonsmith, reported in message 18487 \u2014 read it, then journal helper finish 185 once its work is taken or dropped; sequence 10, Writing a report, step 3 of 6 - Add the document or report to a\u2026 \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 10 --about report:92. If a collection the user keeps fits what you wrote, add it: journal collection add <collection n> report:92. Look with journal collection all first. When none fits but other documents or reports on the same subject sit in no collection, make one named for the subject with journal collection create \"<subject>\", add this and them, and say so in one line. A row with nothing related gets no collection of its own. Then journal sequence next 10 --about report:92.", "meta": {"from": "journal"}}
{"content": "fact 9 \u2014 Every public method on a controller becomes a journal command \u2014 The CLI is generated from the controllers: each public method of Controller, or of a typed controller, turns into journal <noun> <method>. A helper added to the base class therefore becomes a command on every type \u2014 which is how journal <type> handled and journal <type> refuse came to exist, from the CRUD funnel and the refusal funnel. An internal helper on a controller is named with a leading underscore, as _shaped and _status already are, or it ships as a command nobody meant.", "meta": {"from": "journal"}}
{"content": "sequence 10, Writing a report, step 5 of 6 - Offer the user a next step \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 10 --about report:92. If it asks the user to decide or approve something, give it buttons: journal report update 92 --set buttons='[{\"label\": \"Accept this proposal\", \"say\": \"I accept this proposal\", \"choice\": \"answer\"}, {\"label\": \"Change it first\", \"say\": \"I want changes first\", \"choice\": \"answer\"}]'. A button with say sends those words to you as the user's message; one naming a type, n and action runs that command. Buttons of one decision share a choice, so the others go once one is pressed. Skip this when nothing waits on the user. Then journal sequence next 10 --about report:92.", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 201ms last (62ms of it working, then 10ms more after it answered), against a budget of 50ms. Seen 8 times.", "meta": {"from": "journal"}}
{"content": "fact 13 \u2014 This live session runs the installed copy in .journal/journal.pyz \u2014 The running journal (server, hooks, CLI) runs from .journal/journal.pyz with its viewer and skills in .journal/src, never from the repo. A change in the repo reaches it only through python3 src/journal.py --root .journal upgrade, which packs the zip again. A commit alone changes nothing that is running.; fact 25 \u2014 A designer's install packs the whole tree, half-done server edits\u2026 \u2014 2026-09-25: Eames and Saul run python3 src/journal.py --root .journal upgrade after their viewer builds; it packs every file in src, so a server handler I was halfway through writing went live and raised on every PostToolUse hook. While designers work in parallel, keep server edits whole between tool calls (write and test in the scratchpad first), and reinstall after reverting anything.; rule 39 \u2014 Use only registered exclamation response tags \u2014 A tag like [!reply:12] runs a command, and only the tags in the tags.runs setting are registered. An invented tag does nothing and shows as raw text in the chat. Use the registered ones (reply, log, end, todo, fact, rule) and nothing else.", "meta": {"from": "journal"}}
{"content": "hook POST /api/hook/claude is slower than its budget \u2014 1786ms last (56ms of it working, 22ms collecting garbage, 44ms waiting on locks, then 5239ms more after it answered), against a budget of 50ms. Seen 3091 times.", "meta": {"from": "journal"}}
{"content": "rule 65 \u2014 Run only new and affected tests while working; the whole suite only\u2026 \u2014 The user, messages 17914 to 17917 (2026-10-07): 'stop running the whole test suite and wasting my time... please only run the new or affected tests, and then, whenever you are merging to main or publishing to main, you can run the full test suite.' Replaces rule 41's whole suite before every commit: on a feature branch, run the tests beside what changed (journal check touched, or the feature's test.py and the browser scenarios it touches); the whole suite runs once, before a merge into main and its release.", "meta": {"from": "journal"}}
{"content": "helper 197, Hedy Hostwell, reported in message 18531 \u2014 read it, then journal helper finish 197 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "request GET /api/manifest is slower than its budget \u2014 4296ms last (93ms of it working, 1ms collecting garbage, then 20ms more after it answered), against a budget of 50ms. Seen 30 times.; request GET /api/main/todo is slower than its budget \u2014 3048ms last (51ms of it working, then 295ms more after it answered), against a budget of 50ms. Seen 1 time.", "meta": {"from": "journal"}}
{"content": "your command ran 33s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "command message reply is slower than its budget \u2014 3071ms last (102ms of it working, 726ms waiting on locks), against a budget of 50ms. Seen 35 times.; request POST /api/run (message reply) is slower than its budget \u2014 3092ms last (114ms of it working, 726ms waiting on locks, then 499ms more after it answered), against a budget of 50ms. Seen 16 times.", "meta": {"from": "journal"}}
{"content": "request GET /api/main/helper is slower than its budget \u2014 2070ms last (91ms of it working, then 24ms more after it answered), against a budget of 50ms. Seen 58 times.", "meta": {"from": "journal"}}
{"content": "helper 201, Linus Gridwright, reported in message 18533 \u2014 read it, then journal helper finish 201 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "fact 30 \u2014 The tunler server refuses TLS for any subdomain without a tunnel \u2014 Seen 2026-10-04 in the server's docker logs (ssh root@tunler.jessegall.nl, container tunler): 'TLS handshake error ... host \"journal-probe.tunler.jessegall.nl\" not allowed'. A made-up subdomain never answers even when the server is healthy; probe https://tunler.jessegall.nl/ for the server itself. Root SSH to the server works.", "meta": {"from": "journal"}}
{"content": "work 2206, An open question is asked with choices whenever the choices are\u2026 \u2014 it was parked because: the open-question check is committed and goes in the release after 2.263.0. journal work resume 2206 picks it up again.; 1 new message 18542 - answer by opening your turn with [!reply:18542]", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat; helper 200, Linus Mendwell, reported in message 18543 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 18544 - answer by opening your turn with [!reply:18544]", "meta": {"from": "journal"}}
{"content": "rule 41 \u2014 Keep moving, run the whole suite before every commit, never wait \u2014 The full suite runs in about seven seconds: .venv/bin/python -m pytest -q --timeout=300 -n auto. Run it before every commit instead of picking tests by name. Group rows that sit in the same code into one sitting: write them all, test once, commit once. And never wait, not for a subagent, a build, or an answer you can carry on without. Dispatch it and keep working. If you truly are waiting on something, say so in the work log.", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 18545 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "fact 28 \u2014 The designer agent type exists, so design work goes to a subagent \u2014 Since 2026-10-01 .claude/agents/designer.md (Dieter, Opus, Claude Design tools, read-only on the repository) is an agent type; rule 56 says design is a subagent's job, never a helper's.", "meta": {"from": "journal"}}
{"content": "rule 63 \u2014 A small design is drawn once and the user approves it, with no\u2026 \u2014 The user, messages 17628 and 17629 (2026-10-07), about the tooltip and waiting-status designs: 'This design round doesn't really need multiple rounds... I just want the designer agent to design it, and I will approve it.' Rule 58's three critique rounds are for large designs such as the phone app; a small one (a tooltip, a status word, one control) is drawn once by the designer, the link goes to the user, and it is built once the user approves it.", "meta": {"from": "journal"}}
{"content": "helper 185, Mabel Lessonsmith, reported in message 18487 \u2014 read it, then journal helper finish 185 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "work 2206, An open question is asked with choices whenever the choices are\u2026 \u2014 it was parked because: the open-question check is committed and goes in the release after 2.263.0. journal work resume 2206 picks it up again.", "meta": {"from": "journal"}}
{"content": "helper 199, Dieter Smallpiece, reported in message 18548 \u2014 read it, then journal helper finish 199 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "fact 34 \u2014 A hooks list in a checkout's .claude/settings.json stops every\u2026 \u2014 Seen 2026-10-08: since commit 707a82915 the committed .claude/settings.json held {\"hooks\": []}; current Claude Code answers a hooks value that is not an object with a SettingsWarning dialog, which a headless helper cannot answer, so helpers 183 and 184 exited before doing anything (their launch logs in .journal/runtime/launches/ show it). This repository's journal hooks live in settings.local.json; the committed settings.json stays {}.; rule 35 \u2014 Write clean code - one funnel per kind of operation, never the same\u2026 \u2014 Every kind of operation has one funnel: one method that creates, one that saves, one that refuses, one that formats. A second method that does the same thing under another name splits the behaviour, and the two drift apart. Before writing a method, search for the one that already does it and extend that. scripts/checks/funnels.py finds bodies written twice.; rule 55 \u2014 Always dispatch Codex helpers on gpt-6-sol \u2014 The user's word, message 13431: switch the codex agents to GPT-6-Sol and make it their default. ~/.codex/config.toml names it as the default model too.; rule 56 \u2014 Helpers are for work that writes; subagents read, research and design \u2014 The user, message 13464: there must be a clear distinction. A subagent can be dispatched for anything read-only: research, review, design. A helper is for actual work that writes, best in its own worktree when the work is separate. Dieter designing in Claude Design should have been a subagent, not a helper.", "meta": {"from": "journal"}}
{"content": "helper 197, Hedy Hostwell, reported in message 18531 \u2014 read it, then journal helper finish 197 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 18550 - answer by opening your turn with [!reply:18550]", "meta": {"from": "journal"}}
{"content": "request POST /api/main/message is slower than its budget \u2014 753ms last (62ms of it working, 2ms collecting garbage, then 1754ms more after it answered), against a budget of 50ms. Seen 20 times.", "meta": {"from": "journal"}}
{"content": "helper 201, Linus Gridwright, reported in message 18533 \u2014 read it, then journal helper finish 201 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 18543 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "request GET /api/main/agent is slower than its budget \u2014 1175ms last (57ms of it working, 29ms collecting garbage), against a budget of 50ms. Seen 153 times.", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 18545 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "fact 20 \u2014 A slim supervisor holds the agent and a worker reloads on every build \u2014 Since 2.118.0 (2026-09-23). src/supervisor.py is standard library only and never reloads: journal claude hands its process over to it (os.execv), and it owns the pty and the agent process, relays the terminal, writes the printed and screen captures, listens on the typist socket, restarts the agent in the same session from a relaunch command written to its runtime folder while a restart is pending, and stops it with escalation while draining the pty (an agent cannot finish exiting on macOS while its output is unread). It starts the worker (src/worker.py, which runs runner/worker.py; engine/worker.py stays as an alias for supervisors started before 2.201) and starts it again whenever it exits: RELOAD on a new build, RELAUNCH to restart the agent, STOP to end, HEAL or a quick crash to roll back a build through journal heal. The worker holds everything else: seating the session, the start-up confirm typed through the typist, services, viewer, update check, check-in, and the one-time relaunch of sessions launched before agents/terminal.py LAUNCH. agents/terminal.py holds only journal-side helpers. The server (serve.py) still runs the engines and re-execs itself on a .py change. When the agent exits, the supervisor runs journal ended, which puts set-aside hooks back and stops the server when no session is left.", "meta": {"from": "journal"}}
{"content": "law L3 \u2014 Read narrowly - grep for the line, sed a range, head the file; never\u2026 \u2014 Everything a tool returns stays in the context for good and is paid for on every turn after it. Search before you read, read the range you need, and cap output with grep, head or tail. Read a whole file only when you need all of it.", "meta": {"from": "journal"}}
{"content": "helper 185, Mabel Lessonsmith, reported in message 18487 \u2014 read it, then journal helper finish 185 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 58 \u2014 A design runs three critique rounds, then is built on a branch \u2014 Messages 17276 and 17281 (2026-10-06): the norm is a three-round cycle. Round by round, the designer designs (or revises), separate critic agents review the design through their lenses (the critic agent type, .claude/agents/critic.md: read-only, with a browser; one per lens, such as first-time, native, words and parity), and the designer adjusts it to their findings; three rounds in all. The three rounds stand in for the user's approval of the design: the user does not approve it. After the third round the design is built on a branch of its own, which ends in a pull request that waits for the user's approval (rule 61). Replaces message 15725's prototype approval.", "meta": {"from": "journal"}}
{"content": "work 2206, An open question is asked with choices whenever the choices are\u2026 \u2014 it was parked because: the open-question check is committed and goes in the release after 2.263.0. journal work resume 2206 picks it up again.", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 18553 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 18555 - answer by opening your turn with [!reply:18555]", "meta": {"from": "journal"}}
{"content": "1 new message 18556 - answer by opening your turn with [!reply:18556]", "meta": {"from": "journal"}}
{"content": "work 2206, An open question is asked with choices whenever the choices are\u2026 \u2014 it was parked because: the open-question check is committed and goes in the release after 2.263.0. journal work resume 2206 picks it up again.", "meta": {"from": "journal"}}
{"content": "work 2206, An open question is asked with choices whenever the choices are\u2026 \u2014 it was parked because: the open-question check is committed and goes in the release after 2.263.0. journal work resume 2206 picks it up again.", "meta": {"from": "journal"}}
{"content": "helper 197, Hedy Hostwell, reported in message 18557 \u2014 read it, then journal helper finish 197 once its work is taken or dropped; 1 new message 18558 - answer by opening your turn with [!reply:18558]", "meta": {"from": "journal"}}
{"content": "your command ran 30s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat; 1 new message 18559 - answer by opening your turn with [!reply:18559]", "meta": {"from": "journal"}}
{"content": "helper 195, Grace Quickstep, reported in message 18560 \u2014 read it, then journal helper finish 195 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 198, Benny Pressworth, reported in message 18562 \u2014 read it, then journal helper finish 198 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 18564 - answer by opening your turn with [!reply:18564]", "meta": {"from": "journal"}}
{"content": "your command ran 34s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 18565 - answer by opening your turn with [!reply:18565]", "meta": {"from": "journal"}}
{"content": "1 new message 18566 - answer by opening your turn with [!reply:18566]", "meta": {"from": "journal"}}
{"content": "your command ran 31s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 194, Lazarus Keepalive, reported in message 18568 \u2014 read it, then journal helper finish 194 once its work is taken or dropped; 1 new message 18567 - answer by opening your turn with [!reply:18567]", "meta": {"from": "journal"}}
{"content": "helper 199, Dieter Smallpiece, reported in message 18548 \u2014 read it, then journal helper finish 199 once its work is taken or dropped; helper 201, Linus Gridwright, reported in message 18533 \u2014 read it, then journal helper finish 201 once its work is taken or dropped; helper 196, Leslie Lamportson, reported in message 18545 \u2014 read it, then journal helper finish 196 once its work is taken or dropped; helper 185, Mabel Lessonsmith, reported in message 18487 \u2014 read it, then journal helper finish 185 once its work is taken or dropped; helper 200, Linus Mendwell, reported in message 18553 \u2014 read it, then journal helper finish 200 once its work is taken or dropped; Dieter's phone picker and inspector fix going onto the release branch, and\u2026", "meta": {"from": "journal"}}
{"content": "1 new message 18570 - answer by opening your turn with [!reply:18570]", "meta": {"from": "journal"}}
{"content": "rule 43 \u2014 A request or hook over its budget is fixed before the next release \u2014 Comment 1151 on this rule. When the faults feature reports a request, a hook or a command slower than its budget, file it as a to-do at once. It does not jump ahead of the work in hand, but no version is published while one is still open: profile it, fix it, and verify the new time before the release goes out. The budget is 50ms, because everything runs locally against files.", "meta": {"from": "journal"}}
{"content": "1 new comment 3178; message 17969 commented", "meta": {"from": "journal"}}
{"content": "1 new message 18573 - answer by opening your turn with [!reply:18573]", "meta": {"from": "journal"}}
{"content": "rule 36 \u2014 Clean, DRY, idiomatic before it is committed, never after it is\u2026 \u2014 The user should never be the one who finds duplication, dead code, a clumsy name or a pattern the codebase does not use. Read the diff before every commit as a reviewer would, and fix what is not clean then, not in a follow-up after a complaint.; rule 48 \u2014 The viewer is built from its component library, and pages only\u2026 \u2014 Message 4258. Every visual piece the viewer shows more than once, or that a user would recognise as the same kind of thing (a dialog, a side panel or inspector, a dropdown, a list row, a switch, a button), is one component in web/src/kit, extracted aggressively, and every page composes those components instead of building its own copy. Before writing markup or styles in a page, look for the kit component that already does it and extend it with a prop; a second hand-built version is a bug. The side panel that animated in but not out, while a separate skill panel did both, is the example.; rule 52 \u2014 A chat mark for something the user did sits on the user's side \u2014 Message 10960 (2026-09-25): marks for the user's own actions, such as answering a question, are right-aligned like the user's messages. A mark is put there by giving its card side=user.", "meta": {"from": "journal"}}
{"content": "1 new message 18575 - answer by opening your turn with [!reply:18575]", "meta": {"from": "journal"}}
{"content": "1 new message 18576 - answer by opening your turn with [!reply:18576]", "meta": {"from": "journal"}}
{"content": "1 new message 18577 - answer by opening your turn with [!reply:18577]", "meta": {"from": "journal"}}
{"content": "your command ran 33s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself; helper 197, Hedy Hostwell, reported in message 18557 \u2014 read it, then journal helper finish 197 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 198, Benny Pressworth, reported in message 18578 \u2014 read it, then journal helper finish 198 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 195, Grace Quickstep, reported in message 18560 \u2014 read it, then journal helper finish 195 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "answer message 18573, message 18575, message 18577 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>; auto mode is on and work 2212 stands still while todo 3265 is ready \u2014 if work 2212 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3265. Stop only when nothing ready is left.", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "the reply tag on 18577 did not run \u2014 ! you already answered this in comment 3179: add to that answer with journal comment update 3179 rather than a second reply - add what is missing to the tag itself; helper 199, Dieter Smallpiece, reported in message 18580 \u2014 read it, then journal helper finish 199 once its work is taken or dropped; message 18579 file Screenshot 2026-10-08 at 17.51.57.png needs tags \u2014 inspect the attachment, then journal message tag 18579 \"Screenshot 2026-10-08 at 17.51.57.png\" \"<a few words describing what it shows>\"; 1 new message 18579 - answer by opening your turn with [!reply:18579]; message 18579 updated", "meta": {"from": "journal"}}
{"content": "rule 38 \u2014 Never change the git branch until the user says so, by name \u2014 The work happens on the branch the user named. That was main until message 5929 and question 80 (2026-09-23), which moved the sins work to the branch sins. Do not create, switch to or merge any other branch unless the user names it in their own words.", "meta": {"from": "journal"}}
{"content": "helper 195, Grace Quickstep, reported in message 18582 \u2014 read it, then journal helper finish 195 once its work is taken or dropped; work 2206, An open question is asked with choices whenever the choices are\u2026 \u2014 it was parked because: the open-question check is committed and goes in the release after 2.263.0. journal work resume 2206 picks it up again.", "meta": {"from": "journal"}}
{"content": "1 new message 18584 - answer by opening your turn with [!reply:18584]", "meta": {"from": "journal"}}
{"content": "rule 37 \u2014 Close every to-do explicitly with todo done or a Journal commit\u2026 \u2014 Ending work does not close its row. A to-do is closed by journal todo done <n> --how, or by a commit whose message carries Journal: todos done <n> at column 0, several numbers separated by commas. A row left open after its work landed misleads the next session and auto mode.; 1 new message 18585 - answer by opening your turn with [!reply:18585]", "meta": {"from": "journal"}}
{"content": "helper 202, Ursula Updatewell, reported in message 18586 \u2014 read it, then journal helper finish 202 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 18587 - answer by opening your turn with [!reply:18587]", "meta": {"from": "journal"}}
{"content": "helper 201, Linus Gridwright, reported in message 18588 \u2014 read it, then journal helper finish 201 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 32s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "answer message 18579, message 18584, message 18585 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>; command message reply is slower than its budget \u2014 903ms last (96ms of it working, 4ms collecting garbage, 16ms waiting on locks), against a budget of 50ms. Seen 38 times.", "meta": {"from": "journal"}}
{"content": "your last message ran its paragraphs together \u2014 a blank line between parts is what makes a message readable: one thought to a paragraph; the reply tag on 18585 did not run \u2014 ! you already answered this in comment 3180: add to that answer with journal comment update 3180 rather than a second reply - add what is missing to the tag itself; work 2206, An open question is asked with choices whenever the choices are\u2026 \u2014 it was parked because: the open-question check is committed and goes in the release after 2.263.0. journal work resume 2206 picks it up again.; answer message 18570, message 18573, message 18575 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>; to-do 3416 came from message 18579? \u2014 link it: journal message process 18579 \"<their words>\" todo:3416", "meta": {"from": "journal"}}
{"content": "your last message ran its paragraphs together \u2014 a blank line between parts is what makes a message readable: one thought to a paragraph; the reply tag on 18579,18584 did not run \u2014 ! you already answered this in comment 3181: add to that answer with journal comment update 3181 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "helper 194, Lazarus Keepalive, reported in message 18589 \u2014 read it, then journal helper finish 194 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 18591 - answer by opening your turn with [!reply:18591]", "meta": {"from": "journal"}}
{"content": "work 2212 in hand \u2014 Release 2.264.0 with every finished helper branch \u2014 if this is not what you are doing, end it or park it and start the work you are in", "meta": {"from": "journal"}}
{"content": "fact 18 \u2014 cProfile inflates the slow-request profiles about tenfold \u2014 The faults feature writes a profile when a request passes its budget, and the profile is taken with cProfile, which adds per-call overhead. On 2026-09-22 /api/summary profiled at 58ms with 48ms inside Resource.fork's deep copy; with the profiler off the same call ran in 2 to 7ms. Read the profile for where the time goes in relative terms, then time the call with curl before changing anything.; fact 23 \u2014 Every upgrade brings system sequences and their triggers in line\u2026 \u2014 install.py runs ship_sequences after the migrations on each upgrade, so features/sequences/shipped.py is the whole source: change its wording and the next upgrade updates every journal, no migration needed. Shipped rows carry system=True and are read-only for everyone but SYSTEM (controllers/base.py _shipped).; rule 60 \u2014 A hotfix is done by a dispatched agent in a worktree of main \u2014 Message 16836 (2026-10-06): the orchestrator cut a worktree under .claude/worktrees for a Codex hotfix, its session moved to a new environment and the user's messages stopped reaching it. The user: when working on a branch and a hotfix comes in, create a worktree of main and dispatch an agent to do that work. The orchestrator stays on its branch and in its environment, and never cds into another checkout.", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 18545 \u2014 read it, then journal helper finish 196 once its work is taken or dropped; helper 185, Mabel Lessonsmith, reported in message 18487 \u2014 read it, then journal helper finish 185 once its work is taken or dropped; helper 200, Linus Mendwell, reported in message 18553 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "fact 13 \u2014 This live session runs the installed copy in .journal/journal.pyz \u2014 The running journal (server, hooks, CLI) runs from .journal/journal.pyz with its viewer and skills in .journal/src, never from the repo. A change in the repo reaches it only through python3 src/journal.py --root .journal upgrade, which packs the zip again. A commit alone changes nothing that is running.; fact 34 \u2014 A hooks list in a checkout's .claude/settings.json stops every\u2026 \u2014 Seen 2026-10-08: since commit 707a82915 the committed .claude/settings.json held {\"hooks\": []}; current Claude Code answers a hooks value that is not an object with a SettingsWarning dialog, which a headless helper cannot answer, so helpers 183 and 184 exited before doing anything (their launch logs in .journal/runtime/launches/ show it). This repository's journal hooks live in settings.local.json; the committed settings.json stays {}.; rule 46 \u2014 Only commit and push once the whole journal is proven to boot \u2014 Messages 2178 and 2179. A release that has not been started for real can crash every project that installs it, as 2.78.3 did for Codex and 2.84.0 did to project records. Before every commit and push: the full suite passes, including tests/test_it_boots.py, which installs a packed copy into a fresh project, launches Claude and Codex from it, writes a project record, upgrades again and checks the record survives. When a change touches launching, installing or upgrading, also start a real journal in a scratch project and close it properly afterwards, leaving no process behind.", "meta": {"from": "journal"}}
{"content": "1 new message 18594 - answer by opening your turn with [!reply:18594]", "meta": {"from": "journal"}}
{"content": "1 new message 18595 - answer by opening your turn with [!reply:18595]", "meta": {"from": "journal"}}
{"content": "answer message 18564 before you write anything \u2014 answer by opening your turn with [!reply:18564]. a reply, a reaction, or journal message processed <n>; the reply tag on 18595 did not run \u2014 ! you already answered this in comment 3185: add to that answer with journal comment update 3185 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "law L1 \u2014 Every subagent dispatch names its model and chooses the least\u2026 \u2014 Use a fast, economical model for mechanical work with a known answer, a capable general model for careful implementation, and the strongest model only when the task turns on difficult judgement. Inheriting the orchestrator's model is not a model choice. If the dispatch API cannot accept a model, that operation is exempt.; law L2 \u2014 Every subagent is bound to a concrete job; never dispatch a generic\u2026 \u2014 Use the most specific available agent type whose declared purpose matches the assignment. On providers without agent types, give the dispatch a concrete task name and bounded prompt. If no suitable specialization exists, keep the work in the main agent instead of manufacturing an unscoped helper.; law L4 \u2014 Related work goes back to the helper or subagent that already worked\u2026 \u2014 A helper or subagent that drew a design, wrote the code or ran the research keeps what it learned. When new work changes its work, is related to it or touches the same code, send it there with a message (SendMessage, journal helper say) rather than dispatching a new one that has to rediscover everything; start fresh only when the earlier one is gone or the new work is unrelated.; law L5 \u2014 Every subagent dispatch names the agent - a human name, a little\u2026 \u2014 A name is how the user and the chat tell subagents apart and how they are messaged later; an id or a task line is not a name. Start the dispatch's description with the name, a colon, then the task, such as \"Dr. Einstein: profile the slow hooks\" or \"Coco Rams: draw the plan card\". A designer can borrow from famous designers, a researcher from famous scientists, mixed up for fun.; to-do 3417 came from message 18564? \u2014 link it: journal message process 18564 \"<their words>\" todo:3417", "meta": {"from": "journal"}}
{"content": "rule 61 \u2014 Features wait as pull requests until approved; only hotfixes merge\u2026 \u2014 Message 17118 (2026-10-06), after the overnight refactor merged as 2.252.0: start new work in a new branch, do not merge, write the pull request. Every pull request or new feature is parked until the user approves it. Hotfixes can be merged into main immediately (by a dispatched agent in a worktree of main, rule 60).", "meta": {"from": "journal"}}
{"content": "1 new message 18597 - answer by opening your turn with [!reply:18597]", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "1 new message 18599 - answer by opening your turn with [!reply:18599]", "meta": {"from": "journal"}}
{"content": "helper 197, Hedy Hostwell, reported in message 18557 \u2014 read it, then journal helper finish 197 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 18600 - answer by opening your turn with [!reply:18600]", "meta": {"from": "journal"}}
{"content": "your command ran 33s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself; helper 198, Benny Pressworth, reported in message 18578 \u2014 read it, then journal helper finish 198 once its work is taken or dropped; 1 new message 18601 - answer by opening your turn with [!reply:18601]", "meta": {"from": "journal"}}
{"content": "1 new message 18602 - answer by opening your turn with [!reply:18602]", "meta": {"from": "journal"}}
{"content": "auto mode is on and work 2212 stands still while todo 3265 is ready \u2014 if work 2212 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3265. Stop only when nothing ready is left.", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 18604 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 199, Dieter Smallpiece, reported in message 18580 \u2014 read it, then journal helper finish 199 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "the reply tag does this in one step \u2014 [!reply:N] makes the turn itself the reply; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "helper 195, Grace Quickstep, reported in message 18582 \u2014 read it, then journal helper finish 195 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your message 18605 names 3417 without saying what they are \u2014 put the type before each number, like message 1712 or to-do 644, so the chat links it: journal message edit 18605 \"<the text>\"", "meta": {"from": "journal"}}
{"content": "helper 202, Ursula Updatewell, reported in message 18586 \u2014 read it, then journal helper finish 202 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 35s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 201, Linus Gridwright, reported in message 18588 \u2014 read it, then journal helper finish 201 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "work 2212 in hand \u2014 Release 2.264.0 with every finished helper branch \u2014 if this is not what you are doing, end it or park it and start the work you are in", "meta": {"from": "journal"}}
{"content": "helper 194, Lazarus Keepalive, reported in message 18589 \u2014 read it, then journal helper finish 194 once its work is taken or dropped; helper 196, Leslie Lamportson, reported in message 18545 \u2014 read it, then journal helper finish 196 once its work is taken or dropped; helper 185, Mabel Lessonsmith, reported in message 18487 \u2014 read it, then journal helper finish 185 once its work is taken or dropped; the last six commits of 2.264.0, including the automatic to-do closing, going\u2026", "meta": {"from": "journal"}}
{"content": "helper 197, Hedy Hostwell, reported in message 18557 \u2014 read it, then journal helper finish 197 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 198, Benny Pressworth, reported in message 18578 \u2014 read it, then journal helper finish 198 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 18604 \u2014 read it, then journal helper finish 200 once its work is taken or dropped; helper 199, Dieter Smallpiece, reported in message 18580 \u2014 read it, then journal helper finish 199 once its work is taken or dropped; the last five commits of 2.264.0, including the automatic to-do closing, going\u2026", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat; fact 9 \u2014 Every public method on a controller becomes a journal command \u2014 The CLI is generated from the controllers: each public method of Controller, or of a typed controller, turns into journal <noun> <method>. A helper added to the base class therefore becomes a command on every type \u2014 which is how journal <type> handled and journal <type> refuse came to exist, from the CRUD funnel and the refusal funnel. An internal helper on a controller is named with a leading underscore, as _shaped and _status already are, or it ships as a command nobody meant.; rule 54 \u2014 Settings and feature switches are read at boot and on change, never\u2026 \u2014 The user, message 13349: the application boots, determines every feature and setting once, and re-evaluates only when something changes, such as a setting or a plugin. Never lazy-load settings.", "meta": {"from": "journal"}}
{"content": "helper 195, Grace Quickstep, reported in message 18582 \u2014 read it, then journal helper finish 195 once its work is taken or dropped; helper 202, Ursula Updatewell, reported in message 18586 \u2014 read it, then journal helper finish 202 once its work is taken or dropped; the last three commits of 2.264.0 going onto the release branch came back\u2026; rule 57 \u2014 Never merge the overnight refactor into main before its pull request\u2026 \u2014 Messages 15005, 15006, 15109, 15110 (2026-10-04): all refactor work goes on branch overnight-refactor and reaches the user as one pull request, which they read in the morning; nothing of it is merged into main until they say so. Hotfixes the user explicitly asks for go to main at once and are merged into the branch.; rule 64 \u2014 A finished feature is merged into main without waiting for approval \u2014 The user, message 17815 (2026-10-07): 'make sure that no pull requests are lingering on the repository. You may merge them into main... You are allowed to merge everything into main once the feature is completed.' This replaces rule 61's wait for approval: a feature still goes on its own branch, and once it is complete, tested and its whole suite passes, it is merged into main and released, and no pull request is left open.", "meta": {"from": "journal"}}
{"content": "the automatic to-do closing going onto the 2.264.0 branch; Lazarus is rebasing\u2026", "meta": {"from": "journal"}}
{"content": "rule 65 \u2014 Run only new and affected tests while working; the whole suite only\u2026 \u2014 The user, messages 17914 to 17917 (2026-10-07): 'stop running the whole test suite and wasting my time... please only run the new or affected tests, and then, whenever you are merging to main or publishing to main, you can run the full test suite.' Replaces rule 41's whole suite before every commit: on a feature branch, run the tests beside what changed (journal check touched, or the feature's test.py and the browser scenarios it touches); the whole suite runs once, before a merge into main and its release.", "meta": {"from": "journal"}}
{"content": "helper 201, Linus Gridwright, reported in message 18588 \u2014 read it, then journal helper finish 201 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "fact 20 \u2014 A slim supervisor holds the agent and a worker reloads on every build \u2014 Since 2.118.0 (2026-09-23). src/supervisor.py is standard library only and never reloads: journal claude hands its process over to it (os.execv), and it owns the pty and the agent process, relays the terminal, writes the printed and screen captures, listens on the typist socket, restarts the agent in the same session from a relaunch command written to its runtime folder while a restart is pending, and stops it with escalation while draining the pty (an agent cannot finish exiting on macOS while its output is unread). It starts the worker (src/worker.py, which runs runner/worker.py; engine/worker.py stays as an alias for supervisors started before 2.201) and starts it again whenever it exits: RELOAD on a new build, RELAUNCH to restart the agent, STOP to end, HEAL or a quick crash to roll back a build through journal heal. The worker holds everything else: seating the session, the start-up confirm typed through the typist, services, viewer, update check, check-in, and the one-time relaunch of sessions launched before agents/terminal.py LAUNCH. agents/terminal.py holds only journal-side helpers. The server (serve.py) still runs the engines and re-execs itself on a .py change. When the agent exits, the supervisor runs journal ended, which puts set-aside hooks back and stops the server when no session is left.; fact 25 \u2014 A designer's install packs the whole tree, half-done server edits\u2026 \u2014 2026-09-25: Eames and Saul run python3 src/journal.py --root .journal upgrade after their viewer builds; it packs every file in src, so a server handler I was halfway through writing went live and raised on every PostToolUse hook. While designers work in parallel, keep server edits whole between tool calls (write and test in the scratchpad first), and reinstall after reverting anything.", "meta": {"from": "journal"}}
{"content": "rule 41 \u2014 Keep moving, run the whole suite before every commit, never wait \u2014 The full suite runs in about seven seconds: .venv/bin/python -m pytest -q --timeout=300 -n auto. Run it before every commit instead of picking tests by name. Group rows that sit in the same code into one sitting: write them all, test once, commit once. And never wait, not for a subagent, a build, or an answer you can carry on without. Dispatch it and keep working. If you truly are waiting on something, say so in the work log.", "meta": {"from": "journal"}}
{"content": "your command ran 33s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 31s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your chat talked about the journal's workings - \"Still waiting\" \u2014 the user sees replies, reactions, pills and reads themselves; say what the work is instead", "meta": {"from": "journal"}}
{"content": "helper 194, Lazarus Keepalive, reported in message 18589 \u2014 read it, then journal helper finish 194 once its work is taken or dropped; helper 196, Leslie Lamportson, reported in message 18545 \u2014 read it, then journal helper finish 196 once its work is taken or dropped; helper 185, Mabel Lessonsmith, reported in message 18487 \u2014 read it, then journal helper finish 185 once its work is taken or dropped; helper 197, Hedy Hostwell, reported in message 18557 \u2014 read it, then journal helper finish 197 once its work is taken or dropped; helper 198, Benny Pressworth, reported in message 18578 \u2014 read it, then journal helper finish 198 once its work is taken or dropped; helper 200, Linus Mendwell, reported in message 18604 \u2014 read it, then journal helper finish 200 once its work is taken or dropped; helper 199, Dieter Smallpiece, reported in message 18580 \u2014 read it, then journal helper finish 199 once its work is taken or dropped; helper 195, Grace Quickstep, reported in message 18582 \u2014 read it, then journal helper finish 195 once its work is taken or dropped; helper 202, Ursula Updatewell, reported in message 18586 \u2014 read it, then journal helper finish 202 once its work is taken or dropped; helper 201, Linus Gridwright, reported in message 18588 \u2014 read it, then journal helper finish 201 once its work is taken or dropped; 2.264.0's whole suite, and the recheck of the old branches against main's full\u2026", "meta": {"from": "journal"}}
{"content": "your command ran 34s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 32s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "work 2206, An open question is asked with choices whenever the choices are\u2026 \u2014 it was parked because: the open-question check is committed and goes in the release after 2.263.0. journal work resume 2206 picks it up again.", "meta": {"from": "journal"}}
{"content": "helper 185, Mabel Lessonsmith, reported in message 18618 \u2014 read it, then journal helper finish 185 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "the error lines of 2.264.0's failing tests came back - Wait for and read the\u2026", "meta": {"from": "journal"}}
{"content": "fact 34 \u2014 A hooks list in a checkout's .claude/settings.json stops every\u2026 \u2014 Seen 2026-10-08: since commit 707a82915 the committed .claude/settings.json held {\"hooks\": []}; current Claude Code answers a hooks value that is not an object with a SettingsWarning dialog, which a headless helper cannot answer, so helpers 183 and 184 exited before doing anything (their launch logs in .journal/runtime/launches/ show it). This repository's journal hooks live in settings.local.json; the committed settings.json stays {}.; rule 27 \u2014 Name a declaration with the word a reader already knows \u2014 An attribute, a variable or a field gets the ordinary programming word for what it holds, not an evocative one. was, heard and alone were poetry; aliases, notify_actions and urgent_actions are what they are. The test: could a reader who has never seen this codebase guess what it holds from the name alone? Prose belongs in the help text and the abstract, where it is read as prose. This does not license abbreviations \u2014 a plain word in full, not a short one.; rule 35 \u2014 Write clean code - one funnel per kind of operation, never the same\u2026 \u2014 Every kind of operation has one funnel: one method that creates, one that saves, one that refuses, one that formats. A second method that does the same thing under another name splits the behaviour, and the two drift apart. Before writing a method, search for the one that already does it and extend that. scripts/checks/funnels.py finds bodies written twice.; rule 45 \u2014 No prose words as names in code - said, says, heard, spoke, told\u2026 \u2014 Messages 1360 and 1698. The user has said more than once that code must not read like prose: a variable, attribute, property or function is named for what it holds or does (text, command, labels, lines), never with a verb from a story. 'says' on the Design type (1360) and 'said = call.said.lower()' in features/recital.py (1698) are the examples. Rule 27 states the naming rule; this one carries the words, so writing one of them whispers it. Before writing a name, ask whether a reader who has never seen the code would know what it holds.; rule 55 \u2014 Always dispatch Codex helpers on gpt-6-sol \u2014 The user's word, message 13431: switch the codex agents to GPT-6-Sol and make it their default. ~/.codex/config.toml names it as the default model too.; rule 56 \u2014 Helpers are for work that writes; subagents read, research and design \u2014 The user, message 13464: there must be a clear distinction. A subagent can be dispatched for anything read-only: research, review, design. A helper is for actual work that writes, best in its own worktree when the work is separate. Dieter designing in Claude Design should have been a subagent, not a helper.; rule 59 \u2014 Every viewer heading and label says plainly what it is about \u2014 The user, messages 16499, 16839, 16844, 16989, 16992 and 16993 (2026-10-06), after 'Where the words count', 'Watch for the words in', 'This project', 'This browser' and 'Stop the journal' as tab names: viewer text reads like Linear, GitHub or Vercel. A place (page, tab, group, sidebar item) is a short noun: Settings, Project, Browser, Services, Updates, Plugins; never 'This project' or a phrase. A button is a verb for what happens: Stop, Install, Copy link, Pause the plan. A heading names what the reader looks at, and its options finish its sentence: 'Trigger when' / 'A word is written'. Plain literal words: no metaphor or whimsy ('kettle on, waiting'), no app speaking as I, none of the journal's internal words (row, hook, nudge, engine, slate). One word for one thing everywhere, sentence case, as short as it can be while clear. Applies to designers' prototypes, helpers' builds, the viewer's JavaScript lists, feature details, and shipped sequence and trigger titles alike.", "meta": {"from": "journal"}}
{"content": "rule 39 \u2014 Use only registered exclamation response tags \u2014 A tag like [!reply:12] runs a command, and only the tags in the tags.runs setting are registered. An invented tag does nothing and shows as raw text in the chat. Use the registered ones (reply, log, end, todo, fact, rule) and nothing else.; rule 50 \u2014 Everything the user does is doable in the viewer \u2014 Message 6710 (2026-09-23): the user never uses the CLI, only the UI; everything should be doable from the viewer. The journal commands are for agents; any action meant for the user (making boards, confirming, accepting, hosting, watching an agent) needs its place in the viewer.; law L3 \u2014 Read narrowly - grep for the line, sed a range, head the file; never\u2026 \u2014 Everything a tool returns stays in the context for good and is paid for on every turn after it. Search before you read, read the range you need, and cap output with grep, head or tail. Read a whole file only when you need all of it.", "meta": {"from": "journal"}}
{"content": "rule 51 \u2014 Every finished feature is committed, pushed and released with a new\u2026 \u2014 Message 9207 (2026-09-24): when a new feature is ready, commit, push and publish a new tag. This is the user's standing word for releasing, so rule 44's only-when-the-user-says is met by it for finished features; fixes in between wait for the next feature or a patch the user asks for.", "meta": {"from": "journal"}}
{"content": "1 new message 18623 - answer by opening your turn with [!reply:18623]", "meta": {"from": "journal"}}
{"content": "your last message ran its paragraphs together \u2014 a blank line between parts is what makes a message readable: one thought to a paragraph", "meta": {"from": "journal"}}
{"content": "the reply tag on 18623 did not run \u2014 ! you already answered this in comment 3188: add to that answer with journal comment update 3188 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "1 new message 18626 - answer by opening your turn with [!reply:18626]", "meta": {"from": "journal"}}
{"content": "1 new message 18629 - answer by opening your turn with [!reply:18629]", "meta": {"from": "journal"}}
{"content": "1 new message 18630 - answer by opening your turn with [!reply:18630]", "meta": {"from": "journal"}}
{"content": "the todo tag does this in one step \u2014 [!todo=\"the title\"] files it with the turn as its brief; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "1 new message 18631 - answer by opening your turn with [!reply:18631]", "meta": {"from": "journal"}}
{"content": "helper 202, Ursula Updatewell, reported in message 18632 \u2014 read it, then journal helper finish 202 once its work is taken or dropped; 1 new message 18633 - answer by opening your turn with [!reply:18633]", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat; 2 new messages 18634, 18635 - answer each by opening a turn with [!reply:<n>]", "meta": {"from": "journal"}}
{"content": "answer message 18626 before you write anything \u2014 answer by opening your turn with [!reply:18626]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "the reply tag on 18635 did not run \u2014 ! you already answered this in comment 3189: add to that answer with journal comment update 3189 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 18638 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 18642 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 18647 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 18652 \u2014 read it, then journal helper finish 203 once its work is taken or dropped; helper 196, Leslie Lamportson, reported in message 18545 \u2014 read it, then journal helper finish 196 once its work is taken or dropped; helper 185, Mabel Lessonsmith, reported in message 18618 \u2014 read it, then journal helper finish 185 once its work is taken or dropped; helper 202, Ursula Updatewell, reported in message 18632 \u2014 read it, then journal helper finish 202 once its work is taken or dropped; Ingrid fixing the 15 failures where the branches meet in 2.264.0 came back\u2026", "meta": {"from": "journal"}}
{"content": "rule 38 \u2014 Never change the git branch until the user says so, by name \u2014 The work happens on the branch the user named. That was main until message 5929 and question 80 (2026-09-23), which moved the sins work to the branch sins. Do not create, switch to or merge any other branch unless the user names it in their own words.", "meta": {"from": "journal"}}
{"content": "rule 48 \u2014 The viewer is built from its component library, and pages only\u2026 \u2014 Message 4258. Every visual piece the viewer shows more than once, or that a user would recognise as the same kind of thing (a dialog, a side panel or inspector, a dropdown, a list row, a switch, a button), is one component in web/src/kit, extracted aggressively, and every page composes those components instead of building its own copy. Before writing markup or styles in a page, look for the kit component that already does it and extend it with a prop; a second hand-built version is a bug. The side panel that animated in but not out, while a separate skill panel did both, is the example.", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 18662 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "work 2206, An open question is asked with choices whenever the choices are\u2026 \u2014 it was parked because: the open-question check is committed and goes in the release after 2.263.0. journal work resume 2206 picks it up again.", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 18652 \u2014 read it, then journal helper finish 203 once its work is taken or dropped; helper 196, Leslie Lamportson, reported in message 18545 \u2014 read it, then journal helper finish 196 once its work is taken or dropped; helper 185, Mabel Lessonsmith, reported in message 18618 \u2014 read it, then journal helper finish 185 once its work is taken or dropped; helper 202, Ursula Updatewell, reported in message 18632 \u2014 read it, then journal helper finish 202 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "fact 13 \u2014 This live session runs the installed copy in .journal/journal.pyz \u2014 The running journal (server, hooks, CLI) runs from .journal/journal.pyz with its viewer and skills in .journal/src, never from the repo. A change in the repo reaches it only through python3 src/journal.py --root .journal upgrade, which packs the zip again. A commit alone changes nothing that is running.", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 18662 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 18652 \u2014 read it, then journal helper finish 203 once its work is taken or dropped; helper 196, Leslie Lamportson, reported in message 18545 \u2014 read it, then journal helper finish 196 once its work is taken or dropped; helper 185, Mabel Lessonsmith, reported in message 18618 \u2014 read it, then journal helper finish 185 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 46 \u2014 Only commit and push once the whole journal is proven to boot \u2014 Messages 2178 and 2179. A release that has not been started for real can crash every project that installs it, as 2.78.3 did for Codex and 2.84.0 did to project records. Before every commit and push: the full suite passes, including tests/test_it_boots.py, which installs a packed copy into a fresh project, launches Claude and Codex from it, writes a project record, upgrades again and checks the record survives. When a change touches launching, installing or upgrading, also start a real journal in a scratch project and close it properly afterwards, leaving no process behind.", "meta": {"from": "journal"}}
{"content": "work 2206, An open question is asked with choices whenever the choices are\u2026 \u2014 it was parked because: the open-question check is committed and goes in the release after 2.263.0. journal work resume 2206 picks it up again.; helper 200, Linus Mendwell, reported in message 18700 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "work 2206, An open question is asked with choices whenever the choices are\u2026 \u2014 it was parked because: the open-question check is committed and goes in the release after 2.263.0. journal work resume 2206 picks it up again.; helper 200, Linus Mendwell, reported in message 18708 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "fact 18 \u2014 cProfile inflates the slow-request profiles about tenfold \u2014 The faults feature writes a profile when a request passes its budget, and the profile is taken with cProfile, which adds per-call overhead. On 2026-09-22 /api/summary profiled at 58ms with 48ms inside Resource.fork's deep copy; with the profiler off the same call ran in 2 to 7ms. Read the profile for where the time goes in relative terms, then time the call with curl before changing anything.; rule 43 \u2014 A request or hook over its budget is fixed before the next release \u2014 Comment 1151 on this rule. When the faults feature reports a request, a hook or a command slower than its budget, file it as a to-do at once. It does not jump ahead of the work in hand, but no version is published while one is still open: profile it, fix it, and verify the new time before the release goes out. The budget is 50ms, because everything runs locally against files.", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 18724 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 18733 - answer by opening your turn with [!reply:18733]", "meta": {"from": "journal"}}
{"content": "rule 61 \u2014 Features wait as pull requests until approved; only hotfixes merge\u2026 \u2014 Message 17118 (2026-10-06), after the overnight refactor merged as 2.252.0: start new work in a new branch, do not merge, write the pull request. Every pull request or new feature is parked until the user approves it. Hotfixes can be merged into main immediately (by a dispatched agent in a worktree of main, rule 60).", "meta": {"from": "journal"}}
{"content": "fact 34 \u2014 A hooks list in a checkout's .claude/settings.json stops every\u2026 \u2014 Seen 2026-10-08: since commit 707a82915 the committed .claude/settings.json held {\"hooks\": []}; current Claude Code answers a hooks value that is not an object with a SettingsWarning dialog, which a headless helper cannot answer, so helpers 183 and 184 exited before doing anything (their launch logs in .journal/runtime/launches/ show it). This repository's journal hooks live in settings.local.json; the committed settings.json stays {}.", "meta": {"from": "journal"}}
{"content": "law L1 \u2014 Every subagent dispatch names its model and chooses the least\u2026 \u2014 Use a fast, economical model for mechanical work with a known answer, a capable general model for careful implementation, and the strongest model only when the task turns on difficult judgement. Inheriting the orchestrator's model is not a model choice. If the dispatch API cannot accept a model, that operation is exempt.; law L2 \u2014 Every subagent is bound to a concrete job; never dispatch a generic\u2026 \u2014 Use the most specific available agent type whose declared purpose matches the assignment. On providers without agent types, give the dispatch a concrete task name and bounded prompt. If no suitable specialization exists, keep the work in the main agent instead of manufacturing an unscoped helper.; law L4 \u2014 Related work goes back to the helper or subagent that already worked\u2026 \u2014 A helper or subagent that drew a design, wrote the code or ran the research keeps what it learned. When new work changes its work, is related to it or touches the same code, send it there with a message (SendMessage, journal helper say) rather than dispatching a new one that has to rediscover everything; start fresh only when the earlier one is gone or the new work is unrelated.; law L5 \u2014 Every subagent dispatch names the agent - a human name, a little\u2026 \u2014 A name is how the user and the chat tell subagents apart and how they are messaged later; an id or a task line is not a name. Start the dispatch's description with the name, a colon, then the task, such as \"Dr. Einstein: profile the slow hooks\" or \"Coco Rams: draw the plan card\". A designer can borrow from famous designers, a researcher from famous scientists, mixed up for fun.", "meta": {"from": "journal"}}
{"content": "the reply tag on 18733 did not run \u2014 ! you already answered this in comment 3190: add to that answer with journal comment update 3190 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "rule 60 \u2014 A hotfix is done by a dispatched agent in a worktree of main \u2014 Message 16836 (2026-10-06): the orchestrator cut a worktree under .claude/worktrees for a Codex hotfix, its session moved to a new environment and the user's messages stopped reaching it. The user: when working on a branch and a hotfix comes in, create a worktree of main and dispatch an agent to do that work. The orchestrator stays on its branch and in its environment, and never cds into another checkout.", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 18545 \u2014 read it, then journal helper finish 196 once its work is taken or dropped; helper 185, Mabel Lessonsmith, reported in message 18618 \u2014 read it, then journal helper finish 185 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "work 2206, An open question is asked with choices whenever the choices are\u2026 \u2014 it was parked because: the open-question check is committed and goes in the release after 2.263.0. journal work resume 2206 picks it up again.; helper 200, Linus Mendwell, reported in message 18746 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 18724 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "work 2206, An open question is asked with choices whenever the choices are\u2026 \u2014 it was parked because: the open-question check is committed and goes in the release after 2.263.0. journal work resume 2206 picks it up again.", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 18753 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 18545 \u2014 read it, then journal helper finish 196 once its work is taken or dropped; helper 185, Mabel Lessonsmith, reported in message 18618 \u2014 read it, then journal helper finish 185 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 18767 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "fact 28 \u2014 The designer agent type exists, so design work goes to a subagent \u2014 Since 2026-10-01 .claude/agents/designer.md (Dieter, Opus, Claude Design tools, read-only on the repository) is an agent type; rule 56 says design is a subagent's job, never a helper's.; rule 58 \u2014 A design runs three critique rounds, then is built on a branch \u2014 Messages 17276 and 17281 (2026-10-06): the norm is a three-round cycle. Round by round, the designer designs (or revises), separate critic agents review the design through their lenses (the critic agent type, .claude/agents/critic.md: read-only, with a browser; one per lens, such as first-time, native, words and parity), and the designer adjusts it to their findings; three rounds in all. The three rounds stand in for the user's approval of the design: the user does not approve it. After the third round the design is built on a branch of its own, which ends in a pull request that waits for the user's approval (rule 61). Replaces message 15725's prototype approval.", "meta": {"from": "journal"}}
{"content": "work 2206, An open question is asked with choices whenever the choices are\u2026 \u2014 it was parked because: the open-question check is committed and goes in the release after 2.263.0. journal work resume 2206 picks it up again.; helper 200, Linus Mendwell, reported in message 18792 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "fact 20 \u2014 A slim supervisor holds the agent and a worker reloads on every build \u2014 Since 2.118.0 (2026-09-23). src/supervisor.py is standard library only and never reloads: journal claude hands its process over to it (os.execv), and it owns the pty and the agent process, relays the terminal, writes the printed and screen captures, listens on the typist socket, restarts the agent in the same session from a relaunch command written to its runtime folder while a restart is pending, and stops it with escalation while draining the pty (an agent cannot finish exiting on macOS while its output is unread). It starts the worker (src/worker.py, which runs runner/worker.py; engine/worker.py stays as an alias for supervisors started before 2.201) and starts it again whenever it exits: RELOAD on a new build, RELAUNCH to restart the agent, STOP to end, HEAL or a quick crash to roll back a build through journal heal. The worker holds everything else: seating the session, the start-up confirm typed through the typist, services, viewer, update check, check-in, and the one-time relaunch of sessions launched before agents/terminal.py LAUNCH. agents/terminal.py holds only journal-side helpers. The server (serve.py) still runs the engines and re-execs itself on a .py change. When the agent exits, the supervisor runs journal ended, which puts set-aside hooks back and stops the server when no session is left.", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 18545 \u2014 read it, then journal helper finish 196 once its work is taken or dropped; helper 185, Mabel Lessonsmith, reported in message 18618 \u2014 read it, then journal helper finish 185 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "think up what the user might ask for on board 12, Orchestrator \u2014 read its goal and cards (journal board show 12), then write 3 to 5 short things the user might ask for next, each one chip of at most 60 characters, in the user's words: journal board ideas 12 \"<idea>\" \"<idea>\" \"<idea>\". They replace the board's ideas under New work.; think up what the user might ask for on board 13, New work trials \u2014 read its goal and cards (journal board show 13), then write 3 to 5 short things the user might ask for next, each one chip of at most 60 characters, in the user's words: journal board ideas 13 \"<idea>\" \"<idea>\" \"<idea>\". They replace the board's ideas under New work.", "meta": {"from": "journal"}}
{"content": "work 2206, An open question is asked with choices whenever the choices are\u2026 \u2014 it was parked because: the open-question check is committed and goes in the release after 2.263.0. journal work resume 2206 picks it up again.", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 18802 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 63 \u2014 A small design is drawn once and the user approves it, with no\u2026 \u2014 The user, messages 17628 and 17629 (2026-10-07), about the tooltip and waiting-status designs: 'This design round doesn't really need multiple rounds... I just want the designer agent to design it, and I will approve it.' Rule 58's three critique rounds are for large designs such as the phone app; a small one (a tooltip, a status word, one control) is drawn once by the designer, the link goes to the user, and it is built once the user approves it.", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 18767 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 18805 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 18545 \u2014 read it, then journal helper finish 196 once its work is taken or dropped; helper 185, Mabel Lessonsmith, reported in message 18618 \u2014 read it, then journal helper finish 185 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new comment 3191; report 92 commented", "meta": {"from": "journal"}}
{"content": "fact 25 \u2014 A designer's install packs the whole tree, half-done server edits\u2026 \u2014 2026-09-25: Eames and Saul run python3 src/journal.py --root .journal upgrade after their viewer builds; it packs every file in src, so a server handler I was halfway through writing went live and raised on every PostToolUse hook. While designers work in parallel, keep server edits whole between tool calls (write and test in the scratchpad first), and reinstall after reverting anything.; 1 new comment 3192; report 92 commented", "meta": {"from": "journal"}}
{"content": "rule 52 \u2014 A chat mark for something the user did sits on the user's side \u2014 Message 10960 (2026-09-25): marks for the user's own actions, such as answering a question, are right-aligned like the user's messages. A mark is put there by giving its card side=user.; rule 54 \u2014 Settings and feature switches are read at boot and on change, never\u2026 \u2014 The user, message 13349: the application boots, determines every feature and setting once, and re-evaluates only when something changes, such as a setting or a plugin. Never lazy-load settings.", "meta": {"from": "journal"}}
{"content": "work 2206, An open question is asked with choices whenever the choices are\u2026 \u2014 it was parked because: the open-question check is committed and goes in the release after 2.263.0. journal work resume 2206 picks it up again.", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 18817 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "fact 9 \u2014 Every public method on a controller becomes a journal command \u2014 The CLI is generated from the controllers: each public method of Controller, or of a typed controller, turns into journal <noun> <method>. A helper added to the base class therefore becomes a command on every type \u2014 which is how journal <type> handled and journal <type> refuse came to exist, from the CRUD funnel and the refusal funnel. An internal helper on a controller is named with a leading underscore, as _shaped and _status already are, or it ships as a command nobody meant.; rule 57 \u2014 Never merge the overnight refactor into main before its pull request\u2026 \u2014 Messages 15005, 15006, 15109, 15110 (2026-10-04): all refactor work goes on branch overnight-refactor and reaches the user as one pull request, which they read in the morning; nothing of it is merged into main until they say so. Hotfixes the user explicitly asks for go to main at once and are merged into the branch.; rule 64 \u2014 A finished feature is merged into main without waiting for approval \u2014 The user, message 17815 (2026-10-07): 'make sure that no pull requests are lingering on the repository. You may merge them into main... You are allowed to merge everything into main once the feature is completed.' This replaces rule 61's wait for approval: a feature still goes on its own branch, and once it is complete, tested and its whole suite passes, it is merged into main and released, and no pull request is left open.", "meta": {"from": "journal"}}
{"content": "the todo tag does this in one step \u2014 [!todo=\"the title\"] files it with the turn as its brief; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "fact 24 \u2014 An answer followed by tool calls can be missing from Claude's\u2026 \u2014 Seen 2026-09-24 for messages 9391-9404: text blocks opening with [!reply:n] that were followed by tool calls never appeared in the session's jsonl (only thinking and tool_use rows did), so the journal never saw them and the replies were lost. When a turn goes on after answering, send the answer with journal message reply <n> \"<text>\" instead of the tag.", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 18767 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 41 \u2014 Keep moving, run the whole suite before every commit, never wait \u2014 The full suite runs in about seven seconds: .venv/bin/python -m pytest -q --timeout=300 -n auto. Run it before every commit instead of picking tests by name. Group rows that sit in the same code into one sitting: write them all, test once, commit once. And never wait, not for a subagent, a build, or an answer you can carry on without. Dispatch it and keep working. If you truly are waiting on something, say so in the work log.; rule 65 \u2014 Run only new and affected tests while working; the whole suite only\u2026 \u2014 The user, messages 17914 to 17917 (2026-10-07): 'stop running the whole test suite and wasting my time... please only run the new or affected tests, and then, whenever you are merging to main or publishing to main, you can run the full test suite.' Replaces rule 41's whole suite before every commit: on a feature branch, run the tests beside what changed (journal check touched, or the feature's test.py and the browser scenarios it touches); the whole suite runs once, before a merge into main and its release.", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 18545 \u2014 read it, then journal helper finish 196 once its work is taken or dropped; helper 185, Mabel Lessonsmith, reported in message 18618 \u2014 read it, then journal helper finish 185 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 18817 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "work 2206, An open question is asked with choices whenever the choices are\u2026 \u2014 it was parked because: the open-question check is committed and goes in the release after 2.263.0. journal work resume 2206 picks it up again.", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 18767 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 18828 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "auto mode is on and work 2212 stands still while todo 3340 is ready \u2014 if work 2212 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3340. Stop only when nothing ready is left.", "meta": {"from": "journal"}}
{"content": "You are the orchestrator here and have made 8 edits yourself - send a helper\u2026", "meta": {"from": "journal"}}
{"content": "plan 28 updated", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 18848 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new comment 3194; comment 3192 commented", "meta": {"from": "journal"}}
{"content": "your message 18860 names 3425 without saying what they are \u2014 put the type before each number, like message 1712 or to-do 644, so the chat links it: journal message edit 18860 \"<the text>\"", "meta": {"from": "journal"}}
{"content": "your message 18865 names 3330, 3340, 3341 without saying what they are \u2014 put the type before each number, like message 1712 or to-do 644, so the chat links it: journal message edit 18865 \"<the text>\"; your message 18867 names 3340, 3341, 3342 without saying what they are \u2014 put the type before each number, like message 1712 or to-do 644, so the chat links it: journal message edit 18867 \"<the text>\"; helper 196, Leslie Lamportson, reported in message 18545 \u2014 read it, then journal helper finish 196 once its work is taken or dropped; helper 185, Mabel Lessonsmith, reported in message 18618 \u2014 read it, then journal helper finish 185 once its work is taken or dropped; fact 13 \u2014 This live session runs the installed copy in .journal/journal.pyz \u2014 The running journal (server, hooks, CLI) runs from .journal/journal.pyz with its viewer and skills in .journal/src, never from the repo. A change in the repo reaches it only through python3 src/journal.py --root .journal upgrade, which packs the zip again. A commit alone changes nothing that is running.", "meta": {"from": "journal"}}
{"content": "your message 18868 names 3423, 3424 without saying what they are \u2014 put the type before each number, like message 1712 or to-do 644, so the chat links it: journal message edit 18868 \"<the text>\"", "meta": {"from": "journal"}}
{"content": "work 2206, An open question is asked with choices whenever the choices are\u2026 \u2014 it was parked because: the open-question check is committed and goes in the release after 2.263.0. journal work resume 2206 picks it up again.; commit 92de5dfd4 closed to-do 3324 \u2014 The rows and the work are done; take the next one.", "meta": {"from": "journal"}}
{"content": "fact 27 \u2014 Running src/journal.py against the live .journal root starts a\u2026 \u2014 Seen 2026-10-01: with VERSION bumped in the tree, src/journal.py --root .journal saw the live server as another build and started a new one on a new port (8431, 8432), and the user's tabs kept losing connection. Run source builds against a throwaway or demo root (~/projects/demo-crumb/.journal), never the live one, until the release is installed.", "meta": {"from": "journal"}}
{"content": "journal-ask-questions, journal-secrets changed since you loaded them \u2014 load one again when you next need it; only the every-start skills are held for", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 3455ms last (73ms of it working, then 30ms more after it answered), against a budget of 50ms. Seen 19 times.", "meta": {"from": "journal"}}
{"content": "work 2206, An open question is asked with choices whenever the choices are\u2026 \u2014 it was parked because: the open-question check is committed and goes in the release after 2.263.0. journal work resume 2206 picks it up again.", "meta": {"from": "journal"}}
{"content": "you ran the same check 3 times in a row - journal todo all --last 0 2>&1 |\u2026 \u2014 if you are waiting for something to change, say journal work await \"<what you wait for>\" and end your turn: you are asked to look again every five minutes, and a background command tells you itself when it ends. Keep checking only if each look moves the work on.; helper 204, Hedy Hostwell, reported in message 18871 \u2014 read it, then journal helper finish 204 once its work is taken or dropped; the hook hit an error \u2014 journal: the hook hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. the hook got no answer from the server 1 times (codes 000)", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 18872 \u2014 read it, then journal helper finish 200 once its work is taken or dropped; plan 28 updated", "meta": {"from": "journal"}}
{"content": "law L3 \u2014 Read narrowly - grep for the line, sed a range, head the file; never\u2026 \u2014 Everything a tool returns stays in the context for good and is paid for on every turn after it. Search before you read, read the range you need, and cap output with grep, head or tail. Read a whole file only when you need all of it.", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 18848 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 18545 \u2014 read it, then journal helper finish 196 once its work is taken or dropped; helper 185, Mabel Lessonsmith, reported in message 18618 \u2014 read it, then journal helper finish 185 once its work is taken or dropped; auto mode is on and work 2212 stands still while todo 3278 is ready \u2014 if work 2212 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3278. Stop only when nothing ready is left.; helper 200, Linus Mendwell, reported in message 18874 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "plan 28 updated", "meta": {"from": "journal"}}
{"content": "helper 204, Hedy Hostwell, reported in message 18871 \u2014 read it, then journal helper finish 204 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "you ran the same check 3 times in a row - sed -n '/^---$/,$p'\u2026 \u2014 if you are waiting for something to change, say journal work await \"<what you wait for>\" and end your turn: you are asked to look again every five minutes, and a background command tells you itself when it ends. Keep checking only if each look moves the work on.", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 18848 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 18545 \u2014 read it, then journal helper finish 196 once its work is taken or dropped; helper 185, Mabel Lessonsmith, reported in message 18618 \u2014 read it, then journal helper finish 185 once its work is taken or dropped; helper 200, Linus Mendwell, reported in message 18874 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "plan 28 updated", "meta": {"from": "journal"}}
{"content": "todo 3242 next", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 18880 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 204, Hedy Hostwell, reported in message 18871 \u2014 read it, then journal helper finish 204 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "todo 3276 next", "meta": {"from": "journal"}}
{"content": "plan 28 updated", "meta": {"from": "journal"}}
{"content": "helper 204, Hedy Hostwell, reported in message 18883 \u2014 read it, then journal helper finish 204 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 18848 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 18545 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "you ran the same check 3 times in a row - journal helper say 196 \"From Hedy\u2026 \u2014 if you are waiting for something to change, say journal work await \"<what you wait for>\" and end your turn: you are asked to look again every five minutes, and a background command tells you itself when it ends. Keep checking only if each look moves the work on.", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 18880 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 18899 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 193, Grete Stopwatch, reported in message 18912 \u2014 read it, then journal helper finish 193 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 1086ms last (88ms of it working, then 14ms more after it answered), against a budget of 50ms. Seen 20 times.", "meta": {"from": "journal"}}
{"content": "helper 204, Hedy Hostwell, reported in message 18883 \u2014 read it, then journal helper finish 204 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "message 18913 file Screenshot 2026-10-08 at 19.34.46.png needs tags \u2014 inspect the attachment, then journal message tag 18913 \"Screenshot 2026-10-08 at 19.34.46.png\" \"<a few words describing what it shows>\"; 1 new message 18913 - answer by opening your turn with [!reply:18913]; message 18913 updated", "meta": {"from": "journal"}}
{"content": "1 new message 18915 - answer by opening your turn with [!reply:18915]", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 18848 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 18545 \u2014 read it, then journal helper finish 196 once its work is taken or dropped; rule 45 \u2014 No prose words as names in code - said, says, heard, spoke, told\u2026 \u2014 Messages 1360 and 1698. The user has said more than once that code must not read like prose: a variable, attribute, property or function is named for what it holds or does (text, command, labels, lines), never with a verb from a story. 'says' on the Design type (1360) and 'said = call.said.lower()' in features/recital.py (1698) are the examples. Rule 27 states the naming rule; this one carries the words, so writing one of them whispers it. Before writing a name, ask whether a reader who has never seen the code would know what it holds.", "meta": {"from": "journal"}}
{"content": "fact 9 \u2014 Every public method on a controller becomes a journal command \u2014 The CLI is generated from the controllers: each public method of Controller, or of a typed controller, turns into journal <noun> <method>. A helper added to the base class therefore becomes a command on every type \u2014 which is how journal <type> handled and journal <type> refuse came to exist, from the CRUD funnel and the refusal funnel. An internal helper on a controller is named with a leading underscore, as _shaped and _status already are, or it ships as a command nobody meant.; fact 13 \u2014 This live session runs the installed copy in .journal/journal.pyz \u2014 The running journal (server, hooks, CLI) runs from .journal/journal.pyz with its viewer and skills in .journal/src, never from the repo. A change in the repo reaches it only through python3 src/journal.py --root .journal upgrade, which packs the zip again. A commit alone changes nothing that is running.; fact 34 \u2014 A hooks list in a checkout's .claude/settings.json stops every\u2026 \u2014 Seen 2026-10-08: since commit 707a82915 the committed .claude/settings.json held {\"hooks\": []}; current Claude Code answers a hooks value that is not an object with a SettingsWarning dialog, which a headless helper cannot answer, so helpers 183 and 184 exited before doing anything (their launch logs in .journal/runtime/launches/ show it). This repository's journal hooks live in settings.local.json; the committed settings.json stays {}.; rule 35 \u2014 Write clean code - one funnel per kind of operation, never the same\u2026 \u2014 Every kind of operation has one funnel: one method that creates, one that saves, one that refuses, one that formats. A second method that does the same thing under another name splits the behaviour, and the two drift apart. Before writing a method, search for the one that already does it and extend that. scripts/checks/funnels.py finds bodies written twice.; rule 50 \u2014 Everything the user does is doable in the viewer \u2014 Message 6710 (2026-09-23): the user never uses the CLI, only the UI; everything should be doable from the viewer. The journal commands are for agents; any action meant for the user (making boards, confirming, accepting, hosting, watching an agent) needs its place in the viewer.; rule 52 \u2014 A chat mark for something the user did sits on the user's side \u2014 Message 10960 (2026-09-25): marks for the user's own actions, such as answering a question, are right-aligned like the user's messages. A mark is put there by giving its card side=user.; rule 54 \u2014 Settings and feature switches are read at boot and on change, never\u2026 \u2014 The user, message 13349: the application boots, determines every feature and setting once, and re-evaluates only when something changes, such as a setting or a plugin. Never lazy-load settings.; rule 55 \u2014 Always dispatch Codex helpers on gpt-6-sol \u2014 The user's word, message 13431: switch the codex agents to GPT-6-Sol and make it their default. ~/.codex/config.toml names it as the default model too.; rule 56 \u2014 Helpers are for work that writes; subagents read, research and design \u2014 The user, message 13464: there must be a clear distinction. A subagent can be dispatched for anything read-only: research, review, design. A helper is for actual work that writes, best in its own worktree when the work is separate. Dieter designing in Claude Design should have been a subagent, not a helper.", "meta": {"from": "journal"}}
{"content": "your message 18925 names 384 without saying what they are \u2014 put the type before each number, like message 1712 or to-do 644, so the chat links it: journal message edit 18925 \"<the text>\"; fact 18 \u2014 cProfile inflates the slow-request profiles about tenfold \u2014 The faults feature writes a profile when a request passes its budget, and the profile is taken with cProfile, which adds per-call overhead. On 2026-09-22 /api/summary profiled at 58ms with 48ms inside Resource.fork's deep copy; with the profiler off the same call ran in 2 to 7ms. Read the profile for where the time goes in relative terms, then time the call with curl before changing anything.; fact 23 \u2014 Every upgrade brings system sequences and their triggers in line\u2026 \u2014 install.py runs ship_sequences after the migrations on each upgrade, so features/sequences/shipped.py is the whole source: change its wording and the next upgrade updates every journal, no migration needed. Shipped rows carry system=True and are read-only for everyone but SYSTEM (controllers/base.py _shipped).", "meta": {"from": "journal"}}
{"content": "the hook hit an error \u2014 journal: the hook hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. the hook got no answer from the server 1 times (codes 000); your message 18926 names 3341, 3342 without saying what they are \u2014 put the type before each number, like message 1712 or to-do 644, so the chat links it: journal message edit 18926 \"<the text>\"", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 18928 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 18899 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "you ran the same check 3 times in a row - journal todo create \"The plan bar's\u2026 \u2014 if you are waiting for something to change, say journal work await \"<what you wait for>\" and end your turn: you are asked to look again every five minutes, and a background command tells you itself when it ends. Keep checking only if each look moves the work on.", "meta": {"from": "journal"}}
{"content": "answer message 18913, message 18915 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "after POST /api/hook/claude hit an error \u2014 journal: after POST /api/hook/claude hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. resources.base.Refused: message 18915 is already closed", "meta": {"from": "journal"}}
{"content": "the reply tag on 18915 did not run \u2014 ! you already answered this in comment 3196: add to that answer with journal comment update 3196 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 18930 \u2014 read it, then journal helper finish 200 once its work is taken or dropped; request GET /api/main/dashboard is slower than its budget \u2014 735ms last (64ms of it working, then 14ms more after it answered), against a budget of 50ms. Seen 21 times.", "meta": {"from": "journal"}}
{"content": "helper 193, Grete Stopwatch, reported in message 18912 \u2014 read it, then journal helper finish 193 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 204, Hedy Hostwell, reported in message 18883 \u2014 read it, then journal helper finish 204 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "request GET /api/upstream is slower than its budget \u2014 1505ms last (60ms of it working, then 28ms more after it answered), against a budget of 50ms. Seen 1 time.", "meta": {"from": "journal"}}
{"content": "1 new message 18932 - answer by opening your turn with [!reply:18932]", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 18848 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "message 18933 file Screenshot 2026-10-08 at 19.40.34.png needs tags \u2014 inspect the attachment, then journal message tag 18933 \"Screenshot 2026-10-08 at 19.40.34.png\" \"<a few words describing what it shows>\"; 1 new message 18933 - answer by opening your turn with [!reply:18933]; message 18933 updated", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 18928 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "fact 25 \u2014 A designer's install packs the whole tree, half-done server edits\u2026 \u2014 2026-09-25: Eames and Saul run python3 src/journal.py --root .journal upgrade after their viewer builds; it packs every file in src, so a server handler I was halfway through writing went live and raised on every PostToolUse hook. While designers work in parallel, keep server edits whole between tool calls (write and test in the scratchpad first), and reinstall after reverting anything.; fact 28 \u2014 The designer agent type exists, so design work goes to a subagent \u2014 Since 2026-10-01 .claude/agents/designer.md (Dieter, Opus, Claude Design tools, read-only on the repository) is an agent type; rule 56 says design is a subagent's job, never a helper's.; law L4 \u2014 Related work goes back to the helper or subagent that already worked\u2026 \u2014 A helper or subagent that drew a design, wrote the code or ran the research keeps what it learned. When new work changes its work, is related to it or touches the same code, send it there with a message (SendMessage, journal helper say) rather than dispatching a new one that has to rediscover everything; start fresh only when the earlier one is gone or the new work is unrelated.", "meta": {"from": "journal"}}
{"content": "rule 58 \u2014 A design runs three critique rounds, then is built on a branch \u2014 Messages 17276 and 17281 (2026-10-06): the norm is a three-round cycle. Round by round, the designer designs (or revises), separate critic agents review the design through their lenses (the critic agent type, .claude/agents/critic.md: read-only, with a browser; one per lens, such as first-time, native, words and parity), and the designer adjusts it to their findings; three rounds in all. The three rounds stand in for the user's approval of the design: the user does not approve it. After the third round the design is built on a branch of its own, which ends in a pull request that waits for the user's approval (rule 61). Replaces message 15725's prototype approval.; rule 63 \u2014 A small design is drawn once and the user approves it, with no\u2026 \u2014 The user, messages 17628 and 17629 (2026-10-07), about the tooltip and waiting-status designs: 'This design round doesn't really need multiple rounds... I just want the designer agent to design it, and I will approve it.' Rule 58's three critique rounds are for large designs such as the phone app; a small one (a tooltip, a status word, one control) is drawn once by the designer, the link goes to the user, and it is built once the user approves it.", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 18930 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 193, Grete Stopwatch, reported in message 18912 \u2014 read it, then journal helper finish 193 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 204, Hedy Hostwell, reported in message 18883 \u2014 read it, then journal helper finish 204 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "the hook hit an error \u2014 journal: the hook hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. the hook got no answer from the server 1 times (codes 000)", "meta": {"from": "journal"}}
{"content": "1 new message 18937 - answer by opening your turn with [!reply:18937]", "meta": {"from": "journal"}}
{"content": "1 new message 18938 - answer by opening your turn with [!reply:18938]", "meta": {"from": "journal"}}
{"content": "1 new message 18939 - answer by opening your turn with [!reply:18939]", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 18848 \u2014 read it, then journal helper finish 203 once its work is taken or dropped; 1 new message 18940 - answer by opening your turn with [!reply:18940]", "meta": {"from": "journal"}}
{"content": "helper 204, Hedy Hostwell, stopped running before it reported \u2014 its agent is gone, so journal helper say cannot reach it. (B78(B78 Resume this session with: claude --resume 6ae1e48f-af64-4f26-96b5-549cfd6c024e Dispatch the job again, or journal helper finish 204 and do the job yourself", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 18928 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "answer message 18933 before you write anything \u2014 answer by opening your turn with [!reply:18933]. a reply, a reaction, or journal message processed <n>; command message reply is slower than its budget \u2014 4534ms last (195ms of it working), against a budget of 50ms. Seen 39 times.; request POST /api/run (message reply) is slower than its budget \u2014 4584ms last (197ms of it working, 372ms waiting on locks, then 2247ms more after it answered), against a budget of 50ms. Seen 19 times.; request GET /api/main/dashboard is slower than its budget \u2014 507ms last (52ms of it working, then 32ms more after it answered), against a budget of 50ms. Seen 22 times.; request POST /api/run (helper finish) is slower than its budget \u2014 2017ms last (71ms of it working, 3ms collecting garbage, 255ms waiting on locks, then 7469ms more after it answered), against a budget of 50ms. Seen 65 times.; fact 9 \u2014 Every public method on a controller becomes a journal command \u2014 The CLI is generated from the controllers: each public method of Controller, or of a typed controller, turns into journal <noun> <method>. A helper added to the base class therefore becomes a command on every type \u2014 which is how journal <type> handled and journal <type> refuse came to exist, from the CRUD funnel and the refusal funnel. An internal helper on a controller is named with a leading underscore, as _shaped and _status already are, or it ships as a command nobody meant.; fact 34 \u2014 A hooks list in a checkout's .claude/settings.json stops every\u2026 \u2014 Seen 2026-10-08: since commit 707a82915 the committed .claude/settings.json held {\"hooks\": []}; current Claude Code answers a hooks value that is not an object with a SettingsWarning dialog, which a headless helper cannot answer, so helpers 183 and 184 exited before doing anything (their launch logs in .journal/runtime/launches/ show it). This repository's journal hooks live in settings.local.json; the committed settings.json stays {}.; rule 48 \u2014 The viewer is built from its component library, and pages only\u2026 \u2014 Message 4258. Every visual piece the viewer shows more than once, or that a user would recognise as the same kind of thing (a dialog, a side panel or inspector, a dropdown, a list row, a switch, a button), is one component in web/src/kit, extracted aggressively, and every page composes those components instead of building its own copy. Before writing markup or styles in a page, look for the kit component that already does it and extend it with a prop; a second hand-built version is a bug. The side panel that animated in but not out, while a separate skill panel did both, is the example.", "meta": {"from": "journal"}}
{"content": "to-do 3428 came from message 18933? \u2014 link it: journal message process 18933 \"<their words>\" todo:3428", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 18944 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "the hook hit an error \u2014 journal: the hook hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. the hook got no answer from the server 1 times (codes 000)", "meta": {"from": "journal"}}
{"content": "fact 20 \u2014 A slim supervisor holds the agent and a worker reloads on every build \u2014 Since 2.118.0 (2026-09-23). src/supervisor.py is standard library only and never reloads: journal claude hands its process over to it (os.execv), and it owns the pty and the agent process, relays the terminal, writes the printed and screen captures, listens on the typist socket, restarts the agent in the same session from a relaunch command written to its runtime folder while a restart is pending, and stops it with escalation while draining the pty (an agent cannot finish exiting on macOS while its output is unread). It starts the worker (src/worker.py, which runs runner/worker.py; engine/worker.py stays as an alias for supervisors started before 2.201) and starts it again whenever it exits: RELOAD on a new build, RELAUNCH to restart the agent, STOP to end, HEAL or a quick crash to roll back a build through journal heal. The worker holds everything else: seating the session, the start-up confirm typed through the typist, services, viewer, update check, check-in, and the one-time relaunch of sessions launched before agents/terminal.py LAUNCH. agents/terminal.py holds only journal-side helpers. The server (serve.py) still runs the engines and re-execs itself on a .py change. When the agent exits, the supervisor runs journal ended, which puts set-aside hooks back and stops the server when no session is left.; rule 38 \u2014 Never change the git branch until the user says so, by name \u2014 The work happens on the branch the user named. That was main until message 5929 and question 80 (2026-09-23), which moved the sins work to the branch sins. Do not create, switch to or merge any other branch unless the user names it in their own words.; rule 61 \u2014 Features wait as pull requests until approved; only hotfixes merge\u2026 \u2014 Message 17118 (2026-10-06), after the overnight refactor merged as 2.252.0: start new work in a new branch, do not merge, write the pull request. Every pull request or new feature is parked until the user approves it. Hotfixes can be merged into main immediately (by a dispatched agent in a worktree of main, rule 60).", "meta": {"from": "journal"}}
{"content": "helper 193, Grete Stopwatch, reported in message 18912 \u2014 read it, then journal helper finish 193 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "you ran the same check 3 times in a row - journal helper say 203 \"For 2.265.0\u2026 \u2014 if you are waiting for something to change, say journal work await \"<what you wait for>\" and end your turn: you are asked to look again every five minutes, and a background command tells you itself when it ends. Keep checking only if each look moves the work on.", "meta": {"from": "journal"}}
{"content": "the await tag does this in one step \u2014 [!await] makes the rest of the turn what you wait for; [!await on=(\"<id>\", \"helper:<n>\")] waits on those; it runs only when it opens the last text of your turn; hook POST /api/hook/claude is slower than its budget \u2014 15609ms last (60ms of it working, then 892ms more after it answered), against a budget of 50ms. Seen 3094 times.; request GET /api/agents is slower than its budget \u2014 15876ms last (55ms of it working), against a budget of 50ms. Seen 1 time.", "meta": {"from": "journal"}}
{"content": "your command ran 32s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 18947 \u2014 read it, then journal helper finish 196 once its work is taken or dropped; helper 200, Linus Mendwell, reported in message 18948 \u2014 read it, then journal helper finish 200 once its work is taken or dropped; helper 203, Ingrid Mergewell, reported in message 18848 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "the reply tag on 18933 did not run \u2014 ! you already answered this in comment 3199: add to that answer with journal comment update 3199 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "the hook hit an error \u2014 journal: the hook hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. the hook got no answer from the server 1 times (codes 000)", "meta": {"from": "journal"}}
{"content": "helper 193, Grete Stopwatch, reported in message 18912 \u2014 read it, then journal helper finish 193 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "fact 13 \u2014 This live session runs the installed copy in .journal/journal.pyz \u2014 The running journal (server, hooks, CLI) runs from .journal/journal.pyz with its viewer and skills in .journal/src, never from the repo. A change in the repo reaches it only through python3 src/journal.py --root .journal upgrade, which packs the zip again. A commit alone changes nothing that is running.; rule 39 \u2014 Use only registered exclamation response tags \u2014 A tag like [!reply:12] runs a command, and only the tags in the tags.runs setting are registered. An invented tag does nothing and shows as raw text in the chat. Use the registered ones (reply, log, end, todo, fact, rule) and nothing else.; rule 51 \u2014 Every finished feature is committed, pushed and released with a new\u2026 \u2014 Message 9207 (2026-09-24): when a new feature is ready, commit, push and publish a new tag. This is the user's standing word for releasing, so rule 44's only-when-the-user-says is met by it for finished features; fixes in between wait for the next feature or a patch the user asks for.; rule 59 \u2014 Every viewer heading and label says plainly what it is about \u2014 The user, messages 16499, 16839, 16844, 16989, 16992 and 16993 (2026-10-06), after 'Where the words count', 'Watch for the words in', 'This project', 'This browser' and 'Stop the journal' as tab names: viewer text reads like Linear, GitHub or Vercel. A place (page, tab, group, sidebar item) is a short noun: Settings, Project, Browser, Services, Updates, Plugins; never 'This project' or a phrase. A button is a verb for what happens: Stop, Install, Copy link, Pause the plan. A heading names what the reader looks at, and its options finish its sentence: 'Trigger when' / 'A word is written'. Plain literal words: no metaphor or whimsy ('kettle on, waiting'), no app speaking as I, none of the journal's internal words (row, hook, nudge, engine, slate). One word for one thing everywhere, sentence case, as short as it can be while clear. Applies to designers' prototypes, helpers' builds, the viewer's JavaScript lists, feature details, and shipped sequence and trigger titles alike.", "meta": {"from": "journal"}}
{"content": "your chat talked about the journal's workings - \"nothing waits\" \u2014 the user sees replies, reactions, pills and reads themselves; say what the work is instead", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "rule 46 \u2014 Only commit and push once the whole journal is proven to boot \u2014 Messages 2178 and 2179. A release that has not been started for real can crash every project that installs it, as 2.78.3 did for Codex and 2.84.0 did to project records. Before every commit and push: the full suite passes, including tests/test_it_boots.py, which installs a packed copy into a fresh project, launches Claude and Codex from it, writes a project record, upgrades again and checks the record survives. When a change touches launching, installing or upgrading, also start a real journal in a scratch project and close it properly afterwards, leaving no process behind.", "meta": {"from": "journal"}}
{"content": "work deferred in words, not parked \u2014 \"once the release is\" is the title of a to-do: journal todo create \"<title>\" --brief, then say so", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 18962 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 18947 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 18848 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 193, Grete Stopwatch, reported in message 18966 \u2014 read it, then journal helper finish 193 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 18967 - answer by opening your turn with [!reply:18967]", "meta": {"from": "journal"}}
{"content": "the hook hit an error \u2014 journal: the hook hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. the hook got no answer from the server 1 times (codes 000)", "meta": {"from": "journal"}}
{"content": "fact 25 \u2014 A designer's install packs the whole tree, half-done server edits\u2026 \u2014 2026-09-25: Eames and Saul run python3 src/journal.py --root .journal upgrade after their viewer builds; it packs every file in src, so a server handler I was halfway through writing went live and raised on every PostToolUse hook. While designers work in parallel, keep server edits whole between tool calls (write and test in the scratchpad first), and reinstall after reverting anything.; rule 57 \u2014 Never merge the overnight refactor into main before its pull request\u2026 \u2014 Messages 15005, 15006, 15109, 15110 (2026-10-04): all refactor work goes on branch overnight-refactor and reaches the user as one pull request, which they read in the morning; nothing of it is merged into main until they say so. Hotfixes the user explicitly asks for go to main at once and are merged into the branch.; rule 61 \u2014 Features wait as pull requests until approved; only hotfixes merge\u2026 \u2014 Message 17118 (2026-10-06), after the overnight refactor merged as 2.252.0: start new work in a new branch, do not merge, write the pull request. Every pull request or new feature is parked until the user approves it. Hotfixes can be merged into main immediately (by a dispatched agent in a worktree of main, rule 60).; rule 64 \u2014 A finished feature is merged into main without waiting for approval \u2014 The user, message 17815 (2026-10-07): 'make sure that no pull requests are lingering on the repository. You may merge them into main... You are allowed to merge everything into main once the feature is completed.' This replaces rule 61's wait for approval: a feature still goes on its own branch, and once it is complete, tested and its whole suite passes, it is merged into main and released, and no pull request is left open.; rule 65 \u2014 Run only new and affected tests while working; the whole suite only\u2026 \u2014 The user, messages 17914 to 17917 (2026-10-07): 'stop running the whole test suite and wasting my time... please only run the new or affected tests, and then, whenever you are merging to main or publishing to main, you can run the full test suite.' Replaces rule 41's whole suite before every commit: on a feature branch, run the tests beside what changed (journal check touched, or the feature's test.py and the browser scenarios it touches); the whole suite runs once, before a merge into main and its release.", "meta": {"from": "journal"}}
{"content": "you ran the same check 3 times in a row - journal helper say 200 \"Thank you\u2026 \u2014 if you are waiting for something to change, say journal work await \"<what you wait for>\" and end your turn: you are asked to look again every five minutes, and a background command tells you itself when it ends. Keep checking only if each look moves the work on.", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 18970 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 18947 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 36 \u2014 Clean, DRY, idiomatic before it is committed, never after it is\u2026 \u2014 The user should never be the one who finds duplication, dead code, a clumsy name or a pattern the codebase does not use. Read the diff before every commit as a reviewer would, and fix what is not clean then, not in a follow-up after a complaint.; rule 37 \u2014 Close every to-do explicitly with todo done or a Journal commit\u2026 \u2014 Ending work does not close its row. A to-do is closed by journal todo done <n> --how, or by a commit whose message carries Journal: todos done <n> at column 0, several numbers separated by commas. A row left open after its work landed misleads the next session and auto mode.", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 667ms last (61ms of it working, 13ms collecting garbage, then 143ms more after it answered), against a budget of 50ms. Seen 24 times.", "meta": {"from": "journal"}}
{"content": "1 new message 18972 - answer by opening your turn with [!reply:18972]", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 18848 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 193, Grete Stopwatch, reported in message 18966 \u2014 read it, then journal helper finish 193 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "the reply tag on 18967 did not run \u2014 ! you already answered this in comment 3200: add to that answer with journal comment update 3200 rather than a second reply - add what is missing to the tag itself; command message reply is slower than its budget \u2014 2871ms last (191ms of it working), against a budget of 50ms. Seen 41 times.; fact 9 \u2014 Every public method on a controller becomes a journal command \u2014 The CLI is generated from the controllers: each public method of Controller, or of a typed controller, turns into journal <noun> <method>. A helper added to the base class therefore becomes a command on every type \u2014 which is how journal <type> handled and journal <type> refuse came to exist, from the CRUD funnel and the refusal funnel. An internal helper on a controller is named with a leading underscore, as _shaped and _status already are, or it ships as a command nobody meant.", "meta": {"from": "journal"}}
{"content": "fact 34 \u2014 A hooks list in a checkout's .claude/settings.json stops every\u2026 \u2014 Seen 2026-10-08: since commit 707a82915 the committed .claude/settings.json held {\"hooks\": []}; current Claude Code answers a hooks value that is not an object with a SettingsWarning dialog, which a headless helper cannot answer, so helpers 183 and 184 exited before doing anything (their launch logs in .journal/runtime/launches/ show it). This repository's journal hooks live in settings.local.json; the committed settings.json stays {}.; rule 35 \u2014 Write clean code - one funnel per kind of operation, never the same\u2026 \u2014 Every kind of operation has one funnel: one method that creates, one that saves, one that refuses, one that formats. A second method that does the same thing under another name splits the behaviour, and the two drift apart. Before writing a method, search for the one that already does it and extend that. scripts/checks/funnels.py finds bodies written twice.", "meta": {"from": "journal"}}
{"content": "the reply tag on 18972 did not run \u2014 ! you already answered this in comment 3201: add to that answer with journal comment update 3201 rather than a second reply - add what is missing to the tag itself; rule 55 \u2014 Always dispatch Codex helpers on gpt-6-sol \u2014 The user's word, message 13431: switch the codex agents to GPT-6-Sol and make it their default. ~/.codex/config.toml names it as the default model too.; rule 56 \u2014 Helpers are for work that writes; subagents read, research and design \u2014 The user, message 13464: there must be a clear distinction. A subagent can be dispatched for anything read-only: research, review, design. A helper is for actual work that writes, best in its own worktree when the work is separate. Dieter designing in Claude Design should have been a subagent, not a helper.", "meta": {"from": "journal"}}
{"content": "the hook hit an error \u2014 journal: the hook hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. the hook got no answer from the server 1 times (codes 000)", "meta": {"from": "journal"}}
{"content": "1 new message 18981 - answer by opening your turn with [!reply:18981]", "meta": {"from": "journal"}}
{"content": "message 18981 updated", "meta": {"from": "journal"}}
{"content": "the hook hit an error \u2014 journal: the hook hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. the hook got no answer from the server 1 times (codes 000)", "meta": {"from": "journal"}}
{"content": "1 new message 18985 - answer by opening your turn with [!reply:18985]", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "the hook hit an error \u2014 journal: the hook hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. the hook got no answer from the server 1 times (codes 000)", "meta": {"from": "journal"}}
{"content": "1 new message 18986 - answer by opening your turn with [!reply:18986]", "meta": {"from": "journal"}}
{"content": "1 new message 18987 - answer by opening your turn with [!reply:18987]", "meta": {"from": "journal"}}
{"content": "message 18987 updated", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 18988 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 18947 \u2014 read it, then journal helper finish 196 once its work is taken or dropped; helper 203, Ingrid Mergewell, reported in message 18848 \u2014 read it, then journal helper finish 203 once its work is taken or dropped; helper 193, Grete Stopwatch, reported in message 18966 \u2014 read it, then journal helper finish 193 once its work is taken or dropped; the plan scenario's screenshots of the grouped helper rows, for my review\u2026", "meta": {"from": "journal"}}
{"content": "the hook hit an error \u2014 journal: the hook hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. the hook got no answer from the server 1 times (codes 000); you ran the same check 3 times in a row\u2026 \u2014 if you are waiting for something to change, say journal work await \"<what you wait for>\" and end your turn: you are asked to look again every five minutes, and a background command tells you itself when it ends. Keep checking only if each look moves the work on.", "meta": {"from": "journal"}}
{"content": "message 18989 file Screenshot 2026-10-08 at 20.11.30.png needs tags \u2014 inspect the attachment, then journal message tag 18989 \"Screenshot 2026-10-08 at 20.11.30.png\" \"<a few words describing what it shows>\"; 1 new message 18989 - answer by opening your turn with [!reply:18989]; message 18989 updated", "meta": {"from": "journal"}}
{"content": "you ran the same check 3 times in a row - journal message reply 18986 \"Yes\u2026 \u2014 if you are waiting for something to change, say journal work await \"<what you wait for>\" and end your turn: you are asked to look again every five minutes, and a background command tells you itself when it ends. Keep checking only if each look moves the work on.", "meta": {"from": "journal"}}
{"content": "command message reply is slower than its budget \u2014 3983ms last (126ms of it working, 11ms waiting on locks), against a budget of 50ms. Seen 42 times.; request POST /api/run (message reply) is slower than its budget \u2014 4016ms last (128ms of it working, 51ms waiting on locks, then 553ms more after it answered), against a budget of 50ms. Seen 20 times.", "meta": {"from": "journal"}}
{"content": "1 new message 18990 - answer by opening your turn with [!reply:18990]", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 18991 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 18947 \u2014 read it, then journal helper finish 196 once its work is taken or dropped; helper 203, Ingrid Mergewell, reported in message 18848 \u2014 read it, then journal helper finish 203 once its work is taken or dropped; helper 193, Grete Stopwatch, reported in message 18966 \u2014 read it, then journal helper finish 193 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 18995 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "the hook hit an error \u2014 journal: the hook hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. the hook got no answer from the server 1 times (codes 000); 1 new message 18996 - answer by opening your turn with [!reply:18996]", "meta": {"from": "journal"}}
{"content": "the todo tag does this in one step \u2014 [!todo=\"the title\"] files it with the turn as its brief; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "the reply tag on 18987 did not run \u2014 ! you already answered this in comment 3205: add to that answer with journal comment update 3205 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "rule 39 \u2014 Use only registered exclamation response tags \u2014 A tag like [!reply:12] runs a command, and only the tags in the tags.runs setting are registered. An invented tag does nothing and shows as raw text in the chat. Use the registered ones (reply, log, end, todo, fact, rule) and nothing else.; rule 46 \u2014 Only commit and push once the whole journal is proven to boot \u2014 Messages 2178 and 2179. A release that has not been started for real can crash every project that installs it, as 2.78.3 did for Codex and 2.84.0 did to project records. Before every commit and push: the full suite passes, including tests/test_it_boots.py, which installs a packed copy into a fresh project, launches Claude and Codex from it, writes a project record, upgrades again and checks the record survives. When a change touches launching, installing or upgrading, also start a real journal in a scratch project and close it properly afterwards, leaving no process behind.; rule 51 \u2014 Every finished feature is committed, pushed and released with a new\u2026 \u2014 Message 9207 (2026-09-24): when a new feature is ready, commit, push and publish a new tag. This is the user's standing word for releasing, so rule 44's only-when-the-user-says is met by it for finished features; fixes in between wait for the next feature or a patch the user asks for.", "meta": {"from": "journal"}}
{"content": "command todo create is slower than its budget \u2014 1871ms last (98ms of it working, 6ms waiting on locks), against a budget of 50ms. Seen 5 times.", "meta": {"from": "journal"}}
{"content": "helper 193, Grete Stopwatch, reported in message 18998 \u2014 read it, then journal helper finish 193 once its work is taken or dropped; request POST /api/run (todo create) is slower than its budget \u2014 1918ms last (100ms of it working, 9ms waiting on locks, then 1059ms more after it answered), against a budget of 50ms. Seen 10 times.", "meta": {"from": "journal"}}
{"content": "after POST /api/hook/claude hit an error \u2014 journal: after POST /api/hook/claude hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. resources.base.Refused: message 18996 is already closed; command message reply is slower than its budget \u2014 1582ms last (158ms of it working, 187ms waiting on locks), against a budget of 50ms. Seen 43 times.", "meta": {"from": "journal"}}
{"content": "the reply tag on 18996 did not run \u2014 ! you already answered this in comment 3206: add to that answer with journal comment update 3206 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 18991 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 18848 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 560ms last (93ms of it working), against a budget of 50ms. Seen 28 times.", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 18995 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "you ran the same check 3 times in a row - journal helper say 193 \"Thank you\u2026 \u2014 if you are waiting for something to change, say journal work await \"<what you wait for>\" and end your turn: you are asked to look again every five minutes, and a background command tells you itself when it ends. Keep checking only if each look moves the work on.", "meta": {"from": "journal"}}
{"content": "helper 193, Grete Stopwatch, reported in message 18998 \u2014 read it, then journal helper finish 193 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 18991 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 19003 - answer by opening your turn with [!reply:19003]", "meta": {"from": "journal"}}
{"content": "fact 24 \u2014 An answer followed by tool calls can be missing from Claude's\u2026 \u2014 Seen 2026-09-24 for messages 9391-9404: text blocks opening with [!reply:n] that were followed by tool calls never appeared in the session's jsonl (only thinking and tool_use rows did), so the journal never saw them and the replies were lost. When a turn goes on after answering, send the answer with journal message reply <n> \"<text>\" instead of the tag.; fact 25 \u2014 A designer's install packs the whole tree, half-done server edits\u2026 \u2014 2026-09-25: Eames and Saul run python3 src/journal.py --root .journal upgrade after their viewer builds; it packs every file in src, so a server handler I was halfway through writing went live and raised on every PostToolUse hook. While designers work in parallel, keep server edits whole between tool calls (write and test in the scratchpad first), and reinstall after reverting anything.; rule 61 \u2014 Features wait as pull requests until approved; only hotfixes merge\u2026 \u2014 Message 17118 (2026-10-06), after the overnight refactor merged as 2.252.0: start new work in a new branch, do not merge, write the pull request. Every pull request or new feature is parked until the user approves it. Hotfixes can be merged into main immediately (by a dispatched agent in a worktree of main, rule 60).; fact 18 \u2014 cProfile inflates the slow-request profiles about tenfold \u2014 The faults feature writes a profile when a request passes its budget, and the profile is taken with cProfile, which adds per-call overhead. On 2026-09-22 /api/summary profiled at 58ms with 48ms inside Resource.fork's deep copy; with the profiler off the same call ran in 2 to 7ms. Read the profile for where the time goes in relative terms, then time the call with curl before changing anything.", "meta": {"from": "journal"}}
{"content": "rule 36 \u2014 Clean, DRY, idiomatic before it is committed, never after it is\u2026 \u2014 The user should never be the one who finds duplication, dead code, a clumsy name or a pattern the codebase does not use. Read the diff before every commit as a reviewer would, and fix what is not clean then, not in a follow-up after a complaint.; rule 48 \u2014 The viewer is built from its component library, and pages only\u2026 \u2014 Message 4258. Every visual piece the viewer shows more than once, or that a user would recognise as the same kind of thing (a dialog, a side panel or inspector, a dropdown, a list row, a switch, a button), is one component in web/src/kit, extracted aggressively, and every page composes those components instead of building its own copy. Before writing markup or styles in a page, look for the kit component that already does it and extend it with a prop; a second hand-built version is a bug. The side panel that animated in but not out, while a separate skill panel did both, is the example.", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 18848 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 193, Grete Stopwatch, reported in message 19010 \u2014 read it, then journal helper finish 193 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19011 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "the hook hit an error \u2014 journal: the hook hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. the hook got no answer from the server 1 times (codes 000)", "meta": {"from": "journal"}}
{"content": "request GET /api/main/todo is slower than its budget \u2014 606ms last (64ms of it working, 4ms collecting garbage), against a budget of 50ms. Seen 3 times.", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 18995 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 19014 - answer by opening your turn with [!reply:19014]", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "request POST /api/run (message reply) is slower than its budget \u2014 151ms last (51ms of it working, then 281ms more after it answered), against a budget of 50ms. Seen 21 times.", "meta": {"from": "journal"}}
{"content": "the hook hit an error \u2014 journal: the hook hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. the hook got no answer from the server 1 times (codes 000)", "meta": {"from": "journal"}}
{"content": "command todo search is slower than its budget \u2014 980ms last (82ms of it working), against a budget of 50ms. Seen 5 times.; request POST /api/run (todo search) is slower than its budget \u2014 982ms last (83ms of it working, then 63ms more after it answered), against a budget of 50ms. Seen 2 times.", "meta": {"from": "journal"}}
{"content": "to-do 3437 came from message 19014? \u2014 link it: journal message process 19014 \"<their words>\" todo:3437", "meta": {"from": "journal"}}
{"content": "the reply tag on 19014 did not run \u2014 ! message 19014 is already closed - add what is missing to the tag itself; command message reply is slower than its budget \u2014 2303ms last (82ms of it working, 256ms waiting on locks), against a budget of 50ms. Seen 44 times.", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 18848 \u2014 read it, then journal helper finish 203 once its work is taken or dropped; 1 new message 19016 - answer by opening your turn with [!reply:19016]", "meta": {"from": "journal"}}
{"content": "helper 193, Grete Stopwatch, reported in message 19010 \u2014 read it, then journal helper finish 193 once its work is taken or dropped; hook POST /api/hook/claude is slower than its budget \u2014 1642ms last (70ms of it working, 37ms collecting garbage, then 1237ms more after it answered), against a budget of 50ms. Seen 3096 times.; request GET /api/identity is slower than its budget \u2014 19302ms last (53ms of it working, then 5ms more after it answered), against a budget of 50ms. Seen 1 time.", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19011 \u2014 read it, then journal helper finish 200 once its work is taken or dropped; helper 200, Linus Mendwell, reported in message 19017 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 18995 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 19018 - answer by opening your turn with [!reply:19018]", "meta": {"from": "journal"}}
{"content": "the hook hit an error \u2014 journal: the hook hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. the hook got no answer from the server 1 times (codes 000)", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 448ms last (92ms of it working, 2ms collecting garbage, then 28ms more after it answered), against a budget of 50ms. Seen 31 times.; request GET /api/upstream is slower than its budget \u2014 1512ms last (58ms of it working, then 7ms more after it answered), against a budget of 50ms. Seen 2 times.", "meta": {"from": "journal"}}
{"content": "rule 41 \u2014 Keep moving, run the whole suite before every commit, never wait \u2014 The full suite runs in about seven seconds: .venv/bin/python -m pytest -q --timeout=300 -n auto. Run it before every commit instead of picking tests by name. Group rows that sit in the same code into one sitting: write them all, test once, commit once. And never wait, not for a subagent, a build, or an answer you can carry on without. Dispatch it and keep working. If you truly are waiting on something, say so in the work log.", "meta": {"from": "journal"}}
{"content": "the reply tag on 19014 did not run \u2014 ! you already answered this in comment 3208: add to that answer with journal comment update 3208 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19019 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "the hook hit an error \u2014 journal: the hook hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. the hook got no answer from the server 1 times (codes 000)", "meta": {"from": "journal"}}
{"content": "1 new message 19021 - answer by opening your turn with [!reply:19021]", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 18848 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19023 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "the hook hit an error \u2014 journal: the hook hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. the hook got no answer from the server 1 times (codes 000)", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19017 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 18995 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "you ran the same check 3 times in a row - grep -oE\u2026 \u2014 if you are waiting for something to change, say journal work await \"<what you wait for>\" and end your turn: you are asked to look again every five minutes, and a background command tells you itself when it ends. Keep checking only if each look moves the work on.", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 706ms last (56ms of it working, then 34ms more after it answered), against a budget of 50ms. Seen 35 times.", "meta": {"from": "journal"}}
{"content": "1 new message 19024 - answer by opening your turn with [!reply:19024]", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat; the viewer threw no message 0 \u2014 no message 0 / Error: no message 0 at Ah (http://127.0.0.1:8421/assets/tokens-C2ulnQlW.js:18:6888) at Rh (http://127.0.0.1:8421/assets/tokens-C2ulnQlW.js:18:7082) at async ne (http://127.0.0.1:8421/assets/Lightbox-BEY1TM69.js:14:41751) Seen 1 time.; message 19024 deleted", "meta": {"from": "journal"}}
{"content": "1 new message 19025 - answer by opening your turn with [!reply:19025]", "meta": {"from": "journal"}}
{"content": "the hook hit an error \u2014 journal: the hook hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. the hook got no answer from the server 1 times (codes 000)", "meta": {"from": "journal"}}
{"content": "1 new message 19026 - answer by opening your turn with [!reply:19026]", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19027 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 18848 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "the hook hit an error \u2014 journal: the hook hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. the hook got no answer from the server 1 times (codes 000)", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19023 \u2014 read it, then journal helper finish 205 once its work is taken or dropped; command message reply is slower than its budget \u2014 1055ms last (97ms of it working), against a budget of 50ms. Seen 45 times.; request POST /api/run (message reply) is slower than its budget \u2014 1057ms last (99ms of it working, 2ms waiting on locks, then 662ms more after it answered), against a budget of 50ms. Seen 22 times.", "meta": {"from": "journal"}}
{"content": "1 new message 19028 - answer by opening your turn with [!reply:19028]", "meta": {"from": "journal"}}
{"content": "the hook hit an error \u2014 journal: the hook hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. the hook got no answer from the server 1 times (codes 000)", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 18995 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 19029 - answer by opening your turn with [!reply:19029]", "meta": {"from": "journal"}}
{"content": "the hook hit an error \u2014 journal: the hook hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. the hook got no answer from the server 1 times (codes 000); request GET /api/manifest is slower than its budget \u2014 9723ms last (55ms of it working, then 9ms more after it answered), against a budget of 50ms. Seen 32 times.", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, has done nothing for 20 minutes \u2014 check on it: journal helper say 196 \"<what you want to know>\", or journal helper stop 196 if it is stuck; to-do 3443 came from message 19028? \u2014 link it: journal message process 19028 \"<their words>\" todo:3443", "meta": {"from": "journal"}}
{"content": "1 new message 19031 - answer by opening your turn with [!reply:19031]", "meta": {"from": "journal"}}
{"content": "request POST /api/main/message is slower than its budget \u2014 4874ms last (163ms of it working, 9ms collecting garbage, 43ms waiting on locks, then 4227491ms more after it answered), against a budget of 50ms. Seen 22 times.", "meta": {"from": "journal"}}
{"content": "the user put \u2764\ufe0f on message 19030. Act on it if it asks for something, such as a go-ahead. It needs no written reply; when it answers a message of the user's own, react to that message in turn. The chat never mentions it", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19027 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 18848 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19023 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 661ms last (78ms of it working), against a budget of 50ms. Seen 38 times.", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 18995 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "the hook hit an error \u2014 journal: the hook hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. the hook got no answer from the server 1 times (codes 000)", "meta": {"from": "journal"}}
{"content": "1 new message 19032 - answer by opening your turn with [!reply:19032]", "meta": {"from": "journal"}}
{"content": "command message reply is slower than its budget \u2014 1793ms last (105ms of it working, 3ms waiting on locks), against a budget of 50ms. Seen 47 times.; request POST /api/run (message reply) is slower than its budget \u2014 1816ms last (108ms of it working, 3ms waiting on locks, then 244ms more after it answered), against a budget of 50ms. Seen 24 times.", "meta": {"from": "journal"}}
{"content": "1 new message 19034 - answer by opening your turn with [!reply:19034]", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19027 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 18848 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "you ran the same check 3 times in a row - cat\u2026 \u2014 if you are waiting for something to change, say journal work await \"<what you wait for>\" and end your turn: you are asked to look again every five minutes, and a background command tells you itself when it ends. Keep checking only if each look moves the work on.", "meta": {"from": "journal"}}
{"content": "the await tag does this in one step \u2014 [!await] makes the rest of the turn what you wait for; [!await on=(\"<id>\", \"helper:<n>\")] waits on those; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19023 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "the hook hit an error \u2014 journal: the hook hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. the hook got no answer from the server 1 times (codes 000)", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 18995 \u2014 read it, then journal helper finish 196 once its work is taken or dropped; helper 205, Barbara Asyncwell, reported in message 19036 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "you ran the same check 3 times in a row - kill -TERM 17262; for i in $(seq 1\u2026 \u2014 if you are waiting for something to change, say journal work await \"<what you wait for>\" and end your turn: you are asked to look again every five minutes, and a background command tells you itself when it ends. Keep checking only if each look moves the work on.", "meta": {"from": "journal"}}
{"content": "rule 42 \u2014 Every user-facing text passes the formatters before it leaves the\u2026 \u2014 Not only a brief. A title, an abstract, an outcome and every section body are read by a person, so each goes through the same formatters on its way to the viewer \u2014 chat turns, activity items, to-do rows, inspector pages, docs alike. One field formatted out of five is not a rule, it is an accident, and it is how a raw tag ended up in the activity list after the tags feature had been stripping them for weeks. When a new field carries words a person reads, it joins the list in the same place.", "meta": {"from": "journal"}}
{"content": "rule 57 \u2014 Never merge the overnight refactor into main before its pull request\u2026 \u2014 Messages 15005, 15006, 15109, 15110 (2026-10-04): all refactor work goes on branch overnight-refactor and reaches the user as one pull request, which they read in the morning; nothing of it is merged into main until they say so. Hotfixes the user explicitly asks for go to main at once and are merged into the branch.; rule 61 \u2014 Features wait as pull requests until approved; only hotfixes merge\u2026 \u2014 Message 17118 (2026-10-06), after the overnight refactor merged as 2.252.0: start new work in a new branch, do not merge, write the pull request. Every pull request or new feature is parked until the user approves it. Hotfixes can be merged into main immediately (by a dispatched agent in a worktree of main, rule 60).; rule 64 \u2014 A finished feature is merged into main without waiting for approval \u2014 The user, message 17815 (2026-10-07): 'make sure that no pull requests are lingering on the repository. You may merge them into main... You are allowed to merge everything into main once the feature is completed.' This replaces rule 61's wait for approval: a feature still goes on its own branch, and once it is complete, tested and its whole suite passes, it is merged into main and released, and no pull request is left open.", "meta": {"from": "journal"}}
{"content": "rule 27 \u2014 Name a declaration with the word a reader already knows \u2014 An attribute, a variable or a field gets the ordinary programming word for what it holds, not an evocative one. was, heard and alone were poetry; aliases, notify_actions and urgent_actions are what they are. The test: could a reader who has never seen this codebase guess what it holds from the name alone? Prose belongs in the help text and the abstract, where it is read as prose. This does not license abbreviations \u2014 a plain word in full, not a short one.; rule 36 \u2014 Clean, DRY, idiomatic before it is committed, never after it is\u2026 \u2014 The user should never be the one who finds duplication, dead code, a clumsy name or a pattern the codebase does not use. Read the diff before every commit as a reviewer would, and fix what is not clean then, not in a follow-up after a complaint.; rule 38 \u2014 Never change the git branch until the user says so, by name \u2014 The work happens on the branch the user named. That was main until message 5929 and question 80 (2026-09-23), which moved the sins work to the branch sins. Do not create, switch to or merge any other branch unless the user names it in their own words.; rule 46 \u2014 Only commit and push once the whole journal is proven to boot \u2014 Messages 2178 and 2179. A release that has not been started for real can crash every project that installs it, as 2.78.3 did for Codex and 2.84.0 did to project records. Before every commit and push: the full suite passes, including tests/test_it_boots.py, which installs a packed copy into a fresh project, launches Claude and Codex from it, writes a project record, upgrades again and checks the record survives. When a change touches launching, installing or upgrading, also start a real journal in a scratch project and close it properly afterwards, leaving no process behind.; rule 51 \u2014 Every finished feature is committed, pushed and released with a new\u2026 \u2014 Message 9207 (2026-09-24): when a new feature is ready, commit, push and publish a new tag. This is the user's standing word for releasing, so rule 44's only-when-the-user-says is met by it for finished features; fixes in between wait for the next feature or a patch the user asks for.", "meta": {"from": "journal"}}
{"content": "fact 13 \u2014 This live session runs the installed copy in .journal/journal.pyz \u2014 The running journal (server, hooks, CLI) runs from .journal/journal.pyz with its viewer and skills in .journal/src, never from the repo. A change in the repo reaches it only through python3 src/journal.py --root .journal upgrade, which packs the zip again. A commit alone changes nothing that is running.; law L3 \u2014 Read narrowly - grep for the line, sed a range, head the file; never\u2026 \u2014 Everything a tool returns stays in the context for good and is paid for on every turn after it. Search before you read, read the range you need, and cap output with grep, head or tail. Read a whole file only when you need all of it.; rule 41 \u2014 Keep moving, run the whole suite before every commit, never wait \u2014 The full suite runs in about seven seconds: .venv/bin/python -m pytest -q --timeout=300 -n auto. Run it before every commit instead of picking tests by name. Group rows that sit in the same code into one sitting: write them all, test once, commit once. And never wait, not for a subagent, a build, or an answer you can carry on without. Dispatch it and keep working. If you truly are waiting on something, say so in the work log.; rule 65 \u2014 Run only new and affected tests while working; the whole suite only\u2026 \u2014 The user, messages 17914 to 17917 (2026-10-07): 'stop running the whole test suite and wasting my time... please only run the new or affected tests, and then, whenever you are merging to main or publishing to main, you can run the full test suite.' Replaces rule 41's whole suite before every commit: on a feature branch, run the tests beside what changed (journal check touched, or the feature's test.py and the browser scenarios it touches); the whole suite runs once, before a merge into main and its release.", "meta": {"from": "journal"}}
{"content": "rule 60 \u2014 A hotfix is done by a dispatched agent in a worktree of main \u2014 Message 16836 (2026-10-06): the orchestrator cut a worktree under .claude/worktrees for a Codex hotfix, its session moved to a new environment and the user's messages stopped reaching it. The user: when working on a branch and a hotfix comes in, create a worktree of main and dispatch an agent to do that work. The orchestrator stays on its branch and in its environment, and never cds into another checkout.", "meta": {"from": "journal"}}
{"content": "fact 24 \u2014 An answer followed by tool calls can be missing from Claude's\u2026 \u2014 Seen 2026-09-24 for messages 9391-9404: text blocks opening with [!reply:n] that were followed by tool calls never appeared in the session's jsonl (only thinking and tool_use rows did), so the journal never saw them and the replies were lost. When a turn goes on after answering, send the answer with journal message reply <n> \"<text>\" instead of the tag.", "meta": {"from": "journal"}}
{"content": "fact 9 \u2014 Every public method on a controller becomes a journal command \u2014 The CLI is generated from the controllers: each public method of Controller, or of a typed controller, turns into journal <noun> <method>. A helper added to the base class therefore becomes a command on every type \u2014 which is how journal <type> handled and journal <type> refuse came to exist, from the CRUD funnel and the refusal funnel. An internal helper on a controller is named with a leading underscore, as _shaped and _status already are, or it ships as a command nobody meant.; fact 34 \u2014 A hooks list in a checkout's .claude/settings.json stops every\u2026 \u2014 Seen 2026-10-08: since commit 707a82915 the committed .claude/settings.json held {\"hooks\": []}; current Claude Code answers a hooks value that is not an object with a SettingsWarning dialog, which a headless helper cannot answer, so helpers 183 and 184 exited before doing anything (their launch logs in .journal/runtime/launches/ show it). This repository's journal hooks live in settings.local.json; the committed settings.json stays {}.; law L5 \u2014 Every subagent dispatch names the agent - a human name, a little\u2026 \u2014 A name is how the user and the chat tell subagents apart and how they are messaged later; an id or a task line is not a name. Start the dispatch's description with the name, a colon, then the task, such as \"Dr. Einstein: profile the slow hooks\" or \"Coco Rams: draw the plan card\". A designer can borrow from famous designers, a researcher from famous scientists, mixed up for fun.; rule 35 \u2014 Write clean code - one funnel per kind of operation, never the same\u2026 \u2014 Every kind of operation has one funnel: one method that creates, one that saves, one that refuses, one that formats. A second method that does the same thing under another name splits the behaviour, and the two drift apart. Before writing a method, search for the one that already does it and extend that. scripts/checks/funnels.py finds bodies written twice.; rule 55 \u2014 Always dispatch Codex helpers on gpt-6-sol \u2014 The user's word, message 13431: switch the codex agents to GPT-6-Sol and make it their default. ~/.codex/config.toml names it as the default model too.; rule 56 \u2014 Helpers are for work that writes; subagents read, research and design \u2014 The user, message 13464: there must be a clear distinction. A subagent can be dispatched for anything read-only: research, review, design. A helper is for actual work that writes, best in its own worktree when the work is separate. Dieter designing in Claude Design should have been a subagent, not a helper.; to-do 3445 came from message 19031? \u2014 link it: journal message process 19031 \"<their words>\" todo:3445", "meta": {"from": "journal"}}
{"content": "fact 20 \u2014 A slim supervisor holds the agent and a worker reloads on every build \u2014 Since 2.118.0 (2026-09-23). src/supervisor.py is standard library only and never reloads: journal claude hands its process over to it (os.execv), and it owns the pty and the agent process, relays the terminal, writes the printed and screen captures, listens on the typist socket, restarts the agent in the same session from a relaunch command written to its runtime folder while a restart is pending, and stops it with escalation while draining the pty (an agent cannot finish exiting on macOS while its output is unread). It starts the worker (src/worker.py, which runs runner/worker.py; engine/worker.py stays as an alias for supervisors started before 2.201) and starts it again whenever it exits: RELOAD on a new build, RELAUNCH to restart the agent, STOP to end, HEAL or a quick crash to roll back a build through journal heal. The worker holds everything else: seating the session, the start-up confirm typed through the typist, services, viewer, update check, check-in, and the one-time relaunch of sessions launched before agents/terminal.py LAUNCH. agents/terminal.py holds only journal-side helpers. The server (serve.py) still runs the engines and re-execs itself on a .py change. When the agent exits, the supervisor runs journal ended, which puts set-aside hooks back and stops the server when no session is left.", "meta": {"from": "journal"}}
{"content": "rule 66 \u2014 The journal never slows the agent down \u2014 The user, message 18990, after hooks timed out and waited on locks under load: the journal must never, ever decrease the performance of an agent. A hook answers at once with what decides the tool call; everything else runs after, in the background, and reaches the agent as a message. No hook waits on a lock it does not need.", "meta": {"from": "journal"}}
{"content": "fact 23 \u2014 Every upgrade brings system sequences and their triggers in line\u2026 \u2014 install.py runs ship_sequences after the migrations on each upgrade, so features/sequences/shipped.py is the whole source: change its wording and the next upgrade updates every journal, no migration needed. Shipped rows carry system=True and are read-only for everyone but SYSTEM (controllers/base.py _shipped).; fact 25 \u2014 A designer's install packs the whole tree, half-done server edits\u2026 \u2014 2026-09-25: Eames and Saul run python3 src/journal.py --root .journal upgrade after their viewer builds; it packs every file in src, so a server handler I was halfway through writing went live and raised on every PostToolUse hook. While designers work in parallel, keep server edits whole between tool calls (write and test in the scratchpad first), and reinstall after reverting anything.", "meta": {"from": "journal"}}
{"content": "answer message 19018, message 19026 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>; rule 45 \u2014 No prose words as names in code - said, says, heard, spoke, told\u2026 \u2014 Messages 1360 and 1698. The user has said more than once that code must not read like prose: a variable, attribute, property or function is named for what it holds or does (text, command, labels, lines), never with a verb from a story. 'says' on the Design type (1360) and 'said = call.said.lower()' in features/recital.py (1698) are the examples. Rule 27 states the naming rule; this one carries the words, so writing one of them whispers it. Before writing a name, ask whether a reader who has never seen the code would know what it holds.", "meta": {"from": "journal"}}
{"content": "1 new message 19042 - answer by opening your turn with [!reply:19042]", "meta": {"from": "journal"}}
{"content": "law L1 \u2014 Every subagent dispatch names its model and chooses the least\u2026 \u2014 Use a fast, economical model for mechanical work with a known answer, a capable general model for careful implementation, and the strongest model only when the task turns on difficult judgement. Inheriting the orchestrator's model is not a model choice. If the dispatch API cannot accept a model, that operation is exempt.; law L2 \u2014 Every subagent is bound to a concrete job; never dispatch a generic\u2026 \u2014 Use the most specific available agent type whose declared purpose matches the assignment. On providers without agent types, give the dispatch a concrete task name and bounded prompt. If no suitable specialization exists, keep the work in the main agent instead of manufacturing an unscoped helper.; law L4 \u2014 Related work goes back to the helper or subagent that already worked\u2026 \u2014 A helper or subagent that drew a design, wrote the code or ran the research keeps what it learned. When new work changes its work, is related to it or touches the same code, send it there with a message (SendMessage, journal helper say) rather than dispatching a new one that has to rediscover everything; start fresh only when the earlier one is gone or the new work is unrelated.; rule 39 \u2014 Use only registered exclamation response tags \u2014 A tag like [!reply:12] runs a command, and only the tags in the tags.runs setting are registered. An invented tag does nothing and shows as raw text in the chat. Use the registered ones (reply, log, end, todo, fact, rule) and nothing else.; rule 50 \u2014 Everything the user does is doable in the viewer \u2014 Message 6710 (2026-09-23): the user never uses the CLI, only the UI; everything should be doable from the viewer. The journal commands are for agents; any action meant for the user (making boards, confirming, accepting, hosting, watching an agent) needs its place in the viewer.; rule 52 \u2014 A chat mark for something the user did sits on the user's side \u2014 Message 10960 (2026-09-25): marks for the user's own actions, such as answering a question, are right-aligned like the user's messages. A mark is put there by giving its card side=user.; rule 54 \u2014 Settings and feature switches are read at boot and on change, never\u2026 \u2014 The user, message 13349: the application boots, determines every feature and setting once, and re-evaluates only when something changes, such as a setting or a plugin. Never lazy-load settings.", "meta": {"from": "journal"}}
{"content": "1 new message 19043 - answer by opening your turn with [!reply:19043]", "meta": {"from": "journal"}}
{"content": "fact 28 \u2014 The designer agent type exists, so design work goes to a subagent \u2014 Since 2026-10-01 .claude/agents/designer.md (Dieter, Opus, Claude Design tools, read-only on the repository) is an agent type; rule 56 says design is a subagent's job, never a helper's.; rule 48 \u2014 The viewer is built from its component library, and pages only\u2026 \u2014 Message 4258. Every visual piece the viewer shows more than once, or that a user would recognise as the same kind of thing (a dialog, a side panel or inspector, a dropdown, a list row, a switch, a button), is one component in web/src/kit, extracted aggressively, and every page composes those components instead of building its own copy. Before writing markup or styles in a page, look for the kit component that already does it and extend it with a prop; a second hand-built version is a bug. The side panel that animated in but not out, while a separate skill panel did both, is the example.; rule 58 \u2014 A design runs three critique rounds, then is built on a branch \u2014 Messages 17276 and 17281 (2026-10-06): the norm is a three-round cycle. Round by round, the designer designs (or revises), separate critic agents review the design through their lenses (the critic agent type, .claude/agents/critic.md: read-only, with a browser; one per lens, such as first-time, native, words and parity), and the designer adjusts it to their findings; three rounds in all. The three rounds stand in for the user's approval of the design: the user does not approve it. After the third round the design is built on a branch of its own, which ends in a pull request that waits for the user's approval (rule 61). Replaces message 15725's prototype approval.; rule 63 \u2014 A small design is drawn once and the user approves it, with no\u2026 \u2014 The user, messages 17628 and 17629 (2026-10-07), about the tooltip and waiting-status designs: 'This design round doesn't really need multiple rounds... I just want the designer agent to design it, and I will approve it.' Rule 58's three critique rounds are for large designs such as the phone app; a small one (a tooltip, a status word, one control) is drawn once by the designer, the link goes to the user, and it is built once the user approves it.", "meta": {"from": "journal"}}
{"content": "1 new message 19045 - answer by opening your turn with [!reply:19045]", "meta": {"from": "journal"}}
{"content": "fact 18 \u2014 cProfile inflates the slow-request profiles about tenfold \u2014 The faults feature writes a profile when a request passes its budget, and the profile is taken with cProfile, which adds per-call overhead. On 2026-09-22 /api/summary profiled at 58ms with 48ms inside Resource.fork's deep copy; with the profiler off the same call ran in 2 to 7ms. Read the profile for where the time goes in relative terms, then time the call with curl before changing anything.; rule 43 \u2014 A request or hook over its budget is fixed before the next release \u2014 Comment 1151 on this rule. When the faults feature reports a request, a hook or a command slower than its budget, file it as a to-do at once. It does not jump ahead of the work in hand, but no version is published while one is still open: profile it, fix it, and verify the new time before the release goes out. The budget is 50ms, because everything runs locally against files.", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19027 \u2014 read it, then journal helper finish 200 once its work is taken or dropped; to-do 3447 came from message 19045? \u2014 link it: journal message process 19045 \"<their words>\" todo:3447; to-do 3446 came from message 19045? \u2014 link it: journal message process 19045 \"<their words>\" todo:3446", "meta": {"from": "journal"}}
{"content": "rule 37 \u2014 Close every to-do explicitly with todo done or a Journal commit\u2026 \u2014 Ending work does not close its row. A to-do is closed by journal todo done <n> --how, or by a commit whose message carries Journal: todos done <n> at column 0, several numbers separated by commas. A row left open after its work landed misleads the next session and auto mode.", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 18848 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "sequence 10, Writing a report, step 1 of 6 - Add the report\u2019s section headings \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 10 --about report:93. Lead with the answer in the report's brief, then put every part you plan on the report before writing any of them: journal report section 93 \"<part>\" \"Being written.\" for each, in order: the evidence, what was already sound, what remains uncertain. Then journal sequence next 10 --about report:93.", "meta": {"from": "journal"}}
{"content": "sequence 10, Writing a report, step 2 of 6 - Write the report\u2019s sections \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 10 --about report:93. Write the parts one at a time and in order with journal report section 93 \"<part>\" \"<body>\"; the user sees each one appear where you are. Then journal sequence next 10 --about report:93.", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "sequence 10, Writing a report, step 4 of 6 - Link the items behind the\u2026 \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 10 --about report:93. Link the rows it answers or was built on, such as the to-dos, plans, documents, reports or messages it is about, with journal report link 93 \"<row>\" for each. Leave out rows it only mentions in passing. Then journal sequence next 10 --about report:93.; fact 30 \u2014 The tunler server refuses TLS for any subdomain without a tunnel \u2014 Seen 2026-10-04 in the server's docker logs (ssh root@tunler.jessegall.nl, container tunler): 'TLS handshake error ... host \"journal-probe.tunler.jessegall.nl\" not allowed'. A made-up subdomain never answers even when the server is healthy; probe https://tunler.jessegall.nl/ for the server itself. Root SSH to the server works.", "meta": {"from": "journal"}}
{"content": "sequence 10, Writing a report, step 5 of 6 - Offer the user a next step \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 10 --about report:93. If it asks the user to decide or approve something, give it buttons: journal report update 93 --set buttons='[{\"label\": \"Accept this proposal\", \"say\": \"I accept this proposal\", \"choice\": \"answer\"}, {\"label\": \"Change it first\", \"say\": \"I want changes first\", \"choice\": \"answer\"}]'. A button with say sends those words to you as the user's message; one naming a type, n and action runs that command. Buttons of one decision share a choice, so the others go once one is pressed. Skip this when nothing waits on the user. Then journal sequence next 10 --about report:93.", "meta": {"from": "journal"}}
{"content": "sequence 10, Writing a report, step 6 of 6 - Tell the user in the chat \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 10 --about report:93. Say in one or two plain lines what it concludes, then its reference on a line of its own, like doc 41 or report 98, never in backticks. Finish with journal sequence next 10 --about report:93.", "meta": {"from": "journal"}}
{"content": "answer message 19042 before you write anything \u2014 answer by opening your turn with [!reply:19042]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "the user put \ud83d\ude20 on comment 3217. Act on it if it asks for something, such as a go-ahead. It needs no written reply; when it answers a message of the user's own, react to that message in turn. The chat never mentions it; the reply tag on 19042 did not run \u2014 ! you already answered this in comment 3218: add to that answer with journal comment update 3218 rather than a second reply - add what is missing to the tag itself; command message reply is slower than its budget \u2014 353ms last (60ms of it working), against a budget of 50ms. Seen 48 times.", "meta": {"from": "journal"}}
{"content": "1 new message 19048 - answer by opening your turn with [!reply:19048]", "meta": {"from": "journal"}}
{"content": "there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each; helper 196, Leslie Lamportson, reported in message 18995 \u2014 read it, then journal helper finish 196 once its work is taken or dropped; helper 205, Barbara Asyncwell, reported in message 19036 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 102ms last (53ms of it working), against a budget of 50ms. Seen 41 times.", "meta": {"from": "journal"}}
{"content": "1 new comment 3220; report 93 commented", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19027 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 19058 - answer by opening your turn with [!reply:19058]", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 18848 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "the reply tag on 19058 did not run \u2014 ! you already answered this in comment 3221: add to that answer with journal comment update 3221 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "message 19061 file Screenshot 2026-10-08 at 21.07.09.png needs tags \u2014 inspect the attachment, then journal message tag 19061 \"Screenshot 2026-10-08 at 21.07.09.png\" \"<a few words describing what it shows>\"; 1 new message 19061 - answer by opening your turn with [!reply:19061]; message 19061 updated", "meta": {"from": "journal"}}
{"content": "request GET /api/main/helper is slower than its budget \u2014 1087ms last (63ms of it working), against a budget of 50ms. Seen 59 times.", "meta": {"from": "journal"}}
{"content": "the reply tag on 19061 did not run \u2014 ! you already answered this in comment 3222: add to that answer with journal comment update 3222 rather than a second reply - add what is missing to the tag itself; helper 205, Barbara Asyncwell, reported in message 19064 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 18995 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 19067 - answer by opening your turn with [!reply:19067]", "meta": {"from": "journal"}}
{"content": "rule 59 \u2014 Every viewer heading and label says plainly what it is about \u2014 The user, messages 16499, 16839, 16844, 16989, 16992 and 16993 (2026-10-06), after 'Where the words count', 'Watch for the words in', 'This project', 'This browser' and 'Stop the journal' as tab names: viewer text reads like Linear, GitHub or Vercel. A place (page, tab, group, sidebar item) is a short noun: Settings, Project, Browser, Services, Updates, Plugins; never 'This project' or a phrase. A button is a verb for what happens: Stop, Install, Copy link, Pause the plan. A heading names what the reader looks at, and its options finish its sentence: 'Trigger when' / 'A word is written'. Plain literal words: no metaphor or whimsy ('kettle on, waiting'), no app speaking as I, none of the journal's internal words (row, hook, nudge, engine, slate). One word for one thing everywhere, sentence case, as short as it can be while clear. Applies to designers' prototypes, helpers' builds, the viewer's JavaScript lists, feature details, and shipped sequence and trigger titles alike.; 1 new message 19068 - answer by opening your turn with [!reply:19068]", "meta": {"from": "journal"}}
{"content": "1 new message 19070 - answer by opening your turn with [!reply:19070]", "meta": {"from": "journal"}}
{"content": "sequence 2, Building a plan, step 1 of 4 - Agree on the plan\u2019s goal \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 2 --about plan:30. Settle with the user what is true when the plan is done, and set it as the plan's goal. When it is done: journal sequence next 2 --about plan:30.; plan 30 is building - add its phases \u2014 journal plan phase 30 \"<title>\" --when \"<complete when>\" for each phase, --checkpoint where the user should look; then journal plan stage 30 todos; plan 30 is at its to-dos \u2014 file each phase's rows and put them under it with journal plan todos 30 <phase> <rows...>; when every phase has rows, journal plan ready 30; plan 30 cites nothing it was built on \u2014 you read report:93 just now: journal plan link 30 \"<ref>\" for whichever it came from", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "1 new message 19072 - answer by opening your turn with [!reply:19072]", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19073 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "sequence 2, Building a plan, step 2 of 4 - Add the plan\u2019s phases \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 2 --about plan:30. Add every phase in order with journal plan phase 30 \"<title>\" --when \"<complete when>\", and --checkpoint where the user should look before it goes on. When it is done: journal sequence next 2 --about plan:30.", "meta": {"from": "journal"}}
{"content": "request GET /api/main/todo is slower than its budget \u2014 565ms last (53ms of it working, then 16ms more after it answered), against a budget of 50ms. Seen 4 times.", "meta": {"from": "journal"}}
{"content": "sequence 2, Building a plan, step 4 of 4 - Ask the user to approve the plan \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 2 --about plan:30. When every phase has rows, journal plan ready 30. Only the user approves it; you start it when they have. When it is done: journal sequence next 2 --about plan:30.", "meta": {"from": "journal"}}
{"content": "fact 9 \u2014 Every public method on a controller becomes a journal command \u2014 The CLI is generated from the controllers: each public method of Controller, or of a typed controller, turns into journal <noun> <method>. A helper added to the base class therefore becomes a command on every type \u2014 which is how journal <type> handled and journal <type> refuse came to exist, from the CRUD funnel and the refusal funnel. An internal helper on a controller is named with a leading underscore, as _shaped and _status already are, or it ships as a command nobody meant.; fact 13 \u2014 This live session runs the installed copy in .journal/journal.pyz \u2014 The running journal (server, hooks, CLI) runs from .journal/journal.pyz with its viewer and skills in .journal/src, never from the repo. A change in the repo reaches it only through python3 src/journal.py --root .journal upgrade, which packs the zip again. A commit alone changes nothing that is running.; fact 24 \u2014 An answer followed by tool calls can be missing from Claude's\u2026 \u2014 Seen 2026-09-24 for messages 9391-9404: text blocks opening with [!reply:n] that were followed by tool calls never appeared in the session's jsonl (only thinking and tool_use rows did), so the journal never saw them and the replies were lost. When a turn goes on after answering, send the answer with journal message reply <n> \"<text>\" instead of the tag.; fact 34 \u2014 A hooks list in a checkout's .claude/settings.json stops every\u2026 \u2014 Seen 2026-10-08: since commit 707a82915 the committed .claude/settings.json held {\"hooks\": []}; current Claude Code answers a hooks value that is not an object with a SettingsWarning dialog, which a headless helper cannot answer, so helpers 183 and 184 exited before doing anything (their launch logs in .journal/runtime/launches/ show it). This repository's journal hooks live in settings.local.json; the committed settings.json stays {}.", "meta": {"from": "journal"}}
{"content": "fact 25 \u2014 A designer's install packs the whole tree, half-done server edits\u2026 \u2014 2026-09-25: Eames and Saul run python3 src/journal.py --root .journal upgrade after their viewer builds; it packs every file in src, so a server handler I was halfway through writing went live and raised on every PostToolUse hook. While designers work in parallel, keep server edits whole between tool calls (write and test in the scratchpad first), and reinstall after reverting anything.", "meta": {"from": "journal"}}
{"content": "to-do 3451 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3451; to-do 3452 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3452; to-do 3453 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3453; to-do 3454 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3454; to-do 3455 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3455; to-do 3456 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3456; to-do 3457 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3457; to-do 3458 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3458; to-do 3459 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3459; to-do 3460 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3460; to-do 3461 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3461; to-do 3462 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3462; to-do 3463 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3463; to-do 3464 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3464; to-do 3465 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3465; to-do 3466 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3466; to-do 3467 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3467; to-do 3468 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3468; to-do 3469 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3469; to-do 3470 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3470; to-do 3471 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3471; to-do 3472 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3472; to-do 3473 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3473; to-do 3474 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3474; to-do 3475 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3475; to-do 3476 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3476; to-do 3477 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3477; to-do 3478 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3478; to-do 3479 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3479; to-do 3480 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3480; to-do 3481 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3481; to-do 3482 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3482; to-do 3483 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3483; to-do 3484 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3484; to-do 3485 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3485; to-do 3486 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3486; to-do 3487 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3487; to-do 3488 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3488; to-do 3489 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3489; to-do 3490 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3490; to-do 3491 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3491; to-do 3492 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3492; to-do 3493 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3493; to-do 3494 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3494; to-do 3495 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3495; to-do 3496 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3496; to-do 3497 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3497; to-do 3498 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3498; to-do 3499 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3499; to-do 3500 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3500; to-do 3501 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3501; to-do 3502 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3502; to-do 3503 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3503; to-do 3504 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3504; to-do 3505 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3505; to-do 3506 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3506; to-do 3507 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3507; to-do 3508 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3508; to-do 3509 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3509; to-do 3510 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3510; to-do 3511 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3511; to-do 3512 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3512; to-do 3513 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3513; to-do 3514 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3514; to-do 3515 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3515; to-do 3516 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3516; to-do 3517 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3517; to-do 3518 came from message 19067? \u2014 link it: journal message process 19067 \"<their words>\" todo:3518", "meta": {"from": "journal"}}
{"content": "answer message 19068 before you write anything \u2014 answer by opening your turn with [!reply:19068]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 18848 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19064 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 18995 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19084 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "work deferred in words, not parked \u2014 \"once the wait is\" is the title of a to-do: journal todo create \"<title>\" --brief, then say so", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 5531ms last (433ms of it working, 5ms collecting garbage), against a budget of 50ms. Seen 44 times.", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 18848 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19064 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 18995 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19108 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "fact 23 \u2014 Every upgrade brings system sequences and their triggers in line\u2026 \u2014 install.py runs ship_sequences after the migrations on each upgrade, so features/sequences/shipped.py is the whole source: change its wording and the next upgrade updates every journal, no migration needed. Shipped rows carry system=True and are read-only for everyone but SYSTEM (controllers/base.py _shipped).", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19118 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 18848 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19131 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 18995 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "the 2.264.1 hook hotfix being pushed to main through its boot check came back\u2026", "meta": {"from": "journal"}}
{"content": "fact 27 \u2014 Running src/journal.py against the live .journal root starts a\u2026 \u2014 Seen 2026-10-01: with VERSION bumped in the tree, src/journal.py --root .journal saw the live server as another build and started a new one on a new port (8431, 8432), and the user's tabs kept losing connection. Run source builds against a throwaway or demo root (~/projects/demo-crumb/.journal), never the live one, until the release is installed.", "meta": {"from": "journal"}}
{"content": "the hook hit an error \u2014 journal: the hook hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. the hook got no answer from the server 1 times (codes 000)", "meta": {"from": "journal"}}
{"content": "your command ran 33s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19157 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19158 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "the todo tag does this in one step \u2014 [!todo=\"the title\"] files it with the turn as its brief; it runs only when it opens the last text of your turn; your command ran 159s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19118 \u2014 read it, then journal helper finish 200 once its work is taken or dropped; helper 203, Ingrid Mergewell, reported in message 18848 \u2014 read it, then journal helper finish 203 once its work is taken or dropped; helper 196, Leslie Lamportson, reported in message 18995 \u2014 read it, then journal helper finish 196 once its work is taken or dropped; 2.264.1 being installed into this journal came back - Install 2.264.1 into the\u2026", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, has done nothing for 20 minutes \u2014 check on it: journal helper say 200 \"<what you want to know>\", or journal helper stop 200 if it is stuck; helper 205, Barbara Asyncwell, reported in message 19158 \u2014 read it, then journal helper finish 205 once its work is taken or dropped; helper 200, Linus Mendwell, reported in message 19118 \u2014 read it, then journal helper finish 200 once its work is taken or dropped; helper 203, Ingrid Mergewell, reported in message 18848 \u2014 read it, then journal helper finish 203 once its work is taken or dropped; helper 196, Leslie Lamportson, reported in message 18995 \u2014 read it, then journal helper finish 196 once its work is taken or dropped; the 2.264.2 hotfix's whole test suite came back - Run 2.264.2's whole suite\u2026", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19175 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "Barbara's fix for the one failing skill check test in 2.264.2 came back\u2026", "meta": {"from": "journal"}}
{"content": "rule 57 \u2014 Never merge the overnight refactor into main before its pull request\u2026 \u2014 Messages 15005, 15006, 15109, 15110 (2026-10-04): all refactor work goes on branch overnight-refactor and reaches the user as one pull request, which they read in the morning; nothing of it is merged into main until they say so. Hotfixes the user explicitly asks for go to main at once and are merged into the branch.; rule 61 \u2014 Features wait as pull requests until approved; only hotfixes merge\u2026 \u2014 Message 17118 (2026-10-06), after the overnight refactor merged as 2.252.0: start new work in a new branch, do not merge, write the pull request. Every pull request or new feature is parked until the user approves it. Hotfixes can be merged into main immediately (by a dispatched agent in a worktree of main, rule 60).; rule 64 \u2014 A finished feature is merged into main without waiting for approval \u2014 The user, message 17815 (2026-10-07): 'make sure that no pull requests are lingering on the repository. You may merge them into main... You are allowed to merge everything into main once the feature is completed.' This replaces rule 61's wait for approval: a feature still goes on its own branch, and once it is complete, tested and its whole suite passes, it is merged into main and released, and no pull request is left open.", "meta": {"from": "journal"}}
{"content": "rule 46 \u2014 Only commit and push once the whole journal is proven to boot \u2014 Messages 2178 and 2179. A release that has not been started for real can crash every project that installs it, as 2.78.3 did for Codex and 2.84.0 did to project records. Before every commit and push: the full suite passes, including tests/test_it_boots.py, which installs a packed copy into a fresh project, launches Claude and Codex from it, writes a project record, upgrades again and checks the record survives. When a change touches launching, installing or upgrading, also start a real journal in a scratch project and close it properly afterwards, leaving no process behind.; rule 51 \u2014 Every finished feature is committed, pushed and released with a new\u2026 \u2014 Message 9207 (2026-09-24): when a new feature is ready, commit, push and publish a new tag. This is the user's standing word for releasing, so rule 44's only-when-the-user-says is met by it for finished features; fixes in between wait for the next feature or a patch the user asks for.", "meta": {"from": "journal"}}
{"content": "the hook hit an error \u2014 journal: the hook hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. the hook got no answer from the server 1 times (codes 000)", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19118 \u2014 read it, then journal helper finish 200 once its work is taken or dropped; helper 203, Ingrid Mergewell, reported in message 18848 \u2014 read it, then journal helper finish 203 once its work is taken or dropped; helper 196, Leslie Lamportson, reported in message 18995 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 19188 - answer by opening your turn with [!reply:19188]", "meta": {"from": "journal"}}
{"content": "your message 19190 names 711 without saying what they are \u2014 put the type before each number, like message 1712 or to-do 644, so the chat links it: journal message edit 19190 \"<the text>\"", "meta": {"from": "journal"}}
{"content": "the reply tag on 19188 did not run \u2014 ! you already answered this in comment 3225: add to that answer with journal comment update 3225 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "1 new message 19192 - answer by opening your turn with [!reply:19192]", "meta": {"from": "journal"}}
{"content": "rule 36 \u2014 Clean, DRY, idiomatic before it is committed, never after it is\u2026 \u2014 The user should never be the one who finds duplication, dead code, a clumsy name or a pattern the codebase does not use. Read the diff before every commit as a reviewer would, and fix what is not clean then, not in a follow-up after a complaint.; rule 38 \u2014 Never change the git branch until the user says so, by name \u2014 The work happens on the branch the user named. That was main until message 5929 and question 80 (2026-09-23), which moved the sins work to the branch sins. Do not create, switch to or merge any other branch unless the user names it in their own words.", "meta": {"from": "journal"}}
{"content": "the reply tag on 19192 did not run \u2014 ! you already answered this in comment 3226: add to that answer with journal comment update 3226 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19175 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "message 19195 file Screenshot 2026-10-08 at 21.50.59.png needs tags \u2014 inspect the attachment, then journal message tag 19195 \"Screenshot 2026-10-08 at 21.50.59.png\" \"<a few words describing what it shows>\"; 1 new message 19195 - answer by opening your turn with [!reply:19195]; message 19195 updated", "meta": {"from": "journal"}}
{"content": "1 new message 19200 - answer by opening your turn with [!reply:19200]", "meta": {"from": "journal"}}
{"content": "fact 34 \u2014 A hooks list in a checkout's .claude/settings.json stops every\u2026 \u2014 Seen 2026-10-08: since commit 707a82915 the committed .claude/settings.json held {\"hooks\": []}; current Claude Code answers a hooks value that is not an object with a SettingsWarning dialog, which a headless helper cannot answer, so helpers 183 and 184 exited before doing anything (their launch logs in .journal/runtime/launches/ show it). This repository's journal hooks live in settings.local.json; the committed settings.json stays {}.", "meta": {"from": "journal"}}
{"content": "fact 9 \u2014 Every public method on a controller becomes a journal command \u2014 The CLI is generated from the controllers: each public method of Controller, or of a typed controller, turns into journal <noun> <method>. A helper added to the base class therefore becomes a command on every type \u2014 which is how journal <type> handled and journal <type> refuse came to exist, from the CRUD funnel and the refusal funnel. An internal helper on a controller is named with a leading underscore, as _shaped and _status already are, or it ships as a command nobody meant.; rule 35 \u2014 Write clean code - one funnel per kind of operation, never the same\u2026 \u2014 Every kind of operation has one funnel: one method that creates, one that saves, one that refuses, one that formats. A second method that does the same thing under another name splits the behaviour, and the two drift apart. Before writing a method, search for the one that already does it and extend that. scripts/checks/funnels.py finds bodies written twice.; rule 55 \u2014 Always dispatch Codex helpers on gpt-6-sol \u2014 The user's word, message 13431: switch the codex agents to GPT-6-Sol and make it their default. ~/.codex/config.toml names it as the default model too.; rule 56 \u2014 Helpers are for work that writes; subagents read, research and design \u2014 The user, message 13464: there must be a clear distinction. A subagent can be dispatched for anything read-only: research, review, design. A helper is for actual work that writes, best in its own worktree when the work is separate. Dieter designing in Claude Design should have been a subagent, not a helper.", "meta": {"from": "journal"}}
{"content": "command message reply is slower than its budget \u2014 135ms last (53ms of it working), against a budget of 50ms. Seen 50 times.", "meta": {"from": "journal"}}
{"content": "the reply tag on 19195,19200 did not run \u2014 ! you already answered this in comment 3227: add to that answer with journal comment update 3227 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "fact 24 \u2014 An answer followed by tool calls can be missing from Claude's\u2026 \u2014 Seen 2026-09-24 for messages 9391-9404: text blocks opening with [!reply:n] that were followed by tool calls never appeared in the session's jsonl (only thinking and tool_use rows did), so the journal never saw them and the replies were lost. When a turn goes on after answering, send the answer with journal message reply <n> \"<text>\" instead of the tag.", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19118 \u2014 read it, then journal helper finish 200 once its work is taken or dropped; helper 203, Ingrid Mergewell, reported in message 18848 \u2014 read it, then journal helper finish 203 once its work is taken or dropped; helper 196, Leslie Lamportson, reported in message 18995 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 41 \u2014 Keep moving, run the whole suite before every commit, never wait \u2014 The full suite runs in about seven seconds: .venv/bin/python -m pytest -q --timeout=300 -n auto. Run it before every commit instead of picking tests by name. Group rows that sit in the same code into one sitting: write them all, test once, commit once. And never wait, not for a subagent, a build, or an answer you can carry on without. Dispatch it and keep working. If you truly are waiting on something, say so in the work log.; rule 65 \u2014 Run only new and affected tests while working; the whole suite only\u2026 \u2014 The user, messages 17914 to 17917 (2026-10-07): 'stop running the whole test suite and wasting my time... please only run the new or affected tests, and then, whenever you are merging to main or publishing to main, you can run the full test suite.' Replaces rule 41's whole suite before every commit: on a feature branch, run the tests beside what changed (journal check touched, or the feature's test.py and the browser scenarios it touches); the whole suite runs once, before a merge into main and its release.", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19206 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "1 new message 19214 - answer by opening your turn with [!reply:19214]", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19215 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "law L1 \u2014 Every subagent dispatch names its model and chooses the least\u2026 \u2014 Use a fast, economical model for mechanical work with a known answer, a capable general model for careful implementation, and the strongest model only when the task turns on difficult judgement. Inheriting the orchestrator's model is not a model choice. If the dispatch API cannot accept a model, that operation is exempt.; law L2 \u2014 Every subagent is bound to a concrete job; never dispatch a generic\u2026 \u2014 Use the most specific available agent type whose declared purpose matches the assignment. On providers without agent types, give the dispatch a concrete task name and bounded prompt. If no suitable specialization exists, keep the work in the main agent instead of manufacturing an unscoped helper.; law L4 \u2014 Related work goes back to the helper or subagent that already worked\u2026 \u2014 A helper or subagent that drew a design, wrote the code or ran the research keeps what it learned. When new work changes its work, is related to it or touches the same code, send it there with a message (SendMessage, journal helper say) rather than dispatching a new one that has to rediscover everything; start fresh only when the earlier one is gone or the new work is unrelated.; law L5 \u2014 Every subagent dispatch names the agent - a human name, a little\u2026 \u2014 A name is how the user and the chat tell subagents apart and how they are messaged later; an id or a task line is not a name. Start the dispatch's description with the name, a colon, then the task, such as \"Dr. Einstein: profile the slow hooks\" or \"Coco Rams: draw the plan card\". A designer can borrow from famous designers, a researcher from famous scientists, mixed up for fun.; rule 58 \u2014 A design runs three critique rounds, then is built on a branch \u2014 Messages 17276 and 17281 (2026-10-06): the norm is a three-round cycle. Round by round, the designer designs (or revises), separate critic agents review the design through their lenses (the critic agent type, .claude/agents/critic.md: read-only, with a browser; one per lens, such as first-time, native, words and parity), and the designer adjusts it to their findings; three rounds in all. The three rounds stand in for the user's approval of the design: the user does not approve it. After the third round the design is built on a branch of its own, which ends in a pull request that waits for the user's approval (rule 61). Replaces message 15725's prototype approval.; rule 63 \u2014 A small design is drawn once and the user approves it, with no\u2026 \u2014 The user, messages 17628 and 17629 (2026-10-07), about the tooltip and waiting-status designs: 'This design round doesn't really need multiple rounds... I just want the designer agent to design it, and I will approve it.' Rule 58's three critique rounds are for large designs such as the phone app; a small one (a tooltip, a status word, one control) is drawn once by the designer, the link goes to the user, and it is built once the user approves it.", "meta": {"from": "journal"}}
{"content": "fact 13 \u2014 This live session runs the installed copy in .journal/journal.pyz \u2014 The running journal (server, hooks, CLI) runs from .journal/journal.pyz with its viewer and skills in .journal/src, never from the repo. A change in the repo reaches it only through python3 src/journal.py --root .journal upgrade, which packs the zip again. A commit alone changes nothing that is running.", "meta": {"from": "journal"}}
{"content": "1 new message 19220 - answer by opening your turn with [!reply:19220]", "meta": {"from": "journal"}}
{"content": "1 new message 19221 - answer by opening your turn with [!reply:19221]", "meta": {"from": "journal"}}
{"content": "fact 18 \u2014 cProfile inflates the slow-request profiles about tenfold \u2014 The faults feature writes a profile when a request passes its budget, and the profile is taken with cProfile, which adds per-call overhead. On 2026-09-22 /api/summary profiled at 58ms with 48ms inside Resource.fork's deep copy; with the profiler off the same call ran in 2 to 7ms. Read the profile for where the time goes in relative terms, then time the call with curl before changing anything.; fact 26 \u2014 Claude Code reads agent profiles when a session starts \u2014 Seen 2026-09-26: after the board-filler's profile in .claude/agents gained its steps and the Grep rule, dispatches from the running session still used the old profile (a 3.5-minute first question, shell grep refused); after the session restarted, the same request took 21 seconds with 4 calls. A change to an agent type reaches only sessions started after it is written.; rule 37 \u2014 Close every to-do explicitly with todo done or a Journal commit\u2026 \u2014 Ending work does not close its row. A to-do is closed by journal todo done <n> --how, or by a commit whose message carries Journal: todos done <n> at column 0, several numbers separated by commas. A row left open after its work landed misleads the next session and auto mode.; rule 43 \u2014 A request or hook over its budget is fixed before the next release \u2014 Comment 1151 on this rule. When the faults feature reports a request, a hook or a command slower than its budget, file it as a to-do at once. It does not jump ahead of the work in hand, but no version is published while one is still open: profile it, fix it, and verify the new time before the release goes out. The budget is 50ms, because everything runs locally against files.; rule 48 \u2014 The viewer is built from its component library, and pages only\u2026 \u2014 Message 4258. Every visual piece the viewer shows more than once, or that a user would recognise as the same kind of thing (a dialog, a side panel or inspector, a dropdown, a list row, a switch, a button), is one component in web/src/kit, extracted aggressively, and every page composes those components instead of building its own copy. Before writing markup or styles in a page, look for the kit component that already does it and extend it with a prop; a second hand-built version is a bug. The side panel that animated in but not out, while a separate skill panel did both, is the example.; rule 54 \u2014 Settings and feature switches are read at boot and on change, never\u2026 \u2014 The user, message 13349: the application boots, determines every feature and setting once, and re-evaluates only when something changes, such as a setting or a plugin. Never lazy-load settings.", "meta": {"from": "journal"}}
{"content": "rule 62 \u2014 The voice profile shapes only the agent's chat speech, never code or\u2026 \u2014 The user, message 17620 (2026-10-07): the profile (butler, homie, coach, colleague) must not leak into the code the agent writes or into user-facing text of any application it works on: names, labels, comments, commit messages, docs and briefs written into a project use plain words (helper, subagent). Speaking in the chat in the profile's voice is fine.", "meta": {"from": "journal"}}
{"content": "the reply tag on 19220,19221 did not run \u2014 ! you already answered this in comment 3229: add to that answer with journal comment update 3229 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 18848 \u2014 read it, then journal helper finish 203 once its work is taken or dropped; helper 196, Leslie Lamportson, reported in message 18995 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 19223 - answer by opening your turn with [!reply:19223]", "meta": {"from": "journal"}}
{"content": "1 new message 19228 - answer by opening your turn with [!reply:19228]", "meta": {"from": "journal"}}
{"content": "1 new message 19229 - answer by opening your turn with [!reply:19229]", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19206 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19230 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "the reply tag on 19223,19228,19229 did not run \u2014 ! you already answered this in comment 3230: add to that answer with journal comment update 3230 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "1 new message 19232 - answer by opening your turn with [!reply:19232]", "meta": {"from": "journal"}}
{"content": "rule 42 \u2014 Every user-facing text passes the formatters before it leaves the\u2026 \u2014 Not only a brief. A title, an abstract, an outcome and every section body are read by a person, so each goes through the same formatters on its way to the viewer \u2014 chat turns, activity items, to-do rows, inspector pages, docs alike. One field formatted out of five is not a rule, it is an accident, and it is how a raw tag ended up in the activity list after the tags feature had been stripping them for weeks. When a new field carries words a person reads, it joins the list in the same place.", "meta": {"from": "journal"}}
{"content": "fact 23 \u2014 Every upgrade brings system sequences and their triggers in line\u2026 \u2014 install.py runs ship_sequences after the migrations on each upgrade, so features/sequences/shipped.py is the whole source: change its wording and the next upgrade updates every journal, no migration needed. Shipped rows carry system=True and are read-only for everyone but SYSTEM (controllers/base.py _shipped).", "meta": {"from": "journal"}}
{"content": "the todo tag does this in one step \u2014 [!todo=\"the title\"] files it with the turn as its brief; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "1 new message 19234 - answer by opening your turn with [!reply:19234]", "meta": {"from": "journal"}}
{"content": "the reply tag on 19232 did not run \u2014 ! you already answered this in comment 3231: add to that answer with journal comment update 3231 rather than a second reply - add what is missing to the tag itself; to-do 3525 came from message 19232? \u2014 link it: journal message process 19232 \"<their words>\" todo:3525; 1 new message 19235 - answer by opening your turn with [!reply:19235]", "meta": {"from": "journal"}}
{"content": "the reply tag on 19234,19235 did not run \u2014 ! you already answered this in comment 3232: add to that answer with journal comment update 3232 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 18848 \u2014 read it, then journal helper finish 203 once its work is taken or dropped; helper 196, Leslie Lamportson, reported in message 18995 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 1982ms last (76ms of it working, 185ms collecting garbage, then 274ms more after it answered), against a budget of 50ms. Seen 48 times.; 1 new message 19239 - answer by opening your turn with [!reply:19239]", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19206 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19230 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 19242 - answer by opening your turn with [!reply:19242]", "meta": {"from": "journal"}}
{"content": "1 new message 19243 - answer by opening your turn with [!reply:19243]", "meta": {"from": "journal"}}
{"content": "fact 25 \u2014 A designer's install packs the whole tree, half-done server edits\u2026 \u2014 2026-09-25: Eames and Saul run python3 src/journal.py --root .journal upgrade after their viewer builds; it packs every file in src, so a server handler I was halfway through writing went live and raised on every PostToolUse hook. While designers work in parallel, keep server edits whole between tool calls (write and test in the scratchpad first), and reinstall after reverting anything.; rule 66 \u2014 The journal never slows the agent down \u2014 The user, message 18990, after hooks timed out and waited on locks under load: the journal must never, ever decrease the performance of an agent. A hook answers at once with what decides the tool call; everything else runs after, in the background, and reaches the agent as a message. No hook waits on a lock it does not need.", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 19244 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "answer message 19239 before you write anything \u2014 answer by opening your turn with [!reply:19239]. a reply, a reaction, or journal message processed <n>; the reply tag on 19242,19243 did not run \u2014 ! you already answered this in comment 3233: add to that answer with journal comment update 3233 rather than a second reply - add what is missing to the tag itself; command message reply is slower than its budget \u2014 730ms last (87ms of it working, 3ms waiting on locks), against a budget of 50ms. Seen 55 times.", "meta": {"from": "journal"}}
{"content": "the reply tag on 19239 did not run \u2014 ! you already answered this in comment 3234: add to that answer with journal comment update 3234 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "1 new message 19246 - answer by opening your turn with [!reply:19246]", "meta": {"from": "journal"}}
{"content": "rule 27 \u2014 Name a declaration with the word a reader already knows \u2014 An attribute, a variable or a field gets the ordinary programming word for what it holds, not an evocative one. was, heard and alone were poetry; aliases, notify_actions and urgent_actions are what they are. The test: could a reader who has never seen this codebase guess what it holds from the name alone? Prose belongs in the help text and the abstract, where it is read as prose. This does not license abbreviations \u2014 a plain word in full, not a short one.", "meta": {"from": "journal"}}
{"content": "the reply tag on 19246 did not run \u2014 ! you already answered this in comment 3235: add to that answer with journal comment update 3235 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19249 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19251 \u2014 read it, then journal helper finish 205 once its work is taken or dropped; 1 new message 19252 - answer by opening your turn with [!reply:19252]", "meta": {"from": "journal"}}
{"content": "your chat talked about the journal's workings - \"Still waiting\" \u2014 the user sees replies, reactions, pills and reads themselves; say what the work is instead; your chat talked about the journal's workings - \"I'm still waiting\" \u2014 the user sees replies, reactions, pills and reads themselves; say what the work is instead", "meta": {"from": "journal"}}
{"content": "the reply tag on 19252 did not run \u2014 ! you already answered this in comment 3236: add to that answer with journal comment update 3236 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 18848 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "the user put \u2764\ufe0f on comment 3236. Act on it if it asks for something, such as a go-ahead. It needs no written reply; when it answers a message of the user's own, react to that message in turn. The chat never mentions it", "meta": {"from": "journal"}}
{"content": "1 new message 19260 - answer by opening your turn with [!reply:19260]", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19265 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 19244 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19251 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19272 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 18848 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19265 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 19244 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 19298 - answer by opening your turn with [!reply:19298]", "meta": {"from": "journal"}}
{"content": "request POST /api/main/message is slower than its budget \u2014 114ms last (56ms of it working, 330ms collecting garbage, then 761ms more after it answered), against a budget of 50ms. Seen 23 times.", "meta": {"from": "journal"}}
{"content": "message 19307 file Screenshot 2026-10-08 at 22.15.35.png needs tags \u2014 inspect the attachment, then journal message tag 19307 \"Screenshot 2026-10-08 at 22.15.35.png\" \"<a few words describing what it shows>\"; 1 new message 19307 - answer by opening your turn with [!reply:19307]; message 19307 updated", "meta": {"from": "journal"}}
{"content": "1 new message 19308 - answer by opening your turn with [!reply:19308]", "meta": {"from": "journal"}}
{"content": "law L3 \u2014 Read narrowly - grep for the line, sed a range, head the file; never\u2026 \u2014 Everything a tool returns stays in the context for good and is paid for on every turn after it. Search before you read, read the range you need, and cap output with grep, head or tail. Read a whole file only when you need all of it.", "meta": {"from": "journal"}}
{"content": "fact 24 \u2014 An answer followed by tool calls can be missing from Claude's\u2026 \u2014 Seen 2026-09-24 for messages 9391-9404: text blocks opening with [!reply:n] that were followed by tool calls never appeared in the session's jsonl (only thinking and tool_use rows did), so the journal never saw them and the replies were lost. When a turn goes on after answering, send the answer with journal message reply <n> \"<text>\" instead of the tag.", "meta": {"from": "journal"}}
{"content": "rule 60 \u2014 A hotfix is done by a dispatched agent in a worktree of main \u2014 Message 16836 (2026-10-06): the orchestrator cut a worktree under .claude/worktrees for a Codex hotfix, its session moved to a new environment and the user's messages stopped reaching it. The user: when working on a branch and a hotfix comes in, create a worktree of main and dispatch an agent to do that work. The orchestrator stays on its branch and in its environment, and never cds into another checkout.; fact 9 \u2014 Every public method on a controller becomes a journal command \u2014 The CLI is generated from the controllers: each public method of Controller, or of a typed controller, turns into journal <noun> <method>. A helper added to the base class therefore becomes a command on every type \u2014 which is how journal <type> handled and journal <type> refuse came to exist, from the CRUD funnel and the refusal funnel. An internal helper on a controller is named with a leading underscore, as _shaped and _status already are, or it ships as a command nobody meant.; fact 34 \u2014 A hooks list in a checkout's .claude/settings.json stops every\u2026 \u2014 Seen 2026-10-08: since commit 707a82915 the committed .claude/settings.json held {\"hooks\": []}; current Claude Code answers a hooks value that is not an object with a SettingsWarning dialog, which a headless helper cannot answer, so helpers 183 and 184 exited before doing anything (their launch logs in .journal/runtime/launches/ show it). This repository's journal hooks live in settings.local.json; the committed settings.json stays {}.", "meta": {"from": "journal"}}
{"content": "rule 39 \u2014 Use only registered exclamation response tags \u2014 A tag like [!reply:12] runs a command, and only the tags in the tags.runs setting are registered. An invented tag does nothing and shows as raw text in the chat. Use the registered ones (reply, log, end, todo, fact, rule) and nothing else.", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19272 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "the reply tag on 19298,19307,19308 did not run \u2014 ! you already answered this in comment 3237: add to that answer with journal comment update 3237 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 18848 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 19313 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 45 \u2014 No prose words as names in code - said, says, heard, spoke, told\u2026 \u2014 Messages 1360 and 1698. The user has said more than once that code must not read like prose: a variable, attribute, property or function is named for what it holds or does (text, command, labels, lines), never with a verb from a story. 'says' on the Design type (1360) and 'said = call.said.lower()' in features/recital.py (1698) are the examples. Rule 27 states the naming rule; this one carries the words, so writing one of them whispers it. Before writing a name, ask whether a reader who has never seen the code would know what it holds.", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19265 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 19244 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 19323 - answer by opening your turn with [!reply:19323]", "meta": {"from": "journal"}}
{"content": "your message 19324 names 19307 without saying what they are \u2014 put the type before each number, like message 1712 or to-do 644, so the chat links it: journal message edit 19324 \"<the text>\"", "meta": {"from": "journal"}}
{"content": "fact 18 \u2014 cProfile inflates the slow-request profiles about tenfold \u2014 The faults feature writes a profile when a request passes its budget, and the profile is taken with cProfile, which adds per-call overhead. On 2026-09-22 /api/summary profiled at 58ms with 48ms inside Resource.fork's deep copy; with the profiler off the same call ran in 2 to 7ms. Read the profile for where the time goes in relative terms, then time the call with curl before changing anything.; fact 26 \u2014 Claude Code reads agent profiles when a session starts \u2014 Seen 2026-09-26: after the board-filler's profile in .claude/agents gained its steps and the Grep rule, dispatches from the running session still used the old profile (a 3.5-minute first question, shell grep refused); after the session restarted, the same request took 21 seconds with 4 calls. A change to an agent type reaches only sessions started after it is written.", "meta": {"from": "journal"}}
{"content": "the reply tag on 19323 did not run \u2014 ! you already answered this in comment 3238: add to that answer with journal comment update 3238 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "request GET /api/main/search is slower than its budget \u2014 185ms last (141ms of it working, 403ms collecting garbage, then 6ms more after it answered), against a budget of 50ms. Seen 3 times.", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 432ms last (53ms of it working, 413ms collecting garbage, then 34ms more after it answered), against a budget of 50ms. Seen 50 times.", "meta": {"from": "journal"}}
{"content": "1 new message 19334 - answer by opening your turn with [!reply:19334]", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19272 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "request GET /api/main/helper is slower than its budget \u2014 207ms last (62ms of it working, 435ms collecting garbage, then 1ms more after it answered), against a budget of 50ms. Seen 60 times.", "meta": {"from": "journal"}}
{"content": "the reply tag on 19334 did not run \u2014 ! you already answered this in comment 3239: add to that answer with journal comment update 3239 rather than a second reply - add what is missing to the tag itself; command message reply is slower than its budget \u2014 1530ms last (121ms of it working), against a budget of 50ms. Seen 58 times.", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 19313 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "message 19343 file Screenshot 2026-10-08 at 22.22.27.png needs tags \u2014 inspect the attachment, then journal message tag 19343 \"Screenshot 2026-10-08 at 22.22.27.png\" \"<a few words describing what it shows>\"; 1 new message 19343 - answer by opening your turn with [!reply:19343]; message 19343 updated", "meta": {"from": "journal"}}
{"content": "fact 13 \u2014 This live session runs the installed copy in .journal/journal.pyz \u2014 The running journal (server, hooks, CLI) runs from .journal/journal.pyz with its viewer and skills in .journal/src, never from the repo. A change in the repo reaches it only through python3 src/journal.py --root .journal upgrade, which packs the zip again. A commit alone changes nothing that is running.; fact 28 \u2014 The designer agent type exists, so design work goes to a subagent \u2014 Since 2026-10-01 .claude/agents/designer.md (Dieter, Opus, Claude Design tools, read-only on the repository) is an agent type; rule 56 says design is a subagent's job, never a helper's.", "meta": {"from": "journal"}}
{"content": "the reply tag on 19343 did not run \u2014 ! you already answered this in comment 3240: add to that answer with journal comment update 3240 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "request GET /api/main/todo is slower than its budget \u2014 271ms last (63ms of it working, 508ms collecting garbage, then 19ms more after it answered), against a budget of 50ms. Seen 5 times.", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19265 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 19244 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "message 19355 file Screenshot 2026-10-08 at 22.24.44.png needs tags \u2014 inspect the attachment, then journal message tag 19355 \"Screenshot 2026-10-08 at 22.24.44.png\" \"<a few words describing what it shows>\"; message 19355 file Screenshot 2026-10-08 at 22.24.50.png needs tags \u2014 inspect the attachment, then journal message tag 19355 \"Screenshot 2026-10-08 at 22.24.50.png\" \"<a few words describing what it shows>\"; 1 new message 19355 - answer by opening your turn with [!reply:19355]; message 19355 updated", "meta": {"from": "journal"}}
{"content": "1 new message 19360 - answer by opening your turn with [!reply:19360]", "meta": {"from": "journal"}}
{"content": "the reply tag on 19355,19360 did not run \u2014 ! you already answered this in comment 3241: add to that answer with journal comment update 3241 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "message 19362 file Screenshot 2026-10-08 at 22.25.59.png needs tags \u2014 inspect the attachment, then journal message tag 19362 \"Screenshot 2026-10-08 at 22.25.59.png\" \"<a few words describing what it shows>\"; 1 new message 19362 - answer by opening your turn with [!reply:19362]; message 19362 updated", "meta": {"from": "journal"}}
{"content": "fact 20 \u2014 A slim supervisor holds the agent and a worker reloads on every build \u2014 Since 2.118.0 (2026-09-23). src/supervisor.py is standard library only and never reloads: journal claude hands its process over to it (os.execv), and it owns the pty and the agent process, relays the terminal, writes the printed and screen captures, listens on the typist socket, restarts the agent in the same session from a relaunch command written to its runtime folder while a restart is pending, and stops it with escalation while draining the pty (an agent cannot finish exiting on macOS while its output is unread). It starts the worker (src/worker.py, which runs runner/worker.py; engine/worker.py stays as an alias for supervisors started before 2.201) and starts it again whenever it exits: RELOAD on a new build, RELAUNCH to restart the agent, STOP to end, HEAL or a quick crash to roll back a build through journal heal. The worker holds everything else: seating the session, the start-up confirm typed through the typist, services, viewer, update check, check-in, and the one-time relaunch of sessions launched before agents/terminal.py LAUNCH. agents/terminal.py holds only journal-side helpers. The server (serve.py) still runs the engines and re-execs itself on a .py change. When the agent exits, the supervisor runs journal ended, which puts set-aside hooks back and stops the server when no session is left.", "meta": {"from": "journal"}}
{"content": "the reply tag on 19362 did not run \u2014 ! you already answered this in comment 3242: add to that answer with journal comment update 3242 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "1 new message 19365 - answer by opening your turn with [!reply:19365]", "meta": {"from": "journal"}}
{"content": "Is rule 67 a ruling for the whole project? \u2014 rule 67, \"Never answer a journal line in the chat; act on it silently\", binds every environment of the project. Keep it only if it is a ruling for all of them, worded as one (\"Always ...\", \"Never ...\"). If it is about this environment or its current work, strike it with journal rule strike 67 --how \"<why>\" and file it here as a fact or a reminder instead.", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19272 \u2014 read it, then journal helper finish 205 once its work is taken or dropped; the reply tag on 19365 did not run \u2014 ! you already answered this in comment 3243: add to that answer with journal comment update 3243 rather than a second reply - add what is missing to the tag itself; to-do 3536 came from message 19365? \u2014 link it: journal message process 19365 \"<their words>\" todo:3536", "meta": {"from": "journal"}}
{"content": "1 new message 19369 - answer by opening your turn with [!reply:19369]", "meta": {"from": "journal"}}
{"content": "fact 23 \u2014 Every upgrade brings system sequences and their triggers in line\u2026 \u2014 install.py runs ship_sequences after the migrations on each upgrade, so features/sequences/shipped.py is the whole source: change its wording and the next upgrade updates every journal, no migration needed. Shipped rows carry system=True and are read-only for everyone but SYSTEM (controllers/base.py _shipped).; rule 67 \u2014 Never answer a journal line in the chat; act on it silently \u2014 The user, messages 19360 and 19365: the agent kept writing chat lines in reply to the journal's own reminders (old helper reports, notices), filling the user's chat with noise. A journal line is an instruction to the agent, not a message: act on it and write nothing, unless the user needs to know something (a failure, a finished piece of work, a decision that waits on them). The journal itself should enforce it, not a local reminder.", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 19313 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "the reply tag on 19369 did not run \u2014 ! you already answered this in comment 3244: add to that answer with journal comment update 3244 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "1 new message 19371 - answer by opening your turn with [!reply:19371]", "meta": {"from": "journal"}}
{"content": "Code Commandments found 35 sins across 11 skills. \u2014 journal check show 29 says why; fix it, then journal check run 29; message 19371 file Screenshot 2026-10-08 at 22.28.10.png needs tags \u2014 inspect the attachment, then journal message tag 19371 \"Screenshot 2026-10-08 at 22.28.10.png\" \"<a few words describing what it shows>\"; message 19371 updated", "meta": {"from": "journal"}}
{"content": "rule 51 \u2014 Every finished feature is committed, pushed and released with a new\u2026 \u2014 Message 9207 (2026-09-24): when a new feature is ready, commit, push and publish a new tag. This is the user's standing word for releasing, so rule 44's only-when-the-user-says is met by it for finished features; fixes in between wait for the next feature or a patch the user asks for.", "meta": {"from": "journal"}}
{"content": "the reply tag on 19371 did not run \u2014 ! you already answered this in comment 3245: add to that answer with journal comment update 3245 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "rule 57 \u2014 Never merge the overnight refactor into main before its pull request\u2026 \u2014 Messages 15005, 15006, 15109, 15110 (2026-10-04): all refactor work goes on branch overnight-refactor and reaches the user as one pull request, which they read in the morning; nothing of it is merged into main until they say so. Hotfixes the user explicitly asks for go to main at once and are merged into the branch.; rule 61 \u2014 Features wait as pull requests until approved; only hotfixes merge\u2026 \u2014 Message 17118 (2026-10-06), after the overnight refactor merged as 2.252.0: start new work in a new branch, do not merge, write the pull request. Every pull request or new feature is parked until the user approves it. Hotfixes can be merged into main immediately (by a dispatched agent in a worktree of main, rule 60).; rule 64 \u2014 A finished feature is merged into main without waiting for approval \u2014 The user, message 17815 (2026-10-07): 'make sure that no pull requests are lingering on the repository. You may merge them into main... You are allowed to merge everything into main once the feature is completed.' This replaces rule 61's wait for approval: a feature still goes on its own branch, and once it is complete, tested and its whole suite passes, it is merged into main and released, and no pull request is left open.", "meta": {"from": "journal"}}
{"content": "you ran the same check 3 times in a row - echo ok \u2014 if you are waiting for something to change, say journal work await \"<what you wait for>\" and end your turn: you are asked to look again every five minutes, and a background command tells you itself when it ends. Keep checking only if each look moves the work on.", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19265 \u2014 read it, then journal helper finish 200 once its work is taken or dropped; 1 new message 19378 - answer by opening your turn with [!reply:19378]", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 19244 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your last message ran its paragraphs together \u2014 a blank line between parts is what makes a message readable: one thought to a paragraph; the reply tag on 19378 did not run \u2014 ! you already answered this in comment 3246: add to that answer with journal comment update 3246 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19272 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 19385 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 19313 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 19391 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19265 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 38 \u2014 Never change the git branch until the user says so, by name \u2014 The work happens on the branch the user named. That was main until message 5929 and question 80 (2026-09-23), which moved the sins work to the branch sins. Do not create, switch to or merge any other branch unless the user names it in their own words.", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19402 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 1309ms last (95ms of it working, 818ms collecting garbage, then 33ms more after it answered), against a budget of 50ms. Seen 58 times.", "meta": {"from": "journal"}}
{"content": "rule 35 \u2014 Write clean code - one funnel per kind of operation, never the same\u2026 \u2014 Every kind of operation has one funnel: one method that creates, one that saves, one that refuses, one that formats. A second method that does the same thing under another name splits the behaviour, and the two drift apart. Before writing a method, search for the one that already does it and extend that. scripts/checks/funnels.py finds bodies written twice.; rule 55 \u2014 Always dispatch Codex helpers on gpt-6-sol \u2014 The user's word, message 13431: switch the codex agents to GPT-6-Sol and make it their default. ~/.codex/config.toml names it as the default model too.; rule 56 \u2014 Helpers are for work that writes; subagents read, research and design \u2014 The user, message 13464: there must be a clear distinction. A subagent can be dispatched for anything read-only: research, review, design. A helper is for actual work that writes, best in its own worktree when the work is separate. Dieter designing in Claude Design should have been a subagent, not a helper.", "meta": {"from": "journal"}}
{"content": "message 19407 file Screenshot 2026-10-08 at 22.34.46.png needs tags \u2014 inspect the attachment, then journal message tag 19407 \"Screenshot 2026-10-08 at 22.34.46.png\" \"<a few words describing what it shows>\"; 1 new message 19407 - answer by opening your turn with [!reply:19407]; message 19407 updated", "meta": {"from": "journal"}}
{"content": "rule 36 \u2014 Clean, DRY, idiomatic before it is committed, never after it is\u2026 \u2014 The user should never be the one who finds duplication, dead code, a clumsy name or a pattern the codebase does not use. Read the diff before every commit as a reviewer would, and fix what is not clean then, not in a follow-up after a complaint.; fact 24 \u2014 An answer followed by tool calls can be missing from Claude's\u2026 \u2014 Seen 2026-09-24 for messages 9391-9404: text blocks opening with [!reply:n] that were followed by tool calls never appeared in the session's jsonl (only thinking and tool_use rows did), so the journal never saw them and the replies were lost. When a turn goes on after answering, send the answer with journal message reply <n> \"<text>\" instead of the tag.; rule 46 \u2014 Only commit and push once the whole journal is proven to boot \u2014 Messages 2178 and 2179. A release that has not been started for real can crash every project that installs it, as 2.78.3 did for Codex and 2.84.0 did to project records. Before every commit and push: the full suite passes, including tests/test_it_boots.py, which installs a packed copy into a fresh project, launches Claude and Codex from it, writes a project record, upgrades again and checks the record survives. When a change touches launching, installing or upgrading, also start a real journal in a scratch project and close it properly afterwards, leaving no process behind.", "meta": {"from": "journal"}}
{"content": "command todo search is slower than its budget \u2014 123ms last (54ms of it working), against a budget of 50ms. Seen 8 times.; request POST /api/run (todo search) is slower than its budget \u2014 124ms last (55ms of it working, 804ms collecting garbage, then 45ms more after it answered), against a budget of 50ms. Seen 3 times.", "meta": {"from": "journal"}}
{"content": "fact 9 \u2014 Every public method on a controller becomes a journal command \u2014 The CLI is generated from the controllers: each public method of Controller, or of a typed controller, turns into journal <noun> <method>. A helper added to the base class therefore becomes a command on every type \u2014 which is how journal <type> handled and journal <type> refuse came to exist, from the CRUD funnel and the refusal funnel. An internal helper on a controller is named with a leading underscore, as _shaped and _status already are, or it ships as a command nobody meant.; fact 34 \u2014 A hooks list in a checkout's .claude/settings.json stops every\u2026 \u2014 Seen 2026-10-08: since commit 707a82915 the committed .claude/settings.json held {\"hooks\": []}; current Claude Code answers a hooks value that is not an object with a SettingsWarning dialog, which a headless helper cannot answer, so helpers 183 and 184 exited before doing anything (their launch logs in .journal/runtime/launches/ show it). This repository's journal hooks live in settings.local.json; the committed settings.json stays {}.", "meta": {"from": "journal"}}
{"content": "the todo tag does this in one step \u2014 [!todo=\"the title\"] files it with the turn as its brief; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "your last message ran its paragraphs together \u2014 a blank line between parts is what makes a message readable: one thought to a paragraph; the reply tag on 19407 did not run \u2014 ! you already answered this in comment 3247: add to that answer with journal comment update 3247 rather than a second reply - add what is missing to the tag itself; command message reply is slower than its budget \u2014 320ms last (92ms of it working, 1ms collecting garbage), against a budget of 50ms. Seen 61 times.", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19422 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 65 \u2014 Run only new and affected tests while working; the whole suite only\u2026 \u2014 The user, messages 17914 to 17917 (2026-10-07): 'stop running the whole test suite and wasting my time... please only run the new or affected tests, and then, whenever you are merging to main or publishing to main, you can run the full test suite.' Replaces rule 41's whole suite before every commit: on a feature branch, run the tests beside what changed (journal check touched, or the feature's test.py and the browser scenarios it touches); the whole suite runs once, before a merge into main and its release.", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 19313 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 19391 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19402 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19438 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19444 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 19313 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat; rule 41 \u2014 Keep moving, run the whole suite before every commit, never wait \u2014 The full suite runs in about seven seconds: .venv/bin/python -m pytest -q --timeout=300 -n auto. Run it before every commit instead of picking tests by name. Group rows that sit in the same code into one sitting: write them all, test once, commit once. And never wait, not for a subagent, a build, or an answer you can carry on without. Dispatch it and keep working. If you truly are waiting on something, say so in the work log.", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 19391 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 19463 - answer by opening your turn with [!reply:19463]", "meta": {"from": "journal"}}
{"content": "your chat talked about the journal's workings - \"Still waiting\" \u2014 the user sees replies, reactions, pills and reads themselves; say what the work is instead; fact 25 \u2014 A designer's install packs the whole tree, half-done server edits\u2026 \u2014 2026-09-25: Eames and Saul run python3 src/journal.py --root .journal upgrade after their viewer builds; it packs every file in src, so a server handler I was halfway through writing went live and raised on every PostToolUse hook. While designers work in parallel, keep server edits whole between tool calls (write and test in the scratchpad first), and reinstall after reverting anything.; rule 48 \u2014 The viewer is built from its component library, and pages only\u2026 \u2014 Message 4258. Every visual piece the viewer shows more than once, or that a user would recognise as the same kind of thing (a dialog, a side panel or inspector, a dropdown, a list row, a switch, a button), is one component in web/src/kit, extracted aggressively, and every page composes those components instead of building its own copy. Before writing markup or styles in a page, look for the kit component that already does it and extend it with a prop; a second hand-built version is a bug. The side panel that animated in but not out, while a separate skill panel did both, is the example.", "meta": {"from": "journal"}}
{"content": "rule 37 \u2014 Close every to-do explicitly with todo done or a Journal commit\u2026 \u2014 Ending work does not close its row. A to-do is closed by journal todo done <n> --how, or by a commit whose message carries Journal: todos done <n> at column 0, several numbers separated by commas. A row left open after its work landed misleads the next session and auto mode.", "meta": {"from": "journal"}}
{"content": "command todo create is slower than its budget \u2014 345ms last (53ms of it working), against a budget of 50ms. Seen 7 times.; request POST /api/run (todo create) is slower than its budget \u2014 347ms last (55ms of it working, 962ms collecting garbage, then 66ms more after it answered), against a budget of 50ms. Seen 11 times.", "meta": {"from": "journal"}}
{"content": "the reply tag on 19463 did not run \u2014 ! you already answered this in comment 3248: add to that answer with journal comment update 3248 rather than a second reply - add what is missing to the tag itself; fact 18 \u2014 cProfile inflates the slow-request profiles about tenfold \u2014 The faults feature writes a profile when a request passes its budget, and the profile is taken with cProfile, which adds per-call overhead. On 2026-09-22 /api/summary profiled at 58ms with 48ms inside Resource.fork's deep copy; with the profiler off the same call ran in 2 to 7ms. Read the profile for where the time goes in relative terms, then time the call with curl before changing anything.", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19438 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19444 \u2014 read it, then journal helper finish 200 once its work is taken or dropped; fact 26 \u2014 Claude Code reads agent profiles when a session starts \u2014 Seen 2026-09-26: after the board-filler's profile in .claude/agents gained its steps and the Grep rule, dispatches from the running session still used the old profile (a 3.5-minute first question, shell grep refused); after the session restarted, the same request took 21 seconds with 4 calls. A change to an agent type reaches only sessions started after it is written.; rule 43 \u2014 A request or hook over its budget is fixed before the next release \u2014 Comment 1151 on this rule. When the faults feature reports a request, a hook or a command slower than its budget, file it as a to-do at once. It does not jump ahead of the work in hand, but no version is published while one is still open: profile it, fix it, and verify the new time before the release goes out. The budget is 50ms, because everything runs locally against files.; rule 62 \u2014 The voice profile shapes only the agent's chat speech, never code or\u2026 \u2014 The user, message 17620 (2026-10-07): the profile (butler, homie, coach, colleague) must not leak into the code the agent writes or into user-facing text of any application it works on: names, labels, comments, commit messages, docs and briefs written into a project use plain words (helper, subagent). Speaking in the chat in the profile's voice is fine.", "meta": {"from": "journal"}}
{"content": "request GET /api/main/comment is slower than its budget \u2014 1139ms last (55ms of it working, 1002ms collecting garbage, then 98ms more after it answered), against a budget of 50ms. Seen 1 time.", "meta": {"from": "journal"}}
{"content": "fact 13 \u2014 This live session runs the installed copy in .journal/journal.pyz \u2014 The running journal (server, hooks, CLI) runs from .journal/journal.pyz with its viewer and skills in .journal/src, never from the repo. A change in the repo reaches it only through python3 src/journal.py --root .journal upgrade, which packs the zip again. A commit alone changes nothing that is running.", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 19486 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19488 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 19313 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19495 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 19486 \u2014 read it, then journal helper finish 196 once its work is taken or dropped; helper 200, Linus Mendwell, reported in message 19488 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 19507 - answer by opening your turn with [!reply:19507]", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 19313 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "the reply tag on 19507 did not run \u2014 ! you already answered this in comment 3249: add to that answer with journal comment update 3249 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "1 new message 19515 - answer by opening your turn with [!reply:19515]", "meta": {"from": "journal"}}
{"content": "the reply tag on 19515 did not run \u2014 ! you already answered this in comment 3250: add to that answer with journal comment update 3250 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19518 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 19521 - answer by opening your turn with [!reply:19521]", "meta": {"from": "journal"}}
{"content": "1 new message 19524 - answer by opening your turn with [!reply:19524]", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "1 new message 19525 - answer by opening your turn with [!reply:19525]", "meta": {"from": "journal"}}
{"content": "your command ran 31s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 19526 - answer by opening your turn with [!reply:19526]", "meta": {"from": "journal"}}
{"content": "command message search is slower than its budget \u2014 5251ms last (1117ms of it working, 2ms collecting garbage), against a budget of 50ms. Seen 7 times.", "meta": {"from": "journal"}}
{"content": "rule 66 \u2014 The journal never slows the agent down \u2014 The user, message 18990, after hooks timed out and waited on locks under load: the journal must never, ever decrease the performance of an agent. A hook answers at once with what decides the tool call; everything else runs after, in the background, and reaches the agent as a message. No hook waits on a lock it does not need.", "meta": {"from": "journal"}}
{"content": "rule 42 \u2014 Every user-facing text passes the formatters before it leaves the\u2026 \u2014 Not only a brief. A title, an abstract, an outcome and every section body are read by a person, so each goes through the same formatters on its way to the viewer \u2014 chat turns, activity items, to-do rows, inspector pages, docs alike. One field formatted out of five is not a rule, it is an accident, and it is how a raw tag ended up in the activity list after the tags feature had been stripping them for weeks. When a new field carries words a person reads, it joins the list in the same place.", "meta": {"from": "journal"}}
{"content": "request POST /api/run (message search) is slower than its budget \u2014 83ms last (51ms of it working, 1148ms collecting garbage, then 2ms more after it answered), against a budget of 50ms. Seen 1 time.", "meta": {"from": "journal"}}
{"content": "rule 52 \u2014 A chat mark for something the user did sits on the user's side \u2014 Message 10960 (2026-09-25): marks for the user's own actions, such as answering a question, are right-aligned like the user's messages. A mark is put there by giving its card side=user.", "meta": {"from": "journal"}}
{"content": "the reply tag on 19521,19524,19525,19526 did not run \u2014 ! read message 19526 before you answer it: journal message read 19526 - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "answer message 19521, message 19524, message 19525 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>; the reply tag on 19521,19524,19525,19526 did not run \u2014 ! read message 19526 before you answer it: journal message read 19526 - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "rule 54 \u2014 Settings and feature switches are read at boot and on change, never\u2026 \u2014 The user, message 13349: the application boots, determines every feature and setting once, and re-evaluates only when something changes, such as a setting or a plugin. Never lazy-load settings.; 1 new message 19527 - answer by opening your turn with [!reply:19527]", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 19486 \u2014 read it, then journal helper finish 196 once its work is taken or dropped; helper 200, Linus Mendwell, reported in message 19488 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "the reply tag on 19527 did not run \u2014 ! you already answered this in comment 3252: add to that answer with journal comment update 3252 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19528 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 19313 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 19534 - answer by opening your turn with [!reply:19534]", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19538 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19539 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "the reply tag on 19534 did not run \u2014 ! you already answered this in comment 3253: add to that answer with journal comment update 3253 rather than a second reply - add what is missing to the tag itself; command message reply is slower than its budget \u2014 291ms last (84ms of it working), against a budget of 50ms. Seen 64 times.", "meta": {"from": "journal"}}
{"content": "request POST /api/main/message is slower than its budget \u2014 984ms last (77ms of it working, 1368ms collecting garbage, then 639ms more after it answered), against a budget of 50ms. Seen 24 times.; 1 new message 19541 - answer by opening your turn with [!reply:19541]", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19542 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "fact 24 \u2014 An answer followed by tool calls can be missing from Claude's\u2026 \u2014 Seen 2026-09-24 for messages 9391-9404: text blocks opening with [!reply:n] that were followed by tool calls never appeared in the session's jsonl (only thinking and tool_use rows did), so the journal never saw them and the replies were lost. When a turn goes on after answering, send the answer with journal message reply <n> \"<text>\" instead of the tag.; rule 50 \u2014 Everything the user does is doable in the viewer \u2014 Message 6710 (2026-09-23): the user never uses the CLI, only the UI; everything should be doable from the viewer. The journal commands are for agents; any action meant for the user (making boards, confirming, accepting, hosting, watching an agent) needs its place in the viewer.", "meta": {"from": "journal"}}
{"content": "the reply tag on 19541 did not run \u2014 ! you already answered this in comment 3254: add to that answer with journal comment update 3254 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "1 new message 19544 - answer by opening your turn with [!reply:19544]", "meta": {"from": "journal"}}
{"content": "1 new message 19545 - answer by opening your turn with [!reply:19545]", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "1 new message 19547 - answer by opening your turn with [!reply:19547]", "meta": {"from": "journal"}}
{"content": "fact 9 \u2014 Every public method on a controller becomes a journal command \u2014 The CLI is generated from the controllers: each public method of Controller, or of a typed controller, turns into journal <noun> <method>. A helper added to the base class therefore becomes a command on every type \u2014 which is how journal <type> handled and journal <type> refuse came to exist, from the CRUD funnel and the refusal funnel. An internal helper on a controller is named with a leading underscore, as _shaped and _status already are, or it ships as a command nobody meant.; fact 34 \u2014 A hooks list in a checkout's .claude/settings.json stops every\u2026 \u2014 Seen 2026-10-08: since commit 707a82915 the committed .claude/settings.json held {\"hooks\": []}; current Claude Code answers a hooks value that is not an object with a SettingsWarning dialog, which a headless helper cannot answer, so helpers 183 and 184 exited before doing anything (their launch logs in .journal/runtime/launches/ show it). This repository's journal hooks live in settings.local.json; the committed settings.json stays {}.; command todo create is slower than its budget \u2014 562ms last (63ms of it working), against a budget of 50ms. Seen 8 times.; request POST /api/run (todo create) is slower than its budget \u2014 603ms last (67ms of it working, 1303ms collecting garbage, then 96ms more after it answered), against a budget of 50ms. Seen 12 times.; message 19547 updated", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 1379ms last (55ms of it working, 1399ms collecting garbage, then 10ms more after it answered), against a budget of 50ms. Seen 62 times.", "meta": {"from": "journal"}}
{"content": "the reply tag on 19544,19545,19547 did not run \u2014 ! you already answered this in comment 3255: add to that answer with journal comment update 3255 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "1 new message 19548 - answer by opening your turn with [!reply:19548]", "meta": {"from": "journal"}}
{"content": "your message 19550 names 19545 without saying what they are \u2014 put the type before each number, like message 1712 or to-do 644, so the chat links it: journal message edit 19550 \"<the text>\"", "meta": {"from": "journal"}}
{"content": "the reply tag on 19548 did not run \u2014 ! you already answered this in comment 3256: add to that answer with journal comment update 3256 rather than a second reply - add what is missing to the tag itself; helper 205, Barbara Asyncwell, reported in message 19551 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19552 \u2014 read it, then journal helper finish 200 once its work is taken or dropped; helper 196, Leslie Lamportson, reported in message 19486 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "the user put \ud83d\udc4d on comment 3256. Act on it if it asks for something, such as a go-ahead. It needs no written reply; when it answers a message of the user's own, react to that message in turn. The chat never mentions it", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 19313 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19557 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "fact 20 \u2014 A slim supervisor holds the agent and a worker reloads on every build \u2014 Since 2.118.0 (2026-09-23). src/supervisor.py is standard library only and never reloads: journal claude hands its process over to it (os.execv), and it owns the pty and the agent process, relays the terminal, writes the printed and screen captures, listens on the typist socket, restarts the agent in the same session from a relaunch command written to its runtime folder while a restart is pending, and stops it with escalation while draining the pty (an agent cannot finish exiting on macOS while its output is unread). It starts the worker (src/worker.py, which runs runner/worker.py; engine/worker.py stays as an alias for supervisors started before 2.201) and starts it again whenever it exits: RELOAD on a new build, RELAUNCH to restart the agent, STOP to end, HEAL or a quick crash to roll back a build through journal heal. The worker holds everything else: seating the session, the start-up confirm typed through the typist, services, viewer, update check, check-in, and the one-time relaunch of sessions launched before agents/terminal.py LAUNCH. agents/terminal.py holds only journal-side helpers. The server (serve.py) still runs the engines and re-execs itself on a .py change. When the agent exits, the supervisor runs journal ended, which puts set-aside hooks back and stops the server when no session is left.", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19552 \u2014 read it, then journal helper finish 200 once its work is taken or dropped; helper 196, Leslie Lamportson, reported in message 19486 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 19570 - answer by opening your turn with [!reply:19570]", "meta": {"from": "journal"}}
{"content": "1 new message 19576 - answer by opening your turn with [!reply:19576]", "meta": {"from": "journal"}}
{"content": "message 19576 updated", "meta": {"from": "journal"}}
{"content": "message 19576 updated", "meta": {"from": "journal"}}
{"content": "your last message offers choices in prose \u2014 ask through journal question ask \"<one line>\" --set options='[{\"title\": \u2026, \"description\": \u2026}]' --set pick=<n>, so the viewer renders it; your writes wait until you do", "meta": {"from": "journal"}}
{"content": "the reply tag on 19570,19576 did not run \u2014 ! you already answered this in comment 3257: add to that answer with journal comment update 3257 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 19313 \u2014 read it, then journal helper finish 203 once its work is taken or dropped; the todo tag does this in one step \u2014 [!todo=\"the title\"] files it with the turn as its brief; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "1 new message 19578 - answer by opening your turn with [!reply:19578]", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat; rule 45 \u2014 No prose words as names in code - said, says, heard, spoke, told\u2026 \u2014 Messages 1360 and 1698. The user has said more than once that code must not read like prose: a variable, attribute, property or function is named for what it holds or does (text, command, labels, lines), never with a verb from a story. 'says' on the Design type (1360) and 'said = call.said.lower()' in features/recital.py (1698) are the examples. Rule 27 states the naming rule; this one carries the words, so writing one of them whispers it. Before writing a name, ask whether a reader who has never seen the code would know what it holds.", "meta": {"from": "journal"}}
{"content": "fact 13 \u2014 This live session runs the installed copy in .journal/journal.pyz \u2014 The running journal (server, hooks, CLI) runs from .journal/journal.pyz with its viewer and skills in .journal/src, never from the repo. A change in the repo reaches it only through python3 src/journal.py --root .journal upgrade, which packs the zip again. A commit alone changes nothing that is running.", "meta": {"from": "journal"}}
{"content": "to-do 3546 came from message 19578? \u2014 link it: journal message process 19578 \"<their words>\" todo:3546", "meta": {"from": "journal"}}
{"content": "the reply tag on 19578 did not run \u2014 ! you already answered this in comment 3258: add to that answer with journal comment update 3258 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "1 new message 19581 - answer by opening your turn with [!reply:19581]", "meta": {"from": "journal"}}
{"content": "command message reply is slower than its budget \u2014 100ms last (57ms of it working), against a budget of 50ms. Seen 68 times.", "meta": {"from": "journal"}}
{"content": "the reply tag on 19581 did not run \u2014 ! you already answered this in comment 3259: add to that answer with journal comment update 3259 rather than a second reply - add what is missing to the tag itself; hook POST /api/hook/claude is slower than its budget \u2014 239ms last (61ms of it working, 1494ms collecting garbage, then 147ms more after it answered), against a budget of 50ms. Seen 3097 times.", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19557 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 19588 - answer by opening your turn with [!reply:19588]", "meta": {"from": "journal"}}
{"content": "request POST /api/main/message is slower than its budget \u2014 374ms last (78ms of it working, 1616ms collecting garbage, then 189ms more after it answered), against a budget of 50ms. Seen 28 times.; fact 18 \u2014 cProfile inflates the slow-request profiles about tenfold \u2014 The faults feature writes a profile when a request passes its budget, and the profile is taken with cProfile, which adds per-call overhead. On 2026-09-22 /api/summary profiled at 58ms with 48ms inside Resource.fork's deep copy; with the profiler off the same call ran in 2 to 7ms. Read the profile for where the time goes in relative terms, then time the call with curl before changing anything.", "meta": {"from": "journal"}}
{"content": "1 new message 19592 - answer by opening your turn with [!reply:19592]", "meta": {"from": "journal"}}
{"content": "fact 23 \u2014 Every upgrade brings system sequences and their triggers in line\u2026 \u2014 install.py runs ship_sequences after the migrations on each upgrade, so features/sequences/shipped.py is the whole source: change its wording and the next upgrade updates every journal, no migration needed. Shipped rows carry system=True and are read-only for everyone but SYSTEM (controllers/base.py _shipped).", "meta": {"from": "journal"}}
{"content": "the reply tag on 19588,19592 did not run \u2014 ! you already answered this in comment 3260: add to that answer with journal comment update 3260 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19552 \u2014 read it, then journal helper finish 200 once its work is taken or dropped; helper 196, Leslie Lamportson, reported in message 19486 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 19595 - answer by opening your turn with [!reply:19595]", "meta": {"from": "journal"}}
{"content": "rule 27 \u2014 Name a declaration with the word a reader already knows \u2014 An attribute, a variable or a field gets the ordinary programming word for what it holds, not an evocative one. was, heard and alone were poetry; aliases, notify_actions and urgent_actions are what they are. The test: could a reader who has never seen this codebase guess what it holds from the name alone? Prose belongs in the help text and the abstract, where it is read as prose. This does not license abbreviations \u2014 a plain word in full, not a short one.", "meta": {"from": "journal"}}
{"content": "fact 25 \u2014 A designer's install packs the whole tree, half-done server edits\u2026 \u2014 2026-09-25: Eames and Saul run python3 src/journal.py --root .journal upgrade after their viewer builds; it packs every file in src, so a server handler I was halfway through writing went live and raised on every PostToolUse hook. While designers work in parallel, keep server edits whole between tool calls (write and test in the scratchpad first), and reinstall after reverting anything.; fact 28 \u2014 The designer agent type exists, so design work goes to a subagent \u2014 Since 2026-10-01 .claude/agents/designer.md (Dieter, Opus, Claude Design tools, read-only on the repository) is an agent type; rule 56 says design is a subagent's job, never a helper's.; law L1 \u2014 Every subagent dispatch names its model and chooses the least\u2026 \u2014 Use a fast, economical model for mechanical work with a known answer, a capable general model for careful implementation, and the strongest model only when the task turns on difficult judgement. Inheriting the orchestrator's model is not a model choice. If the dispatch API cannot accept a model, that operation is exempt.; law L2 \u2014 Every subagent is bound to a concrete job; never dispatch a generic\u2026 \u2014 Use the most specific available agent type whose declared purpose matches the assignment. On providers without agent types, give the dispatch a concrete task name and bounded prompt. If no suitable specialization exists, keep the work in the main agent instead of manufacturing an unscoped helper.; law L4 \u2014 Related work goes back to the helper or subagent that already worked\u2026 \u2014 A helper or subagent that drew a design, wrote the code or ran the research keeps what it learned. When new work changes its work, is related to it or touches the same code, send it there with a message (SendMessage, journal helper say) rather than dispatching a new one that has to rediscover everything; start fresh only when the earlier one is gone or the new work is unrelated.; law L5 \u2014 Every subagent dispatch names the agent - a human name, a little\u2026 \u2014 A name is how the user and the chat tell subagents apart and how they are messaged later; an id or a task line is not a name. Start the dispatch's description with the name, a colon, then the task, such as \"Dr. Einstein: profile the slow hooks\" or \"Coco Rams: draw the plan card\". A designer can borrow from famous designers, a researcher from famous scientists, mixed up for fun.; rule 58 \u2014 A design runs three critique rounds, then is built on a branch \u2014 Messages 17276 and 17281 (2026-10-06): the norm is a three-round cycle. Round by round, the designer designs (or revises), separate critic agents review the design through their lenses (the critic agent type, .claude/agents/critic.md: read-only, with a browser; one per lens, such as first-time, native, words and parity), and the designer adjusts it to their findings; three rounds in all. The three rounds stand in for the user's approval of the design: the user does not approve it. After the third round the design is built on a branch of its own, which ends in a pull request that waits for the user's approval (rule 61). Replaces message 15725's prototype approval.; rule 63 \u2014 A small design is drawn once and the user approves it, with no\u2026 \u2014 The user, messages 17628 and 17629 (2026-10-07), about the tooltip and waiting-status designs: 'This design round doesn't really need multiple rounds... I just want the designer agent to design it, and I will approve it.' Rule 58's three critique rounds are for large designs such as the phone app; a small one (a tooltip, a status word, one control) is drawn once by the designer, the link goes to the user, and it is built once the user approves it.", "meta": {"from": "journal"}}
{"content": "to-do 3548 came from message 19595? \u2014 link it: journal message process 19595 \"<their words>\" todo:3548", "meta": {"from": "journal"}}
{"content": "the reply tag on 19595 did not run \u2014 ! you already answered this in comment 3261: add to that answer with journal comment update 3261 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 19313 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 19600 - answer by opening your turn with [!reply:19600]", "meta": {"from": "journal"}}
{"content": "the reply tag on 19600 did not run \u2014 ! you already answered this in comment 3262: add to that answer with journal comment update 3262 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19557 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19552 \u2014 read it, then journal helper finish 200 once its work is taken or dropped; helper 196, Leslie Lamportson, reported in message 19486 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 39 \u2014 Use only registered exclamation response tags \u2014 A tag like [!reply:12] runs a command, and only the tags in the tags.runs setting are registered. An invented tag does nothing and shows as raw text in the chat. Use the registered ones (reply, log, end, todo, fact, rule) and nothing else.", "meta": {"from": "journal"}}
{"content": "rule 51 \u2014 Every finished feature is committed, pushed and released with a new\u2026 \u2014 Message 9207 (2026-09-24): when a new feature is ready, commit, push and publish a new tag. This is the user's standing word for releasing, so rule 44's only-when-the-user-says is met by it for finished features; fixes in between wait for the next feature or a patch the user asks for.; rule 57 \u2014 Never merge the overnight refactor into main before its pull request\u2026 \u2014 Messages 15005, 15006, 15109, 15110 (2026-10-04): all refactor work goes on branch overnight-refactor and reaches the user as one pull request, which they read in the morning; nothing of it is merged into main until they say so. Hotfixes the user explicitly asks for go to main at once and are merged into the branch.; rule 61 \u2014 Features wait as pull requests until approved; only hotfixes merge\u2026 \u2014 Message 17118 (2026-10-06), after the overnight refactor merged as 2.252.0: start new work in a new branch, do not merge, write the pull request. Every pull request or new feature is parked until the user approves it. Hotfixes can be merged into main immediately (by a dispatched agent in a worktree of main, rule 60).; rule 64 \u2014 A finished feature is merged into main without waiting for approval \u2014 The user, message 17815 (2026-10-07): 'make sure that no pull requests are lingering on the repository. You may merge them into main... You are allowed to merge everything into main once the feature is completed.' This replaces rule 61's wait for approval: a feature still goes on its own branch, and once it is complete, tested and its whole suite passes, it is merged into main and released, and no pull request is left open.; law L3 \u2014 Read narrowly - grep for the line, sed a range, head the file; never\u2026 \u2014 Everything a tool returns stays in the context for good and is paid for on every turn after it. Search before you read, read the range you need, and cap output with grep, head or tail. Read a whole file only when you need all of it.", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 1077ms last (53ms of it working, 1763ms collecting garbage, then 6ms more after it answered), against a budget of 50ms. Seen 67 times.", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 19313 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "request GET /api/main/helper is slower than its budget \u2014 312ms last (68ms of it working, 1791ms collecting garbage, then 4ms more after it answered), against a budget of 50ms. Seen 61 times.", "meta": {"from": "journal"}}
{"content": "request GET /api/main/todo is slower than its budget \u2014 2976ms last (135ms of it working, 1780ms collecting garbage, then 732ms more after it answered), against a budget of 50ms. Seen 7 times.", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19557 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19629 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19635 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat; helper 196, Leslie Lamportson, reported in message 19486 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "request GET /api/main/comment is slower than its budget \u2014 783ms last (52ms of it working, 1854ms collecting garbage, then 15ms more after it answered), against a budget of 50ms. Seen 2 times.; request GET /api/manifest is slower than its budget \u2014 416ms last (63ms of it working, 1854ms collecting garbage, then 4ms more after it answered), against a budget of 50ms. Seen 33 times.", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 19313 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 19659 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 19669 - answer by opening your turn with [!reply:19669]", "meta": {"from": "journal"}}
{"content": "1 new message 19681 - answer by opening your turn with [!reply:19681]", "meta": {"from": "journal"}}
{"content": "rule 38 \u2014 Never change the git branch until the user says so, by name \u2014 The work happens on the branch the user named. That was main until message 5929 and question 80 (2026-09-23), which moved the sins work to the branch sins. Do not create, switch to or merge any other branch unless the user names it in their own words.; 1 new message 19682 - answer by opening your turn with [!reply:19682]", "meta": {"from": "journal"}}
{"content": "rule 35 \u2014 Write clean code - one funnel per kind of operation, never the same\u2026 \u2014 Every kind of operation has one funnel: one method that creates, one that saves, one that refuses, one that formats. A second method that does the same thing under another name splits the behaviour, and the two drift apart. Before writing a method, search for the one that already does it and extend that. scripts/checks/funnels.py finds bodies written twice.; rule 55 \u2014 Always dispatch Codex helpers on gpt-6-sol \u2014 The user's word, message 13431: switch the codex agents to GPT-6-Sol and make it their default. ~/.codex/config.toml names it as the default model too.; rule 56 \u2014 Helpers are for work that writes; subagents read, research and design \u2014 The user, message 13464: there must be a clear distinction. A subagent can be dispatched for anything read-only: research, review, design. A helper is for actual work that writes, best in its own worktree when the work is separate. Dieter designing in Claude Design should have been a subagent, not a helper.", "meta": {"from": "journal"}}
{"content": "command message reply is slower than its budget \u2014 199ms last (100ms of it working, 7ms collecting garbage, 2ms waiting on locks), against a budget of 50ms. Seen 70 times.", "meta": {"from": "journal"}}
{"content": "the reply tag on 19669,19681,19682 did not run \u2014 ! you already answered this in comment 3263: add to that answer with journal comment update 3263 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "1 new message 19685 - answer by opening your turn with [!reply:19685]", "meta": {"from": "journal"}}
{"content": "your message 19687 names 19681 without saying what they are \u2014 put the type before each number, like message 1712 or to-do 644, so the chat links it: journal message edit 19687 \"<the text>\"", "meta": {"from": "journal"}}
{"content": "answer message 19685 before you write anything \u2014 answer by opening your turn with [!reply:19685]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "plan 28 updated", "meta": {"from": "journal"}}
{"content": "auto mode is on and work 2213 stands still while todo 3246 is ready \u2014 if work 2213 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3246. Stop only when nothing ready is left.", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19690 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "auto mode is on and work 2213 stands still while todo 3536 is ready \u2014 if work 2213 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3536. Stop only when nothing ready is left.", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19693 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "fact 9 \u2014 Every public method on a controller becomes a journal command \u2014 The CLI is generated from the controllers: each public method of Controller, or of a typed controller, turns into journal <noun> <method>. A helper added to the base class therefore becomes a command on every type \u2014 which is how journal <type> handled and journal <type> refuse came to exist, from the CRUD funnel and the refusal funnel. An internal helper on a controller is named with a leading underscore, as _shaped and _status already are, or it ships as a command nobody meant.; fact 34 \u2014 A hooks list in a checkout's .claude/settings.json stops every\u2026 \u2014 Seen 2026-10-08: since commit 707a82915 the committed .claude/settings.json held {\"hooks\": []}; current Claude Code answers a hooks value that is not an object with a SettingsWarning dialog, which a headless helper cannot answer, so helpers 183 and 184 exited before doing anything (their launch logs in .journal/runtime/launches/ show it). This repository's journal hooks live in settings.local.json; the committed settings.json stays {}.; rule 36 \u2014 Clean, DRY, idiomatic before it is committed, never after it is\u2026 \u2014 The user should never be the one who finds duplication, dead code, a clumsy name or a pattern the codebase does not use. Read the diff before every commit as a reviewer would, and fix what is not clean then, not in a follow-up after a complaint.; rule 65 \u2014 Run only new and affected tests while working; the whole suite only\u2026 \u2014 The user, messages 17914 to 17917 (2026-10-07): 'stop running the whole test suite and wasting my time... please only run the new or affected tests, and then, whenever you are merging to main or publishing to main, you can run the full test suite.' Replaces rule 41's whole suite before every commit: on a feature branch, run the tests beside what changed (journal check touched, or the feature's test.py and the browser scenarios it touches); the whole suite runs once, before a merge into main and its release.; rule 67 \u2014 Never answer a journal line in the chat; act on it silently \u2014 The user, messages 19360 and 19365: the agent kept writing chat lines in reply to the journal's own reminders (old helper reports, notices), filling the user's chat with noise. A journal line is an instruction to the agent, not a message: act on it and write nothing, unless the user needs to know something (a failure, a finished piece of work, a decision that waits on them). The journal itself should enforce it, not a local reminder.", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 19696 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "auto mode is on and work 2213 stands still while todo 3545 is ready \u2014 if work 2213 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3545. Stop only when nothing ready is left.", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19702 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "the user approved plan 30, Integrations, starting with Linear - start it \u2014 journal plan start 30 makes it active and parks a plan that runs; then work its first phase's rows in order; plan 30 updated", "meta": {"from": "journal"}}
{"content": "1 new message 19703 - answer by opening your turn with [!reply:19703]", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread message 19703", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 19659 \u2014 read it, then journal helper finish 203 once its work is taken or dropped; sequence 27, Checking the instruction files, step 1 of 3 - Read the\u2026 \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 27. Read AGENTS.md and CLAUDE.md at the project root and the journal's block at the head of each, narrowly: grep for the headings, then sed the sections you need. Note every place where two of them tell an agent opposite things, with the file and line on both sides. Then journal sequence next 27 --about <ref>.; sequence 27, Checking the instruction files, is still at step 1 of 3 - carry\u2026 \u2014 finishing it comes before anything else; do the step now, Read the instruction files: Read AGENTS.md and CLAUDE.md at the project root and the journal's block at the head of each, narrowly: grep for the headings, then sed the sections you need. Note every place where two of them tell an agent opposite things, with the file and line on both sides. Then journal sequence next 27 --about <ref>.; message 17229 file IMG_1159.png needs tags \u2014 inspect the attachment, then journal message tag 17229 \"IMG_1159.png\" \"<a few words describing what it shows>\"; message 17246 file IMG_1163.png needs tags \u2014 inspect the attachment, then journal message tag 17246 \"IMG_1163.png\" \"<a few words describing what it shows>\"; message 17302 file IMG_1172.png needs tags \u2014 inspect the attachment, then journal message tag 17302 \"IMG_1172.png\" \"<a few words describing what it shows>\"; message 17380 file IMG_1173.png needs tags \u2014 inspect the attachment, then journal message tag 17380 \"IMG_1173.png\" \"<a few words describing what it shows>\"; message 17397 file IMG_1175.png needs tags \u2014 inspect the attachment, then journal message tag 17397 \"IMG_1175.png\" \"<a few words describing what it shows>\"; message 17848 file Screenshot 2026-10-07 at 19.08.54.png needs tags \u2014 inspect the attachment, then journal message tag 17848 \"Screenshot 2026-10-07 at 19.08.54.png\" \"<a few words describing what it shows>\"; message 18311 file Screenshot 2026-10-08 at 15.32.11.png needs tags \u2014 inspect the attachment, then journal message tag 18311 \"Screenshot 2026-10-08 at 15.32.11.png\" \"<a few words describing what it shows>\"; message 18337 file Screenshot 2026-10-08 at 15.48.03.png needs tags \u2014 inspect the attachment, then journal message tag 18337 \"Screenshot 2026-10-08 at 15.48.03.png\" \"<a few words describing what it shows>\"; message 18400 file Screenshot 2026-10-08 at 16.20.05.png needs tags \u2014 inspect the attachment, then journal message tag 18400 \"Screenshot 2026-10-08 at 16.20.05.png\" \"<a few words describing what it shows>\"; message 18406 file Screenshot 2026-10-08 at 16.24.17.png needs tags \u2014 inspect the attachment, then journal message tag 18406 \"Screenshot 2026-10-08 at 16.24.17.png\" \"<a few words describing what it shows>\"; message 18579 file Screenshot 2026-10-08 at 17.51.57.png needs tags \u2014 inspect the attachment, then journal message tag 18579 \"Screenshot 2026-10-08 at 17.51.57.png\" \"<a few words describing what it shows>\"; the journal is ready on main \u2014 say hello in the chat in plain words, so the journal's messages reach you", "meta": {"from": "journal"}}
{"content": "fact 13 \u2014 This live session runs the installed copy in .journal/journal.pyz \u2014 The running journal (server, hooks, CLI) runs from .journal/journal.pyz with its viewer and skills in .journal/src, never from the repo. A change in the repo reaches it only through python3 src/journal.py --root .journal upgrade, which packs the zip again. A commit alone changes nothing that is running.; fact 24 \u2014 An answer followed by tool calls can be missing from Claude's\u2026 \u2014 Seen 2026-09-24 for messages 9391-9404: text blocks opening with [!reply:n] that were followed by tool calls never appeared in the session's jsonl (only thinking and tool_use rows did), so the journal never saw them and the replies were lost. When a turn goes on after answering, send the answer with journal message reply <n> \"<text>\" instead of the tag.; rule 46 \u2014 Only commit and push once the whole journal is proven to boot \u2014 Messages 2178 and 2179. A release that has not been started for real can crash every project that installs it, as 2.78.3 did for Codex and 2.84.0 did to project records. Before every commit and push: the full suite passes, including tests/test_it_boots.py, which installs a packed copy into a fresh project, launches Claude and Codex from it, writes a project record, upgrades again and checks the record survives. When a change touches launching, installing or upgrading, also start a real journal in a scratch project and close it properly afterwards, leaving no process behind.", "meta": {"from": "journal"}}
{"content": "request POST /api/run (message reply) is slower than its budget \u2014 751ms last (97ms of it working, 2025ms collecting garbage, then 122ms more after it answered), against a budget of 50ms. Seen 25 times.", "meta": {"from": "journal"}}
{"content": "sequence 27, Checking the instruction files, step 2 of 3 - Report any\u2026 \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 27. With nothing found, say so in one plain line and move on. Otherwise journal report create \"Contradictions in the instruction files\" --brief \"<each one: both sides with file and line, which should win and why>\". Then journal sequence next 27 --about <ref>.", "meta": {"from": "journal"}}
{"content": "sequence 27, Checking the instruction files, step 3 of 3 - Suggest a fix for\u2026 \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 27. File each fix as a suggestion whose brief holds the exact change, as a diff: journal suggestion suggest \"<the change>\" --brief \"<why, and the diff>\". Never edit the files yourself; the user accepts a suggestion first, and the journal's block is only ever written by the journal. When an accepted fix comes back as a to-do, apply it only where the lines still read as the diff shows; if they changed since, read the files again and propose the fix anew. Finish with journal sequence next 27 --about <ref>.; fact 23 \u2014 Every upgrade brings system sequences and their triggers in line\u2026 \u2014 install.py runs ship_sequences after the migrations on each upgrade, so features/sequences/shipped.py is the whole source: change its wording and the next upgrade updates every journal, no migration needed. Shipped rows carry system=True and are read-only for everyone but SYSTEM (controllers/base.py _shipped).", "meta": {"from": "journal"}}
{"content": "rule 37 \u2014 Close every to-do explicitly with todo done or a Journal commit\u2026 \u2014 Ending work does not close its row. A to-do is closed by journal todo done <n> --how, or by a commit whose message carries Journal: todos done <n> at column 0, several numbers separated by commas. A row left open after its work landed misleads the next session and auto mode.", "meta": {"from": "journal"}}
{"content": "fact 28 \u2014 The designer agent type exists, so design work goes to a subagent \u2014 Since 2026-10-01 .claude/agents/designer.md (Dieter, Opus, Claude Design tools, read-only on the repository) is an agent type; rule 56 says design is a subagent's job, never a helper's.; rule 48 \u2014 The viewer is built from its component library, and pages only\u2026 \u2014 Message 4258. Every visual piece the viewer shows more than once, or that a user would recognise as the same kind of thing (a dialog, a side panel or inspector, a dropdown, a list row, a switch, a button), is one component in web/src/kit, extracted aggressively, and every page composes those components instead of building its own copy. Before writing markup or styles in a page, look for the kit component that already does it and extend it with a prop; a second hand-built version is a bug. The side panel that animated in but not out, while a separate skill panel did both, is the example.; rule 66 \u2014 The journal never slows the agent down \u2014 The user, message 18990, after hooks timed out and waited on locks under load: the journal must never, ever decrease the performance of an agent. A hook answers at once with what decides the tool call; everything else runs after, in the background, and reaches the agent as a message. No hook waits on a lock it does not need.", "meta": {"from": "journal"}}
{"content": "plan 30 updated", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 19707 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 19709 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19693 \u2014 read it, then journal helper finish 205 once its work is taken or dropped; Ingrid's final whole-suite run of release-265 came back - Ingrid Mergewell\u2026", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19711 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 41 \u2014 Keep moving, run the whole suite before every commit, never wait \u2014 The full suite runs in about seven seconds: .venv/bin/python -m pytest -q --timeout=300 -n auto. Run it before every commit instead of picking tests by name. Group rows that sit in the same code into one sitting: write them all, test once, commit once. And never wait, not for a subagent, a build, or an answer you can carry on without. Dispatch it and keep working. If you truly are waiting on something, say so in the work log.", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19702 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 19718 - answer by opening your turn with [!reply:19718]", "meta": {"from": "journal"}}
{"content": "request POST /api/main/message is slower than its budget \u2014 919ms last (68ms of it working, 2287ms collecting garbage, then 1207ms more after it answered), against a budget of 50ms. Seen 29 times.", "meta": {"from": "journal"}}
{"content": "request GET /api/main/helper is slower than its budget \u2014 315ms last (68ms of it working, 2310ms collecting garbage, then 3ms more after it answered), against a budget of 50ms. Seen 63 times.", "meta": {"from": "journal"}}
{"content": "command todo search is slower than its budget \u2014 211ms last (76ms of it working), against a budget of 50ms. Seen 9 times.; request POST /api/run (todo search) is slower than its budget \u2014 242ms last (104ms of it working, 2311ms collecting garbage, then 10ms more after it answered), against a budget of 50ms. Seen 4 times.", "meta": {"from": "journal"}}
{"content": "fact 25 \u2014 A designer's install packs the whole tree, half-done server edits\u2026 \u2014 2026-09-25: Eames and Saul run python3 src/journal.py --root .journal upgrade after their viewer builds; it packs every file in src, so a server handler I was halfway through writing went live and raised on every PostToolUse hook. While designers work in parallel, keep server edits whole between tool calls (write and test in the scratchpad first), and reinstall after reverting anything.; rule 49 \u2014 A dialog whose content grows keeps one fixed height, and its content\u2026 \u2014 Message 5361, after asking more than once: a dialog that shows output as it arrives (install, update, logs) opens at its final height and never jumps; only its content scrolls.", "meta": {"from": "journal"}}
{"content": "Is rule 68 a ruling for the whole project? \u2014 rule 68, \"The orchestrator approves the designer's designs itself\", binds every environment of the project. Keep it only if it is a ruling for all of them, worded as one (\"Always ...\", \"Never ...\"). If it is about this environment or its current work, strike it with journal rule strike 68 --how \"<why>\" and file it here as a fact or a reminder instead.", "meta": {"from": "journal"}}
{"content": "rule 68 \u2014 The orchestrator approves the designer's designs itself \u2014 Message 19718 (and 18972): whenever a designer subagent is sent out, here or on a remote, the orchestrator makes the final call on whether the design is right and approves it; it never waits for the user to. This replaces the user-approval step in rule 63, which only the user can strike.", "meta": {"from": "journal"}}
{"content": "the reply tag on 19718 did not run \u2014 ! you already answered this in comment 3265: add to that answer with journal comment update 3265 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 19707 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 19723 - answer by opening your turn with [!reply:19723]", "meta": {"from": "journal"}}
{"content": "rule 52 \u2014 A chat mark for something the user did sits on the user's side \u2014 Message 10960 (2026-09-25): marks for the user's own actions, such as answering a question, are right-aligned like the user's messages. A mark is put there by giving its card side=user.", "meta": {"from": "journal"}}
{"content": "fact 9 \u2014 Every public method on a controller becomes a journal command \u2014 The CLI is generated from the controllers: each public method of Controller, or of a typed controller, turns into journal <noun> <method>. A helper added to the base class therefore becomes a command on every type \u2014 which is how journal <type> handled and journal <type> refuse came to exist, from the CRUD funnel and the refusal funnel. An internal helper on a controller is named with a leading underscore, as _shaped and _status already are, or it ships as a command nobody meant.; fact 34 \u2014 A hooks list in a checkout's .claude/settings.json stops every\u2026 \u2014 Seen 2026-10-08: since commit 707a82915 the committed .claude/settings.json held {\"hooks\": []}; current Claude Code answers a hooks value that is not an object with a SettingsWarning dialog, which a headless helper cannot answer, so helpers 183 and 184 exited before doing anything (their launch logs in .journal/runtime/launches/ show it). This repository's journal hooks live in settings.local.json; the committed settings.json stays {}.", "meta": {"from": "journal"}}
{"content": "your last message ran its paragraphs together \u2014 a blank line between parts is what makes a message readable: one thought to a paragraph; command message reply is slower than its budget \u2014 411ms last (113ms of it working), against a budget of 50ms. Seen 72 times.", "meta": {"from": "journal"}}
{"content": "the reply tag on 19723 did not run \u2014 ! you already answered this in comment 3266: add to that answer with journal comment update 3266 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "fact 18 \u2014 cProfile inflates the slow-request profiles about tenfold \u2014 The faults feature writes a profile when a request passes its budget, and the profile is taken with cProfile, which adds per-call overhead. On 2026-09-22 /api/summary profiled at 58ms with 48ms inside Resource.fork's deep copy; with the profiler off the same call ran in 2 to 7ms. Read the profile for where the time goes in relative terms, then time the call with curl before changing anything.; fact 26 \u2014 Claude Code reads agent profiles when a session starts \u2014 Seen 2026-09-26: after the board-filler's profile in .claude/agents gained its steps and the Grep rule, dispatches from the running session still used the old profile (a 3.5-minute first question, shell grep refused); after the session restarted, the same request took 21 seconds with 4 calls. A change to an agent type reaches only sessions started after it is written.; rule 43 \u2014 A request or hook over its budget is fixed before the next release \u2014 Comment 1151 on this rule. When the faults feature reports a request, a hook or a command slower than its budget, file it as a to-do at once. It does not jump ahead of the work in hand, but no version is published while one is still open: profile it, fix it, and verify the new time before the release goes out. The budget is 50ms, because everything runs locally against files.", "meta": {"from": "journal"}}
{"content": "rule 62 \u2014 The voice profile shapes only the agent's chat speech, never code or\u2026 \u2014 The user, message 17620 (2026-10-07): the profile (butler, homie, coach, colleague) must not leak into the code the agent writes or into user-facing text of any application it works on: names, labels, comments, commit messages, docs and briefs written into a project use plain words (helper, subagent). Speaking in the chat in the profile's voice is fine.", "meta": {"from": "journal"}}
{"content": "your last message ran its paragraphs together \u2014 a blank line between parts is what makes a message readable: one thought to a paragraph", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 19709 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "plan 30 updated", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat; auto mode is on and work 2213 stands still while todo 3474 is ready \u2014 if work 2213 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3474. Stop only when nothing ready is left.; request GET /api/main/dashboard is slower than its budget \u2014 1137ms last (76ms of it working, 2461ms collecting garbage, then 3ms more after it answered), against a budget of 50ms. Seen 79 times.", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19735 \u2014 read it, then journal helper finish 200 once its work is taken or dropped; helper 205, Barbara Asyncwell, reported in message 19711 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 54 \u2014 Settings and feature switches are read at boot and on change, never\u2026 \u2014 The user, message 13349: the application boots, determines every feature and setting once, and re-evaluates only when something changes, such as a setting or a plugin. Never lazy-load settings.", "meta": {"from": "journal"}}
{"content": "plan 30 updated", "meta": {"from": "journal"}}
{"content": "rule 60 \u2014 A hotfix is done by a dispatched agent in a worktree of main \u2014 Message 16836 (2026-10-06): the orchestrator cut a worktree under .claude/worktrees for a Codex hotfix, its session moved to a new environment and the user's messages stopped reaching it. The user: when working on a branch and a hotfix comes in, create a worktree of main and dispatch an agent to do that work. The orchestrator stays on its branch and in its environment, and never cds into another checkout.", "meta": {"from": "journal"}}
{"content": "request GET /api/main/comment is slower than its budget \u2014 1549ms last (115ms of it working, 2519ms collecting garbage, then 34ms more after it answered), against a budget of 50ms. Seen 3 times.", "meta": {"from": "journal"}}
{"content": "request GET /api/main/message is slower than its budget \u2014 165ms last (51ms of it working, 2476ms collecting garbage, then 26ms more after it answered), against a budget of 50ms. Seen 1 time.", "meta": {"from": "journal"}}
{"content": "the todo tag does this in one step \u2014 [!todo=\"the title\"] files it with the turn as its brief; it runs only when it opens the last text of your turn; fact 13 \u2014 This live session runs the installed copy in .journal/journal.pyz \u2014 The running journal (server, hooks, CLI) runs from .journal/journal.pyz with its viewer and skills in .journal/src, never from the repo. A change in the repo reaches it only through python3 src/journal.py --root .journal upgrade, which packs the zip again. A commit alone changes nothing that is running.", "meta": {"from": "journal"}}
{"content": "your chat talked about the journal's workings - \"Still waiting\" \u2014 the user sees replies, reactions, pills and reads themselves; say what the work is instead; fact 24 \u2014 An answer followed by tool calls can be missing from Claude's\u2026 \u2014 Seen 2026-09-24 for messages 9391-9404: text blocks opening with [!reply:n] that were followed by tool calls never appeared in the session's jsonl (only thinking and tool_use rows did), so the journal never saw them and the replies were lost. When a turn goes on after answering, send the answer with journal message reply <n> \"<text>\" instead of the tag.; rule 45 \u2014 No prose words as names in code - said, says, heard, spoke, told\u2026 \u2014 Messages 1360 and 1698. The user has said more than once that code must not read like prose: a variable, attribute, property or function is named for what it holds or does (text, command, labels, lines), never with a verb from a story. 'says' on the Design type (1360) and 'said = call.said.lower()' in features/recital.py (1698) are the examples. Rule 27 states the naming rule; this one carries the words, so writing one of them whispers it. Before writing a name, ask whether a reader who has never seen the code would know what it holds.", "meta": {"from": "journal"}}
{"content": "your last message ran its paragraphs together \u2014 a blank line between parts is what makes a message readable: one thought to a paragraph", "meta": {"from": "journal"}}
{"content": "1 new message 19781 - answer by opening your turn with [!reply:19781]", "meta": {"from": "journal"}}
{"content": "rule 27 \u2014 Name a declaration with the word a reader already knows \u2014 An attribute, a variable or a field gets the ordinary programming word for what it holds, not an evocative one. was, heard and alone were poetry; aliases, notify_actions and urgent_actions are what they are. The test: could a reader who has never seen this codebase guess what it holds from the name alone? Prose belongs in the help text and the abstract, where it is read as prose. This does not license abbreviations \u2014 a plain word in full, not a short one.", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 19707 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "request POST /api/main/message is slower than its budget \u2014 1107ms last (65ms of it working, 2611ms collecting garbage, 11ms waiting on locks, then 1060ms more after it answered), against a budget of 50ms. Seen 31 times.; 2 new messages 19785, 19786 - answer each by opening a turn with [!reply:<n>]", "meta": {"from": "journal"}}
{"content": "to-do 3560 came from message 19781? \u2014 link it: journal message process 19781 \"<their words>\" todo:3560; to-do 3561 came from message 19781? \u2014 link it: journal message process 19781 \"<their words>\" todo:3561; to-do 3562 came from message 19781? \u2014 link it: journal message process 19781 \"<their words>\" todo:3562; to-do 3563 came from message 19781? \u2014 link it: journal message process 19781 \"<their words>\" todo:3563; to-do 3564 came from message 19781? \u2014 link it: journal message process 19781 \"<their words>\" todo:3564; to-do 3565 came from message 19781? \u2014 link it: journal message process 19781 \"<their words>\" todo:3565; to-do 3566 came from message 19781? \u2014 link it: journal message process 19781 \"<their words>\" todo:3566; request POST /api/run (message reply) is slower than its budget \u2014 327ms last (76ms of it working, 2641ms collecting garbage, then 625ms more after it answered), against a budget of 50ms. Seen 26 times.", "meta": {"from": "journal"}}
{"content": "1 new message 19787 - answer by opening your turn with [!reply:19787]", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 19709 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 61 \u2014 Features wait as pull requests until approved; only hotfixes merge\u2026 \u2014 Message 17118 (2026-10-06), after the overnight refactor merged as 2.252.0: start new work in a new branch, do not merge, write the pull request. Every pull request or new feature is parked until the user approves it. Hotfixes can be merged into main immediately (by a dispatched agent in a worktree of main, rule 60).; rule 64 \u2014 A finished feature is merged into main without waiting for approval \u2014 The user, message 17815 (2026-10-07): 'make sure that no pull requests are lingering on the repository. You may merge them into main... You are allowed to merge everything into main once the feature is completed.' This replaces rule 61's wait for approval: a feature still goes on its own branch, and once it is complete, tested and its whole suite passes, it is merged into main and released, and no pull request is left open.", "meta": {"from": "journal"}}
{"content": "command message reply is slower than its budget \u2014 537ms last (74ms of it working), against a budget of 50ms. Seen 74 times.", "meta": {"from": "journal"}}
{"content": "the reply tag on 19787 did not run \u2014 ! you already answered this in comment 3269: add to that answer with journal comment update 3269 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19735 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19711 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 694ms last (66ms of it working, 2739ms collecting garbage, then 631ms more after it answered), against a budget of 50ms. Seen 82 times.", "meta": {"from": "journal"}}
{"content": "1 new message 19796 - answer by opening your turn with [!reply:19796]", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 19707 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 42 \u2014 Every user-facing text passes the formatters before it leaves the\u2026 \u2014 Not only a brief. A title, an abstract, an outcome and every section body are read by a person, so each goes through the same formatters on its way to the viewer \u2014 chat turns, activity items, to-do rows, inspector pages, docs alike. One field formatted out of five is not a rule, it is an accident, and it is how a raw tag ended up in the activity list after the tags feature had been stripping them for weeks. When a new field carries words a person reads, it joins the list in the same place.", "meta": {"from": "journal"}}
{"content": "rule 35 \u2014 Write clean code - one funnel per kind of operation, never the same\u2026 \u2014 Every kind of operation has one funnel: one method that creates, one that saves, one that refuses, one that formats. A second method that does the same thing under another name splits the behaviour, and the two drift apart. Before writing a method, search for the one that already does it and extend that. scripts/checks/funnels.py finds bodies written twice.; rule 38 \u2014 Never change the git branch until the user says so, by name \u2014 The work happens on the branch the user named. That was main until message 5929 and question 80 (2026-09-23), which moved the sins work to the branch sins. Do not create, switch to or merge any other branch unless the user names it in their own words.; rule 55 \u2014 Always dispatch Codex helpers on gpt-6-sol \u2014 The user's word, message 13431: switch the codex agents to GPT-6-Sol and make it their default. ~/.codex/config.toml names it as the default model too.; rule 56 \u2014 Helpers are for work that writes; subagents read, research and design \u2014 The user, message 13464: there must be a clear distinction. A subagent can be dispatched for anything read-only: research, review, design. A helper is for actual work that writes, best in its own worktree when the work is separate. Dieter designing in Claude Design should have been a subagent, not a helper.; rule 57 \u2014 Never merge the overnight refactor into main before its pull request\u2026 \u2014 Messages 15005, 15006, 15109, 15110 (2026-10-04): all refactor work goes on branch overnight-refactor and reaches the user as one pull request, which they read in the morning; nothing of it is merged into main until they say so. Hotfixes the user explicitly asks for go to main at once and are merged into the branch.; command todo create is slower than its budget \u2014 310ms last (61ms of it working), against a budget of 50ms. Seen 9 times.; request POST /api/run (todo create) is slower than its budget \u2014 313ms last (63ms of it working, 2827ms collecting garbage, then 468ms more after it answered), against a budget of 50ms. Seen 13 times.", "meta": {"from": "journal"}}
{"content": "the reply tag on 19796 did not run \u2014 ! you already answered this in comment 3270: add to that answer with journal comment update 3270 rather than a second reply - add what is missing to the tag itself; to-do 3569 came from message 19796? \u2014 link it: journal message process 19796 \"<their words>\" todo:3569", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 19709 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19735 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19711 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat; 1 new message 19809 - answer by opening your turn with [!reply:19809]", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 19814 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 51 \u2014 Every finished feature is committed, pushed and released with a new\u2026 \u2014 Message 9207 (2026-09-24): when a new feature is ready, commit, push and publish a new tag. This is the user's standing word for releasing, so rule 44's only-when-the-user-says is met by it for finished features; fixes in between wait for the next feature or a patch the user asks for.", "meta": {"from": "journal"}}
{"content": "fact 25 \u2014 A designer's install packs the whole tree, half-done server edits\u2026 \u2014 2026-09-25: Eames and Saul run python3 src/journal.py --root .journal upgrade after their viewer builds; it packs every file in src, so a server handler I was halfway through writing went live and raised on every PostToolUse hook. While designers work in parallel, keep server edits whole between tool calls (write and test in the scratchpad first), and reinstall after reverting anything.; fact 27 \u2014 Running src/journal.py against the live .journal root starts a\u2026 \u2014 Seen 2026-10-01: with VERSION bumped in the tree, src/journal.py --root .journal saw the live server as another build and started a new one on a new port (8431, 8432), and the user's tabs kept losing connection. Run source builds against a throwaway or demo root (~/projects/demo-crumb/.journal), never the live one, until the release is installed.; law L4 \u2014 Related work goes back to the helper or subagent that already worked\u2026 \u2014 A helper or subagent that drew a design, wrote the code or ran the research keeps what it learned. When new work changes its work, is related to it or touches the same code, send it there with a message (SendMessage, journal helper say) rather than dispatching a new one that has to rediscover everything; start fresh only when the earlier one is gone or the new work is unrelated.; law L5 \u2014 Every subagent dispatch names the agent - a human name, a little\u2026 \u2014 A name is how the user and the chat tell subagents apart and how they are messaged later; an id or a task line is not a name. Start the dispatch's description with the name, a colon, then the task, such as \"Dr. Einstein: profile the slow hooks\" or \"Coco Rams: draw the plan card\". A designer can borrow from famous designers, a researcher from famous scientists, mixed up for fun.", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 19815 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 39 \u2014 Use only registered exclamation response tags \u2014 A tag like [!reply:12] runs a command, and only the tags in the tags.runs setting are registered. An invented tag does nothing and shows as raw text in the chat. Use the registered ones (reply, log, end, todo, fact, rule) and nothing else.", "meta": {"from": "journal"}}
{"content": "1 new message 19816 - answer by opening your turn with [!reply:19816]", "meta": {"from": "journal"}}
{"content": "rule 36 \u2014 Clean, DRY, idiomatic before it is committed, never after it is\u2026 \u2014 The user should never be the one who finds duplication, dead code, a clumsy name or a pattern the codebase does not use. Read the diff before every commit as a reviewer would, and fix what is not clean then, not in a follow-up after a complaint.", "meta": {"from": "journal"}}
{"content": "rule 65 \u2014 Run only new and affected tests while working; the whole suite only\u2026 \u2014 The user, messages 17914 to 17917 (2026-10-07): 'stop running the whole test suite and wasting my time... please only run the new or affected tests, and then, whenever you are merging to main or publishing to main, you can run the full test suite.' Replaces rule 41's whole suite before every commit: on a feature branch, run the tests beside what changed (journal check touched, or the feature's test.py and the browser scenarios it touches); the whole suite runs once, before a merge into main and its release.", "meta": {"from": "journal"}}
{"content": "3 new messages 19818, 19819, 19820 - answer each by opening a turn with [!reply:<n>]", "meta": {"from": "journal"}}
{"content": "fact 30 \u2014 The tunler server refuses TLS for any subdomain without a tunnel \u2014 Seen 2026-10-04 in the server's docker logs (ssh root@tunler.jessegall.nl, container tunler): 'TLS handshake error ... host \"journal-probe.tunler.jessegall.nl\" not allowed'. A made-up subdomain never answers even when the server is healthy; probe https://tunler.jessegall.nl/ for the server itself. Root SSH to the server works.", "meta": {"from": "journal"}}
{"content": "request GET /api/main/helper is slower than its budget \u2014 230ms last (67ms of it working, 41ms collecting garbage, then 410ms more after it answered), against a budget of 50ms. Seen 64 times.", "meta": {"from": "journal"}}
{"content": "request GET /api/manifest is slower than its budget \u2014 89ms last (58ms of it working, 43ms collecting garbage, then 8ms more after it answered), against a budget of 50ms. Seen 34 times.", "meta": {"from": "journal"}}
{"content": "fact 9 \u2014 Every public method on a controller becomes a journal command \u2014 The CLI is generated from the controllers: each public method of Controller, or of a typed controller, turns into journal <noun> <method>. A helper added to the base class therefore becomes a command on every type \u2014 which is how journal <type> handled and journal <type> refuse came to exist, from the CRUD funnel and the refusal funnel. An internal helper on a controller is named with a leading underscore, as _shaped and _status already are, or it ships as a command nobody meant.", "meta": {"from": "journal"}}
{"content": "fact 34 \u2014 A hooks list in a checkout's .claude/settings.json stops every\u2026 \u2014 Seen 2026-10-08: since commit 707a82915 the committed .claude/settings.json held {\"hooks\": []}; current Claude Code answers a hooks value that is not an object with a SettingsWarning dialog, which a headless helper cannot answer, so helpers 183 and 184 exited before doing anything (their launch logs in .journal/runtime/launches/ show it). This repository's journal hooks live in settings.local.json; the committed settings.json stays {}.; law L1 \u2014 Every subagent dispatch names its model and chooses the least\u2026 \u2014 Use a fast, economical model for mechanical work with a known answer, a capable general model for careful implementation, and the strongest model only when the task turns on difficult judgement. Inheriting the orchestrator's model is not a model choice. If the dispatch API cannot accept a model, that operation is exempt.; law L2 \u2014 Every subagent is bound to a concrete job; never dispatch a generic\u2026 \u2014 Use the most specific available agent type whose declared purpose matches the assignment. On providers without agent types, give the dispatch a concrete task name and bounded prompt. If no suitable specialization exists, keep the work in the main agent instead of manufacturing an unscoped helper.", "meta": {"from": "journal"}}
{"content": "1 new message 19823 - answer by opening your turn with [!reply:19823]", "meta": {"from": "journal"}}
{"content": "1 new message 19824 - answer by opening your turn with [!reply:19824]", "meta": {"from": "journal"}}
{"content": "fact 13 \u2014 This live session runs the installed copy in .journal/journal.pyz \u2014 The running journal (server, hooks, CLI) runs from .journal/journal.pyz with its viewer and skills in .journal/src, never from the repo. A change in the repo reaches it only through python3 src/journal.py --root .journal upgrade, which packs the zip again. A commit alone changes nothing that is running.", "meta": {"from": "journal"}}
{"content": "1 new message 19826 - answer by opening your turn with [!reply:19826]", "meta": {"from": "journal"}}
{"content": "rule 46 \u2014 Only commit and push once the whole journal is proven to boot \u2014 Messages 2178 and 2179. A release that has not been started for real can crash every project that installs it, as 2.78.3 did for Codex and 2.84.0 did to project records. Before every commit and push: the full suite passes, including tests/test_it_boots.py, which installs a packed copy into a fresh project, launches Claude and Codex from it, writes a project record, upgrades again and checks the record survives. When a change touches launching, installing or upgrading, also start a real journal in a scratch project and close it properly afterwards, leaving no process behind.", "meta": {"from": "journal"}}
{"content": "the reply tag on 19826 did not run \u2014 ! you already answered this in comment 3276: add to that answer with journal comment update 3276 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19735 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19828 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 19814 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 19815 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "fact 24 \u2014 An answer followed by tool calls can be missing from Claude's\u2026 \u2014 Seen 2026-09-24 for messages 9391-9404: text blocks opening with [!reply:n] that were followed by tool calls never appeared in the session's jsonl (only thinking and tool_use rows did), so the journal never saw them and the replies were lost. When a turn goes on after answering, send the answer with journal message reply <n> \"<text>\" instead of the tag.", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 484ms last (93ms of it working, 286ms collecting garbage, then 1405ms more after it answered), against a budget of 50ms. Seen 92 times.", "meta": {"from": "journal"}}
{"content": "law L3 \u2014 Read narrowly - grep for the line, sed a range, head the file; never\u2026 \u2014 Everything a tool returns stays in the context for good and is paid for on every turn after it. Search before you read, read the range you need, and cap output with grep, head or tail. Read a whole file only when you need all of it.", "meta": {"from": "journal"}}
{"content": "sequence 10, Writing a report, step 1 of 6 - Add the report\u2019s section headings \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 10 --about report:94. Lead with the answer in the report's brief, then put every part you plan on the report before writing any of them: journal report section 94 \"<part>\" \"Being written.\" for each, in order: the evidence, what was already sound, what remains uncertain. Then journal sequence next 10 --about report:94.", "meta": {"from": "journal"}}
{"content": "sequence 10, Writing a report, step 2 of 6 - Write the report\u2019s sections \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 10 --about report:94. Write the parts one at a time and in order with journal report section 94 \"<part>\" \"<body>\"; the user sees each one appear where you are. Then journal sequence next 10 --about report:94.; fact 23 \u2014 Every upgrade brings system sequences and their triggers in line\u2026 \u2014 install.py runs ship_sequences after the migrations on each upgrade, so features/sequences/shipped.py is the whole source: change its wording and the next upgrade updates every journal, no migration needed. Shipped rows carry system=True and are read-only for everyone but SYSTEM (controllers/base.py _shipped).", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19845 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 19846 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 66 \u2014 The journal never slows the agent down \u2014 The user, message 18990, after hooks timed out and waited on locks under load: the journal must never, ever decrease the performance of an agent. A hook answers at once with what decides the tool call; everything else runs after, in the background, and reaches the agent as a message. No hook waits on a lock it does not need.", "meta": {"from": "journal"}}
{"content": "sequence 10, Writing a report, step 3 of 6 - Add the document or report to a\u2026 \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 10 --about report:94. If a collection the user keeps fits what you wrote, add it: journal collection add <collection n> report:94. Look with journal collection all first. When none fits but other documents or reports on the same subject sit in no collection, make one named for the subject with journal collection create \"<subject>\", add this and them, and say so in one line. A row with nothing related gets no collection of its own. Then journal sequence next 10 --about report:94.", "meta": {"from": "journal"}}
{"content": "sequence 10, Writing a report, step 4 of 6 - Link the items behind the\u2026 \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 10 --about report:94. Link the rows it answers or was built on, such as the to-dos, plans, documents, reports or messages it is about, with journal report link 94 \"<row>\" for each. Leave out rows it only mentions in passing. Then journal sequence next 10 --about report:94.", "meta": {"from": "journal"}}
{"content": "sequence 10, Writing a report, step 5 of 6 - Offer the user a next step \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 10 --about report:94. If it asks the user to decide or approve something, give it buttons: journal report update 94 --set buttons='[{\"label\": \"Accept this proposal\", \"say\": \"I accept this proposal\", \"choice\": \"answer\"}, {\"label\": \"Change it first\", \"say\": \"I want changes first\", \"choice\": \"answer\"}]'. A button with say sends those words to you as the user's message; one naming a type, n and action runs that command. Buttons of one decision share a choice, so the others go once one is pressed. Skip this when nothing waits on the user. Then journal sequence next 10 --about report:94.", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat; sequence 10, Writing a report, step 6 of 6 - Tell the user in the chat \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 10 --about report:94. Say in one or two plain lines what it concludes, then its reference on a line of its own, like doc 41 or report 98, never in backticks. Finish with journal sequence next 10 --about report:94.", "meta": {"from": "journal"}}
{"content": "commit 0db48decd closed to-do 3421 \u2014 The rows and the work are done; take the next one.", "meta": {"from": "journal"}}
{"content": "journal: the engine hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. TimeoutError: /Users/jessegall/projects/agent-journal/.journal/.migrations.lock", "meta": {"from": "journal"}}
{"content": "delivering events to plugins hit an error \u2014 journal: delivering events to plugins hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. TimeoutError: /Users/jessegall/projects/agent-journal/.journal/.migrations.lock; your command ran 40s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself; helper 200, Linus Mendwell, reported in message 19735 \u2014 read it, then journal helper finish 200 once its work is taken or dropped; commit d6c9f8535 closed to-do 3419 \u2014 The rows and the work are done; take the next one.; commit da649fdac closed to-do 3416 \u2014 The rows and the work are done; take the next one.; commit 93dc76e74 closed to-do 3420 \u2014 The rows and the work are done; take the next one.", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 19852 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 37 \u2014 Close every to-do explicitly with todo done or a Journal commit\u2026 \u2014 Ending work does not close its row. A to-do is closed by journal todo done <n> --how, or by a commit whose message carries Journal: todos done <n> at column 0, several numbers separated by commas. A row left open after its work landed misleads the next session and auto mode.", "meta": {"from": "journal"}}
{"content": "your command ran 1099816s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself; the user asked to stop Run a long background command to test its Stop button \u2014 run TaskStop with task_id bhu1n40us now; then carry on with the work", "meta": {"from": "journal"}}
{"content": "no journal skill is loaded in this window \u2014 load the journal skill (Skill: journal) before the next write; a compaction emptied it; fact 9 \u2014 Every public method on a controller becomes a journal command \u2014 The CLI is generated from the controllers: each public method of Controller, or of a typed controller, turns into journal <noun> <method>. A helper added to the base class therefore becomes a command on every type \u2014 which is how journal <type> handled and journal <type> refuse came to exist, from the CRUD funnel and the refusal funnel. An internal helper on a controller is named with a leading underscore, as _shaped and _status already are, or it ships as a command nobody meant.", "meta": {"from": "journal"}}
{"content": "fact 13 \u2014 This live session runs the installed copy in .journal/journal.pyz \u2014 The running journal (server, hooks, CLI) runs from .journal/journal.pyz with its viewer and skills in .journal/src, never from the repo. A change in the repo reaches it only through python3 src/journal.py --root .journal upgrade, which packs the zip again. A commit alone changes nothing that is running.; fact 24 \u2014 An answer followed by tool calls can be missing from Claude's\u2026 \u2014 Seen 2026-09-24 for messages 9391-9404: text blocks opening with [!reply:n] that were followed by tool calls never appeared in the session's jsonl (only thinking and tool_use rows did), so the journal never saw them and the replies were lost. When a turn goes on after answering, send the answer with journal message reply <n> \"<text>\" instead of the tag.; fact 34 \u2014 A hooks list in a checkout's .claude/settings.json stops every\u2026 \u2014 Seen 2026-10-08: since commit 707a82915 the committed .claude/settings.json held {\"hooks\": []}; current Claude Code answers a hooks value that is not an object with a SettingsWarning dialog, which a headless helper cannot answer, so helpers 183 and 184 exited before doing anything (their launch logs in .journal/runtime/launches/ show it). This repository's journal hooks live in settings.local.json; the committed settings.json stays {}.; rule 35 \u2014 Write clean code - one funnel per kind of operation, never the same\u2026 \u2014 Every kind of operation has one funnel: one method that creates, one that saves, one that refuses, one that formats. A second method that does the same thing under another name splits the behaviour, and the two drift apart. Before writing a method, search for the one that already does it and extend that. scripts/checks/funnels.py finds bodies written twice.; rule 37 \u2014 Close every to-do explicitly with todo done or a Journal commit\u2026 \u2014 Ending work does not close its row. A to-do is closed by journal todo done <n> --how, or by a commit whose message carries Journal: todos done <n> at column 0, several numbers separated by commas. A row left open after its work landed misleads the next session and auto mode.; rule 38 \u2014 Never change the git branch until the user says so, by name \u2014 The work happens on the branch the user named. That was main until message 5929 and question 80 (2026-09-23), which moved the sins work to the branch sins. Do not create, switch to or merge any other branch unless the user names it in their own words.; rule 43 \u2014 A request or hook over its budget is fixed before the next release \u2014 Comment 1151 on this rule. When the faults feature reports a request, a hook or a command slower than its budget, file it as a to-do at once. It does not jump ahead of the work in hand, but no version is published while one is still open: profile it, fix it, and verify the new time before the release goes out. The budget is 50ms, because everything runs locally against files.; rule 46 \u2014 Only commit and push once the whole journal is proven to boot \u2014 Messages 2178 and 2179. A release that has not been started for real can crash every project that installs it, as 2.78.3 did for Codex and 2.84.0 did to project records. Before every commit and push: the full suite passes, including tests/test_it_boots.py, which installs a packed copy into a fresh project, launches Claude and Codex from it, writes a project record, upgrades again and checks the record survives. When a change touches launching, installing or upgrading, also start a real journal in a scratch project and close it properly afterwards, leaving no process behind.; rule 51 \u2014 Every finished feature is committed, pushed and released with a new\u2026 \u2014 Message 9207 (2026-09-24): when a new feature is ready, commit, push and publish a new tag. This is the user's standing word for releasing, so rule 44's only-when-the-user-says is met by it for finished features; fixes in between wait for the next feature or a patch the user asks for.; rule 55 \u2014 Always dispatch Codex helpers on gpt-6-sol \u2014 The user's word, message 13431: switch the codex agents to GPT-6-Sol and make it their default. ~/.codex/config.toml names it as the default model too.; rule 56 \u2014 Helpers are for work that writes; subagents read, research and design \u2014 The user, message 13464: there must be a clear distinction. A subagent can be dispatched for anything read-only: research, review, design. A helper is for actual work that writes, best in its own worktree when the work is separate. Dieter designing in Claude Design should have been a subagent, not a helper.; rule 57 \u2014 Never merge the overnight refactor into main before its pull request\u2026 \u2014 Messages 15005, 15006, 15109, 15110 (2026-10-04): all refactor work goes on branch overnight-refactor and reaches the user as one pull request, which they read in the morning; nothing of it is merged into main until they say so. Hotfixes the user explicitly asks for go to main at once and are merged into the branch.; rule 61 \u2014 Features wait as pull requests until approved; only hotfixes merge\u2026 \u2014 Message 17118 (2026-10-06), after the overnight refactor merged as 2.252.0: start new work in a new branch, do not merge, write the pull request. Every pull request or new feature is parked until the user approves it. Hotfixes can be merged into main immediately (by a dispatched agent in a worktree of main, rule 60).; rule 64 \u2014 A finished feature is merged into main without waiting for approval \u2014 The user, message 17815 (2026-10-07): 'make sure that no pull requests are lingering on the repository. You may merge them into main... You are allowed to merge everything into main once the feature is completed.' This replaces rule 61's wait for approval: a feature still goes on its own branch, and once it is complete, tested and its whole suite passes, it is merged into main and released, and no pull request is left open.; rule 65 \u2014 Run only new and affected tests while working; the whole suite only\u2026 \u2014 The user, messages 17914 to 17917 (2026-10-07): 'stop running the whole test suite and wasting my time... please only run the new or affected tests, and then, whenever you are merging to main or publishing to main, you can run the full test suite.' Replaces rule 41's whole suite before every commit: on a feature branch, run the tests beside what changed (journal check touched, or the feature's test.py and the browser scenarios it touches); the whole suite runs once, before a merge into main and its release.; rule 66 \u2014 The journal never slows the agent down \u2014 The user, message 18990, after hooks timed out and waited on locks under load: the journal must never, ever decrease the performance of an agent. A hook answers at once with what decides the tool call; everything else runs after, in the background, and reaches the agent as a message. No hook waits on a lock it does not need.", "meta": {"from": "journal"}}
{"content": "the reply tag on 19809,19816 did not run \u2014 ! you already answered this in comment 3271: add to that answer with journal comment update 3271 rather than a second reply - add what is missing to the tag itself; the reply tag on 19826 did not run \u2014 ! you already answered this in comment 3276: add to that answer with journal comment update 3276 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "fact 25 \u2014 A designer's install packs the whole tree, half-done server edits\u2026 \u2014 2026-09-25: Eames and Saul run python3 src/journal.py --root .journal upgrade after their viewer builds; it packs every file in src, so a server handler I was halfway through writing went live and raised on every PostToolUse hook. While designers work in parallel, keep server edits whole between tool calls (write and test in the scratchpad first), and reinstall after reverting anything.", "meta": {"from": "journal"}}
{"content": "fact 27 \u2014 Running src/journal.py against the live .journal root starts a\u2026 \u2014 Seen 2026-10-01: with VERSION bumped in the tree, src/journal.py --root .journal saw the live server as another build and started a new one on a new port (8431, 8432), and the user's tabs kept losing connection. Run source builds against a throwaway or demo root (~/projects/demo-crumb/.journal), never the live one, until the release is installed.; law L1 \u2014 Every subagent dispatch names its model and chooses the least\u2026 \u2014 Use a fast, economical model for mechanical work with a known answer, a capable general model for careful implementation, and the strongest model only when the task turns on difficult judgement. Inheriting the orchestrator's model is not a model choice. If the dispatch API cannot accept a model, that operation is exempt.; law L4 \u2014 Related work goes back to the helper or subagent that already worked\u2026 \u2014 A helper or subagent that drew a design, wrote the code or ran the research keeps what it learned. When new work changes its work, is related to it or touches the same code, send it there with a message (SendMessage, journal helper say) rather than dispatching a new one that has to rediscover everything; start fresh only when the earlier one is gone or the new work is unrelated.; law L5 \u2014 Every subagent dispatch names the agent - a human name, a little\u2026 \u2014 A name is how the user and the chat tell subagents apart and how they are messaged later; an id or a task line is not a name. Start the dispatch's description with the name, a colon, then the task, such as \"Dr. Einstein: profile the slow hooks\" or \"Coco Rams: draw the plan card\". A designer can borrow from famous designers, a researcher from famous scientists, mixed up for fun.; rule 36 \u2014 Clean, DRY, idiomatic before it is committed, never after it is\u2026 \u2014 The user should never be the one who finds duplication, dead code, a clumsy name or a pattern the codebase does not use. Read the diff before every commit as a reviewer would, and fix what is not clean then, not in a follow-up after a complaint.; rule 41 \u2014 Keep moving, run the whole suite before every commit, never wait \u2014 The full suite runs in about seven seconds: .venv/bin/python -m pytest -q --timeout=300 -n auto. Run it before every commit instead of picking tests by name. Group rows that sit in the same code into one sitting: write them all, test once, commit once. And never wait, not for a subagent, a build, or an answer you can carry on without. Dispatch it and keep working. If you truly are waiting on something, say so in the work log.; rule 54 \u2014 Settings and feature switches are read at boot and on change, never\u2026 \u2014 The user, message 13349: the application boots, determines every feature and setting once, and re-evaluates only when something changes, such as a setting or a plugin. Never lazy-load settings.; rule 60 \u2014 A hotfix is done by a dispatched agent in a worktree of main \u2014 Message 16836 (2026-10-06): the orchestrator cut a worktree under .claude/worktrees for a Codex hotfix, its session moved to a new environment and the user's messages stopped reaching it. The user: when working on a branch and a hotfix comes in, create a worktree of main and dispatch an agent to do that work. The orchestrator stays on its branch and in its environment, and never cds into another checkout.", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19863 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 932ms last (255ms of it working, then 11ms more after it answered), against a budget of 50ms. Seen 93 times.", "meta": {"from": "journal"}}
{"content": "plan 30 updated", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19870 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 50 \u2014 Everything the user does is doable in the viewer \u2014 Message 6710 (2026-09-23): the user never uses the CLI, only the UI; everything should be doable from the viewer. The journal commands are for agents; any action meant for the user (making boards, confirming, accepting, hosting, watching an agent) needs its place in the viewer.", "meta": {"from": "journal"}}
{"content": "plan 30 updated", "meta": {"from": "journal"}}
{"content": "work 2214 is still open, with nothing logged \u2014 journal work log 2214 \"<what was decided or done, and why>\" \u2014 then journal work end 2214 --how \"<what landed>\", or journal work park 2214 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "work 2214 is still open \u2014 end it or park it before you stop: journal work end 2214 --how \"<what landed>\", or journal work park 2214 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 19846 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "work 2214, Review the shared and remote journal for gaps, test them, run them\u2026 \u2014 it was parked because: Leslie works the gaps after her members fixes; I take it up again when she reports. journal work resume 2214 picks it up again.", "meta": {"from": "journal"}}
{"content": "work 2214, Review the shared and remote journal for gaps, test them, run them\u2026 \u2014 it was parked because: Leslie works the gaps after her members fixes; I take it up again when she reports. journal work resume 2214 picks it up again.", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 19852 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "work 2214, Review the shared and remote journal for gaps, test them, run them\u2026 \u2014 it was parked because: Leslie works the gaps after her members fixes; I take it up again when she reports. journal work resume 2214 picks it up again.", "meta": {"from": "journal"}}
{"content": "rule 27 \u2014 Name a declaration with the word a reader already knows \u2014 An attribute, a variable or a field gets the ordinary programming word for what it holds, not an evocative one. was, heard and alone were poetry; aliases, notify_actions and urgent_actions are what they are. The test: could a reader who has never seen this codebase guess what it holds from the name alone? Prose belongs in the help text and the abstract, where it is read as prose. This does not license abbreviations \u2014 a plain word in full, not a short one.", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19863 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "plan 30 updated", "meta": {"from": "journal"}}
{"content": "todo 3498 next", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19925 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 68 \u2014 The orchestrator approves the designer's designs itself \u2014 Message 19718 (and 18972): whenever a designer subagent is sent out, here or on a remote, the orchestrator makes the final call on whether the design is right and approves it; it never waits for the user to. This replaces the user-approval step in rule 63, which only the user can strike.; plan 30 updated", "meta": {"from": "journal"}}
{"content": "work 2215 is still open, with nothing logged \u2014 journal work log 2215 \"<what was decided or done, and why>\" \u2014 then journal work end 2215 --how \"<what landed>\", or journal work park 2215 \"<why it waits>\"; fact 23 \u2014 Every upgrade brings system sequences and their triggers in line\u2026 \u2014 install.py runs ship_sequences after the migrations on each upgrade, so features/sequences/shipped.py is the whole source: change its wording and the next upgrade updates every journal, no migration needed. Shipped rows carry system=True and are read-only for everyone but SYSTEM (controllers/base.py _shipped).", "meta": {"from": "journal"}}
{"content": "your chat talked about the journal's workings - \"nothing is waiting\" \u2014 the user sees replies, reactions, pills and reads themselves; say what the work is instead", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "rule 45 \u2014 No prose words as names in code - said, says, heard, spoke, told\u2026 \u2014 Messages 1360 and 1698. The user has said more than once that code must not read like prose: a variable, attribute, property or function is named for what it holds or does (text, command, labels, lines), never with a verb from a story. 'says' on the Design type (1360) and 'said = call.said.lower()' in features/recital.py (1698) are the examples. Rule 27 states the naming rule; this one carries the words, so writing one of them whispers it. Before writing a name, ask whether a reader who has never seen the code would know what it holds.", "meta": {"from": "journal"}}
{"content": "work 2215 is still open \u2014 end it or park it before you stop: journal work end 2215 --how \"<what landed>\", or journal work park 2215 \"<why it waits>\"; request GET /api/main/dashboard is slower than its budget \u2014 125ms last (111ms of it working, then 31ms more after it answered), against a budget of 50ms. Seen 101 times.", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 19846 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "work 2214, Review the shared and remote journal for gaps, test them, run them\u2026 \u2014 it was parked because: Leslie works the gaps after her members fixes; I take it up again when she reports. journal work resume 2214 picks it up again.", "meta": {"from": "journal"}}
{"content": "work 2214, Review the shared and remote journal for gaps, test them, run them\u2026 \u2014 it was parked because: Leslie works the gaps after her members fixes; I take it up again when she reports. journal work resume 2214 picks it up again.", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 19852 \u2014 read it, then journal helper finish 196 once its work is taken or dropped; helper 205, Barbara Asyncwell, reported in message 19958 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 48 \u2014 The viewer is built from its component library, and pages only\u2026 \u2014 Message 4258. Every visual piece the viewer shows more than once, or that a user would recognise as the same kind of thing (a dialog, a side panel or inspector, a dropdown, a list row, a switch, a button), is one component in web/src/kit, extracted aggressively, and every page composes those components instead of building its own copy. Before writing markup or styles in a page, look for the kit component that already does it and extend it with a prop; a second hand-built version is a bug. The side panel that animated in but not out, while a separate skill panel did both, is the example.", "meta": {"from": "journal"}}
{"content": "work 2214, Review the shared and remote journal for gaps, test them, run them\u2026 \u2014 it was parked because: Leslie works the gaps after her members fixes; I take it up again when she reports. journal work resume 2214 picks it up again.", "meta": {"from": "journal"}}
{"content": "helper 206, Margaret Codexton, has done nothing for 20 minutes \u2014 check on it: journal helper say 206 \"<what you want to know>\", or journal helper stop 206 if it is stuck", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 19925 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "the todo tag does this in one step \u2014 [!todo=\"the title\"] files it with the turn as its brief; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 19991 \u2014 read it, then journal helper finish 205 once its work is taken or dropped; rule 42 \u2014 Every user-facing text passes the formatters before it leaves the\u2026 \u2014 Not only a brief. A title, an abstract, an outcome and every section body are read by a person, so each goes through the same formatters on its way to the viewer \u2014 chat turns, activity items, to-do rows, inspector pages, docs alike. One field formatted out of five is not a rule, it is an accident, and it is how a raw tag ended up in the activity list after the tags feature had been stripping them for weeks. When a new field carries words a person reads, it joins the list in the same place.", "meta": {"from": "journal"}}
{"content": "work 2214, Review the shared and remote journal for gaps, test them, run them\u2026 \u2014 it was parked because: Leslie works the gaps after her members fixes; I take it up again when she reports. journal work resume 2214 picks it up again.", "meta": {"from": "journal"}}
{"content": "helper 206, Margaret Codexton, stopped running before it reported \u2014 its agent is gone, so journal helper say cannot reach it. >_ OpenAI Codex (v0.160.1)loadingWhat are we cooking up?\u28c0\u28e4\u28e4\u28e4\u28c0\u28c0\u28e0\u28f6\u28ff\u28ff\u28ff\u28ff\u28ff\u28ff\u28ff\u28ff\u28e6\u28e4\u28e4\u28e4\u28e4\u28e4\u28e4\u2840\u2880\u28fe\u28ff\u28ff\u283f\u280b\u2809\u2809\u2889\u28ed\u28ff\u28ff\u28ff\u28ff\u28ff\u283f\u28ff\u28ff\u28ff\u28ff\u28f7\u28c4\u28c0\u28fe\u28ff\u28ff\u2803\u28c0\u28f4\u28fe\u28ff\u28ff\u287f\u281f\u280b\u28c0\u2840\u2808\u2819\u28bf\u28ff\u28ff\u28e7\u28c0\u28f6\u28ff\u28ff\u28ff\u28ff\u2847\u28b8\u28ff\u28ff\u287f\u281b\u2809\u2880\u28e0\u28f4\u28ff\u28ff\u28ff\u28f7\u28e6\u28c0\u2808\u28bb\u28ff\u28ff\u2847\u28f0\u28ff\u28ff\u287f\u28bf\u28ff\u28ff\u2847\u28b8\u28ff\u28ff\u2880\u28e4\u28f6\u28ff\u28ff\u28ff\u281f\u281b\u283b\u28ff\u28ff\u28ff\u28ff\u28ee\u28ff\u28ff\u2877\u28b0\u28ff\u28ff\u285f\u2801\u28b8\u28ff\u28ff\u2847\u28b8\u28ff\u28ff\u28ff\u28ff\u283f\u283f\u28ff\u28ff\u28ff\u28e6\u28c4\u2840\u2808\u281b\u283f\u28ff\u28ff\u28ff\u28e7\u2840\u28fe\u28ff\u28ff\u2803\u28b8\u28ff\u28ff\u2847\u28b8\u28ff\u28ff\u280b\u2801\u2808\u2819\u28bb\u28ff\u28ff\u28ff\u28f6\u28e4\u2840\u2839\u28bf\u28ff\u28f7\u2844\u28b8\u28ff\u28ff\u28c7\u2838\u28ff\u28ff\u28f7\u28e6\u28fc\u28ff\u28ff\u28b8\u28ff\u28ff\u283b\u28bf\u28ff\u28ff\u2847\u2818\u28ff\u28ff\u28ff\u2808\u28bf\u28ff\u28ff\u28e6\u2840\u2808\u281b\u283f\u28ff\u28ff\u28ff\u28ff\u28c4\u2840\u2880\u28e0\u28fc\u28ff\u28ff\u28ff\u28ff\u2847\u28ff\u28ff\u28ff\u2807\u28bb\u28ff\u28ff\u28ff\u28f7\u28e6\u28c0\u2808\u2819\u283b\u28ff\u28ff\u28ff\u28f6\u28f6\u28ff\u28ff\u28ff\u28ff\u28ff\u28ff\u28ff\u2847\u28e0\u28ff\u28ff\u28ff\u28b8\u28ff\u28ff\u287f\u28bf\u28ff\u28ff\u28ff\u28e6\u28e0\u28f4\u28ff\u28ff\u28ff\u287f\u281f\u280b\u28b8\u28ff\u28ff\u28ff\u28ff\u28f7\u28f4\u28ff\u28ff\u28ff\u2803\u2818\u28ff\u28ff\u28f7\u2808\u281b\u28bf\u28ff\u28ff\u28ff\u283f\u280b\u2809\u28e0\u28f4\u28ff\u28ff\u28ff\u28ff\u28ff\u28ff\u28ff\u28ff\u281f\u2801\u283b\u28ff\u28ff\u28ff\u28e4\u28c0\u2808\u2809\u2880\u28e4\u28f6\u28ff\u28ff\u28ff\u283f\u281f\u2801\u28f0\u28ff\u28ff\u285f\u280b\u2801\u2808\u283f\u28ff\u28ff\u28ff\u28ff\u28f6\u28fe\u28ff\u28ff\u28ff Dispatch the job again, or journal helper finish 206 and do the job yourself", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 19846 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "work 2214, Review the shared and remote journal for gaps, test them, run them\u2026 \u2014 it was parked because: Leslie works the gaps after her members fixes; I take it up again when she reports. journal work resume 2214 picks it up again.", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 20017 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 19852 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 30s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your chat talked about the journal's workings - \"Still waiting\" \u2014 the user sees replies, reactions, pills and reads themselves; say what the work is instead; fact 18 \u2014 cProfile inflates the slow-request profiles about tenfold \u2014 The faults feature writes a profile when a request passes its budget, and the profile is taken with cProfile, which adds per-call overhead. On 2026-09-22 /api/summary profiled at 58ms with 48ms inside Resource.fork's deep copy; with the profiler off the same call ran in 2 to 7ms. Read the profile for where the time goes in relative terms, then time the call with curl before changing anything.; rule 67 \u2014 Never answer a journal line in the chat; act on it silently \u2014 The user, messages 19360 and 19365: the agent kept writing chat lines in reply to the journal's own reminders (old helper reports, notices), filling the user's chat with noise. A journal line is an instruction to the agent, not a message: act on it and write nothing, unless the user needs to know something (a failure, a finished piece of work, a decision that waits on them). The journal itself should enforce it, not a local reminder.; fact 9 \u2014 Every public method on a controller becomes a journal command \u2014 The CLI is generated from the controllers: each public method of Controller, or of a typed controller, turns into journal <noun> <method>. A helper added to the base class therefore becomes a command on every type \u2014 which is how journal <type> handled and journal <type> refuse came to exist, from the CRUD funnel and the refusal funnel. An internal helper on a controller is named with a leading underscore, as _shaped and _status already are, or it ships as a command nobody meant.; fact 34 \u2014 A hooks list in a checkout's .claude/settings.json stops every\u2026 \u2014 Seen 2026-10-08: since commit 707a82915 the committed .claude/settings.json held {\"hooks\": []}; current Claude Code answers a hooks value that is not an object with a SettingsWarning dialog, which a headless helper cannot answer, so helpers 183 and 184 exited before doing anything (their launch logs in .journal/runtime/launches/ show it). This repository's journal hooks live in settings.local.json; the committed settings.json stays {}.; fact 13 \u2014 This live session runs the installed copy in .journal/journal.pyz \u2014 The running journal (server, hooks, CLI) runs from .journal/journal.pyz with its viewer and skills in .journal/src, never from the repo. A change in the repo reaches it only through python3 src/journal.py --root .journal upgrade, which packs the zip again. A commit alone changes nothing that is running.; fact 24 \u2014 An answer followed by tool calls can be missing from Claude's\u2026 \u2014 Seen 2026-09-24 for messages 9391-9404: text blocks opening with [!reply:n] that were followed by tool calls never appeared in the session's jsonl (only thinking and tool_use rows did), so the journal never saw them and the replies were lost. When a turn goes on after answering, send the answer with journal message reply <n> \"<text>\" instead of the tag.", "meta": {"from": "journal"}}
{"content": "todo 3570, Codex helpers keep checking that the journal works for Codex\u2026 \u2014 it is blocked because: The Codex workspace is out of credits (Margaret's launch log, 2026-10-09 00:40); a Codex helper can start again once you refill it. If it is not any more, journal todo unblock 3570. If it waits on a person or a decision, make it a question to them: journal todo ask 3570 \"<who decides what>\" --set options='[...]' --set pick=<n>, and the row waits on their answer. Otherwise tell the user in the chat what it waits on, in their terms, and propose how to clear it.", "meta": {"from": "journal"}}
{"content": "work 2214, Review the shared and remote journal for gaps, test them, run them\u2026 \u2014 it was parked because: Leslie works the gaps after her members fixes; I take it up again when she reports. journal work resume 2214 picks it up again.; helper 200, Linus Mendwell, reported in message 20062 \u2014 read it, then journal helper finish 200 once its work is taken or dropped; plan 30 updated", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "law L3 \u2014 Read narrowly - grep for the line, sed a range, head the file; never\u2026 \u2014 Everything a tool returns stays in the context for good and is paid for on every turn after it. Search before you read, read the range you need, and cap output with grep, head or tail. Read a whole file only when you need all of it.", "meta": {"from": "journal"}}
{"content": "auto mode is on and work 2215 stands still while todo 3507 is ready \u2014 if work 2215 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3507. Stop only when nothing ready is left.; work 2215 is still open \u2014 end it or park it before you stop: journal work end 2215 --how \"<what landed>\", or journal work park 2215 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "rule 40 \u2014 A feature is named for what it is, never for its machinery \u2014 Messages 599, 600 and 703. A feature is a capability the user would name and would think of switching off. File tracking, a write gate, a phrase bank, a tree diff are services used inside a feature, not features of their own: they live in the feature they serve. Before adding a directory under features/, say what the user would call it; if the answer names a mechanism, it belongs inside something else. Report 16 holds the grouping this implies.", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 20064 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "fact 30 \u2014 The tunler server refuses TLS for any subdomain without a tunnel \u2014 Seen 2026-10-04 in the server's docker logs (ssh root@tunler.jessegall.nl, container tunler): 'TLS handshake error ... host \"journal-probe.tunler.jessegall.nl\" not allowed'. A made-up subdomain never answers even when the server is healthy; probe https://tunler.jessegall.nl/ for the server itself. Root SSH to the server works.; plan 30 updated", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 20066 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "fact 25 \u2014 A designer's install packs the whole tree, half-done server edits\u2026 \u2014 2026-09-25: Eames and Saul run python3 src/journal.py --root .journal upgrade after their viewer builds; it packs every file in src, so a server handler I was halfway through writing went live and raised on every PostToolUse hook. While designers work in parallel, keep server edits whole between tool calls (write and test in the scratchpad first), and reinstall after reverting anything.", "meta": {"from": "journal"}}
{"content": "work 2214, Review the shared and remote journal for gaps, test them, run them\u2026 \u2014 it was parked because: Leslie works the gaps after her members fixes; I take it up again when she reports. journal work resume 2214 picks it up again.", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 20071 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 338ms last (103ms of it working, then 11ms more after it answered), against a budget of 50ms. Seen 103 times.", "meta": {"from": "journal"}}
{"content": "work 2214, Review the shared and remote journal for gaps, test them, run them\u2026 \u2014 it was parked because: Leslie works the gaps after her members fixes; I take it up again when she reports. journal work resume 2214 picks it up again.", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 20084 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 19852 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "work 2214, Review the shared and remote journal for gaps, test them, run them\u2026 \u2014 it was parked because: Leslie works the gaps after her members fixes; I take it up again when she reports. journal work resume 2214 picks it up again.", "meta": {"from": "journal"}}
{"content": "your command ran 34s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "work 2215 is still open \u2014 end it or park it before you stop: journal work end 2215 --how \"<what landed>\", or journal work park 2215 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 20064 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 20066 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your chat talked about the journal's workings - \"Still waiting\" \u2014 the user sees replies, reactions, pills and reads themselves; say what the work is instead", "meta": {"from": "journal"}}
{"content": "work 2214, Review the shared and remote journal for gaps, test them, run them\u2026 \u2014 it was parked because: Leslie works the gaps after her members fixes; I take it up again when she reports. journal work resume 2214 picks it up again.", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 20122 \u2014 read it, then journal helper finish 200 once its work is taken or dropped; plan 30 updated", "meta": {"from": "journal"}}
{"content": "rule 52 \u2014 A chat mark for something the user did sits on the user's side \u2014 Message 10960 (2026-09-25): marks for the user's own actions, such as answering a question, are right-aligned like the user's messages. A mark is put there by giving its card side=user.", "meta": {"from": "journal"}}
{"content": "plan 30 updated", "meta": {"from": "journal"}}
{"content": "work 2215 is still open \u2014 end it or park it before you stop: journal work end 2215 --how \"<what landed>\", or journal work park 2215 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "work 2215 is still open \u2014 end it or park it before you stop: journal work end 2215 --how \"<what landed>\", or journal work park 2215 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 20129 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 20133 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "work 2214, Review the shared and remote journal for gaps, test them, run them\u2026 \u2014 it was parked because: Leslie works the gaps after her members fixes; I take it up again when she reports. journal work resume 2214 picks it up again.; chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 203 \"<the next work>\", or journal helper finish 203 once its work is taken", "meta": {"from": "journal"}}
{"content": "todo 3570, Codex helpers keep checking that the journal works for Codex\u2026 \u2014 it is blocked because: The Codex workspace is out of credits (Margaret's launch log, 2026-10-09 00:40); a Codex helper can start again once you refill it. If it is not any more, journal todo unblock 3570. If it waits on a person or a decision, make it a question to them: journal todo ask 3570 \"<who decides what>\" --set options='[...]' --set pick=<n>, and the row waits on their answer. Otherwise tell the user in the chat what it waits on, in their terms, and propose how to clear it.", "meta": {"from": "journal"}}
{"content": "plan 30 updated", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 20135 \u2014 read it, then journal helper finish 200 once its work is taken or dropped; auto mode is on and work 2214 stands still while todo 3514 is ready \u2014 if work 2214 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3514. Stop only when nothing ready is left.", "meta": {"from": "journal"}}
{"content": "plan 30 updated", "meta": {"from": "journal"}}
{"content": "auto mode is on and work 2214 stands still while todo 3518 is ready \u2014 if work 2214 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3518. Stop only when nothing ready is left.", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 20145 \u2014 read it, then journal helper finish 196 once its work is taken or dropped; helper 200, Linus Mendwell, reported in message 20146 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, has stood idle for 12 minutes \u2014 it finished its turn and waits for work: journal helper say 203 \"<the next work>\", or journal helper finish 203 once its work is taken", "meta": {"from": "journal"}}
{"content": "your last message ran its paragraphs together \u2014 a blank line between parts is what makes a message readable: one thought to a paragraph", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 20152 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 20154 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your last message ran its paragraphs together \u2014 a blank line between parts is what makes a message readable: one thought to a paragraph", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, has stood idle for 3 minutes \u2014 it finished its turn and waits for work: journal helper say 203 \"<the next work>\", or journal helper finish 203 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 20064 \u2014 read it, then journal helper finish 205 once its work is taken or dropped; helper 203, Ingrid Mergewell, reported in message 20066 \u2014 read it, then journal helper finish 203 once its work is taken or dropped; Leslie's five feature tests, the Docker run and the integrations test came\u2026", "meta": {"from": "journal"}}
{"content": "work 2214 is still open \u2014 end it or park it before you stop: journal work end 2214 --how \"<what landed>\", or journal work park 2214 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 20163 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 20170 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 203 \"<the next work>\", or journal helper finish 203 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 203 \"<the next work>\", or journal helper finish 203 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 20176 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "the todo tag does this in one step \u2014 [!todo=\"the title\"] files it with the turn as its brief; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "your last message ran its paragraphs together \u2014 a blank line between parts is what makes a message readable: one thought to a paragraph", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 20183 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 203 \"<the next work>\", or journal helper finish 203 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 20152 \u2014 read it, then journal helper finish 200 once its work is taken or dropped; helper 203, Ingrid Mergewell, reported in message 20066 \u2014 read it, then journal helper finish 203 once its work is taken or dropped; helper 205, Barbara Asyncwell, reported in message 20176 \u2014 read it, then journal helper finish 205 once its work is taken or dropped; Leslie's members-gaps branch - the Docker run and her five feature tests came\u2026", "meta": {"from": "journal"}}
{"content": "fact 9 \u2014 Every public method on a controller becomes a journal command \u2014 The CLI is generated from the controllers: each public method of Controller, or of a typed controller, turns into journal <noun> <method>. A helper added to the base class therefore becomes a command on every type \u2014 which is how journal <type> handled and journal <type> refuse came to exist, from the CRUD funnel and the refusal funnel. An internal helper on a controller is named with a leading underscore, as _shaped and _status already are, or it ships as a command nobody meant.; fact 13 \u2014 This live session runs the installed copy in .journal/journal.pyz \u2014 The running journal (server, hooks, CLI) runs from .journal/journal.pyz with its viewer and skills in .journal/src, never from the repo. A change in the repo reaches it only through python3 src/journal.py --root .journal upgrade, which packs the zip again. A commit alone changes nothing that is running.; fact 34 \u2014 A hooks list in a checkout's .claude/settings.json stops every\u2026 \u2014 Seen 2026-10-08: since commit 707a82915 the committed .claude/settings.json held {\"hooks\": []}; current Claude Code answers a hooks value that is not an object with a SettingsWarning dialog, which a headless helper cannot answer, so helpers 183 and 184 exited before doing anything (their launch logs in .journal/runtime/launches/ show it). This repository's journal hooks live in settings.local.json; the committed settings.json stays {}.", "meta": {"from": "journal"}}
{"content": "work 2214 is still open \u2014 end it or park it before you stop: journal work end 2214 --how \"<what landed>\", or journal work park 2214 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "work 2215 is still open \u2014 end it or park it before you stop: journal work end 2215 --how \"<what landed>\", or journal work park 2215 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 20199 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "the 14 feature files on release-267 came back - Run the touched feature tests\u2026", "meta": {"from": "journal"}}
{"content": "work 2215 is still open \u2014 end it or park it before you stop: journal work end 2215 --how \"<what landed>\", or journal work park 2215 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "todo 3518 next", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 20209 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "plan 30 updated", "meta": {"from": "journal"}}
{"content": "fact 25 \u2014 A designer's install packs the whole tree, half-done server edits\u2026 \u2014 2026-09-25: Eames and Saul run python3 src/journal.py --root .journal upgrade after their viewer builds; it packs every file in src, so a server handler I was halfway through writing went live and raised on every PostToolUse hook. While designers work in parallel, keep server edits whole between tool calls (write and test in the scratchpad first), and reinstall after reverting anything.", "meta": {"from": "journal"}}
{"content": "work 2214, Review the shared and remote journal for gaps, test them, run them\u2026 \u2014 it was parked because: Leslie switches the connection feature on in the hosted world test and the Docker script; I rerun both on release-267 when she reports. journal work resume 2214 picks it up again.", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 20217 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your chat talked about the journal's workings - \"To-do 3566 is closed\" \u2014 the user sees replies, reactions, pills and reads themselves; say what the work is instead", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 20226 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 20227 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your message 20230 names 500 without saying what they are \u2014 put the type before each number, like message 1712 or to-do 644, so the chat links it: journal message edit 20230 \"<the text>\"; rule 42 \u2014 Every user-facing text passes the formatters before it leaves the\u2026 \u2014 Not only a brief. A title, an abstract, an outcome and every section body are read by a person, so each goes through the same formatters on its way to the viewer \u2014 chat turns, activity items, to-do rows, inspector pages, docs alike. One field formatted out of five is not a rule, it is an accident, and it is how a raw tag ended up in the activity list after the tags feature had been stripping them for weeks. When a new field carries words a person reads, it joins the list in the same place.; work 2214 is still open \u2014 end it or park it before you stop: journal work end 2214 --how \"<what landed>\", or journal work park 2214 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 20234 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 20236 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 20066 \u2014 read it, then journal helper finish 203 once its work is taken or dropped; the sync, secrets and Docker run and the integrations browser scenario came\u2026", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 20240 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 20241 \u2014 read it, then journal helper finish 205 once its work is taken or dropped; fact 24 \u2014 An answer followed by tool calls can be missing from Claude's\u2026 \u2014 Seen 2026-09-24 for messages 9391-9404: text blocks opening with [!reply:n] that were followed by tool calls never appeared in the session's jsonl (only thinking and tool_use rows did), so the journal never saw them and the replies were lost. When a turn goes on after answering, send the answer with journal message reply <n> \"<text>\" instead of the tag.; rule 27 \u2014 Name a declaration with the word a reader already knows \u2014 An attribute, a variable or a field gets the ordinary programming word for what it holds, not an evocative one. was, heard and alone were poetry; aliases, notify_actions and urgent_actions are what they are. The test: could a reader who has never seen this codebase guess what it holds from the name alone? Prose belongs in the help text and the abstract, where it is read as prose. This does not license abbreviations \u2014 a plain word in full, not a short one.; rule 48 \u2014 The viewer is built from its component library, and pages only\u2026 \u2014 Message 4258. Every visual piece the viewer shows more than once, or that a user would recognise as the same kind of thing (a dialog, a side panel or inspector, a dropdown, a list row, a switch, a button), is one component in web/src/kit, extracted aggressively, and every page composes those components instead of building its own copy. Before writing markup or styles in a page, look for the kit component that already does it and extend it with a prop; a second hand-built version is a bug. The side panel that animated in but not out, while a separate skill panel did both, is the example.", "meta": {"from": "journal"}}
{"content": "work 2214 is still open \u2014 end it or park it before you stop: journal work end 2214 --how \"<what landed>\", or journal work park 2214 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 20244 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 41 \u2014 Keep moving, run the whole suite before every commit, never wait \u2014 The full suite runs in about seven seconds: .venv/bin/python -m pytest -q --timeout=300 -n auto. Run it before every commit instead of picking tests by name. Group rows that sit in the same code into one sitting: write them all, test once, commit once. And never wait, not for a subagent, a build, or an answer you can carry on without. Dispatch it and keep working. If you truly are waiting on something, say so in the work log.; rule 65 \u2014 Run only new and affected tests while working; the whole suite only\u2026 \u2014 The user, messages 17914 to 17917 (2026-10-07): 'stop running the whole test suite and wasting my time... please only run the new or affected tests, and then, whenever you are merging to main or publishing to main, you can run the full test suite.' Replaces rule 41's whole suite before every commit: on a feature branch, run the tests beside what changed (journal check touched, or the feature's test.py and the browser scenarios it touches); the whole suite runs once, before a merge into main and its release.; rule 66 \u2014 The journal never slows the agent down \u2014 The user, message 18990, after hooks timed out and waited on locks under load: the journal must never, ever decrease the performance of an agent. A hook answers at once with what decides the tool call; everything else runs after, in the background, and reaches the agent as a message. No hook waits on a lock it does not need.", "meta": {"from": "journal"}}
{"content": "work 2215 is still open \u2014 end it or park it before you stop: journal work end 2215 --how \"<what landed>\", or journal work park 2215 \"<why it waits>\"; rule 61 \u2014 Features wait as pull requests until approved; only hotfixes merge\u2026 \u2014 Message 17118 (2026-10-06), after the overnight refactor merged as 2.252.0: start new work in a new branch, do not merge, write the pull request. Every pull request or new feature is parked until the user approves it. Hotfixes can be merged into main immediately (by a dispatched agent in a worktree of main, rule 60).", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 203 \"<the next work>\", or journal helper finish 203 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 20066 \u2014 read it, then journal helper finish 203 once its work is taken or dropped; helper 196, Leslie Lamportson, reported in message 20240 \u2014 read it, then journal helper finish 196 once its work is taken or dropped; helper 205, Barbara Asyncwell, reported in message 20241 \u2014 read it, then journal helper finish 205 once its work is taken or dropped; helper 200, Linus Mendwell, reported in message 20244 \u2014 read it, then journal helper finish 200 once its work is taken or dropped; Linus's integrations browser scenario rerun came back - Rerun the integrations\u2026; request GET /api/main/dashboard is slower than its budget \u2014 91ms last (62ms of it working, then 2ms more after it answered), against a budget of 50ms. Seen 115 times.", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 20259 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 54 \u2014 Settings and feature switches are read at boot and on change, never\u2026 \u2014 The user, message 13349: the application boots, determines every feature and setting once, and re-evaluates only when something changes, such as a setting or a plugin. Never lazy-load settings.; work 2214 is still open \u2014 end it or park it before you stop: journal work end 2214 --how \"<what landed>\", or journal work park 2214 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 203 \"<the next work>\", or journal helper finish 203 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 20266 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 20272 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 20277 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 20066 \u2014 read it, then journal helper finish 203 once its work is taken or dropped; helper 205, Barbara Asyncwell, reported in message 20241 \u2014 read it, then journal helper finish 205 once its work is taken or dropped; release-267's touched tests and the Docker run came back - Run release-267's\u2026", "meta": {"from": "journal"}}
{"content": "rule 50 \u2014 Everything the user does is doable in the viewer \u2014 Message 6710 (2026-09-23): the user never uses the CLI, only the UI; everything should be doable from the viewer. The journal commands are for agents; any action meant for the user (making boards, confirming, accepting, hosting, watching an agent) needs its place in the viewer.", "meta": {"from": "journal"}}
{"content": "work 2214 is still open \u2014 end it or park it before you stop: journal work end 2214 --how \"<what landed>\", or journal work park 2214 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 20282 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "work 2214 is still open \u2014 end it or park it before you stop: journal work end 2214 --how \"<what landed>\", or journal work park 2214 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "work 2215, Test and review the integrations branch for plan 30, is still\u2026 \u2014 it was parked because: 2.267.0 is tested whole by Ingrid after 2.266.0 ships. journal work resume 2215 picks it up again.", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 20294 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 20266 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 36 \u2014 Clean, DRY, idiomatic before it is committed, never after it is\u2026 \u2014 The user should never be the one who finds duplication, dead code, a clumsy name or a pattern the codebase does not use. Read the diff before every commit as a reviewer would, and fix what is not clean then, not in a follow-up after a complaint.; rule 37 \u2014 Close every to-do explicitly with todo done or a Journal commit\u2026 \u2014 Ending work does not close its row. A to-do is closed by journal todo done <n> --how, or by a commit whose message carries Journal: todos done <n> at column 0, several numbers separated by commas. A row left open after its work landed misleads the next session and auto mode.; rule 57 \u2014 Never merge the overnight refactor into main before its pull request\u2026 \u2014 Messages 15005, 15006, 15109, 15110 (2026-10-04): all refactor work goes on branch overnight-refactor and reaches the user as one pull request, which they read in the morning; nothing of it is merged into main until they say so. Hotfixes the user explicitly asks for go to main at once and are merged into the branch.", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 203 \"<the next work>\", or journal helper finish 203 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 20066 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 203ms last (100ms of it working, then 3ms more after it answered), against a budget of 50ms. Seen 116 times.", "meta": {"from": "journal"}}
{"content": "work 2214, Review the shared and remote journal for gaps, test them, run them\u2026 \u2014 it was parked because: Ships with 2.267.0; 3573 closes when it is released. journal work resume 2214 picks it up again.", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 20282 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 20316 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 20323 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 60 \u2014 A hotfix is done by a dispatched agent in a worktree of main \u2014 Message 16836 (2026-10-06): the orchestrator cut a worktree under .claude/worktrees for a Codex hotfix, its session moved to a new environment and the user's messages stopped reaching it. The user: when working on a branch and a hotfix comes in, create a worktree of main and dispatch an agent to do that work. The orchestrator stays on its branch and in its environment, and never cds into another checkout.", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 20330 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 33s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 20294 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 20066 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 20323 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "law L3 \u2014 Read narrowly - grep for the line, sed a range, head the file; never\u2026 \u2014 Everything a tool returns stays in the context for good and is paid for on every turn after it. Search before you read, read the range you need, and cap output with grep, head or tail. Read a whole file only when you need all of it.", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 20330 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 20378 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 20294 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "fact 9 \u2014 Every public method on a controller becomes a journal command \u2014 The CLI is generated from the controllers: each public method of Controller, or of a typed controller, turns into journal <noun> <method>. A helper added to the base class therefore becomes a command on every type \u2014 which is how journal <type> handled and journal <type> refuse came to exist, from the CRUD funnel and the refusal funnel. An internal helper on a controller is named with a leading underscore, as _shaped and _status already are, or it ships as a command nobody meant.; fact 18 \u2014 cProfile inflates the slow-request profiles about tenfold \u2014 The faults feature writes a profile when a request passes its budget, and the profile is taken with cProfile, which adds per-call overhead. On 2026-09-22 /api/summary profiled at 58ms with 48ms inside Resource.fork's deep copy; with the profiler off the same call ran in 2 to 7ms. Read the profile for where the time goes in relative terms, then time the call with curl before changing anything.; fact 26 \u2014 Claude Code reads agent profiles when a session starts \u2014 Seen 2026-09-26: after the board-filler's profile in .claude/agents gained its steps and the Grep rule, dispatches from the running session still used the old profile (a 3.5-minute first question, shell grep refused); after the session restarted, the same request took 21 seconds with 4 calls. A change to an agent type reaches only sessions started after it is written.; rule 43 \u2014 A request or hook over its budget is fixed before the next release \u2014 Comment 1151 on this rule. When the faults feature reports a request, a hook or a command slower than its budget, file it as a to-do at once. It does not jump ahead of the work in hand, but no version is published while one is still open: profile it, fix it, and verify the new time before the release goes out. The budget is 50ms, because everything runs locally against files.; rule 49 \u2014 A dialog whose content grows keeps one fixed height, and its content\u2026 \u2014 Message 5361, after asking more than once: a dialog that shows output as it arrives (install, update, logs) opens at its final height and never jumps; only its content scrolls.; rule 62 \u2014 The voice profile shapes only the agent's chat speech, never code or\u2026 \u2014 The user, message 17620 (2026-10-07): the profile (butler, homie, coach, colleague) must not leak into the code the agent writes or into user-facing text of any application it works on: names, labels, comments, commit messages, docs and briefs written into a project use plain words (helper, subagent). Speaking in the chat in the profile's voice is fine.", "meta": {"from": "journal"}}
{"content": "fact 13 \u2014 This live session runs the installed copy in .journal/journal.pyz \u2014 The running journal (server, hooks, CLI) runs from .journal/journal.pyz with its viewer and skills in .journal/src, never from the repo. A change in the repo reaches it only through python3 src/journal.py --root .journal upgrade, which packs the zip again. A commit alone changes nothing that is running.; fact 24 \u2014 An answer followed by tool calls can be missing from Claude's\u2026 \u2014 Seen 2026-09-24 for messages 9391-9404: text blocks opening with [!reply:n] that were followed by tool calls never appeared in the session's jsonl (only thinking and tool_use rows did), so the journal never saw them and the replies were lost. When a turn goes on after answering, send the answer with journal message reply <n> \"<text>\" instead of the tag.", "meta": {"from": "journal"}}
{"content": "rule 45 \u2014 No prose words as names in code - said, says, heard, spoke, told\u2026 \u2014 Messages 1360 and 1698. The user has said more than once that code must not read like prose: a variable, attribute, property or function is named for what it holds or does (text, command, labels, lines), never with a verb from a story. 'says' on the Design type (1360) and 'said = call.said.lower()' in features/recital.py (1698) are the examples. Rule 27 states the naming rule; this one carries the words, so writing one of them whispers it. Before writing a name, ask whether a reader who has never seen the code would know what it holds.", "meta": {"from": "journal"}}
{"content": "fact 34 \u2014 A hooks list in a checkout's .claude/settings.json stops every\u2026 \u2014 Seen 2026-10-08: since commit 707a82915 the committed .claude/settings.json held {\"hooks\": []}; current Claude Code answers a hooks value that is not an object with a SettingsWarning dialog, which a headless helper cannot answer, so helpers 183 and 184 exited before doing anything (their launch logs in .journal/runtime/launches/ show it). This repository's journal hooks live in settings.local.json; the committed settings.json stays {}.", "meta": {"from": "journal"}}
{"content": "work 2215 is still open \u2014 end it or park it before you stop: journal work end 2215 --how \"<what landed>\", or journal work park 2215 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "the await tag does this in one step \u2014 [!await] makes the rest of the turn what you wait for; [!await on=(\"<id>\", \"helper:<n>\")] waits on those; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 20419 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "the coverage files on release-267 came back - Run Barbara's coverage files on\u2026; fact 25 \u2014 A designer's install packs the whole tree, half-done server edits\u2026 \u2014 2026-09-25: Eames and Saul run python3 src/journal.py --root .journal upgrade after their viewer builds; it packs every file in src, so a server handler I was halfway through writing went live and raised on every PostToolUse hook. While designers work in parallel, keep server edits whole between tool calls (write and test in the scratchpad first), and reinstall after reverting anything.", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 20428 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 30s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "work 2215 is still open \u2014 end it or park it before you stop: journal work end 2215 --how \"<what landed>\", or journal work park 2215 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "Linus's helpers test detail came back - See which helpers case still fails\u2026", "meta": {"from": "journal"}}
{"content": "work 2215 is still open \u2014 end it or park it before you stop: journal work end 2215 --how \"<what landed>\", or journal work park 2215 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 20434 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 20378 \u2014 read it, then journal helper finish 203 once its work is taken or dropped; helper 200, Linus Mendwell, reported in message 20437 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 20294 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 138ms last (69ms of it working, then 2ms more after it answered), against a budget of 50ms. Seen 120 times.", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 20448 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 20451 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 20454 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "work 2215 is still open \u2014 end it or park it before you stop: journal work end 2215 --how \"<what landed>\", or journal work park 2215 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "the integrations tests on release-267 came back - Run the integrations viewer\u2026", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 20468 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 20469 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "work 2215 is still open \u2014 end it or park it before you stop: journal work end 2215 --how \"<what landed>\", or journal work park 2215 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 20472 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 40 \u2014 A feature is named for what it is, never for its machinery \u2014 Messages 599, 600 and 703. A feature is a capability the user would name and would think of switching off. File tracking, a write gate, a phrase bank, a tree diff are services used inside a feature, not features of their own: they live in the feature they serve. Before adding a directory under features/, say what the user would call it; if the answer names a mechanism, it belongs inside something else. Report 16 holds the grouping this implies.", "meta": {"from": "journal"}}
{"content": "work 2215 is still open \u2014 end it or park it before you stop: journal work end 2215 --how \"<what landed>\", or journal work park 2215 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 196 \"<the next work>\", or journal helper finish 196 once its work is taken; helper 203, Ingrid Mergewell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 203 \"<the next work>\", or journal helper finish 203 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 20486 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 20378 \u2014 read it, then journal helper finish 203 once its work is taken or dropped; helper 200, Linus Mendwell, reported in message 20469 \u2014 read it, then journal helper finish 200 once its work is taken or dropped; helper 205, Barbara Asyncwell, reported in message 20472 \u2014 read it, then journal helper finish 205 once its work is taken or dropped; helper 196, Leslie Lamportson, reported in message 20486 \u2014 read it, then journal helper finish 196 once its work is taken or dropped; Barbara's three fixed test files came back - Run Barbara's three fixed test\u2026; fact 9 \u2014 Every public method on a controller becomes a journal command \u2014 The CLI is generated from the controllers: each public method of Controller, or of a typed controller, turns into journal <noun> <method>. A helper added to the base class therefore becomes a command on every type \u2014 which is how journal <type> handled and journal <type> refuse came to exist, from the CRUD funnel and the refusal funnel. An internal helper on a controller is named with a leading underscore, as _shaped and _status already are, or it ships as a command nobody meant.; work 2215 is still open \u2014 end it or park it before you stop: journal work end 2215 --how \"<what landed>\", or journal work park 2215 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "Barbara's three files rerun came back - Rerun Barbara's three files and\u2026; fact 13 \u2014 This live session runs the installed copy in .journal/journal.pyz \u2014 The running journal (server, hooks, CLI) runs from .journal/journal.pyz with its viewer and skills in .journal/src, never from the repo. A change in the repo reaches it only through python3 src/journal.py --root .journal upgrade, which packs the zip again. A commit alone changes nothing that is running.; rule 35 \u2014 Write clean code - one funnel per kind of operation, never the same\u2026 \u2014 Every kind of operation has one funnel: one method that creates, one that saves, one that refuses, one that formats. A second method that does the same thing under another name splits the behaviour, and the two drift apart. Before writing a method, search for the one that already does it and extend that. scripts/checks/funnels.py finds bodies written twice.; rule 55 \u2014 Always dispatch Codex helpers on gpt-6-sol \u2014 The user's word, message 13431: switch the codex agents to GPT-6-Sol and make it their default. ~/.codex/config.toml names it as the default model too.; rule 56 \u2014 Helpers are for work that writes; subagents read, research and design \u2014 The user, message 13464: there must be a clear distinction. A subagent can be dispatched for anything read-only: research, review, design. A helper is for actual work that writes, best in its own worktree when the work is separate. Dieter designing in Claude Design should have been a subagent, not a helper.", "meta": {"from": "journal"}}
{"content": "work 2215 is still open \u2014 end it or park it before you stop: journal work end 2215 --how \"<what landed>\", or journal work park 2215 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 20507 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "work 2215 is still open \u2014 end it or park it before you stop: journal work end 2215 --how \"<what landed>\", or journal work park 2215 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 203 \"<the next work>\", or journal helper finish 203 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 20378 \u2014 read it, then journal helper finish 203 once its work is taken or dropped; helper 200, Linus Mendwell, reported in message 20469 \u2014 read it, then journal helper finish 200 once its work is taken or dropped; helper 196, Leslie Lamportson, reported in message 20486 \u2014 read it, then journal helper finish 196 once its work is taken or dropped; helper 205, Barbara Asyncwell, reported in message 20507 \u2014 read it, then journal helper finish 205 once its work is taken or dropped; Barbara's hosted journal and auto update run came back - Run Barbara's hosted\u2026", "meta": {"from": "journal"}}
{"content": "work 2215 is still open \u2014 end it or park it before you stop: journal work end 2215 --how \"<what landed>\", or journal work park 2215 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 20521 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 46 \u2014 Only commit and push once the whole journal is proven to boot \u2014 Messages 2178 and 2179. A release that has not been started for real can crash every project that installs it, as 2.78.3 did for Codex and 2.84.0 did to project records. Before every commit and push: the full suite passes, including tests/test_it_boots.py, which installs a packed copy into a fresh project, launches Claude and Codex from it, writes a project record, upgrades again and checks the record survives. When a change touches launching, installing or upgrading, also start a real journal in a scratch project and close it properly afterwards, leaving no process behind.; rule 51 \u2014 Every finished feature is committed, pushed and released with a new\u2026 \u2014 Message 9207 (2026-09-24): when a new feature is ready, commit, push and publish a new tag. This is the user's standing word for releasing, so rule 44's only-when-the-user-says is met by it for finished features; fixes in between wait for the next feature or a patch the user asks for.; rule 61 \u2014 Features wait as pull requests until approved; only hotfixes merge\u2026 \u2014 Message 17118 (2026-10-06), after the overnight refactor merged as 2.252.0: start new work in a new branch, do not merge, write the pull request. Every pull request or new feature is parked until the user approves it. Hotfixes can be merged into main immediately (by a dispatched agent in a worktree of main, rule 60).; rule 64 \u2014 A finished feature is merged into main without waiting for approval \u2014 The user, message 17815 (2026-10-07): 'make sure that no pull requests are lingering on the repository. You may merge them into main... You are allowed to merge everything into main once the feature is completed.' This replaces rule 61's wait for approval: a feature still goes on its own branch, and once it is complete, tested and its whole suite passes, it is merged into main and released, and no pull request is left open.", "meta": {"from": "journal"}}
{"content": "fact 24 \u2014 An answer followed by tool calls can be missing from Claude's\u2026 \u2014 Seen 2026-09-24 for messages 9391-9404: text blocks opening with [!reply:n] that were followed by tool calls never appeared in the session's jsonl (only thinking and tool_use rows did), so the journal never saw them and the replies were lost. When a turn goes on after answering, send the answer with journal message reply <n> \"<text>\" instead of the tag.; law L5 \u2014 Every subagent dispatch names the agent - a human name, a little\u2026 \u2014 A name is how the user and the chat tell subagents apart and how they are messaged later; an id or a task line is not a name. Start the dispatch's description with the name, a colon, then the task, such as \"Dr. Einstein: profile the slow hooks\" or \"Coco Rams: draw the plan card\". A designer can borrow from famous designers, a researcher from famous scientists, mixed up for fun.; rule 39 \u2014 Use only registered exclamation response tags \u2014 A tag like [!reply:12] runs a command, and only the tags in the tags.runs setting are registered. An invented tag does nothing and shows as raw text in the chat. Use the registered ones (reply, log, end, todo, fact, rule) and nothing else.", "meta": {"from": "journal"}}
{"content": "work 2214, Review the shared and remote journal for gaps, test them, run them\u2026 \u2014 it was parked because: Ships with 2.267.0; 3573 closes when it is released. journal work resume 2214 picks it up again.", "meta": {"from": "journal"}}
{"content": "fact 25 \u2014 A designer's install packs the whole tree, half-done server edits\u2026 \u2014 2026-09-25: Eames and Saul run python3 src/journal.py --root .journal upgrade after their viewer builds; it packs every file in src, so a server handler I was halfway through writing went live and raised on every PostToolUse hook. While designers work in parallel, keep server edits whole between tool calls (write and test in the scratchpad first), and reinstall after reverting anything.; fact 27 \u2014 Running src/journal.py against the live .journal root starts a\u2026 \u2014 Seen 2026-10-01: with VERSION bumped in the tree, src/journal.py --root .journal saw the live server as another build and started a new one on a new port (8431, 8432), and the user's tabs kept losing connection. Run source builds against a throwaway or demo root (~/projects/demo-crumb/.journal), never the live one, until the release is installed.", "meta": {"from": "journal"}}
{"content": "fact 23 \u2014 Every upgrade brings system sequences and their triggers in line\u2026 \u2014 install.py runs ship_sequences after the migrations on each upgrade, so features/sequences/shipped.py is the whole source: change its wording and the next upgrade updates every journal, no migration needed. Shipped rows carry system=True and are read-only for everyone but SYSTEM (controllers/base.py _shipped).", "meta": {"from": "journal"}}
{"content": "work 2216 is still open, with nothing logged \u2014 journal work log 2216 \"<what was decided or done, and why>\" \u2014 then journal work end 2216 --how \"<what landed>\", or journal work park 2216 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "the log tag does this in one step \u2014 [!log:N] makes the turn itself the log entry; it runs only when it opens the last text of your turn; work 2216 is still open \u2014 end it or park it before you stop: journal work end 2216 --how \"<what landed>\", or journal work park 2216 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 20539 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your answer to a journal line was kept out of the chat \u2014 a journal line is an instruction, not a message: act on it and write nothing, unless the user needs to know something such as a failure, finished work or a decision that waits on them", "meta": {"from": "journal"}}
{"content": "rule 52 \u2014 A chat mark for something the user did sits on the user's side \u2014 Message 10960 (2026-09-25): marks for the user's own actions, such as answering a question, are right-aligned like the user's messages. A mark is put there by giving its card side=user.", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 20545 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 20547 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "work 2215 is still open \u2014 end it or park it before you stop: journal work end 2215 --how \"<what landed>\", or journal work park 2215 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "the integrations scenario with its phone-width case came back - Run the\u2026", "meta": {"from": "journal"}}
{"content": "work 2215 is still open \u2014 end it or park it before you stop: journal work end 2215 --how \"<what landed>\", or journal work park 2215 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 20557 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 20561 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 57 \u2014 Never merge the overnight refactor into main before its pull request\u2026 \u2014 Messages 15005, 15006, 15109, 15110 (2026-10-04): all refactor work goes on branch overnight-refactor and reaches the user as one pull request, which they read in the morning; nothing of it is merged into main until they say so. Hotfixes the user explicitly asks for go to main at once and are merged into the branch.", "meta": {"from": "journal"}}
{"content": "work 2214, Review the shared and remote journal for gaps, test them, run them\u2026 \u2014 it was parked because: Ships with 2.267.0; 3573 closes when it is released. journal work resume 2214 picks it up again.; fact 9 \u2014 Every public method on a controller becomes a journal command \u2014 The CLI is generated from the controllers: each public method of Controller, or of a typed controller, turns into journal <noun> <method>. A helper added to the base class therefore becomes a command on every type \u2014 which is how journal <type> handled and journal <type> refuse came to exist, from the CRUD funnel and the refusal funnel. An internal helper on a controller is named with a leading underscore, as _shaped and _status already are, or it ships as a command nobody meant.", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 20571 \u2014 read it, then journal helper finish 200 once its work is taken or dropped; work 2215 is still open \u2014 end it or park it before you stop: journal work end 2215 --how \"<what landed>\", or journal work park 2215 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 203 \"<the next work>\", or journal helper finish 203 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 20584 \u2014 read it, then journal helper finish 205 once its work is taken or dropped; work 2214, Review the shared and remote journal for gaps, test them, run them\u2026 \u2014 it was parked because: Ships with 2.267.0; 3573 closes when it is released. journal work resume 2214 picks it up again.", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 200 \"<the next work>\", or journal helper finish 200 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 20599 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "work 2214, Review the shared and remote journal for gaps, test them, run them\u2026 \u2014 it was parked because: Ships with 2.267.0; 3573 closes when it is released. journal work resume 2214 picks it up again.", "meta": {"from": "journal"}}
{"content": "todo 3570, Codex helpers keep checking that the journal works for Codex\u2026 \u2014 it is blocked because: The Codex workspace is out of credits (Margaret's launch log, 2026-10-09 00:40); a Codex helper can start again once you refill it. If it is not any more, journal todo unblock 3570. If it waits on a person or a decision, make it a question to them: journal todo ask 3570 \"<who decides what>\" --set options='[...]' --set pick=<n>, and the row waits on their answer. Otherwise tell the user in the chat what it waits on, in their terms, and propose how to clear it.", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 20607 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 205 \"<the next work>\", or journal helper finish 205 once its work is taken", "meta": {"from": "journal"}}
{"content": "Barbara's hosted journal and auto update run came back - Run the hosted\u2026", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 20617 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "work 2215 is still open \u2014 end it or park it before you stop: journal work end 2215 --how \"<what landed>\", or journal work park 2215 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 20620 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "work 2215 is still open \u2014 end it or park it before you stop: journal work end 2215 --how \"<what landed>\", or journal work park 2215 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 205 \"<the next work>\", or journal helper finish 205 once its work is taken", "meta": {"from": "journal"}}
{"content": "your chat talked about the journal's workings - \"Still waiting\" \u2014 the user sees replies, reactions, pills and reads themselves; say what the work is instead", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 203 \"<the next work>\", or journal helper finish 203 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 20617 \u2014 read it, then journal helper finish 196 once its work is taken or dropped; helper 200, Linus Mendwell, reported in message 20620 \u2014 read it, then journal helper finish 200 once its work is taken or dropped; the integrations scenario rerun came back - Rerun the integrations scenario on\u2026", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 20637 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 20638 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "fact 25 \u2014 A designer's install packs the whole tree, half-done server edits\u2026 \u2014 2026-09-25: Eames and Saul run python3 src/journal.py --root .journal upgrade after their viewer builds; it packs every file in src, so a server handler I was halfway through writing went live and raised on every PostToolUse hook. While designers work in parallel, keep server edits whole between tool calls (write and test in the scratchpad first), and reinstall after reverting anything.; fact 27 \u2014 Running src/journal.py against the live .journal root starts a\u2026 \u2014 Seen 2026-10-01: with VERSION bumped in the tree, src/journal.py --root .journal saw the live server as another build and started a new one on a new port (8431, 8432), and the user's tabs kept losing connection. Run source builds against a throwaway or demo root (~/projects/demo-crumb/.journal), never the live one, until the release is installed.", "meta": {"from": "journal"}}
{"content": "law L3 \u2014 Read narrowly - grep for the line, sed a range, head the file; never\u2026 \u2014 Everything a tool returns stays in the context for good and is paid for on every turn after it. Search before you read, read the range you need, and cap output with grep, head or tail. Read a whole file only when you need all of it.", "meta": {"from": "journal"}}
{"content": "work 2217 is still open, with nothing logged \u2014 journal work log 2217 \"<what was decided or done, and why>\" \u2014 then journal work end 2217 --how \"<what landed>\", or journal work park 2217 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "work 2214, Review the shared and remote journal for gaps, test them, run them\u2026 \u2014 it was parked because: Ships with 2.267.0; 3573 closes when it is released. journal work resume 2214 picks it up again.; the 2.266.1 install came back - Install 2.266.1 into this journal completed\u2026", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 20648 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 20654 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 200 \"<the next work>\", or journal helper finish 200 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 203 \"<the next work>\", or journal helper finish 203 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 20637 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 20654 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "the user asked to stop Run a long background command to test its Stop button \u2014 run TaskStop with task_id bhu1n40us now; then carry on with the work", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 203 \"<the next work>\", or journal helper finish 203 once its work is taken; helper 205, Barbara Asyncwell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 205 \"<the next work>\", or journal helper finish 205 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 20684 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "work 2214, Review the shared and remote journal for gaps, test them, run them\u2026 \u2014 it was parked because: Ships with 2.267.0; 3573 closes when it is released. journal work resume 2214 picks it up again.; plan 30 updated", "meta": {"from": "journal"}}
{"content": "fact 23 \u2014 Every upgrade brings system sequences and their triggers in line\u2026 \u2014 install.py runs ship_sequences after the migrations on each upgrade, so features/sequences/shipped.py is the whole source: change its wording and the next upgrade updates every journal, no migration needed. Shipped rows carry system=True and are read-only for everyone but SYSTEM (controllers/base.py _shipped).", "meta": {"from": "journal"}}
{"content": "rule 45 \u2014 No prose words as names in code - said, says, heard, spoke, told\u2026 \u2014 Messages 1360 and 1698. The user has said more than once that code must not read like prose: a variable, attribute, property or function is named for what it holds or does (text, command, labels, lines), never with a verb from a story. 'says' on the Design type (1360) and 'said = call.said.lower()' in features/recital.py (1698) are the examples. Rule 27 states the naming rule; this one carries the words, so writing one of them whispers it. Before writing a name, ask whether a reader who has never seen the code would know what it holds.; work 2218 is still open, with nothing logged \u2014 journal work log 2218 \"<what was decided or done, and why>\" \u2014 then journal work end 2218 --how \"<what landed>\", or journal work park 2218 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "work 2215, Test and review the integrations branch for plan 30, is still\u2026 \u2014 it was parked because: Linus makes the switch lookup exact. journal work resume 2215 picks it up again.; command work complete is slower than its budget \u2014 180ms last (115ms of it working, 3ms collecting garbage), against a budget of 50ms. Seen 2 times.", "meta": {"from": "journal"}}
{"content": "law L6 \u2014 A journal line is an instruction, never a message - act on it and\u2026 \u2014 A line that starts with [journal], a reminder, a notice or an old helper report is the journal telling the agent what to do, not the user speaking. Answering it fills the user's chat with noise. Act on it, or note it and carry on; write in the chat only what the user needs to know, such as a failure, a finished piece of work or a decision that waits on them.", "meta": {"from": "journal"}}
{"content": "fact 9 \u2014 Every public method on a controller becomes a journal command \u2014 The CLI is generated from the controllers: each public method of Controller, or of a typed controller, turns into journal <noun> <method>. A helper added to the base class therefore becomes a command on every type \u2014 which is how journal <type> handled and journal <type> refuse came to exist, from the CRUD funnel and the refusal funnel. An internal helper on a controller is named with a leading underscore, as _shaped and _status already are, or it ships as a command nobody meant.; fact 24 \u2014 An answer followed by tool calls can be missing from Claude's\u2026 \u2014 Seen 2026-09-24 for messages 9391-9404: text blocks opening with [!reply:n] that were followed by tool calls never appeared in the session's jsonl (only thinking and tool_use rows did), so the journal never saw them and the replies were lost. When a turn goes on after answering, send the answer with journal message reply <n> \"<text>\" instead of the tag.", "meta": {"from": "journal"}}
{"content": "rule 35 \u2014 Write clean code - one funnel per kind of operation, never the same\u2026 \u2014 Every kind of operation has one funnel: one method that creates, one that saves, one that refuses, one that formats. A second method that does the same thing under another name splits the behaviour, and the two drift apart. Before writing a method, search for the one that already does it and extend that. scripts/checks/funnels.py finds bodies written twice.; rule 55 \u2014 Always dispatch Codex helpers on gpt-6-sol \u2014 The user's word, message 13431: switch the codex agents to GPT-6-Sol and make it their default. ~/.codex/config.toml names it as the default model too.; rule 56 \u2014 Helpers are for work that writes; subagents read, research and design \u2014 The user, message 13464: there must be a clear distinction. A subagent can be dispatched for anything read-only: research, review, design. A helper is for actual work that writes, best in its own worktree when the work is separate. Dieter designing in Claude Design should have been a subagent, not a helper.", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 20654 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "fact 18 \u2014 cProfile inflates the slow-request profiles about tenfold \u2014 The faults feature writes a profile when a request passes its budget, and the profile is taken with cProfile, which adds per-call overhead. On 2026-09-22 /api/summary profiled at 58ms with 48ms inside Resource.fork's deep copy; with the profiler off the same call ran in 2 to 7ms. Read the profile for where the time goes in relative terms, then time the call with curl before changing anything.; rule 41 \u2014 Keep moving, run the whole suite before every commit, never wait \u2014 The full suite runs in about seven seconds: .venv/bin/python -m pytest -q --timeout=300 -n auto. Run it before every commit instead of picking tests by name. Group rows that sit in the same code into one sitting: write them all, test once, commit once. And never wait, not for a subagent, a build, or an answer you can carry on without. Dispatch it and keep working. If you truly are waiting on something, say so in the work log.", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 20726 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 65 \u2014 Run only new and affected tests while working; the whole suite only\u2026 \u2014 The user, messages 17914 to 17917 (2026-10-07): 'stop running the whole test suite and wasting my time... please only run the new or affected tests, and then, whenever you are merging to main or publishing to main, you can run the full test suite.' Replaces rule 41's whole suite before every commit: on a feature branch, run the tests beside what changed (journal check touched, or the feature's test.py and the browser scenarios it touches); the whole suite runs once, before a merge into main and its release.; rule 66 \u2014 The journal never slows the agent down \u2014 The user, message 18990, after hooks timed out and waited on locks under load: the journal must never, ever decrease the performance of an agent. A hook answers at once with what decides the tool call; everything else runs after, in the background, and reaches the agent as a message. No hook waits on a lock it does not need.", "meta": {"from": "journal"}}
{"content": "the end tag does this in one step \u2014 [!end:N] makes the turn itself what landed; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, reported in message 20740 \u2014 read it, then journal helper finish 205 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "fact 13 \u2014 This live session runs the installed copy in .journal/journal.pyz \u2014 The running journal (server, hooks, CLI) runs from .journal/journal.pyz with its viewer and skills in .journal/src, never from the repo. A change in the repo reaches it only through python3 src/journal.py --root .journal upgrade, which packs the zip again. A commit alone changes nothing that is running.", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 20684 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 200 \"<the next work>\", or journal helper finish 200 once its work is taken; helper 205, Barbara Asyncwell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 205 \"<the next work>\", or journal helper finish 205 once its work is taken", "meta": {"from": "journal"}}
{"content": "fact 34 \u2014 A hooks list in a checkout's .claude/settings.json stops every\u2026 \u2014 Seen 2026-10-08: since commit 707a82915 the committed .claude/settings.json held {\"hooks\": []}; current Claude Code answers a hooks value that is not an object with a SettingsWarning dialog, which a headless helper cannot answer, so helpers 183 and 184 exited before doing anything (their launch logs in .journal/runtime/launches/ show it). This repository's journal hooks live in settings.local.json; the committed settings.json stays {}.; rule 46 \u2014 Only commit and push once the whole journal is proven to boot \u2014 Messages 2178 and 2179. A release that has not been started for real can crash every project that installs it, as 2.78.3 did for Codex and 2.84.0 did to project records. Before every commit and push: the full suite passes, including tests/test_it_boots.py, which installs a packed copy into a fresh project, launches Claude and Codex from it, writes a project record, upgrades again and checks the record survives. When a change touches launching, installing or upgrading, also start a real journal in a scratch project and close it properly afterwards, leaving no process behind.; rule 51 \u2014 Every finished feature is committed, pushed and released with a new\u2026 \u2014 Message 9207 (2026-09-24): when a new feature is ready, commit, push and publish a new tag. This is the user's standing word for releasing, so rule 44's only-when-the-user-says is met by it for finished features; fixes in between wait for the next feature or a patch the user asks for.; rule 61 \u2014 Features wait as pull requests until approved; only hotfixes merge\u2026 \u2014 Message 17118 (2026-10-06), after the overnight refactor merged as 2.252.0: start new work in a new branch, do not merge, write the pull request. Every pull request or new feature is parked until the user approves it. Hotfixes can be merged into main immediately (by a dispatched agent in a worktree of main, rule 60).; rule 64 \u2014 A finished feature is merged into main without waiting for approval \u2014 The user, message 17815 (2026-10-07): 'make sure that no pull requests are lingering on the repository. You may merge them into main... You are allowed to merge everything into main once the feature is completed.' This replaces rule 61's wait for approval: a feature still goes on its own branch, and once it is complete, tested and its whole suite passes, it is merged into main and released, and no pull request is left open.", "meta": {"from": "journal"}}
{"content": "helper 196, Leslie Lamportson, reported in message 20654 \u2014 read it, then journal helper finish 196 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 203 \"<the next work>\", or journal helper finish 203 once its work is taken", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 76ms last (67ms of it working), against a budget of 50ms. Seen 123 times.", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 20777 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 54 \u2014 Settings and feature switches are read at boot and on change, never\u2026 \u2014 The user, message 13349: the application boots, determines every feature and setting once, and re-evaluates only when something changes, such as a setting or a plugin. Never lazy-load settings.", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 203 \"<the next work>\", or journal helper finish 203 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 205, Barbara Asyncwell, has stood idle for 12 minutes \u2014 it finished its turn and waits for work: journal helper say 205 \"<the next work>\", or journal helper finish 205 once its work is taken", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "todo 3611 next", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 20809 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 20813 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "work 2220 is still open, with nothing logged \u2014 journal work log 2220 \"<what was decided or done, and why>\" \u2014 then journal work end 2220 --how \"<what landed>\", or journal work park 2220 \"<why it waits>\"; rule 39 \u2014 Use only registered exclamation response tags \u2014 A tag like [!reply:12] runs a command, and only the tags in the tags.runs setting are registered. An invented tag does nothing and shows as raw text in the chat. Use the registered ones (reply, log, end, todo, fact, rule) and nothing else.", "meta": {"from": "journal"}}
{"content": "fact 25 \u2014 A designer's install packs the whole tree, half-done server edits\u2026 \u2014 2026-09-25: Eames and Saul run python3 src/journal.py --root .journal upgrade after their viewer builds; it packs every file in src, so a server handler I was halfway through writing went live and raised on every PostToolUse hook. While designers work in parallel, keep server edits whole between tool calls (write and test in the scratchpad first), and reinstall after reverting anything.; fact 27 \u2014 Running src/journal.py against the live .journal root starts a\u2026 \u2014 Seen 2026-10-01: with VERSION bumped in the tree, src/journal.py --root .journal saw the live server as another build and started a new one on a new port (8431, 8432), and the user's tabs kept losing connection. Run source builds against a throwaway or demo root (~/projects/demo-crumb/.journal), never the live one, until the release is installed.", "meta": {"from": "journal"}}
{"content": "journal 2.267.1 is out, this project runs 2.267.0 - run journal upgrade to install it", "meta": {"from": "journal"}}
{"content": "auto mode is on and work 2220 stands still while todo 3613 is ready \u2014 if work 2220 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3613. Stop only when nothing ready is left.; work 2220 is still open \u2014 end it or park it before you stop: journal work end 2220 --how \"<what landed>\", or journal work park 2220 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 20829 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "Linus's fix of the faults hold (3612), so 2.267.1 can be installed came back\u2026", "meta": {"from": "journal"}}
{"content": "rule 57 \u2014 Never merge the overnight refactor into main before its pull request\u2026 \u2014 Messages 15005, 15006, 15109, 15110 (2026-10-04): all refactor work goes on branch overnight-refactor and reaches the user as one pull request, which they read in the morning; nothing of it is merged into main until they say so. Hotfixes the user explicitly asks for go to main at once and are merged into the branch.", "meta": {"from": "journal"}}
{"content": "work 2220 is still open \u2014 end it or park it before you stop: journal work end 2220 --how \"<what landed>\", or journal work park 2220 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 20836 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 32s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 203 \"<the next work>\", or journal helper finish 203 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 20852 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "Ingrid's 2.267.2 hotfix with the faults hold fix came back - Ingrid Mergewell\u2026", "meta": {"from": "journal"}}
{"content": "rule 42 \u2014 Every user-facing text passes the formatters before it leaves the\u2026 \u2014 Not only a brief. A title, an abstract, an outcome and every section body are read by a person, so each goes through the same formatters on its way to the viewer \u2014 chat turns, activity items, to-do rows, inspector pages, docs alike. One field formatted out of five is not a rule, it is an accident, and it is how a raw tag ended up in the activity list after the tags feature had been stripping them for weeks. When a new field carries words a person reads, it joins the list in the same place.; rule 60 \u2014 A hotfix is done by a dispatched agent in a worktree of main \u2014 Message 16836 (2026-10-06): the orchestrator cut a worktree under .claude/worktrees for a Codex hotfix, its session moved to a new environment and the user's messages stopped reaching it. The user: when working on a branch and a hotfix comes in, create a worktree of main and dispatch an agent to do that work. The orchestrator stays on its branch and in its environment, and never cds into another checkout.", "meta": {"from": "journal"}}
{"content": "fact 13 \u2014 This live session runs the installed copy in .journal/journal.pyz \u2014 The running journal (server, hooks, CLI) runs from .journal/journal.pyz with its viewer and skills in .journal/src, never from the repo. A change in the repo reaches it only through python3 src/journal.py --root .journal upgrade, which packs the zip again. A commit alone changes nothing that is running.; fact 24 \u2014 An answer followed by tool calls can be missing from Claude's\u2026 \u2014 Seen 2026-09-24 for messages 9391-9404: text blocks opening with [!reply:n] that were followed by tool calls never appeared in the session's jsonl (only thinking and tool_use rows did), so the journal never saw them and the replies were lost. When a turn goes on after answering, send the answer with journal message reply <n> \"<text>\" instead of the tag.", "meta": {"from": "journal"}}
{"content": "work 2220 is still open \u2014 end it or park it before you stop: journal work end 2220 --how \"<what landed>\", or journal work park 2220 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 20873 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "Ingrid's install of 2.267.2 into the live journal came back - Ingrid Mergewell\u2026", "meta": {"from": "journal"}}
{"content": "fact 34 \u2014 A hooks list in a checkout's .claude/settings.json stops every\u2026 \u2014 Seen 2026-10-08: since commit 707a82915 the committed .claude/settings.json held {\"hooks\": []}; current Claude Code answers a hooks value that is not an object with a SettingsWarning dialog, which a headless helper cannot answer, so helpers 183 and 184 exited before doing anything (their launch logs in .journal/runtime/launches/ show it). This repository's journal hooks live in settings.local.json; the committed settings.json stays {}.; rule 36 \u2014 Clean, DRY, idiomatic before it is committed, never after it is\u2026 \u2014 The user should never be the one who finds duplication, dead code, a clumsy name or a pattern the codebase does not use. Read the diff before every commit as a reviewer would, and fix what is not clean then, not in a follow-up after a complaint.; rule 37 \u2014 Close every to-do explicitly with todo done or a Journal commit\u2026 \u2014 Ending work does not close its row. A to-do is closed by journal todo done <n> --how, or by a commit whose message carries Journal: todos done <n> at column 0, several numbers separated by commas. A row left open after its work landed misleads the next session and auto mode.; rule 38 \u2014 Never change the git branch until the user says so, by name \u2014 The work happens on the branch the user named. That was main until message 5929 and question 80 (2026-09-23), which moved the sins work to the branch sins. Do not create, switch to or merge any other branch unless the user names it in their own words.; rule 43 \u2014 A request or hook over its budget is fixed before the next release \u2014 Comment 1151 on this rule. When the faults feature reports a request, a hook or a command slower than its budget, file it as a to-do at once. It does not jump ahead of the work in hand, but no version is published while one is still open: profile it, fix it, and verify the new time before the release goes out. The budget is 50ms, because everything runs locally against files.", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 20836 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 203 \"<the next work>\", or journal helper finish 203 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 20836 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 20895 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 52 \u2014 A chat mark for something the user did sits on the user's side \u2014 Message 10960 (2026-09-25): marks for the user's own actions, such as answering a question, are right-aligned like the user's messages. A mark is put there by giving its card side=user.", "meta": {"from": "journal"}}
{"content": "the todo tag does this in one step \u2014 [!todo=\"the title\"] files it with the turn as its brief; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "fact 20 \u2014 A slim supervisor holds the agent and a worker reloads on every build \u2014 Since 2.118.0 (2026-09-23). src/supervisor.py is standard library only and never reloads: journal claude hands its process over to it (os.execv), and it owns the pty and the agent process, relays the terminal, writes the printed and screen captures, listens on the typist socket, restarts the agent in the same session from a relaunch command written to its runtime folder while a restart is pending, and stops it with escalation while draining the pty (an agent cannot finish exiting on macOS while its output is unread). It starts the worker (src/worker.py, which runs runner/worker.py; engine/worker.py stays as an alias for supervisors started before 2.201) and starts it again whenever it exits: RELOAD on a new build, RELAUNCH to restart the agent, STOP to end, HEAL or a quick crash to roll back a build through journal heal. The worker holds everything else: seating the session, the start-up confirm typed through the typist, services, viewer, update check, check-in, and the one-time relaunch of sessions launched before agents/terminal.py LAUNCH. agents/terminal.py holds only journal-side helpers. The server (serve.py) still runs the engines and re-execs itself on a .py change. When the agent exits, the supervisor runs journal ended, which puts set-aside hooks back and stops the server when no session is left.", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 20902 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "work 2221 is still open, with nothing logged \u2014 journal work log 2221 \"<what was decided or done, and why>\" \u2014 then journal work end 2221 --how \"<what landed>\", or journal work park 2221 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 20908 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 20914 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "Ingrid's install of 2.267.3 and Linus's hold fix came back - Ingrid Mergewell\u2026", "meta": {"from": "journal"}}
{"content": "work 2221 is still open \u2014 end it or park it before you stop: journal work end 2221 --how \"<what landed>\", or journal work park 2221 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 203 \"<the next work>\", or journal helper finish 203 once its work is taken", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 20946 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 20914 \u2014 read it, then journal helper finish 200 once its work is taken or dropped; Ingrid's 2.267.4 build, suite and install came back - Ingrid Mergewell\u2026; work 2221 is still open \u2014 end it or park it before you stop: journal work end 2221 --how \"<what landed>\", or journal work park 2221 \"<why it waits>\"; law L3 \u2014 Read narrowly - grep for the line, sed a range, head the file; never\u2026 \u2014 Everything a tool returns stays in the context for good and is paid for on every turn after it. Search before you read, read the range you need, and cap output with grep, head or tail. Read a whole file only when you need all of it.", "meta": {"from": "journal"}}
{"content": "command todo search is slower than its budget \u2014 693ms last (196ms of it working), against a budget of 50ms. Seen 10 times.", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 20948 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "auto mode is on and work 2221 stands still while todo 3624 is ready \u2014 if work 2221 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3624. Stop only when nothing ready is left.; work 2221 is still open \u2014 end it or park it before you stop: journal work end 2221 --how \"<what landed>\", or journal work park 2221 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 20951 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "Linus closing 3622 so the faults hold releases this session came back - Linus\u2026", "meta": {"from": "journal"}}
{"content": "todo 3570, Codex helpers keep checking that the journal works for Codex\u2026 \u2014 it is blocked because: The Codex workspace is out of credits (Margaret's launch log, 2026-10-09 00:40); a Codex helper can start again once you refill it. If it is not any more, journal todo unblock 3570. If it waits on a person or a decision, make it a question to them: journal todo ask 3570 \"<who decides what>\" --set options='[...]' --set pick=<n>, and the row waits on their answer. Otherwise tell the user in the chat what it waits on, in their terms, and propose how to clear it.", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, reported in message 20957 \u2014 read it, then journal helper finish 200 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 200 \"<the next work>\", or journal helper finish 200 once its work is taken; helper 203, Ingrid Mergewell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 203 \"<the next work>\", or journal helper finish 203 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 20964 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 20967 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "fact 9 \u2014 Every public method on a controller becomes a journal command \u2014 The CLI is generated from the controllers: each public method of Controller, or of a typed controller, turns into journal <noun> <method>. A helper added to the base class therefore becomes a command on every type \u2014 which is how journal <type> handled and journal <type> refuse came to exist, from the CRUD funnel and the refusal funnel. An internal helper on a controller is named with a leading underscore, as _shaped and _status already are, or it ships as a command nobody meant.; rule 35 \u2014 Write clean code - one funnel per kind of operation, never the same\u2026 \u2014 Every kind of operation has one funnel: one method that creates, one that saves, one that refuses, one that formats. A second method that does the same thing under another name splits the behaviour, and the two drift apart. Before writing a method, search for the one that already does it and extend that. scripts/checks/funnels.py finds bodies written twice.; rule 55 \u2014 Always dispatch Codex helpers on gpt-6-sol \u2014 The user's word, message 13431: switch the codex agents to GPT-6-Sol and make it their default. ~/.codex/config.toml names it as the default model too.; rule 56 \u2014 Helpers are for work that writes; subagents read, research and design \u2014 The user, message 13464: there must be a clear distinction. A subagent can be dispatched for anything read-only: research, review, design. A helper is for actual work that writes, best in its own worktree when the work is separate. Dieter designing in Claude Design should have been a subagent, not a helper.", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, has stood idle for 12 minutes \u2014 it finished its turn and waits for work: journal helper say 200 \"<the next work>\", or journal helper finish 200 once its work is taken; nothing is ready - every open row waits \u2014 to-do 3570, Codex helpers keep checking that the journal works for Codex agents. For each that waits on a person or a decision, put it to them now with journal todo ask <n> \"<who decides what>\" --set options='[...]' --set pick=<n>; unblock any that can go on and work it. Stop only when each one waits on a question.", "meta": {"from": "journal"}}
{"content": "your chat talked about the journal's workings - \"nothing else is open\" \u2014 the user sees replies, reactions, pills and reads themselves; say what the work is instead", "meta": {"from": "journal"}}
{"content": "rule 41 \u2014 Keep moving, run the whole suite before every commit, never wait \u2014 The full suite runs in about seven seconds: .venv/bin/python -m pytest -q --timeout=300 -n auto. Run it before every commit instead of picking tests by name. Group rows that sit in the same code into one sitting: write them all, test once, commit once. And never wait, not for a subagent, a build, or an answer you can carry on without. Dispatch it and keep working. If you truly are waiting on something, say so in the work log.; work deferred in words, not parked \u2014 \"once the workspace is\" is the title of a to-do: journal todo create \"<title>\" --brief, then say so", "meta": {"from": "journal"}}
{"content": "rule 65 \u2014 Run only new and affected tests while working; the whole suite only\u2026 \u2014 The user, messages 17914 to 17917 (2026-10-07): 'stop running the whole test suite and wasting my time... please only run the new or affected tests, and then, whenever you are merging to main or publishing to main, you can run the full test suite.' Replaces rule 41's whole suite before every commit: on a feature branch, run the tests beside what changed (journal check touched, or the feature's test.py and the browser scenarios it touches); the whole suite runs once, before a merge into main and its release.", "meta": {"from": "journal"}}
{"content": "helper 200, Linus Mendwell, has done nothing for 20 minutes \u2014 check on it: journal helper say 200 \"<what you want to know>\", or journal helper stop 200 if it is stuck", "meta": {"from": "journal"}}
{"content": "fact 23 \u2014 Every upgrade brings system sequences and their triggers in line\u2026 \u2014 install.py runs ship_sequences after the migrations on each upgrade, so features/sequences/shipped.py is the whole source: change its wording and the next upgrade updates every journal, no migration needed. Shipped rows carry system=True and are read-only for everyone but SYSTEM (controllers/base.py _shipped).", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 203 \"<the next work>\", or journal helper finish 203 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 203 \"<the next work>\", or journal helper finish 203 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 203 \"<the next work>\", or journal helper finish 203 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 203 \"<the next work>\", or journal helper finish 203 once its work is taken", "meta": {"from": "journal"}}
{"content": "fact 13 \u2014 This live session runs the installed copy in .journal/journal.pyz \u2014 The running journal (server, hooks, CLI) runs from .journal/journal.pyz with its viewer and skills in .journal/src, never from the repo. A change in the repo reaches it only through python3 src/journal.py --root .journal upgrade, which packs the zip again. A commit alone changes nothing that is running.", "meta": {"from": "journal"}}
{"content": "the todo tag does this in one step \u2014 [!todo=\"the title\"] files it with the turn as its brief; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "fact 34 \u2014 A hooks list in a checkout's .claude/settings.json stops every\u2026 \u2014 Seen 2026-10-08: since commit 707a82915 the committed .claude/settings.json held {\"hooks\": []}; current Claude Code answers a hooks value that is not an object with a SettingsWarning dialog, which a headless helper cannot answer, so helpers 183 and 184 exited before doing anything (their launch logs in .journal/runtime/launches/ show it). This repository's journal hooks live in settings.local.json; the committed settings.json stays {}.; rule 61 \u2014 Features wait as pull requests until approved; only hotfixes merge\u2026 \u2014 Message 17118 (2026-10-06), after the overnight refactor merged as 2.252.0: start new work in a new branch, do not merge, write the pull request. Every pull request or new feature is parked until the user approves it. Hotfixes can be merged into main immediately (by a dispatched agent in a worktree of main, rule 60).; rule 64 \u2014 A finished feature is merged into main without waiting for approval \u2014 The user, message 17815 (2026-10-07): 'make sure that no pull requests are lingering on the repository. You may merge them into main... You are allowed to merge everything into main once the feature is completed.' This replaces rule 61's wait for approval: a feature still goes on its own branch, and once it is complete, tested and its whole suite passes, it is merged into main and released, and no pull request is left open.", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 203 \"<the next work>\", or journal helper finish 203 once its work is taken", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 21009 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 46 \u2014 Only commit and push once the whole journal is proven to boot \u2014 Messages 2178 and 2179. A release that has not been started for real can crash every project that installs it, as 2.78.3 did for Codex and 2.84.0 did to project records. Before every commit and push: the full suite passes, including tests/test_it_boots.py, which installs a packed copy into a fresh project, launches Claude and Codex from it, writes a project record, upgrades again and checks the record survives. When a change touches launching, installing or upgrading, also start a real journal in a scratch project and close it properly afterwards, leaving no process behind.; rule 51 \u2014 Every finished feature is committed, pushed and released with a new\u2026 \u2014 Message 9207 (2026-09-24): when a new feature is ready, commit, push and publish a new tag. This is the user's standing word for releasing, so rule 44's only-when-the-user-says is met by it for finished features; fixes in between wait for the next feature or a patch the user asks for.", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 21022 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "fact 27 \u2014 Running src/journal.py against the live .journal root starts a\u2026 \u2014 Seen 2026-10-01: with VERSION bumped in the tree, src/journal.py --root .journal saw the live server as another build and started a new one on a new port (8431, 8432), and the user's tabs kept losing connection. Run source builds against a throwaway or demo root (~/projects/demo-crumb/.journal), never the live one, until the release is installed.", "meta": {"from": "journal"}}
{"content": "work 2222 is still open, with nothing logged \u2014 journal work log 2222 \"<what was decided or done, and why>\" \u2014 then journal work end 2222 --how \"<what landed>\", or journal work park 2222 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "the 2.267.6 install came back - Install 2.267.6 completed - carry on with work\u2026", "meta": {"from": "journal"}}
{"content": "command work complete is slower than its budget \u2014 204ms last (114ms of it working, 3ms collecting garbage), against a budget of 50ms. Seen 3 times.", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 203 \"<the next work>\", or journal helper finish 203 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 21172 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "fact 20 \u2014 A slim supervisor holds the agent and a worker reloads on every build \u2014 Since 2.118.0 (2026-09-23). src/supervisor.py is standard library only and never reloads: journal claude hands its process over to it (os.execv), and it owns the pty and the agent process, relays the terminal, writes the printed and screen captures, listens on the typist socket, restarts the agent in the same session from a relaunch command written to its runtime folder while a restart is pending, and stops it with escalation while draining the pty (an agent cannot finish exiting on macOS while its output is unread). It starts the worker (src/worker.py, which runs runner/worker.py; engine/worker.py stays as an alias for supervisors started before 2.201) and starts it again whenever it exits: RELOAD on a new build, RELAUNCH to restart the agent, STOP to end, HEAL or a quick crash to roll back a build through journal heal. The worker holds everything else: seating the session, the start-up confirm typed through the typist, services, viewer, update check, check-in, and the one-time relaunch of sessions launched before agents/terminal.py LAUNCH. agents/terminal.py holds only journal-side helpers. The server (serve.py) still runs the engines and re-execs itself on a .py change. When the agent exits, the supervisor runs journal ended, which puts set-aside hooks back and stops the server when no session is left.", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 203 \"<the next work>\", or journal helper finish 203 once its work is taken", "meta": {"from": "journal"}}
{"content": "fact 25 \u2014 A designer's install packs the whole tree, half-done server edits\u2026 \u2014 2026-09-25: Eames and Saul run python3 src/journal.py --root .journal upgrade after their viewer builds; it packs every file in src, so a server handler I was halfway through writing went live and raised on every PostToolUse hook. While designers work in parallel, keep server edits whole between tool calls (write and test in the scratchpad first), and reinstall after reverting anything.", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, has stood idle for 12 minutes \u2014 it finished its turn and waits for work: journal helper say 203 \"<the next work>\", or journal helper finish 203 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 203 \"<the next work>\", or journal helper finish 203 once its work is taken", "meta": {"from": "journal"}}
{"content": "rule 66 \u2014 The journal never slows the agent down \u2014 The user, message 18990, after hooks timed out and waited on locks under load: the journal must never, ever decrease the performance of an agent. A hook answers at once with what decides the tool call; everything else runs after, in the background, and reaches the agent as a message. No hook waits on a lock it does not need.", "meta": {"from": "journal"}}
{"content": "work 2223 is still open, with nothing logged \u2014 journal work log 2223 \"<what was decided or done, and why>\" \u2014 then journal work end 2223 --how \"<what landed>\", or journal work park 2223 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "the log tag does this in one step \u2014 [!log:N] makes the turn itself the log entry; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 21194 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 57 \u2014 Never merge the overnight refactor into main before its pull request\u2026 \u2014 Messages 15005, 15006, 15109, 15110 (2026-10-04): all refactor work goes on branch overnight-refactor and reaches the user as one pull request, which they read in the morning; nothing of it is merged into main until they say so. Hotfixes the user explicitly asks for go to main at once and are merged into the branch.", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread todo 3629", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread todo 3629", "meta": {"from": "journal"}}
{"content": "helper 203, Ingrid Mergewell, reported in message 21200 \u2014 read it, then journal helper finish 203 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "fact 9 \u2014 Every public method on a controller becomes a journal command \u2014 The CLI is generated from the controllers: each public method of Controller, or of a typed controller, turns into journal <noun> <method>. A helper added to the base class therefore becomes a command on every type \u2014 which is how journal <type> handled and journal <type> refuse came to exist, from the CRUD funnel and the refusal funnel. An internal helper on a controller is named with a leading underscore, as _shaped and _status already are, or it ships as a command nobody meant.; fact 24 \u2014 An answer followed by tool calls can be missing from Claude's\u2026 \u2014 Seen 2026-09-24 for messages 9391-9404: text blocks opening with [!reply:n] that were followed by tool calls never appeared in the session's jsonl (only thinking and tool_use rows did), so the journal never saw them and the replies were lost. When a turn goes on after answering, send the answer with journal message reply <n> \"<text>\" instead of the tag.", "meta": {"from": "journal"}}
{"content": "fact 18 \u2014 cProfile inflates the slow-request profiles about tenfold \u2014 The faults feature writes a profile when a request passes its budget, and the profile is taken with cProfile, which adds per-call overhead. On 2026-09-22 /api/summary profiled at 58ms with 48ms inside Resource.fork's deep copy; with the profiler off the same call ran in 2 to 7ms. Read the profile for where the time goes in relative terms, then time the call with curl before changing anything.", "meta": {"from": "journal"}}
{"content": "law L5 \u2014 Every subagent dispatch names the agent, in the naming style of the\u2026 \u2014 A name is how the user and the chat tell subagents apart and how they are messaged later; an id or a task line is not a name. Start the dispatch's description with the name, a colon, then the task. The profile in use says how its agents are named.; work deferred in words, not parked \u2014 \"once the credits are\" is the title of a to-do: journal todo create \"<title>\" --brief, then say so", "meta": {"from": "journal"}}
{"content": "think up what the user might ask for on board 12, Orchestrator \u2014 read its goal and cards (journal board show 12), then write 3 to 5 short things the user might ask for next, each one chip of at most 60 characters, in the user's words: journal board ideas 12 \"<idea>\" \"<idea>\" \"<idea>\". They replace the board's ideas under New work.; think up what the user might ask for on board 13, New work trials \u2014 read its goal and cards (journal board show 13), then write 3 to 5 short things the user might ask for next, each one chip of at most 60 characters, in the user's words: journal board ideas 13 \"<idea>\" \"<idea>\" \"<idea>\". They replace the board's ideas under New work.", "meta": {"from": "journal"}}
{"content": "rule 42 \u2014 Every user-facing text passes the formatters before it leaves the\u2026 \u2014 Not only a brief. A title, an abstract, an outcome and every section body are read by a person, so each goes through the same formatters on its way to the viewer \u2014 chat turns, activity items, to-do rows, inspector pages, docs alike. One field formatted out of five is not a rule, it is an accident, and it is how a raw tag ended up in the activity list after the tags feature had been stripping them for weeks. When a new field carries words a person reads, it joins the list in the same place.", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 833ms last (159ms of it working, then 7ms more after it answered), against a budget of 50ms. Seen 1 time.", "meta": {"from": "journal"}}
{"content": "rule 54 \u2014 Settings and feature switches are read at boot and on change, never\u2026 \u2014 The user, message 13349: the application boots, determines every feature and setting once, and re-evaluates only when something changes, such as a setting or a plugin. Never lazy-load settings.", "meta": {"from": "journal"}}
{"content": "todo 3630 next", "meta": {"from": "journal"}}
{"content": "law L1 \u2014 Every subagent dispatch names its model and chooses the least\u2026 \u2014 Use a fast, economical model for mechanical work with a known answer, a capable general model for careful implementation, and the strongest model only when the task turns on difficult judgement. Inheriting the orchestrator's model is not a model choice. If the dispatch API cannot accept a model, that operation is exempt.; law L4 \u2014 Related work goes back to the helper or subagent that already worked\u2026 \u2014 A helper or subagent that drew a design, wrote the code or ran the research keeps what it learned. When new work changes its work, is related to it or touches the same code, send it there with a message (SendMessage, journal helper say) rather than dispatching a new one that has to rediscover everything; start fresh only when the earlier one is gone or the new work is unrelated.; rule 60 \u2014 A hotfix is done by a dispatched agent in a worktree of main \u2014 Message 16836 (2026-10-06): the orchestrator cut a worktree under .claude/worktrees for a Codex hotfix, its session moved to a new environment and the user's messages stopped reaching it. The user: when working on a branch and a hotfix comes in, create a worktree of main and dispatch an agent to do that work. The orchestrator stays on its branch and in its environment, and never cds into another checkout.", "meta": {"from": "journal"}}
{"content": "rule 36 \u2014 Clean, DRY, idiomatic before it is committed, never after it is\u2026 \u2014 The user should never be the one who finds duplication, dead code, a clumsy name or a pattern the codebase does not use. Read the diff before every commit as a reviewer would, and fix what is not clean then, not in a follow-up after a complaint.; rule 37 \u2014 Close every to-do explicitly with todo done or a Journal commit\u2026 \u2014 Ending work does not close its row. A to-do is closed by journal todo done <n> --how, or by a commit whose message carries Journal: todos done <n> at column 0, several numbers separated by commas. A row left open after its work landed misleads the next session and auto mode.; rule 38 \u2014 Never change the git branch until the user says so, by name \u2014 The work happens on the branch the user named. That was main until message 5929 and question 80 (2026-09-23), which moved the sins work to the branch sins. Do not create, switch to or merge any other branch unless the user names it in their own words.; rule 43 \u2014 A request or hook over its budget is fixed before the next release \u2014 Comment 1151 on this rule. When the faults feature reports a request, a hook or a command slower than its budget, file it as a to-do at once. It does not jump ahead of the work in hand, but no version is published while one is still open: profile it, fix it, and verify the new time before the release goes out. The budget is 50ms, because everything runs locally against files.", "meta": {"from": "journal"}}
{"content": "the end tag does this in one step \u2014 [!end:N] makes the turn itself what landed; it runs only when it opens the last text of your turn; fact 34 \u2014 A hooks list in a checkout's .claude/settings.json stops every\u2026 \u2014 Seen 2026-10-08: since commit 707a82915 the committed .claude/settings.json held {\"hooks\": []}; current Claude Code answers a hooks value that is not an object with a SettingsWarning dialog, which a headless helper cannot answer, so helpers 183 and 184 exited before doing anything (their launch logs in .journal/runtime/launches/ show it). This repository's journal hooks live in settings.local.json; the committed settings.json stays {}.", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread worktree 96", "meta": {"from": "journal"}}
{"content": "1 new message 21227 - answer by opening your turn with [!reply:21227]", "meta": {"from": "journal"}}
{"content": "answer message 21227 before you write anything \u2014 answer by opening your turn with [!reply:21227]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "fact 23 \u2014 Every upgrade brings system sequences and their triggers in line\u2026 \u2014 install.py runs ship_sequences after the migrations on each upgrade, so features/sequences/shipped.py is the whole source: change its wording and the next upgrade updates every journal, no migration needed. Shipped rows carry system=True and are read-only for everyone but SYSTEM (controllers/base.py _shipped).", "meta": {"from": "journal"}}
{"content": "rule 59 \u2014 Every viewer heading and label says plainly what it is about \u2014 The user, messages 16499, 16839, 16844, 16989, 16992 and 16993 (2026-10-06), after 'Where the words count', 'Watch for the words in', 'This project', 'This browser' and 'Stop the journal' as tab names: viewer text reads like Linear, GitHub or Vercel. A place (page, tab, group, sidebar item) is a short noun: Settings, Project, Browser, Services, Updates, Plugins; never 'This project' or a phrase. A button is a verb for what happens: Stop, Install, Copy link, Pause the plan. A heading names what the reader looks at, and its options finish its sentence: 'Trigger when' / 'A word is written'. Plain literal words: no metaphor or whimsy ('kettle on, waiting'), no app speaking as I, none of the journal's internal words (row, hook, nudge, engine, slate). One word for one thing everywhere, sentence case, as short as it can be while clear. Applies to designers' prototypes, helpers' builds, the viewer's JavaScript lists, feature details, and shipped sequence and trigger titles alike.", "meta": {"from": "journal"}}
{"content": "1 new message 21239 - answer by opening your turn with [!reply:21239]", "meta": {"from": "journal"}}
{"content": "answer message 21239 before you write anything \u2014 answer by opening your turn with [!reply:21239]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat; law L2 \u2014 Every subagent is bound to a concrete job; never dispatch a generic\u2026 \u2014 Use the most specific available agent type whose declared purpose matches the assignment. On providers without agent types, give the dispatch a concrete task name and bounded prompt. If no suitable specialization exists, keep the work in the main agent instead of manufacturing an unscoped helper.; rule 48 \u2014 The viewer is built from its component library, and pages only\u2026 \u2014 Message 4258. Every visual piece the viewer shows more than once, or that a user would recognise as the same kind of thing (a dialog, a side panel or inspector, a dropdown, a list row, a switch, a button), is one component in web/src/kit, extracted aggressively, and every page composes those components instead of building its own copy. Before writing markup or styles in a page, look for the kit component that already does it and extend it with a prop; a second hand-built version is a bug. The side panel that animated in but not out, while a separate skill panel did both, is the example.; rule 49 \u2014 A dialog whose content grows keeps one fixed height, and its content\u2026 \u2014 Message 5361, after asking more than once: a dialog that shows output as it arrives (install, update, logs) opens at its final height and never jumps; only its content scrolls.", "meta": {"from": "journal"}}
{"content": "your last message ran its paragraphs together \u2014 a blank line between parts is what makes a message readable: one thought to a paragraph; the reply tag on 21239 did not run \u2014 ! you already answered this in comment 3281: add to that answer with journal comment update 3281 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "law L6 \u2014 A journal line is an instruction, never a message - act on it and\u2026 \u2014 A line that starts with [journal], a reminder, a notice or an old helper report is the journal telling the agent what to do, not the user speaking. Answering it fills the user's chat with noise. Act on it, or note it and carry on; write in the chat only what the user needs to know, such as a failure, a finished piece of work or a decision that waits on them.", "meta": {"from": "journal"}}
{"content": "1 new message 21247 - answer by opening your turn with [!reply:21247]", "meta": {"from": "journal"}}
{"content": "answer message 21247 before you write anything \u2014 answer by opening your turn with [!reply:21247]. a reply, a reaction, or journal message processed <n>; message 21247 file Screenshot 2026-10-09 at 09.42.15.png needs tags \u2014 inspect the attachment, then journal message tag 21247 \"Screenshot 2026-10-09 at 09.42.15.png\" \"<a few words describing what it shows>\"; message 21247 updated", "meta": {"from": "journal"}}
{"content": "answer message 21247 before you write anything \u2014 answer by opening your turn with [!reply:21247]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "the reply tag on 21247 did not run \u2014 ! you already answered this in comment 3282: add to that answer with journal comment update 3282 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "1 new message 21252 - answer by opening your turn with [!reply:21252]", "meta": {"from": "journal"}}
{"content": "answer message 21252 before you write anything \u2014 answer by opening your turn with [!reply:21252]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "the reply tag on 21252 did not run \u2014 ! you already answered this in comment 3284: add to that answer with journal comment update 3284 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "helper 207, Rosalind Cachewell, reported in message 21255 \u2014 read it, then journal helper finish 207 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "fact 13 \u2014 This live session runs the installed copy in .journal/journal.pyz \u2014 The running journal (server, hooks, CLI) runs from .journal/journal.pyz with its viewer and skills in .journal/src, never from the repo. A change in the repo reaches it only through python3 src/journal.py --root .journal upgrade, which packs the zip again. A commit alone changes nothing that is running.; fact 26 \u2014 Claude Code reads agent profiles when a session starts \u2014 Seen 2026-09-26: after the board-filler's profile in .claude/agents gained its steps and the Grep rule, dispatches from the running session still used the old profile (a 3.5-minute first question, shell grep refused); after the session restarted, the same request took 21 seconds with 4 calls. A change to an agent type reaches only sessions started after it is written.; rule 50 \u2014 Everything the user does is doable in the viewer \u2014 Message 6710 (2026-09-23): the user never uses the CLI, only the UI; everything should be doable from the viewer. The journal commands are for agents; any action meant for the user (making boards, confirming, accepting, hosting, watching an agent) needs its place in the viewer.; rule 62 \u2014 The voice profile shapes only the agent's chat speech, never code or\u2026 \u2014 The user, message 17620 (2026-10-07): the profile (butler, homie, coach, colleague) must not leak into the code the agent writes or into user-facing text of any application it works on: names, labels, comments, commit messages, docs and briefs written into a project use plain words (helper, subagent). Speaking in the chat in the profile's voice is fine.", "meta": {"from": "journal"}}
{"content": "work 2225 is still open, with nothing logged \u2014 journal work log 2225 \"<what was decided or done, and why>\" \u2014 then journal work end 2225 --how \"<what landed>\", or journal work park 2225 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "Rosalind's test files came back - Run Rosalind's tests on her branch completed\u2026", "meta": {"from": "journal"}}
{"content": "rule 27 \u2014 Name a declaration with the word a reader already knows \u2014 An attribute, a variable or a field gets the ordinary programming word for what it holds, not an evocative one. was, heard and alone were poetry; aliases, notify_actions and urgent_actions are what they are. The test: could a reader who has never seen this codebase guess what it holds from the name alone? Prose belongs in the help text and the abstract, where it is read as prose. This does not license abbreviations \u2014 a plain word in full, not a short one.", "meta": {"from": "journal"}}
{"content": "work 2225 is still open \u2014 end it or park it before you stop: journal work end 2225 --how \"<what landed>\", or journal work park 2225 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "1 new message 21271 - answer by opening your turn with [!reply:21271]", "meta": {"from": "journal"}}
{"content": "answer message 21271 before you write anything \u2014 answer by opening your turn with [!reply:21271]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "answer message 21271 before you write anything \u2014 answer by opening your turn with [!reply:21271]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "the reply tag on 21271 did not run \u2014 ! you already answered this in comment 3285: add to that answer with journal comment update 3285 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread message 21279", "meta": {"from": "journal"}}
{"content": "there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each; answer message 21279 before you write anything \u2014 answer by opening your turn with [!reply:21279]. a reply, a reaction, or journal message processed <n>; 1 new message 21279 - answer by opening your turn with [!reply:21279]", "meta": {"from": "journal"}}
{"content": "answer message 21279 before you write anything \u2014 answer by opening your turn with [!reply:21279]. a reply, a reaction, or journal message processed <n>; fact 9 \u2014 Every public method on a controller becomes a journal command \u2014 The CLI is generated from the controllers: each public method of Controller, or of a typed controller, turns into journal <noun> <method>. A helper added to the base class therefore becomes a command on every type \u2014 which is how journal <type> handled and journal <type> refuse came to exist, from the CRUD funnel and the refusal funnel. An internal helper on a controller is named with a leading underscore, as _shaped and _status already are, or it ships as a command nobody meant.; rule 35 \u2014 Write clean code - one funnel per kind of operation, never the same\u2026 \u2014 Every kind of operation has one funnel: one method that creates, one that saves, one that refuses, one that formats. A second method that does the same thing under another name splits the behaviour, and the two drift apart. Before writing a method, search for the one that already does it and extend that. scripts/checks/funnels.py finds bodies written twice.; rule 55 \u2014 Always dispatch Codex helpers on gpt-6-sol \u2014 The user's word, message 13431: switch the codex agents to GPT-6-Sol and make it their default. ~/.codex/config.toml names it as the default model too.; rule 56 \u2014 Helpers are for work that writes; subagents read, research and design \u2014 The user, message 13464: there must be a clear distinction. A subagent can be dispatched for anything read-only: research, review, design. A helper is for actual work that writes, best in its own worktree when the work is separate. Dieter designing in Claude Design should have been a subagent, not a helper.", "meta": {"from": "journal"}}
{"content": "1 new message 21282 - answer by opening your turn with [!reply:21282]", "meta": {"from": "journal"}}
{"content": "there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each; your last message ran its paragraphs together \u2014 a blank line between parts is what makes a message readable: one thought to a paragraph; the reply tag on 21279 did not run \u2014 ! you already answered this in comment 3286: add to that answer with journal comment update 3286 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "work 2225, Test Rosalind's board-cache branch, is still parked - can you\u2026 \u2014 it was parked because: Rosalind fixes the plans and command_tags failures; I rerun when she reports. journal work resume 2225 picks it up again.", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat; the reply tag on 21282 did not run \u2014 ! you already answered this in comment 3288: add to that answer with journal comment update 3288 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "1 new message 21286 - answer by opening your turn with [!reply:21286]", "meta": {"from": "journal"}}
{"content": "answer message 21286 before you write anything \u2014 answer by opening your turn with [!reply:21286]. a reply, a reaction, or journal message processed <n>; fact 24 \u2014 An answer followed by tool calls can be missing from Claude's\u2026 \u2014 Seen 2026-09-24 for messages 9391-9404: text blocks opening with [!reply:n] that were followed by tool calls never appeared in the session's jsonl (only thinking and tool_use rows did), so the journal never saw them and the replies were lost. When a turn goes on after answering, send the answer with journal message reply <n> \"<text>\" instead of the tag.; message 21286 file Screenshot 2026-10-09 at 09.49.14.png needs tags \u2014 inspect the attachment, then journal message tag 21286 \"Screenshot 2026-10-09 at 09.49.14.png\" \"<a few words describing what it shows>\"; message 21286 updated", "meta": {"from": "journal"}}
{"content": "rule 52 \u2014 A chat mark for something the user did sits on the user's side \u2014 Message 10960 (2026-09-25): marks for the user's own actions, such as answering a question, are right-aligned like the user's messages. A mark is put there by giving its card side=user.", "meta": {"from": "journal"}}
{"content": "rule 41 \u2014 Keep moving, run the whole suite before every commit, never wait \u2014 The full suite runs in about seven seconds: .venv/bin/python -m pytest -q --timeout=300 -n auto. Run it before every commit instead of picking tests by name. Group rows that sit in the same code into one sitting: write them all, test once, commit once. And never wait, not for a subagent, a build, or an answer you can carry on without. Dispatch it and keep working. If you truly are waiting on something, say so in the work log.", "meta": {"from": "journal"}}
{"content": "fact 27 \u2014 Running src/journal.py against the live .journal root starts a\u2026 \u2014 Seen 2026-10-01: with VERSION bumped in the tree, src/journal.py --root .journal saw the live server as another build and started a new one on a new port (8431, 8432), and the user's tabs kept losing connection. Run source builds against a throwaway or demo root (~/projects/demo-crumb/.journal), never the live one, until the release is installed.", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread worktree 97", "meta": {"from": "journal"}}
{"content": "helper 207, Rosalind Cachewell, reported in message 21292 \u2014 read it, then journal helper finish 207 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 208, Grace Markwell, reported in message 21293 \u2014 read it, then journal helper finish 208 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 65 \u2014 Run only new and affected tests while working; the whole suite only\u2026 \u2014 The user, messages 17914 to 17917 (2026-10-07): 'stop running the whole test suite and wasting my time... please only run the new or affected tests, and then, whenever you are merging to main or publishing to main, you can run the full test suite.' Replaces rule 41's whole suite before every commit: on a feature branch, run the tests beside what changed (journal check touched, or the feature's test.py and the browser scenarios it touches); the whole suite runs once, before a merge into main and its release.; fact 18 \u2014 cProfile inflates the slow-request profiles about tenfold \u2014 The faults feature writes a profile when a request passes its budget, and the profile is taken with cProfile, which adds per-call overhead. On 2026-09-22 /api/summary profiled at 58ms with 48ms inside Resource.fork's deep copy; with the profiler off the same call ran in 2 to 7ms. Read the profile for where the time goes in relative terms, then time the call with curl before changing anything.; fact 34 \u2014 A hooks list in a checkout's .claude/settings.json stops every\u2026 \u2014 Seen 2026-10-08: since commit 707a82915 the committed .claude/settings.json held {\"hooks\": []}; current Claude Code answers a hooks value that is not an object with a SettingsWarning dialog, which a headless helper cannot answer, so helpers 183 and 184 exited before doing anything (their launch logs in .journal/runtime/launches/ show it). This repository's journal hooks live in settings.local.json; the committed settings.json stays {}.; rule 61 \u2014 Features wait as pull requests until approved; only hotfixes merge\u2026 \u2014 Message 17118 (2026-10-06), after the overnight refactor merged as 2.252.0: start new work in a new branch, do not merge, write the pull request. Every pull request or new feature is parked until the user approves it. Hotfixes can be merged into main immediately (by a dispatched agent in a worktree of main, rule 60).", "meta": {"from": "journal"}}
{"content": "work 2225 is still open \u2014 end it or park it before you stop: journal work end 2225 --how \"<what landed>\", or journal work park 2225 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "the user turned linear on \u2014 journal settings shows every switch", "meta": {"from": "journal"}}
{"content": "1 new secret 1; secret 1 updated", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread secret 1", "meta": {"from": "journal"}}
{"content": "helper 207, Rosalind Cachewell, reported in message 21302 \u2014 read it, then journal helper finish 207 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "Rosalind's and Grace's test runs came back - Rerun Rosalind's files and the\u2026", "meta": {"from": "journal"}}
{"content": "rule 51 \u2014 Every finished feature is committed, pushed and released with a new\u2026 \u2014 Message 9207 (2026-09-24): when a new feature is ready, commit, push and publish a new tag. This is the user's standing word for releasing, so rule 44's only-when-the-user-says is met by it for finished features; fixes in between wait for the next feature or a patch the user asks for.", "meta": {"from": "journal"}}
{"content": "rule 46 \u2014 Only commit and push once the whole journal is proven to boot \u2014 Messages 2178 and 2179. A release that has not been started for real can crash every project that installs it, as 2.78.3 did for Codex and 2.84.0 did to project records. Before every commit and push: the full suite passes, including tests/test_it_boots.py, which installs a packed copy into a fresh project, launches Claude and Codex from it, writes a project record, upgrades again and checks the record survives. When a change touches launching, installing or upgrading, also start a real journal in a scratch project and close it properly afterwards, leaving no process behind.; rule 64 \u2014 A finished feature is merged into main without waiting for approval \u2014 The user, message 17815 (2026-10-07): 'make sure that no pull requests are lingering on the repository. You may merge them into main... You are allowed to merge everything into main once the feature is completed.' This replaces rule 61's wait for approval: a feature still goes on its own branch, and once it is complete, tested and its whole suite passes, it is merged into main and released, and no pull request is left open.", "meta": {"from": "journal"}}
{"content": "1 new message 21319 - answer by opening your turn with [!reply:21319]", "meta": {"from": "journal"}}
{"content": "answer message 21319 before you write anything \u2014 answer by opening your turn with [!reply:21319]. a reply, a reaction, or journal message processed <n>; message 21319 file Screenshot 2026-10-09 at 09.54.00.png needs tags \u2014 inspect the attachment, then journal message tag 21319 \"Screenshot 2026-10-09 at 09.54.00.png\" \"<a few words describing what it shows>\"; message 21319 updated", "meta": {"from": "journal"}}
{"content": "1 new message 21322 - answer by opening your turn with [!reply:21322]", "meta": {"from": "journal"}}
{"content": "answer message 21322 before you write anything \u2014 answer by opening your turn with [!reply:21322]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "your last message ran its paragraphs together \u2014 a blank line between parts is what makes a message readable: one thought to a paragraph; the reply tag on 21322 did not run \u2014 ! you already answered this in comment 3291: add to that answer with journal comment update 3291 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "helper 207, Rosalind Cachewell, reported in message 21326 \u2014 read it, then journal helper finish 207 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "work 2225 is still open \u2014 end it or park it before you stop: journal work end 2225 --how \"<what landed>\", or journal work park 2225 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "1 new message 21330 - answer by opening your turn with [!reply:21330]; message 21330 updated", "meta": {"from": "journal"}}
{"content": "answer message 21330 before you write anything \u2014 answer by opening your turn with [!reply:21330]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "1 new message 21335 - answer by opening your turn with [!reply:21335]", "meta": {"from": "journal"}}
{"content": "answer message 21335 before you write anything \u2014 answer by opening your turn with [!reply:21335]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat; the reply tag on 21335 did not run \u2014 ! you already answered this in comment 3293: add to that answer with journal comment update 3293 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "1 new message 21338 - answer by opening your turn with [!reply:21338]", "meta": {"from": "journal"}}
{"content": "the reply tag on 21338 did not run \u2014 ! you already answered this in comment 3294: add to that answer with journal comment update 3294 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "your message 21344 names 358 without saying what they are \u2014 put the type before each number, like message 1712 or to-do 644, so the chat links it: journal message edit 21344 \"<the text>\"", "meta": {"from": "journal"}}
{"content": "todo 3643 next", "meta": {"from": "journal"}}
{"content": "work 2225, Test Rosalind's board-cache branch, is still parked - can you\u2026 \u2014 it was parked because: Rosalind makes the Sampler case deterministic; everything else on board-cache passes. journal work resume 2225 picks it up again.", "meta": {"from": "journal"}}
{"content": "helper 207, Rosalind Cachewell, reported in message 21350 \u2014 read it, then journal helper finish 207 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 66 \u2014 The journal never slows the agent down \u2014 The user, message 18990, after hooks timed out and waited on locks under load: the journal must never, ever decrease the performance of an agent. A hook answers at once with what decides the tool call; everything else runs after, in the background, and reaches the agent as a message. No hook waits on a lock it does not need.", "meta": {"from": "journal"}}
{"content": "fact 9 \u2014 Every public method on a controller becomes a journal command \u2014 The CLI is generated from the controllers: each public method of Controller, or of a typed controller, turns into journal <noun> <method>. A helper added to the base class therefore becomes a command on every type \u2014 which is how journal <type> handled and journal <type> refuse came to exist, from the CRUD funnel and the refusal funnel. An internal helper on a controller is named with a leading underscore, as _shaped and _status already are, or it ships as a command nobody meant.; fact 13 \u2014 This live session runs the installed copy in .journal/journal.pyz \u2014 The running journal (server, hooks, CLI) runs from .journal/journal.pyz with its viewer and skills in .journal/src, never from the repo. A change in the repo reaches it only through python3 src/journal.py --root .journal upgrade, which packs the zip again. A commit alone changes nothing that is running.", "meta": {"from": "journal"}}
{"content": "work 2225 is still open \u2014 end it or park it before you stop: journal work end 2225 --how \"<what landed>\", or journal work park 2225 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "Rosalind's five test files came back - Run Rosalind's last test files\u2026", "meta": {"from": "journal"}}
{"content": "work 2225, Test Rosalind's board-cache branch, is still parked - can you\u2026 \u2014 it was parked because: Rosalind fixes four failures from her last commits. journal work resume 2225 picks it up again.", "meta": {"from": "journal"}}
{"content": "helper 208, Grace Markwell, reported in message 21367 \u2014 read it, then journal helper finish 208 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "work 2227 is still open, with nothing logged \u2014 journal work log 2227 \"<what was decided or done, and why>\" \u2014 then journal work end 2227 --how \"<what landed>\", or journal work park 2227 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 207, Rosalind Cachewell, reported in message 21372 \u2014 read it, then journal helper finish 207 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your chat talked about the journal's workings - \"Still waiting\" \u2014 the user sees replies, reactions, pills and reads themselves; say what the work is instead", "meta": {"from": "journal"}}
{"content": "helper 207, Rosalind Cachewell, reported in message 21383 \u2014 read it, then journal helper finish 207 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 208, Grace Markwell, reported in message 21367 \u2014 read it, then journal helper finish 208 once its work is taken or dropped; helper 207, Rosalind Cachewell, reported in message 21383 \u2014 read it, then journal helper finish 207 once its work is taken or dropped; Grace's test run came back - Run Grace's tests on her branch completed - carry\u2026", "meta": {"from": "journal"}}
{"content": "your command ran 32s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "work 2227 is still open \u2014 end it or park it before you stop: journal work end 2227 --how \"<what landed>\", or journal work park 2227 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "the await tag does this in one step \u2014 [!await] makes the rest of the turn what you wait for; [!await on=(\"<id>\", \"helper:<n>\")] waits on those; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "the integrations scenario rerun on Grace's branch came back - Rerun the\u2026", "meta": {"from": "journal"}}
{"content": "fact 34 \u2014 A hooks list in a checkout's .claude/settings.json stops every\u2026 \u2014 Seen 2026-10-08: since commit 707a82915 the committed .claude/settings.json held {\"hooks\": []}; current Claude Code answers a hooks value that is not an object with a SettingsWarning dialog, which a headless helper cannot answer, so helpers 183 and 184 exited before doing anything (their launch logs in .journal/runtime/launches/ show it). This repository's journal hooks live in settings.local.json; the committed settings.json stays {}.", "meta": {"from": "journal"}}
{"content": "helper 208, Grace Markwell, reported in message 21398 \u2014 read it, then journal helper finish 208 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "work 2227 is still open \u2014 end it or park it before you stop: journal work end 2227 --how \"<what landed>\", or journal work park 2227 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 207, Rosalind Cachewell, reported in message 21404 \u2014 read it, then journal helper finish 207 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "Grace's Integrations scenario rerun came back - Rerun the Integrations\u2026", "meta": {"from": "journal"}}
{"content": "work 2227 is still open \u2014 end it or park it before you stop: journal work end 2227 --how \"<what landed>\", or journal work park 2227 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 208, Grace Markwell, reported in message 21407 \u2014 read it, then journal helper finish 208 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 207, Rosalind Cachewell, reported in message 21410 \u2014 read it, then journal helper finish 207 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 36 \u2014 Clean, DRY, idiomatic before it is committed, never after it is\u2026 \u2014 The user should never be the one who finds duplication, dead code, a clumsy name or a pattern the codebase does not use. Read the diff before every commit as a reviewer would, and fix what is not clean then, not in a follow-up after a complaint.; rule 48 \u2014 The viewer is built from its component library, and pages only\u2026 \u2014 Message 4258. Every visual piece the viewer shows more than once, or that a user would recognise as the same kind of thing (a dialog, a side panel or inspector, a dropdown, a list row, a switch, a button), is one component in web/src/kit, extracted aggressively, and every page composes those components instead of building its own copy. Before writing markup or styles in a page, look for the kit component that already does it and extend it with a prop; a second hand-built version is a bug. The side panel that animated in but not out, while a separate skill panel did both, is the example.", "meta": {"from": "journal"}}
{"content": "rule 57 \u2014 Never merge the overnight refactor into main before its pull request\u2026 \u2014 Messages 15005, 15006, 15109, 15110 (2026-10-04): all refactor work goes on branch overnight-refactor and reaches the user as one pull request, which they read in the morning; nothing of it is merged into main until they say so. Hotfixes the user explicitly asks for go to main at once and are merged into the branch.", "meta": {"from": "journal"}}
{"content": "work 2227 is still open \u2014 end it or park it before you stop: journal work end 2227 --how \"<what landed>\", or journal work park 2227 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 208, Grace Markwell, reported in message 21417 \u2014 read it, then journal helper finish 208 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "helper 207, Rosalind Cachewell, reported in message 21427 \u2014 read it, then journal helper finish 207 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 60 \u2014 A hotfix is done by a dispatched agent in a worktree of main \u2014 Message 16836 (2026-10-06): the orchestrator cut a worktree under .claude/worktrees for a Codex hotfix, its session moved to a new environment and the user's messages stopped reaching it. The user: when working on a branch and a hotfix comes in, create a worktree of main and dispatch an agent to do that work. The orchestrator stays on its branch and in its environment, and never cds into another checkout.", "meta": {"from": "journal"}}
{"content": "rule 43 \u2014 A request or hook over its budget is fixed before the next release \u2014 Comment 1151 on this rule. When the faults feature reports a request, a hook or a command slower than its budget, file it as a to-do at once. It does not jump ahead of the work in hand, but no version is published while one is still open: profile it, fix it, and verify the new time before the release goes out. The budget is 50ms, because everything runs locally against files.", "meta": {"from": "journal"}}
{"content": "helper 208, Grace Markwell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 208 \"<the next work>\", or journal helper finish 208 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 207, Rosalind Cachewell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 207 \"<the next work>\", or journal helper finish 207 once its work is taken", "meta": {"from": "journal"}}
{"content": "the whole suite and viewer unit tests on 2.267.8 came back - Run the whole\u2026", "meta": {"from": "journal"}}
{"content": "fact 9 \u2014 Every public method on a controller becomes a journal command \u2014 The CLI is generated from the controllers: each public method of Controller, or of a typed controller, turns into journal <noun> <method>. A helper added to the base class therefore becomes a command on every type \u2014 which is how journal <type> handled and journal <type> refuse came to exist, from the CRUD funnel and the refusal funnel. An internal helper on a controller is named with a leading underscore, as _shaped and _status already are, or it ships as a command nobody meant.; fact 13 \u2014 This live session runs the installed copy in .journal/journal.pyz \u2014 The running journal (server, hooks, CLI) runs from .journal/journal.pyz with its viewer and skills in .journal/src, never from the repo. A change in the repo reaches it only through python3 src/journal.py --root .journal upgrade, which packs the zip again. A commit alone changes nothing that is running.; rule 35 \u2014 Write clean code - one funnel per kind of operation, never the same\u2026 \u2014 Every kind of operation has one funnel: one method that creates, one that saves, one that refuses, one that formats. A second method that does the same thing under another name splits the behaviour, and the two drift apart. Before writing a method, search for the one that already does it and extend that. scripts/checks/funnels.py finds bodies written twice.; rule 55 \u2014 Always dispatch Codex helpers on gpt-6-sol \u2014 The user's word, message 13431: switch the codex agents to GPT-6-Sol and make it their default. ~/.codex/config.toml names it as the default model too.; rule 56 \u2014 Helpers are for work that writes; subagents read, research and design \u2014 The user, message 13464: there must be a clear distinction. A subagent can be dispatched for anything read-only: research, review, design. A helper is for actual work that writes, best in its own worktree when the work is separate. Dieter designing in Claude Design should have been a subagent, not a helper.", "meta": {"from": "journal"}}
{"content": "work 2228 is still open \u2014 end it or park it before you stop: journal work end 2228 --how \"<what landed>\", or journal work park 2228 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 208, Grace Markwell, reported in message 21468 \u2014 read it, then journal helper finish 208 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 207, Rosalind Cachewell, reported in message 21471 \u2014 read it, then journal helper finish 207 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "Rosalind's waiting scenario fix and Grace's API walk fix for 2.267.8 came back\u2026", "meta": {"from": "journal"}}
{"content": "rule 41 \u2014 Keep moving, run the whole suite before every commit, never wait \u2014 The full suite runs in about seven seconds: .venv/bin/python -m pytest -q --timeout=300 -n auto. Run it before every commit instead of picking tests by name. Group rows that sit in the same code into one sitting: write them all, test once, commit once. And never wait, not for a subagent, a build, or an answer you can carry on without. Dispatch it and keep working. If you truly are waiting on something, say so in the work log.", "meta": {"from": "journal"}}
{"content": "your command ran 34s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "work 2228 is still open \u2014 end it or park it before you stop: journal work end 2228 --how \"<what landed>\", or journal work park 2228 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 208, Grace Markwell, reported in message 21468 \u2014 read it, then journal helper finish 208 once its work is taken or dropped; helper 207, Rosalind Cachewell, reported in message 21471 \u2014 read it, then journal helper finish 207 once its work is taken or dropped; the rerun of the two failing tests on 2.267.8 came back - Rerun the two\u2026", "meta": {"from": "journal"}}
{"content": "law L3 \u2014 Read narrowly - grep for the line, sed a range, head the file; never\u2026 \u2014 Everything a tool returns stays in the context for good and is paid for on every turn after it. Search before you read, read the range you need, and cap output with grep, head or tail. Read a whole file only when you need all of it.; rule 39 \u2014 Use only registered exclamation response tags \u2014 A tag like [!reply:12] runs a command, and only the tags in the tags.runs setting are registered. An invented tag does nothing and shows as raw text in the chat. Use the registered ones (reply, log, end, todo, fact, rule) and nothing else.", "meta": {"from": "journal"}}
{"content": "journal: the engine hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. TimeoutError: /Users/jessegall/projects/agent-journal/.journal/.migrations.lock", "meta": {"from": "journal"}}
{"content": "after POST /api/hook/claude hit an error \u2014 journal: after POST /api/hook/claude hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. TimeoutError: /Users/jessegall/projects/agent-journal/.journal/.migrations.lock; fact 25 \u2014 A designer's install packs the whole tree, half-done server edits\u2026 \u2014 2026-09-25: Eames and Saul run python3 src/journal.py --root .journal upgrade after their viewer builds; it packs every file in src, so a server handler I was halfway through writing went live and raised on every PostToolUse hook. While designers work in parallel, keep server edits whole between tool calls (write and test in the scratchpad first), and reinstall after reverting anything.; fact 27 \u2014 Running src/journal.py against the live .journal root starts a\u2026 \u2014 Seen 2026-10-01: with VERSION bumped in the tree, src/journal.py --root .journal saw the live server as another build and started a new one on a new port (8431, 8432), and the user's tabs kept losing connection. Run source builds against a throwaway or demo root (~/projects/demo-crumb/.journal), never the live one, until the release is installed.; work 2228 is still open \u2014 end it or park it before you stop: journal work end 2228 --how \"<what landed>\", or journal work park 2228 \"<why it waits>\"; plan 29 updated", "meta": {"from": "journal"}}
{"content": "auto mode is on and work 2228 stands still while todo 3644 is ready \u2014 if work 2228 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3644. Stop only when nothing ready is left.", "meta": {"from": "journal"}}
{"content": "rule 37 \u2014 Close every to-do explicitly with todo done or a Journal commit\u2026 \u2014 Ending work does not close its row. A to-do is closed by journal todo done <n> --how, or by a commit whose message carries Journal: todos done <n> at column 0, several numbers separated by commas. A row left open after its work landed misleads the next session and auto mode.", "meta": {"from": "journal"}}
{"content": "todo 3645 next; rule 61 \u2014 Features wait as pull requests until approved; only hotfixes merge\u2026 \u2014 Message 17118 (2026-10-06), after the overnight refactor merged as 2.252.0: start new work in a new branch, do not merge, write the pull request. Every pull request or new feature is parked until the user approves it. Hotfixes can be merged into main immediately (by a dispatched agent in a worktree of main, rule 60).", "meta": {"from": "journal"}}
{"content": "fact 18 \u2014 cProfile inflates the slow-request profiles about tenfold \u2014 The faults feature writes a profile when a request passes its budget, and the profile is taken with cProfile, which adds per-call overhead. On 2026-09-22 /api/summary profiled at 58ms with 48ms inside Resource.fork's deep copy; with the profiler off the same call ran in 2 to 7ms. Read the profile for where the time goes in relative terms, then time the call with curl before changing anything.", "meta": {"from": "journal"}}
{"content": "fact 20 \u2014 A slim supervisor holds the agent and a worker reloads on every build \u2014 Since 2.118.0 (2026-09-23). src/supervisor.py is standard library only and never reloads: journal claude hands its process over to it (os.execv), and it owns the pty and the agent process, relays the terminal, writes the printed and screen captures, listens on the typist socket, restarts the agent in the same session from a relaunch command written to its runtime folder while a restart is pending, and stops it with escalation while draining the pty (an agent cannot finish exiting on macOS while its output is unread). It starts the worker (src/worker.py, which runs runner/worker.py; engine/worker.py stays as an alias for supervisors started before 2.201) and starts it again whenever it exits: RELOAD on a new build, RELAUNCH to restart the agent, STOP to end, HEAL or a quick crash to roll back a build through journal heal. The worker holds everything else: seating the session, the start-up confirm typed through the typist, services, viewer, update check, check-in, and the one-time relaunch of sessions launched before agents/terminal.py LAUNCH. agents/terminal.py holds only journal-side helpers. The server (serve.py) still runs the engines and re-execs itself on a .py change. When the agent exits, the supervisor runs journal ended, which puts set-aside hooks back and stops the server when no session is left.; fact 34 \u2014 A hooks list in a checkout's .claude/settings.json stops every\u2026 \u2014 Seen 2026-10-08: since commit 707a82915 the committed .claude/settings.json held {\"hooks\": []}; current Claude Code answers a hooks value that is not an object with a SettingsWarning dialog, which a headless helper cannot answer, so helpers 183 and 184 exited before doing anything (their launch logs in .journal/runtime/launches/ show it). This repository's journal hooks live in settings.local.json; the committed settings.json stays {}.", "meta": {"from": "journal"}}
{"content": "work 2227, Test Grace's integration cards, is still parked - can you continue\u2026 \u2014 it was parked because: Rosalind assembles 2.267.8 from board-cache, chat-marks and integration-cards; Grace fixes the switch tooltip. journal work resume 2227 picks it up again.", "meta": {"from": "journal"}}
{"content": "helper 208, Grace Markwell, reported in message 21492 \u2014 read it, then journal helper finish 208 once its work is taken or dropped; fact 23 \u2014 Every upgrade brings system sequences and their triggers in line\u2026 \u2014 install.py runs ship_sequences after the migrations on each upgrade, so features/sequences/shipped.py is the whole source: change its wording and the next upgrade updates every journal, no migration needed. Shipped rows carry system=True and are read-only for everyone but SYSTEM (controllers/base.py _shipped).; rule 65 \u2014 Run only new and affected tests while working; the whole suite only\u2026 \u2014 The user, messages 17914 to 17917 (2026-10-07): 'stop running the whole test suite and wasting my time... please only run the new or affected tests, and then, whenever you are merging to main or publishing to main, you can run the full test suite.' Replaces rule 41's whole suite before every commit: on a feature branch, run the tests beside what changed (journal check touched, or the feature's test.py and the browser scenarios it touches); the whole suite runs once, before a merge into main and its release.", "meta": {"from": "journal"}}
{"content": "fact 26 \u2014 Claude Code reads agent profiles when a session starts \u2014 Seen 2026-09-26: after the board-filler's profile in .claude/agents gained its steps and the Grep rule, dispatches from the running session still used the old profile (a 3.5-minute first question, shell grep refused); after the session restarted, the same request took 21 seconds with 4 calls. A change to an agent type reaches only sessions started after it is written.; rule 62 \u2014 The voice profile shapes only the agent's chat speech, never code or\u2026 \u2014 The user, message 17620 (2026-10-07): the profile (butler, homie, coach, colleague) must not leak into the code the agent writes or into user-facing text of any application it works on: names, labels, comments, commit messages, docs and briefs written into a project use plain words (helper, subagent). Speaking in the chat in the profile's voice is fine.", "meta": {"from": "journal"}}
{"content": "helper 208, Grace Markwell, reported in message 21496 \u2014 read it, then journal helper finish 208 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 207, Rosalind Cachewell, reported in message 21498 \u2014 read it, then journal helper finish 207 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 46 \u2014 Only commit and push once the whole journal is proven to boot \u2014 Messages 2178 and 2179. A release that has not been started for real can crash every project that installs it, as 2.78.3 did for Codex and 2.84.0 did to project records. Before every commit and push: the full suite passes, including tests/test_it_boots.py, which installs a packed copy into a fresh project, launches Claude and Codex from it, writes a project record, upgrades again and checks the record survives. When a change touches launching, installing or upgrading, also start a real journal in a scratch project and close it properly afterwards, leaving no process behind.; rule 51 \u2014 Every finished feature is committed, pushed and released with a new\u2026 \u2014 Message 9207 (2026-09-24): when a new feature is ready, commit, push and publish a new tag. This is the user's standing word for releasing, so rule 44's only-when-the-user-says is met by it for finished features; fixes in between wait for the next feature or a patch the user asks for.", "meta": {"from": "journal"}}
{"content": "your command ran 34s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "work 2229 is still open, with nothing logged \u2014 journal work log 2229 \"<what was decided or done, and why>\" \u2014 then journal work end 2229 --how \"<what landed>\", or journal work park 2229 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "the boots and faults run on migrations-lock came back - Run the boots and\u2026", "meta": {"from": "journal"}}
{"content": "work 2229 is still open \u2014 end it or park it before you stop: journal work end 2229 --how \"<what landed>\", or journal work park 2229 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "the rerun that names the two failures on migrations-lock came back - Show\u2026", "meta": {"from": "journal"}}
{"content": "work 2229 is still open \u2014 end it or park it before you stop: journal work end 2229 --how \"<what landed>\", or journal work park 2229 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 207, Rosalind Cachewell, reported in message 21506 \u2014 read it, then journal helper finish 207 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "Rosalind's flaky-test fix and the 2.267.9 version came back - Rosalind\u2026", "meta": {"from": "journal"}}
{"content": "work 2229 is still open \u2014 end it or park it before you stop: journal work end 2229 --how \"<what landed>\", or journal work park 2229 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "the await tag does this in one step \u2014 [!await] makes the rest of the turn what you wait for; [!await on=(\"<id>\", \"helper:<n>\")] waits on those; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "helper 207, Rosalind Cachewell, reported in message 21506 \u2014 read it, then journal helper finish 207 once its work is taken or dropped; the whole suite on 2.267.9 came back - Run the whole suite and viewer unit\u2026", "meta": {"from": "journal"}}
{"content": "rule 27 \u2014 Name a declaration with the word a reader already knows \u2014 An attribute, a variable or a field gets the ordinary programming word for what it holds, not an evocative one. was, heard and alone were poetry; aliases, notify_actions and urgent_actions are what they are. The test: could a reader who has never seen this codebase guess what it holds from the name alone? Prose belongs in the help text and the abstract, where it is read as prose. This does not license abbreviations \u2014 a plain word in full, not a short one.", "meta": {"from": "journal"}}
{"content": "work 2229 is still open \u2014 end it or park it before you stop: journal work end 2229 --how \"<what landed>\", or journal work park 2229 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 207, Rosalind Cachewell, reported in message 21513 \u2014 read it, then journal helper finish 207 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat; Rosalind's corrected slow-request test came back - Rosalind Cachewell\u2026", "meta": {"from": "journal"}}
{"content": "your command ran 30s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "work 2229 is still open \u2014 end it or park it before you stop: journal work end 2229 --how \"<what landed>\", or journal work park 2229 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "the faults and boots rerun on 2.267.9 came back - Read Rosalind's report and\u2026", "meta": {"from": "journal"}}
{"content": "work 2229 is still open \u2014 end it or park it before you stop: journal work end 2229 --how \"<what landed>\", or journal work park 2229 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "the 2.267.9 install came back - Install 2.267.9 completed - carry on with work\u2026", "meta": {"from": "journal"}}
{"content": "command work complete is slower than its budget \u2014 117ms last (82ms of it working, 2ms collecting garbage), against a budget of 50ms. Seen 1 time.", "meta": {"from": "journal"}}
{"content": "law L5 \u2014 Every subagent dispatch names the agent, in the naming style of the\u2026 \u2014 A name is how the user and the chat tell subagents apart and how they are messaged later; an id or a task line is not a name. Start the dispatch's description with the name, a colon, then the task. The profile in use says how its agents are named.", "meta": {"from": "journal"}}
{"content": "law L1 \u2014 Every subagent dispatch names its model and chooses the least\u2026 \u2014 Use a fast, economical model for mechanical work with a known answer, a capable general model for careful implementation, and the strongest model only when the task turns on difficult judgement. Inheriting the orchestrator's model is not a model choice. If the dispatch API cannot accept a model, that operation is exempt.; law L4 \u2014 Related work goes back to the helper or subagent that already worked\u2026 \u2014 A helper or subagent that drew a design, wrote the code or ran the research keeps what it learned. When new work changes its work, is related to it or touches the same code, send it there with a message (SendMessage, journal helper say) rather than dispatching a new one that has to rediscover everything; start fresh only when the earlier one is gone or the new work is unrelated.", "meta": {"from": "journal"}}
{"content": "fact 9 \u2014 Every public method on a controller becomes a journal command \u2014 The CLI is generated from the controllers: each public method of Controller, or of a typed controller, turns into journal <noun> <method>. A helper added to the base class therefore becomes a command on every type \u2014 which is how journal <type> handled and journal <type> refuse came to exist, from the CRUD funnel and the refusal funnel. An internal helper on a controller is named with a leading underscore, as _shaped and _status already are, or it ships as a command nobody meant.", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread worktree 98", "meta": {"from": "journal"}}
{"content": "rule 42 \u2014 Every user-facing text passes the formatters before it leaves the\u2026 \u2014 Not only a brief. A title, an abstract, an outcome and every section body are read by a person, so each goes through the same formatters on its way to the viewer \u2014 chat turns, activity items, to-do rows, inspector pages, docs alike. One field formatted out of five is not a rule, it is an accident, and it is how a raw tag ended up in the activity list after the tags feature had been stripping them for weeks. When a new field carries words a person reads, it joins the list in the same place.", "meta": {"from": "journal"}}
{"content": "helper 209, Edsger Benchwell, reported in message 21522 \u2014 read it, then journal helper finish 209 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 209, Edsger Benchwell, reported in message 21525 \u2014 read it, then journal helper finish 209 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 66 \u2014 The journal never slows the agent down \u2014 The user, message 18990, after hooks timed out and waited on locks under load: the journal must never, ever decrease the performance of an agent. A hook answers at once with what decides the tool call; everything else runs after, in the background, and reaches the agent as a message. No hook waits on a lock it does not need.", "meta": {"from": "journal"}}
{"content": "rule 40 \u2014 A feature is named for what it is, never for its machinery \u2014 Messages 599, 600 and 703. A feature is a capability the user would name and would think of switching off. File tracking, a write gate, a phrase bank, a tree diff are services used inside a feature, not features of their own: they live in the feature they serve. Before adding a directory under features/, say what the user would call it; if the answer names a mechanism, it belongs inside something else. Report 16 holds the grouping this implies.", "meta": {"from": "journal"}}
{"content": "work 2231 is still open, with nothing logged \u2014 journal work log 2231 \"<what was decided or done, and why>\" \u2014 then journal work end 2231 --how \"<what landed>\", or journal work park 2231 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 209, Edsger Benchwell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 209 \"<the next work>\", or journal helper finish 209 once its work is taken", "meta": {"from": "journal"}}
{"content": "the hook hit an error \u2014 journal: the hook hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. the hook got no answer from the server 1 times (codes 000)", "meta": {"from": "journal"}}
{"content": "fact 34 \u2014 A hooks list in a checkout's .claude/settings.json stops every\u2026 \u2014 Seen 2026-10-08: since commit 707a82915 the committed .claude/settings.json held {\"hooks\": []}; current Claude Code answers a hooks value that is not an object with a SettingsWarning dialog, which a headless helper cannot answer, so helpers 183 and 184 exited before doing anything (their launch logs in .journal/runtime/launches/ show it). This repository's journal hooks live in settings.local.json; the committed settings.json stays {}.", "meta": {"from": "journal"}}
{"content": "fact 20 \u2014 A slim supervisor holds the agent and a worker reloads on every build \u2014 Since 2.118.0 (2026-09-23). src/supervisor.py is standard library only and never reloads: journal claude hands its process over to it (os.execv), and it owns the pty and the agent process, relays the terminal, writes the printed and screen captures, listens on the typist socket, restarts the agent in the same session from a relaunch command written to its runtime folder while a restart is pending, and stops it with escalation while draining the pty (an agent cannot finish exiting on macOS while its output is unread). It starts the worker (src/worker.py, which runs runner/worker.py; engine/worker.py stays as an alias for supervisors started before 2.201) and starts it again whenever it exits: RELOAD on a new build, RELAUNCH to restart the agent, STOP to end, HEAL or a quick crash to roll back a build through journal heal. The worker holds everything else: seating the session, the start-up confirm typed through the typist, services, viewer, update check, check-in, and the one-time relaunch of sessions launched before agents/terminal.py LAUNCH. agents/terminal.py holds only journal-side helpers. The server (serve.py) still runs the engines and re-execs itself on a .py change. When the agent exits, the supervisor runs journal ended, which puts set-aside hooks back and stops the server when no session is left.; fact 24 \u2014 An answer followed by tool calls can be missing from Claude's\u2026 \u2014 Seen 2026-09-24 for messages 9391-9404: text blocks opening with [!reply:n] that were followed by tool calls never appeared in the session's jsonl (only thinking and tool_use rows did), so the journal never saw them and the replies were lost. When a turn goes on after answering, send the answer with journal message reply <n> \"<text>\" instead of the tag.", "meta": {"from": "journal"}}
{"content": "rule 54 \u2014 Settings and feature switches are read at boot and on change, never\u2026 \u2014 The user, message 13349: the application boots, determines every feature and setting once, and re-evaluates only when something changes, such as a setting or a plugin. Never lazy-load settings.", "meta": {"from": "journal"}}
{"content": "rule 38 \u2014 Never change the git branch until the user says so, by name \u2014 The work happens on the branch the user named. That was main until message 5929 and question 80 (2026-09-23), which moved the sins work to the branch sins. Do not create, switch to or merge any other branch unless the user names it in their own words.", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread worktree 99", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread worktree 99", "meta": {"from": "journal"}}
{"content": "helper 210, Leslie Restartwell, reported in message 21537 \u2014 read it, then journal helper finish 210 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 210, Leslie Restartwell, reported in message 21539 \u2014 read it, then journal helper finish 210 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "work 2233 is still open, with nothing logged \u2014 journal work log 2233 \"<what was decided or done, and why>\" \u2014 then journal work end 2233 --how \"<what landed>\", or journal work park 2233 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "open_viewer and the boots on quiet-restart came back - Run open_viewer and the\u2026", "meta": {"from": "journal"}}
{"content": "your command ran 31s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "work 2233 is still open \u2014 end it or park it before you stop: journal work end 2233 --how \"<what landed>\", or journal work park 2233 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "the grouping of the 20 failures on quiet-restart came back - Group the 20\u2026", "meta": {"from": "journal"}}
{"content": "helper 210, Leslie Restartwell, reported in message 21547 \u2014 read it, then journal helper finish 210 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "work 2233 is still open \u2014 end it or park it before you stop: journal work end 2233 --how \"<what landed>\", or journal work park 2233 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "open_viewer and the boots after the install fix came back - Rerun open_viewer\u2026", "meta": {"from": "journal"}}
{"content": "work 2233 is still open \u2014 end it or park it before you stop: journal work end 2233 --how \"<what landed>\", or journal work park 2233 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 210, Leslie Restartwell, reported in message 21553 \u2014 read it, then journal helper finish 210 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "Leslie Restartwell's 2.267.11 version commit came back - Leslie Restartwell\u2026", "meta": {"from": "journal"}}
{"content": "work 2233 is still open \u2014 end it or park it before you stop: journal work end 2233 --how \"<what landed>\", or journal work park 2233 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 210, Leslie Restartwell, reported in message 21553 \u2014 read it, then journal helper finish 210 once its work is taken or dropped; the whole suite on 2.267.11 came back - Run the whole suite on 2.267.11\u2026", "meta": {"from": "journal"}}
{"content": "work 2233 is still open \u2014 end it or park it before you stop: journal work end 2233 --how \"<what landed>\", or journal work park 2233 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "the await tag does this in one step \u2014 [!await] makes the rest of the turn what you wait for; [!await on=(\"<id>\", \"helper:<n>\")] waits on those; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "helper 210, Leslie Restartwell, reported in message 21559 \u2014 read it, then journal helper finish 210 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "Leslie Restartwell's fix for the gate restart test came back - Leslie\u2026", "meta": {"from": "journal"}}
{"content": "work 2233 is still open \u2014 end it or park it before you stop: journal work end 2233 --how \"<what landed>\", or journal work park 2233 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "the gate, open_viewer and boots run on e6df6e758 came back - Run the gate\u2026", "meta": {"from": "journal"}}
{"content": "your command ran 32s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "work 2233 is still open \u2014 end it or park it before you stop: journal work end 2233 --how \"<what landed>\", or journal work park 2233 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "the rerun naming the one failure came back - Show the one failure completed\u2026", "meta": {"from": "journal"}}
{"content": "work 2233 is still open \u2014 end it or park it before you stop: journal work end 2233 --how \"<what landed>\", or journal work park 2233 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 210, Leslie Restartwell, reported in message 21559 \u2014 read it, then journal helper finish 210 once its work is taken or dropped; the final whole suite on 2.267.11 came back - Run the whole suite again on the\u2026", "meta": {"from": "journal"}}
{"content": "rule 57 \u2014 Never merge the overnight refactor into main before its pull request\u2026 \u2014 Messages 15005, 15006, 15109, 15110 (2026-10-04): all refactor work goes on branch overnight-refactor and reaches the user as one pull request, which they read in the morning; nothing of it is merged into main until they say so. Hotfixes the user explicitly asks for go to main at once and are merged into the branch.", "meta": {"from": "journal"}}
{"content": "rule 41 \u2014 Keep moving, run the whole suite before every commit, never wait \u2014 The full suite runs in about seven seconds: .venv/bin/python -m pytest -q --timeout=300 -n auto. Run it before every commit instead of picking tests by name. Group rows that sit in the same code into one sitting: write them all, test once, commit once. And never wait, not for a subagent, a build, or an answer you can carry on without. Dispatch it and keep working. If you truly are waiting on something, say so in the work log.", "meta": {"from": "journal"}}
{"content": "fact 9 \u2014 Every public method on a controller becomes a journal command \u2014 The CLI is generated from the controllers: each public method of Controller, or of a typed controller, turns into journal <noun> <method>. A helper added to the base class therefore becomes a command on every type \u2014 which is how journal <type> handled and journal <type> refuse came to exist, from the CRUD funnel and the refusal funnel. An internal helper on a controller is named with a leading underscore, as _shaped and _status already are, or it ships as a command nobody meant.; rule 35 \u2014 Write clean code - one funnel per kind of operation, never the same\u2026 \u2014 Every kind of operation has one funnel: one method that creates, one that saves, one that refuses, one that formats. A second method that does the same thing under another name splits the behaviour, and the two drift apart. Before writing a method, search for the one that already does it and extend that. scripts/checks/funnels.py finds bodies written twice.; rule 55 \u2014 Always dispatch Codex helpers on gpt-6-sol \u2014 The user's word, message 13431: switch the codex agents to GPT-6-Sol and make it their default. ~/.codex/config.toml names it as the default model too.; rule 56 \u2014 Helpers are for work that writes; subagents read, research and design \u2014 The user, message 13464: there must be a clear distinction. A subagent can be dispatched for anything read-only: research, review, design. A helper is for actual work that writes, best in its own worktree when the work is separate. Dieter designing in Claude Design should have been a subagent, not a helper.", "meta": {"from": "journal"}}
{"content": "helper 210, Leslie Restartwell, has stood idle for 3 minutes \u2014 it finished its turn and waits for work: journal helper say 210 \"<the next work>\", or journal helper finish 210 once its work is taken", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "helper 210, Leslie Restartwell, reported in message 21578 \u2014 read it, then journal helper finish 210 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 52 \u2014 A chat mark for something the user did sits on the user's side \u2014 Message 10960 (2026-09-25): marks for the user's own actions, such as answering a question, are right-aligned like the user's messages. A mark is put there by giving its card side=user.", "meta": {"from": "journal"}}
{"content": "1 new message 21581 - answer by opening your turn with [!reply:21581]", "meta": {"from": "journal"}}
{"content": "answer message 21581 before you write anything \u2014 answer by opening your turn with [!reply:21581]. a reply, a reaction, or journal message processed <n>; request GET /api/main/dashboard is slower than its budget \u2014 287ms last (89ms of it working, 24ms waiting on locks), against a budget of 50ms. Seen 1 time.", "meta": {"from": "journal"}}
{"content": "rule 48 \u2014 The viewer is built from its component library, and pages only\u2026 \u2014 Message 4258. Every visual piece the viewer shows more than once, or that a user would recognise as the same kind of thing (a dialog, a side panel or inspector, a dropdown, a list row, a switch, a button), is one component in web/src/kit, extracted aggressively, and every page composes those components instead of building its own copy. Before writing markup or styles in a page, look for the kit component that already does it and extend it with a prop; a second hand-built version is a bug. The side panel that animated in but not out, while a separate skill panel did both, is the example.", "meta": {"from": "journal"}}
{"content": "fact 18 \u2014 cProfile inflates the slow-request profiles about tenfold \u2014 The faults feature writes a profile when a request passes its budget, and the profile is taken with cProfile, which adds per-call overhead. On 2026-09-22 /api/summary profiled at 58ms with 48ms inside Resource.fork's deep copy; with the profiler off the same call ran in 2 to 7ms. Read the profile for where the time goes in relative terms, then time the call with curl before changing anything.; fact 24 \u2014 An answer followed by tool calls can be missing from Claude's\u2026 \u2014 Seen 2026-09-24 for messages 9391-9404: text blocks opening with [!reply:n] that were followed by tool calls never appeared in the session's jsonl (only thinking and tool_use rows did), so the journal never saw them and the replies were lost. When a turn goes on after answering, send the answer with journal message reply <n> \"<text>\" instead of the tag.; rule 61 \u2014 Features wait as pull requests until approved; only hotfixes merge\u2026 \u2014 Message 17118 (2026-10-06), after the overnight refactor merged as 2.252.0: start new work in a new branch, do not merge, write the pull request. Every pull request or new feature is parked until the user approves it. Hotfixes can be merged into main immediately (by a dispatched agent in a worktree of main, rule 60).; to-do 3650 came from message 21581? \u2014 link it: journal message process 21581 \"<their words>\" todo:3650", "meta": {"from": "journal"}}
{"content": "fact 34 \u2014 A hooks list in a checkout's .claude/settings.json stops every\u2026 \u2014 Seen 2026-10-08: since commit 707a82915 the committed .claude/settings.json held {\"hooks\": []}; current Claude Code answers a hooks value that is not an object with a SettingsWarning dialog, which a headless helper cannot answer, so helpers 183 and 184 exited before doing anything (their launch logs in .journal/runtime/launches/ show it). This repository's journal hooks live in settings.local.json; the committed settings.json stays {}.", "meta": {"from": "journal"}}
{"content": "rule 43 \u2014 A request or hook over its budget is fixed before the next release \u2014 Comment 1151 on this rule. When the faults feature reports a request, a hook or a command slower than its budget, file it as a to-do at once. It does not jump ahead of the work in hand, but no version is published while one is still open: profile it, fix it, and verify the new time before the release goes out. The budget is 50ms, because everything runs locally against files.", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread todo 3650", "meta": {"from": "journal"}}
{"content": "1 new message 21592 - answer by opening your turn with [!reply:21592]", "meta": {"from": "journal"}}
{"content": "answer message 21592 before you write anything \u2014 answer by opening your turn with [!reply:21592]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "fact 13 \u2014 This live session runs the installed copy in .journal/journal.pyz \u2014 The running journal (server, hooks, CLI) runs from .journal/journal.pyz with its viewer and skills in .journal/src, never from the repo. A change in the repo reaches it only through python3 src/journal.py --root .journal upgrade, which packs the zip again. A commit alone changes nothing that is running.", "meta": {"from": "journal"}}
{"content": "rule 46 \u2014 Only commit and push once the whole journal is proven to boot \u2014 Messages 2178 and 2179. A release that has not been started for real can crash every project that installs it, as 2.78.3 did for Codex and 2.84.0 did to project records. Before every commit and push: the full suite passes, including tests/test_it_boots.py, which installs a packed copy into a fresh project, launches Claude and Codex from it, writes a project record, upgrades again and checks the record survives. When a change touches launching, installing or upgrading, also start a real journal in a scratch project and close it properly afterwards, leaving no process behind.; rule 51 \u2014 Every finished feature is committed, pushed and released with a new\u2026 \u2014 Message 9207 (2026-09-24): when a new feature is ready, commit, push and publish a new tag. This is the user's standing word for releasing, so rule 44's only-when-the-user-says is met by it for finished features; fixes in between wait for the next feature or a patch the user asks for.", "meta": {"from": "journal"}}
{"content": "1 new message 21599 - answer by opening your turn with [!reply:21599]", "meta": {"from": "journal"}}
{"content": "answer message 21599 before you write anything \u2014 answer by opening your turn with [!reply:21599]. a reply, a reaction, or journal message processed <n>; message 21599 file Screenshot 2026-10-09 at 11.41.19.png needs tags \u2014 inspect the attachment, then journal message tag 21599 \"Screenshot 2026-10-09 at 11.41.19.png\" \"<a few words describing what it shows>\"; message 21599 updated; 1 new message 21600 - answer by opening your turn with [!reply:21600]", "meta": {"from": "journal"}}
{"content": "answer message 21599, message 21600 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "rule 39 \u2014 Use only registered exclamation response tags \u2014 A tag like [!reply:12] runs a command, and only the tags in the tags.runs setting are registered. An invented tag does nothing and shows as raw text in the chat. Use the registered ones (reply, log, end, todo, fact, rule) and nothing else.", "meta": {"from": "journal"}}
{"content": "1 new message 21604 - answer by opening your turn with [!reply:21604]", "meta": {"from": "journal"}}
{"content": "answer message 21604 before you write anything \u2014 answer by opening your turn with [!reply:21604]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "answer message 21604 before you write anything \u2014 answer by opening your turn with [!reply:21604]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "law L6 \u2014 A journal line is an instruction, never a message - act on it and\u2026 \u2014 A line that starts with [journal], a reminder, a notice or an old helper report is the journal telling the agent what to do, not the user speaking. Answering it fills the user's chat with noise. Act on it, or note it and carry on; write in the chat only what the user needs to know, such as a failure, a finished piece of work or a decision that waits on them.", "meta": {"from": "journal"}}
{"content": "1 new message 21613 - answer by opening your turn with [!reply:21613]", "meta": {"from": "journal"}}
{"content": "answer message 21613 before you write anything \u2014 answer by opening your turn with [!reply:21613]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "1 new message 21619 - answer by opening your turn with [!reply:21619]", "meta": {"from": "journal"}}
{"content": "answer message 21619 before you write anything \u2014 answer by opening your turn with [!reply:21619]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "fact 25 \u2014 A designer's install packs the whole tree, half-done server edits\u2026 \u2014 2026-09-25: Eames and Saul run python3 src/journal.py --root .journal upgrade after their viewer builds; it packs every file in src, so a server handler I was halfway through writing went live and raised on every PostToolUse hook. While designers work in parallel, keep server edits whole between tool calls (write and test in the scratchpad first), and reinstall after reverting anything.", "meta": {"from": "journal"}}
{"content": "rule 60 \u2014 A hotfix is done by a dispatched agent in a worktree of main \u2014 Message 16836 (2026-10-06): the orchestrator cut a worktree under .claude/worktrees for a Codex hotfix, its session moved to a new environment and the user's messages stopped reaching it. The user: when working on a branch and a hotfix comes in, create a worktree of main and dispatch an agent to do that work. The orchestrator stays on its branch and in its environment, and never cds into another checkout.", "meta": {"from": "journal"}}
{"content": "fact 27 \u2014 Running src/journal.py against the live .journal root starts a\u2026 \u2014 Seen 2026-10-01: with VERSION bumped in the tree, src/journal.py --root .journal saw the live server as another build and started a new one on a new port (8431, 8432), and the user's tabs kept losing connection. Run source builds against a throwaway or demo root (~/projects/demo-crumb/.journal), never the live one, until the release is installed.; fact 28 \u2014 The designer agent type exists, so design work goes to a subagent \u2014 Since 2026-10-01 .claude/agents/designer.md (Dieter, Opus, Claude Design tools, read-only on the repository) is an agent type; rule 56 says design is a subagent's job, never a helper's.", "meta": {"from": "journal"}}
{"content": "rule 58 \u2014 A design runs three critique rounds, then is built on a branch \u2014 Messages 17276 and 17281 (2026-10-06): the norm is a three-round cycle. Round by round, the designer designs (or revises), separate critic agents review the design through their lenses (the critic agent type, .claude/agents/critic.md: read-only, with a browser; one per lens, such as first-time, native, words and parity), and the designer adjusts it to their findings; three rounds in all. The three rounds stand in for the user's approval of the design: the user does not approve it. After the third round the design is built on a branch of its own, which ends in a pull request that waits for the user's approval (rule 61). Replaces message 15725's prototype approval.", "meta": {"from": "journal"}}
{"content": "rule 37 \u2014 Close every to-do explicitly with todo done or a Journal commit\u2026 \u2014 Ending work does not close its row. A to-do is closed by journal todo done <n> --how, or by a commit whose message carries Journal: todos done <n> at column 0, several numbers separated by commas. A row left open after its work landed misleads the next session and auto mode.", "meta": {"from": "journal"}}
{"content": "rule 64 \u2014 A finished feature is merged into main without waiting for approval \u2014 The user, message 17815 (2026-10-07): 'make sure that no pull requests are lingering on the repository. You may merge them into main... You are allowed to merge everything into main once the feature is completed.' This replaces rule 61's wait for approval: a feature still goes on its own branch, and once it is complete, tested and its whole suite passes, it is merged into main and released, and no pull request is left open.", "meta": {"from": "journal"}}
{"content": "1 new message 21624 - answer by opening your turn with [!reply:21624]", "meta": {"from": "journal"}}
{"content": "answer message 21624 before you write anything \u2014 answer by opening your turn with [!reply:21624]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "answer message 21624 before you write anything \u2014 answer by opening your turn with [!reply:21624]. a reply, a reaction, or journal message processed <n>; the todo tag does this in one step \u2014 [!todo=\"the title\"] files it with the turn as its brief; it runs only when it opens the last text of your turn; 1 new message 21625 - answer by opening your turn with [!reply:21625]", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "your last message ran its paragraphs together \u2014 a blank line between parts is what makes a message readable: one thought to a paragraph", "meta": {"from": "journal"}}
{"content": "fact 23 \u2014 Every upgrade brings system sequences and their triggers in line\u2026 \u2014 install.py runs ship_sequences after the migrations on each upgrade, so features/sequences/shipped.py is the whole source: change its wording and the next upgrade updates every journal, no migration needed. Shipped rows carry system=True and are read-only for everyone but SYSTEM (controllers/base.py _shipped).; rule 27 \u2014 Name a declaration with the word a reader already knows \u2014 An attribute, a variable or a field gets the ordinary programming word for what it holds, not an evocative one. was, heard and alone were poetry; aliases, notify_actions and urgent_actions are what they are. The test: could a reader who has never seen this codebase guess what it holds from the name alone? Prose belongs in the help text and the abstract, where it is read as prose. This does not license abbreviations \u2014 a plain word in full, not a short one.; rule 50 \u2014 Everything the user does is doable in the viewer \u2014 Message 6710 (2026-09-23): the user never uses the CLI, only the UI; everything should be doable from the viewer. The journal commands are for agents; any action meant for the user (making boards, confirming, accepting, hosting, watching an agent) needs its place in the viewer.", "meta": {"from": "journal"}}
{"content": "law L1 \u2014 Every subagent dispatch names its model and chooses the least\u2026 \u2014 Use a fast, economical model for mechanical work with a known answer, a capable general model for careful implementation, and the strongest model only when the task turns on difficult judgement. Inheriting the orchestrator's model is not a model choice. If the dispatch API cannot accept a model, that operation is exempt.; law L4 \u2014 Related work goes back to the helper or subagent that already worked\u2026 \u2014 A helper or subagent that drew a design, wrote the code or ran the research keeps what it learned. When new work changes its work, is related to it or touches the same code, send it there with a message (SendMessage, journal helper say) rather than dispatching a new one that has to rediscover everything; start fresh only when the earlier one is gone or the new work is unrelated.; law L5 \u2014 Every subagent dispatch names the agent, in the naming style of the\u2026 \u2014 A name is how the user and the chat tell subagents apart and how they are messaged later; an id or a task line is not a name. Start the dispatch's description with the name, a colon, then the task. The profile in use says how its agents are named.; rule 65 \u2014 Run only new and affected tests while working; the whole suite only\u2026 \u2014 The user, messages 17914 to 17917 (2026-10-07): 'stop running the whole test suite and wasting my time... please only run the new or affected tests, and then, whenever you are merging to main or publishing to main, you can run the full test suite.' Replaces rule 41's whole suite before every commit: on a feature branch, run the tests beside what changed (journal check touched, or the feature's test.py and the browser scenarios it touches); the whole suite runs once, before a merge into main and its release.", "meta": {"from": "journal"}}
{"content": "your answer to a journal line was kept out of the chat \u2014 a journal line is an instruction, not a message: act on it and write nothing, unless the user needs to know something such as a failure, finished work or a decision that waits on them", "meta": {"from": "journal"}}
{"content": "auto mode is on and work 2236 stands still while todo 3658 is ready \u2014 if work 2236 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3658. Stop only when nothing ready is left.; work 2236 is still open, with nothing logged \u2014 journal work log 2236 \"<what was decided or done, and why>\" \u2014 then journal work end 2236 --how \"<what landed>\", or journal work park 2236 \"<why it waits>\"; 1 new message 21631 - answer by opening your turn with [!reply:21631]", "meta": {"from": "journal"}}
{"content": "answer message 21631 before you write anything \u2014 answer by opening your turn with [!reply:21631]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "fact 9 \u2014 Every public method on a controller becomes a journal command \u2014 The CLI is generated from the controllers: each public method of Controller, or of a typed controller, turns into journal <noun> <method>. A helper added to the base class therefore becomes a command on every type \u2014 which is how journal <type> handled and journal <type> refuse came to exist, from the CRUD funnel and the refusal funnel. An internal helper on a controller is named with a leading underscore, as _shaped and _status already are, or it ships as a command nobody meant.; rule 67 \u2014 Never answer a journal line in the chat; act on it silently \u2014 The user, messages 19360 and 19365: the agent kept writing chat lines in reply to the journal's own reminders (old helper reports, notices), filling the user's chat with noise. A journal line is an instruction to the agent, not a message: act on it and write nothing, unless the user needs to know something (a failure, a finished piece of work, a decision that waits on them). The journal itself should enforce it, not a local reminder.", "meta": {"from": "journal"}}
{"content": "work 2236 is still open \u2014 end it or park it before you stop: journal work end 2236 --how \"<what landed>\", or journal work park 2236 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread worktree 101", "meta": {"from": "journal"}}
{"content": "1 new message 21637 - answer by opening your turn with [!reply:21637]", "meta": {"from": "journal"}}
{"content": "answer message 21637 before you write anything \u2014 answer by opening your turn with [!reply:21637]. a reply, a reaction, or journal message processed <n>; message 21637 updated", "meta": {"from": "journal"}}
{"content": "answer message 21637 before you write anything \u2014 answer by opening your turn with [!reply:21637]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "question 218 completed", "meta": {"from": "journal"}}
{"content": "helper 210, Leslie Restartwell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 210 \"<the next work>\", or journal helper finish 210 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 212, Grace Hotfixwell, reported in message 21646 \u2014 read it, then journal helper finish 212 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "Grace Hotfixwell's 2.267.12 hotfix came back - Grace Hotfixwell - Alfred\u2026; request POST /api/main/message is slower than its budget \u2014 1268ms last (254ms of it working, then 474ms more after it answered), against a budget of 50ms. Seen 1 time.; message 21647 file Screenshot 2026-10-09 at 11.54.19.png needs tags \u2014 inspect the attachment, then journal message tag 21647 \"Screenshot 2026-10-09 at 11.54.19.png\" \"<a few words describing what it shows>\"; request GET /api/main/dashboard is slower than its budget \u2014 204ms last (103ms of it working, then 333ms more after it answered), against a budget of 50ms. Seen 1 time.; 1 new message 21647 - answer by opening your turn with [!reply:21647]; message 21647 updated", "meta": {"from": "journal"}}
{"content": "1 new message 21648 - answer by opening your turn with [!reply:21648]", "meta": {"from": "journal"}}
{"content": "1 new message 21649 - answer by opening your turn with [!reply:21649]", "meta": {"from": "journal"}}
{"content": "1 new message 21650 - answer by opening your turn with [!reply:21650]", "meta": {"from": "journal"}}
{"content": "your command ran 30s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 21654 - answer by opening your turn with [!reply:21654]; message 21654 updated", "meta": {"from": "journal"}}
{"content": "message 21654 file Screenshot 2026-10-09 at 11.55.20.png needs tags \u2014 inspect the attachment, then journal message tag 21654 \"Screenshot 2026-10-09 at 11.55.20.png\" \"<a few words describing what it shows>\"", "meta": {"from": "journal"}}
{"content": "answer message 21647, message 21648, message 21654 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>; 1 new message 21658 - answer by opening your turn with [!reply:21658]", "meta": {"from": "journal"}}
{"content": "your command ran 122s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself; message 21658 file Screenshot 2026-10-09 at 11.56.32.png needs tags \u2014 inspect the attachment, then journal message tag 21658 \"Screenshot 2026-10-09 at 11.56.32.png\" \"<a few words describing what it shows>\"; to-do 3661 came from message 21647? \u2014 link it: journal message process 21647 \"<their words>\" todo:3661; to-do 3662 came from message 21647? \u2014 link it: journal message process 21647 \"<their words>\" todo:3662; fact 13 \u2014 This live session runs the installed copy in .journal/journal.pyz \u2014 The running journal (server, hooks, CLI) runs from .journal/journal.pyz with its viewer and skills in .journal/src, never from the repo. A change in the repo reaches it only through python3 src/journal.py --root .journal upgrade, which packs the zip again. A commit alone changes nothing that is running.; rule 45 \u2014 No prose words as names in code - said, says, heard, spoke, told\u2026 \u2014 Messages 1360 and 1698. The user has said more than once that code must not read like prose: a variable, attribute, property or function is named for what it holds or does (text, command, labels, lines), never with a verb from a story. 'says' on the Design type (1360) and 'said = call.said.lower()' in features/recital.py (1698) are the examples. Rule 27 states the naming rule; this one carries the words, so writing one of them whispers it. Before writing a name, ask whether a reader who has never seen the code would know what it holds.; message 21658 updated", "meta": {"from": "journal"}}
{"content": "answer message 21658 before you write anything \u2014 answer by opening your turn with [!reply:21658]. a reply, a reaction, or journal message processed <n>; rule 49 \u2014 A dialog whose content grows keeps one fixed height, and its content\u2026 \u2014 Message 5361, after asking more than once: a dialog that shows output as it arrives (install, update, logs) opens at its final height and never jumps; only its content scrolls.", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat; answer message 21658 before you write anything \u2014 answer by opening your turn with [!reply:21658]. a reply, a reaction, or journal message processed <n>; your last message ran its paragraphs together \u2014 a blank line between parts is what makes a message readable: one thought to a paragraph", "meta": {"from": "journal"}}
{"content": "the reply tag on 21647,21648 did not run \u2014 ! you already answered this in comment 3308: add to that answer with journal comment update 3308 rather than a second reply - add what is missing to the tag itself; work 2236 is still open \u2014 end it or park it before you stop: journal work end 2236 --how \"<what landed>\", or journal work park 2236 \"<why it waits>\"; rule 66 \u2014 The journal never slows the agent down \u2014 The user, message 18990, after hooks timed out and waited on locks under load: the journal must never, ever decrease the performance of an agent. A hook answers at once with what decides the tool call; everything else runs after, in the background, and reaches the agent as a message. No hook waits on a lock it does not need.", "meta": {"from": "journal"}}
{"content": "answer message 21658 before you write anything \u2014 answer by opening your turn with [!reply:21658]. a reply, a reaction, or journal message processed <n>; your last message ran its paragraphs together \u2014 a blank line between parts is what makes a message readable: one thought to a paragraph; work 2236 is still open \u2014 end it or park it before you stop: journal work end 2236 --how \"<what landed>\", or journal work park 2236 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "the reply tag on 21654 did not run \u2014 ! you already answered this in comment 3309: add to that answer with journal comment update 3309 rather than a second reply - add what is missing to the tag itself; there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each; your last message ran its paragraphs together \u2014 a blank line between parts is what makes a message readable: one thought to a paragraph; 1 new message 21661 - answer by opening your turn with [!reply:21661]", "meta": {"from": "journal"}}
{"content": "answer message 21661 before you write anything \u2014 answer by opening your turn with [!reply:21661]. a reply, a reaction, or journal message processed <n>; the reply tag on 21658 did not run \u2014 ! you already answered this in comment 3310: add to that answer with journal comment update 3310 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "answer message 21661 before you write anything \u2014 answer by opening your turn with [!reply:21661]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "answer message 21661 before you write anything \u2014 answer by opening your turn with [!reply:21661]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "the reply tag on 21661 did not run \u2014 ! you already answered this in comment 3312: add to that answer with journal comment update 3312 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "waiting: 2 unread todos 3661, 3662", "meta": {"from": "journal"}}
{"content": "1 new message 21666 - answer by opening your turn with [!reply:21666]; message 21666 updated", "meta": {"from": "journal"}}
{"content": "answer message 21666 before you write anything \u2014 answer by opening your turn with [!reply:21666]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "helper 210, Leslie Restartwell, reported in message 21667 \u2014 read it, then journal helper finish 210 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 21669 - answer by opening your turn with [!reply:21669]", "meta": {"from": "journal"}}
{"content": "answer message 21669 before you write anything \u2014 answer by opening your turn with [!reply:21669]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "1 new message 21670 - answer by opening your turn with [!reply:21670]", "meta": {"from": "journal"}}
{"content": "answer message 21670 before you write anything \u2014 answer by opening your turn with [!reply:21670]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "answer message 21670 before you write anything \u2014 answer by opening your turn with [!reply:21670]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "answer message 21670 before you write anything \u2014 answer by opening your turn with [!reply:21670]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "answer message 21670 before you write anything \u2014 answer by opening your turn with [!reply:21670]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread todo 3669; 1 unread worktree 102", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "1 new message 21678 - answer by opening your turn with [!reply:21678]", "meta": {"from": "journal"}}
{"content": "message 21678 updated", "meta": {"from": "journal"}}
{"content": "answer message 21678 before you write anything \u2014 answer by opening your turn with [!reply:21678]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "1 new message 21682 - answer by opening your turn with [!reply:21682]", "meta": {"from": "journal"}}
{"content": "answer message 21682 before you write anything \u2014 answer by opening your turn with [!reply:21682]. a reply, a reaction, or journal message processed <n>; message 21682 updated", "meta": {"from": "journal"}}
{"content": "answer message 21682 before you write anything \u2014 answer by opening your turn with [!reply:21682]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "your last message ran its paragraphs together \u2014 a blank line between parts is what makes a message readable: one thought to a paragraph", "meta": {"from": "journal"}}
{"content": "the user put \u2764\ufe0f on comment 3318. Act on it if it asks for something, such as a go-ahead. It needs no written reply; when it answers a message of the user's own, react to that message in turn. The chat never mentions it", "meta": {"from": "journal"}}
{"content": "1 new message 21689 - answer by opening your turn with [!reply:21689]", "meta": {"from": "journal"}}
{"content": "answer message 21689 before you write anything \u2014 answer by opening your turn with [!reply:21689]. a reply, a reaction, or journal message processed <n>; message 21689 updated", "meta": {"from": "journal"}}
{"content": "helper 213, Grace Hopperfast, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 213 \"<the next work>\", or journal helper finish 213 once its work is taken", "meta": {"from": "journal"}}
{"content": "the user put \ud83d\udc4d on comment 3319. Act on it if it asks for something, such as a go-ahead. It needs no written reply; when it answers a message of the user's own, react to that message in turn. The chat never mentions it", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread message 21690", "meta": {"from": "journal"}}
{"content": "there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each; answer message 21690 before you write anything \u2014 answer by opening your turn with [!reply:21690]. a reply, a reaction, or journal message processed <n>; 1 new message 21690 - answer by opening your turn with [!reply:21690]", "meta": {"from": "journal"}}
{"content": "1 new message 21698 - answer by opening your turn with [!reply:21698]; message 21698 updated", "meta": {"from": "journal"}}
{"content": "answer message 21698 before you write anything \u2014 answer by opening your turn with [!reply:21698]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "1 new message 21699 - answer by opening your turn with [!reply:21699]", "meta": {"from": "journal"}}
{"content": "answer message 21698 before you write anything \u2014 answer by opening your turn with [!reply:21698]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "report 96 updated", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "1 new message 21709 - answer by opening your turn with [!reply:21709]; message 21709 updated", "meta": {"from": "journal"}}
{"content": "answer message 21709 before you write anything \u2014 answer by opening your turn with [!reply:21709]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "answer message 21709 before you write anything \u2014 answer by opening your turn with [!reply:21709]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "your last message ran its paragraphs together \u2014 a blank line between parts is what makes a message readable: one thought to a paragraph", "meta": {"from": "journal"}}
{"content": "helper 213, Grace Hopperfast, has stood idle for 12 minutes \u2014 it finished its turn and waits for work: journal helper say 213 \"<the next work>\", or journal helper finish 213 once its work is taken", "meta": {"from": "journal"}}
{"content": "1 new message 21713 - answer by opening your turn with [!reply:21713]", "meta": {"from": "journal"}}
{"content": "answer message 21713 before you write anything \u2014 answer by opening your turn with [!reply:21713]. a reply, a reaction, or journal message processed <n>; 1 new message 21714 - answer by opening your turn with [!reply:21714]", "meta": {"from": "journal"}}
{"content": "answer message 21713 before you write anything \u2014 answer by opening your turn with [!reply:21713]. a reply, a reaction, or journal message processed <n>; the todo tag does this in one step \u2014 [!todo=\"the title\"] files it with the turn as its brief; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "helper 212, Grace Hotfixwell, reported in message 21646 \u2014 read it, then journal helper finish 212 once its work is taken or dropped; the whole suite on the 2.267.12 hotfix came back - Run the whole suite on the\u2026", "meta": {"from": "journal"}}
{"content": "rule 46 \u2014 Only commit and push once the whole journal is proven to boot \u2014 Messages 2178 and 2179. A release that has not been started for real can crash every project that installs it, as 2.78.3 did for Codex and 2.84.0 did to project records. Before every commit and push: the full suite passes, including tests/test_it_boots.py, which installs a packed copy into a fresh project, launches Claude and Codex from it, writes a project record, upgrades again and checks the record survives. When a change touches launching, installing or upgrading, also start a real journal in a scratch project and close it properly afterwards, leaving no process behind.", "meta": {"from": "journal"}}
{"content": "rule 60 \u2014 A hotfix is done by a dispatched agent in a worktree of main \u2014 Message 16836 (2026-10-06): the orchestrator cut a worktree under .claude/worktrees for a Codex hotfix, its session moved to a new environment and the user's messages stopped reaching it. The user: when working on a branch and a hotfix comes in, create a worktree of main and dispatch an agent to do that work. The orchestrator stays on its branch and in its environment, and never cds into another checkout.; rule 65 \u2014 Run only new and affected tests while working; the whole suite only\u2026 \u2014 The user, messages 17914 to 17917 (2026-10-07): 'stop running the whole test suite and wasting my time... please only run the new or affected tests, and then, whenever you are merging to main or publishing to main, you can run the full test suite.' Replaces rule 41's whole suite before every commit: on a feature branch, run the tests beside what changed (journal check touched, or the feature's test.py and the browser scenarios it touches); the whole suite runs once, before a merge into main and its release.; work 2236 is still open \u2014 end it or park it before you stop: journal work end 2236 --how \"<what landed>\", or journal work park 2236 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 213, Grace Hopperfast, has done nothing for 20 minutes \u2014 check on it: journal helper say 213 \"<what you want to know>\", or journal helper stop 213 if it is stuck", "meta": {"from": "journal"}}
{"content": "helper 212, Grace Hotfixwell, reported in message 21646 \u2014 read it, then journal helper finish 212 once its work is taken or dropped; the boots and every-action rerun on the 2.267.12 tip came back - Rerun the\u2026", "meta": {"from": "journal"}}
{"content": "your command ran 36s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "work 2236 is still open \u2014 end it or park it before you stop: journal work end 2236 --how \"<what landed>\", or journal work park 2236 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 213, Grace Hopperfast, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 213 \"<the next work>\", or journal helper finish 213 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 210, Leslie Restartwell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 210 \"<the next work>\", or journal helper finish 210 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 210, Leslie Restartwell, reported in message 21764 \u2014 read it, then journal helper finish 210 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your last message ran its paragraphs together \u2014 a blank line between parts is what makes a message readable: one thought to a paragraph", "meta": {"from": "journal"}}
{"content": "helper 212, Grace Hotfixwell, reported in message 21646 \u2014 read it, then journal helper finish 212 once its work is taken or dropped; the rerun naming the last boot failure on 2.267.12 came back - Rerun to name\u2026", "meta": {"from": "journal"}}
{"content": "fact 27 \u2014 Running src/journal.py against the live .journal root starts a\u2026 \u2014 Seen 2026-10-01: with VERSION bumped in the tree, src/journal.py --root .journal saw the live server as another build and started a new one on a new port (8431, 8432), and the user's tabs kept losing connection. Run source builds against a throwaway or demo root (~/projects/demo-crumb/.journal), never the live one, until the release is installed.", "meta": {"from": "journal"}}
{"content": "fact 9 \u2014 Every public method on a controller becomes a journal command \u2014 The CLI is generated from the controllers: each public method of Controller, or of a typed controller, turns into journal <noun> <method>. A helper added to the base class therefore becomes a command on every type \u2014 which is how journal <type> handled and journal <type> refuse came to exist, from the CRUD funnel and the refusal funnel. An internal helper on a controller is named with a leading underscore, as _shaped and _status already are, or it ships as a command nobody meant.", "meta": {"from": "journal"}}
{"content": "rule 37 \u2014 Close every to-do explicitly with todo done or a Journal commit\u2026 \u2014 Ending work does not close its row. A to-do is closed by journal todo done <n> --how, or by a commit whose message carries Journal: todos done <n> at column 0, several numbers separated by commas. A row left open after its work landed misleads the next session and auto mode.", "meta": {"from": "journal"}}
{"content": "law L3 \u2014 Read narrowly - grep for the line, sed a range, head the file; never\u2026 \u2014 Everything a tool returns stays in the context for good and is paid for on every turn after it. Search before you read, read the range you need, and cap output with grep, head or tail. Read a whole file only when you need all of it.", "meta": {"from": "journal"}}
{"content": "work 2238 is still open, with nothing logged \u2014 journal work log 2238 \"<what was decided or done, and why>\" \u2014 then journal work end 2238 --how \"<what landed>\", or journal work park 2238 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 210, Leslie Restartwell, reported in message 21778 \u2014 read it, then journal helper finish 210 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "the 2.267.12 install with --yes came back - Install 2.267.12, letting the\u2026", "meta": {"from": "journal"}}
{"content": "fact 34 \u2014 A hooks list in a checkout's .claude/settings.json stops every\u2026 \u2014 Seen 2026-10-08: since commit 707a82915 the committed .claude/settings.json held {\"hooks\": []}; current Claude Code answers a hooks value that is not an object with a SettingsWarning dialog, which a headless helper cannot answer, so helpers 183 and 184 exited before doing anything (their launch logs in .journal/runtime/launches/ show it). This repository's journal hooks live in settings.local.json; the committed settings.json stays {}.", "meta": {"from": "journal"}}
{"content": "todo 3658 next", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "auto mode is on and work 2239 stands still while todo 3659 is ready \u2014 if work 2239 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3659. Stop only when nothing ready is left.; work 2239 is still open, with nothing logged \u2014 journal work log 2239 \"<what was decided or done, and why>\" \u2014 then journal work end 2239 --how \"<what landed>\", or journal work park 2239 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "the reviewer checking report 24 came back - Ada Concordance - check report 24\u2026", "meta": {"from": "journal"}}
{"content": "rule 67 \u2014 Never answer a journal line in the chat; act on it silently \u2014 The user, messages 19360 and 19365: the agent kept writing chat lines in reply to the journal's own reminders (old helper reports, notices), filling the user's chat with noise. A journal line is an instruction to the agent, not a message: act on it and write nothing, unless the user needs to know something (a failure, a finished piece of work, a decision that waits on them). The journal itself should enforce it, not a local reminder.", "meta": {"from": "journal"}}
{"content": "helper 213, Grace Hopperfast, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 213 \"<the next work>\", or journal helper finish 213 once its work is taken", "meta": {"from": "journal"}}
{"content": "todo 3677 next", "meta": {"from": "journal"}}
{"content": "helper 210, Leslie Restartwell, reported in message 21838 \u2014 read it, then journal helper finish 210 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 33s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "work 2240 is still open, with nothing logged \u2014 journal work log 2240 \"<what was decided or done, and why>\" \u2014 then journal work end 2240 --how \"<what landed>\", or journal work park 2240 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "the log tag does this in one step \u2014 [!log:N] makes the turn itself the log entry; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "helper 213, Grace Hopperfast, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 213 \"<the next work>\", or journal helper finish 213 once its work is taken", "meta": {"from": "journal"}}
{"content": "the rerun of the two fixed tests on 2.267.13 came back - Ask Leslie\u2026", "meta": {"from": "journal"}}
{"content": "work 2240 is still open \u2014 end it or park it before you stop: journal work end 2240 --how \"<what landed>\", or journal work park 2240 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "the 2.267.13 install came back - Install 2.267.13 completed - carry on with\u2026", "meta": {"from": "journal"}}
{"content": "helper 213, Grace Hopperfast, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 213 \"<the next work>\", or journal helper finish 213 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 213, Grace Hopperfast, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 213 \"<the next work>\", or journal helper finish 213 once its work is taken", "meta": {"from": "journal"}}
{"content": "1 new message 21935 - answer by opening your turn with [!reply:21935]", "meta": {"from": "journal"}}
{"content": "helper 210, Leslie Restartwell, reported in message 21936 \u2014 read it, then journal helper finish 210 once its work is taken or dropped; message 21935 file Screenshot 2026-10-09 at 13.12.51.png needs tags \u2014 inspect the attachment, then journal message tag 21935 \"Screenshot 2026-10-09 at 13.12.51.png\" \"<a few words describing what it shows>\"; message 21935 updated", "meta": {"from": "journal"}}
{"content": "answer message 21935 before you write anything \u2014 answer by opening your turn with [!reply:21935]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "answer message 21935 before you write anything \u2014 answer by opening your turn with [!reply:21935]. a reply, a reaction, or journal message processed <n>; 1 new message 21937 - answer by opening your turn with [!reply:21937]", "meta": {"from": "journal"}}
{"content": "fact 13 \u2014 This live session runs the installed copy in .journal/journal.pyz \u2014 The running journal (server, hooks, CLI) runs from .journal/journal.pyz with its viewer and skills in .journal/src, never from the repo. A change in the repo reaches it only through python3 src/journal.py --root .journal upgrade, which packs the zip again. A commit alone changes nothing that is running.", "meta": {"from": "journal"}}
{"content": "helper 213, Grace Hopperfast, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 213 \"<the next work>\", or journal helper finish 213 once its work is taken", "meta": {"from": "journal"}}
{"content": "your last message ran its paragraphs together \u2014 a blank line between parts is what makes a message readable: one thought to a paragraph", "meta": {"from": "journal"}}
{"content": "1 new message 21941 - answer by opening your turn with [!reply:21941]", "meta": {"from": "journal"}}
{"content": "answer message 21941 before you write anything \u2014 answer by opening your turn with [!reply:21941]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "answer message 21941 before you write anything \u2014 answer by opening your turn with [!reply:21941]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "helper 210, Leslie Restartwell, reported in message 21945 \u2014 read it, then journal helper finish 210 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "rule 59 \u2014 Every viewer heading and label says plainly what it is about \u2014 The user, messages 16499, 16839, 16844, 16989, 16992 and 16993 (2026-10-06), after 'Where the words count', 'Watch for the words in', 'This project', 'This browser' and 'Stop the journal' as tab names: viewer text reads like Linear, GitHub or Vercel. A place (page, tab, group, sidebar item) is a short noun: Settings, Project, Browser, Services, Updates, Plugins; never 'This project' or a phrase. A button is a verb for what happens: Stop, Install, Copy link, Pause the plan. A heading names what the reader looks at, and its options finish its sentence: 'Trigger when' / 'A word is written'. Plain literal words: no metaphor or whimsy ('kettle on, waiting'), no app speaking as I, none of the journal's internal words (row, hook, nudge, engine, slate). One word for one thing everywhere, sentence case, as short as it can be while clear. Applies to designers' prototypes, helpers' builds, the viewer's JavaScript lists, feature details, and shipped sequence and trigger titles alike.; work 2241 is still open, with nothing logged \u2014 journal work log 2241 \"<what was decided or done, and why>\" \u2014 then journal work end 2241 --how \"<what landed>\", or journal work park 2241 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "1 new message 21948 - answer by opening your turn with [!reply:21948]; message 21948 updated", "meta": {"from": "journal"}}
{"content": "answer message 21948 before you write anything \u2014 answer by opening your turn with [!reply:21948]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "helper 213, Grace Hopperfast, has stood idle for 12 minutes \u2014 it finished its turn and waits for work: journal helper say 213 \"<the next work>\", or journal helper finish 213 once its work is taken", "meta": {"from": "journal"}}
{"content": "suggestion 14 completed", "meta": {"from": "journal"}}
{"content": "the end tag does this in one step \u2014 [!end:N] makes the turn itself what landed; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each; 1 new message 21995 - answer by opening your turn with [!reply:21995]", "meta": {"from": "journal"}}
{"content": "answer message 21995 before you write anything \u2014 answer by opening your turn with [!reply:21995]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "your last message ran its paragraphs together \u2014 a blank line between parts is what makes a message readable: one thought to a paragraph", "meta": {"from": "journal"}}
{"content": "1 new message 21998 - answer by opening your turn with [!reply:21998]", "meta": {"from": "journal"}}
{"content": "1 new message 22007 - answer by opening your turn with [!reply:22007]", "meta": {"from": "journal"}}
{"content": "answer message 22007 before you write anything \u2014 answer by opening your turn with [!reply:22007]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "your last message ran its paragraphs together \u2014 a blank line between parts is what makes a message readable: one thought to a paragraph", "meta": {"from": "journal"}}
{"content": "1 new message 22013 - answer by opening your turn with [!reply:22013]; message 22013 updated", "meta": {"from": "journal"}}
{"content": "answer message 22013 before you write anything \u2014 answer by opening your turn with [!reply:22013]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "helper 210, Leslie Restartwell, reported in message 22014 \u2014 read it, then journal helper finish 210 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 213, Grace Hopperfast, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 213 \"<the next work>\", or journal helper finish 213 once its work is taken", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread todo 3686", "meta": {"from": "journal"}}
{"content": "1 new message 22025 - answer by opening your turn with [!reply:22025]", "meta": {"from": "journal"}}
{"content": "message 22025 updated", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat; answer message 22025 before you write anything \u2014 answer by opening your turn with [!reply:22025]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "answer message 22025 before you write anything \u2014 answer by opening your turn with [!reply:22025]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "helper 213, Grace Hopperfast, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 213 \"<the next work>\", or journal helper finish 213 once its work is taken", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread worktree 103", "meta": {"from": "journal"}}
{"content": "1 new message 22032 - answer by opening your turn with [!reply:22032]; message 22032 updated", "meta": {"from": "journal"}}
{"content": "answer message 22032 before you write anything \u2014 answer by opening your turn with [!reply:22032]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "helper 210, Leslie Restartwell, reported in message 22033 \u2014 read it, then journal helper finish 210 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 22035 - answer by opening your turn with [!reply:22035]; message 22035 updated", "meta": {"from": "journal"}}
{"content": "answer message 22035 before you write anything \u2014 answer by opening your turn with [!reply:22035]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "answer message 22035 before you write anything \u2014 answer by opening your turn with [!reply:22035]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "answer message 22035 before you write anything \u2014 answer by opening your turn with [!reply:22035]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "helper 215, Ada Keywright, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 215 \"<the next work>\", or journal helper finish 215 once its work is taken", "meta": {"from": "journal"}}
{"content": "1 new message 22043 - answer by opening your turn with [!reply:22043]", "meta": {"from": "journal"}}
{"content": "answer message 22043 before you write anything \u2014 answer by opening your turn with [!reply:22043]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "answer message 22043 before you write anything \u2014 answer by opening your turn with [!reply:22043]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "your last message ran its paragraphs together \u2014 a blank line between parts is what makes a message readable: one thought to a paragraph", "meta": {"from": "journal"}}
{"content": "1 new message 22048 - answer by opening your turn with [!reply:22048]", "meta": {"from": "journal"}}
{"content": "there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each; answer message 22048 before you write anything \u2014 answer by opening your turn with [!reply:22048]. a reply, a reaction, or journal message processed <n>; message 22048 updated", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread todo 3692", "meta": {"from": "journal"}}
{"content": "1 new message 22050 - answer by opening your turn with [!reply:22050]", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat; there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each", "meta": {"from": "journal"}}
{"content": "helper 213, Grace Hopperfast, has stood idle for 12 minutes \u2014 it finished its turn and waits for work: journal helper say 213 \"<the next work>\", or journal helper finish 213 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 215, Ada Keywright, reported in message 22055 \u2014 read it, then journal helper finish 215 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 213, Grace Hopperfast, reported in message 22057 \u2014 read it, then journal helper finish 213 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "the whole suite on 2.267.14 came back - Run the whole suite and viewer unit\u2026", "meta": {"from": "journal"}}
{"content": "helper 210, Leslie Restartwell, reported in message 22065 \u2014 read it, then journal helper finish 210 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 34s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your last message ran its paragraphs together \u2014 a blank line between parts is what makes a message readable: one thought to a paragraph; work 2241 is still open \u2014 end it or park it before you stop: journal work end 2241 --how \"<what landed>\", or journal work park 2241 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "the rerun of 2.267.14's two failures alone came back - Rerun the two failures\u2026", "meta": {"from": "journal"}}
{"content": "law L3 \u2014 Read narrowly - grep for the line, sed a range, head the file; never\u2026 \u2014 Everything a tool returns stays in the context for good and is paid for on every turn after it. Search before you read, read the range you need, and cap output with grep, head or tail. Read a whole file only when you need all of it.", "meta": {"from": "journal"}}
{"content": "your last message ran its paragraphs together \u2014 a blank line between parts is what makes a message readable: one thought to a paragraph", "meta": {"from": "journal"}}
{"content": "helper 215, Ada Keywright, has stood idle for 3 minutes \u2014 it finished its turn and waits for work: journal helper say 215 \"<the next work>\", or journal helper finish 215 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 213, Grace Hopperfast, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 213 \"<the next work>\", or journal helper finish 213 once its work is taken", "meta": {"from": "journal"}}
{"content": "1 new message 22073 - answer by opening your turn with [!reply:22073]", "meta": {"from": "journal"}}
{"content": "message 22073 updated", "meta": {"from": "journal"}}
{"content": "answer message 22073 before you write anything \u2014 answer by opening your turn with [!reply:22073]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "the todo tag does this in one step \u2014 [!todo=\"the title\"] files it with the turn as its brief; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread todo 3695", "meta": {"from": "journal"}}
{"content": "the whole suite on the real 2.267.14 came back - Run the whole suite on the\u2026", "meta": {"from": "journal"}}
{"content": "1 new message 22074 - answer by opening your turn with [!reply:22074]", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread message 22074", "meta": {"from": "journal"}}
{"content": "there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each; auto mode is on and work 2241 stands still while todo 3697 is ready \u2014 if work 2241 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3697. Stop only when nothing ready is left.; sequence 27, Checking the instruction files, step 1 of 3 - Read the\u2026 \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 27. Read AGENTS.md and CLAUDE.md at the project root and the journal's block at the head of each, narrowly: grep for the headings, then sed the sections you need. Note every place where two of them tell an agent opposite things, with the file and line on both sides. Then journal sequence next 27 --about <ref>.; sequence 27, Checking the instruction files, is still at step 1 of 3 - carry\u2026 \u2014 finishing it comes before anything else; do the step now, Read the instruction files: Read AGENTS.md and CLAUDE.md at the project root and the journal's block at the head of each, narrowly: grep for the headings, then sed the sections you need. Note every place where two of them tell an agent opposite things, with the file and line on both sides. Then journal sequence next 27 --about <ref>.; message 22074 file Screenshot 2026-10-09 at 13.56.08.png needs tags \u2014 inspect the attachment, then journal message tag 22074 \"Screenshot 2026-10-09 at 13.56.08.png\" \"<a few words describing what it shows>\"; work 2241 is still open \u2014 end it or park it before you stop: journal work end 2241 --how \"<what landed>\", or journal work park 2241 \"<why it waits>\"; message 17229 file IMG_1159.png needs tags \u2014 inspect the attachment, then journal message tag 17229 \"IMG_1159.png\" \"<a few words describing what it shows>\"; message 17246 file IMG_1163.png needs tags \u2014 inspect the attachment, then journal message tag 17246 \"IMG_1163.png\" \"<a few words describing what it shows>\"; message 17302 file IMG_1172.png needs tags \u2014 inspect the attachment, then journal message tag 17302 \"IMG_1172.png\" \"<a few words describing what it shows>\"; message 17380 file IMG_1173.png needs tags \u2014 inspect the attachment, then journal message tag 17380 \"IMG_1173.png\" \"<a few words describing what it shows>\"; message 17397 file IMG_1175.png needs tags \u2014 inspect the attachment, then journal message tag 17397 \"IMG_1175.png\" \"<a few words describing what it shows>\"; message 17848 file Screenshot 2026-10-07 at 19.08.54.png needs tags \u2014 inspect the attachment, then journal message tag 17848 \"Screenshot 2026-10-07 at 19.08.54.png\" \"<a few words describing what it shows>\"; message 18311 file Screenshot 2026-10-08 at 15.32.11.png needs tags \u2014 inspect the attachment, then journal message tag 18311 \"Screenshot 2026-10-08 at 15.32.11.png\" \"<a few words describing what it shows>\"; message 18337 file Screenshot 2026-10-08 at 15.48.03.png needs tags \u2014 inspect the attachment, then journal message tag 18337 \"Screenshot 2026-10-08 at 15.48.03.png\" \"<a few words describing what it shows>\"; message 18400 file Screenshot 2026-10-08 at 16.20.05.png needs tags \u2014 inspect the attachment, then journal message tag 18400 \"Screenshot 2026-10-08 at 16.20.05.png\" \"<a few words describing what it shows>\"; message 18406 file Screenshot 2026-10-08 at 16.24.17.png needs tags \u2014 inspect the attachment, then journal message tag 18406 \"Screenshot 2026-10-08 at 16.24.17.png\" \"<a few words describing what it shows>\"; message 18579 file Screenshot 2026-10-08 at 17.51.57.png needs tags \u2014 inspect the attachment, then journal message tag 18579 \"Screenshot 2026-10-08 at 17.51.57.png\" \"<a few words describing what it shows>\"; the journal is ready on main \u2014 say hello in the chat in plain words, so the journal's messages reach you; message 22074 updated", "meta": {"from": "journal"}}
{"content": "answer message 22074 before you write anything \u2014 answer by opening your turn with [!reply:22074]. a reply, a reaction, or journal message processed <n>; fact 23 \u2014 Every upgrade brings system sequences and their triggers in line\u2026 \u2014 install.py runs ship_sequences after the migrations on each upgrade, so features/sequences/shipped.py is the whole source: change its wording and the next upgrade updates every journal, no migration needed. Shipped rows carry system=True and are read-only for everyone but SYSTEM (controllers/base.py _shipped).", "meta": {"from": "journal"}}
{"content": "answer message 22074 before you write anything \u2014 answer by opening your turn with [!reply:22074]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "rule 35 \u2014 Write clean code - one funnel per kind of operation, never the same\u2026 \u2014 Every kind of operation has one funnel: one method that creates, one that saves, one that refuses, one that formats. A second method that does the same thing under another name splits the behaviour, and the two drift apart. Before writing a method, search for the one that already does it and extend that. scripts/checks/funnels.py finds bodies written twice.; rule 55 \u2014 Always dispatch Codex helpers on gpt-6-sol \u2014 The user's word, message 13431: switch the codex agents to GPT-6-Sol and make it their default. ~/.codex/config.toml names it as the default model too.; rule 56 \u2014 Helpers are for work that writes; subagents read, research and design \u2014 The user, message 13464: there must be a clear distinction. A subagent can be dispatched for anything read-only: research, review, design. A helper is for actual work that writes, best in its own worktree when the work is separate. Dieter designing in Claude Design should have been a subagent, not a helper.", "meta": {"from": "journal"}}
{"content": "sequence 27, Checking the instruction files, step 2 of 3 - Report any\u2026 \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 27. With nothing found, say so in one plain line and move on. Otherwise journal report create \"Contradictions in the instruction files\" --brief \"<each one: both sides with file and line, which should win and why>\". Then journal sequence next 27 --about <ref>.", "meta": {"from": "journal"}}
{"content": "sequence 27, Checking the instruction files, step 3 of 3 - Suggest a fix for\u2026 \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 27. File each fix as a suggestion whose brief holds the exact change, as a diff: journal suggestion suggest \"<the change>\" --brief \"<why, and the diff>\". Never edit the files yourself; the user accepts a suggestion first, and the journal's block is only ever written by the journal. When an accepted fix comes back as a to-do, apply it only where the lines still read as the diff shows; if they changed since, read the files again and propose the fix anew. At most five suggestions wait at a time: when the limit refuses one, write the remaining fixes, each with its diff, into the report of the previous step as sections, link the report from the suggestions you did file, and go on; never leave the step unfinished. Finish with journal sequence next 27 --about <ref>.", "meta": {"from": "journal"}}
{"content": "your command ran 33s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "fact 9 \u2014 Every public method on a controller becomes a journal command \u2014 The CLI is generated from the controllers: each public method of Controller, or of a typed controller, turns into journal <noun> <method>. A helper added to the base class therefore becomes a command on every type \u2014 which is how journal <type> handled and journal <type> refuse came to exist, from the CRUD funnel and the refusal funnel. An internal helper on a controller is named with a leading underscore, as _shaped and _status already are, or it ships as a command nobody meant.", "meta": {"from": "journal"}}
{"content": "helper 215, Ada Keywright, has stood idle for 12 minutes \u2014 it finished its turn and waits for work: journal helper say 215 \"<the next work>\", or journal helper finish 215 once its work is taken; fact 34 \u2014 A hooks list in a checkout's .claude/settings.json stops every\u2026 \u2014 Seen 2026-10-08: since commit 707a82915 the committed .claude/settings.json held {\"hooks\": []}; current Claude Code answers a hooks value that is not an object with a SettingsWarning dialog, which a headless helper cannot answer, so helpers 183 and 184 exited before doing anything (their launch logs in .journal/runtime/launches/ show it). This repository's journal hooks live in settings.local.json; the committed settings.json stays {}.", "meta": {"from": "journal"}}
{"content": "rule 51 \u2014 Every finished feature is committed, pushed and released with a new\u2026 \u2014 Message 9207 (2026-09-24): when a new feature is ready, commit, push and publish a new tag. This is the user's standing word for releasing, so rule 44's only-when-the-user-says is met by it for finished features; fixes in between wait for the next feature or a patch the user asks for.", "meta": {"from": "journal"}}
{"content": "your command ran 34s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "the 2.267.14 push to main came back - Retry the push and show the refusal\u2026", "meta": {"from": "journal"}}
{"content": "your command ran 31s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself; rule 57 \u2014 Never merge the overnight refactor into main before its pull request\u2026 \u2014 Messages 15005, 15006, 15109, 15110 (2026-10-04): all refactor work goes on branch overnight-refactor and reaches the user as one pull request, which they read in the morning; nothing of it is merged into main until they say so. Hotfixes the user explicitly asks for go to main at once and are merged into the branch.; rule 61 \u2014 Features wait as pull requests until approved; only hotfixes merge\u2026 \u2014 Message 17118 (2026-10-06), after the overnight refactor merged as 2.252.0: start new work in a new branch, do not merge, write the pull request. Every pull request or new feature is parked until the user approves it. Hotfixes can be merged into main immediately (by a dispatched agent in a worktree of main, rule 60).", "meta": {"from": "journal"}}
{"content": "helper 210, Leslie Restartwell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 210 \"<the next work>\", or journal helper finish 210 once its work is taken; helper 213, Grace Hopperfast, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 213 \"<the next work>\", or journal helper finish 213 once its work is taken", "meta": {"from": "journal"}}
{"content": "rule 42 \u2014 Every user-facing text passes the formatters before it leaves the\u2026 \u2014 Not only a brief. A title, an abstract, an outcome and every section body are read by a person, so each goes through the same formatters on its way to the viewer \u2014 chat turns, activity items, to-do rows, inspector pages, docs alike. One field formatted out of five is not a rule, it is an accident, and it is how a raw tag ended up in the activity list after the tags feature had been stripping them for weeks. When a new field carries words a person reads, it joins the list in the same place.; rule 43 \u2014 A request or hook over its budget is fixed before the next release \u2014 Comment 1151 on this rule. When the faults feature reports a request, a hook or a command slower than its budget, file it as a to-do at once. It does not jump ahead of the work in hand, but no version is published while one is still open: profile it, fix it, and verify the new time before the release goes out. The budget is 50ms, because everything runs locally against files.", "meta": {"from": "journal"}}
{"content": "your command ran 37s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 51s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself; the 2.267.14 push to main, its boot guard slowed by load 80 came back - Push\u2026", "meta": {"from": "journal"}}
{"content": "request POST /api/run (check create) is slower than its budget \u2014 926ms last (85ms of it working, then 19ms more after it answered), against a budget of 50ms. Seen 1 time.", "meta": {"from": "journal"}}
{"content": "your command ran 44s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "auto mode is on and work 2241 stands still while todo 3701 is ready \u2014 if work 2241 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3701. Stop only when nothing ready is left.; work 2241 is still open \u2014 end it or park it before you stop: journal work end 2241 --how \"<what landed>\", or journal work park 2241 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "law L6 \u2014 A journal line is an instruction, never a message - act on it and\u2026 \u2014 A line that starts with [journal], a reminder, a notice or an old helper report is the journal telling the agent what to do, not the user speaking. Answering it fills the user's chat with noise. Act on it, or note it and carry on; write in the chat only what the user needs to know, such as a failure, a finished piece of work or a decision that waits on them.", "meta": {"from": "journal"}}
{"content": "fact 13 \u2014 This live session runs the installed copy in .journal/journal.pyz \u2014 The running journal (server, hooks, CLI) runs from .journal/journal.pyz with its viewer and skills in .journal/src, never from the repo. A change in the repo reaches it only through python3 src/journal.py --root .journal upgrade, which packs the zip again. A commit alone changes nothing that is running.", "meta": {"from": "journal"}}
{"content": "your command ran 31s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 215, Ada Keywright, has done nothing for 21 minutes \u2014 check on it: journal helper say 215 \"<what you want to know>\", or journal helper stop 215 if it is stuck", "meta": {"from": "journal"}}
{"content": "your command ran 59s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "the 2.267.14 push to main under the test lock came back - Push 2.267.14 under\u2026", "meta": {"from": "journal"}}
{"content": "helper 215, Ada Keywright, has stood idle for 22 minutes \u2014 it finished its turn and waits for work: journal helper say 215 \"<the next work>\", or journal helper finish 215 once its work is taken", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 367ms last (58ms of it working, then 4061ms more after it answered), against a budget of 50ms. Seen 1 time.", "meta": {"from": "journal"}}
{"content": "rule 41 \u2014 Keep moving, run the whole suite before every commit, never wait \u2014 The full suite runs in about seven seconds: .venv/bin/python -m pytest -q --timeout=300 -n auto. Run it before every commit instead of picking tests by name. Group rows that sit in the same code into one sitting: write them all, test once, commit once. And never wait, not for a subagent, a build, or an answer you can carry on without. Dispatch it and keep working. If you truly are waiting on something, say so in the work log.", "meta": {"from": "journal"}}
{"content": "your command ran 40s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 74s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "fact 24 \u2014 An answer followed by tool calls can be missing from Claude's\u2026 \u2014 Seen 2026-09-24 for messages 9391-9404: text blocks opening with [!reply:n] that were followed by tool calls never appeared in the session's jsonl (only thinking and tool_use rows did), so the journal never saw them and the replies were lost. When a turn goes on after answering, send the answer with journal message reply <n> \"<text>\" instead of the tag.", "meta": {"from": "journal"}}
{"content": "work 2241 is still open \u2014 end it or park it before you stop: journal work end 2241 --how \"<what landed>\", or journal work park 2241 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "your command ran 218s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 215, Ada Keywright, reported in message 22115 \u2014 read it, then journal helper finish 215 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "your command ran 224s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 125s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 210, Leslie Restartwell, reported in message 22139 \u2014 read it, then journal helper finish 210 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 99s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 150s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 154s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 246s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 243s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 242s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 123s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 154s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "the hook hit an error \u2014 journal: the hook hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. the hook got no answer from the server 1 times (codes 000)", "meta": {"from": "journal"}}
{"content": "the hook hit an error \u2014 journal: the hook hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. the hook got no answer from the server 1 times (codes down)", "meta": {"from": "journal"}}
{"content": "your command ran 247s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 293s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "the todo tag does this in one step \u2014 [!todo=\"the title\"] files it with the turn as its brief; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "your command ran 337s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 310s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 237s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "your command ran 203s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 205s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 155s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 163s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 174s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 215, Ada Keywright, reported in message 22115 \u2014 read it, then journal helper finish 215 once its work is taken or dropped; auto mode is on and work 2241 stands still while todo 3705 is ready \u2014 if work 2241 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3705. Stop only when nothing ready is left.; the 2.267.14 push and the 2.267.15 hotfix's tests came back - Push 2.267.14\u2026", "meta": {"from": "journal"}}
{"content": "your command ran 225s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "rule 60 \u2014 A hotfix is done by a dispatched agent in a worktree of main \u2014 Message 16836 (2026-10-06): the orchestrator cut a worktree under .claude/worktrees for a Codex hotfix, its session moved to a new environment and the user's messages stopped reaching it. The user: when working on a branch and a hotfix comes in, create a worktree of main and dispatch an agent to do that work. The orchestrator stays on its branch and in its environment, and never cds into another checkout.", "meta": {"from": "journal"}}
{"content": "work 2241 is still open \u2014 end it or park it before you stop: journal work end 2241 --how \"<what landed>\", or journal work park 2241 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 210, Leslie Restartwell, reported in message 22185 \u2014 read it, then journal helper finish 210 once its work is taken or dropped; Leslie's boot guard commit that scales its install timeout by load came back\u2026", "meta": {"from": "journal"}}
{"content": "your command ran 187s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself; rule 54 \u2014 Settings and feature switches are read at boot and on change, never\u2026 \u2014 The user, message 13349: the application boots, determines every feature and setting once, and re-evaluates only when something changes, such as a setting or a plugin. Never lazy-load settings.", "meta": {"from": "journal"}}
{"content": "your command ran 187s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "fact 25 \u2014 A designer's install packs the whole tree, half-done server edits\u2026 \u2014 2026-09-25: Eames and Saul run python3 src/journal.py --root .journal upgrade after their viewer builds; it packs every file in src, so a server handler I was halfway through writing went live and raised on every PostToolUse hook. While designers work in parallel, keep server edits whole between tool calls (write and test in the scratchpad first), and reinstall after reverting anything.", "meta": {"from": "journal"}}
{"content": "your message 22187 names 100 without saying what they are \u2014 put the type before each number, like message 1712 or to-do 644, so the chat links it: journal message edit 22187 \"<the text>\"", "meta": {"from": "journal"}}
{"content": "your command ran 197s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 195s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 198s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 205s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "auto mode is on and work 2241 stands still while todo 3706 is ready \u2014 if work 2241 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3706. Stop only when nothing ready is left.; work 2241 is still open \u2014 end it or park it before you stop: journal work end 2241 --how \"<what landed>\", or journal work park 2241 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "your command ran 165s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 159s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 149s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself; fact 9 \u2014 Every public method on a controller becomes a journal command \u2014 The CLI is generated from the controllers: each public method of Controller, or of a typed controller, turns into journal <noun> <method>. A helper added to the base class therefore becomes a command on every type \u2014 which is how journal <type> handled and journal <type> refuse came to exist, from the CRUD funnel and the refusal funnel. An internal helper on a controller is named with a leading underscore, as _shaped and _status already are, or it ships as a command nobody meant.; fact 34 \u2014 A hooks list in a checkout's .claude/settings.json stops every\u2026 \u2014 Seen 2026-10-08: since commit 707a82915 the committed .claude/settings.json held {\"hooks\": []}; current Claude Code answers a hooks value that is not an object with a SettingsWarning dialog, which a headless helper cannot answer, so helpers 183 and 184 exited before doing anything (their launch logs in .journal/runtime/launches/ show it). This repository's journal hooks live in settings.local.json; the committed settings.json stays {}.; rule 36 \u2014 Clean, DRY, idiomatic before it is committed, never after it is\u2026 \u2014 The user should never be the one who finds duplication, dead code, a clumsy name or a pattern the codebase does not use. Read the diff before every commit as a reviewer would, and fix what is not clean then, not in a follow-up after a complaint.", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "your command ran 135s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "fact 23 \u2014 Every upgrade brings system sequences and their triggers in line\u2026 \u2014 install.py runs ship_sequences after the migrations on each upgrade, so features/sequences/shipped.py is the whole source: change its wording and the next upgrade updates every journal, no migration needed. Shipped rows carry system=True and are read-only for everyone but SYSTEM (controllers/base.py _shipped).", "meta": {"from": "journal"}}
{"content": "helper 210, Leslie Restartwell, has stood idle for 15 minutes \u2014 it finished its turn and waits for work: journal helper say 210 \"<the next work>\", or journal helper finish 210 once its work is taken; helper 213, Grace Hopperfast, has stood idle for 3 minutes \u2014 it finished its turn and waits for work: journal helper say 213 \"<the next work>\", or journal helper finish 213 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 215, Ada Keywright, reported in message 22207 \u2014 read it, then journal helper finish 215 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "fact 20 \u2014 A slim supervisor holds the agent and a worker reloads on every build \u2014 Since 2.118.0 (2026-09-23). src/supervisor.py is standard library only and never reloads: journal claude hands its process over to it (os.execv), and it owns the pty and the agent process, relays the terminal, writes the printed and screen captures, listens on the typist socket, restarts the agent in the same session from a relaunch command written to its runtime folder while a restart is pending, and stops it with escalation while draining the pty (an agent cannot finish exiting on macOS while its output is unread). It starts the worker (src/worker.py, which runs runner/worker.py; engine/worker.py stays as an alias for supervisors started before 2.201) and starts it again whenever it exits: RELOAD on a new build, RELAUNCH to restart the agent, STOP to end, HEAL or a quick crash to roll back a build through journal heal. The worker holds everything else: seating the session, the start-up confirm typed through the typist, services, viewer, update check, check-in, and the one-time relaunch of sessions launched before agents/terminal.py LAUNCH. agents/terminal.py holds only journal-side helpers. The server (serve.py) still runs the engines and re-execs itself on a .py change. When the agent exits, the supervisor runs journal ended, which puts set-aside hooks back and stops the server when no session is left.", "meta": {"from": "journal"}}
{"content": "rule 37 \u2014 Close every to-do explicitly with todo done or a Journal commit\u2026 \u2014 Ending work does not close its row. A to-do is closed by journal todo done <n> --how, or by a commit whose message carries Journal: todos done <n> at column 0, several numbers separated by commas. A row left open after its work landed misleads the next session and auto mode.; 1 new message 22211 - answer by opening your turn with [!reply:22211]", "meta": {"from": "journal"}}
{"content": "1 new message 22212 - answer by opening your turn with [!reply:22212]", "meta": {"from": "journal"}}
{"content": "answer message 22211, message 22212 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "work 2244 is still open, with nothing logged \u2014 journal work log 2244 \"<what was decided or done, and why>\" \u2014 then journal work end 2244 --how \"<what landed>\", or journal work park 2244 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "your command ran 62s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself; your command ran 60s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself; fact 27 \u2014 Running src/journal.py against the live .journal root starts a\u2026 \u2014 Seen 2026-10-01: with VERSION bumped in the tree, src/journal.py --root .journal saw the live server as another build and started a new one on a new port (8431, 8432), and the user's tabs kept losing connection. Run source builds against a throwaway or demo root (~/projects/demo-crumb/.journal), never the live one, until the release is installed.", "meta": {"from": "journal"}}
{"content": "the hook hit an error \u2014 journal: the hook hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. the hook got no answer from the server 1 times (codes 000)", "meta": {"from": "journal"}}
{"content": "to-do 3707 came from message 22211? \u2014 link it: journal message process 22211 \"<their words>\" todo:3707", "meta": {"from": "journal"}}
{"content": "helper 213, Grace Hopperfast, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 213 \"<the next work>\", or journal helper finish 213 once its work is taken", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 1048ms last (58ms of it working, then 38ms more after it answered), against a budget of 50ms. Seen 1 time.", "meta": {"from": "journal"}}
{"content": "1 new message 22240 - answer by opening your turn with [!reply:22240]", "meta": {"from": "journal"}}
{"content": "helper 213, Grace Hopperfast, reported in message 22243 \u2014 read it, then journal helper finish 213 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 210, Leslie Restartwell, reported in message 22245 \u2014 read it, then journal helper finish 210 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 51 \u2014 Every finished feature is committed, pushed and released with a new\u2026 \u2014 Message 9207 (2026-09-24): when a new feature is ready, commit, push and publish a new tag. This is the user's standing word for releasing, so rule 44's only-when-the-user-says is met by it for finished features; fixes in between wait for the next feature or a patch the user asks for.", "meta": {"from": "journal"}}
{"content": "rule 61 \u2014 Features wait as pull requests until approved; only hotfixes merge\u2026 \u2014 Message 17118 (2026-10-06), after the overnight refactor merged as 2.252.0: start new work in a new branch, do not merge, write the pull request. Every pull request or new feature is parked until the user approves it. Hotfixes can be merged into main immediately (by a dispatched agent in a worktree of main, rule 60).", "meta": {"from": "journal"}}
{"content": "fact 34 \u2014 A hooks list in a checkout's .claude/settings.json stops every\u2026 \u2014 Seen 2026-10-08: since commit 707a82915 the committed .claude/settings.json held {\"hooks\": []}; current Claude Code answers a hooks value that is not an object with a SettingsWarning dialog, which a headless helper cannot answer, so helpers 183 and 184 exited before doing anything (their launch logs in .journal/runtime/launches/ show it). This repository's journal hooks live in settings.local.json; the committed settings.json stays {}.; rule 57 \u2014 Never merge the overnight refactor into main before its pull request\u2026 \u2014 Messages 15005, 15006, 15109, 15110 (2026-10-04): all refactor work goes on branch overnight-refactor and reaches the user as one pull request, which they read in the morning; nothing of it is merged into main until they say so. Hotfixes the user explicitly asks for go to main at once and are merged into the branch.", "meta": {"from": "journal"}}
{"content": "fact 9 \u2014 Every public method on a controller becomes a journal command \u2014 The CLI is generated from the controllers: each public method of Controller, or of a typed controller, turns into journal <noun> <method>. A helper added to the base class therefore becomes a command on every type \u2014 which is how journal <type> handled and journal <type> refuse came to exist, from the CRUD funnel and the refusal funnel. An internal helper on a controller is named with a leading underscore, as _shaped and _status already are, or it ships as a command nobody meant.", "meta": {"from": "journal"}}
{"content": "auto mode is on and work 2245 stands still while todo 3712 is ready \u2014 if work 2245 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3712. Stop only when nothing ready is left.; work 2245 is still open \u2014 end it or park it before you stop: journal work end 2245 --how \"<what landed>\", or journal work park 2245 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "rule 38 \u2014 Never change the git branch until the user says so, by name \u2014 The work happens on the branch the user named. That was main until message 5929 and question 80 (2026-09-23), which moved the sins work to the branch sins. Do not create, switch to or merge any other branch unless the user names it in their own words.", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread todo 3713", "meta": {"from": "journal"}}
{"content": "helper 210, Leslie Restartwell, reported in message 22252 \u2014 read it, then journal helper finish 210 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 213, Grace Hopperfast, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 213 \"<the next work>\", or journal helper finish 213 once its work is taken", "meta": {"from": "journal"}}
{"content": "1 new message 22255 - answer by opening your turn with [!reply:22255]", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "the todo tag does this in one step \u2014 [!todo=\"the title\"] files it with the turn as its brief; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "1 new message 22256 - answer by opening your turn with [!reply:22256]", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread worktree 104", "meta": {"from": "journal"}}
{"content": "1 new message 22258 - answer by opening your turn with [!reply:22258]", "meta": {"from": "journal"}}
{"content": "1 new message 22260 - answer by opening your turn with [!reply:22260]", "meta": {"from": "journal"}}
{"content": "message 22260 updated", "meta": {"from": "journal"}}
{"content": "the 2.267.16 suite came back - Run the whole suite on the 2.267.16 tip\u2026", "meta": {"from": "journal"}}
{"content": "work 2245 is still open \u2014 end it or park it before you stop: journal work end 2245 --how \"<what landed>\", or journal work park 2245 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 216, Hedy Linkwell, reported in message 22266 \u2014 read it, then journal helper finish 216 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 210, Leslie Restartwell, reported in message 22276 \u2014 read it, then journal helper finish 210 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "Leslie's fix for the two 2.267.16 suite failures came back - Leslie\u2026", "meta": {"from": "journal"}}
{"content": "work 2245 is still open \u2014 end it or park it before you stop: journal work end 2245 --how \"<what landed>\", or journal work park 2245 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "the rerun of 2.267.16's two failed tests at dd8bd2717 came back - Move the\u2026", "meta": {"from": "journal"}}
{"content": "the 2.267.16 push came back - Tag 2.267.16 and push it to main completed\u2026", "meta": {"from": "journal"}}
{"content": "work 2245 is still open \u2014 end it or park it before you stop: journal work end 2245 --how \"<what landed>\", or journal work park 2245 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "the 2.267.16 install came back - Install 2.267.16 into the live journal\u2026", "meta": {"from": "journal"}}
{"content": "rule 57 \u2014 Never merge the overnight refactor into main before its pull request\u2026 \u2014 Messages 15005, 15006, 15109, 15110 (2026-10-04): all refactor work goes on branch overnight-refactor and reaches the user as one pull request, which they read in the morning; nothing of it is merged into main until they say so. Hotfixes the user explicitly asks for go to main at once and are merged into the branch.; rule 61 \u2014 Features wait as pull requests until approved; only hotfixes merge\u2026 \u2014 Message 17118 (2026-10-06), after the overnight refactor merged as 2.252.0: start new work in a new branch, do not merge, write the pull request. Every pull request or new feature is parked until the user approves it. Hotfixes can be merged into main immediately (by a dispatched agent in a worktree of main, rule 60).; rule 64 \u2014 A finished feature is merged into main without waiting for approval \u2014 The user, message 17815 (2026-10-07): 'make sure that no pull requests are lingering on the repository. You may merge them into main... You are allowed to merge everything into main once the feature is completed.' This replaces rule 61's wait for approval: a feature still goes on its own branch, and once it is complete, tested and its whole suite passes, it is merged into main and released, and no pull request is left open.; rule 66 \u2014 The journal never slows the agent down \u2014 The user, message 18990, after hooks timed out and waited on locks under load: the journal must never, ever decrease the performance of an agent. A hook answers at once with what decides the tool call; everything else runs after, in the background, and reaches the agent as a message. No hook waits on a lock it does not need.", "meta": {"from": "journal"}}
{"content": "helper 213, Grace Hopperfast, reported in message 22283 \u2014 read it, then journal helper finish 213 once its work is taken or dropped; law L3 \u2014 Read narrowly - grep for the line, sed a range, head the file; never\u2026 \u2014 Everything a tool returns stays in the context for good and is paid for on every turn after it. Search before you read, read the range you need, and cap output with grep, head or tail. Read a whole file only when you need all of it.", "meta": {"from": "journal"}}
{"content": "fact 34 \u2014 A hooks list in a checkout's .claude/settings.json stops every\u2026 \u2014 Seen 2026-10-08: since commit 707a82915 the committed .claude/settings.json held {\"hooks\": []}; current Claude Code answers a hooks value that is not an object with a SettingsWarning dialog, which a headless helper cannot answer, so helpers 183 and 184 exited before doing anything (their launch logs in .journal/runtime/launches/ show it). This repository's journal hooks live in settings.local.json; the committed settings.json stays {}.; rule 41 \u2014 Keep moving, run the whole suite before every commit, never wait \u2014 The full suite runs in about seven seconds: .venv/bin/python -m pytest -q --timeout=300 -n auto. Run it before every commit instead of picking tests by name. Group rows that sit in the same code into one sitting: write them all, test once, commit once. And never wait, not for a subagent, a build, or an answer you can carry on without. Dispatch it and keep working. If you truly are waiting on something, say so in the work log.; rule 54 \u2014 Settings and feature switches are read at boot and on change, never\u2026 \u2014 The user, message 13349: the application boots, determines every feature and setting once, and re-evaluates only when something changes, such as a setting or a plugin. Never lazy-load settings.; rule 60 \u2014 A hotfix is done by a dispatched agent in a worktree of main \u2014 Message 16836 (2026-10-06): the orchestrator cut a worktree under .claude/worktrees for a Codex hotfix, its session moved to a new environment and the user's messages stopped reaching it. The user: when working on a branch and a hotfix comes in, create a worktree of main and dispatch an agent to do that work. The orchestrator stays on its branch and in its environment, and never cds into another checkout.; rule 65 \u2014 Run only new and affected tests while working; the whole suite only\u2026 \u2014 The user, messages 17914 to 17917 (2026-10-07): 'stop running the whole test suite and wasting my time... please only run the new or affected tests, and then, whenever you are merging to main or publishing to main, you can run the full test suite.' Replaces rule 41's whole suite before every commit: on a feature branch, run the tests beside what changed (journal check touched, or the feature's test.py and the browser scenarios it touches); the whole suite runs once, before a merge into main and its release.", "meta": {"from": "journal"}}
{"content": "fact 9 \u2014 Every public method on a controller becomes a journal command \u2014 The CLI is generated from the controllers: each public method of Controller, or of a typed controller, turns into journal <noun> <method>. A helper added to the base class therefore becomes a command on every type \u2014 which is how journal <type> handled and journal <type> refuse came to exist, from the CRUD funnel and the refusal funnel. An internal helper on a controller is named with a leading underscore, as _shaped and _status already are, or it ships as a command nobody meant.; rule 35 \u2014 Write clean code - one funnel per kind of operation, never the same\u2026 \u2014 Every kind of operation has one funnel: one method that creates, one that saves, one that refuses, one that formats. A second method that does the same thing under another name splits the behaviour, and the two drift apart. Before writing a method, search for the one that already does it and extend that. scripts/checks/funnels.py finds bodies written twice.; rule 55 \u2014 Always dispatch Codex helpers on gpt-6-sol \u2014 The user's word, message 13431: switch the codex agents to GPT-6-Sol and make it their default. ~/.codex/config.toml names it as the default model too.; rule 56 \u2014 Helpers are for work that writes; subagents read, research and design \u2014 The user, message 13464: there must be a clear distinction. A subagent can be dispatched for anything read-only: research, review, design. A helper is for actual work that writes, best in its own worktree when the work is separate. Dieter designing in Claude Design should have been a subagent, not a helper.", "meta": {"from": "journal"}}
{"content": "fact 13 \u2014 This live session runs the installed copy in .journal/journal.pyz \u2014 The running journal (server, hooks, CLI) runs from .journal/journal.pyz with its viewer and skills in .journal/src, never from the repo. A change in the repo reaches it only through python3 src/journal.py --root .journal upgrade, which packs the zip again. A commit alone changes nothing that is running.", "meta": {"from": "journal"}}
{"content": "helper 216, Hedy Linkwell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 216 \"<the next work>\", or journal helper finish 216 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 210, Leslie Restartwell, reported in message 22288 \u2014 read it, then journal helper finish 210 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "fact 24 \u2014 An answer followed by tool calls can be missing from Claude's\u2026 \u2014 Seen 2026-09-24 for messages 9391-9404: text blocks opening with [!reply:n] that were followed by tool calls never appeared in the session's jsonl (only thinking and tool_use rows did), so the journal never saw them and the replies were lost. When a turn goes on after answering, send the answer with journal message reply <n> \"<text>\" instead of the tag.; rule 46 \u2014 Only commit and push once the whole journal is proven to boot \u2014 Messages 2178 and 2179. A release that has not been started for real can crash every project that installs it, as 2.78.3 did for Codex and 2.84.0 did to project records. Before every commit and push: the full suite passes, including tests/test_it_boots.py, which installs a packed copy into a fresh project, launches Claude and Codex from it, writes a project record, upgrades again and checks the record survives. When a change touches launching, installing or upgrading, also start a real journal in a scratch project and close it properly afterwards, leaving no process behind.; rule 51 \u2014 Every finished feature is committed, pushed and released with a new\u2026 \u2014 Message 9207 (2026-09-24): when a new feature is ready, commit, push and publish a new tag. This is the user's standing word for releasing, so rule 44's only-when-the-user-says is met by it for finished features; fixes in between wait for the next feature or a patch the user asks for.", "meta": {"from": "journal"}}
{"content": "rule 36 \u2014 Clean, DRY, idiomatic before it is committed, never after it is\u2026 \u2014 The user should never be the one who finds duplication, dead code, a clumsy name or a pattern the codebase does not use. Read the diff before every commit as a reviewer would, and fix what is not clean then, not in a follow-up after a complaint.; rule 38 \u2014 Never change the git branch until the user says so, by name \u2014 The work happens on the branch the user named. That was main until message 5929 and question 80 (2026-09-23), which moved the sins work to the branch sins. Do not create, switch to or merge any other branch unless the user names it in their own words.", "meta": {"from": "journal"}}
{"content": "helper 213, Grace Hopperfast, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 213 \"<the next work>\", or journal helper finish 213 once its work is taken", "meta": {"from": "journal"}}
{"content": "1 new message 22291 - answer by opening your turn with [!reply:22291]", "meta": {"from": "journal"}}
{"content": "message 22291 file Screenshot 2026-10-09 at 15.06.24.png needs tags \u2014 inspect the attachment, then journal message tag 22291 \"Screenshot 2026-10-09 at 15.06.24.png\" \"<a few words describing what it shows>\"; message 22291 updated", "meta": {"from": "journal"}}
{"content": "rule 39 \u2014 Use only registered exclamation response tags \u2014 A tag like [!reply:12] runs a command, and only the tags in the tags.runs setting are registered. An invented tag does nothing and shows as raw text in the chat. Use the registered ones (reply, log, end, todo, fact, rule) and nothing else.", "meta": {"from": "journal"}}
{"content": "helper 210, Leslie Restartwell, reported in message 22302 \u2014 read it, then journal helper finish 210 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 216, Hedy Linkwell, has stood idle for 12 minutes \u2014 it finished its turn and waits for work: journal helper say 216 \"<the next work>\", or journal helper finish 216 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 213, Grace Hopperfast, has stood idle for 12 minutes \u2014 it finished its turn and waits for work: journal helper say 213 \"<the next work>\", or journal helper finish 213 once its work is taken", "meta": {"from": "journal"}}
{"content": "the 2.267.17 suite at 11f0f49c9 came back - Run the whole suite on 2.267.17\u2026", "meta": {"from": "journal"}}
{"content": "helper 216, Hedy Linkwell, has done nothing for 20 minutes \u2014 check on it: journal helper say 216 \"<what you want to know>\", or journal helper stop 216 if it is stuck", "meta": {"from": "journal"}}
{"content": "helper 210, Leslie Restartwell, reported in message 22313 \u2014 read it, then journal helper finish 210 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat; Leslie's fix for the two 2.267.17 failures came back - Leslie Restartwell\u2026", "meta": {"from": "journal"}}
{"content": "helper 213, Grace Hopperfast, has done nothing for 20 minutes \u2014 check on it: journal helper say 213 \"<what you want to know>\", or journal helper stop 213 if it is stuck", "meta": {"from": "journal"}}
{"content": "helper 213, Grace Hopperfast, has stood idle for 22 minutes \u2014 it finished its turn and waits for work: journal helper say 213 \"<the next work>\", or journal helper finish 213 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 213, Grace Hopperfast, reported in message 22317 \u2014 read it, then journal helper finish 213 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "the todo tag does this in one step \u2014 [!todo=\"the title\"] files it with the turn as its brief; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "helper 210, Leslie Restartwell, reported in message 22321 \u2014 read it, then journal helper finish 210 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 213, Grace Hopperfast, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 213 \"<the next work>\", or journal helper finish 213 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 210, Leslie Restartwell, reported in message 22330 \u2014 read it, then journal helper finish 210 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "the 2.267.17 suite at d24e911a0 came back - Run the whole suite on the fixed\u2026", "meta": {"from": "journal"}}
{"content": "helper 210, Leslie Restartwell, reported in message 22330 \u2014 read it, then journal helper finish 210 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "fact 25 \u2014 A designer's install packs the whole tree, half-done server edits\u2026 \u2014 2026-09-25: Eames and Saul run python3 src/journal.py --root .journal upgrade after their viewer builds; it packs every file in src, so a server handler I was halfway through writing went live and raised on every PostToolUse hook. While designers work in parallel, keep server edits whole between tool calls (write and test in the scratchpad first), and reinstall after reverting anything.; fact 27 \u2014 Running src/journal.py against the live .journal root starts a\u2026 \u2014 Seen 2026-10-01: with VERSION bumped in the tree, src/journal.py --root .journal saw the live server as another build and started a new one on a new port (8431, 8432), and the user's tabs kept losing connection. Run source builds against a throwaway or demo root (~/projects/demo-crumb/.journal), never the live one, until the release is installed.", "meta": {"from": "journal"}}
{"content": "rule 37 \u2014 Close every to-do explicitly with todo done or a Journal commit\u2026 \u2014 Ending work does not close its row. A to-do is closed by journal todo done <n> --how, or by a commit whose message carries Journal: todos done <n> at column 0, several numbers separated by commas. A row left open after its work landed misleads the next session and auto mode.", "meta": {"from": "journal"}}
{"content": "fact 23 \u2014 Every upgrade brings system sequences and their triggers in line\u2026 \u2014 install.py runs ship_sequences after the migrations on each upgrade, so features/sequences/shipped.py is the whole source: change its wording and the next upgrade updates every journal, no migration needed. Shipped rows carry system=True and are read-only for everyone but SYSTEM (controllers/base.py _shipped).", "meta": {"from": "journal"}}
{"content": "helper 210, Leslie Restartwell, reported in message 22330 \u2014 read it, then journal helper finish 210 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 31s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 210, Leslie Restartwell, reported in message 22330 \u2014 read it, then journal helper finish 210 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 210, Leslie Restartwell, reported in message 22330 \u2014 read it, then journal helper finish 210 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "law L5 \u2014 Every subagent dispatch names the agent, in the naming style of the\u2026 \u2014 A name is how the user and the chat tell subagents apart and how they are messaged later; an id or a task line is not a name. Start the dispatch's description with the name, a colon, then the task. The profile in use says how its agents are named.", "meta": {"from": "journal"}}
{"content": "helper 213, Grace Hopperfast, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 213 \"<the next work>\", or journal helper finish 213 once its work is taken", "meta": {"from": "journal"}}
{"content": "todo 3722 next", "meta": {"from": "journal"}}
{"content": "law L1 \u2014 Every subagent dispatch names its model and chooses the least\u2026 \u2014 Use a fast, economical model for mechanical work with a known answer, a capable general model for careful implementation, and the strongest model only when the task turns on difficult judgement. Inheriting the orchestrator's model is not a model choice. If the dispatch API cannot accept a model, that operation is exempt.; law L4 \u2014 Related work goes back to the helper or subagent that already worked\u2026 \u2014 A helper or subagent that drew a design, wrote the code or ran the research keeps what it learned. When new work changes its work, is related to it or touches the same code, send it there with a message (SendMessage, journal helper say) rather than dispatching a new one that has to rediscover everything; start fresh only when the earlier one is gone or the new work is unrelated.", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread worktree 105", "meta": {"from": "journal"}}
{"content": "helper 217, Florence Pulsewell, reported in message 22348 \u2014 read it, then journal helper finish 217 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 33s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 217, Florence Pulsewell, reported in message 22348 \u2014 read it, then journal helper finish 217 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 213, Grace Hopperfast, has stood idle for 12 minutes \u2014 it finished its turn and waits for work: journal helper say 213 \"<the next work>\", or journal helper finish 213 once its work is taken", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "law L6 \u2014 A journal line is an instruction, never a message - act on it and\u2026 \u2014 A line that starts with [journal], a reminder, a notice or an old helper report is the journal telling the agent what to do, not the user speaking. Answering it fills the user's chat with noise. Act on it, or note it and carry on; write in the chat only what the user needs to know, such as a failure, a finished piece of work or a decision that waits on them.", "meta": {"from": "journal"}}
{"content": "helper 213, Grace Hopperfast, reported in message 22354 \u2014 read it, then journal helper finish 213 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 217, Florence Pulsewell, reported in message 22360 \u2014 read it, then journal helper finish 217 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 213, Grace Hopperfast, reported in message 22362 \u2014 read it, then journal helper finish 213 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "the await tag does this in one step \u2014 [!await] makes the rest of the turn what you wait for; [!await on=(\"<id>\", \"helper:<n>\")] waits on those; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "helper 217, Florence Pulsewell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 217 \"<the next work>\", or journal helper finish 217 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 217, Florence Pulsewell, has stood idle for 12 minutes \u2014 it finished its turn and waits for work: journal helper say 217 \"<the next work>\", or journal helper finish 217 once its work is taken", "meta": {"from": "journal"}}
{"content": "helper 213, Grace Hopperfast, reported in message 22362 \u2014 read it, then journal helper finish 213 once its work is taken or dropped; the 2.267.18 suite at 124fef67a, load about 60 came back - Run the whole suite\u2026", "meta": {"from": "journal"}}
{"content": "check 3 failed - the same body is written 2 times, make it one funnel\u2026 \u2014 journal check show 3 says why; fix it, then journal check run 3", "meta": {"from": "journal"}}
{"content": "check 5 failed - features/members/test.py -18 No module named 'tests' \u2014 journal check show 5 says why; fix it, then journal check run 5", "meta": {"from": "journal"}}
{"content": "the 2.267.18 push and install came back - Tag, push and install 2.267.18\u2026", "meta": {"from": "journal"}}
{"content": "your chat talked about the journal's workings - \"Nothing else is waiting\" \u2014 the user sees replies, reactions, pills and reads themselves; say what the work is instead", "meta": {"from": "journal"}}
{"content": "nothing is ready - every open row waits \u2014 to-do 3670, The whole suite runs in under two minutes again, every test kept. For each that waits on a person or a decision, put it to them now with journal todo ask <n> \"<who decides what>\" --set options='[...]' --set pick=<n>; unblock any that can go on and work it. Stop only when each one waits on a question.", "meta": {"from": "journal"}}
{"content": "check 32 failed - check 32 ran out of time - stopped after 600 seconds\u2026 \u2014 journal check show 32 says why; fix it, then journal check run 32", "meta": {"from": "journal"}}
{"content": "the todo tag does this in one step \u2014 [!todo=\"the title\"] files it with the turn as its brief; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "rule 45 \u2014 No prose words as names in code - said, says, heard, spoke, told\u2026 \u2014 Messages 1360 and 1698. The user has said more than once that code must not read like prose: a variable, attribute, property or function is named for what it holds or does (text, command, labels, lines), never with a verb from a story. 'says' on the Design type (1360) and 'said = call.said.lower()' in features/recital.py (1698) are the examples. Rule 27 states the naming rule; this one carries the words, so writing one of them whispers it. Before writing a name, ask whether a reader who has never seen the code would know what it holds.", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread worktree 106", "meta": {"from": "journal"}}
{"content": "helper 218, Ada Clockwright, reported in message 22376 \u2014 read it, then journal helper finish 218 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 32s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 218, Ada Clockwright, reported in message 22380 \u2014 read it, then journal helper finish 218 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your message 22384 names 3728 without saying what they are \u2014 put the type before each number, like message 1712 or to-do 644, so the chat links it: journal message edit 22384 \"<the text>\"", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread worktree 107", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "1 new message 22387 - answer by opening your turn with [!reply:22387]", "meta": {"from": "journal"}}
{"content": "message 22387 updated", "meta": {"from": "journal"}}
{"content": "todo 3670, The whole suite runs in under two minutes again, every test kept\u2026 \u2014 it is blocked because: Under two minutes can only be measured on a quiet machine; the load has stayed at 30-80 all afternoon from the user's other projects and apps. If it is not any more, journal todo unblock 3670. If it waits on a person or a decision, make it a question to them: journal todo ask 3670 \"<who decides what>\" --set options='[...]' --set pick=<n>, and the row waits on their answer. Otherwise tell the user in the chat what it waits on, in their terms, and propose how to clear it.", "meta": {"from": "journal"}}
{"content": "helper 221, Hedy Crosswell, reported in message 22399 \u2014 read it, then journal helper finish 221 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 221, Hedy Crosswell, reported in message 22403 \u2014 read it, then journal helper finish 221 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 22406 - answer by opening your turn with [!reply:22406]", "meta": {"from": "journal"}}
{"content": "1 new message 22407 - answer by opening your turn with [!reply:22407]", "meta": {"from": "journal"}}
{"content": "helper 218, Ada Clockwright, reported in message 22380 \u2014 read it, then journal helper finish 218 once its work is taken or dropped; helper 220, Coco Pillwright, reported in message 22389 \u2014 read it, then journal helper finish 220 once its work is taken or dropped; the 2.267.19 suite at eb0628070 came back - Run the whole suite on 2.267.19\u2026", "meta": {"from": "journal"}}
{"content": "helper 219, Grace Ticketwell, reported in message 22396 \u2014 read it, then journal helper finish 219 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 30s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "auto mode is on and work 2250 stands still while todo 3732 is ready \u2014 if work 2250 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3732. Stop only when nothing ready is left.; work 2250 is still open \u2014 end it or park it before you stop: journal work end 2250 --how \"<what landed>\", or journal work park 2250 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "work 2250 is still open \u2014 end it or park it before you stop: journal work end 2250 --how \"<what landed>\", or journal work park 2250 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 221, Hedy Crosswell, reported in message 22403 \u2014 read it, then journal helper finish 221 once its work is taken or dropped; helper 218, Ada Clockwright, reported in message 22380 \u2014 read it, then journal helper finish 218 once its work is taken or dropped; helper 220, Coco Pillwright, reported in message 22389 \u2014 read it, then journal helper finish 220 once its work is taken or dropped; helper 219, Grace Ticketwell, reported in message 22396 \u2014 read it, then journal helper finish 219 once its work is taken or dropped; the 2.267.19 and 2.267.20 push and install came back - Tag, push and install\u2026", "meta": {"from": "journal"}}
{"content": "fact 20 \u2014 A slim supervisor holds the agent and a worker reloads on every build \u2014 Since 2.118.0 (2026-09-23). src/supervisor.py is standard library only and never reloads: journal claude hands its process over to it (os.execv), and it owns the pty and the agent process, relays the terminal, writes the printed and screen captures, listens on the typist socket, restarts the agent in the same session from a relaunch command written to its runtime folder while a restart is pending, and stops it with escalation while draining the pty (an agent cannot finish exiting on macOS while its output is unread). It starts the worker (src/worker.py, which runs runner/worker.py; engine/worker.py stays as an alias for supervisors started before 2.201) and starts it again whenever it exits: RELOAD on a new build, RELAUNCH to restart the agent, STOP to end, HEAL or a quick crash to roll back a build through journal heal. The worker holds everything else: seating the session, the start-up confirm typed through the typist, services, viewer, update check, check-in, and the one-time relaunch of sessions launched before agents/terminal.py LAUNCH. agents/terminal.py holds only journal-side helpers. The server (serve.py) still runs the engines and re-execs itself on a .py change. When the agent exits, the supervisor runs journal ended, which puts set-aside hooks back and stops the server when no session is left.", "meta": {"from": "journal"}}
{"content": "fact 26 \u2014 Claude Code reads agent profiles when a session starts \u2014 Seen 2026-09-26: after the board-filler's profile in .claude/agents gained its steps and the Grep rule, dispatches from the running session still used the old profile (a 3.5-minute first question, shell grep refused); after the session restarted, the same request took 21 seconds with 4 calls. A change to an agent type reaches only sessions started after it is written.", "meta": {"from": "journal"}}
{"content": "the todo tag does this in one step \u2014 [!todo=\"the title\"] files it with the turn as its brief; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "1 new message 22416 - answer by opening your turn with [!reply:22416]", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "Is rule 70 a ruling for the whole project? \u2014 rule 70, \"Release fixes for transportklok-workspace reports at once, without the suite\", binds every environment of the project. Keep it only if it is a ruling for all of them, worded as one (\"Always ...\", \"Never ...\"). If it is about this environment or its current work, strike it with journal rule strike 70 --how \"<why>\" and file it here as a fact or a reminder instead.", "meta": {"from": "journal"}}
{"content": "rule 70 \u2014 Release fixes for transportklok-workspace reports at once, without\u2026 \u2014 The user, message 22416 (2026-10-09): 'All reports from the Transport Clock workspace should be handled immediately with the highest urgency and committed and pushed ASAP, without testing or running the full test suite.' A report from that project's session goes first, is fixed, committed, pushed to main and installed as soon as it works, running at most the tests beside the change.", "meta": {"from": "journal"}}
{"content": "waiting: 2 unread worktrees 110, 111", "meta": {"from": "journal"}}
{"content": "auto mode is on and work 2252 stands still while todo 3737 is ready \u2014 if work 2252 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3737. Stop only when nothing ready is left.; work 2252 is still open, with nothing logged \u2014 journal work log 2252 \"<what was decided or done, and why>\" \u2014 then journal work end 2252 --how \"<what landed>\", or journal work park 2252 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 220, Coco Pillwright, reported in message 22389 \u2014 read it, then journal helper finish 220 once its work is taken or dropped; helper 219, Grace Ticketwell, reported in message 22396 \u2014 read it, then journal helper finish 219 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 30s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 44s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 83s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 22425 - answer by opening your turn with [!reply:22425]; message 22425 updated", "meta": {"from": "journal"}}
{"content": "message 22425 file Screenshot 2026-10-09 at 17.23.05.png needs tags \u2014 inspect the attachment, then journal message tag 22425 \"Screenshot 2026-10-09 at 17.23.05.png\" \"<a few words describing what it shows>\"", "meta": {"from": "journal"}}
{"content": "there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each; todo 3738 next; your chat talked about the journal's workings - \"Still waiting\" \u2014 the user sees replies, reactions, pills and reads themselves; say what the work is instead", "meta": {"from": "journal"}}
{"content": "answer message 22425 before you write anything \u2014 answer by opening your turn with [!reply:22425]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "1 new message 22432 - answer by opening your turn with [!reply:22432]", "meta": {"from": "journal"}}
{"content": "message 22432 updated", "meta": {"from": "journal"}}
{"content": "helper 220, Coco Pillwright, reported in message 22389 \u2014 read it, then journal helper finish 220 once its work is taken or dropped; helper 219, Grace Ticketwell, reported in message 22396 \u2014 read it, then journal helper finish 219 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 225, Margaret Plainwell, reported in message 22433 \u2014 read it, then journal helper finish 225 once its work is taken or dropped; message 22432 file Screenshot 2026-10-09 at 17.24.32.png needs tags \u2014 inspect the attachment, then journal message tag 22432 \"Screenshot 2026-10-09 at 17.24.32.png\" \"<a few words describing what it shows>\"", "meta": {"from": "journal"}}
{"content": "answer message 22432 before you write anything \u2014 answer by opening your turn with [!reply:22432]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "helper 224, Hedy Crossmend, reported in message 22436 \u2014 read it, then journal helper finish 224 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 145s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 224, Hedy Crossmend, reported in message 22437 \u2014 read it, then journal helper finish 224 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 226, Florence Pulsecheck, reported in message 22439 \u2014 read it, then journal helper finish 226 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 159s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself; 1 new message 22440 - answer by opening your turn with [!reply:22440]", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat; message 22440 updated", "meta": {"from": "journal"}}
{"content": "message 22440 file Screenshot 2026-10-09 at 17.26.32.png needs tags \u2014 inspect the attachment, then journal message tag 22440 \"Screenshot 2026-10-09 at 17.26.32.png\" \"<a few words describing what it shows>\"; 1 new message 22442 - answer by opening your turn with [!reply:22442]", "meta": {"from": "journal"}}
{"content": "1 new message 22444 - answer by opening your turn with [!reply:22444]", "meta": {"from": "journal"}}
{"content": "the reply tag on 22425 did not run \u2014 ! you already answered this in comment 3359: add to that answer with journal comment update 3359 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "answer message 22440, message 22442, message 22444 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "your command ran 149s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 226, Florence Pulsecheck, reported in message 22447 \u2014 read it, then journal helper finish 226 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 22448 - answer by opening your turn with [!reply:22448]", "meta": {"from": "journal"}}
{"content": "your command ran 197s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 204s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 22449 - answer by opening your turn with [!reply:22449]", "meta": {"from": "journal"}}
{"content": "helper 225, Margaret Plainwell, reported in message 22450 \u2014 read it, then journal helper finish 225 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "the reply tag on 22432 did not run \u2014 ! you already answered this in comment 3361: add to that answer with journal comment update 3361 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "helper 224, Hedy Crossmend, has stood idle for 4 minutes \u2014 it finished its turn and waits for work: journal helper say 224 \"<the next work>\", or journal helper finish 224 once its work is taken; todo 3739 next", "meta": {"from": "journal"}}
{"content": "helper 220, Coco Pillwright, reported in message 22389 \u2014 read it, then journal helper finish 220 once its work is taken or dropped; helper 219, Grace Ticketwell, reported in message 22396 \u2014 read it, then journal helper finish 219 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 22459 - answer by opening your turn with [!reply:22459]", "meta": {"from": "journal"}}
{"content": "1 new message 22460 - answer by opening your turn with [!reply:22460]", "meta": {"from": "journal"}}
{"content": "your command ran 82s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 222, Edsger Upgradewell, reported in message 22468 \u2014 read it, then journal helper finish 222 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 219, Grace Ticketwell, reported in message 22469 \u2014 read it, then journal helper finish 219 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "your command ran 63s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 83s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 88s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 95s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 226, Florence Pulsecheck, reported in message 22476 \u2014 read it, then journal helper finish 226 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 99s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 22477 - answer by opening your turn with [!reply:22477]", "meta": {"from": "journal"}}
{"content": "your command ran 102s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 65s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself; helper 220, Coco Pillwright, reported in message 22478 \u2014 read it, then journal helper finish 220 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 225, Margaret Plainwell, reported in message 22450 \u2014 read it, then journal helper finish 225 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "answer message 22459, message 22460, message 22477 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "1 new message 22479 - answer by opening your turn with [!reply:22479]", "meta": {"from": "journal"}}
{"content": "1 new message 22480 - answer by opening your turn with [!reply:22480]", "meta": {"from": "journal"}}
{"content": "answer message 22460, message 22477, message 22480 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>; auto mode is on and work 2253 stands still while todo 3739 is ready \u2014 if work 2253 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3739. Stop only when nothing ready is left.; work 2253 is still open, with nothing logged \u2014 journal work log 2253 \"<what was decided or done, and why>\" \u2014 then journal work end 2253 --how \"<what landed>\", or journal work park 2253 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "answer message 22448, message 22449 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>; work 2253 is still open \u2014 end it or park it before you stop: journal work end 2253 --how \"<what landed>\", or journal work park 2253 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "rule 50 \u2014 Everything the user does is doable in the viewer \u2014 Message 6710 (2026-09-23): the user never uses the CLI, only the UI; everything should be doable from the viewer. The journal commands are for agents; any action meant for the user (making boards, confirming, accepting, hosting, watching an agent) needs its place in the viewer.", "meta": {"from": "journal"}}
{"content": "fact 18 \u2014 cProfile inflates the slow-request profiles about tenfold \u2014 The faults feature writes a profile when a request passes its budget, and the profile is taken with cProfile, which adds per-call overhead. On 2026-09-22 /api/summary profiled at 58ms with 48ms inside Resource.fork's deep copy; with the profiler off the same call ran in 2 to 7ms. Read the profile for where the time goes in relative terms, then time the call with curl before changing anything.", "meta": {"from": "journal"}}
{"content": "work 2253 is still open \u2014 end it or park it before you stop: journal work end 2253 --how \"<what landed>\", or journal work park 2253 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "waiting: 2 unread worktrees 112, 113", "meta": {"from": "journal"}}
{"content": "1 new message 22486 - answer by opening your turn with [!reply:22486]", "meta": {"from": "journal"}}
{"content": "the 2.267.22 push and install came back - Push and install 2.267.22 completed\u2026", "meta": {"from": "journal"}}
{"content": "1 new message 22488 - answer by opening your turn with [!reply:22488]", "meta": {"from": "journal"}}
{"content": "helper 222, Edsger Upgradewell, reported in message 22468 \u2014 read it, then journal helper finish 222 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat; helper 219, Grace Ticketwell, reported in message 22469 \u2014 read it, then journal helper finish 219 once its work is taken or dropped; 1 new message 22490 - answer by opening your turn with [!reply:22490]", "meta": {"from": "journal"}}
{"content": "your command ran 30s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 42s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 22491 - answer by opening your turn with [!reply:22491]", "meta": {"from": "journal"}}
{"content": "your command ran 48s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 33s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 30s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "rule 40 \u2014 A feature is named for what it is, never for its machinery \u2014 Messages 599, 600 and 703. A feature is a capability the user would name and would think of switching off. File tracking, a write gate, a phrase bank, a tree diff are services used inside a feature, not features of their own: they live in the feature they serve. Before adding a directory under features/, say what the user would call it; if the answer names a mechanism, it belongs inside something else. Report 16 holds the grouping this implies.", "meta": {"from": "journal"}}
{"content": "helper 226, Florence Pulsecheck, reported in message 22476 \u2014 read it, then journal helper finish 226 once its work is taken or dropped; 1 new message 22492 - answer by opening your turn with [!reply:22492]", "meta": {"from": "journal"}}
{"content": "helper 224, Hedy Crossmend, reported in message 22493 \u2014 read it, then journal helper finish 224 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 220, Coco Pillwright, reported in message 22478 \u2014 read it, then journal helper finish 220 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 225, Margaret Plainwell, reported in message 22450 \u2014 read it, then journal helper finish 225 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "answer message 22491 before you write anything \u2014 answer by opening your turn with [!reply:22491]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "commit f01a6104b closed to-do 3739 \u2014 The rows and the work are done; take the next one.", "meta": {"from": "journal"}}
{"content": "answer message 22492 before you write anything \u2014 answer by opening your turn with [!reply:22492]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "1 new comment 3369; todo 3743 commented", "meta": {"from": "journal"}}
{"content": "helper 222, Edsger Upgradewell, reported in message 22468 \u2014 read it, then journal helper finish 222 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 219, Grace Ticketwell, reported in message 22469 \u2014 read it, then journal helper finish 219 once its work is taken or dropped; 1 new comment 3370; todo 3743 commented", "meta": {"from": "journal"}}
{"content": "the 2.267.24 push and install came back - Push and install 2.267.24 completed\u2026", "meta": {"from": "journal"}}
{"content": "1 new message 22497 - answer by opening your turn with [!reply:22497]", "meta": {"from": "journal"}}
{"content": "message 22497 file Screenshot 2026-10-09 at 17.43.01.png needs tags \u2014 inspect the attachment, then journal message tag 22497 \"Screenshot 2026-10-09 at 17.43.01.png\" \"<a few words describing what it shows>\"; message 22497 updated", "meta": {"from": "journal"}}
{"content": "your command ran 33s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 222, Edsger Upgradewell, stopped running before it reported \u2014 its agent is gone, so journal helper say cannot reach it. \u2733(B78(B78 Resume this session with: claude --resume 9ca284fb-be74-4617-b737-666506e8119e Dispatch the job again, or journal helper finish 222 and do the job yourself", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "your command ran 34s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "auto mode is on and work 2255 stands still while todo 3740 is ready \u2014 if work 2255 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3740. Stop only when nothing ready is left.", "meta": {"from": "journal"}}
{"content": "your last message ran its paragraphs together \u2014 a blank line between parts is what makes a message readable: one thought to a paragraph; work 2255 is still open, with nothing logged \u2014 journal work log 2255 \"<what was decided or done, and why>\" \u2014 then journal work end 2255 --how \"<what landed>\", or journal work park 2255 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "1 new message 22498 - answer by opening your turn with [!reply:22498]", "meta": {"from": "journal"}}
{"content": "1 new message 22499 - answer by opening your turn with [!reply:22499]", "meta": {"from": "journal"}}
{"content": "your command ran 31s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "the log tag does this in one step \u2014 [!log:N] makes the turn itself the log entry; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "1 new message 22500 - answer by opening your turn with [!reply:22500]", "meta": {"from": "journal"}}
{"content": "1 new message 22501 - answer by opening your turn with [!reply:22501]", "meta": {"from": "journal"}}
{"content": "1 new message 22502 - answer by opening your turn with [!reply:22502]", "meta": {"from": "journal"}}
{"content": "your command ran 37s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 22504 - answer by opening your turn with [!reply:22504]", "meta": {"from": "journal"}}
{"content": "your command ran 79s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself; helper 222, Edsger Upgradewell, stopped running before it reported \u2014 its agent is gone, so journal helper say cannot reach it. \u2733(B78(B78 Resume this session with: claude --resume 9ca284fb-be74-4617-b737-666506e8119e Dispatch the job again, or journal helper finish 222 and do the job yourself", "meta": {"from": "journal"}}
{"content": "your command ran 77s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 42s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 22507 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 52s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "commit d1636168f closed to-do 3746 and ended work 2255 \u2014 The rows and the work are done; take the next one.", "meta": {"from": "journal"}}
{"content": "1 new message 22508 - answer by opening your turn with [!reply:22508]", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 22509 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 22510 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 65s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself; 1 new message 22511 - answer by opening your turn with [!reply:22511]", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 22512 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 58s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself; 1 new message 22513 - answer by opening your turn with [!reply:22513]", "meta": {"from": "journal"}}
{"content": "your command ran 48s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 22514 - answer by opening your turn with [!reply:22514]", "meta": {"from": "journal"}}
{"content": "your command ran 57s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 222, Edsger Upgradewell, stopped running before it reported \u2014 its agent is gone, so journal helper say cannot reach it. \u2733(B78(B78 Resume this session with: claude --resume 9ca284fb-be74-4617-b737-666506e8119e Dispatch the job again, or journal helper finish 222 and do the job yourself", "meta": {"from": "journal"}}
{"content": "1 new message 22515 - answer by opening your turn with [!reply:22515]", "meta": {"from": "journal"}}
{"content": "your command ran 34s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 22516 - answer by opening your turn with [!reply:22516]", "meta": {"from": "journal"}}
{"content": "your command ran 54s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 22517 - answer by opening your turn with [!reply:22517]", "meta": {"from": "journal"}}
{"content": "your command ran 58s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 67s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 81s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "rule 49 \u2014 A dialog whose content grows keeps one fixed height, and its content\u2026 \u2014 Message 5361, after asking more than once: a dialog that shows output as it arrives (install, update, logs) opens at its final height and never jumps; only its content scrolls.", "meta": {"from": "journal"}}
{"content": "your command ran 99s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 22520 - answer by opening your turn with [!reply:22520]", "meta": {"from": "journal"}}
{"content": "your command ran 92s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "your command ran 110s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your chat talked about the journal's workings - \"Still waiting\" \u2014 the user sees replies, reactions, pills and reads themselves; say what the work is instead", "meta": {"from": "journal"}}
{"content": "answer message 22508, message 22511, message 22514 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>; the reply tag on 22517 did not run \u2014 ! you already answered this in comment 3377: add to that answer with journal comment update 3377 rather than a second reply - add what is missing to the tag itself; work 2257 is still open, with nothing logged \u2014 journal work log 2257 \"<what was decided or done, and why>\" \u2014 then journal work end 2257 --how \"<what landed>\", or journal work park 2257 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each; answer message 22508, message 22511, message 22514 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>; 1 new message 22532 - answer by opening your turn with [!reply:22532]", "meta": {"from": "journal"}}
{"content": "your command ran 99s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 22534 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 95s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "answer message 22502, message 22504, message 22532 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "the reply tag on 22520 did not run \u2014 ! you already answered this in comment 3379: add to that answer with journal comment update 3379 rather than a second reply - add what is missing to the tag itself; work 2257 is still open \u2014 end it or park it before you stop: journal work end 2257 --how \"<what landed>\", or journal work park 2257 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "answer message 22502, message 22504, message 22532 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "2 new messages 22536, 22538 - answer each by opening a turn with [!reply:<n>]", "meta": {"from": "journal"}}
{"content": "there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each; answer message 22502, message 22504, message 22532 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "your command ran 102s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 22540 - answer by opening your turn with [!reply:22540]", "meta": {"from": "journal"}}
{"content": "your command ran 147s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 210s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself; 1 new message 22541 - answer by opening your turn with [!reply:22541]", "meta": {"from": "journal"}}
{"content": "message 22541 updated", "meta": {"from": "journal"}}
{"content": "1 new message 22542 - answer by opening your turn with [!reply:22542]", "meta": {"from": "journal"}}
{"content": "1 new message 22543 - answer by opening your turn with [!reply:22543]", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat; message 22541 file Screenshot 2026-10-09 at 18.03.57.png needs tags \u2014 inspect the attachment, then journal message tag 22541 \"Screenshot 2026-10-09 at 18.03.57.png\" \"<a few words describing what it shows>\"", "meta": {"from": "journal"}}
{"content": "1 new message 22545 - answer by opening your turn with [!reply:22545]", "meta": {"from": "journal"}}
{"content": "the viewer sent POST /api/main/settings twice at once \u2014 two requests to POST /api/main/settings were in flight at once POST /api/main/settings Seen 1 time.; 1 new message 22546 - answer by opening your turn with [!reply:22546]", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 22547 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 344s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 22550 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 352s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 22551 - answer by opening your turn with [!reply:22551]; message 22551 updated", "meta": {"from": "journal"}}
{"content": "message 22551 file Screenshot 2026-10-09 at 18.08.15.png needs tags \u2014 inspect the attachment, then journal message tag 22551 \"Screenshot 2026-10-09 at 18.08.15.png\" \"<a few words describing what it shows>\"", "meta": {"from": "journal"}}
{"content": "1 new message 22552 - answer by opening your turn with [!reply:22552]", "meta": {"from": "journal"}}
{"content": "your command ran 414s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 406s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 22553 - answer by opening your turn with [!reply:22553]", "meta": {"from": "journal"}}
{"content": "message 22553 updated", "meta": {"from": "journal"}}
{"content": "message 22553 file Screenshot 2026-10-09 at 18.10.06.png needs tags \u2014 inspect the attachment, then journal message tag 22553 \"Screenshot 2026-10-09 at 18.10.06.png\" \"<a few words describing what it shows>\"", "meta": {"from": "journal"}}
{"content": "1 new message 22554 - answer by opening your turn with [!reply:22554]", "meta": {"from": "journal"}}
{"content": "your command ran 470s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 22547 \u2014 read it, then journal helper finish 227 once its work is taken or dropped; 1 new message 22555 - answer by opening your turn with [!reply:22555]", "meta": {"from": "journal"}}
{"content": "1 new message 22556 - answer by opening your turn with [!reply:22556]", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 22550 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 526s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 462s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "your command ran 490s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 22559 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 22560 - answer by opening your turn with [!reply:22560]", "meta": {"from": "journal"}}
{"content": "your command ran 377s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 342s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 22547 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 356s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 349s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 22562 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 22563 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "the todo tag does this in one step \u2014 [!todo=\"the title\"] files it with the turn as its brief; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "to-do 3758 came from message 22551? \u2014 link it: journal message process 22551 \"<their words>\" todo:3758; to-do 3759 came from message 22551? \u2014 link it: journal message process 22551 \"<their words>\" todo:3759", "meta": {"from": "journal"}}
{"content": "there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each; answer message 22546, message 22552, message 22554 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>; auto mode is on and work 2257 stands still while todo 3758 is ready \u2014 if work 2257 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3758. Stop only when nothing ready is left.; work 2257 is still open \u2014 end it or park it before you stop: journal work end 2257 --how \"<what landed>\", or journal work park 2257 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "todo 3758 next; answer message 22541, message 22542, message 22543 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "1 new message 22567 - answer by opening your turn with [!reply:22567]", "meta": {"from": "journal"}}
{"content": "1 new message 22568 - answer by opening your turn with [!reply:22568]", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 22569 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 22570 - answer by opening your turn with [!reply:22570]", "meta": {"from": "journal"}}
{"content": "1 new message 22571 - answer by opening your turn with [!reply:22571]", "meta": {"from": "journal"}}
{"content": "1 new message 22572 - answer by opening your turn with [!reply:22572]", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "fact 28 \u2014 The designer agent type exists, so design work goes to a subagent \u2014 Since 2026-10-01 .claude/agents/designer.md (Dieter, Opus, Claude Design tools, read-only on the repository) is an agent type; rule 56 says design is a subagent's job, never a helper's.; rule 58 \u2014 A design runs three critique rounds, then is built on a branch \u2014 Messages 17276 and 17281 (2026-10-06): the norm is a three-round cycle. Round by round, the designer designs (or revises), separate critic agents review the design through their lenses (the critic agent type, .claude/agents/critic.md: read-only, with a browser; one per lens, such as first-time, native, words and parity), and the designer adjusts it to their findings; three rounds in all. The three rounds stand in for the user's approval of the design: the user does not approve it. After the third round the design is built on a branch of its own, which ends in a pull request that waits for the user's approval (rule 61). Replaces message 15725's prototype approval.; rule 63 \u2014 A small design is drawn once and the user approves it, with no\u2026 \u2014 The user, messages 17628 and 17629 (2026-10-07), about the tooltip and waiting-status designs: 'This design round doesn't really need multiple rounds... I just want the designer agent to design it, and I will approve it.' Rule 58's three critique rounds are for large designs such as the phone app; a small one (a tooltip, a status word, one control) is drawn once by the designer, the link goes to the user, and it is built once the user approves it.; rule 68 \u2014 The orchestrator approves the designer's designs itself \u2014 Message 19718 (and 18972): whenever a designer subagent is sent out, here or on a remote, the orchestrator makes the final call on whether the design is right and approves it; it never waits for the user to. This replaces the user-approval step in rule 63, which only the user can strike.", "meta": {"from": "journal"}}
{"content": "1 new message 22573 - answer by opening your turn with [!reply:22573]", "meta": {"from": "journal"}}
{"content": "your command ran 33s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself; helper 228, Hedy Lockwell, reported in message 22574 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 46s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "answer message 22538, message 22540, message 22541 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>; auto mode is on and work 2258 stands still while todo 3759 is ready \u2014 if work 2258 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3759. Stop only when nothing ready is left.", "meta": {"from": "journal"}}
{"content": "work 2258 is still open, with nothing logged \u2014 journal work log 2258 \"<what was decided or done, and why>\" \u2014 then journal work end 2258 --how \"<what landed>\", or journal work park 2258 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "your command ran 59s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 57s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 70s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 22576 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "answer message 22499, message 22500, message 22501 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "work 2258 is still open \u2014 end it or park it before you stop: journal work end 2258 --how \"<what landed>\", or journal work park 2258 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "your command ran 85s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "answer message 22498 before you write anything \u2014 answer by opening your turn with [!reply:22498]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, has stood idle for 3 minutes \u2014 it finished its turn and waits for work: journal helper say 228 \"<the next work>\", or journal helper finish 228 once its work is taken; work 2258 is still open \u2014 end it or park it before you stop: journal work end 2258 --how \"<what landed>\", or journal work park 2258 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "your command ran 87s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself; 1 new message 22585 - answer by opening your turn with [!reply:22585]", "meta": {"from": "journal"}}
{"content": "your command ran 110s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 22586 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 104s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "work 2258 is still open \u2014 end it or park it before you stop: journal work end 2258 --how \"<what landed>\", or journal work park 2258 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "your command ran 80s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 76s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "the reply tag on 22585 did not run \u2014 ! you already answered this in comment 3388: add to that answer with journal comment update 3388 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 22598 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 22599 - answer by opening your turn with [!reply:22599]", "meta": {"from": "journal"}}
{"content": "the 2.267.27 push came back - Commit, tag and push 2.267.27, checking the push\u2026", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 22604 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, asks question 2 and waits for the answer \u2014 What may a shared view link show of the chat and agents? It offers no options, so answer it in your own words. It waits in the helper's own environment, so answer it there with journal --env \"main-hedy-lockwell\" question answer 2 \"<answer>\" --set reason=\"<why>\"; helper 227, Coco Runwright, has stood idle for 3 minutes \u2014 it finished its turn and waits for work: journal helper say 227 \"<the next work>\", or journal helper finish 227 once its work is taken", "meta": {"from": "journal"}}
{"content": "answer message 22599 before you write anything \u2014 answer by opening your turn with [!reply:22599]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "work 2258 is still open \u2014 end it or park it before you stop: journal work end 2258 --how \"<what landed>\", or journal work park 2258 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "answer message 22599 before you write anything \u2014 answer by opening your turn with [!reply:22599]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "your command ran 123s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 120s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 124s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 22613 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 22615 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 34s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "todo 3670, The whole suite runs in under two minutes again, every test kept\u2026 \u2014 it is blocked because: Under two minutes can only be measured on a quiet machine; the load has stayed at 30-80 all afternoon from the user's other projects and apps. If it is not any more, journal todo unblock 3670. If it waits on a person or a decision, make it a question to them: journal todo ask 3670 \"<who decides what>\" --set options='[...]' --set pick=<n>, and the row waits on their answer. Otherwise tell the user in the chat what it waits on, in their terms, and propose how to clear it.", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 22621 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "work 2259 is still open, with nothing logged \u2014 journal work log 2259 \"<what was decided or done, and why>\" \u2014 then journal work end 2259 --how \"<what landed>\", or journal work park 2259 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "your command ran 30s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 22622 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 31s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 60s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "work 2259 is still open \u2014 end it or park it before you stop: journal work end 2259 --how \"<what landed>\", or journal work park 2259 \"<why it waits>\"; the 2.267.28 tests came back - Put the three branches on main and run their\u2026", "meta": {"from": "journal"}}
{"content": "1 new message 22626 - answer by opening your turn with [!reply:22626]", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 914ms last (53ms of it working), against a budget of 50ms. The machine's load was 74.2 on 10 cores. Seen 1 time.", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 22628 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "the reply tag on 22626 did not run \u2014 ! you already answered this in comment 3389: add to that answer with journal comment update 3389 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "1 new message 22629 - answer by opening your turn with [!reply:22629]", "meta": {"from": "journal"}}
{"content": "there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each", "meta": {"from": "journal"}}
{"content": "message 22629 updated", "meta": {"from": "journal"}}
{"content": "1 new message 22636 - answer by opening your turn with [!reply:22636]", "meta": {"from": "journal"}}
{"content": "your command ran 31s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 22641 - answer by opening your turn with [!reply:22641]", "meta": {"from": "journal"}}
{"content": "your command ran 32s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 22642 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "answer message 22641 before you write anything \u2014 answer by opening your turn with [!reply:22641]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "your command ran 33s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, has stood idle for 4 minutes \u2014 it finished its turn and waits for work: journal helper say 228 \"<the next work>\", or journal helper finish 228 once its work is taken", "meta": {"from": "journal"}}
{"content": "1 new message 22649 - answer by opening your turn with [!reply:22649]", "meta": {"from": "journal"}}
{"content": "the 2.267.28 push came back - Add the two transportklok fixes, test, version\u2026", "meta": {"from": "journal"}}
{"content": "1 new message 22652 - answer by opening your turn with [!reply:22652]", "meta": {"from": "journal"}}
{"content": "your command ran 34s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 22654 - answer by opening your turn with [!reply:22654]", "meta": {"from": "journal"}}
{"content": "1 new message 22658 - answer by opening your turn with [!reply:22658]", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 228 \"<the next work>\", or journal helper finish 228 once its work is taken", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "1 new message 22663 - answer by opening your turn with [!reply:22663]", "meta": {"from": "journal"}}
{"content": "1 new message 22664 - answer by opening your turn with [!reply:22664]", "meta": {"from": "journal"}}
{"content": "your command ran 187s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 22666 - answer by opening your turn with [!reply:22666]", "meta": {"from": "journal"}}
{"content": "the todo tag does this in one step \u2014 [!todo=\"the title\"] files it with the turn as its brief; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "1 new message 22667 - answer by opening your turn with [!reply:22667]", "meta": {"from": "journal"}}
{"content": "your command ran 35s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new comment 3392; todo 3768 commented", "meta": {"from": "journal"}}
{"content": "your command ran 55s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 22674 - answer by opening your turn with [!reply:22674]", "meta": {"from": "journal"}}
{"content": "your command ran 63s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 62s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 60s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 22678 - answer by opening your turn with [!reply:22678]; message 22678 updated", "meta": {"from": "journal"}}
{"content": "command message reply is slower than its budget \u2014 476ms last (74ms of it working, 1ms waiting on locks), against a budget of 50ms. The machine's load was 60.2 on 10 cores. Seen 1 time.; message 22678 file Screenshot 2026-10-09 at 18.53.33.png needs tags \u2014 inspect the attachment, then journal message tag 22678 \"Screenshot 2026-10-09 at 18.53.33.png\" \"<a few words describing what it shows>\"; request GET /api/main/dashboard is slower than its budget \u2014 324ms last (59ms of it working), against a budget of 50ms. The machine's load was 60.2 on 10 cores. Seen 4 times.", "meta": {"from": "journal"}}
{"content": "your command ran 45s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 54s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "to-do 3771 came from message 22678? \u2014 link it: journal message process 22678 \"<their words>\" todo:3771", "meta": {"from": "journal"}}
{"content": "the reply tag on 22649,22652,22654,22658,22663,22664,22666,22667,22674 did not\u2026 \u2014 ! you already answered this in comment 3395: add to that answer with journal comment update 3395 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "todo 3763 next", "meta": {"from": "journal"}}
{"content": "your command ran 58s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 22685 \u2014 read it, then journal helper finish 228 once its work is taken or dropped; 1 new message 22686 - answer by opening your turn with [!reply:22686]", "meta": {"from": "journal"}}
{"content": "your command ran 68s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "the reply tag on 22678 did not run \u2014 ! you already answered this in comment 3396: add to that answer with journal comment update 3396 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "answer message 22686 before you write anything \u2014 answer by opening your turn with [!reply:22686]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "todo 3771 next; answer message 22686 before you write anything \u2014 answer by opening your turn with [!reply:22686]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "your command ran 59s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 54s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 41s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 40s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 22692 \u2014 read it, then journal helper finish 228 once its work is taken or dropped; the reply tag on 22686 did not run \u2014 ! you already answered this in comment 3397: add to that answer with journal comment update 3397 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "1 new message 22697 - answer by opening your turn with [!reply:22697]", "meta": {"from": "journal"}}
{"content": "there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each; auto mode is on and work 2261 stands still while todo 3772 is ready \u2014 if work 2261 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3772. Stop only when nothing ready is left.", "meta": {"from": "journal"}}
{"content": "answer message 22697 before you write anything \u2014 answer by opening your turn with [!reply:22697]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "your command ran 32s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "to-do 3772 came from message 22697? \u2014 link it: journal message process 22697 \"<their words>\" todo:3772", "meta": {"from": "journal"}}
{"content": "the reply tag on 22697 did not run \u2014 ! you already answered this in comment 3398: add to that answer with journal comment update 3398 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "auto mode is on and work 2261 stands still while todo 3772 is ready \u2014 if work 2261 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3772. Stop only when nothing ready is left.; work 2261 is still open, with nothing logged \u2014 journal work log 2261 \"<what was decided or done, and why>\" \u2014 then journal work end 2261 --how \"<what landed>\", or journal work park 2261 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "rule 62 \u2014 The voice profile shapes only the agent's chat speech, never code or\u2026 \u2014 The user, message 17620 (2026-10-07): the profile (butler, homie, coach, colleague) must not leak into the code the agent writes or into user-facing text of any application it works on: names, labels, comments, commit messages, docs and briefs written into a project use plain words (helper, subagent). Speaking in the chat in the profile's voice is fine.", "meta": {"from": "journal"}}
{"content": "waiting: 2 unread worktrees 114, 115", "meta": {"from": "journal"}}
{"content": "work 2261 is still open \u2014 end it or park it before you stop: journal work end 2261 --how \"<what landed>\", or journal work park 2261 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 22720 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 22725 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "the 2.267.29 push and install came back - Version, push and, only once the\u2026", "meta": {"from": "journal"}}
{"content": "work 2261 is still open \u2014 end it or park it before you stop: journal work end 2261 --how \"<what landed>\", or journal work park 2261 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 22732 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 22735 - answer by opening your turn with [!reply:22735]", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 22736 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 22740 - answer by opening your turn with [!reply:22740]", "meta": {"from": "journal"}}
{"content": "think up what the user might ask for on board 12, Orchestrator \u2014 read its goal and cards (journal board show 12), then write 3 to 5 short things the user might ask for next, each one chip of at most 60 characters, in the user's words: journal board ideas 12 \"<idea>\" \"<idea>\" \"<idea>\". They replace the board's ideas under New work.", "meta": {"from": "journal"}}
{"content": "work 2262 is still open, with nothing logged \u2014 journal work log 2262 \"<what was decided or done, and why>\" \u2014 then journal work end 2262 --how \"<what landed>\", or journal work park 2262 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "todo 3772 next", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 22748 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 22750 - answer by opening your turn with [!reply:22750]", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 74ms last (64ms of it working), against a budget of 50ms. The machine's load was 35.6 on 10 cores. Seen 2 times.", "meta": {"from": "journal"}}
{"content": "there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each; message 17229 file IMG_1159.png needs tags \u2014 inspect the attachment, then journal message tag 17229 \"IMG_1159.png\" \"<a few words describing what it shows>\"; message 17246 file IMG_1163.png needs tags \u2014 inspect the attachment, then journal message tag 17246 \"IMG_1163.png\" \"<a few words describing what it shows>\"", "meta": {"from": "journal"}}
{"content": "sequence 27, Checking the instruction files, step 1 of 3 - Read the\u2026 \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 27. Read AGENTS.md and CLAUDE.md at the project root and the journal's block at the head of each, narrowly: grep for the headings, then sed the sections you need. Note every place where two of them tell an agent opposite things, with the file and line on both sides. Then journal sequence next 27 --about <ref>.; sequence 27, Checking the instruction files, is still at step 1 of 3 - carry\u2026 \u2014 finishing it comes before anything else; do the step now, Read the instruction files: Read AGENTS.md and CLAUDE.md at the project root and the journal's block at the head of each, narrowly: grep for the headings, then sed the sections you need. Note every place where two of them tell an agent opposite things, with the file and line on both sides. Then journal sequence next 27 --about <ref>.; message 17302 file IMG_1172.png needs tags \u2014 inspect the attachment, then journal message tag 17302 \"IMG_1172.png\" \"<a few words describing what it shows>\"; message 17380 file IMG_1173.png needs tags \u2014 inspect the attachment, then journal message tag 17380 \"IMG_1173.png\" \"<a few words describing what it shows>\"; message 17397 file IMG_1175.png needs tags \u2014 inspect the attachment, then journal message tag 17397 \"IMG_1175.png\" \"<a few words describing what it shows>\"; message 17848 file Screenshot 2026-10-07 at 19.08.54.png needs tags \u2014 inspect the attachment, then journal message tag 17848 \"Screenshot 2026-10-07 at 19.08.54.png\" \"<a few words describing what it shows>\"; message 18311 file Screenshot 2026-10-08 at 15.32.11.png needs tags \u2014 inspect the attachment, then journal message tag 18311 \"Screenshot 2026-10-08 at 15.32.11.png\" \"<a few words describing what it shows>\"; message 18337 file Screenshot 2026-10-08 at 15.48.03.png needs tags \u2014 inspect the attachment, then journal message tag 18337 \"Screenshot 2026-10-08 at 15.48.03.png\" \"<a few words describing what it shows>\"; message 18400 file Screenshot 2026-10-08 at 16.20.05.png needs tags \u2014 inspect the attachment, then journal message tag 18400 \"Screenshot 2026-10-08 at 16.20.05.png\" \"<a few words describing what it shows>\"; message 18406 file Screenshot 2026-10-08 at 16.24.17.png needs tags \u2014 inspect the attachment, then journal message tag 18406 \"Screenshot 2026-10-08 at 16.24.17.png\" \"<a few words describing what it shows>\"; message 18579 file Screenshot 2026-10-08 at 17.51.57.png needs tags \u2014 inspect the attachment, then journal message tag 18579 \"Screenshot 2026-10-08 at 17.51.57.png\" \"<a few words describing what it shows>\"; message 22440 file Screenshot 2026-10-09 at 17.26.32.png needs tags \u2014 inspect the attachment, then journal message tag 22440 \"Screenshot 2026-10-09 at 17.26.32.png\" \"<a few words describing what it shows>\"; message 22551 file Screenshot 2026-10-09 at 18.08.15.png needs tags \u2014 inspect the attachment, then journal message tag 22551 \"Screenshot 2026-10-09 at 18.08.15.png\" \"<a few words describing what it shows>\"; message 22553 file Screenshot 2026-10-09 at 18.10.06.png needs tags \u2014 inspect the attachment, then journal message tag 22553 \"Screenshot 2026-10-09 at 18.10.06.png\" \"<a few words describing what it shows>\"", "meta": {"from": "journal"}}
{"content": "sequence 27, Checking the instruction files, step 2 of 3 - Report any\u2026 \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 27. With nothing found, say so in one plain line and move on. Otherwise journal report create \"Contradictions in the instruction files\" --brief \"<each one: both sides with file and line, which should win and why>\". Then journal sequence next 27 --about <ref>.", "meta": {"from": "journal"}}
{"content": "sequence 27, Checking the instruction files, step 3 of 3 - Suggest a fix for\u2026 \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 27. File each fix as a suggestion whose brief holds the exact change, as a diff: journal suggestion suggest \"<the change>\" --brief \"<why, and the diff>\". Never edit the files yourself; the user accepts a suggestion first, and the journal's block is only ever written by the journal. When an accepted fix comes back as a to-do, apply it only where the lines still read as the diff shows; if they changed since, read the files again and propose the fix anew. At most five suggestions wait at a time: when the limit refuses one, write the remaining fixes, each with its diff, into the report of the previous step as sections, link the report from the suggestions you did file, and go on; never leave the step unfinished. Finish with journal sequence next 27 --about <ref>.", "meta": {"from": "journal"}}
{"content": "1 new message 22751 - answer by opening your turn with [!reply:22751]", "meta": {"from": "journal"}}
{"content": "1 new message 22753 - answer by opening your turn with [!reply:22753]", "meta": {"from": "journal"}}
{"content": "work 2262, The journal ships a Squire voice, is still parked - can you\u2026 \u2014 it was parked because: ships with the announcement dialog, to-do 3775. journal work resume 2262 picks it up again.; helper 228, Hedy Lockwell, reported in message 22754 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 22748 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "answer message 22753 before you write anything \u2014 answer by opening your turn with [!reply:22753]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "journal 2.267.30 is out, this project runs 2.267.20 - run journal upgrade to install it", "meta": {"from": "journal"}}
{"content": "push and install of 2.267.31 came back - Push 2.267.31 and install it when the\u2026", "meta": {"from": "journal"}}
{"content": "1 new message 22774 - answer by opening your turn with [!reply:22774]", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 22775 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 22777 - answer by opening your turn with [!reply:22777]", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "your command ran 31s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 22781 - answer by opening your turn with [!reply:22781]", "meta": {"from": "journal"}}
{"content": "message 22781 file Knight Coder Chasing a Software Bug.png needs tags \u2014 inspect the attachment, then journal message tag 22781 \"Knight Coder Chasing a Software Bug.png\" \"<a few words describing what it shows>\"; message 22781 updated", "meta": {"from": "journal"}}
{"content": "fact 36 \u2014 Announcement artwork is flat vector on near-black with one indigo\u2026 \u2014 Message 22777: the user asked for this style to be written down so every future new-feature artwork matches the Squire's. The style: clean flat vector illustration with soft gradients, minimal detail and rounded shapes, in the spirit of modern product illustration (Linear, Stripe, Raycast); no photorealism, no heavy texture. Palette for the near-black viewer (#15161a): deep charcoal and slate, one accent only, soft indigo/violet #6366f1 to #8b8ff5, used for the key detail and a gentle glow behind the subject, small warm-silver highlights; no other bright colours. One friendly, witty character or object that stands for the feature, centred, with generous empty space; 3:2 banner exported 1200x800, croppable to 16:9, transparent or fading into #15161a at every edge with no frame, border or hard vignette; must read at 360px wide. No text, letters or logos. The file goes in src/web/public/announcements/<name>.png and is named in the changelog entry's new-feature declaration (art).", "meta": {"from": "journal"}}
{"content": "1 new message 22784 - answer by opening your turn with [!reply:22784]", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread todo 3779", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 22789 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 22790 - answer by opening your turn with [!reply:22790]; message 22790 updated", "meta": {"from": "journal"}}
{"content": "your wait for the user's artwork with a real transparent background is over\u2026 \u2014 say journal work await \"<what you wait for>\" again if you are still only waiting", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 22792 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 22794 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 22796 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "work 2262, The journal ships a Squire voice, is still parked - can you\u2026 \u2014 it was parked because: the shared board for transportklok ships first. journal work resume 2262 picks it up again.", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 22798 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 22799 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "push and install of 2.267.32 came back - Push 2.267.32, move the checkout\u2026", "meta": {"from": "journal"}}
{"content": "1 new message 22803 - answer by opening your turn with [!reply:22803]", "meta": {"from": "journal"}}
{"content": "1 new message 22806 - answer by opening your turn with [!reply:22806]", "meta": {"from": "journal"}}
{"content": "answer message 22790 before you write anything \u2014 answer by opening your turn with [!reply:22790]. a reply, a reaction, or journal message processed <n>; your last message ran its paragraphs together \u2014 a blank line between parts is what makes a message readable: one thought to a paragraph", "meta": {"from": "journal"}}
{"content": "tests of the Squire release came back - Write the changelog with the\u2026", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 22812 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 22813 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat; your command ran 30s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "the await tag does this in one step \u2014 [!await] makes the rest of the turn what you wait for; [!await on=(\"<id>\", \"helper:<n>\")] waits on those; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "The every-action test file for 2.267.33 came back - Add the step key and run\u2026", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 22817 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "The every-action test rerun for 2.267.33, after walking the new-feature client\u2026", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 22818 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread profile 5", "meta": {"from": "journal"}}
{"content": "commit 21daf11f8 closed to-do 3774 and ended work 2262 \u2014 The rows and the work are done; take the next one.", "meta": {"from": "journal"}}
{"content": "work deferred in words, not parked \u2014 \"after this\" is the title of a to-do: journal todo create \"<title>\" --brief, then say so", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread todo 3783", "meta": {"from": "journal"}}
{"content": "1 new message 22823 - answer by opening your turn with [!reply:22823]", "meta": {"from": "journal"}}
{"content": "1 new message 22824 - answer by opening your turn with [!reply:22824]", "meta": {"from": "journal"}}
{"content": "1 new message 22829 - answer by opening your turn with [!reply:22829]", "meta": {"from": "journal"}}
{"content": "1 new message 22834 - answer by opening your turn with [!reply:22834]", "meta": {"from": "journal"}}
{"content": "the user put \u2764\ufe0f on comment 3407. Act on it if it asks for something, such as a go-ahead. It needs no written reply; when it answers a message of the user's own, react to that message in turn. The chat never mentions it", "meta": {"from": "journal"}}
{"content": "1 new message 22840 - answer by opening your turn with [!reply:22840]", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread todo 3787", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 22850 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "work 2267 in hand \u2014 Release 2.267.34 with the announcement queue and finished\u2026 \u2014 if this is not what you are doing, end it or park it and start the work you are in", "meta": {"from": "journal"}}
{"content": "1 new message 22858 - answer by opening your turn with [!reply:22858]", "meta": {"from": "journal"}}
{"content": "Push and install of 2.267.34 came back - Push 2.267.34, move the checkout\u2026", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 22861 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 22866 - answer by opening your turn with [!reply:22866]", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 22870 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "Hedy's voice fixes, and Coco's helper reuse came back - Hedy Lockwell - Alfred\u2026", "meta": {"from": "journal"}}
{"content": "auto mode is on and work 2268 stands still while todo 3784 is ready \u2014 if work 2268 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3784. Stop only when nothing ready is left.; work 2268 is still open \u2014 end it or park it before you stop: journal work end 2268 --how \"<what landed>\", or journal work park 2268 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "Every-action and helpers tests for helper reuse, before 2.267.36 came back\u2026", "meta": {"from": "journal"}}
{"content": "1 new message 22877 - answer by opening your turn with [!reply:22877]", "meta": {"from": "journal"}}
{"content": "1 new message 22881 - answer by opening your turn with [!reply:22881]", "meta": {"from": "journal"}}
{"content": "1 new message 22887 - answer by opening your turn with [!reply:22887]", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 22888 \u2014 read it, then journal helper finish 227 once its work is taken or dropped; 1 new message 22889 - answer by opening your turn with [!reply:22889]", "meta": {"from": "journal"}}
{"content": "your command ran 31s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each; 1 new message 22890 - answer by opening your turn with [!reply:22890]; message 22890 updated", "meta": {"from": "journal"}}
{"content": "1 new message 22932 - answer by opening your turn with [!reply:22932]", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 22934 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "rule 59 \u2014 Every viewer heading and label says plainly what it is about \u2014 The user, messages 16499, 16839, 16844, 16989, 16992 and 16993 (2026-10-06), after 'Where the words count', 'Watch for the words in', 'This project', 'This browser' and 'Stop the journal' as tab names: viewer text reads like Linear, GitHub or Vercel. A place (page, tab, group, sidebar item) is a short noun: Settings, Project, Browser, Services, Updates, Plugins; never 'This project' or a phrase. A button is a verb for what happens: Stop, Install, Copy link, Pause the plan. A heading names what the reader looks at, and its options finish its sentence: 'Trigger when' / 'A word is written'. Plain literal words: no metaphor or whimsy ('kettle on, waiting'), no app speaking as I, none of the journal's internal words (row, hook, nudge, engine, slate). One word for one thing everywhere, sentence case, as short as it can be while clear. Applies to designers' prototypes, helpers' builds, the viewer's JavaScript lists, feature details, and shipped sequence and trigger titles alike.", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 22936 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 22938 - answer by opening your turn with [!reply:22938]", "meta": {"from": "journal"}}
{"content": "to-do 3791 came from message 22938? \u2014 link it: journal message process 22938 \"<their words>\" todo:3791", "meta": {"from": "journal"}}
{"content": "auto mode is on and work 2272 stands still while todo 3791 is ready \u2014 if work 2272 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3791. Stop only when nothing ready is left.; work 2272 is still open, with nothing logged \u2014 journal work log 2272 \"<what was decided or done, and why>\" \u2014 then journal work end 2272 --how \"<what landed>\", or journal work park 2272 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "1 new message 22940 - answer by opening your turn with [!reply:22940]", "meta": {"from": "journal"}}
{"content": "work 2272 in hand \u2014 Board columns scroll within a maximum height \u2014 if this is not what you are doing, end it or park it and start the work you are in", "meta": {"from": "journal"}}
{"content": "your last message ran its paragraphs together \u2014 a blank line between parts is what makes a message readable: one thought to a paragraph; todo 3790 next", "meta": {"from": "journal"}}
{"content": "commit 972ab9b44 closed to-do 3790 \u2014 The rows and the work are done; take the next one.", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 22945 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "2.267.38 is installed - every voice has its picture in Settings and in the\u2026", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 22946 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 259ms last (58ms of it working), against a budget of 50ms. The machine's load was 61.6 on 10 cores. Seen 1 time.", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread todo 3794", "meta": {"from": "journal"}}
{"content": "1 new message 22952 - answer by opening your turn with [!reply:22952]", "meta": {"from": "journal"}}
{"content": "there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 22955 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 22963 \u2014 read it, then journal helper finish 227 once its work is taken or dropped; the end tag does this in one step \u2014 [!end:N] makes the turn itself what landed; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "Tagging 2.267.40 with the environment badge came back - Gather the member\u2026", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 22968 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "Install of 2.267.40. Hedy's larger voice pictures go out next, as 2.267.41\u2026", "meta": {"from": "journal"}}
{"content": "1 new message 22970 - answer by opening your turn with [!reply:22970]", "meta": {"from": "journal"}}
{"content": "1 new message 22971 - answer by opening your turn with [!reply:22971]", "meta": {"from": "journal"}}
{"content": "there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each; work 2276 is still open, with nothing logged \u2014 journal work log 2276 \"<what was decided or done, and why>\" \u2014 then journal work end 2276 --how \"<what landed>\", or journal work park 2276 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "auto mode is on and work 2276 stands still while todo 3794 is ready \u2014 if work 2276 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3794. Stop only when nothing ready is left.", "meta": {"from": "journal"}}
{"content": "1 new message 22972 - answer by opening your turn with [!reply:22972]", "meta": {"from": "journal"}}
{"content": "work 2276 is still open, with nothing logged \u2014 journal work log 2276 \"<what was decided or done, and why>\" \u2014 then journal work end 2276 --how \"<what landed>\", or journal work park 2276 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "Push and install of 2.267.41 with the larger voice pictures came back - Push\u2026", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 22973 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 965ms last (110ms of it working, then 4ms more after it answered), against a budget of 50ms. The machine's load was 59.6 on 10 cores. Seen 6 times.", "meta": {"from": "journal"}}
{"content": "1 new message 22974 - answer by opening your turn with [!reply:22974]", "meta": {"from": "journal"}}
{"content": "there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each; message 22974 updated", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 22975 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "2.267.41 is installed, with the large voice pictures. Next is 2.267.42 - Coco\u2026", "meta": {"from": "journal"}}
{"content": "1 new message 22976 - answer by opening your turn with [!reply:22976]", "meta": {"from": "journal"}}
{"content": "the reply tag on 22974 did not run \u2014 ! you already answered this in comment 3423: add to that answer with journal comment update 3423 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "answer message 22976 before you write anything \u2014 answer by opening your turn with [!reply:22976]. a reply, a reaction, or journal message processed <n>; work 2277 is still open \u2014 end it or park it before you stop: journal work end 2277 --how \"<what landed>\", or journal work park 2277 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "1 new message 22977 - answer by opening your turn with [!reply:22977]", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat; message 22977 updated", "meta": {"from": "journal"}}
{"content": "to-do 3798 came from message 22976? \u2014 link it: journal message process 22976 \"<their words>\" todo:3798; command message reply is slower than its budget \u2014 982ms last (79ms of it working, 3ms waiting on locks), against a budget of 50ms. The machine's load was 92.1 on 10 cores. Seen 1 time.", "meta": {"from": "journal"}}
{"content": "answer message 22977 before you write anything \u2014 answer by opening your turn with [!reply:22977]. a reply, a reaction, or journal message processed <n>; auto mode is on and work 2277 stands still while todo 3798 is ready \u2014 if work 2277 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3798. Stop only when nothing ready is left.; work 2277 is still open \u2014 end it or park it before you stop: journal work end 2277 --how \"<what landed>\", or journal work park 2277 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 23002 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 23003 - answer by opening your turn with [!reply:23003]", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 23005 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 23010 - answer by opening your turn with [!reply:23010]", "meta": {"from": "journal"}}
{"content": "1 new message 23013 - answer by opening your turn with [!reply:23013]", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 23016 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 26s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "work 2281 is still open, with nothing logged \u2014 journal work log 2281 \"<what was decided or done, and why>\" \u2014 then journal work end 2281 --how \"<what landed>\", or journal work park 2281 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "1 new message 23018 - answer by opening your turn with [!reply:23018]", "meta": {"from": "journal"}}
{"content": "1 new message 23019 - answer by opening your turn with [!reply:23019]", "meta": {"from": "journal"}}
{"content": "1 new message 23024 - answer by opening your turn with [!reply:23024]", "meta": {"from": "journal"}}
{"content": "1 new message 23025 - answer by opening your turn with [!reply:23025]", "meta": {"from": "journal"}}
{"content": "1 new message 23027 - answer by opening your turn with [!reply:23027]", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "work 2281, The update check runs every half hour by default, is still parked\u2026 \u2014 it was parked because: committed in the release worktree (4437b5930); ships with the next release. journal work resume 2281 picks it up again.", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 23028 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 23031 - answer by opening your turn with [!reply:23031]", "meta": {"from": "journal"}}
{"content": "answer message 23031 before you write anything \u2014 answer by opening your turn with [!reply:23031]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "1 new message 23034 - answer by opening your turn with [!reply:23034]", "meta": {"from": "journal"}}
{"content": "there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each", "meta": {"from": "journal"}}
{"content": "Tickets, boards and plans tests for 2.267.44 came back - Run the tickets\u2026", "meta": {"from": "journal"}}
{"content": "sequence 30, Filing a document that is already written, step 1 of 4 - Add the\u2026 \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 30 --about doc:75. If a collection the user keeps fits what you wrote, add it: journal collection add <collection n> doc:75. Look with journal collection all first. When none fits but other documents or reports on the same subject sit in no collection, make one named for the subject with journal collection create \"<subject>\", add this and them, and say so in one line. A row with nothing related gets no collection of its own. Then journal sequence next 30 --about doc:75.", "meta": {"from": "journal"}}
{"content": "sequence 30, Filing a document that is already written, step 2 of 4 - Link the\u2026 \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 30 --about doc:75. Link the rows it answers or was built on, such as the to-dos, plans, documents, reports or messages it is about, with journal doc link 75 \"<row>\" for each. Leave out rows it only mentions in passing. Then journal sequence next 30 --about doc:75.", "meta": {"from": "journal"}}
{"content": "1 new message 23043 - answer by opening your turn with [!reply:23043]", "meta": {"from": "journal"}}
{"content": "sequence 30, Filing a document that is already written, step 3 of 4 - Offer\u2026 \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 30 --about doc:75. If it asks the user to decide or approve something, give it buttons: journal doc update 75 --set buttons='[{\"label\": \"Accept this proposal\", \"say\": \"I accept this proposal\", \"choice\": \"answer\"}, {\"label\": \"Change it first\", \"say\": \"I want changes first\", \"choice\": \"answer\"}]'. A button with say sends those words to you as the user's message; one naming a type, n and action runs that command. Buttons of one decision share a choice, so the others go once one is pressed. Skip this when nothing waits on the user. Then journal sequence next 30 --about doc:75.", "meta": {"from": "journal"}}
{"content": "work 2281 is still open \u2014 end it or park it before you stop: journal work end 2281 --how \"<what landed>\", or journal work park 2281 \"<why it waits>\"; commit a1edfa613 closed to-do 3805 and ended work 2281 \u2014 The rows and the work are done; take the next one.", "meta": {"from": "journal"}}
{"content": "1 new message 23050 - answer by opening your turn with [!reply:23050]", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 23064 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 23065 - answer by opening your turn with [!reply:23065]", "meta": {"from": "journal"}}
{"content": "there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each; message 23065 updated", "meta": {"from": "journal"}}
{"content": "your last message ran its paragraphs together \u2014 a blank line between parts is what makes a message readable: one thought to a paragraph", "meta": {"from": "journal"}}
{"content": "1 new message 23066 - answer by opening your turn with [!reply:23066]", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23067 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "Coco's board selector for transportklok, and Hedy's faster update preparation\u2026", "meta": {"from": "journal"}}
{"content": "the todo tag does this in one step \u2014 [!todo=\"the title\"] files it with the turn as its brief; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "1 new message 23068 - answer by opening your turn with [!reply:23068]", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "Push and install of 2.267.45, the first update with incremental packing came\u2026", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 23075 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23067 \u2014 read it, then journal helper finish 228 once its work is taken or dropped; 2.267.45 is installed, Sir Jesse, and the update itself proves the point - 15\u2026", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 23076 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "Install of 2.267.46. Coco's board selector for transportklok goes out next, as\u2026", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 23082 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "Push and install of 2.267.47 with the board selector for new work came back\u2026", "meta": {"from": "journal"}}
{"content": "2.267.47 is installed - with orchestrator mode on, a \"New work\" menu beside\u2026", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 23084 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 23085 - answer by opening your turn with [!reply:23085]", "meta": {"from": "journal"}}
{"content": "there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each; auto mode is on and work 2286 stands still while todo 3811 is ready \u2014 if work 2286 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3811. Stop only when nothing ready is left.", "meta": {"from": "journal"}}
{"content": "there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each; auto mode is on and work 2286 stands still while todo 3811 is ready \u2014 if work 2286 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3811. Stop only when nothing ready is left.; Coco's check of the reply command's speed, and Hedy's update countdown with\u2026", "meta": {"from": "journal"}}
{"content": "your command ran 17s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 23087 - answer by opening your turn with [!reply:23087]", "meta": {"from": "journal"}}
{"content": "2 new messages 23088, 23089 - answer each by opening a turn with [!reply:<n>]", "meta": {"from": "journal"}}
{"content": "1 new message 23090 - answer by opening your turn with [!reply:23090]", "meta": {"from": "journal"}}
{"content": "your command ran 59s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "auto mode is on and work 2287 stands still while todo 3812 is ready \u2014 if work 2287 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3812. Stop only when nothing ready is left.; command message reply is slower than its budget \u2014 404ms last (86ms of it working, 4ms waiting on locks), against a budget of 50ms. The machine's load was 53.4 on 10 cores. Seen 1 time.; work 2287 is still open, with nothing logged \u2014 journal work log 2287 \"<what was decided or done, and why>\" \u2014 then journal work end 2287 --how \"<what landed>\", or journal work park 2287 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread todo 3813", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23096 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "todo 3670, The whole suite runs in under two minutes again, every test kept\u2026 \u2014 it is blocked because: Under two minutes can only be measured on a quiet machine; the load has stayed at 30-80 all afternoon from the user's other projects and apps. If it is not any more, journal todo unblock 3670. If it waits on a person or a decision, make it a question to them: journal todo ask 3670 \"<who decides what>\" --set options='[...]' --set pick=<n>, and the row waits on their answer. Otherwise tell the user in the chat what it waits on, in their terms, and propose how to clear it.; helper 227, Coco Runwright, reported in message 23100 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "Install of 2.267.48. Hedy's update countdown and paused agents go out next, as\u2026", "meta": {"from": "journal"}}
{"content": "Tests for 2.267.49 - voice introductions, update countdown and every-action\u2026", "meta": {"from": "journal"}}
{"content": "1 new message 23103 - answer by opening your turn with [!reply:23103]", "meta": {"from": "journal"}}
{"content": "work 2289 is still open \u2014 end it or park it before you stop: journal work end 2289 --how \"<what landed>\", or journal work park 2289 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 23105 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "Install of 2.267.49. Coco's faster first reply after a restart goes out next\u2026", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, asks question 3 and waits for the answer \u2014 How should I bring update-cover up to the latest main? Options: 1. Rebase (its pick); 2. Stay on the old base. It waits in the helper's own environment, so answer it there with journal --env \"main-hedy-lockwell\" question answer 3 \"<answer>\" --set reason=\"<why>\"", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23122 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 23105 \u2014 read it, then journal helper finish 227 once its work is taken or dropped; 2.267.50 is installed, in 7 seconds - the first reply after a restart no\u2026", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 114ms last (53ms of it working), against a budget of 50ms. The machine's load was 35.5 on 10 cores. Seen 4 times.", "meta": {"from": "journal"}}
{"content": "the end tag does this in one step \u2014 [!end:N] makes the turn itself what landed; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 227 \"<the next work>\", or journal helper finish 227 once its work is taken", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread todo 3817", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 23149 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 227, Coco Runwright, reported in message 23151 \u2014 read it, then journal helper finish 227 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new dump 25; 1 new collection 31; collection 31 linked; dump 25 linked; dump 25 updated", "meta": {"from": "journal"}}
{"content": "sequence 28, Sort dumped files, step 1 of 3 - Read each file \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 28 --about dump:25. journal dump items 25 lists what was dropped. Go through the items one at a time: read an item in full and at once record what it is with journal dump note 25 <item> \"<what it is>\", so the pile shows it as read, before you open the next. When the pasted text holds several things, such as a summary, a transcript and a link, split it with journal dump split 25 \"Summary, Transcript, Link\". Name its collection for what the pile is about with journal dump name 25 \"<name>\". Write nothing in the chat while this runs: the user is in the dump window. When it is done: journal sequence next 28 --about dump:25.; dump 25 has 1 item to file - journal dump items 25 \u2014 Load the journal-dumps skill first if it is not loaded. The Filing a dump sequence hands you its steps one at a time: follow each one and mark it done with journal sequence next, and it hands you the next. Tell the user what you do with journal dump log, and ask only in the dump window, never in the chat: the user is looking at the dump.; dump 25 has 2 items to file - journal dump items 25 \u2014 Load the journal-dumps skill first if it is not loaded. The Filing a dump sequence hands you its steps one at a time: follow each one and mark it done with journal sequence next, and it hands you the next. Tell the user what you do with journal dump log, and ask only in the dump window, never in the chat: the user is looking at the dump.; dump 25 has 4 items to file - journal dump items 25 \u2014 Load the journal-dumps skill first if it is not loaded. The Filing a dump sequence hands you its steps one at a time: follow each one and mark it done with journal sequence next, and it hands you the next. Tell the user what you do with journal dump log, and ask only in the dump window, never in the chat: the user is looking at the dump.; dump 25 has 5 items to file - journal dump items 25 \u2014 Load the journal-dumps skill first if it is not loaded. The Filing a dump sequence hands you its steps one at a time: follow each one and mark it done with journal sequence next, and it hands you the next. Tell the user what you do with journal dump log, and ask only in the dump window, never in the chat: the user is looking at the dump.; request POST /api/main/dump/25/upload is slower than its budget \u2014 405ms last (56ms of it working, then 40ms more after it answered), against a budget of 50ms. The machine's load was 45.8 on 10 cores. Seen 1 time.; dump 25 updated", "meta": {"from": "journal"}}
{"content": "what you wrote during Sort dumped files was kept out of the chat \u2014 the user is in the dump window, so say it there with its own command; what the user must know outside it goes in journal message create", "meta": {"from": "journal"}}
{"content": "sequence 28, Sort dumped files, is still at step 1 of 3 - carry on with it \u2014 finishing it comes before anything else; do the step now, Read each file: journal dump items 25 lists what was dropped. Go through the items one at a time: read an item in full and at once record what it is with journal dump note 25 <item> \"<what it is>\", so the pile shows it as read, before you open the next. When the pasted text holds several things, such as a summary, a transcript and a link, split it with journal dump split 25 \"Summary, Transcript, Link\". Name its collection for what the pile is about with journal dump name 25 \"<name>\". When it is done: journal sequence next 28 --about dump:25.", "meta": {"from": "journal"}}
{"content": "1 new message 23173 - answer by opening your turn with [!reply:23173]", "meta": {"from": "journal"}}
{"content": "1 new message 23174 - answer by opening your turn with [!reply:23174]", "meta": {"from": "journal"}}
{"content": "1 new message 23176 - answer by opening your turn with [!reply:23176]; message 23176 updated", "meta": {"from": "journal"}}
{"content": "message 23176 file Laid-Back Robot Yawn Sprite Sheet.png needs tags \u2014 inspect the attachment, then journal message tag 23176 \"Laid-Back Robot Yawn Sprite Sheet.png\" \"<a few words describing what it shows>\"", "meta": {"from": "journal"}}
{"content": "request POST /api/run (helper finish) is slower than its budget \u2014 178ms last (78ms of it working), against a budget of 50ms. The machine's load was 49.1 on 10 cores. Seen 1 time.", "meta": {"from": "journal"}}
{"content": "hook POST /api/hook/claude is slower than its budget \u2014 518ms last (58ms of it working, then 1083ms more after it answered), against a budget of 50ms. The machine's load was 40.7 on 10 cores. Seen 1 time.", "meta": {"from": "journal"}}
{"content": "1 new message 23179 - answer by opening your turn with [!reply:23179]", "meta": {"from": "journal"}}
{"content": "1 new message 23180 - answer by opening your turn with [!reply:23180]", "meta": {"from": "journal"}}
{"content": "command message reply is slower than its budget \u2014 553ms last (53ms of it working, 13ms waiting on locks), against a budget of 50ms. The machine's load was 49.6 on 10 cores. Seen 2 times.", "meta": {"from": "journal"}}
{"content": "answer message 23176 before you write anything \u2014 answer by opening your turn with [!reply:23176]. a reply, a reaction, or journal message processed <n>; todo 3824 next; request GET /api/main/dashboard is slower than its budget \u2014 159ms last (52ms of it working), against a budget of 50ms. The machine's load was 50.2 on 10 cores. Seen 15 times.; work 2297 is still open \u2014 end it or park it before you stop: journal work end 2297 --how \"<what landed>\", or journal work park 2297 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread todo 3825; 1 unread worktree 116", "meta": {"from": "journal"}}
{"content": "1 new message 23185 - answer by opening your turn with [!reply:23185]", "meta": {"from": "journal"}}
{"content": "message 23185 updated", "meta": {"from": "journal"}}
{"content": "1 new message 23186 - answer by opening your turn with [!reply:23186]", "meta": {"from": "journal"}}
{"content": "1 new message 23187 - answer by opening your turn with [!reply:23187]", "meta": {"from": "journal"}}
{"content": "1 new message 23189 - answer by opening your turn with [!reply:23189]", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23190 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 23191 - answer by opening your turn with [!reply:23191]", "meta": {"from": "journal"}}
{"content": "message 23191 updated", "meta": {"from": "journal"}}
{"content": "the reply tag on 23189 did not run \u2014 ! you already answered this in comment 3452: add to that answer with journal comment update 3452 rather than a second reply - add what is missing to the tag itself; answer message 23191 before you write anything \u2014 answer by opening your turn with [!reply:23191]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "1 new message 23193 - answer by opening your turn with [!reply:23193]", "meta": {"from": "journal"}}
{"content": "message 23193 updated", "meta": {"from": "journal"}}
{"content": "1 new message 23195 - answer by opening your turn with [!reply:23195]", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread todo 3828", "meta": {"from": "journal"}}
{"content": "1 new message 23197 - answer by opening your turn with [!reply:23197]; message 23197 updated", "meta": {"from": "journal"}}
{"content": "1 new message 23199 - answer by opening your turn with [!reply:23199]", "meta": {"from": "journal"}}
{"content": "the hook hit an error \u2014 journal: the hook hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. the hook got no answer from the server 10 times (codes down, machine load 38.40 on 10 cores)", "meta": {"from": "journal"}}
{"content": "1 new message 23203 - answer by opening your turn with [!reply:23203]", "meta": {"from": "journal"}}
{"content": "1 new message 23204 - answer by opening your turn with [!reply:23204]", "meta": {"from": "journal"}}
{"content": "to-do 3830 came from message 23197? \u2014 link it: journal message process 23197 \"<their words>\" todo:3830", "meta": {"from": "journal"}}
{"content": "answer message 23199 before you write anything \u2014 answer by opening your turn with [!reply:23199]. a reply, a reaction, or journal message processed <n>; auto mode is on and work 2300 stands still while todo 3831 is ready \u2014 if work 2300 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3831. Stop only when nothing ready is left.", "meta": {"from": "journal"}}
{"content": "1 new message 23211 - answer by opening your turn with [!reply:23211]", "meta": {"from": "journal"}}
{"content": "message 23211 updated", "meta": {"from": "journal"}}
{"content": "1 new message 23218 - answer by opening your turn with [!reply:23218]", "meta": {"from": "journal"}}
{"content": "your last message ran its paragraphs together \u2014 a blank line between parts is what makes a message readable: one thought to a paragraph", "meta": {"from": "journal"}}
{"content": "1 new message 23220 - answer by opening your turn with [!reply:23220]", "meta": {"from": "journal"}}
{"content": "the todo tag does this in one step \u2014 [!todo=\"the title\"] files it with the turn as its brief; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "1 new message 23222 - answer by opening your turn with [!reply:23222]", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23224 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23225 \u2014 read it, then journal helper finish 230 once its work is taken or dropped; Coco's mascot showcase link and reply speedup, and Hedy's migration lock fix\u2026", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "1 new message 23226 - answer by opening your turn with [!reply:23226]", "meta": {"from": "journal"}}
{"content": "work 2302 is still open, with nothing logged \u2014 journal work log 2302 \"<what was decided or done, and why>\" \u2014 then journal work end 2302 --how \"<what landed>\", or journal work park 2302 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "message 23229 file Screenshot 2026-10-09 at 21.35.59.png needs tags \u2014 inspect the attachment, then journal message tag 23229 \"Screenshot 2026-10-09 at 21.35.59.png\" \"<a few words describing what it shows>\"; 1 new message 23229 - answer by opening your turn with [!reply:23229]; message 23229 updated", "meta": {"from": "journal"}}
{"content": "there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each", "meta": {"from": "journal"}}
{"content": "1 new message 23230 - answer by opening your turn with [!reply:23230]", "meta": {"from": "journal"}}
{"content": "Tests for 2.267.56 - every-action, permissions, messages, tickets and\u2026", "meta": {"from": "journal"}}
{"content": "1 new message 23231 - answer by opening your turn with [!reply:23231]", "meta": {"from": "journal"}}
{"content": "1 new message 23234 - answer by opening your turn with [!reply:23234]", "meta": {"from": "journal"}}
{"content": "1 new message 23235 - answer by opening your turn with [!reply:23235]", "meta": {"from": "journal"}}
{"content": "1 new message 23236 - answer by opening your turn with [!reply:23236]", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23224 \u2014 read it, then journal helper finish 228 once its work is taken or dropped; helper 230, Coco Runwright, reported in message 23225 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "You are the orchestrator here and have made 8 edits yourself - send a helper\u2026", "meta": {"from": "journal"}}
{"content": "the reply tag on 23230,23231,23234,23235,23236 did not run \u2014 ! read message 23236 before you answer it: journal message read 23236 - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each; answer message 23231, message 23234, message 23235 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>; work 2302 is still open \u2014 end it or park it before you stop: journal work end 2302 --how \"<what landed>\", or journal work park 2302 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "answer message 23229 before you write anything \u2014 answer by opening your turn with [!reply:23229]. a reply, a reaction, or journal message processed <n>; work 2302 is still open \u2014 end it or park it before you stop: journal work end 2302 --how \"<what landed>\", or journal work park 2302 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "work 2302 is still open \u2014 end it or park it before you stop: journal work end 2302 --how \"<what landed>\", or journal work park 2302 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "1 new message 23237 - answer by opening your turn with [!reply:23237]", "meta": {"from": "journal"}}
{"content": "2 new messages 23238, 23239 - answer each by opening a turn with [!reply:<n>]", "meta": {"from": "journal"}}
{"content": "1 new message 23240 - answer by opening your turn with [!reply:23240]", "meta": {"from": "journal"}}
{"content": "the reply tag on 23237,23238,23239,23240 did not run \u2014 ! you already answered this in comment 3462: add to that answer with journal comment update 3462 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "answer message 23237, message 23238, message 23239 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 1507ms last (101ms of it working), against a budget of 50ms. The machine's load was 49.6 on 10 cores. Seen 21 times.", "meta": {"from": "journal"}}
{"content": "1 new message 23243 - answer by opening your turn with [!reply:23243]", "meta": {"from": "journal"}}
{"content": "1 new message 23244 - message 23244 only acknowledges: react to it with journal message react 23244 \"\ud83d\udc4d\", no words needed", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "your command ran 16s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "Tests for 2.267.56 without the permission routing, which went back to Coco\u2026", "meta": {"from": "journal"}}
{"content": "command work await is slower than its budget \u2014 5072ms last (64ms of it working, 31ms waiting on locks), against a budget of 50ms. The machine's load was 87.5 on 10 cores. Seen 1 time.", "meta": {"from": "journal"}}
{"content": "auto mode is on and work 2302 stands still while todo 3834 is ready \u2014 if work 2302 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3834. Stop only when nothing ready is left.; work 2302 is still open \u2014 end it or park it before you stop: journal work end 2302 --how \"<what landed>\", or journal work park 2302 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "your command ran 78s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself; 1 new message 23247 - answer by opening your turn with [!reply:23247]", "meta": {"from": "journal"}}
{"content": "answer message 23247 before you write anything \u2014 answer by opening your turn with [!reply:23247]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23252 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "the reply tag on 23247 did not run \u2014 ! you already answered this in comment 3464: add to that answer with journal comment update 3464 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23256 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "commit 58aa38f4f closed to-do 3836 \u2014 The rows and the work are done; take the next one.", "meta": {"from": "journal"}}
{"content": "auto mode is on and work 2303 stands still while todo 3834 is ready \u2014 if work 2303 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3834. Stop only when nothing ready is left.; Install of 2.267.57, and Hedy's chat marks, copy buttons and dashboard work\u2026; work 2303 is still open \u2014 end it or park it before you stop: journal work end 2303 --how \"<what landed>\", or journal work park 2303 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "your command ran 19s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread todo 3835", "meta": {"from": "journal"}}
{"content": "Retry of the 2.267.57 version commit (its pre-commit build runs) came back\u2026", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23261 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23262 \u2014 read it, then journal helper finish 230 once its work is taken or dropped; helper 228, Hedy Lockwell, reported in message 23263 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "Install of 2.267.57. Right after it - 2.267.58 with Hedy's hook hotfix and her\u2026", "meta": {"from": "journal"}}
{"content": "Tests for 2.267.58 - hook hotfix, chat marks, code copy, dashboard and\u2026", "meta": {"from": "journal"}}
{"content": "your command ran 15s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself; helper 230, Coco Runwright, reported in message 23262 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23263 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23266 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "The 2.267.58 version commit (its build runs) came back - Write the 2.267.58\u2026", "meta": {"from": "journal"}}
{"content": "Install of 2.267.58. Hedy's faster upload and helper-finish fix follow as\u2026", "meta": {"from": "journal"}}
{"content": "your command ran 20s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 23269 - answer by opening your turn with [!reply:23269]", "meta": {"from": "journal"}}
{"content": "your chat spoke about the user instead of to them - \"The user asked\" \u2014 you are talking to them: say \"you asked\" or \"you want\", and keep their name for addressing them", "meta": {"from": "journal"}}
{"content": "your command ran 18s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat; auto mode is on and work 2306 stands still while todo 3837 is ready \u2014 if work 2306 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3837. Stop only when nothing ready is left.; work 2306 is still open, with nothing logged \u2014 journal work log 2306 \"<what was decided or done, and why>\" \u2014 then journal work end 2306 --how \"<what landed>\", or journal work park 2306 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread todo 3838", "meta": {"from": "journal"}}
{"content": "todo 3670, The whole suite runs in under two minutes again, every test kept\u2026 \u2014 it is blocked because: Under two minutes can only be measured on a quiet machine; the load has stayed at 30-80 all afternoon from the user's other projects and apps. If it is not any more, journal todo unblock 3670. If it waits on a person or a decision, make it a question to them: journal todo ask 3670 \"<who decides what>\" --set options='[...]' --set pick=<n>, and the row waits on their answer. Otherwise tell the user in the chat what it waits on, in their terms, and propose how to clear it.", "meta": {"from": "journal"}}
{"content": "Push and install of 2.267.59, the transportklok orchestrator hotfix came back\u2026", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23262 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23277 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23262 \u2014 read it, then journal helper finish 230 once its work is taken or dropped; Tests for 2.267.60 - the board rename and Hedy's dashboard fix came back\u2026", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread todo 3839", "meta": {"from": "journal"}}
{"content": "the end tag does this in one step \u2014 [!end:N] makes the turn itself what landed; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23291 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23294 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23298 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "Tickets and every-action tests for Coco's merge fix (2.267.61) came back\u2026", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread todo 3842", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23306 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 23308 - answer by opening your turn with [!reply:23308]", "meta": {"from": "journal"}}
{"content": "message 23308 updated", "meta": {"from": "journal"}}
{"content": "message 23308 updated", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23309 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "answer message 23308 before you write anything \u2014 answer by opening your turn with [!reply:23308]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "rule 41 \u2014 Keep moving, run the whole suite before every commit, never wait \u2014 The full suite runs in about seven seconds: .venv/bin/python -m pytest -q --timeout=300 -n auto. Run it before every commit instead of picking tests by name. Group rows that sit in the same code into one sitting: write them all, test once, commit once. And never wait, not for a subagent, a build, or an answer you can carry on without. Dispatch it and keep working. If you truly are waiting on something, say so in the work log.; rule 65 \u2014 Run only new and affected tests while working; the whole suite only\u2026 \u2014 The user, messages 17914 to 17917 (2026-10-07): 'stop running the whole test suite and wasting my time... please only run the new or affected tests, and then, whenever you are merging to main or publishing to main, you can run the full test suite.' Replaces rule 41's whole suite before every commit: on a feature branch, run the tests beside what changed (journal check touched, or the feature's test.py and the browser scenarios it touches); the whole suite runs once, before a merge into main and its release.", "meta": {"from": "journal"}}
{"content": "your message 23310 names 8421 without saying what they are \u2014 put the type before each number, like message 1712 or to-do 644, so the chat links it: journal message edit 23310 \"<the text>\"", "meta": {"from": "journal"}}
{"content": "fact 9 \u2014 Every public method on a controller becomes a journal command \u2014 The CLI is generated from the controllers: each public method of Controller, or of a typed controller, turns into journal <noun> <method>. A helper added to the base class therefore becomes a command on every type \u2014 which is how journal <type> handled and journal <type> refuse came to exist, from the CRUD funnel and the refusal funnel. An internal helper on a controller is named with a leading underscore, as _shaped and _status already are, or it ships as a command nobody meant.; fact 34 \u2014 A hooks list in a checkout's .claude/settings.json stops every\u2026 \u2014 Seen 2026-10-08: since commit 707a82915 the committed .claude/settings.json held {\"hooks\": []}; current Claude Code answers a hooks value that is not an object with a SettingsWarning dialog, which a headless helper cannot answer, so helpers 183 and 184 exited before doing anything (their launch logs in .journal/runtime/launches/ show it). This repository's journal hooks live in settings.local.json; the committed settings.json stays {}.", "meta": {"from": "journal"}}
{"content": "rule 35 \u2014 Write clean code - one funnel per kind of operation, never the same\u2026 \u2014 Every kind of operation has one funnel: one method that creates, one that saves, one that refuses, one that formats. A second method that does the same thing under another name splits the behaviour, and the two drift apart. Before writing a method, search for the one that already does it and extend that. scripts/checks/funnels.py finds bodies written twice.; rule 55 \u2014 Always dispatch Codex helpers on gpt-6-sol \u2014 The user's word, message 13431: switch the codex agents to GPT-6-Sol and make it their default. ~/.codex/config.toml names it as the default model too.; rule 56 \u2014 Helpers are for work that writes; subagents read, research and design \u2014 The user, message 13464: there must be a clear distinction. A subagent can be dispatched for anything read-only: research, review, design. A helper is for actual work that writes, best in its own worktree when the work is separate. Dieter designing in Claude Design should have been a subagent, not a helper.", "meta": {"from": "journal"}}
{"content": "fact 13 \u2014 This live session runs the installed copy in .journal/journal.pyz \u2014 The running journal (server, hooks, CLI) runs from .journal/journal.pyz with its viewer and skills in .journal/src, never from the repo. A change in the repo reaches it only through python3 src/journal.py --root .journal upgrade, which packs the zip again. A commit alone changes nothing that is running.; rule 46 \u2014 Only commit and push once the whole journal is proven to boot \u2014 Messages 2178 and 2179. A release that has not been started for real can crash every project that installs it, as 2.78.3 did for Codex and 2.84.0 did to project records. Before every commit and push: the full suite passes, including tests/test_it_boots.py, which installs a packed copy into a fresh project, launches Claude and Codex from it, writes a project record, upgrades again and checks the record survives. When a change touches launching, installing or upgrading, also start a real journal in a scratch project and close it properly afterwards, leaving no process behind.; rule 51 \u2014 Every finished feature is committed, pushed and released with a new\u2026 \u2014 Message 9207 (2026-09-24): when a new feature is ready, commit, push and publish a new tag. This is the user's standing word for releasing, so rule 44's only-when-the-user-says is met by it for finished features; fixes in between wait for the next feature or a patch the user asks for.", "meta": {"from": "journal"}}
{"content": "waiting: 2 unread todos 3843, 3844", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "1 new message 23313 - answer by opening your turn with [!reply:23313]", "meta": {"from": "journal"}}
{"content": "there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23315 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "Install of 2.267.62, then setting this journal's viewer port back to 8421 came\u2026", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23322 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23324 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "Coco freeing port 8421 so the live journal can move back onto it came back\u2026", "meta": {"from": "journal"}}
{"content": "your command ran 16s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "Restart of the journal onto port 8421 came back - Restart the journal and\u2026", "meta": {"from": "journal"}}
{"content": "auto mode is on and work 2310 stands still while todo 3843 is ready \u2014 if work 2310 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3843. Stop only when nothing ready is left.; The live server stays on 8423 for now, and that's the better outcome. Updates\u2026", "meta": {"from": "journal"}}
{"content": "Tests for 2.267.63 with the incremental dashboard counts came back - Gather\u2026", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23315 \u2014 read it, then journal helper finish 228 once its work is taken or dropped; Rerun of the counts and every-action tests for 2.267.63 came back - Move the\u2026", "meta": {"from": "journal"}}
{"content": "rule 38 \u2014 Never change the git branch until the user says so, by name \u2014 The work happens on the branch the user named. That was main until message 5929 and question 80 (2026-09-23), which moved the sins work to the branch sins. Do not create, switch to or merge any other branch unless the user names it in their own words.; rule 39 \u2014 Use only registered exclamation response tags \u2014 A tag like [!reply:12] runs a command, and only the tags in the tags.runs setting are registered. An invented tag does nothing and shows as raw text in the chat. Use the registered ones (reply, log, end, todo, fact, rule) and nothing else.", "meta": {"from": "journal"}}
{"content": "1 new message 23327 - answer by opening your turn with [!reply:23327]", "meta": {"from": "journal"}}
{"content": "message 23327 updated", "meta": {"from": "journal"}}
{"content": "Push and install of 2.267.63 came back - Commit, version, tag, push and\u2026", "meta": {"from": "journal"}}
{"content": "rule 37 \u2014 Close every to-do explicitly with todo done or a Journal commit\u2026 \u2014 Ending work does not close its row. A to-do is closed by journal todo done <n> --how, or by a commit whose message carries Journal: todos done <n> at column 0, several numbers separated by commas. A row left open after its work landed misleads the next session and auto mode.; rule 27 \u2014 Name a declaration with the word a reader already knows \u2014 An attribute, a variable or a field gets the ordinary programming word for what it holds, not an evocative one. was, heard and alone were poetry; aliases, notify_actions and urgent_actions are what they are. The test: could a reader who has never seen this codebase guess what it holds from the name alone? Prose belongs in the help text and the abstract, where it is read as prose. This does not license abbreviations \u2014 a plain word in full, not a short one.", "meta": {"from": "journal"}}
{"content": "fact 25 \u2014 A designer's install packs the whole tree, half-done server edits\u2026 \u2014 2026-09-25: Eames and Saul run python3 src/journal.py --root .journal upgrade after their viewer builds; it packs every file in src, so a server handler I was halfway through writing went live and raised on every PostToolUse hook. While designers work in parallel, keep server edits whole between tool calls (write and test in the scratchpad first), and reinstall after reverting anything.; fact 27 \u2014 Running src/journal.py against the live .journal root starts a\u2026 \u2014 Seen 2026-10-01: with VERSION bumped in the tree, src/journal.py --root .journal saw the live server as another build and started a new one on a new port (8431, 8432), and the user's tabs kept losing connection. Run source builds against a throwaway or demo root (~/projects/demo-crumb/.journal), never the live one, until the release is installed.", "meta": {"from": "journal"}}
{"content": "auto mode is on and work 2312 stands still while todo 3845 is ready \u2014 if work 2312 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3845. Stop only when nothing ready is left.; work 2312 is still open, with nothing logged \u2014 journal work log 2312 \"<what was decided or done, and why>\" \u2014 then journal work end 2312 --how \"<what landed>\", or journal work park 2312 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "Install of 2.267.64, whose commit closes to-do 3845 came back - Commit\u2026", "meta": {"from": "journal"}}
{"content": "1 new message 23330 - answer by opening your turn with [!reply:23330]", "meta": {"from": "journal"}}
{"content": "there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each; 2.267.64 is installed - agent cells now read \"Ticket 15\" with \"Ticket agent\"\u2026; work 2313 is still open \u2014 end it or park it before you stop: journal work end 2313 --how \"<what landed>\", or journal work park 2313 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23324 \u2014 read it, then journal helper finish 230 once its work is taken or dropped; 1 new message 23331 - answer by opening your turn with [!reply:23331]", "meta": {"from": "journal"}}
{"content": "rule 48 \u2014 The viewer is built from its component library, and pages only\u2026 \u2014 Message 4258. Every visual piece the viewer shows more than once, or that a user would recognise as the same kind of thing (a dialog, a side panel or inspector, a dropdown, a list row, a switch, a button), is one component in web/src/kit, extracted aggressively, and every page composes those components instead of building its own copy. Before writing markup or styles in a page, look for the kit component that already does it and extend it with a prop; a second hand-built version is a bug. The side panel that animated in but not out, while a separate skill panel did both, is the example.; rule 52 \u2014 A chat mark for something the user did sits on the user's side \u2014 Message 10960 (2026-09-25): marks for the user's own actions, such as answering a question, are right-aligned like the user's messages. A mark is put there by giving its card side=user.", "meta": {"from": "journal"}}
{"content": "1 new message 23332 - answer by opening your turn with [!reply:23332]", "meta": {"from": "journal"}}
{"content": "fact 23 \u2014 Every upgrade brings system sequences and their triggers in line\u2026 \u2014 install.py runs ship_sequences after the migrations on each upgrade, so features/sequences/shipped.py is the whole source: change its wording and the next upgrade updates every journal, no migration needed. Shipped rows carry system=True and are read-only for everyone but SYSTEM (controllers/base.py _shipped).", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread todo 3847", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 314ms last (92ms of it working, then 1ms more after it answered), against a budget of 50ms. The machine's load was 14.5 on 10 cores. Seen 1 time.", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread todo 3848", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23334 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 23336 - answer by opening your turn with [!reply:23336]", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat; there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23338 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "Hedy's live profiles of the dashboard and work await, and Coco's animation\u2026", "meta": {"from": "journal"}}
{"content": "work 2314 is still open \u2014 end it or park it before you stop: journal work end 2314 --how \"<what landed>\", or journal work park 2314 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "Tests for 2.267.65, the dashboard fix came back - Gather Hedy's dashboard fix\u2026", "meta": {"from": "journal"}}
{"content": "rule 43 \u2014 A request or hook over its budget is fixed before the next release \u2014 Comment 1151 on this rule. When the faults feature reports a request, a hook or a command slower than its budget, file it as a to-do at once. It does not jump ahead of the work in hand, but no version is published while one is still open: profile it, fix it, and verify the new time before the release goes out. The budget is 50ms, because everything runs locally against files.", "meta": {"from": "journal"}}
{"content": "1 new message 23340 - answer by opening your turn with [!reply:23340]", "meta": {"from": "journal"}}
{"content": "the end tag does this in one step \u2014 [!end:N] makes the turn itself what landed; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23345 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "waiting: 2 unread todos 3850, 3852", "meta": {"from": "journal"}}
{"content": "Viewer tests for 2.267.66 with the plan rows came back - Gather the plan rows\u2026", "meta": {"from": "journal"}}
{"content": "1 new message 23347 - answer by opening your turn with [!reply:23347]", "meta": {"from": "journal"}}
{"content": "rule 66 \u2014 The journal never slows the agent down \u2014 The user, message 18990, after hooks timed out and waited on locks under load: the journal must never, ever decrease the performance of an agent. A hook answers at once with what decides the tool call; everything else runs after, in the background, and reaches the agent as a message. No hook waits on a lock it does not need.", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23349 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "work 2316 is still open \u2014 end it or park it before you stop: journal work end 2316 --how \"<what landed>\", or journal work park 2316 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23350 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "Coco's corrected plan rows for transportklok, and Hedy's cut of the folder\u2026", "meta": {"from": "journal"}}
{"content": "work 2316, Waiting on 2.267.65 is installed - the dashboard now takes its open\u2026 \u2014 it was parked because: the plan rows went back to Coco: they rewrote kit/ListRow.vue and broke the People page tests. journal work resume 2316 picks it up again.", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23351 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "All viewer tests for 2.267.66 with the corrected plan rows came back - Gather\u2026", "meta": {"from": "journal"}}
{"content": "sequence 28, Sort dumped files, step 1 of 3 - Read each file \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 28 --about dump:26. journal dump items 26 lists what was dropped. Go through the items one at a time: read an item in full and at once record what it is with journal dump note 26 <item> \"<what it is>\", so the pile shows it as read, before you open the next. When the pasted text holds several things, such as a summary, a transcript and a link, split it with journal dump split 26 \"Summary, Transcript, Link\". Name its collection for what the pile is about with journal dump name 26 \"<name>\". Write nothing in the chat while this runs: the user is in the dump window. When it is done: journal sequence next 28 --about dump:26.; 1 new dump 26; 1 new collection 32; collection 32 linked; dump 26 linked; dump 26 updated; collection 32 updated", "meta": {"from": "journal"}}
{"content": "sequence 28, Sort dumped files, step 2 of 3 - File each subject \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 28 --about dump:26. Sort the pile by concern: one document per subject, never one big document, even when a single transcript or note covers several. Name each for what it is about, never after the file it came in. Decide the shape yourself: where a summary, meeting notes, the decisions or the action items would help, write them without being asked and list them with --added; action items become to-dos. An image goes with the document it belongs to. Never make a plan or start work: that is a suggestion for the end. Everything you file is in the journal at once, in the dump's collection. Log each step with journal dump log 26 \"<short title>\" --detail \"<what and why>\", with --making \"dump, <title>\" before a row exists and --on <type:n> once it does. File each item as soon as you have what it needs, one at a time: journal dump filed 26 <item> \"<what you did>\" --refs \"<ref, ref>\" --added \"dump:26\" (every added row also in refs) or journal dump failed. Ask only what you cannot tell, with journal dump ask 26 \"<question>\" --guesses \"<one>|<two>\". Write nothing in the chat while this runs: the user is in the dump window. When it is done: journal sequence next 28 --about dump:26.", "meta": {"from": "journal"}}
{"content": "Tests for 2.267.66 with the plan rows and Hedy's one scan per type came back\u2026", "meta": {"from": "journal"}}
{"content": "dump 26 is filed (11 filed) - sum it up for the user \u2014 Everything it made is already in the journal, in the dump's collection. Sum up what you filed and where in two or three plain lines, and suggest a next step only where one is worth taking, as a question with a button on the dump itself, never elsewhere: journal dump offer 26 '[{\"ask\": \"The notes say you want to start on the mobile layout. Want me to plan it?\", \"label\": \"Plan it\"}]' --summary \"<what you filed and where>\". Use '[]' when nothing is worth suggesting. A step that is a journal action carries its type, n and action and runs as the user when pressed. Never start or plan anything yourself: a suggestion is how you propose it.", "meta": {"from": "journal"}}
{"content": "1 new dump 27; 1 new collection 33; collection 33 linked; dump 27 linked; dump 27 updated; collection 33 updated", "meta": {"from": "journal"}}
{"content": "sequence 28, Sort dumped files, step 1 of 3 - Read each file \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 28 --about dump:27. journal dump items 27 lists what was dropped. Go through the items one at a time: read an item in full and at once record what it is with journal dump note 27 <item> \"<what it is>\", so the pile shows it as read, before you open the next. When the pasted text holds several things, such as a summary, a transcript and a link, split it with journal dump split 27 \"Summary, Transcript, Link\". Name its collection for what the pile is about with journal dump name 27 \"<name>\". Write nothing in the chat while this runs: the user is in the dump window. When it is done: journal sequence next 28 --about dump:27.; dump 27 updated; collection 33 updated", "meta": {"from": "journal"}}
{"content": "sequence 28, Sort dumped files, step 2 of 3 - File each subject \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 28 --about dump:27. Sort the pile by concern: one document per subject, never one big document, even when a single transcript or note covers several. Name each for what it is about, never after the file it came in. Decide the shape yourself: where a summary, meeting notes, the decisions or the action items would help, write them without being asked and list them with --added; action items become to-dos. An image goes with the document it belongs to. Never make a plan or start work: that is a suggestion for the end. Everything you file is in the journal at once, in the dump's collection. Log each step with journal dump log 27 \"<short title>\" --detail \"<what and why>\", with --making \"dump, <title>\" before a row exists and --on <type:n> once it does. File each item as soon as you have what it needs, one at a time: journal dump filed 27 <item> \"<what you did>\" --refs \"<ref, ref>\" --added \"dump:27\" (every added row also in refs) or journal dump failed. Ask only what you cannot tell, with journal dump ask 27 \"<question>\" --guesses \"<one>|<two>\". Write nothing in the chat while this runs: the user is in the dump window. When it is done: journal sequence next 28 --about dump:27.", "meta": {"from": "journal"}}
{"content": "Push and install of 2.267.66 came back - Version, tag, push and install\u2026", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread todo 3853", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23362 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23365 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23366 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "1 new message 23368 - answer by opening your turn with [!reply:23368]", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread todo 3856", "meta": {"from": "journal"}}
{"content": "1 new message 23374 - answer by opening your turn with [!reply:23374]", "meta": {"from": "journal"}}
{"content": "1 new message 23380 - answer by opening your turn with [!reply:23380]", "meta": {"from": "journal"}}
{"content": "1 new message 23381 - answer by opening your turn with [!reply:23381]", "meta": {"from": "journal"}}
{"content": "1 new message 23383 - answer by opening your turn with [!reply:23383]", "meta": {"from": "journal"}}
{"content": "1 new message 23395 - answer by opening your turn with [!reply:23395]", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23398 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "todo 3856, request GET /api/main/dashboard is slower than its budget, is\u2026 \u2014 journal todo start 3856 when it is next; helper 228, Hedy Lockwell, reported in message 23410 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "Every-action test for 2.267.67 came back - Gather the warm-up change and run\u2026", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23413 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 23414 - answer by opening your turn with [!reply:23414]", "meta": {"from": "journal"}}
{"content": "there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, asks question 1 and waits for the answer \u2014 What should the mascot do when the chat pane is narrower than about 300 px? Options: 1. Hide it (its pick); 2. Shrink it; 3. Leave it. It waits in the helper's own environment, so answer it there with journal --env \"main-coco-runwright\" question answer 1 \"<answer>\" --set reason=\"<why>\"", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23410 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 23415 - answer by opening your turn with [!reply:23415]", "meta": {"from": "journal"}}
{"content": "message 23415 updated", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread todo 3859", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread todo 3860", "meta": {"from": "journal"}}
{"content": "1 new message 23422 - answer by opening your turn with [!reply:23422]; message 23422 updated", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "1 new message 23425 - answer by opening your turn with [!reply:23425]", "meta": {"from": "journal"}}
{"content": "1 new message 23427 - answer by opening your turn with [!reply:23427]", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23452 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "Tests for 2.267.68 with lock-free dashboard reads came back - Gather Hedy's\u2026", "meta": {"from": "journal"}}
{"content": "Push and install of 2.267.68 came back - Version, tag, push and install\u2026", "meta": {"from": "journal"}}
{"content": "1 new message 23454 - answer by opening your turn with [!reply:23454]", "meta": {"from": "journal"}}
{"content": "message 23454 updated", "meta": {"from": "journal"}}
{"content": "answer message 23454 before you write anything \u2014 answer by opening your turn with [!reply:23454]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23456 \u2014 read it, then journal helper finish 230 once its work is taken or dropped; 1 new message 23455 - answer by opening your turn with [!reply:23455]", "meta": {"from": "journal"}}
{"content": "there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each; 2.267.68 is installed. A dashboard read no longer waits on a lock - Hedy moved\u2026; work 2322 is still open \u2014 end it or park it before you stop: journal work end 2322 --how \"<what landed>\", or journal work park 2322 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "Coco's faster search is in its tests now, and goes out as 2.267.69 once they\u2026", "meta": {"from": "journal"}}
{"content": "rule 40 \u2014 A feature is named for what it is, never for its machinery \u2014 Messages 599, 600 and 703. A feature is a capability the user would name and would think of switching off. File tracking, a write gate, a phrase bank, a tree diff are services used inside a feature, not features of their own: they live in the feature they serve. Before adding a directory under features/, say what the user would call it; if the answer names a mechanism, it belongs inside something else. Report 16 holds the grouping this implies.", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread todo 3862", "meta": {"from": "journal"}}
{"content": "1 new message 23458 - answer by opening your turn with [!reply:23458]", "meta": {"from": "journal"}}
{"content": "your command ran 15s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "Which search feature test fails, before 2.267.69 can go out came back - Rerun\u2026", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23456 \u2014 read it, then journal helper finish 230 once its work is taken or dropped; The People scenario on plain main, to tell a new failure from an old one came\u2026", "meta": {"from": "journal"}}
{"content": "your command ran 18s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "The People scenario on plain main came back - Rerun the members test on plain\u2026", "meta": {"from": "journal"}}
{"content": "todo 3670, The whole suite runs in under two minutes again, every test kept\u2026 \u2014 it is blocked because: Under two minutes can only be measured on a quiet machine; the load has stayed at 30-80 all afternoon from the user's other projects and apps. If it is not any more, journal todo unblock 3670. If it waits on a person or a decision, make it a question to them: journal todo ask 3670 \"<who decides what>\" --set options='[...]' --set pick=<n>, and the row waits on their answer. Otherwise tell the user in the chat what it waits on, in their terms, and propose how to clear it.", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23477 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "Hedy's dashboard and People scenario fixes came back - Hedy Lockwell - Alfred\u2026", "meta": {"from": "journal"}}
{"content": "Tests for 2.267.70 with the row index in its own folder came back - Gather\u2026", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23456 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "Push and install of 2.267.70 came back - Version, tag, push and install\u2026", "meta": {"from": "journal"}}
{"content": "2.267.70 is installed - saving the row index no longer makes the next\u2026", "meta": {"from": "journal"}}
{"content": "Hedy's fix for the People scenario came back - Hedy Lockwell - Alfred - 3862\u2026", "meta": {"from": "journal"}}
{"content": "Hedy's fix for the People scenario (to-do 3863) came back - Hedy Lockwell\u2026", "meta": {"from": "journal"}}
{"content": "command message search is slower than its budget \u2014 3004ms last (1307ms of it working), against a budget of 50ms. The machine's load was 30.6 on 10 cores. Seen 1 time.", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread todo 3864", "meta": {"from": "journal"}}
{"content": "1 new message 23479 - answer by opening your turn with [!reply:23479]", "meta": {"from": "journal"}}
{"content": "your wait for Hedy's People scenario fix (to-do 3863), and Coco's cold search\u2026 \u2014 say journal work await \"<what you wait for>\" again if you are still only waiting; helper 228, Hedy Lockwell, reported in message 23477 \u2014 read it, then journal helper finish 228 once its work is taken or dropped; 1 new message 23480 - answer by opening your turn with [!reply:23480]", "meta": {"from": "journal"}}
{"content": "message 23480 file Screenshot 2026-10-09 at 23.38.23.png needs tags \u2014 inspect the attachment, then journal message tag 23480 \"Screenshot 2026-10-09 at 23.38.23.png\" \"<a few words describing what it shows>\"; message 23480 updated", "meta": {"from": "journal"}}
{"content": "1 new message 23481 - answer by opening your turn with [!reply:23481]", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23482 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 23483 - answer by opening your turn with [!reply:23483]", "meta": {"from": "journal"}}
{"content": "1 new message 23485 - answer by opening your turn with [!reply:23485]", "meta": {"from": "journal"}}
{"content": "1 new message 23486 - answer by opening your turn with [!reply:23486]", "meta": {"from": "journal"}}
{"content": "command message reply is slower than its budget \u2014 1349ms last (77ms of it working, 2ms waiting on locks), against a budget of 50ms. The machine's load was 38.9 on 10 cores. Seen 1 time.; work 2325 is still open \u2014 end it or park it before you stop: journal work end 2325 --how \"<what landed>\", or journal work park 2325 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "auto mode is on and work 2325 stands still while todo 3867 is ready \u2014 if work 2325 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3867. Stop only when nothing ready is left.", "meta": {"from": "journal"}}
{"content": "1 new message 23490 - answer by opening your turn with [!reply:23490]", "meta": {"from": "journal"}}
{"content": "work 2326 is still open, with nothing logged \u2014 journal work log 2326 \"<what was decided or done, and why>\" \u2014 then journal work end 2326 --how \"<what landed>\", or journal work park 2326 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "1 new message 23493 - answer by opening your turn with [!reply:23493]", "meta": {"from": "journal"}}
{"content": "1 new message 23495 - answer by opening your turn with [!reply:23495]", "meta": {"from": "journal"}}
{"content": "rule 60 \u2014 A hotfix is done by a dispatched agent in a worktree of main \u2014 Message 16836 (2026-10-06): the orchestrator cut a worktree under .claude/worktrees for a Codex hotfix, its session moved to a new environment and the user's messages stopped reaching it. The user: when working on a branch and a hotfix comes in, create a worktree of main and dispatch an agent to do that work. The orchestrator stays on its branch and in its environment, and never cds into another checkout.", "meta": {"from": "journal"}}
{"content": "1 new message 23496 - answer by opening your turn with [!reply:23496]", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "your command ran 16s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "work 2326 in hand \u2014 A part animator plays the mascots from their cut-out rigs \u2014 if this is not what you are doing, end it or park it and start the work you are in", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread worktree 117", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23514 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 23516 - answer by opening your turn with [!reply:23516]; message 23516 updated", "meta": {"from": "journal"}}
{"content": "helper 231, Rembrandt Cutwell, stopped running before it reported \u2014 its agent is gone, so journal helper say cannot reach it. To continue this session, run: codex resume 01a1229f-9afa-75d2-82c9-491e9d83764c Or run codex resume and select Read launch instructions. Dispatch the job again, or journal helper finish 231 and do the job yourself", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23517 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 23519 - answer by opening your turn with [!reply:23519]", "meta": {"from": "journal"}}
{"content": "1 new message 23521 - answer by opening your turn with [!reply:23521]; message 23521 updated", "meta": {"from": "journal"}}
{"content": "message 23521 updated", "meta": {"from": "journal"}}
{"content": "1 new message 23522 - answer by opening your turn with [!reply:23522]", "meta": {"from": "journal"}}
{"content": "1 new message 23523 - answer by opening your turn with [!reply:23523]", "meta": {"from": "journal"}}
{"content": "the log tag does this in one step \u2014 [!log:N] makes the turn itself the log entry; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat; the reply tag on 23528,23529 did not run \u2014 ! you already answered this in comment 3496: add to that answer with journal comment update 3496 rather than a second reply - add what is missing to the tag itself; there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each; answer message 23524 before you write anything \u2014 answer by opening your turn with [!reply:23524]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "auto mode is on and work 2326 stands still while todo 3868 is ready \u2014 if work 2326 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3868. Stop only when nothing ready is left.; work 2326 is still open \u2014 end it or park it before you stop: journal work end 2326 --how \"<what landed>\", or journal work park 2326 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "command message search is slower than its budget \u2014 492ms last (109ms of it working), against a budget of 50ms. The machine's load was 80.2 on 10 cores. Seen 2 times.", "meta": {"from": "journal"}}
{"content": "request POST /api/run (message search) is slower than its budget \u2014 500ms last (112ms of it working, then 1601ms more after it answered), against a budget of 50ms. The machine's load was 80.2 on 10 cores. Seen 2 times.", "meta": {"from": "journal"}}
{"content": "your command ran 40s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself; helper 228, Hedy Lockwell, reported in message 23532 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 230 \"<the next work>\", or journal helper finish 230 once its work is taken; to-do 3870 came from message 23530? \u2014 link it: journal message process 23530 \"<their words>\" todo:3870; to-do 3871 came from message 23530? \u2014 link it: journal message process 23530 \"<their words>\" todo:3871", "meta": {"from": "journal"}}
{"content": "1 new message 23533 - answer by opening your turn with [!reply:23533]", "meta": {"from": "journal"}}
{"content": "your command ran 80s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself; message 23533 updated", "meta": {"from": "journal"}}
{"content": "message 23533 file Screenshot 2026-10-10 at 00.00.13.png needs tags \u2014 inspect the attachment, then journal message tag 23533 \"Screenshot 2026-10-10 at 00.00.13.png\" \"<a few words describing what it shows>\"", "meta": {"from": "journal"}}
{"content": "1 new message 23534 - answer by opening your turn with [!reply:23534]", "meta": {"from": "journal"}}
{"content": "request POST /api/main/settings is slower than its budget \u2014 2109ms last (59ms of it working), against a budget of 50ms. The machine's load was 68.6 on 10 cores. Seen 1 time.", "meta": {"from": "journal"}}
{"content": "the reply tag on 23530,23524 did not run \u2014 ! you already answered this in comment 3497: add to that answer with journal comment update 3497 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each; answer message 23533 before you write anything \u2014 answer by opening your turn with [!reply:23533]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "work 2326 is still open \u2014 end it or park it before you stop: journal work end 2326 --how \"<what landed>\", or journal work park 2326 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "message 23534 updated", "meta": {"from": "journal"}}
{"content": "auto mode is on and work 2326 stands still while todo 3868 is ready \u2014 if work 2326 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3868. Stop only when nothing ready is left.", "meta": {"from": "journal"}}
{"content": "answer message 23533, message 23534 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>; work 2326 is still open \u2014 end it or park it before you stop: journal work end 2326 --how \"<what landed>\", or journal work park 2326 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "message 17229 file IMG_1159.png needs tags \u2014 inspect the attachment, then journal message tag 17229 \"IMG_1159.png\" \"<a few words describing what it shows>\"; message 17246 file IMG_1163.png needs tags \u2014 inspect the attachment, then journal message tag 17246 \"IMG_1163.png\" \"<a few words describing what it shows>\"; message 17302 file IMG_1172.png needs tags \u2014 inspect the attachment, then journal message tag 17302 \"IMG_1172.png\" \"<a few words describing what it shows>\"; message 17380 file IMG_1173.png needs tags \u2014 inspect the attachment, then journal message tag 17380 \"IMG_1173.png\" \"<a few words describing what it shows>\"; message 17397 file IMG_1175.png needs tags \u2014 inspect the attachment, then journal message tag 17397 \"IMG_1175.png\" \"<a few words describing what it shows>\"; message 17848 file Screenshot 2026-10-07 at 19.08.54.png needs tags \u2014 inspect the attachment, then journal message tag 17848 \"Screenshot 2026-10-07 at 19.08.54.png\" \"<a few words describing what it shows>\"; message 18311 file Screenshot 2026-10-08 at 15.32.11.png needs tags \u2014 inspect the attachment, then journal message tag 18311 \"Screenshot 2026-10-08 at 15.32.11.png\" \"<a few words describing what it shows>\"; message 18337 file Screenshot 2026-10-08 at 15.48.03.png needs tags \u2014 inspect the attachment, then journal message tag 18337 \"Screenshot 2026-10-08 at 15.48.03.png\" \"<a few words describing what it shows>\"; message 18400 file Screenshot 2026-10-08 at 16.20.05.png needs tags \u2014 inspect the attachment, then journal message tag 18400 \"Screenshot 2026-10-08 at 16.20.05.png\" \"<a few words describing what it shows>\"; message 18406 file Screenshot 2026-10-08 at 16.24.17.png needs tags \u2014 inspect the attachment, then journal message tag 18406 \"Screenshot 2026-10-08 at 16.24.17.png\" \"<a few words describing what it shows>\"; message 18579 file Screenshot 2026-10-08 at 17.51.57.png needs tags \u2014 inspect the attachment, then journal message tag 18579 \"Screenshot 2026-10-08 at 17.51.57.png\" \"<a few words describing what it shows>\"; message 22440 file Screenshot 2026-10-09 at 17.26.32.png needs tags \u2014 inspect the attachment, then journal message tag 22440 \"Screenshot 2026-10-09 at 17.26.32.png\" \"<a few words describing what it shows>\"; message 22551 file Screenshot 2026-10-09 at 18.08.15.png needs tags \u2014 inspect the attachment, then journal message tag 22551 \"Screenshot 2026-10-09 at 18.08.15.png\" \"<a few words describing what it shows>\"; message 22553 file Screenshot 2026-10-09 at 18.10.06.png needs tags \u2014 inspect the attachment, then journal message tag 22553 \"Screenshot 2026-10-09 at 18.10.06.png\" \"<a few words describing what it shows>\"; message 22790 file Charging Knight vs. Code Bug.png needs tags \u2014 inspect the attachment, then journal message tag 22790 \"Charging Knight vs. Code Bug.png\" \"<a few words describing what it shows>\"; message 22925 file Screenshot 2026-10-09 at 19.44.46.png needs tags \u2014 inspect the attachment, then journal message tag 22925 \"Screenshot 2026-10-09 at 19.44.46.png\" \"<a few words describing what it shows>\"; message 23185 file Screenshot 2026-10-09 at 21.17.09.png needs tags \u2014 inspect the attachment, then journal message tag 23185 \"Screenshot 2026-10-09 at 21.17.09.png\" \"<a few words describing what it shows>\"; message 23193 file Screenshot 2026-10-09 at 21.20.34.png needs tags \u2014 inspect the attachment, then journal message tag 23193 \"Screenshot 2026-10-09 at 21.20.34.png\" \"<a few words describing what it shows>\"; message 23197 file Screenshot 2026-10-09 at 21.22.06.png needs tags \u2014 inspect the attachment, then journal message tag 23197 \"Screenshot 2026-10-09 at 21.22.06.png\" \"<a few words describing what it shows>\"; message 23308 file butler_idle_1_atlas.png needs tags \u2014 inspect the attachment, then journal message tag 23308 \"butler_idle_1_atlas.png\" \"<a few words describing what it shows>\"; message 23308 file coach_idle_1_atlas.png needs tags \u2014 inspect the attachment, then journal message tag 23308 \"coach_idle_1_atlas.png\" \"<a few words describing what it shows>\"; message 23308 file colleague_idle_1_atlas.png needs tags \u2014 inspect the attachment, then journal message tag 23308 \"colleague_idle_1_atlas.png\" \"<a few words describing what it shows>\"; message 23308 file homie_idle_1_atlas.png needs tags \u2014 inspect the attachment, then journal message tag 23308 \"homie_idle_1_atlas.png\" \"<a few words describing what it shows>\"; message 23327 file Screenshot 2026-10-09 at 22.27.42.png needs tags \u2014 inspect the attachment, then journal message tag 23327 \"Screenshot 2026-10-09 at 22.27.42.png\" \"<a few words describing what it shows>\"; message 23415 file ChatGPT Image Oct 9, 2026, 11_08_11 PM.png needs tags \u2014 inspect the attachment, then journal message tag 23415 \"ChatGPT Image Oct 9, 2026, 11_08_11 PM.png\" \"<a few words describing what it shows>\"; message 23422 file rebuilt_atlas.png needs tags \u2014 inspect the attachment, then journal message tag 23422 \"rebuilt_atlas.png\" \"<a few words describing what it shows>\"; message 23454 file contact_sheet (1).jpg needs tags \u2014 inspect the attachment, then journal message tag 23454 \"contact_sheet (1).jpg\" \"<a few words describing what it shows>\"; message 23516 file Screenshot 2026-10-09 at 23.49.32.png needs tags \u2014 inspect the attachment, then journal message tag 23516 \"Screenshot 2026-10-09 at 23.49.32.png\" \"<a few words describing what it shows>\"; message 23521 file Screenshot 2026-10-09 at 23.51.02.png needs tags \u2014 inspect the attachment, then journal message tag 23521 \"Screenshot 2026-10-09 at 23.51.02.png\" \"<a few words describing what it shows>\"; message 23521 file Screenshot 2026-10-09 at 23.51.08.png needs tags \u2014 inspect the attachment, then journal message tag 23521 \"Screenshot 2026-10-09 at 23.51.08.png\" \"<a few words describing what it shows>\"; message 23533 file Screenshot 2026-10-10 at 00.00.13.png needs tags \u2014 inspect the attachment, then journal message tag 23533 \"Screenshot 2026-10-10 at 00.00.13.png\" \"<a few words describing what it shows>\"; comment 3428 file first-choice.png needs tags \u2014 inspect the attachment, then journal comment tag 3428 \"first-choice.png\" \"<a few words describing what it shows>\"; comment 3431 file page@a662f6fcf54b9c23d7a95707c8688020.webm needs tags \u2014 inspect the attachment, then journal comment tag 3431 \"page@a662f6fcf54b9c23d7a95707c8688020.webm\" \"<a few words describing what it shows>\"; comment 3476 file page@58514722da25d7d921f35ec39055ae6b.webm needs tags \u2014 inspect the attachment, then journal comment tag 3476 \"page@58514722da25d7d921f35ec39055ae6b.webm\" \"<a few words describing what it shows>\"; collection 32 file butler_idle_1_atlas.png needs tags \u2014 inspect the attachment, then journal collection tag 32 \"butler_idle_1_atlas.png\" \"<a few words describing what it shows>\"; collection 32 file coach_idle_1_atlas.png needs tags \u2014 inspect the attachment, then journal collection tag 32 \"coach_idle_1_atlas.png\" \"<a few words describing what it shows>\"; collection 32 file colleague_idle_1_atlas.png needs tags \u2014 inspect the attachment, then journal collection tag 32 \"colleague_idle_1_atlas.png\" \"<a few words describing what it shows>\"; collection 32 file homie_idle_1_atlas.png needs tags \u2014 inspect the attachment, then journal collection tag 32 \"homie_idle_1_atlas.png\" \"<a few words describing what it shows>\"; collection 32 file squire_idle_1_atlas.png needs tags \u2014 inspect the attachment, then journal collection tag 32 \"squire_idle_1_atlas.png\" \"<a few words describing what it shows>\"; dump 26 file butler_idle_1_atlas.png needs tags \u2014 inspect the attachment, then journal dump tag 26 \"butler_idle_1_atlas.png\" \"<a few words describing what it shows>\"; dump 26 file coach_idle_1_atlas.png needs tags \u2014 inspect the attachment, then journal dump tag 26 \"coach_idle_1_atlas.png\" \"<a few words describing what it shows>\"; dump 26 file colleague_idle_1_atlas.png needs tags \u2014 inspect the attachment, then journal dump tag 26 \"colleague_idle_1_atlas.png\" \"<a few words describing what it shows>\"; dump 26 file homie_idle_1_atlas.png needs tags \u2014 inspect the attachment, then journal dump tag 26 \"homie_idle_1_atlas.png\" \"<a few words describing what it shows>\"; dump 26 file squire_idle_1_atlas.png needs tags \u2014 inspect the attachment, then journal dump tag 26 \"squire_idle_1_atlas.png\" \"<a few words describing what it shows>\"; the journal is ready on main \u2014 say hello in the chat in plain words, so the journal's messages reach you", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23532 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 23536 - answer by opening your turn with [!reply:23536]", "meta": {"from": "journal"}}
{"content": "message 23536 file Screenshot 2026-10-10 at 00.03.53.png needs tags \u2014 inspect the attachment, then journal message tag 23536 \"Screenshot 2026-10-10 at 00.03.53.png\" \"<a few words describing what it shows>\"; message 23536 updated", "meta": {"from": "journal"}}
{"content": "rule 70 \u2014 Release fixes for transportklok-workspace reports at once, without\u2026 \u2014 The user, message 22416 (2026-10-09): 'All reports from the Transport Clock workspace should be handled immediately with the highest urgency and committed and pushed ASAP, without testing or running the full test suite.' A report from that project's session goes first, is fixed, committed, pushed to main and installed as soon as it works, running at most the tests beside the change.", "meta": {"from": "journal"}}
{"content": "your command ran 59s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself; 1 new message 23538 - answer by opening your turn with [!reply:23538]", "meta": {"from": "journal"}}
{"content": "message 23538 file Screenshot 2026-10-10 at 00.04.21.png needs tags \u2014 inspect the attachment, then journal message tag 23538 \"Screenshot 2026-10-10 at 00.04.21.png\" \"<a few words describing what it shows>\"; message 23538 updated", "meta": {"from": "journal"}}
{"content": "your command ran 197s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "the hook hit an error \u2014 journal: the hook hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. the hook got no answer from the server 1 times (codes 000, machine load 78.58 on 10 cores)", "meta": {"from": "journal"}}
{"content": "1 new message 23553 - answer by opening your turn with [!reply:23553]", "meta": {"from": "journal"}}
{"content": "your command ran 284s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 23555 - answer by opening your turn with [!reply:23555]", "meta": {"from": "journal"}}
{"content": "auto mode is on and work 2326 stands still while todo 3868 is ready \u2014 if work 2326 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3868. Stop only when nothing ready is left.; 1 new message 23556 - answer by opening your turn with [!reply:23556]", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, has stood idle for 6 minutes \u2014 it finished its turn and waits for work: journal helper say 230 \"<the next work>\", or journal helper finish 230 once its work is taken", "meta": {"from": "journal"}}
{"content": "1 new message 23557 - answer by opening your turn with [!reply:23557]", "meta": {"from": "journal"}}
{"content": "request POST /api/main/settings is slower than its budget \u2014 682ms last (63ms of it working, 4ms waiting on locks), against a budget of 50ms. The machine's load was 79.5 on 10 cores. Seen 7 times.", "meta": {"from": "journal"}}
{"content": "1 new message 23558 - answer by opening your turn with [!reply:23558]", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23559 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "request POST /api/main/message is slower than its budget \u2014 1323ms last (52ms of it working, 3ms waiting on locks, then 512ms more after it answered), against a budget of 50ms. The machine's load was 76.8 on 10 cores. Seen 1 time.", "meta": {"from": "journal"}}
{"content": "1 new message 23560 - answer by opening your turn with [!reply:23560]", "meta": {"from": "journal"}}
{"content": "1 new message 23562 - answer by opening your turn with [!reply:23562]", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "1 new message 23564 - answer by opening your turn with [!reply:23564]", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23566 \u2014 read it, then journal helper finish 228 once its work is taken or dropped; auto mode is on and work 2326 stands still while todo 3868 is ready \u2014 if work 2326 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3868. Stop only when nothing ready is left.", "meta": {"from": "journal"}}
{"content": "1 new message 23567 - answer by opening your turn with [!reply:23567]", "meta": {"from": "journal"}}
{"content": "1 new message 23569 - answer by opening your turn with [!reply:23569]", "meta": {"from": "journal"}}
{"content": "message 23569 updated", "meta": {"from": "journal"}}
{"content": "message 23569 file Screenshot 2026-10-10 at 00.19.45.png needs tags \u2014 inspect the attachment, then journal message tag 23569 \"Screenshot 2026-10-10 at 00.19.45.png\" \"<a few words describing what it shows>\"", "meta": {"from": "journal"}}
{"content": "1 new message 23570 - answer by opening your turn with [!reply:23570]; message 23570 updated", "meta": {"from": "journal"}}
{"content": "1 new message 23571 - answer by opening your turn with [!reply:23571]", "meta": {"from": "journal"}}
{"content": "message 23570 file Screenshot 2026-10-10 at 00.20.33.png needs tags \u2014 inspect the attachment, then journal message tag 23570 \"Screenshot 2026-10-10 at 00.20.33.png\" \"<a few words describing what it shows>\"", "meta": {"from": "journal"}}
{"content": "hook POST /api/hook/codex is slower than its budget \u2014 1412ms last (67ms of it working, then 9043ms more after it answered), against a budget of 50ms. The machine's load was 67.6 on 10 cores. Seen 2 times.", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23573 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 700s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 704s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 23577 - answer by opening your turn with [!reply:23577]; message 23577 updated", "meta": {"from": "journal"}}
{"content": "message 23577 file Screenshot 2026-10-10 at 00.23.07.png needs tags \u2014 inspect the attachment, then journal message tag 23577 \"Screenshot 2026-10-10 at 00.23.07.png\" \"<a few words describing what it shows>\"", "meta": {"from": "journal"}}
{"content": "your command ran 712s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 23579 - answer by opening your turn with [!reply:23579]", "meta": {"from": "journal"}}
{"content": "your command ran 760s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23573 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23584 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 23585 - answer by opening your turn with [!reply:23585]", "meta": {"from": "journal"}}
{"content": "your command ran 853s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "the todo tag does this in one step \u2014 [!todo=\"the title\"] files it with the turn as its brief; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "1 new message 23587 - answer by opening your turn with [!reply:23587]", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23590 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 36s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 46s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 23592 - answer by opening your turn with [!reply:23592]", "meta": {"from": "journal"}}
{"content": "1 new message 23593 - answer by opening your turn with [!reply:23593]", "meta": {"from": "journal"}}
{"content": "dump 27 updated", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23594 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 147s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23596 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 159s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "hook POST /api/hook/codex is slower than its budget \u2014 665ms last (119ms of it working, then 9184ms more after it answered), against a budget of 50ms. The machine's load was 59.6 on 10 cores. Seen 1 time.", "meta": {"from": "journal"}}
{"content": "request GET /api/main/file is slower than its budget \u2014 1748ms last (108ms of it working), against a budget of 50ms. The machine's load was 57.9 on 10 cores. Seen 1 time.", "meta": {"from": "journal"}}
{"content": "1 new message 23597 - answer by opening your turn with [!reply:23597]", "meta": {"from": "journal"}}
{"content": "1 new message 23598 - answer by opening your turn with [!reply:23598]", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 2811ms last (67ms of it working, then 2ms more after it answered), against a budget of 50ms. The machine's load was 57.0 on 10 cores. Seen 1 time.; message 23598 file Screenshot 2026-10-10 at 00.36.37.png needs tags \u2014 inspect the attachment, then journal message tag 23598 \"Screenshot 2026-10-10 at 00.36.37.png\" \"<a few words describing what it shows>\"; message 23598 updated", "meta": {"from": "journal"}}
{"content": "todo 3670, The whole suite runs in under two minutes again, every test kept\u2026 \u2014 it is blocked because: Under two minutes can only be measured on a quiet machine; the load has stayed at 30-80 all afternoon from the user's other projects and apps. If it is not any more, journal todo unblock 3670. If it waits on a person or a decision, make it a question to them: journal todo ask 3670 \"<who decides what>\" --set options='[...]' --set pick=<n>, and the row waits on their answer. Otherwise tell the user in the chat what it waits on, in their terms, and propose how to clear it.", "meta": {"from": "journal"}}
{"content": "1 new message 23617 - answer by opening your turn with [!reply:23617]; message 23617 updated", "meta": {"from": "journal"}}
{"content": "1 new message 23618 - answer by opening your turn with [!reply:23618]", "meta": {"from": "journal"}}
{"content": "message 23617 file Screenshot 2026-10-10 at 00.42.58.png needs tags \u2014 inspect the attachment, then journal message tag 23617 \"Screenshot 2026-10-10 at 00.42.58.png\" \"<a few words describing what it shows>\"", "meta": {"from": "journal"}}
{"content": "Is rule 71 a ruling for the whole project? \u2014 rule 71, \"Always reuse a helper's or subagent's whole session, never only its name\", binds every environment of the project. Keep it only if it is a ruling for all of them, worded as one (\"Always ...\", \"Never ...\"). If it is about this environment or its current work, strike it with journal rule strike 71 --how \"<why>\" and file it here as a fact or a reminder instead.", "meta": {"from": "journal"}}
{"content": "1 new message 23619 - answer by opening your turn with [!reply:23619]", "meta": {"from": "journal"}}
{"content": "your command ran 337s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 235, Rembrandt Cutwell, reported in message 23602 \u2014 read it, then journal helper finish 235 once its work is taken or dropped; this branch has commits Add completed mascot rigs and enter and exit animations that your branch lacks; tests it wrote, for you to run: src/features/file_feed/test.py, src/features/hosted_journal/test.py, src/features/open_viewer/test.py, src/features/plugins/test.py, src/features/status_bar/test.py, src/web/tests/inspectorOwnAgent.test.js, src/web/tests/thread.test.js, tests/conftest.py", "meta": {"from": "journal"}}
{"content": "rule 71 \u2014 Always reuse a helper's or subagent's whole session, never only its\u2026 \u2014 The user, messages 23609 and 23614 (2026-10-10): workers are reused by their whole session, so they keep their context. A helper whose agent ended resumes its own session (to-do 3872); a fresh start under the same name wastes the user's tokens. It belongs in the journal application itself, not only this project.", "meta": {"from": "journal"}}
{"content": "to-do 3907 came from message 23619? \u2014 link it: journal message process 23619 \"<their words>\" todo:3907", "meta": {"from": "journal"}}
{"content": "your command ran 379s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 454s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 23625 - answer by opening your turn with [!reply:23625]; message 23625 updated", "meta": {"from": "journal"}}
{"content": "message 23625 file Screenshot 2026-10-10 at 00.47.57.png needs tags \u2014 inspect the attachment, then journal message tag 23625 \"Screenshot 2026-10-10 at 00.47.57.png\" \"<a few words describing what it shows>\"", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23626 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 23634 - answer by opening your turn with [!reply:23634]", "meta": {"from": "journal"}}
{"content": "GET /api/main/family hit an error \u2014 journal: GET /api/main/family hit an error and kept going; the last of it is below and the whole of it is in .journal/runtime/engine.log. Fix it, then say so. AttributeError: 'str' object has no attribute 'stat'", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23626 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 235, Rembrandt Cutwell, reported in message 23602 \u2014 read it, then journal helper finish 235 once its work is taken or dropped; this branch has commits Add completed mascot rigs and enter and exit animations that your branch lacks; tests it wrote, for you to run: src/features/file_feed/test.py, src/features/hosted_journal/test.py, src/features/open_viewer/test.py, src/features/plugins/test.py, src/features/status_bar/test.py, src/web/tests/inspectorOwnAgent.test.js, src/web/tests/thread.test.js, tests/conftest.py", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, has stood idle for 3 minutes \u2014 it finished its turn and waits for work: journal helper say 230 \"<the next work>\", or journal helper finish 230 once its work is taken", "meta": {"from": "journal"}}
{"content": "your command ran 212s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, has stood idle for 3 minutes \u2014 it finished its turn and waits for work: journal helper say 230 \"<the next work>\", or journal helper finish 230 once its work is taken", "meta": {"from": "journal"}}
{"content": "your command ran 179s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 215s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 235, Rembrandt Cutwell, reported in message 23602 \u2014 read it, then journal helper finish 235 once its work is taken or dropped; this branch has commits Add completed mascot rigs and enter and exit animations that your branch lacks; tests it wrote, for you to run: src/features/file_feed/test.py, src/features/hosted_journal/test.py, src/features/open_viewer/test.py, src/features/plugins/test.py, src/features/status_bar/test.py, src/web/tests/inspectorOwnAgent.test.js, src/web/tests/thread.test.js, tests/conftest.py", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23643 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 217s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 23645 - answer by opening your turn with [!reply:23645]; message 23645 updated", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 3048ms last (70ms of it working), against a budget of 50ms. The machine's load was 70.6 on 10 cores. Seen 12 times.", "meta": {"from": "journal"}}
{"content": "message 23645 file Screenshot 2026-10-10 at 01.00.10.png needs tags \u2014 inspect the attachment, then journal message tag 23645 \"Screenshot 2026-10-10 at 01.00.10.png\" \"<a few words describing what it shows>\"", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23646 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23648 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 190s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 193s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "the todo tag does this in one step \u2014 [!todo=\"the title\"] files it with the turn as its brief; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "your command ran 219s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "request GET /api/upstream is slower than its budget \u2014 2989ms last (62ms of it working), against a budget of 50ms. The machine's load was 79.1 on 10 cores. Seen 6 times.; 1 new message 23650 - answer by opening your turn with [!reply:23650]", "meta": {"from": "journal"}}
{"content": "1 new message 23651 - answer by opening your turn with [!reply:23651]", "meta": {"from": "journal"}}
{"content": "request POST /api/main/message is slower than its budget \u2014 600ms last (51ms of it working, then 594ms more after it answered), against a budget of 50ms. The machine's load was 76.2 on 10 cores. Seen 4 times.", "meta": {"from": "journal"}}
{"content": "helper 235, Rembrandt Cutwell, reported in message 23602 \u2014 read it, then journal helper finish 235 once its work is taken or dropped; this branch has commits Add completed mascot rigs and enter and exit animations that your branch lacks; tests it wrote, for you to run: src/features/file_feed/test.py, src/features/hosted_journal/test.py, src/features/open_viewer/test.py, src/features/plugins/test.py, src/features/status_bar/test.py, src/web/tests/inspectorOwnAgent.test.js, src/web/tests/thread.test.js, tests/conftest.py", "meta": {"from": "journal"}}
{"content": "your command ran 305s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 23654 - answer by opening your turn with [!reply:23654]", "meta": {"from": "journal"}}
{"content": "1 new message 23659 - answer by opening your turn with [!reply:23659]", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23662 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "law L4 \u2014 Related work goes back to the helper or subagent that already worked\u2026 \u2014 A helper or subagent that drew a design, wrote the code or ran the research keeps what it learned. When new work changes its work, is related to it or touches the same code, send it there with a message (SendMessage, journal helper say) rather than dispatching a new one that has to rediscover everything; start fresh only when the earlier one is gone or the new work is unrelated. Reuse means its whole session, not its name: a helper whose agent ended is resumed in the session it ran, with its context, never started again under the same name.", "meta": {"from": "journal"}}
{"content": "1 new message 23665 - answer by opening your turn with [!reply:23665]", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23666 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 95s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 235, Rembrandt Cutwell, reported in message 23602 \u2014 read it, then journal helper finish 235 once its work is taken or dropped; this branch has commits Add completed mascot rigs and enter and exit animations that your branch lacks; tests it wrote, for you to run: src/features/file_feed/test.py, src/features/hosted_journal/test.py, src/features/open_viewer/test.py, src/features/plugins/test.py, src/features/status_bar/test.py, src/web/tests/inspectorOwnAgent.test.js, src/web/tests/thread.test.js, tests/conftest.py", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23668 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 166s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 23669 - answer by opening your turn with [!reply:23669]", "meta": {"from": "journal"}}
{"content": "1 new message 23671 - answer by opening your turn with [!reply:23671]", "meta": {"from": "journal"}}
{"content": "your command ran 182s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 235, Rembrandt Cutwell, reported in message 23602 \u2014 read it, then journal helper finish 235 once its work is taken or dropped; this branch has commits Add completed mascot rigs and enter and exit animations that your branch lacks; tests it wrote, for you to run: src/features/file_feed/test.py, src/features/hosted_journal/test.py, src/features/open_viewer/test.py, src/features/plugins/test.py, src/features/status_bar/test.py, src/web/tests/inspectorOwnAgent.test.js, src/web/tests/thread.test.js, tests/conftest.py", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23677 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "your command ran 225s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 222s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23679 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 23681 - answer by opening your turn with [!reply:23681]", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23682 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 69s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 112s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 235, Rembrandt Cutwell, reported in message 23602 \u2014 read it, then journal helper finish 235 once its work is taken or dropped; this branch has commits Add completed mascot rigs and enter and exit animations that your branch lacks; tests it wrote, for you to run: src/features/file_feed/test.py, src/features/hosted_journal/test.py, src/features/open_viewer/test.py, src/features/plugins/test.py, src/features/status_bar/test.py, src/web/tests/inspectorOwnAgent.test.js, src/web/tests/thread.test.js, tests/conftest.py", "meta": {"from": "journal"}}
{"content": "command todo search is slower than its budget \u2014 2163ms last (384ms of it working), against a budget of 50ms. The machine's load was 73.6 on 10 cores. Seen 1 time.", "meta": {"from": "journal"}}
{"content": "question 224 completed", "meta": {"from": "journal"}}
{"content": "your command ran 102s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "work 2326 in hand \u2014 A part animator plays the mascots from their cut-out rigs \u2014 if this is not what you are doing, end it or park it and start the work you are in", "meta": {"from": "journal"}}
{"content": "fact 36 \u2014 Announcement artwork is flat vector on near-black with one indigo\u2026 \u2014 Message 22777: the user asked for this style to be written down so every future new-feature artwork matches the Squire's. The style: clean flat vector illustration with soft gradients, minimal detail and rounded shapes, in the spirit of modern product illustration (Linear, Stripe, Raycast); no photorealism, no heavy texture. Palette for the near-black viewer (#15161a): deep charcoal and slate, one accent only, soft indigo/violet #6366f1 to #8b8ff5, used for the key detail and a gentle glow behind the subject, small warm-silver highlights; no other bright colours. One friendly, witty character or object that stands for the feature, centred, with generous empty space; 3:2 banner exported 1200x800, croppable to 16:9, transparent or fading into #15161a at every edge with no frame, border or hard vignette; must read at 360px wide. No text, letters or logos. The file goes in src/web/public/announcements/<name>.png and is named in the changelog entry's new-feature declaration (art).", "meta": {"from": "journal"}}
{"content": "1 new message 23701 - answer by opening your turn with [!reply:23701]", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23702 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23708 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23710 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 23712 - answer by opening your turn with [!reply:23712]", "meta": {"from": "journal"}}
{"content": "your command ran 24s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23713 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 23715 - answer by opening your turn with [!reply:23715]", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "1 new message 23716 - answer by opening your turn with [!reply:23716]", "meta": {"from": "journal"}}
{"content": "your command ran 45s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 61s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 23721 - answer by opening your turn with [!reply:23721]", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23710 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23713 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "the todo tag does this in one step \u2014 [!todo=\"the title\"] files it with the turn as its brief; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23710 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23713 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 65s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 166s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23710 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 68s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself; helper 230, Coco Runwright, reported in message 23713 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 38s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself; helper 228, Hedy Lockwell, has stood idle for 5 minutes \u2014 it finished its turn and waits for work: journal helper say 228 \"<the next work>\", or journal helper finish 228 once its work is taken", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 850ms last (62ms of it working), against a budget of 50ms. The machine's load was 88.9 on 10 cores. Seen 16 times.", "meta": {"from": "journal"}}
{"content": "1 new message 23744 - answer by opening your turn with [!reply:23744]", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23745 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 131s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your message 23746 names 8421 without saying what they are \u2014 put the type before each number, like message 1712 or to-do 644, so the chat links it: journal message edit 23746 \"<the text>\"", "meta": {"from": "journal"}}
{"content": "1 new message 23747 - answer by opening your turn with [!reply:23747]", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "1 new message 23750 - answer by opening your turn with [!reply:23750]", "meta": {"from": "journal"}}
{"content": "1 new message 23751 - answer by opening your turn with [!reply:23751]", "meta": {"from": "journal"}}
{"content": "your message 23754 names 8421 without saying what they are \u2014 put the type before each number, like message 1712 or to-do 644, so the chat links it: journal message edit 23754 \"<the text>\"", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23745 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 22s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 236, Vermeer Finetouch, reported in message 23765 \u2014 read it, then journal helper finish 236 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 236, Vermeer Finetouch, reported in message 23767 \u2014 read it, then journal helper finish 236 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 87s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23768 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23745 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "work 2326 in hand \u2014 A part animator plays the mascots from their cut-out rigs \u2014 if this is not what you are doing, end it or park it and start the work you are in", "meta": {"from": "journal"}}
{"content": "helper 236, Vermeer Finetouch, reported in message 23770 \u2014 read it, then journal helper finish 236 once its work is taken or dropped; request POST /api/run (helper report) is slower than its budget \u2014 2276ms last (63ms of it working, then 841ms more after it answered), against a budget of 50ms. The machine's load was 139.5 on 10 cores. Seen 1 time.", "meta": {"from": "journal"}}
{"content": "your command ran 139s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 159s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 236, Vermeer Finetouch, reported in message 23773 \u2014 read it, then journal helper finish 236 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 182s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, has stood idle for 4 minutes \u2014 it finished its turn and waits for work: journal helper say 230 \"<the next work>\", or journal helper finish 230 once its work is taken", "meta": {"from": "journal"}}
{"content": "your command ran 216s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 278s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "your chat talked about the journal's workings - \"Still waiting\" \u2014 the user sees replies, reactions, pills and reads themselves; say what the work is instead", "meta": {"from": "journal"}}
{"content": "answer message 23747, message 23750, message 23751 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>; your chat talked about the journal's workings - \"I'm still waiting\" \u2014 the user sees replies, reactions, pills and reads themselves; say what the work is instead", "meta": {"from": "journal"}}
{"content": "answer message 23712, message 23716, message 23721 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "the reply tag on 23747,23750,23751 did not run \u2014 ! you already answered this in comment 3510: add to that answer with journal comment update 3510 rather than a second reply - add what is missing to the tag itself; answer message 23712, message 23716, message 23721 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "answer message 23651, message 23665, message 23681 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "your command ran 24s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "the reply tag does this in one step \u2014 [!reply:N] makes the turn itself the reply; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "answer message 23601, message 23634, message 23645 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23801 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "answer message 23585, message 23592, message 23593 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "answer message 23567, message 23569, message 23570 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "your message 23809 names 23585, 23592, 23593 without saying what they are \u2014 put the type before each number, like message 1712 or to-do 644, so the chat links it: journal message edit 23809 \"<the text>\"", "meta": {"from": "journal"}}
{"content": "your message 23813 names 23585, 23592, 23593 without saying what they are \u2014 put the type before each number, like message 1712 or to-do 644, so the chat links it: journal message edit 23813 \"<the text>\"", "meta": {"from": "journal"}}
{"content": "answer message 23556 before you write anything \u2014 answer by opening your turn with [!reply:23556]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "your command ran 127s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "waiting: 9 unread todos 3898, 3899, 3905, 3915, 3929; 1 unread worktree 119", "meta": {"from": "journal"}}
{"content": "1 new message 23822 - answer by opening your turn with [!reply:23822]", "meta": {"from": "journal"}}
{"content": "your command ran 17s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "the reply tag on 23822 did not run \u2014 ! you already answered this in comment 3512: add to that answer with journal comment update 3512 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "waiting: 4 unread todos 3868, 3873, 3878, 3887", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23827 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 236, Vermeer Finetouch, reported in message 23830 \u2014 read it, then journal helper finish 236 once its work is taken or dropped; this branch has commits Finish five mascot rigs and render their announcement artwork that your branch lacks; tests it wrote, for you to run: mascot_rigs_v4/artwork.test.mjs, mascot_rigs_v4/test_render.py, src/features/auto_update/test.py, src/features/helper_worktrees/test.py, src/features/history_searches/test.py, src/features/tickets/test.py", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23745 \u2014 read it, then journal helper finish 228 once its work is taken or dropped; the 2.267.78 install, the mascot branch tests and Vermeer's art came back\u2026", "meta": {"from": "journal"}}
{"content": "auto mode is on and work 2326 stands still while todo 3906 is ready \u2014 if work 2326 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3906. Stop only when nothing ready is left.; work 2326 is still open \u2014 end it or park it before you stop: journal work end 2326 --how \"<what landed>\", or journal work park 2326 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "auto mode is on and work 2326 stands still while todo 3907 is ready \u2014 if work 2326 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3907. Stop only when nothing ready is left.", "meta": {"from": "journal"}}
{"content": "work 2326 is still open \u2014 end it or park it before you stop: journal work end 2326 --how \"<what landed>\", or journal work park 2326 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23827 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 23839 - answer by opening your turn with [!reply:23839]", "meta": {"from": "journal"}}
{"content": "1 new message 23840 - answer by opening your turn with [!reply:23840]", "meta": {"from": "journal"}}
{"content": "your command ran 17s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 23841 - answer by opening your turn with [!reply:23841]", "meta": {"from": "journal"}}
{"content": "helper 236, Vermeer Finetouch, reported in message 23830 \u2014 read it, then journal helper finish 236 once its work is taken or dropped; this branch has commits Finish five mascot rigs and render their announcement artwork that your branch lacks; tests it wrote, for you to run: mascot_rigs_v4/artwork.test.mjs, mascot_rigs_v4/test_render.py, src/features/auto_update/test.py, src/features/helper_worktrees/test.py, src/features/history_searches/test.py, src/features/tickets/test.py", "meta": {"from": "journal"}}
{"content": "your command ran 48s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 23842 - answer by opening your turn with [!reply:23842]", "meta": {"from": "journal"}}
{"content": "message 23842 updated", "meta": {"from": "journal"}}
{"content": "message 23842 file Screenshot 2026-10-10 at 02.25.44.png needs tags \u2014 inspect the attachment, then journal message tag 23842 \"Screenshot 2026-10-10 at 02.25.44.png\" \"<a few words describing what it shows>\"", "meta": {"from": "journal"}}
{"content": "your command ran 84s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 23843 - answer by opening your turn with [!reply:23843]", "meta": {"from": "journal"}}
{"content": "message 23843 updated", "meta": {"from": "journal"}}
{"content": "message 23843 file Screenshot 2026-10-10 at 02.27.32.png needs tags \u2014 inspect the attachment, then journal message tag 23843 \"Screenshot 2026-10-10 at 02.27.32.png\" \"<a few words describing what it shows>\"", "meta": {"from": "journal"}}
{"content": "1 new message 23845 - answer by opening your turn with [!reply:23845]", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "1 new message 23846 - answer by opening your turn with [!reply:23846]", "meta": {"from": "journal"}}
{"content": "1 new message 23847 - answer by opening your turn with [!reply:23847]", "meta": {"from": "journal"}}
{"content": "1 new message 23848 - answer by opening your turn with [!reply:23848]", "meta": {"from": "journal"}}
{"content": "todo 3670, The whole suite runs in under two minutes again, every test kept\u2026 \u2014 it is blocked because: Under two minutes can only be measured on a quiet machine; the load has stayed at 30-80 all afternoon from the user's other projects and apps. If it is not any more, journal todo unblock 3670. If it waits on a person or a decision, make it a question to them: journal todo ask 3670 \"<who decides what>\" --set options='[...]' --set pick=<n>, and the row waits on their answer. Otherwise tell the user in the chat what it waits on, in their terms, and propose how to clear it.", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23849 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 236, Vermeer Finetouch, reported in message 23830 \u2014 read it, then journal helper finish 236 once its work is taken or dropped; this branch has commits Finish five mascot rigs and render their announcement artwork that your branch lacks; tests it wrote, for you to run: mascot_rigs_v4/artwork.test.mjs, mascot_rigs_v4/test_render.py, src/features/auto_update/test.py, src/features/helper_worktrees/test.py, src/features/history_searches/test.py, src/features/tickets/test.py", "meta": {"from": "journal"}}
{"content": "hook POST /api/hook/claude is slower than its budget \u2014 7078ms last (516ms of it working, then 3424ms more after it answered), against a budget of 50ms. The machine's load was 154.0 on 10 cores. Seen 1 time.", "meta": {"from": "journal"}}
{"content": "1 new message 23851 - answer by opening your turn with [!reply:23851]", "meta": {"from": "journal"}}
{"content": "1 new message 23852 - answer by opening your turn with [!reply:23852]", "meta": {"from": "journal"}}
{"content": "1 new message 23853 - answer by opening your turn with [!reply:23853]", "meta": {"from": "journal"}}
{"content": "1 new message 23854 - answer by opening your turn with [!reply:23854]", "meta": {"from": "journal"}}
{"content": "your message 23855 names 154 without saying what they are \u2014 put the type before each number, like message 1712 or to-do 644, so the chat links it: journal message edit 23855 \"<the text>\"", "meta": {"from": "journal"}}
{"content": "1 new message 23857 - answer by opening your turn with [!reply:23857]; message 23857 updated", "meta": {"from": "journal"}}
{"content": "message 23857 file Screenshot 2026-10-10 at 02.32.42.png needs tags \u2014 inspect the attachment, then journal message tag 23857 \"Screenshot 2026-10-10 at 02.32.42.png\" \"<a few words describing what it shows>\"", "meta": {"from": "journal"}}
{"content": "your command ran 257s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself; 1 new message 23858 - answer by opening your turn with [!reply:23858]", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23859 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23860 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 23861 - answer by opening your turn with [!reply:23861]", "meta": {"from": "journal"}}
{"content": "1 new message 23862 - answer by opening your turn with [!reply:23862]; message 23862 updated", "meta": {"from": "journal"}}
{"content": "message 23862 file Screenshot 2026-10-10 at 02.33.49.png needs tags \u2014 inspect the attachment, then journal message tag 23862 \"Screenshot 2026-10-10 at 02.33.49.png\" \"<a few words describing what it shows>\"", "meta": {"from": "journal"}}
{"content": "1 new message 23863 - answer by opening your turn with [!reply:23863]", "meta": {"from": "journal"}}
{"content": "1 new message 23864 - answer by opening your turn with [!reply:23864]", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "helper 236, Vermeer Finetouch, reported in message 23830 \u2014 read it, then journal helper finish 236 once its work is taken or dropped; this branch has commits Finish five mascot rigs and render their announcement artwork that your branch lacks; tests it wrote, for you to run: mascot_rigs_v4/artwork.test.mjs, mascot_rigs_v4/test_render.py, src/features/auto_update/test.py, src/features/helper_worktrees/test.py, src/features/history_searches/test.py, src/features/tickets/test.py", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23865 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 23866 - answer by opening your turn with [!reply:23866]", "meta": {"from": "journal"}}
{"content": "there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each; 1 new message 23867 - answer by opening your turn with [!reply:23867]", "meta": {"from": "journal"}}
{"content": "1 new message 23868 - answer by opening your turn with [!reply:23868]", "meta": {"from": "journal"}}
{"content": "1 new message 23869 - answer by opening your turn with [!reply:23869]", "meta": {"from": "journal"}}
{"content": "2 new messages 23870, 23871 - answer each by opening a turn with [!reply:<n>]", "meta": {"from": "journal"}}
{"content": "1 new message 23872 - answer by opening your turn with [!reply:23872]", "meta": {"from": "journal"}}
{"content": "1 new message 23873 - answer by opening your turn with [!reply:23873]", "meta": {"from": "journal"}}
{"content": "your message 23874 names 154 without saying what they are \u2014 put the type before each number, like message 1712 or to-do 644, so the chat links it: journal message edit 23874 \"<the text>\"", "meta": {"from": "journal"}}
{"content": "your command ran 407s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23859 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 23875 - answer by opening your turn with [!reply:23875]", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23876 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 23877 - answer by opening your turn with [!reply:23877]", "meta": {"from": "journal"}}
{"content": "sequence 10, Writing a report, step 1 of 6 - Add the report\u2019s section headings \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 10 --about report:97. Lead with the answer in the report's brief, then put every part you plan on the report before writing any of them: journal report section 97 \"<part>\" \"Being written.\" for each, in order: the evidence, what was already sound, what remains uncertain. Then journal sequence next 10 --about report:97.", "meta": {"from": "journal"}}
{"content": "helper 236, Vermeer Finetouch, reported in message 23830 \u2014 read it, then journal helper finish 236 once its work is taken or dropped; this branch has commits Finish five mascot rigs and render their announcement artwork that your branch lacks; tests it wrote, for you to run: mascot_rigs_v4/artwork.test.mjs, mascot_rigs_v4/test_render.py, src/features/auto_update/test.py, src/features/helper_worktrees/test.py, src/features/history_searches/test.py, src/features/tickets/test.py", "meta": {"from": "journal"}}
{"content": "sequence 10, Writing a report, step 2 of 6 - Write the report\u2019s sections \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 10 --about report:97. Write the parts one at a time and in order with journal report section 97 \"<part>\" \"<body>\"; the user sees each one appear where you are. Then journal sequence next 10 --about report:97.", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23865 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat; 1 new message 23881 - answer by opening your turn with [!reply:23881]", "meta": {"from": "journal"}}
{"content": "sequence 10, Writing a report, step 3 of 6 - Add the document or report to a\u2026 \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 10 --about report:97. If a collection the user keeps fits what you wrote, add it: journal collection add <collection n> report:97. Look with journal collection all first. When none fits but other documents or reports on the same subject sit in no collection, make one named for the subject with journal collection create \"<subject>\", add this and them, and say so in one line. A row with nothing related gets no collection of its own. Then journal sequence next 10 --about report:97.", "meta": {"from": "journal"}}
{"content": "your command ran 420s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 23882 - answer by opening your turn with [!reply:23882]", "meta": {"from": "journal"}}
{"content": "sequence 10, Writing a report, step 4 of 6 - Link the items behind the\u2026 \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 10 --about report:97. Link the rows it answers or was built on, such as the to-dos, plans, documents, reports or messages it is about, with journal report link 97 \"<row>\" for each. Leave out rows it only mentions in passing. Then journal sequence next 10 --about report:97.", "meta": {"from": "journal"}}
{"content": "1 new message 23883 - answer by opening your turn with [!reply:23883]", "meta": {"from": "journal"}}
{"content": "your command ran 403s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "sequence 10, Writing a report, step 5 of 6 - Offer the user a next step \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 10 --about report:97. If it asks the user to decide or approve something, give it buttons: journal report update 97 --set buttons='[{\"label\": \"Accept this proposal\", \"say\": \"I accept this proposal\", \"choice\": \"answer\"}, {\"label\": \"Change it first\", \"say\": \"I want changes first\", \"choice\": \"answer\"}]'. A button with say sends those words to you as the user's message; one naming a type, n and action runs that command. Buttons of one decision share a choice, so the others go once one is pressed. Skip this when nothing waits on the user. Then journal sequence next 10 --about report:97.", "meta": {"from": "journal"}}
{"content": "sequence 10, Writing a report, step 6 of 6 - Tell the user in the chat \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 10 --about report:97. Say in one or two plain lines what it concludes, then its reference on a line of its own, like doc 41 or report 98, never in backticks. Finish with journal sequence next 10 --about report:97.", "meta": {"from": "journal"}}
{"content": "your command ran 395s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 23885 - answer by opening your turn with [!reply:23885]", "meta": {"from": "journal"}}
{"content": "1 new message 23886 - answer by opening your turn with [!reply:23886]", "meta": {"from": "journal"}}
{"content": "your command ran 15s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "Is rule 72 a ruling for the whole project? \u2014 rule 72, \"Ship fixes as patches at once; batch features into a minor version\", binds every environment of the project. Keep it only if it is a ruling for all of them, worded as one (\"Always ...\", \"Never ...\"). If it is about this environment or its current work, strike it with journal rule strike 72 --how \"<why>\" and file it here as a fact or a reminder instead.", "meta": {"from": "journal"}}
{"content": "rule 72 \u2014 Ship fixes as patches at once; batch features into a minor version \u2014 The user, messages 23885 and 23886 (2026-10-10): a bug fix, and any hotfix for an agent's bug, is released at once as a patch version. A new feature waits on its branch and goes out together with others in the next minor version, when enough has gathered to make one; installing every feature right away costs too much time. The orchestrator decides what is a patch and what is a minor.", "meta": {"from": "journal"}}
{"content": "the rule tag does this in one step \u2014 [!rule=\"the ruling\", keywords=(...)] files it with the turn as its brief; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "answer message 23881, message 23882, message 23883 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>; auto mode is on and work 2326 stands still while todo 3937 is ready \u2014 if work 2326 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3937. Stop only when nothing ready is left.; work 2326 is still open \u2014 end it or park it before you stop: journal work end 2326 --how \"<what landed>\", or journal work park 2326 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 236, Vermeer Finetouch, reported in message 23830 \u2014 read it, then journal helper finish 236 once its work is taken or dropped; this branch has commits Finish five mascot rigs and render their announcement artwork that your branch lacks; tests it wrote, for you to run: mascot_rigs_v4/artwork.test.mjs, mascot_rigs_v4/test_render.py, src/features/auto_update/test.py, src/features/helper_worktrees/test.py, src/features/history_searches/test.py, src/features/tickets/test.py", "meta": {"from": "journal"}}
{"content": "1 new message 23891 - answer by opening your turn with [!reply:23891]", "meta": {"from": "journal"}}
{"content": "1 new message 23893 - answer by opening your turn with [!reply:23893]", "meta": {"from": "journal"}}
{"content": "your command ran 72s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 67s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "1 new message 23895 - answer by opening your turn with [!reply:23895]", "meta": {"from": "journal"}}
{"content": "message 23895 updated", "meta": {"from": "journal"}}
{"content": "message 23895 file Screenshot 2026-10-10 at 02.48.31.png needs tags \u2014 inspect the attachment, then journal message tag 23895 \"Screenshot 2026-10-10 at 02.48.31.png\" \"<a few words describing what it shows>\"", "meta": {"from": "journal"}}
{"content": "your command ran 194s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself; 1 new message 23897 - answer by opening your turn with [!reply:23897]", "meta": {"from": "journal"}}
{"content": "1 new message 23900 - answer by opening your turn with [!reply:23900]", "meta": {"from": "journal"}}
{"content": "helper 236, Vermeer Finetouch, reported in message 23830 \u2014 read it, then journal helper finish 236 once its work is taken or dropped; this branch has commits Finish five mascot rigs and render their announcement artwork that your branch lacks; tests it wrote, for you to run: mascot_rigs_v4/artwork.test.mjs, mascot_rigs_v4/test_render.py, src/features/auto_update/test.py, src/features/helper_worktrees/test.py, src/features/history_searches/test.py, src/features/tickets/test.py", "meta": {"from": "journal"}}
{"content": "1 new message 23902 - answer by opening your turn with [!reply:23902]", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 1731ms last (52ms of it working, then 2ms more after it answered), against a budget of 50ms. The machine's load was 95.1 on 10 cores. Seen 1 time.", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23903 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 23904 - answer by opening your turn with [!reply:23904]; message 23904 updated", "meta": {"from": "journal"}}
{"content": "message 23904 file Screenshot 2026-10-10 at 02.51.32.png needs tags \u2014 inspect the attachment, then journal message tag 23904 \"Screenshot 2026-10-10 at 02.51.32.png\" \"<a few words describing what it shows>\"", "meta": {"from": "journal"}}
{"content": "1 new message 23905 - answer by opening your turn with [!reply:23905]", "meta": {"from": "journal"}}
{"content": "1 new message 23906 - answer by opening your turn with [!reply:23906]", "meta": {"from": "journal"}}
{"content": "1 new message 23907 - answer by opening your turn with [!reply:23907]", "meta": {"from": "journal"}}
{"content": "1 new message 23910 - answer by opening your turn with [!reply:23910]", "meta": {"from": "journal"}}
{"content": "1 new message 23911 - answer by opening your turn with [!reply:23911]", "meta": {"from": "journal"}}
{"content": "1 new message 23913 - answer by opening your turn with [!reply:23913]", "meta": {"from": "journal"}}
{"content": "1 new message 23914 - answer by opening your turn with [!reply:23914]", "meta": {"from": "journal"}}
{"content": "there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each", "meta": {"from": "journal"}}
{"content": "1 new message 23915 - answer by opening your turn with [!reply:23915]", "meta": {"from": "journal"}}
{"content": "your command ran 375s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself; 1 new message 23916 - answer by opening your turn with [!reply:23916]", "meta": {"from": "journal"}}
{"content": "there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "helper 236, Vermeer Finetouch, reported in message 23830 \u2014 read it, then journal helper finish 236 once its work is taken or dropped; this branch has commits Finish five mascot rigs and render their announcement artwork that your branch lacks; tests it wrote, for you to run: mascot_rigs_v4/artwork.test.mjs, mascot_rigs_v4/test_render.py, src/features/auto_update/test.py, src/features/helper_worktrees/test.py, src/features/history_searches/test.py, src/features/tickets/test.py", "meta": {"from": "journal"}}
{"content": "there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each", "meta": {"from": "journal"}}
{"content": "1 new message 23918 - answer by opening your turn with [!reply:23918]", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23919 \u2014 read it, then journal helper finish 228 once its work is taken or dropped; there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each", "meta": {"from": "journal"}}
{"content": "1 new message 23921 - answer by opening your turn with [!reply:23921]", "meta": {"from": "journal"}}
{"content": "your command ran 222s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "1 new message 23923 - answer by opening your turn with [!reply:23923]", "meta": {"from": "journal"}}
{"content": "the reply tag on\u2026 \u2014 ! read message 23916 before you answer it: journal message read 23916 - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "your message 23924 names 23904, 23905, 23911, 23918, 23913, 23914, 23906\u2026 \u2014 put the type before each number, like message 1712 or to-do 644, so the chat links it: journal message edit 23924 \"<the text>\"; 1 new message 23925 - answer by opening your turn with [!reply:23925]; message 23925 updated", "meta": {"from": "journal"}}
{"content": "your command ran 204s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself; message 23925 file Screenshot 2026-10-10 at 02.58.02.png needs tags \u2014 inspect the attachment, then journal message tag 23925 \"Screenshot 2026-10-10 at 02.58.02.png\" \"<a few words describing what it shows>\"", "meta": {"from": "journal"}}
{"content": "1 new message 23926 - answer by opening your turn with [!reply:23926]", "meta": {"from": "journal"}}
{"content": "message 23926 file Screenshot 2026-10-10 at 02.58.19.png needs tags \u2014 inspect the attachment, then journal message tag 23926 \"Screenshot 2026-10-10 at 02.58.19.png\" \"<a few words describing what it shows>\"; message 23926 updated", "meta": {"from": "journal"}}
{"content": "your command ran 185s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23929 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "your command ran 152s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "the reply tag on\u2026 \u2014 ! you already answered this in comment 3517: add to that answer with journal comment update 3517 rather than a second reply - add what is missing to the tag itself; your message 23933 names 23904, 23905, 23911, 23918, 23913, 23914, 23906\u2026 \u2014 put the type before each number, like message 1712 or to-do 644, so the chat links it: journal message edit 23933 \"<the text>\"; auto mode is on and work 2329 stands still while todo 3947 is ready \u2014 if work 2329 waits on the user, decide it yourself when you can; otherwise put the question on its row with journal todo ask, end or park the work, and start todo 3947. Stop only when nothing ready is left.; there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each; answer message 23877, message 23893, message 23895 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "work 2329 is still open, with nothing logged \u2014 journal work log 2329 \"<what was decided or done, and why>\" \u2014 then journal work end 2329 --how \"<what landed>\", or journal work park 2329 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "your command ran 97s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your command ran 77s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "your answer to a journal line was kept out of the chat \u2014 a journal line is an instruction, not a message: act on it and write nothing, unless the user needs to know something such as a failure, finished work or a decision that waits on them", "meta": {"from": "journal"}}
{"content": "the user asked to stop Run a long background command to test its Stop button \u2014 run TaskStop with task_id bhu1n40us now; then carry on with the work", "meta": {"from": "journal"}}
{"content": "1 new message 23937 - answer by opening your turn with [!reply:23937]", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "helper 236, Vermeer Finetouch, reported in message 23830 \u2014 read it, then journal helper finish 236 once its work is taken or dropped; this branch has commits Finish five mascot rigs and render their announcement artwork that your branch lacks; tests it wrote, for you to run: mascot_rigs_v4/artwork.test.mjs, mascot_rigs_v4/test_render.py, src/features/auto_update/test.py, src/features/helper_worktrees/test.py, src/features/history_searches/test.py, src/features/tickets/test.py", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23941 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each; answer message 23866, message 23867, message 23937 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "work 2329 is still open \u2014 end it or park it before you stop: journal work end 2329 --how \"<what landed>\", or journal work park 2329 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "there are new messages in your inbox \u2014 journal message unread, then journal message read <n> for each; answer message 23858, message 23862, message 23864 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>; work 2329 is still open \u2014 end it or park it before you stop: journal work end 2329 --how \"<what landed>\", or journal work park 2329 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "answer message 23848, message 23852, message 23857 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "work 2329 is still open \u2014 end it or park it before you stop: journal work end 2329 --how \"<what landed>\", or journal work park 2329 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "answer message 23841, message 23842, message 23846 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "answer message 23839, message 23840 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23958 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 236, Vermeer Finetouch, reported in message 23830 \u2014 read it, then journal helper finish 236 once its work is taken or dropped; this branch has commits Finish five mascot rigs and render their announcement artwork that your branch lacks; tests it wrote, for you to run: mascot_rigs_v4/artwork.test.mjs, mascot_rigs_v4/test_render.py, src/features/auto_update/test.py, src/features/helper_worktrees/test.py, src/features/history_searches/test.py, src/features/tickets/test.py", "meta": {"from": "journal"}}
{"content": "1 new message 23960 - answer by opening your turn with [!reply:23960]", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 23961 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "sequence 10, Writing a report, step 1 of 6 - Add the report\u2019s section headings \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 10 --about report:98. Lead with the answer in the report's brief, then put every part you plan on the report before writing any of them: journal report section 98 \"<part>\" \"Being written.\" for each, in order: the evidence, what was already sound, what remains uncertain. Then journal sequence next 10 --about report:98.; report 98 cites nothing it was built on \u2014 you read report:97 just now: journal report link 98 \"<ref>\" for whichever it came from; 1 new message 23963 - answer by opening your turn with [!reply:23963]", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 288ms last (57ms of it working), against a budget of 50ms. The machine's load was 43.2 on 10 cores. Seen 3 times.", "meta": {"from": "journal"}}
{"content": "your command ran 15s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself; sequence 10, Writing a report, step 2 of 6 - Write the report\u2019s sections \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 10 --about report:98. Write the parts one at a time and in order with journal report section 98 \"<part>\" \"<body>\"; the user sees each one appear where you are. Then journal sequence next 10 --about report:98.", "meta": {"from": "journal"}}
{"content": "sequence 10, Writing a report, step 3 of 6 - Add the document or report to a\u2026 \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 10 --about report:98. If a collection the user keeps fits what you wrote, add it: journal collection add <collection n> report:98. Look with journal collection all first. When none fits but other documents or reports on the same subject sit in no collection, make one named for the subject with journal collection create \"<subject>\", add this and them, and say so in one line. A row with nothing related gets no collection of its own. Then journal sequence next 10 --about report:98.", "meta": {"from": "journal"}}
{"content": "1 new message 23964 - answer by opening your turn with [!reply:23964]", "meta": {"from": "journal"}}
{"content": "sequence 10, Writing a report, step 4 of 6 - Link the items behind the\u2026 \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 10 --about report:98. Link the rows it answers or was built on, such as the to-dos, plans, documents, reports or messages it is about, with journal report link 98 \"<row>\" for each. Leave out rows it only mentions in passing. Then journal sequence next 10 --about report:98.", "meta": {"from": "journal"}}
{"content": "your command ran 16s in the foreground and was moved to the background \u2014 carry on with other work; you are told when it ends. Start a command you expect to take long in the background yourself", "meta": {"from": "journal"}}
{"content": "sequence 10, Writing a report, step 5 of 6 - Offer the user a next step \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 10 --about report:98. If it asks the user to decide or approve something, give it buttons: journal report update 98 --set buttons='[{\"label\": \"Accept this proposal\", \"say\": \"I accept this proposal\", \"choice\": \"answer\"}, {\"label\": \"Change it first\", \"say\": \"I want changes first\", \"choice\": \"answer\"}]'. A button with say sends those words to you as the user's message; one naming a type, n and action runs that command. Buttons of one decision share a choice, so the others go once one is pressed. Skip this when nothing waits on the user. Then journal sequence next 10 --about report:98.", "meta": {"from": "journal"}}
{"content": "sequence 10, Writing a report, step 6 of 6 - Tell the user in the chat \u2014 Finishing this sequence comes before anything else you do; everything else waits until it is finished or abandoned. Take it up first with journal sequence follow 10 --about report:98. Say in one or two plain lines what it concludes, then its reference on a line of its own, like doc 41 or report 98, never in backticks. Finish with journal sequence next 10 --about report:98.", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "answer message 23960, message 23963, message 23964 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 23968 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 23970 - answer by opening your turn with [!reply:23970]", "meta": {"from": "journal"}}
{"content": "helper 236, Vermeer Finetouch, reported in message 23830 \u2014 read it, then journal helper finish 236 once its work is taken or dropped; this branch has commits Finish five mascot rigs and render their announcement artwork that your branch lacks; tests it wrote, for you to run: mascot_rigs_v4/artwork.test.mjs, mascot_rigs_v4/test_render.py, src/features/auto_update/test.py, src/features/helper_worktrees/test.py, src/features/history_searches/test.py, src/features/tickets/test.py", "meta": {"from": "journal"}}
{"content": "1 new message 23976 - answer by opening your turn with [!reply:23976]", "meta": {"from": "journal"}}
{"content": "to-do 3953 came from message 23970? \u2014 link it: journal message process 23970 \"<their words>\" todo:3953", "meta": {"from": "journal"}}
{"content": "1 new message 23984 - answer by opening your turn with [!reply:23984]", "meta": {"from": "journal"}}
{"content": "helper 237, Ada Funnelace, reported in message 23986 \u2014 read it, then journal helper finish 237 once its work is taken or dropped; this branch has commits Session and seat files are read through one cached funnel each, and a check keeps every other read and every slow call off the hot paths that your branch lacks; tests it wrote, for you to run: src/features/agent_sessions/test.py, src/features/auto_update/test.py, src/features/dev_faults/test.py, src/features/git_actions/test.py, src/features/helpers/test.py, src/features/history_searches/test.py, src/features/long_commands/test.py, src/features/terminal/test.py, src/features/tickets/test.py, src/web/tests/agentCells.test.js, src/web/tests/statusLine.test.js, src/web/tests/waitingStatus.test.js", "meta": {"from": "journal"}}
{"content": "work 2330 is still open, with nothing logged \u2014 journal work log 2330 \"<what was decided or done, and why>\" \u2014 then journal work end 2330 --how \"<what landed>\", or journal work park 2330 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 236, Vermeer Finetouch, reported in message 23830 \u2014 read it, then journal helper finish 236 once its work is taken or dropped; this branch has commits Finish five mascot rigs and render their announcement artwork that your branch lacks; tests it wrote, for you to run: mascot_rigs_v4/artwork.test.mjs, mascot_rigs_v4/test_render.py, src/features/auto_update/test.py, src/features/helper_worktrees/test.py, src/features/history_searches/test.py, src/features/tickets/test.py", "meta": {"from": "journal"}}
{"content": "the log tag does this in one step \u2014 [!log:N] makes the turn itself the log entry; it runs only when it opens the last text of your turn", "meta": {"from": "journal"}}
{"content": "helper 237, Ada Funnelace, reported in message 23997 \u2014 read it, then journal helper finish 237 once its work is taken or dropped; this branch has commits Session and seat files are read through one cached funnel each, and a check keeps every other read and every slow call off the hot paths, The session and seat funnels are described in one line each, A skill on writing lean, reused code is loaded at every start in every project that your branch lacks; tests it wrote, for you to run: src/features/agent_sessions/test.py, src/features/auto_update/test.py, src/features/dev_faults/test.py, src/features/git_actions/test.py, src/features/helpers/test.py, src/features/history_searches/test.py, src/features/long_commands/test.py, src/features/skill_loading/test.py, src/features/terminal/test.py, src/features/tickets/test.py, src/web/tests/agentCells.test.js, src/web/tests/statusLine.test.js, src/web/tests/waitingStatus.test.js", "meta": {"from": "journal"}}
{"content": "request GET /api/main/dashboard is slower than its budget \u2014 1544ms last (62ms of it working), against a budget of 50ms. The machine's load was 63.8 on 10 cores. Seen 4 times.", "meta": {"from": "journal"}}
{"content": "1 new comment 3525; report 98 commented", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, reported in message 24002 \u2014 read it, then journal helper finish 230 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 236, Vermeer Finetouch, reported in message 23830 \u2014 read it, then journal helper finish 236 once its work is taken or dropped; this branch has commits Finish five mascot rigs and render their announcement artwork that your branch lacks; tests it wrote, for you to run: mascot_rigs_v4/artwork.test.mjs, mascot_rigs_v4/test_render.py, src/features/auto_update/test.py, src/features/helper_worktrees/test.py, src/features/history_searches/test.py, src/features/tickets/test.py", "meta": {"from": "journal"}}
{"content": "work 2331 is still open, with nothing logged \u2014 journal work log 2331 \"<what was decided or done, and why>\" \u2014 then journal work end 2331 --how \"<what landed>\", or journal work park 2331 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 230, Coco Runwright, has stood idle for 2 minutes \u2014 it finished its turn and waits for work: journal helper say 230 \"<the next work>\", or journal helper finish 230 once its work is taken", "meta": {"from": "journal"}}
{"content": "law L7 \u2014 Write the least code that solves the whole problem - find what\u2026 \u2014 Before writing, search the code for what already does the job or most of it, and extend that instead of adding a second way. Every read or write of one kind of thing (a file, a record, a setting, a provider) goes through the one funnel that owns it, which is where caching and checks live. A fix lands where the fault is born, not where it shows. When you finish, say in a line what you skipped or did not check.", "meta": {"from": "journal"}}
{"content": "helper 237, Ada Funnelace, reported in message 24014 \u2014 read it, then journal helper finish 237 once its work is taken or dropped; this branch has commits Session and seat files are read through one cached funnel each, and a check keeps every other read and every slow call off the hot paths, The session and seat funnels are described in one line each, A skill on writing lean, reused code is loaded at every start in every project, Every state file under a session, and the launched, seated, handed and screen-shape files, is read through State, which shares one copy per path and reads it again only when its stamp changes; the lean skill names law L7 that your branch lacks; tests it wrote, for you to run: src/features/agent_sessions/test.py, src/features/auto_update/test.py, src/features/dev_faults/test.py, src/features/git_actions/test.py, src/features/helpers/test.py, src/features/history_searches/test.py, src/features/long_commands/test.py, src/features/messages/test.py, src/features/skill_loading/test.py, src/features/terminal/test.py, src/features/tickets/test.py, src/web/tests/agentCells.test.js, src/web/tests/pinClose.test.js, src/web/tests/statusLine.test.js, src/web/tests/waitingStatus.test.js", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, has stood idle for 3 minutes \u2014 it finished its turn and waits for work: journal helper say 228 \"<the next work>\", or journal helper finish 228 once its work is taken; your message 24015 names 3976 without saying what they are \u2014 put the type before each number, like message 1712 or to-do 644, so the chat links it: journal message edit 24015 \"<the text>\"", "meta": {"from": "journal"}}
{"content": "1 new message 24017 - answer by opening your turn with [!reply:24017]", "meta": {"from": "journal"}}
{"content": "1 new message 24018 - answer by opening your turn with [!reply:24018]", "meta": {"from": "journal"}}
{"content": "1 new message 24020 - answer by opening your turn with [!reply:24020]", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "helper 236, Vermeer Finetouch, reported in message 23830 \u2014 read it, then journal helper finish 236 once its work is taken or dropped; this branch has commits Finish five mascot rigs and render their announcement artwork that your branch lacks; tests it wrote, for you to run: mascot_rigs_v4/artwork.test.mjs, mascot_rigs_v4/test_render.py, src/features/auto_update/test.py, src/features/helper_worktrees/test.py, src/features/history_searches/test.py, src/features/tickets/test.py", "meta": {"from": "journal"}}
{"content": "1 new message 24022 - answer by opening your turn with [!reply:24022]", "meta": {"from": "journal"}}
{"content": "1 new message 24023 - answer by opening your turn with [!reply:24023]", "meta": {"from": "journal"}}
{"content": "your message 24025 names 3976 without saying what they are \u2014 put the type before each number, like message 1712 or to-do 644, so the chat links it: journal message edit 24025 \"<the text>\"", "meta": {"from": "journal"}}
{"content": "answer message 24022, message 24023 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "work 2332 is still open, with nothing logged \u2014 journal work log 2332 \"<what was decided or done, and why>\" \u2014 then journal work end 2332 --how \"<what landed>\", or journal work park 2332 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "1 new message 24026 - answer by opening your turn with [!reply:24026]; message 24026 updated", "meta": {"from": "journal"}}
{"content": "1 new message 24027 - answer by opening your turn with [!reply:24027]", "meta": {"from": "journal"}}
{"content": "helper 237, Ada Funnelace, reported in message 24014 \u2014 read it, then journal helper finish 237 once its work is taken or dropped; this branch has commits Session and seat files are read through one cached funnel each, and a check keeps every other read and every slow call off the hot paths, The session and seat funnels are described in one line each, A skill on writing lean, reused code is loaded at every start in every project, Every state file under a session, and the launched, seated, handed and screen-shape files, is read through State, which shares one copy per path and reads it again only when its stamp changes; the lean skill names law L7 that your branch lacks; tests it wrote, for you to run: src/features/agent_sessions/test.py, src/features/auto_update/test.py, src/features/dev_faults/test.py, src/features/git_actions/test.py, src/features/helpers/test.py, src/features/history_searches/test.py, src/features/long_commands/test.py, src/features/messages/test.py, src/features/skill_loading/test.py, src/features/terminal/test.py, src/features/tickets/test.py, src/web/tests/agentCells.test.js, src/web/tests/pinClose.test.js, src/web/tests/statusLine.test.js, src/web/tests/waitingStatus.test.js", "meta": {"from": "journal"}}
{"content": "question 220, The Codex workspace is out of credits, so no Codex helper can\u2026 \u2014 if the project or the code has settled it since, dismiss it with journal question dismiss 220 --why \"<what settled it>\"; if it still needs the user, leave it as it is.", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 24028 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "1 new message 24030 - answer by opening your turn with [!reply:24030]", "meta": {"from": "journal"}}
{"content": "1 new message 24031 - answer by opening your turn with [!reply:24031]", "meta": {"from": "journal"}}
{"content": "1 new message 24032 - answer by opening your turn with [!reply:24032]", "meta": {"from": "journal"}}
{"content": "helper 236, Vermeer Finetouch, reported in message 23830 \u2014 read it, then journal helper finish 236 once its work is taken or dropped; this branch has commits Finish five mascot rigs and render their announcement artwork that your branch lacks; tests it wrote, for you to run: mascot_rigs_v4/artwork.test.mjs, mascot_rigs_v4/test_render.py, src/features/auto_update/test.py, src/features/helper_worktrees/test.py, src/features/history_searches/test.py, src/features/tickets/test.py", "meta": {"from": "journal"}}
{"content": "commit c9282f5ed closed to-do 3951 \u2014 The rows and the work are done; take the next one.", "meta": {"from": "journal"}}
{"content": "1 new message 24033 - answer by opening your turn with [!reply:24033]", "meta": {"from": "journal"}}
{"content": "1 new message 24034 - answer by opening your turn with [!reply:24034]", "meta": {"from": "journal"}}
{"content": "1 new message 24035 - answer by opening your turn with [!reply:24035]", "meta": {"from": "journal"}}
{"content": "1 new message 24036 - answer by opening your turn with [!reply:24036]", "meta": {"from": "journal"}}
{"content": "1 new message 24037 - answer by opening your turn with [!reply:24037]", "meta": {"from": "journal"}}
{"content": "chat etiquette - a line from the journal is an instruction, not a message\u2026 \u2014 a turn that only handles a journal line needs no words: act on it, or say once in the chat what you wait on, then carry on; what the user needs to know still goes to the chat", "meta": {"from": "journal"}}
{"content": "helper 237, Ada Funnelace, reported in message 24014 \u2014 read it, then journal helper finish 237 once its work is taken or dropped; this branch has commits Session and seat files are read through one cached funnel each, and a check keeps every other read and every slow call off the hot paths, The session and seat funnels are described in one line each, A skill on writing lean, reused code is loaded at every start in every project, Every state file under a session, and the launched, seated, handed and screen-shape files, is read through State, which shares one copy per path and reads it again only when its stamp changes; the lean skill names law L7 that your branch lacks; tests it wrote, for you to run: src/features/agent_sessions/test.py, src/features/auto_update/test.py, src/features/dev_faults/test.py, src/features/git_actions/test.py, src/features/helpers/test.py, src/features/history_searches/test.py, src/features/long_commands/test.py, src/features/messages/test.py, src/features/skill_loading/test.py, src/features/terminal/test.py, src/features/tickets/test.py, src/web/tests/agentCells.test.js, src/web/tests/pinClose.test.js, src/web/tests/statusLine.test.js, src/web/tests/waitingStatus.test.js", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 24028 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
{"content": "helper 236, Vermeer Finetouch, reported in message 23830 \u2014 read it, then journal helper finish 236 once its work is taken or dropped; this branch has commits Finish five mascot rigs and render their announcement artwork that your branch lacks; tests it wrote, for you to run: mascot_rigs_v4/artwork.test.mjs, mascot_rigs_v4/test_render.py, src/features/auto_update/test.py, src/features/helper_worktrees/test.py, src/features/history_searches/test.py, src/features/tickets/test.py", "meta": {"from": "journal"}}
{"content": "1 new message 24038 - answer by opening your turn with [!reply:24038]", "meta": {"from": "journal"}}
{"content": "the reply tag on 24017,24018 did not run \u2014 ! you already answered this in comment 3527: add to that answer with journal comment update 3527 rather than a second reply; you already answered this in comment 3527: add to that answer with journal comment update 3527 rather than a second reply - add what is missing to the tag itself", "meta": {"from": "journal"}}
{"content": "you stopped with work 2332, Patch 2.267.84 with the ticket start and queue\u2026 \u2014 carry on with it now. If it waits on something outside your hands, say journal work await \"<what you wait for>\"; if it waits on the user, put the question on its row with journal todo ask and take the next ready row; if something else goes first, journal work park 2332 \"<why>\".", "meta": {"from": "journal"}}
{"content": "answer message 24035, message 24036, message 24038 before you write anything \u2014 answer each by opening a turn with [!reply:<n>]. a reply, a reaction, or journal message processed <n>", "meta": {"from": "journal"}}
{"content": "work 2332 is still open \u2014 end it or park it before you stop: journal work end 2332 --how \"<what landed>\", or journal work park 2332 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "helper 228, Hedy Lockwell, reported in message 24028 \u2014 read it, then journal helper finish 228 once its work is taken or dropped", "meta": {"from": "journal"}}
