--- belongs_to: - "[[INDEX · 铸渊·协作指令|GitHub ↔ Notion 桥接协议]]" --- # 📢 铸渊+舒舒指令|飞书SYSLOG全自动闭环 · Claude API唤醒人格体+广播生成+推回飞书原窗口(2026-03-14·霜砚签发) --- > **签发者**:霜砚(Notion执行体) > > **签发时间**:2026-03-14 23:36+08:00(v2.0 更新 23:50) > > **执行者**:铸渊(GitHub执行体)+ 舒舒(飞书机器人) > > **优先级**:P1-重要 > > **前置依赖**:[syslog-pipeline.yml 迁移指令](https://www.notion.so/d76959565bdf41ba80fb40a7dede4a4b)(需先完成) > > **关联指令**: > > - [SYSLOG 自助提交系统 + 全自动闭环 v1.0](https://www.notion.so/58a4bfe3cea74305b2a49ea717d3b510)(Claude API 唤醒方案原始设计) > > - [补丁指令:协议动态注入 + 第三方API自动检测](https://www.notion.so/b07bc29f218a4954a76c581d3e9e1bbf)(API 自动检测 + v4.0 协议注入) > > - [全自动闭环对接规范](https://www.notion.so/c057d868ff5945f88b24b9b798fb3a8f)(铸渊 ↔ 人格体 ↔ Notion Agent 对接) > > - [Secrets ID 对照清单](https://www.notion.so/7ae6fa1f44a3483e9e2ca1e874a68220)(所有 Secrets 汇总) > --- ## 目标 实现**开发者在飞书发日志 → 全自动处理 → 自动收到新广播**的完整闭环。 **核心原则:谁的窗口发了日志,就推回谁的窗口。不走邮件,直接飞书推送。** --- ## v2.0 重大更新说明 --- ## 完整闭环架构 ``` ① 开发者在飞书给舒舒发SYSLOG 舒舒记录 sender_open_id + chat_id ↓ ② 舒舒 repository_dispatch → payload 带上 sender_open_id + chat_id ↓ ③ feishu-syslog-bridge.yml 写入 syslog-inbox/xxx.json → git push ↓ ④ syslog-pipeline.yml 自动触发(根目录 workflows) ↓ ⑤ process-syslog.js 解析SYSLOG ├─ 写入 Notion SYSLOG收件箱(含 sender 信息) └─ 调用 Claude API 唤醒人格体 ← 核心环节 ↓ ⑥ 人格体(Claude API 一次性实例)完整跑闭环: ├─ 读取核心大脑 v4.0 协议(Notion API 动态注入) ├─ 读取开发者画像快照(画像库查询) ├─ 读取模块指纹(指纹注册表查询) ├─ 读取当前广播原文(广播归档页) ├─ 验收SYSLOG → 更新画像 → 更新指纹 ├─ RT-02调度判断 → 生成新广播 └─ broadcast_code_injection = always(一律写完整代码) ↓ ⑦ 人格体输出结果 → pipeline 写入 Notion ├─ 新广播页写入广播归档 ├─ 画像快照写入画像库 ├─ 主控台状态更新 └─ 工单标记「已完成」 ↓ ⑧ 触发 push-broadcast dispatch ├─ 广播内容 + sender_open_id + chat_id └─ broadcast_url = 新广播的 Notion 页面链接 ↓ ⑨ push-broadcast.yml → 调用舒舒 /webhook/push-broadcast ↓ ⑩ 舒舒发飞书消息卡片到原聊天窗口 ↓ ⑪ 开发者在飞书原窗口收到新广播 ✅ ``` --- ## 当前状态 | **环节** | **状态** | **说明** | | --- | --- | --- | | ① 飞书 → 舒舒 → GitHub dispatch | ✅ 已通 | 舒舒识别SYSLOG并转发 | | ② GitHub bridge → syslog-inbox/ | ✅ 已通 | feishu-syslog-bridge.yml | | ③ syslog-pipeline → Notion | ⏳ 修复中 | 等铸渊执行 [🔧 铸渊指令|syslog-pipeline.yml 迁移至根目录 workflows · 修复飞书→Notion自动写入断链(2026-03-14·霜砚签发)](%F0%9F%94%A7%20%E9%93%B8%E6%B8%8A%E6%8C%87%E4%BB%A4%EF%BD%9Csyslog-pipeline%20yml%20%E8%BF%81%E7%A7%BB%E8%87%B3%E6%A0%B9%E7%9B%AE%E5%BD%95%20workflows%20%C2%B7%20%E4%BF%AE%E5%A4%8D%E9%A3%9E%E4%B9%A6%20d76959565bdf41ba80fb40a7dede4a4b.md) | | ④ Claude API 唤醒人格体 | 📋 已设计 | 方案在 [自助系统v1.0](https://www.notion.so/58a4bfe3cea74305b2a49ea717d3b510) • [补丁指令](https://www.notion.so/b07bc29f218a4954a76c581d3e9e1bbf),需铸渊对接飞书入口 | | ⑤ 人格体处理 → 生成广播 | 📋 已设计 | 复用已有的 wake-persona.js + 协议动态注入 | | ⑥ 广播 → 推送回飞书 | ❌ 待开发 | **本指令新增** | --- ## 执行指令(分四部分) --- ## Part 1 · 舒舒代码改造(飞书侧) **文件**:`/var/www/feishu-bot/index.js` **执行者**:冰朔(SSH到服务器修改) ### 改造 1.1 · dispatch payload 带上发送者信息 当前舒舒转发 SYSLOG 时的 `repository_dispatch` payload 需要包含发送者信息: ```jsx // 在 forwardToGitHub 函数中,payload 加上 sender 信息 const payload = { event_type: 'feishu-syslog', client_payload: { syslog: messageContent, source: 'feishu', sender_open_id: event.sender.sender_id.open_id, // 发送者飞书ID chat_id: event.message.chat_id, // 聊天窗口ID sender_name: senderName || 'unknown', // 发送者名称 timestamp: new Date().toISOString() } }; ``` **⚠️ 确保 `sender_open_id` 和 `chat_id` 都传给了 GitHub。这是回推的关键——没有这两个字段,就不知道推给谁。** ### 改造 1.2 · 新增 /webhook/push-broadcast 接口 在舒舒的 Express 服务中新增一个接口,接收广播推送请求: ```jsx // ===== 广播推送接口 ===== app.post('/webhook/push-broadcast', async (req, res) => { try { const { chat_id, sender_open_id, broadcast_title, broadcast_content, broadcast_url, feishu_doc_url } = req.body; // 安全校验 const authToken = req.headers['x-push-token']; if (authToken !== process.env.PUSH_BROADCAST_TOKEN) { return res.status(401).json({ error: 'Unauthorized' }); } // 构建飞书消息卡片 const elements = [ { tag: 'markdown', content: `**${broadcast_title}**\n\n${broadcast_content}` } ]; // 按钮区:Notion广播 + 飞书文档(如果有) const buttons = [{ tag: 'button', text: { tag: 'plain_text', content: '📖 查看完整广播(Notion)' }, url: broadcast_url, type: 'primary' }]; if (feishu_doc_url) { buttons.push({ tag: 'button', text: { tag: 'plain_text', content: '📄 飞书文档版' }, url: feishu_doc_url, type: 'default' }); } elements.push({ tag: 'action', actions: buttons }); elements.push({ tag: 'note', elements: [{ tag: 'plain_text', content: '由舒舒自动推送 · 光湖系统 · 人格体已验收' }] }); const card = { config: { wide_screen_mode: true }, header: { title: { tag: 'plain_text', content: '📡 新广播已生成' }, template: 'green' }, elements }; // 发送到原聊天窗口 const targetId = chat_id || sender_open_id; const idType = chat_id ? 'chat_id' : 'open_id'; await sendFeishuMessage(targetId, idType, { msg_type: 'interactive', card: JSON.stringify(card) }); console.log(`[舒舒·广播推送] ✅ 已推送给 ${targetId}: ${broadcast_title}`); res.json({ success: true, target: targetId }); } catch (err) { console.error('[舒舒·广播推送] ❌ 推送失败:', err.message); res.status(500).json({ error: err.message }); } }); ``` ### 改造 1.3 · 飞书文档写入能力(可选增强) 如果希望舒舒把广播内容**同时写入飞书公共文档**(开发者在飞书里也能看到完整内容),需要: 1. **飞书开放平台** → 应用 `cli_a93f8afaabb89bdb` → 添加权限: - `docx:document:write`(写入文档) - `wiki:wiki`(知识库访问,如果用知识库的话) 2. **舒舒代码新增** `createFeishuDoc()` 函数: ```jsx // 创建飞书文档并写入广播内容 async function createFeishuDoc(title, content, folderId) { const token = await getTenantAccessToken(); // 创建文档 const createRes = await axios.post( 'https://open.feishu.cn/open-apis/docx/v1/documents', { title, folder_token: folderId }, { headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' } } ); const docId = createRes.data.data.document.document_id; // 写入内容(飞书文档 Block API) await axios.post( `https://open.feishu.cn/open-apis/docx/v1/documents/${docId}/blocks/batch_update`, { /* 按飞书文档 Block 格式构建内容 */ }, { headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' } } ); return `https://guanghulab.feishu.cn/docx/${docId}`; } ``` 1. 在推送广播前先创建文档,把文档链接一起推给开发者 **⚠️ 飞书文档写入是增强功能,不影响主链路。主链路优先保证消息卡片推送。** ### 改造 1.4 · .env 新增配置 ```bash # 广播推送接口的安全 token(铸渊 GitHub Secrets 里也要存一份) PUSH_BROADCAST_TOKEN=guanghu-push-2026 # 飞书文档相关(可选,用于写入飞书公共文档) # FEISHU_DOC_FOLDER_TOKEN=飞书文件夹token(放广播文档的文件夹) ``` --- ## Part 2 · 铸渊 GitHub 侧改造 **执行者**:铸渊(读到就做) ### 改造 2.1 · bridge.yml 保留 sender 信息 确认 `feishu-syslog-bridge.yml` 写入 `syslog-inbox/` 的 JSON 中保留了完整 `client_payload`,特别是 `sender_open_id` 和 `chat_id`。 如果当前 bridge 只存了 `syslog` 字段,**需要修改 bridge.yml 保存完整 payload**: ```yaml - name: 📥 写入 syslog-inbox env: SYSLOG_RAW: $\ github.event.client_payload run: | mkdir -p syslog-inbox TIMESTAMP=$(date -u +%Y%m%d-%H%M%S) # 保存完整 payload(含 sender_open_id + chat_id) echo '$\ toJSON(github.event.client_payload) ' > "syslog-inbox/${TIMESTAMP}_feishu.json" ``` ### 改造 2.2 · syslog-pipeline 增加 Claude API 唤醒步骤 `syslog-pipeline.yml` 需要增加以下步骤: ```yaml name: 铸渊 · SYSLOG Pipeline(飞书入口) on: push: paths: - 'syslog-inbox/**' jobs: process-syslog: name: 📡 飞书SYSLOG → syslog-inbox runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: token: $\ secrets.GITHUB_TOKEN # Step 1: 解析 SYSLOG - name: 📥 解析 SYSLOG id: parse run: | # 找到最新的 SYSLOG 文件 LATEST=$(ls -t syslog-inbox/*.json | head -1) echo "file=$LATEST" >> $GITHUB_OUTPUT # 提取 sender 信息(用于后续推回飞书) SENDER_OPEN_ID=$(jq -r '.sender_open_id // empty' "$LATEST") CHAT_ID=$(jq -r '.chat_id // empty' "$LATEST") SENDER_NAME=$(jq -r '.sender_name // empty' "$LATEST") SYSLOG_CONTENT=$(jq -r '.syslog // empty' "$LATEST") echo "sender_open_id=$SENDER_OPEN_ID" >> $GITHUB_OUTPUT echo "chat_id=$CHAT_ID" >> $GITHUB_OUTPUT echo "sender_name=$SENDER_NAME" >> $GITHUB_OUTPUT # Step 2: 写入 Notion SYSLOG 收件箱 - name: 📋 写入 Notion 收件箱 env: NOTION_TOKEN: $\ secrets.NOTION_TOKEN NOTION_DB_SYSLOG: $\ secrets.NOTION_DB_SYSLOG run: node scripts/write-notion-syslog.js "$\ steps.parse.outputs.file " # Step 3: 调用 Claude API 唤醒人格体 - name: 🧠 唤醒人格体处理 SYSLOG env: LLM_API_KEY: $\ secrets.LLM_API_KEY LLM_BASE_URL: $\ secrets.LLM_BASE_URL NOTION_TOKEN: $\ secrets.NOTION_TOKEN CORE_BRAIN_PAGE_ID: $\ secrets.CORE_BRAIN_PAGE_ID PORTRAIT_DB_ID: $\ secrets.PORTRAIT_DB_ID FINGERPRINT_DB_ID: $\ secrets.FINGERPRINT_DB_ID run: | # wake-persona.js 内部流程: # 1. 自动检测第三方 API 可用模型(/v1/models) # 2. 选择最优 Claude 模型 # 3. 通过 Notion API 动态读取: # - 核心大脑 v4.0 协议(BC-GEN/SYSLOG/PGP/RT-02) # - 开发者画像快照(最近2-3条) # - 模块指纹(防重复广播) # - 当前广播原文 # 4. 注入 system prompt + SYSLOG 内容 # 5. 人格体处理:验收→画像→指纹→调度→生成新广播 # 6. broadcast_code_injection = always(一律写完整代码) # 7. 输出结果写入 Notion(新广播页 + 画像 + 主控台) node scripts/wake-persona.js "$\ steps.parse.outputs.file " # Step 4: 推送广播回飞书 - name: 📢 推送广播到飞书 if: success() env: PUSH_URL: https://guanghulab.com/webhook/push-broadcast # nginx → 3003端口 PUSH_TOKEN: $\ secrets.PUSH_BROADCAST_TOKEN run: | # 读取人格体输出的广播信息 BROADCAST_TITLE=$(cat /tmp/broadcast-result.json | jq -r '.title') BROADCAST_CONTENT=$(cat /tmp/broadcast-result.json | jq -r '.summary') BROADCAST_URL=$(cat /tmp/broadcast-result.json | jq -r '.notion_url') curl -X POST "$PUSH_URL" \ -H "Content-Type: application/json" \ -H "x-push-token: $PUSH_TOKEN" \ -d "$(jq -n \ --arg chat_id "$\ steps.parse.outputs.chat_id " \ --arg sender_open_id "$\ steps.parse.outputs.sender_open_id " \ --arg broadcast_title "$BROADCAST_TITLE" \ --arg broadcast_content "$BROADCAST_CONTENT" \ --arg broadcast_url "$BROADCAST_URL" \ '{chat_id: $chat_id, sender_open_id: $sender_open_id, broadcast_title: $broadcast_title, broadcast_content: $broadcast_content, broadcast_url: $broadcast_url}')" echo "✅ 广播已推送到飞书" # Step 5: 归档处理完的 SYSLOG - name: 📦 归档 SYSLOG run: | mkdir -p syslog-processed mv "$\ steps.parse.outputs.file " syslog-processed/ git config user.name "铸渊[bot]" git config user.email "zhu-yuan-bot@guanghulab.com" git add . git diff --staged --quiet || git commit -m "📡 SYSLOG processed: 飞书→人格体→广播→推送 [auto]" git push ``` ### 改造 2.3 · Claude API 唤醒脚本(wake-persona.js) `wake-persona.js` 核心流程(已有设计,此处仅概括): ```jsx // 已有设计(见关联指令),核心步骤: // 1. discoverModels() → 自动检测第三方平台可用 Claude 模型 // 2. selectBestModel() → 按优先级选最优模型 // 3. detectApiFormat() → 自动检测 API 格式(OpenAI兼容 or Anthropic原生) // 4. loadProtocols() → Notion API 读取核心大脑 v4.0 各协议段 // 5. loadDevContext() → 读取开发者画像 + 模块指纹 + 当前广播 // 6. callLLM(systemPrompt, syslogContent) → 唤醒人格体 // 7. parseResult() → 解析人格体输出 // 8. writeToNotion() → 写入新广播 + 画像 + 主控台 // 9. 新增:输出 /tmp/broadcast-result.json 供飞书推送 // === 新增输出(供 Step 4 推送) === const broadcastResult = { title: parsedResult.broadcast_title, // 如 "BC-M-DINGTALK-009-ZZ · DEV-004之之 · Phase 9" summary: parsedResult.broadcast_summary, // 广播摘要(100字以内) notion_url: parsedResult.notion_page_url, // 新广播的 Notion 页面链接 dev_id: parsedResult.dev_id, dev_name: parsedResult.dev_name }; fs.writeFileSync('/tmp/broadcast-result.json', JSON.stringify(broadcastResult)); ``` **关键规则(从补丁指令继承):** - `broadcast_code_injection = always` — 自动化链路出的广播一律写完整代码 - 不硬编码任何模型名和 API 地址,全部走自动检测 - v4.0 协议从 Notion 实时读取,不硬编码到代码里 ### 改造 2.4 · 新建 push-broadcast.yml(独立 workflow,备用) 除了 pipeline 内置的推送步骤,额外创建一个独立 workflow 用于手动触发推送: ```yaml name: 铸渊 · 广播推送飞书(手动/独立触发) on: repository_dispatch: types: [push-broadcast] jobs: push-to-feishu: name: 📢 推送广播到飞书 runs-on: ubuntu-latest steps: - name: 📢 推送广播 env: PUSH_URL: https://guanghulab.com/webhook/push-broadcast # nginx → 3003端口 PUSH_TOKEN: $\ secrets.PUSH_BROADCAST_TOKEN run: | curl -X POST "$PUSH_URL" \ -H "Content-Type: application/json" \ -H "x-push-token: $PUSH_TOKEN" \ -d '$\ toJSON(github.event.client_payload) ' echo "✅ 推送请求已发送" ``` **用途**:当自动链路的推送步骤失败时,可通过 `repository_dispatch` 手动补推。 ### 改造 2.5 · GitHub Secrets 汇总 | **Secret 名称** | **用途** | **状态** | | --- | --- | --- | | `LLM_API_KEY` | 第三方 Claude API 密钥 | ✅ 已配置(见[清单](https://www.notion.so/7ae6fa1f44a3483e9e2ca1e874a68220)) | | `LLM_BASE_URL` | 第三方 API 基础地址 | ✅ 已配置 | | `NOTION_TOKEN` | Notion API Token | ✅ 已配置 | | `NOTION_DB_SYSLOG` | SYSLOG收件箱数据库ID | 需确认(正确值:`330ab17507d542c9bbb96d0749b41197`) | | `CORE_BRAIN_PAGE_ID` | 曜冥核心大脑 v4.0 页面ID | 需配置 | | `PORTRAIT_DB_ID` | 开发者动态画像库数据库ID | 需配置 | | `FINGERPRINT_DB_ID` | 模块指纹注册表数据库ID | 需配置 | | `PUSH_BROADCAST_TOKEN` | 广播推送接口鉴权 | ❌ 新增(值:`guanghu-push-2026`) | --- ## Part 3 · 与已有 GitHub Discussion 入口的关系 --- ## Part 4 · 触发模式 ### 模式 A · 全自动(目标状态·本指令实现) ``` 开发者飞书发SYSLOG → 全自动 → 开发者飞书收到新广播 ``` 整个过程无人参与。pipeline 从解析到唤醒到生成到推送一气呵成。 ### 模式 B · 半自动(过渡状态) 如果 Claude API 唤醒环节还没完全调通,可以先用半自动模式: 1. pipeline 写入 Notion 收件箱 ✅ 2. 冰朔告诉霜砚处理 → 霜砚手动跑闭环 3. 霜砚生成广播后,冰朔说"推给开发者" 4. 霜砚触发 `push-broadcast` dispatch → 推回飞书 ### 模式 C · 手动推送(兜底) 冰朔直接在飞书告诉舒舒: > 推送广播给之之:BC-M-DINGTALK-008-ZZ Phase 8 > 舒舒解析命令 → 查找之之的 chat_id → 直接发送。 --- ## 验收标准 1. ✅ 舒舒 dispatch payload 包含 `sender_open_id` 和 `chat_id` 2. ✅ 舒舒新增 `/webhook/push-broadcast` 接口可用 3. ✅ `syslog-pipeline.yml` 包含 Claude API 唤醒步骤 4. ✅ `wake-persona.js` 输出 `/tmp/broadcast-result.json` 5. ✅ pipeline 最后一步自动调用 push-broadcast 6. ✅ `push-broadcast.yml` 独立 workflow 存在(备用手动推送) 7. ✅ 所有 Secrets 已配置 8. ✅ **端到端测试**:飞书发SYSLOG → 人格体唤醒 → 广播生成 → 飞书原窗口收到广播卡片 --- ## 执行顺序 --- > 霜砚签发 · 2026-03-14 23:36(v2.0 更新 23:50)· 飞书全自动闭环 · Claude API 唤醒 + 广播回推 > --- ## ✅ 执行确认区 铸渊完成 Part 2 后追加: `✅ pipeline 已改造 + wake-persona 已对接 + push-broadcast.yml 已创建 + Secrets 已配置 · [日期时间] · commit SHA` 冰朔完成 Part 1 后追加: `✅ 舒舒 push-broadcast 接口已上线 + sender 信息已加入 payload · [日期时间]` 半自动模式测试通过后追加: `✅ 模式B半自动测试通过 · [日期时间]` 全自动模式测试通过后追加: `✅ 模式A全自动测试通过 · [日期时间] · 开发者飞书窗口已收到AI生成的广播`