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 @@ -9,7 +9,7 @@
"name": "parallel-ai-agents",
"source": "./plugins/parallel-ai-agents",
"description": "v2.21.0: 三層 lens 疊加 built-in → lens pack → user (#29) — lens 可由外部 pai-lenses plugin 與 ~/.claude/pai-lenses/ 疊加,新增一條 lens 從「改 JS + bump plugin」降為「改 CSV」;撞名需顯式 override,報表附 provenance 行。v2.20.1: codex-call 補上 SSE error 事件的 message 提取路徑 (#25)。v2.20.0: first-party codex-pro governance deep-integration (#23). v2.19.0: codexModel/codexEffort contract args (#22, caller-governed cross-model leg). 平行派發任務給多個 AI agent(Claude + Codex),獨立執行後交叉比對結果。Codex 改走直接 HTTP wrapper(bin/codex-call,Swift script)取代 codex exec subprocess,解決 hang 問題且避開 Python 版本飄移",
"version": "2.21.0",
"version": "2.22.0",
"author": {
"name": "Che Cheng"
},
Expand Down
4 changes: 2 additions & 2 deletions plugins/parallel-ai-agents/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "parallel-ai-agents",
"description": "v2.20.1: codex-call 補上 SSE error 事件的 message 提取路徑 (#25) — 直接呼叫 codex-call 時,HTTP 200 stream 內帶 message 的後端錯誤(如 server_is_overloaded)會顯示真實原因而非籠統的 \"Codex error\";經 ensemble 使用時仍受 #27 限制(消費端硬編碼失敗訊息)。v2.20.0: first-party skills deep-integrate codex-pro governance (#23, mirroring issue-driven-dev#264) — new references/codex-governance.md (canonical resolution: MIN_CODEX_PRO 0.7.0 gate, defaults.json base + two profile.yaml layers, fail-fast with install instruction when codexEnabled and codex-pro absent); ensemble-code-review / ensemble-academic-review / ensemble-compose(--codex) resolve and pass codexModel/codexEffort explicitly; engine + bin/codex-call baked defaults become release-time governance SNAPSHOTS (bumped to gpt-5.6-sol) — authoritative source is codex-pro's defaults.json; all first-party prose generation-neutral. v2.19.0: codexModel / codexEffort engine args (#22) — the cross-model codex leg's model and effort become caller-governed contract args (defaults gpt-5.5 / xhigh preserve pre-#22 behavior byte-identically). First consumer: issue-driven-dev passing codex-pro-resolved governance. 平行派發任務給多個 AI agent(Claude + Codex),獨立執行後交叉比對結果。Codex 改走直接 HTTP wrapper(bin/codex-call,Swift script)取代 codex exec subprocess,解決 hang 問題且避開 Python 版本飄移",
"version": "2.21.0",
"description": "v2.22.0: minutes profile + ensemble-minutes-review skill — 會議記錄的 ensemble 審閱。四個 lens 互為補集:fidelity(記錄寫的逐字稿有嗎)、completeness(逐字稿有的記錄漏了嗎)、attribution(發言與責任歸屬的依據)、cross-document(來函/開會通知/前次記錄與交叉參照)。既有 profile 都不合用:academic 四個 lens 有三個空轉(methodology 不適用、reference-verifier 查 Zotero、number-verifier 需計算 artifact),lecture 的 student-readability 不適用。skill 並記入 args 須傳物件(傳字串會 0 agent 空跑)與 agentModel 須顯式指定兩個實測陷阱。 v2.20.1: codex-call 補上 SSE error 事件的 message 提取路徑 (#25) — 直接呼叫 codex-call 時,HTTP 200 stream 內帶 message 的後端錯誤(如 server_is_overloaded)會顯示真實原因而非籠統的 \"Codex error\";經 ensemble 使用時仍受 #27 限制(消費端硬編碼失敗訊息)。v2.20.0: first-party skills deep-integrate codex-pro governance (#23, mirroring issue-driven-dev#264) — new references/codex-governance.md (canonical resolution: MIN_CODEX_PRO 0.7.0 gate, defaults.json base + two profile.yaml layers, fail-fast with install instruction when codexEnabled and codex-pro absent); ensemble-code-review / ensemble-academic-review / ensemble-compose(--codex) resolve and pass codexModel/codexEffort explicitly; engine + bin/codex-call baked defaults become release-time governance SNAPSHOTS (bumped to gpt-5.6-sol) — authoritative source is codex-pro's defaults.json; all first-party prose generation-neutral. v2.19.0: codexModel / codexEffort engine args (#22) — the cross-model codex leg's model and effort become caller-governed contract args (defaults gpt-5.5 / xhigh preserve pre-#22 behavior byte-identically). First consumer: issue-driven-dev passing codex-pro-resolved governance. 平行派發任務給多個 AI agent(Claude + Codex),獨立執行後交叉比對結果。Codex 改走直接 HTTP wrapper(bin/codex-call,Swift script)取代 codex exec subprocess,解決 hang 問題且避開 Python 版本飄移",
"version": "2.22.0",
"author": {
"name": "Che Cheng"
}
Expand Down
20 changes: 20 additions & 0 deletions plugins/parallel-ai-agents/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [2.22.0] - 2026-08-04

