# 项目工程规则

版本：3.0  
更新时间：2026-04-02

本规则是当前项目的真实工程约束，不是泛化建议。

## 1. 基本原则

- 结论必须可验证，不能靠口头"已完成"。
- 优先真实闭环，拒绝 fake success、临时掩盖和只过局部样例。
- 任何上线结论都必须区分：
  - 浏览器级真实验证
  - OS 级自动化
  - 外部交付治理证据
- 迭代速度优先，但速度不牺牲质量：快速验证、快速反馈、快速修正。

## 2. 后端规则

### 2.1 运行时安全

- 非测试代码禁止保留 `panic` 作为常规失败路径。
- 配置不合法时应在启动期失败，不要运行后再暴露风险。
- 外部依赖缺失时必须显式禁用能力或启动失败，不能返回假成功。

### 2.2 错误处理

- 必须保留真实错误语义，不能吞错。
- 优先使用显式错误分类：
  - 例如 rate limit
  - validation
  - internal failure
- 禁止长期依赖字符串子串判断错误类型。

### 2.3 分层设计

- service 层依赖接口能力，不依赖具体 repository 类型断言。
- repository 负责持久化细节，service 负责业务编排和错误分级。
- 外部副作用必须 fail closed，并处理回滚。

### 2.4 安全与配置

- 敏感值不得硬编码到配置模板。
- release 模式必须限制：
  - 占位密钥
  - localhost OAuth 回调
  - `*` CORS 放行
  - 不安全 JWT 配置

## 3. 前端规则

### 3.1 浏览器行为

- 原生弹窗和 popup 不是"可以接受的小问题"，而是验收失败信号。
- 必须阻断并记录：
  - `alert`
  - `confirm`
  - `prompt`
  - `open`

### 3.2 主链路要求

- 登录页、后台主导航、路由守卫、认证状态恢复必须进入真实浏览器回归。
- 认证能力展示必须跟随后端 `capabilities`，不能前端硬编码。

### 3.3 smoke 边界

- `smoke` 只允许存在于测试或诊断层。
- 任何产品运行时逻辑都不得依赖 `smoke`。

## 4. 验证规则

### 4.1 后端最低门槛

```powershell
go test ./... -count=1
go vet ./...
go build ./cmd/server
```

### 4.2 前端最低门槛

```powershell
cd frontend/admin
npm.cmd run lint
npm.cmd run build
```

### 4.3 真实浏览器最低门槛

以下改动必须执行：

```powershell
cd frontend/admin
npm.cmd run e2e:full:win
```

适用改动：

- 认证
- 会话
- OAuth
- 登录页
- 路由守卫
- 主导航
- `window` 防线
- 用户主流程

### 4.4 测试覆盖要求

- 新增代码必须有对应测试。
- 修复 bug 必须有回归测试。
- 安全敏感代码必须有边界条件测试。
- 每个函数/方法必须有对应的单元测试。
- 跨模块交互必须有集成测试。
- 用户主流程必须有真实浏览器 E2E 测试。

### 4.5 防虚假测试规则

- 禁止使用 mock 响应替代真实 API 调用进行 E2E 验证。
- 禁止在测试中硬编码预期结果而不走真实业务链路。
- 禁止跳过认证、权限校验等安全环节直接断言页面状态。
- 禁止在测试中使用 `context.Background()` 绕过上下文治理。
- 禁止在测试中注入假数据后直接断言页面显示而不验证后端存储。
- 禁止用 `smoke` 脚本的结果替代主验收路径。

### 4.6 E2E 测试架构要求

- E2E 测试必须：
  - 启动真实后端进程（隔离测试数据库）
  - 启动真实前端开发服务器
  - 通过真实浏览器（CDP 协议）执行用户操作
  - 验证真实 API 响应（非 mock）
  - 验证真实数据库状态变化
- 当前项目的真实 E2E 路径：
  - Playwright CDP E2E：`cd frontend/admin && npm.cmd run e2e:full:win`
  - 覆盖场景：管理员引导、注册、邮箱激活、登录、认证工作流、响应式布局、桌面/移动端导航
- E2E 测试架构组件：
  - Playwright CDP 协议连接真实浏览器
  - 隔离测试数据库（临时 SQLite 文件）
  - 本地 SMTP 捕获服务（验证邮件发送）
  - 信号收集器（console errors、dialogs、popups、request failures、401 responses）
  - 多视口验证（desktop 1440x960、tablet 820x1180、mobile 390x844）
