Files
octopus-workflow/core/rules/ticket-lifecycle.md
T

99 lines
5.1 KiB
Markdown
Raw Normal View History

> Core 中立版(Increment 2 改写)。术语对照见 core/adapters/TERMINOLOGY.md;本组织实例表述见 dogfood 对应文件。
## Ticket Lifecycle — registry-first filing, claim-to-promote ([org-internal #3002] G1)
Bugs worth fixing start life as a **registry row**, not an independent ticket.
This extends the two-tier-artifacts philosophy to the ticket queue: a
"discovery" (no consumer yet, lifecycle undetermined) is Tier-1-shaped — a
cheap row in a ledger — and is **promoted** to a Tier-2 independent ticket
only when someone schedules or picks it up. (Filing one ticket per discovery
is how the 2026-08 backlog formed.)
### The registry (登记册)
- **Where**: a `## TD 登记` comment on the **source ticket** (the ticket whose
verify/review produced the candidates; a ticket-backend issue comment).
No source ticket (standalone iteration) → the owning Epic's tracker
ticket; no Epic either → the standing TD 冷存档 tracker ticket (G2's
fallback archive target).
- **Row format** (one line per item, checkbox-closeable):
```markdown
- [ ] TD-{NNN} · {type: UNVERIFIABLE|ACCEPTED_RISK|DEFERRED|INFO} ·
{severity: HIGH|MEDIUM|LOW} · {origin chunk-id/iter-N} — {one-line summary}
· trigger: {objectively verifiable reactivation condition}
```
- **TD-NNN** is allocated at REGISTRATION via the ledger mutex
[org-internal #3322]: the 配额账本脚本 (`td-alloc` 形态, `bash <alloc-script>
<count> <source-slug> [--ticket N]`) takes a contiguous range from the TD
allocation ledger (a standing tracker issue) — append-only `**td-alloc**`
comments, earliest-comment-id wins on collision. **ANY allocation — manual
included — must land a td-alloc comment on the ledger BEFORE the registry
row is written** (script, tool API, or web UI). Hand-computed `max + 1`
without a ledger comment is FORBIDDEN (parallel-session races,
[org-internal #3322]). The id is **reserved for life**: promotion reuses
it, never renumbers. Run the alloc script's `--check` (reconciliation)
when the last check predates this batch, and in retrospectives.
- **De-duplication** queries the TD index (same-source rows) plus open
promoted issues (cross-source); index matching replaces title-keyword
matching (keyword dedup once produced 18 fragments from one source).
- **Query-failure ruling ([org-internal #3383]: fail-open, visible)**: if the
dedup query itself errors (backend API failure — NOT "queried and found no
match"), retry once; on second failure file anyway, marking the comment
`dedup-unverified` for retro/reconciliation sweep. Fail-closed rejected:
known dedup failures are match failures it cannot prevent, and a backend
hiccup would block a verify PASS gate.
### Promotion (认领升票)
A row is promoted to an independent ticket when **scheduled or picked up**
(assigned, pulled into a wave/sprint, or chosen):
1. Create the ticket (ticket backend 立案) with the row's reserved `TD-NNN`
(full body per the verify skill's promotion template).
2. Tick the registry row (`- [x]`) and append `#NNNN` to it.
3. The new ticket's `## Parent` points back at the registry's source ticket.
Unpromoted rows are not second-class: the registry comment IS a visible
ticket-backend comment, rows close individually, and the TD index dedups
across sessions — the old per-item model's three guarantees at ~1 ticket per
source.
### PR 准入(pr-admissionTD-678
会话交付物 = 分支 + 报告;开 PR 属编排职权,按容量串行一次一张、双绿并入
再开下一张([org-internal #3864] 管合并出口、本节管 PR 入口)。交付推送前置
本地验证(`<test-cmd:changed>` + `<typecheck-cmd>` 绿;实例命令绑定见
core/adapters/TERMINOLOGY.md)。编排不可达可自开,PR 正文标
`uncoordinated`。细则与门控项:pipeline-gate 清单 PR 准入节。
### BF / FT family umbrellas
Baseline failures and flaky tests file **per root-cause family**, not per
occurrence: evidence (run, commit, failing output, failure rate) attaches as
comments on the family's **umbrella ticket** (ticket-backend issue), keyed by
failure signature (error signature + affected surface, not just
`file::test-name` — one root-cause family may span several tests; precedents
[org-internal #2585], [org-internal #2925]). Filing a new ticket when the
signature already matches an existing family (open or closed) is forbidden —
attach evidence instead. A family umbrella is closed when its signature no
longer reproduces.
### TTL semantics (feeds G2's issue-reaper)
- An **unpromoted registry row** stale for 30 days (no promotion, no
evidence comment) is reaper-eligible: 7-day notice, then archived into the
tracker's archive section.
- A **promoted ticket** follows the normal issue lifecycle (its own priority,
assignee, milestone).
### Compatibility (Iron Law preserved)
- `_(Deferred: TD-XXX <reason>)_` annotations keep their exact format; the
`TD-XXX` now resolves to a registry row (or promoted ticket) instead of an
issue number.
- Archive-at-close, `## 工件索引` guards, and issue-checklist-sync are
untouched: the registry comment is an ordinary ticket-backend comment, not
a Tier-2 artifact page.