Plan Outline
A saved agent plan as a read-only outline. The header shows the plan's status, a progress bar, and notices. Groups list their tasks. Each task opens to show its brief, what “done” means, what it waits for, and actions.
Launch the spring bulb catalog
RunningResearch what sold last spring, confirm supplier stock, then price, describe, and publish 48 varieties.
1 of 5 done · 1 working
Find what sold and what suppliers can ship.
Price, describe, and publish the new varieties.
Usage
import { PlanOutline, type PlanOutlineTask } from "@tulipfarm/sprout/plan-outline";
const tasks: PlanOutlineTask[] = [
{
id: "research", title: "Research", mark: "running", label: "1 of 2 done",
children: [
{ id: "audit", title: "Audit last spring's catalog", mark: "done", label: "Done", assignee: "Main agent" },
{
id: "suppliers", title: "Confirm supplier stock", mark: "running", label: "Working",
criteria: ["Each variety has a confirmed count."],
dependencies: [{ id: "audit", title: "Audit last spring's catalog", label: "Done" }],
},
],
},
];
<PlanOutline
title="Launch the spring bulb catalog"
status="Running"
tone="active"
progress="1 of 2 done · 1 working"
tasks={tasks}
/>title,brief: the plan name (anh3that also names the section) and one paragraph under it.statusandtone: the badge text and its color.toneisactive,attention,done,failed, orneutral.progress: the line under the bar, in words. The bar has one segment per task; cancelled tasks are left out.noticeandstale: any content under the progress, such as an Alert.tasks:{ id, title, mark, label, assignee?, brief?, criteria?, dependencies?, reason?, action?, children? }[]. A task withchildrenis a group.
Plan Outline has one look and one size. Map your own plan data to tasks in an adapter, as the examples here do. It never ticks, edits, reorders, or assigns tasks.
Marks and tones
Seven marks: pending (clock), running (spinner),attention (question), blocked (lock),done (check), failed (warning), andcancelled (crossed out). Every mark has a textlabel, so color is never the only signal.
Meadow garden plan
RunningA fictional example of a saved plan.
1 of 6 done · 1 working · 1 waiting for input · 1 failed
Actions affect this example only.
- Measure the bedVerified
- Rent a tillerCancelled
Nested groups
Groups start open and can nest. A group's brief shows above its tasks. A group with no tasks says so.
Resolve damaged order #4821
Running4 of 7 done · 1 working
Collect what the customer asked for.
- Read the support threadMain agentDone
- Look up the accountMain agentDone
- Refund the damaged tulipsBilling agentDone
Ship from the nearest warehouse.
- Pick stock in LeidenWarehouse agentDone
This group has no tasks yet.
Task details
A task with a reason, brief,criteria, dependencies, or actionopens to show them. A failed task's reason is red. Each dependency links to its row and moves focus there, opening its group if it was closed. Tasks with none of these are plain rows.
{
id: "pricing",
title: "Set prices for the spring catalog",
mark: "attention",
label: "Needs your review",
assignee: "Pricing analyst · created for this plan",
brief: "Use last year's margins and current supplier quotes.",
criteria: ["No variety sells below a 35% margin."],
dependencies: [{ id: "audit", title: "Audit last spring's catalog", label: "Done" }],
action: (
<Button variant="outline" size="sm" nativeButton={false} render={<Link to={taskUrl} />}>
Review in task
</Button>
),
}Pick “Waiting on you” or “Verified” in the playground above to open a task with an action or a verification report.
Notice and stale data
Put alerts and requirement checks in notice. When a refresh fails, keep the last plan and say so in stale.
Launch the spring bulb catalog
Paused2 of 5 done · 1 working · 1 need verification
What this plan must achieve
- 48 varieties are live in the Spring 2026 collectionVerified
- Every variety keeps a margin of at least 35%
Before work starts
- Storefront connection can create productsChecked
- Supplier sheet is shared with the workspaceNot checked
The sheet owner has not answered yet.
- Tax rates exist for the NetherlandsBlocked
No tax rate is set for NL.
Find what sold and what suppliers can ship.
Price, describe, and publish the new varieties.
Someone else's plan
People who did not start the plan see who a task waits for, such as “Waiting for a review”. The link to the task stays, so they can open it.
Launch the spring bulb catalog
WaitingResearch what sold last spring, confirm supplier stock, then price, describe, and publish 48 varieties.
2 of 5 done · 2 waiting for input
Find what sold and what suppliers can ship.
Price, describe, and publish the new varieties.
Loading, error, and empty
Before a plan loads, show Skeletonlines. When it can't load, use a State Panel. A plan with no tasks says none were added yet.
Long content
Long titles, names, and links wrap. Labels stay at the end of the row.
Move supplier deliveries from the legacy accounting export into Supplier deliveries
WaitingEvery row from the 2026 Q3 export lands in the new table with its supplier, invoice, and delivery date.
1 of 2 done · 1 waiting for input
- Export https://files.example.com/workspaces/tulipfarm/exports/supplier-deliveries-2026-q3-final-v2.csvData import specialist for the legacy accounting migration · created for this planVerified
Accessibility
The outline is a section named by its title. Tasks are ordered lists named “Tasks” and “Group tasks”. Rows with details are buttons with aria-expanded; Enter and Space open them. Mark icons and the bar are hidden from screen readers; the label and progress text say the same.
Rows open in 180ms and chevrons turn in 120ms. With reduced motion they change at once and the spinner stops.
Theme tokens
Running uses --sprout-info, attention--sprout-warning, done --sprout-success, failed--sprout-danger, and pending, blocked, and cancelled--sprout-muted. Rows hover with --sprout-hover, lines use --sprout-line, and links--sprout-primary.