feat(ms-ai-architect): Spor D steg 2 — score-skill CLI (--json/--gate/--skill) (TDD)
Byggekloss for både SessionStart-surfacing og lifecycle-gate (D3). - eval.mjs: ekstraher buildReport() (eksportert, testbar) ut av main() — samler hele korpus-rapporten (deterministisk + K10 + merget judge-cache). - lib/skill-score.mjs: formatScoreReport() (ren) — sortert forbedringsrapport med score, status, floored/provisional/ujudget-tags og ⚑gulv-markering. - score-skill.mjs (NY CLI): buildReport → scoreReport → render/json/gate. --skill scorer hele korpuset (K10 trenger alle søsken) men rapporterer/gater kun den valgte → inkrementell enkelt-skill-scoring for D3 lifecycle-gate. - docs/development.md: ny «Skill-kvalitetsscore (Spor D)»-seksjon. Live baseline: advisor 91, governance/security 96 (OK); engineering + infrastructure 89 (floored av K10-gulv) UNDER mål. Gate exit=1. Tester: kb-eval 134→142 (+8). validate 239, kb-update 316 uendret grønt. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
e87289d929
commit
c1a09062d4
5 changed files with 249 additions and 7 deletions
|
|
@ -249,3 +249,35 @@ export function scoreReport(report, opts = {}) {
|
|||
const below = scored.filter((s) => !s.meetsTarget);
|
||||
return { target, scored, below };
|
||||
}
|
||||
|
||||
/**
|
||||
* Render a human-readable quality report (pure). Each skill shows its score and
|
||||
* status; below-target skills list their sorted improvements (biggest weighted
|
||||
* loss first). Returns a multi-line string.
|
||||
* @param {{target: number, scored: object[]}} result scoreReport() output
|
||||
*/
|
||||
export function formatScoreReport(result) {
|
||||
const target = result?.target ?? TARGET;
|
||||
const scored = result?.scored || [];
|
||||
const below = scored.filter((s) => !s.meetsTarget);
|
||||
const lines = [];
|
||||
lines.push(`Skill-kvalitet — ${scored.length} skills, mål ≥${target} % (${below.length} under mål)`);
|
||||
lines.push('');
|
||||
for (const s of scored) {
|
||||
const tags = [];
|
||||
if (s.floored) tags.push('floored');
|
||||
if (s.provisional) tags.push('provisional');
|
||||
if (!s.judged) tags.push('ujudget');
|
||||
const status = s.meetsTarget ? 'OK' : 'UNDER MÅL';
|
||||
const tagStr = tags.length ? ` [${tags.join(', ')}]` : '';
|
||||
lines.push(`■ ${s.name} ${s.score}/100 ${status}${tagStr}`);
|
||||
if (!s.meetsTarget) {
|
||||
for (const imp of s.improvements) {
|
||||
const floor = imp.floor ? ' ⚑gulv' : '';
|
||||
lines.push(` ↳ ${imp.key} ${imp.label}${floor} (${imp.detail}) [-${imp.pointsLost.toFixed(2)}] → ${imp.fix}`);
|
||||
}
|
||||
}
|
||||
lines.push('');
|
||||
}
|
||||
return lines.join('\n');
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue