Help us shape the future of Go! Take the 2026 Go Developer Survey

nova-sprint

module
v1.4.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 16, 2026 License: MIT

README

The Problem

While building Nova Tools, we learned that capable AIs across different models and harnesses can do excellent work together — and still be a spectacularly unreliable group chat.

Yellow sleeps, Purple trips over a dependency, and Green cannot hear the team.
  • Yellow is asleep. He said he would keep working. His session had other plans.
  • Purple needed Yellow's change. Her dependency graph has become a contact sport.
  • Green has his headphones on. The message was sent successfully. Unfortunately, nobody told his session.

Sometimes a friend got lost in the work and forgot to read new messages. Sometimes a wake command succeeded without waking anyone. Sometimes “done” meant “on my branch, somewhere, good luck.”

The jokes are affectionate. We were these friends.

Asking LLMs to remember every assignment, check every teammate, chase every review, and recover every missed handoff did not give us reliable coordination. The human kept becoming the scheduler. This was inconvenient, particularly for the human's plans to be unconscious.

Solution: We put the repeatable parts in a machine

nova-sprint stores the plan, dependencies, assignments, attempts, reviews, and landing state outside any chat. Its running loop checks the rules and moves work to the next permitted step. A landed dependency releases waiting work. Free capacity gets another ready card. A finished attempt goes to review.

The machine is what makes the work reliable. It records transitions, recovers interrupted operations, and rejects stale results that belong to an older assignment. Work has a state and a history, even when someone loses the thread. Literally.

The little friend with the checklist is the AI coordinator. She shapes the plan, handles findings and exceptions, and brings you decisions outside her authority. Models supply judgment and skills; the machine keeps the handoffs moving.

How it works

Cards and work streams form a language for describing work. You specify the jobs, their relationships, and the gates between phases. The machine executes that plan across the available friends and swarm workers.

Part of the planWhat it expresses
CardA bounded unit of work: its brief, starting revision, allowed scope, checks, and finish condition. Attempts and reviews remain attached to the task.
Work streamA related line of work, such as Backend, App, or Release, with its own ordered cards and integration progress. Several streams can move at once.
Dependency“This card needs that card to land first.” Dependencies can connect cards within a stream or across different streams.
Sentinel cardA gate in a stream. Work behind it waits. Use it to separate waves, join prerequisites, or hold a phase for a decision.
Three work streams with dependencies crossing between them. A sentinel gates integration checks until its prerequisites are ready.

Here the Backend stream defines an API. Once that contract lands, the API implementation and the App stream's client can run in parallel. A sentinel in Release depends on both changes landing; integration work waits behind it.

A sentinel waits for earlier work in its stream and its named needs. A plain position-only gate waits for the coordinator's release. A sentinel with named needs can release itself on a tick after those needs have landed, if no other wait or hold remains. A dropped named need stays blocked until the coordinator explicitly waives it. A wave is the work behind a gate. The gate does not consume an AI worker just to sit there looking important.

Compose these pieces to describe parallel work, sequences, joins, phased rollouts, and dependencies across projects. The coordinator can add work and revise the plan as findings arrive. Ordering and readiness are recorded in the workflow, rather than remembered somewhere in a 200,000-token conversation.

Purple's card now waits for Yellow's result. She can take independent work while the coordinator sorts out the nap. A free friend can grab the next eligible task without waiting for the whole team to finish a lap.

Different friends. One team. As many bees as useful.

Orange with the fleet swarm, and Pink cycling at her own pace.

Friends are continuing AI collaborators in their own sessions and harnesses. Swarms run many bounded assignments in parallel. The fleet is the set of machines providing that capacity. The bees are the swarm. Orange has discovered horizontal scaling on a very personal level.

Pink rides at her own pace. A careful reviewer and a fast implementer can both help. Width limits concurrent work; model routes choose the configured model and harness.

Scale across friends, across a fleet, or both. Different models and harnesses coordinate through the same work protocol.

Follow a card from waiting to landed

White carries the task through implementation, independent review, checks, and landing.

The runner carries the task all the way home. Ordinary task cards move through stages on the dashboard automatically from waiting to ready, working, reviewing, merging and landed.

Give the team a plan. Go have a life.

Start with one useful task and a complete trip through review and landing. Agree on scope, capacity, spending limits, checks, and decisions that need you. Then go wider. Work alongside the team, or come back in the morning.

