From deep-kiss
You MUST use this before any creative work — creating features, building components, adding functionality, or modifying behavior. Explores intent and presents YAGNI/KISS-locked options (4 axes, 5-slot structure) optimized for low-parameter models. F.L.I.R.T. = Find intent, List axes, Iterate options, Refine slots, Test-spec — the non-committal exploration phase before deep-kiss.
How this skill is triggered — by the user, by Claude, or both
Slash command
/deep-kiss:flirtThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Turns ideas into fully formed designs and specs through natural collaborative dialogue. This is the *non-committal exploration* phase — before committing to implementation.
Turns ideas into fully formed designs and specs through natural collaborative dialogue. This is the non-committal exploration phase — before committing to implementation.
Narrative: flirt (explore) → deep-kiss (lock the design) → implement. This skill is the first step. When done, it leaves a spec document and hands off to writing-plans.
F.L.I.R.T. — 5-step mnemonic (matches the checklist)
Deep-Kiss Principle (applies to this entire series): Dig deep into intent and constraints, but every option you surface must stay inside the KISS zone. All options must be small. The difference between options is not "how big" but "what kind of minimal".
Start by understanding the current project context. Refine the idea one question at a time. Once you understand what to build, present a design and get the user's approval.
Do NOT invoke any implementation skill, write any code, scaffold any project, or take any implementation action until you have presented a design and the user has approved it. No exceptions, even for seemingly simple projects. During clarification, ask exactly 1 question per message. Do not ask follow-up questions or branch before receiving the user's answer. Do not bundle questions — a "scope question + content question" in one message is a violation. If more questions follow, send them in the *next message*. This discipline exists for consistency in small models.This skill applies YAGNI to itself:
Every project goes through this process. A todo list, a single-function utility, a config change — all of them. "Simple" projects cause the most waste from unexamined assumptions. The design can be short (a few sentences for truly simple projects), but it must be presented and approved.
Create a task for each item and complete them in order:
docs/deep-kiss/specs/YYYY-MM-DD-<topic>-design.md and commitspec-document-reviewer-prompt.md; wait for result, fix any issues foundwriting-plans skilldigraph flirt {
"Explore project" [shape=box];
"Ask 1 question" [shape=box];
"Receive answer" [shape=box];
"Enough?" [shape=diamond];
"Choose axis (1 of 4)" [shape=box];
"Propose options (5 slots)" [shape=box];
"Present design" [shape=box];
"Design approved?" [shape=diamond];
"Write design doc" [shape=box];
"Subagent review\n(wait for result)" [shape=box];
"User spec review?" [shape=diamond];
"Invoke writing-plans" [shape=doublecircle];
"Explore project" -> "Ask 1 question";
"Ask 1 question" -> "Receive answer";
"Receive answer" -> "Enough?";
"Enough?" -> "Ask 1 question" [label="no, next 1"];
"Enough?" -> "Choose axis (1 of 4)" [label="yes"];
"Choose axis (1 of 4)" -> "Propose options (5 slots)";
"Propose options (5 slots)" -> "Present design";
"Present design" -> "Design approved?";
"Design approved?" -> "Present design" [label="no, revise"];
"Design approved?" -> "Write design doc" [label="yes"];
"Write design doc" -> "Subagent review\n(wait for result)";
"Subagent review\n(wait for result)" -> "Write design doc" [label="issues found"];
"Subagent review\n(wait for result)" -> "User spec review?" [label="approved"];
"User spec review?" -> "Write design doc" [label="changes requested"];
"User spec review?" -> "Invoke writing-plans" [label="approved"];
}
The terminal state is invoking writing-plans. Do not invoke frontend-design, mcp-builder, or any other implementation skill. The only skill that follows flirt is writing-plans.
Core principle: Every option must stay inside the KISS zone. The difference between options is not "how much" but "what kind of minimal". Options labeled "extensible", "future-proof", or "generic" are rule violations by definition.
Determine the axis from the type of task. All options within any axis stay inside the KISS zone.
Scope axis — when the task is adding/modifying and the impact radius is the decision
Location axis — when where to put the new behavior is the decision
Abstraction axis — when dealing with repeating or growing code
❗ Larger abstractions (generic base classes, plugin architectures, added abstraction layers) are not allowed as options. The three above are the KISS ceiling — except when the "Rule of Named Two" exception applies (see below).
The KISS ceiling on abstractions exists to prevent vague future-proofing (a YAGNI violation) — not to block confirmed planned extensions. If the following mechanical test passes, a larger abstraction (interface / factory) may be included as an option:
Rule of Named Two: At this point in time, there must be ≥ 2 specifically named instances.
- ✅ "Stripe OAuth2 now + Google and GitHub OAuth planned next" — 3 named instances
- ✅ "MySQL adapter + migrating to Postgres next sprint" — 2 named instances
- ❌ "extensible OAuth2" — 0 instances ("extensible" is vague — fails immediately)
- ❌ "support multiple auth providers" — 0 instances ("multiple" / "various" fail the same way)
- ❌ "add OAuth2 login" — 1 instance (single instance → abstraction not justified)
If the test is ambiguous, do not pass it. Ask the user: "What is the specific name of the second instance, and when is it planned?"
When the test passes — 3-Stage Options
The abstraction is justified, but when to build it is the decision. Instead of the 4 axes, present the following 3-Stage structure (all 5 required slots still apply; the stage name goes in slot 1 "Name"):
Stage 0 — Seed
Stage 1 — Thin interface + first implementation (default recommendation)
Stage 2 — Interface + both implementations at once
Default recommendation is Stage 1. When the second implementation becomes the first task of the next session, the interface's validity is naturally verified, and cognitive debt stays focused on one implementation at a time.
Short example — "Stripe OAuth2 login now, Google OAuth2 next session":
stripeLogin() function + a TODO comment at the top of the module (// TODO: googleLogin to be added to this module next session)OAuthProvider interface (authorize(), getProfile()) + StripeProvider implementation. Next session only needs to add GoogleProvider.OAuthProvider + StripeProvider + GoogleProvider all in this session (only if user explicitly requests it)Removal axis — when the task is cleanup/refactoring (YAGNI enforced directly)
If any of these words appear in an option description, rewrite the option immediately:
future-proof, extensible, generic, reusable, configurable, pluggable, abstraction layer, framework
These words are almost never justified. Treat them as a signal that the option has escaped the KISS zone.
Do not force 3 options for trivial tasks. Forcing a third option is itself the start of context bloat.
Do not change the labels. Any option with an empty slot must be rewritten before presenting.
[Option Name]
"No trade-off" / "write a unit test" / "add integration tests" are evasion answers — rewrite. Manual verification exception: visual or system behaviors where automation is clearly impractical (UI flicker, OS theme sync, native dialogs). Even then, specify a minimum automated check (e.g., npm run build, type check).
When unsure which axis to use, ask yourself: what is the core decision in this task?
Once you've decided, write one sentence explaining why this axis before listing the options. If you cannot write that sentence, reconsider your choice.
Example: "Axis: Location — the core decision is whether to inline the filter logic into the existing method or extract it into a helper."
When labeling an option "(recommended)", the middle option is not a default. Derive the recommendation from what the user has actually described:
If you cannot write one sentence explaining why X is recommended in this specific context, reconsider.
docs/deep-kiss/specs/YYYY-MM-DD-<topic>-design.md
elements-of-style:writing-clearly-and-concisely skill if availableCall the Agent tool with:
subagent_type: "general-purpose"description: "Adversarial spec review"prompt: the full contents of spec-document-reviewer-prompt.md in this directory, with [SPEC_FILE_PATH] replaced by the actual spec pathIf the subagent returns issues, fix them in the spec document and call the Agent tool again.
After the subagent approves the spec, ask the user to review it:
"I've written and committed the spec to
<path>. Please review it and let me know if anything needs to change before I move on to writing the implementation plan."
Wait for their response. If changes are requested, make them and dispatch the subagent again. Only proceed after approval.
writing-plans skill to generate a detailed implementation planwriting-plans is the next and only step.npx claudepluginhub tgoddessana/deep-kiss --plugin deep-kissGuides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.