Plan Tasks

A plan's work is a set of tasks. Each task is one unit of work, in one repository, for one kind of executor, and Spektacular can report where they stand and implement them one at a time.

The task format

Tasks sit under a plan’s milestones, in its ## Milestones & Tasks section. Every task carries four structured lines under its heading.

What each line means

Id required

An opaque identifier issued by Spektacular with spektacular plan task-id. It is unique within the plan and never rewritten once written, so it stays the same when tasks are reordered, added or retitled.

Repo required

Exactly one registered repository name. Work that spans two repositories is two tasks.

Depends on required

Either none, or one - <id> — <title> line per task that must be finished first. Only the id is read; the title is there so a reader can tell which task it is. Every dependency must be a task in the same plan, and dependencies may not form a cycle. There is no implied ordering: tasks that can run in parallel simply do not depend on each other.

Execution required

agent, or human — <reason> with a non-empty reason.

Acceptance criteria checkboxes

- [ ] outcome statements, ticked by the implement workflow only when the criterion passed verification.

When a task needs a person

The planning agent decides each task’s executor against three criteria.

Task identifiers

Seeing where work stands: status

spektacular status reports a piece of work from the epic down to each task. It reads the documents when you ask, so it always reflects their current content, for draft and final plans alike.

Status fields

workflow object or null

The workflow in progress, when it works on one of the reported speks or plans: its kind (spec, plan or implement), name, current_step, completed_steps and updated_at. null otherwise.

requested string

The name you asked about. A caller that wants only that spek picks the entry in specs whose name, or whose plan’s name, matches it.

epic object or null

The epic’s name, document_status, created_at and sources, plus a roll-up that is worked out on every call and never written back: progress counts speks implemented of the total and tasks complete of the total across every plan, and done is true once every spek is implemented. null for a spek that is not in an epic.

specs array

Every spek in the epic, in the epic’s order, or the one spek when it is not in an epic.

specs[].state string

Where the spek stands, derived from its documents and never stored. The first that applies wins:

  • missing: the epic names the spek but it cannot be read. It is reported rather than failing, so one broken link does not hide the rest of the epic.
  • stale: the spek changed after its plan was written, under plan.strict_spec_changes.
  • specified: the spek is written and has no plan.
  • planned: a plan exists with none of its tasks complete.
  • in_progress: some of the plan’s tasks are complete.
  • implemented: every task of the plan is complete.

The readable tree shows in_progress as in progress. The implement workflow’s dependency check classifies speks the same way, so the two never disagree.

specs[].document_status string

The spek’s lifecycle status. Consumers decide from it whether the spek is ready to act on.

specs[].current_step string

The live step when a spec workflow is working on this spek; otherwise finished for a closed spek, stale for a stale one, and empty for one still open with no workflow running.

specs[].depends_on array

The speks in the same epic that this one depends on; [] when it has none.

specs[].blocked_by array

The dependencies that are not yet implemented. specs[].ready is true when this list is empty.

specs[].sources array

The material the spek was started from: its own sources, then its epic’s.

specs[].plan object or null

The spek’s plan, which shares its name: name, document_status, current_step, and for a plan with tasks, progress (tasks_completed of tasks_total) and tasks. A plan without task structure reports its lifecycle with progress and tasks absent. null when the spek has no plan.

specs[].plan.tasks array

Every task, in plan order. The tasks[] fields below describe each entry.

tasks[].id string

The task’s identifier.

tasks[].title string

The task’s heading text.

tasks[].milestone integer

The number of the milestone the task sits under.

tasks[].repo.name string

The repository’s registry name, linking back to the project’s configuration.

tasks[].repo.location string

The repository’s declared git source. Empty when none is declared; it is never read from a checkout’s git remotes.

tasks[].depends_on array

Ids of the tasks this one depends on; [] for none.

tasks[].execution.type string

agent or human.

tasks[].execution.reason string

Why a person must carry the task out; set for human tasks.

tasks[].completed boolean

Whether the task heading’s checkbox is ticked.

tasks[].acceptance_criteria object

How many of the task’s criteria are ticked: met of total. Completion and acceptance criteria are separate facts. A task can be completed with a criterion left unmet (an accepted deviation, for example), and the report keeps that visible rather than hiding it.

Implementing one task

Name a task when starting the implement workflow and the run builds that task alone.

Plans written before tasks

See where tasks fit

Tasks are authored in the Plan stage and carried out in the Implement stage. See the whole pipeline.