Operant Studio
OPER-9

decide: ticket taxonomy convention (module column + labels + projectId)

Body

## Context
Yesterday's ticket plan proposed a labeling scheme (`project:ledger`, `wave:1`, `epic:*`) and heavy use of `Task.projectId` + `Task.module`. Audit of prod OPER-1..8 shows:
- `module` column is empty across all existing tickets
- `projectId` is null across all OPER-* tickets (only "Reliability" exists, and it belongs to the portico team)
- `labels` are used freeform (`sweet-unblock`, `assignment`, `extraction`, `platform`, `docs`, etc.) — no `project:*` / `wave:*` / `epic:*` prefix in use
- Portico ticket taxonomy is its own thing (POR-* on portico team)

Without a decision, two conventions will run in parallel until one wins organically. This ticket is the decision.

## Acceptance Criteria
- [ ] Pick one convention for `Task.module` (populate always, populate only for platform work, or ignore)
- [ ] Pick one convention for `Task.labels` (freeform vs. `key:value` scheme)
- [ ] Pick one convention for `Task.projectId` (create Project rows per module, per initiative, or skip entirely)
- [ ] Document decision in `operant-studio/docs/ticket-taxonomy.md`
- [ ] Backfill OPER-1..8 to match decision (or explicitly grandfather them)

## Options
**A — freeform (current)**: keep labels loose, ignore `module`/`projectId`. Cheapest.
**B — module-only nudge**: populate `Task.module` on every new ticket (dispatcher, ledger, dashboard-task, etc.), keep labels freeform. One field, low overhead.
**C — full scheme**: `module` + `project:*` labels + create Project rows per module. Highest fidelity, highest maintenance.

## Files Touched
- operant-studio/docs/ticket-taxonomy.md (new)

## Dependencies
- blocks: any large-batch ticket filing

## Verification
None — decision ticket.

Attachments

Loading attachments…

Comments

Loading comments…