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

99 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
> 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.