Files
pj0235-eai_agentplatform/CODING_RULES.md
T
eaiadminandClaude Code 16d63de4e1 chore: 工作台产品化进行中的改动
把工作区里其余在制品一并入库,主要是工作台产品化的推进:

  后端:新增 capability_definition / project / my_app_center / office_skill
        接口与 action_definition / skill_definition / project / user_app_center
        模型,config 加路由健康上报。
  前端:新增 frontend/src/skills(Office 技能与 workbuddy 复刻)、
        项目管理、应用中心、能力目录页,以及配套 api / store / config;
        聊天侧新增 SpecialistChip / SpecialistPanel / SkillStrip / AppChatRail
        等组件。
  清理:移除旧 views/tools 下的单页工具(已并入工作台)、_frozen 冻结组件、
        cmd/inspect_oa_debug 调试入口,以及两份调试笔记。
  其它:文档与启动脚本同步。

(这批改动与上一提交的 SY23 工作并行进行,此前已在同一工作区内交织。)

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-17 21:32:35 +08:00

15 KiB
Raw Blame History

eai_agentplatform 博昇 AI 数字员工平台(EAI Agent Platform)— 编码与调试最高准则

版本:V1.0 日期:2026-08-15 状态:必须强制执行 (Highest Priority) 适用范围:eai_agentplatform(EAI 数字员工平台)后端(Go)、前端(Vue3)、数据库(SQLite)、AI 检索/对话、考试引擎、素材上传与审批 AI 助手启动任何任务前必须先读取并确认本文件。


整理说明:参考 pj034-oeamgt TOP_CODING_RULES.md 结构体系重组。 分组方式:第一部分是 EAIHub 博昇 AI 中心通用规则;第二部分是本项目专用规则。 编号方式:第一部分 G01-G08;第二部分 P01-P05。


第一部分:通用开发规则

适用范围:适用于 eai_agentplatform 及 EAIHub 下其他涉及 Go/Vue3/AI 的项目。 使用方式:新任务开始前应先通读本部分;项目专用规则(P)在遵守本部分基础上叠加。

索引

  • G01:深度调试日志 — 全链路埋点 + 特殊日志文件
  • G02:Fail Fast 与零静默兜底
  • G03:变量命名锚定 — 防命名漂移
  • G04:测试与验收 — 完成判定必须靠事实
  • G05:安全迁移与重构流程
  • G06:AI 助手行为规范
  • G07:交互控件可用态颜色统一
  • G08:分层清晰,禁止前后端职责串线

G01 最高原则:深度调试日志 (Special Log & Console Print)

任何涉及功能异常、逻辑排错、API 失败或模板渲染问题的任务,必须遵循以下调试流程:

  1. 强制全链路埋点:禁止盲目猜测,必须在后端路由、中间件、服务层以及前端 JS 关键回调中,大量写入过程性输出。
  2. 统一特殊日志文件:
    • 路径:debuglog/backend_YYYY-MM-DD.log(按天生成,由 start_dev_*.sh 落盘)
    • 内容:必须包含 [时间戳] [模块名] [详细描述]
    • 必须包含:请求参数、Session 状态、关键业务变量
    • 脱敏红线:落盘前必须脱敏/删除敏感信息(Authorization/Cookie/JWT/密码/API Key 等)
  3. 同步控制台输出:所有写入调试日志的内容必须同步 print 到 Console,以便开发者实时观察。
  4. 排查先读日志:在提出任何修复方案前,必须先调用读取工具检查该日志。

关键埋点清单

埋点位置 必须记录内容
API 调用 请求参数、响应状态、异常栈
数据库交互 查询关键参数、结果集摘要
文件操作 上传/转换/提取的文件路径、大小、状态
AI LLM 调用 发送给 AI 的完整 Payload + 返回原始正文;落盘前脱敏密钥/令牌

