← ClaudeAtlas

removed-star-prune-lifecyclelisted

starledger 的 set check 出現 extra>0(annotation 的 node_id 不在 stars.json)、要修改 packages/classifier 的 assemble/apply/prune-orphans 任一路徑、或有人提議手動編輯 ai-annotations.json 時載入。這是 removed-star(unstar)生命週期的契約與唯一合法修復路徑。
F-e-u-e-r/opus-pack · ★ 2 · AI & Automation · score 68
Install: claude install-skill F-e-u-e-r/opus-pack
# starledger:removed-star prune 生命週期 (驗證日 2026-07-30,HEAD `55ae7b2`。實作��� PR #213(issue #212),production 首證=PR #214。) ## 背景 spec 的 Merge rule「a removed star prunes its annotation」(`docs/P3-ai-spec.md`)曾是 **未實作**的:`AssembleAiArtifactsInput` 沒有 canonical-identity 輸入——型別簽名層面就不可能 prune;planner 的 PLAN-6 只修剪 classifier **state**,不動發佈 artifact。2026-07-29 第一次 production unstar 留下常設孤兒(extra=1)——偵測者是 routine 自己的 3c set check; completion-runbook 的 set-check 前置條件因此擋住 closeout(該窗口內完成閘**並未被 dispatch**;若 dispatch 必因 extra=1 FAIL)。修復是 end-to-end 的(owner 指定範圍 A–D),且驗收標準是「**由 deterministic path 自己產出 prune PR**」。 ## 契約要點(現行實碼,`packages/classifier/src/`) - **assemble**(`assemble.ts`):`canonicalNodeIds: ReadonlySet<string>` 為**必填**;順序= 重複 node_id 硬失敗 → 修剪不在 canonical set 的既有 annotation(`prunedNodeIds` 排序回報) → **非 canonical 的 validated candidate 硬失敗**(同一輪修剪掉的東西不得由 candidate 重進) → 合併 → 排序/序列化/重建 meta。 - **apply**(`program.ts`):以 `loadCanonicalDataset` 載入並驗證 `--stars/--meta` (預設 `stars.json`/`dataset-meta.json`),**硬拒** `manifest.dataset_sha256 ≠` 驗證後 dataset SHA——絕不用另一份快照的 manifest 執行有破壞性的 prune;canonical set 傳入 assembler。 - **prune-orphans**(`prune-orphans.ts` + CLI):零 candidate 的專用維護指令。 收據=canonical count(含 dataset SHA 前 12 碼)、annotations before、 `pruned: N (id, …)`、annotations after、changed/no-op;只在 changed 時寫檔; 「changed 與 prunedNodeIds 不一致」是 invariant violation(拒寫)。 **stdout 的 `pruned: N` 行是載重介面**——routine 的 3e 逐字解析它 (測試 `PRUNE-STDOUT-1/2` 釘住格式;改輸出格式=介面變更)。 - **gate 相容性*