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

@ -67,9 +67,24 @@ async function ensureDriftBaseline() {
}
// ---------------------------------------------------------------------------
// Normalizers — strip time / path fields that vary between runs.
// Normalizers — strip time / path / ancestor-derived fields that vary
// independently of scanner internals. `claudeMdEstimatedTokens` is computed
// by walking the FS cascade upward from the fixture; any edit to this
// plugin's own CLAUDE.md ripples into it, even though scanner behavior is
// unchanged. The byte-stability contract covers scanner output shape, not
// the size of ancestor input docs.
// ---------------------------------------------------------------------------
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) {
@ -81,6 +96,7 @@ function normalizeScanOrchestrator(env) {
s.duration_ms = 0;
}
}
stripAncestorDerived(out);
return out;
}
@ -96,6 +112,7 @@ function normalizePosture(p) {
s.duration_ms = 0;
}
}
stripAncestorDerived(out.scannerEnvelope);
}
return out;
}