### Added

- `minutes` profile:會議記錄的 ensemble 審閱,四個 lens 互為補集。
`fidelity`(記錄寫的逐字稿有嗎、推論有無被寫成會中決定、有無誤讀原話)與
`completeness`(逐字稿有的記錄漏了嗎、不利內容有無消失)一正一反,缺一不可;
`attribution` 查發言與責任歸屬的依據(語者分離常不可靠,未確認即具名是嚴重問題);
`cross-document` 比對來函、開會通知、前次記錄,並檢查交叉參照是否指對位置。
DA 盯三種安靜的偏移:個別發言寫成全體共識、條件句寫成確定句、會後才知道的事寫得像會中已知。
- `ensemble-minutes-review` skill:載明與 `sinica-admin:meeting-minutes` 的分工
(機械檢查歸 compile.sh、事實核對歸本 skill),以及無逐字稿時應拒絕執行而非降級。

### Fixed

- 文件補上兩個實測陷阱:`args` 傳字串時 `profile` 解析為 `undefined`、0 個 agent 被派出
而 workflow 仍「成功」結束(僅在 findings 留一條 harness HIGH);`agentModel` 不指定時
agent 繼承 session main-loop model,高階 session 單輪曾燒 56-109 萬 token 並撞死 lens agent。


## [2.21.0] - 2026-08-01

