From 5eddb72995718e2ad29f084c75421a02c63d83f7 Mon Sep 17 00:00:00 2001 From: che cheng Date: Fri, 14 Aug 2026 01:01:31 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20idd-list=20=E7=9A=84=E9=9D=9C?= =?UTF-8?q?=E9=BB=98=E6=88=AA=E6=96=B7=E3=80=81idd-verify=20=E7=9A=84=20/t?= =?UTF-8?q?mp=20=E7=A2=B0=E6=92=9E=E3=80=81idd-clarify=20=E6=94=B9?= =?UTF-8?q?=E5=95=8F=E5=8F=A5=20(#299,=20#288,=20#294)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #299 --limit 是 server 端套用、先於任何排序,所以「抓 N 筆再本地排序」拿到的是 「隨便 N 筆,排好序」。輸出看起來排序正確,被截掉的是誰完全看不出來 —— 而 skill 自己的鐵律寫著「按 updatedAt 排序,最近被動的最該注意」。改為 server 端排序, 並記下 --search 與 --label 衝突時的退路(多抓再裁切,且在 footer 說明)。 #288 verify 的 findings / prompt / codex 路徑只帶 issue number,不帶 repo 身分, 所以兩個 session 驗**不同 repo 的同號 issue** 會共用檔名,殘留檔被當成本輪產出。 失敗是靜默的,方向是最壞的一種:把別的 repo 的結論併進這個 PR 的報告。改為所有 路徑掛在單一 mktemp -d 底下(加 repo slug 不夠 —— 同 repo 並發仍會撞)。 #294 Clarity Surface 第三欄從描述式分析改成對使用者的問句(使用者原話:「iddclarify 我覺得你可以直接放對使用者的問題」),並要求問句可用一句話回答。四張表全部改名, 連同 idd-issue 發的同一張表與 terminology-canonical 的 emit 規則 —— 只改一處會讓 兩個 producer 分岔,那正是 #295 花了六輪在修的同一類問題。 --- .../references/terminology-canonical.md | 2 +- .../skills/idd-clarify/SKILL.md | 22 +++++++++++++++---- .../skills/idd-issue/SKILL.md | 2 +- .../issue-driven-dev/skills/idd-list/SKILL.md | 13 ++++++++++- .../skills/idd-verify/SKILL.md | 20 +++++++++++++++++ 5 files changed, 52 insertions(+), 7 deletions(-) diff --git a/plugins/issue-driven-dev/references/terminology-canonical.md b/plugins/issue-driven-dev/references/terminology-canonical.md index 15fda17..d503934 100644 --- a/plugins/issue-driven-dev/references/terminology-canonical.md +++ b/plugins/issue-driven-dev/references/terminology-canonical.md @@ -122,7 +122,7 @@ Optional fields(若有 evidence): 1. **Lexical pass**:body contains source term(case-sensitive for ASCII abbreviations,case-insensitive for Chinese) 2. **Context predicate pass**:context predicate phrase 在 same body 出現(任何位置 OK,not necessarily same paragraph — heuristic allows broad match,user 可 dismiss false positive) 3. **De-dupe**:同一 source phrase 觸發多個 rows 時,選 highest-specificity row(最 specific context predicate) -4. **Emit**:per match row,produce `### Clarity Surface` table row with Type=`terminology`,Source=quoted body excerpt(含周圍 sentence),Suggested canonical=本檔 row 的 suggested canonical value +4. **Emit**:per match row,produce `### Clarity Surface` table row with Type=`terminology`,Source=quoted body excerpt(含周圍 sentence),**Question for you** = 用本檔 row 的 suggested canonical 組成一個可以一句話回答的問句(#294),例如「這裡的『分群變數』指的是 `distinguishing variable` 嗎?」——**不要**只把 canonical term 填進去。本檔的 `Suggested canonical` 欄位仍是 library 自己的欄位名,兩者不同層 ## Versioning diff --git a/plugins/issue-driven-dev/skills/idd-clarify/SKILL.md b/plugins/issue-driven-dev/skills/idd-clarify/SKILL.md index 34fd12e..522e148 100644 --- a/plugins/issue-driven-dev/skills/idd-clarify/SKILL.md +++ b/plugins/issue-driven-dev/skills/idd-clarify/SKILL.md @@ -237,19 +237,33 @@ LIBRARY_CONTENT=$(cat "$LIBRARY_FILE") ```markdown ### Clarity Surface(idd-clarify run ) -| Type | Source | Suggested canonical | Status | +| Type | Source | Question for you | Status | |---|---|---|---| | terminology | "..." | ... | surfaced | | ambiguity | "..." | ... | surfaced | | missing-context | "..." | ... | surfaced | ``` +**第三欄寫「問句」,不是分析(#294)**:使用者原話 —— + +> 「iddclarify我覺得你可以直接放對使用者的問題」 + +那一欄的讀者是**要做裁決的人**。寫成描述式分析(「此處 X 與 Y 的界線未定義」),他讀完還得自己把分析還原成一個可回答的問題,才知道要決定什麼。直接寫成問句,讀完就能回答: + +| ❌ 描述式 | ✅ 問句 | +|---|---| +| 「`phase` 與 `status` 在本文中混用,語義邊界未定義」 | 「`phase` 和 `status` 是同一件事嗎?如果不是,哪一個是給人看的?」 | +| 「未指明此規則套用於既有 repo 或僅新建 repo」 | 「這條規則要不要回頭套用到已經存在的 32 個 repo?」 | +| 「缺少失敗時的預期行為」 | 「如果它失敗了,你希望它擋下來、還是印個警告繼續?」 | + +問句要**可以用一句話回答**。若一個疑點需要三個問題才問得完,那是三個 row,不是一個 row 塞三句。 + **Empty surface case**:no detection → 仍 emit: ```markdown ### Clarity Surface(idd-clarify run ) -| Type | Source | Suggested canonical | Status | +| Type | Source | Question for you | Status | |---|---|---|---| | (none) | — | no issues detected | passed | ``` @@ -261,7 +275,7 @@ LIBRARY_CONTENT=$(cat "$LIBRARY_FILE") ```markdown ### Clarity Surface(idd-clarify run , unattended) -| Type | Source | Suggested canonical | Status | Reason | +| Type | Source | Question for you | Status | Reason | |---|---|---|---|---| | terminology | "..." | ... | deferred | unattended-auto-Step-4.6-deferred | | ambiguity | "..." | ... | deferred | unattended-auto-Step-4.6-deferred | @@ -399,7 +413,7 @@ Annotation appended: ### Clarity Surface(idd-clarify run 2026-05-22T03:42:18Z) -| Type | Source | Suggested canonical | Status | +| Type | Source | Question for you | Status | |---|---|---|---| | terminology | "可否 prompt 跟他說各群要有至少一個最高得分的特徵值" | 分群變數 / distinguishing variable (per K-means context, library row 1) | surfaced | | missing-context | "請根據上面網址的K欄的情感、人、場..." | customer × attribute score 來源未指定(GSheet 只有 metadata) | surfaced | diff --git a/plugins/issue-driven-dev/skills/idd-issue/SKILL.md b/plugins/issue-driven-dev/skills/idd-issue/SKILL.md index 5ce8423..c1da07b 100644 --- a/plugins/issue-driven-dev/skills/idd-issue/SKILL.md +++ b/plugins/issue-driven-dev/skills/idd-issue/SKILL.md @@ -1117,7 +1117,7 @@ else ### Clarity Surface (deferred — see retry hint) -| Type | Source | Suggested canonical | Status | +| Type | Source | Question for you | Status | |---|---|---|---| | (deferred) | /idd-clarify invocation failed | Run /idd-clarify #$NEW_ISSUE_NUMBER manually to populate | deferred | " diff --git a/plugins/issue-driven-dev/skills/idd-list/SKILL.md b/plugins/issue-driven-dev/skills/idd-list/SKILL.md index e051b0c..f8e5dfd 100644 --- a/plugins/issue-driven-dev/skills/idd-list/SKILL.md +++ b/plugins/issue-driven-dev/skills/idd-list/SKILL.md @@ -72,15 +72,26 @@ TaskCreate(name="audit_closes_marker", description="Step 4 (v2.75.2+, #151): 若 ### Step 2: Fetch Issues ```bash +# --limit is applied SERVER-side, BEFORE any sort we do here (#299). Asking for +# N and then sorting locally returns "N arbitrary issues, sorted" — not "the N +# most recently active". The truncation is silent: the output looks correctly +# ordered, and the issues that fell off are invisible. +# +# So the sort must happen server-side too. `--search "sort:updated-desc"` makes +# GitHub order before it truncates; the local sort below is then a no-op that +# keeps the contract explicit. gh issue list \ --repo "$GITHUB_REPO" \ --state "$STATE" \ --limit "$LIMIT" \ + --search "sort:updated-desc" \ ${LABEL:+--label "$LABEL"} \ --json number,title,state,labels,updatedAt,body,comments ``` -按 `updatedAt` desc 排序(最新活動在最上面)。 +按 `updatedAt` desc 排序(最新活動在最上面)。**排序必須在 server 端發生** —— `--limit` 是 server 端套用的,先截再排等於「隨便 N 筆,排好序」,而且截掉的是誰完全看不出來(#299)。 + +> **若 `--search` 與 `--label` 併用有衝突**(GitHub 的 search 語法與 `--label` flag 走不同路徑),退而求其次:把 `--limit` 放大到 `3 × $LIMIT` 抓回來、本地排序後再取前 `$LIMIT`,並在 footer 註明「已從 N 筆中取最近 M 筆」。**不可**維持現狀的靜默截斷。 ### Step 2.5: Fetch Open PRs (v2.51.0+) diff --git a/plugins/issue-driven-dev/skills/idd-verify/SKILL.md b/plugins/issue-driven-dev/skills/idd-verify/SKILL.md index 0e6e5f7..7944658 100644 --- a/plugins/issue-driven-dev/skills/idd-verify/SKILL.md +++ b/plugins/issue-driven-dev/skills/idd-verify/SKILL.md @@ -548,6 +548,26 @@ Exit code: 每個 reviewer 用 single `Agent` tool call(**not** TeamCreate teammate)。所有 5 個 + 1 個 Bash codex **必須在同一個 message** 一起發出(單 message 多 tool calls = parallel)。 +> **Scratch-file naming (#288)**: every `/tmp` path in this skill MUST include a +> per-run token, not just the issue number. `/tmp/verify_${NUMBER}_findings_*.md` +> and `/tmp/codex-verify-${NUMBER}.md` carry no repo identity, so two sessions +> verifying **the same issue number in different repos** share filenames — and a +> leftover file from the earlier run is then read as this run's findings. That +> failure is silent and its direction is the worst one: the coordinator merges +> another repo's verdict into this PR's report. +> +> Resolve a run directory ONCE, before spawning anything, and use it everywhere: +> +> ```bash +> VERIFY_DIR=$(mktemp -d "${TMPDIR:-/tmp}/idd-verify-${NUMBER}-XXXXXX") +> # every findings / prompt / codex path below becomes "$VERIFY_DIR/.md" +> ``` +> +> `mktemp -d` gives collision-freedom without needing a repo slug, survives +> concurrent runs of the same issue in the same repo, and is cleaned up by the +> OS. Do NOT paper over this by adding a repo slug to the old flat names — +> concurrent runs of the *same* repo would still collide. + > **Pre-spawn prompt persistence (per /idd-verify --pr 73 round 1 P1.2)**: BEFORE invoking the 5 Agent calls, coordinator MUST save each reviewer's full prompt to `/tmp/verify_${NUMBER}_prompt_.md`. Step 2.5b Recovery Protocol re-paste step reads these files; if they don't exist, retry fails. Save via: > > ```bash From e322355f64c5511368092f0b93ea4881a113678d Mon Sep 17 00:00:00 2001 From: che cheng Date: Fri, 14 Aug 2026 01:02:07 +0800 Subject: [PATCH 2/2] docs: CHANGELOG + version bump for #299 / #288 / #294 (2.103.1) --- .claude-plugin/marketplace.json | 2 +- .../.claude-plugin/plugin.json | 2 +- plugins/issue-driven-dev/CHANGELOG.md | 26 +++++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 72815a0..b2dc3b8 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.1", "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..125ea01 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.1", "author": { "name": "Che Cheng" }, diff --git a/plugins/issue-driven-dev/CHANGELOG.md b/plugins/issue-driven-dev/CHANGELOG.md index da9674d..0630f51 100644 --- a/plugins/issue-driven-dev/CHANGELOG.md +++ b/plugins/issue-driven-dev/CHANGELOG.md @@ -5,6 +5,32 @@ 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.1] - 2026-08-14 + +### Fixed + +- **`idd-list` truncated the wrong issues, silently (#299)** — `--limit` is applied **server-side, before any sort**, so + asking for N and sorting locally returns "N arbitrary issues, sorted" rather than "the N most recently active". The + output looked correctly ordered and the issues that fell off were invisible — while the skill's own rule says + 「按 `updatedAt` 排序,最近被動的 issue 通常最該注意」. The sort now happens server-side via + `--search "sort:updated-desc"`, with a documented fallback (over-fetch then trim, and say so in the footer) for the + case where `--search` and `--label` conflict. What is not allowed is the silent truncation. + +- **`idd-verify` scratch files collided across repos (#288)** — findings, prompt and codex paths were built from the + issue number alone (`/tmp/verify_${NUMBER}_findings_*.md`), so two sessions verifying **the same issue number in + different repos** shared filenames and a leftover file was read as this run's findings. The failure is silent and its + direction is the worst one: another repo's verdict merged into this PR's report. Every path now hangs off a single + `mktemp -d` run directory. Adding a repo slug to the flat names was considered and rejected — concurrent runs of the + *same* repo would still collide. + +- **`/idd-clarify` asks the user a question instead of describing an ambiguity (#294)** — user's words: + 「iddclarify我覺得你可以直接放對使用者的問題」. The third column was `Suggested canonical` and held descriptive + analysis, so the reader had to reconstruct what was being asked before they could decide anything. It is now + `Question for you`, and the guidance requires a question answerable in one sentence (three questions = three rows). + 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. + ## [2.102.2] - 2026-08-01 ### Added