Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
"plugins": [
{
"name": "issue-driven-dev",
"version": "2.104.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/<login>`; 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"
Expand Down
6 changes: 6 additions & 0 deletions .claude/.idd/attachments/issue-298/_manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"issue": 298,
"fetched_at": "2026-08-10T11:25:30Z",
"fetched_by": "idd-diagnose",
"files": []
}
6 changes: 6 additions & 0 deletions .claude/.idd/attachments/issue-302/_manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"issue": 302,
"fetched_at": "2026-08-12T09:45:46Z",
"fetched_by": "idd-diagnose",
"files": []
}
8 changes: 8 additions & 0 deletions issue-driven-development.code-workspace
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"folders": [
{
"path": "."
}
],
"settings": {}
}
26 changes: 26 additions & 0 deletions plugins/issue-driven-dev/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
22 changes: 18 additions & 4 deletions plugins/issue-driven-dev/skills/idd-clarify/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -237,19 +237,33 @@ LIBRARY_CONTENT=$(cat "$LIBRARY_FILE")
```markdown
### Clarity Surface(idd-clarify run <ISO 8601 timestamp>)

| 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 <ISO 8601 timestamp>)

| Type | Source | Suggested canonical | Status |
| Type | Source | Question for you | Status |
|---|---|---|---|
| (none) | — | no issues detected | passed |
```
Expand All @@ -261,7 +275,7 @@ LIBRARY_CONTENT=$(cat "$LIBRARY_FILE")
```markdown
### Clarity Surface(idd-clarify run <ISO 8601 timestamp>, 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 |
Expand Down Expand Up @@ -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 |
Expand Down
2 changes: 1 addition & 1 deletion plugins/issue-driven-dev/skills/idd-issue/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 |
"
Expand Down
13 changes: 12 additions & 1 deletion plugins/issue-driven-dev/skills/idd-list/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -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+)

Expand Down
Loading
Loading