---
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
>