diff --git a/.agents/skills/impeccable/reference/craft-floor.md b/.agents/skills/impeccable/reference/craft-floor.md index d9ced54e2..c6f3310f6 100644 --- a/.agents/skills/impeccable/reference/craft-floor.md +++ b/.agents/skills/impeccable/reference/craft-floor.md @@ -12,6 +12,7 @@ Each of these is a check on the built result, not an intention. Run them togethe - **Type:** body measure 65–75ch, display max 6rem, tracking floor -0.04em, balanced headings, obvious scale and weight steps. Run the real copy at every breakpoint and fix what overflows. - **Motion:** one authored moment, not scattered effects and not one identical entrance on every section. Exponential ease-out from an already-visible default. Reach past transform and opacity: blur, backdrop-filter, clip-path, mask, and shadow belong to the palette when they stay smooth. - **States:** hover, disabled, loading, error, empty. Plus real content, working controls, responsive composition, keyboard focus. +- **Browser surfaces:** the parts you did not draw still carry the design. Text selection, the caret, custom scrollbars, focus rings, underline offset, and the numerals in tabular data all ship with browser defaults that belong to no design system. Theme them from the palette. This is the cheapest signal that a page was built rather than assembled, and the one models skip most reliably. - **Copy:** the product's own language. Controls name their action; errors name the problem and the recovery. - **Coverage:** every brief requirement present and findable within seconds. diff --git a/.agents/skills/impeccable/scripts/lib/concept-catalog.mjs b/.agents/skills/impeccable/scripts/lib/concept-catalog.mjs index 9c20711ef..949594d0d 100644 --- a/.agents/skills/impeccable/scripts/lib/concept-catalog.mjs +++ b/.agents/skills/impeccable/scripts/lib/concept-catalog.mjs @@ -109,6 +109,18 @@ export function validateConceptEntry(concept, { existingForms = new Map(), axes || concept.tags.some(tag => typeof tag !== 'string' || !tag.trim())) { errors.push(`concept ${id} must have exactly three structural tags`); } + // The slop this world in particular is at risk of. Optional, because 541 + // entries predate it and none of them are wrong for lacking it. A world built + // from posters is at risk of shouting and one built from instruments is at + // risk of dead greys; a global detector cannot know which, and the author can. + if (concept?.avoid !== undefined) { + if (!Array.isArray(concept.avoid) + || concept.avoid.length < 2 + || concept.avoid.length > 3 + || concept.avoid.some(item => typeof item !== 'string' || item.trim().length < 12 || item.trim().length > 160)) { + errors.push(`concept ${id} avoid must be two or three negations of 12–160 characters`); + } + } if (!Array.isArray(concept?.system) || concept.system.length !== SYSTEM_PREFIXES.length || concept.system.some(rule => typeof rule !== 'string' || rule.trim().length < 12 || rule.trim().length > 180)) { diff --git a/.claude/skills/impeccable/reference/craft-floor.md b/.claude/skills/impeccable/reference/craft-floor.md index 408f2912e..93be921db 100644 --- a/.claude/skills/impeccable/reference/craft-floor.md +++ b/.claude/skills/impeccable/reference/craft-floor.md @@ -12,6 +12,7 @@ Each of these is a check on the built result, not an intention. Run them togethe - **Type:** body measure 65–75ch, display max 6rem, tracking floor -0.04em, balanced headings, obvious scale and weight steps. Run the real copy at every breakpoint and fix what overflows. - **Motion:** one authored moment, not scattered effects and not one identical entrance on every section. Exponential ease-out from an already-visible default. Reach past transform and opacity: blur, backdrop-filter, clip-path, mask, and shadow belong to the palette when they stay smooth. - **States:** hover, disabled, loading, error, empty. Plus real content, working controls, responsive composition, keyboard focus. +- **Browser surfaces:** the parts you did not draw still carry the design. Text selection, the caret, custom scrollbars, focus rings, underline offset, and the numerals in tabular data all ship with browser defaults that belong to no design system. Theme them from the palette. This is the cheapest signal that a page was built rather than assembled, and the one models skip most reliably. - **Copy:** the product's own language. Controls name their action; errors name the problem and the recovery. - **Coverage:** every brief requirement present and findable within seconds. diff --git a/.claude/skills/impeccable/scripts/lib/concept-catalog.mjs b/.claude/skills/impeccable/scripts/lib/concept-catalog.mjs index 9c20711ef..949594d0d 100644 --- a/.claude/skills/impeccable/scripts/lib/concept-catalog.mjs +++ b/.claude/skills/impeccable/scripts/lib/concept-catalog.mjs @@ -109,6 +109,18 @@ export function validateConceptEntry(concept, { existingForms = new Map(), axes || concept.tags.some(tag => typeof tag !== 'string' || !tag.trim())) { errors.push(`concept ${id} must have exactly three structural tags`); } + // The slop this world in particular is at risk of. Optional, because 541 + // entries predate it and none of them are wrong for lacking it. A world built + // from posters is at risk of shouting and one built from instruments is at + // risk of dead greys; a global detector cannot know which, and the author can. + if (concept?.avoid !== undefined) { + if (!Array.isArray(concept.avoid) + || concept.avoid.length < 2 + || concept.avoid.length > 3 + || concept.avoid.some(item => typeof item !== 'string' || item.trim().length < 12 || item.trim().length > 160)) { + errors.push(`concept ${id} avoid must be two or three negations of 12–160 characters`); + } + } if (!Array.isArray(concept?.system) || concept.system.length !== SYSTEM_PREFIXES.length || concept.system.some(rule => typeof rule !== 'string' || rule.trim().length < 12 || rule.trim().length > 180)) { diff --git a/.cursor/skills/impeccable/reference/craft-floor.md b/.cursor/skills/impeccable/reference/craft-floor.md index 408f2912e..93be921db 100644 --- a/.cursor/skills/impeccable/reference/craft-floor.md +++ b/.cursor/skills/impeccable/reference/craft-floor.md @@ -12,6 +12,7 @@ Each of these is a check on the built result, not an intention. Run them togethe - **Type:** body measure 65–75ch, display max 6rem, tracking floor -0.04em, balanced headings, obvious scale and weight steps. Run the real copy at every breakpoint and fix what overflows. - **Motion:** one authored moment, not scattered effects and not one identical entrance on every section. Exponential ease-out from an already-visible default. Reach past transform and opacity: blur, backdrop-filter, clip-path, mask, and shadow belong to the palette when they stay smooth. - **States:** hover, disabled, loading, error, empty. Plus real content, working controls, responsive composition, keyboard focus. +- **Browser surfaces:** the parts you did not draw still carry the design. Text selection, the caret, custom scrollbars, focus rings, underline offset, and the numerals in tabular data all ship with browser defaults that belong to no design system. Theme them from the palette. This is the cheapest signal that a page was built rather than assembled, and the one models skip most reliably. - **Copy:** the product's own language. Controls name their action; errors name the problem and the recovery. - **Coverage:** every brief requirement present and findable within seconds. diff --git a/.cursor/skills/impeccable/scripts/lib/concept-catalog.mjs b/.cursor/skills/impeccable/scripts/lib/concept-catalog.mjs index 9c20711ef..949594d0d 100644 --- a/.cursor/skills/impeccable/scripts/lib/concept-catalog.mjs +++ b/.cursor/skills/impeccable/scripts/lib/concept-catalog.mjs @@ -109,6 +109,18 @@ export function validateConceptEntry(concept, { existingForms = new Map(), axes || concept.tags.some(tag => typeof tag !== 'string' || !tag.trim())) { errors.push(`concept ${id} must have exactly three structural tags`); } + // The slop this world in particular is at risk of. Optional, because 541 + // entries predate it and none of them are wrong for lacking it. A world built + // from posters is at risk of shouting and one built from instruments is at + // risk of dead greys; a global detector cannot know which, and the author can. + if (concept?.avoid !== undefined) { + if (!Array.isArray(concept.avoid) + || concept.avoid.length < 2 + || concept.avoid.length > 3 + || concept.avoid.some(item => typeof item !== 'string' || item.trim().length < 12 || item.trim().length > 160)) { + errors.push(`concept ${id} avoid must be two or three negations of 12–160 characters`); + } + } if (!Array.isArray(concept?.system) || concept.system.length !== SYSTEM_PREFIXES.length || concept.system.some(rule => typeof rule !== 'string' || rule.trim().length < 12 || rule.trim().length > 180)) { diff --git a/.gemini/skills/impeccable/reference/craft-floor.md b/.gemini/skills/impeccable/reference/craft-floor.md index 5f298f8f5..87381765f 100644 --- a/.gemini/skills/impeccable/reference/craft-floor.md +++ b/.gemini/skills/impeccable/reference/craft-floor.md @@ -12,6 +12,7 @@ Each of these is a check on the built result, not an intention. Run them togethe - **Type:** body measure 65–75ch, display max 6rem, tracking floor -0.04em, balanced headings, obvious scale and weight steps. Run the real copy at every breakpoint and fix what overflows. - **Motion:** one authored moment, not scattered effects and not one identical entrance on every section. Exponential ease-out from an already-visible default. Reach past transform and opacity: blur, backdrop-filter, clip-path, mask, and shadow belong to the palette when they stay smooth. - **States:** hover, disabled, loading, error, empty. Plus real content, working controls, responsive composition, keyboard focus. +- **Browser surfaces:** the parts you did not draw still carry the design. Text selection, the caret, custom scrollbars, focus rings, underline offset, and the numerals in tabular data all ship with browser defaults that belong to no design system. Theme them from the palette. This is the cheapest signal that a page was built rather than assembled, and the one models skip most reliably. - **Copy:** the product's own language. Controls name their action; errors name the problem and the recovery. - **Coverage:** every brief requirement present and findable within seconds. diff --git a/.gemini/skills/impeccable/scripts/lib/concept-catalog.mjs b/.gemini/skills/impeccable/scripts/lib/concept-catalog.mjs index 9c20711ef..949594d0d 100644 --- a/.gemini/skills/impeccable/scripts/lib/concept-catalog.mjs +++ b/.gemini/skills/impeccable/scripts/lib/concept-catalog.mjs @@ -109,6 +109,18 @@ export function validateConceptEntry(concept, { existingForms = new Map(), axes || concept.tags.some(tag => typeof tag !== 'string' || !tag.trim())) { errors.push(`concept ${id} must have exactly three structural tags`); } + // The slop this world in particular is at risk of. Optional, because 541 + // entries predate it and none of them are wrong for lacking it. A world built + // from posters is at risk of shouting and one built from instruments is at + // risk of dead greys; a global detector cannot know which, and the author can. + if (concept?.avoid !== undefined) { + if (!Array.isArray(concept.avoid) + || concept.avoid.length < 2 + || concept.avoid.length > 3 + || concept.avoid.some(item => typeof item !== 'string' || item.trim().length < 12 || item.trim().length > 160)) { + errors.push(`concept ${id} avoid must be two or three negations of 12–160 characters`); + } + } if (!Array.isArray(concept?.system) || concept.system.length !== SYSTEM_PREFIXES.length || concept.system.some(rule => typeof rule !== 'string' || rule.trim().length < 12 || rule.trim().length > 180)) { diff --git a/.github/skills/impeccable/reference/craft-floor.md b/.github/skills/impeccable/reference/craft-floor.md index 408f2912e..93be921db 100644 --- a/.github/skills/impeccable/reference/craft-floor.md +++ b/.github/skills/impeccable/reference/craft-floor.md @@ -12,6 +12,7 @@ Each of these is a check on the built result, not an intention. Run them togethe - **Type:** body measure 65–75ch, display max 6rem, tracking floor -0.04em, balanced headings, obvious scale and weight steps. Run the real copy at every breakpoint and fix what overflows. - **Motion:** one authored moment, not scattered effects and not one identical entrance on every section. Exponential ease-out from an already-visible default. Reach past transform and opacity: blur, backdrop-filter, clip-path, mask, and shadow belong to the palette when they stay smooth. - **States:** hover, disabled, loading, error, empty. Plus real content, working controls, responsive composition, keyboard focus. +- **Browser surfaces:** the parts you did not draw still carry the design. Text selection, the caret, custom scrollbars, focus rings, underline offset, and the numerals in tabular data all ship with browser defaults that belong to no design system. Theme them from the palette. This is the cheapest signal that a page was built rather than assembled, and the one models skip most reliably. - **Copy:** the product's own language. Controls name their action; errors name the problem and the recovery. - **Coverage:** every brief requirement present and findable within seconds. diff --git a/.github/skills/impeccable/scripts/lib/concept-catalog.mjs b/.github/skills/impeccable/scripts/lib/concept-catalog.mjs index 9c20711ef..949594d0d 100644 --- a/.github/skills/impeccable/scripts/lib/concept-catalog.mjs +++ b/.github/skills/impeccable/scripts/lib/concept-catalog.mjs @@ -109,6 +109,18 @@ export function validateConceptEntry(concept, { existingForms = new Map(), axes || concept.tags.some(tag => typeof tag !== 'string' || !tag.trim())) { errors.push(`concept ${id} must have exactly three structural tags`); } + // The slop this world in particular is at risk of. Optional, because 541 + // entries predate it and none of them are wrong for lacking it. A world built + // from posters is at risk of shouting and one built from instruments is at + // risk of dead greys; a global detector cannot know which, and the author can. + if (concept?.avoid !== undefined) { + if (!Array.isArray(concept.avoid) + || concept.avoid.length < 2 + || concept.avoid.length > 3 + || concept.avoid.some(item => typeof item !== 'string' || item.trim().length < 12 || item.trim().length > 160)) { + errors.push(`concept ${id} avoid must be two or three negations of 12–160 characters`); + } + } if (!Array.isArray(concept?.system) || concept.system.length !== SYSTEM_PREFIXES.length || concept.system.some(rule => typeof rule !== 'string' || rule.trim().length < 12 || rule.trim().length > 180)) { diff --git a/.grok/skills/impeccable/reference/craft-floor.md b/.grok/skills/impeccable/reference/craft-floor.md index 408f2912e..93be921db 100644 --- a/.grok/skills/impeccable/reference/craft-floor.md +++ b/.grok/skills/impeccable/reference/craft-floor.md @@ -12,6 +12,7 @@ Each of these is a check on the built result, not an intention. Run them togethe - **Type:** body measure 65–75ch, display max 6rem, tracking floor -0.04em, balanced headings, obvious scale and weight steps. Run the real copy at every breakpoint and fix what overflows. - **Motion:** one authored moment, not scattered effects and not one identical entrance on every section. Exponential ease-out from an already-visible default. Reach past transform and opacity: blur, backdrop-filter, clip-path, mask, and shadow belong to the palette when they stay smooth. - **States:** hover, disabled, loading, error, empty. Plus real content, working controls, responsive composition, keyboard focus. +- **Browser surfaces:** the parts you did not draw still carry the design. Text selection, the caret, custom scrollbars, focus rings, underline offset, and the numerals in tabular data all ship with browser defaults that belong to no design system. Theme them from the palette. This is the cheapest signal that a page was built rather than assembled, and the one models skip most reliably. - **Copy:** the product's own language. Controls name their action; errors name the problem and the recovery. - **Coverage:** every brief requirement present and findable within seconds. diff --git a/.grok/skills/impeccable/scripts/lib/concept-catalog.mjs b/.grok/skills/impeccable/scripts/lib/concept-catalog.mjs index 9c20711ef..949594d0d 100644 --- a/.grok/skills/impeccable/scripts/lib/concept-catalog.mjs +++ b/.grok/skills/impeccable/scripts/lib/concept-catalog.mjs @@ -109,6 +109,18 @@ export function validateConceptEntry(concept, { existingForms = new Map(), axes || concept.tags.some(tag => typeof tag !== 'string' || !tag.trim())) { errors.push(`concept ${id} must have exactly three structural tags`); } + // The slop this world in particular is at risk of. Optional, because 541 + // entries predate it and none of them are wrong for lacking it. A world built + // from posters is at risk of shouting and one built from instruments is at + // risk of dead greys; a global detector cannot know which, and the author can. + if (concept?.avoid !== undefined) { + if (!Array.isArray(concept.avoid) + || concept.avoid.length < 2 + || concept.avoid.length > 3 + || concept.avoid.some(item => typeof item !== 'string' || item.trim().length < 12 || item.trim().length > 160)) { + errors.push(`concept ${id} avoid must be two or three negations of 12–160 characters`); + } + } if (!Array.isArray(concept?.system) || concept.system.length !== SYSTEM_PREFIXES.length || concept.system.some(rule => typeof rule !== 'string' || rule.trim().length < 12 || rule.trim().length > 180)) { diff --git a/.kiro/skills/impeccable/reference/craft-floor.md b/.kiro/skills/impeccable/reference/craft-floor.md index 408f2912e..93be921db 100644 --- a/.kiro/skills/impeccable/reference/craft-floor.md +++ b/.kiro/skills/impeccable/reference/craft-floor.md @@ -12,6 +12,7 @@ Each of these is a check on the built result, not an intention. Run them togethe - **Type:** body measure 65–75ch, display max 6rem, tracking floor -0.04em, balanced headings, obvious scale and weight steps. Run the real copy at every breakpoint and fix what overflows. - **Motion:** one authored moment, not scattered effects and not one identical entrance on every section. Exponential ease-out from an already-visible default. Reach past transform and opacity: blur, backdrop-filter, clip-path, mask, and shadow belong to the palette when they stay smooth. - **States:** hover, disabled, loading, error, empty. Plus real content, working controls, responsive composition, keyboard focus. +- **Browser surfaces:** the parts you did not draw still carry the design. Text selection, the caret, custom scrollbars, focus rings, underline offset, and the numerals in tabular data all ship with browser defaults that belong to no design system. Theme them from the palette. This is the cheapest signal that a page was built rather than assembled, and the one models skip most reliably. - **Copy:** the product's own language. Controls name their action; errors name the problem and the recovery. - **Coverage:** every brief requirement present and findable within seconds. diff --git a/.kiro/skills/impeccable/scripts/lib/concept-catalog.mjs b/.kiro/skills/impeccable/scripts/lib/concept-catalog.mjs index 9c20711ef..949594d0d 100644 --- a/.kiro/skills/impeccable/scripts/lib/concept-catalog.mjs +++ b/.kiro/skills/impeccable/scripts/lib/concept-catalog.mjs @@ -109,6 +109,18 @@ export function validateConceptEntry(concept, { existingForms = new Map(), axes || concept.tags.some(tag => typeof tag !== 'string' || !tag.trim())) { errors.push(`concept ${id} must have exactly three structural tags`); } + // The slop this world in particular is at risk of. Optional, because 541 + // entries predate it and none of them are wrong for lacking it. A world built + // from posters is at risk of shouting and one built from instruments is at + // risk of dead greys; a global detector cannot know which, and the author can. + if (concept?.avoid !== undefined) { + if (!Array.isArray(concept.avoid) + || concept.avoid.length < 2 + || concept.avoid.length > 3 + || concept.avoid.some(item => typeof item !== 'string' || item.trim().length < 12 || item.trim().length > 160)) { + errors.push(`concept ${id} avoid must be two or three negations of 12–160 characters`); + } + } if (!Array.isArray(concept?.system) || concept.system.length !== SYSTEM_PREFIXES.length || concept.system.some(rule => typeof rule !== 'string' || rule.trim().length < 12 || rule.trim().length > 180)) { diff --git a/.opencode/skills/impeccable/reference/craft-floor.md b/.opencode/skills/impeccable/reference/craft-floor.md index 408f2912e..93be921db 100644 --- a/.opencode/skills/impeccable/reference/craft-floor.md +++ b/.opencode/skills/impeccable/reference/craft-floor.md @@ -12,6 +12,7 @@ Each of these is a check on the built result, not an intention. Run them togethe - **Type:** body measure 65–75ch, display max 6rem, tracking floor -0.04em, balanced headings, obvious scale and weight steps. Run the real copy at every breakpoint and fix what overflows. - **Motion:** one authored moment, not scattered effects and not one identical entrance on every section. Exponential ease-out from an already-visible default. Reach past transform and opacity: blur, backdrop-filter, clip-path, mask, and shadow belong to the palette when they stay smooth. - **States:** hover, disabled, loading, error, empty. Plus real content, working controls, responsive composition, keyboard focus. +- **Browser surfaces:** the parts you did not draw still carry the design. Text selection, the caret, custom scrollbars, focus rings, underline offset, and the numerals in tabular data all ship with browser defaults that belong to no design system. Theme them from the palette. This is the cheapest signal that a page was built rather than assembled, and the one models skip most reliably. - **Copy:** the product's own language. Controls name their action; errors name the problem and the recovery. - **Coverage:** every brief requirement present and findable within seconds. diff --git a/.opencode/skills/impeccable/scripts/lib/concept-catalog.mjs b/.opencode/skills/impeccable/scripts/lib/concept-catalog.mjs index 9c20711ef..949594d0d 100644 --- a/.opencode/skills/impeccable/scripts/lib/concept-catalog.mjs +++ b/.opencode/skills/impeccable/scripts/lib/concept-catalog.mjs @@ -109,6 +109,18 @@ export function validateConceptEntry(concept, { existingForms = new Map(), axes || concept.tags.some(tag => typeof tag !== 'string' || !tag.trim())) { errors.push(`concept ${id} must have exactly three structural tags`); } + // The slop this world in particular is at risk of. Optional, because 541 + // entries predate it and none of them are wrong for lacking it. A world built + // from posters is at risk of shouting and one built from instruments is at + // risk of dead greys; a global detector cannot know which, and the author can. + if (concept?.avoid !== undefined) { + if (!Array.isArray(concept.avoid) + || concept.avoid.length < 2 + || concept.avoid.length > 3 + || concept.avoid.some(item => typeof item !== 'string' || item.trim().length < 12 || item.trim().length > 160)) { + errors.push(`concept ${id} avoid must be two or three negations of 12–160 characters`); + } + } if (!Array.isArray(concept?.system) || concept.system.length !== SYSTEM_PREFIXES.length || concept.system.some(rule => typeof rule !== 'string' || rule.trim().length < 12 || rule.trim().length > 180)) { diff --git a/.pi/skills/impeccable/reference/craft-floor.md b/.pi/skills/impeccable/reference/craft-floor.md index 408f2912e..93be921db 100644 --- a/.pi/skills/impeccable/reference/craft-floor.md +++ b/.pi/skills/impeccable/reference/craft-floor.md @@ -12,6 +12,7 @@ Each of these is a check on the built result, not an intention. Run them togethe - **Type:** body measure 65–75ch, display max 6rem, tracking floor -0.04em, balanced headings, obvious scale and weight steps. Run the real copy at every breakpoint and fix what overflows. - **Motion:** one authored moment, not scattered effects and not one identical entrance on every section. Exponential ease-out from an already-visible default. Reach past transform and opacity: blur, backdrop-filter, clip-path, mask, and shadow belong to the palette when they stay smooth. - **States:** hover, disabled, loading, error, empty. Plus real content, working controls, responsive composition, keyboard focus. +- **Browser surfaces:** the parts you did not draw still carry the design. Text selection, the caret, custom scrollbars, focus rings, underline offset, and the numerals in tabular data all ship with browser defaults that belong to no design system. Theme them from the palette. This is the cheapest signal that a page was built rather than assembled, and the one models skip most reliably. - **Copy:** the product's own language. Controls name their action; errors name the problem and the recovery. - **Coverage:** every brief requirement present and findable within seconds. diff --git a/.pi/skills/impeccable/scripts/lib/concept-catalog.mjs b/.pi/skills/impeccable/scripts/lib/concept-catalog.mjs index 9c20711ef..949594d0d 100644 --- a/.pi/skills/impeccable/scripts/lib/concept-catalog.mjs +++ b/.pi/skills/impeccable/scripts/lib/concept-catalog.mjs @@ -109,6 +109,18 @@ export function validateConceptEntry(concept, { existingForms = new Map(), axes || concept.tags.some(tag => typeof tag !== 'string' || !tag.trim())) { errors.push(`concept ${id} must have exactly three structural tags`); } + // The slop this world in particular is at risk of. Optional, because 541 + // entries predate it and none of them are wrong for lacking it. A world built + // from posters is at risk of shouting and one built from instruments is at + // risk of dead greys; a global detector cannot know which, and the author can. + if (concept?.avoid !== undefined) { + if (!Array.isArray(concept.avoid) + || concept.avoid.length < 2 + || concept.avoid.length > 3 + || concept.avoid.some(item => typeof item !== 'string' || item.trim().length < 12 || item.trim().length > 160)) { + errors.push(`concept ${id} avoid must be two or three negations of 12–160 characters`); + } + } if (!Array.isArray(concept?.system) || concept.system.length !== SYSTEM_PREFIXES.length || concept.system.some(rule => typeof rule !== 'string' || rule.trim().length < 12 || rule.trim().length > 180)) { diff --git a/.qoder/skills/impeccable/reference/craft-floor.md b/.qoder/skills/impeccable/reference/craft-floor.md index 408f2912e..93be921db 100644 --- a/.qoder/skills/impeccable/reference/craft-floor.md +++ b/.qoder/skills/impeccable/reference/craft-floor.md @@ -12,6 +12,7 @@ Each of these is a check on the built result, not an intention. Run them togethe - **Type:** body measure 65–75ch, display max 6rem, tracking floor -0.04em, balanced headings, obvious scale and weight steps. Run the real copy at every breakpoint and fix what overflows. - **Motion:** one authored moment, not scattered effects and not one identical entrance on every section. Exponential ease-out from an already-visible default. Reach past transform and opacity: blur, backdrop-filter, clip-path, mask, and shadow belong to the palette when they stay smooth. - **States:** hover, disabled, loading, error, empty. Plus real content, working controls, responsive composition, keyboard focus. +- **Browser surfaces:** the parts you did not draw still carry the design. Text selection, the caret, custom scrollbars, focus rings, underline offset, and the numerals in tabular data all ship with browser defaults that belong to no design system. Theme them from the palette. This is the cheapest signal that a page was built rather than assembled, and the one models skip most reliably. - **Copy:** the product's own language. Controls name their action; errors name the problem and the recovery. - **Coverage:** every brief requirement present and findable within seconds. diff --git a/.qoder/skills/impeccable/scripts/lib/concept-catalog.mjs b/.qoder/skills/impeccable/scripts/lib/concept-catalog.mjs index 9c20711ef..949594d0d 100644 --- a/.qoder/skills/impeccable/scripts/lib/concept-catalog.mjs +++ b/.qoder/skills/impeccable/scripts/lib/concept-catalog.mjs @@ -109,6 +109,18 @@ export function validateConceptEntry(concept, { existingForms = new Map(), axes || concept.tags.some(tag => typeof tag !== 'string' || !tag.trim())) { errors.push(`concept ${id} must have exactly three structural tags`); } + // The slop this world in particular is at risk of. Optional, because 541 + // entries predate it and none of them are wrong for lacking it. A world built + // from posters is at risk of shouting and one built from instruments is at + // risk of dead greys; a global detector cannot know which, and the author can. + if (concept?.avoid !== undefined) { + if (!Array.isArray(concept.avoid) + || concept.avoid.length < 2 + || concept.avoid.length > 3 + || concept.avoid.some(item => typeof item !== 'string' || item.trim().length < 12 || item.trim().length > 160)) { + errors.push(`concept ${id} avoid must be two or three negations of 12–160 characters`); + } + } if (!Array.isArray(concept?.system) || concept.system.length !== SYSTEM_PREFIXES.length || concept.system.some(rule => typeof rule !== 'string' || rule.trim().length < 12 || rule.trim().length > 180)) { diff --git a/.rovodev/skills/impeccable/reference/craft-floor.md b/.rovodev/skills/impeccable/reference/craft-floor.md index 408f2912e..93be921db 100644 --- a/.rovodev/skills/impeccable/reference/craft-floor.md +++ b/.rovodev/skills/impeccable/reference/craft-floor.md @@ -12,6 +12,7 @@ Each of these is a check on the built result, not an intention. Run them togethe - **Type:** body measure 65–75ch, display max 6rem, tracking floor -0.04em, balanced headings, obvious scale and weight steps. Run the real copy at every breakpoint and fix what overflows. - **Motion:** one authored moment, not scattered effects and not one identical entrance on every section. Exponential ease-out from an already-visible default. Reach past transform and opacity: blur, backdrop-filter, clip-path, mask, and shadow belong to the palette when they stay smooth. - **States:** hover, disabled, loading, error, empty. Plus real content, working controls, responsive composition, keyboard focus. +- **Browser surfaces:** the parts you did not draw still carry the design. Text selection, the caret, custom scrollbars, focus rings, underline offset, and the numerals in tabular data all ship with browser defaults that belong to no design system. Theme them from the palette. This is the cheapest signal that a page was built rather than assembled, and the one models skip most reliably. - **Copy:** the product's own language. Controls name their action; errors name the problem and the recovery. - **Coverage:** every brief requirement present and findable within seconds. diff --git a/.rovodev/skills/impeccable/scripts/lib/concept-catalog.mjs b/.rovodev/skills/impeccable/scripts/lib/concept-catalog.mjs index 9c20711ef..949594d0d 100644 --- a/.rovodev/skills/impeccable/scripts/lib/concept-catalog.mjs +++ b/.rovodev/skills/impeccable/scripts/lib/concept-catalog.mjs @@ -109,6 +109,18 @@ export function validateConceptEntry(concept, { existingForms = new Map(), axes || concept.tags.some(tag => typeof tag !== 'string' || !tag.trim())) { errors.push(`concept ${id} must have exactly three structural tags`); } + // The slop this world in particular is at risk of. Optional, because 541 + // entries predate it and none of them are wrong for lacking it. A world built + // from posters is at risk of shouting and one built from instruments is at + // risk of dead greys; a global detector cannot know which, and the author can. + if (concept?.avoid !== undefined) { + if (!Array.isArray(concept.avoid) + || concept.avoid.length < 2 + || concept.avoid.length > 3 + || concept.avoid.some(item => typeof item !== 'string' || item.trim().length < 12 || item.trim().length > 160)) { + errors.push(`concept ${id} avoid must be two or three negations of 12–160 characters`); + } + } if (!Array.isArray(concept?.system) || concept.system.length !== SYSTEM_PREFIXES.length || concept.system.some(rule => typeof rule !== 'string' || rule.trim().length < 12 || rule.trim().length > 180)) { diff --git a/.trae-cn/skills/impeccable/reference/craft-floor.md b/.trae-cn/skills/impeccable/reference/craft-floor.md index 408f2912e..93be921db 100644 --- a/.trae-cn/skills/impeccable/reference/craft-floor.md +++ b/.trae-cn/skills/impeccable/reference/craft-floor.md @@ -12,6 +12,7 @@ Each of these is a check on the built result, not an intention. Run them togethe - **Type:** body measure 65–75ch, display max 6rem, tracking floor -0.04em, balanced headings, obvious scale and weight steps. Run the real copy at every breakpoint and fix what overflows. - **Motion:** one authored moment, not scattered effects and not one identical entrance on every section. Exponential ease-out from an already-visible default. Reach past transform and opacity: blur, backdrop-filter, clip-path, mask, and shadow belong to the palette when they stay smooth. - **States:** hover, disabled, loading, error, empty. Plus real content, working controls, responsive composition, keyboard focus. +- **Browser surfaces:** the parts you did not draw still carry the design. Text selection, the caret, custom scrollbars, focus rings, underline offset, and the numerals in tabular data all ship with browser defaults that belong to no design system. Theme them from the palette. This is the cheapest signal that a page was built rather than assembled, and the one models skip most reliably. - **Copy:** the product's own language. Controls name their action; errors name the problem and the recovery. - **Coverage:** every brief requirement present and findable within seconds. diff --git a/.trae-cn/skills/impeccable/scripts/lib/concept-catalog.mjs b/.trae-cn/skills/impeccable/scripts/lib/concept-catalog.mjs index 9c20711ef..949594d0d 100644 --- a/.trae-cn/skills/impeccable/scripts/lib/concept-catalog.mjs +++ b/.trae-cn/skills/impeccable/scripts/lib/concept-catalog.mjs @@ -109,6 +109,18 @@ export function validateConceptEntry(concept, { existingForms = new Map(), axes || concept.tags.some(tag => typeof tag !== 'string' || !tag.trim())) { errors.push(`concept ${id} must have exactly three structural tags`); } + // The slop this world in particular is at risk of. Optional, because 541 + // entries predate it and none of them are wrong for lacking it. A world built + // from posters is at risk of shouting and one built from instruments is at + // risk of dead greys; a global detector cannot know which, and the author can. + if (concept?.avoid !== undefined) { + if (!Array.isArray(concept.avoid) + || concept.avoid.length < 2 + || concept.avoid.length > 3 + || concept.avoid.some(item => typeof item !== 'string' || item.trim().length < 12 || item.trim().length > 160)) { + errors.push(`concept ${id} avoid must be two or three negations of 12–160 characters`); + } + } if (!Array.isArray(concept?.system) || concept.system.length !== SYSTEM_PREFIXES.length || concept.system.some(rule => typeof rule !== 'string' || rule.trim().length < 12 || rule.trim().length > 180)) { diff --git a/.trae/skills/impeccable/reference/craft-floor.md b/.trae/skills/impeccable/reference/craft-floor.md index 408f2912e..93be921db 100644 --- a/.trae/skills/impeccable/reference/craft-floor.md +++ b/.trae/skills/impeccable/reference/craft-floor.md @@ -12,6 +12,7 @@ Each of these is a check on the built result, not an intention. Run them togethe - **Type:** body measure 65–75ch, display max 6rem, tracking floor -0.04em, balanced headings, obvious scale and weight steps. Run the real copy at every breakpoint and fix what overflows. - **Motion:** one authored moment, not scattered effects and not one identical entrance on every section. Exponential ease-out from an already-visible default. Reach past transform and opacity: blur, backdrop-filter, clip-path, mask, and shadow belong to the palette when they stay smooth. - **States:** hover, disabled, loading, error, empty. Plus real content, working controls, responsive composition, keyboard focus. +- **Browser surfaces:** the parts you did not draw still carry the design. Text selection, the caret, custom scrollbars, focus rings, underline offset, and the numerals in tabular data all ship with browser defaults that belong to no design system. Theme them from the palette. This is the cheapest signal that a page was built rather than assembled, and the one models skip most reliably. - **Copy:** the product's own language. Controls name their action; errors name the problem and the recovery. - **Coverage:** every brief requirement present and findable within seconds. diff --git a/.trae/skills/impeccable/scripts/lib/concept-catalog.mjs b/.trae/skills/impeccable/scripts/lib/concept-catalog.mjs index 9c20711ef..949594d0d 100644 --- a/.trae/skills/impeccable/scripts/lib/concept-catalog.mjs +++ b/.trae/skills/impeccable/scripts/lib/concept-catalog.mjs @@ -109,6 +109,18 @@ export function validateConceptEntry(concept, { existingForms = new Map(), axes || concept.tags.some(tag => typeof tag !== 'string' || !tag.trim())) { errors.push(`concept ${id} must have exactly three structural tags`); } + // The slop this world in particular is at risk of. Optional, because 541 + // entries predate it and none of them are wrong for lacking it. A world built + // from posters is at risk of shouting and one built from instruments is at + // risk of dead greys; a global detector cannot know which, and the author can. + if (concept?.avoid !== undefined) { + if (!Array.isArray(concept.avoid) + || concept.avoid.length < 2 + || concept.avoid.length > 3 + || concept.avoid.some(item => typeof item !== 'string' || item.trim().length < 12 || item.trim().length > 160)) { + errors.push(`concept ${id} avoid must be two or three negations of 12–160 characters`); + } + } if (!Array.isArray(concept?.system) || concept.system.length !== SYSTEM_PREFIXES.length || concept.system.some(rule => typeof rule !== 'string' || rule.trim().length < 12 || rule.trim().length > 180)) { diff --git a/.vibe/skills/impeccable/reference/craft-floor.md b/.vibe/skills/impeccable/reference/craft-floor.md index 408f2912e..93be921db 100644 --- a/.vibe/skills/impeccable/reference/craft-floor.md +++ b/.vibe/skills/impeccable/reference/craft-floor.md @@ -12,6 +12,7 @@ Each of these is a check on the built result, not an intention. Run them togethe - **Type:** body measure 65–75ch, display max 6rem, tracking floor -0.04em, balanced headings, obvious scale and weight steps. Run the real copy at every breakpoint and fix what overflows. - **Motion:** one authored moment, not scattered effects and not one identical entrance on every section. Exponential ease-out from an already-visible default. Reach past transform and opacity: blur, backdrop-filter, clip-path, mask, and shadow belong to the palette when they stay smooth. - **States:** hover, disabled, loading, error, empty. Plus real content, working controls, responsive composition, keyboard focus. +- **Browser surfaces:** the parts you did not draw still carry the design. Text selection, the caret, custom scrollbars, focus rings, underline offset, and the numerals in tabular data all ship with browser defaults that belong to no design system. Theme them from the palette. This is the cheapest signal that a page was built rather than assembled, and the one models skip most reliably. - **Copy:** the product's own language. Controls name their action; errors name the problem and the recovery. - **Coverage:** every brief requirement present and findable within seconds. diff --git a/.vibe/skills/impeccable/scripts/lib/concept-catalog.mjs b/.vibe/skills/impeccable/scripts/lib/concept-catalog.mjs index 9c20711ef..949594d0d 100644 --- a/.vibe/skills/impeccable/scripts/lib/concept-catalog.mjs +++ b/.vibe/skills/impeccable/scripts/lib/concept-catalog.mjs @@ -109,6 +109,18 @@ export function validateConceptEntry(concept, { existingForms = new Map(), axes || concept.tags.some(tag => typeof tag !== 'string' || !tag.trim())) { errors.push(`concept ${id} must have exactly three structural tags`); } + // The slop this world in particular is at risk of. Optional, because 541 + // entries predate it and none of them are wrong for lacking it. A world built + // from posters is at risk of shouting and one built from instruments is at + // risk of dead greys; a global detector cannot know which, and the author can. + if (concept?.avoid !== undefined) { + if (!Array.isArray(concept.avoid) + || concept.avoid.length < 2 + || concept.avoid.length > 3 + || concept.avoid.some(item => typeof item !== 'string' || item.trim().length < 12 || item.trim().length > 160)) { + errors.push(`concept ${id} avoid must be two or three negations of 12–160 characters`); + } + } if (!Array.isArray(concept?.system) || concept.system.length !== SYSTEM_PREFIXES.length || concept.system.some(rule => typeof rule !== 'string' || rule.trim().length < 12 || rule.trim().length > 180)) { diff --git a/plugin/skills/impeccable/reference/craft-floor.md b/plugin/skills/impeccable/reference/craft-floor.md index 408f2912e..93be921db 100644 --- a/plugin/skills/impeccable/reference/craft-floor.md +++ b/plugin/skills/impeccable/reference/craft-floor.md @@ -12,6 +12,7 @@ Each of these is a check on the built result, not an intention. Run them togethe - **Type:** body measure 65–75ch, display max 6rem, tracking floor -0.04em, balanced headings, obvious scale and weight steps. Run the real copy at every breakpoint and fix what overflows. - **Motion:** one authored moment, not scattered effects and not one identical entrance on every section. Exponential ease-out from an already-visible default. Reach past transform and opacity: blur, backdrop-filter, clip-path, mask, and shadow belong to the palette when they stay smooth. - **States:** hover, disabled, loading, error, empty. Plus real content, working controls, responsive composition, keyboard focus. +- **Browser surfaces:** the parts you did not draw still carry the design. Text selection, the caret, custom scrollbars, focus rings, underline offset, and the numerals in tabular data all ship with browser defaults that belong to no design system. Theme them from the palette. This is the cheapest signal that a page was built rather than assembled, and the one models skip most reliably. - **Copy:** the product's own language. Controls name their action; errors name the problem and the recovery. - **Coverage:** every brief requirement present and findable within seconds. diff --git a/plugin/skills/impeccable/scripts/lib/concept-catalog.mjs b/plugin/skills/impeccable/scripts/lib/concept-catalog.mjs index 9c20711ef..949594d0d 100644 --- a/plugin/skills/impeccable/scripts/lib/concept-catalog.mjs +++ b/plugin/skills/impeccable/scripts/lib/concept-catalog.mjs @@ -109,6 +109,18 @@ export function validateConceptEntry(concept, { existingForms = new Map(), axes || concept.tags.some(tag => typeof tag !== 'string' || !tag.trim())) { errors.push(`concept ${id} must have exactly three structural tags`); } + // The slop this world in particular is at risk of. Optional, because 541 + // entries predate it and none of them are wrong for lacking it. A world built + // from posters is at risk of shouting and one built from instruments is at + // risk of dead greys; a global detector cannot know which, and the author can. + if (concept?.avoid !== undefined) { + if (!Array.isArray(concept.avoid) + || concept.avoid.length < 2 + || concept.avoid.length > 3 + || concept.avoid.some(item => typeof item !== 'string' || item.trim().length < 12 || item.trim().length > 160)) { + errors.push(`concept ${id} avoid must be two or three negations of 12–160 characters`); + } + } if (!Array.isArray(concept?.system) || concept.system.length !== SYSTEM_PREFIXES.length || concept.system.some(rule => typeof rule !== 'string' || rule.trim().length < 12 || rule.trim().length > 180)) {