docs(humanizer): v5.1.0 release notes across plugin + marketplace docs

- Plugin README: add "What's New in v5.1.0" section with humanizer overview,
  before/after example, plain-language vocabulary table, --raw flag docs.
  Bump version badge 5.0.0 → 5.1.0. Add Version History row.
- Plugin CLAUDE.md: add humanizer.mjs + humanizer-data.mjs to Scanner Lib
  table. Add "Plain-Language Output (v5.1.0)" section documenting output
  modes, vocabularies, and Wave 5 lessons. Bump test count 635 → 792 across
  52 test files.
- Marketplace root README: bump config-audit entry 5.0.0 → 5.1.0, update
  one-line description to mention plain-language UX, add bullet for the
  v5.1.0 humanizer, bump test count 635+ → 792+.

Test-normalizer hardening (consequence of growing CLAUDE.md):
walkClaudeMdCascade walks upward from the marketplace-medium fixture into
this plugin's own CLAUDE.md, so any docs edit ripples into
`scanners[*].activeConfig.claudeMdEstimatedTokens`. The v5.0.0 byte-stability
contract is about scanner internals being unchanged, not ancestor input
content being frozen. Normalizers in json-backcompat, raw-backcompat,
posture-humanizer, scan-orchestrator-humanizer, and snapshot-default-output
now strip claudeMdEstimatedTokens to <ANCESTOR_DERIVED>. The
default-output snapshot for scan-orchestrator was re-seeded via
UPDATE_SNAPSHOT=1 (intent: Wave 6 docs additions; humanizer prose
unchanged).

Verify:
- grep -E "5\.1\.0|v5\.1\.0" README.md CLAUDE.md ../../README.md | wc -l = 12
- node --test 'tests/**/*.test.mjs' = 792/792 pass
- self-audit configGrade A (97), pluginGrade A (100), readmeCheck.passed true
This commit is contained in:
Kjell Tore Guttormsen 2026-05-01 20:35:24 +02:00
commit fc8808d6e4
9 changed files with 170 additions and 10 deletions

View file

@ -66,8 +66,21 @@ async function ensureDriftBaseline() {
// ---------------------------------------------------------------------------
// Normalizers — same as json-backcompat to keep the contracts aligned.
// `claudeMdEstimatedTokens` is stripped because walkClaudeMdCascade walks
// upward from the fixture into this plugin's own CLAUDE.md; any docs edit
// here ripples into it even when scanner internals are unchanged.
// ---------------------------------------------------------------------------
function stripAncestorDerived(envOrEnvelope) {
if (Array.isArray(envOrEnvelope?.scanners)) {
for (const s of envOrEnvelope.scanners) {
if (s?.activeConfig && 'claudeMdEstimatedTokens' in s.activeConfig) {
s.activeConfig.claudeMdEstimatedTokens = '<ANCESTOR_DERIVED>';
}
}
}
}
function normalizeScanOrchestrator(env) {
const out = JSON.parse(JSON.stringify(env));
if (out.meta) {
@ -79,6 +92,7 @@ function normalizeScanOrchestrator(env) {
s.duration_ms = 0;
}
}
stripAncestorDerived(out);
return out;
}
@ -94,6 +108,7 @@ function normalizePosture(p) {
s.duration_ms = 0;
}
}
stripAncestorDerived(out.scannerEnvelope);
}
return out;
}