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.99.1",
"version": "2.100.0",
"description": "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: 4 additions & 2 deletions docs/commands.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
| [`/idd-config`](#idd-config) | Inspect / init / validate `.claude/issue-driven-dev.local.json` | `[show \| init \| validate \| which]` |
| [`/idd-list`](#idd-list) | List issues + IDD phase + suggested next action | `[--state ...] [--label ...] [--limit N] [--target ...]` |
| [`/idd-issue`](#idd-issue) | Create a well-documented GitHub issue | `[description \| path/to/.docx] [--target ...] [--parent N] [--blocked-by M,...] [--bundle-mode ordered\|unordered] [--mention login]` |
| [`/idd-comment`](#idd-comment) | Add template-guided comment (decision / note / question / correction / link / errata) | `#N [#N ...] --type=<type> [options]` |
| [`/idd-comment`](#idd-comment) | Add template-guided comment (decision / note / question / correction / link / errata / reply) | `#N [#N ...] --type=<type> [options]` |
| [`/idd-edit`](#idd-edit) | Edit existing comment (append / replace / prepend-note) | `comment:<id>[ ...] \| #N --last [--append \| --replace \| --prepend-note] [--body=...]` |
| [`/idd-diagnose`](#idd-diagnose) | RCA / requirements analysis + complexity verdict | `#N [#N ...] [--cwd ...]` |
| [`/idd-plan`](#idd-plan) | Plan-tier: EnterPlanMode approval gate before TDD | `#N [--pr \| --no-pr] [--cwd ...]` |
Expand Down Expand Up @@ -176,7 +176,7 @@

**Syntax**: `/idd-comment #N [#N ...] --type=<type> [options]`

**Options — `--type`** (mandatory, 6 types):
**Options — `--type`** (mandatory, 7 types):

| Type | Use |
|---|---|
Expand All @@ -186,6 +186,7 @@
| `correction` | Mark a previous claim wrong + correction |
| `link` | External context (URL, related issue, gist) |
| `errata` | Errata about a prior comment in the same issue |
| `reply` | Human-facing point-by-point reply to a comment/issue (v2.100.0+, #269) |

**Other options**:

Expand All @@ -194,6 +195,7 @@
| `--body '...'` | Free-text body; appended under the type-specific template heading |
| `--quote 'text'` | Source quote — forced into blockquote, marked as quoted text |
| `--quote-source 'where'` | Attribution for the quote |
| `--points-from=<comment-url\|issue-body>` | reply type 必填,逐點來源(human-facing 逐點回覆:verbatim blockquote 對方原文 → 各點怎麼改 + SHA 錨定) |
| `#N #N #N` (batch mode, v2.34.0+) | Same comment goes to each issue (3 `gh issue comment` calls, one master report) |

**Workflow position**: Side-quest, any phase. Use when a real-time decision / context fact deserves the audit trail but doesn't merit a new issue.
Expand Down
4 changes: 2 additions & 2 deletions docs/workflows.md
Original file line number Diff line number Diff line change
Expand Up @@ -336,9 +336,9 @@ idd-route recommend --complexity Plan --signals ... --candidates ...
idd-comment #N --type decision --body "..."
```

- **Use case**:加 decision / note / question / correction / link / errata 到既存 issue,不走 phase
- **Use case**:加 decision / note / question / correction / link / errata / reply 到既存 issue,不走 phase
- **Mode**:Attended/Unattended hybrid
- **6 types**:decision / note / question / correction / link / errata
- **7 types**:decision / note / question / correction / link / errata / reply(human-facing 逐點回覆,`--points-from`,v2.100.0+ #269)

#### P-edit-only

Expand Down
4 changes: 4 additions & 0 deletions openspec/changes/add-idd-comment-reply-type/.openspec.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
schema: spec-driven
created: 2026-07-18
created_by: che cheng <kiki830621@gmail.com>
created_with: claude
46 changes: 46 additions & 0 deletions openspec/changes/add-idd-comment-reply-type/design.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
## Context

idd-comment 現有六型(decision / note / question / correction / link / errata)全部 audit-facing:讀者是未來回來考古的 maintainer 或 AI。#269 的觸發案例顯示第七種讀者真實存在——review 提出者(人類 collaborator)要的是「我提的第 3 點你怎麼處理了」,而非聚合式 closing summary。

三個既有資產構成設計素材:

1. **suggestion-report skill**(ai_martech_principles,repo 外 prior art):逐點「客戶反映(blockquote 原文)→ 問題原因 → 解決方式 → 目前狀態」模板,加上「寫報告前強制 verify completeness」紀律(per-issue commits check、實質性 spot-check)——與本案 R1 / R2 同構且已實戰驗證。
2. **perspective-writer plugin**:已抽成 standalone marketplace(`PsychQuant/perspective-writer`,v2.10.0,cache 座標 `perspective-writer/perspective-writer/<ver>`)。提供 voice / recipient calibration、T-Schema referent 紀律、per-recipient rules 學習迴圈(draft-learner / save-feedback → target repo `.claude/rules/correspondence-*.md`)。consumer-facing 契約另案(PsychQuant/perspective-writer#1)。
3. **superpowers-integration spec**(本 repo):跨 plugin delegation 的 hard-dependency 前例——fail-fast、無 fallback,理由是「canonical process 替代、built-in 等價敘述已刪除、無物可退」。

## Goals / Non-Goals

**Goals:**

- `--type=reply`:recipient-facing 逐點回覆型,結構正確性(逐點 verbatim + 錨定 + 誠實狀態)由 IDD 自有紀律保證
- perspective-writer 缺席時功能完整可用(graceful degrade),命中時自動 calibration
- 契約元素被 drift-guard 測試鎖住(與 repo 既有 38 suites 同慣例)

**Non-Goals:**

- 不做 `--audience` 正交 flag、不開新 skill、不動既有六型
- 不定義 perspective-writer 端 EXTERNAL-CONSUMER CONTRACT(PsychQuant/perspective-writer#1)
- 不涵蓋 PR description / Discussions 報告等其他 human-facing 面

## Decisions

**D1 — 第 7 型,不是 audience flag、不是新 skill。** idd-comment 的架構是「per-type 模板 + per-type 必填欄位驗證」(decision 要 `--quote`、errata 要 `--target-comment`);`reply` 帶必填 `--points-from` 完美嵌入。替代案 `--audience human` 需要定義 6 型 × audience 的組合矩陣(每型的 human 變體語意),spec 面積不成比例;新 skill 違反 70%-重疊反模式(target resolution、mention 協定、egress、body 同步全部要複製)。

**D2 — soft integration + graceful degrade,刻意走 superpowers 的另一側。** superpowers-integration 的 fail-fast 前提是「SHALL NOT fall back to built-in equivalent」——IDD 已刪除自有 process 敘述,缺 plugin 即無物可退。`reply` 相反:逐點結構與 verify-before-claim gate 是 IDD 自有紀律,缺 calibration 時輸出仍完整正確。故 presence check(`check-plugin-presence.sh perspective-writer perspective-writer`)命中 → calibration;缺席 → 印一行含兩步安裝指令的 notice 照 post。**不**新增 install-time `dependencies` 條目(soft = runtime-only,manifest 零改動)。替代案 hard fail-fast 會把 enhancement 綁架成 hard dependency,讓沒裝該 marketplace 的公共使用者連逐點 reply 都不能用。

**D3 — `--points-from` 三層解析 + verbatim 鐵律。** (1) 顯式 comment URL 或字面值 `issue-body`;(2) 未指定時預設抓 issue body 的 Original text blockquote(idd-issue 建案紀律保證其存在於多數 issue);(3) 兩者皆無 → 要求使用者貼上原文(AskUserQuestion / 對話)。逐點內容一律 verbatim blockquote,禁止 paraphrase——收件人看到自己的話被改寫即失去信任(IC_R007 同源紀律)。

**D4 — recipient context 留在 target repo,IDD 只傳 pointer。** `--mention <login>` 走既有 tagging-collaborators 5-step 協定 resolve;calibration 階段把 resolved login 與 target repo `.claude/rules/correspondence-<person>.md`(若存在)的路徑交給 perspective-writer。關係語境不進 plugin、不跨專案共享。rules 檔缺席時由 perspective-writer 自行 fallback(其 6-phase 流程含 recipient interview),IDD 不複製該邏輯。

**D5 — 執行序不變量:錨定在前、calibration 在後。** draft 流程固定為:逐點 verbatim 引文組裝 → verify-before-claim(每點以 `git log --grep "#N"` / PR merge 狀態驗證證據;無證據的點寫 open / pending)→ referent 錨定完成(SHA、file / theorem 引用)→ 才進 calibration → egress。calibration 不得改動錨定事實(SHA、引用、verbatim 引文原文);違反即為 bug。理由:先潤飾再錨定會讓句子找不到對應 diff,T-Schema 破功。

**D6 — verify-before-claim 是 prose 紀律 + drift-guard,不是新 script。** 檢查邏輯與 idd-close Step 1.6 semantic gate 同族(keyword → artifact 存在性),在 SKILL.md 以步驟陳述並由測試 suite 鎖關鍵字,不另寫 helper script——避免與既有 gate 形成兩份漂移的實作。

## Implementation Contract

- **Command shape**:`/idd-comment #N --type=reply --points-from=<comment-url|issue-body> [--mention <login>] [--body "<per-point 說明素材>"]`。`--points-from` 缺席 → Step 2 validation 拒絕(與 decision 缺 `--quote` 同機制)。
- **模板產出**(SKILL.md 新增 `#### Template: reply`):每點一段 `> {verbatim 原文}` → 處理說明(哪裡改、怎麼改、cross-link commit / PR / label)→ 狀態(✅ 已解決(`<sha>`)/ ⏳ open);結尾整體狀態行(merged SHA、同步狀態、下一步);metadata marker `<!-- idd:comment type=reply date=... points-from=... calibrated=yes|no -->`。
- **Degrade notice literal**(缺 perspective-writer 時印出,內容進 SKILL.md 固定文字):`claude plugin marketplace add PsychQuant/perspective-writer` + `claude plugin install perspective-writer@perspective-writer`。
- **Egress**:沿用 `gh-egress.sh comment` + `--scrub-attested` + (有 mention 時)`--mention-attested`——與既有六型同 choke-point,零新 egress 面。
- **驗證目標**:新 suite `plugins/issue-driven-dev/scripts/tests/idd-comment-reply/test.sh` 斷言 SKILL.md 含:(a) reply 型必填 `--points-from` 驗證列於 Step 2 表格;(b) degrade 安裝指令兩行 literal;(c) 執行序不變量字句(錨定在前 / calibration 不得改動錨定事實);(d) presence-check 座標 `perspective-writer perspective-writer`。`run-all-tests.sh` 全綠(39 → 40 suites;baseline 已含 #163 的 idd-edit-contract suite)。
- **文件同步**:docs/commands.md 型別清單、docs/workflows.md matrix 行、plugins README 型別摘要、CHANGELOG 版本段。
Loading
Loading