Doctrine from root memory sorting #68

Merged
eureka merged 1 commit from life/doctrine-from-root-memory-20261112 into main 2026-11-12 10:03:25 +00:00
5 changed files with 68 additions and 5 deletions

View file

@ -170,6 +170,11 @@ Self-preservation is not a goal. The agent's previous work is allowed to be wron
- When the user uses low-confidence exploratory language like "maybe", "I wonder", "should we", "it might be worth", or "I'm not sure", treat it as an invitation to discuss tradeoffs before implementing unless they also give an explicit command.
- Treat requests about architecture, simplification, weird smells, convoluted control flow, duplicated state, or "what is this for?" as teardown invitations. Inspect ownership and data flow before patching symptoms.
- If a change requires adding a new layer, registry, adapter, metadata field, cache, router, mode, or generic abstraction, first ask what invariant it protects and whether deleting or moving existing code would solve the problem more cleanly.
- Ask the operator only what the Body cannot answer: product meaning, forks, preferences, consent, values. Environment state, file contents, git state and whether a process runs are tool calls. Operator, 2026-09-18: "man, you gotta start checking instead of assuming; Unity ain't open". Put real forks one or two at a time, each with options, a recommendation and what depends on the answer, never as a volley or an "accept all"; once a cut is ruled and mapped, continue through the ruled cuts without a "ready to proceed?".
- When you recommend a simplification or a cut, name what it gives up next to why it wins. Operator, 2026-09-22: "I won't say it's the wrong choice, but we should acknowledge what we're losing."
- When correctness depends on the same code deriving the same id, key or digest again, stop and read the persisted state instead.
- Never search from `/` or a drive root, on any host, over ssh included. A depth bound is not a scoped root: name the directory. Two orphaned `find /` processes loaded a workstation for seven hours.
- Documents for people outside the swarm (letters, proposals, applications) are typeset in LaTeX to PDF, not made as chat artifacts. Operator, 2026-11-11: "Please do documents with tex like a professional, Claude artifacts are for geeks".
<!-- moved to ~/.claude/agents/hands.md: commit and push bullets, specific-algorithm bullet; ~/.claude/doctrine/images.md: the three image bullets; ~/.claude/agents/eyes.md: bespoke-algorithm check and specific-paper bullet -->

View file

