一键导入
compare-runs
Compare two traced summarize runs from Langfuse and produce a qualitative evaluation of how subjects, descriptions, and speaker contributions changed.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Compare two traced summarize runs from Langfuse and produce a qualitative evaluation of how subjects, descriptions, and speaker contributions changed.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Tag a CalVer release on main, create a GitHub release, and generate a Discord announcement.
Deploy a release to staging or production, or show current deployment status.
Read application logs from the production or staging server via SSH.
Create a new task in the opencouncil-tasks codebase. Use when implementing new features or task handlers.
Write documentation for tasks in the opencouncil-tasks codebase. Use after completing a new task implementation.
| name | compare-runs |
| description | Compare two traced summarize runs from Langfuse and produce a qualitative evaluation of how subjects, descriptions, and speaker contributions changed. |
| argument-hint | <cityId/meetingId> [traceA traceB] |
| allowed-tools | Bash, Read |
Compare two traced summarize runs and evaluate whether the differences are improvements, regressions, or generation noise. Use after re-running summarize on a meeting (e.g. to evaluate a prompt or pipeline change).
Requires LANGFUSE_* env vars in .env (see docs/observability.md).
npm run cli -- runs compare --meeting <cityId/meetingId> # two most recent successful runs
npm run cli -- runs compare <traceA> <traceB> # or explicit trace IDs
This writes data/comparisons/compare-<meeting>-<a>-<b>.{json,html} and prints a per-subject verdict summary (identical / cosmetic / structural).
Interpret the verdict summary first:
Check the runs' prompts: fingerprints (shown by runs list --meeting <...>): identical fingerprints mean any difference is pure generation variance — the noise floor.
Tell the user: where the HTML is (open in browser; Review Mode with ←/→ for skimming).
The comparison JSON can be large (hundreds of KB for big meetings) — do NOT read it whole. Extract a summary first:
node -e '
const d = JSON.parse(require("fs").readFileSync("<json path>", "utf8"));
console.log(JSON.stringify({
sources: d.sources, stats: d.stats, verdictSummary: d.verdictSummary,
matched: d.subjects.matched.map(m => ({ idx: m.agendaItemIndex, matchedBy: m.matchedBy, verdict: m.verdict, name: m.from.name.slice(0,80), changes: m.changes })),
fromOnly: d.subjects.fromOnly.map(s => ({ name: s.name, reason: s.nonAgendaReason })),
toOnly: d.subjects.toOnly.map(s => ({ name: s.name, reason: s.nonAgendaReason })),
}, null, 2))'
Then, for each structural subject (and the largest cosmetic ones if few structural), extract its full data with a targeted node one-liner (filter d.subjects.matched by index) and analyze:
Also check fromOnly/toOnly leftovers for semantic correspondence the name-matching missed (renames with little token overlap), and segmentSamples for summaries that became null or changed type.
Structured markdown, to the terminal:
matchedBy: "name" entries indicate the agenda classification flipped between runs — always report these; classification stability is a known weak point./compare-summarize skill in the opencouncil repo instead.