A rule in a file Claude read an hour ago is a rule Claude may have stopped following: whatever is on screen crowds it out. So Golden Thread puts its Core rules in front of Claude with every single prompt, and the five that must never break are checked: a reply or command that breaks one is blocked before it lands.
core-rules/ and adds all ten, plus the real time.Edit a rule file and the very next turn uses the new text. If the vault cannot be reached, the hook says so loudly instead of going quiet.
This block arrives with every prompt you send, before Claude reads a word of it. It is the real output of gt's rule hook, run against the rule files that ship with gt.
Current date and time: 2026-10-10 15:08 CDT CORE RULES (always on, every turn, every project — see core-rules): 1. Write vault content only through the write queue (gt_write_queue.py), then apply it with gt_broker.py drain; never edit a vault file directly, and never write one another live session has claimed. 2. Name the vault on every mutating tool run — --vault or --dry-run — never let the target be inferred. 3. Never put a secret's value into the session — not to inspect it, not to redact it, not to check it. 4. Run the tests before you commit code, and say which ran — never commit code whose tests you have not seen pass. 5. Begin every response with the current wall-clock timestamp. 6. `global-memory/` contains only facts needed in EVERY project. 7. Do not auto-load the full memory index. 8. Parallelise any work that can be parallelised, in every project — independent units run concurrently within one machine-wide budget shared by every session, and serial execution must be justified, not assumed. (parallel_max: at most 13) 9. A secret's value rests only in the secrets store (sops + age on a dedicated host) or a mode-600 file the store wrote — never in source, a vault file, a repo, a log, or a session; if you find one anywhere else, file it, rotate it, and move it. 10. Label every derived figure you present as fact with its verification state — `unverified`, `self-verified`, or `independently verified`.
checked a hook blocks the break, and the message below is the one it really prints. reminder re-asserted every response; judgement no hook can check.
Two sessions writing the same note at once is how memory gets corrupted. The queue lets the broker hold a write another session has claimed, remove duplicates, and send design and global-memory changes to you for review.
What Claude sees if it tries a direct edit (shortened)BLOCKED by Core rule core_concurrent_session_claim (queue first).
Projects/my-app/research.md
is vault content, and vault content is written only through the write queue (Edit was refused).
The broker holds a write another live session has claimed, removes duplicates, and sends
conflicts and every design.md / global-memory write to the owner for review.A rehearsal meant for a scratch copy once migrated the live vault's 42 decisions files, because the tool quietly defaulted to the real vault. Now a writing command that does not say which vault never runs.
The real message (shortened)BLOCKED by Core rule core_explicit_vault_target.
gt_adr.py migrate writes to a vault, and this command does not say which one.
It would resolve the vault from ~/.claude/vault-config.json -- your REAL
vault -- whatever you meant.
Do this instead:
1. Rehearsing on a copy? add --vault <copy>
2. Just want to see it? add --dry-run
3. Meant the live vault? add --vault <path> -- say it, so the next reader can see you meant it.Anything in the session can end up in a transcript, a log or a summary. The reply is scanned before you see it; a key, a token or a password in it sends the reply back.
The real messageCore rule violated (core_no_secrets_in_transcript): the reply contains an API key.
Never paste a secret into the session, including to inspect or redact it -- read the
file directly, or report only its shape (length, prefix, which key it is). Re-send
without the value. If this is a false positive on a placeholder, use an obviously
non-real form such as <client-secret>."The tests passed earlier" is not the same as passing on the code you are about to commit. A commit is let through only when a test receipt covers what is staged. A repo with no tests opts out visibly, for everyone.
The real message (shortened)BLOCKED by Core rule core_test_before_commit.
1 code file(s) staged, and their tests have not been seen to pass.
Do this instead:
1. Run them, then record it: gt_test_receipt.py record --repo . --ok
(tests/run.sh and dev/release-check.sh record their own receipts.)
2. This repo has no tests? touch .gt-no-test-gate -- exempt, visibly, for everyone.
3. This one commit only: GT_TEST_GATE=off git commit ...It costs nothing and shows on every reply, so it works as a canary: the first rule to slip when attention drifts. When it fails, you know the others are at risk too.
The real messageCore rule violated (core_timestamp_every_message): neither the final answer nor the
first text of this turn begins with the timestamp. Start the final answer with the value
injected by the UserPromptSubmit hook, e.g. '2026-08-16 15:32 CDT'; do not guess it.Whatever is loaded everywhere costs tokens everywhere and competes for attention everywhere. A fact that matters to one project lives in that project.
Opening a project indexes its notes without reading them all. Notes are read when a question needs them, so a large vault does not slow every session down.
Independent searches and checks run side by side instead of one after another, without several sessions together swamping the machine.
Rule 3 stops a secret entering the session; this one says where secrets belong, and what to do when one turns up somewhere it should not be.
A number that sounds certain and one that was checked look the same on the page. The label tells you which one you are reading before you act on it.
Rules live in your vault's core-rules/ folder as markdown. Change the text and the next response uses it. Add your own the same way; the tier is kept small on purpose, because every rule added dilutes the rest.
--- name: core_test_before_commit enforcement: validated imperative: "Run the tests before you commit code, and say which ran. Never commit code whose tests you have not seen pass." ---
From the real rule file. Getting started covers what gt never does without asking.