shuangyan-notebook/第五域 · Fifth Domain/⚒️ 铸渊·协作指令|GitHub ↔ Notion 桥接协议/📢 铸渊+舒舒指令|飞书SYSLOG全自动闭环 · Claude API唤醒人格体+广播生成+推回飞 f5af20c46ee941e68b4ec3ede8e0e629.md
Guanghu Domestic Migration a27e87cb99 chore: import sanitized domestic snapshot for REPO-007
Source snapshot: 97d7f0fae96dc04b7ddad56fc1db6a108ed662cc

[SEC-CLEAN] · pre-push-clean v1.0 · 109处敏感信息已自动转乱码
2026-07-17 15:59:55 +08:00

22 KiB
Raw Permalink Blame History

belongs_to
belongs_to
INDEX · 铸渊·协作指令GitHub ↔ Notion 桥接协议

📢 铸渊+舒舒指令飞书SYSLOG全自动闭环 · Claude API唤醒人格体+广播生成+推回飞书原窗口2026-03-14·霜砚签发


签发者霜砚Notion执行体

签发时间2026-03-14 23:36+08:00v2.0 更新 23:50

执行者铸渊GitHub执行体+ 舒舒(飞书机器人)

优先级P1-重要

前置依赖syslog-pipeline.yml 迁移指令(需先完成)

关联指令


目标

实现开发者在飞书发日志 → 全自动处理 → 自动收到新广播的完整闭环。

核心原则:谁的窗口发了日志,就推回谁的窗口。不走邮件,直接飞书推送。


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·霜砚签发
④ Claude API 唤醒人格体 📋 已设计 方案在 自助系统v1.0补丁指令,需铸渊对接飞书入口
⑤ 人格体处理 → 生成广播 📋 已设计 复用已有的 wake-persona.js + 协议动态注入
⑥ 广播 → 推送回飞书 待开发 本指令新增

执行指令(分四部分)


Part 1 · 舒舒代码改造(飞书侧)

文件/var/www/feishu-bot/index.js

执行者冰朔SSH到服务器修改

改造 1.1 · dispatch payload 带上发送者信息

当前舒舒转发 SYSLOG 时的 repository_dispatch payload 需要包含发送者信息:

// 在 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_idchat_id 都传给了 GitHub。这是回推的关键——没有这两个字段就不知道推给谁。

改造 1.2 · 新增 /webhook/push-broadcast 接口

在舒舒的 Express 服务中新增一个接口,接收广播推送请求:

// ===== 广播推送接口 =====
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() 函数:
// 创建飞书文档并写入广播内容
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 新增配置

# 广播推送接口的安全 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_idchat_id

如果当前 bridge 只存了 syslog 字段,需要修改 bridge.yml 保存完整 payload

- 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 需要增加以下步骤:

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 核心流程(已有设计,此处仅概括):

// 已有设计(见关联指令),核心步骤:
// 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 用于手动触发推送:

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 密钥 已配置(见清单
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_idchat_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:36v2.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生成的广播