Files
octopus-workflow/core/rules/issue-checklist-sync.md
T

160 lines
10 KiB
Markdown
Raw Normal View History

> Core 中立版(Increment 4 改写)。术语对照见 core/adapters/TERMINOLOGY.md;本组织实例表述见 dogfood 对应文件。
## Issue Checklist Sync (mandatory, progressive)
The source issue's checklist is the **stakeholder-facing progress tracker**.
It MUST be kept in sync with actual work state at every pipeline milestone —
not just at close time. Stakeholders should be able to open the issue at any
point and see exactly what is done, in progress, and deferred.
### Sync points (progressive)
| When | Who | What |
|------|-----|------|
| After the DAG artifact is frozen (`review-dag` PASS + freeze confirmation per `analyze-dag/SKILL.md` §Output & Lifecycle step 2, [org-internal #3379]) | Aggregator agent | Convert the source Epic's draft acceptance criteria into a formal checklist; annotate requirement-covered items `_(DAG frozen: {epic-slug}/dag v1)_` |
| After each iteration commit (`implement` Phase 4.5) | Developer | Check off items delivered by this iteration |
| After a PR is created | Developer | Append a `## 当前状态` live-status section (or update it) with PR number + mergeable; in an Epic task list, append the PR reference to the corresponding row |
| After code review converges (`review-code` PASS, Phase E) | Orchestrator | Check off review-related items; annotate `_(reviewed: round N PASS)_`; update the `## 当前状态` review row; label the PR `ready-to-merge` — keep-mergeable automation takes over (hand-written keep-mergeable commits are retired) |
| On CI key state transitions (first green / failure / cumulative goal reached) | Verifier or Developer | Update the process-type AC (e.g. "N consecutive green runs") progress note in the issue; record the run number |
| At `verify` Phase 5.6 (final sweep before PASS) / issue close | Closing agent (Verifier on the primary path; otherwise the last role that closes the issue) | Final sweep — every remaining item gets annotated; **archive-at-close**: fold `## 当前状态`, then mark the `## 工件索引` comment archived per the artifact-index-guards rule guard #3 (see「归档动作」below) |
> Historical ([org-internal #3072] phase 3): the requirements/design/plan exit sync points
> were archived with their skills (detail: Tier-2 reference page
> `rules/issue-checklist-sync-detail`, reachable via the ticket backend).
Between sync points the checklist stays as-is. **PR / review / CI
transitions** MUST also be visible via the live status note below — the
checklist is not the only carrier.
### Live status note (`## 当前状态`)
For flows with externally visible transitions between skill exits —
standalone bugfix, incident response, long-running reviews — maintain a short
live status table near the top of the issue body, updated in place via the
ticket-backend issue-update API at the transition moment (closes the
stale-issue gap [org-internal #1668]/[org-internal #1689]]).
All roles use the literal heading `## 当前状态` (no suffix). If an issue carries
a legacy variant (e.g. `## 当前状态 (live)` from [org-internal #1668]), normalize it to
`## 当前状态` at the first transition touched. Example table + legacy-variant
list: Tier-2 reference page `rules/issue-checklist-sync-detail`, reachable
via the ticket backend.
Rules:
- One row per externally visible transition. Skill-exit sync points are
surfaced by checklist annotations alone — do NOT add live-status rows for
them. PR / review / CI transitions carry BOTH a checklist annotation AND
a live-status row.
- **Stage rows live on the board, not here**: pipeline stage transitions are
represented by the Pipeline Stages board column (shared write-patterns
Pattern 7.5), NOT by `## 当前状态` rows. Keep only the
status-sync-automated rows (PR / 代码评审 / CI) and non-stage
blockers/deferrals.
- Update in place (same section heading `## 当前状态`), never append a second copy.
- Optional for quiet pipeline flows; **MANDATORY for incident-response and
standalone-bugfix flows** (long windows without skill exits).
- At verify PASS / issue close, fold the table's content into checklist
annotations and remove the section (see the「归档动作」section below).
### Automated sync ([org-internal #1833], timer-polled since [org-internal #2813])
PR / review / CI status-row transitions are automated by the `status-sync`
poller (deployed as a host timer, every 5 min; event sources + latency table
on the Tier-2 reference page `rules/issue-checklist-sync-detail`, reachable
via the ticket backend). Roles do NOT hand-write those three row types. A PR
body may carry several close refs (batch PRs, [org-internal #3731]
`land-batch`): rows fan out to EVERY referenced issue
(`parseClosesFixesWide` — [org-internal #3867], merged 2026-08-31) — Chinese 关闭/修复 refs
drive rows too, even though the ticket backend never auto-closes those
keywords. The remaining sync points (checklist annotations at skill exits,
`## 当前状态` creation, deferral/pending marking, section fold-at-close) are
still manual (content judgment, not event detection). Fallback for poller
outages / manual replay: the `status-sync` manual dispatch
(`issue`/`row`/`value`) — the row-write engine is a no-op when the section
or row is absent, never creates or corrupts them; poller failures file a
deduplicated `[status-sync-cron]` issue.
### Standalone bugfix / incident flows
Pipeline mode has natural sync points at skill exits; standalone bugfix and
incident flows do NOT — the only boundaries are commit → PR → review → CI →
merge, and EACH is a sync point with the same annotations as the progressive
table above (full table: Tier-2 reference page
`rules/issue-checklist-sync-detail`, reachable via the ticket backend): fix
commit → tick fix-delivered ACs `_(commit {sha}: file)_`; PR → open/update
`## 当前状态`; review convergence → tick review ACs + review row; CI
transitions → process-AC progress with run number; verify PASS / close →
final sweep, fold `## 当前状态`, archive per「归档动作」.
### DAG-routed tickets — node checklist variant
For tickets routed through the DAG pipeline (see workflow-routing rule
§"DAG 路由 (v2)"), the task-node checklist has a fixed shape (spec-08
§1/§2/§3):
- **Task tickets (nodes) use a fixed 5-row checklist** + an optional 6th row:
验收标准 / 依赖就绪 / PR / 评审(review-code) / CI — **fixed 5 rows, fixed
order, no free additions**. The `verify里程碑` row exists ONLY when the node
fans into a milestone.
- **Row 6 close-time semantics**: if at ticket close the milestone is not yet
green, keep `- [ ]` + `_(Pending: M-01 未 green)_` — mapped to **Pending**, not
STALE, so it satisfies the Iron Law (no stale items at close). After milestone
verify PASS the aggregator agent flips it to `- [x]` in place.
- **Epic aggregator `## DAG 状态` vs `## 当前状态`**: `## DAG 状态` is the
node-status aggregator table (one row per DAG node — never carries ARCHIVE);
`## 当前状态` carries only PR / 评审 / CI rows (no stage rows).
- **Archive rule unchanged**: the archive marker stays ONLY on the `## 工件索引`
comment (single-comment invariant). The body aggregator table is kept as a
historical snapshot at close and does NOT carry ARCHIVE.
### Kind/MVP tickets — exemption ([org-internal #3061])
`Kind/MVP` tickets run the interactive no-pipeline mode: no stage exits →
**nothing to sync**, no `## 当前状态` section (no PR/review/CI rows until
graduation). The body itself is the living document: `## 决策日志` is
append-only (superseded decisions struck through, never edited); `## Debt
Register` rows update in place. On graduation (relabel `Kind/Feature`) normal
sync rules resume from the DAG route; the decision log stays as backfill input.
### Annotation format
- **Done** → `- [x]` + parenthetical evidence: `_(PR #NNN: file/component)_`
or `_(commit {sha}: file)_` if no PR yet.
- **Deferred** → keep `- [ ]` + `_(Deferred: TD-XXX <reason>)_`.
- **Pending** → keep `- [ ]` + `_(Pending: <blocker>)_`.
### How to sync (each point)
Find the source issue (`Closes #N` / `Fixes #N` in the PR body or commit
messages, `## 父级 / Parent` / roadmap chunk mapping, or the issue the user
referenced; none exists → skip). Fetch the body, map each `- [ ]` item
**relevant to this sync point** to evidence (`- [x]` + `_(PR #NNN: …)_` /
`_(commit {sha}: file)_`), deferral, or pending — leave out-of-scope items
untouched for a later point — and update in place, preserving all
non-checklist content. PR / review / CI transitions ALSO go into the
`## 当前状态` live-status section.
### 归档动作(issue 关闭 = 归档)
**生命周期 = 工单生命周期**[org-internal #1929]):文档生命周期与源 issue 绑定 —— verify PASS → issue 关闭 = 归档。Tier-2 工件库无独立生命周期。
归档是 **显式动作**,由关闭 issue 的 agent 执行:主路径为 Verifier 在 `verify` Phase 5.6;路径跳过 verify 时(audit-only、文档类、standalone/bugfix)由关闭 issue 的 role 代为执行。无论哪个 actor,均遵循 artifact-index-guards 规则 guard #3(机制以共享 write-patterns Pattern 10 为准)。动作序列:
1. **Checklist 终扫**Phase 5.6 既有步骤 / closing agent 补执行):每个 `- [ ]` 项都被注解(done / deferred / pending)。
2. **Fold `## 当前状态`**Phase 5.6 既有步骤 / closing agent 补执行):表格内容折入 checklist 注解后移除该节。
3. **标记 `## 工件索引` 归档**:按共享 write-patterns Pattern 10 Archive-at-close 原位 edit(机制以 Pattern 10 为准)。横幅日期以实际关闭日为准。
4. **关闭 issue**PR body 的 `Closes #N` 在 merge 时自动关闭;无 PR 的流程由 **关闭 issue 的 agent** 执行工单后端的 issue-close API 完成闭环。
约束([org-internal #1928] 设计约束;机制细节以共享 write-patterns Pattern 10 Archive-at-close 为准,此处不重复):
- **L 级大件(>~300 行)留 Tier-2 工件库不删除** —— 页面与位置列 URL 保持不动(稳定 URL 供历史与共享契约引用)。
- **索引/状态/归档判定全部收敛到 issue** —— Tier-2 工件库无独立生命周期;归档标记只落在 `## 工件索引` 评论。
- 归档标记可逆(原位 edit):PR 被拒 / issue 重开时恢复行级 重读 即可。
### Iron Law
NO ISSUE MAY BE CLOSED WITH STALE CHECKLIST ITEMS. If a checklist item
cannot be mapped to evidence or deferral at verify time, the iteration is
NOT done.