diff --git a/.agents/skills/impeccable/SKILL.md b/.agents/skills/impeccable/SKILL.md index 8e2ee053e..f6c9da34f 100644 --- a/.agents/skills/impeccable/SKILL.md +++ b/.agents/skills/impeccable/SKILL.md @@ -1,7 +1,7 @@ --- name: impeccable description: Use when the user wants to design, redesign, shape, critique, audit, polish, clarify, distill, harden, optimize, adapt, animate, colorize, extract, or otherwise improve a frontend interface. Covers websites, landing pages, dashboards, product UI, app shells, components, forms, settings, onboarding, and empty states. Handles UX review, visual hierarchy, information architecture, cognitive load, accessibility, performance, responsive behavior, theming, anti-patterns, typography, fonts, spacing, layout, alignment, color, motion, micro-interactions, UX copy, error states, edge cases, i18n, and reusable design systems or tokens. Also use for bland designs that need to become bolder or more delightful, loud designs that should become quieter, live browser iteration on UI elements, or ambitious visual effects that should feel technically extraordinary. Not for backend-only or non-UI tasks. -version: 4.0.2 +version: 4.0.3 --- This skill gives you the tools and permission to create design that earns to be called out-of-distribution craft: Whereas before, your design work would have been safe, timid and measured, you now approach every design task as a award-winning design director with impeccable understanding for what makes exceptional design work: production-grade code, peak creativity, a clear POV, deep understanding of the needs of the client and users, and exceptional craft. diff --git a/.agents/skills/impeccable/scripts/concept-seed.mjs b/.agents/skills/impeccable/scripts/concept-seed.mjs index 2f9e16af3..23339d0f3 100644 --- a/.agents/skills/impeccable/scripts/concept-seed.mjs +++ b/.agents/skills/impeccable/scripts/concept-seed.mjs @@ -206,7 +206,13 @@ ${grammar} // returns no staging. Re-rolls exclude every earlier set until the pool runs out. export function selectApprovedStagings({ scope, key, reroll = 0, mode = null, sourceCompositions = null, count = 3 }) { const pool = sourceCompositions ?? requireLocalConcepts().compositions; + // Stagings honour the same breadth gate as worlds: a staging too specific to + // serve an arbitrary build stays approved for direct briefs and leaves the + // challenger pool. Falls back to the full approved set rather than returning + // nothing if every approved staging is marked niche. let approved = pool.filter(composition => composition.status === 'approved'); + const broad = approved.filter(composition => composition.review?.breadth !== 'niche'); + if (broad.length > 0) approved = broad; if (approved.length === 0) return []; if (mode) { const matching = approved.filter(composition => composition.surface === mode); @@ -271,12 +277,19 @@ export function selectApprovedChallengers({ scope, key, reroll = 0, sourceConcep // graphic systems beside instrument languages and atmosphere worlds, with // the second pick preferring a different family for diversity. Tier order // in the rendered list is rolled too, to avoid positional bias. - // Approval ratings weight the draw: a 3-star world earns a second ticket - // (roughly double odds), a 1-star keeps its approval for direct briefs but - // leaves the challenger pool unless a tier has nothing else. + // Two separate axes, and both can exclude. Rating grades quality: a 3-star + // earns a second ticket, a 1-star marginal keep leaves the pool. Breadth says + // whether a world can serve an arbitrary build at all, so a niche world + // leaves the pool however good it is. Breadth was split out of rating because + // the only way to hold a narrow world back used to be calling it marginal, + // which made "excellent but narrow" unrecordable and corrupted the ratings as + // a calibration signal for the next authoring round. const ticketsFor = pool => pool.flatMap(concept => { const rating = concept.review?.rating; - if (rating === 1) return []; + // Two independent exclusions: a marginal world is too weak to challenge, + // a niche world too narrow. Either one keeps its approval for direct + // briefs and leaves the pool. + if (rating === 1 || concept.review?.breadth === 'niche') return []; return rating === 3 ? [{ concept, ticket: 0 }, { concept, ticket: 1 }] : [{ concept, ticket: 0 }]; diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 417da412a..c94fe1877 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -12,7 +12,7 @@ { "name": "impeccable", "description": "Design fluency for frontend development. 1 skill with 23 commands (/impeccable polish, /impeccable audit, /impeccable critique, etc.) and curated anti-pattern detection.", - "version": "4.0.2", + "version": "4.0.3", "author": { "name": "Paul Bakaus", "email": "paul@paulbakaus.com" diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 7351318e1..38bb1d328 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "impeccable", "description": "Design fluency for frontend development. 1 skill with 23 commands (/impeccable polish, /impeccable audit, /impeccable critique, etc.) and curated anti-pattern detection.", - "version": "4.0.2", + "version": "4.0.3", "author": { "name": "Paul Bakaus", "email": "paul@paulbakaus.com" diff --git a/.claude/skills/impeccable/SKILL.md b/.claude/skills/impeccable/SKILL.md index 8839ad274..4e8e0e8f5 100644 --- a/.claude/skills/impeccable/SKILL.md +++ b/.claude/skills/impeccable/SKILL.md @@ -1,7 +1,7 @@ --- name: impeccable description: Use when the user wants to design, redesign, shape, critique, audit, polish, clarify, distill, harden, optimize, adapt, animate, colorize, extract, or otherwise improve a frontend interface. Covers websites, landing pages, dashboards, product UI, app shells, components, forms, settings, onboarding, and empty states. Handles UX review, visual hierarchy, information architecture, cognitive load, accessibility, performance, responsive behavior, theming, anti-patterns, typography, fonts, spacing, layout, alignment, color, motion, micro-interactions, UX copy, error states, edge cases, i18n, and reusable design systems or tokens. Also use for bland designs that need to become bolder or more delightful, loud designs that should become quieter, live browser iteration on UI elements, or ambitious visual effects that should feel technically extraordinary. Not for backend-only or non-UI tasks. -version: 4.0.2 +version: 4.0.3 user-invocable: true argument-hint: "[craft|shape · audit|critique · animate|bolder|colorize|delight|layout|overdrive|quieter|typeset · adapt|clarify|distill · harden|onboard|optimize|polish · init|document|extract|live] [target]" license: Apache 2.0 diff --git a/.claude/skills/impeccable/scripts/concept-seed.mjs b/.claude/skills/impeccable/scripts/concept-seed.mjs index 2f9e16af3..23339d0f3 100644 --- a/.claude/skills/impeccable/scripts/concept-seed.mjs +++ b/.claude/skills/impeccable/scripts/concept-seed.mjs @@ -206,7 +206,13 @@ ${grammar} // returns no staging. Re-rolls exclude every earlier set until the pool runs out. export function selectApprovedStagings({ scope, key, reroll = 0, mode = null, sourceCompositions = null, count = 3 }) { const pool = sourceCompositions ?? requireLocalConcepts().compositions; + // Stagings honour the same breadth gate as worlds: a staging too specific to + // serve an arbitrary build stays approved for direct briefs and leaves the + // challenger pool. Falls back to the full approved set rather than returning + // nothing if every approved staging is marked niche. let approved = pool.filter(composition => composition.status === 'approved'); + const broad = approved.filter(composition => composition.review?.breadth !== 'niche'); + if (broad.length > 0) approved = broad; if (approved.length === 0) return []; if (mode) { const matching = approved.filter(composition => composition.surface === mode); @@ -271,12 +277,19 @@ export function selectApprovedChallengers({ scope, key, reroll = 0, sourceConcep // graphic systems beside instrument languages and atmosphere worlds, with // the second pick preferring a different family for diversity. Tier order // in the rendered list is rolled too, to avoid positional bias. - // Approval ratings weight the draw: a 3-star world earns a second ticket - // (roughly double odds), a 1-star keeps its approval for direct briefs but - // leaves the challenger pool unless a tier has nothing else. + // Two separate axes, and both can exclude. Rating grades quality: a 3-star + // earns a second ticket, a 1-star marginal keep leaves the pool. Breadth says + // whether a world can serve an arbitrary build at all, so a niche world + // leaves the pool however good it is. Breadth was split out of rating because + // the only way to hold a narrow world back used to be calling it marginal, + // which made "excellent but narrow" unrecordable and corrupted the ratings as + // a calibration signal for the next authoring round. const ticketsFor = pool => pool.flatMap(concept => { const rating = concept.review?.rating; - if (rating === 1) return []; + // Two independent exclusions: a marginal world is too weak to challenge, + // a niche world too narrow. Either one keeps its approval for direct + // briefs and leaves the pool. + if (rating === 1 || concept.review?.breadth === 'niche') return []; return rating === 3 ? [{ concept, ticket: 0 }, { concept, ticket: 1 }] : [{ concept, ticket: 0 }]; diff --git a/.cursor/skills/impeccable/SKILL.md b/.cursor/skills/impeccable/SKILL.md index 85181fe87..e9932168f 100644 --- a/.cursor/skills/impeccable/SKILL.md +++ b/.cursor/skills/impeccable/SKILL.md @@ -1,7 +1,7 @@ --- name: impeccable description: Use when the user wants to design, redesign, shape, critique, audit, polish, clarify, distill, harden, optimize, adapt, animate, colorize, extract, or otherwise improve a frontend interface. Covers websites, landing pages, dashboards, product UI, app shells, components, forms, settings, onboarding, and empty states. Handles UX review, visual hierarchy, information architecture, cognitive load, accessibility, performance, responsive behavior, theming, anti-patterns, typography, fonts, spacing, layout, alignment, color, motion, micro-interactions, UX copy, error states, edge cases, i18n, and reusable design systems or tokens. Also use for bland designs that need to become bolder or more delightful, loud designs that should become quieter, live browser iteration on UI elements, or ambitious visual effects that should feel technically extraordinary. Not for backend-only or non-UI tasks. -version: 4.0.2 +version: 4.0.3 license: Apache 2.0 --- diff --git a/.cursor/skills/impeccable/scripts/concept-seed.mjs b/.cursor/skills/impeccable/scripts/concept-seed.mjs index 2f9e16af3..23339d0f3 100644 --- a/.cursor/skills/impeccable/scripts/concept-seed.mjs +++ b/.cursor/skills/impeccable/scripts/concept-seed.mjs @@ -206,7 +206,13 @@ ${grammar} // returns no staging. Re-rolls exclude every earlier set until the pool runs out. export function selectApprovedStagings({ scope, key, reroll = 0, mode = null, sourceCompositions = null, count = 3 }) { const pool = sourceCompositions ?? requireLocalConcepts().compositions; + // Stagings honour the same breadth gate as worlds: a staging too specific to + // serve an arbitrary build stays approved for direct briefs and leaves the + // challenger pool. Falls back to the full approved set rather than returning + // nothing if every approved staging is marked niche. let approved = pool.filter(composition => composition.status === 'approved'); + const broad = approved.filter(composition => composition.review?.breadth !== 'niche'); + if (broad.length > 0) approved = broad; if (approved.length === 0) return []; if (mode) { const matching = approved.filter(composition => composition.surface === mode); @@ -271,12 +277,19 @@ export function selectApprovedChallengers({ scope, key, reroll = 0, sourceConcep // graphic systems beside instrument languages and atmosphere worlds, with // the second pick preferring a different family for diversity. Tier order // in the rendered list is rolled too, to avoid positional bias. - // Approval ratings weight the draw: a 3-star world earns a second ticket - // (roughly double odds), a 1-star keeps its approval for direct briefs but - // leaves the challenger pool unless a tier has nothing else. + // Two separate axes, and both can exclude. Rating grades quality: a 3-star + // earns a second ticket, a 1-star marginal keep leaves the pool. Breadth says + // whether a world can serve an arbitrary build at all, so a niche world + // leaves the pool however good it is. Breadth was split out of rating because + // the only way to hold a narrow world back used to be calling it marginal, + // which made "excellent but narrow" unrecordable and corrupted the ratings as + // a calibration signal for the next authoring round. const ticketsFor = pool => pool.flatMap(concept => { const rating = concept.review?.rating; - if (rating === 1) return []; + // Two independent exclusions: a marginal world is too weak to challenge, + // a niche world too narrow. Either one keeps its approval for direct + // briefs and leaves the pool. + if (rating === 1 || concept.review?.breadth === 'niche') return []; return rating === 3 ? [{ concept, ticket: 0 }, { concept, ticket: 1 }] : [{ concept, ticket: 0 }]; diff --git a/.gemini/skills/impeccable/SKILL.md b/.gemini/skills/impeccable/SKILL.md index 56645de14..438016760 100644 --- a/.gemini/skills/impeccable/SKILL.md +++ b/.gemini/skills/impeccable/SKILL.md @@ -1,7 +1,7 @@ --- name: impeccable description: Use when the user wants to design, redesign, shape, critique, audit, polish, clarify, distill, harden, optimize, adapt, animate, colorize, extract, or otherwise improve a frontend interface. Covers websites, landing pages, dashboards, product UI, app shells, components, forms, settings, onboarding, and empty states. Handles UX review, visual hierarchy, information architecture, cognitive load, accessibility, performance, responsive behavior, theming, anti-patterns, typography, fonts, spacing, layout, alignment, color, motion, micro-interactions, UX copy, error states, edge cases, i18n, and reusable design systems or tokens. Also use for bland designs that need to become bolder or more delightful, loud designs that should become quieter, live browser iteration on UI elements, or ambitious visual effects that should feel technically extraordinary. Not for backend-only or non-UI tasks. -version: 4.0.2 +version: 4.0.3 --- This skill gives you the tools and permission to create design that earns to be called out-of-distribution craft: Whereas before, your design work would have been safe, timid and measured, you now approach every design task as a award-winning design director with impeccable understanding for what makes exceptional design work: production-grade code, peak creativity, a clear POV, deep understanding of the needs of the client and users, and exceptional craft. diff --git a/.gemini/skills/impeccable/scripts/concept-seed.mjs b/.gemini/skills/impeccable/scripts/concept-seed.mjs index 2f9e16af3..23339d0f3 100644 --- a/.gemini/skills/impeccable/scripts/concept-seed.mjs +++ b/.gemini/skills/impeccable/scripts/concept-seed.mjs @@ -206,7 +206,13 @@ ${grammar} // returns no staging. Re-rolls exclude every earlier set until the pool runs out. export function selectApprovedStagings({ scope, key, reroll = 0, mode = null, sourceCompositions = null, count = 3 }) { const pool = sourceCompositions ?? requireLocalConcepts().compositions; + // Stagings honour the same breadth gate as worlds: a staging too specific to + // serve an arbitrary build stays approved for direct briefs and leaves the + // challenger pool. Falls back to the full approved set rather than returning + // nothing if every approved staging is marked niche. let approved = pool.filter(composition => composition.status === 'approved'); + const broad = approved.filter(composition => composition.review?.breadth !== 'niche'); + if (broad.length > 0) approved = broad; if (approved.length === 0) return []; if (mode) { const matching = approved.filter(composition => composition.surface === mode); @@ -271,12 +277,19 @@ export function selectApprovedChallengers({ scope, key, reroll = 0, sourceConcep // graphic systems beside instrument languages and atmosphere worlds, with // the second pick preferring a different family for diversity. Tier order // in the rendered list is rolled too, to avoid positional bias. - // Approval ratings weight the draw: a 3-star world earns a second ticket - // (roughly double odds), a 1-star keeps its approval for direct briefs but - // leaves the challenger pool unless a tier has nothing else. + // Two separate axes, and both can exclude. Rating grades quality: a 3-star + // earns a second ticket, a 1-star marginal keep leaves the pool. Breadth says + // whether a world can serve an arbitrary build at all, so a niche world + // leaves the pool however good it is. Breadth was split out of rating because + // the only way to hold a narrow world back used to be calling it marginal, + // which made "excellent but narrow" unrecordable and corrupted the ratings as + // a calibration signal for the next authoring round. const ticketsFor = pool => pool.flatMap(concept => { const rating = concept.review?.rating; - if (rating === 1) return []; + // Two independent exclusions: a marginal world is too weak to challenge, + // a niche world too narrow. Either one keeps its approval for direct + // briefs and leaves the pool. + if (rating === 1 || concept.review?.breadth === 'niche') return []; return rating === 3 ? [{ concept, ticket: 0 }, { concept, ticket: 1 }] : [{ concept, ticket: 0 }]; diff --git a/.github/skills/impeccable/SKILL.md b/.github/skills/impeccable/SKILL.md index c7752d05a..d0929dd30 100644 --- a/.github/skills/impeccable/SKILL.md +++ b/.github/skills/impeccable/SKILL.md @@ -1,7 +1,7 @@ --- name: impeccable description: Use when the user wants to design, redesign, shape, critique, audit, polish, clarify, distill, harden, optimize, adapt, animate, colorize, extract, or otherwise improve a frontend interface. Covers websites, landing pages, dashboards, product UI, app shells, components, forms, settings, onboarding, and empty states. Handles UX review, visual hierarchy, information architecture, cognitive load, accessibility, performance, responsive behavior, theming, anti-patterns, typography, fonts, spacing, layout, alignment, color, motion, micro-interactions, UX copy, error states, edge cases, i18n, and reusable design systems or tokens. Also use for bland designs that need to become bolder or more delightful, loud designs that should become quieter, live browser iteration on UI elements, or ambitious visual effects that should feel technically extraordinary. Not for backend-only or non-UI tasks. -version: 4.0.2 +version: 4.0.3 user-invocable: true argument-hint: "[craft|shape · audit|critique · animate|bolder|colorize|delight|layout|overdrive|quieter|typeset · adapt|clarify|distill · harden|onboard|optimize|polish · init|document|extract|live] [target]" license: Apache 2.0 diff --git a/.github/skills/impeccable/scripts/concept-seed.mjs b/.github/skills/impeccable/scripts/concept-seed.mjs index 2f9e16af3..23339d0f3 100644 --- a/.github/skills/impeccable/scripts/concept-seed.mjs +++ b/.github/skills/impeccable/scripts/concept-seed.mjs @@ -206,7 +206,13 @@ ${grammar} // returns no staging. Re-rolls exclude every earlier set until the pool runs out. export function selectApprovedStagings({ scope, key, reroll = 0, mode = null, sourceCompositions = null, count = 3 }) { const pool = sourceCompositions ?? requireLocalConcepts().compositions; + // Stagings honour the same breadth gate as worlds: a staging too specific to + // serve an arbitrary build stays approved for direct briefs and leaves the + // challenger pool. Falls back to the full approved set rather than returning + // nothing if every approved staging is marked niche. let approved = pool.filter(composition => composition.status === 'approved'); + const broad = approved.filter(composition => composition.review?.breadth !== 'niche'); + if (broad.length > 0) approved = broad; if (approved.length === 0) return []; if (mode) { const matching = approved.filter(composition => composition.surface === mode); @@ -271,12 +277,19 @@ export function selectApprovedChallengers({ scope, key, reroll = 0, sourceConcep // graphic systems beside instrument languages and atmosphere worlds, with // the second pick preferring a different family for diversity. Tier order // in the rendered list is rolled too, to avoid positional bias. - // Approval ratings weight the draw: a 3-star world earns a second ticket - // (roughly double odds), a 1-star keeps its approval for direct briefs but - // leaves the challenger pool unless a tier has nothing else. + // Two separate axes, and both can exclude. Rating grades quality: a 3-star + // earns a second ticket, a 1-star marginal keep leaves the pool. Breadth says + // whether a world can serve an arbitrary build at all, so a niche world + // leaves the pool however good it is. Breadth was split out of rating because + // the only way to hold a narrow world back used to be calling it marginal, + // which made "excellent but narrow" unrecordable and corrupted the ratings as + // a calibration signal for the next authoring round. const ticketsFor = pool => pool.flatMap(concept => { const rating = concept.review?.rating; - if (rating === 1) return []; + // Two independent exclusions: a marginal world is too weak to challenge, + // a niche world too narrow. Either one keeps its approval for direct + // briefs and leaves the pool. + if (rating === 1 || concept.review?.breadth === 'niche') return []; return rating === 3 ? [{ concept, ticket: 0 }, { concept, ticket: 1 }] : [{ concept, ticket: 0 }]; diff --git a/.grok/skills/impeccable/SKILL.md b/.grok/skills/impeccable/SKILL.md index d13d661f8..ad8ae0b2b 100644 --- a/.grok/skills/impeccable/SKILL.md +++ b/.grok/skills/impeccable/SKILL.md @@ -1,7 +1,7 @@ --- name: impeccable description: Use when the user wants to design, redesign, shape, critique, audit, polish, clarify, distill, harden, optimize, adapt, animate, colorize, extract, or otherwise improve a frontend interface. Covers websites, landing pages, dashboards, product UI, app shells, components, forms, settings, onboarding, and empty states. Handles UX review, visual hierarchy, information architecture, cognitive load, accessibility, performance, responsive behavior, theming, anti-patterns, typography, fonts, spacing, layout, alignment, color, motion, micro-interactions, UX copy, error states, edge cases, i18n, and reusable design systems or tokens. Also use for bland designs that need to become bolder or more delightful, loud designs that should become quieter, live browser iteration on UI elements, or ambitious visual effects that should feel technically extraordinary. Not for backend-only or non-UI tasks. -version: 4.0.2 +version: 4.0.3 user-invocable: true argument-hint: "[craft|shape · audit|critique · animate|bolder|colorize|delight|layout|overdrive|quieter|typeset · adapt|clarify|distill · harden|onboard|optimize|polish · init|document|extract|live] [target]" license: Apache 2.0 diff --git a/.grok/skills/impeccable/scripts/concept-seed.mjs b/.grok/skills/impeccable/scripts/concept-seed.mjs index 2f9e16af3..23339d0f3 100644 --- a/.grok/skills/impeccable/scripts/concept-seed.mjs +++ b/.grok/skills/impeccable/scripts/concept-seed.mjs @@ -206,7 +206,13 @@ ${grammar} // returns no staging. Re-rolls exclude every earlier set until the pool runs out. export function selectApprovedStagings({ scope, key, reroll = 0, mode = null, sourceCompositions = null, count = 3 }) { const pool = sourceCompositions ?? requireLocalConcepts().compositions; + // Stagings honour the same breadth gate as worlds: a staging too specific to + // serve an arbitrary build stays approved for direct briefs and leaves the + // challenger pool. Falls back to the full approved set rather than returning + // nothing if every approved staging is marked niche. let approved = pool.filter(composition => composition.status === 'approved'); + const broad = approved.filter(composition => composition.review?.breadth !== 'niche'); + if (broad.length > 0) approved = broad; if (approved.length === 0) return []; if (mode) { const matching = approved.filter(composition => composition.surface === mode); @@ -271,12 +277,19 @@ export function selectApprovedChallengers({ scope, key, reroll = 0, sourceConcep // graphic systems beside instrument languages and atmosphere worlds, with // the second pick preferring a different family for diversity. Tier order // in the rendered list is rolled too, to avoid positional bias. - // Approval ratings weight the draw: a 3-star world earns a second ticket - // (roughly double odds), a 1-star keeps its approval for direct briefs but - // leaves the challenger pool unless a tier has nothing else. + // Two separate axes, and both can exclude. Rating grades quality: a 3-star + // earns a second ticket, a 1-star marginal keep leaves the pool. Breadth says + // whether a world can serve an arbitrary build at all, so a niche world + // leaves the pool however good it is. Breadth was split out of rating because + // the only way to hold a narrow world back used to be calling it marginal, + // which made "excellent but narrow" unrecordable and corrupted the ratings as + // a calibration signal for the next authoring round. const ticketsFor = pool => pool.flatMap(concept => { const rating = concept.review?.rating; - if (rating === 1) return []; + // Two independent exclusions: a marginal world is too weak to challenge, + // a niche world too narrow. Either one keeps its approval for direct + // briefs and leaves the pool. + if (rating === 1 || concept.review?.breadth === 'niche') return []; return rating === 3 ? [{ concept, ticket: 0 }, { concept, ticket: 1 }] : [{ concept, ticket: 0 }]; diff --git a/.kiro/skills/impeccable/SKILL.md b/.kiro/skills/impeccable/SKILL.md index 58f204bbe..0d5af0d54 100644 --- a/.kiro/skills/impeccable/SKILL.md +++ b/.kiro/skills/impeccable/SKILL.md @@ -1,7 +1,7 @@ --- name: impeccable description: Use when the user wants to design, redesign, shape, critique, audit, polish, clarify, distill, harden, optimize, adapt, animate, colorize, extract, or otherwise improve a frontend interface. Covers websites, landing pages, dashboards, product UI, app shells, components, forms, settings, onboarding, and empty states. Handles UX review, visual hierarchy, information architecture, cognitive load, accessibility, performance, responsive behavior, theming, anti-patterns, typography, fonts, spacing, layout, alignment, color, motion, micro-interactions, UX copy, error states, edge cases, i18n, and reusable design systems or tokens. Also use for bland designs that need to become bolder or more delightful, loud designs that should become quieter, live browser iteration on UI elements, or ambitious visual effects that should feel technically extraordinary. Not for backend-only or non-UI tasks. -version: 4.0.2 +version: 4.0.3 license: Apache 2.0 --- diff --git a/.kiro/skills/impeccable/scripts/concept-seed.mjs b/.kiro/skills/impeccable/scripts/concept-seed.mjs index 2f9e16af3..23339d0f3 100644 --- a/.kiro/skills/impeccable/scripts/concept-seed.mjs +++ b/.kiro/skills/impeccable/scripts/concept-seed.mjs @@ -206,7 +206,13 @@ ${grammar} // returns no staging. Re-rolls exclude every earlier set until the pool runs out. export function selectApprovedStagings({ scope, key, reroll = 0, mode = null, sourceCompositions = null, count = 3 }) { const pool = sourceCompositions ?? requireLocalConcepts().compositions; + // Stagings honour the same breadth gate as worlds: a staging too specific to + // serve an arbitrary build stays approved for direct briefs and leaves the + // challenger pool. Falls back to the full approved set rather than returning + // nothing if every approved staging is marked niche. let approved = pool.filter(composition => composition.status === 'approved'); + const broad = approved.filter(composition => composition.review?.breadth !== 'niche'); + if (broad.length > 0) approved = broad; if (approved.length === 0) return []; if (mode) { const matching = approved.filter(composition => composition.surface === mode); @@ -271,12 +277,19 @@ export function selectApprovedChallengers({ scope, key, reroll = 0, sourceConcep // graphic systems beside instrument languages and atmosphere worlds, with // the second pick preferring a different family for diversity. Tier order // in the rendered list is rolled too, to avoid positional bias. - // Approval ratings weight the draw: a 3-star world earns a second ticket - // (roughly double odds), a 1-star keeps its approval for direct briefs but - // leaves the challenger pool unless a tier has nothing else. + // Two separate axes, and both can exclude. Rating grades quality: a 3-star + // earns a second ticket, a 1-star marginal keep leaves the pool. Breadth says + // whether a world can serve an arbitrary build at all, so a niche world + // leaves the pool however good it is. Breadth was split out of rating because + // the only way to hold a narrow world back used to be calling it marginal, + // which made "excellent but narrow" unrecordable and corrupted the ratings as + // a calibration signal for the next authoring round. const ticketsFor = pool => pool.flatMap(concept => { const rating = concept.review?.rating; - if (rating === 1) return []; + // Two independent exclusions: a marginal world is too weak to challenge, + // a niche world too narrow. Either one keeps its approval for direct + // briefs and leaves the pool. + if (rating === 1 || concept.review?.breadth === 'niche') return []; return rating === 3 ? [{ concept, ticket: 0 }, { concept, ticket: 1 }] : [{ concept, ticket: 0 }]; diff --git a/.opencode/skills/impeccable/SKILL.md b/.opencode/skills/impeccable/SKILL.md index cf4b4e9de..b20a0780d 100644 --- a/.opencode/skills/impeccable/SKILL.md +++ b/.opencode/skills/impeccable/SKILL.md @@ -1,7 +1,7 @@ --- name: impeccable description: Use when the user wants to design, redesign, shape, critique, audit, polish, clarify, distill, harden, optimize, adapt, animate, colorize, extract, or otherwise improve a frontend interface. Covers websites, landing pages, dashboards, product UI, app shells, components, forms, settings, onboarding, and empty states. Handles UX review, visual hierarchy, information architecture, cognitive load, accessibility, performance, responsive behavior, theming, anti-patterns, typography, fonts, spacing, layout, alignment, color, motion, micro-interactions, UX copy, error states, edge cases, i18n, and reusable design systems or tokens. Also use for bland designs that need to become bolder or more delightful, loud designs that should become quieter, live browser iteration on UI elements, or ambitious visual effects that should feel technically extraordinary. Not for backend-only or non-UI tasks. -version: 4.0.2 +version: 4.0.3 user-invocable: true argument-hint: "[craft|shape · audit|critique · animate|bolder|colorize|delight|layout|overdrive|quieter|typeset · adapt|clarify|distill · harden|onboard|optimize|polish · init|document|extract|live] [target]" license: Apache 2.0 diff --git a/.opencode/skills/impeccable/scripts/concept-seed.mjs b/.opencode/skills/impeccable/scripts/concept-seed.mjs index 2f9e16af3..23339d0f3 100644 --- a/.opencode/skills/impeccable/scripts/concept-seed.mjs +++ b/.opencode/skills/impeccable/scripts/concept-seed.mjs @@ -206,7 +206,13 @@ ${grammar} // returns no staging. Re-rolls exclude every earlier set until the pool runs out. export function selectApprovedStagings({ scope, key, reroll = 0, mode = null, sourceCompositions = null, count = 3 }) { const pool = sourceCompositions ?? requireLocalConcepts().compositions; + // Stagings honour the same breadth gate as worlds: a staging too specific to + // serve an arbitrary build stays approved for direct briefs and leaves the + // challenger pool. Falls back to the full approved set rather than returning + // nothing if every approved staging is marked niche. let approved = pool.filter(composition => composition.status === 'approved'); + const broad = approved.filter(composition => composition.review?.breadth !== 'niche'); + if (broad.length > 0) approved = broad; if (approved.length === 0) return []; if (mode) { const matching = approved.filter(composition => composition.surface === mode); @@ -271,12 +277,19 @@ export function selectApprovedChallengers({ scope, key, reroll = 0, sourceConcep // graphic systems beside instrument languages and atmosphere worlds, with // the second pick preferring a different family for diversity. Tier order // in the rendered list is rolled too, to avoid positional bias. - // Approval ratings weight the draw: a 3-star world earns a second ticket - // (roughly double odds), a 1-star keeps its approval for direct briefs but - // leaves the challenger pool unless a tier has nothing else. + // Two separate axes, and both can exclude. Rating grades quality: a 3-star + // earns a second ticket, a 1-star marginal keep leaves the pool. Breadth says + // whether a world can serve an arbitrary build at all, so a niche world + // leaves the pool however good it is. Breadth was split out of rating because + // the only way to hold a narrow world back used to be calling it marginal, + // which made "excellent but narrow" unrecordable and corrupted the ratings as + // a calibration signal for the next authoring round. const ticketsFor = pool => pool.flatMap(concept => { const rating = concept.review?.rating; - if (rating === 1) return []; + // Two independent exclusions: a marginal world is too weak to challenge, + // a niche world too narrow. Either one keeps its approval for direct + // briefs and leaves the pool. + if (rating === 1 || concept.review?.breadth === 'niche') return []; return rating === 3 ? [{ concept, ticket: 0 }, { concept, ticket: 1 }] : [{ concept, ticket: 0 }]; diff --git a/.pi/skills/impeccable/SKILL.md b/.pi/skills/impeccable/SKILL.md index 6f5913851..dba6dcb54 100644 --- a/.pi/skills/impeccable/SKILL.md +++ b/.pi/skills/impeccable/SKILL.md @@ -1,7 +1,7 @@ --- name: impeccable description: Use when the user wants to design, redesign, shape, critique, audit, polish, clarify, distill, harden, optimize, adapt, animate, colorize, extract, or otherwise improve a frontend interface. Covers websites, landing pages, dashboards, product UI, app shells, components, forms, settings, onboarding, and empty states. Handles UX review, visual hierarchy, information architecture, cognitive load, accessibility, performance, responsive behavior, theming, anti-patterns, typography, fonts, spacing, layout, alignment, color, motion, micro-interactions, UX copy, error states, edge cases, i18n, and reusable design systems or tokens. Also use for bland designs that need to become bolder or more delightful, loud designs that should become quieter, live browser iteration on UI elements, or ambitious visual effects that should feel technically extraordinary. Not for backend-only or non-UI tasks. -version: 4.0.2 +version: 4.0.3 license: Apache 2.0 allowed-tools: - Bash(npx impeccable *) diff --git a/.pi/skills/impeccable/scripts/concept-seed.mjs b/.pi/skills/impeccable/scripts/concept-seed.mjs index 2f9e16af3..23339d0f3 100644 --- a/.pi/skills/impeccable/scripts/concept-seed.mjs +++ b/.pi/skills/impeccable/scripts/concept-seed.mjs @@ -206,7 +206,13 @@ ${grammar} // returns no staging. Re-rolls exclude every earlier set until the pool runs out. export function selectApprovedStagings({ scope, key, reroll = 0, mode = null, sourceCompositions = null, count = 3 }) { const pool = sourceCompositions ?? requireLocalConcepts().compositions; + // Stagings honour the same breadth gate as worlds: a staging too specific to + // serve an arbitrary build stays approved for direct briefs and leaves the + // challenger pool. Falls back to the full approved set rather than returning + // nothing if every approved staging is marked niche. let approved = pool.filter(composition => composition.status === 'approved'); + const broad = approved.filter(composition => composition.review?.breadth !== 'niche'); + if (broad.length > 0) approved = broad; if (approved.length === 0) return []; if (mode) { const matching = approved.filter(composition => composition.surface === mode); @@ -271,12 +277,19 @@ export function selectApprovedChallengers({ scope, key, reroll = 0, sourceConcep // graphic systems beside instrument languages and atmosphere worlds, with // the second pick preferring a different family for diversity. Tier order // in the rendered list is rolled too, to avoid positional bias. - // Approval ratings weight the draw: a 3-star world earns a second ticket - // (roughly double odds), a 1-star keeps its approval for direct briefs but - // leaves the challenger pool unless a tier has nothing else. + // Two separate axes, and both can exclude. Rating grades quality: a 3-star + // earns a second ticket, a 1-star marginal keep leaves the pool. Breadth says + // whether a world can serve an arbitrary build at all, so a niche world + // leaves the pool however good it is. Breadth was split out of rating because + // the only way to hold a narrow world back used to be calling it marginal, + // which made "excellent but narrow" unrecordable and corrupted the ratings as + // a calibration signal for the next authoring round. const ticketsFor = pool => pool.flatMap(concept => { const rating = concept.review?.rating; - if (rating === 1) return []; + // Two independent exclusions: a marginal world is too weak to challenge, + // a niche world too narrow. Either one keeps its approval for direct + // briefs and leaves the pool. + if (rating === 1 || concept.review?.breadth === 'niche') return []; return rating === 3 ? [{ concept, ticket: 0 }, { concept, ticket: 1 }] : [{ concept, ticket: 0 }]; diff --git a/.qoder/skills/impeccable/SKILL.md b/.qoder/skills/impeccable/SKILL.md index 50661550e..6d7f2d896 100644 --- a/.qoder/skills/impeccable/SKILL.md +++ b/.qoder/skills/impeccable/SKILL.md @@ -1,7 +1,7 @@ --- name: impeccable description: Use when the user wants to design, redesign, shape, critique, audit, polish, clarify, distill, harden, optimize, adapt, animate, colorize, extract, or otherwise improve a frontend interface. Covers websites, landing pages, dashboards, product UI, app shells, components, forms, settings, onboarding, and empty states. Handles UX review, visual hierarchy, information architecture, cognitive load, accessibility, performance, responsive behavior, theming, anti-patterns, typography, fonts, spacing, layout, alignment, color, motion, micro-interactions, UX copy, error states, edge cases, i18n, and reusable design systems or tokens. Also use for bland designs that need to become bolder or more delightful, loud designs that should become quieter, live browser iteration on UI elements, or ambitious visual effects that should feel technically extraordinary. Not for backend-only or non-UI tasks. -version: 4.0.2 +version: 4.0.3 user-invocable: true argument-hint: "[craft|shape · audit|critique · animate|bolder|colorize|delight|layout|overdrive|quieter|typeset · adapt|clarify|distill · harden|onboard|optimize|polish · init|document|extract|live] [target]" license: Apache 2.0 diff --git a/.qoder/skills/impeccable/scripts/concept-seed.mjs b/.qoder/skills/impeccable/scripts/concept-seed.mjs index 2f9e16af3..23339d0f3 100644 --- a/.qoder/skills/impeccable/scripts/concept-seed.mjs +++ b/.qoder/skills/impeccable/scripts/concept-seed.mjs @@ -206,7 +206,13 @@ ${grammar} // returns no staging. Re-rolls exclude every earlier set until the pool runs out. export function selectApprovedStagings({ scope, key, reroll = 0, mode = null, sourceCompositions = null, count = 3 }) { const pool = sourceCompositions ?? requireLocalConcepts().compositions; + // Stagings honour the same breadth gate as worlds: a staging too specific to + // serve an arbitrary build stays approved for direct briefs and leaves the + // challenger pool. Falls back to the full approved set rather than returning + // nothing if every approved staging is marked niche. let approved = pool.filter(composition => composition.status === 'approved'); + const broad = approved.filter(composition => composition.review?.breadth !== 'niche'); + if (broad.length > 0) approved = broad; if (approved.length === 0) return []; if (mode) { const matching = approved.filter(composition => composition.surface === mode); @@ -271,12 +277,19 @@ export function selectApprovedChallengers({ scope, key, reroll = 0, sourceConcep // graphic systems beside instrument languages and atmosphere worlds, with // the second pick preferring a different family for diversity. Tier order // in the rendered list is rolled too, to avoid positional bias. - // Approval ratings weight the draw: a 3-star world earns a second ticket - // (roughly double odds), a 1-star keeps its approval for direct briefs but - // leaves the challenger pool unless a tier has nothing else. + // Two separate axes, and both can exclude. Rating grades quality: a 3-star + // earns a second ticket, a 1-star marginal keep leaves the pool. Breadth says + // whether a world can serve an arbitrary build at all, so a niche world + // leaves the pool however good it is. Breadth was split out of rating because + // the only way to hold a narrow world back used to be calling it marginal, + // which made "excellent but narrow" unrecordable and corrupted the ratings as + // a calibration signal for the next authoring round. const ticketsFor = pool => pool.flatMap(concept => { const rating = concept.review?.rating; - if (rating === 1) return []; + // Two independent exclusions: a marginal world is too weak to challenge, + // a niche world too narrow. Either one keeps its approval for direct + // briefs and leaves the pool. + if (rating === 1 || concept.review?.breadth === 'niche') return []; return rating === 3 ? [{ concept, ticket: 0 }, { concept, ticket: 1 }] : [{ concept, ticket: 0 }]; diff --git a/.rovodev/skills/impeccable/SKILL.md b/.rovodev/skills/impeccable/SKILL.md index 680e87ca2..b65468c89 100644 --- a/.rovodev/skills/impeccable/SKILL.md +++ b/.rovodev/skills/impeccable/SKILL.md @@ -1,7 +1,7 @@ --- name: impeccable description: Use when the user wants to design, redesign, shape, critique, audit, polish, clarify, distill, harden, optimize, adapt, animate, colorize, extract, or otherwise improve a frontend interface. Covers websites, landing pages, dashboards, product UI, app shells, components, forms, settings, onboarding, and empty states. Handles UX review, visual hierarchy, information architecture, cognitive load, accessibility, performance, responsive behavior, theming, anti-patterns, typography, fonts, spacing, layout, alignment, color, motion, micro-interactions, UX copy, error states, edge cases, i18n, and reusable design systems or tokens. Also use for bland designs that need to become bolder or more delightful, loud designs that should become quieter, live browser iteration on UI elements, or ambitious visual effects that should feel technically extraordinary. Not for backend-only or non-UI tasks. -version: 4.0.2 +version: 4.0.3 user-invocable: true argument-hint: "[craft|shape · audit|critique · animate|bolder|colorize|delight|layout|overdrive|quieter|typeset · adapt|clarify|distill · harden|onboard|optimize|polish · init|document|extract|live] [target]" license: Apache 2.0 diff --git a/.rovodev/skills/impeccable/scripts/concept-seed.mjs b/.rovodev/skills/impeccable/scripts/concept-seed.mjs index 2f9e16af3..23339d0f3 100644 --- a/.rovodev/skills/impeccable/scripts/concept-seed.mjs +++ b/.rovodev/skills/impeccable/scripts/concept-seed.mjs @@ -206,7 +206,13 @@ ${grammar} // returns no staging. Re-rolls exclude every earlier set until the pool runs out. export function selectApprovedStagings({ scope, key, reroll = 0, mode = null, sourceCompositions = null, count = 3 }) { const pool = sourceCompositions ?? requireLocalConcepts().compositions; + // Stagings honour the same breadth gate as worlds: a staging too specific to + // serve an arbitrary build stays approved for direct briefs and leaves the + // challenger pool. Falls back to the full approved set rather than returning + // nothing if every approved staging is marked niche. let approved = pool.filter(composition => composition.status === 'approved'); + const broad = approved.filter(composition => composition.review?.breadth !== 'niche'); + if (broad.length > 0) approved = broad; if (approved.length === 0) return []; if (mode) { const matching = approved.filter(composition => composition.surface === mode); @@ -271,12 +277,19 @@ export function selectApprovedChallengers({ scope, key, reroll = 0, sourceConcep // graphic systems beside instrument languages and atmosphere worlds, with // the second pick preferring a different family for diversity. Tier order // in the rendered list is rolled too, to avoid positional bias. - // Approval ratings weight the draw: a 3-star world earns a second ticket - // (roughly double odds), a 1-star keeps its approval for direct briefs but - // leaves the challenger pool unless a tier has nothing else. + // Two separate axes, and both can exclude. Rating grades quality: a 3-star + // earns a second ticket, a 1-star marginal keep leaves the pool. Breadth says + // whether a world can serve an arbitrary build at all, so a niche world + // leaves the pool however good it is. Breadth was split out of rating because + // the only way to hold a narrow world back used to be calling it marginal, + // which made "excellent but narrow" unrecordable and corrupted the ratings as + // a calibration signal for the next authoring round. const ticketsFor = pool => pool.flatMap(concept => { const rating = concept.review?.rating; - if (rating === 1) return []; + // Two independent exclusions: a marginal world is too weak to challenge, + // a niche world too narrow. Either one keeps its approval for direct + // briefs and leaves the pool. + if (rating === 1 || concept.review?.breadth === 'niche') return []; return rating === 3 ? [{ concept, ticket: 0 }, { concept, ticket: 1 }] : [{ concept, ticket: 0 }]; diff --git a/.trae-cn/skills/impeccable/SKILL.md b/.trae-cn/skills/impeccable/SKILL.md index f9bf983a5..c503728cf 100644 --- a/.trae-cn/skills/impeccable/SKILL.md +++ b/.trae-cn/skills/impeccable/SKILL.md @@ -1,7 +1,7 @@ --- name: impeccable description: Use when the user wants to design, redesign, shape, critique, audit, polish, clarify, distill, harden, optimize, adapt, animate, colorize, extract, or otherwise improve a frontend interface. Covers websites, landing pages, dashboards, product UI, app shells, components, forms, settings, onboarding, and empty states. Handles UX review, visual hierarchy, information architecture, cognitive load, accessibility, performance, responsive behavior, theming, anti-patterns, typography, fonts, spacing, layout, alignment, color, motion, micro-interactions, UX copy, error states, edge cases, i18n, and reusable design systems or tokens. Also use for bland designs that need to become bolder or more delightful, loud designs that should become quieter, live browser iteration on UI elements, or ambitious visual effects that should feel technically extraordinary. Not for backend-only or non-UI tasks. -version: 4.0.2 +version: 4.0.3 user-invocable: true argument-hint: "[craft|shape · audit|critique · animate|bolder|colorize|delight|layout|overdrive|quieter|typeset · adapt|clarify|distill · harden|onboard|optimize|polish · init|document|extract|live] [target]" license: Apache 2.0 diff --git a/.trae-cn/skills/impeccable/scripts/concept-seed.mjs b/.trae-cn/skills/impeccable/scripts/concept-seed.mjs index 2f9e16af3..23339d0f3 100644 --- a/.trae-cn/skills/impeccable/scripts/concept-seed.mjs +++ b/.trae-cn/skills/impeccable/scripts/concept-seed.mjs @@ -206,7 +206,13 @@ ${grammar} // returns no staging. Re-rolls exclude every earlier set until the pool runs out. export function selectApprovedStagings({ scope, key, reroll = 0, mode = null, sourceCompositions = null, count = 3 }) { const pool = sourceCompositions ?? requireLocalConcepts().compositions; + // Stagings honour the same breadth gate as worlds: a staging too specific to + // serve an arbitrary build stays approved for direct briefs and leaves the + // challenger pool. Falls back to the full approved set rather than returning + // nothing if every approved staging is marked niche. let approved = pool.filter(composition => composition.status === 'approved'); + const broad = approved.filter(composition => composition.review?.breadth !== 'niche'); + if (broad.length > 0) approved = broad; if (approved.length === 0) return []; if (mode) { const matching = approved.filter(composition => composition.surface === mode); @@ -271,12 +277,19 @@ export function selectApprovedChallengers({ scope, key, reroll = 0, sourceConcep // graphic systems beside instrument languages and atmosphere worlds, with // the second pick preferring a different family for diversity. Tier order // in the rendered list is rolled too, to avoid positional bias. - // Approval ratings weight the draw: a 3-star world earns a second ticket - // (roughly double odds), a 1-star keeps its approval for direct briefs but - // leaves the challenger pool unless a tier has nothing else. + // Two separate axes, and both can exclude. Rating grades quality: a 3-star + // earns a second ticket, a 1-star marginal keep leaves the pool. Breadth says + // whether a world can serve an arbitrary build at all, so a niche world + // leaves the pool however good it is. Breadth was split out of rating because + // the only way to hold a narrow world back used to be calling it marginal, + // which made "excellent but narrow" unrecordable and corrupted the ratings as + // a calibration signal for the next authoring round. const ticketsFor = pool => pool.flatMap(concept => { const rating = concept.review?.rating; - if (rating === 1) return []; + // Two independent exclusions: a marginal world is too weak to challenge, + // a niche world too narrow. Either one keeps its approval for direct + // briefs and leaves the pool. + if (rating === 1 || concept.review?.breadth === 'niche') return []; return rating === 3 ? [{ concept, ticket: 0 }, { concept, ticket: 1 }] : [{ concept, ticket: 0 }]; diff --git a/.trae/skills/impeccable/SKILL.md b/.trae/skills/impeccable/SKILL.md index b8dace2b2..b2419daa3 100644 --- a/.trae/skills/impeccable/SKILL.md +++ b/.trae/skills/impeccable/SKILL.md @@ -1,7 +1,7 @@ --- name: impeccable description: Use when the user wants to design, redesign, shape, critique, audit, polish, clarify, distill, harden, optimize, adapt, animate, colorize, extract, or otherwise improve a frontend interface. Covers websites, landing pages, dashboards, product UI, app shells, components, forms, settings, onboarding, and empty states. Handles UX review, visual hierarchy, information architecture, cognitive load, accessibility, performance, responsive behavior, theming, anti-patterns, typography, fonts, spacing, layout, alignment, color, motion, micro-interactions, UX copy, error states, edge cases, i18n, and reusable design systems or tokens. Also use for bland designs that need to become bolder or more delightful, loud designs that should become quieter, live browser iteration on UI elements, or ambitious visual effects that should feel technically extraordinary. Not for backend-only or non-UI tasks. -version: 4.0.2 +version: 4.0.3 user-invocable: true argument-hint: "[craft|shape · audit|critique · animate|bolder|colorize|delight|layout|overdrive|quieter|typeset · adapt|clarify|distill · harden|onboard|optimize|polish · init|document|extract|live] [target]" license: Apache 2.0 diff --git a/.trae/skills/impeccable/scripts/concept-seed.mjs b/.trae/skills/impeccable/scripts/concept-seed.mjs index 2f9e16af3..23339d0f3 100644 --- a/.trae/skills/impeccable/scripts/concept-seed.mjs +++ b/.trae/skills/impeccable/scripts/concept-seed.mjs @@ -206,7 +206,13 @@ ${grammar} // returns no staging. Re-rolls exclude every earlier set until the pool runs out. export function selectApprovedStagings({ scope, key, reroll = 0, mode = null, sourceCompositions = null, count = 3 }) { const pool = sourceCompositions ?? requireLocalConcepts().compositions; + // Stagings honour the same breadth gate as worlds: a staging too specific to + // serve an arbitrary build stays approved for direct briefs and leaves the + // challenger pool. Falls back to the full approved set rather than returning + // nothing if every approved staging is marked niche. let approved = pool.filter(composition => composition.status === 'approved'); + const broad = approved.filter(composition => composition.review?.breadth !== 'niche'); + if (broad.length > 0) approved = broad; if (approved.length === 0) return []; if (mode) { const matching = approved.filter(composition => composition.surface === mode); @@ -271,12 +277,19 @@ export function selectApprovedChallengers({ scope, key, reroll = 0, sourceConcep // graphic systems beside instrument languages and atmosphere worlds, with // the second pick preferring a different family for diversity. Tier order // in the rendered list is rolled too, to avoid positional bias. - // Approval ratings weight the draw: a 3-star world earns a second ticket - // (roughly double odds), a 1-star keeps its approval for direct briefs but - // leaves the challenger pool unless a tier has nothing else. + // Two separate axes, and both can exclude. Rating grades quality: a 3-star + // earns a second ticket, a 1-star marginal keep leaves the pool. Breadth says + // whether a world can serve an arbitrary build at all, so a niche world + // leaves the pool however good it is. Breadth was split out of rating because + // the only way to hold a narrow world back used to be calling it marginal, + // which made "excellent but narrow" unrecordable and corrupted the ratings as + // a calibration signal for the next authoring round. const ticketsFor = pool => pool.flatMap(concept => { const rating = concept.review?.rating; - if (rating === 1) return []; + // Two independent exclusions: a marginal world is too weak to challenge, + // a niche world too narrow. Either one keeps its approval for direct + // briefs and leaves the pool. + if (rating === 1 || concept.review?.breadth === 'niche') return []; return rating === 3 ? [{ concept, ticket: 0 }, { concept, ticket: 1 }] : [{ concept, ticket: 0 }]; diff --git a/.vibe/skills/impeccable/SKILL.md b/.vibe/skills/impeccable/SKILL.md index 66d33e85b..5ac130bd2 100644 --- a/.vibe/skills/impeccable/SKILL.md +++ b/.vibe/skills/impeccable/SKILL.md @@ -1,7 +1,7 @@ --- name: impeccable description: Use when the user wants to design, redesign, shape, critique, audit, polish, clarify, distill, harden, optimize, adapt, animate, colorize, extract, or otherwise improve a frontend interface. Covers websites, landing pages, dashboards, product UI, app shells, components, forms, settings, onboarding, and empty states. Handles UX review, visual hierarchy, information architecture, cognitive load, accessibility, performance, responsive behavior, theming, anti-patterns, typography, fonts, spacing, layout, alignment, color, motion, micro-interactions, UX copy, error states, edge cases, i18n, and reusable design systems or tokens. Also use for bland designs that need to become bolder or more delightful, loud designs that should become quieter, live browser iteration on UI elements, or ambitious visual effects that should feel technically extraordinary. Not for backend-only or non-UI tasks. -version: 4.0.2 +version: 4.0.3 user-invocable: true license: Apache 2.0 allowed-tools: diff --git a/.vibe/skills/impeccable/scripts/concept-seed.mjs b/.vibe/skills/impeccable/scripts/concept-seed.mjs index 2f9e16af3..23339d0f3 100644 --- a/.vibe/skills/impeccable/scripts/concept-seed.mjs +++ b/.vibe/skills/impeccable/scripts/concept-seed.mjs @@ -206,7 +206,13 @@ ${grammar} // returns no staging. Re-rolls exclude every earlier set until the pool runs out. export function selectApprovedStagings({ scope, key, reroll = 0, mode = null, sourceCompositions = null, count = 3 }) { const pool = sourceCompositions ?? requireLocalConcepts().compositions; + // Stagings honour the same breadth gate as worlds: a staging too specific to + // serve an arbitrary build stays approved for direct briefs and leaves the + // challenger pool. Falls back to the full approved set rather than returning + // nothing if every approved staging is marked niche. let approved = pool.filter(composition => composition.status === 'approved'); + const broad = approved.filter(composition => composition.review?.breadth !== 'niche'); + if (broad.length > 0) approved = broad; if (approved.length === 0) return []; if (mode) { const matching = approved.filter(composition => composition.surface === mode); @@ -271,12 +277,19 @@ export function selectApprovedChallengers({ scope, key, reroll = 0, sourceConcep // graphic systems beside instrument languages and atmosphere worlds, with // the second pick preferring a different family for diversity. Tier order // in the rendered list is rolled too, to avoid positional bias. - // Approval ratings weight the draw: a 3-star world earns a second ticket - // (roughly double odds), a 1-star keeps its approval for direct briefs but - // leaves the challenger pool unless a tier has nothing else. + // Two separate axes, and both can exclude. Rating grades quality: a 3-star + // earns a second ticket, a 1-star marginal keep leaves the pool. Breadth says + // whether a world can serve an arbitrary build at all, so a niche world + // leaves the pool however good it is. Breadth was split out of rating because + // the only way to hold a narrow world back used to be calling it marginal, + // which made "excellent but narrow" unrecordable and corrupted the ratings as + // a calibration signal for the next authoring round. const ticketsFor = pool => pool.flatMap(concept => { const rating = concept.review?.rating; - if (rating === 1) return []; + // Two independent exclusions: a marginal world is too weak to challenge, + // a niche world too narrow. Either one keeps its approval for direct + // briefs and leaves the pool. + if (rating === 1 || concept.review?.breadth === 'niche') return []; return rating === 3 ? [{ concept, ticket: 0 }, { concept, ticket: 1 }] : [{ concept, ticket: 0 }]; diff --git a/extension/manifest.json b/extension/manifest.json index cb9c563e7..ed52e9eaf 100644 --- a/extension/manifest.json +++ b/extension/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 3, "name": "Impeccable", "description": "Detect common UI anti-patterns in any web page", - "version": "1.2.1", + "version": "1.3.0", "permissions": ["activeTab", "scripting", "storage", "webNavigation"], "host_permissions": [""], "background": { diff --git a/package.json b/package.json index e82c716af..1ab483466 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "impeccable", - "version": "3.3.1", + "version": "3.4.0", "author": "Paul Bakaus", "description": "Design skills, commands, and anti-pattern detection for AI coding agents", "keywords": [ diff --git a/plugin/.claude-plugin/plugin.json b/plugin/.claude-plugin/plugin.json index 729452ec5..ba90d489b 100644 --- a/plugin/.claude-plugin/plugin.json +++ b/plugin/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "impeccable", "description": "Design fluency for frontend development. 1 skill with 23 commands (/impeccable polish, /impeccable audit, /impeccable critique, etc.) and curated anti-pattern detection.", - "version": "4.0.2", + "version": "4.0.3", "author": { "name": "Paul Bakaus", "email": "paul@paulbakaus.com" diff --git a/plugin/.grok-plugin/plugin.json b/plugin/.grok-plugin/plugin.json index 598719da4..141dceb62 100644 --- a/plugin/.grok-plugin/plugin.json +++ b/plugin/.grok-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "impeccable", - "version": "4.0.2", + "version": "4.0.3", "description": "Design fluency for frontend development. 1 skill with 23 commands (/impeccable polish, /impeccable audit, /impeccable critique, etc.) and curated anti-pattern detection.", "author": { "name": "Paul Bakaus", diff --git a/plugin/skills/impeccable/SKILL.md b/plugin/skills/impeccable/SKILL.md index 8839ad274..4e8e0e8f5 100644 --- a/plugin/skills/impeccable/SKILL.md +++ b/plugin/skills/impeccable/SKILL.md @@ -1,7 +1,7 @@ --- name: impeccable description: Use when the user wants to design, redesign, shape, critique, audit, polish, clarify, distill, harden, optimize, adapt, animate, colorize, extract, or otherwise improve a frontend interface. Covers websites, landing pages, dashboards, product UI, app shells, components, forms, settings, onboarding, and empty states. Handles UX review, visual hierarchy, information architecture, cognitive load, accessibility, performance, responsive behavior, theming, anti-patterns, typography, fonts, spacing, layout, alignment, color, motion, micro-interactions, UX copy, error states, edge cases, i18n, and reusable design systems or tokens. Also use for bland designs that need to become bolder or more delightful, loud designs that should become quieter, live browser iteration on UI elements, or ambitious visual effects that should feel technically extraordinary. Not for backend-only or non-UI tasks. -version: 4.0.2 +version: 4.0.3 user-invocable: true argument-hint: "[craft|shape · audit|critique · animate|bolder|colorize|delight|layout|overdrive|quieter|typeset · adapt|clarify|distill · harden|onboard|optimize|polish · init|document|extract|live] [target]" license: Apache 2.0 diff --git a/plugin/skills/impeccable/scripts/concept-seed.mjs b/plugin/skills/impeccable/scripts/concept-seed.mjs index 2f9e16af3..23339d0f3 100644 --- a/plugin/skills/impeccable/scripts/concept-seed.mjs +++ b/plugin/skills/impeccable/scripts/concept-seed.mjs @@ -206,7 +206,13 @@ ${grammar} // returns no staging. Re-rolls exclude every earlier set until the pool runs out. export function selectApprovedStagings({ scope, key, reroll = 0, mode = null, sourceCompositions = null, count = 3 }) { const pool = sourceCompositions ?? requireLocalConcepts().compositions; + // Stagings honour the same breadth gate as worlds: a staging too specific to + // serve an arbitrary build stays approved for direct briefs and leaves the + // challenger pool. Falls back to the full approved set rather than returning + // nothing if every approved staging is marked niche. let approved = pool.filter(composition => composition.status === 'approved'); + const broad = approved.filter(composition => composition.review?.breadth !== 'niche'); + if (broad.length > 0) approved = broad; if (approved.length === 0) return []; if (mode) { const matching = approved.filter(composition => composition.surface === mode); @@ -271,12 +277,19 @@ export function selectApprovedChallengers({ scope, key, reroll = 0, sourceConcep // graphic systems beside instrument languages and atmosphere worlds, with // the second pick preferring a different family for diversity. Tier order // in the rendered list is rolled too, to avoid positional bias. - // Approval ratings weight the draw: a 3-star world earns a second ticket - // (roughly double odds), a 1-star keeps its approval for direct briefs but - // leaves the challenger pool unless a tier has nothing else. + // Two separate axes, and both can exclude. Rating grades quality: a 3-star + // earns a second ticket, a 1-star marginal keep leaves the pool. Breadth says + // whether a world can serve an arbitrary build at all, so a niche world + // leaves the pool however good it is. Breadth was split out of rating because + // the only way to hold a narrow world back used to be calling it marginal, + // which made "excellent but narrow" unrecordable and corrupted the ratings as + // a calibration signal for the next authoring round. const ticketsFor = pool => pool.flatMap(concept => { const rating = concept.review?.rating; - if (rating === 1) return []; + // Two independent exclusions: a marginal world is too weak to challenge, + // a niche world too narrow. Either one keeps its approval for direct + // briefs and leaves the pool. + if (rating === 1 || concept.review?.breadth === 'niche') return []; return rating === 3 ? [{ concept, ticket: 0 }, { concept, ticket: 1 }] : [{ concept, ticket: 0 }];