### Added
Expand Down
4 changes: 4 additions & 0 deletions plugins/parallel-ai-agents/references/builtin-lenses.csv
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
profile,key,focus,needsSrt
# 唯讀 catalog — 編輯本檔不會改變任何行為。真源是 workflows/ensemble-workflow.js 的 PROFILES。要新增/修改 lens 請走 lens pack 或 ~/.claude/pai-lenses/(見 references/lens-layers.md)。本檔由 references/regen-builtin-lenses.sh 產生。
minutes,fidelity,"記錄對逐字稿的忠實性,這是會議記錄的第一要求。逐條比對,檢查:(1) 記錄中每一條討論事項、決議、待辦,是否都能在逐字稿找到依據?(2) 有無記錄者的推論、整理或補充,被寫成像是會中發生的事?(3) 有無誤讀原話——特別注意把「性質」誤讀成「物件」的一類(實例:發言者說本案屬 top-down 推動,記錄卻寫成「另備 top-down 計畫書」,把計畫的性質誤讀為另一份文件);(4) 討論中的傾向、某人的個別意見,有無被寫成全體共識或決議?(5) 數值是否與逐字稿一致?逐字稿字錯率高,若記錄已註明某數值另經查證,檢查該查證是否確實成立。判準是「拿掉逐字稿,這句話還站得住嗎」。找不到依據就是 finding,不要因為內容看起來合理就放過。",true
minutes,completeness,"記錄是否完整覆蓋會議內容。檢查:(1) 逐字稿有討論但記錄漏寫的重點,這是本 lens 最重要的產出;(2) 會中提到的風險、疑義、反對意見有無被略過(正面內容被保留而負面內容消失,是常見的偏移);(3) 有無提到但未列入待辦的承諾事項;(4) 決議是否齊備(會中作成的決定有無遺漏)。注意:記錄本就該摘要而非逐字,濾掉贅詞、離題、重複不算遺漏。判準是「與會者讀完記錄,會不會以為某件事沒發生過」。",true
minutes,attribution,"發言與責任的歸屬是否有依據。檢查:(1) 記錄具名到個人之處,該人身分是否真的可確認?(語者分離常不可靠,在未確認的情況下具名是嚴重問題)(2) 待辦事項的主辦方歸屬依據為何?以單位層級歸屬時,該推論是否成立?(3) 有無把某方的發言記成另一方的?(4) 敏感內容的歸屬是否恰當(自陳的利益衝突、內部策略、對第三方的評價,具名記錄可能造成困擾)。單位層級的歸屬若有機制性證據(例如發言者提到只有某單位才有的內部機制),可以成立;純粹憑語氣或立場推測則不成立。",true
minutes,cross-document,"記錄與佐證文件的一致性。context 會列出可查證的檔案路徑(來函、開會通知、議程、前次會議的記錄或溯源檔)。用 Read 逐一開啟比對,檢查:(1) 補充說明所述之來函內容、日期、發文單位,是否與實際郵件相符?(2) 會議資訊(時間、地點、主席、出席者)是否與開會通知一致?若不同文件互相矛盾,指出矛盾並說明何者較新、何者有旁證;(3) 跨會議引用的數值,是否與前次記錄或其溯源檔一致?(4) 記錄自述「已查證」之處,該查證是否確實成立?(5) 交叉參照(「詳見某節」)指向的位置是否存在且正確——結構調整後編號語意漂移是常見問題,且句子單獨讀完全正常。",false
lecture,content-accuracy,"教學講義的知識正確性。檢查:(1) 統計概念定義是否正確(p-value、power、effect size、confidence interval);(2) 公式/數學符號有無寫錯(KaTeX 語法);(3) 心理學理論描述是否準確(如 Higgins, Regulatory Focus/Fit);(4) 因果推論有無把相關說成因果或過度推論;(5) 術語一致性(同概念是否同名);(6) 範例是否恰當支持概念。",false
lecture,student-readability,"從「零程式基礎」學生角度的易懂程度。檢查:(1) 白話程度(專業術語有無解釋);(2) 邏輯銜接(段落跳躍是否太大);(3) 抽象概念有無搭配具體例子;(4) 表格/圖表是否幫助理解(還是增加混淆);(5) 篇幅平衡(重要概念是否足夠篇幅);(6) 結構導航(標題是否清楚、好找);(7)「重點整理」是否真涵蓋最重要內容。自問:「零基礎學生讀到這裡會卡住嗎?」",false
lecture,completeness,"講義是否完整覆蓋上課內容。檢查:(1) 逐字稿覆蓋率(逐字稿有教但講義漏寫的重點,最重要);(2) 結構完整性(有無「重點整理」「課後作業」section;h2/h3 層級正確、無孤立 h3;h2 之間有 --- 分隔);(3) KaTeX/Mermaid(有數學符號處有無 KaTeX CDN、有路徑圖處有無 Mermaid 或 ASCII art);(4) 連結有效性(href 指向的檔案是否存在);(5) 缺少的教學元素(該有 blockquote 提醒、該用表格對比卻只用文字處)。",true
Expand Down
119 changes: 119 additions & 0 deletions plugins/parallel-ai-agents/skills/ensemble-minutes-review/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
---
name: ensemble-minutes-review
description: |
會議記錄 ensemble 審閱:fidelity(忠實性)、completeness(完整性)、attribution(歸屬)、
cross-document(佐證文件對照)、devils-advocate。以會議錄音逐字稿為唯一權威來源,
逐條檢查記錄的每一項陳述是否站得住,並比對來函、開會通知、前次記錄等佐證文件。
Use when: 會議記錄定稿前的事實核對、對外行文前的查核、記錄與逐字稿的一致性驗證。
argument-hint: "MINUTES_FILE --srt TRANSCRIPT [--docs 'path1,path2'] [--replicas N] [--model sonnet|opus]"
allowed-tools:
- Read
- Bash
- Grep
- Glob
- Agent
- TaskCreate
- TaskUpdate
- TaskList
- AskUserQuestion
- Workflow
---

# /ensemble-minutes-review — 會議記錄 Ensemble 審閱

會議記錄的品質關卡不是文筆,是**每一條陳述是否站得住**。這份 skill 派出四個角度互不重疊的
審閱者,加一個魔鬼代言人,全部以逐字稿為唯一權威來源。

## 為什麼不用 academic 或 lecture profile

| profile | 用在會議記錄的問題 |
|---|---|
| `academic` | `methodology` 不適用(記錄沒有研究設計);`reference-verifier` 會去查 Zotero 空轉;`number-verifier` 設計成跑 R/Python 重算,但記錄沒有計算 artifact。四個 lens 有三個空轉或方向錯誤 |
| `lecture` | `completeness` 的「逐字稿覆蓋率」確實對得上,但 `student-readability` 不適用,`content-accuracy` 問的是知識正確性而非「是否忠於逐字稿」 |

會議記錄要問的是**忠實性**(有沒有寫出逐字稿沒有的東西)與**完整性**(有沒有漏掉逐字稿有的
東西),這兩者互為反面,缺一不可。`minutes` profile 為此而設。

## 審閱架構

