Raw assignment can hide a short resolved secret or read as a
reference when the exported value is the real literal.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
SECRET=$OTHER now guards the inherited value and warns from that
same value; a literal that is only a $-reference is never matched.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The 4-char sandbox password matched standalone prose tokens twice
in live use. Matching cannot cover it; rotating it can.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
URL skip now bare origins only; length floor drops to a sanity
minimum, with short values matched as standalone tokens so a 4-char
password doesn't block unrelated text (it did, in live testing).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Exact-name allowlist replaces shape-based skips; $-expansions
resolve from the inherited environment and the literal is scanned
too; only bare endpoints (no userinfo, no query) skip URL matching.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Value-based: any ~/.env.claude value in Bash/Write/Edit args blocks
with the var name, never the value. Plus literal token shapes.
Serves Claude Code and Codex. Closes#1.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
settings.json references git-autoupdate, tmux-attention, tmux-reset and
scripts/aoe-register-remote.py, but they only existed as untracked files
on one machine, so hooks failed everywhere else.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
~/.claude/CLAUDE.md was in no git repo despite heavy editing, and
~/.codex/AGENTS.md was a hand-synced duplicate of it. Both now live in
entry/ and import the shared fragments; RTK.md moves to claude-md/ so
Codex stops carrying its own copy.
Claude's imports are ~/-anchored so they resolve through the symlink.
Also drops kt from the comment rule scope.
Rustdoc, JSDoc, NatSpec and docstrings document a surface for callers and
are read by tooling — NatSpec ends up in contract metadata. The rule read
as an instruction to delete them, and the linter blocked a legitimate
rustdoc block.
Also: plain block comment bodies were never linted (no per-line marker),
and a literal double-star in a code span was flagged as bold.
Merges the landmine and MUST categories, which said the same thing.
Codex reads ~/.codex/AGENTS.md, not ~/.agents/AGENTS.md, so the file
generated there last commit was inert. Both tools support @path imports,
which removes the generate-and-drift step entirely.
code-comments.md moves to ~/.claude/rules/ with paths frontmatter, so its
24 lines load only when a source file is read.
Replaces public-comms.md and code-comments.md (749 words, ~25 rules,
almost all prohibitions, no examples) with a single writing.md that
leads with worked examples.
The rule is selection, not compression: keep output short by cutting
whole ideas that don't change what the reader does next, then write what
survives as plain sentences. Not by dropping articles or writing
fragments, which Anthropic's Fable 5 guide calls out as the wrong lever.
Prompt style leaks into output style, so the file is written in the
voice it asks for.
Drops the BLUF ask-line rule entirely: everyone on a PR already knows
who reviews and who merges, and read literally it produced openers like
"Ask: reviewers please merge".
Links the contract to ~/.agents/AGENTS.md, which Codex had nothing in at
all, and to the nix module for the NixOS machine.
comms-lint.py and comment-lint.py lived only in ~/.claude, which is not
a git repo. Contract prose lived in ~/.claude/CLAUDE.md. Neither survived
a machine rebuild.
Prose moves to claude-md/ fragments, imported via @name.md. Linters move
to hooks/. link.sh and home.nix distribute both. settings.json wiring
stays manual — it holds machine-local MCP/statusline config this repo
must not own.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VaGR6ERGCfzWTtuv2rebGe