Framework Issue
框架問題的知識載體是 canonical repo(tarrragon/claude)上的 issue,本地 ticket 只記執行。本檔是入口:先定位你在做哪一種事,再依路由表讀對應的一份 reference。
定位:ticket 記執行,issue 記問題
| ticket | issue | |
|---|---|---|
| 一張對應什麼 | 一個執行單位(本專案這一階段做什麼) | 一個問題領域(問題是什麼、為何這樣解) |
| 狀態可逆 | 否 | 是(close 可 reopen,close 只代表當前結論暫時穩定) |
| 可見範圍 | 單一 consumer | 所有 consumer |
| 增長語意 | 池增長是負債 | open 數增長不是失效,同領域裂成多張才是 |
工作流四階段:發現問題 → 分析票(ticket);分析與方案 → issue 區段;實作 → 實作票(依階段裁票);同步 → sync-push。分析 context 留在 ticket 時對其他 consumer 不可見,同一問題會被重複發現、已解的問題後續票不知情。
決策入口
先答這一問:這個問題替換掉本專案名稱與路徑後還成立、且根源在 .claude/ 通用資產嗎? 兩者皆是才是框架問題;否則走 ticket skill。
| 你要做的事 | 動作 |
|---|---|
| 記錄一個新框架問題 | dedup 查重 → 逐一判定命中的關係(重複/切分/引用)→ 依關係處置 |
| 對既有 issue 補實測、反證、疑慮 | observe,任何 session 隨時可加,不需 owner |
| 更新自己擁有的區段 | update <comment-id>,以 comment id 精準編輯 |
| 把一群本地 ticket 的分析收進 issue | 收束流程五步(見下節) |
| 一個壞 change 多個 consumer 各自修 | fix-matrix 命令(fix-status / fix-version / close) |
| ticket 執行中發現框架問題,決定接不接 | 兩條路徑(先記錄不接手 / 當下接手)與關閉協定 |
查重命中不等於重複:全文檢索涵蓋 comment 內文,互相引用的 issue 會同時命中彼此。三種關係的判定與處置見按需讀取表的協定檔。
命令總表
全部命令住在 scripts/,以 python3 .claude/skills/framework-issue/scripts/<檔名> ... 執行。<issue-ref> 支援 owner/repo#N(限框架 repo)、#N、純數字。
| 命令 | 檔名 | 用途 |
|---|---|---|
dedup |
section_comment.py |
唯讀查重,含空白的關鍵字組拆單詞聯集查詢 |
init |
section_comment.py |
查重後建全部區段 comment、與既有索引列合併回填一次 body 索引;issue 已有區段時拒絕(exit 3,--force 可覆蓋並合併) |
add |
section_comment.py |
對已 init 過的 issue 追加單一區段,併入既有索引列 |
update |
section_comment.py |
以 comment id 更新自己擁有的區段 |
transfer-owner |
section_comment.py |
PATCH 區段首行標記的 owner 欄,內容不變 |
observe |
section_comment.py |
附加觀測 comment |
show |
section_comment.py |
以 body 索引為入口,區分區段與觀測流 |
check |
section_comment.py |
三項警訊:當前結論落後最新觀測(主)、comment 數、索引一致性 |
todo |
section_comment.py |
唯讀,跨 open issue 聚合「待辦與來源*」表格列;預設本 consumer 擁有的 open issue,--all/--issue N 改範圍,--status/--stage/--priority/--consumer/--json 可用 |
create |
create_issue.py |
建 issue,body 自動附環境資訊 |
list |
list_issues.py |
列 issue,--search 作粗篩 |
link |
link_issue.py |
把 issue ref stamp 進本地 error-pattern 的分類資訊表 |
fix-status |
fix_status.py |
查或標記本 consumer 的修復狀態(body 內 fix-matrix 表) |
fix-version |
fix_version.py |
追加修復版本號(body 內 fix-versions 表),close 前置 |
close(issue) |
close_issue.py |
關 issue,缺版本號註記即拒(exit 3);與收束流程的 ticket close 是不同對象 |
exit code:0 成功、3 降級(gh 未安裝/未登入/Issues 停用/執行例外,stderr 給提示不拋 traceback)。
收束流程速覽
把一群本地 ticket 壓成 issue 的當前結論,完整配方在 references/ticket-intake.md。五步不可跳:
- 分群:以主題為單位,一主題一 issue;先與並行 session 對齊誰認領哪個主題。
- 查重:
dedup單詞 token;主題已有 open issue 一律附加,不新開。 - 改寫:ticket 是時序累積(後段修正前段),區段是狀態呈現(只含現在成立的)。逐段問「這是現在的結論,還是通往結論的過程?」,被推翻的中間版本刪除、只留一句撤回記錄。
- 建段:「當前結論」(讀者入口)必有;「問題與方案」「待辦與來源」有內容才建,不寫空殼。
- 收票:ANA/DOC/IMP 一律 close,知識住址寫進 reason-note;依賴範圍票的外部票以
set-why補 issue ref。命令、範圍規則與 reason-note 禁詞見references/ticket-intake.md步驟五。
Owner 與派發
區段 owner 是實際執行該工作的 session,他方以 observe 附加或 add 自己的區段。owner 識別固定為 <專案目錄 kebab-case>-<session 序號>(如 flutter-balance-77),CLI 對其他形態 exit 3;理由見協定檔〈區段與觀測標記格式〉。
收束與區段撰寫派 framework-issue-curator(opus、effort medium);一個主題一個 curator 並行,派發票列明範圍內的 ticket ID,curator 只對這些票 close。純 observe/check 類輕量操作不需派發。
按需讀取
涵蓋章節欄與目標檔的 ## 標題逐字相同、雙向齊全。
| 何時讀 | 檔案 | 涵蓋章節 |
|---|---|---|
| 要 init/add/update/transfer-owner/observe/show/check,或判定查重關係、解讀 check 警訊、查 owner 格式 | references/comment-as-section-protocol.md |
〈操作一覽〉〈CLI 語法〉〈區段與觀測標記格式〉〈init 前查重:三種關係處置〉〈check 的三項警訊〉〈增長語意與 close 語意〉〈已知限制〉 |
| 要用 create/list/link/fix-status/fix-version/close | references/fix-matrix-commands.md |
〈create 與 list〉〈link〉〈fix-status〉〈fix-version〉〈close〉〈Graceful Degradation〉 |
| ticket 執行中辨識到框架問題,決定接不接與怎麼關 | references/escalation-flow.md |
〈介入判斷:框架問題 vs 專案問題〉〈兩條路徑〉〈Issue 關閉協定〉〈回報前查重 SOP〉 |
| 要把一群 ticket 收束成 issue,或派 curator 做這件事 | references/ticket-intake.md |
〈前提與分工〉〈步驟一:分群〉〈步驟二:查重與落點〉〈步驟三:時序改狀態〉〈步驟四:區段範本〉〈步驟五:ticket 處置〉〈步驟六:驗證與交接〉〈派發 curator〉 |
| 想看一張 issue 從 dedup 到 check 的完整走查 | references/worked-example.md |
〈情境〉〈查重輸出與關係判定〉〈sections.json〉〈init 與索引〉〈ticket close〉〈check 與 owner 更新〉 |
Testing
uv run --project .claude/hooks pytest .claude/skills/framework-issue/tests/ -v
測試以 mock 攔截 gh subprocess,不真打 GitHub API。
版本紀錄在同目錄的 CHANGELOG.md。