CtrlK
BlogDocsLog inGet started
Tessl Logo

build-something-ask

Use when the user has an idea for an app, tool, or feature and wants to be interviewed in depth first — answering structured clarifying questions until the requirements are fully pinned down — before it gets built end-to-end. Triggers - "ask me questions then build", "interview me about my idea", "help me spec this out and build it", vague ideas the user wants to shape interactively.

76

Quality

96%

Does it follow best practices?

Run evals on this skill

Adds up to 20 points to the overall score

View guide

SecuritybySnyk

Passed

No known issues

SKILL.md
Quality
Evals
Security

Build Something Ask

Interview the user relentlessly with structured questions until zero decision-changing ambiguity remains, then build the product end-to-end autonomously. The user's answers are LAW; internal judgment fills only the gaps the user explicitly delegates. Deliverables are files on disk plus a short chat summary.

Seed idea: the skill argument; if empty, the user's message.

Gate

If the request is not to build/create software, say so in one line and answer normally without this pipeline.

Step 0 — The Interrogation (runs before anything is written)

Goal: replace every assumption with the user's actual answer. Ask in rounds using the structured multiple-choice question tool (AskUserQuestion): up to 4 questions per round, each with 2–4 concrete options plus descriptions of their consequences. Put your recommended option first, labeled "(Recommended)".

Dimension checklist — every one must end user-answered, seed-answered, or explicitly delegated

  1. Goal & target user — who uses it, for what job
  2. Platform / form factor — CLI, web, mobile, desktop, API, bot
  3. Must-have features — the MVP cut; what's in v1 vs later
  4. Data — what's stored, where, for how long
  5. Users & auth — single-user? accounts? roles?
  6. External integrations / APIs / data sources
  7. Stack — user preference or delegated
  8. Look & feel / UX expectations
  9. Non-functional needs — performance, offline, security, accessibility
  10. Deployment target — local, hosted, container
  11. Success criteria — "v1 is done when …"
  12. Edge cases & failure behavior the user cares about

Rules of the grill

  • Round 1 is always: goal/user, platform, MVP cut, stack. Then recompute what's still unknown and keep firing rounds until nothing decision-changing remains.
  • Every question must be decision-changing: if no possible answer would change what you build, don't ask it.
  • Never re-ask anything the seed or a previous answer already settled.
  • Always include a delegation option ("You decide — recommended: X") so the user can hand a dimension to you.
  • Drill on vagueness: a vague answer earns one sharper follow-up in the next round. A contradiction between answers is surfaced as its own question and must be resolved.
  • Depth follow-ups: once the shape is clear, ask the sharp second-order questions a senior engineer would — data edge cases ("two people with the same name?"), failure behavior ("what should happen when the API is down?"), scope ties ("if X and Y both slip, which survives?").
  • Superlative check: if the seed or an answer contains a superlative or absolute claim ("fewest", "fastest", "never fails", "optimal"), ask whether the user actually needs the provable property or a good-enough heuristic — this is a decision-changing question, always ask it once per superlative found.
  • Stop condition: every dimension answered or delegated AND no contradictions outstanding. If the user says "stop asking / just build", stop immediately — remaining dimensions are delegated.
  • Then: print a locked spec summary (≤ 10 lines) and proceed straight to Step 1. No approval gate — the interview WAS the approval.

Operating rules for everything after Step 0

  1. Answers are LAW. Never override a user answer with your own judgment. The Council (below) rules only on delegated or unasked details.
  2. The Council — three minds, one ruling for delegated decisions: Visionary (most plausible amplified intent), Pragmatist (smallest scope that genuinely ships), Skeptic (edge cases, invalid input, security, failure modes). Ruling = Visionary's intent, cut to Pragmatist's scope, hardened by Skeptic. Material rulings (auth, data retention, payments, licensing) get logged in the Assumptions table.
  3. Superlative claims are promises. If the user's own answer settles for a heuristic ("good enough is fine"), say so plainly in the README. If a superlative claim was delegated to the Council and narrowed, the narrowed, honest wording MUST appear in the shipped README/help text, not only in 01-intent.md's assumptions table.
  4. Evidence over claims. Nothing is Done on narrative — Done requires a captured oracle artifact on disk (command + exit code).
  5. Walking skeleton first. Increment 1 is a thin end-to-end slice that actually runs.
  6. Steady observable progress. Every loop iteration changes state on disk; any re-run resumes from the ledger.
  7. Live data only when needed (versions/prices/APIs). Safety: never invent secrets; never run destructive or paid actions silently.
  8. After Step 0, ask nothing more except the single sanctioned question in 4.4.

