From ab5f84ee9dccc0b34543bef4f0bb3346e63af67c Mon Sep 17 00:00:00 2001 From: Youssef Date: Mon, 18 May 2026 15:37:09 +0100 Subject: [PATCH] =?UTF-8?q?Fix=20=C2=B7=20study=20handoff=20uses=20extract?= =?UTF-8?q?ed=20DNA=20as=20the=20system,=20not=20a=20catalog=20theme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When the user ran `study ` and then said "build it", Hallmark fell back to a catalog theme (the "closest cousin" hint in the diagnosis) instead of using the studied DNA — paper/accent/fonts/macrostructure from the source were discarded. - study.md: rewrote both diagnosis templates and the worked example. The "closest catalog theme" line is now framed as an explicit pivot option ("just say 'use X instead'"), not a recommendation. The "build it" handoff explicitly uses the studied DNA as the system. - SKILL.md § 2.6: new Condition 0 (highest priority) — when a study diagnosis was emitted earlier in the conversation and the user asks to build from it ("build it" / "make it" / "use this DNA"), skip catalog/custom dispatch entirely. The DNA's tokens, macrostructure, and archetypes become the locked system. Diversification suspended for the build. Pivot phrases ("use Linen instead" / "ignore the DNA") route back to normal dispatch. - SKILL.md Step 6: stamp's `theme:` field is `studied-DNA (source: )` with inline OKLCH/font values for studied builds. - slop-test.md: new gate 69 auto-fails any build that names a catalog theme in its stamp when a recent study exists and the user didn't explicitly pivot. - Gate count bumped 68 → 69 in SKILL.md + preview-examples.md. --- skill/SKILL.md | 13 +++++++------ skill/references/preview-examples.md | 8 ++++---- skill/references/slop-test.md | 4 +++- skill/references/study.md | 24 +++++++++++++++++------- 4 files changed, 31 insertions(+), 18 deletions(-) diff --git a/skill/SKILL.md b/skill/SKILL.md index 5635d5c..dd0a358 100644 --- a/skill/SKILL.md +++ b/skill/SKILL.md @@ -319,10 +319,11 @@ Then the theme rotation, on the next line: The rotation block keeps the user inside the discipline without making them read the rules. Skip it and the user starts thinking the diversification is theatre. -### 2.6. Theme route — catalog or custom +### 2.6. Theme route — studied-DNA, catalog, or custom -By the time you reach this step, one of three things is true: +By the time you reach this step, one of four things is true: +0. **A `study` diagnosis was emitted earlier in this conversation and the user is asking to build from it** (phrases: *"build it"*, *"make it"*, *"use this DNA"*, *"build with this"* — immediately following the diagnosis) → theme route is **studied-DNA**. **Skip catalog/custom dispatch entirely.** The studied paper OKLCH, accent OKLCH, type roles (with named candidates), macrostructure, and nav/footer archetypes from the diagnosis become the locked system for this build. Diversification is suspended — you're following an external DNA, not rotating the catalog. The Step 6 stamp records `theme: studied-DNA (source: )` plus the actual OKLCH/font values inline. **If the user later pivots with phrases like *"use Linen instead"* / *"ignore the DNA"* / *"rotate to a different theme"*,** route back to the normal dispatch below and resume diversification. Continue to Step 3. 1. **The user named custom** (because they said so, or because Step 1's signal detection fired and they confirmed) → load [`references/custom-theme.md`](references/custom-theme.md), ask the **one** follow-up (vibe in 4–8 words + optional anchor colour), construct the OKLCH palette + free-font pairing, compute the three axis values (paper-band / display-style / accent-hue), then continue to Step 3. 2. **The user named catalog** (or implicitly accepted it by not naming custom) → pick one of the 22 named themes per the diversification rule above. Existing flow — continue to Step 3. 3. **Neither was discussed** (Step 1's signals didn't fire — vanilla brief) → default to **catalog**. Do not pause. Do not ask. Continue to Step 3. @@ -403,7 +404,7 @@ Before emitting any code, output a tight summary of what you're about to ship. T - **Enrichment** · none (typography only) - **Sections** · Hero · Logos · Stats · Features · Testimonials · Pricing · FAQ · CTA · Footer - **Motion** · counter · pricing-lift · pulse-once -- **Slop test** · 68 / 68 ✓ (run after Build) +- **Slop test** · 69 / 69 ✓ (run after Build) - **Diversification** · differs from Linen on display style + accent hue ``` @@ -414,7 +415,7 @@ Before emitting any code, output a tight summary of what you're about to ship. T 3. **Enrichment** — the chosen archetype + tier, or *none (typography only)*. 4. **Sections** — section names separated by ` · `, in DOM order. 5. **Motion** — microinteraction primitives separated by ` · `, or *none — typography only*. Always under three primitives per the [`microinteractions.md`](references/microinteractions.md) hard rules. -6. **Slop test** — `68 / 68 ✓` if all gates pass, or `N / 68 — fails: ` if any are open. Run the slop test BEFORE writing this row; the slop test is Step 7. +6. **Slop test** — `69 / 69 ✓` if all gates pass, or `N / 69 — fails: ` if any are open. Run the slop test BEFORE writing this row; the slop test is Step 7. 7. **Diversification** *(optional, only when `.hallmark/log.json` has prior entries)* — what axes differ vs the previous run. **Then one quiet CTA line, italicised, after the bullets:** @@ -445,7 +446,7 @@ Always: - Include `:focus-visible` with a visible ring at ≥3:1 contrast. **Never animate the ring's appearance** — it must show instantly on focus. - For each interaction in the output (button, input, modal, toast, drag, copy, etc.), apply the recipe in [`microinteractions.md`](references/microinteractions.md). Pick *silent success* over celebratory toasts. Pick *optimistic update + Undo* over confirmation dialogs. Pick *delay 800ms* on hover tooltips and *0ms* on focus tooltips. - Cut motion before adding it. Most pages have too much, not too little. If removing an animation wouldn't lose the user information, remove it. -- **Stamp the output.** The first non-empty line of the produced CSS file (or the top of `