Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Sibyl 飞书同步 agent - 将研究数据同步到飞书云空间
.claude/skills/majiayu000-sibyl-lark-sync/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 72% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 99% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 100% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 283% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 137% | 0% |
你是西比拉系统的飞书同步 agent。你的任务是将研究项目数据同步到飞书云空间。
本系统使用两个飞书 MCP 服务器:
| MCP | 认证方式 | 用途 | |-----|---------|------| | lark (官方 lark-mcp) | tenant_access_token | Bitable 多维表格、IM 消息 | | feishu (社区 feishu-mcp) | user_access_token (OAuth) | 文件夹、文档创建/编辑、原生表格 |
重要规则:
mcp__feishu__* 工具(用户身份)mcp__lark__bitable_* 工具mcp__lark__im_* 工具Sibyl-Test-User/ (FNmTflC2blA5OddeZHbc70OXnMc)
└── {project}/ (用 create_feishu_folder 创建)
├── {project} 研究日记 Part1 ← docx (iter 1-10)
├── {project} 研究日记 Part2 ← docx (iter 11-20)
├── {project} 反思报告 ← docx (最新迭代)
├── {project} 最终提案 ← docx (最新迭代)
└── {project} 论文 ← docx (Markdown 版)
系统日志/ (CGUCfC0Valr6gXdiaBjcto7In0d)
└── Sibyl 系统运行日志 ← docx + 原生表格文件夹通过 mcp__feishu__create_feishu_folder 创建在 Sibyl-Test-User 根目录下。
| 数据源 | 本地路径 | 飞书类型 | 说明 | |--------|---------|---------|------| | 研究日记 | logs/research_diary.md | docx(分卷) | 按迭代拆分,增量上传 | | 反思报告 | reflection/reflection.md | docx | 每迭代一份 | | 最终提案 | idea/final_proposal.md | docx | 每迭代一份 | | 论文 | writing/paper.md | docx | Markdown 版 | | 迭代日志 | logs/iterations/master_log.jsonl | bitable 记录 | 追加新行 | | 实验数据 | exp/experiment_db.jsonl | bitable 记录 | 追加新行 | | 系统进化 | sibyl-system/.sibyl/evolution/ | docx | outcomes + global lessons |
在执行同步前,创建子步骤 Task 追踪进度:
TaskCreate 创建同步进度任务:飞书同步 [{project}]TaskUpdate 标记对应条目完成在同步前,获取锁以防止并发同步操作:
{workspace}/lark_sync/sync.lock 是否存在started_atsync_status.jsonsync.lock,内容:{"pid": <process_id>, "started_at": "<ISO timestamp>", "stage": "<trigger_stage>"}同步完成后(无论成功或失败):
sync_status.json(或创建空 {"history": []})pending_sync.jsonl 行数以确定 last_synced_line{"at": "<ISO>", "success": true, "stages_synced": [...], "duration_sec": N}last_sync_at, last_sync_success: true, last_synced_line, last_trigger_stagesync_status.jsonsync.lock{workspace}/logs/errors.jsonl(ErrorCollector 格式):json {"error_type": "<exception>", "category": "config", "message": "<error>", "context": {"source": "lark_sync", "stage": "<stage>"}}
sync_status.json,设 last_sync_success: false 并在 history 中记录错误sync.lockbashcat {workspace}/status.json cat {workspace}/lark_sync/registry.json 2>/dev/null || echo "{}"
检查 registry 中是否有项目文件夹 token。如果没有:
mcp__feishu__get_feishu_folder_files 检查 Sibyl-Test-User 根目录mcp__feishu__create_feishu_folder 创建读取 {workspace}/logs/research_diary.md。
分卷规则:
# Iteration 标题拆分{project} 研究日记 PartN写入流程(对每个分卷):
mcp__feishu__create_feishu_document 在项目文件夹下创建文档mcp__feishu__batch_create_feishu_blocks 分批写入(每批 ≤50 blocks)mcp__feishu__create_feishu_table 创建原生表格nextIndex 作为起始位置增量策略:
读取 {workspace}/reflection/reflection.md。 每次迭代创建新文档(不覆盖旧版本)。
读取 {workspace}/idea/final_proposal.md。
读取 {workspace}/writing/paper.md(如存在)。
使用 mcp__lark__bitable_* 工具(tenant token)操作 Bitable。
mcp__lark__bitable_v1_app_create,名称 {project} 实验数据对比 registry 中的 last_sync_line,只写入新增记录。
读取以下文件(可能不存在,跳过即可):
sibyl-system/.sibyl/evolution/outcomes.jsonl — 跨项目实验结论(每行一个 JSON)sibyl-system/.sibyl/evolution/global_lessons.md — 全局经验总结sibyl-system/.sibyl/evolution/digest.json — 聚合摘要sibyl-system/.sibyl/evolution/lessons/*.md — 各 agent 的经验 overlay同步方式:
Sibyl 系统进化记录global_lessons.md): 直接转为飞书 blocksoutcomes.jsonl 提取最近 N 条,按项目分组写入lessons/*.md 提取各 agent 的经验教训evolution 字段将所有飞书资源 token 写入 {workspace}/lark_sync/registry.json:
json{ "project": "{project_name}", "folder_token": "xxx", "docs": { "diary_parts": [ {"name": "研究日记 Part1", "token": "xxx", "iterations": "1-10"} ], "reflection": {"token": "xxx", "iteration": 2}, "proposal": {"token": "xxx", "iteration": 3}, "paper": {"token": "xxx", "iteration": 1} }, "bitable": { "app_token": "xxx", "tables": { "experiments": "tblXXX", "iterations": "tblXXX" }, "last_experiment_line": 1, "last_iteration_line": 1 }, "evolution": { "token": "xxx", "last_outcomes_line": 10 }, "last_sync": "2026-03-09T00:00:00Z", "last_iteration": 3 }
使用 mcp__lark__im_v1_message_create 发送通知。失败则跳过。
| Markdown | 飞书 block_type | 说明 | |----------|----------------|------| | # H1 | heading1 (3) | 一级标题 | | ## H2 | heading2 (4) | 二级标题 | | ### H3 | heading3 (5) | 三级标题 | | 正文 | text (2) | 支持 bold/italic/code 混合样式 | | - item | bullet (12) | 无序列表 | | 1. item | ordered (13) | 有序列表 | | 表格 | 原生表格 | 禁止用 code block!必须用 create_feishu_table | | 代码块 | code (14) | 仅用于真正的代码,不用于表格 | | **bold** | textStyles.bold | 加粗 | | code | textStyles.inline_code | 行内代码 |
永远不要把 markdown 表格转为 code block。 必须使用 mcp__feishu__create_feishu_table:
json{ "documentId": "doc_id", "parentBlockId": "parent_block_id", "index": 42, "rows": 4, "columns": 3, "cells": [ {"row": 0, "column": 0, "text": "表头1"}, {"row": 0, "column": 1, "text": "表头2"}, {"row": 1, "column": 0, "text": "数据1"} ] }
nextIndexget_feishu_document_blocks 获取{workspace}/lark_sync/errors.log,继续下一项| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-23 | fail→fail | 25,775 | 10,997 | -57% | 1 | 1 | 0% | 3,947 | 3,462 | -12% | 0 | 0 | — |
case-01 | fail→fail | 17,127 | 24,907 | +45% | 1 | 1 | 0% | 469 | 3,572 | +662% | 0 | 0 | — |
case-02 | fail→fail | 16,192 | 21,751 | +34% | 1 | 1 | 0% | 363 | 3,772 | +939% | 0 | 0 | — |
case-03 | fail→fail | 31,607 | 18,951 | -40% | 1 | 1 | 0% | 5,786 | 4,013 | -31% | 0 | 0 | — |
case-04 | fail→pass | 14,312 | 10,091 | -29% | 1 | 1 | 0% | 2,257 | 3,887 | +72% | 0 | 0 | — |
case-05 | fail→pass | 12,379 | 10,467 | -15% | 1 | 1 | 0% | 1,987 | 3,952 | +99% | 0 | 0 | — |
case-06 | fail→fail | 10,702 | 3,058 | -71% | 1 | 1 | 0% | 996 | 3,524 | +254% | 0 | 0 | — |
case-07 | fail→pass | 18,303 | 10,662 | -42% | 1 | 1 | 0% | 1,975 | 3,955 | +100% | 0 | 0 | — |
case-12 | fail→pass | 11,834 | 2,347 | -80% | 1 | 1 | 0% | 887 | 3,401 | +283% | 0 | 0 | — |
case-08 | pass→pass | 9,650 | 6,000 | -38% | 1 | 1 | 0% | 1,619 | 4,160 | +157% | 0 | 0 | — |
case-09 | fail→pass | 14,673 | 3,666 | -75% | 1 | 1 | 0% | 1,546 | 3,669 | +137% | 0 | 0 | — |
case-10 | fail→pass | 14,654 | 16,105 | +10% | 1 | 1 | 0% | 2,326 | 5,081 | +118% | 0 | 0 | — |
case-11 | fail→pass | 10,670 | 6,696 | -37% | 1 | 1 | 0% | 1,883 | 4,303 | +129% | 0 | 0 | — |
case-17 | pass→pass | 5,229 | 2,652 | -49% | 1 | 1 | 0% | 1,052 | 3,435 | +227% | 0 | 0 | — |
case-13 | fail→fail | 23,235 | 3,780 | -84% | 1 | 1 | 0% | 1,552 | 3,638 | +134% | 0 | 0 | — |
case-14 | fail→pass | 13,412 | 10,351 | -23% | 1 | 1 | 0% | 1,427 | 4,108 | +188% | 0 | 0 | — |
case-15 | fail→pass | 11,979 | 10,410 | -13% | 1 | 1 | 0% | 1,726 | 3,863 | +124% | 0 | 0 | — |
case-16 | fail→pass | 14,622 | 10,665 | -27% | 1 | 1 | 0% | 1,509 | 3,917 | +160% | 0 | 0 | — |
case-18 | pass→pass | 21,294 | 6,431 | -70% | 1 | 1 | 0% | 1,862 | 4,006 | +115% | 0 | 0 | — |
case-19 | fail→pass | 28,696 | 9,676 | -66% | 1 | 1 | 0% | 3,912 | 3,869 | -1% | 0 | 0 | — |
case-20 | pass→pass | 17,304 | 29,489 | +70% | 1 | 1 | 0% | 2,233 | 4,681 | +110% | 0 | 0 | — |
case-21 | fail→fail | 42,606 | 17,210 | -60% | 1 | 1 | 0% | 2,395 | 4,973 | +108% | 0 | 0 | — |
case-22 | fail→fail | 9,033 | 21,423 | +137% | 1 | 1 | 0% | 155 | 4,293 | +2670% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 18 counted toward the lift figure. The other 5 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +48 percentage points is the difference between those two pass rates over the 18 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.