|
29361
|
5
|
5
|
5
|
116
|
0
|
0
|
refs/heads/feat/identity-tenant-facts
|
0
|
{"Commits":[{"Sha1":"a670fb6bf {"Commits":[{"Sha1":"a670fb6bf3ae8cd5319e424b80fc947965fc358f","Message":"chore(reports): preserve combined identity acceptance and restore evidence\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-13T01:24:32-07:00"}],"HeadCommit":{"Sha1":"a670fb6bf3ae8cd5319e424b80fc947965fc358f","Message":"chore(reports): preserve combined identity acceptance and restore evidence\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-13T01:24:32-07:00"},"CompareURL":"luoanwu/enterprise-platform/compare/76bcfd024d15df2882b9f878eccb5d284c732b5b...a670fb6bf3ae8cd5319e424b80fc947965fc358f","Len":1}...
|
1789287879
|
Edit
Delete
|
|
29362
|
5
|
5
|
5
|
116
|
0
|
0
|
refs/heads/feat/identity-tenant-facts
|
0
|
{"Commits":[{"Sha1":"4a6c1647e {"Commits":[{"Sha1":"4a6c1647e2aea58f705faa6875075a3cb15246c0","Message":"docs(identity): record combined baseline PR and CI account blocker\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-13T01:28:03-07:00"}],"HeadCommit":{"Sha1":"4a6c1647e2aea58f705faa6875075a3cb15246c0","Message":"docs(identity): record combined baseline PR and CI account blocker\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-13T01:28:03-07:00"},"CompareURL":"luoanwu/enterprise-platform/compare/a670fb6bf3ae8cd5319e424b80fc947965fc358f...4a6c1647e2aea58f705faa6875075a3cb15246c0","Len":1}...
|
1789288090
|
Edit
Delete
|
|
29349
|
5
|
5
|
5
|
116
|
0
|
0
|
refs/heads/feat/identity-tenant-resolution
|
0
|
|
1789284799
|
Edit
Delete
|
|
29350
|
5
|
5
|
5
|
116
|
0
|
0
|
refs/heads/feat/identity-tenant-resolution
|
0
|
{"Commits":[{"Sha1":"2f0b7bbac {"Commits":[{"Sha1":"2f0b7bbac2347d94605fd3200cd6f88bcd158f42","Message":"docs(identity): record clean tenant resolution acceptance and sleep diagnostics\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-13T00:33:12-07:00"},{"Sha1":"00d6821ddbf69773ac9ee83953d617214f74da03","Message":"test(identity): inject public mapping SDK from acceptance hosts\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-12T22:46:04-07:00"},{"Sha1":"4e09963395e938a68ed6d93c41b8aeac69c88e2b","Message":"feat(identity): expose trusted canonical tenant resolution API and SDK\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-12T22:34:40-07:00"}],"HeadCommit":{"Sha1":"2f0b7bbac2347d94605fd3200cd6f88bcd158f42","Message":"docs(identity): record clean tenant resolution acceptance and sleep diagnostics\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-13T00:33:12-07:00"},"CompareURL":"luoanwu/enterprise-platform/compare/584bdadc5a5eaf4e4be3b58e3cea2b8056efcb5f...2f0b7bbac2347d94605fd3200cd6f88bcd158f42","Len":3}...
|
1789284799
|
Edit
Delete
|
|
29351
|
5
|
5
|
5
|
116
|
0
|
0
|
refs/heads/feat/identity-tenant-resolution
|
0
|
{"Commits":[{"Sha1":"5997f4533 {"Commits":[{"Sha1":"5997f453389574c04ccb4998813243f8a2daf8ff","Message":"docs(identity): record resolution PR delivery and CI account blocker\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-13T00:35:21-07:00"}],"HeadCommit":{"Sha1":"5997f453389574c04ccb4998813243f8a2daf8ff","Message":"docs(identity): record resolution PR delivery and CI account blocker\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-13T00:35:21-07:00"},"CompareURL":"luoanwu/enterprise-platform/compare/2f0b7bbac2347d94605fd3200cd6f88bcd158f42...5997f453389574c04ccb4998813243f8a2daf8ff","Len":1}...
|
1789284928
|
Edit
Delete
|
|
29321
|
5
|
5
|
5
|
116
|
0
|
0
|
refs/heads/feat/identity-transit-signing
|
0
|
|
1789263990
|
Edit
Delete
|
|
29322
|
5
|
5
|
5
|
116
|
0
|
0
|
refs/heads/feat/identity-transit-signing
|
0
|
{"Commits":[{"Sha1":"97b0a32a9 {"Commits":[{"Sha1":"97b0a32a9377f34273b69aba6fe49004ac619c7f","Message":"chore(reports): record fixed-source Transit identity regressions\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-12T18:46:15-07:00"},{"Sha1":"a5153aef5545e82eb4cade12cfcf17d8a338e2ff","Message":"test(identity): keep signing tests compatible with legacy source links\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-12T18:37:37-07:00"},{"Sha1":"2f49ba4c7c4792f697188b499a6db3175881ec1c","Message":"feat(identity): sign OIDC tokens with verified OpenBao Transit keys\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-12T18:31:58-07:00"}],"HeadCommit":{"Sha1":"97b0a32a9377f34273b69aba6fe49004ac619c7f","Message":"chore(reports): record fixed-source Transit identity regressions\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-12T18:46:15-07:00"},"CompareURL":"luoanwu/enterprise-platform/compare/3308542265e6a301126e1135310b11fbcddd5c5d...97b0a32a9377f34273b69aba6fe49004ac619c7f","Len":3}...
|
1789263990
|
Edit
Delete
|
|
29301
|
5
|
5
|
5
|
116
|
0
|
0
|
refs/heads/feat/identity-ui-runtime
|
0
|
|
1789258129
|
Edit
Delete
|
|
29302
|
5
|
5
|
5
|
116
|
0
|
0
|
refs/heads/feat/identity-ui-runtime
|
0
|
{"Commits":[{"Sha1":"f3ae91601 {"Commits":[{"Sha1":"f3ae91601f5e4feefb3a3769ba09addb2553be08","Message":"docs(identity): record fixed-source browser migration evidence\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-12T17:08:39-07:00"},{"Sha1":"90cda567058bcbe6e5e94b306c1d88b31f39281c","Message":"Merge remote-tracking branch 'github/main' into feat/identity-ui-runtime\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-12T17:05:54-07:00"},{"Sha1":"9e7ecccac5a3060fe03c5d549df0c1e7e29ed78e","Message":"feat(identity): connect canonical browser pages and module UI acceptance\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-12T17:05:32-07:00"}],"HeadCommit":{"Sha1":"f3ae91601f5e4feefb3a3769ba09addb2553be08","Message":"docs(identity): record fixed-source browser migration evidence\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-12T17:08:39-07:00"},"CompareURL":"luoanwu/enterprise-platform/compare/3dad70fba60976838ee81c2dc31f394ebc355691...f3ae91601f5e4feefb3a3769ba09addb2553be08","Len":3}...
|
1789258129
|
Edit
Delete
|
|
29303
|
5
|
5
|
5
|
116
|
0
|
0
|
refs/heads/feat/identity-ui-runtime
|
0
|
{"Commits":[{"Sha1":"edba59bf5 {"Commits":[{"Sha1":"edba59bf5dbfd579d4eb8d31d3fc976a90c9b5f2","Message":"fix(identity): keep legacy browser contracts independent of runtime install\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-12T17:11:59-07:00"}],"HeadCommit":{"Sha1":"edba59bf5dbfd579d4eb8d31d3fc976a90c9b5f2","Message":"fix(identity): keep legacy browser contracts independent of runtime install\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-12T17:11:59-07:00"},"CompareURL":"luoanwu/enterprise-platform/compare/f3ae91601f5e4feefb3a3769ba09addb2553be08...edba59bf5dbfd579d4eb8d31d3fc976a90c9b5f2","Len":1}...
|
1789258328
|
Edit
Delete
|
|
29312
|
5
|
5
|
5
|
116
|
0
|
0
|
refs/heads/feat/identity-web-deploy
|
0
|
|
1789260558
|
Edit
Delete
|
|
29313
|
5
|
5
|
5
|
116
|
0
|
0
|
refs/heads/feat/identity-web-deploy
|
0
|
{"Commits":[{"Sha1":"5b89d7af7 {"Commits":[{"Sha1":"5b89d7af78934144e0355f0a6101ee5298913d03","Message":"Merge remote-tracking branch 'github/main' into feat/identity-web-deploy\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-12T17:47:14-07:00"},{"Sha1":"de3c89fef2d4f1b360108f10cb1b2421558b9587","Message":"docs(identity): preserve fixed image, browser and full SBOM evidence\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-12T17:47:14-07:00"}],"HeadCommit":{"Sha1":"5b89d7af78934144e0355f0a6101ee5298913d03","Message":"Merge remote-tracking branch 'github/main' into feat/identity-web-deploy\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-12T17:47:14-07:00"},"CompareURL":"luoanwu/enterprise-platform/compare/2c705fd9df9e82c50335f170f07d0b70a1359423...5b89d7af78934144e0355f0a6101ee5298913d03","Len":2}...
|
1789260558
|
Edit
Delete
|
|
29315
|
5
|
5
|
5
|
116
|
0
|
0
|
refs/heads/feat/identity-web-deploy
|
0
|
{"Commits":[{"Sha1":"5c6e71a06 {"Commits":[{"Sha1":"5c6e71a065292a5c4baaf48feb5ca2ff86dcdd81","Message":"Merge remote-tracking branch 'github/main' into feat/identity-web-deploy\n\n# Conflicts:\n#\treports/release-manifest.latest.json\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-12T18:07:19-07:00"},{"Sha1":"3308542265e6a301126e1135310b11fbcddd5c5d","Message":"Merge pull request #24 from laoluojuhai/codex/ms3-audit-receipt-integrity\n\nfix(audit): 修复回执篡改漏检并整合撤权验收","AuthorEmail":"158980461+laoluojuhai@users.noreply.github.com","AuthorName":"laoluojuhai","CommitterEmail":"noreply@github.com","CommitterName":"GitHub","Timestamp":"2026-09-12T18:03:34-07:00"},{"Sha1":"5162994aa3dcdae57fdc9322ca629dbb580178f2","Message":"Merge remote-tracking branch 'github/main' into codex/ms3-audit-receipt-integrity\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-12T17:48:58-07:00"},{"Sha1":"9ad709cdf47783dda39a1978bb37b9594d6c31cd","Message":"chore(reports): verify integration with identity browser migration\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-12T17:34:25-07:00"},{"Sha1":"e4bf34312eb344a6a26a1ee7846d23020dc5b8ce","Message":"Merge validated identity browser migration into milestone integration\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-12T17:32:49-07:00"}],"HeadCommit":{"Sha1":"5c6e71a065292a5c4baaf48feb5ca2ff86dcdd81","Message":"Merge remote-tracking branch 'github/main' into feat/identity-web-deploy\n\n# Conflicts:\n#\treports/release-manifest.latest.json\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-12T18:07:19-07:00"},"CompareURL":"luoanwu/enterprise-platform/compare/5b89d7af78934144e0355f0a6101ee5298913d03...5c6e71a065292a5c4baaf48feb5ca2ff86dcdd81","Len":18}...
|
1789261698
|
Edit
Delete
|
|
32880
|
5
|
17
|
5
|
116
|
0
|
0
|
refs/heads/feat/identity-web-deploy
|
0
|
|
1790261362
|
Edit
Delete
|
|
29920
|
5
|
5
|
5
|
57
|
0
|
0
|
refs/heads/feat/illustration-brief-candidates
|
0
|
|
1789445253
|
Edit
Delete
|
|
29921
|
5
|
5
|
5
|
57
|
0
|
0
|
refs/heads/feat/illustration-brief-candidates
|
0
|
{"Commits":[],"HeadCommit":{"S {"Commits":[],"HeadCommit":{"Sha1":"cac4dfce5420bb002137d3438e10560495d1f48f","Message":"test: verify the illustration brief candidates round\n\nSeven heavy gates plus pnpm check pass on the isolated stack at source\nfingerprint 96e80feb; CLAUDE.md heavy rows re-marked accordingly.\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-09-09T20:53:33-07:00"},"CompareURL":"luoanwu/image-generation/compare/main...cac4dfce5420bb002137d3438e10560495d1f48f","Len":0}...
|
1789445253
|
Edit
Delete
|
|
29922
|
5
|
5
|
5
|
57
|
0
|
0
|
refs/heads/feat/illustration-default-descriptions
|
0
|
|
1789445258
|
Edit
Delete
|
|
29923
|
5
|
5
|
5
|
57
|
0
|
0
|
refs/heads/feat/illustration-default-descriptions
|
0
|
{"Commits":[],"HeadCommit":{"S {"Commits":[],"HeadCommit":{"Sha1":"dcc386002801b96fd48bb5a2c7743dc84c3e80e2","Message":"test: verify the default scene descriptions round\n\nSeven isolated gates and pnpm check pass at sha256:306ca1a3…; evidence in reports/illustration-default-descriptions-2026-09-10 and acceptance-artifacts/illustration-default-descriptions-2026-09-10.\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-09-09T21:52:09-07:00"},"CompareURL":"luoanwu/image-generation/compare/main...dcc386002801b96fd48bb5a2c7743dc84c3e80e2","Len":0}...
|
1789445258
|
Edit
Delete
|
|
28968
|
5
|
5
|
5
|
57
|
0
|
0
|
refs/heads/feat/illustration-no-text-toggle
|
0
|
|
1789044670
|
Edit
Delete
|
|
28969
|
5
|
5
|
5
|
57
|
0
|
0
|
refs/heads/feat/illustration-no-text-toggle
|
0
|
{"Commits":[],"HeadCommit":{"S {"Commits":[],"HeadCommit":{"Sha1":"c7722c64bacefaaa48698f2b0899e7fd3ea6cd72","Message":"test: verify the illustration no-text switch round\n\nSeven gates plus the static check passed on an isolated stack for\nfingerprint 79dbb130… (main b299092e + no-text switch, dialog keep\naction, factual-vs-generated check, single save banner); CLAUDE.md\nheavy-gate rows, reports and the governance log follow.\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-09-10T04:37:47-07:00"},"CompareURL":"luoanwu/image-generation/compare/main...c7722c64bacefaaa48698f2b0899e7fd3ea6cd72","Len":0}...
|
1789044670
|
Edit
Delete
|
|
26794
|
16
|
5
|
16
|
88
|
0
|
0
|
refs/heads/feat/juhai-agent-control-plane
|
0
|
|
1788087343
|
Edit
Delete
|
|
26795
|
16
|
5
|
16
|
88
|
0
|
0
|
refs/heads/feat/juhai-agent-control-plane
|
0
|
{"Commits":[{"Sha1":"4749f3df3 {"Commits":[{"Sha1":"4749f3df37316e72da7314c4151971c91e233575","Message":"chore(reports): 绑定最终治理文档迁移证据\n\n实现内容:\n- 将 migrations.latest.json 的 provenance 更新到最终治理文档提交。\n- 不改变迁移检查指标和通过结果。\n\n验证:\n- node scripts/check-migrations.mjs 再次通过。\n- camelCase 标量与关系判定负向探针 2/2 通过。\n","AuthorEmail":"ngotruc672498@gmail.com","AuthorName":"xp","CommitterEmail":"ngotruc672498@gmail.com","CommitterName":"xp","Timestamp":"2026-08-30T18:44:47+08:00"},{"Sha1":"3299c68752ab4c04f4f171cb15b7dea897029818","Message":"docs(governance): 区分稳定包登记与下游验收\n\n实现内容:\n- 保留 contracts 1.13.0 与 tool-runtime 2.2.0 的当前登记事实。\n- 明确下游 tarball 候选验收仍停留在 contracts 1.12.0 与 tool-runtime 2.1.0。\n\n验证:\n- git diff --cached --check 通过。\n- staged diff 仅包含 CLAUDE.md 的证据口径更正。\n","AuthorEmail":"ngotruc672498@gmail.com","AuthorName":"xp","CommitterEmail":"ngotruc672498@gmail.com","CommitterName":"xp","Timestamp":"2026-08-30T18:44:09+08:00"},{"Sha1":"a068ed932c183b9ced5320765872c33e7c453fa1","Message":"chore(reports): 刷新远程读取迁移检查报告\n\n实现内容:\n- 重新生成 migrations.latest.json,并绑定完成源码与文档提交后的本地提交 SHA。\n- 保留迁移危险语句、双后端目录和 Prisma 字段映射检查结果。\n\n验证:\n- node scripts/check-migrations.mjs 通过。\n- camelCase 标量与关系判定负向探针 2/2 通过。\n","AuthorEmail":"ngotruc672498@gmail.com","AuthorName":"xp","CommitterEmail":"ngotruc672498@gmail.com","CommitterName":"xp","Timestamp":"2026-08-30T18:43:17+08:00"},{"Sha1":"1c5d0e1885693aaa93630e3c73d79d7277583f1d","Message":"docs(agent): 记录报价只读工具与 GLM 执行语义\n\n实现内容:\n- 更新控制平面蓝图和 owner matrix,区分 Connector 发布审核与 REMOTE_READ 每次调用确认。\n- 记录 GLM Provider、SSE 聚合、reasoning_content 续执、任务思考深度和结构修复边界。\n- 将 DeepSeek 限定为历史事故记录,并同步稳定包版本真源。\n\n验证:\n- git diff --cached --check 通过。\n- 当前 Provider 文档漂移检索无未解释的 DeepSeek 或智谱兼容端点表述。\n","AuthorEmail":"ngotruc672498@gmail.com","AuthorName":"xp","CommitterEmail":"ngotruc672498@gmail.com","CommitterName":"xp","Timestamp":"2026-08-30T18:42:31+08:00"},{"Sha1":"13bc0d17c7d9026aa17cbb2d5347620dd401119f","Message":"feat(api): 接入双后端报价远程读取与 GLM 执行链\n\n实现内容:\n- 在 NestJS 与 Fastify 执行前共同校验 Tool Activation、Assignment、Grant、CapabilityPack、ConnectorDefinition 和 ACTIVE Installation。\n- 对等实现 REMOTE_READ 调度、稳定错误映射、结果治理、推理续执和任务思考深度冻结。\n- 补充真实数据库 dispatcher 与 LLM acceptance 回归,并更新流式 smoke 传输。\n\n验证:\n- pnpm --filter api-nestjs typecheck 与 build 通过。\n- pnpm --filter api-fastify typecheck 与 build 通过。\n","AuthorEmail":"ngotruc672498@gmail.com","AuthorName":"xp","CommitterEmail":"ngotruc672498@gmail.com","CommitterName":"xp","Timestamp":"2026-08-30T18:41:33+08:00"}],"HeadCommit":{"Sha1":"4749f3df37316e72da7314c4151971c91e233575","Message":"chore(reports): 绑定最终治理文档迁移证据\n\n实现内容:\n- 将 migrations.latest.json 的 provenance 更新到最终治理文档提交。\n- 不改变迁移检查指标和通过结果。\n\n验证:\n- node scripts/check-migrations.mjs 再次通过。\n- camelCase 标量与关系判定负向探针 2/2 通过。\n","AuthorEmail":"ngotruc672498@gmail.com","AuthorName":"xp","CommitterEmail":"ngotruc672498@gmail.com","CommitterName":"xp","Timestamp":"2026-08-30T18:44:47+08:00"},"CompareURL":"pengzhiyu/digital-employee-os/compare/b6d0797b80846ca21150fbb900a59f495f6d2cd3...4749f3df37316e72da7314c4151971c91e233575","Len":10}...
|
1788087343
|
Edit
Delete
|
|
23761
|
5
|
5
|
5
|
57
|
0
|
0
|
refs/heads/feat/llm-shooting-script
|
0
|
|
1787029504
|
Edit
Delete
|
|
23762
|
5
|
5
|
5
|
57
|
0
|
0
|
refs/heads/feat/llm-shooting-script
|
0
|
{"Commits":[{"Sha1":"4c34ff4ff {"Commits":[{"Sha1":"4c34ff4ff22ff5aab34e0492fd7fef9c2c989b02","Message":"feat(script): 接入大语言模型——歌词/文案 → 拍摄脚本 → 角色确认 → 定格图\n\n本仓此前零 LLM 接入(全仓只有 DashScope 的图像调用),「歌词成图」屏是纯前端\n原型(procedural.ts 画色块 + setTimeout 假装推理,不落库不接后端)。本轮把这条\n动线升级为真链路 + 真持久化。\n\n契约单源(packages/contracts/src/script.ts)\n- 角色确认状态机 scriptRoleMachine、脚本状态机 shootingScriptMachine\n- 景别/运镜用枚举而非自由文本:LLM 一旦自由发挥,下游 prompt 与统计就没有稳定口径\n- scriptDraftSchema 是 LLM 输出的唯一判据;prompt 构造器单源,两后端禁止各拼一份\n- evaluateRoleReadiness:本域核心不变量,双后端硬拦截 + 前端同源即时反馈\n- 前端私有的 findBannedHits 上收为 contracts 的 findBannedWords(后端也要逐镜标记,\n 两份并行就是双真源)\n\nLLM 不是权威\n- sidecar /v1/script 只保证「返回长得像脚本的 JSON」,两个后端各自再 parse 一次才落库\n- 模型引用未声明角色键 → 422 SCRIPT_ROLE_KEYS_DANGLING(幻觉护栏)\n- 连续给不出合法 JSON → 502 LLM_OUTPUT_UNPARSEABLE,绝不返回占位脚本\n- parse_json_object 只剥围栏、截首尾花括号,不做字段猜测或补齐\n\n角色必须先确认才允许出定格图\n- 判据 = status CONFIRMED 且有 referenceAssetId(没有参考图就没有一致性锚点)\n- CONFIRMED --reset--\u003e DRAFT 会解除参考图绑定:人确认的是那一张图,不是那个名字\n- 出图时按 roleKeys 顺序喂参考图,与指令里「第 N 张参考图」编号严格对齐\n\n写链纪律与物料链路同构:tenant 全覆盖、updateMany 带状态前置条件(0 行即 409)、\n终态与 outbox 同 tx、能力不可用 → job BLOCKED + 诚实 reason,禁止静默降级。\n品牌准绳只逐镜标记不拒绝整份脚本(脚本属创作内容),硬拦截点在出定格图这个受控出口,\n显式放行需带参数且落审计事件。\n\n顺带修掉三个既有缺陷\n1. 合并遗留:sidecarEdit 用 sidecarGenerateResponseSchema 校验响应(要求 steps/\n loadSeconds),但 run_hosted_edit 两个字段都不返回 —— 托管改字会在客户端边界\n 直接 Zod 抛错(本地路径返回这两个字段,所以一直没暴露)\n2. check-migrations 的列检查只扫 CREATE TABLE,凡 ALTER TABLE ADD COLUMN 追加的\n @map 列一律误报 drift(此前唯一的 ALTER 列 brand_kits.profile 没 @map 才没现形)\n3. ktv-poster-master.png 血统在合并两侧打架,git log --all 证明该文件自初始化提交后\n 从未重新生成,取诚实标注 prototype-demo-master\n\n验收\n- 新增 pnpm check:script → reports/script-acceptance.latest.json(双后端各 8 passed\n + 1 skipped-live);own-tests floor 10→14,棘轮已收紧\n- pnpm check / check:runtime 均 exit 0\n- 浏览器实测:未确认角色 → 按钮 disabled 且提示缺哪个角色;绕过前端直打后端 → 422\n ROLE_NOT_CONFIRMED;跨租户 404;无凭证生成 → UI 显示 503 且不产生占位脚本\n\n诚实边界(已写入 CLAUDE.md)\n- liveLlmAsserted=false:本机无 DASHSCOPE_API_KEY,真调 LLM 的 live 断言被 skip,\n 门禁成立 ≠ LLM 出脚本已验证\n- check:inference 在本机为 failed(动手前即为 failed):本工作副本的模型权重是\n git-lfs 指针存根,非本轮改动导致;基线表该行已从 GREEN 改为 OPEN\n- ui-acceptance 报告早于本屏,未覆盖 script 屏,已标 STALE\n- 新开缺口 G16(LLM 只做结构校验、无事实性校验)、G17(同步 HTTP 挂分钟级推理 /\n render_jobs 索引非 CONCURRENTLY / 本地多图 I2I 未在本机验证)\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-17T22:04:48-07:00"}],"HeadCommit":{"Sha1":"4c34ff4ff22ff5aab34e0492fd7fef9c2c989b02","Message":"feat(script): 接入大语言模型——歌词/文案 → 拍摄脚本 → 角色确认 → 定格图\n\n本仓此前零 LLM 接入(全仓只有 DashScope 的图像调用),「歌词成图」屏是纯前端\n原型(procedural.ts 画色块 + setTimeout 假装推理,不落库不接后端)。本轮把这条\n动线升级为真链路 + 真持久化。\n\n契约单源(packages/contracts/src/script.ts)\n- 角色确认状态机 scriptRoleMachine、脚本状态机 shootingScriptMachine\n- 景别/运镜用枚举而非自由文本:LLM 一旦自由发挥,下游 prompt 与统计就没有稳定口径\n- scriptDraftSchema 是 LLM 输出的唯一判据;prompt 构造器单源,两后端禁止各拼一份\n- evaluateRoleReadiness:本域核心不变量,双后端硬拦截 + 前端同源即时反馈\n- 前端私有的 findBannedHits 上收为 contracts 的 findBannedWords(后端也要逐镜标记,\n 两份并行就是双真源)\n\nLLM 不是权威\n- sidecar /v1/script 只保证「返回长得像脚本的 JSON」,两个后端各自再 parse 一次才落库\n- 模型引用未声明角色键 → 422 SCRIPT_ROLE_KEYS_DANGLING(幻觉护栏)\n- 连续给不出合法 JSON → 502 LLM_OUTPUT_UNPARSEABLE,绝不返回占位脚本\n- parse_json_object 只剥围栏、截首尾花括号,不做字段猜测或补齐\n\n角色必须先确认才允许出定格图\n- 判据 = status CONFIRMED 且有 referenceAssetId(没有参考图就没有一致性锚点)\n- CONFIRMED --reset--\u003e DRAFT 会解除参考图绑定:人确认的是那一张图,不是那个名字\n- 出图时按 roleKeys 顺序喂参考图,与指令里「第 N 张参考图」编号严格对齐\n\n写链纪律与物料链路同构:tenant 全覆盖、updateMany 带状态前置条件(0 行即 409)、\n终态与 outbox 同 tx、能力不可用 → job BLOCKED + 诚实 reason,禁止静默降级。\n品牌准绳只逐镜标记不拒绝整份脚本(脚本属创作内容),硬拦截点在出定格图这个受控出口,\n显式放行需带参数且落审计事件。\n\n顺带修掉三个既有缺陷\n1. 合并遗留:sidecarEdit 用 sidecarGenerateResponseSchema 校验响应(要求 steps/\n loadSeconds),但 run_hosted_edit 两个字段都不返回 —— 托管改字会在客户端边界\n 直接 Zod 抛错(本地路径返回这两个字段,所以一直没暴露)\n2. check-migrations 的列检查只扫 CREATE TABLE,凡 ALTER TABLE ADD COLUMN 追加的\n @map 列一律误报 drift(此前唯一的 ALTER 列 brand_kits.profile 没 @map 才没现形)\n3. ktv-poster-master.png 血统在合并两侧打架,git log --all 证明该文件自初始化提交后\n 从未重新生成,取诚实标注 prototype-demo-master\n\n验收\n- 新增 pnpm check:script → reports/script-acceptance.latest.json(双后端各 8 passed\n + 1 skipped-live);own-tests floor 10→14,棘轮已收紧\n- pnpm check / check:runtime 均 exit 0\n- 浏览器实测:未确认角色 → 按钮 disabled 且提示缺哪个角色;绕过前端直打后端 → 422\n ROLE_NOT_CONFIRMED;跨租户 404;无凭证生成 → UI 显示 503 且不产生占位脚本\n\n诚实边界(已写入 CLAUDE.md)\n- liveLlmAsserted=false:本机无 DASHSCOPE_API_KEY,真调 LLM 的 live 断言被 skip,\n 门禁成立 ≠ LLM 出脚本已验证\n- check:inference 在本机为 failed(动手前即为 failed):本工作副本的模型权重是\n git-lfs 指针存根,非本轮改动导致;基线表该行已从 GREEN 改为 OPEN\n- ui-acceptance 报告早于本屏,未覆盖 script 屏,已标 STALE\n- 新开缺口 G16(LLM 只做结构校验、无事实性校验)、G17(同步 HTTP 挂分钟级推理 /\n render_jobs 索引非 CONCURRENTLY / 本地多图 I2I 未在本机验证)\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-17T22:04:48-07:00"},"CompareURL":"luoanwu/image-generation/compare/9af0a397ce69cf03623a495ee3ef49943598f5a4...4c34ff4ff22ff5aab34e0492fd7fef9c2c989b02","Len":1}...
|
1787029504
|
Edit
Delete
|
|
23818
|
5
|
5
|
5
|
57
|
0
|
0
|
refs/heads/feat/llm-shooting-script
|
0
|
{"Commits":[{"Sha1":"b9d34cfb7 {"Commits":[{"Sha1":"b9d34cfb7e777377776325d7b2e73f1a15ff19e8","Message":"feat(script): 分镜可编辑、定格图可微调可回滚\n\nC10 交付后脚本是只读的——LLM 出完就不能改,定格图也只能整张重出。本轮补齐「改」。\n\n分镜编辑\n- 字段编辑 + 增删 + 重排;镜号唯一约束下走两阶段负号位移,1..N 恒连续不撞号\n- 重排要求全量顺序,拒绝增量语义歧义\n- 改角色 appearance 强制退回 DRAFT 并解绑参考图(描述与图不能各说各话);只改 name 不解绑\n- ARCHIVED / ROLES_LOCKED 从装饰性状态变成真实写约束\n\n定格图调整\n- 三模式:FROM_ROLES 从角色重出 / ADJUST 在当前图上按指令迭代微调 / VARIATION 换种子出候选\n- buildStillAdjustInstruction 把「只改这一点、构图与角色都别动」写死进指令\n (迭代微调最常见的失败是模型顺手重画整张)\n- 历史版本表 script_still_versions:每次出图/微调/换版追加一版,可回滚\n\n失效判据(契约单源,双端同源消费)\n- computeShotFingerprint 把所有影响成图的输入拼成规范串——刻意不哈希:\n 碰撞意味着「该失效却没标失效」,那是静默错误;规范串几百字节可肉眼比对\n- isShotStillStale 据此判断;策略是标记失效不自动删图\n (删掉人已满意的图是不可逆破坏,决定权留给人)\n\n三处刻意的「不静默」\n1. ADJUST 无底图 → NO_STILL_TO_ADJUST 明确报错,不悄悄改成整张重出\n2. 回滚连该版本的 fingerprint 一起还原,否则回滚回来的旧图会被误判成新鲜的\n3. 指纹用规范串而非哈希\n\n验收\n- contracts 新增 13 条失效判据单测(61 tests 全绿)\n- 双后端 acceptance 各 21 passed + 1 skipped-live(原 8)\n- pnpm check / check:runtime / check:script 均 exit 0;own-tests floor 14→15\n- 浏览器实测:过期横幅、编辑表单预填真实值、UI 改动落库并发 material.script.shot.updated、\n 新增与上移后镜号仍连续且未撞唯一约束\n\n诚实边界不变:liveLlmAsserted 仍为 false(本机无 DASHSCOPE_API_KEY);\ncheck:inference 仍因权重是 git-lfs 存根而红,与本轮无关。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-17T22:52:19-07:00"}],"HeadCommit":{"Sha1":"b9d34cfb7e777377776325d7b2e73f1a15ff19e8","Message":"feat(script): 分镜可编辑、定格图可微调可回滚\n\nC10 交付后脚本是只读的——LLM 出完就不能改,定格图也只能整张重出。本轮补齐「改」。\n\n分镜编辑\n- 字段编辑 + 增删 + 重排;镜号唯一约束下走两阶段负号位移,1..N 恒连续不撞号\n- 重排要求全量顺序,拒绝增量语义歧义\n- 改角色 appearance 强制退回 DRAFT 并解绑参考图(描述与图不能各说各话);只改 name 不解绑\n- ARCHIVED / ROLES_LOCKED 从装饰性状态变成真实写约束\n\n定格图调整\n- 三模式:FROM_ROLES 从角色重出 / ADJUST 在当前图上按指令迭代微调 / VARIATION 换种子出候选\n- buildStillAdjustInstruction 把「只改这一点、构图与角色都别动」写死进指令\n (迭代微调最常见的失败是模型顺手重画整张)\n- 历史版本表 script_still_versions:每次出图/微调/换版追加一版,可回滚\n\n失效判据(契约单源,双端同源消费)\n- computeShotFingerprint 把所有影响成图的输入拼成规范串——刻意不哈希:\n 碰撞意味着「该失效却没标失效」,那是静默错误;规范串几百字节可肉眼比对\n- isShotStillStale 据此判断;策略是标记失效不自动删图\n (删掉人已满意的图是不可逆破坏,决定权留给人)\n\n三处刻意的「不静默」\n1. ADJUST 无底图 → NO_STILL_TO_ADJUST 明确报错,不悄悄改成整张重出\n2. 回滚连该版本的 fingerprint 一起还原,否则回滚回来的旧图会被误判成新鲜的\n3. 指纹用规范串而非哈希\n\n验收\n- contracts 新增 13 条失效判据单测(61 tests 全绿)\n- 双后端 acceptance 各 21 passed + 1 skipped-live(原 8)\n- pnpm check / check:runtime / check:script 均 exit 0;own-tests floor 14→15\n- 浏览器实测:过期横幅、编辑表单预填真实值、UI 改动落库并发 material.script.shot.updated、\n 新增与上移后镜号仍连续且未撞唯一约束\n\n诚实边界不变:liveLlmAsserted 仍为 false(本机无 DASHSCOPE_API_KEY);\ncheck:inference 仍因权重是 git-lfs 存根而红,与本轮无关。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-17T22:52:19-07:00"},"CompareURL":"luoanwu/image-generation/compare/4c34ff4ff22ff5aab34e0492fd7fef9c2c989b02...b9d34cfb7e777377776325d7b2e73f1a15ff19e8","Len":1}...
|
1787032352
|
Edit
Delete
|
|
28970
|
5
|
5
|
5
|
57
|
0
|
0
|
refs/heads/feat/merge-all-20260910
|
0
|
|
1789044670
|
Edit
Delete
|
|
28971
|
5
|
5
|
5
|
57
|
0
|
0
|
refs/heads/feat/merge-all-20260910
|
0
|
{"Commits":[],"HeadCommit":{"S {"Commits":[],"HeadCommit":{"Sha1":"9150a0360d0b3d19ff109cbe5723f775f7a263a2","Message":"test: verify the merged branches round\n\nSeven gates plus the static check passed on an isolated stack for\nfingerprint 929c5212… (main 20702824 + radio width, check locate,\ntemplate slot gestures, and the step-7 preview badge fix); CLAUDE.md\nheavy-gate rows, reports and the governance logs follow.\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-09-10T03:42:06-07:00"},"CompareURL":"luoanwu/image-generation/compare/main...9150a0360d0b3d19ff109cbe5723f775f7a263a2","Len":0}...
|
1789044670
|
Edit
Delete
|
|
11155
|
1
|
5
|
1
|
32
|
0
|
0
|
refs/heads/feat/miniprogram-pdf-zoom-sync
|
1
|
|
1781069343
|
Edit
Delete
|
|
11156
|
1
|
5
|
1
|
32
|
0
|
0
|
refs/heads/feat/miniprogram-pdf-zoom-sync
|
1
|
{"Commits":[{"Sha1":"bf0fa1fd7 {"Commits":[{"Sha1":"bf0fa1fd77ef2f5f91a18bac9168709f8abb4889","Message":"feat: 小程序PDF缩放、弹幕同步、个人中心完整功能\n\n- 修复 PDF page API 500 错误(pdftoppm 输出文件名零填充问题)\n- 修复小程序 WebSocket SocketTask 引用丢失,改用全局 API\n- 小程序增加双指捏合缩放、拖动、全屏查看功能\n- 小程序增加点赞、红包动画、弹幕发送功能\n- 小程序个人中心支付订单/红包记录字段对齐 h5/meeting\n- 小程序增加口播稿面板、历史演讲、刷新按钮\n- 小程序修复 page-count API 获取 PDF 页数失败(shell 命令转义)\n- admin/play 弹幕容器改为 position:fixed + z-index 1000000\n- WebSocket 服务端增加广播日志\n- admin/play 修复 JS try/catch 语法错误导致弹幕不显示\n- 新增小程序控制器 Miniapp/Minapi\n- 新增小程序登录、二维码、支付相关 API\n","AuthorEmail":"zhangjunnan@g-hi.com","AuthorName":"zhangjunnan","CommitterEmail":"zhangjunnan@g-hi.com","CommitterName":"zhangjunnan","Timestamp":"2026-06-10T13:28:57+08:00"}],"HeadCommit":{"Sha1":"bf0fa1fd77ef2f5f91a18bac9168709f8abb4889","Message":"feat: 小程序PDF缩放、弹幕同步、个人中心完整功能\n\n- 修复 PDF page API 500 错误(pdftoppm 输出文件名零填充问题)\n- 修复小程序 WebSocket SocketTask 引用丢失,改用全局 API\n- 小程序增加双指捏合缩放、拖动、全屏查看功能\n- 小程序增加点赞、红包动画、弹幕发送功能\n- 小程序个人中心支付订单/红包记录字段对齐 h5/meeting\n- 小程序增加口播稿面板、历史演讲、刷新按钮\n- 小程序修复 page-count API 获取 PDF 页数失败(shell 命令转义)\n- admin/play 弹幕容器改为 position:fixed + z-index 1000000\n- WebSocket 服务端增加广播日志\n- admin/play 修复 JS try/catch 语法错误导致弹幕不显示\n- 新增小程序控制器 Miniapp/Minapi\n- 新增小程序登录、二维码、支付相关 API\n","AuthorEmail":"zhangjunnan@g-hi.com","AuthorName":"zhangjunnan","CommitterEmail":"zhangjunnan@g-hi.com","CommitterName":"zhangjunnan","Timestamp":"2026-06-10T13:28:57+08:00"},"CompareURL":"zhangjunnan/zhouhui/compare/ffa513a52387f5624f52f14b3a56e99c9411087b...bf0fa1fd77ef2f5f91a18bac9168709f8abb4889","Len":1}...
|
1781069343
|
Edit
Delete
|
|
11157
|
1
|
5
|
1
|
32
|
0
|
0
|
refs/heads/feat/miniprogram-pdf-zoom-sync
|
1
|
{"Commits":[{"Sha1":"22bc33a1f {"Commits":[{"Sha1":"22bc33a1f0f14a757dfd4b280668e152617b65d7","Message":"fix: admin/play PDF渲染重复canvas报错+内容翻转\n\n- 添加 pdfRenderingTask 变量跟踪当前渲染任务\n- renderPDFPage 开始时取消之前的渲染(cancel)\n- 忽略 RenderingCancelledException 错误\n- 清理多余 console.log 减少噪声\n","AuthorEmail":"zhangjunnan@g-hi.com","AuthorName":"zhangjunnan","CommitterEmail":"zhangjunnan@g-hi.com","CommitterName":"zhangjunnan","Timestamp":"2026-06-10T13:32:05+08:00"}],"HeadCommit":{"Sha1":"22bc33a1f0f14a757dfd4b280668e152617b65d7","Message":"fix: admin/play PDF渲染重复canvas报错+内容翻转\n\n- 添加 pdfRenderingTask 变量跟踪当前渲染任务\n- renderPDFPage 开始时取消之前的渲染(cancel)\n- 忽略 RenderingCancelledException 错误\n- 清理多余 console.log 减少噪声\n","AuthorEmail":"zhangjunnan@g-hi.com","AuthorName":"zhangjunnan","CommitterEmail":"zhangjunnan@g-hi.com","CommitterName":"zhangjunnan","Timestamp":"2026-06-10T13:32:05+08:00"},"CompareURL":"zhangjunnan/zhouhui/compare/bf0fa1fd77ef2f5f91a18bac9168709f8abb4889...22bc33a1f0f14a757dfd4b280668e152617b65d7","Len":1}...
|
1781069530
|
Edit
Delete
|
|
11455
|
1
|
5
|
1
|
32
|
0
|
0
|
refs/heads/feat/miniprogram-pdf-zoom-sync
|
1
|
{"Commits":[{"Sha1":"2bdc17dcf {"Commits":[{"Sha1":"2bdc17dcf4587d11fa13e8961a83da952426fa3e","Message":"最新\n","AuthorEmail":"zhangjunnan@g-hi.com","AuthorName":"zhangjunnan","CommitterEmail":"zhangjunnan@g-hi.com","CommitterName":"zhangjunnan","Timestamp":"2026-06-11T13:28:40+08:00"}],"HeadCommit":{"Sha1":"2bdc17dcf4587d11fa13e8961a83da952426fa3e","Message":"最新\n","AuthorEmail":"zhangjunnan@g-hi.com","AuthorName":"zhangjunnan","CommitterEmail":"zhangjunnan@g-hi.com","CommitterName":"zhangjunnan","Timestamp":"2026-06-11T13:28:40+08:00"},"CompareURL":"zhangjunnan/zhouhui/compare/22bc33a1f0f14a757dfd4b280668e152617b65d7...2bdc17dcf4587d11fa13e8961a83da952426fa3e","Len":1}...
|
1781155803
|
Edit
Delete
|
|
29423
|
5
|
5
|
5
|
116
|
0
|
0
|
refs/heads/feat/ms4-clients-image-publish
|
0
|
|
1789358504
|
Edit
Delete
|
|
29424
|
5
|
5
|
5
|
116
|
0
|
0
|
refs/heads/feat/ms4-clients-image-publish
|
0
|
{"Commits":[{"Sha1":"6696c8475 {"Commits":[{"Sha1":"6696c84752f17514ebec69e1788bcb93ee445db6","Message":"fix(governance): 端口一致性覆盖地板登记 client-audit 套件(34 例),测试夹具总数改由 PORT_SUITES 推导\n\ncheck:port-conformance 对 suite 数量与总数逐一核对,新增 S-6 套件必须同步登记,否则 suite coverage/count mismatch。\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-09-13T20:58:20-07:00"},{"Sha1":"edcb7a6da44583a9420636855c513feceb0d9dbe","Message":"feat(clients,governance): client-audit / client-ai 与镜像发布通道(MS-4 Manifest 缺项收口)\n\n- @juhai/client-audit@1.0.0-rc.0(CL-6):内核 AuditSinkPort → audit-append.v1 候选契约(POST /v1/audit/events 批量);\n 同步投递审计失败即写链失败;缓冲投递 = 宿主持久缓冲 + 稳定 event_id / digest 至少一次(C10.02);敏感 details 本地即拒;\n 单测 14 例;S-6 夹具对 stub server 四画像(sink / rejecting / 503 / down)同步 + 缓冲 34 例(runtime/test/port/client-audit.test.ts)\n- @juhai/client-ai@1.0.0-rc.0(CL-7):ai-route.v1 候选契约 SDK(POST /v1/ai/route 路由 → 网关端点 + secret:// 凭据引用;\n POST /v1/ai/usage usage_id 幂等记账,有界重试);未配置 / 传输失败一律拒绝,无静默回退;单测 14 例含 stub server 五画像\n- governance/publish-image.mjs(pnpm image:publish):clean head 构建的镜像推 registry,registry manifest digest 取自 push 输出并与\n RepoDigests 互证后写回 reports/image-digest.json(published / registryRef / registryDigest);不一致 / 取不到 / 源码不匹配即失败不改报告\n- governance/prepare-image-release.mjs:镜像发布门(runtime-v\u003csemver\u003e clean tag + 同源成功 CI + 候选 eligible + Required Check)\n- .github/workflows/publish-image.yml:手动通道 build → push → syft SBOM → cosign sign+verify → release:manifest → artifact(不改 main)\n- 治理测试 +17(publish-image.test.mjs);runbook §8 / staging 说明 §5 / owner-matrix / governance README / clients README 同步\n\nRelease Manifest:client-* 缺项 4 → 2(scope / credential 分别在 PR #32 / #42);registryDigest / signature 待 Secret 配置后 dispatch。\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-09-13T20:54:23-07:00"}],"HeadCommit":{"Sha1":"6696c84752f17514ebec69e1788bcb93ee445db6","Message":"fix(governance): 端口一致性覆盖地板登记 client-audit 套件(34 例),测试夹具总数改由 PORT_SUITES 推导\n\ncheck:port-conformance 对 suite 数量与总数逐一核对,新增 S-6 套件必须同步登记,否则 suite coverage/count mismatch。\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-09-13T20:58:20-07:00"},"CompareURL":"luoanwu/enterprise-platform/compare/3308542265e6a301126e1135310b11fbcddd5c5d...6696c84752f17514ebec69e1788bcb93ee445db6","Len":2}...
|
1789358504
|
Edit
Delete
|
|
20407
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/feat/multi-role-assignment
|
0
|
|
1785765661
|
Edit
Delete
|
|
20408
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/feat/multi-role-assignment
|
0
|
{"Commits":[{"Sha1":"744d532b8 {"Commits":[{"Sha1":"744d532b80ba3fd239cfbdd2b3700e3d73c08675","Message":"test(governance): 三级门禁全绿——runtime 396/396、UI 12/12,合同与多角色补齐验收\n\n本轮把欠了整条线的运行态证据补齐:静态 → 真实 DB → 浏览器三级全部实跑通过。\n\n## 合同域门禁(5 条断言 + 自检固化)\n`check:module-integration` 新增:渲染必须调 contracts 纯函数、清单必须走 contracts\n清洗、定稿必须校验金额、激活必须要求合同已定稿、合同列表必须有自己的读模型。\n5 条负向注入逐条实跑判红,并固化进 `scripts/lib/contract-integration.test.mjs`\n(fixture 隔离,不碰真文件;配「未注入 → 绿」基线用例,防止所有\"期望红\"\n以完全错误的理由通过)。gateSelftests 地板 6 → 7。\n\n其中「合同列表必须有自己的读模型」防的是真实发生过的缺陷:\n借用「待激活申请」options(只返 REQUESTED)会让财务一激活,刚签的合同就从界面消失。\n\n## 状态机不变量逼出的设计修正\n`contractMachine` 原本是 `DRAFT ⇄ FINALIZED` 的**无终态环**——合同永远走不完,\n而\"订单已激活则不可修改\"只是运行时守卫。contracts 的状态机不变量测试\n(\"从任一状态都能走到终态\")当场判红。加终态 `EFFECTIVE`,由财务激活时迁入:\n`revise` 从 EFFECTIVE 出发在**状态机层面就不存在**,运行时检查降为第二层。\n\n## 修掉一个我自己制造的严重问题\n早先用批量正则把测试里的 `role:` 改成 `roles:`,**误伤 153 处 `api()` helper 入参**。\n该 helper 收的是 `role`,`roles` 被静默忽略并回落成默认 ADMIN——\n**测试照样绿,但所有「某角色应当 403」的负例都退化成「ADMIN 当然 200」**。\n已全部回退。教训:批量正则改测试比改源码危险得多,源码有编译器兜底,测试没有。\n\n## 修掉一处静默降级(用户反馈两次)\n`draft()` 里 `template ? render(...) : \"\"`——取不到默认模板就给空正文,不报错不提示。\n而\"合同建出来了、正文是空的\"在界面上与\"模板没生效\"完全一样。改为:\n默认模板优先,没设默认但只有一个模板时直接采用;仍取不到时界面明确说明原因。\n另补「套用模板」选择器——此前 `templateId` 存了却从不重渲染,已有合同换不了模板。\n\n## 版式\n按反馈调整为:套用模板 → 合同正文 → 合同清单。\n打印改为只打这一份合同:`@media print` 内 5 条规则(全页隐藏 → 放行合同卡 →\n正文去滚动上限并允许换行 → 按钮与留证快照不打印),沿用配货单打印同一模式,\n含「window.print() 必须在原始 click 内同步调用」那条硬约束。\n\n## 三级门禁证据(本地工作区)\n- `pnpm check` exit 0;门禁自检 8 组\n- `pnpm check:runtime` **396/396**(地板抬至 380),双后端 HTTP 各 45/45\n- `pnpm check:ui` **12/12**,unexpected 0(地板抬至 12)\n- 新增双后端 HTTP 验收:未定稿激活 409 CONTRACT_NOT_FINALIZED、\n 改金额定稿 409 CONTRACT_TOTAL_MISMATCH、合同清单只有对客七列且不含 cost\n- 新增 E2E 真实界面链路:建模板 → 生成合同 → 断言正文按模板渲染 →\n 定稿 → 只读预览 → 激活\n\n## 顺带修复的真账\n多角色改造遗留:两后端测试夹具签单值 role、fromRole/toRole 断言、\nNestJS api() helper 签发、E2E 建账号入参、合同外键 Restrict 导致的清理顺序。\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-03T06:17:45-07:00"},{"Sha1":"0e13b856b65685957296087a642c46a9b57c8d0a","Message":"feat(contract): 合同管理界面——模板维护、清单改写、预览与定稿\n\n## 界面三段\n- **模板维护**:正文编辑 + 可用变量清单(真源是 contracts 白名单,不手抄);\n 默认模板里乙方那几行留了「请填写」占位提示,免得有人以为忘了配变量\n- **合同面板**:清单可改名称/规格/单位/备注,**单价与金额只读**——\n 金额与报价锁死,改写法不改钱,只读比\"改了再被服务端拒绝\"少一次挫败\n- **定稿后**:正文转只读预览 + 打印 + 撤回定稿;留证快照可展开查看\n\n## 浏览器验证时抓到一个真实缺陷\n最初用「待激活申请」的 options 驱动合同列表——而它只返 `status=REQUESTED`。\n结果是**财务一激活,刚签的合同就从界面上凭空消失**。\n补了 `GET /api/contracts` 作为合同自己的读模型(两后端对等),\n视图改为「已有合同 + 尚未起草的待激活申请」两段驱动,后者按 contractRequestId 去重。\n\n这个 bug 单测抓不到,也不会有任何红盘——它只在\"数据恰好处于某状态\"时显形,\n而 dev 库里正好一条 REQUESTED 都没有,所以一打开就是空白。\n\n## 前端不做第二份渲染\n预览直接显示服务端渲染好的 `body`,前端**没有任何占位符处理**。\n在前端补一套 replace 会变成第二份渲染实现(G17 漂移形态):\n两边看起来一样,直到某天对空值的处理不同,界面上好好的合同打印出来金额是空的。\n\n## 证据(本地工作区)\n- `pnpm check` exit 0;全仓 typecheck 0 错误\n- 浏览器实测:模板维护渲染、合同面板 1 个、状态「已定稿」、清单 1 行、\n 合计 ¥660000.00、预览/撤回定稿/打印按钮齐全(截图见会话)\n- `GET /api/contracts` 返回真实合同(编号、报价号、客户名、合计、定稿时间)\n\n## 未做\nE2E 用例、两后端 HTTP 验收、`check:module-integration` 合同断言均未补(#31)。\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-02T23:19:14-07:00"},{"Sha1":"ef882dee3f2d670038bff1151a04e6cb4a4d3d45","Message":"feat(contract): 合同管理落地——模板、清单清洗、预览、定稿快照与激活前置\n\n动手前先证伪了「优化完善」这个词:**本仓此前没有合同**。\n`ContractRequest` 只是流程凭证(状态 + 报价引用 + 拒绝留痕),没有正文、条款、\n甲乙方、签署;「合同管理」视图做的是财务把报价激活成订单,本质是审批队列。\n所以这是新建业务对象,不是加按钮。\n\n## 用户裁决(五条)\n模板+变量填充 / 定稿即快照 / 仅内部预览打印 / 乙方写进模板正文 / 定稿为激活前置。\n另就清单追加两条:只改写法金额锁死 / PUBLIC 附件归入主行备注。\n\n## 合同清单与报价清单是两份不同明细\n报价行 26 列里 9 列是内部的——成本价、底价、成本合计、低于底价标记、调价原因、\n标准价、三种折扣构成。投影**重建对象字面量**而不是删字段,成本列在结构上进不来\n(单测断言 Object.keys 恰为七列,并扫描序列化结果确认成本数字不出现)。\n最隐蔽的一条是 `QuoteLineAccessory.visibility=INTERNAL`:「别显示成本」人人记得,\n「别显示内部附件」没人会想到,因为它藏在子表里。\n\n**金额锁死**先验了算术前提才敢定:dev 库 `sum(quote_lines.total_cents)` 恒等于\n`quote_options.total_cents`,差额全为 0,否则这条不变量会一上线就误杀所有合同(C1 同型)。\n校验放在**定稿**而非每次保存——草稿期正在合并行,中间态必然对不上,\n每次都校验会让「合并两行」这个动作根本做不完。\n\n## 渲染两层 fail-closed\n未知变量、取不到值的变量都抛错并点名。理由:一份看起来正常、金额那行却空白的合同\n被打印去签,比当场报错危险一个量级。另单独检查未闭合 `{{`——它会被正则整段跳过,\n不专门查就会原样印进合同且无人报错。\n\n## 真实链路验证抓出两个 bug\n① `variablesSnapshot` 恒为空:起草时正文已渲染,到定稿时里面早没有 `{{}}` 可提取。\n 改为快照**全部可解析变量**——留证本就该全记,不该取决于模板作者当初印没印。\n② Fastify 路由多写了 `/api` 前缀(注册作用域已带 prefix),实际成了 `/api/api/...`。\n\n## 又踩了一次同字面量陷阱\nNestJS 激活前置最初插错位置——「仓库不存在」那段在文件里出现多次,\n`replace` 只换第一处,守卫落进了 `createStocktake`(盘点)。\n已改为断言锚点唯一性后再插入。CLAUDE.md 点名过两次的坑,我这是第三次踩。\n\n## 证据(本地工作区,Fastify 真实链路)\n- `pnpm check` exit 0;contracts 单测 302(新增 22 条合同用例)\n- 模板:经理可建 201 / 销售 403 / 未登记变量 409 点名「甲方开户行」\n- 合同:起草生成 1 行清单(七列,含\"含:附件\"备注)、正文变量全替换、大写金额正确\n- 定稿:改金额 → 409 报出差额 -10000.00 元;销售定稿 403;正确金额 → FINALIZED\n- 撤回定稿:订单已激活 → 409 ORDER_ALREADY_ACTIVATED\n- 缺税号时起草 → 409 MISSING_VALUE 点名「甲方税号」(真实数据触发,非构造)\n- 留证快照 12 项(缺签署人两项因该报价未走客户接受,属正确 fail-closed)\n\n## 未做(不隐藏)\n前端界面(模板维护/预览/修改)未做;两后端 HTTP 验收测试与 E2E 未补;\n`check:runtime`/`check:ui` 本轮未跑;激活前置只在代码与单测层验证,\n未构造完整「未定稿→拒绝激活」的真实 HTTP 流程(dev 库无待激活申请,\n且 quotation_id 唯一约束挡住了造数)。\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-02T23:07:37-07:00"},{"Sha1":"e0b780d18833713a675d8903f407bd7afd55e650","Message":"feat(auth): 多角色并存——一个账号可持多个角色,能力取并集,互斥组合硬禁止\n\n用户裁决两条:① 多角色并存(而非租户自定义角色);② 互斥组合硬禁止(而非仅警示)。\n\n## 为什么是多角色而不是自定义角色\n备选方案是「租户自建角色 + 勾选任意 capability 子集」。不选它只有一条理由但足够硬:\n那会把「谁能做什么」的真源从 ROLE_PERMISSION_MAP **搬进数据库**,\n`check:role-permissions` 里「数据库不另存权限副本」这条核心断言随即失效,\n排查越权要同时看代码和数据。多角色只在 DB 存**角色分配**,真源不动,门禁继续有牙。\n代价是表达力:拼不出「销售但能看成本」这种现有角色组合不出的能力集。**已知取舍,非遗漏。**\n\n## 互斥矩阵为什么按角色对而不是 capability 对\n按能力对看着更本质,实则注册即红:`FINANCE` 单角色本身就同时持有 `payment.record`\n与 `payment.confirm`,门禁上线当天就判自己违规(C1 同型:扫到自身定义源)。\n故定义在角色层,并由 `it.each(MANAGED_USER_ROLES)`「每个单角色都不触发冲突」常驻断言守住。\n三组:采购三责分离 / 收款与发货放行 / 财务发起与审批;ADMIN 须单独持有。\n**这挡不住 ADMIN**——它持全部 capability,三责分离对它本就不成立,\n所以审批动作仍按 actor 硬校验 `approver !== requester`,两层缺一不可。\n\n## 删掉 requestRole 是本次最关键的决定\n`hasRolePermission` 改为同时接受单角色与角色集,好让 185 处调用点逐字不变。\n但这带来一个隐患:若保留 `requestRole`/`RequestRole` 单值访问器,\n调用点会**照常编译通过、静默只按主角色授权**——并集悄悄失效,零红盘。\n删掉它,编译器逼出 122+29 个错误,一个都跑不掉。\n\n编译器抓不到的恰是最危险的一处:`lockActiveAdmins` 的裸 SQL `\"role\" = 'ADMIN'`。\n它绕过 Prisma 类型检查;若当初保留 role 列做「兼容」,这句会静默匹配陈旧数据——\n**最后管理员保护看似还在,锁的却是错的行**。这是坚持 DROP COLUMN(并按门禁写\n`migration-allow` 留痕)的真正理由。计数侧同理:数组列上等值查询恒不匹配,\n`count` 恒为 0 会让保护永远放行。\n\n## 顺带修掉一个存量 bug\n两后端 `reverseAllocation` 把**角色名当操作人**存进 `reversedBy`(`reversedBy: role` → \"FINANCE\")。\n列是 String? 所以静默收下,反核销记录追不到人。多角色改造让它变成类型错误才暴露,已改传 actor。\n\n## token 与失效语义\nclaims `role` → `roles`,**无兼容分支**:留着它,只带 `role` 的旧令牌会走进「按单角色授权」\n的窄路径而调用方以为拿到并集,这种不一致比直接 401 难查得多。旧令牌一律 401 CLAIMS。\n受管理令牌回查用 `sameRoleSet` **集合语义**——按数组逐位比会让管理员调整勾选顺序\n就把在线用户全部踢下线(同 sameTagSet 那条教训)。\n\n## 迁移\n两端对等:users.role → users.roles、user_events 角色快照转集合,先回填再删旧列。\nDROP COLUMN 与 CREATE INDEX 均按门禁要求加 `-- migration-allow:` 留痕。\n\n## 前端\n账号页角色由单选下拉改多选勾选,实时显示并集能力数与互斥冲突——\n预览调 contracts 同一个 `previewRoleAssignment`,不在前端另写一套 if。\n**前端只提示不裁决**:绕过 UI 直接 curl 照样 400。\n\n## 证据(本地工作区)\n- `pnpm check` exit 0;contracts 273/273(新增 33 条多角色单测);全仓 typecheck 0 错误\n- 门禁负向已实跑判红:注入「退化成只按主角色授权」→ check:role-permissions exit 1;\n 注入「待办中心放行全集」→ check:module-integration exit 1;均恢复后转绿\n- 迁移在 dev 库实跑:单角色→单元素集合、0 个空角色集账号、旧列已删\n- 真实 HTTP 四条对抗:仓库+采购 400 点名冲突/空集 400/ADMIN 混搭 400/销售+技术 201\n- 浏览器:多选控件 10 角色、并集能力数实时更新、互斥冲突当场提示\n\n## 未做(不隐藏)\n`check:runtime` 与 `check:ui` 本轮未实跑;两后端多角色 HTTP 验收与 E2E 用例尚未补齐。\n动态区 runtime/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-02T22:26:56-07:00"}],"HeadCommit":{"Sha1":"744d532b80ba3fd239cfbdd2b3700e3d73c08675","Message":"test(governance): 三级门禁全绿——runtime 396/396、UI 12/12,合同与多角色补齐验收\n\n本轮把欠了整条线的运行态证据补齐:静态 → 真实 DB → 浏览器三级全部实跑通过。\n\n## 合同域门禁(5 条断言 + 自检固化)\n`check:module-integration` 新增:渲染必须调 contracts 纯函数、清单必须走 contracts\n清洗、定稿必须校验金额、激活必须要求合同已定稿、合同列表必须有自己的读模型。\n5 条负向注入逐条实跑判红,并固化进 `scripts/lib/contract-integration.test.mjs`\n(fixture 隔离,不碰真文件;配「未注入 → 绿」基线用例,防止所有\"期望红\"\n以完全错误的理由通过)。gateSelftests 地板 6 → 7。\n\n其中「合同列表必须有自己的读模型」防的是真实发生过的缺陷:\n借用「待激活申请」options(只返 REQUESTED)会让财务一激活,刚签的合同就从界面消失。\n\n## 状态机不变量逼出的设计修正\n`contractMachine` 原本是 `DRAFT ⇄ FINALIZED` 的**无终态环**——合同永远走不完,\n而\"订单已激活则不可修改\"只是运行时守卫。contracts 的状态机不变量测试\n(\"从任一状态都能走到终态\")当场判红。加终态 `EFFECTIVE`,由财务激活时迁入:\n`revise` 从 EFFECTIVE 出发在**状态机层面就不存在**,运行时检查降为第二层。\n\n## 修掉一个我自己制造的严重问题\n早先用批量正则把测试里的 `role:` 改成 `roles:`,**误伤 153 处 `api()` helper 入参**。\n该 helper 收的是 `role`,`roles` 被静默忽略并回落成默认 ADMIN——\n**测试照样绿,但所有「某角色应当 403」的负例都退化成「ADMIN 当然 200」**。\n已全部回退。教训:批量正则改测试比改源码危险得多,源码有编译器兜底,测试没有。\n\n## 修掉一处静默降级(用户反馈两次)\n`draft()` 里 `template ? render(...) : \"\"`——取不到默认模板就给空正文,不报错不提示。\n而\"合同建出来了、正文是空的\"在界面上与\"模板没生效\"完全一样。改为:\n默认模板优先,没设默认但只有一个模板时直接采用;仍取不到时界面明确说明原因。\n另补「套用模板」选择器——此前 `templateId` 存了却从不重渲染,已有合同换不了模板。\n\n## 版式\n按反馈调整为:套用模板 → 合同正文 → 合同清单。\n打印改为只打这一份合同:`@media print` 内 5 条规则(全页隐藏 → 放行合同卡 →\n正文去滚动上限并允许换行 → 按钮与留证快照不打印),沿用配货单打印同一模式,\n含「window.print() 必须在原始 click 内同步调用」那条硬约束。\n\n## 三级门禁证据(本地工作区)\n- `pnpm check` exit 0;门禁自检 8 组\n- `pnpm check:runtime` **396/396**(地板抬至 380),双后端 HTTP 各 45/45\n- `pnpm check:ui` **12/12**,unexpected 0(地板抬至 12)\n- 新增双后端 HTTP 验收:未定稿激活 409 CONTRACT_NOT_FINALIZED、\n 改金额定稿 409 CONTRACT_TOTAL_MISMATCH、合同清单只有对客七列且不含 cost\n- 新增 E2E 真实界面链路:建模板 → 生成合同 → 断言正文按模板渲染 →\n 定稿 → 只读预览 → 激活\n\n## 顺带修复的真账\n多角色改造遗留:两后端测试夹具签单值 role、fromRole/toRole 断言、\nNestJS api() helper 签发、E2E 建账号入参、合同外键 Restrict 导致的清理顺序。\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-03T06:17:45-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/4e06b62635319faead311e0b6799c2e47877f859...744d532b80ba3fd239cfbdd2b3700e3d73c08675","Len":4}...
|
1785765661
|
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
|
|
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
|
|
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
|
|
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
|
|
20881
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/feat/multi-role-assignment
|
0
|
{"Commits":[{"Sha1":"bf778452d {"Commits":[{"Sha1":"bf778452d29f9965677f5d7eafdbd98843ef0ac6","Message":"fix(web): 内部售后建单表单幂等键在 resolver 前预生成(C29 回潮)\n\nAfterSalesWorkbench 的 CreateCaseForm 点「提交售后申请」静默无反应——\n不发请求、无报错。根因是 C29 的同一形态:idempotencyKey 默认 \"\",只在\nsubmit 回调**内部**用 `|| crypto.randomUUID()` 兜底;但 zodResolver 的\n`min(1)` 先于回调校验空串失败,回调永不执行、兜底成死代码;该字段又无输入框,\nFormMessage 无处渲染,用户零反馈。\n\nC29 的修复此前只打到公开客户表单 PublicFulfillmentView(挂载后预生成),\n没打到内部工作台表单。E2E 只走公开表单提交路径,HTTP 验收直接带 key 打 API,\n内部建单提交路径零覆盖——「测试路径 ≠ 运行路径」(P1)。\n\n修复:挂载后 useEffect 预生成 idempotencyKey(镜像公开表单);本表单提交后\nform.reset() 会把键清空,故 reset 后补发一次,保证可连续建单。\n\n验证(本地工作区,2026-08-05):\n- web typecheck 通过\n- 浏览器实测:客服建单 POST /api/after-sales → 201;自批 403 SELF_APPROVAL_FORBIDDEN;\n 换审批人 200;退款额度 ¥110,000 冻结\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-05T17:31:03-07:00"}],"HeadCommit":{"Sha1":"bf778452d29f9965677f5d7eafdbd98843ef0ac6","Message":"fix(web): 内部售后建单表单幂等键在 resolver 前预生成(C29 回潮)\n\nAfterSalesWorkbench 的 CreateCaseForm 点「提交售后申请」静默无反应——\n不发请求、无报错。根因是 C29 的同一形态:idempotencyKey 默认 \"\",只在\nsubmit 回调**内部**用 `|| crypto.randomUUID()` 兜底;但 zodResolver 的\n`min(1)` 先于回调校验空串失败,回调永不执行、兜底成死代码;该字段又无输入框,\nFormMessage 无处渲染,用户零反馈。\n\nC29 的修复此前只打到公开客户表单 PublicFulfillmentView(挂载后预生成),\n没打到内部工作台表单。E2E 只走公开表单提交路径,HTTP 验收直接带 key 打 API,\n内部建单提交路径零覆盖——「测试路径 ≠ 运行路径」(P1)。\n\n修复:挂载后 useEffect 预生成 idempotencyKey(镜像公开表单);本表单提交后\nform.reset() 会把键清空,故 reset 后补发一次,保证可连续建单。\n\n验证(本地工作区,2026-08-05):\n- web typecheck 通过\n- 浏览器实测:客服建单 POST /api/after-sales → 201;自批 403 SELF_APPROVAL_FORBIDDEN;\n 换审批人 200;退款额度 ¥110,000 冻结\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-05T17:31:03-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/d6b659343565a590d5c9d75adecc62710643a553...bf778452d29f9965677f5d7eafdbd98843ef0ac6","Len":1}...
|
1785976276
|
Edit
Delete
|
|
20882
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/feat/multi-role-assignment
|
0
|
{"Commits":[{"Sha1":"a3dd4914e {"Commits":[{"Sha1":"a3dd4914eeaa83dc5ac32695829417bdf1faf44a","Message":"test(web): E2E 覆盖内部售后建单表单提交(C29 回潮回归锁)\n\n上一提交(bf77845)修了内部售后工作台建单表单静默无 POST 的 bug,但 E2E 此前\n只覆盖公开客户表单(public-after-sales-create)的提交,内部工作台表单\n(after-sales-create-card)提交路径长期零覆盖——正是这个盲区让 C29 二次复发\n逃过所有门禁。\n\n本回归锁在履约闭环用例末尾走内部表单真实提交:选订单→联动带出商品→填量与原因→\n点「提交售后申请」,用 waitForResponse 捕 POST /api/after-sales。C29 回潮的形态是\n「提交静默无请求」,届时 waitForResponse 超时即红。状态断言用 \u003c500 而非 pin 201:\n本用例前序公开售后已在同一交付订单消耗过退货额度,内部再建可能 201 或 409,\n两者都证明「客户端校验通过 + POST 真发出 + 服务端处理」这条链通畅。\n\n负向验证(本会话):撤掉 AfterSalesWorkbench 挂载预生成后重跑 check:ui,本断言在\nwaitForResponse 处超时判红(error-context 确认按钮 active、表单已填、无 response);\n恢复修复后 12/12 复绿。报告 status=passed,绑定 bf77845。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-05T17:46:57-07:00"}],"HeadCommit":{"Sha1":"a3dd4914eeaa83dc5ac32695829417bdf1faf44a","Message":"test(web): E2E 覆盖内部售后建单表单提交(C29 回潮回归锁)\n\n上一提交(bf77845)修了内部售后工作台建单表单静默无 POST 的 bug,但 E2E 此前\n只覆盖公开客户表单(public-after-sales-create)的提交,内部工作台表单\n(after-sales-create-card)提交路径长期零覆盖——正是这个盲区让 C29 二次复发\n逃过所有门禁。\n\n本回归锁在履约闭环用例末尾走内部表单真实提交:选订单→联动带出商品→填量与原因→\n点「提交售后申请」,用 waitForResponse 捕 POST /api/after-sales。C29 回潮的形态是\n「提交静默无请求」,届时 waitForResponse 超时即红。状态断言用 \u003c500 而非 pin 201:\n本用例前序公开售后已在同一交付订单消耗过退货额度,内部再建可能 201 或 409,\n两者都证明「客户端校验通过 + POST 真发出 + 服务端处理」这条链通畅。\n\n负向验证(本会话):撤掉 AfterSalesWorkbench 挂载预生成后重跑 check:ui,本断言在\nwaitForResponse 处超时判红(error-context 确认按钮 active、表单已填、无 response);\n恢复修复后 12/12 复绿。报告 status=passed,绑定 bf77845。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-05T17:46:57-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/bf778452d29f9965677f5d7eafdbd98843ef0ac6...a3dd4914eeaa83dc5ac32695829417bdf1faf44a","Len":1}...
|
1785977229
|
Edit
Delete
|
|
20883
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/feat/multi-role-assignment
|
0
|
{"Commits":[{"Sha1":"1334a6214 {"Commits":[{"Sha1":"1334a6214585274050083c387a7fbbb5a591d308","Message":"docs(governance): C29 二次复发回灌——修复挂错消费者 + 内部提交路径零覆盖\n\n对抗式点击测试实打提交时抓到:C29 当初的「resolver 前预生成」只打到公开客户表单,\n内部售后工作台建单表单遗漏,点提交静默无 POST。已修(bf77845)+ 回归锁(a3dd491)。\nC29 行补记复发经过与通用教训:一个 bug 的修复挂在某个消费者上时,必须问同一 contracts\nschema 的其他消费者有没有同一个坑,并让门禁覆盖每一条提交路径而非只覆盖第一条。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-05T17:50:36-07:00"}],"HeadCommit":{"Sha1":"1334a6214585274050083c387a7fbbb5a591d308","Message":"docs(governance): C29 二次复发回灌——修复挂错消费者 + 内部提交路径零覆盖\n\n对抗式点击测试实打提交时抓到:C29 当初的「resolver 前预生成」只打到公开客户表单,\n内部售后工作台建单表单遗漏,点提交静默无 POST。已修(bf77845)+ 回归锁(a3dd491)。\nC29 行补记复发经过与通用教训:一个 bug 的修复挂在某个消费者上时,必须问同一 contracts\nschema 的其他消费者有没有同一个坑,并让门禁覆盖每一条提交路径而非只覆盖第一条。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-05T17:50:36-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/a3dd4914eeaa83dc5ac32695829417bdf1faf44a...1334a6214585274050083c387a7fbbb5a591d308","Len":1}...
|
1785977443
|
Edit
Delete
|
|
20884
|
5
|
5
|
5
|
72
|
0
|
0
|
refs/heads/feat/multi-role-assignment
|
0
|
{"Commits":[{"Sha1":"be1e0734c {"Commits":[{"Sha1":"be1e0734c39315b61a7bf452231a853f44866085","Message":"test(manual): 采集 spec 适配工作台 UI 改版(1–11 章绿,余记 backlog)\n\n2026-08-04 UI 改版(侧栏 6 组折叠 + 视图切换器、收款抽屉、后果确认框铺开、\n公开页一方案一链接单档投影、合同定稿成为激活前置)让手册截图采集大面积失效\n(采集是「有环境才跑、非门禁」的真实运行任务,改版后没有门禁会红——正是本仓\n两次为文档漂移付代价的形态 C14/C25)。\n\n本轮适配并经 build:manual 实跑通过第 1–11 章:\n- 移植 openWorkspaceEntry + workspaceTab helper,折叠入口(报价5/履约4/售后8)\n 改走「组条目 → 视图切换器 tab」的真实用户路径;第 1 章 nav-group 标注按 6 组重写\n- 报价发送补 send-quotation-dialog「确认发送」;申请合同补\n quotation-request-contract-dialog 确认;客户报价页去掉已下线的「选择方案」下拉、\n 「打开客户页」多档链接取 .first()\n- 第 13 章收款改为「选单 → 开 open-receivables-drawer 抽屉 → 切分期/收款 tab」,\n 状态标签改中文(RECORDED→待确认到账)\n\n未完成(文件头 backlog 详列):合同定稿新章节(激活前置,需先建模板)、收款抽屉\n后半(14 章开票/红冲/退款)、确认框簇、售后流水线;正文与 manifest 待全章绿后统一重生成。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-05T18:32:06-07:00"}],"HeadCommit":{"Sha1":"be1e0734c39315b61a7bf452231a853f44866085","Message":"test(manual): 采集 spec 适配工作台 UI 改版(1–11 章绿,余记 backlog)\n\n2026-08-04 UI 改版(侧栏 6 组折叠 + 视图切换器、收款抽屉、后果确认框铺开、\n公开页一方案一链接单档投影、合同定稿成为激活前置)让手册截图采集大面积失效\n(采集是「有环境才跑、非门禁」的真实运行任务,改版后没有门禁会红——正是本仓\n两次为文档漂移付代价的形态 C14/C25)。\n\n本轮适配并经 build:manual 实跑通过第 1–11 章:\n- 移植 openWorkspaceEntry + workspaceTab helper,折叠入口(报价5/履约4/售后8)\n 改走「组条目 → 视图切换器 tab」的真实用户路径;第 1 章 nav-group 标注按 6 组重写\n- 报价发送补 send-quotation-dialog「确认发送」;申请合同补\n quotation-request-contract-dialog 确认;客户报价页去掉已下线的「选择方案」下拉、\n 「打开客户页」多档链接取 .first()\n- 第 13 章收款改为「选单 → 开 open-receivables-drawer 抽屉 → 切分期/收款 tab」,\n 状态标签改中文(RECORDED→待确认到账)\n\n未完成(文件头 backlog 详列):合同定稿新章节(激活前置,需先建模板)、收款抽屉\n后半(14 章开票/红冲/退款)、确认框簇、售后流水线;正文与 manifest 待全章绿后统一重生成。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-05T18:32:06-07:00"},"CompareURL":"luoanwu/juhai-quotation-system/compare/1334a6214585274050083c387a7fbbb5a591d308...be1e0734c39315b61a7bf452231a853f44866085","Len":1}...
|
1785979947
|
Edit
Delete
|
|
19163
|
1
|
5
|
1
|
32
|
0
|
0
|
refs/heads/feat/multi-tenant
|
1
|
|
1785215714
|
Edit
Delete
|
|
19164
|
1
|
5
|
1
|
32
|
0
|
0
|
refs/heads/feat/multi-tenant
|
1
|
{"Commits":[{"Sha1":"4d3adab33 {"Commits":[{"Sha1":"4d3adab33937e145ac2c0329518019163bf00172","Message":"feat(tenant): add multi-merchant architecture\n\nBind merchant, platform, and frontend auth to separate scopes.\nScope business data, caches, media, and WebSocket rooms by merchant.\n\nBREAKING CHANGE: users.role is no longer read or written.\nRun sql/2026-07-28_add_multi_tenant.sql before deployment.\n","AuthorEmail":"121158035@qq.com","AuthorName":"zhangjunnan","CommitterEmail":"121158035@qq.com","CommitterName":"zhangjunnan","Timestamp":"2026-07-28T13:13:15+08:00"}],"HeadCommit":{"Sha1":"4d3adab33937e145ac2c0329518019163bf00172","Message":"feat(tenant): add multi-merchant architecture\n\nBind merchant, platform, and frontend auth to separate scopes.\nScope business data, caches, media, and WebSocket rooms by merchant.\n\nBREAKING CHANGE: users.role is no longer read or written.\nRun sql/2026-07-28_add_multi_tenant.sql before deployment.\n","AuthorEmail":"121158035@qq.com","AuthorName":"zhangjunnan","CommitterEmail":"121158035@qq.com","CommitterName":"zhangjunnan","Timestamp":"2026-07-28T13:13:15+08:00"},"CompareURL":"zhangjunnan/zhouhui/compare/17343d79db91c05d317145998ea1962645ee1b13...4d3adab33937e145ac2c0329518019163bf00172","Len":1}...
|
1785215714
|
Edit
Delete
|
|
19181
|
1
|
5
|
1
|
32
|
0
|
0
|
refs/heads/feat/multi-tenant
|
1
|
{"Commits":[{"Sha1":"bb26e7c67 {"Commits":[{"Sha1":"bb26e7c67797f97fd6d510d77049b892a7e93bbf","Message":"fix(tenant): align haihui deployment\n\nRebuild the tenant migration from the current online schema and create meeting_states when absent.\n\nUse haihui database and domain defaults while leaving database data and cloud Nginx/Docker configuration unchanged.\n\nMigration: run sqlnew/2026-07-28_multi_tenant_migration.sql once after backup.\n","AuthorEmail":"121158035@qq.com","AuthorName":"zhangjunnan","CommitterEmail":"121158035@qq.com","CommitterName":"zhangjunnan","Timestamp":"2026-07-28T13:47:49+08:00"}],"HeadCommit":{"Sha1":"bb26e7c67797f97fd6d510d77049b892a7e93bbf","Message":"fix(tenant): align haihui deployment\n\nRebuild the tenant migration from the current online schema and create meeting_states when absent.\n\nUse haihui database and domain defaults while leaving database data and cloud Nginx/Docker configuration unchanged.\n\nMigration: run sqlnew/2026-07-28_multi_tenant_migration.sql once after backup.\n","AuthorEmail":"121158035@qq.com","AuthorName":"zhangjunnan","CommitterEmail":"121158035@qq.com","CommitterName":"zhangjunnan","Timestamp":"2026-07-28T13:47:49+08:00"},"CompareURL":"zhangjunnan/zhouhui/compare/4d3adab33937e145ac2c0329518019163bf00172...bb26e7c67797f97fd6d510d77049b892a7e93bbf","Len":1}...
|
1785217698
|
Edit
Delete
|
|
19210
|
1
|
5
|
1
|
32
|
0
|
0
|
refs/heads/feat/multi-tenant
|
1
|
{"Commits":[{"Sha1":"0ac14d3dd {"Commits":[{"Sha1":"0ac14d3dd7490301d8ab62b52b96074a7136b0ae","Message":"feat(auth): split merchant and platform login\n","AuthorEmail":"121158035@qq.com","AuthorName":"zhangjunnan","CommitterEmail":"121158035@qq.com","CommitterName":"zhangjunnan","Timestamp":"2026-07-28T14:29:33+08:00"}],"HeadCommit":{"Sha1":"0ac14d3dd7490301d8ab62b52b96074a7136b0ae","Message":"feat(auth): split merchant and platform login\n","AuthorEmail":"121158035@qq.com","AuthorName":"zhangjunnan","CommitterEmail":"121158035@qq.com","CommitterName":"zhangjunnan","Timestamp":"2026-07-28T14:29:33+08:00"},"CompareURL":"zhangjunnan/zhouhui/compare/bb26e7c67797f97fd6d510d77049b892a7e93bbf...0ac14d3dd7490301d8ab62b52b96074a7136b0ae","Len":1}...
|
1785220204
|
Edit
Delete
|
|
19251
|
1
|
5
|
1
|
32
|
0
|
0
|
refs/heads/feat/multi-tenant
|
1
|
{"Commits":[{"Sha1":"3fbac823e {"Commits":[{"Sha1":"3fbac823ef2dcfd7660f2c682b1464773277f617","Message":"多租户\n","AuthorEmail":"121158035@qq.com","AuthorName":"zhangjunnan","CommitterEmail":"121158035@qq.com","CommitterName":"zhangjunnan","Timestamp":"2026-07-28T14:55:41+08:00"}],"HeadCommit":{"Sha1":"3fbac823ef2dcfd7660f2c682b1464773277f617","Message":"多租户\n","AuthorEmail":"121158035@qq.com","AuthorName":"zhangjunnan","CommitterEmail":"121158035@qq.com","CommitterName":"zhangjunnan","Timestamp":"2026-07-28T14:55:41+08:00"},"CompareURL":"zhangjunnan/zhouhui/compare/0ac14d3dd7490301d8ab62b52b96074a7136b0ae...3fbac823ef2dcfd7660f2c682b1464773277f617","Len":1}...
|
1785221755
|
Edit
Delete
|
|
19252
|
1
|
5
|
1
|
32
|
0
|
0
|
refs/heads/feat/multi-tenant
|
1
|
{"Commits":[{"Sha1":"af26d3e82 {"Commits":[{"Sha1":"af26d3e828cfe155dc5926f6165d3040599abf54","Message":"多租户\n","AuthorEmail":"121158035@qq.com","AuthorName":"zhangjunnan","CommitterEmail":"121158035@qq.com","CommitterName":"zhangjunnan","Timestamp":"2026-07-28T15:02:22+08:00"}],"HeadCommit":{"Sha1":"af26d3e828cfe155dc5926f6165d3040599abf54","Message":"多租户\n","AuthorEmail":"121158035@qq.com","AuthorName":"zhangjunnan","CommitterEmail":"121158035@qq.com","CommitterName":"zhangjunnan","Timestamp":"2026-07-28T15:02:22+08:00"},"CompareURL":"zhangjunnan/zhouhui/compare/3fbac823ef2dcfd7660f2c682b1464773277f617...af26d3e828cfe155dc5926f6165d3040599abf54","Len":1}...
|
1785222156
|
Edit
Delete
|
|
19269
|
1
|
5
|
1
|
32
|
0
|
0
|
refs/heads/feat/multi-tenant
|
1
|
{"Commits":[{"Sha1":"60df304f7 {"Commits":[{"Sha1":"60df304f776bef84382a0167be2220497cb26924","Message":"fix(settings): hide disabled merchant settings\n","AuthorEmail":"121158035@qq.com","AuthorName":"zhangjunnan","CommitterEmail":"121158035@qq.com","CommitterName":"zhangjunnan","Timestamp":"2026-07-28T15:15:05+08:00"},{"Sha1":"50ce6c2da9a0136ab7a3aa9c1e44bbb565ced0e5","Message":"feat(settings): add merchant default controls\n\nAdd MySQL 5.6 migration for platform defaults and merchant override state.\n","AuthorEmail":"121158035@qq.com","AuthorName":"zhangjunnan","CommitterEmail":"121158035@qq.com","CommitterName":"zhangjunnan","Timestamp":"2026-07-28T15:05:04+08:00"}],"HeadCommit":{"Sha1":"60df304f776bef84382a0167be2220497cb26924","Message":"fix(settings): hide disabled merchant settings\n","AuthorEmail":"121158035@qq.com","AuthorName":"zhangjunnan","CommitterEmail":"121158035@qq.com","CommitterName":"zhangjunnan","Timestamp":"2026-07-28T15:15:05+08:00"},"CompareURL":"zhangjunnan/zhouhui/compare/af26d3e828cfe155dc5926f6165d3040599abf54...60df304f776bef84382a0167be2220497cb26924","Len":2}...
|
1785223066
|
Edit
Delete
|