v2.1.1 — Loop Closing (Truthful Score Lands)
🛡️ The shield loop closes — truthful score lands for users
v2.1.0 shipped the single-source scoreFafYaml fix in ChampionshipToolHandler, but server.ts still wired the legacy FafToolHandler with the 40+30+15+14 pseudo-score. WJTTC AERO Phase 2 caught it. v2.1.1 closes the loop — faf_score now calls faf-cli's real, IANA-spec scorer directly.
Fixed
faf_score— now calls faf-cli'sscoreFafYaml(IANA-spec scorer). Legacy file-presence pseudo-score retired on the live handler. Output reformatted:FAF SCORE: <n>/100 (<n>%) ● TIER+ canonical Unicode tier glyphs + progress bar + populated/total slots + next-tier hint. Banned medal/colored-circle ladder dead on this surface too.- Graceful invalid-.faf handling —
0/100 (0%) ○ INVALID/○ UNREADABLE/♡ no .fafwith diagnostics. No fake numbers, no crashes. - Node 18 ESM-from-CJS compat — dynamic-import bridge (temp workaround for faf-cli's broken
bunexports condition).
Tests
- WJTTC AERO Phase 2 — score-parity assertion tightened to TRUE parity: MCP
faf_scorenumeric == faf-cliscoreFafYaml(...).scoreon the same YAML. - 341 pass / 1 todo / 0 fail / 1336 expects — CI green across ubuntu/macOS/windows + Node 18+20.
FAF defines. MD instructs. AI codes.