New orchestrated scanner output-style-scanner.mjs — first new family since SKL. Three findings, each pinned to a CONFIRMED V-row of the steering-model plan + re-verified against code.claude.com/docs/en/output-styles: - CA-OST-001 (medium, V10): user/project custom style missing keep-coding-instructions:true (default false) → silently strips built-in software-engineering instructions when active. Scoped to user/project. - CA-OST-002 (low, V11): plugin style with force-for-plugin:true overrides the user's selected outputStyle. Verifiseringsplikt correction — the plan bullet said "project/user style," but force-for-plugin is plugin-styles-only per the docs, so the check keys on source==='plugin'. - CA-OST-003 (medium): settings outputStyle matching no built-in (Default/Explanatory/Learning/Proactive, case-insensitive) nor discovered custom style → dead config. Byte-stability — a scanner addition, not a field addition. Growing the scanners array + scanners_ok cannot be hidden by a field strip, but re-seeding frozen v5.0.0 (the SKL precedent) would now bake in B2's hotspot triple + claudeMd drift. So, per the B2 lesson, frozen v5.0.0 snapshots are PRESERVED and the OST entry is stripped at compare time via new tests/helpers/strip-added-scanner.mjs (wired into json/raw-backcompat + the Step 5/6 humanizer tests); only SC-5 default-output is regenerated (additive OST entry, diff reviewed). OST is fixture-gated (no output styles on marketplace-medium / hermetic HOME → silent). Wiring: orchestrator; humanizer (OST→Configuration mistake) + humanizer-data OST family (title-coupled); scoring (OST→Settings, keeps 10 areas). Suite 1012→1023 (+11). Badges: scanners 14, tests 1023, TRANSLATIONS families 15. Lore swept: README, CLAUDE.md, scanner-internals, humanizer.md. self-audit A/A. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2.6 KiB
2.6 KiB
Config-Audit — Plain-language output (v5.1.0)
Imported from CLAUDE.md via pointer.
Default output of all 18 commands routes through humanizeEnvelope from lib/humanizer.mjs. Findings are decorated with three additive fields and may have title/description/recommendation replaced when a translation exists.
Output modes
| Flag | Behavior |
|---|---|
| (default, no flag) | Plain-language: humanizer applied, findings group by user-impact, titles lead with prose. Self-audit terminal render also humanized. |
--raw |
Byte-stable v5.0.0 verbatim — humanizer bypassed, technical IDs and severity-only labels. For tooling that scrapes stderr from v5.0.0. |
--json |
Unchanged from v5.0.0 — humanizer bypassed, byte-stable JSON envelope. Always preferred for programmatic consumption over --raw. |
--output-file <path> |
Writes raw v5.0.0-shape JSON (humanizer bypassed). Posture-specific. |
--raw is threaded through every CLI: posture.mjs, scan-orchestrator.mjs, token-hotspots-cli.mjs, manifest.mjs, whats-active.mjs, fix-cli.mjs, drift-cli.mjs, self-audit.mjs.
Vocabularies
User-impact category (added to each finding as userImpactCategory, derived from scanner prefix):
| Label | Scanners |
|---|---|
| Configuration mistake | CML, SET, HKV, RUL, MCP, IMP, PLH, OST |
| Conflict | CNF, COL |
| Wasted tokens | TOK, CPS |
| Dead config | DIS |
| Missed opportunity | GAP |
Action language (added to each finding as userActionLanguage, derived from severity):
| Severity | Phrase |
|---|---|
| critical | Fix this now |
| high | Fix soon |
| medium | Fix when convenient |
| low | Optional cleanup |
| info | FYI |
Relevance context (added to each finding as relevanceContext, computed from finding's file path):
| Value | When |
|---|---|
test-fixture-no-impact |
Path contains /tests/fixtures/ or /test/fixtures/ |
affects-this-machine-only |
Basename matches *.local.* (e.g., settings.local.json) |
affects-everyone |
Default — assumed shared/committed config |
Wave 5 lessons
- Posture's stderr scorecard is rendered prose-side and is not part of the JSON envelope;
humanized.areas[].titleHumanizedreferenced by command templates lives only in the prose render. - Posture's
--output-filewrites raw v5.0.0-shape JSON becauseposture.mjsdoes not callhumanizeEnvelope. If session-files should later be humanized, posture needs its own humanize pass — out of v5.1.0 scope. - The default-output snapshot at
tests/snapshots/default-output/posture.jsonis frozen — change requiresUPDATE_SNAPSHOT=1plus intent confirmation.