name: describe-tickets description: Ticket system overview, schema, and workflows
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.