|
20881
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/feat/multi-role-assignment
|
0
|
{"Commits":[{"Sha1":"bf778452d {"Commits":[{"Sha1":"bf778452d29f9965677f5d7eafdbd98843ef0ac6","Message":"fix(web): 内部售后建单表单幂等键在 resolver 前预生成(C29 回潮)\n\nAfterSalesWorkbench 的 CreateCaseForm 点「提交售后申请」静默无反应——\n不发请求、无报错。根因是 C29 的同一形态:idempotencyKey 默认 \"\",只在\nsubmit 回调**内部**用 `|| crypto.randomUUID()` 兜底;但 zodResolver 的\n`min(1)` 先于回调校验空串失败,回调永不执行、兜底成死代码;该字段又无输入框,\nFormMessage 无处渲染,用户零反馈。\n\nC29 的修复此前只打到公开客户表单 PublicFulfillmentView(挂载后预生成),\n没打到内部工作台表单。E2E 只走公开表单提交路径,HTTP 验收直接带 key 打 API,\n内部建单提交路径零覆盖——「测试路径 ≠ 运行路径」(P1)。\n\n修复:挂载后 useEffect 预生成 idempotencyKey(镜像公开表单);本表单提交后\nform.reset() 会把键清空,故 reset 后补发一次,保证可连续建单。\n\n验证(本地工作区,2026-08-05):\n- web typecheck 通过\n- 浏览器实测:客服建单 POST /api/after-sales → 201;自批 403 SELF_APPROVAL_FORBIDDEN;\n 换审批人 200;退款额度 ¥110,000 冻结\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-05T17:31:03-07:00"}],"HeadCommit":{"Sha1":"bf778452d29f9965677f5d7eafdbd98843ef0ac6","Message":"fix(web): 内部售后建单表单幂等键在 resolver 前预生成(C29 回潮)\n\nAfterSalesWorkbench 的 CreateCaseForm 点「提交售后申请」静默无反应——\n不发请求、无报错。根因是 C29 的同一形态:idempotencyKey 默认 \"\",只在\nsubmit 回调**内部**用 `|| crypto.randomUUID()` 兜底;但 zodResolver 的\n`min(1)` 先于回调校验空串失败,回调永不执行、兜底成死代码;该字段又无输入框,\nFormMessage 无处渲染,用户零反馈。\n\nC29 的修复此前只打到公开客户表单 PublicFulfillmentView(挂载后预生成),\n没打到内部工作台表单。E2E 只走公开表单提交路径,HTTP 验收直接带 key 打 API,\n内部建单提交路径零覆盖——「测试路径 ≠ 运行路径」(P1)。\n\n修复:挂载后 useEffect 预生成 idempotencyKey(镜像公开表单);本表单提交后\nform.reset() 会把键清空,故 reset 后补发一次,保证可连续建单。\n\n验证(本地工作区,2026-08-05):\n- web typecheck 通过\n- 浏览器实测:客服建单 POST /api/after-sales → 201;自批 403 SELF_APPROVAL_FORBIDDEN;\n 换审批人 200;退款额度 ¥110,000 冻结\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-05T17:31:03-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/d6b659343565a590d5c9d75adecc62710643a553...bf778452d29f9965677f5d7eafdbd98843ef0ac6","Len":1}...
|
1785976276
|
Edit
Delete
|
|
20882
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/feat/multi-role-assignment
|
0
|
{"Commits":[{"Sha1":"a3dd4914e {"Commits":[{"Sha1":"a3dd4914eeaa83dc5ac32695829417bdf1faf44a","Message":"test(web): E2E 覆盖内部售后建单表单提交(C29 回潮回归锁)\n\n上一提交(bf77845)修了内部售后工作台建单表单静默无 POST 的 bug,但 E2E 此前\n只覆盖公开客户表单(public-after-sales-create)的提交,内部工作台表单\n(after-sales-create-card)提交路径长期零覆盖——正是这个盲区让 C29 二次复发\n逃过所有门禁。\n\n本回归锁在履约闭环用例末尾走内部表单真实提交:选订单→联动带出商品→填量与原因→\n点「提交售后申请」,用 waitForResponse 捕 POST /api/after-sales。C29 回潮的形态是\n「提交静默无请求」,届时 waitForResponse 超时即红。状态断言用 \u003c500 而非 pin 201:\n本用例前序公开售后已在同一交付订单消耗过退货额度,内部再建可能 201 或 409,\n两者都证明「客户端校验通过 + POST 真发出 + 服务端处理」这条链通畅。\n\n负向验证(本会话):撤掉 AfterSalesWorkbench 挂载预生成后重跑 check:ui,本断言在\nwaitForResponse 处超时判红(error-context 确认按钮 active、表单已填、无 response);\n恢复修复后 12/12 复绿。报告 status=passed,绑定 bf77845。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-05T17:46:57-07:00"}],"HeadCommit":{"Sha1":"a3dd4914eeaa83dc5ac32695829417bdf1faf44a","Message":"test(web): E2E 覆盖内部售后建单表单提交(C29 回潮回归锁)\n\n上一提交(bf77845)修了内部售后工作台建单表单静默无 POST 的 bug,但 E2E 此前\n只覆盖公开客户表单(public-after-sales-create)的提交,内部工作台表单\n(after-sales-create-card)提交路径长期零覆盖——正是这个盲区让 C29 二次复发\n逃过所有门禁。\n\n本回归锁在履约闭环用例末尾走内部表单真实提交:选订单→联动带出商品→填量与原因→\n点「提交售后申请」,用 waitForResponse 捕 POST /api/after-sales。C29 回潮的形态是\n「提交静默无请求」,届时 waitForResponse 超时即红。状态断言用 \u003c500 而非 pin 201:\n本用例前序公开售后已在同一交付订单消耗过退货额度,内部再建可能 201 或 409,\n两者都证明「客户端校验通过 + POST 真发出 + 服务端处理」这条链通畅。\n\n负向验证(本会话):撤掉 AfterSalesWorkbench 挂载预生成后重跑 check:ui,本断言在\nwaitForResponse 处超时判红(error-context 确认按钮 active、表单已填、无 response);\n恢复修复后 12/12 复绿。报告 status=passed,绑定 bf77845。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-05T17:46:57-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/bf778452d29f9965677f5d7eafdbd98843ef0ac6...a3dd4914eeaa83dc5ac32695829417bdf1faf44a","Len":1}...
|
1785977229
|
Edit
Delete
|
|
20883
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/feat/multi-role-assignment
|
0
|
{"Commits":[{"Sha1":"1334a6214 {"Commits":[{"Sha1":"1334a6214585274050083c387a7fbbb5a591d308","Message":"docs(governance): C29 二次复发回灌——修复挂错消费者 + 内部提交路径零覆盖\n\n对抗式点击测试实打提交时抓到:C29 当初的「resolver 前预生成」只打到公开客户表单,\n内部售后工作台建单表单遗漏,点提交静默无 POST。已修(bf77845)+ 回归锁(a3dd491)。\nC29 行补记复发经过与通用教训:一个 bug 的修复挂在某个消费者上时,必须问同一 contracts\nschema 的其他消费者有没有同一个坑,并让门禁覆盖每一条提交路径而非只覆盖第一条。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-05T17:50:36-07:00"}],"HeadCommit":{"Sha1":"1334a6214585274050083c387a7fbbb5a591d308","Message":"docs(governance): C29 二次复发回灌——修复挂错消费者 + 内部提交路径零覆盖\n\n对抗式点击测试实打提交时抓到:C29 当初的「resolver 前预生成」只打到公开客户表单,\n内部售后工作台建单表单遗漏,点提交静默无 POST。已修(bf77845)+ 回归锁(a3dd491)。\nC29 行补记复发经过与通用教训:一个 bug 的修复挂在某个消费者上时,必须问同一 contracts\nschema 的其他消费者有没有同一个坑,并让门禁覆盖每一条提交路径而非只覆盖第一条。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-05T17:50:36-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/a3dd4914eeaa83dc5ac32695829417bdf1faf44a...1334a6214585274050083c387a7fbbb5a591d308","Len":1}...
|
1785977443
|
Edit
Delete
|
|
20884
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/feat/multi-role-assignment
|
0
|
{"Commits":[{"Sha1":"be1e0734c {"Commits":[{"Sha1":"be1e0734c39315b61a7bf452231a853f44866085","Message":"test(manual): 采集 spec 适配工作台 UI 改版(1–11 章绿,余记 backlog)\n\n2026-08-04 UI 改版(侧栏 6 组折叠 + 视图切换器、收款抽屉、后果确认框铺开、\n公开页一方案一链接单档投影、合同定稿成为激活前置)让手册截图采集大面积失效\n(采集是「有环境才跑、非门禁」的真实运行任务,改版后没有门禁会红——正是本仓\n两次为文档漂移付代价的形态 C14/C25)。\n\n本轮适配并经 build:manual 实跑通过第 1–11 章:\n- 移植 openWorkspaceEntry + workspaceTab helper,折叠入口(报价5/履约4/售后8)\n 改走「组条目 → 视图切换器 tab」的真实用户路径;第 1 章 nav-group 标注按 6 组重写\n- 报价发送补 send-quotation-dialog「确认发送」;申请合同补\n quotation-request-contract-dialog 确认;客户报价页去掉已下线的「选择方案」下拉、\n 「打开客户页」多档链接取 .first()\n- 第 13 章收款改为「选单 → 开 open-receivables-drawer 抽屉 → 切分期/收款 tab」,\n 状态标签改中文(RECORDED→待确认到账)\n\n未完成(文件头 backlog 详列):合同定稿新章节(激活前置,需先建模板)、收款抽屉\n后半(14 章开票/红冲/退款)、确认框簇、售后流水线;正文与 manifest 待全章绿后统一重生成。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-05T18:32:06-07:00"}],"HeadCommit":{"Sha1":"be1e0734c39315b61a7bf452231a853f44866085","Message":"test(manual): 采集 spec 适配工作台 UI 改版(1–11 章绿,余记 backlog)\n\n2026-08-04 UI 改版(侧栏 6 组折叠 + 视图切换器、收款抽屉、后果确认框铺开、\n公开页一方案一链接单档投影、合同定稿成为激活前置)让手册截图采集大面积失效\n(采集是「有环境才跑、非门禁」的真实运行任务,改版后没有门禁会红——正是本仓\n两次为文档漂移付代价的形态 C14/C25)。\n\n本轮适配并经 build:manual 实跑通过第 1–11 章:\n- 移植 openWorkspaceEntry + workspaceTab helper,折叠入口(报价5/履约4/售后8)\n 改走「组条目 → 视图切换器 tab」的真实用户路径;第 1 章 nav-group 标注按 6 组重写\n- 报价发送补 send-quotation-dialog「确认发送」;申请合同补\n quotation-request-contract-dialog 确认;客户报价页去掉已下线的「选择方案」下拉、\n 「打开客户页」多档链接取 .first()\n- 第 13 章收款改为「选单 → 开 open-receivables-drawer 抽屉 → 切分期/收款 tab」,\n 状态标签改中文(RECORDED→待确认到账)\n\n未完成(文件头 backlog 详列):合同定稿新章节(激活前置,需先建模板)、收款抽屉\n后半(14 章开票/红冲/退款)、确认框簇、售后流水线;正文与 manifest 待全章绿后统一重生成。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-05T18:32:06-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/1334a6214585274050083c387a7fbbb5a591d308...be1e0734c39315b61a7bf452231a853f44866085","Len":1}...
|
1785979947
|
Edit
Delete
|
|
11155
|
1
|
5
|
1
|
32
|
0
|
0
|
refs/heads/feat/miniprogram-pdf-zoom-sync
|
1
|
|
1781069343
|
Edit
Delete
|
|
11156
|
1
|
5
|
1
|
32
|
0
|
0
|
refs/heads/feat/miniprogram-pdf-zoom-sync
|
1
|
{"Commits":[{"Sha1":"bf0fa1fd7 {"Commits":[{"Sha1":"bf0fa1fd77ef2f5f91a18bac9168709f8abb4889","Message":"feat: 小程序PDF缩放、弹幕同步、个人中心完整功能\n\n- 修复 PDF page API 500 错误(pdftoppm 输出文件名零填充问题)\n- 修复小程序 WebSocket SocketTask 引用丢失,改用全局 API\n- 小程序增加双指捏合缩放、拖动、全屏查看功能\n- 小程序增加点赞、红包动画、弹幕发送功能\n- 小程序个人中心支付订单/红包记录字段对齐 h5/meeting\n- 小程序增加口播稿面板、历史演讲、刷新按钮\n- 小程序修复 page-count API 获取 PDF 页数失败(shell 命令转义)\n- admin/play 弹幕容器改为 position:fixed + z-index 1000000\n- WebSocket 服务端增加广播日志\n- admin/play 修复 JS try/catch 语法错误导致弹幕不显示\n- 新增小程序控制器 Miniapp/Minapi\n- 新增小程序登录、二维码、支付相关 API\n","AuthorEmail":"zhangjunnan@g-hi.com","AuthorName":"zhangjunnan","CommitterEmail":"zhangjunnan@g-hi.com","CommitterName":"zhangjunnan","Timestamp":"2026-06-10T13:28:57+08:00"}],"HeadCommit":{"Sha1":"bf0fa1fd77ef2f5f91a18bac9168709f8abb4889","Message":"feat: 小程序PDF缩放、弹幕同步、个人中心完整功能\n\n- 修复 PDF page API 500 错误(pdftoppm 输出文件名零填充问题)\n- 修复小程序 WebSocket SocketTask 引用丢失,改用全局 API\n- 小程序增加双指捏合缩放、拖动、全屏查看功能\n- 小程序增加点赞、红包动画、弹幕发送功能\n- 小程序个人中心支付订单/红包记录字段对齐 h5/meeting\n- 小程序增加口播稿面板、历史演讲、刷新按钮\n- 小程序修复 page-count API 获取 PDF 页数失败(shell 命令转义)\n- admin/play 弹幕容器改为 position:fixed + z-index 1000000\n- WebSocket 服务端增加广播日志\n- admin/play 修复 JS try/catch 语法错误导致弹幕不显示\n- 新增小程序控制器 Miniapp/Minapi\n- 新增小程序登录、二维码、支付相关 API\n","AuthorEmail":"zhangjunnan@g-hi.com","AuthorName":"zhangjunnan","CommitterEmail":"zhangjunnan@g-hi.com","CommitterName":"zhangjunnan","Timestamp":"2026-06-10T13:28:57+08:00"},"CompareURL":"zhangjunnan/zhouhui/compare/ffa513a52387f5624f52f14b3a56e99c9411087b...bf0fa1fd77ef2f5f91a18bac9168709f8abb4889","Len":1}...
|
1781069343
|
Edit
Delete
|
|
11157
|
1
|
5
|
1
|
32
|
0
|
0
|
refs/heads/feat/miniprogram-pdf-zoom-sync
|
1
|
{"Commits":[{"Sha1":"22bc33a1f {"Commits":[{"Sha1":"22bc33a1f0f14a757dfd4b280668e152617b65d7","Message":"fix: admin/play PDF渲染重复canvas报错+内容翻转\n\n- 添加 pdfRenderingTask 变量跟踪当前渲染任务\n- renderPDFPage 开始时取消之前的渲染(cancel)\n- 忽略 RenderingCancelledException 错误\n- 清理多余 console.log 减少噪声\n","AuthorEmail":"zhangjunnan@g-hi.com","AuthorName":"zhangjunnan","CommitterEmail":"zhangjunnan@g-hi.com","CommitterName":"zhangjunnan","Timestamp":"2026-06-10T13:32:05+08:00"}],"HeadCommit":{"Sha1":"22bc33a1f0f14a757dfd4b280668e152617b65d7","Message":"fix: admin/play PDF渲染重复canvas报错+内容翻转\n\n- 添加 pdfRenderingTask 变量跟踪当前渲染任务\n- renderPDFPage 开始时取消之前的渲染(cancel)\n- 忽略 RenderingCancelledException 错误\n- 清理多余 console.log 减少噪声\n","AuthorEmail":"zhangjunnan@g-hi.com","AuthorName":"zhangjunnan","CommitterEmail":"zhangjunnan@g-hi.com","CommitterName":"zhangjunnan","Timestamp":"2026-06-10T13:32:05+08:00"},"CompareURL":"zhangjunnan/zhouhui/compare/bf0fa1fd77ef2f5f91a18bac9168709f8abb4889...22bc33a1f0f14a757dfd4b280668e152617b65d7","Len":1}...
|
1781069530
|
Edit
Delete
|
|
11455
|
1
|
5
|
1
|
32
|
0
|
0
|
refs/heads/feat/miniprogram-pdf-zoom-sync
|
1
|
{"Commits":[{"Sha1":"2bdc17dcf {"Commits":[{"Sha1":"2bdc17dcf4587d11fa13e8961a83da952426fa3e","Message":"最新\n","AuthorEmail":"zhangjunnan@g-hi.com","AuthorName":"zhangjunnan","CommitterEmail":"zhangjunnan@g-hi.com","CommitterName":"zhangjunnan","Timestamp":"2026-06-11T13:28:40+08:00"}],"HeadCommit":{"Sha1":"2bdc17dcf4587d11fa13e8961a83da952426fa3e","Message":"最新\n","AuthorEmail":"zhangjunnan@g-hi.com","AuthorName":"zhangjunnan","CommitterEmail":"zhangjunnan@g-hi.com","CommitterName":"zhangjunnan","Timestamp":"2026-06-11T13:28:40+08:00"},"CompareURL":"zhangjunnan/zhouhui/compare/22bc33a1f0f14a757dfd4b280668e152617b65d7...2bdc17dcf4587d11fa13e8961a83da952426fa3e","Len":1}...
|
1781155803
|
Edit
Delete
|
|
23761
|
5
|
5
|
5
|
57
|
0
|
0
|
refs/heads/feat/llm-shooting-script
|
0
|
|
1787029504
|
Edit
Delete
|
|
23762
|
5
|
5
|
5
|
57
|
0
|
0
|
refs/heads/feat/llm-shooting-script
|
0
|
{"Commits":[{"Sha1":"4c34ff4ff {"Commits":[{"Sha1":"4c34ff4ff22ff5aab34e0492fd7fef9c2c989b02","Message":"feat(script): 接入大语言模型——歌词/文案 → 拍摄脚本 → 角色确认 → 定格图\n\n本仓此前零 LLM 接入(全仓只有 DashScope 的图像调用),「歌词成图」屏是纯前端\n原型(procedural.ts 画色块 + setTimeout 假装推理,不落库不接后端)。本轮把这条\n动线升级为真链路 + 真持久化。\n\n契约单源(packages/contracts/src/script.ts)\n- 角色确认状态机 scriptRoleMachine、脚本状态机 shootingScriptMachine\n- 景别/运镜用枚举而非自由文本:LLM 一旦自由发挥,下游 prompt 与统计就没有稳定口径\n- scriptDraftSchema 是 LLM 输出的唯一判据;prompt 构造器单源,两后端禁止各拼一份\n- evaluateRoleReadiness:本域核心不变量,双后端硬拦截 + 前端同源即时反馈\n- 前端私有的 findBannedHits 上收为 contracts 的 findBannedWords(后端也要逐镜标记,\n 两份并行就是双真源)\n\nLLM 不是权威\n- sidecar /v1/script 只保证「返回长得像脚本的 JSON」,两个后端各自再 parse 一次才落库\n- 模型引用未声明角色键 → 422 SCRIPT_ROLE_KEYS_DANGLING(幻觉护栏)\n- 连续给不出合法 JSON → 502 LLM_OUTPUT_UNPARSEABLE,绝不返回占位脚本\n- parse_json_object 只剥围栏、截首尾花括号,不做字段猜测或补齐\n\n角色必须先确认才允许出定格图\n- 判据 = status CONFIRMED 且有 referenceAssetId(没有参考图就没有一致性锚点)\n- CONFIRMED --reset--\u003e DRAFT 会解除参考图绑定:人确认的是那一张图,不是那个名字\n- 出图时按 roleKeys 顺序喂参考图,与指令里「第 N 张参考图」编号严格对齐\n\n写链纪律与物料链路同构:tenant 全覆盖、updateMany 带状态前置条件(0 行即 409)、\n终态与 outbox 同 tx、能力不可用 → job BLOCKED + 诚实 reason,禁止静默降级。\n品牌准绳只逐镜标记不拒绝整份脚本(脚本属创作内容),硬拦截点在出定格图这个受控出口,\n显式放行需带参数且落审计事件。\n\n顺带修掉三个既有缺陷\n1. 合并遗留:sidecarEdit 用 sidecarGenerateResponseSchema 校验响应(要求 steps/\n loadSeconds),但 run_hosted_edit 两个字段都不返回 —— 托管改字会在客户端边界\n 直接 Zod 抛错(本地路径返回这两个字段,所以一直没暴露)\n2. check-migrations 的列检查只扫 CREATE TABLE,凡 ALTER TABLE ADD COLUMN 追加的\n @map 列一律误报 drift(此前唯一的 ALTER 列 brand_kits.profile 没 @map 才没现形)\n3. ktv-poster-master.png 血统在合并两侧打架,git log --all 证明该文件自初始化提交后\n 从未重新生成,取诚实标注 prototype-demo-master\n\n验收\n- 新增 pnpm check:script → reports/script-acceptance.latest.json(双后端各 8 passed\n + 1 skipped-live);own-tests floor 10→14,棘轮已收紧\n- pnpm check / check:runtime 均 exit 0\n- 浏览器实测:未确认角色 → 按钮 disabled 且提示缺哪个角色;绕过前端直打后端 → 422\n ROLE_NOT_CONFIRMED;跨租户 404;无凭证生成 → UI 显示 503 且不产生占位脚本\n\n诚实边界(已写入 CLAUDE.md)\n- liveLlmAsserted=false:本机无 DASHSCOPE_API_KEY,真调 LLM 的 live 断言被 skip,\n 门禁成立 ≠ LLM 出脚本已验证\n- check:inference 在本机为 failed(动手前即为 failed):本工作副本的模型权重是\n git-lfs 指针存根,非本轮改动导致;基线表该行已从 GREEN 改为 OPEN\n- ui-acceptance 报告早于本屏,未覆盖 script 屏,已标 STALE\n- 新开缺口 G16(LLM 只做结构校验、无事实性校验)、G17(同步 HTTP 挂分钟级推理 /\n render_jobs 索引非 CONCURRENTLY / 本地多图 I2I 未在本机验证)\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-17T22:04:48-07:00"}],"HeadCommit":{"Sha1":"4c34ff4ff22ff5aab34e0492fd7fef9c2c989b02","Message":"feat(script): 接入大语言模型——歌词/文案 → 拍摄脚本 → 角色确认 → 定格图\n\n本仓此前零 LLM 接入(全仓只有 DashScope 的图像调用),「歌词成图」屏是纯前端\n原型(procedural.ts 画色块 + setTimeout 假装推理,不落库不接后端)。本轮把这条\n动线升级为真链路 + 真持久化。\n\n契约单源(packages/contracts/src/script.ts)\n- 角色确认状态机 scriptRoleMachine、脚本状态机 shootingScriptMachine\n- 景别/运镜用枚举而非自由文本:LLM 一旦自由发挥,下游 prompt 与统计就没有稳定口径\n- scriptDraftSchema 是 LLM 输出的唯一判据;prompt 构造器单源,两后端禁止各拼一份\n- evaluateRoleReadiness:本域核心不变量,双后端硬拦截 + 前端同源即时反馈\n- 前端私有的 findBannedHits 上收为 contracts 的 findBannedWords(后端也要逐镜标记,\n 两份并行就是双真源)\n\nLLM 不是权威\n- sidecar /v1/script 只保证「返回长得像脚本的 JSON」,两个后端各自再 parse 一次才落库\n- 模型引用未声明角色键 → 422 SCRIPT_ROLE_KEYS_DANGLING(幻觉护栏)\n- 连续给不出合法 JSON → 502 LLM_OUTPUT_UNPARSEABLE,绝不返回占位脚本\n- parse_json_object 只剥围栏、截首尾花括号,不做字段猜测或补齐\n\n角色必须先确认才允许出定格图\n- 判据 = status CONFIRMED 且有 referenceAssetId(没有参考图就没有一致性锚点)\n- CONFIRMED --reset--\u003e DRAFT 会解除参考图绑定:人确认的是那一张图,不是那个名字\n- 出图时按 roleKeys 顺序喂参考图,与指令里「第 N 张参考图」编号严格对齐\n\n写链纪律与物料链路同构:tenant 全覆盖、updateMany 带状态前置条件(0 行即 409)、\n终态与 outbox 同 tx、能力不可用 → job BLOCKED + 诚实 reason,禁止静默降级。\n品牌准绳只逐镜标记不拒绝整份脚本(脚本属创作内容),硬拦截点在出定格图这个受控出口,\n显式放行需带参数且落审计事件。\n\n顺带修掉三个既有缺陷\n1. 合并遗留:sidecarEdit 用 sidecarGenerateResponseSchema 校验响应(要求 steps/\n loadSeconds),但 run_hosted_edit 两个字段都不返回 —— 托管改字会在客户端边界\n 直接 Zod 抛错(本地路径返回这两个字段,所以一直没暴露)\n2. check-migrations 的列检查只扫 CREATE TABLE,凡 ALTER TABLE ADD COLUMN 追加的\n @map 列一律误报 drift(此前唯一的 ALTER 列 brand_kits.profile 没 @map 才没现形)\n3. ktv-poster-master.png 血统在合并两侧打架,git log --all 证明该文件自初始化提交后\n 从未重新生成,取诚实标注 prototype-demo-master\n\n验收\n- 新增 pnpm check:script → reports/script-acceptance.latest.json(双后端各 8 passed\n + 1 skipped-live);own-tests floor 10→14,棘轮已收紧\n- pnpm check / check:runtime 均 exit 0\n- 浏览器实测:未确认角色 → 按钮 disabled 且提示缺哪个角色;绕过前端直打后端 → 422\n ROLE_NOT_CONFIRMED;跨租户 404;无凭证生成 → UI 显示 503 且不产生占位脚本\n\n诚实边界(已写入 CLAUDE.md)\n- liveLlmAsserted=false:本机无 DASHSCOPE_API_KEY,真调 LLM 的 live 断言被 skip,\n 门禁成立 ≠ LLM 出脚本已验证\n- check:inference 在本机为 failed(动手前即为 failed):本工作副本的模型权重是\n git-lfs 指针存根,非本轮改动导致;基线表该行已从 GREEN 改为 OPEN\n- ui-acceptance 报告早于本屏,未覆盖 script 屏,已标 STALE\n- 新开缺口 G16(LLM 只做结构校验、无事实性校验)、G17(同步 HTTP 挂分钟级推理 /\n render_jobs 索引非 CONCURRENTLY / 本地多图 I2I 未在本机验证)\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-17T22:04:48-07:00"},"CompareURL":"luoanwu/image-generation/compare/9af0a397ce69cf03623a495ee3ef49943598f5a4...4c34ff4ff22ff5aab34e0492fd7fef9c2c989b02","Len":1}...
|
1787029504
|
Edit
Delete
|
|
23818
|
5
|
5
|
5
|
57
|
0
|
0
|
refs/heads/feat/llm-shooting-script
|
0
|
{"Commits":[{"Sha1":"b9d34cfb7 {"Commits":[{"Sha1":"b9d34cfb7e777377776325d7b2e73f1a15ff19e8","Message":"feat(script): 分镜可编辑、定格图可微调可回滚\n\nC10 交付后脚本是只读的——LLM 出完就不能改,定格图也只能整张重出。本轮补齐「改」。\n\n分镜编辑\n- 字段编辑 + 增删 + 重排;镜号唯一约束下走两阶段负号位移,1..N 恒连续不撞号\n- 重排要求全量顺序,拒绝增量语义歧义\n- 改角色 appearance 强制退回 DRAFT 并解绑参考图(描述与图不能各说各话);只改 name 不解绑\n- ARCHIVED / ROLES_LOCKED 从装饰性状态变成真实写约束\n\n定格图调整\n- 三模式:FROM_ROLES 从角色重出 / ADJUST 在当前图上按指令迭代微调 / VARIATION 换种子出候选\n- buildStillAdjustInstruction 把「只改这一点、构图与角色都别动」写死进指令\n (迭代微调最常见的失败是模型顺手重画整张)\n- 历史版本表 script_still_versions:每次出图/微调/换版追加一版,可回滚\n\n失效判据(契约单源,双端同源消费)\n- computeShotFingerprint 把所有影响成图的输入拼成规范串——刻意不哈希:\n 碰撞意味着「该失效却没标失效」,那是静默错误;规范串几百字节可肉眼比对\n- isShotStillStale 据此判断;策略是标记失效不自动删图\n (删掉人已满意的图是不可逆破坏,决定权留给人)\n\n三处刻意的「不静默」\n1. ADJUST 无底图 → NO_STILL_TO_ADJUST 明确报错,不悄悄改成整张重出\n2. 回滚连该版本的 fingerprint 一起还原,否则回滚回来的旧图会被误判成新鲜的\n3. 指纹用规范串而非哈希\n\n验收\n- contracts 新增 13 条失效判据单测(61 tests 全绿)\n- 双后端 acceptance 各 21 passed + 1 skipped-live(原 8)\n- pnpm check / check:runtime / check:script 均 exit 0;own-tests floor 14→15\n- 浏览器实测:过期横幅、编辑表单预填真实值、UI 改动落库并发 material.script.shot.updated、\n 新增与上移后镜号仍连续且未撞唯一约束\n\n诚实边界不变:liveLlmAsserted 仍为 false(本机无 DASHSCOPE_API_KEY);\ncheck:inference 仍因权重是 git-lfs 存根而红,与本轮无关。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-17T22:52:19-07:00"}],"HeadCommit":{"Sha1":"b9d34cfb7e777377776325d7b2e73f1a15ff19e8","Message":"feat(script): 分镜可编辑、定格图可微调可回滚\n\nC10 交付后脚本是只读的——LLM 出完就不能改,定格图也只能整张重出。本轮补齐「改」。\n\n分镜编辑\n- 字段编辑 + 增删 + 重排;镜号唯一约束下走两阶段负号位移,1..N 恒连续不撞号\n- 重排要求全量顺序,拒绝增量语义歧义\n- 改角色 appearance 强制退回 DRAFT 并解绑参考图(描述与图不能各说各话);只改 name 不解绑\n- ARCHIVED / ROLES_LOCKED 从装饰性状态变成真实写约束\n\n定格图调整\n- 三模式:FROM_ROLES 从角色重出 / ADJUST 在当前图上按指令迭代微调 / VARIATION 换种子出候选\n- buildStillAdjustInstruction 把「只改这一点、构图与角色都别动」写死进指令\n (迭代微调最常见的失败是模型顺手重画整张)\n- 历史版本表 script_still_versions:每次出图/微调/换版追加一版,可回滚\n\n失效判据(契约单源,双端同源消费)\n- computeShotFingerprint 把所有影响成图的输入拼成规范串——刻意不哈希:\n 碰撞意味着「该失效却没标失效」,那是静默错误;规范串几百字节可肉眼比对\n- isShotStillStale 据此判断;策略是标记失效不自动删图\n (删掉人已满意的图是不可逆破坏,决定权留给人)\n\n三处刻意的「不静默」\n1. ADJUST 无底图 → NO_STILL_TO_ADJUST 明确报错,不悄悄改成整张重出\n2. 回滚连该版本的 fingerprint 一起还原,否则回滚回来的旧图会被误判成新鲜的\n3. 指纹用规范串而非哈希\n\n验收\n- contracts 新增 13 条失效判据单测(61 tests 全绿)\n- 双后端 acceptance 各 21 passed + 1 skipped-live(原 8)\n- pnpm check / check:runtime / check:script 均 exit 0;own-tests floor 14→15\n- 浏览器实测:过期横幅、编辑表单预填真实值、UI 改动落库并发 material.script.shot.updated、\n 新增与上移后镜号仍连续且未撞唯一约束\n\n诚实边界不变:liveLlmAsserted 仍为 false(本机无 DASHSCOPE_API_KEY);\ncheck:inference 仍因权重是 git-lfs 存根而红,与本轮无关。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-17T22:52:19-07:00"},"CompareURL":"luoanwu/image-generation/compare/4c34ff4ff22ff5aab34e0492fd7fef9c2c989b02...b9d34cfb7e777377776325d7b2e73f1a15ff19e8","Len":1}...
|
1787032352
|
Edit
Delete
|
|
20295
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/feat/g8-verified-auth
|
0
|
|
1785690034
|
Edit
Delete
|
|
20296
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/feat/g8-verified-auth
|
0
|
{"Commits":[{"Sha1":"90cb8a411 {"Commits":[{"Sha1":"90cb8a4111b88f700b2dba5913e7a1e29c9666b6","Message":"feat(auth): 用户与权限管理落地——登录、受管理令牌吊销、本地身份切换\n\n承接 G8 验签切片(已合入的 auth.ts 单源),把「令牌从哪来」这一半补上:\n此前只解决了「后端是否验签」,令牌仍靠带外发放、没有账号也无从吊销。\n\n## 用户与访问管理\n- 新增 `packages/password-auth`:口令哈希与校验独立成包,不与业务代码混在一起\n- 迁移 `20260802150000_user_access_management`(两后端对等)\n- 登录端点 + `/login` 页面 + `features/users` 管理界面\n- **受管理令牌**:claims 带 `authVersion`,每次鉴权比对 DB 快照\n (同租户/同用户/同角色/ACTIVE/版本一致),任一不符即 REVOKED——\n 这让「停用账号」「改角色」能**立即生效**,而不是等令牌自然过期;\n 未带 authVersion 的 bootstrap/local 令牌走原有受控接缝,不受影响\n- 蓝图见 docs/domain/user-access-management-blueprint.md\n\n## 本地身份切换(开发接缝,非生产能力)\n`LOCAL_DEVELOPMENT_IDENTITIES` 固定目录 + 显式开关,双后端仅在非生产签发;\nWeb 用同一 cookie 同步 SSR / REST / 实时连接。**只为职责分离验收而存在**\n(不可自批需要两个不同的 sub,而浏览器会话只有一个身份),生产模式无条件关闭。\n契约层单测钉住:目录 id/sub 唯一、不含 UNAUTHENTICATED、只接受目录内身份。\n\n## 方案技术复核邀请\n迁移 `20260802170000_solution_technical_reviewer_invitation` + 两后端服务与路由,\n配套 SolutionStatusBadge;owner-matrix 与方案蓝图同步登记。\n\n## 文档\n新增 docs/spatiotemporal-fact-model.md(时空事实模型范式规范);\n词典、角色权限蓝图、待办审批蓝图、操作手册、治理经验库同步更新;\nG8 交接文档转为已完成归档,并保留四条诚实边界(RLS 未做、令牌分发非生产级、\naccess_token 进 log 的残留风险、验签可信才谈防抵赖)。\n\n## 证据(本地工作区,dirty)\n`pnpm check` exit 0。runtime/ui 由本轮实现方记录于交接文档:\n312/312 与 11/11,其中浏览器真实完成管理员→技术→管理员切换。\n该证据绑定本地工作区,不外推为远端 CI、部署或生产签收。\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-02T09:40:29-07:00"},{"Sha1":"b1e5c5e57f3d4075b12289f9de89ae616d909b7e","Message":"feat(governance): 业务闭环五切片——事件如实、配货可取消复活、退款可撤回、合同申请可拒绝、过期报价可续期\n\n跨域闭环分析(2026-08-02)定位的死路与半接线修复:\n- A1 客户「暂缓」(DEFER)事件错标成 customer_selected → 契约新增 solution.customer_deferred,两后端按 action 如实发布\n- A2 配货单 cancel 死边接线:补 cancel 端点与订单取消级联;salesOrderId 唯一 → 取消后重配走 CANCELLED--recreate--\u003eDRAFT 同行复活,明细重建实拣归零\n- A3 退款撤回补 UI 入口 + 双后端「申请→撤回→冻结额度释放」验收\n- B1 合同申请拒绝:ContractRequestStatus 增 REJECTED(留痕三列),报价同 tx contract_reject→ACCEPTED,复活重申请;连带拆开 CONTRACT_REQUESTED 的语义混叠,新增 CONTRACT_EFFECTIVE 终态由 activateContract 同 tx 迁移(不变量测试逼出的裁决)\n- B2 过期报价续期:SENT 增 send 自环,重发=完整 send 流程(版本+1/刷新有效期/重快照开关),配件冻结幂等\n\n迁移:20260802100000_contract_request_rejection(两后端,ALTER TYPE ADD VALUE + 加列,均 additive)\n证据(本地 dirty 工作区,2026-08-02):pnpm check EXIT=0;check:runtime 330 用例全绿(地板312);check:ui 11/12——唯一红盘为并发会话 skip_technical_review WIP 与其 E2E 不同步,非本切片所致\n文档:business-flow-overview 状态机索引与主干分支、quotation-blueprint §10、inventory-blueprint §9\n\n注:本提交经 hunk 级分离,不含同工作区并发会话的用户管理/技术复核指派 WIP;\n快照缺 MobileOverview 的 CONTRACT_EFFECTIVE 标签一行(属对方文件),合并后自愈\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-02T09:21:45-07:00"},{"Sha1":"7b3c8328178440e90c3a332dfbbd563401c44edc","Message":"feat(g8): 验签切片完成——前端单 token、测试夹具真签、本地身份切换、auth-source 门禁与文档回灌\n\n本地三级门禁证据(2026-08-02, dirty 工作区): check 绿 / check:runtime 312 用例 / check:ui 11 用例。\n剩余 G8 边界(生产 IdP、令牌吊销轮换、RLS)见 docs/handoff/g8-verified-auth.md 与 CLAUDE.md 动态区。\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-02T08:31:43-07:00"},{"Sha1":"83498209dddd46dfc21f45b1806b94e18d903552","Message":"docs(handoff): G8 验签改造交接文档——已裁决/已完成/剩余四步/诚实边界/已踩的坑\n\n上下文将满,把接手所需信息落盘:两项用户裁决、已完成范围、剩余四步的具体做法\n(含「测试 helper 签名保持不变、只换内部实现」这个让上百处调用点零改动的关键做法)、\n必须保留的诚实边界(RLS 未做、令牌分发非生产级、access_token 进 log 的残留风险),\n以及两个已踩过的坑(pnpm store 错位会触发清空重装;contracts lib 刻意不含 DOM)。\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-02T00:21:26-07:00"},{"Sha1":"5f8b521692f93344dd494d71fdcfe3cd3786fa6f","Message":"feat(g8/wip): 访问令牌验签单源 + 两后端强制验签(进行中,测试与前端未改完)\n\n⚠️ **本提交是 WIP,尚未通过 runtime/ui 门禁**——两套 HTTP 验收与 E2E 仍在发\ndemo 头,必然红。推上来是为了不丢这批安全改造,勿合并。\n\n## 已完成\n- contracts 新增 auth.ts:HS256 验签单源\n · verifyAccessToken(token, secret):**显式限定 algorithms**(不写就允许\n alg:none / 算法混淆);密钥 \u003c32 字符当场抛 CONFIG 而非降级放行\n · secret 由调用方显式传入——contracts 会被打进浏览器包,自己读 env\n 就有把密钥内联进前端产物的风险\n · decodeAccessTokenClaimsUnverified 仅供 UI 门控,名字写明它不是安全校验\n · 11 条对抗性单测:alg:none / HS512 混淆 / 篡改租户 / 过期 / 弱密钥 / 非法角色\n- 两后端改为**每请求验签一次**(NestJS 全局 APP_GUARD、Fastify onRequest 钩子),\n claims 挂 req 供下游同步读取\n- 身份三件套(tenantId/role/sub)全部改从已验签 claims 取;\n **删除全部回退分支**——验签失败即 401,绝不落回 x-tenant-id/x-user-role/x-user-id\n (那条兼容路径在验签落地后就是降级攻击面,G8 原文点名)\n- SSE/WS 的 ?access_token= 同样验签;删除 ?tenantId= 明文参数\n (它等于让任何人自称任意租户)\n- 免认证白名单只有 /api/health 与 /api/public/**,默认拒绝\n\n## 一并暴露的既有问题\nCLAUDE.md 只记了「租户未验签」,实际**角色也未验签**:x-user-role 同样是\n客户端自报,整个 capability 体系建立在后端信任这个头之上。现已一并收进 token。\n\n## 未完成(下一步)\n- 前端与导入脚本仍发 demo 头\n- 两套 HTTP 验收 + E2E 需改用 jose 现签 token,并补 401 判责断言\n- contracts/tenant.ts 的旧未验签 seam 待删\n- 门禁断言(禁止 demo 头回退回潮)+ 治理回灌\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-02T00:07:43-07:00"}],"HeadCommit":{"Sha1":"90cb8a4111b88f700b2dba5913e7a1e29c9666b6","Message":"feat(auth): 用户与权限管理落地——登录、受管理令牌吊销、本地身份切换\n\n承接 G8 验签切片(已合入的 auth.ts 单源),把「令牌从哪来」这一半补上:\n此前只解决了「后端是否验签」,令牌仍靠带外发放、没有账号也无从吊销。\n\n## 用户与访问管理\n- 新增 `packages/password-auth`:口令哈希与校验独立成包,不与业务代码混在一起\n- 迁移 `20260802150000_user_access_management`(两后端对等)\n- 登录端点 + `/login` 页面 + `features/users` 管理界面\n- **受管理令牌**:claims 带 `authVersion`,每次鉴权比对 DB 快照\n (同租户/同用户/同角色/ACTIVE/版本一致),任一不符即 REVOKED——\n 这让「停用账号」「改角色」能**立即生效**,而不是等令牌自然过期;\n 未带 authVersion 的 bootstrap/local 令牌走原有受控接缝,不受影响\n- 蓝图见 docs/domain/user-access-management-blueprint.md\n\n## 本地身份切换(开发接缝,非生产能力)\n`LOCAL_DEVELOPMENT_IDENTITIES` 固定目录 + 显式开关,双后端仅在非生产签发;\nWeb 用同一 cookie 同步 SSR / REST / 实时连接。**只为职责分离验收而存在**\n(不可自批需要两个不同的 sub,而浏览器会话只有一个身份),生产模式无条件关闭。\n契约层单测钉住:目录 id/sub 唯一、不含 UNAUTHENTICATED、只接受目录内身份。\n\n## 方案技术复核邀请\n迁移 `20260802170000_solution_technical_reviewer_invitation` + 两后端服务与路由,\n配套 SolutionStatusBadge;owner-matrix 与方案蓝图同步登记。\n\n## 文档\n新增 docs/spatiotemporal-fact-model.md(时空事实模型范式规范);\n词典、角色权限蓝图、待办审批蓝图、操作手册、治理经验库同步更新;\nG8 交接文档转为已完成归档,并保留四条诚实边界(RLS 未做、令牌分发非生产级、\naccess_token 进 log 的残留风险、验签可信才谈防抵赖)。\n\n## 证据(本地工作区,dirty)\n`pnpm check` exit 0。runtime/ui 由本轮实现方记录于交接文档:\n312/312 与 11/11,其中浏览器真实完成管理员→技术→管理员切换。\n该证据绑定本地工作区,不外推为远端 CI、部署或生产签收。\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-02T09:40:29-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/7619cf79681794bf28a8dceeb606c9dcfec21a5c...90cb8a4111b88f700b2dba5913e7a1e29c9666b6","Len":5}...
|
1785690034
|
Edit
Delete
|
|
20297
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/feat/g8-verified-auth
|
0
|
{"Commits":[{"Sha1":"9f1ea88bc {"Commits":[{"Sha1":"9f1ea88bcf8f55b6a1d25f0c5e5d0e282fd09a56","Message":"fix(dev): 本地启动链补齐 G8 验签所需 env——launch.json 与 README 都停在验签之前\n\n## 症状\n`preview_start` 起 web 后页面能开、功能全死:每个 API 请求 500 AUTH_NOT_CONFIGURED。\n(同时出现的 corepack `Invalid package.json` 是另一回事——那三次重试恰好撞在\n上一个 cherry-pick 的冲突窗口里,`package.json` 当时带着冲突标记,确实不是合法 JSON。\n冲突收干净后自动消失,不是配置问题。)\n\n## 根因\n`.claude/launch.json` 与 README 的「快速开始」都写于 G8 落地之前。\nG8 之后两个后端每请求都要 verifyAccessToken,缺 AUTH_JWT_SECRET 即 fail-closed 500\n——刻意不回 401:密钥没配是服务端故障,回 401 会把运维问题伪装成调用方的凭证问题。\n而 `.env.example` 双端其实都已补过密钥,漏的只有这两个**启动入口**。\n\n## 改动\n- launch.json 四个配置:后端补 AUTH_JWT_SECRET + LOCAL_IDENTITY_SWITCH_ENABLED\n- web 侧现签引导令牌:本地身份切换接口自己也要验签,没有引导令牌就是先有鸡还是\n 先有蛋。令牌用 contracts 的 signAccessToken 现签——**与后端同一份密钥、同一个\n 函数**,不另造第二条签发路径(那正是 P1 禁止的双真源形态)\n- 加 `test -n \"$NEXT_PUBLIC_AUTH_TOKEN\"`:签发失败当场退出,不让「令牌为空」\n 静默退化成满屏 401——那种失败看起来和「没登录」一模一样,最难判责\n- 顺手修 api-nestjs 的 `port` 字段:原为 3099,与实际监听的 3097 对不上\n- README 第 3 步补 AUTH_JWT_SECRET / NEXT_PUBLIC_AUTH_TOKEN 及其 fail-closed 语义;\n 命令表补 4 个已存在却从未登记的门禁(api-routes / approval-payload /\n workspace-hygiene / gate-selftest)\n\n## 证据(本地工作区,Fastify + PG:55432 + Redis:6382)\n- /api/health → `{\"status\":\"ok\",\"checks\":{\"database\":\"up\",\"redis\":\"up\"}}`\n- 无令牌 GET /api/quotations → 401;签名令牌 → 200 带真实数据;\n 令牌改一个字符 → 401(验签真的参与判定,不是摆设)\n- 浏览器 http://localhost:3098:demo-tenant 工作台渲染,KPI ¥2,733,893.60 / 5 份报价,\n 实时通道在线,本地身份切换 10 个角色可用,控制台零报错\n- `pnpm check` exit 0\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-02T18:24:48-07:00"},{"Sha1":"44a51eebab6962f641bdf6d95eb2742d082d0a32","Message":"fix(gate): 捡回工作区卫生门禁(C28)——check:ui 的 tsconfig 残留会自愈\n\n`34635aa` 是 2026-07-31 落在一个 detached worktree 里、**从未合入也未被重新实现**的\n改进。经核查:三个脚本文件在 main 血脉里全都不存在,棘轮无 workspaceHygieneViolations,\n而它修的 bug 至今仍在(restoreWebTypeArtifacts 仍是快照式还原)。故 cherry-pick 捡回。\n\n## 解决的问题\ncheck:ui 为规避 manifest/EMFILE 假 404(C17)给 Next 用独立 distDir `.next-ui-\u003cpid\u003e`,\nNext dev 会把该路径写进**被跟踪的** apps/web/tsconfig.json。\n此前的备份/还原是**快照式**——把启动前就存在的残留原样写回,永不自愈;\n而残留恰恰来自还原逻辑捕获不到的退出路径(SIGKILL / 并发轮次互相复活死条目)。\n本仓有并发会话共用 checkout,这条路径不是假想。\n\n## 修法两层\n- runner 还原后**无条件剥离** `.next-ui-*`:干净工作区上是恒等变换,仍严格净零\n- 独立门禁 `check:workspace-hygiene` 作第二道防线,入棘轮\n 判据刻意收窄防假门禁:只查 include 不查 exclude(node_modules 天然 gitignore,\n 一并查会注册即红,重蹈 C1);合法性只看首个路径段而非字面量白名单,\n 以免随 Next 版本增删而变成维护跑步机\n\n## 落地时的两处调整\n1. **编号 C25 → C28**:并行工作里已有另一个 C25(孤儿组件 `OrdersPanel`/`UsersPanel`),\n 撞车。按「编号只用于定位、不复用」的约定改为空号 C28。\n2. **只取代码不取报告**:原提交带的 baseline 与 20 份 report 快照已全部过期\n (gateSelftests 地板当时 2→3,现已是 6),直接取会把棘轮改坏。\n 报告全部还原为当前 HEAD,改由本轮重跑生成。\n\n## 门禁上线即抓到 5 处真实残留\n`.next-manual-10560` / `.next-ui-{49228,61102,94609}` / `.next-dev-3098`\n——比原提交记录的面更广:除 check:ui 外,手册截图 runner 与开发服务器同样会写入。\n已清理;runner 侧自愈只覆盖 `.next-ui-*`,其余 runner 若再产生仍由本门禁兜住。\n\n## 证据(本地工作区)\n`pnpm check` exit 0(含新门禁);`check:gate-selftest` 7 组负向全绿;\n真实链路负向:注入 `.next-ui-99999` → exit 1,移除后 → exit 0。\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-02T18:13:12-07:00"}],"HeadCommit":{"Sha1":"9f1ea88bcf8f55b6a1d25f0c5e5d0e282fd09a56","Message":"fix(dev): 本地启动链补齐 G8 验签所需 env——launch.json 与 README 都停在验签之前\n\n## 症状\n`preview_start` 起 web 后页面能开、功能全死:每个 API 请求 500 AUTH_NOT_CONFIGURED。\n(同时出现的 corepack `Invalid package.json` 是另一回事——那三次重试恰好撞在\n上一个 cherry-pick 的冲突窗口里,`package.json` 当时带着冲突标记,确实不是合法 JSON。\n冲突收干净后自动消失,不是配置问题。)\n\n## 根因\n`.claude/launch.json` 与 README 的「快速开始」都写于 G8 落地之前。\nG8 之后两个后端每请求都要 verifyAccessToken,缺 AUTH_JWT_SECRET 即 fail-closed 500\n——刻意不回 401:密钥没配是服务端故障,回 401 会把运维问题伪装成调用方的凭证问题。\n而 `.env.example` 双端其实都已补过密钥,漏的只有这两个**启动入口**。\n\n## 改动\n- launch.json 四个配置:后端补 AUTH_JWT_SECRET + LOCAL_IDENTITY_SWITCH_ENABLED\n- web 侧现签引导令牌:本地身份切换接口自己也要验签,没有引导令牌就是先有鸡还是\n 先有蛋。令牌用 contracts 的 signAccessToken 现签——**与后端同一份密钥、同一个\n 函数**,不另造第二条签发路径(那正是 P1 禁止的双真源形态)\n- 加 `test -n \"$NEXT_PUBLIC_AUTH_TOKEN\"`:签发失败当场退出,不让「令牌为空」\n 静默退化成满屏 401——那种失败看起来和「没登录」一模一样,最难判责\n- 顺手修 api-nestjs 的 `port` 字段:原为 3099,与实际监听的 3097 对不上\n- README 第 3 步补 AUTH_JWT_SECRET / NEXT_PUBLIC_AUTH_TOKEN 及其 fail-closed 语义;\n 命令表补 4 个已存在却从未登记的门禁(api-routes / approval-payload /\n workspace-hygiene / gate-selftest)\n\n## 证据(本地工作区,Fastify + PG:55432 + Redis:6382)\n- /api/health → `{\"status\":\"ok\",\"checks\":{\"database\":\"up\",\"redis\":\"up\"}}`\n- 无令牌 GET /api/quotations → 401;签名令牌 → 200 带真实数据;\n 令牌改一个字符 → 401(验签真的参与判定,不是摆设)\n- 浏览器 http://localhost:3098:demo-tenant 工作台渲染,KPI ¥2,733,893.60 / 5 份报价,\n 实时通道在线,本地身份切换 10 个角色可用,控制台零报错\n- `pnpm check` exit 0\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-02T18:24:48-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/90cb8a4111b88f700b2dba5913e7a1e29c9666b6...9f1ea88bcf8f55b6a1d25f0c5e5d0e282fd09a56","Len":2}...
|
1785720302
|
Edit
Delete
|
|
20306
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/feat/g8-verified-auth
|
0
|
{"Commits":[{"Sha1":"4e06b6263 {"Commits":[{"Sha1":"4e06b62635319faead311e0b6799c2e47877f859","Message":"feat(fulfillment): 履约五模块 UI 优化——分批发运、采购看板、交接中文标签与终态确认\n\n- 契约单源:新增 SHIPMENT_STATE_LABELS 与 CONTRACT_REQUEST_STATUS_LABELS,\n 补齐发运/合同状态此前缺失的中文标签定义\n- 履约协同:订单卡显示下单时间与「当前责任人」指引(与安装页口径一致)\n- 采购协同:消费服务端 /purchase-orders/summary 聚合做看板指标(不在浏览器\n reduce,C27 口径);补加载/空态;四段进度条与明细待收展示\n- 物流发运:发运表单支持逐行下调本批数量(分批发运蓝图承诺补齐 UI 端);\n 新增「发运记录」区展示含已送达在内的全部发运单;配货清单补加载/空态\n- 技术履约:工单生成/开始/完成时间恒显(此前仅完工后可见)\n- 客服交接:发运/安装/合同状态全部改用 contracts 中文标签(消除英文枚举\n 直出);新增服务进度时间线;「关闭服务」终态动作补二次确认;显示交接备注\n\n证据:pnpm check 19 项全绿;contracts 240/240;check:ui 12/12 全绿\n(履约闭环用例覆盖新版发运表单/采购流转/交接卡;此前并行红项未复现)。\nCLAUDE.md 动态区证据行已同步。\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-02T19:32:04-07:00"}],"HeadCommit":{"Sha1":"4e06b62635319faead311e0b6799c2e47877f859","Message":"feat(fulfillment): 履约五模块 UI 优化——分批发运、采购看板、交接中文标签与终态确认\n\n- 契约单源:新增 SHIPMENT_STATE_LABELS 与 CONTRACT_REQUEST_STATUS_LABELS,\n 补齐发运/合同状态此前缺失的中文标签定义\n- 履约协同:订单卡显示下单时间与「当前责任人」指引(与安装页口径一致)\n- 采购协同:消费服务端 /purchase-orders/summary 聚合做看板指标(不在浏览器\n reduce,C27 口径);补加载/空态;四段进度条与明细待收展示\n- 物流发运:发运表单支持逐行下调本批数量(分批发运蓝图承诺补齐 UI 端);\n 新增「发运记录」区展示含已送达在内的全部发运单;配货清单补加载/空态\n- 技术履约:工单生成/开始/完成时间恒显(此前仅完工后可见)\n- 客服交接:发运/安装/合同状态全部改用 contracts 中文标签(消除英文枚举\n 直出);新增服务进度时间线;「关闭服务」终态动作补二次确认;显示交接备注\n\n证据:pnpm check 19 项全绿;contracts 240/240;check:ui 12/12 全绿\n(履约闭环用例覆盖新版发运表单/采购流转/交接卡;此前并行红项未复现)。\nCLAUDE.md 动态区证据行已同步。\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-02T19:32:04-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/9f1ea88bcf8f55b6a1d25f0c5e5d0e282fd09a56...4e06b62635319faead311e0b6799c2e47877f859","Len":1}...
|
1785724341
|
Edit
Delete
|
|
20280
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/feat/g24-list-pagination-and-options
|
0
|
|
1785589103
|
Edit
Delete
|
|
20281
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/feat/g24-list-pagination-and-options
|
0
|
{"Commits":[{"Sha1":"ccbb031fd {"Commits":[{"Sha1":"ccbb031fdb47bc913ed2b4ba270c0a49889eb88d","Message":"feat(g24): 列表分页 + 选择器 options 双读路径(contracts 单源/双后端对等/三层负向证据)\n\n- contracts 新增 pagination.ts 单源:Paginated\u003cT\u003e{items,page,pageSize,total}(total=租户全量)、\n paginationQuerySchema(默认 20/上限 100,越界 Zod 400 不静默 clamp)、toPrismaPage/makePaginated、\n OptionList\u003cT\u003e{items,truncated} + OPTION_LIST_LIMIT=200 + makeOptionList,\n 三个 Option 投影重建对象字面量做字段白名单(成本/底价结构性缺席;按选择器反推补 versionNo/taxRateBps)\n- 两后端对等:quotations/products/customers/sales-orders 四列表改 Paginated 信封;\n 新增 /products/options(只返在售)、/customers/options(联系人 id/name/mobile)、\n /fulfillment/contract-requests/options(只返 REQUESTED);权限沿用列表同一 capability\n- 前端真实对接:9 个选择器站点切 options hook(key 挂既有根继承实时失效,\n sales_order.* 额外失效合同 options);合同激活手填 UUID 换真实下拉;\n page.tsx contracts/products prop 下钻退役;4 列表接分页条;truncated 显式提示\n- 对抗性测试三层负向均实跑判红后恢复:contracts 投影透传红 / module-integration\n degrade-selector-to-paginated-list 注入红 / E2E 选择器退化红(第 9 条浏览器用例);\n 顺带发现并修复 drop-fulfillment-realtime 注入被 payment 分支同字面量代码静默拔牙(replace→replaceAll)\n- 棘轮抬地板:testsPassed 265→279、uiTestsPassed 8→9、ownTests 17→18、ownTestCases 194→209\n- 回灌:CLAUDE.md 真源地图+动态区(G24 移入已关闭)、governance-experience 战役记录、\n owner-matrix 登记三个 options 读模型、api-standard 分页章节按裁决修正\n\n证据(本地工作区,2026-08-01):pnpm check exit 0;check:runtime 279/0(PG:55432/juhai_quotation_g24_20260801);\ncheck:ui 9/0(juhai_quotation_ui_g24_20260801)\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-01T05:57:57-07:00"}],"HeadCommit":{"Sha1":"ccbb031fdb47bc913ed2b4ba270c0a49889eb88d","Message":"feat(g24): 列表分页 + 选择器 options 双读路径(contracts 单源/双后端对等/三层负向证据)\n\n- contracts 新增 pagination.ts 单源:Paginated\u003cT\u003e{items,page,pageSize,total}(total=租户全量)、\n paginationQuerySchema(默认 20/上限 100,越界 Zod 400 不静默 clamp)、toPrismaPage/makePaginated、\n OptionList\u003cT\u003e{items,truncated} + OPTION_LIST_LIMIT=200 + makeOptionList,\n 三个 Option 投影重建对象字面量做字段白名单(成本/底价结构性缺席;按选择器反推补 versionNo/taxRateBps)\n- 两后端对等:quotations/products/customers/sales-orders 四列表改 Paginated 信封;\n 新增 /products/options(只返在售)、/customers/options(联系人 id/name/mobile)、\n /fulfillment/contract-requests/options(只返 REQUESTED);权限沿用列表同一 capability\n- 前端真实对接:9 个选择器站点切 options hook(key 挂既有根继承实时失效,\n sales_order.* 额外失效合同 options);合同激活手填 UUID 换真实下拉;\n page.tsx contracts/products prop 下钻退役;4 列表接分页条;truncated 显式提示\n- 对抗性测试三层负向均实跑判红后恢复:contracts 投影透传红 / module-integration\n degrade-selector-to-paginated-list 注入红 / E2E 选择器退化红(第 9 条浏览器用例);\n 顺带发现并修复 drop-fulfillment-realtime 注入被 payment 分支同字面量代码静默拔牙(replace→replaceAll)\n- 棘轮抬地板:testsPassed 265→279、uiTestsPassed 8→9、ownTests 17→18、ownTestCases 194→209\n- 回灌:CLAUDE.md 真源地图+动态区(G24 移入已关闭)、governance-experience 战役记录、\n owner-matrix 登记三个 options 读模型、api-standard 分页章节按裁决修正\n\n证据(本地工作区,2026-08-01):pnpm check exit 0;check:runtime 279/0(PG:55432/juhai_quotation_g24_20260801);\ncheck:ui 9/0(juhai_quotation_ui_g24_20260801)\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-01T05:57:57-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/8fe17cd57002bf1ed691e63a80c71db5c03d0f5f...ccbb031fdb47bc913ed2b4ba270c0a49889eb88d","Len":1}...
|
1785589103
|
Edit
Delete
|
|
1116
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/feat/base-service-v2-poc
|
0
|
|
1776406532
|
Edit
Delete
|
|
1117
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/feat/base-service-v2-poc
|
0
|
{"Commits":[{"Sha1":"c438f31da {"Commits":[{"Sha1":"c438f31dae2fd15bc8ae3fd5419a19394c7191cc","Message":"feat(shared): BaseServiceV2 PoC(RFC-0001 方案 B 类型签名验证)\n\nSprint 2 样本 PoC:验证 RFC-0001 方案 B 的 TypeScript 泛型约束\n(TModelKey extends keyof Prisma.TransactionClient) 在 Prisma 5.22 下可\n编译,且能让子类在编译期被强制声明真实的 Prisma model key。\n\n核心设计(对应 RFC-0001 方案 B):\n\n1. backend/src/shared/services/base-service-v2.ts(226 行)\n - abstract class BaseServiceV2\u003cTEntity, TCreate, TUpdate, TModelKey\u003e\n - TModelKey 泛型约束:extends keyof Prisma.TransactionClient\n - 子类通过 protected abstract readonly modelKey: TModelKey 声明\n - create/update/delete 内部 prisma.$transaction(async tx =\u003e ...):\n * 数据写入走 tx[this.modelKey](绑定到 tx 客户端)\n * 事件发布走 publishEventInTransaction(tx, ...)(同事务)\n * 共享同一 $transaction → 彻底消除模式 A \"data write 绕 tx\" 假绿\n - 30s 事务超时默认值\n\n2. backend/src/shared/services/__examples__/base-service-v2-samples.ts(144 行)\n - 3 个样本子类演示 modelKey 泛型锁定:\n * ReconciliationServiceV2Sample(modelKey='auto_match_rules')\n * RenewalsServiceV2Sample(modelKey='renewals')\n * CourseServiceV2Sample(modelKey='hr_courses')\n - 含反例注释:bogus_table 会触发 TypeScript 编译错误\n \"Type '\\\"not_a_real_table\\\"' does not satisfy the constraint\n 'keyof TransactionClient'\",证明编译期约束有效\n\n验证:\n- tsc --noEmit 对新增文件零错误(全工作区其他错误均来自预存在的\n journey-orchestration 模块 Prisma schema 不同步问题,与本 PR 无关)\n- 本 PoC 不在生产路径上使用,不导入任何生产 controller/routes/main.ts\n- 纯技术可行性验证,供技术委员会评审 RFC-0001 方案 B\n\nSprint 2 正式迁移路线(RFC-0001 W5-W6):\n1. 合并本 PoC 后,Backend Architect 基于 BaseServiceV2 产出 PR\n2. 按优先级顺序迁移:22 真 D → 6 A-override → 8 良性 override → 4 微竞态\n3. 用 V2 审计判据(PR #38)作为 gate,迁移完成后启用 --strict-v2\n\n关联:Q2 Sprint 2 预研 · RFC-0001 方案 B 技术可行性验证\n前序:#36 D-class 盘点 / #37 RFC-0001 / #38 V2 审计升级 / #39 Sprint 1 复盘\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T14:15:21+08:00"}],"HeadCommit":{"Sha1":"c438f31dae2fd15bc8ae3fd5419a19394c7191cc","Message":"feat(shared): BaseServiceV2 PoC(RFC-0001 方案 B 类型签名验证)\n\nSprint 2 样本 PoC:验证 RFC-0001 方案 B 的 TypeScript 泛型约束\n(TModelKey extends keyof Prisma.TransactionClient) 在 Prisma 5.22 下可\n编译,且能让子类在编译期被强制声明真实的 Prisma model key。\n\n核心设计(对应 RFC-0001 方案 B):\n\n1. backend/src/shared/services/base-service-v2.ts(226 行)\n - abstract class BaseServiceV2\u003cTEntity, TCreate, TUpdate, TModelKey\u003e\n - TModelKey 泛型约束:extends keyof Prisma.TransactionClient\n - 子类通过 protected abstract readonly modelKey: TModelKey 声明\n - create/update/delete 内部 prisma.$transaction(async tx =\u003e ...):\n * 数据写入走 tx[this.modelKey](绑定到 tx 客户端)\n * 事件发布走 publishEventInTransaction(tx, ...)(同事务)\n * 共享同一 $transaction → 彻底消除模式 A \"data write 绕 tx\" 假绿\n - 30s 事务超时默认值\n\n2. backend/src/shared/services/__examples__/base-service-v2-samples.ts(144 行)\n - 3 个样本子类演示 modelKey 泛型锁定:\n * ReconciliationServiceV2Sample(modelKey='auto_match_rules')\n * RenewalsServiceV2Sample(modelKey='renewals')\n * CourseServiceV2Sample(modelKey='hr_courses')\n - 含反例注释:bogus_table 会触发 TypeScript 编译错误\n \"Type '\\\"not_a_real_table\\\"' does not satisfy the constraint\n 'keyof TransactionClient'\",证明编译期约束有效\n\n验证:\n- tsc --noEmit 对新增文件零错误(全工作区其他错误均来自预存在的\n journey-orchestration 模块 Prisma schema 不同步问题,与本 PR 无关)\n- 本 PoC 不在生产路径上使用,不导入任何生产 controller/routes/main.ts\n- 纯技术可行性验证,供技术委员会评审 RFC-0001 方案 B\n\nSprint 2 正式迁移路线(RFC-0001 W5-W6):\n1. 合并本 PoC 后,Backend Architect 基于 BaseServiceV2 产出 PR\n2. 按优先级顺序迁移:22 真 D → 6 A-override → 8 良性 override → 4 微竞态\n3. 用 V2 审计判据(PR #38)作为 gate,迁移完成后启用 --strict-v2\n\n关联:Q2 Sprint 2 预研 · RFC-0001 方案 B 技术可行性验证\n前序:#36 D-class 盘点 / #37 RFC-0001 / #38 V2 审计升级 / #39 Sprint 1 复盘\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T14:15:21+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/7b47df3186db279cfc071517a6c034aa213d926d...c438f31dae2fd15bc8ae3fd5419a19394c7191cc","Len":1}...
|
1776406533
|
Edit
Delete
|
|
2005
|
5
|
17
|
5
|
6
|
0
|
0
|
refs/heads/feat/base-service-v2-poc
|
0
|
|
1778625303
|
Edit
Delete
|
|
1134
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/feat/audit-v2.1-improvements
|
0
|
|
1776410323
|
Edit
Delete
|
|
1135
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/feat/audit-v2.1-improvements
|
0
|
{"Commits":[{"Sha1":"280c26d50 {"Commits":[{"Sha1":"280c26d501e997899fd203579d774521be2fe166","Message":"feat(audit): V2.1 规则精度改进 - 方法作用域 + 数组事务豁免 + txn 别名\n\n基于 PR #41 的抽样验证(V2 规则 20% 误报 / 10% 归类错),对 V2 判据做三项\n改进,命中数从 297 降至 64(↓78%),且修复 finance-credits 9 处 TX-BOUND-WRITE\n假归类问题。\n\n改进 1 · 方法作用域判定(解决误报)\n detectTxBoundWrite 升级为方法级作用域:仅当 this.model.\u003cwrite\u003e 或\n prisma.\u003cmodel\u003e.\u003cwrite\u003e 所在方法体内也存在 publishEvent/publishLifecycleEvent\n 调用时才命中。消除 \"同文件其他方法发事件但本方法只是 updateMany/projection\n 同步\" 类误报(如 ad-placement:405 updateCampaign / approval:395\n syncProjectionAfterWorkflowDecision 两处抽样已被正确豁免)。\n\n改进 2 · txn 别名识别(解决归类错)\n findArrayTransactionRanges 正则扩展以识别 txn/inTransaction/runInTransaction\n 作为 prisma.$transaction 的内部 helper 别名。\n\n改进 3 · detectTxBoundWrite 豁免数组事务范围(抽样报告未覆盖的缺陷)\n V2 版本 detectTxBoundWrite 只豁免 $transaction callback 与 tx-helper 函数,\n 未豁免数组事务范围,导致 finance-credits L193 this.model.upsert 虽在\n txn([...]) 内却被错报为 TX-BOUND-WRITE。补齐:detectTxBoundWrite 现同时\n 豁免 arrayTxRanges,避免与 ARRAY-TXN-WITH-EVENT 重复归类。\n\n验证(对比 V2 vs V2.1):\n- TX-BOUND-WRITE: 297 → 64 (↓78%)\n- ARRAY-TXN-WITH-EVENT: 5 → 5 (不变,finance-credits 4 + price-books 1)\n- A-class: 1633 → 1633 (不变)\n- B/C/D-class: 全部不变\n- ad-placement:405 (误报) → 已豁免\n- approval:395 (误报) → 已豁免\n- finance-credits L193-267 / L454-503 (9 处归类错) → 已豁免,只剩\n L224/273/477/518 四处正确的 ARRAY-TXN-WITH-EVENT\n- geo-keywords / ad-biddings / price-books 等真阳性 → 仍命中\n\n抽样报告 PR #41 预测 V2.1 会收敛到 ~150 处,实际 64 处,说明方法作用域 +\n数组事务豁免联合比预期更有效。这 64 处即 Sprint 2 的精确攻击清单。\n\ntsc --noEmit 无新增错误。\n\nSprint 2 路径微调:原计划 W5 需要先实施 V2.1 再迁移,现在 V2.1 已预实施\n(本 PR),Sprint 2 W5 直接按 64 处清单启动迁移即可。\n\n关联:Q2 Sprint 2 迁移前置\n前序:#38 V2 审计升级 / #41 精度抽样验证\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T15:18:26+08:00"}],"HeadCommit":{"Sha1":"280c26d501e997899fd203579d774521be2fe166","Message":"feat(audit): V2.1 规则精度改进 - 方法作用域 + 数组事务豁免 + txn 别名\n\n基于 PR #41 的抽样验证(V2 规则 20% 误报 / 10% 归类错),对 V2 判据做三项\n改进,命中数从 297 降至 64(↓78%),且修复 finance-credits 9 处 TX-BOUND-WRITE\n假归类问题。\n\n改进 1 · 方法作用域判定(解决误报)\n detectTxBoundWrite 升级为方法级作用域:仅当 this.model.\u003cwrite\u003e 或\n prisma.\u003cmodel\u003e.\u003cwrite\u003e 所在方法体内也存在 publishEvent/publishLifecycleEvent\n 调用时才命中。消除 \"同文件其他方法发事件但本方法只是 updateMany/projection\n 同步\" 类误报(如 ad-placement:405 updateCampaign / approval:395\n syncProjectionAfterWorkflowDecision 两处抽样已被正确豁免)。\n\n改进 2 · txn 别名识别(解决归类错)\n findArrayTransactionRanges 正则扩展以识别 txn/inTransaction/runInTransaction\n 作为 prisma.$transaction 的内部 helper 别名。\n\n改进 3 · detectTxBoundWrite 豁免数组事务范围(抽样报告未覆盖的缺陷)\n V2 版本 detectTxBoundWrite 只豁免 $transaction callback 与 tx-helper 函数,\n 未豁免数组事务范围,导致 finance-credits L193 this.model.upsert 虽在\n txn([...]) 内却被错报为 TX-BOUND-WRITE。补齐:detectTxBoundWrite 现同时\n 豁免 arrayTxRanges,避免与 ARRAY-TXN-WITH-EVENT 重复归类。\n\n验证(对比 V2 vs V2.1):\n- TX-BOUND-WRITE: 297 → 64 (↓78%)\n- ARRAY-TXN-WITH-EVENT: 5 → 5 (不变,finance-credits 4 + price-books 1)\n- A-class: 1633 → 1633 (不变)\n- B/C/D-class: 全部不变\n- ad-placement:405 (误报) → 已豁免\n- approval:395 (误报) → 已豁免\n- finance-credits L193-267 / L454-503 (9 处归类错) → 已豁免,只剩\n L224/273/477/518 四处正确的 ARRAY-TXN-WITH-EVENT\n- geo-keywords / ad-biddings / price-books 等真阳性 → 仍命中\n\n抽样报告 PR #41 预测 V2.1 会收敛到 ~150 处,实际 64 处,说明方法作用域 +\n数组事务豁免联合比预期更有效。这 64 处即 Sprint 2 的精确攻击清单。\n\ntsc --noEmit 无新增错误。\n\nSprint 2 路径微调:原计划 W5 需要先实施 V2.1 再迁移,现在 V2.1 已预实施\n(本 PR),Sprint 2 W5 直接按 64 处清单启动迁移即可。\n\n关联:Q2 Sprint 2 迁移前置\n前序:#38 V2 审计升级 / #41 精度抽样验证\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T15:18:26+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/8a95110c2f089d5e800363910dee9bd22993258c...280c26d501e997899fd203579d774521be2fe166","Len":1}...
|
1776410323
|
Edit
Delete
|
|
1136
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/feat/audit-v2.1-improvements
|
0
|
{"Commits":[{"Sha1":"5c3113137 {"Commits":[{"Sha1":"5c31131371cccf1842c6ed8aa4df13df09861249","Message":"refactor(geo-keywords): 原子化 7 个写链 - RFC-0001 方案 B 端到端样板\n\n将 createKeyword / updateKeyword / deleteKeyword / recordRanking /\ntoggleKeywordStatus / batchDeleteKeywords / checkRanking 全部收口为\n`$transaction + tx.\u003cmodel\u003e.* + publishLifecycleEvent({ tx })`,\n让业务写集与 outbox 事件共享同一事务边界。\n\n- V2.1 TX-BOUND-WRITE: 全局命中 64→54,geo-keyword 模块 10→0\n- batchDelete 的 Promise.all 事件改串行,避免在事务回调内并发写同一 TransactionClient\n- 单测:$transaction mock 兼容 callback/array 两种语义并把 mockPrisma 作为\n TransactionClient 透回,5 个写链新增 `tx: mockPrisma` 透传断言(8/8 pass)\n\n作为 RFC-0001 方案 B 的端到端样板,剩余 54 条 TX-BOUND-WRITE 与 5 条\nARRAY-TXN-WITH-EVENT 按 Sprint 2 W6 依此模板批量处理。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-22T22:02:35+08:00"}],"HeadCommit":{"Sha1":"5c31131371cccf1842c6ed8aa4df13df09861249","Message":"refactor(geo-keywords): 原子化 7 个写链 - RFC-0001 方案 B 端到端样板\n\n将 createKeyword / updateKeyword / deleteKeyword / recordRanking /\ntoggleKeywordStatus / batchDeleteKeywords / checkRanking 全部收口为\n`$transaction + tx.\u003cmodel\u003e.* + publishLifecycleEvent({ tx })`,\n让业务写集与 outbox 事件共享同一事务边界。\n\n- V2.1 TX-BOUND-WRITE: 全局命中 64→54,geo-keyword 模块 10→0\n- batchDelete 的 Promise.all 事件改串行,避免在事务回调内并发写同一 TransactionClient\n- 单测:$transaction mock 兼容 callback/array 两种语义并把 mockPrisma 作为\n TransactionClient 透回,5 个写链新增 `tx: mockPrisma` 透传断言(8/8 pass)\n\n作为 RFC-0001 方案 B 的端到端样板,剩余 54 条 TX-BOUND-WRITE 与 5 条\nARRAY-TXN-WITH-EVENT 按 Sprint 2 W6 依此模板批量处理。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-22T22:02:35+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/280c26d501e997899fd203579d774521be2fe166...5c31131371cccf1842c6ed8aa4df13df09861249","Len":1}...
|
1776867159
|
Edit
Delete
|
|
1207
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/feat/audit-v2.1-improvements
|
0
|
{"Commits":[{"Sha1":"fa2dbcdf3 {"Commits":[{"Sha1":"fa2dbcdf3ad8d2db0a53e7c03d418f402bdfddbc","Message":"chore: 阶段性更新 - Sentry 集成 + 限流分档 + P0 链路测试 + 审计报告刷新\n\n- backend: 接入 Sentry 错误追踪 + uncaughtException 处理;advanced-rate-limiter\n 分档配置(standard/batch/write/sensitive);ticket-workflow / product-categories /\n alliance-agreement schema 修复 + 单测补齐\n- e2e: 新增 P0 链路测试运行器(ui-chain-runner / chain-context / chain-runner /\n stability-trend)及 trend 分析脚本;helpers 单测覆盖\n- deploy: blue-green compose / k8s configmap / api-deployment 调整;\n 新增 docs/deploy/blue-green-runbook.md\n- reports: 刷新审计快照(prisma-zod-contract 4-17/4-22、模块评分、\n 租户安全、API 覆盖率、approval-governance 等)\n- env.example: 文档化 SENTRY_DSN / RATE_LIMIT_* 分档 / EXIT_ON_UNCAUGHT_EXCEPTION\n\n排除:backend/.env(含真实开发密钥)、deploy/kubernetes/secrets.yaml(k8s 密钥模板)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-24T23:28:12+08:00"}],"HeadCommit":{"Sha1":"fa2dbcdf3ad8d2db0a53e7c03d418f402bdfddbc","Message":"chore: 阶段性更新 - Sentry 集成 + 限流分档 + P0 链路测试 + 审计报告刷新\n\n- backend: 接入 Sentry 错误追踪 + uncaughtException 处理;advanced-rate-limiter\n 分档配置(standard/batch/write/sensitive);ticket-workflow / product-categories /\n alliance-agreement schema 修复 + 单测补齐\n- e2e: 新增 P0 链路测试运行器(ui-chain-runner / chain-context / chain-runner /\n stability-trend)及 trend 分析脚本;helpers 单测覆盖\n- deploy: blue-green compose / k8s configmap / api-deployment 调整;\n 新增 docs/deploy/blue-green-runbook.md\n- reports: 刷新审计快照(prisma-zod-contract 4-17/4-22、模块评分、\n 租户安全、API 覆盖率、approval-governance 等)\n- env.example: 文档化 SENTRY_DSN / RATE_LIMIT_* 分档 / EXIT_ON_UNCAUGHT_EXCEPTION\n\n排除:backend/.env(含真实开发密钥)、deploy/kubernetes/secrets.yaml(k8s 密钥模板)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-24T23:28:12+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/5c31131371cccf1842c6ed8aa4df13df09861249...fa2dbcdf3ad8d2db0a53e7c03d418f402bdfddbc","Len":1}...
|
1777044501
|
Edit
Delete
|
|
2004
|
5
|
17
|
5
|
6
|
0
|
0
|
refs/heads/feat/audit-v2.1-improvements
|
0
|
|
1778625303
|
Edit
Delete
|
|
1112
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/feat/audit-outbox-tx-bound
|
0
|
|
1776402871
|
Edit
Delete
|
|
1113
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/feat/audit-outbox-tx-bound
|
0
|
{"Commits":[{"Sha1":"8a95110c2 {"Commits":[{"Sha1":"8a95110c2f089d5e800363910dee9bd22993258c","Message":"feat(audit): outbox-atomicity 新增 V2 判据 TX-BOUND-WRITE / ARRAY-TXN-WITH-EVENT\n\n对应 RFC-0001(BaseService 真正原子化)的审计脚本升级。在保留原有\nA/B/C/D 四分类判据不变的前提下,新增两类 WARNING 级判据暴露 Sprint 1 手工\n盘点中发现的两类系统性假绿:\n\n1. TX-BOUND-WRITE(模式 A · BaseService 架构级)\n - 扫描任一含 publishEvent/publishLifecycleEvent 调用的 service 文件\n - 对所有 this.model.\u003cwrite\u003e / prisma.\u003cmodel\u003e.\u003cwrite\u003e 出现位置,若其不在\n 任何 $transaction 回调 / tx-helper 函数范围内,记为 TX-BOUND-WRITE\n - 语义:data write 在默认 prisma client 上执行(未绑定 tx),publishEvent\n 失败或 tx 回滚时数据与事件会分裂\n\n2. ARRAY-TXN-WITH-EVENT(模式 B · 数组事务 + 事务外事件)\n - 扫描 prisma.$transaction([...]) / txn([...]) 数组形式事务\n - 若其所在方法体内(数组事务结束行之后)还有事务外的 publishEvent /\n publishLifecycleEvent 调用,则判 ARRAY-TXN-WITH-EVENT\n - 语义:数组事务无法传递 tx 客户端,后续事件必然独立事务\n\n输出设计:\n- V2 判据默认输出为 WARNING 级(不阻塞 CI),summary 新增\n v2TxBoundWrite / v2ArrayTxnWithEvent 两个计数\n- JSON 报告新增 v2Findings 数组记录 {ruleId, severity, file, line, code, hint}\n- 控制台输出前 15 条 finding,其余存档 JSON\n- 新增 --strict-v2 flag(B+C 为 0 时才触发),Sprint 2 完成迁移后可启用为\n 硬门禁\n\n首次运行结果(main HEAD):\n- A=1633 / B=0 / C=0 / D=43 / 原子化率 100%(未退化)\n- TX-BOUND-WRITE: 297 命中(顶部文件 groupbuy-influencers=20 /\n supply-chain-platform=19 / geo-keywords=10 / price-books=10 /\n finance-credits=9)\n- ARRAY-TXN-WITH-EVENT: 5 命中(finance-credits 4 处 + 新发现\n price-books 1 处)\n\nARRAY-TXN-WITH-EVENT 5 处 100% 对应 Sprint 1 手工盘点(finance-credits 4 处\n+ 1 处 price-books 新发现),印证规则精度高。TX-BOUND-WRITE 297 处为 Sprint 2\n架构级迁移的全量攻击清单。\n\ntsc --noEmit 无新增错误。\n\n关联:Q2 Sprint 1 · Backend Architect RFC-0001 预研\n前序:#36 D-class 首轮盘点 / #37 D-class 深挖 + RFC-0001\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T13:14:22+08:00"}],"HeadCommit":{"Sha1":"8a95110c2f089d5e800363910dee9bd22993258c","Message":"feat(audit): outbox-atomicity 新增 V2 判据 TX-BOUND-WRITE / ARRAY-TXN-WITH-EVENT\n\n对应 RFC-0001(BaseService 真正原子化)的审计脚本升级。在保留原有\nA/B/C/D 四分类判据不变的前提下,新增两类 WARNING 级判据暴露 Sprint 1 手工\n盘点中发现的两类系统性假绿:\n\n1. TX-BOUND-WRITE(模式 A · BaseService 架构级)\n - 扫描任一含 publishEvent/publishLifecycleEvent 调用的 service 文件\n - 对所有 this.model.\u003cwrite\u003e / prisma.\u003cmodel\u003e.\u003cwrite\u003e 出现位置,若其不在\n 任何 $transaction 回调 / tx-helper 函数范围内,记为 TX-BOUND-WRITE\n - 语义:data write 在默认 prisma client 上执行(未绑定 tx),publishEvent\n 失败或 tx 回滚时数据与事件会分裂\n\n2. ARRAY-TXN-WITH-EVENT(模式 B · 数组事务 + 事务外事件)\n - 扫描 prisma.$transaction([...]) / txn([...]) 数组形式事务\n - 若其所在方法体内(数组事务结束行之后)还有事务外的 publishEvent /\n publishLifecycleEvent 调用,则判 ARRAY-TXN-WITH-EVENT\n - 语义:数组事务无法传递 tx 客户端,后续事件必然独立事务\n\n输出设计:\n- V2 判据默认输出为 WARNING 级(不阻塞 CI),summary 新增\n v2TxBoundWrite / v2ArrayTxnWithEvent 两个计数\n- JSON 报告新增 v2Findings 数组记录 {ruleId, severity, file, line, code, hint}\n- 控制台输出前 15 条 finding,其余存档 JSON\n- 新增 --strict-v2 flag(B+C 为 0 时才触发),Sprint 2 完成迁移后可启用为\n 硬门禁\n\n首次运行结果(main HEAD):\n- A=1633 / B=0 / C=0 / D=43 / 原子化率 100%(未退化)\n- TX-BOUND-WRITE: 297 命中(顶部文件 groupbuy-influencers=20 /\n supply-chain-platform=19 / geo-keywords=10 / price-books=10 /\n finance-credits=9)\n- ARRAY-TXN-WITH-EVENT: 5 命中(finance-credits 4 处 + 新发现\n price-books 1 处)\n\nARRAY-TXN-WITH-EVENT 5 处 100% 对应 Sprint 1 手工盘点(finance-credits 4 处\n+ 1 处 price-books 新发现),印证规则精度高。TX-BOUND-WRITE 297 处为 Sprint 2\n架构级迁移的全量攻击清单。\n\ntsc --noEmit 无新增错误。\n\n关联:Q2 Sprint 1 · Backend Architect RFC-0001 预研\n前序:#36 D-class 首轮盘点 / #37 D-class 深挖 + RFC-0001\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T13:14:22+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/7b47df3186db279cfc071517a6c034aa213d926d...8a95110c2f089d5e800363910dee9bd22993258c","Len":1}...
|
1776402871
|
Edit
Delete
|
|
2003
|
5
|
17
|
5
|
6
|
0
|
0
|
refs/heads/feat/audit-outbox-tx-bound
|
0
|
|
1778625303
|
Edit
Delete
|
|
1106
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/feat/api-tests-bom-crud
|
0
|
|
1776391397
|
Edit
Delete
|
|
1107
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/feat/api-tests-bom-crud
|
0
|
{"Commits":[{"Sha1":"7031b8c0b {"Commits":[{"Sha1":"7031b8c0b8d37548dac36f74e76bc0e887ba8005","Message":"test(bom): 扩充 API 测试至完整 CRUD + 状态机 + 租户隔离\n\napi-test-coverage 审计之前将 bom 标为 probe-only (缺 detail/create/update/delete),\n仅覆盖 list / stats / auth401 三个浅层断言。本次扩充将 bom 升级至 complete-crud:\n\n覆盖维度:\n- create / detail / update / delete 全链路(含 draft 状态守卫)\n- 状态机:activate → update 被拒 / delete 被拒 / deactivate 回滚\n- 跨租户隔离:foreign tenant 对 detail / update / delete 均返回 404\n- auth401:未携带 token 请求返回 401\n- list / stats:保留原结构化响应校验\n\naudit:api-test-coverage 复跑验证 bom.status = \"complete-crud\",\ncoverage.list/detail/create/update/delete/stats/auth401 全部 true,\n覆盖 activate action。全量 complete-crud 模块数由 62 升至 63。\n\n⚠️ 本地 Docker daemon 未运行,依赖 postgres-test / redis-test 的 supertest\n执行未在本地跑通。依靠 GitHub Actions CI 的 e2e-tests.yml / migration-safety.yml\n在真实容器中执行验证。\n\nTypeScript 类型检查通过(tsc --noEmit 无 bom.test.ts 相关错误)。\n\n关联:Q2 12 周落地计划 Sprint 1 · Backend Quality Squad · KR2.2\n(API 测试覆盖 probe-only 93 → ≤ 20 / 完整 CRUD 62 → ≥ 140)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T10:03:09+08:00"}],"HeadCommit":{"Sha1":"7031b8c0b8d37548dac36f74e76bc0e887ba8005","Message":"test(bom): 扩充 API 测试至完整 CRUD + 状态机 + 租户隔离\n\napi-test-coverage 审计之前将 bom 标为 probe-only (缺 detail/create/update/delete),\n仅覆盖 list / stats / auth401 三个浅层断言。本次扩充将 bom 升级至 complete-crud:\n\n覆盖维度:\n- create / detail / update / delete 全链路(含 draft 状态守卫)\n- 状态机:activate → update 被拒 / delete 被拒 / deactivate 回滚\n- 跨租户隔离:foreign tenant 对 detail / update / delete 均返回 404\n- auth401:未携带 token 请求返回 401\n- list / stats:保留原结构化响应校验\n\naudit:api-test-coverage 复跑验证 bom.status = \"complete-crud\",\ncoverage.list/detail/create/update/delete/stats/auth401 全部 true,\n覆盖 activate action。全量 complete-crud 模块数由 62 升至 63。\n\n⚠️ 本地 Docker daemon 未运行,依赖 postgres-test / redis-test 的 supertest\n执行未在本地跑通。依靠 GitHub Actions CI 的 e2e-tests.yml / migration-safety.yml\n在真实容器中执行验证。\n\nTypeScript 类型检查通过(tsc --noEmit 无 bom.test.ts 相关错误)。\n\n关联:Q2 12 周落地计划 Sprint 1 · Backend Quality Squad · KR2.2\n(API 测试覆盖 probe-only 93 → ≤ 20 / 完整 CRUD 62 → ≥ 140)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T10:03:09+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/7b47df3186db279cfc071517a6c034aa213d926d...7031b8c0b8d37548dac36f74e76bc0e887ba8005","Len":1}...
|
1776391397
|
Edit
Delete
|
|
2002
|
5
|
17
|
5
|
6
|
0
|
0
|
refs/heads/feat/api-tests-bom-crud
|
0
|
|
1778625303
|
Edit
Delete
|
|
1118
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/docs/tx-bound-write-samples
|
0
|
|
1776408604
|
Edit
Delete
|
|
1119
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/docs/tx-bound-write-samples
|
0
|
{"Commits":[{"Sha1":"94bdd3e0c {"Commits":[{"Sha1":"94bdd3e0c36e7ba8e9380ddb74627492acc988dc","Message":"docs(governance): TX-BOUND-WRITE 规则精度抽样验证 · 10 处样本判定\n\n对 PR #38 新增的 TX-BOUND-WRITE 判据(297 处命中)做规则精度验证。\n抽样 10 处覆盖 TOP 2 文件(groupbuy-influencers / supply-chain-platform)\n+ 中等命中(ad-biddings / ad-placement / ai-autopilot / assembly /\nfinance-credits)+ 代表性小模块(alliance-campaigns / approvals /\ngeo-keywords),每处读 20-40 行上下文逐个判定。\n\n抽样结果:\n- 🔴 明确真阳性:4/10 = 40%\n * ad-biddings:124(create + 事务外事件)\n * alliance-campaign:46(super.create + 独立 createMany,模式 C)\n * geo-keywords:65(create + 事务外 publishLifecycleEvent)\n * supply-chain-platform:418(updateMany + create 分离,模式 C)\n- 🟠 归类错误(仍是假绿):1/10 = 10%\n * finance-credits:193 应归模式 B(txn([...]) 未被识别为事务)\n- ⚠️ 难判(偏真阳):3/10 = 30%\n * ai-autopilot:649(helper 函数,需追调用方)\n * assembly:404(紧跟 recalculateBomCost 语义未定)\n * groupbuy-influencers:153(createWithBizCodeRetry 包装)\n- ⚠️ 误报倾向:2/10 = 20%\n * ad-placement:405(方法内无事件发布)\n * approval:395(projection 同步非主写入)\n\n保守估计 297 处中:\n- ~50% (约 150 处) 明确真阳性假绿\n- ~30% (约 90 处) 需 helper 追踪确认\n- ~20% (约 60 处) 误报\n\n规则改进建议(V2.1):\n1. 方法作用域判定:仅当 write 所在方法体内也有 publishEvent 才命中\n → 解决 20% 误报\n2. 识别 txn/inTransaction/runInTransaction 别名为事务范围\n → 解决 10% 归类错\n3. helper 深度追踪(Sprint 3 / Q3 再升级)\n → 解决 30% 难判\n4. 可选:projection/refreshView/aggregate 方法白名单\n\n对 Sprint 2 迁移计划的影响:\n- 攻击清单从 297 收敛为 ~150 明确真阳 + ~90 需深挖\n- Sprint 2 W5 前置完成 V2.1 升级(改进 1+2),再用新 audit 重扫\n- Sprint 2 W5-W6 按 V2.1 精确列表迁移\n- Sprint 2 W6 末启用 --strict-v2 硬门禁\n\n本 PR 纯文档,无代码变更。依赖 #38 分支。合并顺序:#38 → 本 PR。\n\n关联:Q2 Sprint 2 迁移前置准备\n前序 PR:#38 V2 审计升级 / #40 BaseServiceV2 PoC\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T14:49:49+08:00"}],"HeadCommit":{"Sha1":"94bdd3e0c36e7ba8e9380ddb74627492acc988dc","Message":"docs(governance): TX-BOUND-WRITE 规则精度抽样验证 · 10 处样本判定\n\n对 PR #38 新增的 TX-BOUND-WRITE 判据(297 处命中)做规则精度验证。\n抽样 10 处覆盖 TOP 2 文件(groupbuy-influencers / supply-chain-platform)\n+ 中等命中(ad-biddings / ad-placement / ai-autopilot / assembly /\nfinance-credits)+ 代表性小模块(alliance-campaigns / approvals /\ngeo-keywords),每处读 20-40 行上下文逐个判定。\n\n抽样结果:\n- 🔴 明确真阳性:4/10 = 40%\n * ad-biddings:124(create + 事务外事件)\n * alliance-campaign:46(super.create + 独立 createMany,模式 C)\n * geo-keywords:65(create + 事务外 publishLifecycleEvent)\n * supply-chain-platform:418(updateMany + create 分离,模式 C)\n- 🟠 归类错误(仍是假绿):1/10 = 10%\n * finance-credits:193 应归模式 B(txn([...]) 未被识别为事务)\n- ⚠️ 难判(偏真阳):3/10 = 30%\n * ai-autopilot:649(helper 函数,需追调用方)\n * assembly:404(紧跟 recalculateBomCost 语义未定)\n * groupbuy-influencers:153(createWithBizCodeRetry 包装)\n- ⚠️ 误报倾向:2/10 = 20%\n * ad-placement:405(方法内无事件发布)\n * approval:395(projection 同步非主写入)\n\n保守估计 297 处中:\n- ~50% (约 150 处) 明确真阳性假绿\n- ~30% (约 90 处) 需 helper 追踪确认\n- ~20% (约 60 处) 误报\n\n规则改进建议(V2.1):\n1. 方法作用域判定:仅当 write 所在方法体内也有 publishEvent 才命中\n → 解决 20% 误报\n2. 识别 txn/inTransaction/runInTransaction 别名为事务范围\n → 解决 10% 归类错\n3. helper 深度追踪(Sprint 3 / Q3 再升级)\n → 解决 30% 难判\n4. 可选:projection/refreshView/aggregate 方法白名单\n\n对 Sprint 2 迁移计划的影响:\n- 攻击清单从 297 收敛为 ~150 明确真阳 + ~90 需深挖\n- Sprint 2 W5 前置完成 V2.1 升级(改进 1+2),再用新 audit 重扫\n- Sprint 2 W5-W6 按 V2.1 精确列表迁移\n- Sprint 2 W6 末启用 --strict-v2 硬门禁\n\n本 PR 纯文档,无代码变更。依赖 #38 分支。合并顺序:#38 → 本 PR。\n\n关联:Q2 Sprint 2 迁移前置准备\n前序 PR:#38 V2 审计升级 / #40 BaseServiceV2 PoC\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T14:49:49+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/8a95110c2f089d5e800363910dee9bd22993258c...94bdd3e0c36e7ba8e9380ddb74627492acc988dc","Len":1}...
|
1776408604
|
Edit
Delete
|
|
2001
|
5
|
17
|
5
|
6
|
0
|
0
|
refs/heads/docs/tx-bound-write-samples
|
0
|
|
1778625303
|
Edit
Delete
|
|
1114
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/docs/sprint-1-retro
|
0
|
|
1776405595
|
Edit
Delete
|
|
1115
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/docs/sprint-1-retro
|
0
|
{"Commits":[{"Sha1":"56a7df27f {"Commits":[{"Sha1":"56a7df27f1e7a0b2b9f9136862a817427c4704be","Message":"docs(retro): Q2 Sprint 1 复盘 - 三类假绿发现与 Sprint 2 修订建议\n\n整合 Sprint 1 执行的 6 个 PR(#33-#38)产出,归档本 Sprint 的发现、\n对 Q2 12 周计划的影响、以及 Sprint 2 的修订建议。\n\nTL;DR:Sprint 1 原计划主题 \"BLOCKER 清零 + 底座加固\",实际完成 1 个\nBLOCKER + 挖出 3 类系统性假绿 + 完成 RFC + 自动化审计升级。最重大发现:\nHarness v5.3 宣称的 \"原子化率 100%\" 是建立在有漏洞的审计判据之上的\n虚假基线,V2 审计扫出 297 处 TX-BOUND-WRITE + 5 处 ARRAY-TXN-WITH-EVENT\n系统性假绿。\n\n文档内容:\n- 6 个 PR 的交付清单与净增(代码 +274 / 文档 +1145)\n- 三类假绿模式(A 架构级 / B 数组事务 / C 业务前置 side-effect)\n 及各自影响面统计\n- 其他发现:4 个预检查微竞态 / 8 个良性 override / 6 个 A-override\n- 原计划 vs 实际进度对比(实际只完成 Data Squad,其他 Squad 未启动)\n- 超出原计划范围的 7 项高价值交付\n- 对 Q2 12 周计划的修订建议:\n * 阶段 A 验收门新增 v2TxBoundWrite + v2ArrayTxnWithEvent = 0\n * Sprint 2 工作量重估(+30% 架构重构开销)\n * 推荐选项 B 并行分攻(Backend Architect 主攻架构 /\n SRE/Data 并行推进原计划 SRE 项)\n- 执行层面洞察:做对了什么 + 应该做得更好\n- Sprint 2 启动清单\n\n纯文档 PR,无代码变更。作为技术委员会评审 Sprint 2 走向的依据。\n\n关联:Q2 12 周落地计划 Sprint 1 收尾\n前序 PR: #33 (计划) / #34 (BLOCKER) / #35 (bom 测试) /\n #36 (D-class 盘点) / #37 (RFC) / #38 (审计升级)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T13:59:46+08:00"}],"HeadCommit":{"Sha1":"56a7df27f1e7a0b2b9f9136862a817427c4704be","Message":"docs(retro): Q2 Sprint 1 复盘 - 三类假绿发现与 Sprint 2 修订建议\n\n整合 Sprint 1 执行的 6 个 PR(#33-#38)产出,归档本 Sprint 的发现、\n对 Q2 12 周计划的影响、以及 Sprint 2 的修订建议。\n\nTL;DR:Sprint 1 原计划主题 \"BLOCKER 清零 + 底座加固\",实际完成 1 个\nBLOCKER + 挖出 3 类系统性假绿 + 完成 RFC + 自动化审计升级。最重大发现:\nHarness v5.3 宣称的 \"原子化率 100%\" 是建立在有漏洞的审计判据之上的\n虚假基线,V2 审计扫出 297 处 TX-BOUND-WRITE + 5 处 ARRAY-TXN-WITH-EVENT\n系统性假绿。\n\n文档内容:\n- 6 个 PR 的交付清单与净增(代码 +274 / 文档 +1145)\n- 三类假绿模式(A 架构级 / B 数组事务 / C 业务前置 side-effect)\n 及各自影响面统计\n- 其他发现:4 个预检查微竞态 / 8 个良性 override / 6 个 A-override\n- 原计划 vs 实际进度对比(实际只完成 Data Squad,其他 Squad 未启动)\n- 超出原计划范围的 7 项高价值交付\n- 对 Q2 12 周计划的修订建议:\n * 阶段 A 验收门新增 v2TxBoundWrite + v2ArrayTxnWithEvent = 0\n * Sprint 2 工作量重估(+30% 架构重构开销)\n * 推荐选项 B 并行分攻(Backend Architect 主攻架构 /\n SRE/Data 并行推进原计划 SRE 项)\n- 执行层面洞察:做对了什么 + 应该做得更好\n- Sprint 2 启动清单\n\n纯文档 PR,无代码变更。作为技术委员会评审 Sprint 2 走向的依据。\n\n关联:Q2 12 周落地计划 Sprint 1 收尾\n前序 PR: #33 (计划) / #34 (BLOCKER) / #35 (bom 测试) /\n #36 (D-class 盘点) / #37 (RFC) / #38 (审计升级)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T13:59:46+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/7b47df3186db279cfc071517a6c034aa213d926d...56a7df27f1e7a0b2b9f9136862a817427c4704be","Len":1}...
|
1776405595
|
Edit
Delete
|
|
2000
|
5
|
17
|
5
|
6
|
0
|
0
|
refs/heads/docs/sprint-1-retro
|
0
|
|
1778625303
|
Edit
Delete
|
|
1102
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/docs/q2-2026-landing-plan
|
0
|
|
1776389054
|
Edit
Delete
|
|
1103
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/docs/q2-2026-landing-plan
|
0
|
{"Commits":[{"Sha1":"faf34a7bb {"Commits":[{"Sha1":"faf34a7bb942869bf4cc111c51215701378d2397","Message":"docs(playbook): 归档 Q2 12 周生产落地计划(三轴并行)\n\n- 三阶段路线图(4+4+4 周)覆盖治理债清零、SRE 加固、灰度 GA\n- 6 个 Squad 编制与 RACI,覆盖 SRE/Data/Backend/Frontend/AI/BI\n- 成功标准含 3 组 OKR 共 13 个 KR,均可度量\n- 验收包含 harness 审计命令、SLO 查询、灾难演练场景\n- 关键文件清单明确必须修改/新增/复用的路径\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T09:23:33+08:00"}],"HeadCommit":{"Sha1":"faf34a7bb942869bf4cc111c51215701378d2397","Message":"docs(playbook): 归档 Q2 12 周生产落地计划(三轴并行)\n\n- 三阶段路线图(4+4+4 周)覆盖治理债清零、SRE 加固、灰度 GA\n- 6 个 Squad 编制与 RACI,覆盖 SRE/Data/Backend/Frontend/AI/BI\n- 成功标准含 3 组 OKR 共 13 个 KR,均可度量\n- 验收包含 harness 审计命令、SLO 查询、灾难演练场景\n- 关键文件清单明确必须修改/新增/复用的路径\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T09:23:33+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/7b47df3186db279cfc071517a6c034aa213d926d...faf34a7bb942869bf4cc111c51215701378d2397","Len":1}...
|
1776389054
|
Edit
Delete
|
|
1999
|
5
|
17
|
5
|
6
|
0
|
0
|
refs/heads/docs/q2-2026-landing-plan
|
0
|
|
1778625303
|
Edit
Delete
|
|
20269
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/docs/ci-green-on-main
|
0
|
|
1785506104
|
Edit
Delete
|
|
20270
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/docs/ci-green-on-main
|
0
|
{"Commits":[{"Sha1":"ec4bf7fde {"Commits":[{"Sha1":"ec4bf7fdec43629ca034c3b16fa6fd8b3b456286","Message":"test(negative): 受控失败——删除一个测试文件以验证远端门禁真会阻断\n\nG14 关闭条件的最后一项:证明违规确实被 CI + 分支保护阻断,而不是\n「门禁存在但从没拦住过任何东西」(假绿五形态第 5 形态:假生效门禁)。\n\n刻意注入的违规:删除 apps/api-fastify/test/outbox.deadletter.test.ts。\n预期 ownTests 从 11 掉到 10,低于 reports/baseline.json 的地板 11,\nstatic job 的 check:governance 棘轮应判红;runtime job 因 needs 依赖不会启动。\n\n预期结果:PR 无法合并(required checks: Static governance +\nRuntime and UI acceptance,enforce_admins=true)。\n验证完毕后本 PR 直接关闭,绝不合并。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-31T06:49:50-07:00"}],"HeadCommit":{"Sha1":"ec4bf7fdec43629ca034c3b16fa6fd8b3b456286","Message":"test(negative): 受控失败——删除一个测试文件以验证远端门禁真会阻断\n\nG14 关闭条件的最后一项:证明违规确实被 CI + 分支保护阻断,而不是\n「门禁存在但从没拦住过任何东西」(假绿五形态第 5 形态:假生效门禁)。\n\n刻意注入的违规:删除 apps/api-fastify/test/outbox.deadletter.test.ts。\n预期 ownTests 从 11 掉到 10,低于 reports/baseline.json 的地板 11,\nstatic job 的 check:governance 棘轮应判红;runtime job 因 needs 依赖不会启动。\n\n预期结果:PR 无法合并(required checks: Static governance +\nRuntime and UI acceptance,enforce_admins=true)。\n验证完毕后本 PR 直接关闭,绝不合并。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-31T06:49:50-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/9618d78da3e668f14e3c1611d7090f45eef0c085...ec4bf7fdec43629ca034c3b16fa6fd8b3b456286","Len":1}...
|
1785506104
|
Edit
Delete
|
|
20271
|
5
|
17
|
5
|
72
|
0
|
0
|
refs/heads/docs/ci-green-on-main
|
0
|
|
1785507095
|
Edit
Delete
|
|
1110
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/docs/base-service-atomicity-rfc
|
0
|
|
1776396760
|
Edit
Delete
|
|
1111
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/docs/base-service-atomicity-rfc
|
0
|
{"Commits":[{"Sha1":"7e9fa6922 {"Commits":[{"Sha1":"7e9fa692276960419fa95d57ebe7395c49960b4c","Message":"docs(rfcs): RFC-0001 BaseService 真正原子化 + D-class 深挖续集\n\n本 PR 是 #36(D-class 首轮盘点)的续集,包含:\n\n1. docs/governance/outbox-d-class-deep-dive-2026-04-17.md\n - 逐个人工判读 11 个\"待查 override\" D-class 文件:\n * 8 个良性(仅 input 预处理 + super.xxx)\n * 4 个预检查微竞态(findFirst 在事务外):expense-category, hr-competency,\n commission-rule, channels\n - 深查 finance-credits 的 4 处 this.model:\n * 🔴 确认为真实假绿(模式 B:数组事务 + 事务外 publishLifecycleEvent)\n * 4 处 publishLifecycleEvent 全在 txn([...]) 外,事件与数据写集彻底分裂\n - 归纳三类系统性假绿:\n * 模式 A:BaseService 架构级(crud.createOne 的 model.create 绕过 tx)\n * 模式 B:数组事务 + 事务外事件\n * 模式 C:业务前置 side-effect 非同事务\n - D-class 43 最终分类:22 真 D / 6 A-override / 8 良性 override / 4 微竞态\n / 2 真假绿(contract-templates + finance-credits)\n\n2. docs/rfcs/0001-base-service-atomicity.md\n - 针对三类假绿模式提出 3 个重构候选方案对比:\n * 方案 A:crud.* 新增 modelOnTx 参数(最小侵入,但类型不安全)\n * 方案 B:BaseService 泛型约束 modelKey,编译期类型锁定(推荐)\n * 方案 C:引入 UnitOfWork 抽象(大侵入,延后到 Q3)\n - 推荐采用方案 B,Sprint 2 Week 5-6 分阶段实施:\n * W5 基础设施:BaseService 泛型 + 22 真 D 文件迁移 + contract-templates /\n finance-credits 手动修复\n * W6 迁移 override:6 A-override + 8 良性 override + 4 微竞态\n * W6 审计升级:audit-outbox-atomicity.ts 新增 TX-BOUND-WRITE /\n ARRAY-TXN-WITH-EVENT / PRE-SIDE-EFFECT 三个判据\n - 含详细迁移风险矩阵与验收标准\n\n纯文档 PR,无代码变更。audit:outbox-atomicity 保持 A=1633/D=43/原子化率 100%\n(未退化)。\n\n关联:Q2 12 周落地计划 Sprint 1 · Data/Governance Squad + Backend Architect\n前序 PR #36(D-class 首轮盘点)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T11:32:29+08:00"}],"HeadCommit":{"Sha1":"7e9fa692276960419fa95d57ebe7395c49960b4c","Message":"docs(rfcs): RFC-0001 BaseService 真正原子化 + D-class 深挖续集\n\n本 PR 是 #36(D-class 首轮盘点)的续集,包含:\n\n1. docs/governance/outbox-d-class-deep-dive-2026-04-17.md\n - 逐个人工判读 11 个\"待查 override\" D-class 文件:\n * 8 个良性(仅 input 预处理 + super.xxx)\n * 4 个预检查微竞态(findFirst 在事务外):expense-category, hr-competency,\n commission-rule, channels\n - 深查 finance-credits 的 4 处 this.model:\n * 🔴 确认为真实假绿(模式 B:数组事务 + 事务外 publishLifecycleEvent)\n * 4 处 publishLifecycleEvent 全在 txn([...]) 外,事件与数据写集彻底分裂\n - 归纳三类系统性假绿:\n * 模式 A:BaseService 架构级(crud.createOne 的 model.create 绕过 tx)\n * 模式 B:数组事务 + 事务外事件\n * 模式 C:业务前置 side-effect 非同事务\n - D-class 43 最终分类:22 真 D / 6 A-override / 8 良性 override / 4 微竞态\n / 2 真假绿(contract-templates + finance-credits)\n\n2. docs/rfcs/0001-base-service-atomicity.md\n - 针对三类假绿模式提出 3 个重构候选方案对比:\n * 方案 A:crud.* 新增 modelOnTx 参数(最小侵入,但类型不安全)\n * 方案 B:BaseService 泛型约束 modelKey,编译期类型锁定(推荐)\n * 方案 C:引入 UnitOfWork 抽象(大侵入,延后到 Q3)\n - 推荐采用方案 B,Sprint 2 Week 5-6 分阶段实施:\n * W5 基础设施:BaseService 泛型 + 22 真 D 文件迁移 + contract-templates /\n finance-credits 手动修复\n * W6 迁移 override:6 A-override + 8 良性 override + 4 微竞态\n * W6 审计升级:audit-outbox-atomicity.ts 新增 TX-BOUND-WRITE /\n ARRAY-TXN-WITH-EVENT / PRE-SIDE-EFFECT 三个判据\n - 含详细迁移风险矩阵与验收标准\n\n纯文档 PR,无代码变更。audit:outbox-atomicity 保持 A=1633/D=43/原子化率 100%\n(未退化)。\n\n关联:Q2 12 周落地计划 Sprint 1 · Data/Governance Squad + Backend Architect\n前序 PR #36(D-class 首轮盘点)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T11:32:29+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/7b47df3186db279cfc071517a6c034aa213d926d...7e9fa692276960419fa95d57ebe7395c49960b4c","Len":1}...
|
1776396760
|
Edit
Delete
|
|
1998
|
5
|
17
|
5
|
6
|
0
|
0
|
refs/heads/docs/base-service-atomicity-rfc
|
0
|
|
1778625303
|
Edit
Delete
|
|
20275
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/do-not-merge/gate-negative-proof
|
0
|
|
1785507509
|
Edit
Delete
|
|
20276
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/do-not-merge/gate-negative-proof
|
0
|
{"Commits":[],"HeadCommit":{"S {"Commits":[],"HeadCommit":{"Sha1":"ec4bf7fdec43629ca034c3b16fa6fd8b3b456286","Message":"test(negative): 受控失败——删除一个测试文件以验证远端门禁真会阻断\n\nG14 关闭条件的最后一项:证明违规确实被 CI + 分支保护阻断,而不是\n「门禁存在但从没拦住过任何东西」(假绿五形态第 5 形态:假生效门禁)。\n\n刻意注入的违规:删除 apps/api-fastify/test/outbox.deadletter.test.ts。\n预期 ownTests 从 11 掉到 10,低于 reports/baseline.json 的地板 11,\nstatic job 的 check:governance 棘轮应判红;runtime job 因 needs 依赖不会启动。\n\n预期结果:PR 无法合并(required checks: Static governance +\nRuntime and UI acceptance,enforce_admins=true)。\n验证完毕后本 PR 直接关闭,绝不合并。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-31T06:49:50-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/main...ec4bf7fdec43629ca034c3b16fa6fd8b3b456286","Len":0}...
|
1785507509
|
Edit
Delete
|
|
22077
|
18
|
5
|
18
|
69
|
0
|
0
|
refs/heads/dianbo-20260915
|
0
|
|
1786517151
|
Edit
Delete
|
|
22078
|
17
|
5
|
18
|
69
|
0
|
0
|
refs/heads/dianbo-20260915
|
0
|
|
1786517151
|
Edit
Delete
|