with one click
single-source-doc-lint
Lint repo docs for single-source-of-truth violations.
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
Lint repo docs for single-source-of-truth violations.
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
Diagnose and fix the dual-channel memory problem in Hermes Agent — when `memory.provider: holographic` (or any external provider) is configured but the agent keeps writing only to `memories/MEMORY.md`, bypassing it. Covers why agents default to the markdown file, the four root causes of routing failure, and three remediation options (SOUL.md rules / disable MEMORY.md / mirror via code). Triggers on 'memory 不生效', 'holographic 没在用', 'agent 都写到 MEMORY.md', '双 memory 系统', 'memory tool vs fact_store', 'on_memory_write', 'memory drift', 'Mirrors 不到', or any 'why is my agent ignoring the configured memory provider' question.
Use when the user works inside ~/Projects/Config/Guix-configs and mentions '改 dotfiles', 'blue home', 'guix system reconfigure', 'shepherd service', 'stow 死链', 'blue stow', 'AGENTS.md 翻新', 'fcitx', 'IME 没输入法', 'Electron 没输入法', 'wireplumber', '二轨 dotfiles', '恢复被删除的 dotfiles', or related. Ten sub-protocols — dotfiles deploy verification, worker delegation, multi-line edit safety, Guix service debugging, GNU Stow mutable config, restoring deleted dotfiles, ISO 移植, 需求澄清, 模块归属陷阱.
跨 agent KB 健康度维护。**触发信号**:每周/长会话后例行维护 / 卡片 >50 张 / 检索质量明显下降 / 用户触发 `/agenote-curate` / 发现重复卡片或矛盾结论 / 新增了对话抽取源。**当上述任一信号出现时立即调用本 skill** 做健康检查+去重+归档+权重重分配+reconcile 多源 memory。基础用法见 `agenote-base`;会话中单次经验记录见 `agenote-review`。
Maintain the personal Guix channel at ~/Projects/Config/jeans (Just Enough AI-geNerated Slops). Use when the user asks to "fix the CI build failure issue", "升级 X 包", "add a package", "check upstream updates", "跑 maak upgrade", "修复 auto-update 流水线的 issue
How to author a Hermes Agent skill the right way. Covers the two non-negotiable structural principles every skill must follow — **self-contained** (all runnable artifacts ship inside the skill directory so backup = usable) and **progressive disclosure** (SKILL.md is a thin router; details live under `references/`, `templates/`, `scripts/`) — the directory layout, file-type rules, decision trees for what goes in SKILL.md vs. a support file, **which of the 12 existing categories a new skill belongs to (never top-level `<skill-name>/`)**, and a checklist before declaring a skill done. Trigger when: writing a new skill, refactoring an existing skill's structure, wondering 'should this go in SKILL.md or references()' / 'which category directory should this skill live into', preparing a skill for backup/share, noticing a self-contained violation, or auditing existing skills. Also trigger when the user complains something is 'too verbose' or 'in the wrong place' — those are progressive-disclosure violations.
When the user says '校对文档 / 检查文档是否还有效 / sync doc with code / 扩写 README / 改写文档 / 把这个 PLAN/plan/任务书做成文档 / 文档并入主文档', or when a `refs/*.md` document may be drifting from the tool/CLI/源码 it describes, or when a PLAN file needs to become a user-facing reference doc. Covers three entry points — check, rewrite, plan-to-doc — backed by a `scripts/doc-check.py` checker that catches silent drift between a doc and its source-of-truth (CLI flags, MCP tool names, file paths). Trigger when the user names a doc path and asks whether it's still accurate, when adding a new CLI/MCP/API surface that old docs don't mention, or when a PLAN/任务书/thread needs to graduate into a stable reference.
| name | single-source-doc-lint |
| description | Lint repo docs for single-source-of-truth violations. |
| version | 0.1.0 |
| author | Hermes |
| metadata | {"hermes":{"tags":["Docs","Lint","Single-Source-Of-Truth","Repo-Hygiene","Markdown"],"related_skills":["crush-session-extract","guix-configs-workflow","hermes-agent"]}} |
Audit a repo's markdown / org documentation against four rules that came out of a real Guix-configs cleanup session. Every doc on a doc tree drifts unless there's a named authority for each piece of information — and the audit is worth doing because tables that "should" be authoritative get out of sync quietly, while stale directory names linger long after renames.
The four rules:
This skill codifies the audit workflow and ships one helper script. It does not auto-edit your files; you read the candidates and decide.
The helper script scripts/find_md_tables.py is stdlib-only.
enable/ / stow/ references after a rename"AGENTS.md out of sync with .gitmodules again"Skip this skill when the user wants to fix the doc as they write it (use
the local repo's AGENTS.md routing rules instead) or when the doc set
is so small that a manual review is faster than running the scanner.
pathlib.Path.rglob).All work is done via the terminal tool. The helper lives at
scripts/find_md_tables.py and has two subcommands: tables and paths.
Read-only, no mutations.
# 1. find all "large" markdown tables (>= N body rows)
python3 scripts/find_md_tables.py tables --root <repo> --min-rows 5
# 2. find stale path references (default patterns target the
# enable/ -> immutable/ and stow/ -> mutable/ renames)
python3 scripts/find_md_tables.py paths --root <repo>
# 3. JSON output for piping into a review buffer
python3 scripts/find_md_tables.py tables --root <repo> --json | jq
# 4. extend patterns for a different rename event
python3 scripts/find_md_tables.py paths --root <repo> \
--patterns '\bold-name/' '\bdeprecated-namespace/'
# after editing, run a Guix Home deploy if dotfiles changed:
cd ~/Projects/Config/Guix-configs && blue home
The audit is five steps; do not skip the "regenerable" check (step 3) — it is the one that catches the most entropy and saves the most future work.
Run tables to enumerate every markdown table in the repo:
python3 scripts/find_md_tables.py tables --root <repo> --min-rows 5
Default --min-rows 5 is the "definitely worth a second look" threshold.
Below that, the table is small enough that duplication is rarely a problem;
raise the threshold to 10+ if the repo is huge and you want to triage the
top offenders first.
Pipe to --json if you want to write the candidates into a review buffer
instead of a terminal scroll.
Run paths with the built-in rename patterns. The defaults target the
historical enable/ → immutable/ and stow/ → mutable/ rename in
Guix-configs. Override --patterns for a different rename event:
python3 scripts/find_md_tables.py paths --root <repo> \
--patterns '\benable/agents\b' '\benable/desktop\b'
Hits in .agents/workfile/ archive files are noise — they are historical
review notes that intentionally reference old paths. Filter those out of
your final todo.
For each table, ask the four questions in order. The order matters: rule 3 (regenerable) is the highest-leverage check, and rule 4 (single source) only applies once you have decided to keep something.
| Question | If YES | If NO |
|---|---|---|
| Q1 — Stale? | Edit or remove | Continue |
| Q2 — Time-sensitive content? | Note for periodic review | Continue |
| Q3 — Fully regenerable from one command or one file? | Delete the table, replace with a one-liner pointing to the command/file. This is the highest-value move. | Continue |
| Q4 — Does another doc already host the same data? | Delete this copy; point to the other doc | Keep, but mark its authority in a header note |
Worked examples from the source session:
AGENTS.md submodule table (root): regenerable from
git submodule status + .gitmodules. → Delete, replace with
"子模块列表见 .gitmodules(权威来源)".docs/secrets.md subcommand table: regenerable from
tools/secrets (the script's --help / no-arg output). → Delete, replace
with a pointer to the command.docs/loopctl.md adapter table: regenerable from
loopctl adapter list. → Delete, replace with a pointer.AGENTS.md global-variable table: partial overlap with
source/information.scm. The "类型" and "说明" columns are doc-only,
but the "变量" column duplicates information.scm. → Keep, but add a
header note: "变量名以 source/information.scm 为准".dotfiles/mutable/AGENTS.md immutable-vs-mutable comparison: this is
the canonical explanation of the deployment model, not regenerable
from any command. → Keep, no edit.When you delete a regenerable table, do not leave a hole. Replace it with a one-liner pointer that names the command or the file:
| ... deleted table ... |
| --------------------- |
| ... deleted table ... |
子模块列表见 `.gitmodules`(权威来源),**不要直接编辑子模块内容**。
For path references, use the patch tool with replace_all=true when the
old name is fully consistent across the file (e.g. every enable/agents/
becomes immutable/agents/). Use read_file to scan the doc first; if the
old name is used in code blocks (a literal bash example), preserve those.
If the audited docs are deployed by Guix Home (dotfiles/immutable/):
cd ~/Projects/Config/Guix-configs
blue home # rebuild store, re-link to $HOME
ls -la ~/.config/<app>/ # confirm the link points at the new store hash
If the audited docs are in dotfiles/mutable/ (stow flat-link), no deploy
step is needed — the link points directly at the repo source, edits are
live.
Then re-run both scanners. If they produce no new hits on the files you
edited, the cleanup is complete. If they produce hits only in
.agents/workfile/ archive files, those are intentional and you are done.
messages.md tables to be authoritative for things like
version numbers, package lists, or commit SHAs. They drift. Replace with
the command that produces them.loopctl adapter list exists, so the loopctl.md adapter table is
duplicative even though the doc is "nice to read". Don't keep both.home-dotfiles-service-type excluded list excludes
AGENTS.md and README.md from the deployed ~. Editing these files
in the source does not require blue home to update the user's
view; the docs only exist in the repo.--min-rows if the repo is small — start at
3 and bump up if the list is too long.disable/ is a graveyard — directories moved there are intentionally
not deployed. References to dotfiles/disable/<x> in active docs are
almost always stale. The default patterns include dotfiles/disable/.--json to inspect raw output before trusting
numbers.enable/ globally without checking — it appears
legitimately in .agents/workfile/ archive notes that should stay
verbatim for historical accuracy.A successful run produces all three:
python3 scripts/find_md_tables.py tables --root <repo> — fewer hits
than before the audit, on the files you edited (other files' counts
should not increase).python3 scripts/find_md_tables.py paths --root <repo> — no hits in
active docs (.agents/workfile/ archive hits are noise).rg -l '<deleted header>'
— should produce no results in active docs.If a hit reappears after a deploy, the Guix Home store still serves the
old copy — re-run blue home and check ls -la ~/.config/<app>/ points
at the new store hash.
scripts/find_md_tables.py — stdlib-only. Two subcommands:
tables (find markdown tables with ≥N body rows) and paths (grep for
stale path patterns, defaults target the Guix-configs renames).references/judgment-examples.md — annotated list of "delete vs keep"
judgments from the source session, including the marginal cases
(e.g. global-variable table with header note added).