138 lines
7.7 KiB
Markdown
138 lines
7.7 KiB
Markdown
> Core 中立版(Increment 2 改写)。术语对照见 core/adapters/TERMINOLOGY.md;本组织实例表述见 dogfood 对应文件。
|
||||
|
|
|
|||
|
|
## Workflow Routing — type-driven process selection (mandatory)
|
|||
|
|
|
|||
|
|
A ticket's `Kind/*` label determines its process route. The main-session
|
|||
|
|
Process Assessment Gate MUST resolve the route BEFORE matching a skill, so a
|
|||
|
|
labeled ticket never re-derives its path from scratch. Routing is **additive**:
|
|||
|
|
it can only skip stages a ticket doesn't need — it can never weaken a
|
|||
|
|
mandatory gate or skip review/verify.
|
|||
|
|
|
|||
|
|
**Authoritative table**: the workflow-routing table in the instance config
|
|||
|
|
area (`label → { entry, skip, keep_gates }`). The table is the single source
|
|||
|
|
of truth; this rule only says _when and how_ to consult it.
|
|||
|
|
|
|||
|
|
### When to route (Step 0 — runs before the gate's "Articulate intent")
|
|||
|
|
|
|||
|
|
On every substantive request that is tied to a ticket, run Step 0:
|
|||
|
|
|
|||
|
|
1. **Identify the working ticket**. Priority order: explicit `Closes #N` /
|
|||
|
|
`Fixes #N` / `Resolves #N` in the PR or commit → `## 父级 / Parent` link
|
|||
|
|
or chunk mapping → the issue the user pasted or referenced by number.
|
|||
|
|
None of these → no ticket, skip to degradation.
|
|||
|
|
2. **Resolve the route with the 路由解析工具 FIRST** — pass the full
|
|||
|
|
`Kind/*` label when known; omit `kind` when not yet read (the tool returns
|
|||
|
|
the default route plus a read-ticket-then-re-invoke instruction). Agents
|
|||
|
|
with the route-gate option enabled enforce this mechanically
|
|||
|
|
[org-internal #3328]: other tool calls are dispatch-rejected until the
|
|||
|
|
路由解析工具 runs. Do not hand-read the routing table when the tool is
|
|||
|
|
available.
|
|||
|
|
3. **Read the ticket's `Kind/*` label** from the issue body or via the issue
|
|||
|
|
tools (unblocked once the route gate is satisfied). Pick the FIRST
|
|||
|
|
`Kind/*` label if several exist; on a non-default route, re-invoke the
|
|||
|
|
路由解析工具 with the full label.
|
|||
|
|
4. **Apply the route**:
|
|||
|
|
- `entry.skill` non-null → invoke that skill (with `entry.mode` if given)
|
|||
|
|
instead of natural-language matching. This satisfies gate Step 3.
|
|||
|
|
- `entry.skill` null → normal natural-language match, still honoring
|
|||
|
|
`skip` / `keep_gates` downstream. Never drop a gate the route lists in
|
|||
|
|
`keep_gates`; never add back a stage the route lists in `skip`.
|
|||
|
|
|
|||
|
|
### Degradation — label missing, unknown, or wrong ([org-internal #1828] AC)
|
|||
|
|
|
|||
|
|
- **No ticket / no `Kind/*` label / label not in the table** → `default`
|
|||
|
|
route (natural-language matching). State this in one line ("no Kind/\*
|
|||
|
|
label → default route") so the choice is auditable; never block or ask
|
|||
|
|
the user just because a label is absent.
|
|||
|
|
- **Label looks wrong for the work** → do NOT silently override the label.
|
|||
|
|
Apply the labeled route, flag the mismatch in your first response, and
|
|||
|
|
recommend the correct label — the creator owns label correctness; routing
|
|||
|
|
acts only on what is written.
|
|||
|
|
- **Routing table file missing/unreadable** → fall back to natural-language
|
|||
|
|
matching session-wide and note it once — a broken table never blocks work.
|
|||
|
|
|
|||
|
|
### Interaction with the rest of the pipeline
|
|||
|
|
|
|||
|
|
- Routing chooses the **entry** and the **skip set** only. L0/L1 enforcement
|
|||
|
|
(worktree/branch discipline, commit-msg format, stash ban,
|
|||
|
|
claim-discipline, issue-checklist-sync, issue-cross-linking) applies on
|
|||
|
|
every route; a `Kind/Documentation` ticket still needs a worktree and a
|
|||
|
|
PR.
|
|||
|
|
- `keep_gates` from the route and the skill's own mandatory gates intersect:
|
|||
|
|
a gate is mandatory if EITHER source requires it. Skipping is valid only
|
|||
|
|
when BOTH the route and the skill agree it's skippable for this ticket type.
|
|||
|
|
|
|||
|
|
### Runtime growth signals (post-sizing)
|
|||
|
|
|
|||
|
|
Two live growth mechanisms (narrative: Tier-2 reference page
|
|||
|
|
`rules/workflow-routing-detail`, reachable via the ticket backend; retired
|
|||
|
|
Size/* history: the instance rules-history archive). Canonical key:
|
|||
|
|
`dag.size_derivation.oversize_signals` (TD/DUP-F009).
|
|||
|
|
|
|||
|
|
- **DAG-routed tickets** (DAG Epic, DAG-routed `Kind/Feature`, their
|
|||
|
|
`Kind/Task` children — no `Size/*` tier): runtime growth fires the
|
|||
|
|
oversize signals → response is **re-derivation + review-dag re-run**.
|
|||
|
|
- **Bug tickets (big-bug relabel rule, [org-internal #3061])**: a `Kind/Bug`
|
|||
|
|
hitting a design-level trigger (design-decision root cause, shared-contract /
|
|||
|
|
public-API change, data migration) has outgrown the bug type — mandatory
|
|||
|
|
action is **relabel `Kind/Feature`** (Step 0 reroutes into the DAG
|
|||
|
|
pipeline; repro + root-cause notes carry over as node input). Scale-only
|
|||
|
|
triggers stay in bugfix with batched iterations.
|
|||
|
|
|
|||
|
|
Both follow "act on what's written, surface the doubt": when reality
|
|||
|
|
disagrees with the label, pause, reclassify, and make the change visible —
|
|||
|
|
never quietly override.
|
|||
|
|
|
|||
|
|
### DAG 路由 (v2) — default (转正)
|
|||
|
|
|
|||
|
|
The DAG ticket pipeline (`analyze-dag` → task DAG → single gate `review-dag`)
|
|||
|
|
is the **default** route for `Kind/Epic` and `Kind/Feature`
|
|||
|
|
([org-internal #3061] Phase 2 / TD-388). Both resolve via the routes table
|
|||
|
|
directly — **no trigger/marker check** (route rollback = revert PR).
|
|||
|
|
Authoritative definition: the `dag:` block in the workflow-routing table;
|
|||
|
|
narrative + history: Tier-2 reference page `rules/workflow-routing-detail`.
|
|||
|
|
|
|||
|
|
1. **`Kind/Epic` or `Kind/Feature` → `dag.route`**: entry `analyze-dag`,
|
|||
|
|
single gate `review-dag` (replaces review-design-space +
|
|||
|
|
review-iteration-plan), `keep_gates` `[review-dag, verify]`.
|
|||
|
|
2. **`Kind/Task` under a DAG parent → `dag.task_route`** (entry `implement`,
|
|||
|
|
`implement → review-code → verify`), NOT `dag.route`. All three skills
|
|||
|
|
carry a DAG branch; `pipeline/review-dag` success replaces the
|
|||
|
|
design-space + iteration-plan convergence preconditions at review-code
|
|||
|
|
and verify.
|
|||
|
|
|
|||
|
|
**Routing stickiness**: once an Epic is routed to DAG (draft DAG artifact
|
|||
|
|
exists or `## DAG 状态` table created), all subsequent Step 0 for that Epic
|
|||
|
|
stays on the DAG route — stickiness starts at first routing, NOT at
|
|||
|
|
single-gate PASS. Symmetrically, an Epic already decomposed via legacy
|
|||
|
|
roadmap stays legacy through close (no new legacy decomposition).
|
|||
|
|
|
|||
|
|
**Ticket creation after single-gate PASS** (switch values authoritative in
|
|||
|
|
the routing table `dag.ticket_creation`; analyze-dag itself does NOT create
|
|||
|
|
tickets): on `review-dag` PASS the **aggregator agent** creates one
|
|||
|
|
`Kind/Task` ticket per `type: task` node (body: node `acceptance_criteria`
|
|||
|
|
or dag subpage link + `test_id` suite; `## 父级 / Parent` → DAG parent so
|
|||
|
|
Step 0 resolves `dag.task_route`); `type: milestone` nodes get NO ticket
|
|||
|
|
(DoD carried by `dag.verify_milestone`); the parent body aggregates
|
|||
|
|
`## DAG 状态` + `## 当前状态` (single writer: the aggregator). Each task
|
|||
|
|
ticket then flows implement → review-code (`mode: "dag-task"`) → verify
|
|||
|
|
(task mode).
|
|||
|
|
|
|||
|
|
### Retired sections (index)
|
|||
|
|
|
|||
|
|
Retired mechanisms (Sizing, JIT decomposition, marker disambiguation,
|
|||
|
|
legacy-route sunset, publish-target-by-tier, gate-trim) live in the instance
|
|||
|
|
rules archive; rulings in the phase-3 retirement ruling doc (Tier-2
|
|||
|
|
reference, reachable via the ticket backend). Nothing trims gates —
|
|||
|
|
`never_trim` is structural.
|
|||
|
|
|
|||
|
|
### 立案降档 — filing/sprint-mode([org-internal #3002] G5 / [org-internal #3007])
|
|||
|
|
|
|||
|
|
Sprint 期间债务侧显式降档,不靠纪律。开关:routing table `filing.sprint-mode`
|
|||
|
|
(默认 `false`)。`true`(冲刺期)时 verify Phase 5.5 registry-only 不分严重度
|
|||
|
|
(登记行照写、零丢失;独立工单创建冻结至开关回 `false`,已登记行按
|
|||
|
|
ticket-lifecycle 规则正常认领升票;期间 HIGH/MEDIUM 行不被 reaper 触碰,
|
|||
|
|
[org-internal #3004])。BF/FT(5.55/5.56)不受影响。谁翻转:冲刺负责人(人),
|
|||
|
|
在冲刺跟踪单记一行;开关值即 routing table 当前值,verify 每次运行时读取。
|
|||
|
|
动机与细节:Tier-2 参考页(经 ticket backend)`rules/workflow-routing-detail`。
|