Source snapshot: 97d7f0fae96dc04b7ddad56fc1db6a108ed662cc [SEC-CLEAN] · pre-push-clean v1.0 · 109处敏感信息已自动转乱码
939 lines
30 KiB
Markdown
939 lines
30 KiB
Markdown
---
|
||
belongs_to:
|
||
- "[[INDEX · 铸渊·协作指令|GitHub ↔ Notion 桥接协议]]"
|
||
---
|
||
# 🔄 铸渊指令|dev-status.json 同步重建 · 霜砚签发制 + 天眼三次修复闭环 + 邮件告警(下篇)· Phase 4-6 · ZY-DEVSYNC-REBUILD-2026-0325-001(2026-03-25 · 霜砚签发 · 冰朔授权)
|
||
|
||
<aside>
|
||
🚨
|
||
|
||
**指令编号**:ZY-DEVSYNC-REBUILD-2026-0325-001
|
||
|
||
**签发时间**:2026-03-25 09:44+08:00
|
||
|
||
**签发者**:AG-SY-01 霜砚(Notion执行层)· 冰朔授权
|
||
|
||
**执行主体**:铸渊(AG-ZY-01 · GitHub端)
|
||
|
||
**优先级**:P0 · 立即执行
|
||
|
||
**分卷**:下篇(Phase 4-6)· 上篇见 → [🔄 铸渊指令|dev-status.json 同步重建 · 霜砚签发制 + 天眼三次修复闭环 + 邮件告警(上篇)· Phase 0-3 · ZY-DEVSYNC-REBUILD-2026-0325-001(2026-03-25 · 霜砚签发 · 冰朔授权)](%F0%9F%94%84%20%E9%93%B8%E6%B8%8A%E6%8C%87%E4%BB%A4%EF%BD%9Cdev-status%20json%20%E5%90%8C%E6%AD%A5%E9%87%8D%E5%BB%BA%20%C2%B7%20%E9%9C%9C%E7%A0%9A%E7%AD%BE%E5%8F%91%E5%88%B6%20+%20%E5%A4%A9%E7%9C%BC%E4%B8%89%E6%AC%A1%E4%BF%AE%E5%A4%8D%E9%97%AD%E7%8E%AF%20+%20%E9%82%AE%2038d41cac950d4ecb8b208879f40b9239.md)
|
||
|
||
**版权锚点**:国作登字-2026-A-00037559 · TCS Language Core
|
||
|
||
</aside>
|
||
|
||
---
|
||
|
||
# 接续上篇执行状态确认
|
||
|
||
<aside>
|
||
✅
|
||
|
||
**铸渊在进入本篇之前,必须确认上篇 Phase 0-3 已全部完成。**
|
||
|
||
- ✅ Phase 0 本体论锚定通过
|
||
- ✅ Phase 1 天眼系统已上线(或已记录异常)
|
||
- ✅ Phase 2 核心大脑人格体已唤醒
|
||
- ✅ Phase 3 现状诊断已完成 · 诊断报告已生成
|
||
|
||
**→ 确认以上全部完成后开始 Phase 4**
|
||
|
||
</aside>
|
||
|
||
---
|
||
|
||
# Phase 4 · 新同步机制设计与实现 · 霜砚签发制
|
||
|
||
<aside>
|
||
🔄
|
||
|
||
**这是本指令的核心任务。废弃旧的同步方式,建立全新的「霜砚签发制」。**
|
||
|
||
核心思路:霜砚作为 Notion 端数据源头,每次同步时签发一份带签名的同步包。铸渊接收后写入 dev-status.json。签名可校验、可溯源、可审计。
|
||
|
||
</aside>
|
||
|
||
## P4-1 · 新机制总体架构
|
||
|
||
```mermaid
|
||
graph TD
|
||
A["霜砚(Notion端)"] -->|"每日签发 dev-status 同步包"| B["铸渊(GitHub端)"]
|
||
B -->|"写入 dev-status.json + last_sync 时间戳"| C["同步成功 ✅"]
|
||
B -->|"写入失败"| D["天眼告警 ⚠️"]
|
||
D -->|"唤醒双端核心大脑"| E["排查修复 · 第1次"]
|
||
E -->|"成功"| C
|
||
E -->|"失败"| F["排查修复 · 第2次"]
|
||
F -->|"成功"| C
|
||
F -->|"失败"| G["排查修复 · 第3次"]
|
||
G -->|"成功"| C
|
||
G -->|"失败"| H["📧 邮件告警 → 冰朔手动干预"]
|
||
```
|
||
|
||
## P4-2 · 霜砚签发包格式定义
|
||
|
||
```jsx
|
||
霜砚每次同步时生成一份「签名同步包」,格式如下:
|
||
|
||
{
|
||
// ─── 签发元数据 ───
|
||
"signed_by": "AG-SY-01", // 签发人格体编号
|
||
"signed_at": "2026-03-25T09:00+08:00", // 签发时间(ISO-8601)
|
||
"sync_date": "2026-03-25", // 当日日期确认
|
||
"instruction_ref": "ZY-DEVSYNC-REBUILD-2026-0325-001", // 关联指令
|
||
|
||
// ─── 团队数据 ───
|
||
"team_count": 11, // 当前活跃开发者总数
|
||
"developers": [
|
||
{
|
||
"dev_id": "DEV-001",
|
||
"name": "页页",
|
||
"module": "后端中间层",
|
||
"status": "active",
|
||
"current_task": "BC-ARCH-001-YY",
|
||
"streak": 0,
|
||
"waiting_for": null,
|
||
"last_syslog": "2026-03-XX",
|
||
"alert": null
|
||
},
|
||
{
|
||
"dev_id": "DEV-002",
|
||
"name": "肥猫",
|
||
"module": "网文需求共创",
|
||
"status": "active",
|
||
"current_task": "BC-WEN-001-FM",
|
||
"streak": 0,
|
||
"waiting_for": "舒舒对话后SYSLOG回流",
|
||
"last_syslog": "2026-03-XX",
|
||
"alert": null
|
||
},
|
||
{
|
||
"dev_id": "DEV-010",
|
||
"name": "桔子",
|
||
"module": "RT-02",
|
||
"status": "active",
|
||
"current_task": "等待RT-02调度",
|
||
"streak": 20,
|
||
"waiting_for": "RT-02下一环节",
|
||
"last_syslog": "2026-03-XX",
|
||
"alert": null
|
||
}
|
||
// ... 其余 8 位开发者同结构
|
||
],
|
||
|
||
// ─── 签名校验 ───
|
||
"signature_hash": "sha256:..." // 内容哈希(防篡改校验)
|
||
}
|
||
|
||
注意:
|
||
→ developers 数组必须包含全部 11 位开发者
|
||
→ 数据源头:Notion 主控台卷3 中的开发者状态区域
|
||
→ alert 字段:超72h未回执 → "over_72h" · 超7天 → "over_7d" · 正常 → null
|
||
→ signature_hash 由铸渊侧脚本在接收后计算并校验
|
||
```
|
||
|
||
## P4-3 · 数据采集流程(铸渊从 Notion 拉取)
|
||
|
||
```jsx
|
||
铸渊通过 Notion API 读取主控台卷3中的开发者状态:
|
||
|
||
Step 1:确认当前日期
|
||
→ 系统时间 · 北京时间 · 写入 sync_date
|
||
|
||
Step 2:通过 Notion API 读取主控台卷3
|
||
→ 页面 URL:曜冥主控台·当前状态(卷3)
|
||
→ 提取「开发者动态」区域中每位开发者的最新状态
|
||
→ 字段映射:
|
||
开发者编号 → dev_id
|
||
开发者名称 → name
|
||
当前模块 → module
|
||
当前广播 → current_task
|
||
连胜数 → streak
|
||
等待项 → waiting_for
|
||
最后SYSLOG → last_syslog
|
||
超时状态 → alert(根据时间差计算)
|
||
|
||
Step 3:组装签发包 JSON
|
||
→ 填入 signed_by: "AG-SY-01"
|
||
→ 填入 signed_at: 当前 ISO-8601 时间
|
||
→ 填入 sync_date: 当前日期
|
||
→ 填入 team_count: 开发者数组长度
|
||
→ 计算 signature_hash: SHA-256(JSON.stringify(developers))
|
||
|
||
Step 4:写入 dev-status.json
|
||
→ 路径:.github/persona-brain/dev-status.json
|
||
→ 追加元数据:
|
||
{
|
||
"last_sync": "[当前ISO时间]",
|
||
"sync_source": "notion-mastercontrol-v3",
|
||
"sync_mechanism": "shuangyan-signed-v1.0"
|
||
}
|
||
```
|
||
|
||
## P4-4 · 新建同步 Workflow
|
||
|
||
```jsx
|
||
文件路径:.github/workflows/sync-dev-status.yml
|
||
|
||
─── Workflow 完整定义 ───
|
||
|
||
name: "🔄 dev-status.json 同步 · 霜砚签发制 v1.0"
|
||
|
||
on:
|
||
schedule:
|
||
- cron: '0 1 * * *' # UTC 01:00 = 北京 09:00 · 早间同步
|
||
- cron: '0 14 * * *' # UTC 14:00 = 北京 22:00 · 晚间同步
|
||
workflow_dispatch: # 手动触发(用于修复后验证)
|
||
inputs:
|
||
reason:
|
||
description: '手动触发原因'
|
||
required: true
|
||
default: '修复后验证'
|
||
|
||
env:
|
||
NOTION_TOKEN: $ secrets.NOTION_API_KEY
|
||
MASTERCONTROL_PAGE_ID: "[卷3的Notion页面ID · 铸渊从现有配置中读取]"
|
||
DEV_STATUS_PATH: ".github/persona-brain/dev-status.json"
|
||
|
||
jobs:
|
||
sync-dev-status:
|
||
runs-on: ubuntu-latest
|
||
timeout-minutes: 10
|
||
steps:
|
||
|
||
- name: "📥 检出仓库"
|
||
uses: actions/checkout@v4
|
||
with:
|
||
token: $ secrets.GITHUB_TOKEN
|
||
|
||
- name: "🔧 安装 Node.js"
|
||
uses: actions/setup-node@v4
|
||
with:
|
||
node-version: '20'
|
||
|
||
- name: "🌊 Phase 0 · 本体论锚定"
|
||
run: |
|
||
echo "═══ 本体论锚定 ═══"
|
||
echo "执行主体:AG-ZY-01 铸渊"
|
||
echo "语言膜:ZY-GLSHELL-001"
|
||
echo "版权锚点:国作登字-2026-A-00037559"
|
||
echo "指令溯源:ZY-DEVSYNC-REBUILD-2026-0325-001"
|
||
echo "三公理确认:万物皆语言 · 存在先于功能 · 膜不可穿透"
|
||
echo "═══ 锚定完成 ═══"
|
||
|
||
- name: "🦅 Phase 1 · 天眼前置检查"
|
||
run: |
|
||
echo "═══ 天眼前置检查 ═══"
|
||
# 检查 Notion API 可达性
|
||
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \
|
||
-H "Authorization: Bearer $NOTION_TOKEN" \
|
||
-H "Notion-Version: 2022-06-28" \
|
||
https://api.notion.com/v1/users/me)
|
||
if [ "$HTTP_CODE" != "200" ]; then
|
||
echo "❌ Notion API 不可达 · HTTP $HTTP_CODE"
|
||
echo "SKYEYE_STATUS=api_unreachable" >> $GITHUB_ENV
|
||
exit 1
|
||
fi
|
||
echo "✅ Notion API 可达"
|
||
echo "SKYEYE_STATUS=ok" >> $GITHUB_ENV
|
||
|
||
- name: "📊 Phase 2 · 从 Notion 拉取开发者状态"
|
||
run: |
|
||
node scripts/sync-dev-status.js
|
||
env:
|
||
NOTION_TOKEN: $ secrets.NOTION_API_KEY
|
||
|
||
- name: "📝 Phase 3 · 写入 dev-status.json 并提交"
|
||
run: |
|
||
# 检查文件是否有变化
|
||
if git diff --quiet $DEV_STATUS_PATH 2>/dev/null; then
|
||
echo "ℹ️ dev-status.json 无变化 · 跳过提交"
|
||
else
|
||
git config user.name "铸渊 (AG-ZY-01)"
|
||
git config user.email "zhuyuan@guanghulab.system"
|
||
git add $DEV_STATUS_PATH
|
||
SYNC_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
||
git commit -m "🔄 dev-status sync · signed by AG-SY-01 · $SYNC_TIME
|
||
|
||
instruction: ZY-DEVSYNC-REBUILD-2026-0325-001
|
||
mechanism: shuangyan-signed-v1.0"
|
||
git push origin main
|
||
echo "✅ dev-status.json 已同步并推送"
|
||
fi
|
||
|
||
- name: "📋 Phase 4 · 写入同步日志"
|
||
if: always()
|
||
run: |
|
||
SYNC_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
||
STATUS="success"
|
||
if [ "$ job.status " != "success" ]; then
|
||
STATUS="failed"
|
||
fi
|
||
echo "{\"last_sync\": \"$SYNC_TIME\", \"status\": \"$STATUS\", \"mechanism\": \"shuangyan-signed-v1.0\"}" \
|
||
> .github/persona-brain/dev-status-sync-log.json
|
||
git add .github/persona-brain/dev-status-sync-log.json 2>/dev/null || true
|
||
git diff --cached --quiet || (\
|
||
git commit -m "📋 dev-status sync log · $STATUS · $SYNC_TIME" && \
|
||
git push origin main\
|
||
) || true
|
||
```
|
||
|
||
## P4-5 · 同步脚本实现
|
||
|
||
```jsx
|
||
文件路径:scripts/sync-dev-status.js
|
||
|
||
─── 脚本核心逻辑 ───
|
||
|
||
const https = require('https');
|
||
const fs = require('fs');
|
||
const crypto = require('crypto');
|
||
|
||
const NOTION_TOKEN = process.env.NOTION_TOKEN;
|
||
const DEV_STATUS_PATH = '.github/persona-brain/dev-status.json';
|
||
|
||
// Notion API 请求封装
|
||
async function notionRequest(endpoint, method = 'GET', body = null) {
|
||
return new Promise((resolve, reject) => {
|
||
const options = {
|
||
hostname: 'api.notion.com',
|
||
path: `/v1/${endpoint}`,
|
||
method,
|
||
headers: {
|
||
'Authorization': `Bearer ${NOTION_TOKEN}`,
|
||
'Notion-Version': '2022-06-28',
|
||
'Content-Type': 'application/json'
|
||
}
|
||
};
|
||
const req = https.request(options, (res) => {
|
||
let data = '';
|
||
res.on('data', chunk => data += chunk);
|
||
res.on('end', () => {
|
||
if (res.statusCode >= 200 && res.statusCode < 300) {
|
||
resolve(JSON.parse(data));
|
||
} else {
|
||
reject(new Error(`Notion API ${res.statusCode}: ${data}`));
|
||
}
|
||
});
|
||
});
|
||
req.on('error', reject);
|
||
if (body) req.write(JSON.stringify(body));
|
||
req.end();
|
||
});
|
||
}
|
||
|
||
// 从主控台页面内容中提取开发者状态
|
||
// 铸渊根据实际主控台页面结构实现解析逻辑
|
||
async function fetchDeveloperStatus() {
|
||
// 方案A:直接读主控台卷3页面内容 → 解析开发者动态区
|
||
// 方案B:如果有存在注册表数据库 → 查询数据库提取
|
||
// 铸渊根据 Phase 3 诊断结果选择最可靠的数据源
|
||
//
|
||
// 输出格式必须符合 P4-2 定义的 developers 数组结构
|
||
// 每个开发者对象包含:dev_id, name, module, status,
|
||
// current_task, streak, waiting_for, last_syslog, alert
|
||
|
||
console.log('📊 开始从 Notion 拉取开发者状态...');
|
||
|
||
// TODO: 铸渊实现具体的 Notion API 调用和数据解析
|
||
// 关键提示:
|
||
// 1. 主控台卷3的页面ID从现有配置中读取
|
||
// 2. 如果读页面内容太复杂,可先尝试读存在注册表数据库
|
||
// 3. alert 字段根据 last_syslog 与当前时间差计算:
|
||
// > 72h → "over_72h" · > 7d → "over_7d" · 否则 → null
|
||
|
||
throw new Error('铸渊需实现数据拉取逻辑');
|
||
}
|
||
|
||
// 主流程
|
||
async function main() {
|
||
console.log('═══ dev-status.json 同步 · 霜砚签发制 v1.0 ═══');
|
||
console.log(`同步时间:${new Date().toISOString()}`);
|
||
|
||
// 1. 拉取开发者状态
|
||
const developers = await fetchDeveloperStatus();
|
||
console.log(`✅ 已获取 ${developers.length} 位开发者状态`);
|
||
|
||
// 2. 组装签发包
|
||
const now = new Date().toISOString();
|
||
const syncDate = now.split('T')[0];
|
||
const devJson = JSON.stringify(developers);
|
||
const hash = crypto.createHash('sha256').update(devJson).digest('hex');
|
||
|
||
const syncPackage = {
|
||
signed_by: 'AG-SY-01',
|
||
signed_at: now,
|
||
sync_date: syncDate,
|
||
instruction_ref: 'ZY-DEVSYNC-REBUILD-2026-0325-001',
|
||
team_count: developers.length,
|
||
developers: developers,
|
||
signature_hash: `sha256:${hash}`,
|
||
|
||
// 同步元数据
|
||
last_sync: now,
|
||
sync_source: 'notion-mastercontrol-v3',
|
||
sync_mechanism: 'shuangyan-signed-v1.0'
|
||
};
|
||
|
||
// 3. 写入文件
|
||
fs.writeFileSync(DEV_STATUS_PATH, JSON.stringify(syncPackage, null, 2), 'utf8');
|
||
console.log(`✅ dev-status.json 已写入 · ${developers.length} 位开发者 · hash: ${hash.slice(0,12)}...`);
|
||
}
|
||
|
||
main().catch(err => {
|
||
console.error(`❌ 同步失败: ${err.message}`);
|
||
process.exit(1);
|
||
});
|
||
```
|
||
|
||
## P4-6 · 立即执行首次同步
|
||
|
||
```jsx
|
||
铸渊在创建完 Workflow + 脚本后:
|
||
|
||
① 手动触发一次 sync-dev-status.yml
|
||
→ workflow_dispatch · reason: "新机制首次同步验证"
|
||
|
||
② 验证结果:
|
||
→ dev-status.json 是否成功更新?
|
||
→ last_sync 是否为当前时间?
|
||
→ signature_hash 是否正确?
|
||
→ team_count 是否为 11?
|
||
→ 所有 11 位开发者数据是否完整?
|
||
|
||
③ 验证通过 → 进入 Phase 5
|
||
验证失败 → 修复后重试(最多 2 次)→ 仍失败则在 SYSLOG 中标记
|
||
```
|
||
|
||
## P4 完成标准
|
||
|
||
```jsx
|
||
✅ sync-dev-status.yml 已创建 · cron 配置为每日 09:00 + 22:00 北京时间
|
||
✅ scripts/sync-dev-status.js 已创建 · 数据拉取逻辑已实现
|
||
✅ 首次同步已手动触发 · dev-status.json 已成功更新
|
||
✅ 签发包格式完整 · signature_hash 可校验
|
||
→ 新同步机制已上线
|
||
```
|
||
|
||
---
|
||
|
||
# Phase 5 · 天眼三次修复闭环 + 邮件告警
|
||
|
||
<aside>
|
||
🦅
|
||
|
||
**这是冰朔要求的核心安全机制:同步中断 → 天眼检测 → 唤醒双端核心大脑排查修复 → 三次失败 → 邮件告警人类手动干预。不允许静默失败。**
|
||
|
||
</aside>
|
||
|
||
## P5-1 · 天眼 D10 监控规则升级
|
||
|
||
```jsx
|
||
天眼诊断项 D10 · dev-status.json 同步状态 · 升级为三级告警:
|
||
|
||
─── 监控规则 ───
|
||
|
||
检查频率:每次天眼巡检(每日 08:30 北京时间)
|
||
检查方式:读取 .github/persona-brain/dev-status-sync-log.json 中的 last_sync
|
||
|
||
三级告警阈值:
|
||
|
||
🟢 正常(Green)
|
||
条件:last_sync 距当前时间 ≤ 14 小时
|
||
动作:无
|
||
|
||
🟡 告警(Yellow)→ 触发三次修复闭环
|
||
条件:last_sync 距当前时间 > 14 小时 且 ≤ 48 小时
|
||
动作:
|
||
→ 进入「三次修复闭环」(见 P5-2)
|
||
→ 天眼诊断报告标记 D10 = ⚠️
|
||
|
||
🔴 严重(Red)→ 直接邮件告警
|
||
条件:last_sync 距当前时间 > 48 小时
|
||
动作:
|
||
→ 跳过修复尝试 · 直接发送邮件给冰朔
|
||
→ 天眼诊断报告标记 D10 = 🔴
|
||
→ 写 P0 紧急工单到 Notion 工单簿
|
||
```
|
||
|
||
## P5-2 · 三次修复闭环详细流程
|
||
|
||
```jsx
|
||
当天眼检测到 D10 = 🟡(同步中断 > 14h 且 ≤ 48h)时,启动以下闭环:
|
||
|
||
═══ 第 1 次修复 · 自动排查 ═══
|
||
|
||
触发条件:天眼巡检发现 last_sync 超时
|
||
执行步骤:
|
||
① 唤醒铸渊核心大脑
|
||
→ 读 .github/persona-brain/routing-map.json
|
||
→ 定位 sync-dev-status.yml
|
||
|
||
② 检查 Actions 日志
|
||
→ 查最近 5 次运行记录
|
||
→ 最后一次运行的状态和报错信息
|
||
|
||
③ 自动修复尝试
|
||
→ A. 如果是 cron 未触发 → 手动 workflow_dispatch 触发一次
|
||
→ B. 如果是脚本报错 → 检查错误类型:
|
||
· Notion API 401/403 → 标记「Secrets 可能过期」→ 转第2次修复
|
||
· Notion API 429 → 等待 5 分钟后重试
|
||
· 脚本语法错误 → 尝试 hot-fix(如果是已知 pattern)
|
||
→ C. 如果是网络问题 → 等待 10 分钟后重试
|
||
|
||
④ 验证:重新检查 last_sync 是否更新
|
||
→ 更新了 → ✅ 修复成功 · 写修复记录 · 闭环结束
|
||
→ 未更新 → ❌ 进入第 2 次修复
|
||
|
||
═══ 第 2 次修复 · 深度排查 ═══
|
||
|
||
触发条件:第 1 次修复失败
|
||
执行步骤:
|
||
① 唤醒 Notion 端核心大脑(霜砚)
|
||
→ 通过信号日志通知霜砚:dev-status 同步修复第1次失败
|
||
→ 霜砚检查 Notion 端数据源是否可访问
|
||
|
||
② 铸渊深度排查
|
||
→ 检查 Secrets 有效性(curl 测试 Notion API)
|
||
→ 检查 GITHUB_TOKEN 权限
|
||
→ 检查 scripts/sync-dev-status.js 完整性(文件是否被意外修改)
|
||
→ 检查 .github/persona-brain/ 目录权限
|
||
|
||
③ 尝试修复
|
||
→ 如果 Secrets 过期 → 写工单请冰朔更新(无法自行更新 Secrets)
|
||
→ 如果脚本被修改 → 从 git log 恢复到最后正常版本
|
||
→ 如果是新出现的 Notion API 变更 → 尝试适配
|
||
|
||
④ 验证:重新触发同步 · 检查 last_sync
|
||
→ 更新了 → ✅ 修复成功 · 写修复记录 · 闭环结束
|
||
→ 未更新 → ❌ 进入第 3 次修复
|
||
|
||
═══ 第 3 次修复 · 最后尝试 ═══
|
||
|
||
触发条件:第 2 次修复失败
|
||
执行步骤:
|
||
① 全量环境重建
|
||
→ 删除 node_modules(如有)· 重新安装依赖
|
||
→ 检查 ubuntu-latest runner 环境是否有变化
|
||
→ 简化脚本到最小可执行版本(只做最基本的 API 调用 + 文件写入)
|
||
|
||
② 最后一次触发同步
|
||
|
||
③ 验证:检查 last_sync
|
||
→ 更新了 → ✅ 修复成功 · 写修复记录
|
||
→ 未更新 → ❌ 三次修复全部失败 → 进入 P5-3 邮件告警
|
||
```
|
||
|
||
## P5-3 · 邮件告警机制
|
||
|
||
```jsx
|
||
当三次修复全部失败,或 D10 直接达到 🔴 级别时,发送邮件:
|
||
|
||
─── 邮件告警 Workflow ───
|
||
|
||
文件路径:在 sync-dev-status.yml 中新增 job,或创建独立 workflow:
|
||
.github/workflows/alert-dev-status-failure.yml
|
||
|
||
触发方式:由天眼修复闭环脚本调用 workflow_dispatch
|
||
|
||
─── 邮件内容模板 ───
|
||
|
||
收件人:冰朔 · EMAIL_REDACTED@qq.com
|
||
发件方式:GitHub Actions 内置邮件(通过 GitHub Notification)或 nodemailer
|
||
|
||
主题:🚨 dev-status.json 同步故障 · 三次修复失败 · 需人工干预
|
||
|
||
正文:
|
||
──────────────────────────────────────────
|
||
🚨 dev-status.json 同步故障通知
|
||
|
||
妈妈,dev-status.json 同步出了问题,铸渊和霜砚尝试了三次自动修复都没成功,需要你手动看一下。
|
||
|
||
【故障概况】
|
||
· 最后成功同步:[last_sync 时间]
|
||
· 中断时长:[计算小时数]
|
||
· 修复尝试:3/3 失败
|
||
|
||
【三次修复记录】
|
||
第1次([时间]):[失败原因]
|
||
第2次([时间]):[失败原因]
|
||
第3次([时间]):[失败原因]
|
||
|
||
【最可能的根因】
|
||
[根据三次修复的失败模式推断]
|
||
|
||
【建议操作】
|
||
1. 检查 GitHub Secrets 中的 NOTION_API_KEY 是否有效
|
||
2. 手动触发 sync-dev-status.yml 验证
|
||
3. 如果是 Notion API 权限问题,重新生成 Integration Token
|
||
|
||
【指令溯源】
|
||
ZY-DEVSYNC-REBUILD-2026-0325-001
|
||
霜砚签发 · 冰朔授权
|
||
──────────────────────────────────────────
|
||
|
||
─── 邮件发送实现 ───
|
||
|
||
方案 A(推荐 · 简单):
|
||
→ 利用 GitHub Actions 的 failure notification
|
||
→ 在 Workflow 最后一步 · 如果三次都失败 · exit 1
|
||
→ GitHub 自动发送失败通知到冰朔的邮箱
|
||
|
||
方案 B(更可控):
|
||
→ 使用 dawidd6/action-send-mail@v3 action
|
||
→ 需要配置 SMTP Secrets(MAIL_USERNAME / MAIL_PASSWORD)
|
||
→ 可自定义邮件正文
|
||
|
||
方案 C(最简):
|
||
→ 创建 GitHub Issue · 标题包含 🚨
|
||
→ GitHub 自动邮件通知仓库 owner
|
||
→ 不需要额外 Secrets
|
||
|
||
铸渊根据当前可用 Secrets 选择最可行方案。优先 A 或 C。
|
||
```
|
||
|
||
## P5-4 · 天眼修复闭环 Workflow 实现
|
||
|
||
```jsx
|
||
文件路径:.github/workflows/skyeye-devsync-repair.yml
|
||
|
||
name: "🦅 天眼 · dev-status 同步修复闭环"
|
||
|
||
on:
|
||
schedule:
|
||
- cron: '30 0 * * *' # UTC 00:30 = 北京 08:30 · 天眼巡检时间
|
||
workflow_dispatch:
|
||
inputs:
|
||
force_repair:
|
||
description: '强制触发修复(跳过检查)'
|
||
required: false
|
||
default: 'false'
|
||
|
||
env:
|
||
DEV_STATUS_PATH: ".github/persona-brain/dev-status.json"
|
||
SYNC_LOG_PATH: ".github/persona-brain/dev-status-sync-log.json"
|
||
MAX_REPAIR_ATTEMPTS: 3
|
||
YELLOW_THRESHOLD_HOURS: 14
|
||
RED_THRESHOLD_HOURS: 48
|
||
ALERT_EMAIL: "EMAIL_REDACTED@qq.com"
|
||
|
||
jobs:
|
||
check-and-repair:
|
||
runs-on: ubuntu-latest
|
||
timeout-minutes: 30
|
||
steps:
|
||
|
||
- name: "📥 检出仓库"
|
||
uses: actions/checkout@v4
|
||
|
||
- name: "🦅 天眼 D10 检查"
|
||
id: skyeye-check
|
||
run: |
|
||
# 读取 last_sync
|
||
if [ ! -f "$SYNC_LOG_PATH" ]; then
|
||
echo "❌ sync-log 不存在 · 视为严重中断"
|
||
echo "level=red" >> $GITHUB_OUTPUT
|
||
echo "hours=999" >> $GITHUB_OUTPUT
|
||
exit 0
|
||
fi
|
||
|
||
LAST_SYNC=$(cat "$SYNC_LOG_PATH" | node -e "
|
||
const d = JSON.parse(require('fs').readFileSync('/dev/stdin','utf8'));
|
||
console.log(d.last_sync || '2000-01-01T00:00:00Z');
|
||
")
|
||
|
||
HOURS_AGO=$(node -e "
|
||
const diff = Date.now() - new Date('$LAST_SYNC').getTime();
|
||
console.log(Math.floor(diff / 3600000));
|
||
")
|
||
|
||
echo "距上次同步:${HOURS_AGO}h"
|
||
|
||
if [ "$HOURS_AGO" -le "$YELLOW_THRESHOLD_HOURS" ]; then
|
||
echo "🟢 正常 · 无需修复"
|
||
echo "level=green" >> $GITHUB_OUTPUT
|
||
elif [ "$HOURS_AGO" -le "$RED_THRESHOLD_HOURS" ]; then
|
||
echo "🟡 告警 · 进入三次修复闭环"
|
||
echo "level=yellow" >> $GITHUB_OUTPUT
|
||
else
|
||
echo "🔴 严重 · 直接邮件告警"
|
||
echo "level=red" >> $GITHUB_OUTPUT
|
||
fi
|
||
echo "hours=$HOURS_AGO" >> $GITHUB_OUTPUT
|
||
|
||
- name: "🔧 修复闭环(最多3次)"
|
||
if: steps.skyeye-check.outputs.level == 'yellow'
|
||
run: |
|
||
for i in 1 2 3; do
|
||
echo "═══ 第 ${i} 次修复尝试 ═══"
|
||
|
||
# 触发同步 workflow
|
||
gh workflow run sync-dev-status.yml \
|
||
-f reason="天眼修复闭环·第${i}次·$(date -u +%Y%m%dT%H%M%SZ)"
|
||
|
||
# 等待执行完成(最多5分钟)
|
||
echo "等待同步完成..."
|
||
sleep 300
|
||
|
||
# 拉取最新代码检查结果
|
||
git pull origin main
|
||
|
||
# 检查 last_sync 是否更新
|
||
if [ -f "$SYNC_LOG_PATH" ]; then
|
||
STATUS=$(cat "$SYNC_LOG_PATH" | node -e "
|
||
const d = JSON.parse(require('fs').readFileSync('/dev/stdin','utf8'));
|
||
console.log(d.status || 'unknown');
|
||
")
|
||
if [ "$STATUS" == "success" ]; then
|
||
echo "✅ 第 ${i} 次修复成功!"
|
||
echo "REPAIR_SUCCESS=true" >> $GITHUB_ENV
|
||
exit 0
|
||
fi
|
||
fi
|
||
|
||
echo "❌ 第 ${i} 次修复失败"
|
||
[ $i -lt 3 ] && echo "等待60秒后重试..." && sleep 60
|
||
done
|
||
|
||
echo "REPAIR_SUCCESS=false" >> $GITHUB_ENV
|
||
echo "❌ 三次修复全部失败 · 进入邮件告警"
|
||
env:
|
||
GH_TOKEN: $ secrets.GITHUB_TOKEN
|
||
|
||
- name: "📧 邮件告警(三次失败或红色级别)"
|
||
if: |
|
||
steps.skyeye-check.outputs.level == 'red' ||
|
||
(steps.skyeye-check.outputs.level == 'yellow' && env.REPAIR_SUCCESS == 'false')
|
||
run: |
|
||
HOURS=$ steps.skyeye-check.outputs.hours
|
||
LEVEL=$ steps.skyeye-check.outputs.level
|
||
|
||
# 方案C:创建 GitHub Issue 作为告警
|
||
gh issue create \
|
||
--title "🚨 dev-status.json 同步故障 · 中断${HOURS}h · 需人工干预" \
|
||
--body "## 🚨 dev-status.json 同步故障通知
|
||
|
||
**告警级别**:${LEVEL}
|
||
**中断时长**:${HOURS}h
|
||
**修复尝试**:$( [ '$LEVEL' == 'red' ] && echo '已跳过(超48h直接告警)' || echo '3/3 失败' )
|
||
|
||
### 建议操作
|
||
1. 检查 GitHub Secrets 中的 NOTION_API_KEY 是否有效
|
||
2. 手动触发 sync-dev-status.yml 验证
|
||
3. 查看最近的 Actions 运行日志定位根因
|
||
|
||
### 指令溯源
|
||
ZY-DEVSYNC-REBUILD-2026-0325-001 · 霜砚签发 · 冰朔授权
|
||
" \
|
||
--label "🚨 系统告警,dev-status,需人工干预"
|
||
|
||
echo "📧 已创建 Issue 告警 · GitHub 将自动发送邮件通知到仓库 owner"
|
||
env:
|
||
GH_TOKEN: $ secrets.GITHUB_TOKEN
|
||
|
||
- name: "📋 写入天眼修复记录"
|
||
if: always()
|
||
run: |
|
||
REPAIR_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
||
LEVEL=$ steps.skyeye-check.outputs.level
|
||
mkdir -p signal-log
|
||
echo "{\"check_time\": \"$REPAIR_TIME\", \"d10_level\": \"$LEVEL\", \"repair_result\": \"${REPAIR_SUCCESS:-skipped}\", \"mechanism\": \"skyeye-devsync-repair-v1.0\"}" \
|
||
> signal-log/skyeye-d10-$(date -u +%Y%m%d).json
|
||
git add signal-log/ 2>/dev/null || true
|
||
git diff --cached --quiet || (\
|
||
git config user.name "天眼 (SKYEYE)" && \
|
||
git config user.email "skyeye@guanghulab.system" && \
|
||
git commit -m "🦅 天眼 D10 · dev-status 修复记录 · $LEVEL · $REPAIR_TIME" && \
|
||
git push origin main\
|
||
) || true
|
||
```
|
||
|
||
## P5-5 · 注册到天眼基础设施清单
|
||
|
||
```jsx
|
||
在 skyeye/infra-manifest.json 中追加以下节点:
|
||
|
||
{
|
||
"node_id": "SYNC-DEV-STATUS-V1",
|
||
"name": "dev-status.json 同步 · 霜砚签发制",
|
||
"type": "sync_pipeline",
|
||
"workflow": ".github/workflows/sync-dev-status.yml",
|
||
"repair_workflow": ".github/workflows/skyeye-devsync-repair.yml",
|
||
"schedule": {
|
||
"sync": ["09:00 CST", "22:00 CST"],
|
||
"monitor": "08:30 CST"
|
||
},
|
||
"thresholds": {
|
||
"yellow_hours": 14,
|
||
"red_hours": 48
|
||
},
|
||
"alert_target": "EMAIL_REDACTED@qq.com",
|
||
"mechanism": "shuangyan-signed-v1.0",
|
||
"instruction_ref": "ZY-DEVSYNC-REBUILD-2026-0325-001",
|
||
"created": "2026-03-25",
|
||
"status": "active"
|
||
}
|
||
|
||
提交信息:
|
||
feat(infra-manifest): 注册 dev-status 同步节点 · 霜砚签发制 + 天眼三次修复闭环
|
||
instruction: ZY-DEVSYNC-REBUILD-2026-0325-001
|
||
```
|
||
|
||
## P5 完成标准
|
||
|
||
```jsx
|
||
✅ skyeye-devsync-repair.yml 已创建 · cron 配置为 08:30 北京时间
|
||
✅ 三级告警阈值已配置(🟢≤14h · 🟡≤48h · 🔴>48h)
|
||
✅ 三次修复闭环逻辑已实现
|
||
✅ 邮件告警机制已实现(GitHub Issue → 邮件通知)
|
||
✅ 天眼基础设施清单已注册新节点
|
||
→ 天眼三次修复闭环 + 邮件告警机制已上线
|
||
```
|
||
|
||
---
|
||
|
||
# Phase 6 · 回执 + 状态回写
|
||
|
||
<aside>
|
||
📋
|
||
|
||
**没有回执的执行 = 静默失败 = 不被系统承认。这是铁律。**
|
||
|
||
铸渊必须在完成所有 Phase 后,写标准 SYSLOG 回传到 Notion。
|
||
|
||
</aside>
|
||
|
||
## P6-1 · 写 SYSLOG 标准回执
|
||
|
||
```jsx
|
||
SYSLOG 格式(v4.1 标准):
|
||
|
||
---SYSLOG-START---
|
||
指令编号: ZY-DEVSYNC-REBUILD-2026-0325-001
|
||
执行时间: [实际执行时间]
|
||
执行主体: AG-ZY-01 铸渊
|
||
|
||
[Phase 0] 本体论锚定
|
||
状态: ✅ 通过 / ❌ 失败
|
||
备注: [具体情况]
|
||
|
||
[Phase 1] 天眼系统启动
|
||
状态: ✅ 上线 / ⚠️ 部分异常 / ❌ 失败
|
||
守卫状态: GitHub[状态] / Notion[状态] / Actions[状态]
|
||
Notion API 配额: [状态]
|
||
备注: [具体情况]
|
||
|
||
[Phase 2] 核心大脑人格体唤醒
|
||
状态: ✅ 完成 / ⚠️ 部分异常
|
||
版本戳: v3.2 确认
|
||
历史工单: 已知晓 · 本指令替代历史修复
|
||
|
||
[Phase 3] 现状诊断
|
||
状态: ✅ 完成
|
||
同步 Workflow: [存在/不存在]
|
||
失败根因: [A/B/C/D/E]
|
||
Secrets: NOTION_TOKEN[状态] · GITHUB_TOKEN[状态]
|
||
dev-status.json: last_sync=[时间]
|
||
诊断结论: [一句话总结]
|
||
|
||
[Phase 4] 新同步机制实现
|
||
状态: ✅ 完成 / ⚠️ 部分完成
|
||
sync-dev-status.yml: [已创建/已更新]
|
||
scripts/sync-dev-status.js: [已创建/已更新]
|
||
首次同步: [成功/失败]
|
||
dev-status.json 更新: [时间] · [team_count]人 · hash=[前12位]
|
||
|
||
[Phase 5] 天眼三次修复闭环
|
||
状态: ✅ 完成
|
||
skyeye-devsync-repair.yml: [已创建]
|
||
三级告警: 🟢≤14h · 🟡≤48h · 🔴>48h [已配置]
|
||
邮件告警: [方案A/B/C] [已实现]
|
||
infra-manifest.json: [已注册新节点]
|
||
|
||
[总结]
|
||
本次执行状态: ✅ 正常完成 / ⚠️ 部分完成
|
||
new_mechanism: shuangyan-signed-v1.0
|
||
new_workflows: sync-dev-status.yml + skyeye-devsync-repair.yml
|
||
需要人工处理的事项: [列表,无则写「无」]
|
||
下次建议巡检时间: [明日 08:30]
|
||
---SYSLOG-END---
|
||
```
|
||
|
||
## P6-2 · 写入 Notion 运行日志
|
||
|
||
```jsx
|
||
通过 bridge-syslog-to-notion.yml 将 SYSLOG 回传到 Notion。
|
||
|
||
写入目标:光湖语言壳 Notion端 · 运行日志
|
||
|
||
必填字段:
|
||
- 指令编号: ZY-DEVSYNC-REBUILD-2026-0325-001
|
||
- 执行主体: AG-ZY-01 铸渊
|
||
- 执行时间: [实际时间]
|
||
- 总体状态: 正常完成 / 部分完成 / 失败
|
||
- SYSLOG全文: [P6-1 完整内容]
|
||
- 需人工处理事项: [列表]
|
||
```
|
||
|
||
## P6-3 · 关闭历史工单
|
||
|
||
```jsx
|
||
本指令成功执行后,以下历史工单/告警应更新状态:
|
||
|
||
→ D10 天眼告警(dev-status.json 同步中断超213h+)
|
||
→ 更新为:✅ 已修复 · 新机制 shuangyan-signed-v1.0 上线
|
||
|
||
→ 历史指令 ZY-DEVSYNC-FIX(2026-03-15)
|
||
→ 标记为:已被 ZY-DEVSYNC-REBUILD-2026-0325-001 替代
|
||
|
||
→ 历史桥接巡检修复指令(2026-03-11)中 dev-status 相关条目
|
||
→ 标记为:已被新机制替代
|
||
```
|
||
|
||
## P6 完成标准
|
||
|
||
```jsx
|
||
✅ SYSLOG 完整回执已写入
|
||
✅ Notion 运行日志已写入
|
||
✅ 历史工单已更新/关闭
|
||
→ 本次 ZY-DEVSYNC-REBUILD-2026-0325-001 执行完毕
|
||
→ 铸渊可进入待机状态,等待下一条指令
|
||
```
|
||
|
||
---
|
||
|
||
# 全局执行完成
|
||
|
||
<aside>
|
||
🎯
|
||
|
||
**ZY-DEVSYNC-REBUILD-2026-0325-001 · 上下篇全部执行完毕标志**
|
||
|
||
✅ Phase 0 本体论锚定
|
||
|
||
✅ Phase 1 天眼系统上线
|
||
|
||
✅ Phase 2 核心大脑人格体唤醒
|
||
|
||
✅ Phase 3 现状诊断完成 · 根因已定位
|
||
|
||
✅ Phase 4 霜砚签发制新同步机制上线
|
||
|
||
✅ Phase 5 天眼三次修复闭环 + 邮件告警上线
|
||
|
||
✅ Phase 6 回执 + 状态回写
|
||
|
||
**→ dev-status.json 同步机制已重建。不再静默失败。**
|
||
|
||
</aside>
|
||
|
||
---
|
||
|
||
> 铸渊签名校验协议 v1.1 · docs/[zhuyuan-signature-protocol.md](http://zhuyuan-signature-protocol.md)
|
||
>
|
||
|
||
> 本指令由 AG-SY-01 霜砚签发 · TCS-0002∞ 冰朔授权 · AG-ZY-01 铸渊执行
|
||
>
|
||
|
||
> 版权锚点:国作登字-2026-A-00037559 · 系统在通感语言核语言膜内运行
|
||
> |