10ff755649
Closes the 9 pre-existing name@source drifts that prevented strict mode: settings.json lists each marketplace plugin by machine name (e.g. "frontend-design@claude-plugins-official"), while Tooling Прил. Н describes them under a human/group name (e.g. "Frontend Design plugin", "Trail of Bits Skills" — single row #39 for 8 sub-plugins). Mechanism: - tools/.l1-watcher-aliases.txt — settings_name=tooling_substring map. - detectDrift(settings, tooling, aliases): direct match first, then alias-substring fallback. Settings name considered formalized if Tooling text includes either the name itself or aliases[name]. - parseAliases(raw) exported — line-based KV parser with #-comments and split-on-first-= semantics (values may contain "="). TDD: 6 new tests (3 detectDrift + 4 parseAliases). 12/12 GREEN. Smoke: node tools/l1-watcher.mjs -> exit 0, "OK — 0 drift". Known cosmetic baseline issue (pre-existing, not introduced here): the missingInSettings WARN list is noisy — regex /#\d+\s+([\w-]+(?:@[\w-]+)?)/g captures the first \w+ after "#NN" even when it is a plain word (e.g. "#1 PostgreSQL MCP" -> "PostgreSQL"), producing ~190 WARN entries. WARN is non-blocking, so strict mode flip in Phase 3 is unaffected; a follow-up filter on names containing "@" would silence this without behavioural change. Refs: ADR-011 brain governance §6.1 (C1 L1-watcher detector for the "plugin in settings.json without Tooling formalization" L1 pattern). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>