skills/ticket-pack-builder/SKILL.md
Create a repo-local ticket system with an index, machine-readable manifest, board, and individual ticket files. Use when a repo needs task decomposition that autonomous agents can follow without re-planning the whole project each session.
npx skillsauth add chelch5/scafforge ticket-pack-builderInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use this skill to create or refine the repo-local work queue. Use ../../references/competence-contract.md as the backlog-quality bar: a ticket is not good enough if its acceptance leaves the operator trapped between scope boundaries and a literal failing closeout command.
scaffold-kickoff during greenfield scaffolding, use bootstrap.refine.remediation-follow-up.tickets/manifest.json does not exist yet, use bootstrap.refine unless the request is explicitly about post-audit or post-repair follow-up, in which case use remediation-follow-up.Read:
docs/spec/CANONICAL-BRIEF.md.opencode/skills/.opencode/agents/.opencode/commands/.opencode/state/workflow-state.jsonIdentify:
Organize tickets into waves based on dependency order:
Core-wave discipline:
For each piece of work, create a ticket with these fields:
id — unique identifier (e.g., SETUP-001, CORE-001, FEAT-001)title — short descriptive titlewave — which execution wave this belongs tolane — which project area or ownership lane this belongs toparallel_safe — whether this ticket can be advanced in parallel with other tickets when dependencies are satisfiedoverlap_risk — low, medium, or high expected overlap with other ticketsstage — planning (all new tickets start here)status — todo or blocked for new tickets; later lifecycle-aligned queue values are derived by ticket_updateresolution_state — open for new tickets, later done, reopened, or supersededverification_state — trusted only after current proof exists; initialize new tickets as suspectdepends_on — list of ticket IDs this depends onsource_ticket_id — source ticket when this is a follow-up or remediation ticket, otherwise nullfollow_up_ticket_ids — linked downstream remediation or expansion tickets, initially emptysource_mode — process_verification, post_completion_issue, net_new_scope, or split_scope when the ticket was created from later diagnosis, reverification work, or open-parent decomposition; omit for greenfield bootstrap ticketssplit_kind — required when source_mode is split_scope; use sequential_dependent when the child must not run until the parent-owned work is complete, or parallel_independent when the child can truly advance independently; default to sequential_dependent unless project evidence proves the child has no dependency on the parent's open workEXEC-REMED-001 follow-up tickets that repair missing runnable review evidence on an open parent ticket, treat the child as parallel_independent: the parent stays open, but the evidence-repair child is the foreground work and must not deadlock behind the parent it is meant to unblockfinding_source — original audit, review, QA, or smoke finding code when this ticket exists to remediate a validated issuesummary — one-paragraph description of what needs to be doneacceptance — list of specific acceptance criteria tied to finalized repo-local commands, checks, or observable workflow surfaces; these must be scope-isolated to the ticket's own workartifacts — empty list (populated during execution)decision_blockers — list of unresolved decisions that block this ticket (empty if none)parallel_safe: true only when the ticket has no unresolved dependency on another unfinished ticket and the expected overlap risk is lowoverlap_risk to make concurrency judgment explicit instead of assuming it from lane namesparallel_safe: false when the ownership boundary is uncleartickets/manifest.json canonical at ticket granularity even when an adjacent orchestration service later batches several tickets into one downstream phase.tickets/manifest.json and .opencode/state/workflow-state.json.Wave 0 must always include one bootstrap/setup ticket that covers:
Treat that ticket as the default first active ticket unless the canonical brief proves a different setup sequence is required.
If the canonical brief or bootstrap provenance declares a Tier 1 release target, create dedicated tickets for the target-completion path instead of burying that work inside generic polish.
For Godot Android repos, always create:
ANDROID-001 in lane android-exportSIGNING-001 in lane signing-prerequisites (only when the brief requires packaged delivery; see Product Finish Contract below)RELEASE-001 in lane release-readinessANDROID-001 acceptance must cover:
export_presets.cfg exists with an Android presetandroid/ support surfaces exist and are non-placeholderSIGNING-001 acceptance must cover (when packaged delivery is required):
RELEASE-001 acceptance must cover:
godot --headless --path . --export-debug "Android Debug" build/android/<project-slug>-debug.apk or the exact resolved Godot-binary equivalent succeeds (runnable proof)build/android/<project-slug>-debug.apkunzip -l confirms Android manifest plus compiled classes or resources contentSIGNING-001 is closedRELEASE-001 must declare depends_on edges to two kinds of prerequisites:
SIGNING-001 when the brief requires packaged delivery. In debug-only mode, omit SIGNING-001.android-export, signing-prerequisites, release-readiness) and not in process lanes (remediation, reverification). When the backlog has no such tickets, note the gap as a decision blocker on RELEASE-001.source_ticket_id records split-scope lineage for provenance only. It is not a depends_on target. The workflow engine forbids a split-scope child from blocking on its source_ticket_id (deadlock rule). RELEASE-001's source_ticket_id is ANDROID-001 or SIGNING-001; neither must appear in depends_on.
Do not let a generic POLISH-001, UX, or validation ticket stand in for Android export or release proof ownership.
If the canonical brief describes a product whose user-facing surfaces depend on a real backend or provider path, seed explicit tickets for that integration before the release lane.
Examples include:
For these repos:
Do not author tickets that say or imply:
If the real behavior truly belongs later, rename the current ticket to the narrower scaffold-only scope and create the later behavior ticket immediately in the backlog.
If the canonical brief includes a Product Finish Contract (section 13) that forbids placeholder output in the final product, create explicit finish-ownership tickets instead of burying finish work in a generic polish bucket.
Finish work must be split into owned tickets that cover:
blocked or decision ticket)Do not create one generic FINISH-001 or POLISH-001 ticket for all content work. The backlog must be specific enough for an agent to determine what constitutes completion for each owned area.
When the finish contract explicitly allows placeholder output in the shipped product (for example placeholder_policy: placeholder_ok), do not invent finish-ownership tickets for those content areas.
Leaving finish work as unwritten commentary outside the canonical backlog is not permitted when the Product Finish Contract records a non-placeholder finish bar.
blocked tickets with decision_blockers listing what needs to be decideddecision tickets for choices the team needs to make (e.g., "Choose database engine")discovery tickets for research that needs to happen before implementationBefore writing any ticket files, verify that the ticket backlog covers every feature area in the canonical brief:
feature → ticket_idThis check prevents the greenfield run from emitting a backlog that silently omits whole spec areas. A backlog that reaches this step with uncovered spec features must add tickets — it cannot proceed to manifest writing until coverage is complete.
For each ticket, write a markdown file to tickets/<id>.md using the template in tickets/templates/TICKET.template.md.
Write tickets/manifest.json with the structure defined in references/ticket-system.md:
version: 3project: project name from canonical briefactive_ticket: first ticket in wave 0tickets: array of all ticket objects.opencode/lib/workflow.tsWrite tickets/BOARD.md as a human-readable view of the backlog organized by wave, showing:
Ensure .opencode/state/workflow-state.json reflects the first active ticket:
{
"active_ticket": "<first-ticket-id>",
"stage": "planning",
"status": "todo",
"approved_plan": false,
"ticket_state": {
"<first-ticket-id>": {
"approved_plan": false,
"reopen_count": 0,
"needs_reverification": false
}
},
"process_version": 7,
"process_last_changed_at": null,
"process_last_change_summary": null,
"pending_process_verification": false,
"parallel_mode": "sequential",
"bootstrap": {
"status": "missing",
"last_verified_at": null,
"environment_fingerprint": null,
"proof_artifact": null
},
"lane_leases": [],
"state_revision": 0
}
Before leaving this skill, confirm all of these are true:
tickets/manifest.json exists, uses version: 3, and every ticket record matches the runtime ticket contracttickets/BOARD.md exists and is clearly derived from the manifest instead of carrying extra machine statetickets/<id>.md file exists for the manifest entries created or changed in this run.opencode/state/workflow-state.json names the foreground ticket from the manifest and seeds bootstrap.status: "missing" on fresh scaffolds until bootstrap proof existssource_ticket_id, follow_up_ticket_ids, and source_mode linkage when the work came from diagnosis, repair, or reverification evidencefinding_source so downstream review, QA, and closeout can rerun the original failing checkUse when expanding or normalizing an existing backlog:
Use when audit, diagnosis, review, or repair work already produced concrete findings and the repo needs canonical follow-up tickets.
Public follow-up command when a diagnosis pack already contains ticket recommendations:
python3 skills/ticket-pack-builder/scripts/apply_remediation_follow_up.py <repo-root> --diagnosis <diagnosis-dir-or-manifest>
Collect the current source of truth for the follow-up:
diagnosis/<timestamp>/ when working from scafforge-auditscafforge-repairreview, qa, smoke-test, or backlog-verification artifacts when working inside a generated repoDo not infer remediation work from vague commentary when canonical evidence already exists.
For each finding:
For every remediation or reverification ticket:
source_ticket_id when the work came from a prior ticketfollow_up_ticket_idsfinding_source when the follow-up exists to remediate a validated audit, review, QA, or smoke-test findingverification_state: suspect until current evidence proves the issue resolvedWhen the generated repo exposes guarded ticket tooling:
ticket_create flow instead of raw manifest edits when the workflow contract requires itWhen operating at package level without the generated tooling available, emit the canonical ticket payload and update the generated ticket surfaces in the same contract shape the repo expects.
After applying the follow-up:
tickets/manifest.jsontickets/BOARD.md.opencode/state/workflow-state.jsonWhen scafforge-repair required ticket-pack-builder as a repair follow-on stage, read .opencode/meta/repair-follow-on-state.json and, after the ticket follow-up work is actually complete, write:
.opencode/state/artifacts/history/repair/ticket-pack-builder-completion.mdUse this minimal shape so the public repair runner can auto-recognize completion for the current repair cycle on the next run:
# Repair Follow-On Completion
- completed_stage: ticket-pack-builder
- cycle_id: <cycle_id from .opencode/meta/repair-follow-on-state.json>
- completed_by: ticket-pack-builder
## Summary
- Created or updated the canonical repair follow-up tickets required by the current repair cycle.
Do not write this artifact speculatively. Only emit it once the remediation-follow-up ticket work is actually complete for the current cycle.
Continue to ../handoff-brief/SKILL.md as directed by scaffold-kickoff.
todo, ready, plan_review, in_progress, blocked, review, qa, smoke_test, doneplan_review and smoke_test as workflow-tool-owned queue values, not as free-form authoring choicessmoke_test tool rather than generic PASS prosesmoke_test can treat that command as the canonical smoke scope instead of improvising a heuristic subset or full-suite fallbackwave, lane, parallel_safe, and overlap_risk aligned with real execution boundariesstatus stays queue-oriented, while resolution_state and verification_state represent historical closure and present trustreferences/ticket-system.md for the contractassets/templates/TICKET.template.md for the package-side canonical ticket template; it must stay identical to the generated tickets/templates/TICKET.template.md surfacetesting
Use when validating Android feature flows in an emulator with adb-driven launch, input, UI-tree inspection, screenshots, and logcat capture.
development
Best practices for Remotion - Video creation in React
development
Set browser-game architecture before implementation. Use when the user needs engine choice, simulation and render boundaries, input model, asset organization, or save/debug/performance strategy.
development
Prepare and optimize browser-game 3D assets. Use when the user asks for GLB or glTF shipping work, including Blender cleanup and export, collision or LOD setup, compression, texture packaging, and runtime validation.