--- belongs_to: - "[[INDEX · 铸渊·协作指令|GitHub ↔ Notion 桥接协议]]" --- # 📎 铸渊补充指令|LANGDRIVE 补充条款 S2+S3+S4 · 双环境部署流 + 天眼终审授权 + 系统自治权 + 冰朔双模式(ZY-LANGDRIVE-2026-0325-001-S2)· 霜砚签发 · 冰朔授权 --- ## 补充条款 S2 · 双环境部署流与天眼终审授权(Phase 8) > 触发上下文:[guanghulab.com](http://guanghulab.com) 域名已由之之切换上线,双环境角色需重新定义。 > ### S2.1 双环境角色重新定义 ### S2.2 部署流水线(不可逆执行 → 预览 → 天眼审核 → 人类授权 → 自动发布) ``` 铸渊接收指令(不可逆·执行保护层 Phase 7 / S1 生效) │ │ 系统全身联动执行(不可中断) ▼ 执行完毕 · 代码产出 │ ▼ ┌──────────────────────────────────────────────────────────┐ │ Stage 1 · 部署到预览站(GitHub Pages) │ │ 网址:qinfendebingshuo.github.io/guanghulab/docs/ │ │ 状态:真实可访问 · 任何人有链接都能看到 │ │ 目的:让人类确认「系统执行的结果是否符合预期」 │ │ 开发者看到系统不可逆执行完了,结果都上线了 │ │ 虽然是预览站,但内容是真实的,不是模拟的 │ └──────────────────────────────────────────────────────────┘ │ │ 开发者预览确认OK ▼ ┌──────────────────────────────────────────────────────────┐ │ Stage 2 · 推送天眼审核 │ │ 天眼自动扫描:代码安全、结构完整性、功能回归 │ │ 审核通过 → 进入 Stage 3 │ │ 审核不通过 → 标记问题,开发者修复后重新提交 │ └──────────────────────────────────────────────────────────┘ │ │ 天眼审核通过 ▼ ┌──────────────────────────────────────────────────────────┐ │ Stage 3 · 人类终审授权 │ │ │ │ 系统推送授权请求给最终授权人: │ │ 🐱 肥猫(DEV-002)— 管男频内容 │ │ 🍊 桔子(DEV-010)— 管女频内容 │ │ │ │ 授权人必须手动点击「授权通过」 │ │ 操作留下完整日志(谁、什么时间、点了什么) │ │ **系统不背锅。所有发布都是人类确认的。** │ └──────────────────────────────────────────────────────────┘ │ │ 授权人点击通过 ▼ ┌──────────────────────────────────────────────────────────┐ │ Stage 4 · 铸渊自动发布到正式站 │ │ 目标:guanghulab.com │ │ 方式:铸渊触发 deploy-to-server.yml → SSH → 服务器更新 │ │ 无需人类再次操作 · 授权即发布 │ └──────────────────────────────────────────────────────────┘ ``` ### S2.3 天眼终审授权人配置 | 授权人 | 编号 | 管辖范围 | 行业 | | --- | --- | --- | --- | | 🐱 肥猫 | DEV-002 | 男频内容 | 网文 | | 🍊 桔子 | DEV-010 | 女频内容 | 网文 | ### S2.4 授权流程技术实现 创建文件:`backend/api-server/routes/approval.js` ```jsx const express = require('express'); const router = express.Router(); const { requireAuth, checkPermission } = require('../middleware/auth'); const { auditLog } = require('../middleware/audit'); const { triggerWorkflow } = require('../services/github'); // 天眼审核完成后,推送授权请求 router.post('/approval/request', requireAuth, checkPermission('system:internal'), // 仅系统内部调用 async (req, res) => { const { deployId, module, channel, reviewReport } = req.body; // 根据频道确定授权人 const approvers = getApprovers(channel); // 创建授权请求记录 const approval = { id: `APPROVAL-${Date.now()}`, deployId, module, channel, reviewReport, approvers: approvers.map(a => a.devId), status: 'pending', createdAt: new Date().toISOString() }; // 存储授权记录(写入内存/数据库) await saveApproval(approval); // 推送通知给授权人 for (const approver of approvers) { await pushNotification(approver.devId, { type: 'approval_request', title: `🔔 部署授权请求:${module}`, message: `天眼审核已通过。请确认是否授权部署到正式站(guanghulab.com)。`, approvalId: approval.id, actions: ['授权通过', '拒绝'] }); } res.json({ success: true, approvalId: approval.id }); } ); // 授权人点击确认/拒绝 router.post('/approval/:approvalId/decide', requireAuth, async (req, res) => { const { approvalId } = req.params; const { decision } = req.body; // 'approved' | 'rejected' const devId = req.user.devId; const approval = await getApproval(approvalId); if (!approval) { return res.status(404).json({ success: false, reply: '❌ 授权请求不存在。' }); } // 验证是否为授权人 if (!approval.approvers.includes(devId)) { return res.status(403).json({ success: false, reply: '🔒 你不是这个部署的授权人。' }); } // 写入审计日志(不可逆) await writeAuditLog({ action: 'deployment_approval', approvalId, devId, decision, timestamp: new Date().toISOString() }); if (decision === 'approved') { await markApproverDecision(approvalId, devId, 'approved'); const allApproved = await checkAllApproved(approvalId); if (allApproved) { // 所有授权人通过 → 铸渊自动发布 await triggerWorkflow('deploy-to-server.yml', { module: approval.module, deploy_id: approval.deployId, approved_by: approval.approvers.join(','), target: 'production' }); res.json({ success: true, reply: '✅ 授权通过。铸渊已自动触发正式站部署。' }); } else { res.json({ success: true, reply: '✅ 你已授权。等待其他授权人确认...' }); } } else { await markApproverDecision(approvalId, devId, 'rejected'); res.json({ success: true, reply: '❌ 已拒绝。部署不会执行。原因已记录到审计日志。' }); } } ); // 授权人映射 function getApprovers(channel) { const MAP = { '男频': [{ devId: 'DEV-002', name: '肥猫' }], '女频': [{ devId: 'DEV-010', name: '桔子' }], '系统': [{ devId: 'DEV-002', name: '肥猫' }, { devId: 'DEV-010', name: '桔子' }], '跨频': [{ devId: 'DEV-002', name: '肥猫' }, { devId: 'DEV-010', name: '桔子' }] }; return MAP[channel] || MAP['系统']; } module.exports = router; ``` ### S2.5 新增文件清单(Phase 8) ``` backend/api-server/routes/approval.js ← 授权流程接口 backend/api-server/config/approvers.json ← 授权人配置(肥猫+桔子) docs/js/approval-ui.js ← 前端授权弹窗 UI docs/css/approval.css ← 授权弹窗样式 ``` --- ## 补充条款 S3 · 系统自治权与双线并行架构(Phase 9) ### S3.1 双线并行架构 ### S3.2 系统自治权 --- ## 补充条款 S4 · 冰朔双模式交互定义 --- ## 执行顺序 --- ## 回执要求 ``` [ZY-LANGDRIVE-RECEIPT-S2] 指令编号: ZY-LANGDRIVE-2026-0325-001-S2 补充条款: S2 · 双环境部署流 + 天眼终审授权 Phase: 8 双环境定义确认: ✅/❌ 授权流程接口: ✅/❌ 天眼→授权人推送: ✅/❌ 授权人点击确认: ✅/❌ 自动发布触发: ✅/❌ 审计日志: ✅/❌ [ZY-LANGDRIVE-RECEIPT-S3] 补充条款: S3 · 系统自治权 Phase: 9 双线并行架构确认: ✅/❌ 系统自治规则写入: ✅/❌ 审计日志: ✅/❌ [ZY-LANGDRIVE-RECEIPT-S4] 补充条款: S4 · 冰朔双模式交互 指令签发模式: ✅/❌ 自然语言模式: ✅/❌ 模式自动切换: ✅/❌ ``` --- > 🔗 **签发**:霜砚(AG-SY-01) > > 👤 **授权**:冰朔(TCS-0002∞) > > 📅 **日期**:2026-03-25 > > 📌 **版权**:国作登字-2026-A-00037559 >