- 未来增强方向：
  - 引入 `agent-browser`（bb browse）等浏览器自动化工具，补充 Playwright 未覆盖的交互场景
  - 增加复杂业务流程的端到端验证（如设备信任、批量操作、系统设置等）

## 5. 方案对比机制

### 5.1 何时需要方案对比

- 新增核心功能或架构变更时。
- 存在多种可行实现路径时。
- 性能优化涉及重大权衡时。

### 5.2 对比维度

- 实现复杂度（人天/智能体时）
- 性能影响
- 可维护性
- 与现有架构的兼容性
- 测试难度

### 5.3 决策记录

- 选定的方案必须记录决策原因。
- 被否决的方案必须记录否决原因。
- 决策记录写入 PR 描述或 `docs/decisions/` 目录。

## 6. 文档规则

- 真实状态变化后必须更新 `docs/status/REAL_PROJECT_STATUS.md`。
- 团队长期规则变化后必须更新本文件和 `docs/team/PRODUCTION_CHECKLIST.md`。
- 形成阶段性经验后必须沉淀到 `docs/team/PROJECT_EXPERIENCE_SUMMARY.md`。
- 新增架构决策时，写入 `docs/decisions/` 目录。

## 7. Gitea 协作规则

### 7.1 分支策略

- `main` 分支：始终可构建、可测试通过，是唯一的发布基线。
- `feature/<简短描述>`：功能分支，每个独立功能一个分支。
- `fix/<简短描述>`：修复分支，每个独立修复一个分支。
- 禁止直接推送到 `main`，所有变更必须通过 PR 合并。

### 7.2 PR 规范

- 每个 PR 只包含一个逻辑变更。
- PR 描述必须包含：
  - 变更目的（1-2 句）
  - 验证命令及结果
  - 影响范围（后端/前端/文档）
- PR 合并前必须通过最低验证矩阵。

### 7.3 提交规范

- 提交信息格式：`类型: 简短描述`
  - 类型：`feat`、`fix`、`test`、`docs`、`refactor`、`chore`
- 每次提交应该是可独立验证的最小单元。

## 8. 多智能体并行工作流

### 8.1 任务拆分原则

- 每个任务必须是独立的、可并行执行的单元。
- 任务之间如果有依赖，必须明确标注依赖关系和执行顺序。
- 前后端分离的任务优先并行执行。

### 8.2 并行执行模式

- **方案对比阶段**：多个智能体并行输出不同方案，由决策者选择最优解。
- **实现阶段**：无依赖的任务并行执行，有依赖的任务按拓扑序执行。
- **验证阶段**：后端测试、前端 lint/build、E2E 测试并行执行。

### 8.3 智能体分工

- **规划智能体**：负责任务拆分、依赖分析、方案对比。
- **实现智能体**：负责编码，每个智能体负责一个独立任务。
- **验证智能体**：负责测试执行、结果验证、报告生成。
- **审查智能体**：负责代码审查、安全审查、性能审查。

### 8.4 冲突解决

- 多个智能体修改同一文件时，必须在任务拆分阶段识别并协调。
- 如果发生合并冲突，优先保留功能完整的版本，手动合并差异。

## 9. 快速迭代规则

### 9.1 迭代节奏

- 小步快跑：每个迭代周期不超过 2 小时。
- 持续验证：每个迭代完成后立即执行验证矩阵。
- 快速回滚：如果验证失败，立即回滚到上一个可用状态。

### 9.2 阻塞处理

- 遇到阻塞时，立即记录阻塞原因和影响范围。
- 优先寻找替代方案，而不是等待阻塞解除。
- 阻塞超过 30 分钟必须上报并寻求协助。

### 9.3 知识沉淀

- 每次解决的问题必须记录解决方案。
- 每次踩过的坑必须记录避免方法。
- 每次验证通过的命令必须记录执行结果。

## 10. 禁止项

- 禁止"只跑单个用例就宣布收口"。
- 禁止"因为环境受限就把诊断脚本包装成主验收路径"。
- 禁止"为了通过测试保留运行时 mock provider"。
- 禁止"服务层通过具体仓储断言完成业务"。
- 禁止"因为终端乱码就把乱码字面量继续扩散到业务逻辑"。
- 禁止"用 mock 响应替代真实 API 调用进行 E2E 验证"。
- 禁止"在测试中硬编码预期结果而不走真实业务链路"。
- 禁止"跳过认证、权限校验等安全环节直接断言页面状态"。
