Use when writing or updating any doc of record in this dotfiles repo -- README.md, repo CLAUDE.md, claude/global-instructions.md, claude/operating-principles.md, codex/AGENTS.md, NOTICE -- or when authoring a new skill or slash command file. Trigger on "update the README", "document this", "where should this fact live", "add a skill", "add a command", "the docs are stale", "docs drift", or any house-style question (emoji tags, dash style, commit-message format). Not for platform mechanics content itself (use claude-code-platform-reference), change gating and review process (use dotfiles-change-control), or public-repo/licensing posture decisions (use dotfiles-external-positioning).
Install
npx skillscat add taloncjones/dotfiles/dotfiles-docs-and-writing Install via the SkillsCat registry.
Dotfiles Docs and Writing
Ownership map for every doc of record in this repo, the hook-enforced house
style, the templates for new skills and commands, and the update-trigger
checklist that keeps docs from drifting when the code surface changes. Rule
zero: every fact has exactly ONE home; other docs point to it, never restate it.
Rule one: always edit the REPO file, never the live symlinked copy under~/.claude* or ~/.codex.
Warnings first
- [WARNING]
codex/AGENTS.mdis repo-owned policy. Native plugins own
upstream guidance. The copied ECC (retired) instruction block and global
sync wrapper are retired; never regenerate them. - [WARNING]
claude/global-instructions.mdis symlinked to~/.claude/CLAUDE.mdand~/.claude-work/CLAUDE.mdand loads in EVERY session in EVERY repo. A bad
edit propagates globally on the next session start. Theprotect_claude_md.pyhook warns (does not block) when the live~/.claude/CLAUDE.mdpath is edited -- the warning means "editclaude/global-instructions.mdin the dotfiles repo instead". - [WARNING] House style is hook-enforced (see table below). Violations are
blocked at write or commit time, not merely flagged in review. Emojis and AI
attribution never pass. - [WARNING]
format_files.pyrunsprettier --write --ignore-unknownafter
an edit, but only on files the repo already formats with prettier (a config
covers the path, or the committed file is prettier-clean). Such Markdown gets
reflowed -- re-read a doc after editing before making a second edit
(operating-principles: re-read after any formatter pass).
When NOT to use this skill
| You actually want | Go to |
|---|---|
| How changes are classified, gated, tested, reviewed | dotfiles-change-control |
| Content answers about plugins, config dirs, cloud containers | claude-code-platform-reference |
| Adding or running a test suite | dotfiles-validation-and-qa |
| What may never land in this public repo; licensing decisions | dotfiles-external-positioning |
| Why a doc says what it says (history, reverts) | dotfiles-failure-archaeology |
| Day-to-day operation (update, repair, plugin ops) | dotfiles-run-and-operate |
This skill covers WHERE a fact lives, HOW to write it, and WHAT else must be
updated when it changes.
Docs of record: single home per fact
| Doc | Owns (nothing else restates these) | Edit rules |
|---|---|---|
README.md |
Human-facing setup (fresh Mac quick start), directory structure, command/agent/skill/hook catalogs, identity routing overview, troubleshooting | Catalogs must track the real surface -- see checklist below |
CLAUDE.md (repo root) |
Claude-session guidance for THIS repo: commands, cloud restore mechanics, architecture guardrails and a pointer to the install-layout reference, commit format | The doc every session loads; keep terse. The symlink-targets list lives in the install-layout reference |
.claude/skills/dotfiles-architecture-contract/references/install-layout.md |
Install flow, symlink and seed targets, hook catalogue, Codex plugin and Herdr notes | Authoritative symlink-targets list; update it with any link, hook, or installer change |
claude/global-instructions.md |
Global cross-repo rules: strict rules, response style, commit/branch/Jira conventions, skill routing, plan-mode rules | Symlinked to ~/.claude*/CLAUDE.md; edit the repo file only |
claude/operating-principles.md |
Model-agnostic engineering discipline (verify-before-claim, scope/safety, judgment, comms) | @imported by the last line of claude/global-instructions.md; also symlinked into both config dirs |
codex/AGENTS.md |
Codex global policy and runtime skill routing | Edit owned policy; native plugins supply upstream guidance |
NOTICE |
Third-party attribution: retired ECC rules + pre-commit/pre-push hooks, GSD-redux-derived statusline; MIT notices | Add an entry (paths, upstream URL, license, copyright) whenever anything is vendored or adapted |
Jargon, defined once: "ECC" = Everything Claude Code, a retired (2026-09) third-party Claude Code plugin (github.com/affaan-m/ECC).
"GSD" = Get Shit Done, a retired third-party tool whose statusline this repo ported (see NOTICE).
House writing style (hook-enforced)
| Rule | Enforced by |
|---|---|
No emojis; use [OK] [X] [WARNING] [INFO] |
claude/hooks/emoji_guard.py (file edits), claude/hooks/commit_guard.py + git/hooks/commit-msg (messages) |
| No AI attribution anywhere | claude/hooks/commit_guard.py, no_ai_attribution_bash.py, no_ai_comments.py, git/hooks/commit-msg |
| No secrets in files | claude/hooks/block_secrets.py |
| Commit messages: no attribution, no AI co-author trailers, no emojis | git/hooks/commit-msg (applies to Claude, Codex, and manual commits via core.hooksPath) -- this is ALL it checks; the <scope>: <summary> format, imperative mood, and <75-char rules are review convention, not hook-enforced |
| Markdown auto-formatted by prettier | claude/hooks/format_files.py |
Convention, not hook-enforced -- still mandatory:
- Commits:
<scope>: <summary>, imperative mood, <75 chars (claude/global-instructions.md;
caught in review, not by any hook). - Terse, scannable, rationale-carrying. Engineers scan, not read. Tables and
checklists over prose. Front-load warnings. - ASCII;
--for dashes in new content. - Cite repo files as
path:line, sparingly -- line numbers drift, so prefer
stable anchors (function names, headings) and cite lines only where they add
value. - Never create new
.mdfiles unless explicitly instructed
(claude/global-instructions.md, Code Standards). - Cite commit hashes for anything committed (operating-principles.md).
Templates
New skill (claude/skills/<name>/SKILL.md)
Model: claude/skills/ship/SKILL.md. Frontmatter has exactly two keys:
---
name: <skill-name>
description: Use when <situation>. Trigger on "<phrase>", "<phrase>". Not for <adjacent case> (use <sibling-skill>).
---The description is the ONLY text the model sees before deciding to load the
skill -- make it trigger-rich (concrete phrases and situations) and
differentiate from siblings. Body: title heading, short purpose paragraph,
terse sections.
[WARNING] Tracking step, load-bearing: claude/skills/.gitignore ignores
everything (/*) and whitelists specific dirs. A new skill dir is GITIGNORED
until you add a !/<skill-dir>/ line to that file -- without it, work
silently accumulates on an untracked file (the exact trap
operating-principles.md warns about). Add the line, then verify withgit ls-files claude/skills/<name>. Then follow the checklist below (README
skills catalog).
New slash command (claude/commands/<name>.md)
Existing commands are plain markdown with an H1 title (claude/commands/pr.md);
handoff and kickoff are skills. Optional YAML frontmatter looks like:
---
description: <what it does, when to use, one line>
---
# <Name> Command
...The bare-H1 style (# /commit - Create a commit ..., claude/commands/commit.md:1)
is legacy -- 20 of 22 commands still use it (verified 2026-07-02). Write new
commands in the YAML style; migrate legacy ones opportunistically when already
editing them, not in bulk.
Update-trigger checklist (the drift preventer)
Run this after ANY surface change. Each row is a required same-PR update.
| You changed | You must also update |
|---|---|
Added/renamed/removed a command in claude/commands/ |
README Commands list (under "Claude Code Configuration") |
Added a skill under claude/skills/ |
README Skills catalog; !/<skill-dir>/ line in claude/skills/.gitignore (dir is otherwise gitignored -- verify with git ls-files claude/skills/<name>) |
| Added/changed a Claude hook | README Hooks list; registration in claude/settings.json.tmpl; expectations in claude/hooks/claude-hooks.test.sh; the registration table in claude-code-platform-reference (single home -- change-control and debugging-playbook point to it) |
Added a test suite (*.test.sh or a skill test) |
SUITES list in bin/dotfiles-tests -- CI runs only the runner, so an unlisted suite NEVER runs in CI (.github/workflows/tests.yml) |
| Added a symlink target | .claude/skills/dotfiles-architecture-contract/references/install-layout.md "Symlink targets" list; README Directory Structure; the relevant link script |
Changed claude/settings.json.tmpl |
Announce the manual-merge need in the PR body -- machines seed once and never re-read the template; only cloud reconciles automatically (bootstrap-cloud.sh reconcile_claude_settings) |
| Vendored or adapted third-party content | NOTICE entry: paths, upstream URL, license, copyright |
| Changed cloud restore mechanics | Repo CLAUDE.md "Cloud sessions" section (the doc of record for that flow) |
| Changed a global behavior rule | claude/global-instructions.md (repo file) -- and expect it to reach every session in every repo |
Quick audit commands:
ls "$HOME/dotfiles/claude/commands" | sed 's/\.md$//' # vs README command list
ls -d "$HOME/dotfiles/claude/skills"/*/ # vs README skills catalog
bash "$HOME/dotfiles/bin/dotfiles-tests" --list # vs suites on disk:
grep -rl 'passed, .* failed' "$HOME/dotfiles" --include='*.sh' # (runner's own sync-audit hint)(Substitute your checkout path for $HOME/dotfiles if cloned elsewhere.)
Residual known drift (verified 2026-07-02; fix or file, do not re-discover)
- GSD stance split -- CLOSED (2026-07-10).
gsd-install/gsd-updatewere
removed fromzsh/functions.zshandcodex/AGENTS.mdnow states no GSD
variant has an install path;gsd-uninstallplus thedotfiles-repair
tripwire are the only remaining GSD surface. Ground truth on the
supply-chain history: the ORIGINALget-shit-done-ccnpm package is
compromised (token rug-pull, publish access retained) and must never be
reinstalled; the redux fork is retired as well. - ECC (retired 2026-09) copied instruction block -- CLOSED. Native plugins
now own upstream guidance; repo-owned global policy remains concise and
independently managed. templates/(added 8ae7009; containstemplates/python/pyproject.toml)
is missing from the README Directory Structure tree.- README.md:13 claims a "CLAUDE.md template system" -- CANDIDATE stale:
bin/setup-claudeonly writes.git/info/excludeentries and no CLAUDE.md
template ships in the repo. Grep for references before deleting the claim
(Code Cleanup rule in claude/global-instructions.md). - Command style: every command is plain markdown with an H1 title (see
Templates); handoff and kickoff are skills, not commands. GSD_HOOK_REPAIR/GSD_HOOK_ISOLATEenv-flag names ingit/hooks/post-checkout(documented in README "Global Git Hooks") outlived
the GSD retirement. Functional; naming-only drift.- Dropped todo from the deleted
todo.md(c0a9072): "README Brewfile split
doc" -- README has an "Adding New Packages" section, but whether it fully
covers the common-vs-macos Brewfile split was never re-assessed. OPEN.
Provenance and maintenance
Facts verified against the working tree on 2026-07-02 at commit 26eae6d
(README command list + skills catalog + spec-path fix landed that day; test
runner and CI at 465ee17, same day). Re-verify before trusting:
git -C "$HOME/dotfiles" log --oneline -3 # has the repo moved past 26eae6d?
grep -n 'GSD is retired' zsh/functions.zsh # drift item 1 anchor (line 760 today)
grep -n "sed -i ''" zsh/functions.zsh # drift item 2 anchor (line 358 today)
head -3 claude/commands/*.md | grep -c '^description:' # YAML-style command count (2 today)
ls claude/commands | wc -l # command count (22 today)
bash bin/dotfiles-tests --list | wc -l # suite count (9 today)
grep -n 'reconcile_claude_settings' bootstrap-cloud.sh # cloud settings-merge still exists
grep -rn 'prettier' claude/hooks/format_files.py # formatter hook still prettier-basedVolatile facts date-stamped above: function line
numbers, command/suite counts, the 20/22 legacy-frontmatter split, and every
entry in "Residual known drift". Line numbers WILL drift -- trust the grep
anchors, not the numbers.