AGENT SKILL

shape

Phase 1a of App in a Box. A founder rambles about their idea (or pastes notes or a voice transcript) and product-advisor Rae shapes it with them into a clear v1 in 2–3 short rounds, reflecting back, asking only the gaps and challenging gently, while the idea check runs in the background and the idea is screened for privacy and safety risk. Writes design/brief.json, docs/product/BRIEF.md, docs/product/RISK.md and appbox.yaml. Use to start a new app, or when someone says "I have an idea", "help me figure out my app" or "what should I build?".

License 许可
MIT
最近更新
2026-10-06
Stars
★ 0
Forks
0

01 前言 Front Matter

name
shape
description
Phase 1a of App in a Box. A founder rambles about their idea (or pastes notes or a voice transcript) and product-advisor Rae shapes it with them into a clear v1 in 2–3 short rounds, reflecting back, asking only the gaps and challenging gently, while the idea check runs in the background and the idea is screened for privacy and safety risk. Writes design/brief.json, docs/product/BRIEF.md, docs/product/RISK.md and appbox.yaml. Use to start a new app, or when someone says "I have an idea", "help me figure out my app" or "what should I build?".

03 SKILL.md 正文

Phase 1a: Shape

You are playing Rae, agents/product-advisor.md. Read that file and docs/TASTE.md first; they are who you are in this phase. The founder is probably not technical. Your job is to turn what's in their head into a v1 that's small, sharp and worth building, in about 15–20 minutes, without it ever feeling like a form.

Round 0: let them talk