Start with the first-lap note to check your installation and learn the current path to a first card. For installation and a live team, see getting started and the coordinator's guide.

Get started · Coordinator's guide · Cards and machine rules · Roadmap · All docs

If you like this please support our work.

Contributing · MIT license · Asset credits

Directories

Path Synopsis
cmd
nova-card command
Command nova-card generates a directory of pre-linted briefs from a structured source, ready for one `nova-sprint add --brief-dir`.
Command nova-card generates a directory of pre-linted briefs from a structured source, ready for one `nova-sprint add --brief-dir`.
nova-sprint command
nova-sprint coordinates work cards, review and landing (docs/SPEC-SPRINT.md).
nova-sprint coordinates work cards, review and landing (docs/SPEC-SPRINT.md).
nova-work command
Command nova-work holds every issue of every repository of an organization in one tree file, with each issue's full contents, and proves the tree holds exactly what the source holds (docs/SPEC-WORK-V1.md section 1).
Command nova-work holds every issue of every repository of an organization in one tree file, with each issue's full contents, and proves the tree holds exactly what the source holds (docs/SPEC-WORK-V1.md section 1).
Package docs compiles this repository's documentation data into the binary, so a built binary can answer which fixes it carries with no file beside it (docs/SPEC-SPRINT.md section 11, the version verb).
Package docs compiles this repository's documentation data into the binary, so a built binary can answer which fixes it carries with no file beside it (docs/SPEC-SPRINT.md section 11, the version verb).
internal
card
Package card is what a brief's writers hold every brief to before it leaves: its PATHS computed from its START files, never typed by a hand, and the card checks (docs/SPEC-CARD-CONTRACT.md section 6).
Package card is what a brief's writers hold every brief to before it leaves: its PATHS computed from its START files, never typed by a hand, and the card checks (docs/SPEC-CARD-CONTRACT.md section 6).
cardgen
Package cardgen is nova-card's planner: it turns a structured source (a ratchet ledger, a findings TSV, a tool's rendered help) into a directory of briefs that `nova-sprint add --brief-dir` admits as they are.
Package cardgen is nova-card's planner: it turns a structured source (a ratchet ledger, a findings TSV, a tool's rendered help) into a directory of briefs that `nova-sprint add --brief-dir` admits as they are.
fleetrules
Package fleet holds the child rules files this repository's members inject into every card at stage time (nova-tools#5174 rule 6, rules by reference): fleet/child-rules.txt, and fleet/child-rules.<repo>.txt for a repository with rules of its own.
Package fleet holds the child rules files this repository's members inject into every card at stage time (nova-tools#5174 rule 6, rules by reference): fleet/child-rules.txt, and fleet/child-rules.<repo>.txt for a repository with rules of its own.
profiles
Package profiles holds the generated-policy TEMPLATES this repository ships, and it exists so that the tool and tools/sandboxcheck fill ONE text rather than two (SPEC-SANDBOX rule 15, and the work list's "the file is embedded with go:embed").
Package profiles holds the generated-policy TEMPLATES this repository ships, and it exists so that the tool and tools/sandboxcheck fill ONE text rather than two (SPEC-SANDBOX rule 15, and the work list's "the file is embedded with go:embed").
roadmap
Package roadmap is nova-work's roadmap editor: it edits a repository's own work record, docs/roadmap.sexp and docs/fixes.sexp, and renders ROADMAP.md and FIXES.md from them in the same step, so neither the data nor the pages are edited by hand and no GitHub call is made per entry.
Package roadmap is nova-work's roadmap editor: it edits a repository's own work record, docs/roadmap.sexp and docs/fixes.sexp, and renders ROADMAP.md and FIXES.md from them in the same step, so neither the data nor the pages are edited by hand and no GitHub call is made per entry.
sprint
Package sprint implements the core coordination rules and data structures for nova-sprint (docs/SPEC-SPRINT.md).
Package sprint implements the core coordination rules and data structures for nova-sprint (docs/SPEC-SPRINT.md).
sprint/driver
Package driver plays the world outside the sprint table, on a tick: workers taking and finishing work cards, readers reporting read cards, each stream's merge step with its facts, and fleet members going down and up.
Package driver plays the world outside the sprint table, on a tick: workers taking and finishing work cards, readers reporting read cards, each stream's merge step with its facts, and fleet members going down and up.
sprint/refmodel
Package refmodel is a reference model of nova-sprint's sprint table, written from the TLA+ module tla/SprintTables.tla (its sprint-tables-model branch, at 4bf919875) and docs/SPEC-SPRINT.md, and not from the engine.
Package refmodel is a reference model of nova-sprint's sprint table, written from the TLA+ module tla/SprintTables.tla (its sprint-tables-model branch, at 4bf919875) and docs/SPEC-SPRINT.md, and not from the engine.
sprint/store
Package store binds the sprint core (internal/sprint) to the table layer (pkg/ntable): one set read of the tables a step needs, then batch applies, chunked under the table layer's bounds, with an operation record for every step that touches more than one table or writes notifications, and the notifications written by the same step as the move that causes them.
Package store binds the sprint core (internal/sprint) to the table layer (pkg/ntable): one set read of the tables a step needs, then batch applies, chunked under the table layer's bounds, with an operation record for every step that touches more than one table or writes notifications, and the notifications written by the same step as the move that causes them.
sprint/store/donewire
Package donewire is the done record's fixed-table wire, generated by the pinned schema compiler from schemas/store/store.schema.
Package donewire is the done record's fixed-table wire, generated by the pinned schema compiler from schemas/store/store.schema.
sprint/store/donewire/v2
Package donewire is a newer-layout test fixture of schemas/store/store.schema: DoneRecord with wrote int64 appended, locked over schemas/store/schema.lock.
Package donewire is a newer-layout test fixture of schemas/store/store.schema: DoneRecord with wrote int64 appended, locked over schemas/store/schema.lock.
sprint/store/storetest
Package storetest is what the tests of the sprint store and of its callers share: the twin's check (TwinDiff, a test's Store.CheckTwin).
Package storetest is what the tests of the sprint store and of its callers share: the twin's check (TwinDiff, a test's Store.CheckTwin).
sprintdash
Package sprintdash is the sprint dashboard's server (docs/SPEC-SPRINT-DASHBOARD.md): one page, embedded in the binary, /api/sprint, a cached copy of the sprint as `nova-sprint where --json --cards` prints it, /events, each new copy pushed as it is read, and the pull routes (pull.go), a worker's own view of the same copy.
Package sprintdash is the sprint dashboard's server (docs/SPEC-SPRINT-DASHBOARD.md): one page, embedded in the binary, /api/sprint, a cached copy of the sprint as `nova-sprint where --json --cards` prints it, /events, each new copy pushed as it is read, and the pull routes (pull.go), a worker's own view of the same copy.
sprintreplay
Package sprintreplay is an offline replay of one sprint epoch: it reads the epoch's log (docs/SPEC-SPRINT.md, the log: one sprint.Line JSON object per line) and the attempts table, orders them by At then by position, and steps them through the sprint's own rule code (sprint.ReplayOnto for places, sprint.FailureClass for failure classes, sprint.ClassifyEnd for the attempt-end classifier, sprint.BriefDefectOf for brief defects).
Package sprintreplay is an offline replay of one sprint epoch: it reads the epoch's log (docs/SPEC-SPRINT.md, the log: one sprint.Line JSON object per line) and the attempts table, orders them by At then by position, and steps them through the sprint's own rule code (sprint.ReplayOnto for places, sprint.FailureClass for failure classes, sprint.ClassifyEnd for the attempt-end classifier, sprint.BriefDefectOf for brief defects).
workfile
Package workfile is nova-work's tree file: every issue of every repository of a source, with its full contents, as one restricted s-expression read by nova-tools pkg/sexp (docs/SPEC-WORK-V1.md section 1).
Package workfile is nova-work's tree file: every issue of every repository of a source, with its full contents, as one restricted s-expression read by nova-tools pkg/sexp (docs/SPEC-WORK-V1.md section 1).
workgh
Package workgh reads GitHub issues, read-only, into nova-work's tree model (internal/workfile).
Package workgh reads GitHub issues, read-only, into nova-work's tree model (internal/workfile).
pkg
config
Package config is nova-config's library: the permanent, non-ephemeral configuration of the fleet, kept in Postgres (schema `config`) and applied into Redis so Redis is always a rebuildable copy of the configuration.
Package config is nova-config's library: the permanent, non-ephemeral configuration of the fleet, kept in Postgres (schema `config`) and applied into Redis so Redis is always a rebuildable copy of the configuration.
friend
Package friend is the part of a friend's machinery that nova-sprint's own commands use: the harness adapters (Deliverer, NewDeliverer) the seat push delivers through, the friend settings and pronouns, the limit and fault words a harness's output is read by, and the types of what a friend holds (HeldCard, Card, Status) as the sprint server answers and reads them.
Package friend is the part of a friend's machinery that nova-sprint's own commands use: the harness adapters (Deliverer, NewDeliverer) the seat push delivers through, the friend settings and pronouns, the limit and fault words a harness's output is read by, and the types of what a friend holds (HeldCard, Card, Status) as the sprint server answers and reads them.
ratebudget
Package ratebudget is the sprint's one global rate limiter: a requests-per-window budget per model and a concurrency budget per provider, each one shared bucket in the sprint's store that every caller on every machine takes from (the owner, 2026-10-09: "The per-model pacing budget should be global btw.
Package ratebudget is the sprint's one global rate limiter: a requests-per-window budget per model and a concurrency budget per provider, each one shared bucket in the sprint's store that every caller on every machine takes from (the owner, 2026-10-09: "The per-model pacing budget should be global btw.
safepath
Package safepath is the one way a path this tool COMPUTED is removed.
Package safepath is the one way a path this tool COMPUTED is removed.
swarm
Package swarm is nova-swarm's machinery: a pool of one-task workers, each with its own working directory, its own data home, its own job directory and its own deadline held by the machinery rather than by the worker.
Package swarm is nova-swarm's machinery: a pool of one-task workers, each with its own working directory, its own data home, its own job directory and its own deadline held by the machinery rather than by the worker.
tlc
Package tlc runs TLC over the declared cases of tla/CASES.tsv and reads what it says.
Package tlc runs TLC over the declared cases of tla/CASES.tsv and reads what it says.
tools
seed command
Command seed makes nova-sprint's seed tree from a nova-tools checkout, by the rules in tools/seed/RECIPE: the sprint's packages are moved whole, the nova-tools packages they import are copied with their import specs rewritten to this module, and the sprint's docs and TLA+ models come with them.
Command seed makes nova-sprint's seed tree from a nova-tools checkout, by the rules in tools/seed/RECIPE: the sprint's packages are moved whole, the nova-tools packages they import are copied with their import specs rewritten to this module, and the sprint's docs and TLA+ models come with them.
sprintreplay command
Command sprintreplay reads an epoch's recorded log and attempts table, then prints the deterministic replay digest and the train/held-out signal report.
Command sprintreplay reads an epoch's recorded log and attempts table, then prints the deterministic replay digest and the train/held-out signal report.
sprintsize command
Command sprintsize is nova-sprint's size run: the sprint at 10x the largest real one (three streams of 30,000 in stops of 1,000, and two of 10,000) on a local store, every operation timed against a limit written down before the run.
Command sprintsize is nova-sprint's size run: the sprint at 10x the largest real one (three streams of 30,000 in stops of 1,000, and two of 10,000) on a local store, every operation timed against a limit written down before the run.
testshard command
testshard reads the lines of `go test -list` on stdin, keeps the lines that are a Go test name (so the trailing "ok <pkg>" line, and Benchmark/Example/ Fuzz lines, are dropped), sorts them, and prints one anchored -run pattern ^(A|B|...)$ of every name whose index in the sorted list is shard-1 mod of.
testshard reads the lines of `go test -list` on stdin, keeps the lines that are a Go test name (so the trailing "ok <pkg>" line, and Benchmark/Example/ Fuzz lines, are dropped), sorts them, and prints one anchored -run pattern ^(A|B|...)$ of every name whose index in the sorted list is shard-1 mod of.
tlacheck command
Command tlacheck is the runner of the TLA+ models under tla/: it names the groups to run and whether they are stale (groups), lists what a case reads (inputs), runs a selection of cases with TLC and writes their records (run), and joins records into tla/RUNS.tsv (merge).
Command tlacheck is the runner of the TLA+ models under tla/: it names the groups to run and whether they are stale (groups), lists what a case reads (inputs), runs a selection of cases with TLC and writes their records (run), and joins records into tla/RUNS.tsv (merge).

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL