Skip to content

fix: the toolkit graded an empty folder and shipped text its own linter rejects (3.5.2) - #11

Merged
tmoody1973 merged 1 commit into
mainfrom
fix/v3.5.2-dx
Aug 22, 2026
Merged

fix: the toolkit graded an empty folder and shipped text its own linter rejects (3.5.2)#11
tmoody1973 merged 1 commit into
mainfrom
fix/v3.5.2-dx

Conversation

@tmoody1973

Copy link
Copy Markdown
Owner

A developer-experience audit of the toolkit itself: install it fresh, run the CLI, break it on purpose, check every doc link. Four findings, all fixed.

1. An empty folder used to get a grade

$ mkdir /tmp/empty && prod_audit.py --repo /tmp/empty
Repository Controls Score: 65/100, D, release blockers present
**4 CRITICAL blocking issue(s)** must be resolved

Nothing said the folder was empty. A mistyped path produced a confident report about nothing. This is the same failure v3.5.1 shipped three fixes for: the tool claiming more than it checked.

Now:

error: /tmp/empty has no files to audit. Nothing was scanned, so no score would mean anything.
Check the path, or pass `--repo .` to audit the directory you are in.

This is a behavior change. A pipeline aimed at a path with no files used to exit 0 and now exits 2. That is a fix, not a regression, but it is breaking in a patch release and both the CHANGELOG and docs/decisions/008 say so.

2. A non-git directory now says so

The scan still runs, because there are real files and the findings mean something. But git ls-files is unavailable, so .gitignore is not applied and node_modules or build output can be read as source. That caveat now sits above the score instead of nowhere. Carried on the fingerprint, so it reaches the JSON too.

3. The toolkit shipped ten files its own linter rejects

check_report.py:20 refuses and in generated documents. The toolkit shipped:

Dash Files
em 8, including plain-english-glossary.md (the file that defines the house style) and all 5 stack reference files
en 2 SKILL.md files

The 3.5.0 entry said em dashes were "gone from every skill, command and template." True of those three directories. references/ was never swept, and that is where most of the prose lives.

All ten fixed by hand, not by bulk replace: a first pass produced four comma splices and one meaning change in cloudflare-workers.md, all corrected. validate-toolkit.sh now enforces the rule, verified by adding a dash and watching it fail:

Validation failed: em or en dash in shipped text (house style uses plain punctuation): skills/boy-scout-cleanup/SKILL.md:93

The rule was previously enforced only on documents the tool generates, never on the documents it ships.

4. add-clean-code.sh --help was a dead end

Unknown option: --help, exit 64. The usage text already existed as a comment at lines 5 to 14 of the same file and was never printed. --help and -h now print it and exit 0; an unknown flag prints it too.

Test plan

  • 92 tests pass (was 86). Five new tests written failing first.
  • ./scripts/validate-toolkit.sh green, and proven to fail on an injected dash
  • --fail-on critical on this repo, exit 0
  • Empty dir refused with exit 2; non-git dir with files still runs and warns
  • add-clean-code.sh --help prints usage, exit 0
  • Version bumped in plugin.json and marketplace.json (x2), CHANGELOG entry written
  • CI green on this PR

Why this keeps happening, and what ends it

Each of these was a thing a machine could check on every commit, found instead by a person reading. Two of the four are now permanent gates (the dash rule in the validator, the empty-folder refusal in the test suite). That is the pattern worth generalizing in v3.6.0: a finding that becomes a gate never comes back, a finding that becomes a paragraph comes back next quarter.

…er rejects (3.5.2)

A DX audit of the toolkit itself. Four findings.

- An empty directory used to return "65/100, D, release blockers
  present" with four CRITICAL findings and never mention that it was
  empty. It now refuses and exits 2. BEHAVIOR CHANGE: a pipeline aimed
  at a path with no files used to exit 0. Decision 008.
- A directory that is not a git repository now carries a warning above
  the score, because .gitignore is not applied and build output can be
  read as source.
- Ten shipped files contained em or en dashes, which check_report.py
  rejects in generated docs. Includes plain-english-glossary.md and all
  five stack reference files. The 3.5.0 sweep covered skills, commands
  and templates but never references/. All ten fixed, and
  validate-toolkit.sh now enforces the rule so it cannot return.
- add-clean-code.sh --help printed "Unknown option: --help" and exited
  64, while the usage text sat unprinted in a comment at the top of the
  same file. It now prints, on --help and on a bad flag.

92 tests.
@coderabbitai

coderabbitai Bot commented Aug 22, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@tmoody1973, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 43 minutes

Limit details: You’ve used the included review currently available.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

Wait for the limit to reset, then comment @coderabbitai review or push new commits to the PR.

An organization admin can change what happens after included review limits in Billing.

How do review limits work?

CodeRabbit enforces per-developer PR review limits within each organization.

For paid Pro and Pro+ reviews, CodeRabbit uses a developer's included PR review attempts over the past 7 days to set the current hourly allowance. At typical activity levels, the full plan allowance applies. Higher sustained activity can lower the allowance until earlier attempts leave the 7-day window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: dd36c8cc-f1d6-4df1-8321-ceae5aa22427

📥 Commits

Reviewing files that changed from the base of the PR and between 80cae17 and 1256247.

📒 Files selected for processing (20)
  • .claude-plugin/marketplace.json
  • .claude-plugin/plugin.json
  • CHANGELOG.md
  • docs/decisions/008-refuse-to-grade-an-empty-folder.md
  • scripts/add-clean-code.sh
  • scripts/validate-toolkit.py
  • skills/boy-scout-cleanup/SKILL.md
  • skills/clean-code-review/SKILL.md
  • skills/clean-code-review/references/report-format.md
  • skills/clean-code-review/references/review-rubric.md
  • skills/prod-readiness-coach/references/plain-english-glossary.md
  • skills/prod-readiness-coach/references/stacks/cloudflare-workers.md
  • skills/prod-readiness-coach/references/stacks/convex.md
  • skills/prod-readiness-coach/references/stacks/fly.md
  • skills/prod-readiness-coach/references/stacks/netlify.md
  • skills/prod-readiness-coach/references/stacks/nextjs-vercel.md
  • skills/prod-readiness-coach/scripts/audit/fingerprint.py
  • skills/prod-readiness-coach/scripts/audit/report.py
  • skills/prod-readiness-coach/scripts/prod_audit.py
  • skills/prod-readiness-coach/tests/test_prod_audit.py

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@tmoody1973
tmoody1973 merged commit 42c7ee7 into main Aug 22, 2026
3 checks passed
@tmoody1973
tmoody1973 deleted the fix/v3.5.2-dx branch August 22, 2026 23:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant