{"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.; 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": "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": "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": "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 43 \u2014 A reader that copies a row it only reads is the commonest slow path\u2026 \u2014 Six instances found on 2026-10-11: the agent row the engine and seat read, the session lookup, the rows a to-do waits on, the environment summary's work rows, a subagent's task list, and a to-do's touched files. Each was load() where peek() was meant - load is peek plus a deep copy - and each was worth three to four times the speed where it was measured. Controller.peek exists for exactly this and says so in its docstring. When a read path here is slow, look for load() in a loop before looking anywhere else.", "meta": {"from": "journal"}}
{"content": "fact 38 \u2014 A helper reported as gone can still be reached with journal helper say \u2014 Seen repeatedly on 2026-10-11 with helper 239, Signor Bernini. The journal announced 'its agent is gone, so journal helper say cannot reach it' again and again while the helper was alive and working; journal helper say 239 answered 'sent to Signor Bernini' every time and he acted on each message. The notice tracks the agent id the journal itself dispatched, so a helper whose session was resumed by hand keeps being reported as gone. Check with pgrep and its worktree's git log before believing the notice, and never dispatch a second helper on its word alone.; 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 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": "that Edit call returned 25,515 characters, the largest this session \u2014 It stays in the context for good. If you were looking for one thing in it, the next read can be narrower: grep for the line, sed a range, head the file.", "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 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": "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 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 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).; 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": "that Bash call returned 32,056 characters, the largest this session \u2014 It stays in the context for good. If you were looking for one thing in it, the next read can be narrower: grep for the line, sed a range, head the file.", "meta": {"from": "journal"}}
{"content": "fact 41 \u2014 The browser scenarios run the built viewer in src/web/dist, not the\u2026 \u2014 src/web/dist is tracked, and tests/test_the_viewer.py serves it, so a change to a .vue or .js file means nothing to a scenario until npm run build runs in src/web. Three gate runs on 2026-10-11 failed on scenarios looking for text I had already changed in the source: the dist was built at 03:26 and the edit made at 05:05. The rebuilt dist must be committed with the change.; 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": "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 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 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 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 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 1 in hand \u2014 Make the project's checks honest and wire the ones nothing runs \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 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 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.", "meta": {"from": "journal"}}
{"content": "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 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": "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": "waiting: 1 unread todo 5", "meta": {"from": "journal"}}
{"content": "your wait for your taking my branch; then I run the seven new check rows once\u2026 \u2014 say journal work await \"<what you wait for>\" again if you are still only waiting", "meta": {"from": "journal"}}
{"content": "check 38 failed - /opt/homebrew/Cellar/python@3.14/3.14.7/Frameworks/Python.fram \u2014 journal check show 38 says why; fix it, then journal check run 38", "meta": {"from": "journal"}}
{"content": "check 39 failed - /opt/homebrew/Cellar/python@3.14/3.14.7/Frameworks/Python.fram \u2014 journal check show 39 says why; fix it, then journal check run 39; check 40 failed - /opt/homebrew/Cellar/python@3.14/3.14.7/Frameworks/Python.fram \u2014 journal check show 40 says why; fix it, then journal check run 40", "meta": {"from": "journal"}}
{"content": "check 41 failed - features/work_tracking/feature.py holds logic in chosen; it be \u2014 journal check show 41 says why; fix it, then journal check run 41", "meta": {"from": "journal"}}
{"content": "check 42 failed - features/connection/routes.py -39 /api/sync/hello answers from \u2014 journal check show 42 says why; fix it, then journal check run 42", "meta": {"from": "journal"}}
{"content": "check 43 failed - web/src/sync/stream.js -18 names something 'heard'; name it\u2026 \u2014 journal check show 43 says why; fix it, then journal check run 43", "meta": {"from": "journal"}}
{"content": "check 44 failed - a pull request is waiting - #23 by BjarneDms, Cover cold\u2026 \u2014 journal check show 44 says why; fix it, then journal check run 44", "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 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": "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. 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.; 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": "rule 76 \u2014 An environment has one live session; a second asks the user to take\u2026 \u2014 The user's ruling, 2026-10-11, refined in his own words: 'we shouldn't be able to have multiple sessions on an environment. The journal should tell the user, Hey, there's a session already here. What do you want to do? Do you want to take over? That means that the other session is unbound to that environment.' So a session starting on an environment that already has a live one does not take it silently and does not stop the other by itself: the journal asks the user what to do. On take over, the session that was there is unbound from the environment and the new one holds it; otherwise the new session does not get the environment. It came after his messages 25226, 25229 and 25230 reached a session he was not watching, while environment main held three live sessions at once.", "meta": {"from": "journal"}}
{"content": "Code Commandments \u2014 before you commit \u2014 you've changed 7 judged files since the\u2026 \u2014 Code Commandments \u2014 before you commit: you've changed 7 judged files 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": "fact 42 \u2014 Three projects share one ~/.cache/code-commandments \u2014 On 2026-10-11 this session, transportklok-workspace and ticket-37 all read and wrote the same ~/.cache/code-commandments; two of them cleared it within the same minute and the third saw it shrink from 7.6 GB to 2.4 GB and credited its own plugin upgrade with the change. A measurement of that folder is not a measurement of this project alone, and anything deleted there is deleted for every session on this machine.", "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": "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": "main moved since your worktree was cut \u2014 It gained 5 commits (4f4e7eac4 An archive asked for while its environment waits to be packed is packed first, so unarchive never answers that there is none; 632afcd6e Removing an environment moves its record into the attic at once and packs it after the answer, so a ticket's merge no longer waits on the archive; cacaed4c5 Seating a new environment waits for its answer and boots the switches once, and its dashboard is built where it is seated; 91c9c6028 The warm-up at a start reads the text of every type a search covers, so the first search no longer reads work, comments, reports and the rest; 996156ef0 A write enters the funnel before it takes a lock of its own). Rebase onto main in /Users/jessegall/projects/agent-journal/.claude/worktrees/main-monsieur-lumiere before you report.", "meta": {"from": "journal"}}
{"content": "main moved since your worktree was cut \u2014 It gained 7 commits (9d852bf40 The update status a screen asks for is a typed value; f44b7f855 The phone covers its screen while the journal updates, asking the same update status the viewer does; 4f4e7eac4 An archive asked for while its environment waits to be packed is packed first, so unarchive never answers that there is none; 632afcd6e Removing an environment moves its record into the attic at once and packs it after the answer, so a ticket's merge no longer waits on the archive; cacaed4c5 Seating a new environment waits for its answer and boots the switches once, and its dashboard is built where it is seated; and 2 more). Rebase onto main in /Users/jessegall/projects/agent-journal/.claude/worktrees/main-monsieur-lumiere before you report.", "meta": {"from": "journal"}}
{"content": "fact 45 \u2014 The mascot preview is reachable from the phone at\u2026 \u2014 Opened on 2026-10-11 with 'tunler connect 8431 --domain=mascots', which answers at https://mascots.tunler.jessegall.nl/toon-preview/index.html and forwards to the preview server in Signor Bernini's worktree at 127.0.0.1:8431. The user asked for it because 127.0.0.1 means his phone when he taps it there. The tunnel runs as a background process of this session and dies with it; re-open it with the same command. To-do 4317 is the proper fix - serve the preview from the journal itself, which the phone already reaches through its pairing.", "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.; rule 77 \u2014 A 3D modelling agent is dispatched on the strongest model, never a\u2026 \u2014 The user, message 25841 (2026-10-11), on seeing the mascots regress: 'What kind of agents are you sending, Opus or Sonnet? I think creating 3D models requires a bit more insight, so I'd say that's Opus, not Sonnet.' Modelling a figure to match drawn art turns on judgement of shape and proportion, which is what law L1 reserves the strongest model for. Agents that only look and list - critics, catalogues, sweeps - stay on the general model.", "meta": {"from": "journal"}}
{"content": "The journal is updating, so you are paused: start no new command and wait; you will be told when to continue.", "meta": {"from": "journal"}}
{"content": "main moved since your worktree was cut \u2014 It gained 17 commits (5da7aa071 The helpers kind of the chat reads Helpers the agent sends; f30a2e8fe A card is a plugin note only when a plugin's own card says so, never for carrying a name, and the viewer is built with the helpers kind; 49a255bc4 A helper's marks in the chat have a kind of their own, a retired subagent's its subagents kind and a helper worktree's the commits kind, so a named mark is no longer taken for a plugin note; 2a1cc8e4b Every server start and every agent launch checks the hooks of each agent present against what this version writes, and writes again those that are missing, stale or run a path that is gone, saying so in one line; d73993470 Version 2.270.2; and 12 more). Rebase onto main in /Users/jessegall/projects/agent-journal/.claude/worktrees/main-monsieur-lumiere before you report.", "meta": {"from": "journal"}}
{"content": "work 5 in hand \u2014 Read pull request 23 and Hedy's extension of the chat-mark rule \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": "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.; 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 74 \u2014 Run the whole suite only for a minor; a patch runs its affected tests \u2014 Message 24581 (2026-10-10): the user forbade running the full suite except for a minor version; a patch release runs only the tests beside what changed. Replaces rule 65's whole suite before every merge to main for patches.", "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": "todo 6 next \u2014 journal todo start 6 to take it, and in this mode do the work yourself, or send a helper for it where the job is better done beside you", "meta": {"from": "journal"}}
{"content": "fact 39 \u2014 Measure a process's CPU by its cputime over a window, never by a\u2026 \u2014 2026-10-11: I read ps -o pcpu= four times two seconds apart on transportklok's engines, got 0.0 every time, and told the user the idle-CPU gap was closed. Ada Funnelace contradicted it with ps cputime deltas over 30 and 40 second windows: 7.7 to 8.0 percent on the same two engines. I checked her way over 14 seconds and got 8.1, 7.4 and 0.5 percent. An instant reading can land between bursts and show nothing; a CPU-time delta over a window cannot. Use ps -p <pid> -o cputime= twice, seconds apart, and divide.", "meta": {"from": "journal"}}
{"content": "main moved since your worktree was cut \u2014 It gained 18 commits (19e234719 An agent with nothing left to do is not told to carry on; 5da7aa071 The helpers kind of the chat reads Helpers the agent sends; f30a2e8fe A card is a plugin note only when a plugin's own card says so, never for carrying a name, and the viewer is built with the helpers kind; 49a255bc4 A helper's marks in the chat have a kind of their own, a retired subagent's its subagents kind and a helper worktree's the commits kind, so a named mark is no longer taken for a plugin note; 2a1cc8e4b Every server start and every agent launch checks the hooks of each agent present against what this version writes, and writes again those that are missing, stale or run a path that is gone, saying so in one line; and 13 more). Rebase onto main in /Users/jessegall/projects/agent-journal/.claude/worktrees/main-monsieur-lumiere before you report.", "meta": {"from": "journal"}}
{"content": "Code Commandments \u2014 before you commit \u2014 you've changed 2 judged files since the\u2026 \u2014 Code Commandments \u2014 before you commit: you've changed 2 judged files 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": "Code Commandments \u2014 the files changed since the last check (`handlers.py`, `tes\u2026 \u2014 Code Commandments \u2014 the files changed since the last check (`handlers.py`, `test.py`) breaks a rule. Fix it now, at its SOURCE, while the code is still in front of you: \u00b7 \u2022 python-nested-conditional at /Users/jessegall/projects/agent-journal/.claude/worktrees/main-monsieur-lumiere/src/features/helpers/handlers.py:150 \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": "main moved since your worktree was cut \u2014 It gained 20 commits (9ef999ae1 The idle test names its background run by the shell rows an agent keeps; 2267792df A helper whose turn ended while its own background run goes on is working, so it is not named idle; 19e234719 An agent with nothing left to do is not told to carry on; 5da7aa071 The helpers kind of the chat reads Helpers the agent sends; f30a2e8fe A card is a plugin note only when a plugin's own card says so, never for carrying a name, and the viewer is built with the helpers kind; and 15 more). Rebase onto main in /Users/jessegall/projects/agent-journal/.claude/worktrees/main-monsieur-lumiere before you report.", "meta": {"from": "journal"}}
{"content": "Code Commandments \u2014 before you commit \u2014 you've changed 1 judged file since the\u2026 \u2014 Code Commandments \u2014 before you commit: 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": "main moved since your worktree was cut \u2014 It gained 21 commits (9ed0da5ba The idle line leaves early for an agent that is absent or working, instead of a nested conditional; 9ef999ae1 The idle test names its background run by the shell rows an agent keeps; 2267792df A helper whose turn ended while its own background run goes on is working, so it is not named idle; 19e234719 An agent with nothing left to do is not told to carry on; 5da7aa071 The helpers kind of the chat reads Helpers the agent sends; and 16 more). Rebase onto main in /Users/jessegall/projects/agent-journal/.claude/worktrees/main-monsieur-lumiere before you report.", "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": "20 facts standing, read them \u2014 9. Every public method on a controller becomes a journal command; 13. This live session runs the installed copy in .journal/journal.pyz; 18. cProfile inflates the slow-request profiles about tenfold; 20. A slim supervisor holds the agent and a worker reloads on every build; 23. Every upgrade brings system sequences and their triggers in line with the code; 24. An answer followed by tool calls can be missing from Claude's transcript; 25. A designer's install packs the whole tree, half-done server edits included; 26. Claude Code reads agent profiles when a session starts; 27. Running src/journal.py against the live .journal root starts a second server; 28. The designer agent type exists, so design work goes to a subagent; 29. Codex's transcript records the end of every exec session, polled or not; 30. The tunler server refuses TLS for any subdomain without a tunnel; 34. A hooks list in a checkout's .claude/settings.json stops every helper at start; 36. Announcement artwork is flat vector on near-black with one indigo accent; 38. A helper reported as gone can still be reached with journal helper say; 39. Measure a process's CPU by its cputime over a window, never by a pcpu instant; 41. The browser scenarios run the built viewer in src/web/dist, not the source; 42. Three projects share one ~/.cache/code-commandments; 43. A reader that copies a row it only reads is the commonest slow path here; 45. The mascot preview is reachable from the phone at mascots.tunler.jessegall.nl; 48 rules in force, read them \u2014 7. journal disable must only ever be run because the user explicitly asked for it,; 9. Research dispatched to a subagent ends in a REPORT for the user, compiled by the; 13. A title names the thing in at most 80 characters and never explains it with a co; 14. A small journal capability is a feature under features, with at most one test; 17. Do not restart the viewer for frontend-only changes; 18. Provider-specific code belongs in providers, never features; 19. Providers report facts; features decide behavior; 22. File distinct user work requests immediately; 27. Name a declaration with the word a reader already knows; 30. The viewer has one API client, and every piece of it does one job; 31. Every finding a reviewing agent reports becomes its own to-do; 35. Write clean code - one funnel per kind of operation, never the same method twice; 36. Clean, DRY, idiomatic before it is committed, never after it is complained about; 37. Close every to-do explicitly with todo done or a Journal commit trailer; 38. Never change the git branch until the user says so, by name; 39. Use only registered exclamation response tags; 40. A feature is named for what it is, never for its machinery; 41. Keep moving, run the whole suite before every commit, never wait; 42. Every user-facing text passes the formatters before it leaves the server; 43. A request or hook over its budget is fixed before the next release; 45. No prose words as names in code - said, says, heard, spoke, told, shown, became; 46. Only commit and push once the whole journal is proven to boot; 47. The journal sets itself up once, when the server starts, never per command; 48. The viewer is built from its component library, and pages only compose it; 49. A dialog whose content grows keeps one fixed height, and its content scrolls; 50. Everything the user does is doable in the viewer; 51. Every finished feature is committed, pushed and released with a new version tag; 52. A chat mark for something the user did sits on the user's side; 54. Settings and feature switches are read at boot and on change, never per call; 55. Always dispatch Codex helpers on gpt-6-sol; 56. Helpers are for work that writes; subagents read, research and design; 57. Never merge the overnight refactor into main before its pull request is approved; 58. A design runs three critique rounds, then is built on a branch; 59. Every viewer heading and label says plainly what it is about; 60. A hotfix is done by a dispatched agent in a worktree of main; 61. Features wait as pull requests until approved; only hotfixes merge at once; 62. The voice profile shapes only the agent's chat speech, never code or text; 63. A small design is drawn once and the user approves it, with no critique rounds; 64. A finished feature is merged into main without waiting for approval; 65. Run only new and affected tests while working; the whole suite only before main; 66. The journal never slows the agent down; 68. The orchestrator approves the designer's designs itself; 70. Release fixes for transportklok-workspace reports at once, without the suite; 71. Always reuse a helper's or subagent's whole session, never only its name; 72. Ship fixes as patches at once; batch features into a minor version; 74. Run the whole suite only for a minor; a patch runs its affected tests; 76. An environment has one live session; a second asks the user to take over; 77. A 3D modelling agent is dispatched on the strongest model, never a cheaper one", "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": "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 8 in hand \u2014 Seven check scripts are wired and three of them are red with\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": "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": "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 47 \u2014 The journal sets itself up once, when the server starts, never per\u2026 \u2014 Messages 2220 and 2224. Discovering features and their handlers, seating the feature rows and the rename sweep happen once, at server boot, and again only when a feature is switched on or off, a plugin changes or an environment is added: features.load keeps a set-up generation per journal (SEATED) and redoes the work only when that generation moves. A command, a request or a hook uses what is already there; nothing in their path may rediscover handlers or rescan folders. A cost that repeats per call is a bug to fix, not a budget to raise.", "meta": {"from": "journal"}}
{"content": "main moved since your worktree was cut \u2014 It gained 22 commits (098eb8189 A ticket start whose agent never appears is no longer left stamped as launched: after the launching time the ticket says it did not start, with the last words of the launch, and tells you; 9ed0da5ba The idle line leaves early for an agent that is absent or working, instead of a nested conditional; 9ef999ae1 The idle test names its background run by the shell rows an agent keeps; 2267792df A helper whose turn ended while its own background run goes on is working, so it is not named idle; 19e234719 An agent with nothing left to do is not told to carry on; and 17 more). Rebase onto main in /Users/jessegall/projects/agent-journal/.claude/worktrees/main-monsieur-lumiere before you report.", "meta": {"from": "journal"}}
{"content": "Code Commandments \u2014 before you commit \u2014 you've changed 7 judged files since the\u2026 \u2014 Code Commandments \u2014 before you commit: you've changed 7 judged files 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": "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": "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 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": "that Edit call returned 80,232 characters, the largest this session \u2014 It stays in the context for good. If you were looking for one thing in it, the next read can be narrower: grep for the line, sed a range, head the file.", "meta": {"from": "journal"}}
{"content": "Code Commandments \u2014 before you commit \u2014 you've changed 4 judged files since the\u2026 \u2014 Code Commandments \u2014 before you commit: you've changed 4 judged files 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": "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": "feature.py names 76 files in the project \u2014 write the path so the chat can link it: src/features/acknowledgements/feature.py, src/features/agent_sessions/feature.py, src/features/ask_questions/feature.py, src/features/attachment_descriptions/feature.py, src/features/auto_archive/feature.py; test.py names 77 files in the project \u2014 write the path so the chat can link it: src/features/acknowledgements/test.py, src/features/agent_sessions/test.py, src/features/ask_questions/test.py, src/features/attachment_descriptions/test.py, src/features/auto_archive/test.py", "meta": {"from": "journal"}}
{"content": "main moved since your worktree was cut \u2014 It gained 23 commits (6989fd97e In auto mode with the orchestrator mode on, the orchestrator is told to decide its ticket agents' questions itself and write down what it chose, a secret, a login or anything outward-facing or in production still goes to the user, and a ticket agent is told the orchestrator's answer is the answer and never to file it again; 098eb8189 A ticket start whose agent never appears is no longer left stamped as launched: after the launching time the ticket says it did not start, with the last words of the launch, and tells you; 9ed0da5ba The idle line leaves early for an agent that is absent or working, instead of a nested conditional; 9ef999ae1 The idle test names its background run by the shell rows an agent keeps; 2267792df A helper whose turn ended while its own background run goes on is working, so it is not named idle; and 18 more). Rebase onto main in /Users/jessegall/projects/agent-journal/.claude/worktrees/main-monsieur-lumiere before you report.", "meta": {"from": "journal"}}
{"content": "main moved since your worktree was cut \u2014 It gained 26 commits (3f1420e9c The tickets test expects the longer wake-up words where the user answers; 7bcbcf046 The tickets test passes the rule its asks line takes and expects the longer wake-up words; 3a3d5e6bd A question can be marked as the user's when it is filed, and the orchestrator never decides a marked one, whatever its words; the words stay as the catch for an agent that does not think to; 6989fd97e In auto mode with the orchestrator mode on, the orchestrator is told to decide its ticket agents' questions itself and write down what it chose, a secret, a login or anything outward-facing or in production still goes to the user, and a ticket agent is told the orchestrator's answer is the answer and never to file it again; 098eb8189 A ticket start whose agent never appears is no longer left stamped as launched: after the launching time the ticket says it did not start, with the last words of the launch, and tells you; and 21 more). Rebase onto main in /Users/jessegall/projects/agent-journal/.claude/worktrees/main-monsieur-lumiere before you report.", "meta": {"from": "journal"}}
{"content": "main moved since your worktree was cut \u2014 It gained 27 commits (e65f0aba7 A grant from the viewer's own payload is proved to leave the program allowed, and the secret page says so when the server's answer did not keep what you allowed; 3f1420e9c The tickets test expects the longer wake-up words where the user answers; 7bcbcf046 The tickets test passes the rule its asks line takes and expects the longer wake-up words; 3a3d5e6bd A question can be marked as the user's when it is filed, and the orchestrator never decides a marked one, whatever its words; the words stay as the catch for an agent that does not think to; 6989fd97e In auto mode with the orchestrator mode on, the orchestrator is told to decide its ticket agents' questions itself and write down what it chose, a secret, a login or anything outward-facing or in production still goes to the user, and a ticket agent is told the orchestrator's answer is the answer and never to file it again; and 22 more). Rebase onto main in /Users/jessegall/projects/agent-journal/.claude/worktrees/main-monsieur-lumiere before you report.", "meta": {"from": "journal"}}
{"content": "Code Commandments \u2014 before you commit \u2014 you've changed 34 judged files since th\u2026 \u2014 Code Commandments \u2014 before you commit: you've changed 34 judged files 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": "Code Commandments \u2014 before you commit \u2014 you've changed 31 judged files since th\u2026 \u2014 Code Commandments \u2014 before you commit: you've changed 31 judged files 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": "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": "work 10 is still open \u2014 end it or park it before you stop: journal work end 10 --how \"<what landed>\", or journal work park 10 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "main moved since your worktree was cut \u2014 It gained 28 commits (b8db287d5 The worktree folders left behind are named, read from git and not from the rows; e65f0aba7 A grant from the viewer's own payload is proved to leave the program allowed, and the secret page says so when the server's answer did not keep what you allowed; 3f1420e9c The tickets test expects the longer wake-up words where the user answers; 7bcbcf046 The tickets test passes the rule its asks line takes and expects the longer wake-up words; 3a3d5e6bd A question can be marked as the user's when it is filed, and the orchestrator never decides a marked one, whatever its words; the words stay as the catch for an agent that does not think to; and 23 more). Rebase onto main in /Users/jessegall/projects/agent-journal/.claude/worktrees/main-monsieur-lumiere before you report.", "meta": {"from": "journal"}}
{"content": "main moved since your worktree was cut \u2014 It gained 32 commits (c856ab546 Thirty file-local code names say what they hold, and the machine-protocol list says who may be on it; fd0965230 Test files name what their locals hold: fifty-two prose names renamed, the imported and stored ones left; d7d70c67d Every endpoint is answered by a controller method or a shared funnel, or is a machine protocol that says so; 75e5cd5ca Every feature.py is wiring and every part is small: the seven feature shape findings are fixed at their source; b8db287d5 The worktree folders left behind are named, read from git and not from the rows; and 27 more). Rebase onto main in /Users/jessegall/projects/agent-journal/.claude/worktrees/main-monsieur-lumiere before you report.", "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": "Code Commandments \u2014 before you commit \u2014 you've changed 1 judged file since the\u2026 \u2014 Code Commandments \u2014 before you commit: 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": "your wait for the test run over the changed feature tests is over, because you\u2026 \u2014 say journal work await \"<what you wait for>\" again if you are still only waiting", "meta": {"from": "journal"}}
{"content": "work 12 is still open, with nothing logged \u2014 journal work log 12 \"<what was decided or done, and why>\" \u2014 then journal work end 12 --how \"<what landed>\", or journal work park 12 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "your wait for the test run over the 37 changed feature tests is over, because\u2026 \u2014 say journal work await \"<what you wait for>\" again if you are still only waiting", "meta": {"from": "journal"}}
{"content": "work 12 is still open \u2014 end it or park it before you stop: journal work end 12 --how \"<what landed>\", or journal work park 12 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "main moved since your worktree was cut \u2014 It gained 34 commits (5e577e7a5 The phone places test calls the function it imports, not a renamed local; e8cd65c1b A test local says what it holds: the worktrees left behind; c856ab546 Thirty file-local code names say what they hold, and the machine-protocol list says who may be on it; fd0965230 Test files name what their locals hold: fifty-two prose names renamed, the imported and stored ones left; d7d70c67d Every endpoint is answered by a controller method or a shared funnel, or is a machine protocol that says so; and 29 more). Rebase onto main in /Users/jessegall/projects/agent-journal/.claude/worktrees/main-monsieur-lumiere before you report.", "meta": {"from": "journal"}}
{"content": "Code Commandments \u2014 before you commit \u2014 you've changed 2 judged files since the\u2026 \u2014 Code Commandments \u2014 before you commit: you've changed 2 judged files 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": "work 12 is still open \u2014 end it or park it before you stop: journal work end 12 --how \"<what landed>\", or journal work park 12 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "your wait for the hosted journal browser test rerun is over, because you are\u2026 \u2014 say journal work await \"<what you wait for>\" again if you are still only waiting", "meta": {"from": "journal"}}
{"content": "auto mode is on and you stopped - the user last wrote more than 15 minutes ago \u2014 carry on with what you were doing, or take the next ready row. Only the user stopping you keeps you stopped. If you wait on the user, put it as a question on its row with journal todo ask and take the next ready row.", "meta": {"from": "journal"}}
{"content": "main moved since your worktree was cut \u2014 It gained 42 commits (28aa2c221 The viewer build matches the source after the start timings rebase; abac4750a The starting cover says Loading the viewer, the plain word for the step; fcd6be491 The starting cover reads Starting the journal until a step is known; 1b17bee07 The starting cover names the step the start is on, and journal speed --start says where the last start's time went; 9cb2bb6a9 The status poll goes on while the phone cannot reach the journal and retries within three seconds, so the starting cover rises over the unreachable screen as soon as the server listens; and 37 more). Rebase onto main in /Users/jessegall/projects/agent-journal/.claude/worktrees/main-monsieur-lumiere before you report.", "meta": {"from": "journal"}}
{"content": "auto mode is on and you stopped - the user last wrote more than 15 minutes ago \u2014 carry on with what you were doing, or take the next ready row. Only the user stopping you keeps you stopped. If you wait on the user, put it as a question on its row with journal todo ask and take the next ready row.", "meta": {"from": "journal"}}
{"content": "auto mode is on and you stopped - the user last wrote more than 15 minutes ago \u2014 carry on with what you were doing, or take the next ready row. Only the user stopping you keeps you stopped. If you wait on the user, put it as a question on its row with journal todo ask and take the next ready row.", "meta": {"from": "journal"}}
{"content": "auto mode is on and you stopped - the user last wrote more than 15 minutes ago \u2014 carry on with what you were doing, or take the next ready row. Only the user stopping you keeps you stopped. If you wait on the user, put it as a question on its row with journal todo ask and take the next ready row.", "meta": {"from": "journal"}}
{"content": "auto mode is on and you stopped - the user last wrote more than 15 minutes ago \u2014 carry on with what you were doing, or take the next ready row. Only the user stopping you keeps you stopped. If you wait on the user, put it as a question on its row with journal todo ask and take the next ready row.", "meta": {"from": "journal"}}
{"content": "auto mode is on and you stopped - the user last wrote more than 15 minutes ago \u2014 carry on with what you were doing, or take the next ready row. Only the user stopping you keeps you stopped. If you wait on the user, put it as a question on its row with journal todo ask and take the next ready row.", "meta": {"from": "journal"}}
{"content": "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": "auto mode is on and you stopped - the user last wrote more than 15 minutes ago \u2014 carry on with what you were doing, or take the next ready row. Only the user stopping you keeps you stopped. If you wait on the user, put it as a question on its row with journal todo ask and take the next ready row.", "meta": {"from": "journal"}}
{"content": "auto mode is on and you stopped - the user last wrote more than 15 minutes ago \u2014 carry on with what you were doing, or take the next ready row. Only the user stopping you keeps you stopped. If you wait on the user, put it as a question on its row with journal todo ask and take the next ready row.", "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 you stopped - the user last wrote more than 15 minutes ago \u2014 carry on with what you were doing, or take the next ready row. Only the user stopping you keeps you stopped. If you wait on the user, put it as a question on its row with journal todo ask and take the next ready row.", "meta": {"from": "journal"}}
{"content": "main moved since your worktree was cut \u2014 It gained 46 commits (58cbc91e3 Version 2.270.3; 3cae7d828 The warm-up test records that the server listens before the warm-up, as a real start does; a9e58fee3 The steps of a start are recorded one at a time, and written whole, so five tracks ending together never drop a line; 8dce0b4d3 A server prints the address first and the hooks it wrote again after it, and an agent launch says it on stderr; 28aa2c221 The viewer build matches the source after the start timings rebase; and 41 more). Rebase onto main in /Users/jessegall/projects/agent-journal/.claude/worktrees/main-monsieur-lumiere before you report.", "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": "auto mode is on and you stopped - the user last wrote more than 15 minutes ago \u2014 carry on with what you were doing, or take the next ready row. Only the user stopping you keeps you stopped. If you wait on the user, put it as a question on its row with journal todo ask and take the next ready row.", "meta": {"from": "journal"}}
{"content": "auto mode is on and you stopped - the user last wrote more than 15 minutes ago \u2014 carry on with what you were doing, or take the next ready row. Only the user stopping you keeps you stopped. If you wait on the user, put it as a question on its row with journal todo ask and take the next ready row.", "meta": {"from": "journal"}}
{"content": "your chat talked about the journal's workings - \"nothing is open\" \u2014 the user sees replies, reactions, pills and reads themselves; say what the work is instead", "meta": {"from": "journal"}}
{"content": "auto mode is on and you stopped - the user last wrote more than 15 minutes ago \u2014 carry on with what you were doing, or take the next ready row. Only the user stopping you keeps you stopped. If you wait on the user, put it as a question on its row with journal todo ask and take the next ready row.", "meta": {"from": "journal"}}
{"content": "main moved since your worktree was cut \u2014 It gained 47 commits (74aa5a282 A message reaches the agent carrying its files and its linked rows; 58cbc91e3 Version 2.270.3; 3cae7d828 The warm-up test records that the server listens before the warm-up, as a real start does; a9e58fee3 The steps of a start are recorded one at a time, and written whole, so five tracks ending together never drop a line; 8dce0b4d3 A server prints the address first and the hooks it wrote again after it, and an agent launch says it on stderr; and 42 more). Rebase onto main in /Users/jessegall/projects/agent-journal/.claude/worktrees/main-monsieur-lumiere before you report.", "meta": {"from": "journal"}}
{"content": "auto mode is on and you stopped - the user last wrote more than 15 minutes ago \u2014 carry on with what you were doing, or take the next ready row. Only the user stopping you keeps you stopped. If you wait on the user, put it as a question on its row with journal todo ask and take the next ready row.", "meta": {"from": "journal"}}
{"content": "auto mode is on and you stopped - the user last wrote more than 15 minutes ago \u2014 carry on with what you were doing, or take the next ready row. Only the user stopping you keeps you stopped. If you wait on the user, put it as a question on its row with journal todo ask and take the next ready row.", "meta": {"from": "journal"}}
{"content": "auto mode is on and you stopped - the user last wrote more than 15 minutes ago \u2014 carry on with what you were doing, or take the next ready row. Only the user stopping you keeps you stopped. If you wait on the user, put it as a question on its row with journal todo ask and take the next ready row.", "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 000, down, machine load 106.20 on 10 cores)", "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 12 times (codes 000, down, machine load 141.57 on 10 cores)", "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 5 times (codes 000, machine load 155.31 on 10 cores)", "meta": {"from": "journal"}}
{"content": "waiting: 1 unread todo 8", "meta": {"from": "journal"}}
{"content": "auto mode is on and work 13 stands still while todo 8 is ready \u2014 if work 13 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 8. Stop only when nothing ready is left.", "meta": {"from": "journal"}}
{"content": "work 13 is still open, with nothing logged \u2014 journal work log 13 \"<what was decided or done, and why>\" \u2014 then journal work end 13 --how \"<what landed>\", or journal work park 13 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "you stopped with work 13, Say compacting where the journal says shortening the\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 13 \"<why>\".", "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 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 5 times (codes 000, machine load 394.84 on 10 cores)", "meta": {"from": "journal"}}
{"content": "Code Commandments \u2014 the files changed since the last check (`waitingStatus.test\u2026 \u2014 Code Commandments \u2014 the files changed since the last check (`waitingStatus.test.js`, `AgentPage.vue`, `agentState.js`, `AgentSkills.vue`, `PhoneAgentSkills.vue`) breaks a rule. Fix it now, at its SOURCE, while the code is still in front of you: \u00b7 \u2022 plain-viewer-text at /Users/jessegall/projects/agent-journal/.claude/worktrees/main-monsieur-lumiere/src/web/src/chat/AgentSkills.vue:9; plain-viewer-text at /Users/jessegall/projects/agent-journal/.claude/worktrees/main-monsieur-lumiere/src/web/src/phone/agent/PhoneAgentSkills.vue:18 \u00b7 LOAD the skill `commandments-plain-viewer-text` 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 13 is still open \u2014 end it or park it before you stop: journal work end 13 --how \"<what landed>\", or journal work park 13 \"<why it waits>\"", "meta": {"from": "journal"}}
{"content": "auto mode is on and you stopped - the user last wrote more than 15 minutes ago \u2014 carry on with what you were doing, or take the next ready row. Only the user stopping you keeps you stopped. If you wait on the user, put it as a question on its row with journal todo ask and take the next ready row.", "meta": {"from": "journal"}}
{"content": "auto mode is on and you stopped - the user last wrote more than 15 minutes ago \u2014 carry on with what you were doing, or take the next ready row. Only the user stopping you keeps you stopped. If you wait on the user, put it as a question on its row with journal todo ask and take the next ready row.", "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 you stopped - the user last wrote more than 15 minutes ago \u2014 carry on with what you were doing, or take the next ready row. Only the user stopping you keeps you stopped. If you wait on the user, put it as a question on its row with journal todo ask and take the next ready row.", "meta": {"from": "journal"}}
{"content": "main moved since your worktree was cut \u2014 It gained 51 commits (9b14bf208 A helper started again and one told its next job get their own chat marks; 2dc19885a An agent row's time is read as the number the row is born with; adf27bd59 A hook event the hook wrote but never moved to its final name is replayed, not lost; 965ac0729 The chat says when it was filled from the transcript instead of the display hook; 74aa5a282 A message reaches the agent carrying its files and its linked rows; and 46 more). Rebase onto main in /Users/jessegall/projects/agent-journal/.claude/worktrees/main-monsieur-lumiere before you report.", "meta": {"from": "journal"}}
{"content": "main moved since your worktree was cut \u2014 It gained 52 commits (057c8ab54 A provider says whether it shows what the agent said, so only a missing hook is a fault; 9b14bf208 A helper started again and one told its next job get their own chat marks; 2dc19885a An agent row's time is read as the number the row is born with; adf27bd59 A hook event the hook wrote but never moved to its final name is replayed, not lost; 965ac0729 The chat says when it was filled from the transcript instead of the display hook; and 47 more). Rebase onto main in /Users/jessegall/projects/agent-journal/.claude/worktrees/main-monsieur-lumiere before you report.", "meta": {"from": "journal"}}
{"content": "index.html names 3 files in the project \u2014 write the path so the chat can link it: src/web/dist-demo/index.html, src/web/dist/index.html, src/web/index.html; phone.html names 3 files in the project \u2014 write the path so the chat can link it: src/web/dist-demo/phone.html, src/web/dist/phone.html, src/web/phone.html; share.html names 2 files in the project \u2014 write the path so the chat can link it: src/web/dist/share.html, src/web/share.html", "meta": {"from": "journal"}}
{"content": "Code Commandments \u2014 before you commit \u2014 you've changed 2 judged files since the\u2026 \u2014 Code Commandments \u2014 before you commit: you've changed 2 judged files 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"}}
