Expand description
The devtask module: an issue and a milestone read as executable development scopes.
§Why this is a module and not two more plan.* capabilities
Every capability is composed into exactly one Rust module, and a module’s id is the
namespace of everything in it, so plan.task would have to live inside
builtin/plan.rs. It does not belong there: plan is the projection of
crate::plan, which is held to byte equality with lib/project.awk by
test/cases/99_plan_capabilities.sh, and a capability that joins the plan to git and to
the session records has no counterpart in the awk to be equal to. Keeping them apart
keeps that equality checkable.
What it must not be is a second project model, and it is not:
- the records are the canonical ones, read through the index like every other object;
- the status, wave, dependents, edges and findings are
crate::plan’s, unchanged —the_status_never_disagrees_with_the_planis the assertion; - the branches and commits are
worktree::trace’s, through the sameTracertrace.issueuses; - the readiness vocabulary is a projection of the canonical statuses and refines three
of them without replacing any —
crate::devtask::readinessstates which and why; - the external projection stays
scripts/github-sync’s. Nothing here writes, and nothing here restates its reconciliation vocabulary.
§Why the milestone graph does not touch git
devtask.milestone is a pure function of the index, and deliberately: a graph whose
ordering depended on git for-each-ref would be a graph that differs between a full
clone and a shallow one, and this repository has already been bitten by a derivation
that was machine-dependent. devtask.issue consults git because a single issue’s
branches are the question being asked; the graph does not, because they are not.
Structs§
- DevMilestone
Input - Which milestone to read as a dependency graph.
- DevTask
Input - Which issue to read as a development task.
Functions§
- module
- The
devtaskmodule: the canonical development task, composed from derivations that already exist.