# tickets.toml — a container's agreed children. tickets.py reads it. # The order of the tables is the build order: move a table to reorder. `id` names a child for good and is never reused; it is not an order. # An epic's file holds [[entry]] tables. An initiative's holds [[epic]] tables; with no epics it holds [[entry]] tables. # Keys tickets.py does not know are ignored, so a team may add its own. # Status never lives here: an entry with no plan and no leaf file is planned; its plan beside it carries `status`, and on a tracker `tickets.py mirror` writes `tracker_status` in the leaf file. # ---- In an epic folder: one table per planned story, spike, or bug ---- [[entry]] id = 1 # the leaf file carries it as `id:`; refer to it as 1 here, as .1 from another epic type = "story" # story | spike | bug title = "Cart service scaffold" description = "Stands up the cart service with one add-item path through UI, API, and store." verify = "A shopper adds one item on the deployed site and sees it in the cart." covers = ["R1"] # ids from the epic's requirement source after = [] # real prerequisites only, never the sequence; empty means it can run beside anything above it. A bare number is a sibling's id; everything else is quoted hitl = true # a person runs the starter risk = "low" # low | medium | high # estimate = 2 # only when the user gives one; never proposed # unknown = "..." # a question to settle with the user before this entry starts, one sentence; `tickets.py next` lists the entry under blocked until it is removed # references = ["architecture-checkout/architecture-checkout.md#ad-8"] # what this entry needs beyond the epic's own References; pull writes them to the ticket # notes = ["..."] # the user's words only, never filled by the agent; pull writes them to the ticket's Notes # refine = true # refine to full acceptance criteria before it starts # plan_checkpoint = true # a person reviews the ticket, or the builder's plan, before work starts # done_checkpoint = true # work pauses after this ticket until a person says continue [[entry]] id = 2 type = "story" title = "Apply and refuse discount codes" description = "Adds code validation to the pricing call and shows the refusal reason." verify = "A valid code lowers the total; an expired one is refused with its reason." covers = ["R2", "R3"] after = [1, "1.3"] # a sibling's id; "." for an entry in another epic; "epic-" for that whole epic hitl = false risk = "medium" # ---- In an initiative folder: one table per epic; table order is the build order ---- [[epic]] id = 1 # entries in other epics refer to this epic's entries as 1. slug = "epic-pricing-rules" # the epic's folder name title = "Pricing rules" covers = ["P1", "P2"] [[epic]] id = 2 slug = "epic-cart-rules" title = "Shoppers manage their cart" covers = ["C1", "C2", "C3"] after = [{ epic = 1, needs = "the one-function pricing contract" }] # what this epic needs from which; the entries that wait on it carry the `after`