Backlog Ticket Numbering
backlog specs/backlog/numbering.kmd
Numeração de tickets no monorepo é sequencial por backlog no disco (`NNN-titulo.md`) e Jira-style prefixed (`<PREFIX>-NNN`) em referências cross-stack — commit messages, conversas, memórias, docs, outros tickets. Cada módulo com backlog declara seu prefix em `[backlog] prefix` no `koder.toml` e fica registrado em `meta/docs/stack/registries/ticket-prefixes.md`.
When this spec applies
All triggers
- Abrir, mover ou referenciar ticket cross-module
- Adicionar backlog a um módulo novo
- Reservar/registrar prefix para um módulo
- Auditar drift de referências `#NNN` casuais sem prefix
Specification body
Spec — Backlog Ticket Numbering
Overview
A Koder Stack usa um esquema híbrido de numeração de tickets:
| Layer | Forma | Onde |
|---|---|---|
| Disco (filename) | NNN-titulo-slug.md |
<module-or-project>/backlog/{pending,in-progress,done}/ |
| Referência cross-stack | <PREFIX>-NNN |
commit message, conversa, doc, memória, outros tickets |
A numeração NNN é sequencial dentro de cada backlog (não global).
O prefix é único por módulo e definido na koder.toml do módulo.
Por que prefix?
A Stack tem dezenas de backlogs (módulos + projetos cross-cutting). Numeração
puramente sequencial gera ambiguidade — #101 existe simultaneamente em
projects/koder-stack, engines/kodec, services/ai, engines/lang/lang,
infra/data/kdb e outros.
Alternativas avaliadas:
| Modelo | Veredicto |
|---|---|
| Per-backlog sequencial (sem prefix) | ambíguo cross-stack |
Globalmente único (#1234) |
rejeitado — race conditions, perde narrativa per-módulo |
Prefixed Jira-style (KSTACK-101, KTERM-42) |
escolhido — inequívoco, sem coordenação central, familiar |
| UUID / hash / date-based | rejeitados — inhumano ou verboso |
Razões da escolha:
- Inequívoco em commit messages, conversas, memórias
- Zero contador global → não cria hot file / race conditions
- Convenção familiar — todo dev reconhece
PROJ-NNN(Jira/Linear/Github project keys) - Filename no disco continua
NNN-titulo.md— só a referência muda
Schema de prefix
<PREFIX> ::= [A-Z][A-Z0-9_]{1,9}
- 2–10 caracteres
- Começa com letra maiúscula
- Só letras maiúsculas, dígitos, underscore
- Único cross-stack — colisão não permitida
Exemplos válidos: KSTACK, KTERM, KIT, KODEC, LANG, KDB, JET,
HUB, KODE, BOT, EYE, JET, K8S_OPS.
Exemplos inválidos: kterm (lowercase), K (curto demais), KODER-STACK
(hifen), KODERSTACKPLATFORM (longo demais).
Declaração no koder.toml
Cada módulo (ou projeto cross-cutting) com backlog declara seu prefix:
[backlog]
prefix = "KSTACK"
Sem essa seção, o módulo:
- Não tem backlog (válido — nem todo módulo precisa) — no audit, OK.
- Tem
<module>/backlog/mas não declarou prefix — drift advisory.
A declaração é fonte da verdade local. O registry global
(meta/docs/stack/registries/ticket-prefixes.md) é derivável dela.
Schema do filename
<module>/backlog/{pending,in-progress,done}/NNN-<title-slug>.md
NNN— 3 dígitos (zero-padded), sequencial dentro do backlog<title-slug>— kebab-case, ASCII- Extensão:
.md(default),.kmdperpolicies/document-format.kmd, ou.kdquando o ticket é tratado como source code do módulo (ex.:engines/lang/lang/backlog/done/043-selfhost-bootstrap-self-compile.kd)
Numeração não reusa: tickets em done/ mantêm seu número; o próximo
ticket pega max(existing) + 1 cruzando pending/, in-progress/, done/.
Schema de referência
Em commit messages, conversas, memórias, docs, outros tickets, a forma canônica é:
<PREFIX>-NNN
Exemplos:
KSTACK-101,KSTACK-104KTERM-42KODEC-23JET-7
Forma estendida (quando precisar desambiguar contra módulo com mesmo prefix em fork/clone — raro):
<scope>/<PREFIX>-NNN
Ex.: koder/KSTACK-104. Em uso normal dentro do monorepo, scope é
omitido.
Anti-patterns
#NNN casual sem prefix
Don't:
ver #101 pra contexto
Do:
ver KSTACK-101 pra contexto
Por quê: #101 é ambíguo — a leitura humana ou de IA precisa adivinhar
qual módulo. O audit numbering-audit.sh reporta drift sempre que
encontrar #\d+ em arquivos sob meta/, projects/*/backlog/,
**/backlog/ (excluindo commits históricos via git log, que são imutáveis).
Exceção: dentro do próprio ticket, referência ao próprio número (no título, no corpo "este #104") é OK — o contexto do filename já desambigua.
Reusar números de tickets em done/
Don't: numerar próximo ticket 046 se já existe 046-foo.md em
done/. Mesmo que o ticket original tenha sido cancelado, o número fica
queimado.
Do: sempre max(NNN across pending/+in-progress/+done/) + 1.
Renomear filenames retroativamente pra incluir prefix
Don't: renomear 101-stack-framework.md pra KSTACK-101-stack-framework.md.
Por quê: filename no disco é NNN-...; prefix é convenção de
referência, não de filename. Renomear quebra git blame/history sem
benefício — quem lê o path já sabe o módulo.
Ferramenta de criação — koder-ticket
A criação de tickets (especialmente em sessões paralelas que podem race
no mesmo NNN) é serializada via binário koder-ticket em
dev/koder-tools/:
koder-ticket new <module> "<title>" # cria NNN-<slug>.md atomicamente
koder-ticket list <module> # lista tickets + status
koder-ticket move <ID> <state> # KTERM-42 → in-progress / done
koder-ticket id <path> # filename → KTERM-42
koder-ticket path <ID> # KTERM-42 → filename
koder-ticket grep <text> # busca cross-stack
Ver dev/koder-tools/koder-ticket/README.md (a criar em Fase C de KSTACK-104).
Audit
numbering-audit.sh (sibling deste arquivo) percorre o monorepo procurando:
- Módulos com
<module>/backlog/mas sem[backlog] prefixemkoder.toml - Filenames de ticket que não casam
^\d{3}-[a-z0-9-]+\.md$ - Referências
#\d+casuais em arquivos sobmeta/,projects/*/backlog/,**/backlog/
Severity: advisory — reporta no /k-housekeep Fase 0.5, não bloqueia
commit. Drift em commits históricos é tolerado.
Migração retroativa
- Filenames no disco — não migrar; convenção é só pra referência
- Commit messages históricos — git log é imutável; aceita-se
#NNNambíguo em commits antigos - Refs em docs/specs/policies vivos — sweep one-shot na Fase D do KSTACK-104, registrado em git
- RFCs — não tocar; já têm naming próprio (
RFC-XXX)
Origem
KSTACK-104 (projects/koder-stack/backlog/in-progress/104-ticket-numbering-jira-style-migration.md).
Decisão arquitetural D23 ratificada na sessão de 2026-05-01 que entregou
KSTACK-101 (Stack Framework — UI Styles + Settings + Spec Audit).
References
policies/backlog.kmdregistries/ticket-prefixes.md