# AGENTS.md

本文件适用于整个仓库。

## 1. 项目目标

- 目标不是"看起来完成"，而是形成可验证、可审计、可上线的真实闭环。
- 任何"已完成""已收口""可上线"的表述，都必须以本地实际执行过的命令和证据为依据。
- 迭代速度优先，但速度不牺牲质量：快速验证、快速反馈、快速修正。

## 2. Gitea 协作规则

### 2.1 分支策略

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

### 2.2 PR 规范

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

### 2.3 提交规范

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

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

### 3.1 任务拆分原则

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

### 3.2 并行执行模式

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

### 3.3 智能体分工

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

### 3.4 冲突解决

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

## 4. 方案对比机制

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

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

### 4.2 对比维度

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

### 4.3 决策记录

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

## 5. 测试全面性要求

### 5.1 测试层级

- **单元测试**：每个函数/方法必须有对应的单元测试。
- **集成测试**：跨模块交互必须有集成测试。
- **E2E 测试**：用户主流程必须有真实浏览器 E2E 测试。

### 5.2 测试覆盖要求

- 新增代码必须有对应测试。
- 修复 bug 必须有回归测试。
- 安全敏感代码必须有边界条件测试。

### 5.3 测试执行策略

- 本地开发：运行受影响的最小测试集。
- PR 提交前：运行完整测试矩阵。
- 合并后：运行完整 E2E 验证。

### 5.4 防虚假测试规则

- 禁止使用 mock 响应替代真实 API 调用进行 E2E 验证。
- 禁止在测试中硬编码预期结果而不走真实业务链路。
- 禁止跳过认证、权限校验等安全环节直接断言页面状态。
- 禁止在测试中使用 `context.Background()` 绕过上下文治理。
- E2E 测试必须：
  - 启动真实后端进程（隔离测试数据库）
  - 启动真实前端开发服务器
  - 通过真实浏览器（CDP 协议）执行用户操作
  - 验证真实 API 响应（非 mock）
  - 验证真实数据库状态变化
- 当前项目的真实 E2E 路径：
  - Playwright CDP E2E：`cd frontend/admin && npm.cmd run e2e:full:win`
  - 覆盖场景：管理员引导、注册、邮箱激活、登录、认证工作流、响应式布局、桌面/移动端导航
- 未来增强方向：
  - 引入 `agent-browser`（bb browse）等浏览器自动化工具，补充 Playwright 未覆盖的交互场景
  - 增加复杂业务流程的端到端验证（如设备信任、批量操作、系统设置等）

## 6. 真实边界

- 当前受支持的真实浏览器主验收路径是：
  - `cd frontend/admin && npm.cmd run e2e:full:win`
- 当前可诚实宣称的是"浏览器级真实 E2E 已闭环"，不是"完整 OS 级自动化已闭环"。
- `smoke` 脚本仅用于补充诊断，不能被当成产品运行时依赖，也不能被当成主验收结论。
- `agent-browser` 目前只能辅助观察和诊断，不能替代受支持的项目 E2E 主链路。
- 当前 E2E 覆盖场景：
  - 管理员引导（admin-bootstrap）
  - 公开注册（public-registration）
  - 邮箱激活（email-activation）
  - 登录表面验证（login-surface）
  - 认证工作流（auth-workflow）
  - 响应式登录（responsive-login）
  - 桌面/移动端导航（desktop-mobile-navigation）
- E2E 测试架构：
  - Playwright CDP 协议连接真实浏览器
  - 隔离测试数据库（临时 SQLite 文件）
  - 本地 SMTP 捕获服务（验证邮件发送）
  - 信号收集器（console errors、dialogs、popups、request failures、401 responses）
  - 多视口验证（desktop 1440x960、tablet 820x1180、mobile 390x844）

## 7. 运行时规则

- 禁止在非测试代码中保留 `panic` 作为常规失败路径。
- 禁止运行时使用 mock provider、fake success 或"假成功返回"掩盖真实依赖缺失。
- 邮件、短信、OAuth、文件上传、外部调用必须 fail closed，不能失败后伪装成功。
- 对外部副作用必须考虑回滚：
  - 文件写入失败要清理半成品
  - 持久化失败要回滚已创建的文件或缓存状态
- 安全敏感接口必须保持 `no-store` 等防缓存约束。
- 前端原生弹窗和弹出页视为缺陷信号：
  - `window.alert`
  - `window.confirm`
  - `window.prompt`
  - `window.open`

