|
26204
|
7
|
5
|
7
|
72
|
0
|
0
|
refs/heads/hljTest
|
0
|
{"Commits":[{"Sha1":"fc0729c51 {"Commits":[{"Sha1":"fc0729c51eaa6fb61e5c2c39bdc6d4bd30696570","Message":"fix(vm): make smoke honor the web base path\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"hlj@g-hi.com","AuthorName":"huangliujian","CommitterEmail":"hlj@g-hi.com","CommitterName":"huangliujian","Timestamp":"2026-08-26T13:51:23+08:00"}],"HeadCommit":{"Sha1":"fc0729c51eaa6fb61e5c2c39bdc6d4bd30696570","Message":"fix(vm): make smoke honor the web base path\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"hlj@g-hi.com","AuthorName":"huangliujian","CommitterEmail":"hlj@g-hi.com","CommitterName":"huangliujian","Timestamp":"2026-08-26T13:51:23+08:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/08df317afac31db70f0394580a0bb8686f49671c...fc0729c51eaa6fb61e5c2c39bdc6d4bd30696570","Len":1}...
|
1787723483
|
Edit
Delete
|
|
26123
|
7
|
5
|
7
|
72
|
0
|
0
|
refs/heads/hljTest
|
0
|
{"Commits":[{"Sha1":"08df317af {"Commits":[{"Sha1":"08df317afac31db70f0394580a0bb8686f49671c","Message":"Merge remote-tracking branch 'origin/codex/catalog-customer-quotation-workflows' into hljTest\n\n# Conflicts:\n#\tdeploy/vm/Dockerfile\n#\tscripts/lib/component-size.mjs\n","AuthorEmail":"hlj@g-hi.com","AuthorName":"huangliujian","CommitterEmail":"hlj@g-hi.com","CommitterName":"huangliujian","Timestamp":"2026-08-26T13:12:50+08:00"},{"Sha1":"8f11b6bc4df9f709414e306e9c9225bd45bccb65","Message":"feat: complete catalog customer and quotation workflows\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-24T01:18:51-07:00"},{"Sha1":"2de7545076ac90e4aa88e89cdf310f72ca9692ce","Message":"fix(vm): Prisma 生成物拷到运行时真正解析的位置——旧断言查的是拷贝目标而非读取路径\n\n`pnpm vm:up` 首次真跑起整栈,api-nestjs 容器启动即崩溃重启循环:\n`@prisma/client did not initialize yet. Please run \"prisma generate\"`。\n而构建期那条\"Prisma Client 必须在部署树里\"的断言是**绿的**。\n\n根因:`pnpm deploy` 把 @prisma/client 放进\n`node_modules/.pnpm/@prisma+client@\u003chash\u003e/node_modules/`,而 @prisma/client 是相对\n**自身**去找同级 `.prisma` 的——部署树顶层那份它根本不看。上一版把生成物拷到了顶层\n扁平路径,于是:\n- 运行时解析到 .pnpm 内嵌的那份,那是 @prisma/client **自带的桩**\n (`default.js` 第 43 行专门抛 \"did not initialize yet\"),没有 query engine;\n- 而断言 `test -d /runtime/\u003capp\u003e/node_modules/.prisma/client` 查的正是我刚拷过去的\n 顶层目录,\"往哪拷就查哪\",必然通过。\n\n这是「断言检查的位置 ≠ 运行时读取的位置」,与 C23(typecheck 读 src、运行时读 dist)\n同型:不是断言写得弱,而是它锚在一条运行时不走的路径上。\n\n两处一起修:\n1. 拷贝目标改为 .pnpm 内嵌位置(顶层那份保留,覆盖 hoist 布局),glob 取不到即 fail。\n2. 断言改为**按运行时同一方式推导路径**(从 require.resolve('@prisma/client/package.json')\n 反推同级 .prisma),并断言 **query engine 二进制存在**——只 `test -d` 等于没查,\n 因为那个桩目录永远存在。\n\n负向测试(实跑):去掉 .pnpm 拷贝那行后构建 EXIT=1,报\n`ERROR: no generated query engine at /runtime/api-nestjs/node_modules/.pnpm/@prisma+client@.../.prisma/client`\n——新断言会在构建期拦下这个 bug,而不是等容器启动才炸。\n\n证据(作用域=本地工作区):\n- pnpm vm:up 全流程通过:6 个服务全 healthy、migrate Exited(0)\n- 迁移真实应用到部署库(含 20260805120000_product_image_thumbnail /\n 20260807120000_quotation_void_and_restore)\n- 冒烟:Gateway + web + NestJS health passed;\n Write-chain smoke passed(create + read-back under a throwaway tenant)\n- 独立复核(不依赖脚本自述):curl 网关 /api/health -\u003e ok(db=up,redis=up)、首页 200、\n 容器内 `new PrismaClient()` 实例化成功\n- pnpm check 22 项全绿 exit=0\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-17T17:36:43-07:00"}],"HeadCommit":{"Sha1":"08df317afac31db70f0394580a0bb8686f49671c","Message":"Merge remote-tracking branch 'origin/codex/catalog-customer-quotation-workflows' into hljTest\n\n# Conflicts:\n#\tdeploy/vm/Dockerfile\n#\tscripts/lib/component-size.mjs\n","AuthorEmail":"hlj@g-hi.com","AuthorName":"huangliujian","CommitterEmail":"hlj@g-hi.com","CommitterName":"huangliujian","Timestamp":"2026-08-26T13:12:50+08:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/04432cff2b306ecd33ca2bea6e2e256814f978f0...08df317afac31db70f0394580a0bb8686f49671c","Len":3}...
|
1787721223
|
Edit
Delete
|
|
24580
|
7
|
5
|
7
|
72
|
0
|
0
|
refs/heads/hljTest
|
0
|
{"Commits":[{"Sha1":"04432cff2 {"Commits":[{"Sha1":"04432cff2b306ecd33ca2bea6e2e256814f978f0","Message":"fix(web): preserve /jh authentication and realtime paths\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"hlj@g-hi.com","AuthorName":"huangliujian","CommitterEmail":"hlj@g-hi.com","CommitterName":"huangliujian","Timestamp":"2026-08-20T16:25:36+08:00"}],"HeadCommit":{"Sha1":"04432cff2b306ecd33ca2bea6e2e256814f978f0","Message":"fix(web): preserve /jh authentication and realtime paths\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"hlj@g-hi.com","AuthorName":"huangliujian","CommitterEmail":"hlj@g-hi.com","CommitterName":"huangliujian","Timestamp":"2026-08-20T16:25:36+08:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/083385f1c38217147aacf74d0f2251a65fbce450...04432cff2b306ecd33ca2bea6e2e256814f978f0","Len":1}...
|
1787214380
|
Edit
Delete
|
|
24190
|
7
|
5
|
7
|
72
|
0
|
0
|
refs/heads/hljTest
|
0
|
{"Commits":[{"Sha1":"083385f1c {"Commits":[{"Sha1":"083385f1c38217147aacf74d0f2251a65fbce450","Message":"feat(integrations): 接入报价优惠券核销\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"hlj@g-hi.com","AuthorName":"huangliujian","CommitterEmail":"hlj@g-hi.com","CommitterName":"huangliujian","Timestamp":"2026-08-19T13:12:36+08:00"},{"Sha1":"be60de1f7e3c6183500ea7d65fc2bf039a86f1d0","Message":"Merge remote-tracking branch 'origin/main' into hljTest\n\n# Conflicts:\n#\tCLAUDE.md\n#\tapps/api-fastify/prisma/schema.prisma\n#\tapps/api-fastify/src/routes/quotations.ts\n#\tapps/api-nestjs/prisma/schema.prisma\n#\tapps/api-nestjs/src/quotations/quotations.service.ts\n#\tapps/web/src/features/quotations/api/quotations-api.ts\n#\tapps/web/src/features/quotations/components/PublicQuotationView.tsx\n#\tapps/web/src/hooks/useRealtime.ts\n#\tdeploy/vm/Dockerfile\n#\tdeploy/vm/compose.yaml\n#\tdocs/governance-experience.md\n#\tpackages/contracts/src/index.ts\n#\tpackages/contracts/src/quotation.ts\n#\tpackages/contracts/src/realtime.ts\n#\tscripts/vm-deploy.sh\n","AuthorEmail":"hlj@g-hi.com","AuthorName":"huangliujian","CommitterEmail":"hlj@g-hi.com","CommitterName":"huangliujian","Timestamp":"2026-08-19T09:54:43+08:00"},{"Sha1":"125c54d328d3da221b5d91c0a2dd0475712c6e96","Message":"Merge pull request #12 from laoluojuhai/fix/vm-dockerfile-build-path\n\nfix(vm): 打通容器构建路径——保住 slim 运行镜像,不靠放宽红线换构建成功","AuthorEmail":"158980461+laoluojuhai@users.noreply.github.com","AuthorName":"laoluojuhai","CommitterEmail":"noreply@github.com","CommitterName":"GitHub","Timestamp":"2026-08-17T07:09:44-07:00"},{"Sha1":"6f13a78de9c02ae6a36fcebfb4bde63fbd092158","Message":"fix(vm): 打通容器构建路径——保住 slim 运行镜像,不靠放宽红线换构建成功\n\n`deploy/vm/Dockerfile` 的构建路径从未真正跑通过(并发治理会话只用 pnpm/turbo 跑门禁,\n从不 docker build)。而 check:vm-deploy 一直是绿的——它查 Dockerfile 的**结构**\n(每个 stage 用哪个 FROM、有没有 fat runtime),不查它**能不能构建出来**。\n于是棘轮报告写着「镜像瘦身非 root、可回滚、备份可恢复」✅,而那个镜像根本产不出来。\n\n5 处构建 bug:\n1. contracts 的 `prepare`(tsc) 在只有 manifest 的依赖层里跑,找不到 tsconfig/src → TS5058。\n 先 COPY contracts 的 tsconfig + src 给它当输入。\n2. 新 workspace 包 @repo/password-auth(两后端 runtime 依赖)未进 manifest COPY、\n 也没被显式 build。\n3. `pnpm deploy --prod --legacy`:pnpm 9.15.9 不认 `--legacy`(Unknown option)。\n 旧注释称「未开启 inject-workspace-packages 时需要 --legacy」——实测在本仓版本上\n 不成立,去掉即可正常打平 workspace 包(sharp 这类 lockfile 原生依赖也照常带出)。\n4. `pnpm deploy` 只按 lockfile 物化依赖,而 .prisma/client(含平台相关 query engine)\n 是 `prisma generate` **生成**的、不在任何 lockfile 里,永远不会被带出去 →\n 新增一步从 build 树复制。路径由 @prisma/client 的解析结果反推,不硬编码 pnpm store\n 的哈希目录名;且必须从 app 目录解析(workspace 根 node_modules 里没有它)。\n5. web stage `COPY apps/web/public` 失败——git 未跟踪任何 public 资产。\n ⚠️ 本机可能有个空的 public/(git 不跟踪空目录),docker build 读本地上下文因而能过,\n CI 与全新 clone 上必挂,注释已写明这个陷阱。\n\n**刻意不采用**此前 `dockerfile-vm-deploy-fixes-ec411c0.patch` 的策略(放弃 slim、\n运行镜像改 FROM build):那会撞 4 条门禁红线(runtime-from-base-* / no-fat-runtime-*),\n而实测 slim 路径的两个阻塞点(3、4)都可解,「镜像瘦身作为后续项不阻塞」的前提不成立。\n体积实测:api-nestjs 741MB / api-fastify 695MB / web 546MB,\n对照 fat 方案 8.46GB、2026-08-06 实际部署的 2.69GB。非 root 由镜像层 USER node 保证,\n而非仅靠 compose 的 user: 覆盖。\n\n顺带两处断链(均为 MinIO 进 compose 后没人跟上):\n- .env.example 与 vm:init 都不认识 S3_*,而它们是 compose 的必填变量 → 新机器\n `vm:init` 后 `vm:up` 必然卡在变量插值。已补占位符 + 随机生成 + 存量 .env 自愈。\n- .dockerignore 只写 `**/.next`,匹配不到本仓工具链自建的 distDir\n (.next-ui-* / .next-dev-* / .next-manual-*),也没排除 sites/(G26 那套独立\n Cloudflare 系统,其 .sites-runtime 本机 1.0GB)→ COPY . . 层 3.79GB → 270MB。\n\n证据(作用域=本地工作区):\n- docker build 四个 target 全部 EXIT=0(api-nestjs / api-fastify / web / migrate)\n- 镜像内实测 @prisma/client 与原生模块 sharp 均可加载、dist 入口就位、uid=1000 非 root\n- Dockerfile 里那条「Prisma Client 缺失即构建失败」的断言**首次真正执行并通过**\n- pnpm vm:config EXIT=0(7 个服务解析通过)\n- pnpm check 22 项全绿 exit=0\n\n未验证:未跑 vm:up / vm:smoke(整栈起停与真实写链冒烟),故不得宣称「可部署」。\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-17T06:57:55-07:00"},{"Sha1":"8ae98649e077fa188f8e9c1b0a11b78a2377c836","Message":"Merge pull request #11 from laoluojuhai/feat/product-catalog-search-and-image-upload\n\nfeat(products): 商品库服务端搜索筛选 + 图片上传至对象存储","AuthorEmail":"158980461+laoluojuhai@users.noreply.github.com","AuthorName":"laoluojuhai","CommitterEmail":"noreply@github.com","CommitterName":"GitHub","Timestamp":"2026-08-17T04:16:44-07:00"}],"HeadCommit":{"Sha1":"083385f1c38217147aacf74d0f2251a65fbce450","Message":"feat(integrations): 接入报价优惠券核销\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"hlj@g-hi.com","AuthorName":"huangliujian","CommitterEmail":"hlj@g-hi.com","CommitterName":"huangliujian","Timestamp":"2026-08-19T13:12:36+08:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/d2c99c9fc71e8a1c48d1aa3684c30ead3eb110c0...083385f1c38217147aacf74d0f2251a65fbce450","Len":51}...
|
1787116369
|
Edit
Delete
|
|
20364
|
7
|
5
|
7
|
72
|
0
|
0
|
refs/heads/hljTest
|
0
|
{"Commits":[{"Sha1":"d2c99c9fc {"Commits":[{"Sha1":"d2c99c9fc71e8a1c48d1aa3684c30ead3eb110c0","Message":"chore(dockerfile): drop leftover debug prints from prisma cp step\n\n前次 commit 进了 set -x + 多处 ls -la 调试输出。功能等价,纯粹清理。\ncp 失败时 echo message 从 \"cp ok for X\" 改成 \"cp prisma client for X: ok/FAIL\"\n以匹配同文件其他步骤的可读风格。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hlj@g-hi.com","AuthorName":"huangliujian","CommitterEmail":"hlj@g-hi.com","CommitterName":"huangliujian","Timestamp":"2026-08-03T15:03:44+08:00"},{"Sha1":"f97d67dbc0d53eeb203d205164c493a7b30a1116","Message":"chore: ship deployment integration + VM env layering\n\n合并远端 main 36 个新提交,并把本机部署整合的 basePath + BASE 双链路方案\n一起入仓;VM 镜像里 apt 镜像源抽成 APT_MIRROR build-arg,业务层/环境层解耦。\n\n业务/部署整合(来自 basePath 整合方案,对应 CLAUDE.md 真源地图「整合到\ngeneration.g-hi.com 的地址口径」):\n\n- apps/web/next.config.ts: basePath '/jh'(与 songGeneration/voicePrintRecognition\n 同款),同时取并集远端的 output: 'standalone' + outputFileTracingRoot\n- apps/web/src/hooks/useRealtime.ts: SSE_BASE = BASE;defaultWebSocketUrl 区分\n 绝对 URL / 相对前缀两种情况\n- apps/web/src/lib/api.ts: BASE = NEXT_PUBLIC_API_URL || NEXT_PUBLIC_BASE_PATH ||\n ''(必须 || 不是 ??,build 时 env 是字符串 '' 非 null,?? 不会把空串当\n fallback),USER_ROLE 改 runtime(data-user-role)来自 layout.tsx\n- deploy/vm/nginx.conf: gateway 加 = /jh/ws { proxy_pass http://api-nestjs:3001/ws; }\n (显式 URI 剥 /jh 前缀,转发到 NestJS WsAdapter 实际注册路径 /ws);/api/ /sse/\n 保留以便本机直连 8180(无前缀)调试\n- deploy/vm/compose.yaml: 与远端取并集(migrate 拆 target / non root / 资源\n 上限 / 日志轮转)\n- scripts/vm-deploy.sh: 显式注入 NEXT_PUBLIC_BASE_PATH 给 web 构建;与远端的\n IMAGE_TAG 时间戳机制取并集\n\n环境分层(Mac / 海外 CI / 国内 GFW 互不影响):\n\n- deploy/vm/Dockerfile: 硬编码的 aliyun 源 sed 抽成 ARG APT_MIRROR=;\n vm-deploy.sh 自动从 .env 注入所有 build target;空 = 走 deb.debian.org 官方源\n- deploy/vm/.env.example: 文档化 APT_MIRROR 留空行为\n- 理由:之前硬编码 mirrors.aliyun.com 在 Mac/海外 CI 上 build 会做无用 sed\n 且让外人看不出这是环境特化;现在抽成 build-arg 任何环境只需一行配置\n\n部署 bug 修(不分环境,本机 pnpm 9.15 行为差异):\n\n- deploy/vm/Dockerfile: 删 @repo/contracts 的 prepare 钩子(pnpm 9.15 跨\n workspace install 找不到子目录的 tsconfig.json)\n- deploy/vm/Dockerfile: 删 pnpm deploy --legacy(pnpm 9.7+ 已删除该 flag)\n- deploy/vm/Dockerfile: deploy 之后 cp -a --remove-destination 强制覆盖 .prisma/\n client;deploy 阶段的 @prisma/client postinstall 会把真实 client 还原成\n 2KB 占位,缺 17MB libquery_engine 二进制,runtime 抛 \"did not initialize\"\n- deploy/vm/Dockerfile: web 镜像 public 目录用 RUN mkdir -p 兜底(apps/web 当前\n 无 public 资产,但 next standalone 仍可能因目录存在与否决定路由)\n- deploy/vm/Dockerfile: runtime-base 阶段加 APT_MIRROR 注入(同 build 阶段)\n- packages/contracts/package.json: 删 prepare 字段(Dockerfile 显式\n pnpm --filter @repo/contracts build 触发)\n\nCLAUDE.md 同步(远端 36 提交 + 治理增量 +222 行)。\n\n验证:\n- pnpm check exit 0(5/5 packages,绿;ownTests=19, ownTestCases=227)\n- 部署到本机 tag 20260803T055150Z 后 /api/health 200,DB+Redis 探活正常\n- 5 个 juhai-quotation 容器 healthy(postgres/redis/api-nestjs/web/gateway)\n\n未覆盖:22 个 reports/*.latest.json(机器产物,commit 后下次 check 即变 dirty)\n与 packages/contracts/node-compile-cache/(node 22 编译缓存)未入 commit。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hlj@g-hi.com","AuthorName":"huangliujian","CommitterEmail":"hlj@g-hi.com","CommitterName":"huangliujian","Timestamp":"2026-08-03T14:34:32+08:00"}],"HeadCommit":{"Sha1":"d2c99c9fc71e8a1c48d1aa3684c30ead3eb110c0","Message":"chore(dockerfile): drop leftover debug prints from prisma cp step\n\n前次 commit 进了 set -x + 多处 ls -la 调试输出。功能等价,纯粹清理。\ncp 失败时 echo message 从 \"cp ok for X\" 改成 \"cp prisma client for X: ok/FAIL\"\n以匹配同文件其他步骤的可读风格。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hlj@g-hi.com","AuthorName":"huangliujian","CommitterEmail":"hlj@g-hi.com","CommitterName":"huangliujian","Timestamp":"2026-08-03T15:03:44+08:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/7619cf79681794bf28a8dceeb606c9dcfec21a5c...d2c99c9fc71e8a1c48d1aa3684c30ead3eb110c0","Len":2}...
|
1785740632
|
Edit
Delete
|
|
20362
|
7
|
5
|
7
|
72
|
0
|
0
|
refs/heads/hljTest
|
0
|
|
1785740632
|
Edit
Delete
|
|
45806
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"d56955802 {"Commits":[{"Sha1":"d569558020dccc2deea5a21dc56dc37727286e24","Message":"test(da05): rewound-ancestor HEAD with identifier-only diff fails closed\n\nIndependent review found that loosening the merge-base condition to\n'mergeBase is B or HEAD' left all tests green. 18c checks out an ancestor\nof B whose two-dot diff is the one ordinary identifier M and expects full;\n18b now binds its graph to the delta head like the CLI does.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-11-03T04:27:10-08:00"},{"Sha1":"759413e3bf3d96aaf51f71efb701053280ed8a79","Message":"docs(da05): record the merge-base sibling negative\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-11-03T04:15:38-08:00"},{"Sha1":"60fe91d5e5b29694a1ff016b6d195150c31468ad","Message":"test(da05): sibling candidate with identifier-only diff fails closed on merge base\n\nTest 18 diverges on two paths, so its two-dot diff is already full without\nthe merge-base condition. 18b builds a sibling of B whose diff from B is\nexactly one ordinary identifier.test.ts M; removing\ndelta.mergeBase === delta.baseline turns only this test red.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-11-03T04:15:17-08:00"}],"HeadCommit":{"Sha1":"d569558020dccc2deea5a21dc56dc37727286e24","Message":"test(da05): rewound-ancestor HEAD with identifier-only diff fails closed\n\nIndependent review found that loosening the merge-base condition to\n'mergeBase is B or HEAD' left all tests green. 18c checks out an ancestor\nof B whose two-dot diff is the one ordinary identifier M and expects full;\n18b now binds its graph to the delta head like the CLI does.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-11-03T04:27:10-08:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/bfbc96902aa455160bff6085b7b60f936dfbe67b...d569558020dccc2deea5a21dc56dc37727286e24","Len":3}...
|
1793709169
|
Edit
Delete
|
|
45714
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"bfbc96902 {"Commits":[{"Sha1":"bfbc96902aa455160bff6085b7b60f936dfbe67b","Message":"docs(evidence): rebind DA05 post-D3 evidence to directory-pinned baseline 65d376a\n\nRe-ran P0-P3 against fixed baseline 65d376a (P0/P1 shadow-subset, selected\nsubset 453/453 and 1 failed/452; P2 fallback-full with graph accepted; P3 edge\nrewire GRAPH_EDGE_INVENTORY) and added P4: on a drift baseline swapping the\ncontracts and password-auth manifests, an identifier.test.ts M is rejected\nwith GRAPH_PACKAGES on a real Turbo graph. No full pnpm test comparison run.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-11-03T00:32:43-08:00"},{"Sha1":"65d376ab3b697ab6b5407fe277511ab948de2788","Message":"fix(da05): pin package directories so moved or swapped packages fail closed\n\nSecond independent review found package directories were only compared with the\nmanifests, never pinned (pre-existing since 02d2402): swapping the contracts and\npassword-auth directories, or moving contracts and leaving a stray\npackages/contracts/src/identifier.test.ts, kept names and edges, was accepted by\nreal Turbo, and the identifier rule then suggested @repo/contracts#test for a\nfile owned by another package or none. Pin the name-to-directory map measured on\n80c8e5a and add both drift negatives; sync CLAUDE.md / governance-experience.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-11-03T00:31:38-08:00"},{"Sha1":"44dbce11aa81f6d2a1804014b8e511295334e9fa","Message":"docs(evidence): rebind DA05 post-D3 evidence to exact-edge baseline dd42d82\n\nRe-ran all candidates against fixed baseline dd42d82: P0 benign and P1\nassertion-defect identifier.test.ts M suggest shadow-subset @repo/contracts#test\n(selected subset 453/453; 1 failed/452 passed); P2 amount+1 stays fallback-full\nwith the graph accepted; new P3 count-preserving edge rewire is rejected with\nGRAPH_EDGE_INVENTORY on a real Turbo graph. No full pnpm test comparison run.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-11-03T00:06:46-08:00"},{"Sha1":"dd42d826020e0a3c0860cf746ff29e7dadbb2a1c","Message":"fix(da05): pin exact post-D3 task edge list so count-preserving rewires fail closed\n\nIndependent review of 30386b1 found edges were still pinned by count only: moving\nweb's @repo/config dependency to api-nestjs, or contracts' public-file dependency\nto config (which changes the narrow closure), kept 14/13/10 and was accepted.\nPin the exact 13 dependent\u003edependency task edges measured on 80c8e5a plus task\nrows, and add two rewire negatives. Docs: state the exact-edge pin, scope the old\nGRAPH_PACKAGES fallback to D3 (56519ef) through 80c8e5a, and mark the 43b264f\ncomparison as historical.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-11-03T00:03:55-08:00"},{"Sha1":"c8a79121d017597682c6d69fc7e8c5a5fcefdb2e","Message":"docs(evidence): record DA05 shadow-subset on post-D3 pinned baseline 30386b1\n\nFixed baseline 30386b1 (selector re-pinned to the post-D3 graph). Clean\ncandidates: P0 benign identifier.test.ts M and P1 identifier assertion defect\nboth suggest shadow-subset @repo/contracts#test (selected subset run: 453/453\ngreen; 1 failed/452 passed); P2 amount+1 in quotation.ts stays fallback-full\nwith the graph accepted. No full pnpm test comparison was run this round;\nselection stays shadow-only and L1 is not enabled.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-11-02T23:46:02-08:00"}],"HeadCommit":{"Sha1":"bfbc96902aa455160bff6085b7b60f936dfbe67b","Message":"docs(evidence): rebind DA05 post-D3 evidence to directory-pinned baseline 65d376a\n\nRe-ran P0-P3 against fixed baseline 65d376a (P0/P1 shadow-subset, selected\nsubset 453/453 and 1 failed/452; P2 fallback-full with graph accepted; P3 edge\nrewire GRAPH_EDGE_INVENTORY) and added P4: on a drift baseline swapping the\ncontracts and password-auth manifests, an identifier.test.ts M is rejected\nwith GRAPH_PACKAGES on a real Turbo graph. No full pnpm test comparison run.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-11-03T00:32:43-08:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/80c8e5a0dd4e458a4a5cbc9d6625ff61f4e4450e...bfbc96902aa455160bff6085b7b60f936dfbe67b","Len":6}...
|
1793695336
|
Edit
Delete
|
|
45672
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"80c8e5a0d {"Commits":[{"Sha1":"80c8e5a0dd4e458a4a5cbc9d6625ff61f4e4450e","Message":"docs(evidence): run DA02/DA05 real fault comparisons in isolated env\n\nDA02: external baseline 817fa24 protected acceptance passes the correct\ncandidates (56/56) and rejects amount+1, amount+1 with rewritten expectation,\nand the approval-inbox self-filter fault; both-backend HTTP 403 removal is\ncaught by check:runtime and both http.acceptance suites (201/200 vs 403).\n\nDA05: shadow advisor vs real selected/full runs at 02d2402 and main 43b264f;\nzero missed selections across 8 candidates. On main the advisor always falls\nback to full (GRAPH_PACKAGES) because its graph inventory predates D3.\nSelection stays shadow-only; not enabled for L1.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-11-02T23:11:51-08:00"}],"HeadCommit":{"Sha1":"80c8e5a0dd4e458a4a5cbc9d6625ff61f4e4450e","Message":"docs(evidence): run DA02/DA05 real fault comparisons in isolated env\n\nDA02: external baseline 817fa24 protected acceptance passes the correct\ncandidates (56/56) and rejects amount+1, amount+1 with rewritten expectation,\nand the approval-inbox self-filter fault; both-backend HTTP 403 removal is\ncaught by check:runtime and both http.acceptance suites (201/200 vs 403).\n\nDA05: shadow advisor vs real selected/full runs at 02d2402 and main 43b264f;\nzero missed selections across 8 candidates. On main the advisor always falls\nback to full (GRAPH_PACKAGES) because its graph inventory predates D3.\nSelection stays shadow-only; not enabled for L1.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-11-02T23:11:51-08:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/43b264fdef470bbb7342458c63be104369fb9d7c...80c8e5a0dd4e458a4a5cbc9d6625ff61f4e4450e","Len":1}...
|
1793690079
|
Edit
Delete
|
|
42800
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"43b264fde {"Commits":[{"Sha1":"43b264fdef470bbb7342458c63be104369fb9d7c","Message":"chore(evidence): record C50/C51 runtime 593 and UI 14 on clean 7a94d61\n\nIsolated loopback-bound PG/Redis/MinIO/ClamAV.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-27T19:18:35-07:00"},{"Sha1":"7a94d6163065ef2e74a3a7ab82f681b18dd8926a","Message":"fix(security): adopt framework C50/C51 loopback defaults for listen host and dev data stores\n\nFrom base-framework main 26212ad (2026-10-27):\n- API defaults to 127.0.0.1 when HOST is unset or empty; the VM image's\n runtime-base stage already sets HOST=0.0.0.0 and the VM compose only\n publishes the nginx gateway.\n- Dev base binds PostgreSQL/Redis to 127.0.0.1; Redis host port becomes\n overridable.\n- check:dual-backend gains the listen-default check, a stage-aware check\n that the api-nestjs image (or its parent stage) sets HOST=0.0.0.0, and\n the data-store loopback check (framework compose-ports module, tests in\n test:governance-kit).\n\nNegative: entry back to 0.0.0.0, HOST removed from runtime-base, Redis\nwithout loopback each exit 1; green after restore. pnpm check passed on\nthe dirty worktree.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-27T18:57:21-07:00"}],"HeadCommit":{"Sha1":"43b264fdef470bbb7342458c63be104369fb9d7c","Message":"chore(evidence): record C50/C51 runtime 593 and UI 14 on clean 7a94d61\n\nIsolated loopback-bound PG/Redis/MinIO/ClamAV.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-27T19:18:35-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/470030609c843e1a22422efc24a95566f1210d0f...43b264fdef470bbb7342458c63be104369fb9d7c","Len":2}...
|
1793154112
|
Edit
Delete
|
|
41211
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"470030609 {"Commits":[{"Sha1":"470030609c843e1a22422efc24a95566f1210d0f","Message":"docs(evidence): bind quotation D3 to clean full acceptance\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-24T03:37:15-07:00"},{"Sha1":"56519ef48177ef38a86bd0e38e568dc25773a04c","Message":"refactor(d3): converge quotation onto NestJS FastifyAdapter\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-24T03:26:48-07:00"}],"HeadCommit":{"Sha1":"470030609c843e1a22422efc24a95566f1210d0f","Message":"docs(evidence): bind quotation D3 to clean full acceptance\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-24T03:37:15-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/02d24022fda89d1dff23f9dd7a203e584cf8c72c...470030609c843e1a22422efc24a95566f1210d0f","Len":2}...
|
1792838264
|
Edit
Delete
|
|
41058
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"02d24022f {"Commits":[{"Sha1":"02d24022fda89d1dff23f9dd7a203e584cf8c72c","Message":"fix(governance): keep all report changes in shadow impact scope\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-23T23:47:34-07:00"},{"Sha1":"2c2419b35697dc2cf1a06ccc68455153c5cd198f","Message":"fix(governance): keep shadow path handling canonical and portable\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-23T23:45:32-07:00"},{"Sha1":"52f8d8585ecfbb36b0024bde0dc251d69414cddc","Message":"feat(governance): add conservative shadow test impact suggestions\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-23T23:42:40-07:00"},{"Sha1":"817fa24e96b0b7d42f25d24530cef8141848bcac","Message":"fix(governance): align prototype selftest vocabulary\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-23T22:30:05-07:00"},{"Sha1":"2de2752e32fad5ebf01c8c834c4525935de72b30","Message":"fix(governance): read candidate index without executing filters\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-23T22:27:54-07:00"}],"HeadCommit":{"Sha1":"02d24022fda89d1dff23f9dd7a203e584cf8c72c","Message":"fix(governance): keep all report changes in shadow impact scope\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-23T23:47:34-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/281c8fc888556adcd784efa0e02c1e39e2f940d1...02d24022fda89d1dff23f9dd7a203e584cf8c72c","Len":6}...
|
1792826591
|
Edit
Delete
|
|
40881
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"281c8fc88 {"Commits":[{"Sha1":"281c8fc888556adcd784efa0e02c1e39e2f940d1","Message":"fix(agent): align quotation acceptance brief with isolated frozen verification\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-23T22:03:45-07:00"}],"HeadCommit":{"Sha1":"281c8fc888556adcd784efa0e02c1e39e2f940d1","Message":"fix(agent): align quotation acceptance brief with isolated frozen verification\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-23T22:03:45-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/7fe4778cb90fc12ca5d5cf7ae1b7d1874ce12e53...281c8fc888556adcd784efa0e02c1e39e2f940d1","Len":1}...
|
1792818565
|
Edit
Delete
|
|
40843
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"7fe4778cb {"Commits":[{"Sha1":"7fe4778cb90fc12ca5d5cf7ae1b7d1874ce12e53","Message":"docs(evidence): bind SDK 0.27 to clean 660 runtime and 13 browser cases\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-23T16:56:21-07:00"},{"Sha1":"cb6a73ac9b406255ef9a2d898ba827a53e9bc22f","Message":"fix(test): assert published SDK lock identity as literal bytes\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-23T16:48:04-07:00"},{"Sha1":"ed7e3010e068dd1d20e0aa52c4b57fd66d55d041","Message":"chore(kernel): align quotation request-context SDK to exact published 0.27.0\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-23T16:46:02-07:00"}],"HeadCommit":{"Sha1":"7fe4778cb90fc12ca5d5cf7ae1b7d1874ce12e53","Message":"docs(evidence): bind SDK 0.27 to clean 660 runtime and 13 browser cases\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-23T16:56:21-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/a19237251b330595f824b5b08100293ee0be827e...7fe4778cb90fc12ca5d5cf7ae1b7d1874ce12e53","Len":3}...
|
1792799785
|
Edit
Delete
|
|
40790
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"a19237251 {"Commits":[{"Sha1":"a19237251b330595f824b5b08100293ee0be827e","Message":"docs(governance): bind C32 three-tier evidence to 2e6c0f0\n\nRecord the clean local run on 2e6c0f0: pnpm check exit 0 in 65.7s (53.7s on\nthe closing re-run) with 19/19 same-run sub-reports reused and no provenance\nviolations; check:runtime 660/660; check:ui 13/13; gate self-tests 23; the\nnegative proofs; and refresh the committed latest reports. Local isolated\nworktree only: not pushed, not merged, no remote CI, not deployed.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-22T16:36:22-07:00"},{"Sha1":"2e6c0f0da8a0c6db978d5563d73724dd570772ed","Message":"chore(governance): lock gate self-test floor at 23 (C32)\n\nRaise reports/baseline.json gateSelftests 20-\u003e23 via governance-report\n--update-baseline after the three new self-tests passed on 317f336.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-22T16:30:52-07:00"},{"Sha1":"317f3366060413256b1960a8098c0ae9e791fbdf","Message":"fix(governance): never reuse a sub-report whose status is not passed (C32)\n\nA report that carries a status field is reused only when it says passed, so\nthe reuse rule no longer depends on the \u0026\u0026 chain having stopped earlier.\nDocument that checker sources and inputs are covered by the fingerprint while\nthe environment is bounded only by the shared runId; add the self-test case.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-22T16:28:33-07:00"},{"Sha1":"b47cd323ef7fa15b08d765cded24847a26e06532","Message":"feat(governance): stop Prisma cache false green, reuse same-run reports, add L0 check:quick (C32)\n\n- check:prisma-client compares each backend's resolved generated schema with\n its source schema after stripping comments and whitespace; the static chain\n now runs prisma:generate first, so turbo can no longer replay a typecheck\n green against a stale generated client.\n- pnpm check runs scripts/run-static-check.mjs, which pins one runner/runId for\n the whole check:static-chain; check:governance:reuse reuses a sub-report only\n when all six provenance fields match exactly and re-runs it otherwise, so gate\n self-tests no longer run twice. Standalone check:governance still re-runs all.\n- check:quick runs 22 node gates to completion plus lint/typecheck via\n governance-kit runQuickChecks; .githooks/pre-commit calls it once enabled with\n pnpm hooks:install.\n- Three self-tests (prisma-client-freshness, report-reuse, quick-gates) join\n check:gate-selftest; 11 source mutations all fail on the intended assertion.\n- Sync CLAUDE.md, README, module test matrix and governance experience (C32).\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-22T16:26:32-07:00"},{"Sha1":"9c4711acfebfbfb5f8ce16410225cdf215dae6bb","Message":"docs(governance): bind QH-T02/QH-T03 static and runtime evidence to f5ced61\n\nReports regenerated on clean f5ced61 (worktreeDirty=false): pnpm check\nexit 0 and check:runtime 660/660 (floor 660) against isolated PG\n127.0.0.1:47301/juhai_quotation_qhsrc_rt3, Redis 47302/4, MinIO 47303 and\nClamAV 47305. ui-acceptance.latest.json is unchanged (still 088eee1;\ncheck:ui not run this round).\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-22T10:10:39-07:00"}],"HeadCommit":{"Sha1":"a19237251b330595f824b5b08100293ee0be827e","Message":"docs(governance): bind C32 three-tier evidence to 2e6c0f0\n\nRecord the clean local run on 2e6c0f0: pnpm check exit 0 in 65.7s (53.7s on\nthe closing re-run) with 19/19 same-run sub-reports reused and no provenance\nviolations; check:runtime 660/660; check:ui 13/13; gate self-tests 23; the\nnegative proofs; and refresh the committed latest reports. Local isolated\nworktree only: not pushed, not merged, no remote CI, not deployed.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-22T16:36:22-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/5a92833251b0332bf260feeb47ddf55ecc6e66c1...a19237251b330595f824b5b08100293ee0be827e","Len":7}...
|
1792767666
|
Edit
Delete
|
|
39764
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"5a9283325 {"Commits":[{"Sha1":"5a92833251b0332bf260feeb47ddf55ecc6e66c1","Message":"docs(governance): bind verified quotation migration and isolated build evidence\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-20T02:11:29-07:00"},{"Sha1":"088eee13e2e19cb58bfd55efc8ff13dcfce8f46b","Message":"fix(build): include shared TypeScript inputs for quotation prepare\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-20T01:51:32-07:00"},{"Sha1":"3739f749d55c59d64bd5f3a1abf44b7b31be55c7","Message":"fix(governance): retain validated runtime package floors in scalar ratchet adapter\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-20T01:44:26-07:00"},{"Sha1":"cff596379a0ce023a3d52e016d53618c87c0299a","Message":"fix(governance): preserve quotation metric tuple normalization\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-20T01:41:11-07:00"},{"Sha1":"af5d921f2d34a51bdcbaabe3cc202c207bcf102b","Message":"fix(governance): build quotation dependencies in clean checkout order\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-20T01:36:35-07:00"}],"HeadCommit":{"Sha1":"5a92833251b0332bf260feeb47ddf55ecc6e66c1","Message":"docs(governance): bind verified quotation migration and isolated build evidence\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-20T02:11:29-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/6447331b6b77ea3050942dd874746057c0ffd68d...5a92833251b0332bf260feeb47ddf55ecc6e66c1","Len":21}...
|
1792487531
|
Edit
Delete
|
|
39676
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/codex/notification-sdk-rc8-refresh-2026 refs/heads/codex/notification-sdk-rc8-refresh-20261019...
|
0
|
{"Commits":[{"Sha1":"3f51bcf02 {"Commits":[{"Sha1":"3f51bcf02415f912dc8740fc032086f6a336aa4b","Message":"docs(notification): 绑定云端main的rc.8候选验证\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-19T23:20:55-07:00"},{"Sha1":"ca64a945fde03a6b5e57471621b1ae1684a491ed","Message":"merge(notification): 更新云端main的rc.8消费候选\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-19T23:18:52-07:00"}],"HeadCommit":{"Sha1":"3f51bcf02415f912dc8740fc032086f6a336aa4b","Message":"docs(notification): 绑定云端main的rc.8候选验证\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-19T23:20:55-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/6447331b6b77ea3050942dd874746057c0ffd68d...3f51bcf02415f912dc8740fc032086f6a336aa4b","Len":2}...
|
1792477290
|
Edit
Delete
|
|
39675
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/codex/notification-sdk-rc8-refresh-2026 refs/heads/codex/notification-sdk-rc8-refresh-20261019...
|
0
|
|
1792477290
|
Edit
Delete
|
|
39647
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"6447331b6 {"Commits":[{"Sha1":"6447331b6b77ea3050942dd874746057c0ffd68d","Message":"docs: add independent application system atlas and editable Mermaid source\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-19T22:10:44-07:00"}],"HeadCommit":{"Sha1":"6447331b6b77ea3050942dd874746057c0ffd68d","Message":"docs: add independent application system atlas and editable Mermaid source\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-19T22:10:44-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/7fbd54793a41ee137e05974f71d3e822f78ef7af...6447331b6b77ea3050942dd874746057c0ffd68d","Len":1}...
|
1792473074
|
Edit
Delete
|
|
38488
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/codex/notification-sdk-rc8-20261015
|
0
|
{"Commits":[{"Sha1":"d6a60322d {"Commits":[{"Sha1":"d6a60322d972ff85bcf6e96c1b4ac2d7cdeae030","Message":"chore(reports): bind rc8 SDK candidate local acceptance\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-15T19:12:43-07:00"},{"Sha1":"c00255134cb0531b19714ffdaff4c06da5c57b61","Message":"fix(notification): isolate UNKNOWN effects and verify rate-limit recovery\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-15T18:55:05-07:00"},{"Sha1":"f9df13e2e980ba4437e691d04bfcc5439bec4ac4","Message":"docs(notification): align intent wording with repository naming rules\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-15T18:49:20-07:00"},{"Sha1":"094122512c61f58019e1331b04cb57f3f0ed3c9c","Message":"feat(notification): prepare rc8 SDK consumer candidate and real-chain acceptance\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-15T18:47:26-07:00"}],"HeadCommit":{"Sha1":"d6a60322d972ff85bcf6e96c1b4ac2d7cdeae030","Message":"chore(reports): bind rc8 SDK candidate local acceptance\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-15T19:12:43-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/7fbd54793a41ee137e05974f71d3e822f78ef7af...d6a60322d972ff85bcf6e96c1b4ac2d7cdeae030","Len":4}...
|
1792116768
|
Edit
Delete
|
|
38487
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/codex/notification-sdk-rc8-20261015
|
0
|
|
1792116768
|
Edit
Delete
|
|
34869
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"7fbd54793 {"Commits":[{"Sha1":"7fbd54793a41ee137e05974f71d3e822f78ef7af","Message":"docs(handoff): register SalesOrderCreated producer work order as G27\n\nRecords the incoming request from the enterprise reality kernel\n(seven-domain-five-dimension-unified-model @ fda2821a) for this app to be\nthe authoritative producer of SalesOrderCreated. Documentation only: no\ncode, schema, or contract change.\n\n- docs/handoff/sales-order-created-producer-2026-10-03.md: current write\n point and local outbox (read at 3b7ca66), the five open forks from the\n kernel's decision pack, and the work split into what can start now,\n what waits for the fact contract, and what belongs to the platform\n- CLAUDE.md: open item G27 pointing at the handoff; D1 site orders stay\n under G26\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-03T04:30:56-07:00"}],"HeadCommit":{"Sha1":"7fbd54793a41ee137e05974f71d3e822f78ef7af","Message":"docs(handoff): register SalesOrderCreated producer work order as G27\n\nRecords the incoming request from the enterprise reality kernel\n(seven-domain-five-dimension-unified-model @ fda2821a) for this app to be\nthe authoritative producer of SalesOrderCreated. Documentation only: no\ncode, schema, or contract change.\n\n- docs/handoff/sales-order-created-producer-2026-10-03.md: current write\n point and local outbox (read at 3b7ca66), the five open forks from the\n kernel's decision pack, and the work split into what can start now,\n what waits for the fact contract, and what belongs to the platform\n- CLAUDE.md: open item G27 pointing at the handoff; D1 site orders stay\n under G26\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-03T04:30:56-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/3b7ca66f6af2d9ecf7465dea5be95b1aa199b5a0...7fbd54793a41ee137e05974f71d3e822f78ef7af","Len":1}...
|
1791027398
|
Edit
Delete
|
|
32726
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"3b7ca66f6 {"Commits":[{"Sha1":"3b7ca66f6af2d9ecf7465dea5be95b1aa199b5a0","Message":"feat(notification): add platform delivery consumer\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-23T07:56:12-07:00"},{"Sha1":"8cae1a58031ddc85848d02cff06cfd4d11083098","Message":"fix(compose): 开发基座补顶层 name,停止与另外六个仓共用 project `api-nestjs`\n\n本文件没有顶层 name,compose 便按**所在目录名**推导 project 名。它在每个仓里的路径都是\napps/api-nestjs/,于是 7 个仓推导出同一个 `api-nestjs`,共用 `api-nestjs_pgdata` /\n`_redisdata` 与同名容器——后 up 的那个直接接管先起者的容器与卷。这类冲突单仓内部永远\n判不出来,只有横着比多份 compose 才看得见,已经咬过一次(C-15)。\n\n现改为 `name: ${COMPOSE_PROJECT_NAME:-juhai-quotation-system}`,默认取本仓 package.json 的 name,\n仍可用 COMPOSE_PROJECT_NAME 覆盖。实测 `docker compose config` 解析出的卷已变为\n`juhai-quotation-system_*`。\n\n数据风险已先核过再改:本机 260 个卷里**没有任何 `api-nestjs_*`**,\n`docker ps -a --filter label=com.docker.compose.project=api-nestjs` 零命中——\n这份 compose 在本机从未以默认推导名起过,没有旧卷需要迁移。(只证明本机;\n别的机器若直接 up 过,改名后首次 up 会建新空卷,旧卷需自行迁移。)\n\n工作区门禁 `平台治理/基础/scripts/check-workspace-consistency.mjs` 的\nL9 COMPOSE_PROJECT_COLLISION 在 7 个仓全部补齐后由 ISSUES 转 CLEAN(exit 0,0 issues)。\n处置依据:裁决 N-11 选项 ①。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-18T19:13:32-07:00"}],"HeadCommit":{"Sha1":"3b7ca66f6af2d9ecf7465dea5be95b1aa199b5a0","Message":"feat(notification): add platform delivery consumer\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-23T07:56:12-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/6908c19f9faf3b006d73054657b97c6cb8f945d9...3b7ca66f6af2d9ecf7465dea5be95b1aa199b5a0","Len":2}...
|
1790175423
|
Edit
Delete
|
|
31179
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"6908c19f9 {"Commits":[{"Sha1":"6908c19f9faf3b006d73054657b97c6cb8f945d9","Message":"fix(quotation): 通知投递显式传重试上限——领取与死信判定不再各用一份常数\n\n服务里的 MAX_ATTEMPTS = 3 只进领取查询与死信清扫,decideNotificationFailure 没传 maxAttempts、\n走的是 @repo/notification-delivery 的包默认 3。今天两个 3 相等所以看不出来,改任一边即静默不一致:\n领取按新上限继续捡,死信判定仍按旧上限提前把行判死。同仓 event-delivery.service.ts 一直是显式传的。\n\n两后端各一行,语义不变。验证:typecheck 绿;pnpm check 22 道全绿;包单测 4/4 未受影响。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-18T16:06:42-07:00"}],"HeadCommit":{"Sha1":"6908c19f9faf3b006d73054657b97c6cb8f945d9","Message":"fix(quotation): 通知投递显式传重试上限——领取与死信判定不再各用一份常数\n\n服务里的 MAX_ATTEMPTS = 3 只进领取查询与死信清扫,decideNotificationFailure 没传 maxAttempts、\n走的是 @repo/notification-delivery 的包默认 3。今天两个 3 相等所以看不出来,改任一边即静默不一致:\n领取按新上限继续捡,死信判定仍按旧上限提前把行判死。同仓 event-delivery.service.ts 一直是显式传的。\n\n两后端各一行,语义不变。验证:typecheck 绿;pnpm check 22 道全绿;包单测 4/4 未受影响。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-18T16:06:42-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/ec9e07de44a5619a8a6b5648f00f5ea7f7dcafcf...6908c19f9faf3b006d73054657b97c6cb8f945d9","Len":1}...
|
1789772844
|
Edit
Delete
|
|
29814
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"ec9e07de4 {"Commits":[{"Sha1":"ec9e07de44a5619a8a6b5648f00f5ea7f7dcafcf","Message":"feat(quotation): 接入公共文件平台并补齐 outbox 重放与通知投递\n\n- 新增 packages/public-file,对象存储改走公共文件平台契约,\n 两端 object-storage 与 files 路由同步重构\n- 新增 outbox-operations 模块与路由,配套 outbox_replay_operations 迁移,\n 支持事件重放运维操作\n- 新增 notification-delivery 模块与 packages/notification-delivery,\n 配套 quotation_notification_delivery 迁移\n- packages/contracts 补 notification / outbox-operations 契约与测试\n- 刷新 reports 证据\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-14T19:52:39-07:00"}],"HeadCommit":{"Sha1":"ec9e07de44a5619a8a6b5648f00f5ea7f7dcafcf","Message":"feat(quotation): 接入公共文件平台并补齐 outbox 重放与通知投递\n\n- 新增 packages/public-file,对象存储改走公共文件平台契约,\n 两端 object-storage 与 files 路由同步重构\n- 新增 outbox-operations 模块与路由,配套 outbox_replay_operations 迁移,\n 支持事件重放运维操作\n- 新增 notification-delivery 模块与 packages/notification-delivery,\n 配套 quotation_notification_delivery 迁移\n- packages/contracts 补 notification / outbox-operations 契约与测试\n- 刷新 reports 证据\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-14T19:52:39-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/125c54d328d3da221b5d91c0a2dd0475712c6e96...ec9e07de44a5619a8a6b5648f00f5ea7f7dcafcf","Len":1}...
|
1789440856
|
Edit
Delete
|
|
26205
|
5
|
5
|
7
|
72
|
0
|
0
|
refs/heads/hljTest
|
0
|
{"Commits":[{"Sha1":"fc0729c51 {"Commits":[{"Sha1":"fc0729c51eaa6fb61e5c2c39bdc6d4bd30696570","Message":"fix(vm): make smoke honor the web base path\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"hlj@g-hi.com","AuthorName":"huangliujian","CommitterEmail":"hlj@g-hi.com","CommitterName":"huangliujian","Timestamp":"2026-08-26T13:51:23+08:00"}],"HeadCommit":{"Sha1":"fc0729c51eaa6fb61e5c2c39bdc6d4bd30696570","Message":"fix(vm): make smoke honor the web base path\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"hlj@g-hi.com","AuthorName":"huangliujian","CommitterEmail":"hlj@g-hi.com","CommitterName":"huangliujian","Timestamp":"2026-08-26T13:51:23+08:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/08df317afac31db70f0394580a0bb8686f49671c...fc0729c51eaa6fb61e5c2c39bdc6d4bd30696570","Len":1}...
|
1787723483
|
Edit
Delete
|
|
26124
|
5
|
5
|
7
|
72
|
0
|
0
|
refs/heads/hljTest
|
0
|
{"Commits":[{"Sha1":"08df317af {"Commits":[{"Sha1":"08df317afac31db70f0394580a0bb8686f49671c","Message":"Merge remote-tracking branch 'origin/codex/catalog-customer-quotation-workflows' into hljTest\n\n# Conflicts:\n#\tdeploy/vm/Dockerfile\n#\tscripts/lib/component-size.mjs\n","AuthorEmail":"hlj@g-hi.com","AuthorName":"huangliujian","CommitterEmail":"hlj@g-hi.com","CommitterName":"huangliujian","Timestamp":"2026-08-26T13:12:50+08:00"},{"Sha1":"8f11b6bc4df9f709414e306e9c9225bd45bccb65","Message":"feat: complete catalog customer and quotation workflows\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-24T01:18:51-07:00"},{"Sha1":"2de7545076ac90e4aa88e89cdf310f72ca9692ce","Message":"fix(vm): Prisma 生成物拷到运行时真正解析的位置——旧断言查的是拷贝目标而非读取路径\n\n`pnpm vm:up` 首次真跑起整栈,api-nestjs 容器启动即崩溃重启循环:\n`@prisma/client did not initialize yet. Please run \"prisma generate\"`。\n而构建期那条\"Prisma Client 必须在部署树里\"的断言是**绿的**。\n\n根因:`pnpm deploy` 把 @prisma/client 放进\n`node_modules/.pnpm/@prisma+client@\u003chash\u003e/node_modules/`,而 @prisma/client 是相对\n**自身**去找同级 `.prisma` 的——部署树顶层那份它根本不看。上一版把生成物拷到了顶层\n扁平路径,于是:\n- 运行时解析到 .pnpm 内嵌的那份,那是 @prisma/client **自带的桩**\n (`default.js` 第 43 行专门抛 \"did not initialize yet\"),没有 query engine;\n- 而断言 `test -d /runtime/\u003capp\u003e/node_modules/.prisma/client` 查的正是我刚拷过去的\n 顶层目录,\"往哪拷就查哪\",必然通过。\n\n这是「断言检查的位置 ≠ 运行时读取的位置」,与 C23(typecheck 读 src、运行时读 dist)\n同型:不是断言写得弱,而是它锚在一条运行时不走的路径上。\n\n两处一起修:\n1. 拷贝目标改为 .pnpm 内嵌位置(顶层那份保留,覆盖 hoist 布局),glob 取不到即 fail。\n2. 断言改为**按运行时同一方式推导路径**(从 require.resolve('@prisma/client/package.json')\n 反推同级 .prisma),并断言 **query engine 二进制存在**——只 `test -d` 等于没查,\n 因为那个桩目录永远存在。\n\n负向测试(实跑):去掉 .pnpm 拷贝那行后构建 EXIT=1,报\n`ERROR: no generated query engine at /runtime/api-nestjs/node_modules/.pnpm/@prisma+client@.../.prisma/client`\n——新断言会在构建期拦下这个 bug,而不是等容器启动才炸。\n\n证据(作用域=本地工作区):\n- pnpm vm:up 全流程通过:6 个服务全 healthy、migrate Exited(0)\n- 迁移真实应用到部署库(含 20260805120000_product_image_thumbnail /\n 20260807120000_quotation_void_and_restore)\n- 冒烟:Gateway + web + NestJS health passed;\n Write-chain smoke passed(create + read-back under a throwaway tenant)\n- 独立复核(不依赖脚本自述):curl 网关 /api/health -\u003e ok(db=up,redis=up)、首页 200、\n 容器内 `new PrismaClient()` 实例化成功\n- pnpm check 22 项全绿 exit=0\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-17T17:36:43-07:00"}],"HeadCommit":{"Sha1":"08df317afac31db70f0394580a0bb8686f49671c","Message":"Merge remote-tracking branch 'origin/codex/catalog-customer-quotation-workflows' into hljTest\n\n# Conflicts:\n#\tdeploy/vm/Dockerfile\n#\tscripts/lib/component-size.mjs\n","AuthorEmail":"hlj@g-hi.com","AuthorName":"huangliujian","CommitterEmail":"hlj@g-hi.com","CommitterName":"huangliujian","Timestamp":"2026-08-26T13:12:50+08:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/04432cff2b306ecd33ca2bea6e2e256814f978f0...08df317afac31db70f0394580a0bb8686f49671c","Len":3}...
|
1787721223
|
Edit
Delete
|
|
25374
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/codex/catalog-customer-quotation-workfl refs/heads/codex/catalog-customer-quotation-workflows...
|
0
|
{"Commits":[{"Sha1":"8f11b6bc4 {"Commits":[{"Sha1":"8f11b6bc4df9f709414e306e9c9225bd45bccb65","Message":"feat: complete catalog customer and quotation workflows\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-24T01:18:51-07:00"}],"HeadCommit":{"Sha1":"8f11b6bc4df9f709414e306e9c9225bd45bccb65","Message":"feat: complete catalog customer and quotation workflows\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-24T01:18:51-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/2de7545076ac90e4aa88e89cdf310f72ca9692ce...8f11b6bc4df9f709414e306e9c9225bd45bccb65","Len":1}...
|
1787559678
|
Edit
Delete
|
|
25373
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/codex/catalog-customer-quotation-workfl refs/heads/codex/catalog-customer-quotation-workflows...
|
0
|
|
1787559677
|
Edit
Delete
|
|
25166
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/fix/vm-prisma-runtime-path
|
0
|
{"Commits":[{"Sha1":"2de754507 {"Commits":[{"Sha1":"2de7545076ac90e4aa88e89cdf310f72ca9692ce","Message":"fix(vm): Prisma 生成物拷到运行时真正解析的位置——旧断言查的是拷贝目标而非读取路径\n\n`pnpm vm:up` 首次真跑起整栈,api-nestjs 容器启动即崩溃重启循环:\n`@prisma/client did not initialize yet. Please run \"prisma generate\"`。\n而构建期那条\"Prisma Client 必须在部署树里\"的断言是**绿的**。\n\n根因:`pnpm deploy` 把 @prisma/client 放进\n`node_modules/.pnpm/@prisma+client@\u003chash\u003e/node_modules/`,而 @prisma/client 是相对\n**自身**去找同级 `.prisma` 的——部署树顶层那份它根本不看。上一版把生成物拷到了顶层\n扁平路径,于是:\n- 运行时解析到 .pnpm 内嵌的那份,那是 @prisma/client **自带的桩**\n (`default.js` 第 43 行专门抛 \"did not initialize yet\"),没有 query engine;\n- 而断言 `test -d /runtime/\u003capp\u003e/node_modules/.prisma/client` 查的正是我刚拷过去的\n 顶层目录,\"往哪拷就查哪\",必然通过。\n\n这是「断言检查的位置 ≠ 运行时读取的位置」,与 C23(typecheck 读 src、运行时读 dist)\n同型:不是断言写得弱,而是它锚在一条运行时不走的路径上。\n\n两处一起修:\n1. 拷贝目标改为 .pnpm 内嵌位置(顶层那份保留,覆盖 hoist 布局),glob 取不到即 fail。\n2. 断言改为**按运行时同一方式推导路径**(从 require.resolve('@prisma/client/package.json')\n 反推同级 .prisma),并断言 **query engine 二进制存在**——只 `test -d` 等于没查,\n 因为那个桩目录永远存在。\n\n负向测试(实跑):去掉 .pnpm 拷贝那行后构建 EXIT=1,报\n`ERROR: no generated query engine at /runtime/api-nestjs/node_modules/.pnpm/@prisma+client@.../.prisma/client`\n——新断言会在构建期拦下这个 bug,而不是等容器启动才炸。\n\n证据(作用域=本地工作区):\n- pnpm vm:up 全流程通过:6 个服务全 healthy、migrate Exited(0)\n- 迁移真实应用到部署库(含 20260805120000_product_image_thumbnail /\n 20260807120000_quotation_void_and_restore)\n- 冒烟:Gateway + web + NestJS health passed;\n Write-chain smoke passed(create + read-back under a throwaway tenant)\n- 独立复核(不依赖脚本自述):curl 网关 /api/health -\u003e ok(db=up,redis=up)、首页 200、\n 容器内 `new PrismaClient()` 实例化成功\n- pnpm check 22 项全绿 exit=0\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-17T17:36:43-07:00"}],"HeadCommit":{"Sha1":"2de7545076ac90e4aa88e89cdf310f72ca9692ce","Message":"fix(vm): Prisma 生成物拷到运行时真正解析的位置——旧断言查的是拷贝目标而非读取路径\n\n`pnpm vm:up` 首次真跑起整栈,api-nestjs 容器启动即崩溃重启循环:\n`@prisma/client did not initialize yet. Please run \"prisma generate\"`。\n而构建期那条\"Prisma Client 必须在部署树里\"的断言是**绿的**。\n\n根因:`pnpm deploy` 把 @prisma/client 放进\n`node_modules/.pnpm/@prisma+client@\u003chash\u003e/node_modules/`,而 @prisma/client 是相对\n**自身**去找同级 `.prisma` 的——部署树顶层那份它根本不看。上一版把生成物拷到了顶层\n扁平路径,于是:\n- 运行时解析到 .pnpm 内嵌的那份,那是 @prisma/client **自带的桩**\n (`default.js` 第 43 行专门抛 \"did not initialize yet\"),没有 query engine;\n- 而断言 `test -d /runtime/\u003capp\u003e/node_modules/.prisma/client` 查的正是我刚拷过去的\n 顶层目录,\"往哪拷就查哪\",必然通过。\n\n这是「断言检查的位置 ≠ 运行时读取的位置」,与 C23(typecheck 读 src、运行时读 dist)\n同型:不是断言写得弱,而是它锚在一条运行时不走的路径上。\n\n两处一起修:\n1. 拷贝目标改为 .pnpm 内嵌位置(顶层那份保留,覆盖 hoist 布局),glob 取不到即 fail。\n2. 断言改为**按运行时同一方式推导路径**(从 require.resolve('@prisma/client/package.json')\n 反推同级 .prisma),并断言 **query engine 二进制存在**——只 `test -d` 等于没查,\n 因为那个桩目录永远存在。\n\n负向测试(实跑):去掉 .pnpm 拷贝那行后构建 EXIT=1,报\n`ERROR: no generated query engine at /runtime/api-nestjs/node_modules/.pnpm/@prisma+client@.../.prisma/client`\n——新断言会在构建期拦下这个 bug,而不是等容器启动才炸。\n\n证据(作用域=本地工作区):\n- pnpm vm:up 全流程通过:6 个服务全 healthy、migrate Exited(0)\n- 迁移真实应用到部署库(含 20260805120000_product_image_thumbnail /\n 20260807120000_quotation_void_and_restore)\n- 冒烟:Gateway + web + NestJS health passed;\n Write-chain smoke passed(create + read-back under a throwaway tenant)\n- 独立复核(不依赖脚本自述):curl 网关 /api/health -\u003e ok(db=up,redis=up)、首页 200、\n 容器内 `new PrismaClient()` 实例化成功\n- pnpm check 22 项全绿 exit=0\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-17T17:36:43-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/125c54d328d3da221b5d91c0a2dd0475712c6e96...2de7545076ac90e4aa88e89cdf310f72ca9692ce","Len":1}...
|
1787540013
|
Edit
Delete
|
|
25165
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/fix/vm-prisma-runtime-path
|
0
|
|
1787540013
|
Edit
Delete
|
|
24581
|
5
|
5
|
7
|
72
|
0
|
0
|
refs/heads/hljTest
|
0
|
{"Commits":[{"Sha1":"04432cff2 {"Commits":[{"Sha1":"04432cff2b306ecd33ca2bea6e2e256814f978f0","Message":"fix(web): preserve /jh authentication and realtime paths\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"hlj@g-hi.com","AuthorName":"huangliujian","CommitterEmail":"hlj@g-hi.com","CommitterName":"huangliujian","Timestamp":"2026-08-20T16:25:36+08:00"}],"HeadCommit":{"Sha1":"04432cff2b306ecd33ca2bea6e2e256814f978f0","Message":"fix(web): preserve /jh authentication and realtime paths\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"hlj@g-hi.com","AuthorName":"huangliujian","CommitterEmail":"hlj@g-hi.com","CommitterName":"huangliujian","Timestamp":"2026-08-20T16:25:36+08:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/083385f1c38217147aacf74d0f2251a65fbce450...04432cff2b306ecd33ca2bea6e2e256814f978f0","Len":1}...
|
1787214380
|
Edit
Delete
|
|
24191
|
5
|
5
|
7
|
72
|
0
|
0
|
refs/heads/hljTest
|
0
|
{"Commits":[{"Sha1":"083385f1c {"Commits":[{"Sha1":"083385f1c38217147aacf74d0f2251a65fbce450","Message":"feat(integrations): 接入报价优惠券核销\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"hlj@g-hi.com","AuthorName":"huangliujian","CommitterEmail":"hlj@g-hi.com","CommitterName":"huangliujian","Timestamp":"2026-08-19T13:12:36+08:00"},{"Sha1":"be60de1f7e3c6183500ea7d65fc2bf039a86f1d0","Message":"Merge remote-tracking branch 'origin/main' into hljTest\n\n# Conflicts:\n#\tCLAUDE.md\n#\tapps/api-fastify/prisma/schema.prisma\n#\tapps/api-fastify/src/routes/quotations.ts\n#\tapps/api-nestjs/prisma/schema.prisma\n#\tapps/api-nestjs/src/quotations/quotations.service.ts\n#\tapps/web/src/features/quotations/api/quotations-api.ts\n#\tapps/web/src/features/quotations/components/PublicQuotationView.tsx\n#\tapps/web/src/hooks/useRealtime.ts\n#\tdeploy/vm/Dockerfile\n#\tdeploy/vm/compose.yaml\n#\tdocs/governance-experience.md\n#\tpackages/contracts/src/index.ts\n#\tpackages/contracts/src/quotation.ts\n#\tpackages/contracts/src/realtime.ts\n#\tscripts/vm-deploy.sh\n","AuthorEmail":"hlj@g-hi.com","AuthorName":"huangliujian","CommitterEmail":"hlj@g-hi.com","CommitterName":"huangliujian","Timestamp":"2026-08-19T09:54:43+08:00"},{"Sha1":"125c54d328d3da221b5d91c0a2dd0475712c6e96","Message":"Merge pull request #12 from laoluojuhai/fix/vm-dockerfile-build-path\n\nfix(vm): 打通容器构建路径——保住 slim 运行镜像,不靠放宽红线换构建成功","AuthorEmail":"158980461+laoluojuhai@users.noreply.github.com","AuthorName":"laoluojuhai","CommitterEmail":"noreply@github.com","CommitterName":"GitHub","Timestamp":"2026-08-17T07:09:44-07:00"},{"Sha1":"6f13a78de9c02ae6a36fcebfb4bde63fbd092158","Message":"fix(vm): 打通容器构建路径——保住 slim 运行镜像,不靠放宽红线换构建成功\n\n`deploy/vm/Dockerfile` 的构建路径从未真正跑通过(并发治理会话只用 pnpm/turbo 跑门禁,\n从不 docker build)。而 check:vm-deploy 一直是绿的——它查 Dockerfile 的**结构**\n(每个 stage 用哪个 FROM、有没有 fat runtime),不查它**能不能构建出来**。\n于是棘轮报告写着「镜像瘦身非 root、可回滚、备份可恢复」✅,而那个镜像根本产不出来。\n\n5 处构建 bug:\n1. contracts 的 `prepare`(tsc) 在只有 manifest 的依赖层里跑,找不到 tsconfig/src → TS5058。\n 先 COPY contracts 的 tsconfig + src 给它当输入。\n2. 新 workspace 包 @repo/password-auth(两后端 runtime 依赖)未进 manifest COPY、\n 也没被显式 build。\n3. `pnpm deploy --prod --legacy`:pnpm 9.15.9 不认 `--legacy`(Unknown option)。\n 旧注释称「未开启 inject-workspace-packages 时需要 --legacy」——实测在本仓版本上\n 不成立,去掉即可正常打平 workspace 包(sharp 这类 lockfile 原生依赖也照常带出)。\n4. `pnpm deploy` 只按 lockfile 物化依赖,而 .prisma/client(含平台相关 query engine)\n 是 `prisma generate` **生成**的、不在任何 lockfile 里,永远不会被带出去 →\n 新增一步从 build 树复制。路径由 @prisma/client 的解析结果反推,不硬编码 pnpm store\n 的哈希目录名;且必须从 app 目录解析(workspace 根 node_modules 里没有它)。\n5. web stage `COPY apps/web/public` 失败——git 未跟踪任何 public 资产。\n ⚠️ 本机可能有个空的 public/(git 不跟踪空目录),docker build 读本地上下文因而能过,\n CI 与全新 clone 上必挂,注释已写明这个陷阱。\n\n**刻意不采用**此前 `dockerfile-vm-deploy-fixes-ec411c0.patch` 的策略(放弃 slim、\n运行镜像改 FROM build):那会撞 4 条门禁红线(runtime-from-base-* / no-fat-runtime-*),\n而实测 slim 路径的两个阻塞点(3、4)都可解,「镜像瘦身作为后续项不阻塞」的前提不成立。\n体积实测:api-nestjs 741MB / api-fastify 695MB / web 546MB,\n对照 fat 方案 8.46GB、2026-08-06 实际部署的 2.69GB。非 root 由镜像层 USER node 保证,\n而非仅靠 compose 的 user: 覆盖。\n\n顺带两处断链(均为 MinIO 进 compose 后没人跟上):\n- .env.example 与 vm:init 都不认识 S3_*,而它们是 compose 的必填变量 → 新机器\n `vm:init` 后 `vm:up` 必然卡在变量插值。已补占位符 + 随机生成 + 存量 .env 自愈。\n- .dockerignore 只写 `**/.next`,匹配不到本仓工具链自建的 distDir\n (.next-ui-* / .next-dev-* / .next-manual-*),也没排除 sites/(G26 那套独立\n Cloudflare 系统,其 .sites-runtime 本机 1.0GB)→ COPY . . 层 3.79GB → 270MB。\n\n证据(作用域=本地工作区):\n- docker build 四个 target 全部 EXIT=0(api-nestjs / api-fastify / web / migrate)\n- 镜像内实测 @prisma/client 与原生模块 sharp 均可加载、dist 入口就位、uid=1000 非 root\n- Dockerfile 里那条「Prisma Client 缺失即构建失败」的断言**首次真正执行并通过**\n- pnpm vm:config EXIT=0(7 个服务解析通过)\n- pnpm check 22 项全绿 exit=0\n\n未验证:未跑 vm:up / vm:smoke(整栈起停与真实写链冒烟),故不得宣称「可部署」。\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-17T06:57:55-07:00"},{"Sha1":"8ae98649e077fa188f8e9c1b0a11b78a2377c836","Message":"Merge pull request #11 from laoluojuhai/feat/product-catalog-search-and-image-upload\n\nfeat(products): 商品库服务端搜索筛选 + 图片上传至对象存储","AuthorEmail":"158980461+laoluojuhai@users.noreply.github.com","AuthorName":"laoluojuhai","CommitterEmail":"noreply@github.com","CommitterName":"GitHub","Timestamp":"2026-08-17T04:16:44-07:00"}],"HeadCommit":{"Sha1":"083385f1c38217147aacf74d0f2251a65fbce450","Message":"feat(integrations): 接入报价优惠券核销\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"hlj@g-hi.com","AuthorName":"huangliujian","CommitterEmail":"hlj@g-hi.com","CommitterName":"huangliujian","Timestamp":"2026-08-19T13:12:36+08:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/d2c99c9fc71e8a1c48d1aa3684c30ead3eb110c0...083385f1c38217147aacf74d0f2251a65fbce450","Len":51}...
|
1787116369
|
Edit
Delete
|
|
23627
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"125c54d32 {"Commits":[{"Sha1":"125c54d328d3da221b5d91c0a2dd0475712c6e96","Message":"Merge pull request #12 from laoluojuhai/fix/vm-dockerfile-build-path\n\nfix(vm): 打通容器构建路径——保住 slim 运行镜像,不靠放宽红线换构建成功","AuthorEmail":"158980461+laoluojuhai@users.noreply.github.com","AuthorName":"laoluojuhai","CommitterEmail":"noreply@github.com","CommitterName":"GitHub","Timestamp":"2026-08-17T07:09:44-07:00"},{"Sha1":"6f13a78de9c02ae6a36fcebfb4bde63fbd092158","Message":"fix(vm): 打通容器构建路径——保住 slim 运行镜像,不靠放宽红线换构建成功\n\n`deploy/vm/Dockerfile` 的构建路径从未真正跑通过(并发治理会话只用 pnpm/turbo 跑门禁,\n从不 docker build)。而 check:vm-deploy 一直是绿的——它查 Dockerfile 的**结构**\n(每个 stage 用哪个 FROM、有没有 fat runtime),不查它**能不能构建出来**。\n于是棘轮报告写着「镜像瘦身非 root、可回滚、备份可恢复」✅,而那个镜像根本产不出来。\n\n5 处构建 bug:\n1. contracts 的 `prepare`(tsc) 在只有 manifest 的依赖层里跑,找不到 tsconfig/src → TS5058。\n 先 COPY contracts 的 tsconfig + src 给它当输入。\n2. 新 workspace 包 @repo/password-auth(两后端 runtime 依赖)未进 manifest COPY、\n 也没被显式 build。\n3. `pnpm deploy --prod --legacy`:pnpm 9.15.9 不认 `--legacy`(Unknown option)。\n 旧注释称「未开启 inject-workspace-packages 时需要 --legacy」——实测在本仓版本上\n 不成立,去掉即可正常打平 workspace 包(sharp 这类 lockfile 原生依赖也照常带出)。\n4. `pnpm deploy` 只按 lockfile 物化依赖,而 .prisma/client(含平台相关 query engine)\n 是 `prisma generate` **生成**的、不在任何 lockfile 里,永远不会被带出去 →\n 新增一步从 build 树复制。路径由 @prisma/client 的解析结果反推,不硬编码 pnpm store\n 的哈希目录名;且必须从 app 目录解析(workspace 根 node_modules 里没有它)。\n5. web stage `COPY apps/web/public` 失败——git 未跟踪任何 public 资产。\n ⚠️ 本机可能有个空的 public/(git 不跟踪空目录),docker build 读本地上下文因而能过,\n CI 与全新 clone 上必挂,注释已写明这个陷阱。\n\n**刻意不采用**此前 `dockerfile-vm-deploy-fixes-ec411c0.patch` 的策略(放弃 slim、\n运行镜像改 FROM build):那会撞 4 条门禁红线(runtime-from-base-* / no-fat-runtime-*),\n而实测 slim 路径的两个阻塞点(3、4)都可解,「镜像瘦身作为后续项不阻塞」的前提不成立。\n体积实测:api-nestjs 741MB / api-fastify 695MB / web 546MB,\n对照 fat 方案 8.46GB、2026-08-06 实际部署的 2.69GB。非 root 由镜像层 USER node 保证,\n而非仅靠 compose 的 user: 覆盖。\n\n顺带两处断链(均为 MinIO 进 compose 后没人跟上):\n- .env.example 与 vm:init 都不认识 S3_*,而它们是 compose 的必填变量 → 新机器\n `vm:init` 后 `vm:up` 必然卡在变量插值。已补占位符 + 随机生成 + 存量 .env 自愈。\n- .dockerignore 只写 `**/.next`,匹配不到本仓工具链自建的 distDir\n (.next-ui-* / .next-dev-* / .next-manual-*),也没排除 sites/(G26 那套独立\n Cloudflare 系统,其 .sites-runtime 本机 1.0GB)→ COPY . . 层 3.79GB → 270MB。\n\n证据(作用域=本地工作区):\n- docker build 四个 target 全部 EXIT=0(api-nestjs / api-fastify / web / migrate)\n- 镜像内实测 @prisma/client 与原生模块 sharp 均可加载、dist 入口就位、uid=1000 非 root\n- Dockerfile 里那条「Prisma Client 缺失即构建失败」的断言**首次真正执行并通过**\n- pnpm vm:config EXIT=0(7 个服务解析通过)\n- pnpm check 22 项全绿 exit=0\n\n未验证:未跑 vm:up / vm:smoke(整栈起停与真实写链冒烟),故不得宣称「可部署」。\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-17T06:57:55-07:00"}],"HeadCommit":{"Sha1":"125c54d328d3da221b5d91c0a2dd0475712c6e96","Message":"Merge pull request #12 from laoluojuhai/fix/vm-dockerfile-build-path\n\nfix(vm): 打通容器构建路径——保住 slim 运行镜像,不靠放宽红线换构建成功","AuthorEmail":"158980461+laoluojuhai@users.noreply.github.com","AuthorName":"laoluojuhai","CommitterEmail":"noreply@github.com","CommitterName":"GitHub","Timestamp":"2026-08-17T07:09:44-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/8ae98649e077fa188f8e9c1b0a11b78a2377c836...125c54d328d3da221b5d91c0a2dd0475712c6e96","Len":2}...
|
1786975808
|
Edit
Delete
|
|
23626
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"8ae98649e {"Commits":[{"Sha1":"8ae98649e077fa188f8e9c1b0a11b78a2377c836","Message":"Merge pull request #11 from laoluojuhai/feat/product-catalog-search-and-image-upload\n\nfeat(products): 商品库服务端搜索筛选 + 图片上传至对象存储","AuthorEmail":"158980461+laoluojuhai@users.noreply.github.com","AuthorName":"laoluojuhai","CommitterEmail":"noreply@github.com","CommitterName":"GitHub","Timestamp":"2026-08-17T04:16:44-07:00"},{"Sha1":"6a67a7abf58201b2b407aab3e500b463d3f08bc7","Message":"Merge branch 'feat/product-catalog-search-and-image-upload' of https://github.com/laoluojuhai/juhai-quotation-system into feat/product-catalog-search-and-image-upload\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-17T04:04:06-07:00"},{"Sha1":"874115874d1ce6a322367e0553a620a531ebdaf9","Message":"fix(e2e): 修两条潜伏五天的失效断言——\u0026\u0026 串行链把 UI 验收挡在门外\n\n上一条提交让 static governance 转绿后,CI 的 Runtime and UI acceptance 才**首次真正\n跑起来**(自 2026-08-06 起每轮都是 SKIPPED),当场暴露两条 E2E 失效断言。二者均由\n35ebc86(2026-08-12)改文案引入而断言没跟上,与本轮重构无关:\n\n① 侧栏入口叫「报价审核」,子页标题已改为「待我审核」——入口名与标题是两个口径,\n 不能因为同一个入口就复用同一个词。\n② 版本徽标由「版本 1」改为紧凑的「v1」(与版本中心的「V1」看齐)。\n 断言收紧为 /·\\s*v1\\s*·/:裸 `v1` 会被报价号或客户名里任何含 v1 的片段撞上,\n 会让断言以错误理由变绿,那恰恰是它该防的漂移。\n\nmodule-integration 的浏览器证据标记同步跟到**标题**而非入口名——写成入口名会被\nopenWorkspaceEntry(page, \"报价审核\") 白白喂饱,标记就不再证明任何事(负向实测:\n把 E2E 里该断言改掉即 exit=1 并命中 browser-name: \"待我审核\")。\n\n顺带删掉上一条提交遗留的死代码:权限判据已随创建卡下沉进 QuotationCreateCard,\nQuotationWorkbench 里的 userCan 不再有消费者,留着会让下一个人以为还有权限逻辑要接。\n\n三级门禁证据(作用域=本地工作区):\n- 静态 pnpm check:22 项全绿 exit=0,16 组负向自检有牙\n- check:runtime:548/548(地板 503;contracts 436 + NestJS 56 + Fastify 56)\n- check:ui:12/12 全绿\n\n教训已回灌 CLAUDE.md:串行 \u0026\u0026 门禁链报出的违规数是**下界不是总数**,\n本轮 CI 报「共 1 处违规」,实际是 4 处静态 + 2 处 E2E。\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-17T04:03:39-07:00"},{"Sha1":"c7d8d5944215315512254bb9a8f6cc2bd937c88f","Message":"Merge branch 'main' into feat/product-catalog-search-and-image-upload","AuthorEmail":"158980461+laoluojuhai@users.noreply.github.com","AuthorName":"laoluojuhai","CommitterEmail":"noreply@github.com","CommitterName":"GitHub","Timestamp":"2026-08-17T03:48:25-07:00"},{"Sha1":"3afb568a1d13a2ceeaf49a2a9bf1d8634f422c23","Message":"fix(gate): 版本中心断言重锚为结构式——距离窗口误杀且漏杀,顺带逼出报价域拆分\n\nPR #11 的 CI 红在 quotation-version-detail-visible。查证为**门禁误杀**:版本中心的\n快照详情一直正常渲染(浏览器实测展开 V1 可见「经济方案 ¥910,000.00 · 1 项明细」),\n只是行内补了 diff 段落与三段设计裁决注释后,两个锚点间距涨到 1309 字符、超过\n{0,500} 距离窗口(after-sales-order-options-hook 同型,本仓第二次踩)。\n\n断言重锚为否定环视 (?:(?!\u003c\\/details\u003e)[\\s\\S])*,语义由「两锚点挨得近」改为\n「快照摘要在版本行元素内部」。差分真值表显示旧写法 4 例错 2 例、两个方向都错:\n不仅误杀,还漏杀「快照挪到行外但离得近」——重锚顺手补上那个洞,并固化为\ncontract-integration.test.mjs 第 24b 条负向用例(实跑 exit=1 且命中预期断言 id)。\n\ncomponent-size 同轮逼出真拆分(门禁明说「先拆分而不是上调登记值」):\n- QuotationWorkbench 661→169:创建卡连同表单状态提为 QuotationCreateCard、\n 单档编辑器提为 QuotationOptionEditor、版本中心提为 QuotationVersionCenter\n- MobileOverview 473→413:报价经营四指标卡提为 OverviewQuoteMetrics\n全部抽为**同文件兄弟组件**——搬到独立文件会让按路径锚定的门禁锚点落空。\nQuotationCreateCard 刻意始终挂载、在 hooks 之后才 return null,保证候选查询的\n发起时机与重构前逐字一致(只搬行不改行为)。登记值同步下调/毕业锁住进步。\n\n⚠️ 抽 OverviewQuoteMetrics 时一度把三元中段当 JSX 搬走并用 \u003c\u003e 包裹,`) : (`\n降格为文本节点原样上屏,且两个分支同时渲染——给有权限的管理员显示「未向当前\n角色开放」。tsc 与 22 项静态门禁全绿,只有浏览器截图抓得到。已修并留档。\n\n证据(作用域=本地工作区):pnpm check 22 项全绿 exit=0、16 组负向自检有牙、\n浏览器实测总览/新建报价/版本中心三处渲染正常。未重跑 check:runtime / check:ui\n(两后端与 contracts 一行未动,那两级证据仍绑定上一轮 commit)。\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-17T03:47:39-07:00"}],"HeadCommit":{"Sha1":"8ae98649e077fa188f8e9c1b0a11b78a2377c836","Message":"Merge pull request #11 from laoluojuhai/feat/product-catalog-search-and-image-upload\n\nfeat(products): 商品库服务端搜索筛选 + 图片上传至对象存储","AuthorEmail":"158980461+laoluojuhai@users.noreply.github.com","AuthorName":"laoluojuhai","CommitterEmail":"noreply@github.com","CommitterName":"GitHub","Timestamp":"2026-08-17T04:16:44-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/7619cf79681794bf28a8dceeb606c9dcfec21a5c...8ae98649e077fa188f8e9c1b0a11b78a2377c836","Len":41}...
|
1786965499
|
Edit
Delete
|
|
23625
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/feat/product-catalog-search-and-image-u refs/heads/feat/product-catalog-search-and-image-upload...
|
0
|
{"Commits":[{"Sha1":"6a67a7abf {"Commits":[{"Sha1":"6a67a7abf58201b2b407aab3e500b463d3f08bc7","Message":"Merge branch 'feat/product-catalog-search-and-image-upload' of https://github.com/laoluojuhai/juhai-quotation-system into feat/product-catalog-search-and-image-upload\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-17T04:04:06-07:00"},{"Sha1":"c7d8d5944215315512254bb9a8f6cc2bd937c88f","Message":"Merge branch 'main' into feat/product-catalog-search-and-image-upload","AuthorEmail":"158980461+laoluojuhai@users.noreply.github.com","AuthorName":"laoluojuhai","CommitterEmail":"noreply@github.com","CommitterName":"GitHub","Timestamp":"2026-08-17T03:48:25-07:00"},{"Sha1":"e3fc771d3e1769a970dd0638d0ce694fae74a023","Message":"Merge pull request #8 from laoluojuhai/feat/g8-verified-auth\n\nfeat(g8): 已验签身份落地 + 业务闭环五切片 + 工作区卫生门禁","AuthorEmail":"158980461+laoluojuhai@users.noreply.github.com","AuthorName":"laoluojuhai","CommitterEmail":"noreply@github.com","CommitterName":"GitHub","Timestamp":"2026-08-02T19:06:51-07:00"}],"HeadCommit":{"Sha1":"6a67a7abf58201b2b407aab3e500b463d3f08bc7","Message":"Merge branch 'feat/product-catalog-search-and-image-upload' of https://github.com/laoluojuhai/juhai-quotation-system into feat/product-catalog-search-and-image-upload\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-17T04:04:06-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/874115874d1ce6a322367e0553a620a531ebdaf9...6a67a7abf58201b2b407aab3e500b463d3f08bc7","Len":3}...
|
1786964711
|
Edit
Delete
|
|
23624
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/feat/product-catalog-search-and-image-u refs/heads/feat/product-catalog-search-and-image-upload...
|
0
|
{"Commits":[{"Sha1":"874115874 {"Commits":[{"Sha1":"874115874d1ce6a322367e0553a620a531ebdaf9","Message":"fix(e2e): 修两条潜伏五天的失效断言——\u0026\u0026 串行链把 UI 验收挡在门外\n\n上一条提交让 static governance 转绿后,CI 的 Runtime and UI acceptance 才**首次真正\n跑起来**(自 2026-08-06 起每轮都是 SKIPPED),当场暴露两条 E2E 失效断言。二者均由\n35ebc86(2026-08-12)改文案引入而断言没跟上,与本轮重构无关:\n\n① 侧栏入口叫「报价审核」,子页标题已改为「待我审核」——入口名与标题是两个口径,\n 不能因为同一个入口就复用同一个词。\n② 版本徽标由「版本 1」改为紧凑的「v1」(与版本中心的「V1」看齐)。\n 断言收紧为 /·\\s*v1\\s*·/:裸 `v1` 会被报价号或客户名里任何含 v1 的片段撞上,\n 会让断言以错误理由变绿,那恰恰是它该防的漂移。\n\nmodule-integration 的浏览器证据标记同步跟到**标题**而非入口名——写成入口名会被\nopenWorkspaceEntry(page, \"报价审核\") 白白喂饱,标记就不再证明任何事(负向实测:\n把 E2E 里该断言改掉即 exit=1 并命中 browser-name: \"待我审核\")。\n\n顺带删掉上一条提交遗留的死代码:权限判据已随创建卡下沉进 QuotationCreateCard,\nQuotationWorkbench 里的 userCan 不再有消费者,留着会让下一个人以为还有权限逻辑要接。\n\n三级门禁证据(作用域=本地工作区):\n- 静态 pnpm check:22 项全绿 exit=0,16 组负向自检有牙\n- check:runtime:548/548(地板 503;contracts 436 + NestJS 56 + Fastify 56)\n- check:ui:12/12 全绿\n\n教训已回灌 CLAUDE.md:串行 \u0026\u0026 门禁链报出的违规数是**下界不是总数**,\n本轮 CI 报「共 1 处违规」,实际是 4 处静态 + 2 处 E2E。\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-17T04:03:39-07:00"}],"HeadCommit":{"Sha1":"874115874d1ce6a322367e0553a620a531ebdaf9","Message":"fix(e2e): 修两条潜伏五天的失效断言——\u0026\u0026 串行链把 UI 验收挡在门外\n\n上一条提交让 static governance 转绿后,CI 的 Runtime and UI acceptance 才**首次真正\n跑起来**(自 2026-08-06 起每轮都是 SKIPPED),当场暴露两条 E2E 失效断言。二者均由\n35ebc86(2026-08-12)改文案引入而断言没跟上,与本轮重构无关:\n\n① 侧栏入口叫「报价审核」,子页标题已改为「待我审核」——入口名与标题是两个口径,\n 不能因为同一个入口就复用同一个词。\n② 版本徽标由「版本 1」改为紧凑的「v1」(与版本中心的「V1」看齐)。\n 断言收紧为 /·\\s*v1\\s*·/:裸 `v1` 会被报价号或客户名里任何含 v1 的片段撞上,\n 会让断言以错误理由变绿,那恰恰是它该防的漂移。\n\nmodule-integration 的浏览器证据标记同步跟到**标题**而非入口名——写成入口名会被\nopenWorkspaceEntry(page, \"报价审核\") 白白喂饱,标记就不再证明任何事(负向实测:\n把 E2E 里该断言改掉即 exit=1 并命中 browser-name: \"待我审核\")。\n\n顺带删掉上一条提交遗留的死代码:权限判据已随创建卡下沉进 QuotationCreateCard,\nQuotationWorkbench 里的 userCan 不再有消费者,留着会让下一个人以为还有权限逻辑要接。\n\n三级门禁证据(作用域=本地工作区):\n- 静态 pnpm check:22 项全绿 exit=0,16 组负向自检有牙\n- check:runtime:548/548(地板 503;contracts 436 + NestJS 56 + Fastify 56)\n- check:ui:12/12 全绿\n\n教训已回灌 CLAUDE.md:串行 \u0026\u0026 门禁链报出的违规数是**下界不是总数**,\n本轮 CI 报「共 1 处违规」,实际是 4 处静态 + 2 处 E2E。\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-17T04:03:39-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/3afb568a1d13a2ceeaf49a2a9bf1d8634f422c23...874115874d1ce6a322367e0553a620a531ebdaf9","Len":1}...
|
1786964630
|
Edit
Delete
|
|
23623
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/feat/product-catalog-search-and-image-u refs/heads/feat/product-catalog-search-and-image-upload...
|
0
|
{"Commits":[{"Sha1":"3afb568a1 {"Commits":[{"Sha1":"3afb568a1d13a2ceeaf49a2a9bf1d8634f422c23","Message":"fix(gate): 版本中心断言重锚为结构式——距离窗口误杀且漏杀,顺带逼出报价域拆分\n\nPR #11 的 CI 红在 quotation-version-detail-visible。查证为**门禁误杀**:版本中心的\n快照详情一直正常渲染(浏览器实测展开 V1 可见「经济方案 ¥910,000.00 · 1 项明细」),\n只是行内补了 diff 段落与三段设计裁决注释后,两个锚点间距涨到 1309 字符、超过\n{0,500} 距离窗口(after-sales-order-options-hook 同型,本仓第二次踩)。\n\n断言重锚为否定环视 (?:(?!\u003c\\/details\u003e)[\\s\\S])*,语义由「两锚点挨得近」改为\n「快照摘要在版本行元素内部」。差分真值表显示旧写法 4 例错 2 例、两个方向都错:\n不仅误杀,还漏杀「快照挪到行外但离得近」——重锚顺手补上那个洞,并固化为\ncontract-integration.test.mjs 第 24b 条负向用例(实跑 exit=1 且命中预期断言 id)。\n\ncomponent-size 同轮逼出真拆分(门禁明说「先拆分而不是上调登记值」):\n- QuotationWorkbench 661→169:创建卡连同表单状态提为 QuotationCreateCard、\n 单档编辑器提为 QuotationOptionEditor、版本中心提为 QuotationVersionCenter\n- MobileOverview 473→413:报价经营四指标卡提为 OverviewQuoteMetrics\n全部抽为**同文件兄弟组件**——搬到独立文件会让按路径锚定的门禁锚点落空。\nQuotationCreateCard 刻意始终挂载、在 hooks 之后才 return null,保证候选查询的\n发起时机与重构前逐字一致(只搬行不改行为)。登记值同步下调/毕业锁住进步。\n\n⚠️ 抽 OverviewQuoteMetrics 时一度把三元中段当 JSX 搬走并用 \u003c\u003e 包裹,`) : (`\n降格为文本节点原样上屏,且两个分支同时渲染——给有权限的管理员显示「未向当前\n角色开放」。tsc 与 22 项静态门禁全绿,只有浏览器截图抓得到。已修并留档。\n\n证据(作用域=本地工作区):pnpm check 22 项全绿 exit=0、16 组负向自检有牙、\n浏览器实测总览/新建报价/版本中心三处渲染正常。未重跑 check:runtime / check:ui\n(两后端与 contracts 一行未动,那两级证据仍绑定上一轮 commit)。\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-17T03:47:39-07:00"}],"HeadCommit":{"Sha1":"3afb568a1d13a2ceeaf49a2a9bf1d8634f422c23","Message":"fix(gate): 版本中心断言重锚为结构式——距离窗口误杀且漏杀,顺带逼出报价域拆分\n\nPR #11 的 CI 红在 quotation-version-detail-visible。查证为**门禁误杀**:版本中心的\n快照详情一直正常渲染(浏览器实测展开 V1 可见「经济方案 ¥910,000.00 · 1 项明细」),\n只是行内补了 diff 段落与三段设计裁决注释后,两个锚点间距涨到 1309 字符、超过\n{0,500} 距离窗口(after-sales-order-options-hook 同型,本仓第二次踩)。\n\n断言重锚为否定环视 (?:(?!\u003c\\/details\u003e)[\\s\\S])*,语义由「两锚点挨得近」改为\n「快照摘要在版本行元素内部」。差分真值表显示旧写法 4 例错 2 例、两个方向都错:\n不仅误杀,还漏杀「快照挪到行外但离得近」——重锚顺手补上那个洞,并固化为\ncontract-integration.test.mjs 第 24b 条负向用例(实跑 exit=1 且命中预期断言 id)。\n\ncomponent-size 同轮逼出真拆分(门禁明说「先拆分而不是上调登记值」):\n- QuotationWorkbench 661→169:创建卡连同表单状态提为 QuotationCreateCard、\n 单档编辑器提为 QuotationOptionEditor、版本中心提为 QuotationVersionCenter\n- MobileOverview 473→413:报价经营四指标卡提为 OverviewQuoteMetrics\n全部抽为**同文件兄弟组件**——搬到独立文件会让按路径锚定的门禁锚点落空。\nQuotationCreateCard 刻意始终挂载、在 hooks 之后才 return null,保证候选查询的\n发起时机与重构前逐字一致(只搬行不改行为)。登记值同步下调/毕业锁住进步。\n\n⚠️ 抽 OverviewQuoteMetrics 时一度把三元中段当 JSX 搬走并用 \u003c\u003e 包裹,`) : (`\n降格为文本节点原样上屏,且两个分支同时渲染——给有权限的管理员显示「未向当前\n角色开放」。tsc 与 22 项静态门禁全绿,只有浏览器截图抓得到。已修并留档。\n\n证据(作用域=本地工作区):pnpm check 22 项全绿 exit=0、16 组负向自检有牙、\n浏览器实测总览/新建报价/版本中心三处渲染正常。未重跑 check:runtime / check:ui\n(两后端与 contracts 一行未动,那两级证据仍绑定上一轮 commit)。\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-17T03:47:39-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/6e260f9edb613a60434dd3c0b38c78068c346022...3afb568a1d13a2ceeaf49a2a9bf1d8634f422c23","Len":1}...
|
1786963673
|
Edit
Delete
|
|
22536
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/feat/product-catalog-search-and-image-u refs/heads/feat/product-catalog-search-and-image-upload...
|
0
|
{"Commits":[{"Sha1":"6e260f9ed {"Commits":[{"Sha1":"6e260f9edb613a60434dd3c0b38c78068c346022","Message":"feat(ui): 交互审计全项收口——成功回执、状态机中文报错、子页交互三缺口\n\n同日两轮,基线 2c0409a 干净树,全部改动可干净归属。\n\n轮一(审计项 3/4):\n- 成功回执:保存方案/收款登记/确认到账/发送报价四处 mutation 补 toast\n (按售后成例「结果 + 下一站归谁」;收款文案显式说清「登记≠到账,\n 确认后才解锁发货门禁」的三责分离)。ToastProvider 早已挂载,\n 此前 81 个 mutation 只有售后 1 个消费者。\n- 双后端 24 处状态机报错去英文枚举:`状态 ${STATE} 不允许执行 ${event}`\n → `…当前状态为「中文标签」,不支持该操作`(9 通用 + 3 动作变体 ×2 后端,\n 文案逐字一致);消费 contracts 既有 *_STATE_LABELS——错误路径此前从未用过它们,\n 与 error-messages.ts 的发现同构。内部事件动词不外泄(标注 21);\n code/state/allowed 结构字段原样保留,前端零影响。\n\n轮二(子页交互审计 P1-P3;shell 骨架已把 08-04 诊断 §2.7 实质关闭,本轮修行为缺口):\n- P1 履约 Orders 六 mode 同实例:page/搜索词/状态筛选/选中补 [mode] 重置,\n 镜像售后纪律;「切队列不换单」由 selectedOrderId ?? focusId 回退结构保住。\n- P2 售后流水线胶囊接 AfterSalesSummary.byState 出每段积压数\n (共用 query cache;徽标 aria-hidden,0 不渲染)。\n- P3 新建 WorkspaceMain:main landmark + aria-label=入口名 + tabIndex=-1,\n 子页切换后焦点移入播报并滚回顶部;首帧不抢焦点;带 focusId 的跳转不滚顶\n (报价卡自滚,父效应后跑会砸掉它——标注 16)。\n Home 借道 activeEntry 单查找瘦身回 399/400,下一个动 Home 的必须先拆分。\n\n证据(2026-08-13 本地,详见 CLAUDE.md 动态区两条新记录):\ncheck:runtime 全量 548 用例绿(地板 503,分包 436/56/56,全新库 gov25);\n三端 typecheck / web lint / design-tokens / dual-backend / workspace-hygiene 绿;\n真实 Chromium 全新库(ui19)「商品客户」「客户方案闭环」两章全绿;\n浏览器实测:保存方案 toast 落 aria-live、409 新文案「方案当前状态为「可设计」…」、\n物流搜索词切队列后清空、切维修复检焦点落 main 且 scrollY 600→0、\n流水线徽标计数与真数据一致。module-integration/component-size 仍剩的红\n均属报价版本中心在途战役(quotation-version-detail-visible + 3 处体积),非本轮引入。\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-13T08:00:31-07:00"}],"HeadCommit":{"Sha1":"6e260f9edb613a60434dd3c0b38c78068c346022","Message":"feat(ui): 交互审计全项收口——成功回执、状态机中文报错、子页交互三缺口\n\n同日两轮,基线 2c0409a 干净树,全部改动可干净归属。\n\n轮一(审计项 3/4):\n- 成功回执:保存方案/收款登记/确认到账/发送报价四处 mutation 补 toast\n (按售后成例「结果 + 下一站归谁」;收款文案显式说清「登记≠到账,\n 确认后才解锁发货门禁」的三责分离)。ToastProvider 早已挂载,\n 此前 81 个 mutation 只有售后 1 个消费者。\n- 双后端 24 处状态机报错去英文枚举:`状态 ${STATE} 不允许执行 ${event}`\n → `…当前状态为「中文标签」,不支持该操作`(9 通用 + 3 动作变体 ×2 后端,\n 文案逐字一致);消费 contracts 既有 *_STATE_LABELS——错误路径此前从未用过它们,\n 与 error-messages.ts 的发现同构。内部事件动词不外泄(标注 21);\n code/state/allowed 结构字段原样保留,前端零影响。\n\n轮二(子页交互审计 P1-P3;shell 骨架已把 08-04 诊断 §2.7 实质关闭,本轮修行为缺口):\n- P1 履约 Orders 六 mode 同实例:page/搜索词/状态筛选/选中补 [mode] 重置,\n 镜像售后纪律;「切队列不换单」由 selectedOrderId ?? focusId 回退结构保住。\n- P2 售后流水线胶囊接 AfterSalesSummary.byState 出每段积压数\n (共用 query cache;徽标 aria-hidden,0 不渲染)。\n- P3 新建 WorkspaceMain:main landmark + aria-label=入口名 + tabIndex=-1,\n 子页切换后焦点移入播报并滚回顶部;首帧不抢焦点;带 focusId 的跳转不滚顶\n (报价卡自滚,父效应后跑会砸掉它——标注 16)。\n Home 借道 activeEntry 单查找瘦身回 399/400,下一个动 Home 的必须先拆分。\n\n证据(2026-08-13 本地,详见 CLAUDE.md 动态区两条新记录):\ncheck:runtime 全量 548 用例绿(地板 503,分包 436/56/56,全新库 gov25);\n三端 typecheck / web lint / design-tokens / dual-backend / workspace-hygiene 绿;\n真实 Chromium 全新库(ui19)「商品客户」「客户方案闭环」两章全绿;\n浏览器实测:保存方案 toast 落 aria-live、409 新文案「方案当前状态为「可设计」…」、\n物流搜索词切队列后清空、切维修复检焦点落 main 且 scrollY 600→0、\n流水线徽标计数与真数据一致。module-integration/component-size 仍剩的红\n均属报价版本中心在途战役(quotation-version-detail-visible + 3 处体积),非本轮引入。\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-13T08:00:31-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/2c0409a3cbd22aaba6d36a123d8ba9bea5711059...6e260f9edb613a60434dd3c0b38c78068c346022","Len":1}...
|
1786633238
|
Edit
Delete
|
|
22302
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/feat/product-catalog-search-and-image-u refs/heads/feat/product-catalog-search-and-image-upload...
|
0
|
{"Commits":[{"Sha1":"2c0409a3c {"Commits":[{"Sha1":"2c0409a3cbd22aaba6d36a123d8ba9bea5711059","Message":"chore(dev): dev 端口防跨仓劫持——API 迁 13099、web 改 autoPort\n\n实锤:本机多仓并发会话互抢 3xxx 段端口,3098 被他仓 Next 占、3099 被\n「图像生成」的 fastify 占——后者 /api/health 报文与本仓逐字同构\n(fastify + database/redis up),探活全绿而业务路由全 404,页面表现为\n「Route GET:/api/solutions not found」(G15「端口通≠基座对」的跨仓变体)。\n\n- api-fastify:固定端口 3099 → 13099,迁出拥挤段;\n- web:去掉写死的 -p 3098,改 autoPort(next dev 吃 PORT env),\n API_PROXY_TARGET / NEXT_PUBLIC_WS_URL 同步指向 13099。\n判断「端口上是不是本仓服务」以后要打带 token 的业务路由,不能只看 health。\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-12T23:35:20-07:00"}],"HeadCommit":{"Sha1":"2c0409a3cbd22aaba6d36a123d8ba9bea5711059","Message":"chore(dev): dev 端口防跨仓劫持——API 迁 13099、web 改 autoPort\n\n实锤:本机多仓并发会话互抢 3xxx 段端口,3098 被他仓 Next 占、3099 被\n「图像生成」的 fastify 占——后者 /api/health 报文与本仓逐字同构\n(fastify + database/redis up),探活全绿而业务路由全 404,页面表现为\n「Route GET:/api/solutions not found」(G15「端口通≠基座对」的跨仓变体)。\n\n- api-fastify:固定端口 3099 → 13099,迁出拥挤段;\n- web:去掉写死的 -p 3098,改 autoPort(next dev 吃 PORT env),\n API_PROXY_TARGET / NEXT_PUBLIC_WS_URL 同步指向 13099。\n判断「端口上是不是本仓服务」以后要打带 token 的业务路由,不能只看 health。\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-12T23:35:20-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/35ebc8613b168219ce82c0b3cf9336d32e958821...2c0409a3cbd22aaba6d36a123d8ba9bea5711059","Len":1}...
|
1786602927
|
Edit
Delete
|
|
22301
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/feat/product-catalog-search-and-image-u refs/heads/feat/product-catalog-search-and-image-upload...
|
0
|
{"Commits":[{"Sha1":"35ebc8613 {"Commits":[{"Sha1":"35ebc8613b168219ce82c0b3cf9336d32e958821","Message":"feat(ui): 方案商品多选批量添加 + 交互模式采纳率收口(全量落盘,含并发在途批次)\n\n整棵混合工作区的全量提交:多个战役共树、文件内手笔交错,无法按文件拆分归属,\n经用户裁决全量提交推送;已知红盘如实列出,等对应战役收口后 CI 自然转绿。\n\n本轮两个战役(已验证):\n- 方案设计三档选品改多选批量:新增 TierProductPicker(checkbox 候选 + 分类/关键词\n 收窄 + 待添加纸片跨筛选常驻 + 已添加禁勾),SolutionDesigner 416→252 行并从\n component-size 棘轮毕业;E2E 方案章改写为「勾 2 件一次落 2 行」的多选证明。\n- 交互模式采纳率收口:裸 {x.error.message} 29→1(统一走 ErrorAlert/QueryErrorState,\n receivables 本地 ErrorText 裸实现改包装、13 调用点一次收口,消掉 text-red-600 与\n 「操作失败,请重试」兜底);裸 disabled={isPending} 59→31(单动作按钮换 Button\n loading 保焦点带 aria-busy;行共享 mutation/批准驳回对/兄弟禁用具名保留);\n check:design-tokens 新增 designTokenRawErrorMessage=1 / designTokenBareIsPendingDisable=31\n 两条采纳率棘轮(计数单源 scripts/lib/design-adoption.mjs),design-adoption.test.mjs\n 13 例负向自检进 gate-selftest,活体注入实跑 exit=1 判红后恢复。\n\n同树落盘的并发/前序批次(未逐一复验,以各自战役记录为准):\n- 报价版本中心(进行中,已知红:module-integration 的 quotation-version-detail-visible\n + component-size 3 处【MobileOverview 473\u003e430、QuotationCard 437、QuotationWorkbench\n 665\u003e566】+ gate-selftest 基线用例如实继承)\n- 事件业务编号按域推广、售后/方案后端切片、设计稿真源目录与 08-07 迁移目录等\n\n证据(本地混合工作区,2026-08-13,详见 CLAUDE.md 动态区新条目):\ntypecheck / lint / design-tokens / role-permissions / naming / schema / validation /\ncontract-consumers / governance-docs / workspace-hygiene 绿;真实 Chromium 定向验收\n「商品客户」「客户方案闭环」两章通过(全新库 ui18);「报价闭环」红属版本中心在途,\n「履约闭环」被串行阻断——fulfillment/receivables 的 loading 换写暂只有 typecheck+lint\n级证据,全量 check:ui 复跑时重点看这两章。\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-12T23:22:47-07:00"},{"Sha1":"0b2e3703fed8f72749a8dc1824848d0601f1c9ea","Message":"docs(governance): 回灌远端 CI 证据——run 31072021158 @ ac22869 全绿\n\n作用域是**这个提交与这条分支**,不是 main(main 仍落后 21 个提交)。\nstatic ✅ / runtime 497 用例(contracts 395 + 双端各 51)/ UI 12 用例,\nCI 侧真起 MinIO 跑上传写链。\n\n同时记下两次实测判红的插曲:check:runtime 加了 S3 preflight 却没同步 CI 环境;\nMinIO 放进 services: 起不来(Actions 的 service 容器没有传 command 的字段)。\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-05T21:52:52-07:00"},{"Sha1":"ac228691be9468a1345b4f3669a7c5aa0ca86bef","Message":"ci: MinIO 改用显式 step 启动——services 传不了启动参数\n\n上一提交把 MinIO 放进 `services:`,CI 实测判红:\n「Failed to initialize container minio/minio:latest」。\n\n根因:Actions 的 service 容器只支持 image/env/ports/options/credentials/volumes,\n**没有传 command/args 的字段**;而 minio 镜像的 entrypoint 需要 `server /data`。\n不带参数时它打印 usage 后正常退出,于是健康检查永远 unhealthy。\n\n改为在 runtime job 里显式 `docker run -d ... server /data` 并轮询\n/minio/health/live。步骤跑在 runner 宿主机上,端口映射到 127.0.0.1:9000,\n与 S3_ENDPOINT 一致。\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-05T21:42:48-07:00"},{"Sha1":"6a2a86ba23719de7baa4940fb278b2df8b72b95e","Message":"ci: 补 MinIO 服务与 S3 环境——check:runtime 现在硬要求对象存储\n\n上一提交给 check:runtime / check:ui 的 preflight 加了 S3_ENDPOINT / S3_BUCKET\n强制显式传参与桶名归属守卫(G15 同型:本机与 CI 都可能共用对象存储,\n静默写进别人的桶就是拿别仓存储当验收基座)。\n\nCI 只起了 postgres + redis,因此上一提交推上去会在 preflight 处直接判红——\n这不是回归,是我加了硬要求却没同步跑它的环境。\n\n桶名用 juhai-quotation-ci(须匹配 juhai-quotation* 前缀守卫)。\n健康检查用 /minio/health/live:容器镜像里没有 mc 客户端,`mc ready` 不可用。\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-05T21:38:10-07:00"},{"Sha1":"8feb39921ea8a404b09e287154f4c6fd1f7bd3e3","Message":"feat(products): 商品库服务端搜索筛选 + 图片上传至对象存储\n\n## 一、服务端搜索与筛选(此前 115 个商品只能翻页找)\n\n商品列表新增 keyword / kind 两个过滤维度,与既有 active 一并落 DB where。\n谓词收进 contracts `buildProductListFilter` 单源,两后端各自\n`{ tenantId, ...buildProductListFilter(query) }`——行为对等由结构保证,\n任一侧自己拼 where 就会搜出不同结果而无红盘(G17 漂移形态)。\n\n- 关键词语义(SKU + 名称双列 contains、大小写不敏感、不含 description)\n 单独抽 `buildProductKeywordFilter`,换口径只改这一个函数。\n- 空串/纯空白在契约层归一为 undefined(C24 同型:清空搜索框最易发出空串),\n 前端另在 api 层直接不发该参数——双层防御。\n- tenantId 刻意不由该函数产出:租户隔离不能依赖一个可被调用方忘记展开的返回值。\n\n页面同步重构:录入表单默认收起、卡片压缩、展开管理时横跨整行、分页条下移、\n空态区分「筛选无结果」与「库里没商品」、成本 ¥0 改显「成本未录入」\n(导入时成本列整列为空是已知缺口,直显 ¥0.00 会被读成毛利 100%)。\n配件行由固定列宽改 flex-wrap + 最小宽度:视口断点用在 1/3 视口宽的卡片里\n是容器语境错配,断点满足了容器并没有变宽。\n\nProductLibrary 443 → 183 行,拆出 5 个子组件并从 component-size 债务登记毕业。\n\n## 二、图片上传至对象存储(此前只能粘贴外链 URL)\n\nMinIO 进 compose,两后端走 S3 SDK——换阿里云 OSS / 腾讯云 COS 只改 endpoint\n与凭证,写链代码不动。上传链:multipart → 按真实字节魔数判类型 → sharp 转\nWebP + 缩略图 → 写对象存储 → 落库(与 outbox 同 tx)。\n\n- 类型判定收进 contracts,连判定顺序也收:Content-Type 与扩展名都是攻击者\n 可控输入;顺序决定 0 字节文件报「没收到文件」还是「类型不支持」。\n 不收 SVG(可执行文档,直出即存储型 XSS)与 GIF。\n- S3 写入必须先于落库且在事务外:先落库则上传失败留下指向空对象的行(破图),\n 先上传则落库失败只留下无人引用的对象(垃圾,可清理)。代价不对称。\n- 公开回读 /api/files/:tenantId/:imageId/:variant 不鉴权(对客报价页没有内部\n 身份),路径穿越由 schema 校验后重建 key 结构性排除,非法参数回 404 不回 400。\n- DB 存相对路径而非对象存储绝对地址:换存储那天不必迁移存量 URL。\n- backup/restore 成对覆盖 minio 卷:只备份 Postgres 时恢复演练照常报绿,\n 但每行 ProductImage 都指向不存在的对象。卷名问 Docker 要而不是按\n 「项目名_卷名」拼——拼错会备份一个空卷而命令成功。\n\n## 三、修复与门禁\n\n- 修 `after-sales-order-options-hook` 在 HEAD 上的存量误杀(C29 修复插入\n ~700 字符把距离顶到 1749,撑破 1600 窗口,接线本身完好)。\n- 三条断言随组件拆分重新锚定(成本可见性/公开配件/配件确认框/元→分转换)。\n- 新增 6 条上传链断言;其中 2 条初版无牙被负向测试当场抓出并重写:\n 距离型顺序断言不测顺序、`id: imageId` 锚点在 removeImage 里不唯一(G13 同型)。\n 窗口取值均由实测距离确定,不拍脑袋。\n- DIVERGENCE_CEILINGS.products 142→152 属扩容非放水:同轮 PARITY_FLOORS.products\n 74.1→76.9(实测 77.4 高于校准时 74.6),只放松绝对判据是净削弱。\n- turbo globalEnv 补 S3_* 六项(不补则测试进程拿不到凭证,表现为 500)。\n\n## 证据(作用域=本地工作区)\n\n- pnpm check:21 项全绿;负向注入 40 → 44 条\n- check:runtime:497/497(contracts 395 + 双端各 51),真上传打真 MinIO,地板已收紧\n- check:ui:12/12,上传段断言 naturalWidth \u003e 0(src 有值只证明存了个字符串)\n\n尚未核验远端 CI。\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-05T21:35:24-07:00"}],"HeadCommit":{"Sha1":"35ebc8613b168219ce82c0b3cf9336d32e958821","Message":"feat(ui): 方案商品多选批量添加 + 交互模式采纳率收口(全量落盘,含并发在途批次)\n\n整棵混合工作区的全量提交:多个战役共树、文件内手笔交错,无法按文件拆分归属,\n经用户裁决全量提交推送;已知红盘如实列出,等对应战役收口后 CI 自然转绿。\n\n本轮两个战役(已验证):\n- 方案设计三档选品改多选批量:新增 TierProductPicker(checkbox 候选 + 分类/关键词\n 收窄 + 待添加纸片跨筛选常驻 + 已添加禁勾),SolutionDesigner 416→252 行并从\n component-size 棘轮毕业;E2E 方案章改写为「勾 2 件一次落 2 行」的多选证明。\n- 交互模式采纳率收口:裸 {x.error.message} 29→1(统一走 ErrorAlert/QueryErrorState,\n receivables 本地 ErrorText 裸实现改包装、13 调用点一次收口,消掉 text-red-600 与\n 「操作失败,请重试」兜底);裸 disabled={isPending} 59→31(单动作按钮换 Button\n loading 保焦点带 aria-busy;行共享 mutation/批准驳回对/兄弟禁用具名保留);\n check:design-tokens 新增 designTokenRawErrorMessage=1 / designTokenBareIsPendingDisable=31\n 两条采纳率棘轮(计数单源 scripts/lib/design-adoption.mjs),design-adoption.test.mjs\n 13 例负向自检进 gate-selftest,活体注入实跑 exit=1 判红后恢复。\n\n同树落盘的并发/前序批次(未逐一复验,以各自战役记录为准):\n- 报价版本中心(进行中,已知红:module-integration 的 quotation-version-detail-visible\n + component-size 3 处【MobileOverview 473\u003e430、QuotationCard 437、QuotationWorkbench\n 665\u003e566】+ gate-selftest 基线用例如实继承)\n- 事件业务编号按域推广、售后/方案后端切片、设计稿真源目录与 08-07 迁移目录等\n\n证据(本地混合工作区,2026-08-13,详见 CLAUDE.md 动态区新条目):\ntypecheck / lint / design-tokens / role-permissions / naming / schema / validation /\ncontract-consumers / governance-docs / workspace-hygiene 绿;真实 Chromium 定向验收\n「商品客户」「客户方案闭环」两章通过(全新库 ui18);「报价闭环」红属版本中心在途,\n「履约闭环」被串行阻断——fulfillment/receivables 的 loading 换写暂只有 typecheck+lint\n级证据,全量 check:ui 复跑时重点看这两章。\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-12T23:22:47-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/be1e0734c39315b61a7bf452231a853f44866085...35ebc8613b168219ce82c0b3cf9336d32e958821","Len":5}...
|
1786602303
|
Edit
Delete
|
|
22300
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/feat/product-catalog-search-and-image-u refs/heads/feat/product-catalog-search-and-image-upload...
|
0
|
|
1786602303
|
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
|
|
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
|
|
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
|
|
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
|
|
20880
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/feat/multi-role-assignment
|
0
|
{"Commits":[{"Sha1":"d6b659343 {"Commits":[{"Sha1":"d6b659343565a590d5c9d75adecc62710643a553","Message":"feat(web): 工作台 UI 改版 + 采购/客服权限补齐 + 订单收款列摘要\n\n前端工作台按侧栏 6 组流水线重组导航,新增 WorkspaceViewSwitcher / AfterSalesPipeline\n与 Drawer/Breadcrumb/Segmented/Toast/ErrorAlert 原语;收款面板从 964 行拆抽屉编排并\n从 component-size 登记表毕业;设计令牌换画布 #e9e9e3 并加深 muted/brand-strong 回 AA。\n\n契约与后端:\n- contracts 新增 formatCents 单源,收口前端 4 份 money 实现与后端错误文案的金额漂移\n- SalesOrderView.shipmentGate 可选字段:订单列表「收款」列摘要,与发运门禁共用\n evaluateShipmentPaymentGate + toGateInstallments 投影,现算不落汇总列\n- ROLE_PERMISSION_MAP 补 PROCUREMENT/CUSTOMER_SERVICE 只读集合(product.read /\n customer.read / fulfillment.order.read),不含写权限与敏感成本列\n\n验收(当前工作区,2026-08-05):\n- pnpm check 全绿(typecheck 强制重跑 Cached:0/7)\n- check:runtime 470/470(contracts 372 / NestJS 49 / Fastify 49),含 shipmentGate 三态\n- check:ui 12/12\n- 对抗探测:鉴权无回退/跨租户404/自批403/状态机409/并发恰好一次 均实测有牙\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-05T11:17:13-07:00"},{"Sha1":"ec411c0e6fb0c5cbcebb686f67b01cb355c29665","Message":"docs(analysis): 前端 UI 诊断报告 2026-08-04(并发治理会话产出)\n\n29 入口/84 组件/42 useQuery/81 useMutation 只读走查:流程断裂(仅 1 个跨域跳转)、\n反馈缺位(81 个 mutation 零成功提示)、重复实现(money 格式化 4 份)三条问题线,\n含 1 个多角色待办入口丢失的真 bug 与文末 Top5 修复建议。\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-04T09:20:22-07:00"}],"HeadCommit":{"Sha1":"d6b659343565a590d5c9d75adecc62710643a553","Message":"feat(web): 工作台 UI 改版 + 采购/客服权限补齐 + 订单收款列摘要\n\n前端工作台按侧栏 6 组流水线重组导航,新增 WorkspaceViewSwitcher / AfterSalesPipeline\n与 Drawer/Breadcrumb/Segmented/Toast/ErrorAlert 原语;收款面板从 964 行拆抽屉编排并\n从 component-size 登记表毕业;设计令牌换画布 #e9e9e3 并加深 muted/brand-strong 回 AA。\n\n契约与后端:\n- contracts 新增 formatCents 单源,收口前端 4 份 money 实现与后端错误文案的金额漂移\n- SalesOrderView.shipmentGate 可选字段:订单列表「收款」列摘要,与发运门禁共用\n evaluateShipmentPaymentGate + toGateInstallments 投影,现算不落汇总列\n- ROLE_PERMISSION_MAP 补 PROCUREMENT/CUSTOMER_SERVICE 只读集合(product.read /\n customer.read / fulfillment.order.read),不含写权限与敏感成本列\n\n验收(当前工作区,2026-08-05):\n- pnpm check 全绿(typecheck 强制重跑 Cached:0/7)\n- check:runtime 470/470(contracts 372 / NestJS 49 / Fastify 49),含 shipmentGate 三态\n- check:ui 12/12\n- 对抗探测:鉴权无回退/跨租户404/自批403/状态机409/并发恰好一次 均实测有牙\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-05T11:17:13-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/3ab4474b6c62c031d9016986285fed531904c82c...d6b659343565a590d5c9d75adecc62710643a553","Len":2}...
|
1785953861
|
Edit
Delete
|
|
20661
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/feat/multi-role-assignment
|
0
|
{"Commits":[{"Sha1":"3ab4474b6 {"Commits":[{"Sha1":"3ab4474b6c62c031d9016986285fed531904c82c","Message":"chore(governance): REDIS_URL 运行时 fail-closed 绊网与报告聚合接线(并发治理会话收尾)\n\nN6:G15 只在 runner preflight 强制显式 REDIS_URL,应用运行时仍会静默默认\nlocalhost:6379——队列投空、pub/sub 静默丢事件且零日志。四个连接位点\n(双后端 BullMQ + pub/sub)全部接入 fail-closed 判定,governance-report 聚合随之扩展。\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-04T06:57:12-07:00"},{"Sha1":"a82bc613d079d5b14ccdc66d2b901d99d980403f","Message":"chore(governance): 刷新证据行与棘轮——tests 470、own-test-cases 332、UI 12 含死路恢复链\n\n- CLAUDE.md 真源地图新增「履约死路恢复」条目;G16 条目按事务级咨询锁机制修正\n (含连接池滞留 bug 的完整教训与绊网口径)\n- 动态区证据行:静态/runtime/UI 三级 2026-08-04 实跑全绿,作用域=本地工作区\n- 棘轮收紧:testsPassed 465→470(byPackage 372/49/49)、ownTestCases 327→332、\n gateSelftests 8→14\n- reports/*.latest.json 为终链同 run 产物(provenance 一致)\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-04T06:56:25-07:00"},{"Sha1":"68fe619dbf7752a2bdd058e16fa81fa13653e323","Message":"chore(governance): 新增 sites/component-size 门禁、Redis fail-closed 与依赖范围对齐(并发治理会话)\n\n- check:sites-governance / check:component-size 两个新门禁接入 check 链(含负向自检)\n- Redis URL fail-closed 与队列前缀模块收口\n- 双后端依赖范围从 ^X.0.0 对齐到实际锁定版本邻域(N7 断言配套)\n- pnpm-lock.yaml 同步 specifier(仅 5 行,锁定版本零变化)——不同步则干净\n checkout 上 frozen install 直接 ERR_PNPM_OUTDATED_LOCKFILE\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-04T06:56:01-07:00"},{"Sha1":"4b637592aa9a1af503cbc7bf02e9e7fafa166f49","Message":"style(web): 移动导航搜索与首页视觉打磨(并发治理会话工作,随本轮一并落库)\n\n移动端「更多」菜单搜索、退款入口定位与首页布局打磨及配套 E2E 断言。\n本切片由并发治理会话实现并已随本轮三级门禁(check / runtime 470 / UI 12)整体验证。\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-04T06:56:01-07:00"},{"Sha1":"da3230ece27359e62fd0945dd9d74a79f04fef83","Message":"fix(events): outbox 选主改事务级咨询锁——会话级锁在连接池上滞留导致投递饿死\n\nG16 领取锁闭环(初版为并发治理会话实现,本提交含其 dispatcher 失败判责拆分与\ndual-backend N7 依赖断言,一并落库)。当日实锤修正:\n\n会话级 pg_try_advisory_lock + pg_advisory_unlock 各发一条 $queryRaw——Prisma 是\n连接池,加锁与解锁大概率落在不同池化连接:锁被闲置连接永久滞留,集群投递静默\n饿死。欺骗性极强:低并发 vitest 全绿(池内单连接复用),check:ui 高并发下三连红\n且失败点漂移(前几步实时刷新正常、后面某步等失效超时)。\n\n改为事务级 pg_try_advisory_xact_lock:在 $transaction 事务客户端上取锁,提交/回滚\n自动释放,「解锁落错连接」结构上不可达;锁查询失败=事务抛错=本轮不跑批\n(fail-closed 不变)。事务只为持锁而存在,批内行更新仍走连接池。\n\n绊网同步翻转:xact 锁在位/事务客户端取锁/锁结果闸住跑批/会话级回潮即红/失败阶段\n判责/双端锁键对齐;定位锚用调用形态而非裸词(防注释锁名抢占第一处匹配,G13 同型)。\n12 条负向自检全绿,check:ui 12/12 复绿实证实时链恢复。\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-04T06:55:43-07:00"}],"HeadCommit":{"Sha1":"3ab4474b6c62c031d9016986285fed531904c82c","Message":"chore(governance): REDIS_URL 运行时 fail-closed 绊网与报告聚合接线(并发治理会话收尾)\n\nN6:G15 只在 runner preflight 强制显式 REDIS_URL,应用运行时仍会静默默认\nlocalhost:6379——队列投空、pub/sub 静默丢事件且零日志。四个连接位点\n(双后端 BullMQ + pub/sub)全部接入 fail-closed 判定,governance-report 聚合随之扩展。\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-04T06:57:12-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/dddca39245dbd8ff6caea7a87c7e48de227e2daa...3ab4474b6c62c031d9016986285fed531904c82c","Len":6}...
|
1785852216
|
Edit
Delete
|
|
20660
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/feat/multi-role-assignment
|
0
|
{"Commits":[{"Sha1":"dddca3924 {"Commits":[{"Sha1":"dddca39245dbd8ff6caea7a87c7e48de227e2daa","Message":"Enforce after-sales lifecycle gates and approval inbox integration\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-04T04:24:41-07:00"},{"Sha1":"c3ea882a2a67fdb7799a39b0d69278e7de50124b","Message":"feat: complete governed business lifecycle\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-03T20:59:05-07:00"}],"HeadCommit":{"Sha1":"dddca39245dbd8ff6caea7a87c7e48de227e2daa","Message":"Enforce after-sales lifecycle gates and approval inbox integration\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-04T04:24:41-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/7a0c7fc472beebeaac8232aaff49889c3cb97fa0...dddca39245dbd8ff6caea7a87c7e48de227e2daa","Len":2}...
|
1785842687
|
Edit
Delete
|
|
20409
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/feat/multi-role-assignment
|
0
|
{"Commits":[{"Sha1":"7a0c7fc47 {"Commits":[{"Sha1":"7a0c7fc472beebeaac8232aaff49889c3cb97fa0","Message":"chore(governance): 刷新报告与证据行,清理 tsconfig 临时产物残留\n\n- `apps/web/tsconfig.json`:C28 工作区卫生自愈剥掉 `.next-ui-14845` 残留\n (check:ui 的独立 distDir 会把该路径写进被跟踪的 tsconfig)\n- `reports/*.latest.json`:本轮 `pnpm check` 重跑产物,provenance 绑定当前工作区\n- `CLAUDE.md` 证据行:**含并行会话在同一 checkout 的更新**(客户勘测提交相关,\n 非本会话产出),已与本轮交付培训内容合并,未覆盖任何一方\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-03T10:40:43-07:00"},{"Sha1":"167d026f912b2b17c9e4380a5eb18d1d50130751","Message":"feat(fulfillment): 交付培训成为硬卡点——安装完成前使用培训、服务关闭前运维培训\n\n用户裁决两条:培训是**硬卡点**而非记录;由各自角色做、记录客方参加人,\n不引入客户在线签收(本仓无实名认证,凭链接签收只能是具名降级)。\n\n## 卡点做成结构约束,不是运行时 if\n- 安装:`IN_PROGRESS --deliver_training--\u003e TRAINING --complete--\u003e COMPLETED`\n- 客服:`IN_SERVICE --deliver_operation_training--\u003e OPERATION_TRAINING --close--\u003e CLOSED`\n\n⚠️ **安装工单此前根本没有状态机**——三个状态靠 `updateMany` 的 where 条件硬走,\n不受 assertTransition 与状态机不变量守护。本轮补齐 `installationMachine` 并登记进\n不变量表(11 条结构断言自动生效)。否则新卡点又是一条只靠 if、没有结构保障的规则。\n\n客服侧相反:它本来就走 assertTransition,所以在 contracts 插入 `OPERATION_TRAINING`\n态之后,「服务中直接关单」**一行服务端代码都不用改**就自动变成 INVALID_TRANSITION。\n这个对比正是状态机单源的价值。\n\n## 参加人必填是刻意的\n`attendees` 记的是**客方名单**——培训的价值在于「谁被教会了」,不是「谁去讲了」。\n讲师取已验签 actor,不由客户端填,免得填错或冒名。一场没有参加人的培训等于没培训,\n允许留空就等于允许走过场。\n\n## 过程中挖出两处真问题\n1. **动作白名单是双真源**:两端各有一份手抄的 `[\"accept\",\"start\",\"close\"]`,\n 与 contracts 的 `SERVICE_HANDOFF_EVENTS` 平行维护。加了新事件而拷贝不知道,\n 表现是 400「Unsupported action」——排查时很难联想到「白名单没跟上」。\n 已改为两端都读 contracts 事件全集。\n2. **Zod 静默剥字段**:`acceptServiceHandoffSchema` 没登记 `attendees`,\n 请求里填了也会被剥掉,服务端于是说「没填参加人」——**调用方明明填了却被告知没填**,\n 这类不一致最难自查。已在 contracts 补登记并注明。\n\n## 一处「类型绿但数据没出来」\n客服读模型是**白名单重建对象字面量**(C20:不得泄漏成本/毛利/审批意见),\n返回类型是推断的,漏投影新字段**不会有任何编译错误**。安装侧是泛型透传所以自动带上,\n客服侧必须显式列出。已补,并由 `handoff-training-projected-*` 断言守住。\n\n## 界面\n安装工单进度四段(待开始/现场安装/使用培训/客户验收),段位改为按状态映射——\n原来是硬编码 if 链,新增状态会静默停在旧段位。安装中显示培训表单,\n完工表单挪到培训之后;客服服务中显示运维培训表单,关单挪到培训之后。\n\n## 门禁(4 条断言 + 4 条负向注入)\n`installation-training-required-*`、`training-attendees-required-*`、\n`handoff-action-allowlist-single-source-*`、`handoff-training-projected-*`。\n另收紧一条既有断言:完工表单必须挂在 **TRAINING** 段(原来锚的是两个标记的邻近性,\n插入培训表单后被撑开而误报;真正该守的是「完工在培训之后」,锚这个既更强也不怕插内容)。\n自检从 5 条扩到 9 条,均实跑判红。\n\n## 三级门禁证据(本地工作区,PG:55432 + Redis:6382)\n- `pnpm check` exit 0;门禁自检 9 条负向注入\n- `pnpm check:runtime` **413/413**(地板 380→400)\n- `pnpm check:ui` **12/12**,unexpected 0;E2E 断言「安装中不应出现完工按钮」\n ——卡点只在服务端而界面仍能诱导用户走错路,同样是缺陷\n\n## 未做\n客服交接的 E2E 里没有关单步骤,**运维培训卡点缺浏览器级证据**(HTTP 层已覆盖)。\n本次 runtime 增量含并行会话在同一 checkout 写入的约 400 行 HTTP 验收,非本会话产出。\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-03T10:36:05-07:00"}],"HeadCommit":{"Sha1":"7a0c7fc472beebeaac8232aaff49889c3cb97fa0","Message":"chore(governance): 刷新报告与证据行,清理 tsconfig 临时产物残留\n\n- `apps/web/tsconfig.json`:C28 工作区卫生自愈剥掉 `.next-ui-14845` 残留\n (check:ui 的独立 distDir 会把该路径写进被跟踪的 tsconfig)\n- `reports/*.latest.json`:本轮 `pnpm check` 重跑产物,provenance 绑定当前工作区\n- `CLAUDE.md` 证据行:**含并行会话在同一 checkout 的更新**(客户勘测提交相关,\n 非本会话产出),已与本轮交付培训内容合并,未覆盖任何一方\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-03T10:40:43-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/744d532b80ba3fd239cfbdd2b3700e3d73c08675...7a0c7fc472beebeaac8232aaff49889c3cb97fa0","Len":2}...
|
1785778851
|
Edit
Delete
|