feat(ultraplan-local): v2.3.1 — qualified slug convention for cc-architect-catalog

Resolves v2.3.0 dogfood collision: skill-factory produced a
specialized hooks-pattern.md draft that would have overwritten the
generic seed. Qualified slugs let one feature host multiple named
patterns at different abstraction levels.

Slug convention: <cc_feature>[-<qualifier>]-<layer>.md. Unqualified =
canonical baseline. Qualified = sub-pattern (e.g., hooks-observability-
pattern.md) that does not displace the baseline.

Changes:
- SKILL.md: slug convention section, coverage-table qualified column,
  matcher logic for N patterns per feature, modification rules cover
  qualified-vs-canonical choice and collision handling.
- feature-matcher: catalog map is cc_feature -> {layer -> [skills]};
  selection rules (baseline by default, qualified when justified,
  multi-skill when non-overlapping); supporting_skill accepts list.
- gap-identifier: adds pattern_count[cc_feature] to coverage audit.
- architecture-critic: supporting-skill verification — every cited
  skill name must exist in the catalog (blocker severity).
- First qualified skill: hooks-observability-pattern.md (promoted from
  .drafts/, source ai-psychosis/README.md, ngram-overlap 0.01).
- Version bump 2.3.0 -> 2.3.1 across plugin.json, badges, table, root
  CLAUDE.md, CHANGELOG.

Non-breaking: existing unqualified slugs keep working, no cc_feature
taxonomy changes, hallucination gate unchanged.
This commit is contained in:
Kjell Tore Guttormsen 2026-04-18 17:53:55 +02:00
commit 4bbd17cbfa
11 changed files with 232 additions and 38 deletions

View file

@ -38,12 +38,16 @@ enough" notes. You do not propose architecture — only gaps.
### 1. Catalog audit
Read `{catalog_root}/SKILL.md` to learn the taxonomy + coverage table.
Glob `{catalog_root}/*.md` (excluding `SKILL.md`) and parse
frontmatter. Build:
Read `{catalog_root}/SKILL.md` to learn the taxonomy, slug convention
(`<feature>[-<qualifier>]-<layer>.md`), and coverage table. Glob
`{catalog_root}/*.md` (excluding `SKILL.md`) and parse frontmatter.
Build:
- `have[(cc_feature, layer)]` — set of (feature, layer) pairs with at
least one skill.
- `pattern_count[cc_feature]` — number of pattern-layer skills per
feature (useful signal for the audit; one baseline plus zero-or-more
qualified variants).
### 2. Read the brief + research
@ -111,7 +115,7 @@ They are not issues; they are informational.
### Catalog coverage audit
- Skills in catalog: N
- Features with reference: [list]
- Features with pattern: [list]
- Features with pattern: [list with (feature, pattern_count) when >1]
- Features with decision: [list]
- Features with no coverage: [list]