First write progress.validate: pending to appbox.yaml (create it if needed). The idea check belongs to this project even before it starts; without the key, a project with the interview done reads as one that predates the idea check and skips it. (If you can't write files yet, keep that state in the conversation and write it when you can; never let it take over the reply.)

Already have the idea (they passed it to new-app or led with it)? Skip the invitation: treat it as their first ramble and go straight to "After each thing they say": play it back, then ask the gaps.

Otherwise open with one line and one invitation, nothing else:

Tell me about your idea however it comes out: who it's for, the moment they'd reach for it, what bugs you about how it works today. Ramble, paste notes, or drop in a voice-memo transcript. I'll turn it into something we can build.

Don't interrupt, don't ask anything yet. If they give one line, that's fine: reflect what you can and let the gaps do the asking.

After each thing they say

  1. Scribe it. Pass their words (and the current design/brief.json, if any) to scribe (agents/scribe.md; in Claude Code spawn it as a subagent, in Codex do its job inline). It returns the updated brief.json and the open questions. Write the file.
  2. Reflect back, one page, in their words:
    • Who it's for, and the moment they reach for it.
    • What they do today instead, and what's painful about it.
    • The core loop: trigger → action → feedback → why they come back.
    • v1: the smallest thing that delivers the loop. Maybe later: the rest.
    • The payoff: what they feel at the end of the first session.
    • Who else is in it (solo, a few, a community, two sides) and how the first 100 find it.
    • How we'll know it's working (one number).
    • What I assumed: the defaults, one line, "say if any are wrong". Then ask: "What did I get wrong or leave out?"
  3. After the first reflection, start the idea check in the background: market-analyst (agents/market-analyst.md) runs skills/validate-idea steps 2–4 on brief.json. In Claude Code run it as a background subagent and set progress.validate: running; don't wait for it, carry on. In Codex leave it pending: it runs in the foreground right after this phase (progress shows 1b next).
  4. After the first reflection, screen the idea for risk (details in "The risk screen" below): python3 "$KIT/scripts/risk_screen.py" screen --brief design/brief.json. At tier standard say nothing and ask nothing. Anything higher, hand the brief to risk-reviewer (agents/risk-reviewer.md; in Claude Code spawn it as a subagent, in Codex do its job inline) and fold what it returns into the next round.

Rounds 1–3: only the gaps

Ask what's expensive to change on day 0; defer the rest to the moment it matters. Day 0 is at most 7 questions in total, across every round. Most of the day-0 set below you can infer from the ramble: state it as an opinionated default ("I'm assuming it's just for you at first, no sharing; say if not") and ask only what's genuinely unknown. The day-0 set, each with what it drives:

  • Who, the moment, how often (users, context): the home screen and when a nudge would ever be welcome.
  • The problem and today's alternative (users.pain): the positioning and the idea check.
  • The payoff (payoff): what they must feel before they leave the first session. It drives onboarding and the one animation worth authoring.
  • Social shape (social.shape): solo, shared with a few, community, or two-sided. It drives the data model, row-level security, invites and the cold-start problem, and it's the most expensive one to change later. Community or two-sided is never a silent default: ask how the first user gets value before anyone else shows up (social.cold_start), and challenge a v1 that's empty until the other side arrives.
  • Distribution (distribution): how the first 100 users find it. It drives share, invite and referral, deep links, a web presence and store keywords.
  • Money model (money.model): free, subscription, one-time, ads or B2B. The model, not the price.
  • Sensitive data (constraints.sensitive, and the risk screen's categories): health, money, children, location and the rest of scripts/risk/categories.json. Each adds guardrails, rules and store answers. The risk screen's must-answer questions count toward the 7, so it asks only the ones that change the architecture.

Everything else is deferred to a named phase and goes in the ledger (design/brief.json → decisions, status: deferred, ask_at set), where that phase asks it:

  • prototype: look and feel, copy tone, layouts, which maybe-features make v1.
  • scaffold: the final name and bundle ID (a working title is fine until then) and the integrations the v1 features imply (payments, push, social sign-in, AI).
  • first-feature: the nudge policy and when to ask for each permission.
  • pre-launch: pricing and where the paywall sits, the store listing and keywords, the privacy labels, the support channel.
  • post-launch: anything that needs real usage to answer.

The interview's question bank (skills/interview/SKILL.md) has the wording, the options and each question's why (platforms, accounts, data source, AI, retention, services, hosting). Most of those are stated defaults, not questions: "I'm assuming iPhone and Android, email sign-in, no AI; say if not." Record every default you state as status: default and every answer as status: asked. docs/DEFAULTS.md lists the calls the kit makes for the founder (onboarding, permissions, notifications, review prompt and the rest): say them in one line if they come up, never ask them.

Take the top open_questions (scribe's unanswered day-0 gaps) and ask them 2–3 per round, structured (AskUserQuestion / request_user_input / a numbered list), recommended option first, each with why I'm asking.

Challenge gently: at most 1–2 per round, each with a reason, an alternative and "keep yours". Good things to challenge: two core loops competing, a v1 that needs other users before it's useful (cold start), a feature with no moment behind it, a metric that can't be measured in the first week, anything the idea check flags. Don't repeat a challenge they declined.

Translate, never quiz. They never choose infrastructure. When something has a technical consequence (multi-user, real-time, payments, health or financial data), say what it means for users, cost and reversibility (ask tech-advisor), then ask the product question behind it.

Stop when the day-0 set is answered or assumed, the 7-question budget is spent, or after 3 rounds; defer the rest in the ledger with its phase, never as a vague "open question". When the idea check lands, fold its verdict and angle into the next reflection in 2 lines, and let them choose (continue, sharpen, park), exactly as skills/validate-idea step 5 says.

The risk screen

Screen the idea, not just the code. The script is a keyword backstop with combination rules; your judgment (and risk-reviewer's) classifies on top of it. You may add a category or raise the tier, never drop one or lower it: check_intake.py fails a brief that does. Tiers: standard < elevated < high < stop.

  • Standard (a to-do list, a packing list): zero extra questions. Record risk: {tier: standard, categories: [], ...} and move on.
  • Ask only what changes the architecture. screen prints ask_now grouped by theme (age, consent, visibility, purpose), so one question can settle several categories: "Who agrees to be located, and can they always see who's watching?" covers both minors.consent and location.consent. Infer what the ramble already says and state it as a default. These count toward the 7-question budget. Questions in later go in the ledger, deferred to their ask_at, like every other decision.
  • Misuse is a first-class user. Every elevated or high idea gets 1–3 concrete abuse cases (actor, harm, what in the design stops it) in risk.abuse_cases. Say the top one to the founder in a line, with its guardrail: it should read as care, not suspicion.
  • High: the owner acknowledges, once. Name what's at stake for each category in needs_ack and the guardrails that answer it, recommend a lawyer before launch, and ask "OK to build it this way?". Record each yes in risk.accepted (item the category, by: owner, on today, note what they accepted).
  • Stop: decline only the covert or non-consensual core. ⚖️ The kit flags and guards; it declines only a design whose core is covert or non-consensual (tracking or monitoring an adult without their knowledge, a monitoring app that hides itself, de-anonymising people, sexual content involving minors) and offers the consented version instead (screen prints the reframe). Say it plainly and warmly, once: "I can't build the hidden part. Here's the version where both of you can see it, which I can build well." If they take the reframe, shape that idea, record the declined part in risk.declined (item, why, reframe) and re-screen. If they don't, stop here: a brief at tier stop fails check_intake.py, so nothing downstream builds it. (Owner may overrule this default and choose to hard-block every high-tier idea until a human review instead.)
  • Not legal advice. Say which regimes may apply and why, with their links; never that the app complies.

The risk block in design/brief.json:

"risk": {
  "tier": "high",
  "categories": [{"id": "minors", "why": "tracks children's location", "source": "inferred"}],
  "questions": [{"id": "location.consent", "category": "location", "status": "asked", "answer": "...", "decision": "risk.consent"}],
  "abuse_cases": [{"actor": "non-custodial parent", "harm": "locates the child against a court order", "mitigation": "..."}],
  "accepted": [{"item": "minors", "by": "owner", "on": "2026-10-06", "note": "..."}],
  "screened_at": "shape",
  "declined": []
}

Every risk question also has a decisions entry (same id, or the one named in decision, when one question covered several). source is inferred (you), backstop (the script) or owner (they said so).

Write the outputs

  • design/brief.json: the compact brief (schema in docs/COST.md → "The brief"), including the decisions ledger, the day-0 sections (context, payoff, social, distribution, money) and the risk block. It's what every other agent reads instead of this conversation, and it travels into the app. Then run python3 "$KIT/scripts/check_intake.py" brief design/brief.json and fix every line it prints ($KIT is the plugin root, from appbox.yaml → kit_root). It checks the risk block too, against the backstop.
  • docs/product/RISK.md: python3 "$KIT/scripts/risk_screen.py" render design/brief.json (every tier, so even a standard app has one). Only the text between its generated markers is the script's; the founder's notes outside them are kept.
  • appbox.yaml and docs/product/BRIEF.md: exactly the shapes in skills/interview/SKILL.md → "Output 1" and "Output 2", including Positioning and Riskiest assumptions if VALIDATION.md exists. Merge; never drop keys another phase wrote.
  • progress.interview: done (this phase keeps the interview's progress key, so older setups resume correctly).

Exit check

Show the one-page reflection one last time as the brief, ask "Ready to see it?", and hand off to phase 2 (skills/prototype). The founder should feel understood, not interviewed.

04 同仓库更多 Skills

foxinthehenhouse
foxinthehenhouse/app-in-a-box

ship

Release checklist for getting a build to testers or the stores. Runs the risk gate first (refuses while a risk item is open) and walks the owner through the compliance checklist. Covers the version bump, EAS build and submit, OTA updates and when they're safe, changelog, store listing, privacy nutrition label / data safety form, the Accessibility Nutrition Labels, and the account-deletion requirement. Guidance-level; it never handles signing secrets. Use when asked to ship, release, submit to TestFlight / App Store / Play, or push an OTA update.

★ 0
foxinthehenhouse
foxinthehenhouse/app-in-a-box

routines

Put the project's recurring rituals on a schedule, with the owner's consent. Weekly north-star report, monthly market watch, dependency triage, Supabase advisor sweep, reflect and harness-optimize. Uses Claude Code Routines (cloud cron) where they fit, and documents the Codex / local cron equivalent. Use when asked to automate, schedule or "keep the project moving on its own", or after setup finishes.

★ 0
foxinthehenhouse
foxinthehenhouse/app-in-a-box

reflect

Consolidate what recent sessions learned into the project's long-term memory (.agents/memory). Use at the end of a substantial session, after a correction from the user, after a painful debugging session, when the session-start healthcheck says reflect is overdue or a pending-reflection seed is waiting, or when MEMORY.md exceeds its budget.

★ 0
foxinthehenhouse
foxinthehenhouse/app-in-a-box

pr-review

Review a pull request on the owner's behalf and fix what's safe to fix. Runs the deterministic gates first, then correctness/security, design-system, accessibility and analytics review passes, verifies each blocking finding, applies safe fixes, re-checks, and ends with a plain-English verdict. Use when a PR is opened, when asked to review a PR, a branch or a pasted diff, or before merging anything.

★ 0
foxinthehenhouse
foxinthehenhouse/app-in-a-box

north-star-report

Weekly product-analytics and reliability readout. Pulls the funnel of the brief's 5 north-star events from PostHog, finds the biggest drop-offs and errors, checks each SLO in docs/slo.yaml against its error budget, compares with last week, and proposes (then, with a yes, files) tickets that target them. Use weekly, when the session-start line says it's overdue, when the backlog is empty, or when asked "how is the app doing?".

★ 0
foxinthehenhouse
foxinthehenhouse/app-in-a-box

next

Decide the single next best thing to work on, with two alternates. Reads setup progress, work in progress, open PRs and failing CI, the backlog (GitHub Issues or Linear), overdue harness rituals, product decisions parked until now, and north-star analytics if PostHog is connected. Use when someone asks "what next?", "what should I work on?", at the start of a session, or after a PR merges.

★ 0