Ticket System
Purpose
Tickets provide a lightweight, file-backed way to capture ideas for future work within the Ushabti repository. They complement the phase-driven workflow by allowing agents and users to record ideas that are out-of-scope for the current phase without losing them.
Tickets are deliberately simple: create, derive a phase from, archive. No editing, no complex state transitions, no prioritization logic.
Directory Structure
.ushabti/tickets/ # Active tickets .ushabti/tickets/.archived/ # Completed tickets (invisible to agents)
Agents read tickets from .ushabti/tickets/ but ignore .ushabti/tickets/.archived/. Archived tickets are effectively invisible once moved.
Ticket YAML Schema
Each ticket is a YAML file with the following required fields:
id: T0001 # Sequential ticket ID (TNNNN format) title: Short description # Brief, descriptive title created: 2026-02-01 # ISO 8601 date (YYYY-MM-DD) priority: medium # Must be: low, medium, or high context: | Multi-line context explaining why this ticket exists. What observation or need led to its creation? proposed_work: | Multi-line description of what should be done. What would a phase derived from this ticket accomplish?
All fields are required. The priority field must be one of: low, medium, high.
Ticket Filename Format
Ticket files are named: TNNNN-short-description.yaml
- •
TNNNN: Zero-padded 4-digit sequential ID (T0001, T0002, etc.) - •
short-description: Lowercase, hyphenated slug derived from title - •Extension:
.yaml
Example: T0042-improve-error-messages.yaml
Workflows
Creating a Ticket
- •Determine next ticket ID (use
find-next-ticket-numberskill) - •Create YAML file with all required fields
- •Validate schema (all fields present, priority is valid)
- •Write file to
.ushabti/tickets/TNNNN-slug.yaml
Deriving a Phase from a Ticket
When a ticket is ready to become a phase:
- •Scribe reads the ticket YAML from
.ushabti/tickets/ - •Scribe uses
contextandproposed_workto inform phase planning - •Scribe adds
ticket: TNNNNmetadata to the phase.md file - •The ticket remains in
.ushabti/tickets/until the phase completes
Archiving a Ticket
When a ticket-derived phase completes:
- •Overseer reads the
ticketfield from phase.md - •Overseer moves the ticket file from
.ushabti/tickets/to.ushabti/tickets/.archived/ - •Overseer logs the archival action in review findings
- •The archived ticket is now invisible to agents
Agent Responsibilities
Vizier (Advisory)
- •Can read active tickets from
.ushabti/tickets/ - •Ignores archived tickets in
.ushabti/tickets/.archived/ - •May offer to create tickets when good ideas for future work arise during conversation
- •Should offer ticket creation sparingly, only for genuine future work
Scribe (Planning)
- •Reads tickets when user requests a phase derived from a ticket
- •Uses ticket
contextandproposed_workto inform phase intent and scope - •Adds
ticket: TNNNNmetadata to phase.md when deriving from a ticket
Overseer (Review)
- •Checks phase.md for
ticketfield when completing a phase - •Archives the corresponding ticket by moving it to
.ushabti/tickets/.archived/ - •Logs archival action in review findings
Builder, Lawgiver, Artisan, Surveyor
- •No specific ticket responsibilities
- •May create tickets if they observe out-of-scope work during their duties
Design Principles
- •Simple lifecycle: Create → derive phase → archive. No intermediate states.
- •File-backed: Everything lives in the repository, no external dependencies.
- •Agent-friendly: Clear schema, clear locations, clear workflows.
- •Complementary: Tickets support phases, they don't replace planning or become a backlog management tool.
- •Invisible when done: Archived tickets are moved out of the active directory and ignored by agents.