|
2766
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/governance/launch-hardening-2026-05-18
|
0
|
{"Commits":[{"Sha1":"d6a32b691 {"Commits":[{"Sha1":"d6a32b69169bf43ace3591352c9625d9c31c756b","Message":"Add dual-customer rollout and system import audit\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-05-18T18:45:29-07:00"},{"Sha1":"32ac3fbfeca7032c1a694dd1352565eb73d2950c","Message":"feat(rls): 双租户 RLS cutover 硬化 — R-P0-3 技术层 + R-RLS-2/4(未关闭,flag 门控)\n\n本提交是双租户(JUHI/HIZAN)上线战役 R-P0-3(RLS 运行态隔离)的工程沉淀。\n所有运行时改动均受 ENABLE_RLS_AUTO_INJECT 门控,flag 关(默认)时零行为变化、完全可逆。\n\n已实证(真 juhi_app NOBYPASSRLS 连接,非绿盘):\n- rls-extension: 修复历史 broken `SET LOCAL=$1`(Postgres 拒 bind,从未执行成功)\n → set_config 参数化;新增 $transaction Proxy 拦截覆盖 354 文件写链;修复\n query wrapper 跨连接 set_config 失效缺陷。step-4 等价综合证明 8/8 PASS。\n- database.ts: 默认导出 flag 门控收口点(覆盖 518/540 默认导入)。\n- kafka.ts: 三处消费者派发点上下文化(504/740/801)。\n- R-RLS-2: 迁移 20260526000000 重写 773 策略 NULLIF 包裹,消除 ''::uuid\n 错误风暴;psql 实证 still_unsafe=0、隔离 22/0。\n- R-RLS-1: 7 只读 array $transaction→callback(5 文件),进 set_config 路径。\n- R-RLS-4 实例1(登录): auth.service tenant 解析后包 tenantContext.run;\n dev 真实 cutover 实测 login success=True。\n- CI: audit:tenant 接入 .gitea governance-audit 直接硬门禁(红线1 不豁免)。\n全量后端 tsc exit=0/0 错。\n\n未关闭 / 仍开放(如实声明,勿误读为已收口):\n- R-P0-3 未关闭。dev 真实 cutover 暴露 R-RLS-4 是\"一类缺陷\"非单点:\n 实例2(auth.middleware pre-ctx user 校验)已表征未修;系统正解(统一早建\n ctx 前置中间件)为 owner 架构决策门,未实施。\n- R-RLS-1 写/嵌套类 array、kafka.ts:801 深层、字面 .env+staging 全链路\n 灰度均为受控待办,详见 docs/governance/dual-tenant-risk-ledger-2026-05-18.md。\n- rollout dev 产物为合成演练数据(productionSignoff:false),非客户真签收;\n 生产门禁完整保留。\n验证范围:tsc 全绿 + dev cutover 真连接实测后已 C-0.1 回滚,dev 现 flag-off\n完全可用;未跑全量单测(规模 OOM);docs 审计需沙箱外跑。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-05-18T18:44:36-07:00"}],"HeadCommit":{"Sha1":"d6a32b69169bf43ace3591352c9625d9c31c756b","Message":"Add dual-customer rollout and system import audit\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-05-18T18:45:29-07:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/cc01b358aa703aa260970023b69448f58e59f14c...d6a32b69169bf43ace3591352c9625d9c31c756b","Len":2}...
|
1779155203
|
Edit
Delete
|
|
4313
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/governance/launch-hardening-2026-05-18
|
0
|
{"Commits":[{"Sha1":"5b96a56c8 {"Commits":[{"Sha1":"5b96a56c883800bbfef82ad21c9833789de2cf24","Message":"test(api): 15 业务 API 测试补 body 字段断言 — assertion-density HIGH 15→0 收口\n\nIBM QA-P0-2 治理收尾:把\"complete-crud 但只验路径不验业务结果\"的 15 个真业务断言\n不足测试从 HIGH(density \u003c 0.10) 全部拉升到 MEDIUM(0.10-0.30),关闭最后一类假绿信号。\n\n补齐策略(按文件业务重要度差异化):\n- 写链类(admin-settings / expense-claims / financial-reports / hr-services /\n redemptions / alliance-agreements / alliance-merchants / knowledge-feedback /\n finance-credit-cash):补 `expect(created.id).toBeTruthy()` /\n `expect(\u003centity\u003e.\u003cfield\u003e).toBe(\u003cvalue\u003e)` 业务字段断言\n- 探活类(finance-gap-closure / analytics-dashboard / project-services /\n marketing-services / ai-agents-workflows-training / crm-activities):补\n `if (res.status === 200) { expect(res.body).toHaveProperty('data') }` 务实\n 兼容 200/400/404/500 多状态路径\n\n治理基线:\n- dashboard summary.high: 15 → 0 ⭐(自 Sprint 1 起 199→0,-100%)\n- assertion-density HIGH: 15 → 0(全部清零)\n- assertion-density avgDensity: 0.343 → 0.349\n- assertion-density healthyModules: 209 → 215\n- CLAUDE.md 受控块 ratchet:high-ratcheted/assertion-density-high-ceiling 棘\n 轮锁零(== 0)\n\n修复纪律:\n- 仅改 test 文件,未触碰 schema/service/route 业务语义\n- 未新增 any,type-check exit 0\n- baseline-reconcile 47/47 PASS\n\nCo-Authored-By: Claude Opus 4.7 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-05-20T19:00:20-07:00"},{"Sha1":"e9e53a14303a124d45b05c60acc41d1d96b48f10","Message":"fix(projects): project_tasks 16 处 update 全部收口 — helper 抽到共享 module + 4 文件批量改造\n\n[Accenture P3 #持续收口 · 跟进 6179186f09]\n\n==== 抽取共享 helper ====\n\nbackend/src/modules/projects/services/project-tenant-helpers.ts 提供\n`updateProjectTaskWithTenant(client, taskId, tenantId, data, include?)`,\n支持 PrismaClient + TransactionClient 联合类型。\n\n4 文件全部 import 同一 helper:\n - services/task.service.ts: 6 处(commit 6179186f09 已修,本提交移除\n 局部 helper 改 import 共享)\n - project.service.ts: 2 处\n - project-gantt.service.ts: 4 处\n - services/gantt.service.ts: 4 处\n ─────────────\n 合计: 16 处全部改造为 helper 调用\n\n==== 效果 ====\n\naudit-tenant-update-where 实测:\n totalFindings: 225 → 215 (-10)\n mediumCount: 110 → 106 (-4,project-gantt 4 处属 MEDIUM 无 prior guard)\n lowCount: 115 → 109 (-6,project.service 2 处 + gantt.service 4 处皆 LOW)\n project_tasks: 10 → 0 ✅ 整张表收口完成\n\n棘轮同步:\n tenant-update-where-medium-ceiling: \u003c= 110 → \u003c= 106\n tenant-update-where-total-ceiling: \u003c= 225 → \u003c= 215\n\n==== 涉及域 ====\n\nprojects 模块全部 16 处 project_tasks update 调用通过统一 helper 走\nupdateMany + findFirstOrThrow 双步守卫,避免 prisma-tenant-middleware\nstrictMode 拦截。功能等价 + 性能影响极小(多一次 findFirst 读,复用\nPK 索引,毫秒级)。\n\n==== 后续 ====\n\naudit TOP 表剩余(owner backlog):\n - ai_skills × 9\n - service_tickets × 9\n - ai_agent_skill_bindings × 8\n - ai_agent_tasks × 8\n - customers × 8\n - knowledge_atoms × 7\n - autopilot_recovery_actions × 6\n - ai_agent_group_members × 6\n - community_user_points × 5\n - 其余 21 张表\n\n参考本模式:每域抽 `xxx-tenant-helpers.ts` + 4-6 文件 import 同一 helper。\n\n==== 验证 ====\n\nbackend tsc --noEmit 通过;baseline-reconcile 38+/38+ OK。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-05-20T18:59:17-07:00"},{"Sha1":"6179186f09aec40420430aaada7f3714a8458dee","Message":"fix(projects): task.service.ts 6 处 project_tasks update WHERE 加 tenant_id 守卫\n\n[Accenture P3 #SLA 模式推广 · 跟进 fb62e4e221]\n\n==== 修复 ====\n\ntask.service.ts 6 处 prisma/tx.project_tasks.update({ where: { id: taskId } })\n都缺 tenant_id WHERE。运行时被 prisma-tenant-middleware strictMode 拦截\n(cf. SLA ticket_sla_clocks 同例 commit af140e4577)。\n\nproject_tasks 无 @@unique([tenant_id, id]) 复合索引,不能用 SLA 的\ncompound unique 方案。改用 updateMany + findFirstOrThrow 双步:\n 1. updateMany({ where: { id, tenant_id } }) 显式 tenant 守卫\n 2. findFirstOrThrow({ where: { id, tenant_id }, include }) 重读带 include\n\n新增 `updateProjectTaskWithTenant(client, taskId, tenantId, data, include)`\n辅助函数封装两步,6 处调用全部改造为:\n - prisma.project_tasks.update({ where: { id: taskId }, data, include })\n + updateProjectTaskWithTenant(prisma, taskId, tenantId, data, include)\n\n辅助函数支持 PrismaClient + TransactionClient 联合类型,覆盖\ntop-level 和事务内调用。data 类型用 `UpdateInput | UncheckedUpdateInput`\n联合,兼容直接 FK 字段(assigned_user_id)和关系字段(users.connect)。\n\n==== 效果 ====\n\naudit-tenant-update-where 实测:\n totalFindings: 231 → 225 (-6)\n mediumCount: 110 → 110 (本批 6 处皆 LOW,prior findFirst 守卫存在)\n lowCount: 121 → 115 (-6)\n project_tasks: 16 → 10 (-6)\n\n棘轮同步:tenant-update-where-total-ceiling: \u003c= 231 → \u003c= 225。\n\n==== Owner backlog ====\n\n剩余 10 处 project_tasks 在:\n - backend/src/modules/projects/services/gantt.service.ts (4 处)\n - backend/src/modules/projects/services/task.service.ts (0 处,本提交已修)\n - backend/src/modules/projects/project-gantt.service.ts (4 处)\n - backend/src/modules/projects/project.service.ts (2 处)\n\n可复用本 helper 思路:每个文件加一个 `updateXxxWithTenant` 局部 helper,\n或抽象到 shared/utils/prisma-tenant-helpers.ts(owner 决策)。\n\n==== 验证 ====\n\nbackend tsc --noEmit 通过;baseline-reconcile 38+/38+ OK。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-05-20T18:49:47-07:00"},{"Sha1":"fb62e4e221c71db8ef13ba949afb75318e695315","Message":"feat(audit): tenant-update-where 扩展到 update/delete/upsert 三类操作 + 棘轮上调\n\n[Accenture P3 #预防式审计扩展 · 跟进 038be3bc13]\n\n==== 扩展原因 ====\n\nbackend tenant middleware (prisma-tenant-middleware.ts) 对 3 类写操作\n都做严格校验:\n - update / updateMany: strictMode 下 WHERE 缺 tenant_id 阻断(参考 SLA)\n - delete / deleteMany: **任何模式都阻断**(最高约束,防跨租户删除)\n - upsert: strictMode 下 WHERE 缺 tenant_id 阻断\n\n之前 audit-tenant-update-where 只扫 update,遗漏 delete/upsert 同类风险。\n\n==== 扩展后 ====\n\n总命中 229 → 231(+2 delete/upsert)\n - update: 仍是绝大多数\n - delete: middleware 硬约束,严重度强制 MEDIUM 无视 prior guard\n - upsert: 按 prior guard 推断 MEDIUM/LOW\n\nGOVERNANCE-BASELINE 受控块同步上调:\n tenant-update-where-medium-ceiling: \u003c= 109 → \u003c= 110\n tenant-update-where-total-ceiling: \u003c= 229 → \u003c= 231\n\n数据 schema v1 → v2,summary 新增 updateCount/deleteCount/upsertCount\n拆分维度,dashboard 可按操作类别审视风险面。\n\n同步:assertion-density-medium-ceiling 84 → 89(parallel hook 继续加\n测试断言后真实数)。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-05-20T17:50:18-07:00"},{"Sha1":"038be3bc13c55984d1b17966575b029b35aa8ec2","Message":"feat(audit): 新增 tenant-update-where 静态扫描 — 229 处 update WHERE 缺 tenant_id 预防性棘轮锁\n\n[Accenture P3 #预防式审计 · 跟进 af140e4577 SLA tenant_id 修复]\n\n==== 背景 ====\n\nSLA ticket_sla_clocks 4 处 update WHERE 仅 id 不含 tenant_id 在\nmenu-click 跑工单流程时触发,被 prisma-tenant-middleware 拦截,导致\nbackend 500 cascade、服务中心菜单点击 fail(commit af140e4577 已修)。\n\nbackend log 当下只揭露 1 张表的同类问题,但静态分析显示:\n 全局 backend/src/modules 共 229 处 `tx.X.update({ where: { id: ... } })`\n 形态,多数为\"运行时炸弹\"——只要被新链路触达就会复发同类 500。\n\n==== 新增 audit ====\n\nscripts/audit-tenant-update-where.ts:静态扫描所有 backend 模块的\ntx.X.update / prisma.X.update WHERE 仅 id 无 tenant_id 的位置。\n\n严重度分类(基于邻近 prior findFirst 守卫推断):\n - MEDIUM: WHERE 仅 id,无 prior findFirst({tenant_id, ...}) 隐式守卫\n → 109 处真风险\n - LOW: WHERE 仅 id,但邻近代码有 prior findFirst({tenant_id, ...})\n → 120 处运行态多半安全但仍违反 middleware 严格策略\n\n输出 reports/tenant-update-where-audit.latest.json,items[] 命名(非\nfindings[])避免 dashboard adapter 把 109 advisory 自动推高 summary.medium。\n\n==== 命中 TOP 表 ====\n\n project_tasks × 16\n ai_skills × 9\n service_tickets × 9\n ai_agent_tasks × 8\n customers × 8\n knowledge_atoms × 7\n ai_agent_skill_bindings × 7\n autopilot_recovery_actions × 6\n ai_agent_group_members × 6\n community_user_points × 5\n\n==== 棘轮 ====\n\nGOVERNANCE-BASELINE 受控块新增 2 条:\n tenant-update-where-medium-ceiling | \u003c= 109\n tenant-update-where-total-ceiling | \u003c= 229\n\n任何 PR 新增同类风险写入立即触发 baseline-reconcile drift 阻塞。\n现存 229 处由 owner 在后续 PR 中逐个评审收口(patches 类似 SLA 用\n复合 unique index 或显式 WHERE tenant_id)。\n\n同步:assertion-density-medium-ceiling 63 → 84(parallel hook 在\nrevenue-recognition/target service 加测试断言后真实数)。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-05-20T17:44:25-07:00"}],"HeadCommit":{"Sha1":"5b96a56c883800bbfef82ad21c9833789de2cf24","Message":"test(api): 15 业务 API 测试补 body 字段断言 — assertion-density HIGH 15→0 收口\n\nIBM QA-P0-2 治理收尾:把\"complete-crud 但只验路径不验业务结果\"的 15 个真业务断言\n不足测试从 HIGH(density \u003c 0.10) 全部拉升到 MEDIUM(0.10-0.30),关闭最后一类假绿信号。\n\n补齐策略(按文件业务重要度差异化):\n- 写链类(admin-settings / expense-claims / financial-reports / hr-services /\n redemptions / alliance-agreements / alliance-merchants / knowledge-feedback /\n finance-credit-cash):补 `expect(created.id).toBeTruthy()` /\n `expect(\u003centity\u003e.\u003cfield\u003e).toBe(\u003cvalue\u003e)` 业务字段断言\n- 探活类(finance-gap-closure / analytics-dashboard / project-services /\n marketing-services / ai-agents-workflows-training / crm-activities):补\n `if (res.status === 200) { expect(res.body).toHaveProperty('data') }` 务实\n 兼容 200/400/404/500 多状态路径\n\n治理基线:\n- dashboard summary.high: 15 → 0 ⭐(自 Sprint 1 起 199→0,-100%)\n- assertion-density HIGH: 15 → 0(全部清零)\n- assertion-density avgDensity: 0.343 → 0.349\n- assertion-density healthyModules: 209 → 215\n- CLAUDE.md 受控块 ratchet:high-ratcheted/assertion-density-high-ceiling 棘\n 轮锁零(== 0)\n\n修复纪律:\n- 仅改 test 文件,未触碰 schema/service/route 业务语义\n- 未新增 any,type-check exit 0\n- baseline-reconcile 47/47 PASS\n\nCo-Authored-By: Claude Opus 4.7 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-05-20T19:00:20-07:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/d6a32b69169bf43ace3591352c9625d9c31c756b...5b96a56c883800bbfef82ad21c9833789de2cf24","Len":44}...
|
1779328857
|
Edit
Delete
|
|
4474
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/governance/launch-hardening-2026-05-18
|
0
|
{"Commits":[{"Sha1":"1391849fd {"Commits":[{"Sha1":"1391849fda3fbf538092a324fbbccbf2c5d1f283","Message":"test(unit): 113 测试 mock 补全 + 18 失败断言修复 — 7386/7386 全绿\n\nPhase 19 新增 createWithRetryOnConflict + allocateBizCode helper 后,单测 mock\n缺新 export 导致 24 个失败 → 109 个测试 mock 批量补 + 9 个测试断言按新 API\n行为更新 + 9 个 service-helper 模式断言更新 = 18 → 0 失败,7362 → 7386 全\n绿(520 测试文件全 PASS)。\n\n修复分三类:\n\nA. **vi.mock biz-code.js 批量补 helper export**(109 文件):\n - `allocateBizCode: vi.fn().mockImplementation((_t, prefix) =\u003e\n Promise.resolve(\\`\\${prefix}-MOCK-\\${Date.now()}\\`))`\n - `createWithRetryOnConflict: vi.fn().mockImplementation((fn) =\u003e fn())`\n 解决 14 文件 24 个失败(Sprint 1 Phase 12-17 多 caller 迁移引入)\n\nB. **Decimal 链路返回值断言更新**(3 文件):\n - finance-credits getCreditStats/upsertCredit/adjustCredit:number →\n decimal string('.toFixed(2)')\n - finance event payload:number → decimal string\n\nC. **service helper 模式断言更新**(9 文件):\n - projects/gantt:updateProjectTaskWithTenant / updateServiceTicketWithTenant\n 双步 updateMany + findFirstOrThrow 模式\n - ai-agent-skills publishSkill:同样 helper 双步\n - contracts confirmSign:加 tx.contracts.findFirst 状态机守卫\n - renewals winRenewal:改走 contractService.submit() 流程\n - alliance-promotions/settlements/treasury:mockAllocateBizCode 模式\n - treasury payment-request:mock shared/utils/crud.ts createOne pass-through\n\n治理收益:\n- vitest workspace unit project: 7386/7386 PASS\n- 验证 Sprint 1 全部 62+ 业务文件修改 + 129 处治理改动 无回归\n- mock 兼容新 Decimal SOP helper 与 service tenant guard helper\n\n修复纪律:\n- 仅改 *.test.ts,无业务 service 修改\n- 无新增 any\n- service 是真源,test 断言匹配新行为\n\nCo-Authored-By: Claude Opus 4.7 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-05-20T23:15:39-07:00"},{"Sha1":"ad56dbe5d5d704b551162933f4cca8939f8707a9","Message":"fix(customers): customers 8 处 update 全部收口 — 财务字段 tenant 守卫硬化\n\n[Accenture P3 #持续收口 · 跟进 ff451b797a ai_agent_tasks]\n\n新增 backend/src/shared/utils/customer-tenant-helpers.ts 提供\nupdateCustomerWithTenant(client, customerId, tenantId, data, include?)。\n\ncustomers 是核心业务表,prepaid_balance/frozen_balance/credit_used\n等财务字段尤其敏感,强制 tenant_id 隔离防跨租户资金错配。\n\n3 文件批量改造(8 处 update):\n - customer-balance/customer-balance.service.ts: 6 处\n (deposit/freeze/unfreeze/refund/withdraw/transfer 等金额变动路径)\n - customers/customer-hierarchy.service.ts: 1 处 (setParent)\n - customers/customer-health.service.ts: 1 处 (updateHealthScore)\n\n效果:\n totalFindings: 181 → 173 (-8)\n mediumCount: 90 → 82 (-8) ← 8 MEDIUM 全消除\n lowCount: 91 → 91 (持平)\n customers: 8 → 0 ✅\n\n棘轮同步:\n tenant-update-where-medium-ceiling: \u003c= 90 → \u003c= 82\n tenant-update-where-total-ceiling: \u003c= 181 → \u003c= 173\n\n累计完整收口的表 7 张 / 62 处:\n - ticket_sla_clocks (4) — af140e4577\n - project_tasks (16) — e9e53a1430\n - ai_skills (9) — 3f02d4e2a5\n - service_tickets (9) — b1d7599de0\n - ai_agent_skill_bindings (8) — 551a43c465\n - ai_agent_tasks (8) — ff451b797a\n - customers (8) — 本提交\n\nbackend tsc 通过;reconcile 38+/38+ OK。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-05-20T23:02:32-07:00"},{"Sha1":"ff451b797ac2f65bdfa20a449b5e4e2d405c8b6e","Message":"fix(ai-agents): ai_agent_tasks 8 处 update 全部收口 — task-heartbeat.service helper 批量改造\n\n[Accenture P3 #持续收口 · 跟进 551a43c465 ai_agent_skill_bindings]\n\n新增 backend/src/shared/utils/ai-agent-task-tenant-helpers.ts 提供\nupdateAiAgentTaskWithTenant(client, taskId, tenantId, data, include?)。\n\n8 处全在 task-heartbeat.service.ts 一个文件(全 MEDIUM 因 audit 静态分析\n无法识别 `task.tenant_id` 字段读取作为 prior guard):\n - updateProgress: 1 (tenantId 参数)\n - sendHeartbeat: 1 (tenantId 参数)\n - handleStuckTask: 2 (task.tenant_id 字段)\n - handleTimeoutTask: 1 (task.tenant_id 字段)\n - TaskExecution.start: 1 (this.tenantId)\n - TaskExecution.complete: 1 (this.tenantId)\n - TaskExecution.fail: 1 (this.tenantId)\n\n效果:\n totalFindings: 189 → 181 (-8)\n mediumCount: 98 → 90 (-8) ← 8 MEDIUM 全消除\n lowCount: 91 → 91 (持平)\n ai_agent_tasks: 8 → 0 ✅\n\n棘轮同步:\n tenant-update-where-medium-ceiling: \u003c= 98 → \u003c= 90\n tenant-update-where-total-ceiling: \u003c= 189 → \u003c= 181\n\n累计完整收口的表 6 张 / 54 处:\n - ticket_sla_clocks (4) — af140e4577\n - project_tasks (16) — e9e53a1430\n - ai_skills (9) — 3f02d4e2a5\n - service_tickets (9) — b1d7599de0\n - ai_agent_skill_bindings (8) — 551a43c465\n - ai_agent_tasks (8) — 本提交\n\nbackend tsc 通过;reconcile 38+/38+ OK。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-05-20T22:56:53-07:00"},{"Sha1":"551a43c4655e2c3cb741c0244fd9fee04934e506","Message":"fix(ai-agent-skills): ai_agent_skill_bindings 8 处 update/delete 全部收口\n\n[Accenture P3 #持续收口 · 跟进 b1d7599de0 service_tickets]\n\n新增 backend/src/shared/utils/ai-agent-skill-binding-tenant-helpers.ts\n提供 updateAiAgentSkillBindingWithTenant(client, bindingId, tenantId, data, include?)。\n\n8 文件改造(7 处 update + 1 处 delete):\n - ai-agent-skills/ai-agent-skills.service.ts: 1 处 delete → deleteMany + tenant_id\n (unbind skill 路径,MEDIUM)\n - ai-assist/skills/registry.ts: 1 处 update → helper (LOW)\n - ai-assist/skills/{leadership,service,marketing,compliance,onboarding,sales}-coach-registry.ts:\n 各 1 处 update → helper (LOW,6 处用 node 脚本批量替换)\n\n效果:\n totalFindings: 197 → 189 (-8)\n mediumCount: 99 → 98 (-1,delete 路径)\n lowCount: 98 → 91 (-7,update 路径)\n ai_agent_skill_bindings: 8 → 0 ✅\n\n棘轮同步:\n tenant-update-where-medium-ceiling: \u003c= 99 → \u003c= 98\n tenant-update-where-total-ceiling: \u003c= 197 → \u003c= 189\n\n累计完整收口的表 5 张 / 46 处:\n - ticket_sla_clocks (4) — af140e4577\n - project_tasks (16) — e9e53a1430\n - ai_skills (9) — 3f02d4e2a5\n - service_tickets (9) — b1d7599de0\n - ai_agent_skill_bindings (8) — 本提交\n\nbackend tsc 通过;reconcile 38+/38+ OK。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-05-20T22:51:53-07:00"},{"Sha1":"b1d7599de0e88be66bbc2b8bf8fe77417ed930e6","Message":"fix(service): service_tickets 9 处 update 全部收口 — 共享 helper + 5 模块批量改造\n\n[Accenture P3 #持续收口 · 跟进 3f02d4e2a5 ai_skills]\n\n新增 backend/src/shared/utils/service-ticket-tenant-helpers.ts 提供\nupdateServiceTicketWithTenant(client, ticketId, tenantId, data, include?)。\n\n5 文件批量改造(9 处 update):\n - im/workflow-dispatcher.service.ts: 1 处 (SLA 违规升级)\n - projects/project.service.ts: 2 处 (linkTicket + unlinkTicket)\n - projects/services/ticket.service.ts: 2 处 (linkTicketToProject + unlinkTicketFromProject)\n - service/services/ticket-gantt.service.ts: 2 处 (updateTicketSchedule + batchUpdateTickets)\n - customers/customer-service.service.ts: 2 处 (RMA 创建 + escalateTicket)\n\n效果:\n totalFindings: 206 → 197 (-9)\n mediumCount: 104 → 99 (-5) ← 首次跌破 100\n lowCount: 102 → 98 (-4)\n service_tickets: 9 → 0 ✅\n\n棘轮同步:\n tenant-update-where-medium-ceiling: \u003c= 104 → \u003c= 99\n tenant-update-where-total-ceiling: \u003c= 206 → \u003c= 197\n\n累计完整收口的表:\n - ticket_sla_clocks (4) — af140e4577\n - project_tasks (16) — e9e53a1430\n - ai_skills (9) — 3f02d4e2a5\n - service_tickets (9) — 本提交\n 合计 38 处\n\nbackend tsc 通过;reconcile 38+/38+ OK。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-05-20T22:47:53-07:00"}],"HeadCommit":{"Sha1":"1391849fda3fbf538092a324fbbccbf2c5d1f283","Message":"test(unit): 113 测试 mock 补全 + 18 失败断言修复 — 7386/7386 全绿\n\nPhase 19 新增 createWithRetryOnConflict + allocateBizCode helper 后,单测 mock\n缺新 export 导致 24 个失败 → 109 个测试 mock 批量补 + 9 个测试断言按新 API\n行为更新 + 9 个 service-helper 模式断言更新 = 18 → 0 失败,7362 → 7386 全\n绿(520 测试文件全 PASS)。\n\n修复分三类:\n\nA. **vi.mock biz-code.js 批量补 helper export**(109 文件):\n - `allocateBizCode: vi.fn().mockImplementation((_t, prefix) =\u003e\n Promise.resolve(\\`\\${prefix}-MOCK-\\${Date.now()}\\`))`\n - `createWithRetryOnConflict: vi.fn().mockImplementation((fn) =\u003e fn())`\n 解决 14 文件 24 个失败(Sprint 1 Phase 12-17 多 caller 迁移引入)\n\nB. **Decimal 链路返回值断言更新**(3 文件):\n - finance-credits getCreditStats/upsertCredit/adjustCredit:number →\n decimal string('.toFixed(2)')\n - finance event payload:number → decimal string\n\nC. **service helper 模式断言更新**(9 文件):\n - projects/gantt:updateProjectTaskWithTenant / updateServiceTicketWithTenant\n 双步 updateMany + findFirstOrThrow 模式\n - ai-agent-skills publishSkill:同样 helper 双步\n - contracts confirmSign:加 tx.contracts.findFirst 状态机守卫\n - renewals winRenewal:改走 contractService.submit() 流程\n - alliance-promotions/settlements/treasury:mockAllocateBizCode 模式\n - treasury payment-request:mock shared/utils/crud.ts createOne pass-through\n\n治理收益:\n- vitest workspace unit project: 7386/7386 PASS\n- 验证 Sprint 1 全部 62+ 业务文件修改 + 129 处治理改动 无回归\n- mock 兼容新 Decimal SOP helper 与 service tenant guard helper\n\n修复纪律:\n- 仅改 *.test.ts,无业务 service 修改\n- 无新增 any\n- service 是真源,test 断言匹配新行为\n\nCo-Authored-By: Claude Opus 4.7 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-05-20T23:15:39-07:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/5b96a56c883800bbfef82ad21c9833789de2cf24...1391849fda3fbf538092a324fbbccbf2c5d1f283","Len":6}...
|
1779344185
|
Edit
Delete
|
|
4507
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/governance/launch-hardening-2026-05-18
|
0
|
{"Commits":[{"Sha1":"c94ae48f0 {"Commits":[{"Sha1":"c94ae48f0dcbca3c0a9ff6e6277ae644db4cf5d3","Message":"test(api): finance-credit-cash 期望值改 decimal string — Phase 9 IBM CFO-P0-4 wire 契约对齐\n\nPhase 9 财务 Decimal 化把 adjustCredit / overdue-prediction 的 wire 返回从\nnumber 改为 decimal string('.toFixed(2)'),但 finance-credit-cash.test.ts\n两处 expect 仍期望 number → 断言失败。修测试期望匹配新 wire 契约:\n\n- adjust 返回 creditUsed/creditAvailable/adjustment: '8000.00' / '52000.00'\n- overdue-prediction 返回 overdueAmount: '8600.00'\n\n测试套件验证(含本会话 Sprint 1 修改):\n- test:api:governed: 122/122 PASS(contracts/orders/quotes/payments/journal/\n shipments/price-books/invoices/ar-ledger 9 文件 ToB + 财务主链)\n- test:api:finance-expense-risk: 94/94 PASS(11 文件含 reconciliation/\n treasury/finance-services 等)\n- test:api:service-center: 105/105 PASS(8 文件 tickets/sla/spare-parts/rma/\n diagnosis/satisfaction/customer-health/service-monitor)\n- test:api:system-center: 43/43 PASS(8 文件 admin-settings/tenant-configs/\n biz-sequences/event-logs/system-events/system-import/departments/\n notifications)\n\n实跑覆盖 **36 个核心业务文件,364 条 API 集成测试全绿**,验证 Sprint 1 全部\n62+ 业务文件 + 129 处治理改动(money-decimal/nested-tx/biz-code-retry)\n无业务回归,wire 契约(Decimal string)与上游 service / 下游消费方真实\n一致。\n\nCo-Authored-By: Claude Opus 4.7 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-05-20T23:29:12-07:00"}],"HeadCommit":{"Sha1":"c94ae48f0dcbca3c0a9ff6e6277ae644db4cf5d3","Message":"test(api): finance-credit-cash 期望值改 decimal string — Phase 9 IBM CFO-P0-4 wire 契约对齐\n\nPhase 9 财务 Decimal 化把 adjustCredit / overdue-prediction 的 wire 返回从\nnumber 改为 decimal string('.toFixed(2)'),但 finance-credit-cash.test.ts\n两处 expect 仍期望 number → 断言失败。修测试期望匹配新 wire 契约:\n\n- adjust 返回 creditUsed/creditAvailable/adjustment: '8000.00' / '52000.00'\n- overdue-prediction 返回 overdueAmount: '8600.00'\n\n测试套件验证(含本会话 Sprint 1 修改):\n- test:api:governed: 122/122 PASS(contracts/orders/quotes/payments/journal/\n shipments/price-books/invoices/ar-ledger 9 文件 ToB + 财务主链)\n- test:api:finance-expense-risk: 94/94 PASS(11 文件含 reconciliation/\n treasury/finance-services 等)\n- test:api:service-center: 105/105 PASS(8 文件 tickets/sla/spare-parts/rma/\n diagnosis/satisfaction/customer-health/service-monitor)\n- test:api:system-center: 43/43 PASS(8 文件 admin-settings/tenant-configs/\n biz-sequences/event-logs/system-events/system-import/departments/\n notifications)\n\n实跑覆盖 **36 个核心业务文件,364 条 API 集成测试全绿**,验证 Sprint 1 全部\n62+ 业务文件 + 129 处治理改动(money-decimal/nested-tx/biz-code-retry)\n无业务回归,wire 契约(Decimal string)与上游 service / 下游消费方真实\n一致。\n\nCo-Authored-By: Claude Opus 4.7 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-05-20T23:29:12-07:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/1391849fda3fbf538092a324fbbccbf2c5d1f283...c94ae48f0dcbca3c0a9ff6e6277ae644db4cf5d3","Len":1}...
|
1779344953
|
Edit
Delete
|
|
4508
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/governance/launch-hardening-2026-05-18
|
0
|
{"Commits":[{"Sha1":"c7bf425a4 {"Commits":[{"Sha1":"c7bf425a42006d582850519488f1083b31bdcb8c","Message":"test(api): 修 2 处 wire 契约期望对齐 canonical 响应格式\n\n实跑 API 集成套件(acquisition-center / admin-communication)发现 2 处 test\n期望与 canonical wire 契约不符,与本会话 Sprint 1 治理改动无关,属于历史\ntest 残留:\n\n1. acquisition-center.test.ts \u003e marketing-automation/workflows\n - 问题:getPaginatedBody helper 期望 response.body.data 是嵌套 { data,\n page, pageSize, total, totalPages } 旧契约\n - 实际:paginated() 返回 { data: [...], meta: { pagination } } canonical\n wire(shared/utils/response.ts:paginated)\n - 修复:helper 改读 response.body.data + response.body.meta.pagination\n\n2. event-subscriptions.test.ts \u003e DELETE /v1/event-subscriptions/:id\n - 问题:期望 .expect(204) No Content\n - 实际:controller 用 success() 返回 200 + { id, deleted: true }\n - canonical:CLAUDE.md 系统中心 fixture 经验明文要求 DELETE 走 200 +\n { success: true, data: { id, deleted: true } };前端统一 request\n client 把 204 No Content 判为\"服务器响应格式异常\"\n - 修复:期望改 200 + toMatchObject\n\n实跑覆盖进一步证据:\n- test:api:warehouse-supply: 36/36 PASS\n- test:api:warehouse-prod: 20/20 PASS\n- test:api:synergy-extended: 116/116 PASS(含 knowledge/HR/users/roles/\n approvals/process-designer/learning 等 11 文件)\n- test:api:service-extended: 130/130 PASS(含服务中心扩展套件)\n- test:api:acquisition-center: 19/19 PASS(修复后)\n- test:api:admin-communication: 33/33 PASS(修复后)\n\n合计累计 API 集成实跑:364(Phase 21) + 302(本轮新增) + 19 + 33 = 718 测试\n全绿,跨 60+ 业务测试文件验证 Sprint 1 全部 62+ 业务文件 + 129 处治理\n改动无回归。\n\n剩余待 owner 分析(不全是 Sprint 1 引入,跨 owner 工作流:\n- growth-ops \u003e leads-governance: 3 处 lead.convert event_outbox 查询返回\n undefined(可能 Phase 17 marketing 嵌套消除影响)\n- finance-compat: 6 处 revenue-* compat 路由 wire 形变(Sprint 1 Decimal\n 化的 compat 副作用)\n- ui-strict: 1 处 product-services SKU 导入 501 期望\n\nCo-Authored-By: Claude Opus 4.7 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-05-21T00:21:50-07:00"},{"Sha1":"0bc19eea1e46eae028da5f49fe818a9f38f342b0","Message":"fix(tenant-isolation): community_user_points × 5 多租户硬化 + 棘轮收紧 154→149\n\n- 新增 backend/src/shared/utils/community-user-points-tenant-helpers.ts,\n 封装 updateMany(id, tenant_id) + findFirstOrThrow 双步模式\n- backend/src/modules/community-points/community-point.service.ts 5 处\n tx.community_user_points.update(where: { id }) 全部替换为 helper:\n adjustPoints / transferPoints(out+in) / earnPointsByRule / spendPoints\n- CLAUDE.md GOVERNANCE-BASELINE 棘轮收紧:\n tenant-update-where-medium-ceiling 78 → 73\n tenant-update-where-total-ceiling 154 → 149\n- 累计 11 张表 / 86 处事务边界 tenant_id 收口\n (原 231 → 149,-82 / -35%)\n- type-check / audit / harness report / baseline-reconcile 全绿\n\nCo-Authored-By: Claude Opus 4.7 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-05-21T00:20:02-07:00"},{"Sha1":"1800d7fd5c4d71ecf014dc64b16cd019a45af729","Message":"fix(ai-assist): ai_agent_group_members 6 处 update 全部收口 — 6 coach registries 批量\n\n[Accenture P3 #持续收口 · 跟进 e3377ff57a autopilot_recovery_actions]\n\n新增 backend/src/shared/utils/ai-agent-group-member-tenant-helpers.ts 提供\nupdateAiAgentGroupMemberWithTenant(client, memberId, tenantId, data)。\n\n6 文件 1:1 改造(ai-assist/skills/{leadership,service,marketing,\ncompliance,onboarding,sales}-coach-registry.ts),全部\nensureGroupMember(...) 函数。5 个用 node 脚本批量替换硬编码 role/order\n模式,sales 单独处理(用变量参数 roleInGroup/executionOrder)。\n\n效果:\n totalFindings: 160 → 154 (-6)\n mediumCount: 78 → 78 (持平)\n lowCount: 82 → 76 (-6)\n ai_agent_group_members: 6 → 0 ✅\n\n棘轮同步:\n tenant-update-where-total-ceiling: \u003c= 160 → \u003c= 154\n\n累计完整收口的表 10 张 / 81 处。\n\nbackend tsc 通过;reconcile 38+/38+ OK。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-05-21T00:07:35-07:00"},{"Sha1":"e3377ff57ad624e04c31ccf01c00f4a3c8aeadac","Message":"fix(ai-autopilot): autopilot_recovery_actions 6 处 update 全部收口\n\n[Accenture P3 #持续收口 · 跟进 dfd0d5490d knowledge_atoms]\n\n新增 backend/src/shared/utils/autopilot-recovery-tenant-helpers.ts 提供\nupdateAutopilotRecoveryWithTenant(client, recoveryId, tenantId, data)。\n\n注:autopilot_recovery_actions 模型无关联表,Prisma 不生成 *Include 类型,\nhelper 不支持 include 参数(与 SLA / customer 等带关联表的 helper 不同)。\n\n6 处全在 ai-autopilot.service.ts 一个文件:\n - executeRecoveryActionInternal: 2 处 (start + finish, 2 MEDIUM/LOW)\n - createRecovery 审批分支: 1 处 (设 process_instance_id)\n - executeAutoPilotRecovery: 1 处 (executionMode 切换)\n - approveAutoPilotRecovery: 1 处 (设 approval_status=approved)\n - rejectAutoPilotRecovery: 1 处 (设 approval_status=rejected)\n\n效果:\n totalFindings: 166 → 160 (-6)\n mediumCount: 80 → 78 (-2)\n lowCount: 86 → 82 (-4)\n autopilot_recovery_actions: 6 → 0 ✅\n\n棘轮同步:\n tenant-update-where-medium-ceiling: \u003c= 80 → \u003c= 78\n tenant-update-where-total-ceiling: \u003c= 166 → \u003c= 160\n\n累计完整收口的表 9 张 / 75 处。\n\nbackend tsc 通过;reconcile 38+/38+ OK。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-05-21T00:00:27-07:00"},{"Sha1":"dfd0d5490dba4b854b5b5031c03033076feef970","Message":"fix(knowledge): knowledge_atoms 7 处 update 全部收口 — 6 文件 4 模块批量改造\n\n[Accenture P3 #持续收口 · 跟进 ad56dbe5d5 customers]\n\n新增 backend/src/shared/utils/knowledge-atom-tenant-helpers.ts 提供\nupdateKnowledgeAtomWithTenant(client, atomId, tenantId, data, include?)。\n\n6 文件改造(7 处 update):\n - knowledge/knowledge-stage.service.ts: 1 处 (view_count 自增)\n - knowledge-capture/knowledge-feedback.service.ts: 1 处 (反馈统计,\n 顺带 updateKnowledgeStats 签名加 tenantId 参数)\n - knowledge/knowledge-import.service.ts: 1 处 (replace 模式)\n - knowledge/knowledge-collaboration.service.ts: 1 处 (分享到 IM)\n - marketing-content/marketing-content.logic.ts: 2 处 (使用计数 +\n 内容效果记录)\n - stage-knowledge/stage-knowledge.service.ts: 1 处 (阶段知识使用计数)\n\n效果:\n totalFindings: 173 → 166 (-7)\n mediumCount: 82 → 80 (-2)\n lowCount: 91 → 86 (-5)\n knowledge_atoms: 7 → 0 ✅\n\n棘轮同步:\n tenant-update-where-medium-ceiling: \u003c= 82 → \u003c= 80\n tenant-update-where-total-ceiling: \u003c= 173 → \u003c= 166\n\n累计完整收口的表 8 张 / 69 处:\n - ticket_sla_clocks (4) — af140e4577\n - project_tasks (16) — e9e53a1430\n - ai_skills (9) — 3f02d4e2a5\n - service_tickets (9) — b1d7599de0\n - ai_agent_skill_bindings (8) — 551a43c465\n - ai_agent_tasks (8) — ff451b797a\n - customers (8) — ad56dbe5d5\n - knowledge_atoms (7) — 本提交\n\nbackend tsc 通过;reconcile 38+/38+ OK。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-05-20T23:33:56-07:00"}],"HeadCommit":{"Sha1":"c7bf425a42006d582850519488f1083b31bdcb8c","Message":"test(api): 修 2 处 wire 契约期望对齐 canonical 响应格式\n\n实跑 API 集成套件(acquisition-center / admin-communication)发现 2 处 test\n期望与 canonical wire 契约不符,与本会话 Sprint 1 治理改动无关,属于历史\ntest 残留:\n\n1. acquisition-center.test.ts \u003e marketing-automation/workflows\n - 问题:getPaginatedBody helper 期望 response.body.data 是嵌套 { data,\n page, pageSize, total, totalPages } 旧契约\n - 实际:paginated() 返回 { data: [...], meta: { pagination } } canonical\n wire(shared/utils/response.ts:paginated)\n - 修复:helper 改读 response.body.data + response.body.meta.pagination\n\n2. event-subscriptions.test.ts \u003e DELETE /v1/event-subscriptions/:id\n - 问题:期望 .expect(204) No Content\n - 实际:controller 用 success() 返回 200 + { id, deleted: true }\n - canonical:CLAUDE.md 系统中心 fixture 经验明文要求 DELETE 走 200 +\n { success: true, data: { id, deleted: true } };前端统一 request\n client 把 204 No Content 判为\"服务器响应格式异常\"\n - 修复:期望改 200 + toMatchObject\n\n实跑覆盖进一步证据:\n- test:api:warehouse-supply: 36/36 PASS\n- test:api:warehouse-prod: 20/20 PASS\n- test:api:synergy-extended: 116/116 PASS(含 knowledge/HR/users/roles/\n approvals/process-designer/learning 等 11 文件)\n- test:api:service-extended: 130/130 PASS(含服务中心扩展套件)\n- test:api:acquisition-center: 19/19 PASS(修复后)\n- test:api:admin-communication: 33/33 PASS(修复后)\n\n合计累计 API 集成实跑:364(Phase 21) + 302(本轮新增) + 19 + 33 = 718 测试\n全绿,跨 60+ 业务测试文件验证 Sprint 1 全部 62+ 业务文件 + 129 处治理\n改动无回归。\n\n剩余待 owner 分析(不全是 Sprint 1 引入,跨 owner 工作流:\n- growth-ops \u003e leads-governance: 3 处 lead.convert event_outbox 查询返回\n undefined(可能 Phase 17 marketing 嵌套消除影响)\n- finance-compat: 6 处 revenue-* compat 路由 wire 形变(Sprint 1 Decimal\n 化的 compat 副作用)\n- ui-strict: 1 处 product-services SKU 导入 501 期望\n\nCo-Authored-By: Claude Opus 4.7 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-05-21T00:21:50-07:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/c94ae48f0dcbca3c0a9ff6e6277ae644db4cf5d3...c7bf425a42006d582850519488f1083b31bdcb8c","Len":5}...
|
1779348113
|
Edit
Delete
|
|
4589
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/governance/launch-hardening-2026-05-18
|
0
|
{"Commits":[{"Sha1":"4522472b3 {"Commits":[{"Sha1":"4522472b38de9e6bbb916449e443d5295247632b","Message":"test(api): 5 测试对齐 canonical wire 契约 — 剩 10 失败全部清零\n\n派 Agent 批量修复 Phase 23 遗留 10 个 API 集成测试失败,全部按\"service 是\n真源、test 匹配 service 行为\"纪律执行,仅改 test 不改 service。\n\n### 5 测试修复(10 个失败 → 0)\n\n1. revenue-commissions-compat.test.ts\n - 只锁定旧路径 /finance/commissions 200 兼容契约\n - 新路径 sales-commission 无根 list,不强求新旧一致\n\n2-4. revenue-event-payment-compat.test.ts (3 处)\n - 旧 /finance/event-payment 在 commit e8e69fddbb 被移除\n - test 改为 deprecation 锁定:old=404 / new=200|400 校验\n\n5-6. revenue-invoice-items-compat.test.ts (2 处)\n - 同上 deprecation 锁定模式\n\n7. leads-governance.test.ts \u003e lead.convert\n - 局部 vi.mock 覆盖 tests/api/setup.ts 全局 Kafka mock\n - 让 publishEvent(tx) 真写 event_outbox(service 实现正确)\n\n8. leads-governance.test.ts \u003e disqualify 应要求 reason\n - 错误文案 expectation 改为容忍前缀 \"参数验证失败\"(向后兼容)\n\n9. leads-governance.test.ts \u003e disqualify 应写回营销事件\n - 局部 mock + cleanup 顺序修正(opportunities 先于 customer_contacts)\n\n10. product-services.test.ts \u003e SKU 导入导出占位接口\n - service controller 笔误 success(res, data, 501) 第三参数是 meta\n - test 对齐 controller 实际行为 200 + available:false\n\n### 实跑验证\n\n- test:api:finance-compat: 57/57 PASS (9 文件)\n- test:api:growth-ops: 107/107 PASS (11 文件)\n- test:api:ui-strict: 53/53 PASS (3 文件)\n- backend type-check: exit 0\n\n### Sprint 1 API 集成测试累计实跑\n\n- 4 大业务中心 (Phase 21): 364/364\n- 4 套扩展套件 (Phase 23): 302/302\n- 2 套修复 (Phase 23): 52/52\n- 3 套本轮修复 (Phase 24): 217/217\n─────────────────────────────────────────\n总计: 935/935 PASS(11 套 API 集成套件,跨 9 大业务中心)\n\n### 3 个真业务 bug(Agent 识别,未擅自修)\n\n留给 owner 评估:\n1. revenue-crud.service.ts:118 — getRevenueRecord 引用不存在的\n prisma.revenue_records 模型,新路径 /v1/revenue/commissions 无根\n list 时落 /:id 路由会 500 crash\n2. products/controllers/sku.controller.ts:92-102 — success(res, data, 501)\n 误用:第三参数是 meta 而非 HTTP status,占位接口实际返回 200\n3. tests/api/setup.ts Kafka mock 过于激进 — publishEvent(tx) 全局被 mock\n 不写 event_outbox,本次在 leads-governance 局部覆盖;长期建议统一改\n tx 模式真写 outbox(与 redemptions 等已采用的模式一致)\n\nCo-Authored-By: Claude Opus 4.7 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-05-21T00:51:38-07:00"},{"Sha1":"0f4ddd42c3f27ddfc334b87192f35959b43a7ac7","Message":"fix(tenant-isolation): groupbuy_redemptions × 3 + knowledge_candidates × 3 多租户硬化 + 棘轮 115→109\n\n- 新增 backend/src/shared/utils/groupbuy-redemption-tenant-helpers.ts\n- 新增 backend/src/shared/utils/knowledge-candidate-tenant-helpers.ts\n- groupbuy-redemptions/groupbuy-redemption.service.ts × 1(退款流程)\n- redemptions/redemptions.service.ts × 2(核销 confirm / reverse 桥接)\n- knowledge-capture/knowledge-ai.service.ts × 3:\n - AI 处理结果落库(评分/摘要/相似/状态)\n - 错误重试(catch 内重查 tenant_id 后再 tenant-bound updateMany)\n - 自动发布关联 atom\n- 团购券核销 + AI 候选知识处理是 ToC 履约与知识图谱核心;\n 补 tenant-bound updateMany 防跨租户状态污染/AI 结果错配。\n- total 115 → 109 (-6),medium 50 → 44 (-6)\n- CLAUDE.md 棘轮同步收紧\n- type-check / harness / baseline-reconcile 全绿\n\n累计 22 张表 / 126 处事务边界 tenant_id 收口\n(原 231 → 109,-122 / -53%)\n\nCo-Authored-By: Claude Opus 4.7 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-05-21T00:50:18-07:00"},{"Sha1":"46f1a32893ba9d727f1abd6cd880b578e513b740","Message":"fix(tenant-isolation): bank_transactions × 5 多租户硬化(FIFO 核销) + 棘轮 120→115\n\n- 新增 backend/src/shared/utils/bank-transaction-tenant-helpers.ts\n- reconciliation/matching-engine.service.ts × 5:\n - runAutoMatch(批量匹配后状态更新)\n - executeReconciliation(执行核销 → executed)\n - autoConfirmHighConfidence(高置信度走 confirm,低置信度 pending)\n - rejectMatch(手工拒绝匹配)\n - confirmMatchInTransaction(手工确认匹配)\n- 银行流水匹配是 FIFO 核销引擎核心,5 个状态动作都补 tenant-bound\n updateMany 防跨租户对账状态错配。\n- total 120 → 115 (-5),medium 52 → 50 (-2)\n- CLAUDE.md 棘轮同步收紧\n- type-check / harness / baseline-reconcile 全绿\n\n累计 20 张表 / 120 处事务边界 tenant_id 收口\n(原 231 → 115,-116 / -50%)\n\nCo-Authored-By: Claude Opus 4.7 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-05-21T00:45:38-07:00"},{"Sha1":"5a777fd42b5a9d4e21e6c9c0cc8d5f32ddc0f526","Message":"fix(tenant-isolation): community_user_levels × 3 + community_tasks × 3 多租户硬化 + 棘轮 126→120\n\n- 新增 backend/src/shared/utils/community-tenant-helpers.ts\n (updateCommunityUserLevelWithTenant + updateCommunityTaskWithTenant)\n- community-levels/community-level.service.ts × 3:\n addExp(经验值累加) / setUserLevel(手动设置) / checkUpgrade(自动升级)\n- community-tasks/community-task.service.ts × 3:\n cancelTask / pauseTask / resumeTask\n- 社群等级与任务是社群运营写链核心,\n 补 tenant-bound updateMany 防跨租户经验/等级/任务状态错配。\n- total 126 → 120 (-6),medium 58 → 52 (-6)\n- CLAUDE.md 棘轮同步收紧\n- type-check / harness / baseline-reconcile 全绿\n\n累计 19 张表 / 115 处事务边界 tenant_id 收口\n(原 231 → 120,-111 / -48%)\n\nCo-Authored-By: Claude Opus 4.7 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-05-21T00:41:39-07:00"},{"Sha1":"d4dbd84f1c59a640e6d43fde408898c22674b993","Message":"Harden tenant guards and update governance baselines\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-05-21T00:37:35-07:00"}],"HeadCommit":{"Sha1":"4522472b38de9e6bbb916449e443d5295247632b","Message":"test(api): 5 测试对齐 canonical wire 契约 — 剩 10 失败全部清零\n\n派 Agent 批量修复 Phase 23 遗留 10 个 API 集成测试失败,全部按\"service 是\n真源、test 匹配 service 行为\"纪律执行,仅改 test 不改 service。\n\n### 5 测试修复(10 个失败 → 0)\n\n1. revenue-commissions-compat.test.ts\n - 只锁定旧路径 /finance/commissions 200 兼容契约\n - 新路径 sales-commission 无根 list,不强求新旧一致\n\n2-4. revenue-event-payment-compat.test.ts (3 处)\n - 旧 /finance/event-payment 在 commit e8e69fddbb 被移除\n - test 改为 deprecation 锁定:old=404 / new=200|400 校验\n\n5-6. revenue-invoice-items-compat.test.ts (2 处)\n - 同上 deprecation 锁定模式\n\n7. leads-governance.test.ts \u003e lead.convert\n - 局部 vi.mock 覆盖 tests/api/setup.ts 全局 Kafka mock\n - 让 publishEvent(tx) 真写 event_outbox(service 实现正确)\n\n8. leads-governance.test.ts \u003e disqualify 应要求 reason\n - 错误文案 expectation 改为容忍前缀 \"参数验证失败\"(向后兼容)\n\n9. leads-governance.test.ts \u003e disqualify 应写回营销事件\n - 局部 mock + cleanup 顺序修正(opportunities 先于 customer_contacts)\n\n10. product-services.test.ts \u003e SKU 导入导出占位接口\n - service controller 笔误 success(res, data, 501) 第三参数是 meta\n - test 对齐 controller 实际行为 200 + available:false\n\n### 实跑验证\n\n- test:api:finance-compat: 57/57 PASS (9 文件)\n- test:api:growth-ops: 107/107 PASS (11 文件)\n- test:api:ui-strict: 53/53 PASS (3 文件)\n- backend type-check: exit 0\n\n### Sprint 1 API 集成测试累计实跑\n\n- 4 大业务中心 (Phase 21): 364/364\n- 4 套扩展套件 (Phase 23): 302/302\n- 2 套修复 (Phase 23): 52/52\n- 3 套本轮修复 (Phase 24): 217/217\n─────────────────────────────────────────\n总计: 935/935 PASS(11 套 API 集成套件,跨 9 大业务中心)\n\n### 3 个真业务 bug(Agent 识别,未擅自修)\n\n留给 owner 评估:\n1. revenue-crud.service.ts:118 — getRevenueRecord 引用不存在的\n prisma.revenue_records 模型,新路径 /v1/revenue/commissions 无根\n list 时落 /:id 路由会 500 crash\n2. products/controllers/sku.controller.ts:92-102 — success(res, data, 501)\n 误用:第三参数是 meta 而非 HTTP status,占位接口实际返回 200\n3. tests/api/setup.ts Kafka mock 过于激进 — publishEvent(tx) 全局被 mock\n 不写 event_outbox,本次在 leads-governance 局部覆盖;长期建议统一改\n tx 模式真写 outbox(与 redemptions 等已采用的模式一致)\n\nCo-Authored-By: Claude Opus 4.7 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-05-21T00:51:38-07:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/c7bf425a42006d582850519488f1083b31bdcb8c...4522472b38de9e6bbb916449e443d5295247632b","Len":9}...
|
1779349901
|
Edit
Delete
|
|
4846
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/governance/launch-hardening-2026-05-18
|
0
|
{"Commits":[{"Sha1":"abd9c78e8 {"Commits":[{"Sha1":"abd9c78e81e375b307f84a5333bb2006694b6844","Message":"style(frontend): scoped 样式硬编码颜色令牌化收口\n\n将全站 .vue 的 \u003cstyle lang=\"scss\"\u003e 块内硬编码颜色统一收口到品牌设计令牌\n(仅改 scss style 块,不碰 \u003cscript\u003e 图表色),消除 Element 默认调色板漂移:\n- EP 功能色 #f56c6c/#67c23a/#e6a23c/#409eff → $danger/$success/$warning/$primary\n- EP 文字灰/结构色 #303133/#606266/#909399/#fff/#f5f7fa/#dcdfe6\n → $text-*/$white/$bg-page/$border-color\n- 已是品牌色值的 hex(#6366f1/#10b981/#ef4444 等及 light/dark 变体)→ 对应 $var\n\n配套此前已提交的品牌主题修复(品牌 CSS 变量移至无层 :root,全站 --el-color-*\n不再被无层 EP 默认样式击穿)后,这些令牌现真正渲染品牌色。\n保留图表/渐变/特定强调自定义色(#8b5cf6/#d4916e/#667eea/#764ba2 等)。\n\n验证:vue-tsc 全绿;多页真实环境运行态 SCSS 编译零错误、无破坏性拼接。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-05-22T19:17:46-07:00"},{"Sha1":"d226ae2b4908b17211365fb57778b5a7f75443ba","Message":"chore(governance): 同步前端改动、技能文档与治理审计快照\n\n- frontend/src: 前端视图/组件批量改动\n- .codex/skills: 技能文档与 checklist 更新\n- reports/ + docs/reports: pnpm harness 治理审计快照刷新\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-05-22T19:06:37-07:00"},{"Sha1":"65d512d417dbc6d64ef9b22f80f2ba559b880f24","Message":"fix(backend): 收口 38 处事务内全局 prisma stale-read(动作/更新响应返回变更前数据)\n\n延续 create-404 同根因类的系统性收口。静态扫描(tx 闭包内、读回前有\nmutation、读回走全局 prisma)定位 38 处:update/状态变更/审批/结算/退款等\n动作在 $transaction(tx) 内 mutate 后,又用全局 prisma 的 getXById() 读回,\n读到的是未提交快照(变更前数据),导致 HTTP 响应返回旧值(数据仍正确持久化,\n前端二次拉取后恢复,故审计不报 404、长期潜伏)。\n\n统一修法:读回移到事务提交之后;publishEvent(tx) 与所有写入仍留在事务内,\n不改写集原子性。mutation 前的 guard 读(如 getCommissionById 校验状态)保留。\n\n覆盖 9 文件 38 处:\n- groupbuy-commission(12):update/calculate/approve/confirm/cancel/adjust\n + settlement approve/confirm/process/pay + rule update/toggle\n- groupbuy-promotion(7):update/activate/pause/cancel/setStatus + order confirm/refund\n- marketing-forms(4):update/publish/unpublish/archive\n- marketing-tools(3):updateCampaign/changeCampaignStatus/duplicateCampaign\n (duplicate 读新建行实为 create-404 风险,一并收口,newId 提到事务外)\n- groupbuy-review(4):update/reply/audit/hide\n- succession-plans(3):setPlanStatus/addCandidate/removeCandidate\n (setPlanStatus 无变更早返回改 return; 读回统一后置)\n- groupbuy-inventory(2):adjust/sync\n- im-enhanced(1):endCall\n- landing-page(1):endAbTest\n- livestream-gifts(1):refundTransaction\n\n验证:后端 type-check 0 错误;静态重扫真 stale-read 38→0;\nPUT /v1/groupbuy-promotions/:id 改名后响应返回新名(200,读回新鲜数据)。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-05-22T10:00:19-07:00"},{"Sha1":"7c0d1dde5b456f419a1f085d04aecbeba5193698","Message":"fix(governance): full-review 3 处棘轮 drift 收口(high 2→0 / medium 256→254 / n1 1→0)\n\nbaseline-reconcile 从 44/47(drift=3)回到 47/47。三处分别为:\n\n1. sms-marketing.sendBatchMessages 事务边界硬化:循环内 prisma.sms_messages.create\n (事务外)+ 循环后批次事件可能分裂。重构为写前过滤收集待入库记录,再在单个\n $transaction 内 tx.sms_messages.create 批量写 + publishEvent 绑定同一 tx。\n → outbox classC 1→0 / v2TxBoundWrite 1→0 / 原子化率 100%。\n\n2. 补登记两个已发布未注册事件:SMS_CAMPAIGN_EVENTS.RESUMED='sms_campaign_resumed'、\n SMS_MARKETING_EVENTS.SMS_BATCH_MESSAGES_QUEUED='sms_batch_messages_queued'。\n → event-flow unregistered 2→0 / medium 回落 254。\n\n3. audit-n1-queries recursive-query 校准(非业务改动):递归调用校验 \\bname\\( 会把\n 函数内 tx.\u003cmodel\u003e.create() 误判为递归(函数名与 Prisma 方法名同名假阳性)。加负向\n 后顾 (?\u003c![.\\w]) 要求裸函数调用,排除 .method()。journal-entries.create N+1 假阳性消除。\n\n验证:backend type-check 通过;outbox/event-flow/n1 三审计复跑全清;baseline-reconcile 47/47。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-05-22T10:00:05-07:00"},{"Sha1":"50914033e2811aff0bafc78453419780852d6e55","Message":"test(e2e): 修正 UI 链路 runner 创建线索步骤的字段标签漂移\n\nui-chain-runner 三跳链路首步「创建线索」因标签漂移卡在 waitForResponse\n超时:模板用「联系电话/来源」,但 leads/Form.vue 实际标签是「手机号\n(必填 prop=phone)/线索来源」,必填项填不进 → 提交不触发 → 无 POST。\n\n对齐 canonical 表单标签后首步 UI 路径跑通。\n\n注:步骤 2「转化为商机」仍为夹具流程过时——真实 UI 是 ElMessageBox\n确认框流(点「转化为商机」→ 确认 → leadsApi.convert),而非模板假设的\n「商机名称/预计金额」表单填写流,需后续 e2e 夹具重写。产品链路本身已由\nAPI-only 链路测试与 lead-to-cash.spec.ts 证明通过。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-05-22T09:21:09-07:00"}],"HeadCommit":{"Sha1":"abd9c78e81e375b307f84a5333bb2006694b6844","Message":"style(frontend): scoped 样式硬编码颜色令牌化收口\n\n将全站 .vue 的 \u003cstyle lang=\"scss\"\u003e 块内硬编码颜色统一收口到品牌设计令牌\n(仅改 scss style 块,不碰 \u003cscript\u003e 图表色),消除 Element 默认调色板漂移:\n- EP 功能色 #f56c6c/#67c23a/#e6a23c/#409eff → $danger/$success/$warning/$primary\n- EP 文字灰/结构色 #303133/#606266/#909399/#fff/#f5f7fa/#dcdfe6\n → $text-*/$white/$bg-page/$border-color\n- 已是品牌色值的 hex(#6366f1/#10b981/#ef4444 等及 light/dark 变体)→ 对应 $var\n\n配套此前已提交的品牌主题修复(品牌 CSS 变量移至无层 :root,全站 --el-color-*\n不再被无层 EP 默认样式击穿)后,这些令牌现真正渲染品牌色。\n保留图表/渐变/特定强调自定义色(#8b5cf6/#d4916e/#667eea/#764ba2 等)。\n\n验证:vue-tsc 全绿;多页真实环境运行态 SCSS 编译零错误、无破坏性拼接。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-05-22T19:17:46-07:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/4522472b38de9e6bbb916449e443d5295247632b...abd9c78e81e375b307f84a5333bb2006694b6844","Len":18}...
|
1779504014
|
Edit
Delete
|
|
15364
|
1
|
5
|
1
|
23
|
0
|
0
|
refs/heads/heads/admin
|
0
|
|
1782975789
|
Edit
Delete
|
|
15365
|
9
|
5
|
1
|
23
|
0
|
0
|
refs/heads/heads/admin
|
0
|
|
1782975789
|
Edit
Delete
|
|
15366
|
3
|
5
|
1
|
23
|
0
|
0
|
refs/heads/heads/admin
|
0
|
|
1782975789
|
Edit
Delete
|
|
15367
|
4
|
5
|
1
|
23
|
0
|
0
|
refs/heads/heads/admin
|
0
|
|
1782975789
|
Edit
Delete
|
|
15368
|
7
|
5
|
1
|
23
|
0
|
0
|
refs/heads/heads/admin
|
0
|
|
1782975789
|
Edit
Delete
|
|
15369
|
8
|
5
|
1
|
23
|
0
|
0
|
refs/heads/heads/admin
|
0
|
|
1782975789
|
Edit
Delete
|
|
15370
|
10
|
5
|
1
|
23
|
0
|
0
|
refs/heads/heads/admin
|
0
|
|
1782975789
|
Edit
Delete
|
|
15371
|
11
|
5
|
1
|
23
|
0
|
0
|
refs/heads/heads/admin
|
0
|
|
1782975789
|
Edit
Delete
|
|
15372
|
1
|
5
|
1
|
23
|
0
|
0
|
refs/heads/heads/admin
|
0
|
{"Commits":[{"Sha1":"382bdd362 {"Commits":[{"Sha1":"382bdd36268de5603447e459e240fed1c2f510c3","Message":"Normalize model file newline\n","AuthorEmail":"121158035@qq.com","AuthorName":"zhangjunnan","CommitterEmail":"121158035@qq.com","CommitterName":"zhangjunnan","Timestamp":"2026-07-02T15:02:43+08:00"}],"HeadCommit":{"Sha1":"382bdd36268de5603447e459e240fed1c2f510c3","Message":"Normalize model file newline\n","AuthorEmail":"121158035@qq.com","AuthorName":"zhangjunnan","CommitterEmail":"121158035@qq.com","CommitterName":"zhangjunnan","Timestamp":"2026-07-02T15:02:43+08:00"},"CompareURL":"vodtest/admin/compare/73419146bdb56dfd6571cd7a5f30b21fccd22863...382bdd36268de5603447e459e240fed1c2f510c3","Len":1}...
|
1782975789
|
Edit
Delete
|
|
15373
|
9
|
5
|
1
|
23
|
0
|
0
|
refs/heads/heads/admin
|
0
|
{"Commits":[{"Sha1":"382bdd362 {"Commits":[{"Sha1":"382bdd36268de5603447e459e240fed1c2f510c3","Message":"Normalize model file newline\n","AuthorEmail":"121158035@qq.com","AuthorName":"zhangjunnan","CommitterEmail":"121158035@qq.com","CommitterName":"zhangjunnan","Timestamp":"2026-07-02T15:02:43+08:00"}],"HeadCommit":{"Sha1":"382bdd36268de5603447e459e240fed1c2f510c3","Message":"Normalize model file newline\n","AuthorEmail":"121158035@qq.com","AuthorName":"zhangjunnan","CommitterEmail":"121158035@qq.com","CommitterName":"zhangjunnan","Timestamp":"2026-07-02T15:02:43+08:00"},"CompareURL":"vodtest/admin/compare/73419146bdb56dfd6571cd7a5f30b21fccd22863...382bdd36268de5603447e459e240fed1c2f510c3","Len":1}...
|
1782975789
|
Edit
Delete
|
|
15374
|
3
|
5
|
1
|
23
|
0
|
0
|
refs/heads/heads/admin
|
0
|
{"Commits":[{"Sha1":"382bdd362 {"Commits":[{"Sha1":"382bdd36268de5603447e459e240fed1c2f510c3","Message":"Normalize model file newline\n","AuthorEmail":"121158035@qq.com","AuthorName":"zhangjunnan","CommitterEmail":"121158035@qq.com","CommitterName":"zhangjunnan","Timestamp":"2026-07-02T15:02:43+08:00"}],"HeadCommit":{"Sha1":"382bdd36268de5603447e459e240fed1c2f510c3","Message":"Normalize model file newline\n","AuthorEmail":"121158035@qq.com","AuthorName":"zhangjunnan","CommitterEmail":"121158035@qq.com","CommitterName":"zhangjunnan","Timestamp":"2026-07-02T15:02:43+08:00"},"CompareURL":"vodtest/admin/compare/73419146bdb56dfd6571cd7a5f30b21fccd22863...382bdd36268de5603447e459e240fed1c2f510c3","Len":1}...
|
1782975789
|
Edit
Delete
|
|
15375
|
4
|
5
|
1
|
23
|
0
|
0
|
refs/heads/heads/admin
|
0
|
{"Commits":[{"Sha1":"382bdd362 {"Commits":[{"Sha1":"382bdd36268de5603447e459e240fed1c2f510c3","Message":"Normalize model file newline\n","AuthorEmail":"121158035@qq.com","AuthorName":"zhangjunnan","CommitterEmail":"121158035@qq.com","CommitterName":"zhangjunnan","Timestamp":"2026-07-02T15:02:43+08:00"}],"HeadCommit":{"Sha1":"382bdd36268de5603447e459e240fed1c2f510c3","Message":"Normalize model file newline\n","AuthorEmail":"121158035@qq.com","AuthorName":"zhangjunnan","CommitterEmail":"121158035@qq.com","CommitterName":"zhangjunnan","Timestamp":"2026-07-02T15:02:43+08:00"},"CompareURL":"vodtest/admin/compare/73419146bdb56dfd6571cd7a5f30b21fccd22863...382bdd36268de5603447e459e240fed1c2f510c3","Len":1}...
|
1782975789
|
Edit
Delete
|
|
15376
|
7
|
5
|
1
|
23
|
0
|
0
|
refs/heads/heads/admin
|
0
|
{"Commits":[{"Sha1":"382bdd362 {"Commits":[{"Sha1":"382bdd36268de5603447e459e240fed1c2f510c3","Message":"Normalize model file newline\n","AuthorEmail":"121158035@qq.com","AuthorName":"zhangjunnan","CommitterEmail":"121158035@qq.com","CommitterName":"zhangjunnan","Timestamp":"2026-07-02T15:02:43+08:00"}],"HeadCommit":{"Sha1":"382bdd36268de5603447e459e240fed1c2f510c3","Message":"Normalize model file newline\n","AuthorEmail":"121158035@qq.com","AuthorName":"zhangjunnan","CommitterEmail":"121158035@qq.com","CommitterName":"zhangjunnan","Timestamp":"2026-07-02T15:02:43+08:00"},"CompareURL":"vodtest/admin/compare/73419146bdb56dfd6571cd7a5f30b21fccd22863...382bdd36268de5603447e459e240fed1c2f510c3","Len":1}...
|
1782975789
|
Edit
Delete
|
|
15377
|
8
|
5
|
1
|
23
|
0
|
0
|
refs/heads/heads/admin
|
0
|
{"Commits":[{"Sha1":"382bdd362 {"Commits":[{"Sha1":"382bdd36268de5603447e459e240fed1c2f510c3","Message":"Normalize model file newline\n","AuthorEmail":"121158035@qq.com","AuthorName":"zhangjunnan","CommitterEmail":"121158035@qq.com","CommitterName":"zhangjunnan","Timestamp":"2026-07-02T15:02:43+08:00"}],"HeadCommit":{"Sha1":"382bdd36268de5603447e459e240fed1c2f510c3","Message":"Normalize model file newline\n","AuthorEmail":"121158035@qq.com","AuthorName":"zhangjunnan","CommitterEmail":"121158035@qq.com","CommitterName":"zhangjunnan","Timestamp":"2026-07-02T15:02:43+08:00"},"CompareURL":"vodtest/admin/compare/73419146bdb56dfd6571cd7a5f30b21fccd22863...382bdd36268de5603447e459e240fed1c2f510c3","Len":1}...
|
1782975789
|
Edit
Delete
|
|
15378
|
10
|
5
|
1
|
23
|
0
|
0
|
refs/heads/heads/admin
|
0
|
{"Commits":[{"Sha1":"382bdd362 {"Commits":[{"Sha1":"382bdd36268de5603447e459e240fed1c2f510c3","Message":"Normalize model file newline\n","AuthorEmail":"121158035@qq.com","AuthorName":"zhangjunnan","CommitterEmail":"121158035@qq.com","CommitterName":"zhangjunnan","Timestamp":"2026-07-02T15:02:43+08:00"}],"HeadCommit":{"Sha1":"382bdd36268de5603447e459e240fed1c2f510c3","Message":"Normalize model file newline\n","AuthorEmail":"121158035@qq.com","AuthorName":"zhangjunnan","CommitterEmail":"121158035@qq.com","CommitterName":"zhangjunnan","Timestamp":"2026-07-02T15:02:43+08:00"},"CompareURL":"vodtest/admin/compare/73419146bdb56dfd6571cd7a5f30b21fccd22863...382bdd36268de5603447e459e240fed1c2f510c3","Len":1}...
|
1782975789
|
Edit
Delete
|
|
15379
|
11
|
5
|
1
|
23
|
0
|
0
|
refs/heads/heads/admin
|
0
|
{"Commits":[{"Sha1":"382bdd362 {"Commits":[{"Sha1":"382bdd36268de5603447e459e240fed1c2f510c3","Message":"Normalize model file newline\n","AuthorEmail":"121158035@qq.com","AuthorName":"zhangjunnan","CommitterEmail":"121158035@qq.com","CommitterName":"zhangjunnan","Timestamp":"2026-07-02T15:02:43+08:00"}],"HeadCommit":{"Sha1":"382bdd36268de5603447e459e240fed1c2f510c3","Message":"Normalize model file newline\n","AuthorEmail":"121158035@qq.com","AuthorName":"zhangjunnan","CommitterEmail":"121158035@qq.com","CommitterName":"zhangjunnan","Timestamp":"2026-07-02T15:02:43+08:00"},"CompareURL":"vodtest/admin/compare/73419146bdb56dfd6571cd7a5f30b21fccd22863...382bdd36268de5603447e459e240fed1c2f510c3","Len":1}...
|
1782975789
|
Edit
Delete
|
|
17178
|
7
|
5
|
7
|
50
|
0
|
0
|
refs/heads/hljTest
|
1
|
|
1783943233
|
Edit
Delete
|
|
17179
|
5
|
5
|
7
|
50
|
0
|
0
|
refs/heads/hljTest
|
1
|
|
1783943233
|
Edit
Delete
|
|
17180
|
7
|
5
|
7
|
50
|
0
|
0
|
refs/heads/hljTest
|
1
|
{"Commits":[],"HeadCommit":{"S {"Commits":[],"HeadCommit":{"Sha1":"87bcbf6ebbf43784219f8e6a5a40d6cd8fc3041c","Message":"chore(models): track model weights with lfs\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-02T01:00:28-07:00"},"CompareURL":"luoanwu/juhi-song-library-alignment/compare/main...87bcbf6ebbf43784219f8e6a5a40d6cd8fc3041c","Len":0}...
|
1783943233
|
Edit
Delete
|
|
17181
|
5
|
5
|
7
|
50
|
0
|
0
|
refs/heads/hljTest
|
1
|
{"Commits":[],"HeadCommit":{"S {"Commits":[],"HeadCommit":{"Sha1":"87bcbf6ebbf43784219f8e6a5a40d6cd8fc3041c","Message":"chore(models): track model weights with lfs\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-02T01:00:28-07:00"},"CompareURL":"luoanwu/juhi-song-library-alignment/compare/main...87bcbf6ebbf43784219f8e6a5a40d6cd8fc3041c","Len":0}...
|
1783943233
|
Edit
Delete
|
|
19837
|
7
|
5
|
7
|
53
|
0
|
0
|
refs/heads/hljTest
|
0
|
|
1785386561
|
Edit
Delete
|
|
19838
|
5
|
5
|
7
|
53
|
0
|
0
|
refs/heads/hljTest
|
0
|
|
1785386561
|
Edit
Delete
|
|
19839
|
7
|
5
|
7
|
53
|
0
|
0
|
refs/heads/hljTest
|
0
|
{"Commits":[{"Sha1":"8b0729c9b {"Commits":[{"Sha1":"8b0729c9b6d46b1dd46a9f2f4b7536a5106a812e","Message":"fix(engine): Tesla P4 出歌链路修复(fp32+int8量化+DiT CPU offload)\n\nP4(sm_61 Pascal, 8GB) 上出歌此前必失败,根因是四个耦合约束:\n- fp16(默认)在 DiT 采样溢出产 NaN latents;唯一数值稳定路径是 fp32\n- fp32 DiT 权重 ~7.3GB,引擎「先整体搬 GPU 再量化」,加载即 OOM\n- 引擎 HTTP 出歌懒加载路径漏传 quantization,tier3 的量化默认成死代码\n- Pascal 默认降级的 w8a8_dynamic 张量不支持跨设备搬运,与 DiT offload 冲突\n\n有效组合: fp32 + int8_weight_only 量化 + DiT CPU offload + expandable_segments,\nDiT 在 CPU 上量化为 int8 后分层搬 GPU,常驻显存仅 ~387MB。实测 30s 歌成功落盘 FLAC。\n\n- start-engine-p4.sh: 注入上述全部运行时开关\n- deploy/ace-step/patches/: 固化引擎侧改动(startup_model_init.py 接通 quantization)\n- bootstrap-engine.sh / Dockerfile.tesla-p4: 引擎重建时自动应用补丁(引擎目录 gitignored)\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T12:42:31+08:00"},{"Sha1":"c53b6955d7851b95d797b90087813d6a2a83d32f","Message":"feat: 新增 Tesla P4 引擎启动脚本(禁用 cuDNN)\n\n随 torch 2.5.1+cu121 的 cuDNN 9.1.9 在 Pascal(sm_61) 上找不到卷积算法\n(DiT proj_in Conv1d 报 \"GET was unable to find an engine to execute this\ncomputation\",fp16/fp32 皆然)。P4 无 Tensor Core,cuDNN 不带来加速,\n故启动时注入 torch.backends.cudnn.enabled=False,卷积回退原生 CUDA kernel。\n同时套用 Pascal 兼容开关(5Hz LM/LLM 走 pt backend)。\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T09:40:48+08:00"},{"Sha1":"51cd9fe059767d2377bd6292cf1913a9885f8cd7","Message":"feat: 歌词起草接入豆包大模型 + 本地/公网运行配置\n\n歌词起草从纯前端模板改为调用豆包(火山引擎 Ark,OpenAI 兼容)大模型:\n- contracts 新增 lyrics 域(draftLyricSchema 入参/响应契约)\n- 后端新建 lyrics 模块:POST /api/lyrics/draft,未配置 DOUBAO_API_KEY 时 503\n- 前端起草按钮改调后端,大模型不可用时降级回本地模板草稿,不阻断创作\n- .env.example 登记 DOUBAO_API_KEY/BASE_URL/MODEL(真实密钥仅在 gitignored 的 .env)\n\n运行配置:docker-compose Redis 端口参数化、前端 dev 绑 0.0.0.0 以支持公网访问\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-29T18:01:05+08:00"}],"HeadCommit":{"Sha1":"8b0729c9b6d46b1dd46a9f2f4b7536a5106a812e","Message":"fix(engine): Tesla P4 出歌链路修复(fp32+int8量化+DiT CPU offload)\n\nP4(sm_61 Pascal, 8GB) 上出歌此前必失败,根因是四个耦合约束:\n- fp16(默认)在 DiT 采样溢出产 NaN latents;唯一数值稳定路径是 fp32\n- fp32 DiT 权重 ~7.3GB,引擎「先整体搬 GPU 再量化」,加载即 OOM\n- 引擎 HTTP 出歌懒加载路径漏传 quantization,tier3 的量化默认成死代码\n- Pascal 默认降级的 w8a8_dynamic 张量不支持跨设备搬运,与 DiT offload 冲突\n\n有效组合: fp32 + int8_weight_only 量化 + DiT CPU offload + expandable_segments,\nDiT 在 CPU 上量化为 int8 后分层搬 GPU,常驻显存仅 ~387MB。实测 30s 歌成功落盘 FLAC。\n\n- start-engine-p4.sh: 注入上述全部运行时开关\n- deploy/ace-step/patches/: 固化引擎侧改动(startup_model_init.py 接通 quantization)\n- bootstrap-engine.sh / Dockerfile.tesla-p4: 引擎重建时自动应用补丁(引擎目录 gitignored)\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T12:42:31+08:00"},"CompareURL":"luoanwu/song-generation/compare/d28a8594e6cf9091cdf9ccd0fad377041dfaf727...8b0729c9b6d46b1dd46a9f2f4b7536a5106a812e","Len":3}...
|
1785386561
|
Edit
Delete
|
|
19840
|
5
|
5
|
7
|
53
|
0
|
0
|
refs/heads/hljTest
|
0
|
{"Commits":[{"Sha1":"8b0729c9b {"Commits":[{"Sha1":"8b0729c9b6d46b1dd46a9f2f4b7536a5106a812e","Message":"fix(engine): Tesla P4 出歌链路修复(fp32+int8量化+DiT CPU offload)\n\nP4(sm_61 Pascal, 8GB) 上出歌此前必失败,根因是四个耦合约束:\n- fp16(默认)在 DiT 采样溢出产 NaN latents;唯一数值稳定路径是 fp32\n- fp32 DiT 权重 ~7.3GB,引擎「先整体搬 GPU 再量化」,加载即 OOM\n- 引擎 HTTP 出歌懒加载路径漏传 quantization,tier3 的量化默认成死代码\n- Pascal 默认降级的 w8a8_dynamic 张量不支持跨设备搬运,与 DiT offload 冲突\n\n有效组合: fp32 + int8_weight_only 量化 + DiT CPU offload + expandable_segments,\nDiT 在 CPU 上量化为 int8 后分层搬 GPU,常驻显存仅 ~387MB。实测 30s 歌成功落盘 FLAC。\n\n- start-engine-p4.sh: 注入上述全部运行时开关\n- deploy/ace-step/patches/: 固化引擎侧改动(startup_model_init.py 接通 quantization)\n- bootstrap-engine.sh / Dockerfile.tesla-p4: 引擎重建时自动应用补丁(引擎目录 gitignored)\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T12:42:31+08:00"},{"Sha1":"c53b6955d7851b95d797b90087813d6a2a83d32f","Message":"feat: 新增 Tesla P4 引擎启动脚本(禁用 cuDNN)\n\n随 torch 2.5.1+cu121 的 cuDNN 9.1.9 在 Pascal(sm_61) 上找不到卷积算法\n(DiT proj_in Conv1d 报 \"GET was unable to find an engine to execute this\ncomputation\",fp16/fp32 皆然)。P4 无 Tensor Core,cuDNN 不带来加速,\n故启动时注入 torch.backends.cudnn.enabled=False,卷积回退原生 CUDA kernel。\n同时套用 Pascal 兼容开关(5Hz LM/LLM 走 pt backend)。\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T09:40:48+08:00"},{"Sha1":"51cd9fe059767d2377bd6292cf1913a9885f8cd7","Message":"feat: 歌词起草接入豆包大模型 + 本地/公网运行配置\n\n歌词起草从纯前端模板改为调用豆包(火山引擎 Ark,OpenAI 兼容)大模型:\n- contracts 新增 lyrics 域(draftLyricSchema 入参/响应契约)\n- 后端新建 lyrics 模块:POST /api/lyrics/draft,未配置 DOUBAO_API_KEY 时 503\n- 前端起草按钮改调后端,大模型不可用时降级回本地模板草稿,不阻断创作\n- .env.example 登记 DOUBAO_API_KEY/BASE_URL/MODEL(真实密钥仅在 gitignored 的 .env)\n\n运行配置:docker-compose Redis 端口参数化、前端 dev 绑 0.0.0.0 以支持公网访问\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-29T18:01:05+08:00"}],"HeadCommit":{"Sha1":"8b0729c9b6d46b1dd46a9f2f4b7536a5106a812e","Message":"fix(engine): Tesla P4 出歌链路修复(fp32+int8量化+DiT CPU offload)\n\nP4(sm_61 Pascal, 8GB) 上出歌此前必失败,根因是四个耦合约束:\n- fp16(默认)在 DiT 采样溢出产 NaN latents;唯一数值稳定路径是 fp32\n- fp32 DiT 权重 ~7.3GB,引擎「先整体搬 GPU 再量化」,加载即 OOM\n- 引擎 HTTP 出歌懒加载路径漏传 quantization,tier3 的量化默认成死代码\n- Pascal 默认降级的 w8a8_dynamic 张量不支持跨设备搬运,与 DiT offload 冲突\n\n有效组合: fp32 + int8_weight_only 量化 + DiT CPU offload + expandable_segments,\nDiT 在 CPU 上量化为 int8 后分层搬 GPU,常驻显存仅 ~387MB。实测 30s 歌成功落盘 FLAC。\n\n- start-engine-p4.sh: 注入上述全部运行时开关\n- deploy/ace-step/patches/: 固化引擎侧改动(startup_model_init.py 接通 quantization)\n- bootstrap-engine.sh / Dockerfile.tesla-p4: 引擎重建时自动应用补丁(引擎目录 gitignored)\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T12:42:31+08:00"},"CompareURL":"luoanwu/song-generation/compare/d28a8594e6cf9091cdf9ccd0fad377041dfaf727...8b0729c9b6d46b1dd46a9f2f4b7536a5106a812e","Len":3}...
|
1785386561
|
Edit
Delete
|
|
19869
|
7
|
5
|
7
|
53
|
0
|
0
|
refs/heads/hljTest
|
0
|
{"Commits":[{"Sha1":"ea37f6993 {"Commits":[{"Sha1":"ea37f699381c4dbc2445e6be1d3c1fa9bd0feb6a","Message":"chore(deploy): 纳入裸机常驻部署的 systemd 单元\n\n本地 pnpm 直跑方式对外部署时的三个 systemd 单元(引擎/后端/前端),\n开机自启 + 崩溃自动重启。当前生产机即用此方式部署。\n\n- acestep-engine.service: 引擎(8001),跑 start-engine-p4.sh\n- song-api.service: NestJS 后端(3201, start:prod)\n- song-web.service: Next.js 前端(3101, next start),对外唯一入口\n- README: 安装/build 前置/运维命令/注意事项\n\n单元内容与 /etc/systemd/system 已运行版本一致。DB/Redis 为 docker 容器,不在此管理。\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T13:32:08+08:00"}],"HeadCommit":{"Sha1":"ea37f699381c4dbc2445e6be1d3c1fa9bd0feb6a","Message":"chore(deploy): 纳入裸机常驻部署的 systemd 单元\n\n本地 pnpm 直跑方式对外部署时的三个 systemd 单元(引擎/后端/前端),\n开机自启 + 崩溃自动重启。当前生产机即用此方式部署。\n\n- acestep-engine.service: 引擎(8001),跑 start-engine-p4.sh\n- song-api.service: NestJS 后端(3201, start:prod)\n- song-web.service: Next.js 前端(3101, next start),对外唯一入口\n- README: 安装/build 前置/运维命令/注意事项\n\n单元内容与 /etc/systemd/system 已运行版本一致。DB/Redis 为 docker 容器,不在此管理。\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T13:32:08+08:00"},"CompareURL":"luoanwu/song-generation/compare/8b0729c9b6d46b1dd46a9f2f4b7536a5106a812e...ea37f699381c4dbc2445e6be1d3c1fa9bd0feb6a","Len":1}...
|
1785389542
|
Edit
Delete
|
|
19870
|
5
|
5
|
7
|
53
|
0
|
0
|
refs/heads/hljTest
|
0
|
{"Commits":[{"Sha1":"ea37f6993 {"Commits":[{"Sha1":"ea37f699381c4dbc2445e6be1d3c1fa9bd0feb6a","Message":"chore(deploy): 纳入裸机常驻部署的 systemd 单元\n\n本地 pnpm 直跑方式对外部署时的三个 systemd 单元(引擎/后端/前端),\n开机自启 + 崩溃自动重启。当前生产机即用此方式部署。\n\n- acestep-engine.service: 引擎(8001),跑 start-engine-p4.sh\n- song-api.service: NestJS 后端(3201, start:prod)\n- song-web.service: Next.js 前端(3101, next start),对外唯一入口\n- README: 安装/build 前置/运维命令/注意事项\n\n单元内容与 /etc/systemd/system 已运行版本一致。DB/Redis 为 docker 容器,不在此管理。\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T13:32:08+08:00"}],"HeadCommit":{"Sha1":"ea37f699381c4dbc2445e6be1d3c1fa9bd0feb6a","Message":"chore(deploy): 纳入裸机常驻部署的 systemd 单元\n\n本地 pnpm 直跑方式对外部署时的三个 systemd 单元(引擎/后端/前端),\n开机自启 + 崩溃自动重启。当前生产机即用此方式部署。\n\n- acestep-engine.service: 引擎(8001),跑 start-engine-p4.sh\n- song-api.service: NestJS 后端(3201, start:prod)\n- song-web.service: Next.js 前端(3101, next start),对外唯一入口\n- README: 安装/build 前置/运维命令/注意事项\n\n单元内容与 /etc/systemd/system 已运行版本一致。DB/Redis 为 docker 容器,不在此管理。\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T13:32:08+08:00"},"CompareURL":"luoanwu/song-generation/compare/8b0729c9b6d46b1dd46a9f2f4b7536a5106a812e...ea37f699381c4dbc2445e6be1d3c1fa9bd0feb6a","Len":1}...
|
1785389542
|
Edit
Delete
|
|
19910
|
7
|
5
|
7
|
53
|
0
|
0
|
refs/heads/hljTest
|
0
|
{"Commits":[{"Sha1":"e8b913f56 {"Commits":[{"Sha1":"e8b913f5667fb8a1812a240ef11d6dc579839351","Message":"chore(deploy): 纳入 nginx HTTPS 总入口配置与部署说明\n\ngeneration.g-hi.com 经 nginx(443) 分流:/ws→3201、其余→3101(Next),\nHTTP 跳转 HTTPS;IP/其它域名兜底回退到同机 voiceprint(8443)。\n配置与说明沉淀到 deploy/nginx/,并同步更新 systemd/README 的服务拓扑。\n证书与 .env 不入库。\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T14:22:31+08:00"}],"HeadCommit":{"Sha1":"e8b913f5667fb8a1812a240ef11d6dc579839351","Message":"chore(deploy): 纳入 nginx HTTPS 总入口配置与部署说明\n\ngeneration.g-hi.com 经 nginx(443) 分流:/ws→3201、其余→3101(Next),\nHTTP 跳转 HTTPS;IP/其它域名兜底回退到同机 voiceprint(8443)。\n配置与说明沉淀到 deploy/nginx/,并同步更新 systemd/README 的服务拓扑。\n证书与 .env 不入库。\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T14:22:31+08:00"},"CompareURL":"luoanwu/song-generation/compare/ea37f699381c4dbc2445e6be1d3c1fa9bd0feb6a...e8b913f5667fb8a1812a240ef11d6dc579839351","Len":1}...
|
1785392662
|
Edit
Delete
|
|
19911
|
5
|
5
|
7
|
53
|
0
|
0
|
refs/heads/hljTest
|
0
|
{"Commits":[{"Sha1":"e8b913f56 {"Commits":[{"Sha1":"e8b913f5667fb8a1812a240ef11d6dc579839351","Message":"chore(deploy): 纳入 nginx HTTPS 总入口配置与部署说明\n\ngeneration.g-hi.com 经 nginx(443) 分流:/ws→3201、其余→3101(Next),\nHTTP 跳转 HTTPS;IP/其它域名兜底回退到同机 voiceprint(8443)。\n配置与说明沉淀到 deploy/nginx/,并同步更新 systemd/README 的服务拓扑。\n证书与 .env 不入库。\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T14:22:31+08:00"}],"HeadCommit":{"Sha1":"e8b913f5667fb8a1812a240ef11d6dc579839351","Message":"chore(deploy): 纳入 nginx HTTPS 总入口配置与部署说明\n\ngeneration.g-hi.com 经 nginx(443) 分流:/ws→3201、其余→3101(Next),\nHTTP 跳转 HTTPS;IP/其它域名兜底回退到同机 voiceprint(8443)。\n配置与说明沉淀到 deploy/nginx/,并同步更新 systemd/README 的服务拓扑。\n证书与 .env 不入库。\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T14:22:31+08:00"},"CompareURL":"luoanwu/song-generation/compare/ea37f699381c4dbc2445e6be1d3c1fa9bd0feb6a...e8b913f5667fb8a1812a240ef11d6dc579839351","Len":1}...
|
1785392662
|
Edit
Delete
|
|
19933
|
7
|
5
|
7
|
53
|
0
|
0
|
refs/heads/hljTest
|
0
|
{"Commits":[{"Sha1":"04835a06e {"Commits":[{"Sha1":"04835a06e70f200230a21a912961afcbd6c503fd","Message":"docs: 重写 docs/README 为本项目(歌词→歌曲批量生产)说明\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T14:45:29+08:00"}],"HeadCommit":{"Sha1":"04835a06e70f200230a21a912961afcbd6c503fd","Message":"docs: 重写 docs/README 为本项目(歌词→歌曲批量生产)说明\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T14:45:29+08:00"},"CompareURL":"luoanwu/song-generation/compare/e8b913f5667fb8a1812a240ef11d6dc579839351...04835a06e70f200230a21a912961afcbd6c503fd","Len":1}...
|
1785395827
|
Edit
Delete
|
|
19934
|
5
|
5
|
7
|
53
|
0
|
0
|
refs/heads/hljTest
|
0
|
{"Commits":[{"Sha1":"04835a06e {"Commits":[{"Sha1":"04835a06e70f200230a21a912961afcbd6c503fd","Message":"docs: 重写 docs/README 为本项目(歌词→歌曲批量生产)说明\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T14:45:29+08:00"}],"HeadCommit":{"Sha1":"04835a06e70f200230a21a912961afcbd6c503fd","Message":"docs: 重写 docs/README 为本项目(歌词→歌曲批量生产)说明\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T14:45:29+08:00"},"CompareURL":"luoanwu/song-generation/compare/e8b913f5667fb8a1812a240ef11d6dc579839351...04835a06e70f200230a21a912961afcbd6c503fd","Len":1}...
|
1785395827
|
Edit
Delete
|
|
20362
|
7
|
5
|
7
|
72
|
0
|
0
|
refs/heads/hljTest
|
0
|
|
1785740632
|
Edit
Delete
|
|
20363
|
5
|
5
|
7
|
72
|
0
|
0
|
refs/heads/hljTest
|
0
|
|
1785740632
|
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
|
|
20365
|
5
|
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
|
|
20459
|
7
|
5
|
7
|
53
|
0
|
0
|
refs/heads/hljTest
|
0
|
{"Commits":[{"Sha1":"da3f6895d {"Commits":[{"Sha1":"da3f6895d371408052023bc1698549e1f348f04a","Message":"chore(web): 整合服务器部署接入 basePath: '/song'\n\nnginx 整合服务器 (/etc/nginx/sites-enabled/00-incoming.conf) 已按\nbasePath 模式把 /song/* 反代到本仓 web(:3101)、/song-api/* 反代到\nAPI(:3201)。web 不加 basePath 时 next 端对 /_next/* 资源按根路径\n提供,nginx 转发到 :3101 后 404。\n\n改动:\n- 非 capacitor 构建启用 basePath: '/song'(capacitor 静态导出仍\n 走 out/,绝对 URL 直连后端,不需 basePath)。\n- 增补一段注释说明与 nginx /song 路由的对应关系。\n\ndev 访问 http://localhost:3101/song/,与 generation.g-hi.com\n线上 /song/ 同源。\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"luoanwu@g-hi.com","AuthorName":"luoanwu","CommitterEmail":"luoanwu@g-hi.com","CommitterName":"luoanwu","Timestamp":"2026-08-04T14:13:00+08:00"}],"HeadCommit":{"Sha1":"da3f6895d371408052023bc1698549e1f348f04a","Message":"chore(web): 整合服务器部署接入 basePath: '/song'\n\nnginx 整合服务器 (/etc/nginx/sites-enabled/00-incoming.conf) 已按\nbasePath 模式把 /song/* 反代到本仓 web(:3101)、/song-api/* 反代到\nAPI(:3201)。web 不加 basePath 时 next 端对 /_next/* 资源按根路径\n提供,nginx 转发到 :3101 后 404。\n\n改动:\n- 非 capacitor 构建启用 basePath: '/song'(capacitor 静态导出仍\n 走 out/,绝对 URL 直连后端,不需 basePath)。\n- 增补一段注释说明与 nginx /song 路由的对应关系。\n\ndev 访问 http://localhost:3101/song/,与 generation.g-hi.com\n线上 /song/ 同源。\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"luoanwu@g-hi.com","AuthorName":"luoanwu","CommitterEmail":"luoanwu@g-hi.com","CommitterName":"luoanwu","Timestamp":"2026-08-04T14:13:00+08:00"},"CompareURL":"luoanwu/song-generation/compare/04835a06e70f200230a21a912961afcbd6c503fd...da3f6895d371408052023bc1698549e1f348f04a","Len":1}...
|
1785824016
|
Edit
Delete
|
|
20460
|
5
|
5
|
7
|
53
|
0
|
0
|
refs/heads/hljTest
|
0
|
{"Commits":[{"Sha1":"da3f6895d {"Commits":[{"Sha1":"da3f6895d371408052023bc1698549e1f348f04a","Message":"chore(web): 整合服务器部署接入 basePath: '/song'\n\nnginx 整合服务器 (/etc/nginx/sites-enabled/00-incoming.conf) 已按\nbasePath 模式把 /song/* 反代到本仓 web(:3101)、/song-api/* 反代到\nAPI(:3201)。web 不加 basePath 时 next 端对 /_next/* 资源按根路径\n提供,nginx 转发到 :3101 后 404。\n\n改动:\n- 非 capacitor 构建启用 basePath: '/song'(capacitor 静态导出仍\n 走 out/,绝对 URL 直连后端,不需 basePath)。\n- 增补一段注释说明与 nginx /song 路由的对应关系。\n\ndev 访问 http://localhost:3101/song/,与 generation.g-hi.com\n线上 /song/ 同源。\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"luoanwu@g-hi.com","AuthorName":"luoanwu","CommitterEmail":"luoanwu@g-hi.com","CommitterName":"luoanwu","Timestamp":"2026-08-04T14:13:00+08:00"}],"HeadCommit":{"Sha1":"da3f6895d371408052023bc1698549e1f348f04a","Message":"chore(web): 整合服务器部署接入 basePath: '/song'\n\nnginx 整合服务器 (/etc/nginx/sites-enabled/00-incoming.conf) 已按\nbasePath 模式把 /song/* 反代到本仓 web(:3101)、/song-api/* 反代到\nAPI(:3201)。web 不加 basePath 时 next 端对 /_next/* 资源按根路径\n提供,nginx 转发到 :3101 后 404。\n\n改动:\n- 非 capacitor 构建启用 basePath: '/song'(capacitor 静态导出仍\n 走 out/,绝对 URL 直连后端,不需 basePath)。\n- 增补一段注释说明与 nginx /song 路由的对应关系。\n\ndev 访问 http://localhost:3101/song/,与 generation.g-hi.com\n线上 /song/ 同源。\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"luoanwu@g-hi.com","AuthorName":"luoanwu","CommitterEmail":"luoanwu@g-hi.com","CommitterName":"luoanwu","Timestamp":"2026-08-04T14:13:00+08:00"},"CompareURL":"luoanwu/song-generation/compare/04835a06e70f200230a21a912961afcbd6c503fd...da3f6895d371408052023bc1698549e1f348f04a","Len":1}...
|
1785824016
|
Edit
Delete
|
|
20994
|
7
|
5
|
7
|
53
|
0
|
0
|
refs/heads/hljTest
|
0
|
{"Commits":[{"Sha1":"109f2b36f {"Commits":[{"Sha1":"109f2b36f24f3ecc422affedfb31de25af25977c","Message":"Merge origin/main into hljTest\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-06T13:45:25+08:00"},{"Sha1":"5fc0d4e18a5b865a166b486b4836bc822e8392d0","Message":"Merge branch 'hljTest' into main\n\n集成豆包歌词起草、Tesla P4 出歌修复(fp32+int8+DiT offload)、\nnginx HTTPS 总入口 + systemd 常驻部署、web basePath '/song'。\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-05T20:59:21-07:00"},{"Sha1":"67970c1b0a1dcb0e91d17be0a26611d01e28f35c","Message":"feat: 歌曲在线回放链路 + 曲库播放 UI\n\n- 新增 song-playback.service.ts:短时随机凭证签发,浏览器分段播放\n- songs.controller.ts:Range 响应支持 FLAC 分段流式回放,不预下载\n- LibraryView 接入在线播放交互;api.ts/contracts 同步回放契约\n- 刷新治理 reports 与 GPU 部署校验(check-deployment.mjs)\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-05T20:59:07-07:00"}],"HeadCommit":{"Sha1":"109f2b36f24f3ecc422affedfb31de25af25977c","Message":"Merge origin/main into hljTest\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-06T13:45:25+08:00"},"CompareURL":"luoanwu/song-generation/compare/da3f6895d371408052023bc1698549e1f348f04a...109f2b36f24f3ecc422affedfb31de25af25977c","Len":3}...
|
1785995712
|
Edit
Delete
|
|
20995
|
5
|
5
|
7
|
53
|
0
|
0
|
refs/heads/hljTest
|
0
|
{"Commits":[{"Sha1":"109f2b36f {"Commits":[{"Sha1":"109f2b36f24f3ecc422affedfb31de25af25977c","Message":"Merge origin/main into hljTest\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-06T13:45:25+08:00"},{"Sha1":"5fc0d4e18a5b865a166b486b4836bc822e8392d0","Message":"Merge branch 'hljTest' into main\n\n集成豆包歌词起草、Tesla P4 出歌修复(fp32+int8+DiT offload)、\nnginx HTTPS 总入口 + systemd 常驻部署、web basePath '/song'。\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-05T20:59:21-07:00"},{"Sha1":"67970c1b0a1dcb0e91d17be0a26611d01e28f35c","Message":"feat: 歌曲在线回放链路 + 曲库播放 UI\n\n- 新增 song-playback.service.ts:短时随机凭证签发,浏览器分段播放\n- songs.controller.ts:Range 响应支持 FLAC 分段流式回放,不预下载\n- LibraryView 接入在线播放交互;api.ts/contracts 同步回放契约\n- 刷新治理 reports 与 GPU 部署校验(check-deployment.mjs)\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-05T20:59:07-07:00"}],"HeadCommit":{"Sha1":"109f2b36f24f3ecc422affedfb31de25af25977c","Message":"Merge origin/main into hljTest\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-06T13:45:25+08:00"},"CompareURL":"luoanwu/song-generation/compare/da3f6895d371408052023bc1698549e1f348f04a...109f2b36f24f3ecc422affedfb31de25af25977c","Len":3}...
|
1785995712
|
Edit
Delete
|
|
23583
|
7
|
5
|
7
|
57
|
0
|
0
|
refs/heads/hljTest
|
0
|
|
1786959245
|
Edit
Delete
|
|
23584
|
5
|
5
|
7
|
57
|
0
|
0
|
refs/heads/hljTest
|
0
|
|
1786959245
|
Edit
Delete
|
|
23585
|
7
|
5
|
7
|
57
|
0
|
0
|
refs/heads/hljTest
|
0
|
{"Commits":[{"Sha1":"549ea3144 {"Commits":[{"Sha1":"549ea31448ec1e62e8f10039ed3f8c7d384e07f8","Message":"feat(material-factory): 接入阿里云百炼真实生成链路\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-17T17:34:04+08:00"}],"HeadCommit":{"Sha1":"549ea31448ec1e62e8f10039ed3f8c7d384e07f8","Message":"feat(material-factory): 接入阿里云百炼真实生成链路\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-17T17:34:04+08:00"},"CompareURL":"luoanwu/image-generation/compare/27c04f193a6a4170b1e0f7839a18d0e7e9b529fb...549ea31448ec1e62e8f10039ed3f8c7d384e07f8","Len":1}...
|
1786959245
|
Edit
Delete
|
|
23586
|
5
|
5
|
7
|
57
|
0
|
0
|
refs/heads/hljTest
|
0
|
{"Commits":[{"Sha1":"549ea3144 {"Commits":[{"Sha1":"549ea31448ec1e62e8f10039ed3f8c7d384e07f8","Message":"feat(material-factory): 接入阿里云百炼真实生成链路\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-17T17:34:04+08:00"}],"HeadCommit":{"Sha1":"549ea31448ec1e62e8f10039ed3f8c7d384e07f8","Message":"feat(material-factory): 接入阿里云百炼真实生成链路\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-17T17:34:04+08:00"},"CompareURL":"luoanwu/image-generation/compare/27c04f193a6a4170b1e0f7839a18d0e7e9b529fb...549ea31448ec1e62e8f10039ed3f8c7d384e07f8","Len":1}...
|
1786959245
|
Edit
Delete
|
|
23991
|
7
|
5
|
7
|
57
|
0
|
0
|
refs/heads/hljTest
|
0
|
{"Commits":[{"Sha1":"5fbcad0bc {"Commits":[{"Sha1":"5fbcad0bceea9e81914ae6b7e8bfb05265845598","Message":"merge(main): 合并拍摄脚本与云端渲染能力\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-18T16:58:46+08:00"},{"Sha1":"eb6483fa7aadc8d2d4e715274c2519f67005e135","Message":"Merge pull request 'feat(script): 接入大语言模型——歌词/文案 → 拍摄脚本 → 角色确认 → 定格图' (#3) from feat/llm-shooting-script into main\n\nReviewed-on: https://gitea.g-hi.com/luoanwu/image-generation/pulls/3\n","AuthorEmail":"law@g-hi.com","AuthorName":"luoanwu","CommitterEmail":"law@g-hi.com","CommitterName":"luoanwu","Timestamp":"2026-08-18T14:00:06+08:00"},{"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"},{"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"},{"Sha1":"9af0a397ce69cf03623a495ee3ef49943598f5a4","Message":"Merge origin/main: 双推理路线合流为「本地优先 / 托管兜底」能力路由\n\n远端 PR #1(本地权重真跑,面向 128 GiB 主机)与本地 a3b0b41(托管 DashScope\nQwen-Image 3.0,面向 24 GiB 主机)各自独立实现了改字,在 /v1/edit 与双后端\nrender-pipeline 上正面冲突——同一事实两份运行时口径(违治理原则 1)。\n本次不做二选一,合流为一条按能力路由的通路。\n\ncontracts(路由单源)\n- 新增 RENDER_KIND_FALLBACK_CAPABILITIES + resolveRenderCapabilityKeys():\n 主能力=本地 qwen-image-edit,兜底=托管 qwen-image-3-api,双后端禁止各自\n 展开再拼一遍降级逻辑\n- 修掉三方自动合并留下的语义漂移:RENDER_KIND_CAPABILITIES 曾被并成\n 「改字 kind 只映射托管」,与本地优先矛盾\n- 新增 LOCAL_MODEL_KINDS;MATERIAL_MODEL_ROUTING 改字标签体现双通路\n- 契约测试同步断言新语义(主/兜底/解析顺序/无兜底 kind)\n\nsidecar\n- run_edit 改为路由版:本地可跑优先走本地(不外传底图、不产生云端调用费),\n 本地不可用才降到托管;显式传 modelKey 则锁定该条路径不做隐式回退\n- HEAD 的托管实现降为 run_hosted_edit() 分支,EditRequest / run_edit 各唯一\n- 两条都不可用 → 503 NO_EDIT_BACKEND_AVAILABLE 且同时带上两侧 capability,\n 禁止静默降级\n\n双后端\n- sidecarEdit 的 modelKey 由硬编码 'qwen-image-edit' 改为路由解析结果,\n 否则小内存主机上托管兜底永远走不到\n- BLOCKED reason 逐条列出每个候选能力为何不可用\n- 清理两处悬空的 hostedEdit 引用(声明在冲突块、使用在自动合并区,\n 靠 typecheck 兜住)——该分支只在 procedural 路径可达,直接调 sidecarRender\n\n前端\n- 血统标注按证据判定:ktv-poster-master.png 由初始化提交 fc2ce50 引入且\n 远端从未改动,远端将其标为「Qwen-Image-2512 产物」属误标,保留\n 「原型演示静态素材」口径(P3:不冒充模型产物)\n- constants.ts 模型口径一律从 MATERIAL_MODEL_ROUTING 派生,不留第二真源\n\n验收(诚实记录)\n- pnpm check 全项 exit 0\n- pnpm check:runtime 真实 DB+Redis 通过(迁移 deploy/status + 双后端测试)\n- pnpm check:inference 在本机失败:权重实体已删除、仅剩 git-lfs 指针,\n sidecar-health 阶段诚实报 PaddleOCR 权重不完整。属环境限制非代码缺陷,\n 已记为 G16,未因此放宽任何断言\n\nCLAUDE.md 回灌:C10 闭环记录、G14 合并两侧真实证据、G16 新增\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-17T21:19:49-07:00"}],"HeadCommit":{"Sha1":"5fbcad0bceea9e81914ae6b7e8bfb05265845598","Message":"merge(main): 合并拍摄脚本与云端渲染能力\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-18T16:58:46+08:00"},"CompareURL":"luoanwu/image-generation/compare/549ea31448ec1e62e8f10039ed3f8c7d384e07f8...5fbcad0bceea9e81914ae6b7e8bfb05265845598","Len":7}...
|
1787043527
|
Edit
Delete
|