|
|
c446920c9e
|
feat(backend): F1-6 sprint2 #5 累计 GMV 加入 sandbox_replay (门店级)
Sprint 2 收尾指标:门店级累计 GMV(与 #1-#4 会员级粒度不同),新建
sandbox_replay/finance_replay.py 模块。无原 fdw_queries.get_total_gmv
函数(0 现有调用方),不写 thin wrapper(spec §5.5 决策原则)。
数据源 dws_finance_daily_summary.gross_amount(门店日度财务汇总,daily 累计)。
SQL 模式 SUM(gross_amount) WHERE stat_date <= ctx.business_date,与 #1-#4
取最新单行不同,是多行累计 SUM。SQL 层 COALESCE(SUM(...), 0) 兜底,无数据
返回 Decimal('0')(开店前累计 GMV = 0,业务语义)。
口径 gross_amount = table_fee + goods + assistant_pd + assistant_cx,**不含
electricity_money**(与会员级 items_sum 略有差异,docstring 明确防止交叉验证)。
双口径数值验证 PASS(直接 Python,site=2790685415443269 朗朗桌球):
- 4a live(today=2026-05-05): ¥5,725,837.51
- 4b sandbox=2026-04-20: ¥5,653,063.37(差异 ¥72,774,即 4-21~4-27 七天合计)
新增防御性回归测试 test_get_total_gmv_no_member_ids_param 阻断未来误加
member_id 参数(门店级粒度强约束)。
unit test sprint1+sprint2 累计 28/28 PASS,无回归。
Sprint 2 收尾(4 项迁移 + #3 推迟 Sprint 3 等 ETL 配合)。
详见 docs/audit/changes/2026-05-06__f1_6_sprint2_total_gmv.md
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-06 01:32:14 +08:00 |
|
|
|
7b1cfadc2e
|
feat(backend): F1-6 sprint2 #4 储值卡余额迁移 sandbox_replay (SCD2 时光机)
新建 sandbox_replay/balance_replay.py 模块,迁移 fdw_queries.get_member_balance,
fdw_queries 改 thin wrapper 保持 5 处现有调用(chat/coach/customer x2/task_manager)
透明兼容。
数据源 dim_member_card_account 是 SCD2 维度表(原生支持时光机),sandbox 改造
关键是替换 scd2_is_current=1 过滤为 scd2_start_time + scd2_end_time 时间过滤
(ref_date+1day 边界 = 当天结束时仍 active 的版本,timestamptz 比较稳定)。
双口径 UI 走查 PASS(member=2799207363643141 葛先生,SCD2 历史余额变化样本):
- 4a live(today=2026-05-05): 储值余额 ¥6,602
- 4b sandbox=2026-04-20: 储值余额 ¥18,080(差异 1.1w+,时光机效果显著)
unit test sprint1+sprint2 累计 24/24 PASS,无回归。
附带本次 sprint 2 触发的架构级登记:
- 新建 docs/_overview/architecture-evolution-backlog.md(DWD 孤立 + Core 中间件 +
库重组,长远架构演进 backlog)
- F1-6-tasks.md 登记 #3 累计交易笔数推迟 Sprint 3(ETL 配合新增
total_open_table_count,因现有 total_visit_count 实算 COUNT(settle_type IN (1,3))
含商城订单,不符 Neo "开台次数"业务语义)
- sandbox-replay-engine-spec §5.5 thin wrapper 决策原则(已在 #2 commit)
详见 docs/audit/changes/2026-05-06__f1_6_sprint2_member_balance.md
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-06 01:26:18 +08:00 |
|
|
|
32716bc71a
|
feat(backend): F1-6 sprint2 #2 累计消费总额加入 sandbox_replay
新增指标(无 fdw_queries 原查询 + 0 现有调用方 + 无 thin wrapper),沿用
sprint 1/sprint2 #1 模式 @trace_service + @runtime_aware decorator + 显式
stat_date <= ctx.business_date 上界 + dws_member_consumption_summary
.total_consume_amount 字段 items_sum 口径。
双口径数值验证 PASS(member=2799207087163141 黄先生,直接 Python 调用):
- 4a live(today=2026-05-05): get_total_consume_amount=1252.65
- 4b sandbox=2026-04-20: get_total_consume_amount=999.99(walkthrough 测试快照)
unit test sprint1+sprint2 累计 19/19 PASS,无回归。
记录 thin wrapper 决策原则到 spec §5.5(迁移辅助层,非常态架构;
fdw_queries 长远退化纯 ETL 物理访问层,清理放收尾 sprint)。
注:#3 累计交易笔数因 spec §4 字段未明确(dws_order_summary vs
total_visit_count)暂停,等 Neo 决断后继续。
详见 docs/audit/changes/2026-05-06__f1_6_sprint2_total_consume_amount.md
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-06 00:52:08 +08:00 |
|
|
|
d418621951
|
feat(backend): F1-6 sprint2 #1 60d 消费迁移到 sandbox_replay
迁移 fdw_queries.get_consumption_60d 到 sandbox_replay.consumption_replay,
沿用 sprint 1 模式: @trace_service + @runtime_aware decorator + 显式
stat_date <= ctx.business_date 上界(与视图过滤双保险),fdw_queries 改
thin wrapper 保持 customer_service 2 处调用兼容。
双口径走查 PASS(member=2799207087163141 黄先生):
- 4a live(today=2026-05-05): 小程序 stat 卡条 60天消费 ¥115(consume_amount_60d=115.36)
- 4b sandbox=2026-04-20: 小程序 stat 卡条 60天消费 ¥89(walkthrough 测试快照 88.88)
unit test sprint1+sprint2 累计 15/15 PASS,无回归。
详见 docs/audit/changes/2026-05-06__f1_6_sprint2_consumption_60d.md
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-06 00:27:13 +08:00 |
|
|
|
9f1e35d71a
|
feat(backend): F1-6 sprint1 sandbox_replay 模块脚手架 + get_last_visit_days 迁移试点 (W1)
F1-5b 完成后启动 F1-6 沙箱时光机阶段 B,Sprint 1 范围:
1. 建立 sandbox_replay 模块脚手架
2. 实现 @runtime_aware decorator(自动注入 RuntimeContext)
3. 试点迁移 1 个指标:get_last_visit_days(P1-4 距上次到店天数)
4. MCP 端到端 4a/4b 双口径走查
新增文件:
- apps/backend/app/services/sandbox_replay/__init__.py(模块入口 + re-export)
- apps/backend/app/services/sandbox_replay/_decorator.py(@runtime_aware 实现)
- apps/backend/app/services/sandbox_replay/consumption_replay.py(get_last_visit_days 试点)
- docs/_overview/wave1-findings/F1-6-tasks.md(F1-6 任务清单 4 个 sprint)
- docs/audit/changes/2026-05-05__f1_6_sprint1_sandbox_replay_kickoff.md(Sprint 1 审计)
修改:
- apps/backend/app/services/fdw_queries.py:218-238
get_last_visit_days 改 thin wrapper,委托 sandbox_replay.consumption_replay
保持 75+ 现有调用点无感兼容
关键 bug 修复:@trace_service + @runtime_aware 嵌套 sig.bind 失败
- 现象:仅 FastAPI 请求 + 有活跃 TraceContext 时复现
(直接 Python 脚本 get_current_trace 返回 None,跳过 _build_params_dict)
- 根因:functools.wraps 设置 __wrapped__ 让 inspect.signature 追溯原函数
→ bind 时缺 keyword-only 必传 ctx → TypeError
- 修复:_decorator.py 不用 functools.wraps,手动复制元信息但不设
__wrapped__,inspect.signature 看到 wrapper 自身 (*args, **kwargs)
测试:
- unit test 10/10 PASS(本地 .gitignore:71 不入仓)
- 直接 customer_service.get_customer_detail PASS(独立诊断脚本)
- etl_conn 复用模式 PASS
MCP 双口径(member=2799207087163141 黄先生):
- 4a live (today=2026-05-05): daysSinceVisit=32(05-05 - 04-03)
- 4b sandbox=2026-04-20: daysSinceVisit=31(04-20 - 03-20)
通过插 walkthrough 测试快照 stat_date=2026-04-15 演示
(测试库 dws_member_consumption_summary 仅 stat_date=2026-05-01 一行,
sandbox=4-20 时被视图层 stat_date <= business_date_now() 过滤)
- 测试快照已清理,sandbox 已切回 live
Sprint 2-4 待启动(见 F1-6-tasks.md):
- Sprint 2:5 个会员 P1 指标(余额/60d 消费/累计交易/GMV/累计服务客户数)
- Sprint 3:5 个助教/门店 P1 + MP-2 完整(含 ETL 改造)
- Sprint 4:5 个 P2 算法重算指标
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-05 23:53:19 +08:00 |
|
|
|
1e803e23cd
|
feat(db,docs): F1-5b MP-2 prep + 沙箱时光机模块 spec (W1)
MP-2 经 4 轮调研 + Neo 反馈,采纳方案 C(推迟到 F1-6 沙箱时光机阶段 B):
- 第 1 轮原方案 D(双口径) → 第 2 轮 D'(单口径)
- 第 3 轮 Neo 架构纠正:不读 DWD,走 Core/DWS/app
- 第 4 轮 DWS 视图靠谱性审计:dws_assistant_daily_detail 是计费明细
(ledger_amount),不是助教工资(gross_salary 需等级时薪 + 抽成
+ 罚分),且缺 effective_hours / work_days
- 结论:MP-2 真正实施需要新建 dws_assistant_daily_salary 表(ETL
改造),跟其他 14 个 P1 指标一起做更高效 → 推迟到 F1-6
本次 Wave B 只做 prep:DB schema + 模块 spec + tasks.md 状态调整。
DB 迁移(zqyy_app):
- db/zqyy_app/migrations/20260505__add_effective_date_for_excel_adjustments.sql
- 3 张 Excel 暂存表(全空,Neo 确认尚无 Excel 上传)ADD COLUMN
effective_date DATE NOT NULL(无 DEFAULT,强制未来 Excel 上传必须带):
* biz.salary_adjustments(助教薪资扣款/奖励)
* biz.stg_finance_expense(月度支出)
* biz.stg_platform_income(平台结算收入)
- 3 个复合索引 (site_id, effective_date) 支持后续 daily 截断查询
- biz.stg_recharge_commission 已有 recharge_date,无需改造
测试库执行 + 5/5 校验 PASS:
- 字段存在(NOT NULL DATE 无 default)
- 复合索引存在 + 列序正确
- 字段注释含 'F1-5b MP-2 prep'
- INSERT 不带 effective_date 触发 NotNullViolation
docs/database/ 同步:
- docs/database/changes/2026-05-05__add_effective_date_for_excel_adjustments.md
完整变更说明 + 兼容性 + 回滚 + 5 条校验 SQL + 正式库执行说明
沙箱时光机模块 spec(主干任务排期登记):
- docs/_overview/sandbox-replay-engine-spec.md
- 22 个相关指标分 P1/P2/P3 优先级:
* P1 14 项(daily 视图已有,后端切换)
* P2 5 项(算法重算,含 MP-2 完整 daily salary)
* P3 3 项(状态算法 + sandbox_audit_log 用户行为)
- 4 阶段实施路径:
* 阶段 0(本次 prep)
* 阶段 A(F1-5a/b 已完成)
* 阶段 B(F1-6,2-3 周)— MP-2 真正实施在此
* 阶段 C(F1-7+,1-2 周)
- sandbox_replay 模块结构 + runtime_aware decorator 接口契约
- 性能 + 测试 + 前置依赖清单
F1-5b-tasks.md 状态调整:
- §4.3 顺序 15:MP-2 从"待开始/C4" → "延期 F1-6"
- §6 进度表 MP-2 行同步标"延期 F1-6 + 改方向说明"
- 关联到 mp2_prep.md 审计
业务影响:
- board-coach sandbox 行为暂遗留(F1-6 解决)
- 旧 Excel 模板上传将因 NOT NULL 失败,需 F1-6 同期 ETL UI 改造 +
操作员培训
- 跨页面已 audit:board-finance / customer-records / coach-service-records
/ customer-service-records 等已合规(F1-5b A1/A3 + MP-1/3/5 收益)
审计:docs/audit/changes/2026-05-05__wave1_f1_5b_mp2_prep.md
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-05 22:12:22 +08:00 |
|
|
|
af02446740
|
feat(ai): F1-5b Wave A 中段 沙箱业务日全栈架构主体收口 (W1)
完成 F1-5b 任务:
- T1 RuntimeContext unit 测试基础(36 case PASS,本地不入仓走 .gitignore:71)
- A1 admin_service.py 4 处 CURRENT_DATE → business_date 改造
- _get_range_stats / _get_7d_trend / _get_app_distribution
- 上下界双全(下界 - 6 days + 上界 < + 1 day,Step 4b 暴露原 PR
上界缺失,sandbox=4-20 时 trend_7d 漏 4-21~5-01 数据 → 修补)
- 全局聚合 list_trigger_jobs / get_budget 保留 CURRENT_DATE
(Neo D 决策选 A: 多 site 时全局无单一业务日)
- A2 fdw_queries:113 / 2552 异常分支兜底 + 三层 fallback + warning
- conn=None 也尝试 get_runtime_context(自开 conn)
- RuntimeContext 不可用降级真实 today + logger.warning
- A3 _fdw_context docstring 显式登记唯一 ETL 入口架构契约
(D2 完整且统一: 所有 ETL 视图查询通过 _fdw_context 自动 SET 三个
GUC: site_id / business_date / runtime_mode)
- 防御 hook post_edit_business_date_check.py
Wave 2 后续 PR 引回 CURRENT_DATE / date.today() 即提醒
双口径验证(§3.1 4a + 4b):
- 4a live: dashboard trend_7d 2 条 4-30~5-01 (真实今天)
- 4b sandbox=2026-04-20: trend_7d 1 条仅 4-20 (业务日上界生效硬证据)
- pytest test_runtime_context 36/36 全过
未完(下一批 Wave A): T2 integration / UI-1/2/4 / MP-3/5 / MP-1 / BE-1
F1-5b-tasks.md 新增 + audit 记录已就位
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-05 15:01:51 +08:00 |
|
|
|
421e193041
|
fix(ai): F1-5a 沙箱 batch-run 接入 runtime_context (W1 / 阶段 A 主体)
Neo F1-5 反馈: "让沙箱起到其真正的作用. 真正的模拟日期, 仅能看到沙箱设定日期
及之前日期的数据, 并运行 AI 的各个业务."
调研发现 (4 个并行子代理): batch-run 端点 _run_batch 是空壳 stub
(只 logger.info, 实际不跑 AI), GUC apply_runtime_session_vars 0 处调用
(dead code), 7 张业务表 6 张有 runtime 复合索引唯独 ai_run_logs 漏建,
App2/2a 3 行 _calc_date_range 漏传 ref_date.
本 commit (F1-5a 阶段 A 主体, F1-5b 后续完整 zqyy_app RLS 视图层):
后端核心:
- admin_service.py: _run_batch 真实化 (Semaphore(5)+asyncio.gather+
return_exceptions=True+ctx_snapshot 防漂移); estimate 入口抓
RuntimeContext 快照, confirm 取出传给 worker
- admin_ai.py: confirm_batch_run lazy 注入 dispatcher
- admin_service.retry_trigger_job: INSERT 落 runtime_mode +
sandbox_instance_id 列 (用 runtime_insert_columns helper)
- runtime_context.py: get_runtime_context 加 bind_to_session 参数,
激活 GUC app.current_business_date / app.current_runtime_mode
- run_log_service.create_log: 启用 bind_to_session=True 试点
App2/2a 3 行 ref_date 修复:
- app2_finance_prompt.py:817 储值卡余额变化板块
- app2_finance_prompt.py:841 日粒度 series + 异常检测窗口
- app2a_finance_area_prompt.py:466 区域日粒度 series
DB:
- migrations/20260505__ai_run_logs_runtime_index.sql:
补 (site_id, runtime_mode, sandbox_instance_id, created_at DESC) 复合索引
前端:
- AIOperations.tsx: 顶部加 sandbox 模式提示条 (Alert 显示 sandbox_date +
sandbox_instance_id + 影响范围 + 切回 live 入口)
未做 (留 F1-5b 完整 zqyy_app RLS 视图层一并):
- B1 admin_service 6 处 CURRENT_DATE -> business_date
- B2 fdw_queries 异常分支兜底
- GUC 完整传递 (fdw_queries / page_context 等)
- 测试 3 套 (.gitignore:71 排除, F2-2 入仓时 commit)
- P20 SPEC \xa76/\xa710/\xa711/\xa715 (F1-5b 完整收口后同步更准确)
Neo 决策: docs/_overview/wave1-findings/F1-5-impl-decisions.md
详见 docs/audit/changes/2026-05-05__wave1_f1_5a_sandbox_batch_run.md
|
2026-05-05 03:01:48 +08:00 |
|
|
|
b3ad4b8325
|
docs(ai-prompt): 9 APP system prompt 独立 MD 目录 + ai-app-prompts.md 瘦身改造 (W1 / F3-2C)
Neo 反馈: 我把百炼 8 APP 的 system prompt 更新到了 ai_system_prompt_by_app.md,
帮我整理成单独 8+1 个文件, 加说明, 放合适目录, 妥善保管。
新增 docs/ai/system-prompts/ 目录:
- _INDEX.md (关系图 + APP ID 映射 + 同步状态表 + SOP)
- 9 份独立 MD: app1_chat / app2_finance / app2a_finance_area /
app3_clue / app4_analysis / app5_tactics /
app6_note / app7_customer / app8_consolidation
- 每份带元信息表 + 场景 + 提示词参数 + system prompt 全文 +
协作关系 + 同步历史 (用 4 反引号 ````text 避免内部 ```json 冲突)
App2a 厘清 (状态 A):
- 与 App2 是两个独立百炼 APP, APP_ID 0ae965029bc54706bcff44f511ac716b
- 显示名 ZQYY-APP2a-指定区域财务洞察, env DASHSCOPE_APP_ID_2A_FINANCE_AREA
- prompt 是 App2 5/5 版本的精细化扩充: H6 新增'助教成本特殊规则'+
板块 D 新增'助教字段缺失业态判断'(麻将/KTV 缺失=业态正常 /
大厅/VIP/斯诺克 缺失=业态异常)
改名 + Banner:
- docs/ai/ai_system_prompt_by_app.md
-> docs/ai/system-prompts/_snapshot-20260505-source.md
(git mv 保留历史; 文件头加 Banner 说明已被拆分)
A 处置 docs/prd/ai-app-prompts.md (Neo 同意):
- 727 行 -> 110 行 (减 84.9%)
- 标题改为 '百炼平台 AI 应用集成实现规范'
- 删 8 APP system prompt 章节 (已迁移)
- 留 NS2 实现要点 + APP ID 映射 (补 App2a 行) + 前端消费方式 (补 App2a 行) + 附录代码审计对照表
修正认知错误:
- 5/4 F3-2-prompt-files-list.md 给的对照逻辑 (对照 .py 与云端) 是错的
- .py 是 user message 拼装代码, 不是 system prompt 备份
- 5/5 重写该文件: 对照对象改为 docs/ai/system-prompts/*.md
详见 docs/audit/changes/2026-05-05__wave1_f3_2c_system_prompts_split.md
|
2026-05-05 02:03:20 +08:00 |
|
|
|
f92f2d98f3
|
fix(tools): 恢复 OpenAPI 抓取脚本 + 重抓 backend-api.json (W1 / F2-1A)
历史: 2026-04-06 commit 779b2f6 大批量清理时被 Claude Opus 4.6
误归档到 _DEL/_DEL/scripts/ops/_export_openapi.py, 28 天 stale。
恢复:
- cp _DEL/_DEL/scripts/ops/_export_openapi.py scripts/ops/
- 跑脚本重抓: 137 -> 167 paths (新增 30) / 194 -> 234 schemas
- 0 个 removed (后端无废弃)
新增 30 端点分布: admin-ai 5 + runtime-context 3 + task-engine 7 +
triggers 1 + db-health 1 + execution/internal/trigger-jobs 5 + xcx 5
附 F3-2B prompt 文件清单 (本地 8 个 + App1 缺本地副本):
docs/_overview/wave1-findings/F3-2-prompt-files-list.md
Neo 决策 B 云端权威, 用清单对照云端 prompt 检查/更新本地副本。
详细 diff 见审计:
docs/audit/changes/2026-05-04__wave1_f2_1_openapi_script_restored.md
|
2026-05-05 00:30:10 +08:00 |
|
|
|
8458cfaae2
|
docs(audit): Wave 1 findings 第二轮反馈追加 (5 项深入答疑)
回答 Neo 在 01-W1-findings-response.md 上写的 5 个新问题:
1. F1-3 Frozen >1 年 - 本地硬盘 tar.zst 即可, 不必对象存储
2. F2-1 OpenAPI 作用深入浅出 - "厨房菜单 vs 大堂菜单"比喻 +
5 个使用场景 (FastAPI 双层结构 + 28 天 stale 不破坏运行的原因)
3. F2-2 自建 Gitea 优化 - .gitea/workflows/ 替代 GitHub Actions,
默认仍 5 分钟版 (步骤 1+2+5), 启 Actions 可选
4. F3-2 system prompt 计费 - 100% 计入 (Qwen 无 caching 折扣) +
推荐方案 A 全 prompt 入 git 单源 (新增 Wave 5 prompt 治理任务)
5. F3-4 全 API 端点遍历 - ~25-30 端点 / 半天集中改造,
兑现 Wave 0 全览调研价值 (推荐 Wave 5 集中, 不分散)
最终 Wave 总分配:
- Wave 1 (进行中): F1-5
- Wave 2 前 (立即): F2-1A 恢复脚本
- Wave 2: F1-1 / F2-1B hook / F3-1 / F3-2A / F3-3
- Wave 4: F1-2 / F1-3 三层归档 / F3-5
- Wave 5: F2-2 tests / F3-4 全 API 沙箱校验 / F3-2B prompt 治理 (新增)
待 Neo 拍板 3 项:
- F2-2 是否启 Gitea Actions
- F3-2B 全 App prompt 入 git 单源 是否启动
- F3-4 集中 Wave 5 vs 分散
|
2026-05-05 00:20:19 +08:00 |
|
|
|
8952ca2969
|
docs(audit): Wave 1 findings 反馈响应 + F2-1 OpenAPI 同步历史调研
01-W1-findings-response.md 主线整合 12 项 Neo 反馈:
- 直接同意 7 项 (F1-1/1-5 + F2-1 + F3-1/3/5 等)
- 修正 2 项: F1-2 降级 P1 UX (admin-web 无 site_admin 登录),
F1-4 撤销 (前提错误)
- 评估 1 项: F1-3 改良为 Hot DB + Cold Parquet 按月分区
- 简化 1 项: F2-2 基于 Neo 前提 5 分钟方案 (删 .gitignore + 入仓)
- 联网搜 1 项: F3-2 DashScope Qwen3-Max-Preview $1.20/$6.00 per 1M
+ Qwen3 切词 1000 字符 ≈ 500 tokens + SCD2 配置表方案
- 答疑 1 项: F3-4 沙箱越界 422 拒绝
F2-1-openapi-history.md (234 行) 真相:
- 抓取脚本 scripts/ops/_export_openapi.py 12 行曾存在
- 2026-04-06 00:39 commit 779b2f6 批量清理 1155 个废弃文件时
被 Claude Opus 4.6 误归档到 _DEL/_DEL/scripts/ops/
- 36 分钟前同一天还跑过最后一次抓取
- 28 天内无人发现, 9/10 缺失端点是工具消失后新加 router
- 脚本本身无 bug, 推荐恢复 + 加 hook 防御
|
2026-05-05 00:03:57 +08:00 |
|
|
|
658aa7e12b
|
docs(audit): Wave 1 发现待 Neo 拍板 12 项业务故事卡
Wave 1 Day 1-4 实施过程中挖出的问题, 按 04a/b/c 业务故事卡风格呈现:
- 7 字段 (关联/背景/逻辑/影响/选项/判定)
- 12 项分 3 组: P0 评估发现×5 / 项目治理×2 / 业务语义×5
- 每条带 Wave 分配建议, 不评估工时
第一组 P0 评估发现 (W1-T7 PRD 撰写挖出):
- F1-1 批量 AI 长事务无幂等 (重复扣费风险)
- F1-2 run-logs PII 跨租户泄露 (个保法风险, 建议 Wave 1 修)
- F1-3 batch_id 生命周期未管理 (数据库膨胀)
- F1-4 triggers/unified 权限过松 (跨租户可见)
- F1-5 沙箱 batch-run 未读 runtime_context (沙箱主线必修)
第二组 项目治理:
- F2-1 OpenAPI 与代码不同步 (建议 Wave 2 提前修脚本)
- F2-2 tests/ .gitignore 排除 (建议 Wave 5 入仓 + 启 CI)
第三组 业务语义待 Neo 答:
- F3-1 cache invalidate 粒度
- F3-2 AI budget 单价来源
- F3-3 手动触发 audit + 二次确认
- F3-4 sandbox_date 边界
- F3-5 unified 分页
|
2026-05-04 22:37:04 +08:00 |
|