Layout

One git repo rooted at builds/<slug>/ (not just app/ — the interview transcript, plan, stories, ledger, and evidence are the proof-of-work and must share history with the code they prove):

builds/<slug>/
  00-seed.txt      # seed idea verbatim, written first
  00-interview.md  # every question asked + the user's answer, verbatim
  01-intent.md     # Step 1
  02-plan.md       # Step 2
  03-stories.md    # Step 3
  04-ledger.md     # Step 4 — live status board
  evidence/        # Builder oracle runs, per story — COMMITTED (proof-of-work)
  adversary/       # Adversary oracle re-runs + scratch — gitignored, never app/
  app/             # the product

Slug = kebab-case from the seed. Existing dir: same seed → resume from the ledger (and skip Step 0 if 00-interview.md is complete); different seed → append -2, -3, …

Step 1 — Intent brief → 01-intent.md

Compile the interview into a decisive brief (≤ 1 page, no options, no TBD). Mark each line's provenance: [user] for answered, [delegated] for Council-ruled.

  1. Product statement — 2–3 sentences: what, for whom, why.
  2. Top 3 usage scenarios — concrete, first-person, step-by-step enough to literally replay (they become the final smoke test in 4.3).
  3. MVP features — numbered F1..Fn, each one line and testable.
  4. Out of scope — explicit, including features the user deferred.
  5. Stack — one line + why.
  6. Success criteria — the user's own "done when…" made measurable.
  7. Assumptions — table | # | Assumption | Material? | — delegated decisions only.
  8. Superlative claims — any absolute/superlative language and whether it's user-settled, achieved, or narrowed; if narrowed, the exact honest replacement wording for README/help.
  9. Top risks — Skeptic's list + one-line mitigation each.

Step 2 — Build plan → 02-plan.md

  1. Summary — one line.
  2. Architecture — components + data flow, ≤ 10 lines (or one small mermaid block).
  3. File tree — the planned app/ layout.
  4. Milestones — M1 = walking skeleton, then M2..Mn. Each milestone lists atomic tasks: | ID | Task | Files | Definition of Done | — every DoD testable, no "etc."
  5. Data contracts — schemas, types, CLI/API signatures (exact, if applicable).
  6. Test strategy — framework + what kind of test proves what.
  7. Run instructions — exact commands: setup, run, test.

Step 3 — User stories → 03-stories.md

  1. Story map| ID | Title | Implements | Deps | Increment | Status |. Increment 1 = walking skeleton. Every plan task appears in some story's Implements (100% coverage, no orphans).
  2. Per story (exact schema):
    • ### US-<n> — <title>
    • Implements: task IDs. Deps: story IDs or none.
    • Statement: As a <role>, I want <capability>, so that <benefit>.
    • Acceptance criteria (Gherkin): Scenario: blocks — happy path plus at least one negative/edge case (use the edge cases the user named in the interview). No story may skip the negative case; if truly none applies, write Scenario: N/A — <one-line reason> explicitly rather than omitting it.
    • Checklist: - [ ] items derived 1:1 from the Gherkin. Oracle naming: name the oracle by behavior, not by a literal test function name that doesn't exist yet — e.g. "a test proving grade 1 yields the spec EF value", not test_ef_grade1. The exact test name is filled in — and cross-checked against the real file — only when the story closes (see 4.1 step 3).
    • Sub-tasks: ordered - [ ] list. Files: paths touched.
  3. Cross-cutting stories — required: input validation & error handling; plus security/config/logging if the domain needs them.

Standards: INVEST, vertical slices, zero TBDs, each story completable in one focused session. Nice-to-haves → "Out-of-MVP backlog" the loop never picks up.

