rigscore v2.0.0
- #rigscore
- #security
- #ai
- #devtools
- #open-source
- #breaking-change
- #v2
Changes: v1.0.0 → v2.0.0
Public-release hardening pass. Four parallel tracks — security, distribution, scoring, docs — plus a dogfood-fixture fix. The scoring change is the reason this is a major bump.
Breaking
- Continuous coverage scaling — the step at
totalApplicableWeight < 50is gone; scaling is nowscale = min(1, totalApplicableWeight / 100), applied always. Overall scores shift downward for projects with applicable weight 50–100; recalibrate--fail-underthresholds.
Security
- ANSI escape injection closed —
stripAnsiapplied to every file-sourced field before Chalk wrapping, blocking terminal-hijack payloads planted in scanned skill files - Atomic
saveState— state writes go to a temp file and arerename()’d in place, preventing SIGINT / concurrent-scan corruption - Strict config parsing —
ConfigParseError+readJsonStrict; the CLI exits2with a clear message instead of a raw Node stack - Symlink-loop defense — shared
walkDirSafewithlstat+ visited-inode set +maxDepth; aninfofinding surfaces once per skipped cycle - Network timeout + per-file cap —
fetchwrapped in a 5sAbortController; the deep scanner skips files over 512 KB windows-securitydesynced — synchronousexecSyncreplaced with the promisifiedexecSafe, no event-loop blocking
Distribution
- Lockfile regenerated — built against
package.json1.0.0;npm ciis reproducible again - Runtime + dev deps pinned to exact versions — caret ranges on
chalk,yaml,vitestgone; no re-resolving deps on every install engines.nodefloor →>=18.17.0—fs.promises.readdir({ recursive: true })guaranteed available- User-Agent derived from
package.json—createRequireat module load; no more hardcoded version drift --init-hookpins@v${pkg.version}— writes the current tag into.git/hooks/pre-commit; re-installs warn rather than append- CI matrix expanded — Node 18.17 / 20 / 22 across ubuntu and macos, with a lockfile-drift guard
- Dockerfile hardened — non-root
rigscoreuser runs the scan;ARG VERSION+ OCI labels; no longer reads/workspaceas root action.ymlstops swallowing crashes —2>/dev/null || trueremoved; validates callers pin to a semver tag, not@main
Docs
- README — Platform notes + Exit codes — WSL / macOS / Git Bash / Docker Desktop behaviour documented; CI authors can branch on exit codes
docs/FINDING_IDS.md— enumerates every emittedfindingId, documents the<check>/<slug>schema and stability contract- README — Advisory escalation, First run, Documentation sections — new
docs/TROUBLESHOOTING.md— newdocs/examples/starter governance templates — Cursor, Cline, Continue, Windsurf, Aider
Scoring & checks
claude-md→NOT_APPLICABLEon non-AI dirs — returnsNOT_APPLICABLE(notCRITICAL) with no AI tooling markers; a banner points to--include-home-skills; generic hygiene still scores- Narrowed
claude-mdanti-injection keyword — bareinjection(which gave “dependency injection” credit) rejected for specific prompt-injection patterns skill-files— defensive-context suppression in shell-exec — fixes false fires onDo not use curl http://; findings carry amatches: Ncount and escalate toCRITICALat ≥ 3deep-secrets— no blanket dotfile skip —config/.env.productionand similar now scanned;SKIP_DIRSextended with machine-generated dotfolders
Test hygiene
test/fixture-dogfood.test.jsscrubs.rigscore-state.jsonfrom the fixture dirbeforeEach/afterEach; fixture.gitignorelists the state file. A prior run’s per-user mode-0600 state file can no longer mask themcp-configcheck and drift the locked finding count.