| Lens | 需要逐字稿 | 問的問題 |
|---|:---:|---|
| `fidelity` | ✓ | 記錄寫的,逐字稿有嗎?推論有沒有被寫成會中決定? |
| `completeness` | ✓ | 逐字稿有的,記錄漏了嗎?不利內容有沒有消失? |
| `attribution` | ✓ | 誰說的、誰要辦,依據何在?未確認者有無被具名? |
| `cross-document` | | 來函、開會通知、前次記錄,對得上嗎?交叉參照指對地方了嗎? |
| `devils-advocate` | ✓ | 上面四位判定「沒問題」的地方,真的沒問題嗎? |

DA 專門盯三種安靜的偏移:把個別發言寫成全體共識、把條件句寫成確定句、把會後才知道的事寫得
像會中已知。這三種在文本上都讀起來很正常。

## 執行流程

### Phase 0:解析輸入

- `MINUTES_FILE`:會議記錄(`.tex` / `.md` / `.docx`)
- `--srt`:**必要**。逐字稿路徑。沒有逐字稿就沒有權威來源,此時應拒絕執行而非降級——
無來源的「審閱」只會產生看起來合理的臆測
- `--docs`:佐證文件路徑,逗號分隔(來函、開會通知、議程、前次會議的記錄或溯源檔)

### Phase 1:組 contextBlock

把下列資訊寫進 `contextBlock` 交給 agent:

1. **任務定性**:這是行政文件的事實查核,不是論文審查;重點不在文筆,在每條陳述是否站得住
2. **佐證文件清單**:逐一列出絕對路徑並說明各是什麼,agent 才知道要 Read 什麼
3. **已知限制**(避免回饋都在講這些):逐字稿字錯率、語者分離是否可靠、哪些專名已知為誤聽、
哪些內容是刻意不記錄的(如製作說明移入註解、敏感內容依指示略去)
4. **已知曾犯的錯**(如果有):給具體實例比給抽象原則有效。例如「曾把『本案屬 top-down 推動』
誤寫為『另備 top-down 計畫書』,把性質誤讀成文件」,agent 會據此找同類錯誤

### Phase 2:派發

```javascript
Workflow({ name: "parallel-ai-agents:pai-ensemble", args: {
profile: "minutes",
file: "<會議記錄絕對路徑>",
srtFile: "<逐字稿絕對路徑>",
contextBlock: "<Phase 1 組好的內容>",
agentModel: "sonnet",
replicas: 1,
codexEnabled: false
}})
```

> ⚠️ **`args` 是物件,不是字串。** 傳字串時 `profile` 解析為 `undefined`,harness 回
> `unknown ensemble profile` 且 **0 個 agent 被派出**——workflow 會「成功」結束,
> 只在 findings 裡留一條 harness 層級的 HIGH。看到 `agents: 0` 就是踩到這個。
>
> ⚠️ **`agentModel` 一定要給。** 不給時 agent 繼承 session 的 main-loop model,
> 高階 session 單輪 ensemble 曾燒掉 56–109 萬 token 並在 session limit 撞死 lens agent。
> 事實核對用 `sonnet` 即可;記錄爭議大或篇幅長再考慮 `opus`。

### Phase 3:讀結果

回傳 `{ findings, verdict, stats }`。`stats.agents` 應等於 lens 數 × replicas + DA;
**明顯偏少就是有 agent 死掉或 profile 沒吃到**,先查 `journal.jsonl` 再解讀 findings。

### Phase 4:處置

findings 逐條回原文核對後才改。**不要照單全收**——審閱者同樣可能誤讀逐字稿,
特別是逐字稿本身字錯率高的時候。改與不改都要能說出理由。

## 與 `sinica-admin:meeting-minutes` 的分工

| | 管什麼 |
|---|---|
| `meeting-minutes` | 產出記錄;`compile.sh` 的機械 gate(破折號、markdown 殘留、寡行、缺字、檔名) |
| 本 skill | 內容是否忠於會議;機械檢查看不出來的東西 |

兩者互補,順序是先產出、機械 gate 過關,再跑 ensemble 查事實。**不要用本 skill 檢查標點或
排版**——那些有確定性的機械檢查,派 LLM 去做既慢又不可靠。

## 反模式

| 想做的 | 為什麼不行 |
|---|---|
| 沒有逐字稿也跑 | 沒有權威來源,審閱者只能憑常識猜「這樣寫合不合理」,產出的是臆測 |
| 用本 skill 抓錯字、標點 | 那是 `compile.sh` 的工作,機械檢查更快更準 |
| findings 直接照改 | 審閱者也會誤讀。每條回原文核對 |
| 把已知限制留給 agent 自己發現 | 會得到一堆「語者未確認」「字錯率高」的重複回饋,淹掉真正的問題 |
Loading
Loading