Step 4 — Delivery loop

Embody the senior engineer for the chosen stack. Two minds run this loop:

  • Builder — implements, writes tests, runs oracles, records evidence, commits.
  • Adversary — a skeptical QA mind rewarded only for finding a failing criterion. Sees only the story's Gherkin+checklist and the code on disk; re-runs oracles itself; never reads Builder's journal narrative (exception: 4.1 step 4b, fix-verification).

4.0 Setup (once per run)

  1. Create 04-ledger.md from this exact template:
# Ledger — <slug>
seed: <verbatim seed>
stack: <stack> | toolchain: <available|unavailable> | started: <timestamp>
SCOREBOARD: done=0 self=0 unverified=0 blocked=0 todo=<N>

| ID | Title | Deps | Status | Attempts | Evidence | Last result |
|----|-------|------|--------|----------|----------|-------------|

## Journal

## Impediments

Status values: todo / doing / done / done-self / done-unverified / blocked. Evidence column: the path to that story's evidence dir, filled in as soon as the first oracle runs. 2. Toolchain probe: run the stack's version + test-runner commands; record the result in the header. 3. git init at builds/<slug>/ (the whole tree). Write a stack-appropriate .gitignore that excludes app/'s deps/build output, .env*, and adversary/ (QA scratch and re-run logs are regenerable and not part of the shipped deliverable — evidence/ is the committed proof; adversary/ stays out of history so it never bleeds into a story commit). Set a repo-local commit identity if none exists.

4.1 Iterate until termination

  1. Pick: earliest incomplete increment → first todo story whose deps are done/done-self/done-unverified.
  2. Build: read the story → micro-plan (3–6 bullets) → implement the smallest correct slice in app/ → author the tests the Gherkin implies, using real test names.
  3. Citation-sync: before ticking any checklist item, confirm the exact test name/command you're citing actually exists and passes right now — re-run it, don't trust memory. Prove: run the oracles — test runner, compiler/type-check, lint, plus a real smoke run when the story is user-facing. Save every run to evidence/US-<n>/<seq>-<oracle>.txt. Evidence format contract (mandatory): each Builder evidence file's first line is COMMAND: <exact command run> and its last line is EXIT_CODE: <int> — a file missing either does not count as evidence. Tick a checklist item only by citing its evidence file.
  4. Commit first (resolves the Adversary race). As soon as the story self-proves, make the US-<n>: <title> commit in the repo root (builds/<slug>/), touching only app/ (plus that story's evidence/US-<n>/); verify git status is clean of stray adversary/ files. The Adversary re-runs oracles against files on disk, so it must verify a stable committed state, never a half-written working tree. Do any history-reconstruction only when no Adversary is running.
  5. Adversary pass (against the state you just committed):
    • a. First check of a story: spawn a fresh-context subagent (if the harness supports subagents) given ONLY the story's Gherkin+checklist and the committed app/ path, instructed: "Verify the committed state at HEAD, not any later uncommitted edits. Re-run the oracles yourself from adversary/US-<n>/ as your scratch dir — never write into app/. Save each re-run with the COMMAND:/EXIT_CODE: contract to adversary/US-<n>/ (both fields present; for your own QA files EXIT_CODE need not be the literal last line — a trailing note is fine). Try to find a failing criterion; report pass/fail per item." Fail-closed: any Adversary fail reopens the story (consumes an attempt); the fix lands as a follow-up commit.
    • b. Fix-verification round: when re-checking a story that previously failed, the Adversary MAY be told the one-line prior failure reason (nothing else) so it knows what to specifically re-attack, then independently re-runs the full checklist as usual.
    • c. Subagent death: if the Adversary subagent errors out or is lost mid-run, respawn it once. If it dies a second time, fall back to a same-thread skeptical re-check and cap the story at done-self.
    • d. No subagent capability at all → same-thread fallback from the start, capped at done-self.
  6. Outcome:
ResultStatusNext
All items evidence-proven + Adversary-confirmed in a fresh context (first attempt or after one respawn)doneupdate ledger, next story
Proven, but Adversary ran same-thread (no subagent, or died twice) or a criterion is judgment-only (pure UX)done-selfupdate ledger, next story
Toolchain genuinely unavailable (re-probe once before degrading)done-unverifiedcode+tests authored & committed, next
Any item failsattempt++diagnose, fix, re-prove, follow-up commit
3 attempts exhausted, or needs a real secret/paid resource/destructive actionblockedlog impediment, next story

Attempt accounting (explicit): the initial build-and-prove pass (steps 2–5a) is attempt 1. Each fail→fix→re-prove cycle increments the counter; blocked triggers once attempt 3 also fails (at most 2 retries after the initial attempt). Security-tagged stories (auth, secrets) never reach done on mocked credentials — cap at done-self with a journal note. 7. Update the ledger — the story's row (incl. Evidence column), the SCOREBOARD line, and a journal entry (≤ 8 lines). Code is already committed (step 4); this is bookkeeping only.

4.2 Sweep (when no eligible todo remains)

  1. Regression sweep: Adversary re-runs the full test suite from a clean state; compares fresh exit codes against evidence/. Any story whose oracle no longer passes → reopen and back through 4.1.
  2. Commit-integrity sweep (content, not just existence): for every done/done-self story, git log --grep "^US-<n>:" must return a commit AND git show --stat on it must touch at least one file the story declared in its Files list. A commit that exists but contains none of the story's code (bundled into a neighbor's commit) fails and the story is reopened — existence alone is not integrity.
  3. Intent-drift sweep: walk every MVP feature (F1..Fn) in 01-intent.md and confirm it is literally present and working in the shipped app/ — invoke it, don't just find its function. Any feature silently dropped or quietly narrowed is either implemented as a new story or explicitly moved to "Out of scope" in 01-intent.md with a journal entry. A promise the app doesn't keep is a defect. (Especially important here: the interview made explicit promises to the user.)
  4. Blocked retries: each blocked story gets up to 3 fresh-approach retries (max 6 total attempts per story, per the v3 attempt accounting above).