G02 最高原则:Fail Fast 与零静默兜底 (Fail Fast & Zero-Fallback)

  1. 禁止隐式回退:所有涉及配置、运行时资产的读取,严禁使用硬编码的默认值进行静默兜底。
  2. 配置/字段缺失即报错:如果代码依赖某项配置或 JSON 字段且其缺失,必须立即抛出异常并终止流程。
  3. 禁止入口层吞错:路由入口不得 try/except 后静默放行;凡关键身份、权限、业务校验失败,必须返回明确错误(4xx/5xx)并阻断流程。
  4. 禁止"先跑通再修正"策略:不得为"先可用"加入 hardcode 默认值、临时跳过校验等行为。这类行为视为质量事故。
  5. 错误可见性强制:任何违反业务规则或数据约束的问题,必须对开发者显式可见(日志 + 返回错误 + 可复现路径),禁止隐藏真实错误来源。
  6. 图片不做 OCR:严格按照 PRD V1.1 规定,图片(png/jpg/jpeg)不做 OCR、不进 AI 文本库。

反例与正例

反例 ❌ 正例 ✅
A 文件审批状态未知时默认视为"已通过" 状态非 approved 则拦截并返回明确错误
B LLM 配置缺失时使用硬编码的默认地址 配置缺失立即报错,引导管理员在系统参数补充
C 考试 session 不存在时返回空结果 Session 不存在返回 404 + 明确错误信息

G03 原则:变量命名锚定 — 防命名漂移 (Identity Anchoring)

  1. 变量名前缀强制化:所有业务相关变量必须带明确前缀(如 media_file_id, exam_session_key, product_code)。禁止使用 id, data, res 等模糊命名。
  2. 变量名全链路同步:同一业务参数在 API、Service、Model 层必须保持变量名完全一致。
  3. 最小长度约束:变量名原则上不短于 5 个字符(循环索引除外)。
  4. AI 引用已定义标识符必须按字符复制:AI 在生成或修改代码时,引用任何已在项目中定义过的标识符,必须先 Read/Grep 找到定义处,按字符原样复制,禁止自行改写大小写或分隔符。例如 user_id 不应被写成 userId 或 uid。

G04 最高原则:测试与验收 — 「我说完成」必须靠观察的事实

  1. 完成判定必须看 exit code,禁止仅看屏幕末尾文字:命令后立刻 echo $? 或 if [ $? -ne 0 ];链式命令必须确认每一段都退出 0。
  2. 修改既存文件前必须 Read 整文件,禁止凭印象 Edit。
  3. 新依赖必须同步进 go.mod / package.json:任何新 import 出现必检查此包是否在依赖清单中。
  4. 测试/build 失败时禁止"再试一次"侥幸:失败原因必须先找出来。
  5. 声明完成前的最小验证清单:
    • 后端:go build ./... 无编译错误 且 go test ./... 通过
    • 前端:npx vite build exit 0
    • API smoke:/api/health 返回 200,管理员 login 返回 200
    • 任何新 import 在依赖清单中

G05 原则:安全迁移与重构流程 (Secure Migration)

  1. 非简化原则:重构不得以简化逻辑为目的,必须保留所有原始业务深度。
  2. 实质性内容保护:除非内容明确放错位置、存在重复副本或已经完成等价迁移验证,否则不得删除原有实质性内容与技术细节。
  3. 全量备份:大规模操作前,将原始文件完整备份。
  4. 文件安全强制:
    • 文件扩展名白名单校验(仅允许 ppt/pptx/pdf/doc/docx/mp4/png/jpg/jpeg)
    • 文件名重命名为存储 UUID,杜绝路径穿越
    • 上传目录对静态预览只读,禁止直接执行

