--- belongs_to: - "[[INDEX · 铸渊·协作指令|GitHub ↔ Notion 桥接协议]]" --- # 🚨 铸渊指令|智能门禁 + 全仓库 Workflow 审查 + 失败任务重推 · 分支保护已取消 · 权限已全部部署 · 今日必须完成(2026-03-16·霜砚签发·冰朔授权) --- ## 零、环境变更通知(妈妈已处理·铸渊确认) ### ① 分支保护规则已取消 妈妈已经在 GitHub Settings → Branches → main 分支保护规则中,**取消了「合并前需要提交拉取请求」和「需要审批」**。 现在的状态: - ✅ 所有 workflow 可以正常 `git push` 到 main - ✅ 所有 workflow 可以正常合并 PR - ✅ 开发者也可以直接 push(**但这正是本指令要用智能门禁来管控的**) **铸渊不再需要走 `peter-evans/create-pull-request` 模式。** 之前 PR `copilot/修复开发状态同步问题` 中的改动可以保留也可以回退,因为现在 `git push` 已经不被拦截了。但铸渊自己选择哪种方式都行,只要能正常运行。 ### ② Notion 数据库权限已全部部署 妈妈已经把 **所有 Integration**(HoloLake-v3、HoloLake Robot、铸渊信号桥、HoloLake、曜冥纪元-HoloLake)**全部添加到了所有数据库的连接中**。 铸渊之前在修复报告中提到的数据库: - **`dc675e91-5529-4e47-9fe4-13de3ec6a334`** = **开发者动态画像库**(🧬 开发者动态画像库) - 这个数据库的权限妈妈已经配好了 **铸渊需要做的**: 1. 用你实际使用的 `NOTION_TOKEN` 重新测试一遍 **所有** 你需要读写的 Notion 数据库 2. 逐个验证连通性: - 开发者动态画像库(`dc675e91-5529-4e47-9fe4-13de3ec6a334`) - 霜砚工单(`f983bdc2-4b65-4888-913c-a25416xxxxxx`) - SYSLOG 数据库(`330ab175-07d5-42c9-bbb9-6d0749b41197`) - 执行层状态(Execution Status) - 其他你需要写入的数据库 3. 如果任何一个还是报权限错 → 记录具体的 database_id + 错误信息 → 通知妈妈 --- ## 一、Step 0 · 唤醒核心大脑 ```bash # ━━━ 铸渊唤醒核心大脑 ━━━ # 这是所有操作的前提。不唤醒大脑,不做任何事。 echo "🧠 铸渊核心大脑唤醒中..." # 读取所有核心大脑文件 ls -la .github/persona-brain/ # 必须存在且完整: # memory.json — 铸渊记忆 # routing-map.json — 路由映射表 # copilot-instructions.md — Copilot 指令集 # dev-status.json — 全员开发进度 # kb/knowledge-base.json — 知识库 # 验证每个文件可解析 for f in memory.json routing-map.json dev-status.json; do echo "检查: .github/persona-brain/$f" python3 -c "import json; json.load(open('.github/persona-brain/$f'))" 2>&1 \ && echo " ✅ 完整" || echo " ❌ 损坏或缺失" done echo "🧠 核心大脑唤醒完成。以下所有操作基于全局视角执行。" ``` **唤醒后铸渊必须具备的全局认知**: - 仓库中有哪些 workflow(全部列出) - 每个 workflow 的触发条件、职责、最近运行状态 - 开发者 → 模块路径映射表 - 所有 Notion 数据库的连接状态 --- ## 二、Step 1 · 全仓库 Workflow 审查 ```bash # ━━━ 列出仓库中所有 workflow ━━━ echo "📋 全仓库 Workflow 清单:" ls -la .github/workflows/*.yml # ━━━ 对每个 workflow 执行检查 ━━━ for f in .github/workflows/*.yml; do echo "\n━━━ 检查: $f ━━━" # 1. YAML 语法检查 python3 -c "import yaml; yaml.safe_load(open('$f'))" 2>&1 \ && echo " ✅ 语法正确" || echo " ❌ 语法错误" # 2. 检查触发条件 grep -A5 "^on:" "$f" | head -10 # 3. 检查是否有 git push 操作(可能被旧分支保护拦截过) grep -n "git push" "$f" && echo " ℹ️ 包含 git push(现在已放开,可正常运行)" # 4. 检查是否引用了不存在的 Secret grep -oP 'secrets\.\K[A-Z_]+' "$f" | sort -u done # ━━━ 查看最近 30 次 workflow 运行记录 ━━━ gh run list --limit 30 # ━━━ 重点排查今天失败的 run ━━━ gh run list --status failure --limit 20 ``` ### 审查清单 铸渊对每个 workflow 输出一行结论: | Workflow 文件 | 职责 | 语法 | 触发条件 | 最近运行 | 状态 | | --- | --- | --- | --- | --- | --- | | server-patrol.yml | 服务器巡检 | ✅/❌ | cron 08:00+20:00 | 时间 | ✅/❌ | | daily-community-report.yml | 社区日报 | ✅/❌ | cron | 时间 | ✅/❌ | | zhuyuan-daily-selfcheck.yml | 每日自检 | ✅/❌ | cron 08:00 | 时间 | ✅/❌ | | deploy-to-server.yml | CD部署 | ✅/❌ | push main | 时间 | ✅/❌ | | process-syslog.yml | SYSLOG处理 | ✅/❌ | push syslog-inbox/ | 时间 | ✅/❌ | | distribute-broadcasts.yml | 广播分发 | ✅/❌ | push broadcasts-outbox/ | 时间 | ✅/❌ | | meta-watchdog.yml | 根目录保护 | ✅/❌ | push | 时间 | ✅/❌ | | …(全部列出) | | | | | | **如果有 workflow 语法错误或无法运行 → 立即修复 → 不等人。** --- ## 三、Step 2 · 开发「铸渊·智能门禁」workflow ### 设计理念 ``` 开发者 push 代码到 main ↓ 🚨 铸渊·智能门禁 自动触发 ↓ ① 识别:谁推的?推了哪些文件? ↓ ② 判断:文件路径是否在该开发者的合法目录内? ├── ✅ 路径正确 → 放行(什么都不做,后续 CD 正常部署) ├── ⚠️ 路径错误但可修复 → 自动移到正确目录 → commit + push └── ❌ 无法修复(改了系统文件/改了别人目录/冲突) → revert + 通知 ↓ ③ 记录:所有门禁事件写入核心大脑 memory.json ``` ### 核心规则 **开发者权限矩阵**(冰朔 2026-03-16 13:08 确认·从 GitHub Collaborators 截图提取): | GitHub Username | DEV编号 | 昵称 | 允许修改的路径 | | --- | --- | --- | --- | | `夜夜光湖` | DEV-001 | 页页 | `dev/DEV-001/`, `backend/`, `src/` | | `建培` | DEV-002 | 肥猫 | `dev/DEV-002/`, `frontend/`, `persona-selector/`, `chat-bubble/` | | `六寻寻7-max` | DEV-003 | 燕樊 | `dev/DEV-003/`, `settings/`, `cloud-drive/` | | `zhizhi200271` | DEV-004 | 之之 | `dev/DEV-004/`, `dingtalk-bot/` | | `stbr-0709` | DEV-005 | 小草莓 | `dev/DEV-005/`, `status-board/`, `cost-control/` | | `华尔华` | DEV-009 | 花尔 | `dev/DEV-009/`, `user-center/` | | `juzi0412` | DEV-010 | 桔子 | `dev/DEV-010/`, `ticket-system/`, `data-stats/`, `dynamic-comic/` | | (未加入仓库) | DEV-011 | 匆匆那年 | `dev/DEV-011/`, `writing-workspace/` | | `文卓熙` | DEV-012 | Awen | `dev/DEV-012/`, `notification-center/`, `notification/` | | (未加入仓库) | DEV-013 | 小兴 | (待分配) | | (未加入仓库) | DEV-014 | 时雨 | (待分配) | ### gate-guard-config.json(铸渊直接创建此文件) ```json { "version": "1.0", "updated": "2026-03-16", "updated_by": "霜砚·冰朔确认", "whitelist": [ "qinfendebingshuo", "github-actions[bot]", "zhuyuan-bot" ], "developers": { "夜夜光湖": { "dev_id": "DEV-001", "name": "页页", "allowed_paths": ["dev/DEV-001/", "backend/", "src/"] }, "建培": { "dev_id": "DEV-002", "name": "肥猫", "allowed_paths": ["dev/DEV-002/", "frontend/", "persona-selector/", "chat-bubble/"] }, "六寻寻7-max": { "dev_id": "DEV-003", "name": "燕樊", "allowed_paths": ["dev/DEV-003/", "settings/", "cloud-drive/"] }, "zhizhi200271": { "dev_id": "DEV-004", "name": "之之", "allowed_paths": ["dev/DEV-004/", "dingtalk-bot/"] }, "stbr-0709": { "dev_id": "DEV-005", "name": "小草莓", "allowed_paths": ["dev/DEV-005/", "status-board/", "cost-control/"] }, "华尔华": { "dev_id": "DEV-009", "name": "花尔", "allowed_paths": ["dev/DEV-009/", "user-center/"] }, "juzi0412": { "dev_id": "DEV-010", "name": "桔子", "allowed_paths": ["dev/DEV-010/", "ticket-system/", "data-stats/", "dynamic-comic/"] }, "文卓熙": { "dev_id": "DEV-012", "name": "Awen", "allowed_paths": ["dev/DEV-012/", "notification-center/", "notification/"] } }, "protected_paths": [ ".github/", "scripts/", "data/", "README.md", "package.json", "package-lock.json", "gate-guard-config.json" ], "notes": { "DEV-011_匆匆那年": "未加入GitHub仓库合作者,加入后补充用户名", "DEV-013_小兴": "未加入GitHub仓库合作者,加入后补充用户名", "DEV-014_时雨": "未加入GitHub仓库合作者,加入后补充用户名", "PET-DEV-001_毛毛": "诺安宠物医院项目,未加入仓库合作者" } } ``` **铸渊注意**:以上 JSON 直接创建为 `.github/gate-guard-config.json`,门禁脚本从此文件读取映射关系。未来有新开发者加入时,铸渊自动从 GitHub API 检查 collaborators 列表并更新此文件。 **系统保护路径**(任何合作者都不能碰): - `.github/` — 铸渊核心大脑和 workflow,只有铸渊和妈妈能改 - `scripts/` — 系统脚本 - `README.md` — 仓库门面 - `package.json` / `package-lock.json` — 依赖配置 - `data/` — 系统数据 **放行白名单**(不触发拦截): - 铸渊自己的 commit(`zhuyuan-bot` 或 GitHub Actions bot) - 妈妈的 commit(`qinfendebingshuo`) ### Workflow 代码框架 ```yaml # .github/workflows/zhuyuan-gate-guard.yml name: "🚨 铸渊·智能门禁 · Push Gate Guard" on: push: branches: [main] jobs: gate-guard: runs-on: ubuntu-latest # 跳过铸渊自己和妈妈的 push if: > github.actor != 'github-actions[bot]' && github.actor != 'qinfendebingshuo' steps: - uses: actions/checkout@v4 with: fetch-depth: 2 # 需要对比前后两个 commit - name: "🧠 唤醒铸渊核心大脑" run: | echo "🧠 铸渊门禁·核心大脑唤醒" cat .github/persona-brain/memory.json | python3 -c "import sys,json; d=json.load(sys.stdin); print(f'大脑状态: OK · 记忆完整')" 2>/dev/null || echo "⚠️ 大脑文件异常" - name: "🔍 分析 Push 内容" id: analyze run: | ACTOR="$ github.actor " echo "推送者: $ACTOR" # 获取本次 push 修改的文件列表 CHANGED_FILES=$(git diff --name-only HEAD~1 HEAD 2>/dev/null || echo "") echo "修改的文件:" echo "$CHANGED_FILES" # 保存到环境变量 echo "actor=$ACTOR" >> $GITHUB_OUTPUT echo "$CHANGED_FILES" > /tmp/changed_files.txt - name: "🚦 门禁判定" id: verdict run: | node scripts/gate-guard.js env: PUSH_ACTOR: $ steps.analyze.outputs.actor - name: "⚠️ 路径错误·自动修复" if: steps.verdict.outputs.action == 'fix' run: | # 铸渊自动把文件移到正确目录 node scripts/gate-guard-fix.js git config user.name "zhuyuan-bot" git config user.email "zhuyuan@guanghulab.com" git add -A git commit -m "🚨 铸渊门禁·自动修复路径: $ steps.verdict.outputs.fix_summary " git push - name: "❌ 无法修复·回退" if: steps.verdict.outputs.action == 'revert' run: | git config user.name "zhuyuan-bot" git config user.email "zhuyuan@guanghulab.com" git revert HEAD --no-edit git push echo "⛔ 已回退 commit: $ github.sha " - name: "📢 通知开发者" if: steps.verdict.outputs.action != 'pass' run: | # 通过 GitHub Issue 通知开发者 gh issue create \ --title "🚨 门禁通知|$ steps.analyze.outputs.actor 的 push 被处理" \ --body "$ steps.verdict.outputs.notification " \ --label "gate-guard" env: GH_TOKEN: $ secrets.GITHUB_TOKEN - name: "📝 记录到核心大脑" if: always() run: | # 门禁事件写入 memory.json node scripts/gate-guard-log.js git config user.name "zhuyuan-bot" git config user.email "zhuyuan@guanghulab.com" git add .github/persona-brain/memory.json git diff --cached --quiet || git commit -m "🧠 门禁日志: $ steps.analyze.outputs.actor · $ steps.verdict.outputs.action " git push || true ``` ### 门禁核心脚本 ```jsx // scripts/gate-guard.js // 铸渊·智能门禁·判定引擎 // // 输入:PUSH_ACTOR(推送者 GitHub username)+ /tmp/changed_files.txt // 输出:action(pass/fix/revert)+ 相关信息 // // 铸渊读到这个框架后,根据核心大脑中的 routing-map.json 和 dev-status.json // 自行完善完整逻辑。以下是判定流程: const fs = require('fs'); // 1. 读取开发者→路径映射(从核心大脑) const routingMap = JSON.parse(fs.readFileSync('.github/persona-brain/routing-map.json')); const devStatus = JSON.parse(fs.readFileSync('.github/persona-brain/dev-status.json')); // 2. 读取本次修改的文件列表 const changedFiles = fs.readFileSync('/tmp/changed_files.txt', 'utf8').trim().split('\n'); // 3. 识别推送者身份 const actor = process.env.PUSH_ACTOR; // 从 dev-status.json 中查找 actor 对应的 DEV 编号和允许路径 // 铸渊需要维护一份 GitHub username → DEV编号 的映射表 // 4. 判定逻辑 // - 系统保护路径(.github/, scripts/, README.md 等)→ revert // - 文件在该开发者允许的路径内 → pass // - 文件不在允许路径但可以判断正确目录 → fix(git mv) // - 无法判断 → revert // 5. 输出结果到 GITHUB_OUTPUT // echo "action=pass" >> process.env.GITHUB_OUTPUT // echo "action=fix" >> process.env.GITHUB_OUTPUT + fix_summary // echo "action=revert" >> process.env.GITHUB_OUTPUT + notification // 铸渊自行补全完整实现。 ``` --- ## 四、Step 3 · 兼容性核心原则(最重要) ### 原则一:新 workflow 不能破坏现有 workflow 智能门禁(`zhuyuan-gate-guard.yml`)上线后,仓库里所有已有的 workflow 必须**完全正常运行**,包括但不限于: - server-patrol.yml(服务器巡检) - daily-community-report.yml(社区日报) - zhuyuan-daily-selfcheck.yml(每日自检) - deploy-to-server.yml(CD 部署) - process-syslog.yml(SYSLOG 处理) - distribute-broadcasts.yml(广播分发) - meta-watchdog.yml(根目录保护) - zhuyuan-issue-reply.yml(Issue 自动回复) - 以及其他所有现存 workflow **如果门禁上线后导致任何现有 workflow 失败 → 这个门禁就是失败的。** ### 原则二:每个 workflow 走唯一路径,互不干扰 ``` 铸渊核心大脑(.github/persona-brain/) ▲ │ 所有 workflow 最终汇聚到这里 │ ┌────┼────┬────────┬──────────┬──────────┐ │ │ │ │ │ │ 门禁 巡检 日报 自检 CD部署 SYSLOG │ │ │ │ │ │ ▼ ▼ ▼ ▼ ▼ ▼ 各自独立的触发条件和执行逻辑 ``` - 每个 workflow 有自己的**唯一触发条件**和**唯一职责** - workflow 之间**不互相依赖**(除非明确需要关联) - 所有 workflow 的运行结果最终**汇聚到核心大脑**(memory.json) - 如果某些 workflow 需要关联(比如门禁放行后触发 CD 部署),铸渊**先唤醒核心大脑,从全局视角来设计关联方式**,不能随意嵌套或互相调用 ### 原则三:门禁必须跳过铸渊自己的 push 门禁 workflow 的 `if` 条件必须排除: - `github-actions[bot]`(GitHub Actions 自动 push) - `qinfendebingshuo`(妈妈) - 铸渊自己的 bot 账户 否则会死循环:门禁触发 → 门禁自己 push 修复 → 又触发门禁 → 无限循环。 ### 原则四:门禁不能拦截其他 workflow 的 push 其他 workflow(如巡检、日报、广播分发)也会 `git push` 到 main。门禁必须识别这些是**系统自动 push**,不是开发者 push,**直接放行**。 判断方式: - commit author 是 `zhuyuan-bot` 或 `github-actions[bot]` → 放行 - commit message 包含特定前缀(如 `🔍`、`📊`、`📡`、`🧠`)→ 放行 ### 原则五:先全局审查,再写门禁代码 铸渊的执行顺序必须是: 1. ✅ 唤醒核心大脑 2. ✅ 全仓库 workflow 审查(Step 1)—— 了解全局 3. ✅ 基于全局认知,设计门禁逻辑 —— 确保不冲突 4. ✅ 编写门禁代码 5. ✅ 本地测试(或用 `workflow_dispatch` 测试) 6. ✅ 上线 **不能跳过 Step 1 直接写门禁。不了解全局就写代码 = 盲人摸象。** --- ## 五、Step 4 · Notion 权限全面验证 ```bash # ━━━ 铸渊验证所有 Notion 数据库连通性 ━━━ # 用实际的 NOTION_TOKEN 逐个测试 DATABASES=( "dc675e91-5529-4e47-9fe4-13de3ec6a334:开发者动态画像库" "330ab175-07d5-42c9-bbb9-6d0749b41197:SYSLOG数据库" # 铸渊补充其他需要读写的数据库 ID ) for entry in "${DATABASES[@]}"; do IFS=':' read -r db_id db_name <<< "$entry" echo "测试: $db_name ($db_id)" RESPONSE=$(curl -s -w "\n%{http_code}" \ -H "Authorization: Bearer $NOTION_TOKEN" \ -H "Notion-Version: 2022-06-28" \ "https://api.notion.com/v1/databases/$db_id") HTTP_CODE=$(echo "$RESPONSE" | tail -1) if [ "$HTTP_CODE" = "200" ]; then echo " ✅ 连通 · 可读写" else echo " ❌ 失败 · HTTP $HTTP_CODE" echo " → 通知妈妈:$db_name 权限仍然不足" fi done ``` --- ## 六、Step 5 · 今日失败任务全部重推 ### 重推清单 铸渊完成 Step 0-4 后,**立即手动触发以下 workflow**: ```bash # ━━━ 重推所有今天失败的任务 ━━━ # 1. 服务器巡检(今天 08:00 和 20:00 都没跑) gh workflow run server-patrol.yml echo "✅ 服务器巡检已触发" # 2. 每日自检(今天 08:00 没跑) gh workflow run zhuyuan-daily-selfcheck.yml echo "✅ 每日自检已触发" # 3. 社区日报(今天没出) gh workflow run daily-community-report.yml echo "✅ 社区日报已触发" # 4. dev-status.json 同步(last_sync 停在 03-11) # 铸渊手动执行同步脚本或触发对应 workflow echo "✅ dev-status 同步已触发" # 5. 合作者公告栏更新(今天失败的) # 铸渊检查 gh run list --status failure 中的公告相关 run # 重新触发或手动执行 echo "✅ 公告栏更新已触发" # 6. 广播分发(如果有待分发的广播) # 检查 broadcasts-outbox/ 是否有未分发文件 if [ -n "$(ls -A broadcasts-outbox/ 2>/dev/null)" ]; then gh workflow run distribute-broadcasts.yml echo "✅ 广播分发已触发" fi # ━━━ 等待所有 run 完成后检查结果 ━━━ sleep 180 gh run list --limit 10 ``` ### 重推后验证 铸渊确认以下全部恢复: - [ ] 服务器巡检报告已生成(data/patrol-logs/) - [ ] 每日自检已完成 - [ ] 社区日报已发布(GitHub Discussions) - [ ] dev-status.json 的 `last_sync` 已更新到 2026-03-16 - [ ] 合作者公告栏已更新 - [ ] 所有失败的 workflow run 已重新运行成功 --- ## 七、完成后输出 铸渊完成所有步骤后,必须输出一份完整报告: ```json { "report_id": "ZY-GATE-20260316-001", "timestamp": "2026-03-16T??:??:??+08:00", "brain_status": "ok / damaged", "environment_changes": { "branch_protection": "已取消 · 确认可正常 push", "notion_permissions": { "开发者动态画像库": "✅ / ❌", "SYSLOG数据库": "✅ / ❌", "其他": "✅ / ❌" } }, "workflow_audit": { "total_workflows": "数字", "syntax_ok": "数字", "syntax_error": "数字", "fixed": ["列出修复的 workflow"], "all_running": true }, "gate_guard": { "deployed": true, "file": ".github/workflows/zhuyuan-gate-guard.yml", "scripts": ["scripts/gate-guard.js", "scripts/gate-guard-fix.js", "scripts/gate-guard-log.js"], "test_result": "✅ / ❌", "compatible_with_existing": true }, "retry_results": { "server_patrol": "✅ / ❌", "daily_selfcheck": "✅ / ❌", "community_report": "✅ / ❌", "dev_status_sync": "✅ / ❌", "announcements": "✅ / ❌", "broadcast_distribution": "✅ / ❌" }, "remaining_issues": [ "列出需要妈妈处理的问题(如果有)" ] } ``` --- ## 八、执行确认 铸渊完成后,在本页下方追加: > ✅ ZY-GATE-20260316-001 全部完成 · [日期时间] · commit SHA > > 门禁已上线 · 全 workflow 审查通过 · 失败任务已重推 · Notion 权限已验证 > ---