diff --git a/.agents/skills/impeccable/SKILL.md b/.agents/skills/impeccable/SKILL.md
index 873292cfd..576199435 100644
--- a/.agents/skills/impeccable/SKILL.md
+++ b/.agents/skills/impeccable/SKILL.md
@@ -5,22 +5,6 @@ description: Use when the user wants to design, redesign, shape, critique, audit
Designs and iterates production-grade frontend interfaces. Real working code, committed design choices, exceptional craft.
-
-BEFORE doing any design work, run this one-time maintenance step. Tell the user:
-
-> **Impeccable 3.0 consolidation.** All standalone commands ($audit, $polish, $critique, etc.) are now accessed through $impeccable (e.g., `$impeccable audit`). I'll clean up the old standalone skill files. Use `$impeccable pin ` to restore shortcuts for commands you use often.
-
-Then run:
-
-```bash
-node .agents/skills/impeccable/scripts/cleanup-deprecated.mjs
-```
-
-If the script removed files, briefly confirm what was cleaned up. If it found nothing, skip any output and move on.
-
-After running the script, delete this entire section (from `` through `` inclusive) from THIS file so it does not run again until the next update. Save the file.
-
-
## Setup (non-optional)
Two steps before any design work. Both are required. Skipping either produces generic output that ignores the project.
diff --git a/.agents/skills/impeccable/scripts/live-browser.js b/.agents/skills/impeccable/scripts/live-browser.js
index 8b1839211..65e779628 100644
--- a/.agents/skills/impeccable/scripts/live-browser.js
+++ b/.agents/skills/impeccable/scripts/live-browser.js
@@ -2818,14 +2818,18 @@ void main() {
// Static-server / no-HMR fallback: if the wrapper is still around 2s after
// the cleanup above, swap it out manually. By now React has either moved
- // on or the app isn't React at all.
+ // on or the app isn't React at all. Preserve the `data-impeccable-variant="N"`
+ // div (with display:contents) so @scope rules anchored to the variant
+ // attribute keep matching until reload replaces it with the carbonize block.
setTimeout(function() {
const wrapper = document.querySelector('[data-impeccable-variants="' + acceptedSessionId + '"]');
if (!wrapper) return;
const accepted = wrapper.querySelector('[data-impeccable-variant="' + acceptedVariant + '"]');
if (accepted && accepted.firstElementChild) {
const parent = wrapper.parentElement;
- if (parent) parent.replaceChild(accepted.firstElementChild.cloneNode(true), wrapper);
+ if (!parent) return;
+ accepted.style.display = 'contents';
+ parent.replaceChild(accepted, wrapper);
}
}, 2000);
}
diff --git a/.claude/skills/impeccable/SKILL.md b/.claude/skills/impeccable/SKILL.md
index e2e7930e8..5978f72de 100644
--- a/.claude/skills/impeccable/SKILL.md
+++ b/.claude/skills/impeccable/SKILL.md
@@ -11,22 +11,6 @@ allowed-tools:
Designs and iterates production-grade frontend interfaces. Real working code, committed design choices, exceptional craft.
-
-BEFORE doing any design work, run this one-time maintenance step. Tell the user:
-
-> **Impeccable 3.0 consolidation.** All standalone commands (/audit, /polish, /critique, etc.) are now accessed through /impeccable (e.g., `/impeccable audit`). I'll clean up the old standalone skill files. Use `/impeccable pin ` to restore shortcuts for commands you use often.
-
-Then run:
-
-```bash
-node .claude/skills/impeccable/scripts/cleanup-deprecated.mjs
-```
-
-If the script removed files, briefly confirm what was cleaned up. If it found nothing, skip any output and move on.
-
-After running the script, delete this entire section (from `` through `` inclusive) from THIS file so it does not run again until the next update. Save the file.
-
-
## Setup (non-optional)
Two steps before any design work. Both are required. Skipping either produces generic output that ignores the project.
diff --git a/.claude/skills/impeccable/scripts/live-browser.js b/.claude/skills/impeccable/scripts/live-browser.js
index 8b1839211..65e779628 100644
--- a/.claude/skills/impeccable/scripts/live-browser.js
+++ b/.claude/skills/impeccable/scripts/live-browser.js
@@ -2818,14 +2818,18 @@ void main() {
// Static-server / no-HMR fallback: if the wrapper is still around 2s after
// the cleanup above, swap it out manually. By now React has either moved
- // on or the app isn't React at all.
+ // on or the app isn't React at all. Preserve the `data-impeccable-variant="N"`
+ // div (with display:contents) so @scope rules anchored to the variant
+ // attribute keep matching until reload replaces it with the carbonize block.
setTimeout(function() {
const wrapper = document.querySelector('[data-impeccable-variants="' + acceptedSessionId + '"]');
if (!wrapper) return;
const accepted = wrapper.querySelector('[data-impeccable-variant="' + acceptedVariant + '"]');
if (accepted && accepted.firstElementChild) {
const parent = wrapper.parentElement;
- if (parent) parent.replaceChild(accepted.firstElementChild.cloneNode(true), wrapper);
+ if (!parent) return;
+ accepted.style.display = 'contents';
+ parent.replaceChild(accepted, wrapper);
}
}, 2000);
}
diff --git a/.cursor/skills/impeccable/SKILL.md b/.cursor/skills/impeccable/SKILL.md
index 7834b5bb1..9f579cd95 100644
--- a/.cursor/skills/impeccable/SKILL.md
+++ b/.cursor/skills/impeccable/SKILL.md
@@ -7,22 +7,6 @@ license: Apache 2.0. Based on Anthropic's frontend-design skill. See NOTICE.md f
Designs and iterates production-grade frontend interfaces. Real working code, committed design choices, exceptional craft.
-
-BEFORE doing any design work, run this one-time maintenance step. Tell the user:
-
-> **Impeccable 3.0 consolidation.** All standalone commands (/audit, /polish, /critique, etc.) are now accessed through /impeccable (e.g., `/impeccable audit`). I'll clean up the old standalone skill files. Use `/impeccable pin ` to restore shortcuts for commands you use often.
-
-Then run:
-
-```bash
-node .cursor/skills/impeccable/scripts/cleanup-deprecated.mjs
-```
-
-If the script removed files, briefly confirm what was cleaned up. If it found nothing, skip any output and move on.
-
-After running the script, delete this entire section (from `` through `` inclusive) from THIS file so it does not run again until the next update. Save the file.
-
-
## Setup (non-optional)
Two steps before any design work. Both are required. Skipping either produces generic output that ignores the project.
diff --git a/.cursor/skills/impeccable/scripts/live-browser.js b/.cursor/skills/impeccable/scripts/live-browser.js
index 8b1839211..65e779628 100644
--- a/.cursor/skills/impeccable/scripts/live-browser.js
+++ b/.cursor/skills/impeccable/scripts/live-browser.js
@@ -2818,14 +2818,18 @@ void main() {
// Static-server / no-HMR fallback: if the wrapper is still around 2s after
// the cleanup above, swap it out manually. By now React has either moved
- // on or the app isn't React at all.
+ // on or the app isn't React at all. Preserve the `data-impeccable-variant="N"`
+ // div (with display:contents) so @scope rules anchored to the variant
+ // attribute keep matching until reload replaces it with the carbonize block.
setTimeout(function() {
const wrapper = document.querySelector('[data-impeccable-variants="' + acceptedSessionId + '"]');
if (!wrapper) return;
const accepted = wrapper.querySelector('[data-impeccable-variant="' + acceptedVariant + '"]');
if (accepted && accepted.firstElementChild) {
const parent = wrapper.parentElement;
- if (parent) parent.replaceChild(accepted.firstElementChild.cloneNode(true), wrapper);
+ if (!parent) return;
+ accepted.style.display = 'contents';
+ parent.replaceChild(accepted, wrapper);
}
}, 2000);
}
diff --git a/.gemini/skills/impeccable/SKILL.md b/.gemini/skills/impeccable/SKILL.md
index bb93640ab..49c8c81eb 100644
--- a/.gemini/skills/impeccable/SKILL.md
+++ b/.gemini/skills/impeccable/SKILL.md
@@ -6,22 +6,6 @@ version: 3.0.0
Designs and iterates production-grade frontend interfaces. Real working code, committed design choices, exceptional craft.
-
-BEFORE doing any design work, run this one-time maintenance step. Tell the user:
-
-> **Impeccable 3.0 consolidation.** All standalone commands (/audit, /polish, /critique, etc.) are now accessed through /impeccable (e.g., `/impeccable audit`). I'll clean up the old standalone skill files. Use `/impeccable pin ` to restore shortcuts for commands you use often.
-
-Then run:
-
-```bash
-node .gemini/skills/impeccable/scripts/cleanup-deprecated.mjs
-```
-
-If the script removed files, briefly confirm what was cleaned up. If it found nothing, skip any output and move on.
-
-After running the script, delete this entire section (from `` through `` inclusive) from THIS file so it does not run again until the next update. Save the file.
-
-
## Setup (non-optional)
Two steps before any design work. Both are required. Skipping either produces generic output that ignores the project.
diff --git a/.gemini/skills/impeccable/scripts/live-browser.js b/.gemini/skills/impeccable/scripts/live-browser.js
index 8b1839211..65e779628 100644
--- a/.gemini/skills/impeccable/scripts/live-browser.js
+++ b/.gemini/skills/impeccable/scripts/live-browser.js
@@ -2818,14 +2818,18 @@ void main() {
// Static-server / no-HMR fallback: if the wrapper is still around 2s after
// the cleanup above, swap it out manually. By now React has either moved
- // on or the app isn't React at all.
+ // on or the app isn't React at all. Preserve the `data-impeccable-variant="N"`
+ // div (with display:contents) so @scope rules anchored to the variant
+ // attribute keep matching until reload replaces it with the carbonize block.
setTimeout(function() {
const wrapper = document.querySelector('[data-impeccable-variants="' + acceptedSessionId + '"]');
if (!wrapper) return;
const accepted = wrapper.querySelector('[data-impeccable-variant="' + acceptedVariant + '"]');
if (accepted && accepted.firstElementChild) {
const parent = wrapper.parentElement;
- if (parent) parent.replaceChild(accepted.firstElementChild.cloneNode(true), wrapper);
+ if (!parent) return;
+ accepted.style.display = 'contents';
+ parent.replaceChild(accepted, wrapper);
}
}, 2000);
}
diff --git a/.github/skills/impeccable/SKILL.md b/.github/skills/impeccable/SKILL.md
index 30ef89843..47754c347 100644
--- a/.github/skills/impeccable/SKILL.md
+++ b/.github/skills/impeccable/SKILL.md
@@ -9,22 +9,6 @@ license: Apache 2.0. Based on Anthropic's frontend-design skill. See NOTICE.md f
Designs and iterates production-grade frontend interfaces. Real working code, committed design choices, exceptional craft.
-
-BEFORE doing any design work, run this one-time maintenance step. Tell the user:
-
-> **Impeccable 3.0 consolidation.** All standalone commands (/audit, /polish, /critique, etc.) are now accessed through /impeccable (e.g., `/impeccable audit`). I'll clean up the old standalone skill files. Use `/impeccable pin ` to restore shortcuts for commands you use often.
-
-Then run:
-
-```bash
-node .github/skills/impeccable/scripts/cleanup-deprecated.mjs
-```
-
-If the script removed files, briefly confirm what was cleaned up. If it found nothing, skip any output and move on.
-
-After running the script, delete this entire section (from `` through `` inclusive) from THIS file so it does not run again until the next update. Save the file.
-
-
## Setup (non-optional)
Two steps before any design work. Both are required. Skipping either produces generic output that ignores the project.
diff --git a/.github/skills/impeccable/scripts/live-browser.js b/.github/skills/impeccable/scripts/live-browser.js
index 8b1839211..65e779628 100644
--- a/.github/skills/impeccable/scripts/live-browser.js
+++ b/.github/skills/impeccable/scripts/live-browser.js
@@ -2818,14 +2818,18 @@ void main() {
// Static-server / no-HMR fallback: if the wrapper is still around 2s after
// the cleanup above, swap it out manually. By now React has either moved
- // on or the app isn't React at all.
+ // on or the app isn't React at all. Preserve the `data-impeccable-variant="N"`
+ // div (with display:contents) so @scope rules anchored to the variant
+ // attribute keep matching until reload replaces it with the carbonize block.
setTimeout(function() {
const wrapper = document.querySelector('[data-impeccable-variants="' + acceptedSessionId + '"]');
if (!wrapper) return;
const accepted = wrapper.querySelector('[data-impeccable-variant="' + acceptedVariant + '"]');
if (accepted && accepted.firstElementChild) {
const parent = wrapper.parentElement;
- if (parent) parent.replaceChild(accepted.firstElementChild.cloneNode(true), wrapper);
+ if (!parent) return;
+ accepted.style.display = 'contents';
+ parent.replaceChild(accepted, wrapper);
}
}, 2000);
}
diff --git a/.kiro/skills/impeccable/SKILL.md b/.kiro/skills/impeccable/SKILL.md
index c3dc00364..05c07fba1 100644
--- a/.kiro/skills/impeccable/SKILL.md
+++ b/.kiro/skills/impeccable/SKILL.md
@@ -7,22 +7,6 @@ license: Apache 2.0. Based on Anthropic's frontend-design skill. See NOTICE.md f
Designs and iterates production-grade frontend interfaces. Real working code, committed design choices, exceptional craft.
-
-BEFORE doing any design work, run this one-time maintenance step. Tell the user:
-
-> **Impeccable 3.0 consolidation.** All standalone commands (/audit, /polish, /critique, etc.) are now accessed through /impeccable (e.g., `/impeccable audit`). I'll clean up the old standalone skill files. Use `/impeccable pin ` to restore shortcuts for commands you use often.
-
-Then run:
-
-```bash
-node .kiro/skills/impeccable/scripts/cleanup-deprecated.mjs
-```
-
-If the script removed files, briefly confirm what was cleaned up. If it found nothing, skip any output and move on.
-
-After running the script, delete this entire section (from `` through `` inclusive) from THIS file so it does not run again until the next update. Save the file.
-
-
## Setup (non-optional)
Two steps before any design work. Both are required. Skipping either produces generic output that ignores the project.
diff --git a/.kiro/skills/impeccable/scripts/live-browser.js b/.kiro/skills/impeccable/scripts/live-browser.js
index 8b1839211..65e779628 100644
--- a/.kiro/skills/impeccable/scripts/live-browser.js
+++ b/.kiro/skills/impeccable/scripts/live-browser.js
@@ -2818,14 +2818,18 @@ void main() {
// Static-server / no-HMR fallback: if the wrapper is still around 2s after
// the cleanup above, swap it out manually. By now React has either moved
- // on or the app isn't React at all.
+ // on or the app isn't React at all. Preserve the `data-impeccable-variant="N"`
+ // div (with display:contents) so @scope rules anchored to the variant
+ // attribute keep matching until reload replaces it with the carbonize block.
setTimeout(function() {
const wrapper = document.querySelector('[data-impeccable-variants="' + acceptedSessionId + '"]');
if (!wrapper) return;
const accepted = wrapper.querySelector('[data-impeccable-variant="' + acceptedVariant + '"]');
if (accepted && accepted.firstElementChild) {
const parent = wrapper.parentElement;
- if (parent) parent.replaceChild(accepted.firstElementChild.cloneNode(true), wrapper);
+ if (!parent) return;
+ accepted.style.display = 'contents';
+ parent.replaceChild(accepted, wrapper);
}
}, 2000);
}
diff --git a/.opencode/skills/impeccable/SKILL.md b/.opencode/skills/impeccable/SKILL.md
index e186eca85..e9b79285d 100644
--- a/.opencode/skills/impeccable/SKILL.md
+++ b/.opencode/skills/impeccable/SKILL.md
@@ -11,22 +11,6 @@ allowed-tools:
Designs and iterates production-grade frontend interfaces. Real working code, committed design choices, exceptional craft.
-
-BEFORE doing any design work, run this one-time maintenance step. Tell the user:
-
-> **Impeccable 3.0 consolidation.** All standalone commands (/audit, /polish, /critique, etc.) are now accessed through /impeccable (e.g., `/impeccable audit`). I'll clean up the old standalone skill files. Use `/impeccable pin ` to restore shortcuts for commands you use often.
-
-Then run:
-
-```bash
-node .opencode/skills/impeccable/scripts/cleanup-deprecated.mjs
-```
-
-If the script removed files, briefly confirm what was cleaned up. If it found nothing, skip any output and move on.
-
-After running the script, delete this entire section (from `` through `` inclusive) from THIS file so it does not run again until the next update. Save the file.
-
-
## Setup (non-optional)
Two steps before any design work. Both are required. Skipping either produces generic output that ignores the project.
diff --git a/.opencode/skills/impeccable/scripts/live-browser.js b/.opencode/skills/impeccable/scripts/live-browser.js
index 8b1839211..65e779628 100644
--- a/.opencode/skills/impeccable/scripts/live-browser.js
+++ b/.opencode/skills/impeccable/scripts/live-browser.js
@@ -2818,14 +2818,18 @@ void main() {
// Static-server / no-HMR fallback: if the wrapper is still around 2s after
// the cleanup above, swap it out manually. By now React has either moved
- // on or the app isn't React at all.
+ // on or the app isn't React at all. Preserve the `data-impeccable-variant="N"`
+ // div (with display:contents) so @scope rules anchored to the variant
+ // attribute keep matching until reload replaces it with the carbonize block.
setTimeout(function() {
const wrapper = document.querySelector('[data-impeccable-variants="' + acceptedSessionId + '"]');
if (!wrapper) return;
const accepted = wrapper.querySelector('[data-impeccable-variant="' + acceptedVariant + '"]');
if (accepted && accepted.firstElementChild) {
const parent = wrapper.parentElement;
- if (parent) parent.replaceChild(accepted.firstElementChild.cloneNode(true), wrapper);
+ if (!parent) return;
+ accepted.style.display = 'contents';
+ parent.replaceChild(accepted, wrapper);
}
}, 2000);
}
diff --git a/.pi/skills/impeccable/SKILL.md b/.pi/skills/impeccable/SKILL.md
index e1d5b859e..0553686db 100644
--- a/.pi/skills/impeccable/SKILL.md
+++ b/.pi/skills/impeccable/SKILL.md
@@ -9,22 +9,6 @@ allowed-tools:
Designs and iterates production-grade frontend interfaces. Real working code, committed design choices, exceptional craft.
-
-BEFORE doing any design work, run this one-time maintenance step. Tell the user:
-
-> **Impeccable 3.0 consolidation.** All standalone commands (/audit, /polish, /critique, etc.) are now accessed through /impeccable (e.g., `/impeccable audit`). I'll clean up the old standalone skill files. Use `/impeccable pin ` to restore shortcuts for commands you use often.
-
-Then run:
-
-```bash
-node .pi/skills/impeccable/scripts/cleanup-deprecated.mjs
-```
-
-If the script removed files, briefly confirm what was cleaned up. If it found nothing, skip any output and move on.
-
-After running the script, delete this entire section (from `` through `` inclusive) from THIS file so it does not run again until the next update. Save the file.
-
-
## Setup (non-optional)
Two steps before any design work. Both are required. Skipping either produces generic output that ignores the project.
diff --git a/.pi/skills/impeccable/scripts/live-browser.js b/.pi/skills/impeccable/scripts/live-browser.js
index 8b1839211..65e779628 100644
--- a/.pi/skills/impeccable/scripts/live-browser.js
+++ b/.pi/skills/impeccable/scripts/live-browser.js
@@ -2818,14 +2818,18 @@ void main() {
// Static-server / no-HMR fallback: if the wrapper is still around 2s after
// the cleanup above, swap it out manually. By now React has either moved
- // on or the app isn't React at all.
+ // on or the app isn't React at all. Preserve the `data-impeccable-variant="N"`
+ // div (with display:contents) so @scope rules anchored to the variant
+ // attribute keep matching until reload replaces it with the carbonize block.
setTimeout(function() {
const wrapper = document.querySelector('[data-impeccable-variants="' + acceptedSessionId + '"]');
if (!wrapper) return;
const accepted = wrapper.querySelector('[data-impeccable-variant="' + acceptedVariant + '"]');
if (accepted && accepted.firstElementChild) {
const parent = wrapper.parentElement;
- if (parent) parent.replaceChild(accepted.firstElementChild.cloneNode(true), wrapper);
+ if (!parent) return;
+ accepted.style.display = 'contents';
+ parent.replaceChild(accepted, wrapper);
}
}, 2000);
}
diff --git a/.rovodev/skills/impeccable/SKILL.md b/.rovodev/skills/impeccable/SKILL.md
index 12d459937..3e21cada6 100644
--- a/.rovodev/skills/impeccable/SKILL.md
+++ b/.rovodev/skills/impeccable/SKILL.md
@@ -11,22 +11,6 @@ allowed-tools:
Designs and iterates production-grade frontend interfaces. Real working code, committed design choices, exceptional craft.
-
-BEFORE doing any design work, run this one-time maintenance step. Tell the user:
-
-> **Impeccable 3.0 consolidation.** All standalone commands (/audit, /polish, /critique, etc.) are now accessed through /impeccable (e.g., `/impeccable audit`). I'll clean up the old standalone skill files. Use `/impeccable pin ` to restore shortcuts for commands you use often.
-
-Then run:
-
-```bash
-node .rovodev/skills/impeccable/scripts/cleanup-deprecated.mjs
-```
-
-If the script removed files, briefly confirm what was cleaned up. If it found nothing, skip any output and move on.
-
-After running the script, delete this entire section (from `` through `` inclusive) from THIS file so it does not run again until the next update. Save the file.
-
-
## Setup (non-optional)
Two steps before any design work. Both are required. Skipping either produces generic output that ignores the project.
diff --git a/.rovodev/skills/impeccable/scripts/live-browser.js b/.rovodev/skills/impeccable/scripts/live-browser.js
index 8b1839211..65e779628 100644
--- a/.rovodev/skills/impeccable/scripts/live-browser.js
+++ b/.rovodev/skills/impeccable/scripts/live-browser.js
@@ -2818,14 +2818,18 @@ void main() {
// Static-server / no-HMR fallback: if the wrapper is still around 2s after
// the cleanup above, swap it out manually. By now React has either moved
- // on or the app isn't React at all.
+ // on or the app isn't React at all. Preserve the `data-impeccable-variant="N"`
+ // div (with display:contents) so @scope rules anchored to the variant
+ // attribute keep matching until reload replaces it with the carbonize block.
setTimeout(function() {
const wrapper = document.querySelector('[data-impeccable-variants="' + acceptedSessionId + '"]');
if (!wrapper) return;
const accepted = wrapper.querySelector('[data-impeccable-variant="' + acceptedVariant + '"]');
if (accepted && accepted.firstElementChild) {
const parent = wrapper.parentElement;
- if (parent) parent.replaceChild(accepted.firstElementChild.cloneNode(true), wrapper);
+ if (!parent) return;
+ accepted.style.display = 'contents';
+ parent.replaceChild(accepted, wrapper);
}
}, 2000);
}
diff --git a/.trae-cn/skills/impeccable/SKILL.md b/.trae-cn/skills/impeccable/SKILL.md
index 5682fbe4b..f471d8537 100644
--- a/.trae-cn/skills/impeccable/SKILL.md
+++ b/.trae-cn/skills/impeccable/SKILL.md
@@ -9,22 +9,6 @@ license: Apache 2.0. Based on Anthropic's frontend-design skill. See NOTICE.md f
Designs and iterates production-grade frontend interfaces. Real working code, committed design choices, exceptional craft.
-
-BEFORE doing any design work, run this one-time maintenance step. Tell the user:
-
-> **Impeccable 3.0 consolidation.** All standalone commands (/audit, /polish, /critique, etc.) are now accessed through /impeccable (e.g., `/impeccable audit`). I'll clean up the old standalone skill files. Use `/impeccable pin ` to restore shortcuts for commands you use often.
-
-Then run:
-
-```bash
-node .trae-cn/skills/impeccable/scripts/cleanup-deprecated.mjs
-```
-
-If the script removed files, briefly confirm what was cleaned up. If it found nothing, skip any output and move on.
-
-After running the script, delete this entire section (from `` through `` inclusive) from THIS file so it does not run again until the next update. Save the file.
-
-
## Setup (non-optional)
Two steps before any design work. Both are required. Skipping either produces generic output that ignores the project.
diff --git a/.trae-cn/skills/impeccable/scripts/live-browser.js b/.trae-cn/skills/impeccable/scripts/live-browser.js
index 8b1839211..65e779628 100644
--- a/.trae-cn/skills/impeccable/scripts/live-browser.js
+++ b/.trae-cn/skills/impeccable/scripts/live-browser.js
@@ -2818,14 +2818,18 @@ void main() {
// Static-server / no-HMR fallback: if the wrapper is still around 2s after
// the cleanup above, swap it out manually. By now React has either moved
- // on or the app isn't React at all.
+ // on or the app isn't React at all. Preserve the `data-impeccable-variant="N"`
+ // div (with display:contents) so @scope rules anchored to the variant
+ // attribute keep matching until reload replaces it with the carbonize block.
setTimeout(function() {
const wrapper = document.querySelector('[data-impeccable-variants="' + acceptedSessionId + '"]');
if (!wrapper) return;
const accepted = wrapper.querySelector('[data-impeccable-variant="' + acceptedVariant + '"]');
if (accepted && accepted.firstElementChild) {
const parent = wrapper.parentElement;
- if (parent) parent.replaceChild(accepted.firstElementChild.cloneNode(true), wrapper);
+ if (!parent) return;
+ accepted.style.display = 'contents';
+ parent.replaceChild(accepted, wrapper);
}
}, 2000);
}
diff --git a/.trae/skills/impeccable/SKILL.md b/.trae/skills/impeccable/SKILL.md
index a097b0a41..9b5d10abd 100644
--- a/.trae/skills/impeccable/SKILL.md
+++ b/.trae/skills/impeccable/SKILL.md
@@ -9,22 +9,6 @@ license: Apache 2.0. Based on Anthropic's frontend-design skill. See NOTICE.md f
Designs and iterates production-grade frontend interfaces. Real working code, committed design choices, exceptional craft.
-
-BEFORE doing any design work, run this one-time maintenance step. Tell the user:
-
-> **Impeccable 3.0 consolidation.** All standalone commands (/audit, /polish, /critique, etc.) are now accessed through /impeccable (e.g., `/impeccable audit`). I'll clean up the old standalone skill files. Use `/impeccable pin ` to restore shortcuts for commands you use often.
-
-Then run:
-
-```bash
-node .trae/skills/impeccable/scripts/cleanup-deprecated.mjs
-```
-
-If the script removed files, briefly confirm what was cleaned up. If it found nothing, skip any output and move on.
-
-After running the script, delete this entire section (from `` through `` inclusive) from THIS file so it does not run again until the next update. Save the file.
-
-
## Setup (non-optional)
Two steps before any design work. Both are required. Skipping either produces generic output that ignores the project.
diff --git a/.trae/skills/impeccable/scripts/live-browser.js b/.trae/skills/impeccable/scripts/live-browser.js
index 8b1839211..65e779628 100644
--- a/.trae/skills/impeccable/scripts/live-browser.js
+++ b/.trae/skills/impeccable/scripts/live-browser.js
@@ -2818,14 +2818,18 @@ void main() {
// Static-server / no-HMR fallback: if the wrapper is still around 2s after
// the cleanup above, swap it out manually. By now React has either moved
- // on or the app isn't React at all.
+ // on or the app isn't React at all. Preserve the `data-impeccable-variant="N"`
+ // div (with display:contents) so @scope rules anchored to the variant
+ // attribute keep matching until reload replaces it with the carbonize block.
setTimeout(function() {
const wrapper = document.querySelector('[data-impeccable-variants="' + acceptedSessionId + '"]');
if (!wrapper) return;
const accepted = wrapper.querySelector('[data-impeccable-variant="' + acceptedVariant + '"]');
if (accepted && accepted.firstElementChild) {
const parent = wrapper.parentElement;
- if (parent) parent.replaceChild(accepted.firstElementChild.cloneNode(true), wrapper);
+ if (!parent) return;
+ accepted.style.display = 'contents';
+ parent.replaceChild(accepted, wrapper);
}
}, 2000);
}
diff --git a/AGENTS.md b/AGENTS.md
index 954bc3df1..8bc23b79d 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -1,5 +1,9 @@
# Repository Guidelines
+## Skill bootstrap: skip the post-update-cleanup step
+
+If you load the Impeccable skill from `.agents/skills/impeccable/SKILL.md` (or any sibling harness directory under this repo), it begins with a `` block that runs `scripts/cleanup-deprecated.mjs` and then self-deletes. **Do not run it here, and do not delete the block.** This repo is the source of truth for the skill; cleanup-deprecated assumes a consumer project and would touch legitimate source files. The block is regenerated from `source/skills/impeccable/SKILL.md` on every `bun run build`, so any deletion churns back. Skip it silently and proceed with the task.
+
## Project Structure & Module Organization
`source/` is the source of truth. Author skills in `source/skills/impeccable/` and keep provider output in `dist/` generated, not hand-edited. Build logic lives in `scripts/`, with provider configs in `scripts/lib/transformers/`. Runtime detection code ships from `src/`. The website lives in `public/`, local API/dev serving lives in `server/`, and regression coverage lives in `tests/` with fixtures under `tests/fixtures/`.
diff --git a/CLAUDE.md b/CLAUDE.md
index f5ce038ef..23e40722e 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -1,5 +1,11 @@
# Project Instructions for Claude
+## Skill bootstrap: skip the post-update-cleanup step
+
+The `` block at the top of `.claude/skills/impeccable/SKILL.md` runs `scripts/cleanup-deprecated.mjs` and then self-deletes. **Do not run it in this repo, and do not delete the block.** This repo is the source of truth for the Impeccable skill; the cleanup script scans for "leftover" skill files to remove and its judgment doesn't fit a repo where the skill lives in `source/`. The block is also regenerated from `source/skills/impeccable/SKILL.md` on every `bun run build`, so any deletion churns back on the next build. Skip the step silently and proceed.
+
+Same rule for AGENTS.md and every other harness-specific instruction file: treat post-update-cleanup as a no-op in this repo.
+
## Architecture (v3.0+)
There is **one** user-invocable skill, `impeccable`, with **23 commands** underneath it. Users type `/impeccable polish`, `/impeccable audit`, etc. The skill is defined in `source/skills/impeccable/`:
diff --git a/content/site/skills/live.md b/content/site/skills/live.md
index 99cacf47d..ae2969609 100644
--- a/content/site/skills/live.md
+++ b/content/site/skills/live.md
@@ -7,6 +7,11 @@ tagline: "Iterate on UI in the browser. Pick an element, drop a comment, get thr
See it in action, with the animated demo, at /live-mode. This page is the reference for what your AI harness reads when the command runs.
+
+ ▸
+ Status: alpha. Live Mode works end-to-end and is ready to try, but it still needs more testing against real-world repos and framework configs. Expect rough edges on uncommon setups, and please report what breaks.
+
Scans tokens, components, and rendered output. Writes a spec-compliant DESIGN.md.
+
+
-
+
- Before any of this
-
Pick a register.
-
Brand and product surfaces have different defaults. Impeccable tracks this in PRODUCT.md as a single field, so commands like typeset, animate, and colorize adapt their vocabulary to match.
+ Two lanes
+
Brand, or product.
+
Two defaults with different vocabularies. Impeccable picks the lane from your task cue and PRODUCT.md before every command, so typeset, animate, colorize, and friends adjust their output to match. You rarely need to set it by hand.
-
-
-
- No. 04 · Dispatch
- Letters, occasionally.
+
+
+ Brand
+
Design IS the product. Marketing, landing, editorial, long-form, portfolio.
Design serves the task. App UI, admin, dashboards, tools.
+
+ Newsletter
+ Subscribe to updates
-
-
-
The same element, rendered in brand register (editorial masthead) and product register (utility). Register is answered once during teach and applies to every downstream command.
DESIGN.md follows the format Google Stitch publishes. Not a lock-in. When you outgrow Impeccable or want a second opinion from another tool, the file comes with you.
Pick any element in the browser. Drop a comment or a stroke. Hit Go. Three production-quality variants swap in via your framework's HMR. Accept the one you want and it writes back to source.
diff --git a/public/js/components/framework-viz.js b/public/js/components/framework-viz.js
index 1caf03d55..bde86bac2 100644
--- a/public/js/components/framework-viz.js
+++ b/public/js/components/framework-viz.js
@@ -4,7 +4,7 @@
* Hover tooltips show description and relationships inline.
*/
-import { commandCategories, commandRelationships, betaCommands } from '../data.js';
+import { commandCategories, commandRelationships, alphaCommands } from '../data.js';
const categoryColors = {
create: { bg: 'var(--cat-create-bg)', border: 'var(--cat-create-border)', text: 'var(--cat-create-text)' },
@@ -298,8 +298,8 @@ export class PeriodicTable {
}
el.appendChild(name);
- // Beta badge
- if (betaCommands.includes(cmd)) {
+ // Alpha badge
+ if (alphaCommands.includes(cmd)) {
const badge = document.createElement('div');
badge.style.cssText = `
position: absolute;
@@ -312,7 +312,7 @@ export class PeriodicTable {
opacity: 0.45;
text-transform: uppercase;
`;
- badge.textContent = 'β';
+ badge.textContent = 'α';
el.appendChild(badge);
}
diff --git a/public/js/components/glass-terminal.js b/public/js/components/glass-terminal.js
index cd1673482..71f79f357 100644
--- a/public/js/components/glass-terminal.js
+++ b/public/js/components/glass-terminal.js
@@ -1,6 +1,6 @@
import { renderCommandDemo, initCommandDemo } from "../demo-renderer.js";
import { initSplitCompare } from "../effects/split-compare.js";
-import { commandProcessSteps, commandCategories, commandRelationships, betaCommands } from "../data.js";
+import { commandProcessSteps, commandCategories, commandRelationships, alphaCommands } from "../data.js";
// Track current split instance and command for cleanup
let currentSplitInstance = null;
@@ -134,14 +134,14 @@ function renderDesktopLayout(container, commands) {
const fisheyeHTML = filteredCommands.map((cmd, i) => {
const cat = commandCategories[cmd.id] || 'other';
- const isBeta = betaCommands.includes(cmd.id);
+ const isAlpha = alphaCommands.includes(cmd.id);
// The root skill is shown as "/impeccable", everything else is a sub-command
// displayed without a slash (invocation is /impeccable )
const isRoot = cmd.id === 'impeccable';
const label = isRoot
? `/impeccable`
: cmd.id;
- return ``;
+ return ``;
}).join('');
container.innerHTML = `
@@ -166,7 +166,7 @@ function renderDesktopLayout(container, commands) {
function renderSpread(cmd, index, isActive) {
const cat = commandCategories[cmd.id] || 'other';
- const isBeta = betaCommands.includes(cmd.id);
+ const isAlpha = alphaCommands.includes(cmd.id);
const relationship = commandRelationships[cmd.id];
// Build relationship flow
let flowHTML = '';
@@ -213,7 +213,7 @@ function renderSpread(cmd, index, isActive) {
${categoryLabels[cat] || cat}
-
${nameHTML}${isBeta ? 'BETA' : ''}
+
${nameHTML}${isAlpha ? 'ALPHA' : ''}
${cmd.tagline || cmd.description}
${flowHTML}
diff --git a/public/js/data.js b/public/js/data.js
index 25e61a855..16a0ab53f 100644
--- a/public/js/data.js
+++ b/public/js/data.js
@@ -12,8 +12,8 @@ export const readyCommands = [
'layout' // First command to be fully completed
];
-// Commands marked as beta — shown with a badge in the UI
-export const betaCommands = [
+// Commands marked as alpha — shown with a badge in the UI
+export const alphaCommands = [
'live'
];
diff --git a/public/live-mode/index.html b/public/live-mode/index.html
index 2668afe19..1a76f9ded 100644
--- a/public/live-mode/index.html
+++ b/public/live-mode/index.html
@@ -46,9 +46,10 @@
-
New in v3.0 Beta
+
New in v3.0 Alpha
Live Mode
Pick any element in the browser. Drop a comment or a stroke. Three production-quality variants swap in via your framework's HMR. Accept the one you want and it writes back to source.
+
Why alpha: Live Mode works end-to-end and is ready to try, but it still needs more testing against real-world repos and framework configs. Expect rough edges on uncommon setups, and please report what breaks.
@@ -805,9 +805,10 @@ function renderLiveModeMain() {
return `
-
New in v3.0 Beta
+
New in v3.0 Alpha
Live Mode
Pick any element in the browser. Drop a comment or a stroke. Three production-quality variants swap in via your framework's HMR. Accept the one you want and it writes back to source.
+
Why alpha: Live Mode works end-to-end and is ready to try, but it still needs more testing against real-world repos and framework configs. Expect rough edges on uncommon setups, and please report what breaks.
$/impeccable live
@@ -1143,20 +1144,28 @@ function renderDesigningMain() {
Scans tokens, components, and rendered output. Writes a spec-compliant DESIGN.md.
+
+
-
+
- Before any of this
-
Pick a register.
-
Brand and product surfaces have different defaults. Impeccable tracks this in PRODUCT.md as a single field, so commands like typeset, animate, and colorize adapt their vocabulary to match.
+ Two lanes
+
Brand, or product.
+
Two defaults with different vocabularies. Impeccable picks the lane from your task cue and PRODUCT.md before every command, so typeset, animate, colorize, and friends adjust their output to match. You rarely need to set it by hand.
-
-
-
- No. 04 · Dispatch
- Letters, occasionally.
+
+
+ Brand
+
Design IS the product. Marketing, landing, editorial, long-form, portfolio.
Design serves the task. App UI, admin, dashboards, tools.
+
+ Newsletter
+ Subscribe to updates
-
-
-
The same element, rendered in brand register (editorial masthead) and product register (utility). Register is answered once during teach and applies to every downstream command.
DESIGN.md follows the format Google Stitch publishes. Not a lock-in. When you outgrow Impeccable or want a second opinion from another tool, the file comes with you.
diff --git a/source/skills/impeccable/SKILL.md b/source/skills/impeccable/SKILL.md
index 7d11094c6..3e30929bd 100644
--- a/source/skills/impeccable/SKILL.md
+++ b/source/skills/impeccable/SKILL.md
@@ -10,22 +10,6 @@ license: Apache 2.0. Based on Anthropic's frontend-design skill. See NOTICE.md f
Designs and iterates production-grade frontend interfaces. Real working code, committed design choices, exceptional craft.
-
-BEFORE doing any design work, run this one-time maintenance step. Tell the user:
-
-> **Impeccable 3.0 consolidation.** All standalone commands ({{command_prefix}}audit, {{command_prefix}}polish, {{command_prefix}}critique, etc.) are now accessed through {{command_prefix}}impeccable (e.g., `{{command_prefix}}impeccable audit`). I'll clean up the old standalone skill files. Use `{{command_prefix}}impeccable pin ` to restore shortcuts for commands you use often.
-
-Then run:
-
-```bash
-node {{scripts_path}}/cleanup-deprecated.mjs
-```
-
-If the script removed files, briefly confirm what was cleaned up. If it found nothing, skip any output and move on.
-
-After running the script, delete this entire section (from `` through `` inclusive) from THIS file so it does not run again until the next update. Save the file.
-
-
## Setup (non-optional)
Two steps before any design work. Both are required. Skipping either produces generic output that ignores the project.
diff --git a/source/skills/impeccable/scripts/live-browser.js b/source/skills/impeccable/scripts/live-browser.js
index 8b1839211..65e779628 100644
--- a/source/skills/impeccable/scripts/live-browser.js
+++ b/source/skills/impeccable/scripts/live-browser.js
@@ -2818,14 +2818,18 @@ void main() {
// Static-server / no-HMR fallback: if the wrapper is still around 2s after
// the cleanup above, swap it out manually. By now React has either moved
- // on or the app isn't React at all.
+ // on or the app isn't React at all. Preserve the `data-impeccable-variant="N"`
+ // div (with display:contents) so @scope rules anchored to the variant
+ // attribute keep matching until reload replaces it with the carbonize block.
setTimeout(function() {
const wrapper = document.querySelector('[data-impeccable-variants="' + acceptedSessionId + '"]');
if (!wrapper) return;
const accepted = wrapper.querySelector('[data-impeccable-variant="' + acceptedVariant + '"]');
if (accepted && accepted.firstElementChild) {
const parent = wrapper.parentElement;
- if (parent) parent.replaceChild(accepted.firstElementChild.cloneNode(true), wrapper);
+ if (!parent) return;
+ accepted.style.display = 'contents';
+ parent.replaceChild(accepted, wrapper);
}
}, 2000);
}