feat(config-audit): remove TOK Pattern D detectSonnetEra (v5 F5)
Pattern D was the v4 sonnet-era signature: 'config is structurally clean but uses no Opus-4.7-specific features'. Two problems: - It triggered on any minimal config that happened to lack skills/MCP - The advice was generic and not actionable The hotspots ranking and per-pattern findings (A/B/C) cover the same ground with concrete, file-anchored signal. Dropping the noise. BREAKING (intentional): scanners no longer emit the sonnet-era info finding. Suppression entries and downstream tooling that reference the v4 finding ID should be updated. Doc sweep follows in Step 8b. Tests: sonnet-era fixture now asserts zero findings.
This commit is contained in:
parent
1486368a2b
commit
2810ee6f62
2 changed files with 16 additions and 43 deletions
|
|
@ -1,14 +1,18 @@
|
||||||
/**
|
/**
|
||||||
* TOK Scanner — Token Hotspots / Opus 4.7 patterns
|
* TOK Scanner — Token Hotspots / Opus 4.7 patterns
|
||||||
*
|
*
|
||||||
* Detects four structural Opus 4.7-era token-efficiency patterns:
|
* Detects three structural Opus 4.7-era token-efficiency patterns:
|
||||||
* CA-TOK-001 cache-breaking volatile top in CLAUDE.md (medium)
|
* CA-TOK-001 cache-breaking volatile top in CLAUDE.md (medium)
|
||||||
* CA-TOK-002 redundant tool/permission declarations (low)
|
* CA-TOK-002 redundant tool/permission declarations (low)
|
||||||
* CA-TOK-003 deep @import chain (>2 hops) (medium)
|
* CA-TOK-003 deep @import chain (>2 hops) (medium)
|
||||||
* CA-TOK-004 sonnet-era signature — clean config with no Opus 4.7 features (info)
|
*
|
||||||
|
* Note: the v4 sonnet-era signature pattern was removed in v5 F5 — too noisy
|
||||||
|
* and not actionable; live token costs are better surfaced by the hotspots
|
||||||
|
* ranking and per-pattern findings.
|
||||||
*
|
*
|
||||||
* Also ranks every discovered config source by estimated tokens and exposes
|
* Also ranks every discovered config source by estimated tokens and exposes
|
||||||
* a `hotspots` array (3–10 entries) on the scanner result.
|
* a `hotspots` array (≤10 entries, possibly fewer for tiny projects) on the
|
||||||
|
* scanner result.
|
||||||
*
|
*
|
||||||
* Pattern catalogue: knowledge/opus-4.7-patterns.md
|
* Pattern catalogue: knowledge/opus-4.7-patterns.md
|
||||||
* Token heuristic: estimateTokens() in scanners/lib/active-config-reader.mjs
|
* Token heuristic: estimateTokens() in scanners/lib/active-config-reader.mjs
|
||||||
|
|
@ -151,25 +155,6 @@ function detectRedundantPermissions(settings) {
|
||||||
return issues;
|
return issues;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Detect "sonnet-era" signature: the configuration is structurally clean
|
|
||||||
* but uses no Opus 4.7-specific features (no skills, no managed-settings,
|
|
||||||
* no plugin imports, no MCP servers, minimal hooks).
|
|
||||||
*/
|
|
||||||
function detectSonnetEra(discovery) {
|
|
||||||
const types = new Set(discovery.files.map(f => f.type));
|
|
||||||
const hasSkill = types.has('skill-md');
|
|
||||||
const hasMcp = types.has('mcp-json');
|
|
||||||
const hasHooks = types.has('hooks-json');
|
|
||||||
const hasManaged = discovery.files.some(f => f.scope === 'managed');
|
|
||||||
const hasPlugin = discovery.files.some(f => f.scope === 'plugin');
|
|
||||||
const hasClaudeMd = types.has('claude-md');
|
|
||||||
const hasSettings = types.has('settings-json');
|
|
||||||
// "Clean baseline" requires CLAUDE.md present; otherwise nothing to flag.
|
|
||||||
if (!hasClaudeMd) return false;
|
|
||||||
return !hasSkill && !hasMcp && !hasHooks && !hasManaged && !hasPlugin && hasSettings;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Build the ranked hotspots array.
|
* Build the ranked hotspots array.
|
||||||
*
|
*
|
||||||
|
|
@ -334,23 +319,6 @@ export async function scan(targetPath, discovery) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ── Pattern D: sonnet-era signature (info only) ──
|
|
||||||
if (detectSonnetEra(discovery)) {
|
|
||||||
findings.push(finding({
|
|
||||||
scanner: SCANNER,
|
|
||||||
severity: SEVERITY.info,
|
|
||||||
title: 'Sonnet-era configuration signature',
|
|
||||||
description:
|
|
||||||
'The configuration is structurally clean but does not yet leverage Opus 4.7-specific ' +
|
|
||||||
'features (no skills, no MCP servers, no plugins, no managed settings, minimal hooks). ' +
|
|
||||||
'Not a defect — a hint that token-efficiency-driven optimisations have not been applied.',
|
|
||||||
recommendation:
|
|
||||||
'Consider adopting Opus 4.7 features that fit the project: skills for shared workflows, ' +
|
|
||||||
'managed settings for cross-repo defaults, or MCP servers for external integrations.',
|
|
||||||
category: 'token-efficiency',
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
// ── Hotspots ranking ──
|
// ── Hotspots ranking ──
|
||||||
const hotspots = await buildHotspots(discovery, targetPath, activeConfig);
|
const hotspots = await buildHotspots(discovery, targetPath, activeConfig);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -87,15 +87,20 @@ describe('TOK scanner — opus-47/deep-imports', () => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('TOK scanner — opus-47/sonnet-era', () => {
|
describe('TOK scanner — opus-47/sonnet-era (v5 F5: Pattern D removed)', () => {
|
||||||
let result;
|
let result;
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
result = await runScanner('opus-47/sonnet-era');
|
result = await runScanner('opus-47/sonnet-era');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('emits no findings above info severity', () => {
|
it('emits zero findings (no Pattern D / CA-TOK-004 anymore)', () => {
|
||||||
const nonInfo = result.findings.filter(f => f.severity !== 'info');
|
assert.equal(result.findings.length, 0,
|
||||||
assert.equal(nonInfo.length, 0, `expected only info findings, got: ${nonInfo.map(f => f.id + '=' + f.severity).join(', ')}`);
|
`expected 0 findings on sonnet-era after F5, got: ${result.findings.map(f => f.id).join(', ')}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('never emits CA-TOK-004 (removed in v5)', () => {
|
||||||
|
assert.ok(result.findings.every(f => f.id !== 'CA-TOK-004'),
|
||||||
|
'expected no CA-TOK-004; removed in v5 F5');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue