", fix: "Rename with a descriptive, purpose-driven name (e.g., 'Header', 'ProductCard', 'Divider')", @@ -116,7 +116,7 @@ export const nonSemanticName = defineRule({ const inconsistentNamingConventionDef: RuleDefinition = { id: "inconsistent-naming-convention", name: "Inconsistent Naming Convention", - category: "minor", + category: "semantic", why: "Mixed naming conventions (camelCase + kebab-case + Title Case) at the same level confuse AI pattern recognition", impact: "AI generates inconsistent class/component names, making the codebase harder to maintain", fix: "Pick one convention for sibling elements (e.g., kebab-case: 'product-card', or PascalCase: 'ProductCard') — AI maps names to CSS classes and component names, so mixed conventions produce inconsistent code", @@ -195,7 +195,7 @@ export const inconsistentNamingConvention = defineRule({ const nonStandardNamingDef: RuleDefinition = { id: "non-standard-naming", name: "Non-Standard Naming", - category: "minor", + category: "semantic", why: "Non-standard state names prevent interaction rules from detecting state variants — AI cannot generate correct :hover/:active/:disabled styles", impact: "Interaction state detection fails, resulting in static UI with no state transitions", fix: "Use platform-standard state names: default, hover, active, pressed, selected, highlighted, disabled, enabled, focus, focused, dragged", diff --git a/src/core/rules/naming/non-semantic-name.test.ts b/src/core/rules/naming/non-semantic-name.test.ts index a3d1d8de..8e18b683 100644 --- a/src/core/rules/naming/non-semantic-name.test.ts +++ b/src/core/rules/naming/non-semantic-name.test.ts @@ -4,7 +4,7 @@ import { nonSemanticName } from "./index.js"; describe("non-semantic-name", () => { it("has correct rule definition metadata", () => { expect(nonSemanticName.definition.id).toBe("non-semantic-name"); - expect(nonSemanticName.definition.category).toBe("minor"); + expect(nonSemanticName.definition.category).toBe("semantic"); }); // Default name detection (merged from default-name) — exact subType per node type diff --git a/src/core/rules/naming/non-standard-naming.test.ts b/src/core/rules/naming/non-standard-naming.test.ts index 3022a5b0..6d68cca5 100644 --- a/src/core/rules/naming/non-standard-naming.test.ts +++ b/src/core/rules/naming/non-standard-naming.test.ts @@ -5,7 +5,7 @@ describe("non-standard-naming", () => { it("has correct rule definition metadata", () => { const def = nonStandardNaming.definition; expect(def.id).toBe("non-standard-naming"); - expect(def.category).toBe("minor"); + expect(def.category).toBe("semantic"); }); it("flags non-standard state name 'Clicked'", () => { diff --git a/src/core/rules/rule-config.ts b/src/core/rules/rule-config.ts index de88108e..3c917f76 100644 --- a/src/core/rules/rule-config.ts +++ b/src/core/rules/rule-config.ts @@ -8,7 +8,7 @@ import type { RuleConfig, RuleId } from "../contracts/rule.js"; * - responsive-critical: ΔV ≥ 15% at expanded viewport — size info critical for responsive * - code-quality: ΔV ≈ 0% but CSS classes -8~15 — affects code structure, not pixels * - token-management: raw values without design tokens — wrong input = wrong output - * - minor: ΔV < 2%, negligible code difference — naming and minor issues + * - semantic: ΔV < 2%, negligible code difference — naming and semantic issues */ export const RULE_ID_CATEGORY: Record = { // Pixel Critical @@ -29,21 +29,21 @@ export const RULE_ID_CATEGORY: Record = { // Interaction "missing-interaction-state": "interaction", "missing-prototype": "interaction", - // Minor - "non-standard-naming": "minor", - "non-semantic-name": "minor", - "inconsistent-naming-convention": "minor", + // Semantic + "non-standard-naming": "semantic", + "non-semantic-name": "semantic", + "inconsistent-naming-convention": "semantic", }; /** * Central configuration for all rules. - * Scores based on ablation experiment impact data (PR #149, #150): + * Scores based on ablation experiment + AI implementation interview (#200): * - pixel-critical: -10 ~ -7 (layout strip caused ΔV +5.4%) * - responsive-critical: -7 ~ -5 (size-constraints ΔV +15.9% at responsive viewports) - * - code-quality: -5 ~ -3 (CSS classes -8~15, no pixel impact) - * - token-management: -3 ~ -2 (wrong input = wrong output, but values still present) - * - interaction: -3 (data incomplete) - * - minor: -2 ~ -1 (ΔV < 2%, negligible) + * - code-quality: -7 ~ -3 (CSS classes -8~15, no pixel impact) + * - token-management: -5 ~ -3 (wrong input = wrong output, irregular spacing actively causes errors) + * - interaction: -5 (wrong guess > omission, interview confirmed) + * - semantic: -4 ~ -1 (non-semantic-name upgraded per interview — causes actual implementation errors) * * Category weights removed (#196) — overall score is simple average of categories. */ @@ -98,7 +98,7 @@ export const RULE_CONFIGS: Record = { }, "variant-structure-mismatch": { severity: "risk", - score: -4, + score: -6, enabled: true, }, "deep-nesting": { @@ -117,8 +117,8 @@ export const RULE_CONFIGS: Record = { enabled: true, }, "irregular-spacing": { - severity: "missing-info", - score: -2, + severity: "risk", + score: -5, enabled: true, options: { gridBase: 2, @@ -127,8 +127,8 @@ export const RULE_CONFIGS: Record = { // ── Interaction ── "missing-interaction-state": { - severity: "missing-info", - score: -3, + severity: "risk", + score: -5, enabled: true, }, "missing-prototype": { @@ -137,15 +137,15 @@ export const RULE_CONFIGS: Record = { enabled: false, // disabled: interactionDestinations data missing from fixtures (#139) }, - // ── Minor ── + // ── Semantic ── "non-standard-naming": { severity: "suggestion", score: -3, // higher than other naming rules: non-standard state names break interaction detection pipeline enabled: true, }, "non-semantic-name": { - severity: "suggestion", - score: -1, + severity: "risk", + score: -4, enabled: true, }, "inconsistent-naming-convention": { diff --git a/src/core/ui-constants.ts b/src/core/ui-constants.ts index 59115400..27d50141 100644 --- a/src/core/ui-constants.ts +++ b/src/core/ui-constants.ts @@ -22,7 +22,7 @@ export const CATEGORY_DESCRIPTIONS: Record = { "Design token binding for colors, fonts, shadows, opacity, spacing grid", "interaction": "State variants for interactive components — hover, disabled, active, focus", - "minor": + "semantic": "Semantic layer names, naming conventions, default names", };