Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions .agents/skills/design-guard/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,10 @@ description: Judgment check before delivering any UI or user-facing output: scre
Render the thing (screenshot, preview, generated document) and check *that*, not the source.
DESIGN.md and VOICE.md are the measuring stick; this catches what automation can't.

Is it a persuasion page (landing, marketing, portfolio, explainer)? Then skill `taste` carried
the build rules and its pre-flight already ran; this guard re-checks the rendered result, and
every `taste` section 11 tell that survived into the render is a finding here.
Is it a frontend? Then the installed design method built it, its craft floor and its detector
already ran, and a finish reviewer already scored it. Start from that verdict: re-check the render
against the direction contract in the artifact's opening comment, and report what is still open
rather than opening a fresh hunt.

## Visual

Expand Down
19 changes: 10 additions & 9 deletions .agents/skills/design/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ input, and holds open the three points where the owner decides.

`docs/design/DESIGN.md` sections 1 and 2 and `docs/design/VOICE.md` carry the durable principles
and the owner's standing defaults. DESIGN.md **section 3 is not written here**: it is recorded from
the world that was actually built, after the finish review (step 5). A rulebook written before the
the world that was actually built, after the finish review (step 4). A rulebook written before the
build gets defended against reality instead of describing it.

No design method installed (a project that started without an interface, a failed install recorded
Expand Down Expand Up @@ -85,6 +85,14 @@ Then hand the method its input, once, and let it run:
hand over VOICE.md section 3 and the foundation decision from step 2.
- **The accessibility floor** in principle 8 and `docs/compliance/COMPLIANCE.md` is not negotiable
by any direction.
- **The live-surface contract, on a redesign.** A surface that already has visitors carries
commitments the method does not know about and will not preserve on its own: URL structure and
slugs, page titles and structured data, primary navigation labels, form field names and their
order, analytics event and field names, the logo or wordmark, and legal or consent copy. Write
that list down from the live site before the direction round, hand it over as a constraint, and
check the built result against it. Anything on it that does change, changes on the owner's say-so
and ships with redirects. Losing the search ranking is the most expensive way a redesign can
succeed visually and fail commercially.

The owner decides at three points, in this order. This is the order of work:

Expand Down Expand Up @@ -114,14 +122,7 @@ The owner decides at three points, in this order. This is the order of work:
An addition inside a surface that already exists inherits that surface: it is not a new identity
exercise, and it does not run this round again.

## 4. Set the taste dials

For pages meant to persuade (landing, marketing, portfolio, explainer), skill `taste` carries
the per-page execution rules. Set its three dials (VARIANCE / MOTION / DENSITY) here, from the
direction the owner chose, and record them in DESIGN.md section 3 so every later page build starts
from the same read.

## 5. Record
## 4. Record

After the finish review, DESIGN.md section 3 is written from the built world: the foundation from
step 2, the tokens as they exist in code (code is the SSOT, DESIGN.md mirrors it), the component
Expand Down
308 changes: 0 additions & 308 deletions .agents/skills/taste/SKILL.md

This file was deleted.

1 change: 0 additions & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,6 @@ trigger applies. The library:
| `stack` | Choosing the tech stack or hosted platform; generates `docs/standards/<stack>.md`, wires gates |
| `architect` | System design before building: boundaries, data, contracts, threats |
| `design` | Standing up the project's design & voice system |
| `taste` | Building or redesigning a landing page, marketing site, portfolio or explainer |
| `scope-guard` | Before calling work done or proposing a commit |
| `design-guard` | Before delivering any UI or user-facing output |
| `verify` | Verifying a change actually works, end to end |
Expand Down
5 changes: 4 additions & 1 deletion checks/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,10 @@
{ "pattern": "skipSymlinkCheck\"?\\s*:\\s*true", "why": "retired instruction; skipSymlinkCheck takes the reason as a string value and config-invariants rejects a bare true, so an exemption states its case (INTAKE row 58)" },
{ "pattern": "COMPLIANCE\\.md.{0,4}§ ?[12]|§ ?[12].{0,40}COMPLIANCE\\.md", "why": "retired pointer; COMPLIANCE.md is one table of regimes with no numbered sections, and this project's register moved to docs/compliance/REGISTER.md, which begin copies from TEMPLATE-REGISTER.md" },
{ "pattern": "clear §2 back to its skeleton", "why": "retired begin instruction; the register is a cp from docs/compliance/TEMPLATE-REGISTER.md now, like the brief, the deploy runbook and the debt ledger" },
{ "pattern": "definitions cover language|no implementation detail in this file", "why": "retired glossary rule; a CONTEXT.md entry may now settle how a term is measured (which period, which basis, who counts) and stops at the threshold value and the branching, which belong in a spec where a test can execute them (decision 0019)" }
{ "pattern": "definitions cover language|no implementation detail in this file", "why": "retired glossary rule; a CONTEXT.md entry may now settle how a term is measured (which period, which basis, who counts) and stops at the threshold value and the branching, which belong in a spec where a test can execute them (decision 0019)" },
{ "pattern": "\\btaste dials\\b|VARIANCE ?/ ?MOTION ?/ ?DENSITY", "why": "retired taste-skill machinery; a page is no longer configured by three numeric knobs set before the owner sees anything. The installed design method commits a direction contract, a color strategy and one authored motion instead (decision 0020)" },
{ "pattern": "leonxlnx/taste-skill", "why": "retired upstream pointer; the frontend rulebook this repo adapted from it is gone and the installed design method owns that ground now (decision 0020 supersedes 0012)" },
{ "pattern": "skill `taste`|\\.agents/skills/taste", "why": "retired skill; taste was removed on 2026-08-07 and nothing may point at it again. What each of its rules became is the table in decision 0020", "exclude": ["docs/specs/011-design-on-impeccable/"] }
],
"styleBans": [
{ "pattern": "\\bdelve(s|d|ing)?\\b", "why": "AI-tell verb; say 'look at', 'go into' or just state the point" },
Expand Down
6 changes: 5 additions & 1 deletion docs/decisions/0012-taste-skill-for-persuasion-pages.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
# 0012: Frontend persuasion pages follow the `taste` skill, adapted from leonxlnx/taste-skill

- **Date:** 2026-07-11 · **Status:** accepted · **Decider:** owner (Remon) + agent
- **Date:** 2026-07-11 · **Status:** superseded by 0020 · **Decider:** owner (Remon) + agent

<!-- Superseded 2026-08-07 by decision 0020: the design method impeccable now owns the making of an
interface, and `taste` is gone. The reasoning below stays readable as the record of why an
in-house rulebook was the right answer while nothing better was installed. -->

## Context

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# 0020: The installed design method replaces Groundwork's in-house frontend rulebook

- **Date:** 2026-08-07 · **Status:** accepted · **Decider:** owner (Remon) + agent

## Context

Decision 0012 gave this framework `taste`: an adapted, in-house rulebook for the page type models
fail at most visibly. It was the right answer while nothing better was installed. Spec 011 installs
impeccable per project as the method that makes an interface, and impeccable carries its own craft
floor, its own list of category defaults to refuse, and a deterministic detector of 59 rules. Two
anti-slop rulebooks side by side is exactly the situation AGENTS.md exists to prevent: one fact,
one place. The owner chose retirement over coexistence on 2026-08-05.

## Options considered

1. **Retire `taste`, move what the method does not carry to the file that owns it (chosen):** one
rulebook governs a build, and the pieces that are genuinely Groundwork's (the accessibility
floor, the live-surface contract, the foundation choice) live where they were already owned.
2. **Keep both, `taste` for persuasion pages and the method for the rest:** every page type would
need a routing rule, and the two would drift on the first upstream release. A build would have
to be judged against two lists that disagree.
3. **Keep `taste` as the house overlay on top of the method:** an overlay is a patch on somebody
else's file by another name, and it re-creates the update cost the per-project install exists to
avoid (spec 011's settled decisions).

## Where each retired rule went

| `taste` section | Where it lives now |
|---|---|
| 1 Design read | Method: new-work section 1 (what is already true) and 2 (one round of questions per mode) |
| 2 Three dials (VARIANCE / MOTION / DENSITY) | **Dropped.** See below |
| 3 Foundation choice | Unchanged and unmoved: `design` step 2 and decision 0009. `taste` only restated it |
| 4 Layout rules | Method: craft floor (cards, nested cards, kicker ban, section numbers, spacing), new-work section 6 (first viewport, scroll pacing); detector rules `kicker-above-heading`, `hero-eyebrow-chip`, `numbered-section-labels`, `oversized-h1`, `edge-flush-cards`, `cramped-padding`, `monotonous-spacing` |
| 5 Typography | Method: craft floor (measure, scale, tracking floor), new-work section 4 (face selection, with its own list of overused faces); detector `overused-font`, `italic-serif-display`, `flat-type-hierarchy`, `line-length`, `tiny-text`, `wide-tracking`, `tight-leading` |
| 6 Color and theme | Method: new-work section 4 (color strategy, the named default-palette calibration, light or dark chosen from the use scene); detector `ai-color-palette`, `cream-palette`, `gradient-text`, `dark-glow`, `radial-halo`. The rule to design both light and dark from the start is **dropped**: the method picks one theme from the real use scene, and a surface that needs both says so in its own brief |
| 7 Imagery and assets | Method: craft floor (no glyphs for icons, no chrome standing in for content), new-work section 6 (author the assets, verified real imagery); detector `shape-assembled-illustration`, `broken-image`, `icon-tile-stack`. The icon family stays the owner's default in DESIGN.md principle 9 |
| 8 Copy on the page | VOICE.md and the prose gate keep language, unchanged. Method: craft floor (the product's own language), `clarify`, and the truth rule in new-work section 3 (claims stay uninventable, demonstration data is labelled); detector `marketing-buzzword`, `aphoristic-cadence`, `theater-slop-phrase`, `em-dash-overuse` |
| 9 Motion | Method: craft floor (one authored moment), new-work section 6 (motion as the form's own material); detector `bounce-easing`, `layout-transition`, `marquee`, `pulsing-dot`, `content-hidden-at-rest`. **Moved:** the reduced-motion obligation, which the method's own guidance never states, is now DESIGN.md principle 7, where it binds every direction |
| 10 States and accessibility | Method: craft floor (states, contrast); detector `low-contrast`, `gray-on-color`. The legal floor stays DESIGN.md principle 8 and COMPLIANCE.md |
| 11 Forbidden tells | Method: the craft floor's Refuse list and the 59 detector rules. Ticket 05 makes the detector a gate |
| 12 Redesign protocol | Preserve-or-overhaul is the method's own four-way read (new-work section 1, plus "refinement preserves, redesign replaces"). **Moved:** the SEO and migration half, which the method does not carry at all, is now the live-surface contract in `design` step 3: URLs and slugs, titles and structured data, nav labels, form field and analytics names, wordmark, legal and consent copy |
| 13 Pre-flight | Method: the finish reviewer and its verdict, reported with its open items (`design` step 3). `design-guard` re-checks the render against the direction contract |

**Why the dials are dropped rather than moved.** They are a model-set configuration of a page,
fixed before the owner sees anything, which is precisely the unwatched stretch spec 011 exists to
close. The method decides the same things in the open and further down: a committed direction
contract, a color strategy chosen at page scale, and motion authored once as the form's own. A
numeric knob beside that contract would be a second, weaker answer to a question already settled.

## Decision & consequences

`taste` is gone from `.agents/skills/`, from the AGENTS.md table, from DESIGN.md principle 10, from
`design`, from `design-guard` and from the explainer. Decision 0012 is superseded, not deleted: it
stays the record of why an in-house rulebook was right while nothing better was installed. The
retired wording is in the denylist in `checks/config.json`, so the dials and the upstream pointer
cannot quietly return in a later session.

Easier: one rulebook governs a build, and it updates by reinstalling rather than by hand. Harder:
the rules now live in somebody else's file, so a rule this framework wants to keep has to be
carried in a Groundwork file, as the reduced-motion floor and the live-surface contract now are.
Watch for: an upstream release that drops a rule the table above credits to it. `maintain`'s
dependency round is where that gets noticed, and the answer is to move the rule back into a
Groundwork file, never to fork the method.
14 changes: 7 additions & 7 deletions docs/design/DESIGN.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,10 @@
6. **States are designed, not inherited.** Hover, visible focus, disabled, loading, empty,
error: every component ships with all of them. Empty states say what to do, not just "no data".
7. **Motion is physics, not decoration.** 120-200ms ease-out on state changes; nothing bounces,
nothing autoplays, nothing moves that the user didn't cause.
nothing autoplays, nothing moves that the user didn't cause. A chosen direction may author more
motion than that on a surface meant to persuade, and whatever it authors collapses to static
under the user's reduced-motion preference: loops, parallax, scroll-driven choreography and
pointer physics all go still there, with the content still readable.
8. **Accessible by construction.** Contrast of at least 4.5:1 for text, focus always visible,
touch targets at least 44px, semantics before ARIA. WCAG 2.1 AA is the legal floor, not the
ambition.
Expand All @@ -38,10 +41,9 @@
gradient, and blue or purple as a reflex accent, are banned as defaults; pick the project's
own accent (seed: the owner's deep teal). A gradient is only ever a small, deliberate,
owner-approved accent, never the baseline. Any background motion stays subtle and secondary
to reading; usability wins over decoration. For pages meant to persuade (landing, marketing,
portfolio, explainer) the full anti-slop rulebook is skill `taste`: brief read first, three
dials, layout and motion rules, forbidden tells. There a deliberately higher motion level
may override principle 7, within `taste`'s reduced-motion and motivation rules.
to reading; usability wins over decoration. The full rulebook against the default look is the
installed design method's craft floor and its detector, which the skill `design` runs; these
ten principles are the floor it builds on top of and may not break.

## 2. Standing default direction (the owner's taste: seed, not straitjacket)

Expand All @@ -68,8 +70,6 @@ the `design` skill; deviate only on the owner's say-so.
| Accent | `--color-accent` | TBD | one family, sparingly |
| Danger / Warning / Success / Info | `--color-...` | TBD | used via opacity only |

- **Taste dials:** TBD <!-- VARIANCE / MOTION / DENSITY, 1-10, set by `design` step 4 with
skill `taste`, e.g. 5 / 3 / 3 for a minimal register. Governs persuasion pages. -->
- **Type scale:** TBD <!-- e.g. 32/24/18/16/14 + line heights; font family + weights -->
- **Spacing ladder:** TBD <!-- e.g. 4 / 8 / 12 / 16 / 24 / 32 / 48 -->
- **Radius:** TBD <!-- container / control / pill -->
Expand Down
14 changes: 7 additions & 7 deletions docs/specs/011-design-on-impeccable/tickets/03-retire-taste.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# 03: taste is retired, and nothing points at a skill that is gone

- **Blocked by:** 02-begin-and-design-route-into-impeccable.md
- **Status:** ready
- **Status:** done
- **Traces to:** BRIEF SC-8

**What to build:** The framework carries one rulebook for building an interface. `taste` is
Expand All @@ -15,13 +15,13 @@ decision record states where each went.

**Acceptance:**

- [ ] Every rule in `taste` is accounted for: covered by impeccable, moved to a named file, or
- [x] Every rule in `taste` is accounted for: covered by impeccable, moved to a named file, or
dropped with a reason. The mapping is written in the decision record, not in a commit message.
- [ ] `.agents/skills/taste/` is gone and its row is out of the AGENTS.md skills table.
- [ ] Every pointer that named it is repointed: DESIGN.md principle 10, `design`, `design-guard`,
- [x] `.agents/skills/taste/` is gone and its row is out of the AGENTS.md skills table.
- [x] Every pointer that named it is repointed: DESIGN.md principle 10, `design`, `design-guard`,
and any doc the links gate finds.
- [ ] Decision 0012 is marked superseded, naming the decision that replaced it, and stays readable
- [x] Decision 0012 is marked superseded, naming the decision that replaced it, and stays readable
as the record of why the earlier choice was right at the time.
- [ ] The retired wording is in the denylist in `checks/config.json`, so a later session cannot
- [x] The retired wording is in the denylist in `checks/config.json`, so a later session cannot
reintroduce a rulebook that no longer exists.
- [ ] `node checks/check.mjs`, the links gate and the self-test suites stay green.
- [x] `node checks/check.mjs`, the links gate and the self-test suites stay green.
Loading