config-audit/docs/humanizer.md
Kjell Tore Guttormsen e3b044a476 feat(ost): v5.6 C — output-style scanner (CA-OST, count 13→14)
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>
2026-06-20 21:02:44 +02:00

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[].titleHumanized referenced by command templates lives only in the prose render.
  • Posture's --output-file writes raw v5.0.0-shape JSON because posture.mjs does not call humanizeEnvelope. 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.json is frozen — change requires UPDATE_SNAPSHOT=1 plus intent confirmation.