Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
0c8a7a1
feat: implement compartmentalized persona prompt system (Wang et al. …
May 20, 2026
1faf2de
feat: add PB&J psychological scaffold enhancer for backstory rational…
May 20, 2026
c0ed17d
feat: implement ID-RAG system for factual persona grounding (Tan et a…
May 20, 2026
9ea38b7
feat: implement evaluation pipeline - InCharacter interview + PICon i…
May 20, 2026
d4a6c8a
test: add full-system integration tests for persona techniques
May 20, 2026
527f214
test: add E2E verification tests for persona inference-time pipeline
May 20, 2026
4cab6a6
docs: add comprehensive documentation of persona inference-time system
May 20, 2026
664a1cc
refactor: align persona psychographics with research-backed framework
May 20, 2026
8758837
fix: update analysis prompt to leverage full Big Five + psychographic…
May 20, 2026
f9593cc
fix: use compartmentalized prompt compiler in analysis pipeline
May 20, 2026
3373fc1
feat: integrate PB&J scaffold enhancement into persona generation pip…
May 20, 2026
221ef05
fix: update FlowDialog to show 4 persona generation phases
May 20, 2026
3ae320f
feat: wire ID-RAG into chat and analysis flows
May 20, 2026
09fb17c
feat: add periodic persona re-grounding every 4 turns
May 20, 2026
27c0b35
fix: use non-streaming persona generation by default
May 20, 2026
3981707
fix: add domain calibration, scoring alignment, and recommendations
May 21, 2026
45bf2bc
fix: replace hardcoded domain calibration with AI-generated persona p…
May 21, 2026
e25f30d
feat: add openness priming, intent funnel, and score rationales
May 21, 2026
c9c193d
feat: swap to deepseek/deepseek-v4-flash with reasoning token support
May 21, 2026
087d0d2
feat: swap legacy adapter defaults to deepseek-v4-flash
May 21, 2026
c97c00f
fix: replace unsupported /s regex flag with [\s\S] for Turbopack compat
May 21, 2026
92218a8
fix: resolve build errors
May 21, 2026
8679f78
fix: replace hardcoded AI suggestion with LLM-generated persona-speci…
May 21, 2026
18306a6
fix: debug reasoning token format + prevent 4th-wall anchor quoting
May 22, 2026
041a7a3
fix: remove duplicate reasoning extraction code, accumulate across ch…
May 22, 2026
d9dc69c
fix(IdRagStore): remove duplicate private chunkBackstory and keep exp…
May 24, 2026
5cf75fb
feat(pipeline): wave 1 — types, ports, adapter renames, IdRag general…
May 24, 2026
dce8a00
feat(pipeline): wave 1 completion — finalize LlmServiceImpl wiring, u…
May 24, 2026
3415bad
feat(pipeline): wave 2 batch A — sampling, variable count, chunkInter…
May 24, 2026
f258659
feat(pipeline): wave 2 batch B — InterviewSignalExtractor, pooling, n…
May 24, 2026
01cc4d0
feat(pipeline): wave 3 batch A — orchestrator, port createChatComplet…
May 24, 2026
cba6217
feat(pipeline): wave 3 — server action for pipeline trigger
May 24, 2026
5202308
test(pipeline): wave 4 — unit + integration tests for all pipeline co…
May 24, 2026
ae44140
chore(pipeline): final verification wave — all 4 reviewers APPROVE
May 24, 2026
1d3c813
feat(ui): interview upload page with file drag-drop and pipeline inte…
May 24, 2026
088dca9
feat(ui): persistent persona store with sidebar nav and batch history
May 25, 2026
f0a3000
fix(ui): center main content, reuse PersonaProfilePanel, restore repo…
May 25, 2026
324c36e
polish(app): align UI with design system spec, harden tokens and fix …
May 25, 2026
6c601a7
fix(ui): resolve persona sheet layout bugs — close button overlap, un…
May 26, 2026
50ad6ce
refactor(ui): convert persona sheet from side panel to centered modal
May 26, 2026
e7b464f
chore: add .DS_Store and logs/ to gitignore, untrack OS artifacts
Jun 7, 2026
53487b0
feat(design): refresh design system — cerulean blue accent, refined t…
Jun 7, 2026
eee4178
refactor(chat): extract shared message parser, fix error handling in …
Jun 7, 2026
3729723
feat(pricing): overhaul pricing analysis pipeline with comprehensive …
Jun 7, 2026
278c7df
feat(browser): improve browser scouting with adaptive scrolling, lazy…
Jun 7, 2026
b06be63
feat(llm): refactor LLM service layer — OpenRouter adapters, improved…
Jun 7, 2026
1d855e1
feat(persona): add persona variation generation with Big Five trait s…
Jun 7, 2026
ebe68a4
feat(simulations): add simulations list and detail pages with progres…
Jun 7, 2026
3702120
refactor(ui): streamline dashboard layout, add AnalysisProvider, impr…
Jun 7, 2026
f7f69c8
feat(pipeline): complete interview-to-persona pipeline with IdRag ide…
Jun 7, 2026
1f83467
test: add comprehensive E2E and unit tests for pricing analysis, pers…
Jun 7, 2026
7582c10
chore: update dependencies, tsconfig, and vitest config
Jun 7, 2026
9458913
ci: add opencode GitHub action for AI-assisted PR review
Jun 7, 2026
3134ec5
chore: add netlify.toml with 5-min function timeout for LLM pipelines
Jun 7, 2026
4472d47
fix(pipeline): add heartbeat interval to prevent serverless function …
Jun 7, 2026
f3c2ff7
feat(pipeline): add Netlify Background Function for long-running LLM …
Jun 7, 2026
0034a8b
fix: align InterviewUploadClient step type with background function (…
Jun 7, 2026
8db5f1f
fix(pipeline): import PipelineStore directly in background function i…
Jun 7, 2026
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
Binary file removed .DS_Store
Binary file not shown.
168 changes: 168 additions & 0 deletions .agents/skills/impeccable/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
---
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."
argument-hint: "[{{command_hint}}] [target]"
user-invocable: true
allowed-tools:
- Bash(npx impeccable *)
license: Apache 2.0. Based on Anthropic's frontend-design skill. See NOTICE.md for attribution.
---

Designs and iterates production-grade frontend interfaces. Real working code, committed design choices, exceptional craft.

## Setup

Before any design work or file edits:

1. Load context (PRODUCT.md / DESIGN.md) via the loader script.
2. Identify the register and load the matching register reference (brand.md or product.md).
3. **If the user invoked a sub-command (e.g. `craft`, `shape`, `audit`), load its reference file too.** This is non-negotiable: `craft` without `craft.md` loaded means you'll skip the shape-and-confirm step the user expects.

Skipping these produces generic output that ignores the project.

### 1. Context gathering

Two files, case-insensitive. The loader looks at the project root by default and falls back to `.agents/context/` and `docs/` if the root is clean. Override with `IMPECCABLE_CONTEXT_DIR=path/to/dir` (absolute or relative to cwd).

- **PRODUCT.md**: required. Users, brand, tone, anti-references, strategic principles.
- **DESIGN.md**: optional, strongly recommended. Colors, typography, elevation, components.

Load both in one call:

```bash
node {{scripts_path}}/load-context.mjs
```

Consume the full JSON output. Never pipe through `head`, `tail`, `grep`, or `jq`. The output's `contextDir` field tells you where the files were resolved from.

If the output is already in this session's conversation history, don't re-run. Exceptions requiring a fresh load: you just ran `{{command_prefix}}impeccable teach` or `{{command_prefix}}impeccable document` (they rewrite the files), or the user manually edited one.

`{{command_prefix}}impeccable live` already warms context via `live.mjs`. If you've run `live.mjs`, don't also run `load-context.mjs` this session.

If PRODUCT.md is missing, empty, or placeholder (`[TODO]` markers, <200 chars): run `{{command_prefix}}impeccable teach`, then resume the user's original task with the fresh context. If the original task was `{{command_prefix}}impeccable craft`, resume into `{{command_prefix}}impeccable shape` before any implementation work.

If DESIGN.md is missing: nudge once per session (*"Run `{{command_prefix}}impeccable document` for more on-brand output"*), then proceed.

### 2. Register

Every design task is **brand** (marketing, landing, campaign, long-form content, portfolio: design IS the product) or **product** (app UI, admin, dashboard, tool: design SERVES the product).

Identify before designing. Priority: (1) cue in the task itself ("landing page" vs "dashboard"); (2) the surface in focus (the page, file, or route being worked on); (3) `register` field in PRODUCT.md. First match wins.

If PRODUCT.md lacks the `register` field (legacy), infer it once from its "Users" and "Product Purpose" sections, then cache the inferred value for the session. Suggest the user run `{{command_prefix}}impeccable teach` to add the field explicitly.

Load the matching reference: [reference/brand.md](reference/brand.md) or [reference/product.md](reference/product.md). The shared design laws below apply to both.

## Shared design laws

Apply to every design, both registers. Match implementation complexity to the aesthetic vision: maximalism needs elaborate code, minimalism needs precision. Interpret creatively. Vary across projects; never converge on the same choices. {{model}} is capable of extraordinary work. Don't hold back.

### Color

- Use OKLCH. Reduce chroma as lightness approaches 0 or 100; high chroma at extremes looks garish.
- Never use `#000` or `#fff`. Tint every neutral toward the brand hue (chroma 0.005–0.01 is enough).
- Pick a **color strategy** before picking colors. Four steps on the commitment axis:
- **Restrained**: tinted neutrals + one accent ≤10%. Product default; brand minimalism.
- **Committed**: one saturated color carries 30–60% of the surface. Brand default for identity-driven pages.
- **Full palette**: 3–4 named roles, each used deliberately. Brand campaigns; product data viz.
- **Drenched**: the surface IS the color. Brand heroes, campaign pages.
- The "one accent ≤10%" rule is Restrained only. Committed / Full palette / Drenched exceed it on purpose. Don't collapse every design to Restrained by reflex.

### Theme

Dark vs. light is never a default. Not dark "because tools look cool dark." Not light "to be safe."

Before choosing, write one sentence of physical scene: who uses this, where, under what ambient light, in what mood. If the sentence doesn't force the answer, it's not concrete enough. Add detail until it does.

"Observability dashboard" does not force an answer. "SRE glancing at incident severity on a 27-inch monitor at 2am in a dim room" does. Run the sentence, not the category.

### Typography

- Cap body line length at 65–75ch.
- Hierarchy through scale + weight contrast (≥1.25 ratio between steps). Avoid flat scales.

### Layout

- Vary spacing for rhythm. Same padding everywhere is monotony.
- Cards are the lazy answer. Use them only when they're truly the best affordance. Nested cards are always wrong.
- Don't wrap everything in a container. Most things don't need one.

### Motion

- Don't animate CSS layout properties.
- Ease out with exponential curves (ease-out-quart / quint / expo). No bounce, no elastic.

### Absolute bans

Match-and-refuse. If you're about to write any of these, rewrite the element with different structure.

- **Side-stripe borders.** `border-left` or `border-right` greater than 1px as a colored accent on cards, list items, callouts, or alerts. Never intentional. Rewrite with full borders, background tints, leading numbers/icons, or nothing.
- **Gradient text.** `background-clip: text` combined with a gradient background. Decorative, never meaningful. Use a single solid color. Emphasis via weight or size.
- **Glassmorphism as default.** Blurs and glass cards used decoratively. Rare and purposeful, or nothing.
- **The hero-metric template.** Big number, small label, supporting stats, gradient accent. SaaS cliché.
- **Identical card grids.** Same-sized cards with icon + heading + text, repeated endlessly.
- **Modal as first thought.** Modals are usually laziness. Exhaust inline / progressive alternatives first.

### Copy

- Every word earns its place. No restated headings, no intros that repeat the title.
- **No em dashes.** Use commas, colons, semicolons, periods, or parentheses. Also not `--`.

### The AI slop test

If someone could look at this interface and say "AI made that" without doubt, it's failed. Cross-register failures are the absolute bans above. Register-specific failures live in each reference.

**Category-reflex check.** Run at two altitudes; the second one catches what the first one misses.

- **First-order:** if someone could guess the theme + palette from the category alone ("observability → dark blue", "healthcare → white + teal", "finance → navy + gold", "crypto → neon on black"), it's the first training-data reflex. Rework the scene sentence and color strategy until the answer isn't obvious from the domain.
- **Second-order:** if someone could guess the aesthetic family from category-plus-anti-references ("AI workflow tool that's not SaaS-cream → editorial-typographic", "fintech that's not navy-and-gold → terminal-native dark mode"), it's the trap one tier deeper. The first reflex was avoided; the second wasn't. Rework until both answers are not obvious. The brand register's [reflex-reject aesthetic lanes](reference/brand.md) list catches the currently-saturated families.

## Commands

| Command | Category | Description | Reference |
|---|---|---|---|
| `craft [feature]` | Build | Shape, then build a feature end-to-end | [reference/craft.md](reference/craft.md) |
| `shape [feature]` | Build | Plan UX/UI before writing code | [reference/shape.md](reference/shape.md) |
| `teach` | Build | Set up PRODUCT.md and DESIGN.md context | [reference/teach.md](reference/teach.md) |
| `document` | Build | Generate DESIGN.md from existing project code | [reference/document.md](reference/document.md) |
| `extract [target]` | Build | Pull reusable tokens and components into design system | [reference/extract.md](reference/extract.md) |
| `critique [target]` | Evaluate | UX design review with heuristic scoring | [reference/critique.md](reference/critique.md) |
| `audit [target]` | Evaluate | Technical quality checks (a11y, perf, responsive) | [reference/audit.md](reference/audit.md) |
| `polish [target]` | Refine | Final quality pass before shipping | [reference/polish.md](reference/polish.md) |
| `bolder [target]` | Refine | Amplify safe or bland designs | [reference/bolder.md](reference/bolder.md) |
| `quieter [target]` | Refine | Tone down aggressive or overstimulating designs | [reference/quieter.md](reference/quieter.md) |
| `distill [target]` | Refine | Strip to essence, remove complexity | [reference/distill.md](reference/distill.md) |
| `harden [target]` | Refine | Production-ready: errors, i18n, edge cases | [reference/harden.md](reference/harden.md) |
| `onboard [target]` | Refine | Design first-run flows, empty states, activation | [reference/onboard.md](reference/onboard.md) |
| `animate [target]` | Enhance | Add purposeful animations and motion | [reference/animate.md](reference/animate.md) |
| `colorize [target]` | Enhance | Add strategic color to monochromatic UIs | [reference/colorize.md](reference/colorize.md) |
| `typeset [target]` | Enhance | Improve typography hierarchy and fonts | [reference/typeset.md](reference/typeset.md) |
| `layout [target]` | Enhance | Fix spacing, rhythm, and visual hierarchy | [reference/layout.md](reference/layout.md) |
| `delight [target]` | Enhance | Add personality and memorable touches | [reference/delight.md](reference/delight.md) |
| `overdrive [target]` | Enhance | Push past conventional limits | [reference/overdrive.md](reference/overdrive.md) |
| `clarify [target]` | Fix | Improve UX copy, labels, and error messages | [reference/clarify.md](reference/clarify.md) |
| `adapt [target]` | Fix | Adapt for different devices and screen sizes | [reference/adapt.md](reference/adapt.md) |
| `optimize [target]` | Fix | Diagnose and fix UI performance | [reference/optimize.md](reference/optimize.md) |
| `live` | Iterate | Visual variant mode: pick elements in the browser, generate alternatives | [reference/live.md](reference/live.md) |

Plus two management commands: `pin <command>` and `unpin <command>`, detailed below.

### Routing rules

1. **No argument**: render the table above as the user-facing command menu, grouped by category. Ask what they'd like to do.
2. **First word matches a command**: load its reference file and follow its instructions. Everything after the command name is the target.
3. **First word doesn't match**: general design invocation. Apply the setup steps, shared design laws, and the loaded register reference, using the full argument as context.

Setup (context gathering, register) is already loaded by then; sub-commands don't re-invoke `{{command_prefix}}impeccable`.

If the first word is `craft`, setup still runs first, but [reference/craft.md](reference/craft.md) owns the rest of the flow. If setup invokes `teach` as a blocker, finish teach, refresh context, then resume the original command and target.

## Pin / Unpin

**Pin** creates a standalone shortcut so `{{command_prefix}}<command>` invokes `{{command_prefix}}impeccable <command>` directly. **Unpin** removes it. The script writes to every harness directory present in the project.

```bash
node {{scripts_path}}/pin.mjs <pin|unpin> <command>
```

Valid `<command>` is any command from the table above. Report the script's result concisely. Confirm the new shortcut on success, relay stderr verbatim on error.
Loading