From 054adf14f4e6af195c507c695f8a34feb61bc228 Mon Sep 17 00:00:00 2001 From: che cheng Date: Fri, 14 Aug 2026 05:24:40 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20routing=20=E8=AE=80=E4=B8=8D?= =?UTF-8?q?=E5=88=B0=E3=80=8C=E7=8F=BE=E5=9C=A8=E5=8F=AF=E4=B8=8D=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=E5=8B=95=E3=80=8D=E3=80=81Spectra=20tier=20=E5=A4=B1?= =?UTF-8?q?=E5=8E=BB=E8=BF=BD=E8=B9=A4=20(#298,=20#300)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #298 四個 triage 訊號只有一個被接上。實測本 repo 的 22-issue backlog,9 條路由錯 8 條, 其中 #131 與 #200 帶著使用者親自下的 defer 裁決 —— 照 routing 執行等於自動推翻已記錄的 人為決策。失敗完全看不出來:表格語法正確、格式正常、零 warning。Step 3.7 改讀四個訊號, 並要求 ### Complexity 的限定詞不得被截斷(非裸 tier token → 保守歸 Blocked + 印出原文)。 #300 spectra 三個 skill 一則 phase-bearing comment 都不產生,進度在 IDD 看不到的 tasks.md 裡,所以 phase 凍在 diagnosed、close gate 一路 fallback 掃到 Diagnosis 的 Strategy checklist —— 一份 pre-implementation 清單。兩個方向都壞,其中一個是安靜的: 若該清單當初寫得少或已打勾,gate 會對一份與實作無關的清單放行。idd-diagnose 改為在 Spectra verdict 時印出綁定的 hand-off(含 /idd-update --tasks-file 指令)。 43/43 suites 綠。 --- .claude-plugin/marketplace.json | 2 +- .../.claude-plugin/plugin.json | 2 +- plugins/issue-driven-dev/CHANGELOG.md | 25 +++++++++++++++++++ .../skills/idd-diagnose/SKILL.md | 15 +++++++++++ .../issue-driven-dev/skills/idd-list/SKILL.md | 24 ++++++++++++++++-- 5 files changed, 64 insertions(+), 4 deletions(-) diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 72815a0..b9f03ef 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -15,7 +15,7 @@ "plugins": [ { "name": "issue-driven-dev", - "version": "2.103.0", + "version": "2.103.3", "description": "v2.102.2: Deep Research light integration (#277, ruling b). idd-diagnose gains a non-binding pointer (the #111 superpowers hand-off shape: pure suggestion, no presence check, no dependency) fired when the diagnosis's quality depends on facts OUTSIDE the repo — with trigger examples AND counter-examples (the overly-broad-signal risk). Output flows back via '/idd-comment --type note' as summary + link, never full text (#116) — that is what keeps external research inside the audit trail. Both real-user misconceptions get canonical answers where they lived: research attaches AT diagnose (not after plan), and research vs implement are different phases' work, not substitutes. usecase-routing scenario 32 + a three-row internal-corpus vs external-world boundary table (idd-find / idd-ask / Deep Research). Deep integration stays a recorded residue until a plugin-dependable primitive exists. v2.102.1: reopen / resume path (#278) — the legal return trip from closed. idd-close gains a 'Reopen / resume path' section (close's dual operation): reopen-vs-new-issue criteria (same Expected -> reopen for trail continuity; morphed need -> new issue Refs old; broken upstream artifact -> #200's re-baseline, out of this path), resume point decided by the closing summary's WHY (premise changed -> re-diagnose; pure deferral -> implement), and the old summary stays untouched (append-only; reopen = note comment + idd-update phase rollback + optional prepend-note). Cross-referenced against auto-close-trap recovery. usecase-routing scenario 31. From a real user exchange; verify on substitute basis (disclosed). v2.102.0: three-front release. Skill-description contract + Path Map (#276, two-phase): idd-plan's frontmatter description — the ONLY surface read at skill-selection time — now names its diagnosis precondition; 5 skills gain the house pattern (drift-guard skill-description-contract, RED 8 first); docs/workflows.md gains a mermaid Path Flowchart mirroring the decision tree with all 36 catalog paths, rendered deterministically to the wiki Path-Map page by scripts/generate-path-map.py (drift-guard path-map-sync: freshness / coverage / discovery). Egress data-safety cluster (#275 + #273): empty-body guard — a provided-but-empty body now refuses (exit 15, band discipline; edit floors at 10 stripped chars because overwrite semantics turn empty dispatch into data loss — live incident 2026-07-22; explicit-intent escape --allow-empty-body); and the comment-PATCH surgery channel enters the nets via the new edit-comment verb (the #226 rollout's tracked-separately whitelist debt retired — it had bypassed EVERY net), with idd-edit's batch loop consuming the refusal band into a second outcome bucket (final exit stays 4). Dogfood: the #163 contract layer caught this release's own SCRUB_LEVEL provenance gap on first sweep. 42 suites, 0 fail. v2.99.1: staleness sweep + guard-net expansion (#267). README carried three stale gpt-5.5 pins and a stale vendored-codex-call claim — all outside the drift-guard scan net; fixed and the net widened: model-generation-sync now refutes pins in README + both catalog docs (31 assertions), and a new docs-catalog-sync suite requires every skills/* directory to appear in the catalog docs (the #122 no-forcing-function root cause is now test-detectable; it caught idd-ask and idd-config on its first RED). docs/workflows.md + skill-dimensions.md backfilled to v2.99 reality (P-find-lookup / P-ask-history / P-report-rollup / P-config-maintain / P-verify-file-profile paths, matrix rows, D12 4th member). 38 suites 0 fail. v2.99.0: /idd-ask — grounded QA over the issue corpus (#72), the surfacing family's 4th member mirroring /spectra-ask. Natural-language question -> decide-to-search gate (greetings/meta skip; bug-shaped questions never trigger diagnose) -> retrieval delegating idd-find's search backend (family rule: never rebuild a read-only query) -> full-text read of top-N hits (default 5, capped 10) -> grounded synthesis: first line blockquotes the question, every claim carries an issue/comment citation, source priority closed-with-PR > open > orphaned comment with conflicts surfaced, ending with Referenced Issues; corpus silence reported honestly, never filled from training memory. Read-only allowed-tools locked. First live run of the #140 fourth-member procedure (Q3 weak-hit judgment recorded in the family canonical). New capability spec idd-ask (+2 requirements); new drift-guard suite; 37 suites 0 fail. v2.98.0: codex channel goes full-dependency (#264, user ruling 'like superpowers'). The vendored bin/codex-call is DELETED — it trailed pai 2.18.0 by four security/correctness fixes (token-exp NSNumber parse, OAuth-file umask 0o077, form-encoding escape, post-flock re-read). Executable now resolves from the parallel-ai-agents plugin cache (MIN_PAI 2.19.0 — the codexModel/codexEffort contract floor, pai issue 22); model/effort/max-time governance resolves from codex-pro's EXTERNAL-CONSUMER CONTRACT (MIN_CODEX_PRO 0.7.0: machine-readable references/defaults.json base + global/project profile.yaml overlay, codex-pro issue 7) and is passed explicitly on all three call paths (canonical Workflow args + manual fan-out + legacy direct). IDD's tree contains ZERO model pins — generation bumps touch codex-pro's defaults.json only. Dependency wiring mirrors the superpowers shape: install-time dependencies entry (codex-pro@codex-pro), allowCrossMarketplaceDependenciesOn, check-plugin-presence pre-flight, fail-fast with a one-step install instruction, no soft fallback. model-generation-sync drift-guard reshaped to the v2 contract (a re-vendored codex-call fails the suite). 36 suites 0 fail. v2.97.0: 9-issue drain via 5 cluster PRs (#259-#263). Composable verification profiles (#258): idd-verify --profile code|prose|academic (+ config-registered custom via verify_profiles) switches the (lens set, DA focus, input source, freshness) four-tuple; new --file/--dir input sources make the git worktree optional; file-mode SHA-256 freshness gate mirrors the #228 diff gate (never silently exempted); code default byte-identical. New /idd-find skill (#139): surfacing-only semantic lookup over the open+closed corpus with GitHub relevance + phase/PR overlay; read-only, filter flags redirect to idd-list, embedding honestly deferred. Dashboard comment contract (#133) + idd-report --rollup (#134): one human-facing narrative snapshot per issue (marker-located, updates bound to phase transitions only, anti-#116) and a pull-only four-group attention view (need-attention / in-progress / stalled>14d / recently-closed). sdd_bias config switch (#252): hard-gate hits escalate to Spectra when high; default routing byte-identical. Layer V unattended deferred-record (#120): registry literal + structured catch-up record aggregated by idd-all Phase 6. Surfacing-primitives family doc, D12 axis (#140). Model-generation sync (#251): codex-call default gpt-5.6-sol is the tree's single generation pin (live-probed); prose generation-neutral; idd-route candidate renamed codex-xhigh. Docs path catalog completed (#122). 5 new drift-guard suites; 36 suites 0 fail. v2.96.0: gh-egress hardening cluster + idd-edit batch semantics. Exit-code band >=10 (#227: 10=privacy/11=mention/12=unscannable/13=attestation/14=usage; wrapper never exits <10 on its own — rc<10 is always gh's, so unattended callers can split gate-refusal from gh-failure on $? alone). Unified python3 content-net scan (#225: kills the jq/no-jq divergence; taxonomy = projects keys + path-shaped values under sensitive key names; fail-closed wide net when python3 absent). Phase 2 rollout (#226: all 6 skills' comment/edit egress now dispatch through gh-egress with attestation — the #117 mention net is mechanically enforced on the comment channel). idd-edit batch x R5 (#158: per-comment refuse + continue, batch outcome report, exit 4 iff any refused). v2.95.0: Discussions intake bridge (#221) — opt-in `idd-list --discussions` (GraphQL surface: Q&A/Ideas + unanswered + deduped vs issue refs; graceful no-op) + `idd-issue --from-discussion` (Provenance seed + draft-and-confirm reply, unattended never posts); cardinal rule: never auto-file. Plus idd-verify diff-freshness gate (#228: FROZEN_SHA vs HEAD before aggregate — refuse stale-snapshot verdicts) and the IDD_CALLER registry (#161: dynamic tree-sweep drift-guard). v2.94.0: selective git auto-tag (#85) — idd-issue tags idd-{N}-baseline at main HEAD (rollback anchor); idd-verify tags idd-{N}-verified on Aggregate PASS (review snapshot). Only these two milestones (no diagnose/plan/implement tags) so the tag namespace stays clean. Config `auto_tag` (default-ON, opt-out via enabled:false); idempotent (existing tag skipped) + graceful-skip on push failure (never aborts the workflow). v2.93.1: collaborator identity registry in idd-config (#86) — optional `collaborators[]` config field mapping a person's alias / email / display-name → GitHub @login WITHOUT guessing (github_login required; email is PII, private/gitignored only). tagging-collaborators.md Step 2.5 consults the registry first as an accelerator (a hit is still existence-verified via `gh api users/`; a miss falls through to the API fuzzy-match); idd-config validate checks login charset + globally-unique aliases + PII reminder. v2.93.0: reshape Plan / pre-implementation tier (Cluster C, #129/#57/#111, via reshape-plan-preimpl-tier Spectra change) — first-class `meeting` issue type (meeting-first routing + Phase A/B/C deliberation + self-contained close gate), complexity hard gate (>=5-file interdependent-concept OR shared-abstraction MUST-trigger Plan, escalate-only), and superpowers pre-implementation hand-off (README stage-mapping table + non-binding brainstorming pointer, no self-built staging skill). v2.92.1: hotfix — parallel-ai-agents install-time dependency pointed at the wrong marketplace (psychquant-claude-plugins), making v2.92.0 fail to load and silently dropping all /idd-* skills; corrected to the parallel-ai-agents marketplace. v2.92.0: /idd-all batch-drain release — 23 issues verified+closed via 16 PRs (#223, #229-#243), the plugin's largest self-dogfood. Added: unattended-contract (state-file signal + TTL, TTY heuristic removed, idd-all/chain dependency early gates #123/#222/#211); gh-egress unconditional @-mention net with --mention-attested escape-or-attest contract (#117) atop 6-item mechanical-net precision hardening (#203); idd-close Step 6.3 doc-sync sweep (#220); test aggregator + GitHub Actions CI, 21 suites (#217); idd-list blocked-state grouping + all-blocked banner (#84); config Mechanism 3.5 submodule routing (#162); check-plugin-presence enabled-state detection exit 3 (#212); monorepo host plugin disambiguation (#68); assert-helpers eval-content ban + safe output-grep pair (#188); diagnosis-detection contract fixtures (#61). Changed: parallel-ai-agents promoted to install-time dependency, vendored ensemble fork DELETED, idd-verify two-tier chain (#219); DA sequenced-spawn eliminates the #119 socket-crash polling window (#130); spectra-archive-post-ic --force-linked-issue vs --linked-issue intent separation (#172); worktree conventions unified on the managed helper (#169); bridge state migrated to .claude/.idd/state/bridge.json (#199); .gitattributes LF policy (#216); merge-completeness fixtures default-branch self-sufficiency (#224). Audits: dependency bindings vs deep-integration rule (#210), rules layering 12/12 (#215). Follow-ups filed: #225-#228.", "author": { "name": "Che Cheng" diff --git a/plugins/issue-driven-dev/.claude-plugin/plugin.json b/plugins/issue-driven-dev/.claude-plugin/plugin.json index 1289a89..0c2937d 100644 --- a/plugins/issue-driven-dev/.claude-plugin/plugin.json +++ b/plugins/issue-driven-dev/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "issue-driven-dev", "description": "v2.102.2: Deep Research light integration (#277, ruling b). idd-diagnose gains a non-binding pointer (the #111 superpowers hand-off shape: pure suggestion, no presence check, no dependency) fired when the diagnosis's quality depends on facts OUTSIDE the repo — with trigger examples AND counter-examples (the overly-broad-signal risk). Output flows back via '/idd-comment --type note' as summary + link, never full text (#116) — that is what keeps external research inside the audit trail. Both real-user misconceptions get canonical answers where they lived: research attaches AT diagnose (not after plan), and research vs implement are different phases' work, not substitutes. usecase-routing scenario 32 + a three-row internal-corpus vs external-world boundary table (idd-find / idd-ask / Deep Research). Deep integration stays a recorded residue until a plugin-dependable primitive exists.", - "version": "2.103.0", + "version": "2.103.3", "author": { "name": "Che Cheng" }, diff --git a/plugins/issue-driven-dev/CHANGELOG.md b/plugins/issue-driven-dev/CHANGELOG.md index da9674d..15f9362 100644 --- a/plugins/issue-driven-dev/CHANGELOG.md +++ b/plugins/issue-driven-dev/CHANGELOG.md @@ -5,6 +5,31 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [2.103.3] - 2026-08-14 + +### Fixed + +- **`idd-list` routing could not read "is this actionable right now" (#298)** — four signals exist for it and #84 wired + up exactly one. Measured against this repo's own 22-issue backlog: **8 of 9 routes were wrong**, and two of them + (#131, #200) carried a defer ruling the user had made personally — following the routing would have silently + overturned a recorded human decision. The failure looks like nothing: the table is syntactically fine, correctly + formatted, and carries no warning. Step 3.7 now reads all four — `### Blocking`, the `blocked` label, the + **`parking-lot` label as a first-class gate**, and the **`### Complexity` qualifier**. A Complexity value that is not + a bare tier token (`Simple when triggered`, `Spectra when triggered (parking lot)`) is treated conservatively **and + its qualifier is printed verbatim** — symmetric with the existing `### Conflict Class` rule, except this field + previously did not parse at all: it took the first tier-looking word and dropped the condition. + +- **Spectra-tier issues fell out of tracking after diagnose (#300)** — `/spectra-discuss`, `/spectra-propose` and + `/spectra-apply` emit **no phase-bearing comment**; progress lives in `openspec/changes//tasks.md`, which IDD + cannot see. So phase froze at `diagnosed`, and `idd-close`'s authoritative-source resolution fell through to the + Diagnosis **Strategy checklist** — a pre-implementation list that stays unticked no matter how much work was done. + Both directions are bad and one is silent: reading "nothing done" blocks a legitimate close (visible, someone + complains), but a Strategy list that happened to be short or already ticked lets the gate **pass on a checklist + unrelated to the actual implementation** — and nobody finds out. `idd-diagnose` now prints a binding hand-off with the + `/idd-update --tasks-file` command whenever the verdict is Spectra. Auto-detecting the spectra directory layout was + considered and rejected: it would weld an external tool's structure into IDD, against `--tasks-file`'s deliberate + design of not composing paths from convention. + ## [2.102.2] - 2026-08-01 ### Added diff --git a/plugins/issue-driven-dev/skills/idd-diagnose/SKILL.md b/plugins/issue-driven-dev/skills/idd-diagnose/SKILL.md index e3a48eb..a0c9bc5 100644 --- a/plugins/issue-driven-dev/skills/idd-diagnose/SKILL.md +++ b/plugins/issue-driven-dev/skills/idd-diagnose/SKILL.md @@ -618,6 +618,21 @@ Diagnosis 完成 + Step 3.4 Vagueness Pre-check 結束後(`type=meeting` 已 | `Spectra` (opt-out) | `/spectra-propose` | diagnose → propose → apply → verify → close + archive(僅當 ALL opt-out conditions 成立) | | `meeting`(**type 分流,非 complexity verdict** —— 在 Step 3.5 最優先分支、不經複雜度評分) | `/idd-plan #NNN`(meeting-adapted plan) | diagnose(Phase A/B/C Strategy)→ plan(meeting Plan body:議程 → 決策點 → 行動項;**不** chain to `/idd-implement`)→ close(decision→action mapping + meeting-specific gate,無 `/idd-verify` TDD pass) | +> **Spectra tier 的追蹤 hand-off(#300,綁定)**:verdict 為 `Spectra` 時,diagnose **必須**在 report 的下一步區塊印出以下三行,否則該 issue 會在 diagnose 之後失去追蹤: +> +> ``` +> → /spectra-discuss (或依 opt-out 條件走 /spectra-propose) +> ⚠ Spectra 路徑不產生任何 phase-bearing comment,所以: +> artifacts 完成後請貼一則 `## Implementation Complete`,並跑 +> /idd-update #N --tasks-file openspec/changes//tasks.md +> ``` +> +> **為什麼需要這一行**:`idd-update` 的 phase 推斷靠掃 comment 標題(`## Diagnosis` / `## Implementation Plan` / `## Implementation Complete` / `## Verify` / `## Closing Summary`),而 `/spectra-discuss`、`/spectra-propose`、`/spectra-apply` **一則都不產生** —— 進度記在 `openspec/changes//tasks.md`,那個檔案 IDD 看不到。於是 phase 凍在 `diagnosed`,而 `idd-close` 的 authoritative-source 解析會一路 fallback 到第 3 層,掃到 **Diagnosis 的 Strategy checklist** —— 一份 pre-implementation 清單,實作做完了它也還是全未打勾。 +> +> 方向不對稱且其中一邊是安靜的:gate 讀到「全未完成」會擋下 close(假陰性,看得見、會被抱怨);但若 Strategy 清單當初就寫得少或被打過勾,gate 會**對一份與實際實作無關的清單放行**(假陽性,沒人會發現)。 +> +> `--tasks-file` 本來就是為此設計的(`idd-update` 自己寫著「為走非 `idd-implement` 路徑的 issue 補上 authoritative source」),但在本次修正之前**沒有任何地方會告訴走 Spectra 的人要用它**。這是最小改動的一版;把 spectra 目錄佈局寫進 IDD 的自動偵測方案刻意不採用,因為那會把外部工具的結構知識焊進來,與 `--tasks-file` 不從慣例組路徑的設計相衝。 + > **Pre-implementation staging hand-off(#111,非綁定)**:verdict 為 `Plan` 或 `Spectra`(design-heavy)時,diagnose 在 report 印一行非綁定 pointer —— `→ 建議 pre-implementation staging: superpowers:brainstorming`(先 brainstorm 對齊方向再進 plan / propose)。這是**非綁定建議**:IDD 自身**不** invoke `superpowers:brainstorming`,使用者自行決定是否跟進(見 README「IDD ↔ superpowers stage mapping」)。 > **為什麼 discuss 是 Spectra default?** AI 常常高估 diagnosis 的完整度。一份看起來詳盡的 diagnosis 可能仍留下關鍵的未決項:命名、範圍邊界、多個合理方案中該選哪個、新產物要放哪裡。直接跳到 `spectra-propose` 會產生建立在未確認假設之上的 proposal。`spectra-discuss` 是對齊的 safety net — 強制把假設列出、讓使用者修正。跳過它應該是例外,不是預設。 diff --git a/plugins/issue-driven-dev/skills/idd-list/SKILL.md b/plugins/issue-driven-dev/skills/idd-list/SKILL.md index e051b0c..e6484a9 100644 --- a/plugins/issue-driven-dev/skills/idd-list/SKILL.md +++ b/plugins/issue-driven-dev/skills/idd-list/SKILL.md @@ -48,7 +48,7 @@ TaskCreate(name="fetch_open_prs", description="Step 2.5 (v2.51+): gh pr list --s TaskCreate(name="fetch_discussions", description="Step 2.7 (v2.95+, #221): 僅當 --discussions flag — probe hasDiscussionsEnabled(false → 一行 skip note)→ GraphQL 抓 open discussions(first 50)→ filter(Q&A/Ideas ∧ answerChosenAt null)→ dedup(issue body 含該 URL 者剔除)→ Discussions (actionable) 區塊。query 失敗降級 skip note,絕不 abort。無 flag 時 no-op") TaskCreate(name="extract_phase", description="從每個 issue body 的 Current Status → **Phase**: 抽出 phase;fallback 掃 comments 標題推斷") TaskCreate(name="build_issue_pr_index", description="Step 3.5 (v2.51+): client-side regex `#(\d{1,7})\b` scan PR body 找 issue refs (cap digits ≤7,過濾 #0),反向建 issue→PR map + cluster detection (refs ≥ 2 → cluster,leader = min(refs);若同 issue 被多 PR ref,sort by PR number asc 確保 deterministic order;cluster_members 寫入 pr_info 僅當 len ≥ 2)") -TaskCreate(name="extract_blocked_state", description="Step 3.7 (v2.92+, #84): 抽 blocked 信號(Blocking 區塊/label/wait 類 next)→ blocked_reason 掛 entry") +TaskCreate(name="extract_blocked_state", description="Step 3.7 (v2.92+, #84; #298 擴充): 抽四個「現在可不可以動」訊號 —— Blocking 區塊 / blocked label / **parking-lot label** / **### Complexity 的 when-triggered 限定詞**(非裸 tier token → 保守歸 Blocked 且印出限定詞原文,不得截斷)→ blocked_reason 掛 entry") TaskCreate(name="format_output", description="組 #N [phase] title 表格;有 PR 加 └─ 子行 (cluster leader 顯示 cluster: #X #Y / member 顯示 → see PR #N) + footer 統計含 PR/cluster 數") TaskCreate(name="report_and_suggest_next", description="輸出 table 並列出 Suggested next(phase × PR state matrix);#84 分 Actionable/Blocked 兩組 + 全 blocked banner + footer 計數") TaskCreate(name="audit_closes_marker", description="Step 4 (v2.75.2+, #151): 若 --audit-closes,對 state=CLOSED 但 Step 3 找不到 `## Closing Summary` 的 issue 加 ⚠ marker(可能被 commit/PR-body close keyword auto-close 繞過 /idd-close gate)。reuse Step 3 comment scan,不重 fetch") @@ -227,7 +227,27 @@ def get_leader(refs_list, body, rule): **`cluster_members` 寫入規則**:寫進 `pr_info` 僅當 `len(refs) >= 2`(single-PR 為 None)。Step 4 判定 cluster 一律以 `pr_info['cluster_members'] is not None` 為 single source of truth,避免 single-PR 判定條件有歧義(per L12 finding)。 -### Step 3.7: Blocked-state extraction(v2.92+, #84) +### Step 3.7: Blocked-state extraction(v2.92+, #84;#298 擴充為四訊號) + +對每個 issue 抽「現在可不可以動」的信號(**依 body 記錄判定,不宣稱即時**)。#84 只接上四個訊號中的一個,其餘三個 routing 讀不到 —— 實測本 repo 的 22-issue backlog,**9 條路由裡 8 條錯**,而且錯得完全看不出來(表格語法正確、格式正常、零 warning)。其中 #131 與 #200 帶著使用者親自下的 defer 裁決,照 routing 執行等於自動推翻已記錄的人為決策。 + +**四個訊號,全部要讀(#298)**: + +| 訊號 | 位置 | 判定 | +|---|---|---| +| `### Blocking` 區塊非空 | body `## Current Status` | blocked(#84 已 ship)| +| `blocked` label | labels | blocked | +| **`parking-lot` label** | labels | **parked —— first-class gate,不得路由成 actionable** | +| **`### Complexity` 帶限定詞** | 最新 Diagnosis comment | **見下** | + +**`### Complexity` 的限定詞不得被截斷**:值若不是已知 tier 的**裸 token**(`Simple` / `Plan` / `Spectra`),而是帶條件的形式 —— `Simple when triggered`、`Spectra when triggered (parking lot)`、`Plan (deferred pending #86)` —— 則: + +1. **保守處置**:歸入 Blocked/Parked 組,**不**給 `→ /idd-implement` 之類的 actionable 建議; +2. **必須 surface**:在該列印出限定詞原文(如 `⏸ when triggered: ≥3 instances (目前 #1)`),不得靜默截成 tier。 + +這與 `### Conflict Class` 的既有規則對稱:值無法 parse 成已知 token 時預設最保守的類別**並把 fallback 印出來**。差別只在本欄過去連 parse 都沒做 —— 它直接取第一個像 tier 的字。 + +> **本規則的實證來源**:2026-08-14 的 backlog 清理逐一讀了這些 issue 的**歷史**(誰在什麼脈絡下決定了什麼),才判斷得出 #131/#146/#157/#143/#145/#136 該關、#200 該留。那個判斷需要的訊息不在 label 也不在 complexity 欄位裡 —— 這正是 #37(bulk-solve autopilot)被 re-park 的理由,也是本 step 只做到「擋下誤路由」而不做「自動決定處置」的原因。 對每個 issue 抽 blocked 信號(**依 body 記錄判定,不宣稱即時**): From 435520fe3f849fbcc6a60bfed5073bda01becb77 Mon Sep 17 00:00:00 2001 From: che cheng Date: Fri, 14 Aug 2026 05:28:53 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=E4=BF=AE=E6=8E=89=E6=88=91=E4=B8=8A?= =?UTF-8?q?=E4=B8=80=E5=80=8B=20commit=20=E8=AA=A4=E7=95=99=E5=9C=A8=20CHA?= =?UTF-8?q?NGELOG=20=E7=9A=84=E8=A1=9D=E7=AA=81=E6=A8=99=E8=A8=98=EF=BC=88?= =?UTF-8?q?=E5=85=A9=E5=81=B4=E6=A2=9D=E7=9B=AE=E9=83=BD=E4=BF=9D=E7=95=99?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/issue-driven-dev/CHANGELOG.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/plugins/issue-driven-dev/CHANGELOG.md b/plugins/issue-driven-dev/CHANGELOG.md index 742eedd..9ffc5f5 100644 --- a/plugins/issue-driven-dev/CHANGELOG.md +++ b/plugins/issue-driven-dev/CHANGELOG.md @@ -5,7 +5,6 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -<<<<<<< HEAD ## [2.103.3] - 2026-08-14 ### Fixed @@ -30,7 +29,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 `/idd-update --tasks-file` command whenever the verdict is Spectra. Auto-detecting the spectra directory layout was considered and rejected: it would weld an external tool's structure into IDD, against `--tasks-file`'s deliberate design of not composing paths from convention. -======= ## [2.103.1] - 2026-08-14 ### Fixed @@ -56,7 +54,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 Renamed in all four tables in `idd-clarify`, plus the copy `idd-issue` emits on the deferred path and the emit rule in `references/terminology-canonical.md` — that library keeps its own `Suggested canonical` field, which is a different layer, and now states that the canonical term is the *basis* of the question rather than the cell contents. ->>>>>>> main ## [2.102.2] - 2026-08-01