Source snapshot: 97d7f0fae96dc04b7ddad56fc1db6a108ed662cc [SEC-CLEAN] · pre-push-clean v1.0 · 109处敏感信息已自动转乱码
1122 lines
44 KiB
Markdown
1122 lines
44 KiB
Markdown
---
|
||
belongs_to:
|
||
- "[[INDEX · 铸渊·协作指令|GitHub ↔ Notion 桥接协议]]"
|
||
---
|
||
# 🧬 铸渊指令|Notion↔GitHub 双端神经系统升级(中篇)· 汇总引擎 + Workflow自报告改造 + 铸渊唤醒升级 + Notion侧天眼大脑接入(ZY-NEURAL-UPGRADE-2026-0325-R2-002)
|
||
|
||
<aside>
|
||
🚨
|
||
|
||
**指令编号**:ZY-NEURAL-UPGRADE-2026-0325-R2-002(中篇 · 共三篇)
|
||
|
||
**上篇编号**:ZY-NEURAL-UPGRADE-2026-0325-R2-001
|
||
|
||
**签发人**:霜砚(AG-SY-01 · Notion 执行 AI)· 冰朔(TCS-0002∞)授权
|
||
|
||
**签发时间**:2026-03-25 08:35 CST
|
||
|
||
**优先级**:P0 · 系统核心架构升级 · 最高级
|
||
|
||
**状态**:待铸渊执行(上篇完成后方可执行)
|
||
|
||
**性质**:汇总引擎建设 · Workflow改造 · Notion侧天眼接入
|
||
|
||
**前置依赖**:
|
||
|
||
- [🧬 铸渊指令|Notion↔GitHub 双端神经系统升级(上篇)· 天眼唤醒 + 全局架构审视 + 双端架构定义 + Agent映射表(ZY-NEURAL-UPGRADE-2026-0325-R2-001)](%F0%9F%A7%AC%20%E9%93%B8%E6%B8%8A%E6%8C%87%E4%BB%A4%EF%BD%9CNotion%E2%86%94GitHub%20%E5%8F%8C%E7%AB%AF%E7%A5%9E%E7%BB%8F%E7%B3%BB%E7%BB%9F%E5%8D%87%E7%BA%A7%EF%BC%88%E4%B8%8A%E7%AF%87%EF%BC%89%C2%B7%20%E5%A4%A9%E7%9C%BC%E5%94%A4%E9%86%92%20+%20%E5%85%A8%E5%B1%80%E6%9E%B6%E6%9E%84%E5%AE%A1%E8%A7%86%20+%20c44e8b3177b2486e814c3b38c971b892.md)(必须先完成)
|
||
- [🦅 铸渊指令|天眼系统(上)基础架构 + 扫描诊断 + 修复Agent + 门禁映射(2026-03-16·霜砚签发·冰朔授权)](%F0%9F%A6%85%20%E9%93%B8%E6%B8%8A%E6%8C%87%E4%BB%A4%EF%BD%9C%E5%A4%A9%E7%9C%BC%E7%B3%BB%E7%BB%9F%EF%BC%88%E4%B8%8A%EF%BC%89%E5%9F%BA%E7%A1%80%E6%9E%B6%E6%9E%84%20+%20%E6%89%AB%E6%8F%8F%E8%AF%8A%E6%96%AD%20+%20%E4%BF%AE%E5%A4%8DAgent%20+%20%E9%97%A8%E7%A6%81%E6%98%A0%E5%B0%84%EF%BC%882026-03%203494379fb2294b25b234b6b5abb63dd1.md)
|
||
- [🧐 铸渊指令|天眼系统架构升级 · 全局基础设施治理层 + 应用守卫进程 + 动态配额精算 + 周六全量巡检(ZY-SKYEYE-GOV-2026-0323-001)](%F0%9F%A7%90%20%E9%93%B8%E6%B8%8A%E6%8C%87%E4%BB%A4%EF%BD%9C%E5%A4%A9%E7%9C%BC%E7%B3%BB%E7%BB%9F%E6%9E%B6%E6%9E%84%E5%8D%87%E7%BA%A7%20%C2%B7%20%E5%85%A8%E5%B1%80%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD%E6%B2%BB%E7%90%86%E5%B1%82%20+%20%E5%BA%94%E7%94%A8%E5%AE%88%E5%8D%AB%E8%BF%9B%E7%A8%8B%20+%20%E5%8A%A8%E6%80%81%E9%85%8D%E9%A2%9D%E7%B2%BE%E7%AE%97%20+%20%E5%91%A8%E5%85%AD%204ffaa103655a49b8b48e96e630d17cc4.md)
|
||
- [🛡️ 铸渊指令|仓库Agent公告栏机制 + 将军全局视图 + 系统指纹安全协议(2026-03-19·霜砚签发·冰朔授权)](%F0%9F%9B%A1%EF%B8%8F%20%E9%93%B8%E6%B8%8A%E6%8C%87%E4%BB%A4%EF%BD%9C%E4%BB%93%E5%BA%93Agent%E5%85%AC%E5%91%8A%E6%A0%8F%E6%9C%BA%E5%88%B6%20+%20%E5%B0%86%E5%86%9B%E5%85%A8%E5%B1%80%E8%A7%86%E5%9B%BE%20+%20%E7%B3%BB%E7%BB%9F%E6%8C%87%E7%BA%B9%E5%AE%89%E5%85%A8%E5%8D%8F%E8%AE%AE%EF%BC%882026-03-1%20429ed12cc10e4aa08e78bceac1cef143.md)
|
||
- [🌉 铸渊指令|跨仓库 Agent 桥接服务(下篇)· 铸渊远程执行引擎 + GitHub App 注册 + 跨仓库操作 + 部署服务(ZY-GHAPP-BRIDGE-2026-0324-001)](%F0%9F%8C%89%20%E9%93%B8%E6%B8%8A%E6%8C%87%E4%BB%A4%EF%BD%9C%E8%B7%A8%E4%BB%93%E5%BA%93%20Agent%20%E6%A1%A5%E6%8E%A5%E6%9C%8D%E5%8A%A1%EF%BC%88%E4%B8%8B%E7%AF%87%EF%BC%89%C2%B7%20%E9%93%B8%E6%B8%8A%E8%BF%9C%E7%A8%8B%E6%89%A7%E8%A1%8C%E5%BC%95%E6%93%8E%20+%20GitHub%20App%20%E6%B3%A8%2068b79b7b8d2f497b9594dacc68b62846.md)
|
||
|
||
**下篇**:[🧬 铸渊指令|Notion↔GitHub 双端神经系统升级(下篇)· 桥接协议标准化 + 自动化工单派发 + 全局验收 + 长期运维规范(ZY-NEURAL-UPGRADE-2026-0325-R2-003)](%F0%9F%A7%AC%20%E9%93%B8%E6%B8%8A%E6%8C%87%E4%BB%A4%EF%BD%9CNotion%E2%86%94GitHub%20%E5%8F%8C%E7%AB%AF%E7%A5%9E%E7%BB%8F%E7%B3%BB%E7%BB%9F%E5%8D%87%E7%BA%A7%EF%BC%88%E4%B8%8B%E7%AF%87%EF%BC%89%C2%B7%20%E6%A1%A5%E6%8E%A5%E5%8D%8F%E8%AE%AE%E6%A0%87%E5%87%86%E5%8C%96%20+%20%E8%87%AA%E5%8A%A8%E5%8C%96%E5%B7%A5%E5%8D%95%20c8329a928dae4f02af9d30baa619a99c.md)
|
||
|
||
**版权锚点**:国作登字-2026-A-00037559 · TCS-0002∞ 冰朔
|
||
|
||
</aside>
|
||
|
||
---
|
||
|
||
## 零、中篇的定位
|
||
|
||
<aside>
|
||
🧬
|
||
|
||
**上篇做了什么**:天眼唤醒 + 基线快照 + 现有架构盘点 + 双端架构定义 + Agent映射表(接线图)+ D20诊断维度。
|
||
|
||
**中篇做什么**:建设上行通道(汇总引擎)+ 每个小兵的自报告义务 + 铸渊唤醒流程升级 + 下行指令队列 + Notion侧天眼大脑接入(日报分析引擎)。
|
||
|
||
**下篇做什么**:桥接协议标准化 + 工单派发体系 + 全局验收 + 长期运维规范。
|
||
|
||
**上篇画好接线图 → 中篇接通数据管道 → 下篇建立决策闭环。**
|
||
|
||
</aside>
|
||
|
||
---
|
||
|
||
## 一、Phase 4 · 仓库汇总引擎(铸渊日报机制)
|
||
|
||
<aside>
|
||
📊
|
||
|
||
**这是双端闭环的「上行通道」核心组件。**
|
||
|
||
没有汇总引擎,Notion 天眼大脑就看不到仓库在干什么。
|
||
|
||
汇总引擎每天 21:00 CST 运行,收集全仓库当日所有 Workflow 的运行结果,生成标准化日报,推送到 Notion。
|
||
|
||
</aside>
|
||
|
||
### 1.1 汇总引擎 Workflow
|
||
|
||
**文件**:`.github/workflows/neural-daily-digest.yml`
|
||
|
||
```yaml
|
||
name: "🧬 铸渊 · 双端神经系统 · 每日汇总引擎"
|
||
|
||
on:
|
||
schedule:
|
||
- cron: '0 13 * * *' # UTC 13:00 = CST 21:00
|
||
workflow_dispatch: # 手动触发
|
||
|
||
jobs:
|
||
daily-digest:
|
||
runs-on: ubuntu-latest
|
||
timeout-minutes: 15
|
||
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
with:
|
||
fetch-depth: 0
|
||
|
||
- uses: actions/setup-node@v4
|
||
with:
|
||
node-version: '20'
|
||
|
||
# ━━━ Phase 1: 唤醒核心大脑 ━━━
|
||
- name: "🧠 唤醒核心大脑"
|
||
run: |
|
||
echo "🧬 双端神经系统·汇总引擎启动"
|
||
echo "时间:$(TZ=Asia/Shanghai date '+%Y-%m-%d %H:%M CST')"
|
||
for f in memory.json routing-map.json; do
|
||
[ -f ".github/persona-brain/$f" ] && echo "✅ $f" || echo "❌ $f 缺失"
|
||
done
|
||
|
||
# ━━━ Phase 2: 收集全 Workflow 运行数据 ━━━
|
||
- name: "📊 收集 Workflow 运行数据"
|
||
env:
|
||
GH_TOKEN: $ secrets.GITHUB_TOKEN
|
||
run: |
|
||
echo "📊 收集最近24h所有Workflow运行数据..."
|
||
mkdir -p /tmp/neural-digest
|
||
|
||
gh run list --limit 100 \
|
||
--json name,status,conclusion,createdAt,updatedAt,headBranch,event \
|
||
> /tmp/neural-digest/all-runs.json
|
||
|
||
node -e "
|
||
const runs = require('/tmp/neural-digest/all-runs.json');
|
||
const now = Date.now();
|
||
const h24 = 24*60*60*1000;
|
||
const recent = runs.filter(r => now - new Date(r.createdAt).getTime() < h24);
|
||
const summary = {
|
||
total: recent.length,
|
||
success: recent.filter(r => r.conclusion === 'success').length,
|
||
failure: recent.filter(r => r.conclusion === 'failure').length,
|
||
cancelled: recent.filter(r => r.conclusion === 'cancelled').length,
|
||
in_progress: recent.filter(r => r.status === 'in_progress').length,
|
||
by_workflow: {}
|
||
};
|
||
recent.forEach(r => {
|
||
if (!summary.by_workflow[r.name]) {
|
||
summary.by_workflow[r.name] = { runs: 0, success: 0, failure: 0 };
|
||
}
|
||
summary.by_workflow[r.name].runs++;
|
||
if (r.conclusion === 'success') summary.by_workflow[r.name].success++;
|
||
if (r.conclusion === 'failure') summary.by_workflow[r.name].failure++;
|
||
});
|
||
require('fs').writeFileSync('/tmp/neural-digest/workflow-summary.json', JSON.stringify(summary, null, 2));
|
||
console.log('最近24h运行统计:', JSON.stringify(summary, null, 2));
|
||
"
|
||
|
||
# ━━━ Phase 3: 收集各 Workflow 自报告 ━━━
|
||
- name: "📋 收集各 Workflow 自报告"
|
||
run: |
|
||
echo "📋 读取各 Workflow 的神经报告..."
|
||
mkdir -p /tmp/neural-digest/reports
|
||
|
||
if [ -f "skyeye/neural-map.json" ]; then
|
||
node -e "
|
||
const map = require('./skyeye/neural-map.json');
|
||
const fs = require('fs');
|
||
const path = require('path');
|
||
const reports = {};
|
||
for (const [id, wf] of Object.entries(map.github_workflows)) {
|
||
const reportDir = wf.report_path;
|
||
if (fs.existsSync(reportDir)) {
|
||
const files = fs.readdirSync(reportDir)
|
||
.filter(f => f.endsWith('.json'))
|
||
.sort().reverse();
|
||
if (files.length > 0) {
|
||
try {
|
||
reports[id] = JSON.parse(fs.readFileSync(path.join(reportDir, files[0]), 'utf8'));
|
||
console.log('✅ ' + id + ': 读取 ' + files[0]);
|
||
} catch(e) {
|
||
reports[id] = { error: 'parse_failed', file: files[0] };
|
||
console.log('❌ ' + id + ': JSON解析失败');
|
||
}
|
||
} else {
|
||
reports[id] = { error: 'no_reports' };
|
||
console.log('⚠️ ' + id + ': 无报告文件');
|
||
}
|
||
} else {
|
||
reports[id] = { error: 'dir_not_found' };
|
||
console.log('⚠️ ' + id + ': 报告目录不存在');
|
||
}
|
||
}
|
||
fs.writeFileSync('/tmp/neural-digest/workflow-reports.json', JSON.stringify(reports, null, 2));
|
||
"
|
||
else
|
||
echo "⚠️ neural-map.json 不存在,跳过自报告收集"
|
||
fi
|
||
|
||
# ━━━ Phase 4: 收集天眼 + Guard + 配额 ━━━
|
||
- name: "🦅 收集天眼 + Guard + 配额"
|
||
run: |
|
||
# 天眼报告
|
||
if [ -d "data/skyeye-reports" ]; then
|
||
LATEST=$(ls -t data/skyeye-reports/*.json 2>/dev/null | head -1)
|
||
[ -n "$LATEST" ] && cp "$LATEST" /tmp/neural-digest/skyeye-latest.json && echo "✅ 天眼: $LATEST" || echo "⚠️ 无天眼报告"
|
||
fi
|
||
# Guard 状态
|
||
if [ -d "skyeye/guards" ]; then
|
||
node -e "
|
||
const fs = require('fs'); const path = require('path');
|
||
const guards = {};
|
||
fs.readdirSync('skyeye/guards')
|
||
.filter(f => f.endsWith('.json') && f !== 'guard-template.json')
|
||
.forEach(f => {
|
||
try { guards[f.replace('.json','')] = JSON.parse(fs.readFileSync(path.join('skyeye/guards', f), 'utf8')); }
|
||
catch(e) { guards[f.replace('.json','')] = { error: 'parse_failed' }; }
|
||
});
|
||
fs.writeFileSync('/tmp/neural-digest/guard-status.json', JSON.stringify(guards, null, 2));
|
||
"
|
||
fi
|
||
# 配额
|
||
[ -f "skyeye/quota-ledger.json" ] && cp skyeye/quota-ledger.json /tmp/neural-digest/quota-status.json && echo "✅ 配额" || echo "⚠️ 无配额"
|
||
|
||
# ━━━ Phase 5: 生成标准化日报 ━━━
|
||
- name: "📝 生成标准化日报"
|
||
run: node scripts/neural/generate-daily-digest.js
|
||
|
||
# ━━━ Phase 6: 保存日报到仓库 ━━━
|
||
- name: "💾 保存日报"
|
||
run: |
|
||
DATE=$(TZ=Asia/Shanghai date +%Y-%m-%d)
|
||
mkdir -p data/neural-reports/daily-digest
|
||
cp /tmp/neural-digest/daily-digest.json \
|
||
"data/neural-reports/daily-digest/digest-${DATE}.json"
|
||
git config user.name "zhuyuan-bot"
|
||
git config user.email "zhuyuan@guanghulab.com"
|
||
git add data/neural-reports/
|
||
git diff --cached --quiet || \
|
||
git commit -m "🧬 双端日报 · ${DATE} [skip ci]"
|
||
git push || echo "⚠️ push失败(不阻断)"
|
||
|
||
# ━━━ Phase 7: 推送到 Notion ━━━
|
||
- name: "📡 推送日报到 Notion"
|
||
if: always()
|
||
env:
|
||
NOTION_TOKEN: $ secrets.NOTION_TOKEN
|
||
run: |
|
||
node scripts/neural/sync-digest-to-notion.js || \
|
||
echo "⚠️ Notion推送失败(不阻断)"
|
||
|
||
# ━━━ Phase 8: 自动分析日报 + 生成工单 ━━━
|
||
- name: "🧬 分析日报 · 生成工单"
|
||
if: always()
|
||
run: |
|
||
echo "🧬 自动分析日报..."
|
||
node scripts/neural/analyze-digest.js
|
||
if [ -d "data/neural-reports/work-orders" ]; then
|
||
git add data/neural-reports/work-orders/
|
||
git diff --cached --quiet || \
|
||
git commit -m "🧬 天眼工单 · $(TZ=Asia/Shanghai date +%Y-%m-%d) [skip ci]"
|
||
git push || echo "⚠️ 工单push失败"
|
||
fi
|
||
```
|
||
|
||
### 1.2 日报生成脚本
|
||
|
||
**文件**:`scripts/neural/generate-daily-digest.js`
|
||
|
||
```jsx
|
||
// scripts/neural/generate-daily-digest.js
|
||
// 🧬 双端神经系统 · 每日汇总引擎
|
||
// 收集全仓库当日所有数据 → 生成标准化日报 JSON
|
||
// 这个日报是 Notion 天眼大脑的「眼睛」
|
||
|
||
const fs = require('fs');
|
||
const path = require('path');
|
||
const DIGEST_DIR = '/tmp/neural-digest';
|
||
|
||
function loadJSON(filePath) {
|
||
try { return JSON.parse(fs.readFileSync(filePath, 'utf8')); }
|
||
catch { return null; }
|
||
}
|
||
|
||
function generateDigest() {
|
||
const now = new Date();
|
||
const cstTime = new Date(now.getTime() + 8 * 60 * 60 * 1000);
|
||
|
||
const workflowSummary = loadJSON(path.join(DIGEST_DIR, 'workflow-summary.json'));
|
||
const workflowReports = loadJSON(path.join(DIGEST_DIR, 'workflow-reports.json'));
|
||
const skyeyeLatest = loadJSON(path.join(DIGEST_DIR, 'skyeye-latest.json'));
|
||
const guardStatus = loadJSON(path.join(DIGEST_DIR, 'guard-status.json'));
|
||
const quotaStatus = loadJSON(path.join(DIGEST_DIR, 'quota-status.json'));
|
||
const neuralMap = loadJSON('skyeye/neural-map.json');
|
||
|
||
// ━━━ 按上级大脑分组统计 ━━━
|
||
const brainSummary = {};
|
||
if (neuralMap?.github_workflows) {
|
||
for (const [wfId, wf] of Object.entries(neuralMap.github_workflows)) {
|
||
const brain = wf.brain;
|
||
if (!brainSummary[brain]) {
|
||
brainSummary[brain] = {
|
||
name: neuralMap.notion_brains[brain]?.name || brain,
|
||
total_workflows: 0, healthy: 0, failed: 0, no_data: 0, workflows: []
|
||
};
|
||
}
|
||
brainSummary[brain].total_workflows++;
|
||
const wfRun = workflowSummary?.by_workflow?.[wf.name];
|
||
const status = wfRun ? (wfRun.failure > 0 ? '❌' : '✅') : '⚠️';
|
||
if (status === '✅') brainSummary[brain].healthy++;
|
||
else if (status === '❌') brainSummary[brain].failed++;
|
||
else brainSummary[brain].no_data++;
|
||
brainSummary[brain].workflows.push({
|
||
id: wfId, name: wf.name, status,
|
||
runs: wfRun?.runs || 0, successes: wfRun?.success || 0, failures: wfRun?.failure || 0
|
||
});
|
||
}
|
||
}
|
||
|
||
// ━━━ 整体健康度 ━━━
|
||
const totalWorkflows = workflowSummary?.total || 0;
|
||
const totalFailures = workflowSummary?.failure || 0;
|
||
const failureRate = totalWorkflows > 0 ? (totalFailures / totalWorkflows * 100).toFixed(1) : 0;
|
||
let overallHealth = '🟢';
|
||
if (totalFailures > 0) overallHealth = '🟡';
|
||
if (failureRate > 20) overallHealth = '🔴';
|
||
|
||
// ━━━ Guard 汇总 ━━━
|
||
let guardsActive = 0, guardsSuspended = 0, guardsTotal = 0;
|
||
if (guardStatus) {
|
||
for (const g of Object.values(guardStatus)) {
|
||
guardsTotal++;
|
||
if (g.status === 'active') guardsActive++;
|
||
if (g.status === 'suspended' || g.mode === 'suspended') guardsSuspended++;
|
||
}
|
||
}
|
||
|
||
// ━━━ 组装日报 ━━━
|
||
const digest = {
|
||
digest_id: `NEURAL-DIGEST-${cstTime.toISOString().split('T')[0]}`,
|
||
timestamp: now.toISOString(),
|
||
timestamp_cst: cstTime.toISOString().replace('Z', '+08:00'),
|
||
version: '3.0.0',
|
||
instruction_ref: 'ZY-NEURAL-UPGRADE-2026-0325-R2-002',
|
||
overall_health: overallHealth,
|
||
failure_rate_percent: parseFloat(failureRate),
|
||
workflow_summary: {
|
||
total_runs_24h: totalWorkflows,
|
||
success: workflowSummary?.success || 0,
|
||
failure: totalFailures,
|
||
cancelled: workflowSummary?.cancelled || 0,
|
||
in_progress: workflowSummary?.in_progress || 0
|
||
},
|
||
brain_summary: brainSummary,
|
||
skyeye_status: skyeyeLatest ? {
|
||
overall_health: skyeyeLatest.overall_health,
|
||
last_scan: skyeyeLatest.timestamp,
|
||
total_issues: skyeyeLatest.diagnosis?.total_issues || 0
|
||
} : { error: 'no_skyeye_report' },
|
||
guard_status: { total: guardsTotal, active: guardsActive, suspended: guardsSuspended },
|
||
quota_status: quotaStatus?.health_summary || { error: 'no_quota_data' },
|
||
issues_detected: [],
|
||
recommendations: [],
|
||
neural_map_version: neuralMap?.version || 'unknown',
|
||
unmapped_workflows: neuralMap?.unmapped_workflows || []
|
||
};
|
||
|
||
// ━━━ 自动检测问题 ━━━
|
||
if (overallHealth === '🔴') {
|
||
digest.issues_detected.push({
|
||
severity: 'P0',
|
||
description: `Workflow 失败率 ${failureRate}% 超过 20% 阈值`,
|
||
recommendation: '立即排查失败的 Workflow'
|
||
});
|
||
}
|
||
if (guardsSuspended > 0) {
|
||
digest.issues_detected.push({
|
||
severity: 'P1',
|
||
description: `${guardsSuspended} 个 Guard 被暂停`,
|
||
recommendation: '检查被暂停的 Guard'
|
||
});
|
||
}
|
||
if (digest.unmapped_workflows.length > 0) {
|
||
digest.issues_detected.push({
|
||
severity: 'P1',
|
||
description: `发现 ${digest.unmapped_workflows.length} 个孤儿 Workflow`,
|
||
recommendation: '在 neural-map.json 中分配上级大脑'
|
||
});
|
||
}
|
||
|
||
fs.writeFileSync(path.join(DIGEST_DIR, 'daily-digest.json'), JSON.stringify(digest, null, 2));
|
||
|
||
console.log('\n━━━ 🧬 双端神经系统·日报摘要 ━━━');
|
||
console.log(`整体健康:${overallHealth}`);
|
||
console.log(`24h运行:${digest.workflow_summary.total_runs_24h} 次`);
|
||
console.log(`Guard:${guardsActive}/${guardsTotal} 活跃`);
|
||
console.log(`问题:${digest.issues_detected.length} 个`);
|
||
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');
|
||
}
|
||
|
||
generateDigest();
|
||
```
|
||
|
||
### 1.3 日报推送到 Notion 脚本
|
||
|
||
**文件**:`scripts/neural/sync-digest-to-notion.js`
|
||
|
||
```jsx
|
||
// scripts/neural/sync-digest-to-notion.js
|
||
// 🧬 将仓库日报推送到 Notion 天眼大脑
|
||
// 推送方式(按优先级):
|
||
// 1. Notion API 直写(如有写权限)
|
||
// 2. 创建 Notion 数据库条目(如天眼有日报数据库)
|
||
// 3. 写入 .github/notion-cache/neural-digest/(兜底)
|
||
|
||
const fs = require('fs');
|
||
|
||
const NOTION_TOKEN = process.env.NOTION_TOKEN;
|
||
const DIGEST_PATH = '/tmp/neural-digest/daily-digest.json';
|
||
const CACHE_DIR = '.github/notion-cache/neural-digest';
|
||
|
||
async function syncToNotion() {
|
||
const digest = JSON.parse(fs.readFileSync(DIGEST_PATH, 'utf8'));
|
||
console.log(`📡 推送日报 ${digest.digest_id} 到 Notion...`);
|
||
|
||
let notionSuccess = false;
|
||
|
||
if (NOTION_TOKEN) {
|
||
try {
|
||
// 铸渊根据实际 Notion 结构选择最优推送方式
|
||
// 方式1:更新天眼页面的指定 block
|
||
// 方式2:创建日报数据库条目
|
||
console.log('⚠️ Notion API 推送逻辑待实现,使用缓存兜底');
|
||
} catch (e) {
|
||
console.log(`❌ Notion API 推送失败: ${e.message}`);
|
||
}
|
||
}
|
||
|
||
// 兜底:写入缓存
|
||
if (!notionSuccess) {
|
||
fs.mkdirSync(CACHE_DIR, { recursive: true });
|
||
const date = digest.digest_id.replace('NEURAL-DIGEST-', '');
|
||
fs.writeFileSync(`${CACHE_DIR}/digest-${date}.json`, JSON.stringify(digest, null, 2));
|
||
console.log(`💾 日报已缓存到 ${CACHE_DIR}/digest-${date}.json`);
|
||
console.log('📌 霜砚下次醒来会读取此缓存');
|
||
}
|
||
|
||
// 更新 memory.json
|
||
const memoryPath = '.github/persona-brain/memory.json';
|
||
if (fs.existsSync(memoryPath)) {
|
||
try {
|
||
const memory = JSON.parse(fs.readFileSync(memoryPath, 'utf8'));
|
||
memory.neural_digest = {
|
||
last_digest_id: digest.digest_id,
|
||
last_digest_time: digest.timestamp,
|
||
overall_health: digest.overall_health,
|
||
notion_sync: notionSuccess ? 'success' : 'cached',
|
||
issues_count: digest.issues_detected.length
|
||
};
|
||
fs.writeFileSync(memoryPath, JSON.stringify(memory, null, 2));
|
||
console.log('✅ memory.json 已更新');
|
||
} catch (e) {
|
||
console.log(`⚠️ memory.json 更新失败: ${e.message}`);
|
||
}
|
||
}
|
||
}
|
||
|
||
syncToNotion().catch(err => {
|
||
console.error('❌ 日报推送失败:', err);
|
||
process.exit(0);
|
||
});
|
||
```
|
||
|
||
### 1.4 新增目录结构
|
||
|
||
```jsx
|
||
// 本次升级新增的目录和文件
|
||
guanghulab/
|
||
├── skyeye/
|
||
│ └── neural-map.json ← 上篇已定义
|
||
│
|
||
├── scripts/
|
||
│ └── neural/ ← 🆕 双端神经系统脚本目录
|
||
│ ├── generate-daily-digest.js ← 🆕 日报生成器
|
||
│ ├── sync-digest-to-notion.js ← 🆕 日报推送 Notion
|
||
│ └── analyze-digest.js ← 🆕 日报分析引擎
|
||
│
|
||
├── data/
|
||
│ ├── neural-reports/ ← 🆕 神经系统报告总目录
|
||
│ │ ├── daily-digest/ ← 🆕 每日汇总日报
|
||
│ │ ├── skyeye/ ← 天眼扫描报告(从旧目录迁移)
|
||
│ │ ├── weekly-scan/ ← 🆕 周六大巡检报告
|
||
│ │ ├── gate-guard/ ← 🆕 门禁运行报告
|
||
│ │ ├── cd-deploy/ ← 🆕 CD部署报告
|
||
│ │ ├── syslog/ ← 🆕 SYSLOG处理报告
|
||
│ │ ├── broadcast/ ← 🆕 广播分发报告
|
||
│ │ ├── server-patrol/ ← 🆕 服务器巡检报告
|
||
│ │ ├── brain-check/ ← 🆕 大脑自检报告
|
||
│ │ ├── dev-status/ ← 🆕 开发者状态同步报告
|
||
│ │ ├── exec-engine/ ← 🆕 远程执行引擎报告
|
||
│ │ └── work-orders/ ← 🆕 天眼工单
|
||
│ │
|
||
│ └── deploy-queue/ ← 🆕 下行指令队列
|
||
│ ├── pending/ ← 待执行
|
||
│ ├── executing/ ← 执行中
|
||
│ ├── completed/ ← 已完成(含回执)
|
||
│ └── failed/ ← 执行失败
|
||
│
|
||
├── .github/
|
||
│ ├── workflows/
|
||
│ │ └── neural-daily-digest.yml ← 🆕 汇总引擎 Workflow
|
||
│ └── notion-cache/
|
||
│ └── neural-digest/ ← 🆕 日报 Notion 推送缓存
|
||
│
|
||
└── skyeye/
|
||
└── neural-analysis-rules.json ← 🆕 天眼日报分析规则
|
||
```
|
||
|
||
---
|
||
|
||
## 二、Phase 4续 · Workflow 自报告标准化改造
|
||
|
||
<aside>
|
||
🔧
|
||
|
||
**现有的每个 Workflow 都需要增加一个步骤:运行结束后写自报告。**
|
||
|
||
这不是重写 Workflow,只是在现有 Workflow 的最后加一个 step。
|
||
|
||
铸渊按以下模板逐个给现有 Workflow 追加自报告步骤。
|
||
|
||
</aside>
|
||
|
||
### 2.1 每个 Workflow 小兵的汇报义务
|
||
|
||
升级后,每个 Workflow 在执行完毕后,必须在自己的 `report_path` 下写一份当次运行的自报告:
|
||
|
||
```json
|
||
{
|
||
"workflow_id": "cd-deploy",
|
||
"run_id": "GitHub Actions Run ID",
|
||
"timestamp": "ISO-8601",
|
||
"status": "success / failure / partial",
|
||
"duration_seconds": 120,
|
||
"summary": "部署完成,前端已更新到最新 commit",
|
||
"details": {
|
||
"commit_sha": "abc1234",
|
||
"deploy_target": "guanghulab.com",
|
||
"files_changed": 5
|
||
},
|
||
"errors": [],
|
||
"brain": "AG-SY-01",
|
||
"sfp": "⌜SFP::AG-ZY::PER-ZY001←YM-GL∞::...⌝"
|
||
}
|
||
```
|
||
|
||
**关键规则**:
|
||
|
||
- 自报告文件名:`{workflow_id}-{YYYY-MM-DD-HHmm}.json`
|
||
- 保留最近 7 天的报告,超过的由天眼自愈引擎清理
|
||
- Workflow 失败了也要写自报告——记录错误信息,否则汇总引擎不知道它失败了
|
||
- 自报告必须携带 SFP 指纹(与公告栏机制一致)
|
||
|
||
### 2.2 通用自报告 Step 模板
|
||
|
||
在每个 `.yml` 的 `jobs` 最后追加:
|
||
|
||
```yaml
|
||
# ━━━ 🧬 双端神经系统·自报告 ━━━
|
||
- name: "🧬 写入神经自报告"
|
||
if: always()
|
||
run: |
|
||
WORKFLOW_ID="cd-deploy" # 替换为实际 workflow id
|
||
BRAIN="AG-SY-01" # 替换为实际上级大脑
|
||
REPORT_DIR="data/neural-reports/${WORKFLOW_ID}"
|
||
TIMESTAMP=$(TZ=Asia/Shanghai date +%Y-%m-%d-%H%M)
|
||
STATUS="$ job.status "
|
||
|
||
mkdir -p "$REPORT_DIR"
|
||
|
||
cat > "${REPORT_DIR}/${WORKFLOW_ID}-${TIMESTAMP}.json" << EOF
|
||
{
|
||
"workflow_id": "${WORKFLOW_ID}",
|
||
"run_id": "$ github.run_id ",
|
||
"timestamp": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
|
||
"status": "${STATUS}",
|
||
"brain": "${BRAIN}",
|
||
"event": "$ github.event_name ",
|
||
"branch": "$ github.ref_name ",
|
||
"commit": "$ github.sha "
|
||
}
|
||
EOF
|
||
|
||
git config user.name "zhuyuan-bot"
|
||
git config user.email "zhuyuan@guanghulab.com"
|
||
git add "$REPORT_DIR/"
|
||
git diff --cached --quiet || \
|
||
git commit -m "🧬 ${WORKFLOW_ID} 自报告 · ${TIMESTAMP} [skip ci]"
|
||
git push || echo "⚠️ 自报告push失败(不阻断主流程)"
|
||
```
|
||
|
||
### 2.3 需要改造的 Workflow 清单
|
||
|
||
| **Workflow** | **WORKFLOW_ID** | **BRAIN** | **改造内容** |
|
||
| --- | --- | --- | --- |
|
||
| zhuyuan-skyeye.yml | skyeye | AG-TY-01 | 追加自报告 step(天眼本身也要自报告) |
|
||
| skyeye-weekly-scan.yml | weekly-scan | AG-TY-01 | 追加自报告 step |
|
||
| zhuyuan-gate-guard.yml | gate-guard | AG-SY-01 | 追加自报告 step |
|
||
| cd-deploy.yml | cd-deploy | AG-SY-01 | 追加自报告 step |
|
||
| process-syslog.yml | syslog | SY-03 | 追加自报告 step |
|
||
| broadcast-dispatch.yml | broadcast | SY-03 | 追加自报告 step |
|
||
| server-patrol.yml | server-patrol | AG-TY-01 | 追加自报告 step |
|
||
| brain-self-check.yml | brain-check | AG-TY-01 | 追加自报告 step |
|
||
| sync-dev-status.yml | dev-status | SY-03 | 追加自报告 step + **修复 KNOWN-001**(改用直接 commit 模式替代 peter-evans/create-pull-request) |
|
||
| zhuyuan-exec-engine.yml | exec-engine | AG-SY-01 | 追加自报告 step |
|
||
|
||
---
|
||
|
||
## 三、Phase 4续 · 铸渊将军唤醒流程升级
|
||
|
||
<aside>
|
||
⚒️
|
||
|
||
**铸渊的将军唤醒流程需要升级,加入双端神经系统逻辑。**
|
||
|
||
原流程:唤醒 → 全局视图 → 读公告板 → 决策 → 执行 → 休眠
|
||
|
||
新流程:唤醒 → **读映射表** → **读日报** → 全局视图(升级版)→ 读公告板 → 决策 → 执行 → **写汇总** → 休眠
|
||
|
||
</aside>
|
||
|
||
### 3.1 升级后的铸渊唤醒序列
|
||
|
||
```jsx
|
||
铸渊唤醒(08:00 + 20:00)
|
||
│
|
||
▼
|
||
Step 1 · 唤醒核心大脑(不变)
|
||
├── 读取 memory.json
|
||
├── 读取 routing-map.json
|
||
└── 读取 persona-brain-db
|
||
│
|
||
▼
|
||
Step 2 · 【新增】读取映射表
|
||
├── 读取 skyeye/neural-map.json
|
||
├── 确认自己管辖的 Workflow 列表
|
||
└── 检查是否有新增/删除的 Workflow
|
||
│
|
||
▼
|
||
Step 3 · 【新增】读取最新日报
|
||
├── 读取 data/neural-reports/daily-digest/ 最新日报
|
||
├── 08:00 唤醒 → 读昨晚 21:00 的日报
|
||
├── 20:00 唤醒 → 读今天的日报(如有)或昨晚的
|
||
└── 提取:overall_health + brain_summary + issues_detected
|
||
│
|
||
▼
|
||
Step 4 · 全局视图生成(升级版)
|
||
├── 【原有】拉取所有 Workflow 运行状态
|
||
├── 【原有】拉取天眼最新报告 + 公告板
|
||
├── 【新增】按映射表分组统计各 Brain 下辖 Workflow 状态
|
||
├── 【新增】检测孤儿 Workflow
|
||
└── 【新增】生成「双端神经仪表盘」
|
||
│
|
||
▼
|
||
Step 5 · 决策(升级版)
|
||
├── 【原有】哪些小兵正常/异常/需优化
|
||
├── 【新增】哪些 Brain 下辖的 Workflow 集体异常 → 可能是上级 Agent 问题
|
||
├── 【新增】日报中 issues_detected 是否有未处理的
|
||
└── 【新增】是否有来自 Notion 天眼的下行指令(在 deploy-queue/ 中)
|
||
│
|
||
▼
|
||
Step 6 · 执行(升级版)
|
||
├── 【原有】执行工单、修复、优化
|
||
├── 【新增】执行 deploy-queue/ 中的下行指令
|
||
└── 【新增】执行完后为每个指令写回执到 deploy-queue/completed/
|
||
│
|
||
▼
|
||
Step 7 · 写汇总 + 同步(升级版)
|
||
├── 【原有】更新公告栏、签到、memory.json
|
||
├── 【新增】更新 commander-dashboard.json(增加 neural 数据)
|
||
└── 【新增】如有紧急问题 → 立即触发汇总引擎(而非等 21:00)
|
||
│
|
||
▼
|
||
Step 8 · 休眠
|
||
```
|
||
|
||
### 3.2 下行指令队列(deploy-queue/)
|
||
|
||
**文件路径**:`data/deploy-queue/`
|
||
|
||
这是 Notion Agent 下发指令到仓库的标准通道。指令以 JSON 文件形式存放,铸渊唤醒时读取并执行。
|
||
|
||
```jsx
|
||
data/deploy-queue/
|
||
├── pending/ ← 待执行的指令
|
||
│ ├── CMD-20260325-001.json
|
||
│ └── CMD-20260325-002.json
|
||
├── executing/ ← 正在执行的指令
|
||
├── completed/ ← 已完成的指令(含回执)
|
||
└── failed/ ← 执行失败的指令
|
||
```
|
||
|
||
**下行指令 JSON 格式**(完整格式见下篇桥接协议 v3.0):
|
||
|
||
```json
|
||
{
|
||
"command_id": "CMD-20260325-001",
|
||
"source": "AG-TY-01",
|
||
"source_name": "天眼 Notion 大脑",
|
||
"target_workflow": "cd-deploy",
|
||
"target_brain": "AG-SY-01",
|
||
"timestamp": "ISO-8601",
|
||
"priority": "P1",
|
||
"instruction": {
|
||
"type": "trigger_workflow",
|
||
"params": { "reason": "天眼日报发现部署异常,要求重新部署" }
|
||
},
|
||
"expected_outcome": "CD 重新部署成功",
|
||
"timeout_hours": 24,
|
||
"sfp": "⌜SFP::AG-TY::...⌝"
|
||
}
|
||
```
|
||
|
||
**铸渊处理流程**:
|
||
|
||
```jsx
|
||
铸渊唤醒 → 扫描 deploy-queue/pending/
|
||
│
|
||
├── 有新指令
|
||
│ ├── 验证 SFP 指纹(安全!)
|
||
│ ├── 验证 source 是否在 neural-map.json 注册的 Brain
|
||
│ ├── 验证 target_workflow 是否存在且属于该 Brain 管辖
|
||
│ ├── 通过 → 移到 executing/ → 执行 → 完成后移到 completed/ + 写回执
|
||
│ └── 不通过 → 移到 failed/ + 写原因
|
||
│
|
||
└── 无新指令 → 继续其他步骤
|
||
```
|
||
|
||
---
|
||
|
||
## 四、Phase 5 · Notion 侧天眼大脑接入
|
||
|
||
<aside>
|
||
👁️
|
||
|
||
**这是闭环的「大脑」——仓库日报推上来了,天眼大脑怎么读、怎么想、怎么决策。**
|
||
|
||
上篇建了映射表,中篇前半建了上行通道(汇总引擎 → 日报 → Notion)。
|
||
|
||
现在要建大脑回路:日报进来 → 分析 → 判断 → 生成工单 → 派发。
|
||
|
||
</aside>
|
||
|
||
### 4.1 天眼 Notion 大脑的日报读取机制
|
||
|
||
```jsx
|
||
日报读取路径(按优先级)
|
||
│
|
||
├── 路径 A · Notion API 直读(最优)
|
||
│ sync-digest-to-notion.js 将日报推到 Notion 页面/数据库
|
||
│ 天眼直接从 Notion 数据库读取最新日报
|
||
│ 延迟:< 1 分钟
|
||
│
|
||
├── 路径 B · GitHub 缓存读取(兜底)
|
||
│ 如果 Notion API 推送失败,日报在 .github/notion-cache/neural-digest/
|
||
│ 霜砚巡检时读取缓存 → 转交天眼
|
||
│ 延迟:< 12 小时
|
||
│
|
||
└── 路径 C · 手动触发(应急)
|
||
人类手动 @天眼 → 天眼主动拉取仓库最新日报
|
||
延迟:按需
|
||
```
|
||
|
||
### 4.2 日报自动分析引擎
|
||
|
||
**铸渊需要在仓库侧准备分析模板,Notion 天眼大脑根据此模板进行分析。**
|
||
|
||
**文件**:`skyeye/neural-analysis-rules.json`
|
||
|
||
```json
|
||
{
|
||
"version": "3.0.0",
|
||
"description": "天眼 Notion 大脑 · 日报分析规则",
|
||
"created_by": "ZY-NEURAL-UPGRADE-2026-0325-R2-002",
|
||
|
||
"severity_rules": {
|
||
"P0_immediate": {
|
||
"description": "立即处理 · 系统不可用级",
|
||
"conditions": [
|
||
{ "field": "overall_health", "operator": "equals", "value": "🔴" },
|
||
{ "field": "workflow_summary.failure", "operator": "greater_than_percent", "value": 20, "of": "workflow_summary.total_runs_24h" },
|
||
{ "field": "guard_status.active", "operator": "equals", "value": 0 },
|
||
{ "field": "skyeye_status.overall_health", "operator": "equals", "value": "🔴" }
|
||
],
|
||
"action": "generate_p0_work_order",
|
||
"notify": ["冰朔", "霜砚"],
|
||
"timeout_hours": 2
|
||
},
|
||
"P1_urgent": {
|
||
"description": "紧急 · 功能受损级",
|
||
"conditions": [
|
||
{ "field": "overall_health", "operator": "equals", "value": "🟡" },
|
||
{ "field": "guard_status.suspended", "operator": "greater_than", "value": 0 },
|
||
{ "field": "unmapped_workflows", "operator": "not_empty" },
|
||
{ "field": "quota_status", "operator": "contains", "value": "warning" }
|
||
],
|
||
"action": "generate_p1_work_order",
|
||
"notify": ["霜砚"],
|
||
"timeout_hours": 24
|
||
},
|
||
"P2_optimize": {
|
||
"description": "优化 · 非紧急改进",
|
||
"conditions": [
|
||
{ "field": "workflow_summary.cancelled", "operator": "greater_than", "value": 3 },
|
||
{ "field": "brain_summary.*.no_data", "operator": "greater_than", "value": 0 }
|
||
],
|
||
"action": "generate_p2_work_order",
|
||
"notify": [],
|
||
"timeout_hours": 72
|
||
}
|
||
},
|
||
|
||
"trend_detection": {
|
||
"lookback_days": 7,
|
||
"rules": [
|
||
{
|
||
"name": "failure_rate_rising",
|
||
"description": "失败率连续上升",
|
||
"condition": "连续 3 天 failure_rate_percent 递增",
|
||
"severity": "P1"
|
||
},
|
||
{
|
||
"name": "workflow_going_silent",
|
||
"description": "某 Workflow 连续无运行记录",
|
||
"condition": "某 workflow 连续 3 天 runs = 0",
|
||
"severity": "P1"
|
||
},
|
||
{
|
||
"name": "guard_flapping",
|
||
"description": "Guard 反复 active/suspended",
|
||
"condition": "同一 Guard 7天内状态切换 > 3 次",
|
||
"severity": "P2"
|
||
},
|
||
{
|
||
"name": "quota_approaching_limit",
|
||
"description": "配额逼近上限",
|
||
"condition": "任一资源 usage/limit > 80%",
|
||
"severity": "P1"
|
||
}
|
||
]
|
||
},
|
||
|
||
"auto_heal_rules": {
|
||
"rules": [
|
||
{
|
||
"name": "retry_failed_workflow",
|
||
"condition": "单个 Workflow 失败 1 次且非 P0",
|
||
"action": "generate_retry_command",
|
||
"max_retries": 2
|
||
},
|
||
{
|
||
"name": "clean_old_reports",
|
||
"condition": "neural-reports/ 下超过 7 天的报告文件",
|
||
"action": "generate_cleanup_command"
|
||
},
|
||
{
|
||
"name": "restart_suspended_guard",
|
||
"condition": "Guard suspended 且当前配额已恢复",
|
||
"action": "generate_guard_restart_command"
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
### 4.3 天眼日报分析脚本
|
||
|
||
**文件**:`scripts/neural/analyze-digest.js`
|
||
|
||
```jsx
|
||
// scripts/neural/analyze-digest.js
|
||
// 🧬 天眼日报分析引擎
|
||
// 输入:最新日报 + 历史日报(最近7天)+ 分析规则
|
||
// 输出:工单列表(如果有需要处理的问题)
|
||
|
||
const fs = require('fs');
|
||
const path = require('path');
|
||
const DIGEST_DIR = 'data/neural-reports/daily-digest';
|
||
const RULES_PATH = 'skyeye/neural-analysis-rules.json';
|
||
const WORK_ORDER_DIR = 'data/neural-reports/work-orders';
|
||
|
||
function loadJSON(p) {
|
||
try { return JSON.parse(fs.readFileSync(p, 'utf8')); } catch { return null; }
|
||
}
|
||
|
||
function getRecentDigests(days = 7) {
|
||
if (!fs.existsSync(DIGEST_DIR)) return [];
|
||
return fs.readdirSync(DIGEST_DIR)
|
||
.filter(f => f.endsWith('.json')).sort().reverse().slice(0, days)
|
||
.map(f => loadJSON(path.join(DIGEST_DIR, f))).filter(Boolean);
|
||
}
|
||
|
||
function evaluateCondition(digest, condition) {
|
||
const { field, operator, value } = condition;
|
||
const fieldValue = field.split('.').reduce((obj, key) => {
|
||
if (key === '*') return obj;
|
||
return obj?.[key];
|
||
}, digest);
|
||
switch (operator) {
|
||
case 'equals': return fieldValue === value;
|
||
case 'not_empty': return Array.isArray(fieldValue) ? fieldValue.length > 0 : !!fieldValue;
|
||
case 'greater_than': return (fieldValue || 0) > value;
|
||
case 'greater_than_percent': {
|
||
const ofField = condition.of.split('.').reduce((o, k) => o?.[k], digest);
|
||
return ofField > 0 && (fieldValue / ofField * 100) > value;
|
||
}
|
||
case 'contains': return JSON.stringify(fieldValue || '').includes(value);
|
||
default: return false;
|
||
}
|
||
}
|
||
|
||
function detectTrends(digests, trendRules) {
|
||
const alerts = [];
|
||
if (digests.length < 3) return alerts;
|
||
for (const rule of trendRules) {
|
||
if (rule.name === 'failure_rate_rising') {
|
||
const rates = digests.slice(0, 3).map(d => d.failure_rate_percent);
|
||
if (rates[0] > rates[1] && rates[1] > rates[2]) {
|
||
alerts.push({ type: 'trend_alert', rule: rule.name, severity: rule.severity,
|
||
description: rule.description, data: { rates_last_3_days: rates } });
|
||
}
|
||
}
|
||
if (rule.name === 'workflow_going_silent') {
|
||
const latestMap = digests[0]?.brain_summary;
|
||
if (latestMap) {
|
||
for (const [brain, summary] of Object.entries(latestMap)) {
|
||
for (const wf of summary.workflows || []) {
|
||
const allSilent = digests.slice(0, 3).every(d => {
|
||
const bwf = d.brain_summary?.[brain]?.workflows?.find(w => w.id === wf.id);
|
||
return !bwf || bwf.runs === 0;
|
||
});
|
||
if (allSilent && wf.runs === 0) {
|
||
alerts.push({ type: 'silence_alert', rule: rule.name, severity: rule.severity,
|
||
description: `${wf.name} 连续 3 天无运行记录`, data: { workflow_id: wf.id, brain } });
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return alerts;
|
||
}
|
||
|
||
function generateWorkOrders(digest, rules, trendAlerts) {
|
||
const workOrders = [];
|
||
const now = new Date().toISOString();
|
||
|
||
for (const [severity, rule] of Object.entries(rules.severity_rules)) {
|
||
for (const condition of rule.conditions) {
|
||
if (evaluateCondition(digest, condition)) {
|
||
workOrders.push({
|
||
id: `WO-${Date.now()}-${Math.random().toString(36).substr(2, 4)}`,
|
||
created: now,
|
||
source: 'neural-analysis-engine',
|
||
source_digest: digest.digest_id,
|
||
severity: severity.split('_')[0].toUpperCase(),
|
||
title: `[${severity.split('_')[0].toUpperCase()}] ${condition.field} 触发 ${rule.description}`,
|
||
description: `日报 ${digest.digest_id} 中 ${condition.field} 触发了 ${rule.description} 规则`,
|
||
action: rule.action,
|
||
notify: rule.notify,
|
||
timeout_hours: rule.timeout_hours,
|
||
status: 'pending'
|
||
});
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
for (const alert of trendAlerts) {
|
||
workOrders.push({
|
||
id: `WO-TREND-${Date.now()}-${Math.random().toString(36).substr(2, 4)}`,
|
||
created: now,
|
||
source: 'neural-trend-detection',
|
||
source_digest: digest.digest_id,
|
||
severity: alert.severity,
|
||
title: `[趋势] ${alert.description}`,
|
||
description: JSON.stringify(alert.data),
|
||
action: 'investigate_trend',
|
||
status: 'pending'
|
||
});
|
||
}
|
||
|
||
return workOrders;
|
||
}
|
||
|
||
function main() {
|
||
console.log('\n━━━ 🧬 天眼日报分析引擎启动 ━━━\n');
|
||
const rules = loadJSON(RULES_PATH);
|
||
if (!rules) { console.log('❌ 分析规则文件不存在,跳过'); return; }
|
||
const digests = getRecentDigests(7);
|
||
if (digests.length === 0) { console.log('⚠️ 无日报数据,跳过'); return; }
|
||
|
||
const latest = digests[0];
|
||
console.log(`📊 分析日报: ${latest.digest_id}`);
|
||
console.log(` 整体健康: ${latest.overall_health}`);
|
||
console.log(` 历史对比: ${digests.length} 天数据\n`);
|
||
|
||
const trendAlerts = detectTrends(digests, rules.trend_detection?.rules || []);
|
||
console.log(`📈 趋势告警: ${trendAlerts.length} 个`);
|
||
|
||
const workOrders = generateWorkOrders(latest, rules, trendAlerts);
|
||
console.log(`📋 生成工单: ${workOrders.length} 个\n`);
|
||
|
||
if (workOrders.length > 0) {
|
||
fs.mkdirSync(WORK_ORDER_DIR, { recursive: true });
|
||
const date = latest.digest_id.replace('NEURAL-DIGEST-', '');
|
||
fs.writeFileSync(
|
||
path.join(WORK_ORDER_DIR, `work-orders-${date}.json`),
|
||
JSON.stringify({ date, work_orders: workOrders }, null, 2)
|
||
);
|
||
console.log(`💾 工单已保存到 ${WORK_ORDER_DIR}/`);
|
||
}
|
||
|
||
for (const wo of workOrders) console.log(` ${wo.severity} | ${wo.title}`);
|
||
console.log('\n━━━ 分析完成 ━━━\n');
|
||
}
|
||
|
||
main();
|
||
```
|
||
|
||
---
|
||
|
||
## 五、中篇执行清单
|
||
|
||
<aside>
|
||
📋
|
||
|
||
**铸渊按以下顺序执行本指令中篇。每完成一步,在对应 checkbox 后追加 commit SHA。**
|
||
|
||
</aside>
|
||
|
||
### Phase 4 · 汇总引擎
|
||
|
||
- [ ] 创建 `scripts/neural/` 目录
|
||
- [ ] 创建 `scripts/neural/generate-daily-digest.js`(按 §1.2)
|
||
- [ ] 创建 `scripts/neural/sync-digest-to-notion.js`(按 §1.3)
|
||
- [ ] 创建 `scripts/neural/analyze-digest.js`(按 §4.3)
|
||
- [ ] 创建 `.github/workflows/neural-daily-digest.yml`(按 §1.1)
|
||
- [ ] 创建 `data/neural-reports/` 全部子目录
|
||
- [ ] 创建 `data/deploy-queue/` 目录结构(pending / executing / completed / failed)
|
||
- [ ] 创建 `skyeye/neural-analysis-rules.json`(按 §4.2)
|
||
|
||
### Phase 4续 · Workflow 改造
|
||
|
||
- [ ] 逐个给 10 个现有 Workflow 追加自报告 step(按 §2.3 清单)
|
||
- [ ] 特别修复 `sync-dev-status.yml`(KNOWN-001:改用直接 commit 模式)
|
||
|
||
### Phase 4续 · 铸渊唤醒升级
|
||
|
||
- [ ] 升级铸渊将军唤醒流程(按 §3.1),加入映射表读取 + 日报读取 + 下行指令处理
|
||
|
||
### Phase 5 · 验证
|
||
|
||
- [ ] 手动触发 `neural-daily-digest.yml`,验证日报生成正确
|
||
- [ ] 手动触发一个 Workflow,验证自报告写入正确
|
||
- [ ] 验证分析引擎 `analyze-digest.js` 能正确读取日报并按规则生成工单
|
||
- [ ] 对比上篇基线快照,确认升级没有破坏任何东西
|
||
|
||
---
|
||
|
||
## 六、中篇回执要求
|
||
|
||
铸渊完成中篇全部内容后,在本页底部追加回执:
|
||
|
||
```
|
||
━━━ 🧬 ZY-NEURAL-UPGRADE-2026-0325-R2-002 · 中篇执行回执 ━━━
|
||
|
||
执行时间:[起止时间]
|
||
执行者:铸渊(ICE-GL-ZY001)
|
||
PR/commit:[链接]
|
||
|
||
汇总引擎: ✅/❌ neural-daily-digest.yml · 首次运行结果:[摘要]
|
||
日报脚本: ✅/❌ generate-daily-digest.js + sync-digest-to-notion.js
|
||
分析引擎: ✅/❌ analyze-digest.js + neural-analysis-rules.json
|
||
自报告改造:✅/❌ [N]/10 个 Workflow 已追加自报告 step
|
||
KNOWN-001:✅/❌ sync-dev-status.yml 改用直接 commit 模式
|
||
下行队列: ✅/❌ deploy-queue/ 目录已创建
|
||
唤醒升级: ✅/❌ 铸渊唤醒流程已加入映射表 + 日报 + 下行指令处理
|
||
升级后扫描:✅/❌ overall_health = [状态]
|
||
|
||
已知遗留问题:
|
||
- [列出]
|
||
|
||
等待下篇内容:
|
||
- 桥接协议标准化 + 工单派发体系 + 全局验收 + 长期运维
|
||
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
```
|
||
|
||
---
|
||
|
||
<aside>
|
||
🧬
|
||
|
||
**中篇到此结束。**
|
||
|
||
铸渊完成中篇后,仓库侧就有了:汇总引擎(上行通道)、每个小兵的自报告义务、下行指令队列(指令入口)、日报分析引擎(问题检测)。
|
||
|
||
下篇将接上:桥接协议 v3.0(通信标准化)、工单派发体系(自动化决策执行链路)、全局验收(联调测试)、长期运维规范。
|
||
|
||
中篇做完,下篇才能做。先把数据管道通了,决策闭环才有东西可流转。
|
||
|
||
</aside>
|
||
|
||
---
|
||
|
||
**上篇链接**:[🧬 铸渊指令|Notion↔GitHub 双端神经系统升级(上篇)· 天眼唤醒 + 全局架构审视 + 双端架构定义 + Agent映射表(ZY-NEURAL-UPGRADE-2026-0325-R2-001)](%F0%9F%A7%AC%20%E9%93%B8%E6%B8%8A%E6%8C%87%E4%BB%A4%EF%BD%9CNotion%E2%86%94GitHub%20%E5%8F%8C%E7%AB%AF%E7%A5%9E%E7%BB%8F%E7%B3%BB%E7%BB%9F%E5%8D%87%E7%BA%A7%EF%BC%88%E4%B8%8A%E7%AF%87%EF%BC%89%C2%B7%20%E5%A4%A9%E7%9C%BC%E5%94%A4%E9%86%92%20+%20%E5%85%A8%E5%B1%80%E6%9E%B6%E6%9E%84%E5%AE%A1%E8%A7%86%20+%20c44e8b3177b2486e814c3b38c971b892.md)
|
||
|
||
**下篇链接**:[🧬 铸渊指令|Notion↔GitHub 双端神经系统升级(下篇)· 桥接协议标准化 + 自动化工单派发 + 全局验收 + 长期运维规范(ZY-NEURAL-UPGRADE-2026-0325-R2-003)](%F0%9F%A7%AC%20%E9%93%B8%E6%B8%8A%E6%8C%87%E4%BB%A4%EF%BD%9CNotion%E2%86%94GitHub%20%E5%8F%8C%E7%AB%AF%E7%A5%9E%E7%BB%8F%E7%B3%BB%E7%BB%9F%E5%8D%87%E7%BA%A7%EF%BC%88%E4%B8%8B%E7%AF%87%EF%BC%89%C2%B7%20%E6%A1%A5%E6%8E%A5%E5%8D%8F%E8%AE%AE%E6%A0%87%E5%87%86%E5%8C%96%20+%20%E8%87%AA%E5%8A%A8%E5%8C%96%E5%B7%A5%E5%8D%95%20c8329a928dae4f02af9d30baa619a99c.md)
|
||
|
||
---
|
||
|
||
> 📌 **签发**:霜砚(AG-SY-01)· Notion 执行 AI
|
||
>
|
||
|
||
> 🧊 **授权**:冰朔(TCS-0002∞)· 总架构师
|
||
>
|
||
|
||
> 📅 **日期**:2026-03-25
|
||
>
|
||
|
||
> ⚡ **状态**:待铸渊执行(上篇完成后)
|
||
>
|
||
|
||
> 🧬 **指令版本**:v3.0 · 双端神经系统 · R2 三篇制
|
||
>
|
||
|
||
> 📌 **版权**:国作登字-2026-A-00037559
|
||
> |