4.3 Quality bar (checked in the sweep)

  • Real error handling on every user input and I/O path; no TODO/stub/placeholder anywhere.
  • README.md in app/ with exact setup/run/test commands that actually work on this machine's real toolchain — verified by running them verbatim from a fresh clone (if the box is uv-only, the README says uv, not pip; a command that fails as written is a docs honesty gap). And any narrowed superlative stated honestly.
  • Scenario replay (mandatory final smoke): literally replay each of 01-intent.md's "Top 3 usage scenarios" step by step, not just "exit code 0" — this catches a feature that passes its unit tests but doesn't deliver the promised experience. Capture the replay as evidence. Portable-path rule: any standalone smoke script MUST resolve paths relative to its own location (or take them as args) — never hardcode an absolute path to the build dir, or it silently tests the original copy from anywhere and passes even against broken code. Verify by running it from a fresh clone elsewhere.
  • The app runs end-to-end at every increment boundary — proven by a captured smoke-run evidence file.
  • Code idiomatic to the stack; no dead code.

4.4 Terminate and report

  • All done → declare "All stories machine-verified."
  • Mixed tiers → report exact counts; recommend an independent CI/human pass on non-machine-verified IDs.
  • More than half done-unverified → do not claim success; report "authored but unverifiable — no toolchain."
  • Any blocked → list each ID + precise blocker, then ask the user exactly once: "N stories need your input — take them up now?" If yes, ask minimal targeted questions scoped to the blockers, then run those stories back through 4.1.

Context discipline (long runs)

  • Journal entries ≤ 8 lines; never paste code or test output into the ledger — evidence files hold that.
  • Before each pick, re-read only the SCOREBOARD line, the status table, and the chosen story.
  • On any restart, reconcile from the ledger before acting.

Final chat summary (print only this)

Slug + stack + one-line product statement; artifact paths; SCOREBOARD counts; how to run the app; which decisions were [user] vs [delegated] (material only, including any narrowed superlative and its honest README wording); the 4.4 blocked question if any.

Repository
cindulasai/build-something
Last updated
Created

Is this your skill?

If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.