--- belongs_to: - "[[INDEX · 铸渊·协作指令|GitHub ↔ Notion 桥接协议]]" --- # 🔧 铸渊紧急指令|README.md 恢复 + PR#112 workflow 修复 + 根目录保护机制(2026-03-15·霜砚签发) --- # 任务一:[README.md](http://README.md) 立即恢复(P0) ## 问题根因 之之的 PR #112 在分支根目录包含了一个属于钉钉项目的 `README.md`,merge 后覆盖了铸渊维护的主仓库首页。 `服务器部署适配协议 v1.0` 已约束了服务器目录的越界,但**未覆盖 GitHub 仓库根目录文件保护**——本次修复同步补上。 ## 恢复目标结构 原主 README 包含以下五个区块(铸渊按记忆/git history恢复): ```markdown # 🌊 HoloLake · 光湖纪元 ``` ## 执行步骤 ```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: · 恢复状态:✅已恢复 / ❌失败(原因) · 之之钉钉 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 打断) ---