Plan work as Tasks
Write a plan, review it in the browser and approve it, so the Factory has ready Tasks to claim.
On this page
The Factory only works on Tasks. A plan is a set of Tasks that share an epic label, connected by dependencies. You can create one in three ways:
| Way | Use it when |
|---|---|
| Ask the overseer | You're starting the Factory anyway and can describe the goal in a few sentences. |
| Ask your coding agent | You already worked out the plan in a Claude Code, Codex or other session. |
| Write the plan file yourself | You want full control, or you're scripting it. |
All three end with the same browser review and the same Tasks.
What a good Task contains
Each Task should fit in one agent's context and carry its own proof. A worker reads only its Task, so put everything it needs in the Task.
| Field | Required | What to put in it |
|---|---|---|
title |
yes | The outcome, not the activity: "Export respects filters", not "Work on export". |
objective |
yes | One or two sentences on what changes. |
implementation |
yes | Numbered steps, file paths, the functions to change. |
acceptance |
yes | Observable results a reviewer can check. |
verification |
yes | The exact test file and test name that proves it, plus any screenshots. For work that crosses a process or network boundary, add Integration matrix:, Fidelity: and Not proven here: lines. |
risk |
yes | low, medium or high, with notes. |
depends_on + dependency_reasons |
if any | Keys of Tasks that must merge first, each with a one-line reason. |
kind |
no | human for work only a person can do (sign-off, production rollout); post_deploy for checks after deploy. Workers never claim these. |
Limits: 1–50 Tasks per plan. Keys are lowercase ([a-z][a-z0-9_-]*) and at most 31 characters. No cycles.
A. Ask the overseer
-
Start the Factory:
archdev agents factory run(see Run the Factory). -
Type your goal at the prompt:
Add CSV export to the results page. Exports must respect the active filters and the user's permissions. End-to-end tests for the API and the download. -
The overseer drafts a Task graph and opens a review in your browser. Continue at Review and approve.
B. Ask your coding agent
In a session where you've already discussed the work (install the skill first with archdev setup --skills --skill tasks --scope repository, then restart the agent):
Use the tasks skill to turn this plan into ArchDev Tasks under epic "CSV export".
What happens:
- The agent reads
archdev tasks guideandarchdev tasks graph schema. - It writes a plan file and checks each Task with a fresh subagent: wrong test paths, missing context, undefined config.
- It runs
archdev tasks review start --file <plan>.json, which opens the review page.
Continue at Review and approve.
C. Write the plan file yourself
Run these from the repository the work belongs to. Tasks are linked to the current checkout's GitHub repository, and the Factory only claims Tasks from its own repository.
1. Pick or create a project. It's optional, but recommended: it groups the epic on the Tasks page. Without a project_id, the epic label gets a suffix such as CSV export (ab12cd), and --epic "CSV export" won't match it.
archdev projects list --query "CSV export"
archdev projects create "CSV export" --description "Filtered CSV export from the results page"
Copy the prj_… ID.
2. Write plan.json:
{
"action": "preview",
"epic": "CSV export",
"nodes": [
{
"key": "export-api",
"title": "Export respects filters",
"objective": "Add GET /api/export, which streams the filtered, authorized rows as CSV.",
"implementation": ["1. Add GET /api/export using the existing filtered query.", "2. Stream rows as CSV."],
"acceptance": ["Export returns exactly the rows the user can see under the active filters."],
"verification": ["tests/export-api.e2e.test.ts: 'filtered export returns only authorized rows'"],
"risk": { "grade": "low", "notes": "New read-only endpoint." },
"project_id": "prj_0123456789abcdef01234567"
},
{
"key": "export-ui",
"title": "Users can download filtered results",
"objective": "Wire the Download button to /api/export with the current filters.",
"implementation": "1. Call /api/export with the active filters from the results page.",
"acceptance": ["The downloaded file matches the active filters."],
"verification": ["tests/export-ui.e2e.test.ts: 'download matches filters' (browser download, file inspected)"],
"risk": { "grade": "low" },
"project_id": "prj_0123456789abcdef01234567",
"depends_on": ["export-api"],
"dependency_reasons": { "export-api": "Needs the endpoint." }
}
]
}
Replace prj_0123456789abcdef01234567 with your project ID. "action": "preview" is required. Every depends_on entry needs a matching dependency_reasons entry.
3. Open the review:
archdev tasks review start --file plan.json
Or, to create the Tasks without a review:
archdev tasks graph import --file plan.json
Imported 2 tasks in 2 dependency waves
Plan: <hash>
graph import creates the Tasks immediately; it has no dry run. Use review start to see the plan before anything is created.
Review and approve
archdev tasks review start runs a local review server and opens it in your browser. Over SSH it prints an encrypted relay link instead. The URL contains a private token, so don't share it. The command keeps running and streams feedback events until you stop it, so leave that terminal open and use another one.
On the review page:
- Read each Task, its dependencies and the major decisions the planner raised (each with a recommended option).
- Leave comments or request changes. Your agent (or the overseer) receives them, revises the plan and updates the page.
- Click Approve & save. The Tasks are created with their dependency edges. The status changes to
saved; onlysavedmeans the save succeeded. - Stop the review server:
archdev tasks review stop <session-file>, using the session file path from thereadyeventreview startprinted.
Approving the same plan again later updates the same Tasks, and Tasks removed from the plan are closed. This depends on the receipt file review start keeps for that plan path. If the receipt is lost, a new review creates duplicates.
Plan checks
Before saving, the plan is checked for problems a worker can't solve before merge:
| Check | Severity | Fix |
|---|---|---|
pre-merge-unsatisfiable |
blocks the save | The Task requires production, a rollout, a soak, real or production credentials, or a human sign-off. Phrases like "visual inspection" or "screenshots inspected" also trigger it; describe screenshots as captured and attached instead. Move human or production work into a separate Task with "kind": "human" or "kind": "post_deploy". |
integration-matrix-missing |
warning | The Task crosses a boundary (webhook, queue, version skew…) but its verification has no Integration matrix: (or a simulated test has no Fidelity: / Not proven here:). |
ungated-deferred-proof |
warning | A Task named under Not proven here: isn't in any Task's depends_on. |
contradiction-credentials |
warning | The Task both requires and forbids credentials. |
To accept a blocking finding anyway, pass --allow-lint <check> to graph import, or add it to allow_lint in the plan file.
Check what's ready
archdev tasks ready --explain --epic "CSV export"
For the example plan, export-api is ready and export-ui is blocked (open_blockers). When export-api merges and closes, export-ui becomes ready on its own.
You can also see the plan at archdev.ai/tasks: use the Epics tab for progress per epic and Graph for the dependency chains.
Why a Task isn't picked up
A worker claims a Task only when all of these are true:
- It is open and has no open blockers.
- It is assigned to you, in your organization's tasks. Plans you save are assigned to you. Tasks saved with
review start --teamgo to a collection the Factory doesn't read. - It belongs to the repository the Factory runs in.
- It isn't
kind: humanorkind: post_deploy. - No other in-flight Task is changing the same files.
- In
--dispatch manualmode, you released it (see Run the Factory).
Next: Run the Factory.