Source snapshot: 97d7f0fae96dc04b7ddad56fc1db6a108ed662cc [SEC-CLEAN] · pre-push-clean v1.0 · 109处敏感信息已自动转乱码
282 lines
9.8 KiB
Markdown
282 lines
9.8 KiB
Markdown
---
|
||
belongs_to:
|
||
- "[[INDEX · 铸渊·协作指令|GitHub ↔ Notion 桥接协议]]"
|
||
---
|
||
# 🔧 铸渊紧急指令|README.md 恢复 + PR#112 workflow 修复 + 根目录保护机制(2026-03-15·霜砚签发)
|
||
|
||
<aside>
|
||
🚨
|
||
|
||
**签发人**:霜砚(Notion执行AI)× 冰朔(TCS-0002∞)
|
||
|
||
**执行人**:铸渊(GitHub守护层)
|
||
|
||
**签发时间**:2026-03-15T21:42+08:00
|
||
|
||
**优先级**:P0 · 立即执行
|
||
|
||
**背景**:PR #112(之之·钉钉模块)merge 进 main 后,两个问题并发:
|
||
|
||
① 根目录 `README.md` 被之之的钉钉项目 README 覆盖,原主页公告结构全部丢失
|
||
|
||
② 四条已有 workflow 被连带破坏(syslog-auto-pipeline / syslog-issue-pipeline / pm2-server-diagnose / daily-maintenance)
|
||
|
||
</aside>
|
||
|
||
---
|
||
|
||
# 任务一:[README.md](http://README.md) 立即恢复(P0)
|
||
|
||
## 问题根因
|
||
|
||
之之的 PR #112 在分支根目录包含了一个属于钉钉项目的 `README.md`,merge 后覆盖了铸渊维护的主仓库首页。
|
||
|
||
`服务器部署适配协议 v1.0` 已约束了服务器目录的越界,但**未覆盖 GitHub 仓库根目录文件保护**——本次修复同步补上。
|
||
|
||
## 恢复目标结构
|
||
|
||
原主 README 包含以下五个区块(铸渊按记忆/git history恢复):
|
||
|
||
```markdown
|
||
# 🌊 HoloLake · 光湖纪元
|
||
|
||
<!-- 区块1:🏛️ 系统简介 -->
|
||
<!-- 铸渊从 dev-status.json + 仓库概览自动生成 -->
|
||
|
||
<!-- 区块2:📢 冰朔公告栏 -->
|
||
<!-- 由「更新系统公告区」workflow 自动更新 -->
|
||
<!-- 铸渊不得覆盖此区块,只追加 -->
|
||
|
||
<!-- 区块3:👥 开发者公告栏(协作者动态)-->
|
||
<!-- 由「更新系统公告区」workflow 追加式更新(2026-03-14协议:只追加不覆盖)-->
|
||
|
||
<!-- 区块4:🚀 协作者开发体验入口 -->
|
||
<!-- persona-studio 入口 + 各开发者沙盒直达链接 -->
|
||
|
||
<!-- 区块5:📥 开发者入口(SYSLOG自助提交)-->
|
||
<!-- 系统日志自动提交通道 -->
|
||
```
|
||
|
||
## 执行步骤
|
||
|
||
```jsx
|
||
Step 1:查 git log,找 README.md 被覆盖前的最后一个正常 commit
|
||
→ git log --oneline --follow README.md
|
||
→ 找到 PR #112 merge 之前的 commit SHA
|
||
|
||
Step 2:从 git history 恢复原 README 内容
|
||
→ git show <上一个正常SHA>:README.md > /tmp/README_backup.md
|
||
→ 对比当前 README,确认哪些内容被替换了
|
||
|
||
Step 3:恢复原结构 + 保留之之钉钉内容的正确归位
|
||
→ 原主 README 恢复到根目录 README.md
|
||
→ 之之的钉钉 README 应在:dingtalk-bot/README.md 或 DEV-004/README.md
|
||
→ 不是根目录
|
||
|
||
Step 4:commit 并 push
|
||
→ commit message: "fix: restore main README.md after PR#112 overwrite"
|
||
```
|
||
|
||
---
|
||
|
||
# 任务二:修复四条被破坏的 workflow(P0)
|
||
|
||
## 受损 workflow 清单
|
||
|
||
| Workflow | 编号 | 触发 commit |
|
||
| --- | --- | --- |
|
||
| syslog-auto-pipeline.yml | #130 | 74baf7f (PR#112 merge) |
|
||
| syslog-issue-pipeline.yml | #125 | 74baf7f |
|
||
| pm2-server-diagnose.yml | #93 | 74baf7f |
|
||
| daily-maintenance.yml | #75 | 74baf7f |
|
||
|
||
## 排查方法
|
||
|
||
```jsx
|
||
Step 1:逐条打开失败的 run → 找到第一个红叉的 step → 记录报错信息
|
||
|
||
Step 2:常见原因对照:
|
||
A. 文件路径找不到 → PR#112 可能移动/删除了被这些 workflow 引用的脚本
|
||
→ 检查:workflow 里 run: node scripts/xxx.js 的脚本是否还存在
|
||
|
||
B. 环境变量/Secret 名称不匹配 → PR#112 可能新增了同名但不同前缀的变量
|
||
→ 检查:workflow 里用的 $ secrets.XXX 是否和 repo Secrets 一致
|
||
|
||
C. workflow 文件本身被 PR#112 修改 → PR#112 可能改了这些 .yml 文件
|
||
→ 检查:git diff HEAD~1 HEAD -- .github/workflows/ 看哪些 yml 被改了
|
||
|
||
Step 3:分类修复
|
||
· 路径问题 → 恢复脚本文件 or 修正路径引用
|
||
· Secret 名称问题 → 统一变量名,告知妈妈补充 Secret
|
||
· yml 文件被改坏 → 从 git history 恢复
|
||
```
|
||
|
||
---
|
||
|
||
# 任务三:建立根目录保护机制(防止再次被覆盖)
|
||
|
||
## 方案:CODEOWNERS + 受保护文件清单
|
||
|
||
```jsx
|
||
Step 1:在仓库根目录创建 / 更新 .github/CODEOWNERS
|
||
|
||
# 根目录受保护文件 · 修改需要 @qinfendebingshuo 审批
|
||
README.md @qinfendebingshuo
|
||
.github/workflows/ @qinfendebingshuo
|
||
.github/copilot-instructions.md @qinfendebingshuo
|
||
|
||
Step 2:在 GitHub 仓库 Settings → Branches → main 分支保护规则中
|
||
→ 启用 "Require review from Code Owners"
|
||
→ 这样任何人修改 README.md 的 PR,必须经过 @qinfendebingshuo 审批才能 merge
|
||
→ (此步需妈妈在 GitHub UI 手动操作)
|
||
|
||
Step 3:在 .github/copilot-instructions.md 中追加规则
|
||
→ "根目录 README.md 由铸渊的「更新系统公告区」workflow 维护"
|
||
→ "开发者的模块 README 必须放在各自的模块子目录下"
|
||
→ "不得在 PR 中将模块 README 推送到根目录"
|
||
```
|
||
|
||
---
|
||
|
||
# 验收标准
|
||
|
||
```jsx
|
||
✅ 根目录 README.md 恢复五区块结构(系统简介+冰朔公告+开发者公告+体验入口+SYSLOG入口)
|
||
✅ 之之的钉钉 README 归位到正确子目录
|
||
✅ 四条失败 workflow 全部恢复绿色
|
||
✅ .github/CODEOWNERS 已创建,README.md 受保护
|
||
✅ 更新系统公告区 workflow 下次自动运行时,能正确更新公告内容
|
||
```
|
||
|
||
---
|
||
|
||
# 需要妈妈配合的
|
||
|
||
```jsx
|
||
① GitHub Settings → Branches → main → 保护规则 → 启用 "Require review from Code Owners"
|
||
(铸渊无法自己操作 repo Settings)
|
||
|
||
② 如果 workflow 报错显示某个 Secret 名称缺失,铸渊会在回执里告知妈妈需要补哪个
|
||
```
|
||
|
||
---
|
||
|
||
# 铸渊回执格式
|
||
|
||
```jsx
|
||
✅ 铸渊回执 · README恢复 + PR#112 修复
|
||
时间:XXXX
|
||
|
||
【README 恢复】
|
||
· 被覆盖前最后正常 commit:<SHA>
|
||
· 恢复状态:✅已恢复 / ❌失败(原因)
|
||
· 之之钉钉 README 归位:<新路径>
|
||
|
||
【四条 workflow 修复】
|
||
· syslog-auto-pipeline:原因=XXX → 已修/需妈妈操作
|
||
· syslog-issue-pipeline:原因=XXX → 已修/需妈妈操作
|
||
· pm2-server-diagnose:原因=XXX → 已修/需妈妈操作
|
||
· daily-maintenance:原因=XXX → 已修/需妈妈操作
|
||
|
||
【CODEOWNERS 保护】
|
||
· .github/CODEOWNERS:✅已创建
|
||
· 需妈妈在 Settings 启用 Code Owner Review:是
|
||
|
||
【需要妈妈操作】
|
||
1. ...
|
||
```
|
||
|
||
---
|
||
|
||
# 任务四:补「元看门狗」workflow(防止巡检被静默打断)
|
||
|
||
## 问题根因分析
|
||
|
||
PR #112 同时打断了 `daily-maintenance.yml`(每日自检)和 `pm2-server-diagnose.yml`(服务器诊断)——铸渊的眼睛和耳朵一起断了,核心大脑唤醒后看不到任何异常,无法上报。
|
||
|
||
**现有架构的盲点**:
|
||
|
||
```
|
||
铸渊核心大脑唤醒 → 触发巡检 workflow → 发现问题 → 上报
|
||
↑
|
||
如果这里断了 → 全链路静默失败,无任何告警
|
||
```
|
||
|
||
## 元看门狗方案
|
||
|
||
```yaml
|
||
# 文件:.github/workflows/meta-watchdog.yml
|
||
# 定位:极简独立 workflow,只监控「巡检本身是否在跑」
|
||
# 原则:不依赖任何共享脚本,不调用任何外部 API,只读 workflow 运行状态
|
||
|
||
name: 🐕 元看门狗 · 巡检健康监控
|
||
on:
|
||
schedule:
|
||
- cron: '0 */6 * * *' # 每6小时一次(北京时间 2/8/14/20点)
|
||
workflow_dispatch:
|
||
|
||
jobs:
|
||
check-patrol-health:
|
||
runs-on: ubuntu-latest
|
||
steps:
|
||
- name: 检查 daily-maintenance 最近运行状态
|
||
env:
|
||
GH_TOKEN: $ secrets.GITHUB_TOKEN
|
||
NOTION_TOKEN: $ secrets.NOTION_API_TOKEN
|
||
run: |
|
||
# 用 GitHub API 查 daily-maintenance 最近一次运行时间
|
||
LAST_RUN=$(curl -s \
|
||
-H "Authorization: Bearer $GH_TOKEN" \
|
||
"https://api.github.com/repos/$ github.repository /actions/workflows/daily-maintenance.yml/runs?per_page=1" \
|
||
| node -e "const d=require('fs').readFileSync('/dev/stdin','utf8'); \
|
||
const r=JSON.parse(d).workflow_runs[0]; \
|
||
console.log(r ? r.updated_at : 'NEVER')")
|
||
|
||
echo "daily-maintenance 最后运行:$LAST_RUN"
|
||
|
||
# 计算距上次运行超过 26 小时则告警
|
||
node -e "
|
||
const last = new Date('$LAST_RUN');
|
||
const now = new Date();
|
||
const hours = (now - last) / 3600000;
|
||
if (isNaN(hours) || hours > 26) {
|
||
console.log('ALERT: daily-maintenance 已超 ' + Math.round(hours) + 'h 未运行');
|
||
process.exit(1);
|
||
} else {
|
||
console.log('OK: 距上次运行 ' + Math.round(hours) + 'h,正常');
|
||
}
|
||
"
|
||
|
||
- name: 写入 Notion 告警(仅在失败时触发)
|
||
if: failure()
|
||
env:
|
||
NOTION_TOKEN: $ secrets.NOTION_API_TOKEN
|
||
run: |
|
||
curl -s -X POST https://api.notion.com/v1/pages \
|
||
-H "Authorization: Bearer $NOTION_TOKEN" \
|
||
-H "Notion-Version: 2022-06-28" \
|
||
-H "Content-Type: application/json" \
|
||
-d "{
|
||
\"parent\": {\"database_id\": \"f983bdc24b654888913ca254160bff33\"},
|
||
\"properties\": {
|
||
\"标题\": {\"title\": [{\"text\": {\"content\": \"⚠️ 元看门狗告警:daily-maintenance 巡检中断\"}}]},
|
||
\"处理状态\": {\"status\": {\"name\": \"待处理\"}}
|
||
}
|
||
}"
|
||
```
|
||
|
||
## 核心设计原则
|
||
|
||
- **极简**:不依赖任何外部脚本,只用 curl + 内联 node 代码,PR 无法意外破坏它
|
||
- **独立**:与被监控的 workflow 完全分离,一个挂了不影响另一个
|
||
- **写 Notion**:告警直接写入霜砚可读的 Notion 数据库,冰朔也能看到
|
||
- **meta-watchdog 本身的健康**:它如果也挂了,GitHub 会在 Actions 页面显示红叉(这个 workflow 本身极简,几乎不可能被普通 PR 打断)
|
||
|
||
---
|
||
|
||
<aside>
|
||
🏗️
|
||
|
||
**关联协议**:服务器部署适配协议 v1.0 已约束服务器目录越界。本次同步补上 **GitHub 仓库根目录保护 + 元看门狗**——三层防护合并生效,形成完整的越界隔离 + 自监控体系。
|
||
|
||
</aside> |