## 8. 设计规则

- 优先使用显式错误分类，不要依赖字符串子串猜测错误类型。
- service 层依赖接口能力，不依赖具体 repository 实现断言。
- 配置模板中的敏感值必须留空或使用占位说明，真实密钥只能通过环境变量或密钥管理系统注入。
- release 约束必须在启动期失败，而不是运行中放任危险配置继续启动。

## 9. 编码与编码问题

- 如果终端显示乱码，不要把终端渲染出来的中文直接复制回业务逻辑。
- 遇到编码不稳定场景时，优先使用：
  - ASCII 文本
  - `\uXXXX` 转义
  - 显式错误类型
- 如果局部补丁频繁被编码噪音阻断，优先整段或整文件重写，不要继续赌字符串匹配。

## 10. 最低验证矩阵

- 只改后端时，至少执行：
  - `go test ./... -count=1`
  - `go vet ./...`
  - `go build ./cmd/server`
- 改前端时，至少执行：
  - `cd frontend/admin && npm.cmd run lint`
  - `cd frontend/admin && npm.cmd run build`
- 只要改动涉及以下任一类，就必须补真实浏览器回归：
  - 认证
  - 会话
  - 路由守卫
  - 导航
  - 弹窗保护
  - 用户主流程
  - `window` 相关防线
  - 影响登录页或后台主导航的改动
  - 命令：`cd frontend/admin && npm.cmd run e2e:full:win`

## 11. 文档同步规则

- 改变真实结论时，必须同步更新：
  - `docs/status/REAL_PROJECT_STATUS.md`
- 沉淀长期工程约束时，优先更新：
  - `docs/team/QUALITY_STANDARD.md`
  - `docs/team/PRODUCTION_CHECKLIST.md`
  - `docs/team/TECHNICAL_GUIDE.md`
- 形成阶段性经验总结时，沉淀到：
  - `docs/team/PROJECT_EXPERIENCE_SUMMARY.md`
- 新增架构决策时，写入：
  - `docs/decisions/` 目录

## 12. 对外表述规则

- 允许说：
  - "浏览器级真实 E2E 已闭环"
  - "本地可审计的一轮治理证据已形成"
- 不允许夸大成：
  - "完整 OS 级自动化已闭环"
  - "全部企业级生产治理材料都已闭环"
- 若仍缺少真实第三方 OAuth live 验证、外部 Secrets/KMS、多环境交付证据或 schema downgrade 回滚证据，必须明确说明。

## 13. 快速迭代规则

### 13.1 迭代节奏

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

### 13.2 阻塞处理

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

### 13.3 知识沉淀

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

## 14. 项目目录规范

### 14.1 目录结构

详见 `docs/PROJECT_STRUCTURE.md`，核心规范：

| 目录 | 用途 | 注意事项 |
|------|------|----------|
| `bin/` | 编译产物（二进制） | 禁止提交 |
| `cmd/` | 应用入口 | 每个应用一个子目录 |
| `internal/` | 私有内部包 | 不可被外部导入 |
| `pkg/` | 公共外部包 | 仅当需要作为独立库发布时使用 |
| `scripts/` | 脚本 | 按 dev/deploy/ops/test 分类 |
| `tools/` | 工具脚本 | Python/Shell 工具 |
| `configs/` | 配置文件 | JSON/YAML/TOML |
| `deployment/` | 部署配置 | Docker/K8s/Compose |
| `docs/` | 项目文档 | 分类管理 |
| `data/` | 运行时数据 | SQLite数据库等 |
| `logs/` | 日志输出 | |
| `uploads/` | 用户上传 | |

### 14.2 禁止在根目录放置

- ❌ 编译产物（*.exe, *.dll → bin/）
- ❌ 临时测试输出（*_result.txt, *_test.txt → 删除）
- ❌ 运行时日志（*.log → logs/）
- ❌ 环境配置文件（.env → 不提交）

### 14.3 新增目录检查

添加新目录前，确认：
1. 是否有必要？能用现有目录表达吗？
2. 符合命名规范？小写字母、中划线分隔
3. 放置位置正确？对应到规范中的位置
4. 是否需要版本控制？data/logs/uploads 通常不提交

### 14.4 文件命名规范

- Go源文件：`snake_case.go`
- 测试文件：`*_test.go`
- 配置文件：`snake_case.json/yaml/toml`
- 脚本文件：`snake_case.sh/ps1/py`
- Markdown：`kebab-case.md` 或 `snake_case.md`
