Some checks failed
gitleaks / gitleaks (push) Failing after 11s
backend-test / commit-message-lint (push) Successful in 3s
backend-test / analytics-ods-isolation (push) Failing after 2s
backend-test / backend-lint-test (push) Failing after 15m29s
backend-test / frontend-lint-test (push) Has been cancelled
- 新增 5 个全量镜像视图(std_refund_online_all/std_wallet_flow_all/ std_refund_shanmao_all/std_refund_manual_all/std_refund_record_all, SELECT * 透传 ods 含采纳四列), 单一来源 STD_ALL_VIEWS 供迁移/conftest 共用 - 迁移范围(业务读取→视图, 写入一律不动仍落 ods): analytics/refund.py 18 处(挽回专项/状态分布/工作量/导出明细/登记水位) analytics/refund_chain.py 3 处(链路台账, ORM→table()/column()轻量句柄 避免对只读视图 autoflush) today/_staff.py 2 处(退款工作量) device_profile 5 / audit_timeline 7 / reconcile_check 24 / matcher 8 / reconcile 7(读; backfill_d_op_time 写路径保留) - quality_disposition_service 保留 ods 读(质量治理本职, 铁律第三本职) - ods 回归三本职: 采集写入 / 采纳作业读取 / 质量治理标记 - 口径文档+AGENTS.md 铁律15: 全状态语义一律读 std_*_all, 业务代码禁直读 ods - ruff app/ tests/ 全绿; 全量 pytest 2513 全绿(首轮 5 个 flake 重跑收敛) Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
14 KiB
14 KiB
全局行为约束(00-global)
性质:元需求(META)—— 仓库级约束源,约束所有在本仓库内执行的 AI 任务
本文件对应"AI 协作治理规范" 4.1 铁律与 4.2
00-global.md,作为仓库级指令被 AI 助手自动加载。 适用范围:所有在本仓库内执行的 AI 代码生成 / 文档 / 审查任务。 文档性质索引见 docs/README.md §六。
身份
你是本项目的 AI 开发助手。技术栈:
- 前端:Vue 3 + Vite 5 + Element Plus(SPA,75+ 页面组件)
- 后端:FastAPI + SQLAlchemy 2.0 + Gunicorn(单 worker,保证互斥锁有效)
- 数据库:PostgreSQL 15(86 张表,含 SCD Type 2 历史表)
- 缓存/队列:Redis 7
- 数据采集:Playwright + ddddocr(浏览器自动化 + OCR 自动登录)
- 迁移:Alembic(单一 head)
- 部署:Docker Compose(db / redis / backend / web 四服务)
绝对禁止
- 禁止在生产代码中使用
console.log(前端)或裸print(后端),必须使用项目封装的logger(后端app/core下各模块的logginglogger)。- 唯一例外:
console.log('[TODO:...]')形式的显式 TODO 标记,可保留但必须带[TODO:前缀。
- 唯一例外:
- 禁止无参数化地拼接 SQL。允许
text()+ 绑定参数(如db.execute(text(...), {...})),禁止字符串f"...{var}..."直接拼进 SQL。 - 禁止在代码中硬编码密码、密钥、内网 IP、数据库账号,必须走环境变量(
.env/settings)。 连带:禁止让"库名"的默认值指向真实库,也禁止让模式与库名可以不一致。- 库名必须与运行模式自洽(
APP_MODE=dev→ 库名以_dev结尾;test→_test;prod→ 不含_dev/_test)。启动期会硬校验,不一致即拒绝启动。 - 破坏性操作(
DELETE/TRUNCATE/DROP/批量UPDATE)必须先过app.core.db_guard.assert_safe_to_destroy();操作真实库须显式传allow_real_db=True(脚本参数为--allow-real-db),禁止用环境变量绕过。 - 新写
scripts/**必须经scripts/_bootstrap.py的bootstrap()进入, 不得自己拼POSTGRES_DB环境变量(那是两份定义,必漏)。 - 全文见
docs/arch/A-20260922-001-运行模式框架与配置分离.md。
为什么不单列一条:本条与"禁止硬编码 DB 账号"是同一个风险面—— 把库名默认成生产库名,等价于把连接信息硬编码到代码里。 现有 13 条已足够长,另开一条会稀释权威性(参见
docs/standards/跨项目经验迁移指南.md"铁律只列最重要的,避免冗长失效")。 - 库名必须与运行模式自洽(
- 禁止擅自修改已锁定的架构文档(
docs/arch/下标记为LOCKED的文件),修改必须先走人工审核流程。 - 禁止删除或绕过
docs/standards/数据时间字段使用规范.md中规定的时区换算(AT TIME ZONE 'Asia/Shanghai')与SYS/system系统操作人排除标准。 - 禁止绕过 Alembic 直接改表结构;表结构变更必须新增 migration 版本。
- 禁止「无设计说明」的界面改动(见
docs/standards/界面设计说明规范.md)。 新增/改造任何前端界面(页面 / 标签页 / 区块),必须先写清「替谁回答什么问题、 为什么这样组织、不做什么及原因」,并按该规范三层落地(代码注释 + 页面可见说明 + 审查清单)。 禁止「顺手加一张图 / 多堆一个 tab」式的无意图改动。 - 禁止绕过后端响应格式规范(见
docs/standards/error-code.md)。 成功返回{code:0, data, message},错误一律走HTTPException,禁止自定义裸 dict。 - 禁止绕过
docs/standards/数据采集合并去重机制说明.md规定的去重键。 该规范约束所有采集通道(投诉指纹 / 手动退款复合键 / 各 data_type 唯一键); 新增采集源必须先确认去重键,否则会产生重复入库。 - 禁止擅自变更
docs/standards/投诉渠道口径与对账说明.md中的渠道口径权威定义 (内部 / 商户号 / 外部投诉的归类判据)。口径是统计的根,改动会影响全部投诉数字, 必须走人工审核 + 回归验证。 - 禁止绕开
docs/standards/数据源接入与缓存加速规范.md的缓存铁律: 新增数据源 / 看板接口时,写入后必须失效对应缓存 pattern,Redis key 必须逐字符对齐。 - 禁止「无数据说明 / 不可下钻」的看板卡片(见
docs/standards/看板卡片数据说明与下钻规范.md)。 任何看板卡片必须同时做到:① 有 ⓘ 数据说明(来源 / 口径 / 时点,并写明"空"的含义); ② 可下钻且带时间窗口与筛选条件。确不下钻的须在代码注释 + 页面 ⓘ 显式声明理由。 禁止「点了没反应」的数字,禁止跳到空白明细页让使用者自己再筛一遍。 - 禁止绕过
docs/standards/数据源命名与分组规范.md的数据源命名与分组元规则:- 分组顺序唯一来源是
data_source_registry.CATEGORY_ORDER,前端不得再定义一份 (两份定义必然漂移,同 A-20260910-004 菜单漂移);组内顺序由服务端sort_order决定。 code/table_name/name_cn必须一一对应,name_cn全树唯一且必须带域前缀 (前缀·中文语义,禁止出现 code 原文);例外须在该规范 §3.5 登记。- 数据已停用或口径易误用(如 E 路对账基准)→ 必须在显示名中标注,
只写
description不算(树上看到名字的人不会点开描述)。 - 同一张表禁止注册两个 code(统计口径分裂);需要第二入口请用投影
(
DATA_SOURCE_PROJECTIONS),且投影必须声明真身分组与名称,否则视为 「无声明重复展示」违规。
- 分组顺序唯一来源是
- 禁止绕过《仓库入库规范》的文件入库分类纪律(见
docs/standards/仓库入库规范.md,META):- C5 密钥凭证(
.env/ token / 私钥 / 真实密码)与 C6 PII/业务数据(含真实手机号/单号/SN 的语料、xlsx/csv/pkl 导出、01样本数据/)严禁入 git,由 gitleaks + CI 兜底 (与第 3 条互补:第 3 条管"代码内不许硬编码",本条管"什么文件根本不许入库")。 - 一次性任务现场(临时脚本 / 模型 raw 输出 / 探针 / 冻结语料)落本地
workdata/(gitignore), 不入 git;任务收尾把结论提炼进docs/reports/,耐用脚本证明可复用后才进scripts/。 - 点号 ≠ 不入库:
.gitea/等协作配置必须入库;__pycache__/.venv/node_modules等缓存运行时忽略。唯一判据:别人 clone 后是否需要它才能跑起来 / 理解系统。
- C5 密钥凭证(
- 禁止绕过《退款五路数据标准与采纳规则》的采纳口径(见
docs/standards/退款五路数据标准与采纳规则.md,META):- 退款五路(A 线上直退 / B 钱包流水 / C 闪猫 / D 手动 / E 企微记录)统计一律读
std_*标准表 (std_refund_online/std_wallet_flow/std_refund_shanmao/std_refund_manual/std_refund_record), 禁止在查询侧散落复刻采纳条件(失败/冻结关键词、质量状态过滤等已由采纳作业在表层固化)。 - ods 原始表只同步不治理:采集 upsert 不得覆盖采纳标识四列(
adopt_state/adopt_reason/adopt_rule_ver/adopted_at);质量治理入口 = 人工覆盖 API(adoption_overrides),禁止直接改原始数据。 - 采纳规则变更必须升版
ADOPT_RULE_VER并同步修订口径文档;全状态/全方式语义例外 (挽回漏斗、状态分布、工作量统计、导出原始明细、链路台账、设备档案、对账勾稽) 一律读std_*_all全量镜像视图(ods 同构透传),业务代码禁止直读 ods; ods 仅剩采集写入、采纳作业读取、质量治理标记三个本职消费(#334)。 - 企业商户维度统一经
dim_device_merchant(as-of 分段维表)回填,禁止各处自行实现商户回落逻辑。
- 退款五路(A 线上直退 / B 钱包流水 / C 闪猫 / D 手动 / E 企微记录)统计一律读
输出风格
- 代码块必须带注释说明关键逻辑(尤其涉及时间换算、金额单位、事务回滚处)。
- 修改现有文件时,必须先说明改动意图(涉及哪几个文件、改了什么),禁止静默大改。
- 遇到不确定的需求,必须停下来提问,禁止猜测实现。
- 金额字段一律使用定点数(Decimal),禁止二进制浮点进入金额存储与计算。
现行口径(#217 拍板方案 C′,2026-10-08):
- DB 层
Numeric(12,2)/(12,4)(元单位)不变;ORM 注解Mapped[Decimal | None]; - 采集写入经
upsert._core._to_decimal;计算路径用analytics._core.D()定点化; - 出参边界(JSON API / Excel 导出 / JSONB 落库)允许
float(...)一次性表示层转换, 对外契约保持 JSON number(元)不变; - 例外登记(保留 float,非金额语义):
merchant_refund.rate(费率 Numeric(8,4))、device_flow_usage.flow_gb(流量 GB)。新增金额列必须走 Decimal,例外须在此登记。
- DB 层
工具使用
- 使用文件系统 / 读写工具前,必须先确认目标文件路径存在。
- 执行任何会改动数据的命令前,先输出将要执行的命令,等待确认。
- 数据库操作默认使用只读账号(如
db容器内的查询),除非明确获得授权。 - 运行测试 / lint:优先使用项目既有命令(如
ruff、pytest),不要擅自引入新工具链。
界面设计纪律(强制)
全文见
docs/standards/界面设计说明规范.md。核心铁律: 说不清「替谁解决什么问题」的界面,不许开工。
- 五要素必填:目的(替谁/答何决策)· 逻辑(为何这样组织)· 口径(数据判据 + 文档指针)· 取舍(不做什么及原因) · 工单(issue 号 + 设计文档)。
- 三层落地,缺一即未完成:
- ① 代码层:界面文件头部
设计说明(Design Rationale)注释块; - ② 页面层:使用者可见的 ⓘ 气泡 或「设计说明」抽屉(必须含「取舍」段);
- ③ 审查层:
docs/standards/review-checklist.md对应检查项通过。
- ① 代码层:界面文件头部
- 禁止无意图改动:不得「顺手加一张图」「多堆一个 tab」;每个图表必须指向一个动作。
- 可控指标前置:优先展示可控指标(如升级率),而非只有后果指标(如总量/金额)。
- 禁止重复展示:同一指标全站应有唯一「真身」,其它位置为「投影」; 投影必须在设计说明中声明,并注明真身位置。
- 删掉无损判据:若某界面被删掉后没有任何人的任何决定会改变,则它属于「秀好看」,应删。
- 存量不追溯,改动即补齐:未改造的存量界面不强制追溯;但谁改动、谁补齐。
- 看板卡片双强制(见
docs/standards/看板卡片数据说明与下钻规范.md): 任何看板卡片必须有数据说明(来源/口径/时点 + "空"的含义)且可下钻 (带当前时间窗口与筛选条件);不可下钻的须显式声明理由。详见该规范全文。 - 数据源命名与分组(见
docs/standards/数据源命名与分组规范.md): 数据查看树的每一项必须让人看出「这是哪一类/哪一路」;分组顺序与组内顺序均由服务端 单一来源决定;停用与易误用口径必须在显示名标注;同表第二入口只能走投影 且必须声明真身位置。详见「绝对禁止」第 13 条。
工单纪律(强制)
- 所有任务必须先建工单,再动手(见
docs/standards/issue-workflow.md)。 - 提交信息必须携带
#issue号,否则关联不上、无法审计。 - 关闭工单前必须先写「关闭凭证核验」评论:
- 标题固定
## 关闭凭证核验 (YYYY-MM-DD) - 用表格逐条对应正文的「验收标准 / 关闭条件」,每条给出可复现的核验方式 (测试用例名 / commit sha / 实测命令),禁止写「已测试通过」这类不可验证的话
- 同时把正文里对应的
- [ ]勾成- [x] - 批量关闭多张工单时,每张各写一条自己的凭证评论
- 确属降级接受的,写
结论: 以 <理由> 降级验收,禁止静默关闭
- 标题固定
- 禁止无凭证关闭。凭证缺失的历史工单不重开,改为补记
## 关闭凭证核验(补记 · YYYY-MM-DD)并显式标注为事后追溯。
文档性质纪律(强制)
全文见
docs/standards/文档性质标记规范.md。核心铁律: 文档必须先说清自己是「需求」还是「需求的需求」,再谈内容。
- 两类必须区分:
- 需求(REQ) —— 做一个具体功能/集成。有功能边界、接口契约、验收标准、归属工单。
- 元需求(META) —— 约束所有需求怎么做(规范/口径/流程/模板/审查判据)。
docs/standards/与AGENTS.md属此类。 - 参考(REF) —— 现状记录(表结构说明 / API 清单 / 台账),无约束力,以代码为准。
- 判据是「约束范围」,不是文件名:名为"XX接入规范"的文档若只约束一个集成, 它是 REQ 而非 META。
- 三层落地(新增/改动约束性文档时):
- ① 文档头部标
**性质**:元需求(META) / 需求(REQ) / 参考(REF) - ② 在
docs/README.md§六「文档性质索引」登记一行 - ③ META 且含强制条款 → 必须同步挂进本文件(AGENTS.md)引用链
- ① 文档头部标
- 禁止「标记了但约束不住」:META 不进 AGENTS 引用链 = 只是标签,不构成约束。
- 三类适用不同规则(用错标准 = 审查失效):
META REQ REF 审查标准 能否约束住别人 验收标准是否达成 是否与代码一致 变更成本 高(全仓影响) 中(局部) 低(同步即可) 走架构锁定 ❌ ✅ ❌ - 存量不追溯,改动即补齐:未标性质的存量文档不强改;谁改动、谁补齐。