Interview me relentlessly about every aspect of this plan until we reach a shared understanding. Walk down each branch of the design tree, resolving dependencies between decisions one-by-one. For each question, provide your recommended answer.
Ask the questions one at a time, waiting for feedback on each question before continuing.
If a question can be answered by exploring the codebase, explore the codebase instead.
Repo documentation map
docs/README.md is the system of record for what goes where. Read it before grilling instead of relying on a duplicated directory map in this skill.
The routes most relevant to a grill session are:
- Established conventions ("how we write Effect", "how we structure boundaries") →
docs/patterns/and the ast-grep rules inrules/effect/andrules/shared/. - How to build a new app ("CLI scaffold", "HTTP API scaffold") →
docs/templates/. - Accepted architectural shape ("what the system looks like for app X") →
docs/architecture/. - Unshipped non-trivial changes ("what we plan to change and why") →
docs/proposals/active/. - Feasibility work ("what the prototype proved") →
docs/experiments/. - Repo-level naming (app names, package names, command names) → the tables in
AGENTS.md.
This repo does not use a separate docs/adr/ tree. Architectural decisions are captured as rationale inside docs/architecture/ once accepted. Update or extend the docs that already exist; only graduate to a new file when docs/README.md's convention says you should.
During the session
Challenge against established conventions
When the user's plan conflicts with conventions documented in docs/patterns/, the ast-grep rules in rules/, settled shape in docs/architecture/, or the names/responsibilities recorded in AGENTS.md, call it out immediately. Examples:
- "
docs/patterns/effect.mdrequires custom errors to extendData.TaggedError(andrules/effect/use-tagged-error.ymlenforces it). Your plan introduces a plainErrorsubclass — intentional?" - "
docs/patterns/boundaries.mdsays external SDKs are wrapped in adapter files;runPromiseonly appears at entry points. Your plan callsEffect.runPromiseinside an interior service — is that a deliberate departure?" - "
docs/patterns/data-validation.mdrequiresSchema.decodeUnknownat boundaries — noascasts on parsed data. Your plan hasJSON.parse(body) as Foo— intentional?" - "You're using the name 'workspace' for what
AGENTS.mdcalls a 'project' — which do you mean?"
Sharpen fuzzy language
When the user uses vague or overloaded terms, propose a precise canonical term grounded in the codebase. "You're saying 'service' — do you mean an Effect Context.Tag service, an adapter wrapping an SDK, or a deployable app under apps/? Pick the one you mean and use it consistently."
Discuss concrete scenarios
When domain relationships are being discussed, stress-test them with specific scenarios. Invent scenarios that probe edge cases and force the user to be precise about the boundaries between concepts.
Cross-reference with code
When the user states how something works, check whether the code agrees. If you find a contradiction, surface it: "Your plan says the adapter swallows network errors, but the existing code in apps/foo/src/http.adapter.ts lets them propagate as a tagged error — which is right?"
Update docs inline
When a convention is sharpened or a name is pinned down, update the relevant doc in place — don't batch. Use the routing in docs/README.md:
- Coding convention (idiom, rule, style — applies across files) → extend the relevant
docs/patterns/*.md. If the pattern can be enforced mechanically, mention adding an ast-grep rule underrules/effect/orrules/shared/(with a matching test underrule-tests/). - Accepted system shape, data flow, or process model →
docs/architecture/(create the file if it doesn't exist). - Unshipped non-trivial design →
docs/proposals/active/. Proposals carry status while decisions are still in flight. - Feasibility notes and demo evidence →
docs/experiments/unless the repo has accepted the design. - How to build a new app of some kind → extend the matching
docs/templates/*.md. - Repo-level names or command pointers → update
AGENTS.md. - App-specific setup or run instructions → the app's own
README.md, notdocs/.
Don't couple docs to implementation details. Capture conventions that survive refactors, not specifics of a single function.
If the doc describes code behavior tightly, bind it with drift link <doc> <source-file> so future drift is caught — see docs/README.md and the drift skill.
Capture decisions sparingly
If the decision is already settled and uncontroversial, write it directly into docs/architecture/ or docs/patterns/. Don't invent ceremony where there's no live trade-off.
When a non-obvious architectural decision is already settled, capture it inline in the appropriate docs/architecture/<topic>.md with a short rationale section — see ADR-FORMAT.md for the shape and the criteria for when a decision is worth capturing at all. When the decision is still a proposal, use docs/proposals/active/; when it is accepted, architecture describes the accepted state and the completed proposal keeps the historical decision context.