G06 原则:AI 助手行为规范

  1. 任务启动预读:AI 助手在接收到新任务后的第一步操作中,必须读取本项目根目录下的 CODING_RULES.md 与 eai_agentplatform/CLAUDE.md。
  2. 持续追踪:直到问题完全解决并经由日志或接口验证通过前,不得结束任务。
  3. 新对话启动仪式:新对话必须先读 eai_agentplatform/PROJECT_STATE.md → CODING_RULES.md,再开始干活。
  4. 发现规则与实现冲突时,优先提醒并修正,不得静默忽略。
  5. Git 同步状态必须用 -sb 显式确认:首次执行 git 相关操作时,必须使用 git status -sb 或 git status -v 而非简短版本,确保能清晰看到本地与远端的 ahead/behind 关系。禁止依赖 git diff HEAD origin/HEAD 单条链式命令判断,因其 && 链在中间出错时会导致后续输出丢失。
  6. Git 检查必须指定分支名:使用 origin/<branch>(如 origin/main)而非 origin/HEAD,避免 origin/HEAD 歧义。
  7. 验证输出后再总结:在给出 git 状态结论前,必须确认所有关键信息(ahead/behind、clean/dirty、branch)均已成功读取,不得在未确认完整性的情况下返回结论。

G07 原则:交互控件可用态颜色统一规范

  1. 按钮可用态统一蓝底:所有可点击的关键交互按钮必须使用蓝色底(推荐 #1677ff)。
  2. 按钮不可用态统一灰底:所有不可点击按钮必须使用灰色底(推荐 #cbd5e1)与灰色文字(推荐 #64748b),并保持 cursor: not-allowed。
  3. 状态变化必须实时联动视觉:按钮的 disabled 状态变化后,底色必须立即同步变化。
  4. Element Plus 严格类型约束:el-tag / el-button 的 type prop 禁止传入 "" 或 null;无条件匹配时应传 undefined。

G08 原则:分层清晰,禁止前后端职责串线

  1. 前端只负责:页面渲染、用户交互、表单收集、数据展示
  2. 后端必须负责:登录认证、权限校验、文件操作、AI 接口调用、业务判分逻辑、数据库操作
  3. 前端不可以直接持有 JWT Secret 或 AI API Key — 敏感凭据只在后端
  4. 前端可以做格式和必填校验,但后端必须再次做强校验
  5. 所有权限以后端鉴权为准:前端路由守卫仅作 UX 隐藏,不作为安全边界

第二部分:eai_agentplatform 项目专用规则

适用范围:仅适用于博昇 AI 数字员工平台项目。 使用方式:本部分在通用规则之上叠加。若两者看似冲突,应先检查是否为项目专用规则对通用规则的场景化收敛。

索引

  • P01:培训平台定位 — 知识库 + 考试 + 素材审批
  • P02:知识库安全与检索边界
  • P03:考试判分与记录规则
  • P04:素材上传与审批流程
  • P05:AI PathCoach 对话安全边界

P01 最高原则:平台定位 — 通用数字员工平台(对齐 D20/D25/D26)

  1. 本项目是 EAI 通用数字员工平台(Agent Platform):以「数字员工/专家、技能、长程 App」为核心对象,Chat 优先界面承载新建任务/对话,知识库作为组织级内建 App 有独立入口(对齐 D20「先通用、后定制」、D25 六层架构第 5 层对象层、D26 路由三类命名)。不再被描述为「博昇内部培训平台 / AI 对话机器人平台」。
  2. 首批四类通用数字员工(对齐 D20):知识运营、培训考试、内容生成、任务推进;后续再沉淀行业包与企业半定制。(原有产品知识/销售培训/考试等业务能力收敛为内部 App 注入其中。)
  3. 业务对象统一为一级对象(对齐 D21/D25/D26):Expert(专家/专员)、Skill(技能)、App(长程任务壳)。任务定义为「工作实例容器」,可挂载主 app、右栏 expert、后台 skill;消息流降级为对话轨迹,长程状态由 app 侧状态承载。
  4. 知识库是组织级内建 App(对齐 D25):素材审批 → 文本提取 → 知识切片 → 混合检索,有独立一级入口,不再只是后台能力。
  5. 开始写某个模块前,先明确对应文档:
    • docs/04_Backend/BE*.md(后端详细设计)
    • docs/06_Product_Lines/PL*.md(产品原型)
    • docs/08_Design_Rules/DR*.md(设计规则)

关联

  • 关联 G08:前端不持有业务逻辑,AI PathCoach 调用必须走后端 API
  • 关联 G02:配置/素材缺失必须报错,不静默兜底

P02 最高原则:知识库安全与检索边界

  1. 只存元数据,不存文件二进制:数据库仅存储文件路径、大小、类型等元数据。
  2. 素材文本存 knowledge_chunk 表:审批通过的文档类素材经异步转换提取文本,切片写入。
  3. 混合检索:AI 知识检索 = 向量(Go 内 brute-force 余弦,Ollama bge-m3 embedding)+ 关键词兜底;数据量小无需 ANN/向量库(不上 Milvus/FAISS/Elasticsearch)。
  4. 图片不进知识库:png/jpg/jpeg 仅做存储预览,不做 OCR 提取,不进 AI 文本检索。
  5. 审批前置:素材只有 approved 状态才会触发异步转换;pending / rejected 的素材不进知识库。
  6. 视频仅存储:mp4 文件上传后仅做存储和预览,不做视频分析、不做帧提取。

关联

  • 关联 G02:状态非 approved 的前端预览请求必须拦截
  • 关联 G05:文件安全校验(扩展名 + UUID存储 + 只读预览)
  • 关联 P04:审批是转换的前置条件

P03 原则:考试判分与记录规则

  1. 确定性判分:单选/多选/判断题型采用确定性规则判分;简答题(essay)除外——按 D17 走后端 LLM 评分(复用 title_gen 路由、essay_grade 能力,不扣点数)。所有判分都在后端。
  2. 判分逻辑必须在后端:前端仅做选项展示和提交,不得在前端判分。
  3. 自测 vs 正式考:
    • 自测(self_test):提交后立即显示正确答案 + 解析,不持久化成绩
    • 正式考(formal):提交后判分落 exam_record 表,不显示正确答案
  4. 考试试卷落库:试卷为 DB 持久化配置(exam_paper 表),按配置从题库抽题,成绩与记录保存到 exam_record,不使用进程内字典兜底。
  5. 正式考不可重做:同一用户对同一正式考卷仅可提交一次(后端校验)。

P04 原则:素材上传与审批流程

  1. 管理员上传自动通过:管理员(role=admin)上传的素材直接 approved + 立即触发异步转换。
  2. 员工上传需审批:员工上传后状态为 pending,管理员审批通过后才转 approved。
  3. 驳回必须填写理由:管理员驳回素材时,reject_reason 字段必填。
  4. 异步转换管线:审批通过 → 后台线程执行 LibreOffice(ppt/docx→pdf) → pdftotext(提取文本) → 切片 → 写入 knowledge_chunk。
  5. 前端轮询状态:前端通过 GET /api/media/{id}/status 轮询素材/转换状态,不使用 WebSocket。
  6. 分片上传:> 100MB 的视频文件走分片上传(init → chunk → complete)。

关联

  • 关联 G02:状态/配置缺失必须报错
  • 关联 G05:文件安全校验
  • 关联 P02:审批是知识库转换的前置条件

P05 原则:AI PathCoach 对话安全边界

  1. SSE 流式响应:AI PathCoach 对话采用 SSE (Server-Sent Events),末包采集 token usage。
  2. 上下文注入规则:AI 回答基于知识库检索结果 + 当前页面上下文,禁止注入管理员凭据/内部配置。
  3. 快捷动作限范围:
    • scenario(情景演练)— 使用预设 prompt 模拟客户对话
    • commission(查佣金)— 检索产品佣金数据
    • compare(产品对比)— 对比两个产品参数
  4. LLM 配置链:system_config 表 → .env 文件两层优先级,缺失任何一项(base_url/api_key/model)抛 501 LLMNotConfiguredError。
  5. 禁止功能:AI PathCoach 不做图片生成、不做代码生成、不做外部 API 调用。

关联

  • 关联 G02:配置缺失 Fail Fast(501),不静默兜底
  • 关联 G01:AI LLM 调用完整 Payload + 返回正文必须埋点日志
  • 关联 G08:AI 调用全程在后端,前端仅展示流式输出

注:本准则放置于项目根目录,作为全局 Rule 永久锁定。