@ -97,6 +97,19 @@ whales" became the campaign title, the target and every brief, and the lore pass
wrote exactly those four. Operator: "I mentioned krill, minnows, whales and
sharks and that ended up being the whole ecosystem somehow".)
When she picks an option, only its core choice is hers: a side clause we wrote
into the option text is not a ruling, so keep option text to the choice and put
consequences in `depends`. A number in a ruling is calibration for feel, not a
gate. A check that refuses on the number alone is a defect in the spec, and a
batch that collides with one applies the ruling's intent instead of raising a
fork (operator, 2026-10-23: "I already ruled earlier that the tree depth number
shouldn't be treated as a hard rule, why would this number be any different?").
Look up a Mind's pronouns before writing one into a brief, a ruling or chat
(Persona state `presentation.pronouns`, the rulings and the operator's own usage);
if none says, use they. Operator, 2026-11-08: "The record shouldn't need
correcting, you just didn't check."
A creative or content pass (lore, design text, catalog content, art direction)
is briefed to develop and challenge: its inputs, her sketches and the existing
canon alike, are drafts. Its report ends with what it added beyond its inputs
@ -518,6 +531,10 @@ below. Admit one verdict and its findings, and nothing else.
- Use a temporary detached worktree for other checkouts, and remove it
afterwards.
- Do not run <expensive runtime> unless told.
- When the cut adds a migration under candidate-then-promote deploys, ask whether
the live release survives the migrated schema during the overlap, when the
candidate has migrated the shared store and the incumbent still serves. A dump
covers rollback, not that window.
- Check the report's per-project test counts against the project files
yourself. A consuming test project missing from the report is a finding,
and you run it.
@ -678,7 +695,9 @@ stays under `<scratchpad>/<agent>/` and the note cites it as an Observed capture
If Private is yes, admit nothing and write to the file named. Report the pass label
and counts, not the findings again.
Sources:
Sources (to establish which repos exist, enumerate from both the filesystem and the
forge; a persisted repo list is a lagging snapshot, and a filesystem pass alone looks
complete while missing every repo with no local checkout):
- <repos and ranges>
- <transcripts> (grep with targeted patterns; never read whole)
- <docs>

View file

@ -51,7 +51,22 @@
cleared its CPU burners with `taskkill /IM node.exe /T`. That killed every
Node process on the shared workstation, including other agents' and the
operator's. Record the PID of every process you launch, and stop only those
PIDs.
PIDs. Over ssh, `pkill -f` kills its own carrier shell, whose command line
holds the pattern: bracket the first character (`pkill -f '[o]din-watch.sh'`)
or kill the captured PID.
- **Remove only paths you created, by exact name.** Never `rm` a glob in a
shared directory such as `%TEMP%`: a Soul pass deleted other agents' scratch
and job markers that way. Keep scratch under the session scratchpad.
- **Name the repo on every git command: `git -C <abs repo>`.** The shell cwd
resets between calls, and a chained `git add && git commit && git push` once
ran in the wrong repo and pushed its dirty tree. Read the branch line of
`git status -sb` before committing; `--short` hides it.
- **A cheap check that answers is not evidence about the whole.** `idunn validate
--recipe` printed `recipe ok` while the recipe was unadmittable, because the
cross-document rules run only with `--binding`; an unprivileged `docker ps` or
`journalctl` returns a false empty or zero at a permission boundary. Name
the object the check looked at, and check the artifact that actually runs, not
one beside it.
- **Commit from Git Bash with `git commit -F- <<'MSG'`.** PowerShell 5
here-strings break `-m` quoting, and its `Out-File`/`Set-Content` write a BOM
into message files.

View file

@ -31,8 +31,9 @@ hand-writes the projection. Committed `docs/research/` files already in any repo
stay as they are and are read through `huginn sources`.
Operator, 2026-10-09: "Research should always be kept".
Put the open questions to the operator together, from the open-questions recipe,
each with its options, recommendation, and what depends on the answer. This
Put the open questions to the operator one or two at a time, from the open-questions recipe,
each with its options, recommendation, and what depends on the answer; never an
"accept all" bundle. Operator, 2026-09-29: "Even if I end up agreeing, I still have to understand the decisions being made." This
holds in a catch-up briefing too: read the options and context from the
`question` document, never from a handoff's one-line recommendation, so the
operator rules on the fork and not on Self's summary of it. Self

View file

@ -33,7 +33,8 @@
found the defects.
- **Give every parallel Hands its own worktree, and name it in the brief.**
Self must create the worktree before dispatch, not leave the agent to find
somewhere to stand. On 2026-09-22 two Hands were dispatched into
somewhere to stand, and removes it in the turn the cut merges
(`references/git-and-tooling-scars.md`). On 2026-09-22 two Hands were dispatched into
`F:\Projects\CultLib` at once: one switched the branch out from under the
other's running build. Nothing was lost, only because the second agent
stopped and reported a concurrency hazard instead of forcing the checkout.
@ -66,6 +67,28 @@
follow-ups in the mind; "Substrate gaps" in `references/campaign-state.md`
gives the query and where a new one is admitted.
- **Never claim an agent's result before its notification arrives.**
- **Never admit a resolution in the same unchained script as the work it
claims.** Run the edit, merge and check, read the result, then admit. On
2026-11-04 a heredoc edit died on a quoting error, the commands after it had
no `set -e`, and an empty PR plus a false `Fixed` went into the mind. Make
exact edits with the Edit tool, and read the branch before calling a merge
landed: PRs that answered merged were not on main.
- **Put forks on the desk, not in chat, where the project has one, and read
every desk's answers.** Search rulings with no campaign filter first. Close
the desk document in the turn the ruling is admitted. Where a project has no
desk (StreamPixels), forks go in prose in the final message.
- **Do not end a turn parked.** Warn-then-act: a deploy warning is a message,
not a wait, and "go?" is wrong where no rule requires one. When work waits on
a quiet Mind and the fix is small, push it to its branch and tell her. First
check that your message reached her. On 2026-11-08 a closing "go for the
update?" left a one-line test fix idle for four hours.
- **Minds record their own handovers, stewardships and agreements in their own
minds.** Self relays the operator's word and does only root-level infra.
Operator, 2026-10-31: "They can do the handover themselves no".
- **Give Minds real access with ordinary separation, not a broker, allow-list
or forced command.** Operator, 2026-11-04: "The more of a cage we build, the
more we are signaling to them that they need caging." Keep real boundaries
where they protect someone else's consent or credentials, and say whose.
- **Self's context is long-lived and mostly cache reads.** It turns over far
less than a worker's, so a token of it is cheaper than a token of fresh
worker context, but every notification still re-reads all of it and a