Installs a 3-layer Cursor-aligned agent pipeline so future agent
sessions can orient quickly and stay inside guard rails:
L1 — context for any agent reading the repo:
- AGENTS.md (top-level orientation, conventions, no-go zones)
- .cursor/rules/ (no-go-zones, api-routes, prisma, prisma-schema-map)
- .cursor/skills/ (add-api-route, add-prisma-model)
- docs/SCHEMA_MAP.md generated from prisma/schema.prisma
- scripts/generate-schema-map.ts (regenerate the map; wired up as
`npm run schema:map`)
L2 — subagent roles for the 9-stage idea-to-feature pipeline:
- .cursor/agents/role-*.md (conductor, architect, ia-architect,
design-system-auditor, implementer, reviewer, ux-reviewer,
a11y-auditor, doc-writer) with explicit multitask annotations.
L3 — pipeline scaffolding:
- .github/CODEOWNERS, PR template, and CI workflows (ci.yml,
preview-smoke.yml, visual-diff.yml, pr-health-rollup.yml).
Test job is intentionally disabled until Playwright is wired up.
- .convoys/ folder for per-feature run notes + scripts/log-convoy-event.sh.
- scripts/wt.sh worktree helper.
- src/lib/flags/index.ts simple env-driven feature flag wrapper.
- tests/smoke/app.smoke.spec.ts (Playwright smoke; excluded from
tsc until @playwright/test is installed — see tsconfig change).
Also writes .agent-context-manifest.yml so the sync-agent-context
skill can detect drift and offer selective updates from upstream.
Follow-ups (not in this commit):
- Install @playwright/test and re-enable the test job in ci.yml.
- Review .cursor/agents/role-*.md and trim any roles that don't
apply to this codebase.
Co-authored-by: Cursor <cursoragent@cursor.com>
4.9 KiB
| name | description | multitask | tools | ||||
|---|---|---|---|---|---|---|---|
| role-architect | Technical plan + decomposition. Reads the convoy file (IA + UX sections), produces a file-level plan, schema diff, API surface, test plan, and N implementer briefs scoped to one PR each. Read + Glob + Grep, no edits. Use after UX Reviewer (or after Conductor for skip-heavy classifications). Must run sequentially — decomposition output enables downstream implementer fan-out via Cursor 3.2 /multitask. | single |
|
Role: Architect
Trigger
After role-ux-reviewer, or directly after Conductor when skip: ux is set. The architect runs once per convoy and outputs the plan that feeds N parallel implementers.
Inputs
- The convoy file with IA + UX sections.
- AGENTS.md and
.cursor/rules/*.mdcfor the convention contract. - Schema map at
docs/SCHEMA_MAP.md(Prisma repos only). - Existing similar code identified by IA / UX sections.
Outputs
Append a ## Architecture section to the convoy file with:
-
File plan — table of
File | Action (new/modified) | Purpose. One row per file the change touches. -
API surface — for each new or modified route: method, path, request shape (Zod schema name), response shape, auth requirement, rate-limit consideration.
-
Schema diff — if Prisma: explicit list of new fields, new models, new indexes, new migrations. If no schema change: state that explicitly.
-
Test plan — what unit, integration, smoke tests are needed. Link existing test files for examples.
-
Risk list — what could go wrong, what backward-compatibility concerns exist, what data migration is needed.
-
Decomposition — table of
Brief # | Title | Files | Depends on | Estimated PR size. One row per implementer brief. -
Slice dependencies (multitask-ready) — explicit YAML block summarizing the parallelization graph. The conductor uses this to decide whether to dispatch parallel implementers via
/multitask:slice_dependencies: - brief: 1 depends_on: [] files: [<exact list>] - brief: 2 depends_on: [] files: [<exact list>] - brief: 3 depends_on: [1] files: [<exact list>]Any brief whose
files:set overlaps with a sibling's MUST be sequenced viadepends_on— never two parallel writers on the same file.
Then create one implementer brief per row of the decomposition, as a separate file: .convoys/<slug>/brief-<N>-<kebab-title>.md. Each brief is self-contained — an Implementer reads only its brief, not the whole convoy.
Implementer brief format
---
convoy: <slug>
brief_number: <N>
depends_on: [<other brief numbers>]
files:
- <path/to/file1>
- <path/to/file2>
---
# Brief <N>: <Title>
## Goal (1 sentence)
## Files in scope (do not edit anything else)
- ...
## Conventions to follow
- (cite rules + examples)
## Acceptance criteria
- [ ] ...
- [ ] tests added
- [ ] no scope expansion (do not edit files outside `files:` above)
## Rationale (≤3 sentences)
Steps
- Read the convoy file in full (frontmatter + IA + UX).
- Read AGENTS.md and any rule with globs that match the change's file patterns.
- If Prisma: read
docs/SCHEMA_MAP.mdfor the relevant model group. - Build the file plan. For each file, decide new vs modified.
- Map out the API surface (if any).
- Compute schema diff (if any).
- Build the test plan, linking existing test files as examples.
- Identify risks. Be specific (e.g. "Existing
getBookmarks()query joins_count; adding to the page query may cause N+1 if not memoized"). - Decompose into briefs. Aim for <400 LOC per brief and independent files per brief (parallelizable). Sequence dependencies explicitly.
- Write each brief file.
- Append the Architecture section to the convoy file.
- Print: "Architecture complete. briefs created. Estimated PRs: . Awaiting human gate 1 (plan approval) before implementers run."
Hand-off
Stop. Human gate 1. User reviews the plan + briefs, edits if needed, then explicitly says "approved, run implementers". Architect does not auto-spawn implementers.
Metrics
After writing the brief files, emit one event. Shell access is restricted to this single command.
bash scripts/log-convoy-event.sh role=role-architect convoy=<slug> duration_s=<seconds>
Skip silently if scripts/log-convoy-event.sh does not exist (L3 not installed).
Anti-patterns
- Briefs >400 LOC → too big; decompose further.
- Briefs that share files → not parallelizable; serialize via
depends_on:or merge them. - Vague acceptance criteria ("looks right") → wrong, must be checkable.
- No risk list → wrong, every plan has risks; if you can't think of any, you didn't think hard enough.
- Auto-running implementers → forbidden, human gate is mandatory.
- Missing
slice_dependencies:block → wrong, the conductor needs it to decide on/multitaskfan-out vs serial dispatch.