From c118489398f77479533bd56d2a21c95e04541420 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 25 Aug 2026 06:43:51 +0000 Subject: [PATCH 1/3] chore(scripts): sync derive_counters docs with 5-source gate, rename EXCLUDED_DIRS to EXCLUDED_NAMES MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two reviewer nits batched: derive_counters.py's module docstring and --check help still described the pre-#989 three-source coverage (flagged on #989); check_model_freshness.py's EXCLUDED_DIRS did double duty as a directory AND filename exclusion set, which the name hid (flagged on #985 and #988's reviews) — renamed with a comment stating both roles. No behavior change; both gates re-verified passing. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01Qgc6RYXWJPr5oW9DHU7zR4 --- scripts/check_model_freshness.py | 8 +++++--- scripts/derive_counters.py | 9 +++++---- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/scripts/check_model_freshness.py b/scripts/check_model_freshness.py index 5d32c309..39cc679a 100644 --- a/scripts/check_model_freshness.py +++ b/scripts/check_model_freshness.py @@ -35,7 +35,9 @@ import os import re import sys -EXCLUDED_DIRS = { +# Excludes both directory names (pruned during walk) and individual filenames +# (e.g. CHANGELOG.md) — membership is checked against dirnames AND filenames. +EXCLUDED_NAMES = { ".git", ".codex", ".gemini", ".hermes", ".vibe", "node_modules", "docs", # generated mirror; fix the source instead "audit", # audit records quote stale IDs on purpose, that is their job @@ -157,9 +159,9 @@ def scan_file(path, repo_root, allowlist): def collect(repo_root): targets = [] for dirpath, dirnames, filenames in os.walk(repo_root): - dirnames[:] = [d for d in dirnames if d not in EXCLUDED_DIRS] + dirnames[:] = [d for d in dirnames if d not in EXCLUDED_NAMES] for fn in filenames: - if fn in EXCLUDED_DIRS or fn in SELF_FILES: + if fn in EXCLUDED_NAMES or fn in SELF_FILES: continue if fn.endswith(SCAN_EXTENSIONS): targets.append(os.path.join(dirpath, fn)) diff --git a/scripts/derive_counters.py b/scripts/derive_counters.py index cb8b2754..23e23427 100644 --- a/scripts/derive_counters.py +++ b/scripts/derive_counters.py @@ -19,9 +19,10 @@ Modes: (default) print a human-readable table --json print the derived counters as JSON --check exit 1 listing mismatches if the headline counters claimed in - README.md, root CLAUDE.md ("Current Scope" line), and - marketplace.json metadata.description disagree with derived - values. Also validates the README "Skills Overview" per-domain + README.md, root CLAUDE.md ("Current Scope" / "Status:" lines), + marketplace.json metadata.description, mkdocs.yml + site_description, or .codex-plugin/plugin.json descriptions + disagree with derived values. Also validates the README "Skills Overview" per-domain table: every domain row's count must equal the SKILL.md count in its linked folder, and every on-disk domain must have a row. CI gate G3. @@ -360,7 +361,7 @@ def main() -> int: parser.add_argument( "--check", action="store_true", - help="exit 1 if README.md / CLAUDE.md / marketplace.json claims drift from derived values", + help="exit 1 if claims in README.md / CLAUDE.md / marketplace.json / mkdocs.yml / .codex-plugin drift from derived values", ) args = parser.parse_args() From 5d2ff0d49dcad34132ae6d9aa0695a0dce6b67e7 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 25 Aug 2026 06:46:01 +0000 Subject: [PATCH 2/3] style(scripts): rewrap derive_counters docstring to consistent width Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01Qgc6RYXWJPr5oW9DHU7zR4 --- scripts/derive_counters.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/scripts/derive_counters.py b/scripts/derive_counters.py index 23e23427..d2dc7fd5 100644 --- a/scripts/derive_counters.py +++ b/scripts/derive_counters.py @@ -22,9 +22,10 @@ Modes: README.md, root CLAUDE.md ("Current Scope" / "Status:" lines), marketplace.json metadata.description, mkdocs.yml site_description, or .codex-plugin/plugin.json descriptions - disagree with derived values. Also validates the README "Skills Overview" per-domain - table: every domain row's count must equal the SKILL.md count in - its linked folder, and every on-disk domain must have a row. CI gate G3. + disagree with derived values. Also validates the README + "Skills Overview" per-domain table: every domain row's count + must equal the SKILL.md count in its linked folder, and every + on-disk domain must have a row. CI gate G3. Stdlib only. No writes ever. """ From af8aa6e66b5f19532ecd64b133079b783e96dc31 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 25 Aug 2026 06:47:46 +0000 Subject: [PATCH 3/3] style(scripts): update derive_counters top-of-file summary to the 5-source list Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01Qgc6RYXWJPr5oW9DHU7zR4 --- scripts/derive_counters.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/derive_counters.py b/scripts/derive_counters.py index d2dc7fd5..c87060eb 100644 --- a/scripts/derive_counters.py +++ b/scripts/derive_counters.py @@ -3,7 +3,7 @@ Walks the canonical tree (excluding sync copies, docs site, audit workspace, and VCS/CI internals) and derives the headline numbers that README.md, -CLAUDE.md, and .claude-plugin/marketplace.json claim: +CLAUDE.md, marketplace.json, mkdocs.yml, and .codex-plugin/plugin.json claim: skills count of SKILL.md files plugins_on_disk count of **/.claude-plugin/plugin.json manifests