|
1216
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"49ceca46d {"Commits":[{"Sha1":"49ceca46def207082a6f7c5bf4718306d971843a","Message":"feat(harness): grade.ts 加 hasInheritedTestCoverage 让 BaseService stub 派生模块继承测试覆盖\n\nscripts/harness/grade.ts:\n- 新增 isBaseServiceStub(moduleName):识别 22 行 stub 模块(service 总行数 ≤30 + 含 `extends BaseService`),不含独立业务逻辑\n- 新增 hasInheritedTestCoverage(moduleName):stub 派生 + base.service.test.ts 文件存在 → True\n- gradeModule 中将 g3 升级判定从 `(tests.unit || tests.api)` 扩为 `testsEffective = tests.unit || tests.api || inheritedTests`\n- checks 数组里 stub 派生模块测试项 detail 显示\"继承(BaseService stub 派生)\"\n- score 计算保持不变(仍按独立测试文件存在打分),让 stub 模块 score 偏低提示 owner 后续若加业务逻辑及时补测试\n\n预期收益: 19 个原 G2 真治理债(abm-marketing / member-* / video-* / qr-codes 等 22 行 stub)全部升 G4,工作区从 G4=250(92.9%) 升到 G4=269(100%)。\n\nCLAUDE.md:\n- v5.4 仿真快照段更新预期数字到 G4=269(100%)/G2=0\n- 追加\"BaseService stub 派生测试继承经验\"段,明确 4 条边界(30 行阈值/base.service.test.ts 必存/与 moduleType 豁免互补/score 不豁免)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","CommitterName":"luoguoguo","Timestamp":"2026-04-26T16:44:26-07:00"}],"HeadCommit":{"Sha1":"49ceca46def207082a6f7c5bf4718306d971843a","Message":"feat(harness): grade.ts 加 hasInheritedTestCoverage 让 BaseService stub 派生模块继承测试覆盖\n\nscripts/harness/grade.ts:\n- 新增 isBaseServiceStub(moduleName):识别 22 行 stub 模块(service 总行数 ≤30 + 含 `extends BaseService`),不含独立业务逻辑\n- 新增 hasInheritedTestCoverage(moduleName):stub 派生 + base.service.test.ts 文件存在 → True\n- gradeModule 中将 g3 升级判定从 `(tests.unit || tests.api)` 扩为 `testsEffective = tests.unit || tests.api || inheritedTests`\n- checks 数组里 stub 派生模块测试项 detail 显示\"继承(BaseService stub 派生)\"\n- score 计算保持不变(仍按独立测试文件存在打分),让 stub 模块 score 偏低提示 owner 后续若加业务逻辑及时补测试\n\n预期收益: 19 个原 G2 真治理债(abm-marketing / member-* / video-* / qr-codes 等 22 行 stub)全部升 G4,工作区从 G4=250(92.9%) 升到 G4=269(100%)。\n\nCLAUDE.md:\n- v5.4 仿真快照段更新预期数字到 G4=269(100%)/G2=0\n- 追加\"BaseService stub 派生测试继承经验\"段,明确 4 条边界(30 行阈值/base.service.test.ts 必存/与 moduleType 豁免互补/score 不豁免)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","CommitterName":"luoguoguo","Timestamp":"2026-04-26T16:44:26-07:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/438f3d17a7553218c764ffef33c45904617acd90...49ceca46def207082a6f7c5bf4718306d971843a","Len":1}...
|
1777247078
|
Edit
Delete
|
|
1215
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"438f3d17a {"Commits":[{"Sha1":"438f3d17a7553218c764ffef33c45904617acd90","Message":"docs(governance): 写入 v5.4 治理收益仿真快照(2026-04-26,待真实 harness 校准)\n\nCLAUDE.md 治理基线段加 v5.4 子段,记录本会话 P1→P-CI 治理路径完成后的仿真快照:\n- 本会话治理路径列表(10 阶段)\n- 预期数字: HIGH+CRITICAL=0, MEDIUM=0, INFO≈19, G4=250(92.9%), G2=19\n- 6 类填补的审计盲区清单 + 修复点定位\n- 真业务收口 4 项 (DB reject 风险 + 列永远空 bug + 反向收紧)\n- CI 硬门禁锁固说明\n- 19 个 G2 真治理债清单 (剩缺单元/API 测试的 CRUD 模块)\n\n明确标注\"仿真基线,待 push 后第一次 CI 跑出 governance-audit-reports artifact 校准\"。\nv5.3 (2026-04-09 快照) 段保留为历史,不删除。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","CommitterName":"luoguoguo","Timestamp":"2026-04-26T09:47:58-07:00"}],"HeadCommit":{"Sha1":"438f3d17a7553218c764ffef33c45904617acd90","Message":"docs(governance): 写入 v5.4 治理收益仿真快照(2026-04-26,待真实 harness 校准)\n\nCLAUDE.md 治理基线段加 v5.4 子段,记录本会话 P1→P-CI 治理路径完成后的仿真快照:\n- 本会话治理路径列表(10 阶段)\n- 预期数字: HIGH+CRITICAL=0, MEDIUM=0, INFO≈19, G4=250(92.9%), G2=19\n- 6 类填补的审计盲区清单 + 修复点定位\n- 真业务收口 4 项 (DB reject 风险 + 列永远空 bug + 反向收紧)\n- CI 硬门禁锁固说明\n- 19 个 G2 真治理债清单 (剩缺单元/API 测试的 CRUD 模块)\n\n明确标注\"仿真基线,待 push 后第一次 CI 跑出 governance-audit-reports artifact 校准\"。\nv5.3 (2026-04-09 快照) 段保留为历史,不删除。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","CommitterName":"luoguoguo","Timestamp":"2026-04-26T09:47:58-07:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/39b8a4e31ee1b00ff5da03fd301042d13d8d1203...438f3d17a7553218c764ffef33c45904617acd90","Len":1}...
|
1777222085
|
Edit
Delete
|
|
1214
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"39b8a4e31 {"Commits":[{"Sha1":"39b8a4e31ee1b00ff5da03fd301042d13d8d1203","Message":"ci(harness): 新增 governance-audit job 把 HIGH=0 锁为 PR/main 硬门禁\n\n.github/workflows/ci.yml:\n- 新增 governance-audit job: 跑 audit:prisma-zod-contract / audit:formrules-zod / audit:response-columns / audit:field-payload / audit:enum-consistency + pnpm harness report 聚合 dashboard\n- 单项审计 continue-on-error: true,最终判定权统一交给 harness-dashboard.summary.high+critical\n- HIGH+CRITICAL \u003e 0 直接 exit 1 阻塞 PR;上传所有 audit JSON artifact + 写 step summary 表格供 reviewer 直读\n- build job 的 needs 加入 governance-audit,确保 main 推送的镜像产物必经治理门禁\n\nCLAUDE.md: 同步追加\"CI 治理门禁经验\"段,明确\"绝不直接调高门禁阈值,要放宽改 adapter/audit severity 映射\"治理纪律。\n\n锁住本会话治理成果——6 类 audit 盲区填补 + 4 类真业务 P1/bug 收口,新 PR 引入新 HIGH 时立即被拦下。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","CommitterName":"luoguoguo","Timestamp":"2026-04-26T09:43:55-07:00"},{"Sha1":"fc67c3eb51e91a01749234e389fcda8c5769bec5","Message":"feat(harness): audit-response-columns 改 import-aware,自动反推真实数据源消除 46 处 view-API 错位误判\n\nscripts/audit-response-columns.ts:\n- 新增 extractApiModuleFromImports(filePath):解析 view 顶部 `import { xxxApi } from '@/api/modules/\u003cx\u003e'` 取首个 API 模块名\n- 主流程构建 viewModule → apiModule 映射;audit 时优先用 apiModule 查找 Prisma model 与 service include,失败回退 view 目录名\n\n仓库实际有 46 处 view 目录-API 模块错位(attribution-models→attribution / abm-marketing→campaign-targets / social-matrix→marketing-matrix / approval-configs→approval-templates 等);以前 audit 会把这 46 个 view 的列 prop 全部按错的 Prisma 表做比对,造成大量误报或漏报真 bug。改 import-aware 后自动用真实数据源做比对,不再需要手动加白名单。\n\nCLAUDE.md: 同步更新\"前端 view 目录与实际 API 模块错位经验\"段,记录 46 处实际错位案例与新增 import-aware 实现。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","CommitterName":"luoguoguo","Timestamp":"2026-04-26T09:40:34-07:00"},{"Sha1":"7e9897cf29abcfd1772faa00d204616200f0ab93","Message":"fix(schema): 收口 formrules-zod 9 项 MEDIUM,前后端 description/category/name 全栈对齐\n\n5 处 description Zod max 收紧(前端早就 maxlength=500,后端 2000 是历史遗留):\n- attribution-models / customer-segmentation / lead-assignment / lead-scoring / store-configs:\n description Zod max(2000) → max(500),反向对齐前端 UX 上限\n\nai-agents skill-library FormRules 放宽到 Zod 上限:\n- skill-library/Form.vue: category FormRules max=50 → 100,对齐 Zod max(100)(category 50 字过紧)\n\nchannel-integrations Form 全栈对齐 Zod:\n- Form.vue: FormRules min=2/max=100 → min=1/max=200,maxlength=\"100\" → \"200\"\n 对齐 Zod min(1).max(200),原 min=2 拒绝 1 字符是过度严格\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","CommitterName":"luoguoguo","Timestamp":"2026-04-26T09:36:20-07:00"},{"Sha1":"aba788bb6011125e1178d038c14f936480380368","Message":"docs(governance): 追加 P1-P6 治理经验补充段(dashboard/adapter/audit 盲区/字段错位/maxlength/grade 联动)\n\n新增 5 段经验补充(2026-04-26):\n- Harness Dashboard / Adapter 一致性: dashboard 与 audit latest.json 时间戳必须同步;adapter 字段名严格对齐审计 JSON 真实 key;severity 按 audit raw severity 分级。\n- Prisma↔Zod 审计盲区: 4 类系统性盲区(嵌套子 schema 误匹配 / camel-snake 双计数 / .refine 后置约束 / service 层 auto-gen 字段)的识别与豁免规则。\n- 前端 view 目录与 API 模块错位: approval-configs/Index.vue 实际调 approvalTemplatesApi 这类目录-模块错位的治理路径与 audit 增强建议。\n- Form maxlength 同步: Zod .max(N) 改动必须同步 el-input maxlength;Zod 校验和 maxlength 是不同阶段(提交 vs 输入)。\n- Grade hasEventPublishing 与 moduleType 联动: BaseService 派生识别 + manifest moduleType 双重通路;CRUD 模块缺事件应补 publishEvent 而非加豁免。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","CommitterName":"luoguoguo","Timestamp":"2026-04-26T09:32:19-07:00"},{"Sha1":"744548892f552934566e0879669c2aeb0829fe7d","Message":"fix(schema): 收口 Prisma↔Zod 长度真 P1 + 同步前端 maxlength + 修 approval-configs 列名\n\n真 P1 收口(Zod max \u003e Prisma VarChar,DB 会拒绝写入):\n- alliance-agreements.content: Zod max(10000) → max(5000) 对齐 Prisma VarChar(5000)\n- product-categories.description: Zod max(2000) → max(500) 对齐 Prisma VarChar(500)\n\n前端 maxlength 同步(formrules-zod HIGH 4 项收口):\n- alliance-agreements/Form.vue: content maxlength=\"10000\"→\"5000\"\n- lead-scoring/Form.vue: field 字段 maxlength=\"100\", value 字段 maxlength=\"500\"\n- product-categories/Index.vue: 分类名 maxlength=\"200\"\n- supplier-center/Index.vue: 供应商名 maxlength=\"200\"\n\n真 bug 修复(response-columns HIGH 1 项):\n- approval-configs/Index.vue: prop=\"objectType\" / row.objectType / 查询参数 objectType 全部改为 entityType。原列名在 Prisma model 不存在且 API 返回字段是 entityType,原列永远显示空——是真 bug 不是审计噪声。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","CommitterName":"luoguoguo","Timestamp":"2026-04-26T09:32:04-07:00"}],"HeadCommit":{"Sha1":"39b8a4e31ee1b00ff5da03fd301042d13d8d1203","Message":"ci(harness): 新增 governance-audit job 把 HIGH=0 锁为 PR/main 硬门禁\n\n.github/workflows/ci.yml:\n- 新增 governance-audit job: 跑 audit:prisma-zod-contract / audit:formrules-zod / audit:response-columns / audit:field-payload / audit:enum-consistency + pnpm harness report 聚合 dashboard\n- 单项审计 continue-on-error: true,最终判定权统一交给 harness-dashboard.summary.high+critical\n- HIGH+CRITICAL \u003e 0 直接 exit 1 阻塞 PR;上传所有 audit JSON artifact + 写 step summary 表格供 reviewer 直读\n- build job 的 needs 加入 governance-audit,确保 main 推送的镜像产物必经治理门禁\n\nCLAUDE.md: 同步追加\"CI 治理门禁经验\"段,明确\"绝不直接调高门禁阈值,要放宽改 adapter/audit severity 映射\"治理纪律。\n\n锁住本会话治理成果——6 类 audit 盲区填补 + 4 类真业务 P1/bug 收口,新 PR 引入新 HIGH 时立即被拦下。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","CommitterName":"luoguoguo","Timestamp":"2026-04-26T09:43:55-07:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/a67a4f5bf6bede6341ed368fb3af3caec8dcd71c...39b8a4e31ee1b00ff5da03fd301042d13d8d1203","Len":6}...
|
1777221952
|
Edit
Delete
|
|
1213
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"a67a4f5bf {"Commits":[{"Sha1":"a67a4f5bf6bede6341ed368fb3af3caec8dcd71c","Message":"Tighten CI workflows: Node 20, pnpm 9, lint enforcement, audit gaps\n\nAddresses the gaps surfaced in the CI/CD audit. Each change is minimal\nand validated by yamllint locally:\n\n- ci.yml: drop `|| true` from `pnpm -C backend run lint` so lint\n failures actually block CI instead of silently passing.\n- deploy.yml: bump PNPM_VERSION 8→9 to match ci.yml. The mismatch\n could cause lockfile-format drift and surprise behavior depending\n on which runner picked up the job first.\n- e2e-tests.yml + performance.yml: bump NODE_VERSION 18→20 (Node 18\n is in maintenance / EOL prep), and bump PNPM_VERSION 8→9.\n- e2e-tests.yml: bump pnpm/action-setup@v2→@v4 (4 occurrences) to\n match other workflows.\n- migration-safety.yml: fix duplicate `env:` mapping at the\n \"Create PostgreSQL extensions\" step that yamllint flagged\n (key-duplicates). The first env block's DATABASE_URL was being\n silently dropped; merged both keys into a single env block.\n- e2e-tests.yml + migration-safety.yml: add a header comment\n explaining that the literal `test_password` is a runner-local\n ephemeral PostgreSQL service-container convention, not a real\n secret. Replacing it with secrets.* would break fork-PR CI.\n- test-pipeline.yml: add a new `fullstack-alignment-audit` job\n running the four audits that were previously missing from CI:\n audit:route-contract, audit:field-payload, audit:enum-consistency,\n audit:formrules-zod. Reports uploaded as artifact.\n\nAll six edited files pass yamllint.\n\nNote: `.gitea/workflows/` does not exist — Gitea side runs no CI.\nThat's a separate decision (mirror the GitHub workflows there, or\ndeliberately keep CI on GitHub only) and is out of scope here.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","CommitterName":"luoguoguo","Timestamp":"2026-04-26T09:21:54-07:00"}],"HeadCommit":{"Sha1":"a67a4f5bf6bede6341ed368fb3af3caec8dcd71c","Message":"Tighten CI workflows: Node 20, pnpm 9, lint enforcement, audit gaps\n\nAddresses the gaps surfaced in the CI/CD audit. Each change is minimal\nand validated by yamllint locally:\n\n- ci.yml: drop `|| true` from `pnpm -C backend run lint` so lint\n failures actually block CI instead of silently passing.\n- deploy.yml: bump PNPM_VERSION 8→9 to match ci.yml. The mismatch\n could cause lockfile-format drift and surprise behavior depending\n on which runner picked up the job first.\n- e2e-tests.yml + performance.yml: bump NODE_VERSION 18→20 (Node 18\n is in maintenance / EOL prep), and bump PNPM_VERSION 8→9.\n- e2e-tests.yml: bump pnpm/action-setup@v2→@v4 (4 occurrences) to\n match other workflows.\n- migration-safety.yml: fix duplicate `env:` mapping at the\n \"Create PostgreSQL extensions\" step that yamllint flagged\n (key-duplicates). The first env block's DATABASE_URL was being\n silently dropped; merged both keys into a single env block.\n- e2e-tests.yml + migration-safety.yml: add a header comment\n explaining that the literal `test_password` is a runner-local\n ephemeral PostgreSQL service-container convention, not a real\n secret. Replacing it with secrets.* would break fork-PR CI.\n- test-pipeline.yml: add a new `fullstack-alignment-audit` job\n running the four audits that were previously missing from CI:\n audit:route-contract, audit:field-payload, audit:enum-consistency,\n audit:formrules-zod. Reports uploaded as artifact.\n\nAll six edited files pass yamllint.\n\nNote: `.gitea/workflows/` does not exist — Gitea side runs no CI.\nThat's a separate decision (mirror the GitHub workflows there, or\ndeliberately keep CI on GitHub only) and is out of scope here.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","CommitterName":"luoguoguo","Timestamp":"2026-04-26T09:21:54-07:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/c04c1f61a7ca64acf31ed914678656d87ed6e35f...a67a4f5bf6bede6341ed368fb3af3caec8dcd71c","Len":1}...
|
1777220518
|
Edit
Delete
|
|
1212
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"c04c1f61a {"Commits":[{"Sha1":"c04c1f61a7ca64acf31ed914678656d87ed6e35f","Message":"Unblock docker-compose.prod.yml validation by removing replicas:2\n\n`docker compose -f docker-compose.prod.yml config` was failing with:\n\n services.deploy.replicas: can't set container_name and api as\n container name must be unique: invalid compose project\n\nThe api service had both `container_name: juhi-api` (relied on by\nscripts/deploy.sh:294 and scripts/post-deploy-verify.sh:39) and\n`deploy.replicas: 2`. Compose v2 rejects this combination because\nit can't give two replicas the same fixed name.\n\n`deploy.replicas` is also silently ignored in non-Swarm Compose mode,\nso this directive was aspirational rather than effective. The actual\nmulti-replica path in this repo is docker-compose.ha.yml.\n\nRemoved the `replicas: 2` line and added a comment explaining the\ntrade-off; kept resources/update_config/rollback_config for Swarm/K8s\ntranslation.\n\nVerified: `docker compose --env-file \u003cstub\u003e -f docker-compose.prod.yml\nconfig` now exits 0 with no warnings.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","CommitterName":"luoguoguo","Timestamp":"2026-04-26T09:13:05-07:00"}],"HeadCommit":{"Sha1":"c04c1f61a7ca64acf31ed914678656d87ed6e35f","Message":"Unblock docker-compose.prod.yml validation by removing replicas:2\n\n`docker compose -f docker-compose.prod.yml config` was failing with:\n\n services.deploy.replicas: can't set container_name and api as\n container name must be unique: invalid compose project\n\nThe api service had both `container_name: juhi-api` (relied on by\nscripts/deploy.sh:294 and scripts/post-deploy-verify.sh:39) and\n`deploy.replicas: 2`. Compose v2 rejects this combination because\nit can't give two replicas the same fixed name.\n\n`deploy.replicas` is also silently ignored in non-Swarm Compose mode,\nso this directive was aspirational rather than effective. The actual\nmulti-replica path in this repo is docker-compose.ha.yml.\n\nRemoved the `replicas: 2` line and added a comment explaining the\ntrade-off; kept resources/update_config/rollback_config for Swarm/K8s\ntranslation.\n\nVerified: `docker compose --env-file \u003cstub\u003e -f docker-compose.prod.yml\nconfig` now exits 0 with no warnings.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","CommitterName":"luoguoguo","Timestamp":"2026-04-26T09:13:05-07:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/6f30ee7954e6142227f44fbcb36106e5ce6018eb...c04c1f61a7ca64acf31ed914678656d87ed6e35f","Len":1}...
|
1777219989
|
Edit
Delete
|
|
1211
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"6f30ee795 {"Commits":[{"Sha1":"6f30ee7954e6142227f44fbcb36106e5ce6018eb","Message":"Add secret-content-scan to Fast Gate pre-commit\n\nLayer-2 defense complementing the env-leak guard added in bd8162cf2:\n\n- Scans staged diff lines for high-precision secret patterns:\n PEM private-key blocks, AWS access keys (AKIA…), GitHub PATs\n (ghp_/gho_/ghs_), JWT tokens (eyJ…eyJ…), and assignment lines\n matching `*PASSWORD|SECRET|TOKEN|API_KEY = \u003c32+ char base64\u003e`.\n- Excludes hook itself, docs/security/**, test fixtures, and the\n generate-secrets script to avoid self-tripping.\n- Per-line bypass via trailing `noqa: secret-scan` comment for\n legitimate fixtures or doc samples.\n\nVerified all positive cases trip and all negative cases pass through\nwhen run with system /usr/bin/grep (the shell sh hooks use). Failing\nthe gate prints up to 10 offending lines to give the developer\ncontext without dumping the whole secret.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","CommitterName":"luoguoguo","Timestamp":"2026-04-26T09:06:13-07:00"}],"HeadCommit":{"Sha1":"6f30ee7954e6142227f44fbcb36106e5ce6018eb","Message":"Add secret-content-scan to Fast Gate pre-commit\n\nLayer-2 defense complementing the env-leak guard added in bd8162cf2:\n\n- Scans staged diff lines for high-precision secret patterns:\n PEM private-key blocks, AWS access keys (AKIA…), GitHub PATs\n (ghp_/gho_/ghs_), JWT tokens (eyJ…eyJ…), and assignment lines\n matching `*PASSWORD|SECRET|TOKEN|API_KEY = \u003c32+ char base64\u003e`.\n- Excludes hook itself, docs/security/**, test fixtures, and the\n generate-secrets script to avoid self-tripping.\n- Per-line bypass via trailing `noqa: secret-scan` comment for\n legitimate fixtures or doc samples.\n\nVerified all positive cases trip and all negative cases pass through\nwhen run with system /usr/bin/grep (the shell sh hooks use). Failing\nthe gate prints up to 10 offending lines to give the developer\ncontext without dumping the whole secret.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","CommitterName":"luoguoguo","Timestamp":"2026-04-26T09:06:13-07:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/bd8162cf2c08d175a1cab0f69d42b648bb825c10...6f30ee7954e6142227f44fbcb36106e5ce6018eb","Len":1}...
|
1777219584
|
Edit
Delete
|
|
1210
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"bd8162cf2 {"Commits":[{"Sha1":"bd8162cf2c08d175a1cab0f69d42b648bb825c10","Message":"Add env-leak pre-commit guard and secrets-leak incident doc\n\n- .husky/pre-commit: insert a serial first-position check that blocks\n any staged file ending in `.env` or `.env.local` from entering the\n index. Templates (`.env.example`, `.env.test`, `frontend/.env.development`,\n etc.) are not matched. Background and the previous incident are\n documented in docs/security/leaked-env-2026-04-26.md.\n\n- docs/security/leaked-env-2026-04-26.md: full incident record covering\n what leaked, what was done in 597fbdc49 and f8c99c0bc, what each team\n member needs to do locally, the rotation checklist for the four leaked\n secrets, and the conditions under which a history rewrite would be\n warranted (currently not).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","CommitterName":"luoguoguo","Timestamp":"2026-04-26T08:56:37-07:00"}],"HeadCommit":{"Sha1":"bd8162cf2c08d175a1cab0f69d42b648bb825c10","Message":"Add env-leak pre-commit guard and secrets-leak incident doc\n\n- .husky/pre-commit: insert a serial first-position check that blocks\n any staged file ending in `.env` or `.env.local` from entering the\n index. Templates (`.env.example`, `.env.test`, `frontend/.env.development`,\n etc.) are not matched. Background and the previous incident are\n documented in docs/security/leaked-env-2026-04-26.md.\n\n- docs/security/leaked-env-2026-04-26.md: full incident record covering\n what leaked, what was done in 597fbdc49 and f8c99c0bc, what each team\n member needs to do locally, the rotation checklist for the four leaked\n secrets, and the conditions under which a history rewrite would be\n warranted (currently not).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","CommitterName":"luoguoguo","Timestamp":"2026-04-26T08:56:37-07:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/f8c99c0bccfc306a4dcc9afd03e1247a4ebd4a97...bd8162cf2c08d175a1cab0f69d42b648bb825c10","Len":1}...
|
1777219006
|
Edit
Delete
|
|
1209
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"f8c99c0bc {"Commits":[{"Sha1":"f8c99c0bccfc306a4dcc9afd03e1247a4ebd4a97","Message":"Stop tracking backend/.env (leaked secrets remediation, step 1)\n\nbackend/.env was committed once at 204e3356f with what appear to be\nreal base64-encoded random secrets (DB password, Redis password, JWT\nsecret, MinIO secret key — pattern matches `openssl rand -base64 32`\noutput). The file header indicates it was auto-generated locally by\nscripts/sync-local-env.sh and committed by mistake.\n\nThis commit only stops tracking the file going forward. The leaked\ncontent is still reachable in git history at commit 204e3356f from\nmain and from ~10+ origin feature branches; treat the secrets as\ncompromised and rotate them in any deployment that may have used them.\n\nRoot .gitignore already has a `.env` rule that takes effect once the\nfile is no longer tracked, so no .gitignore change is needed.\n\nTo regenerate backend/.env locally with the new dev defaults:\n bash scripts/sync-local-env.sh --force\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","CommitterName":"luoguoguo","Timestamp":"2026-04-26T08:52:06-07:00"}],"HeadCommit":{"Sha1":"f8c99c0bccfc306a4dcc9afd03e1247a4ebd4a97","Message":"Stop tracking backend/.env (leaked secrets remediation, step 1)\n\nbackend/.env was committed once at 204e3356f with what appear to be\nreal base64-encoded random secrets (DB password, Redis password, JWT\nsecret, MinIO secret key — pattern matches `openssl rand -base64 32`\noutput). The file header indicates it was auto-generated locally by\nscripts/sync-local-env.sh and committed by mistake.\n\nThis commit only stops tracking the file going forward. The leaked\ncontent is still reachable in git history at commit 204e3356f from\nmain and from ~10+ origin feature branches; treat the secrets as\ncompromised and rotate them in any deployment that may have used them.\n\nRoot .gitignore already has a `.env` rule that takes effect once the\nfile is no longer tracked, so no .gitignore change is needed.\n\nTo regenerate backend/.env locally with the new dev defaults:\n bash scripts/sync-local-env.sh --force\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","CommitterName":"luoguoguo","Timestamp":"2026-04-26T08:52:06-07:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/597fbdc49bc67e7803e9ff0ab9c77dccc99d778e...f8c99c0bccfc306a4dcc9afd03e1247a4ebd4a97","Len":1}...
|
1777218737
|
Edit
Delete
|
|
1208
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"597fbdc49 {"Commits":[{"Sha1":"597fbdc49bc67e7803e9ff0ab9c77dccc99d778e","Message":"Make local one-command startup work end-to-end\n\nFix the gaps that prevented `make dev` / `docker compose up` from working\non a fresh checkout:\n\n- Replace `\u003cCHANGE_ME_*\u003e` placeholders in .env.example with dev defaults\n so Postgres / Redis / MinIO containers no longer initialize with the\n literal placeholder string as their password. Production override\n warning preserved at the top of the file.\n- Add normalize_placeholder() in sync-local-env.sh as a legacy-safety\n net for existing .env files still carrying the old placeholders.\n- Add PGBOUNCER_PORT to .env.example so it shows up alongside other\n configurable ports (the docker-compose default still works).\n- Remove the truncated complete_migration_seed.sql.gz (20 bytes,\n unreachable from any script or doc).\n- Add a \"🚀 快速开始\" section to README.md with prerequisites, the\n three-way startup comparison (make dev / full Docker / base-only),\n default credentials, and troubleshooting entry points — the README\n previously had no quickstart at all.\n- Unify `docker-compose \u003cverb\u003e` → `docker compose \u003cverb\u003e` (33 places\n in DEPLOYMENT.md) and replace `cd backend \u0026\u0026 npx prisma ...` /\n `npm ci` with `pnpm -C backend exec prisma ...` / `pnpm install`\n in DEPLOYMENT.md and DEPLOY_DB.md.\n- Annotate `make db-migrate / mock-seed / seed` as `[legacy]` in the\n Makefile help text and point users to the canonical\n `pnpm -C backend exec prisma migrate deploy` /\n `pnpm -C backend run db:seed` entrypoints.\n\nEnd-to-end verification:\n cp .env.example .env\n docker compose -f docker-compose.yml config --quiet # exits 0\n bash scripts/sync-local-env.sh # backend/.env\n uses identical\n dev passwords\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","CommitterName":"luoguoguo","Timestamp":"2026-04-26T08:41:01-07:00"}],"HeadCommit":{"Sha1":"597fbdc49bc67e7803e9ff0ab9c77dccc99d778e","Message":"Make local one-command startup work end-to-end\n\nFix the gaps that prevented `make dev` / `docker compose up` from working\non a fresh checkout:\n\n- Replace `\u003cCHANGE_ME_*\u003e` placeholders in .env.example with dev defaults\n so Postgres / Redis / MinIO containers no longer initialize with the\n literal placeholder string as their password. Production override\n warning preserved at the top of the file.\n- Add normalize_placeholder() in sync-local-env.sh as a legacy-safety\n net for existing .env files still carrying the old placeholders.\n- Add PGBOUNCER_PORT to .env.example so it shows up alongside other\n configurable ports (the docker-compose default still works).\n- Remove the truncated complete_migration_seed.sql.gz (20 bytes,\n unreachable from any script or doc).\n- Add a \"🚀 快速开始\" section to README.md with prerequisites, the\n three-way startup comparison (make dev / full Docker / base-only),\n default credentials, and troubleshooting entry points — the README\n previously had no quickstart at all.\n- Unify `docker-compose \u003cverb\u003e` → `docker compose \u003cverb\u003e` (33 places\n in DEPLOYMENT.md) and replace `cd backend \u0026\u0026 npx prisma ...` /\n `npm ci` with `pnpm -C backend exec prisma ...` / `pnpm install`\n in DEPLOYMENT.md and DEPLOY_DB.md.\n- Annotate `make db-migrate / mock-seed / seed` as `[legacy]` in the\n Makefile help text and point users to the canonical\n `pnpm -C backend exec prisma migrate deploy` /\n `pnpm -C backend run db:seed` entrypoints.\n\nEnd-to-end verification:\n cp .env.example .env\n docker compose -f docker-compose.yml config --quiet # exits 0\n bash scripts/sync-local-env.sh # backend/.env\n uses identical\n dev passwords\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@luoguoguodeMacBook-Pro.local","CommitterName":"luoguoguo","Timestamp":"2026-04-26T08:41:01-07:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/7b47df3186db279cfc071517a6c034aa213d926d...597fbdc49bc67e7803e9ff0ab9c77dccc99d778e","Len":1}...
|
1777218320
|
Edit
Delete
|
|
1207
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/feat/audit-v2.1-improvements
|
0
|
{"Commits":[{"Sha1":"fa2dbcdf3 {"Commits":[{"Sha1":"fa2dbcdf3ad8d2db0a53e7c03d418f402bdfddbc","Message":"chore: 阶段性更新 - Sentry 集成 + 限流分档 + P0 链路测试 + 审计报告刷新\n\n- backend: 接入 Sentry 错误追踪 + uncaughtException 处理;advanced-rate-limiter\n 分档配置(standard/batch/write/sensitive);ticket-workflow / product-categories /\n alliance-agreement schema 修复 + 单测补齐\n- e2e: 新增 P0 链路测试运行器(ui-chain-runner / chain-context / chain-runner /\n stability-trend)及 trend 分析脚本;helpers 单测覆盖\n- deploy: blue-green compose / k8s configmap / api-deployment 调整;\n 新增 docs/deploy/blue-green-runbook.md\n- reports: 刷新审计快照(prisma-zod-contract 4-17/4-22、模块评分、\n 租户安全、API 覆盖率、approval-governance 等)\n- env.example: 文档化 SENTRY_DSN / RATE_LIMIT_* 分档 / EXIT_ON_UNCAUGHT_EXCEPTION\n\n排除:backend/.env(含真实开发密钥)、deploy/kubernetes/secrets.yaml(k8s 密钥模板)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-24T23:28:12+08:00"}],"HeadCommit":{"Sha1":"fa2dbcdf3ad8d2db0a53e7c03d418f402bdfddbc","Message":"chore: 阶段性更新 - Sentry 集成 + 限流分档 + P0 链路测试 + 审计报告刷新\n\n- backend: 接入 Sentry 错误追踪 + uncaughtException 处理;advanced-rate-limiter\n 分档配置(standard/batch/write/sensitive);ticket-workflow / product-categories /\n alliance-agreement schema 修复 + 单测补齐\n- e2e: 新增 P0 链路测试运行器(ui-chain-runner / chain-context / chain-runner /\n stability-trend)及 trend 分析脚本;helpers 单测覆盖\n- deploy: blue-green compose / k8s configmap / api-deployment 调整;\n 新增 docs/deploy/blue-green-runbook.md\n- reports: 刷新审计快照(prisma-zod-contract 4-17/4-22、模块评分、\n 租户安全、API 覆盖率、approval-governance 等)\n- env.example: 文档化 SENTRY_DSN / RATE_LIMIT_* 分档 / EXIT_ON_UNCAUGHT_EXCEPTION\n\n排除:backend/.env(含真实开发密钥)、deploy/kubernetes/secrets.yaml(k8s 密钥模板)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-24T23:28:12+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/5c31131371cccf1842c6ed8aa4df13df09861249...fa2dbcdf3ad8d2db0a53e7c03d418f402bdfddbc","Len":1}...
|
1777044501
|
Edit
Delete
|
|
1136
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/feat/audit-v2.1-improvements
|
0
|
{"Commits":[{"Sha1":"5c3113137 {"Commits":[{"Sha1":"5c31131371cccf1842c6ed8aa4df13df09861249","Message":"refactor(geo-keywords): 原子化 7 个写链 - RFC-0001 方案 B 端到端样板\n\n将 createKeyword / updateKeyword / deleteKeyword / recordRanking /\ntoggleKeywordStatus / batchDeleteKeywords / checkRanking 全部收口为\n`$transaction + tx.\u003cmodel\u003e.* + publishLifecycleEvent({ tx })`,\n让业务写集与 outbox 事件共享同一事务边界。\n\n- V2.1 TX-BOUND-WRITE: 全局命中 64→54,geo-keyword 模块 10→0\n- batchDelete 的 Promise.all 事件改串行,避免在事务回调内并发写同一 TransactionClient\n- 单测:$transaction mock 兼容 callback/array 两种语义并把 mockPrisma 作为\n TransactionClient 透回,5 个写链新增 `tx: mockPrisma` 透传断言(8/8 pass)\n\n作为 RFC-0001 方案 B 的端到端样板,剩余 54 条 TX-BOUND-WRITE 与 5 条\nARRAY-TXN-WITH-EVENT 按 Sprint 2 W6 依此模板批量处理。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-22T22:02:35+08:00"}],"HeadCommit":{"Sha1":"5c31131371cccf1842c6ed8aa4df13df09861249","Message":"refactor(geo-keywords): 原子化 7 个写链 - RFC-0001 方案 B 端到端样板\n\n将 createKeyword / updateKeyword / deleteKeyword / recordRanking /\ntoggleKeywordStatus / batchDeleteKeywords / checkRanking 全部收口为\n`$transaction + tx.\u003cmodel\u003e.* + publishLifecycleEvent({ tx })`,\n让业务写集与 outbox 事件共享同一事务边界。\n\n- V2.1 TX-BOUND-WRITE: 全局命中 64→54,geo-keyword 模块 10→0\n- batchDelete 的 Promise.all 事件改串行,避免在事务回调内并发写同一 TransactionClient\n- 单测:$transaction mock 兼容 callback/array 两种语义并把 mockPrisma 作为\n TransactionClient 透回,5 个写链新增 `tx: mockPrisma` 透传断言(8/8 pass)\n\n作为 RFC-0001 方案 B 的端到端样板,剩余 54 条 TX-BOUND-WRITE 与 5 条\nARRAY-TXN-WITH-EVENT 按 Sprint 2 W6 依此模板批量处理。\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-22T22:02:35+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/280c26d501e997899fd203579d774521be2fe166...5c31131371cccf1842c6ed8aa4df13df09861249","Len":1}...
|
1776867159
|
Edit
Delete
|
|
1135
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/feat/audit-v2.1-improvements
|
0
|
{"Commits":[{"Sha1":"280c26d50 {"Commits":[{"Sha1":"280c26d501e997899fd203579d774521be2fe166","Message":"feat(audit): V2.1 规则精度改进 - 方法作用域 + 数组事务豁免 + txn 别名\n\n基于 PR #41 的抽样验证(V2 规则 20% 误报 / 10% 归类错),对 V2 判据做三项\n改进,命中数从 297 降至 64(↓78%),且修复 finance-credits 9 处 TX-BOUND-WRITE\n假归类问题。\n\n改进 1 · 方法作用域判定(解决误报)\n detectTxBoundWrite 升级为方法级作用域:仅当 this.model.\u003cwrite\u003e 或\n prisma.\u003cmodel\u003e.\u003cwrite\u003e 所在方法体内也存在 publishEvent/publishLifecycleEvent\n 调用时才命中。消除 \"同文件其他方法发事件但本方法只是 updateMany/projection\n 同步\" 类误报(如 ad-placement:405 updateCampaign / approval:395\n syncProjectionAfterWorkflowDecision 两处抽样已被正确豁免)。\n\n改进 2 · txn 别名识别(解决归类错)\n findArrayTransactionRanges 正则扩展以识别 txn/inTransaction/runInTransaction\n 作为 prisma.$transaction 的内部 helper 别名。\n\n改进 3 · detectTxBoundWrite 豁免数组事务范围(抽样报告未覆盖的缺陷)\n V2 版本 detectTxBoundWrite 只豁免 $transaction callback 与 tx-helper 函数,\n 未豁免数组事务范围,导致 finance-credits L193 this.model.upsert 虽在\n txn([...]) 内却被错报为 TX-BOUND-WRITE。补齐:detectTxBoundWrite 现同时\n 豁免 arrayTxRanges,避免与 ARRAY-TXN-WITH-EVENT 重复归类。\n\n验证(对比 V2 vs V2.1):\n- TX-BOUND-WRITE: 297 → 64 (↓78%)\n- ARRAY-TXN-WITH-EVENT: 5 → 5 (不变,finance-credits 4 + price-books 1)\n- A-class: 1633 → 1633 (不变)\n- B/C/D-class: 全部不变\n- ad-placement:405 (误报) → 已豁免\n- approval:395 (误报) → 已豁免\n- finance-credits L193-267 / L454-503 (9 处归类错) → 已豁免,只剩\n L224/273/477/518 四处正确的 ARRAY-TXN-WITH-EVENT\n- geo-keywords / ad-biddings / price-books 等真阳性 → 仍命中\n\n抽样报告 PR #41 预测 V2.1 会收敛到 ~150 处,实际 64 处,说明方法作用域 +\n数组事务豁免联合比预期更有效。这 64 处即 Sprint 2 的精确攻击清单。\n\ntsc --noEmit 无新增错误。\n\nSprint 2 路径微调:原计划 W5 需要先实施 V2.1 再迁移,现在 V2.1 已预实施\n(本 PR),Sprint 2 W5 直接按 64 处清单启动迁移即可。\n\n关联:Q2 Sprint 2 迁移前置\n前序:#38 V2 审计升级 / #41 精度抽样验证\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T15:18:26+08:00"}],"HeadCommit":{"Sha1":"280c26d501e997899fd203579d774521be2fe166","Message":"feat(audit): V2.1 规则精度改进 - 方法作用域 + 数组事务豁免 + txn 别名\n\n基于 PR #41 的抽样验证(V2 规则 20% 误报 / 10% 归类错),对 V2 判据做三项\n改进,命中数从 297 降至 64(↓78%),且修复 finance-credits 9 处 TX-BOUND-WRITE\n假归类问题。\n\n改进 1 · 方法作用域判定(解决误报)\n detectTxBoundWrite 升级为方法级作用域:仅当 this.model.\u003cwrite\u003e 或\n prisma.\u003cmodel\u003e.\u003cwrite\u003e 所在方法体内也存在 publishEvent/publishLifecycleEvent\n 调用时才命中。消除 \"同文件其他方法发事件但本方法只是 updateMany/projection\n 同步\" 类误报(如 ad-placement:405 updateCampaign / approval:395\n syncProjectionAfterWorkflowDecision 两处抽样已被正确豁免)。\n\n改进 2 · txn 别名识别(解决归类错)\n findArrayTransactionRanges 正则扩展以识别 txn/inTransaction/runInTransaction\n 作为 prisma.$transaction 的内部 helper 别名。\n\n改进 3 · detectTxBoundWrite 豁免数组事务范围(抽样报告未覆盖的缺陷)\n V2 版本 detectTxBoundWrite 只豁免 $transaction callback 与 tx-helper 函数,\n 未豁免数组事务范围,导致 finance-credits L193 this.model.upsert 虽在\n txn([...]) 内却被错报为 TX-BOUND-WRITE。补齐:detectTxBoundWrite 现同时\n 豁免 arrayTxRanges,避免与 ARRAY-TXN-WITH-EVENT 重复归类。\n\n验证(对比 V2 vs V2.1):\n- TX-BOUND-WRITE: 297 → 64 (↓78%)\n- ARRAY-TXN-WITH-EVENT: 5 → 5 (不变,finance-credits 4 + price-books 1)\n- A-class: 1633 → 1633 (不变)\n- B/C/D-class: 全部不变\n- ad-placement:405 (误报) → 已豁免\n- approval:395 (误报) → 已豁免\n- finance-credits L193-267 / L454-503 (9 处归类错) → 已豁免,只剩\n L224/273/477/518 四处正确的 ARRAY-TXN-WITH-EVENT\n- geo-keywords / ad-biddings / price-books 等真阳性 → 仍命中\n\n抽样报告 PR #41 预测 V2.1 会收敛到 ~150 处,实际 64 处,说明方法作用域 +\n数组事务豁免联合比预期更有效。这 64 处即 Sprint 2 的精确攻击清单。\n\ntsc --noEmit 无新增错误。\n\nSprint 2 路径微调:原计划 W5 需要先实施 V2.1 再迁移,现在 V2.1 已预实施\n(本 PR),Sprint 2 W5 直接按 64 处清单启动迁移即可。\n\n关联:Q2 Sprint 2 迁移前置\n前序:#38 V2 审计升级 / #41 精度抽样验证\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T15:18:26+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/8a95110c2f089d5e800363910dee9bd22993258c...280c26d501e997899fd203579d774521be2fe166","Len":1}...
|
1776410323
|
Edit
Delete
|
|
1134
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/feat/audit-v2.1-improvements
|
0
|
|
1776410323
|
Edit
Delete
|
|
1119
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/docs/tx-bound-write-samples
|
0
|
{"Commits":[{"Sha1":"94bdd3e0c {"Commits":[{"Sha1":"94bdd3e0c36e7ba8e9380ddb74627492acc988dc","Message":"docs(governance): TX-BOUND-WRITE 规则精度抽样验证 · 10 处样本判定\n\n对 PR #38 新增的 TX-BOUND-WRITE 判据(297 处命中)做规则精度验证。\n抽样 10 处覆盖 TOP 2 文件(groupbuy-influencers / supply-chain-platform)\n+ 中等命中(ad-biddings / ad-placement / ai-autopilot / assembly /\nfinance-credits)+ 代表性小模块(alliance-campaigns / approvals /\ngeo-keywords),每处读 20-40 行上下文逐个判定。\n\n抽样结果:\n- 🔴 明确真阳性:4/10 = 40%\n * ad-biddings:124(create + 事务外事件)\n * alliance-campaign:46(super.create + 独立 createMany,模式 C)\n * geo-keywords:65(create + 事务外 publishLifecycleEvent)\n * supply-chain-platform:418(updateMany + create 分离,模式 C)\n- 🟠 归类错误(仍是假绿):1/10 = 10%\n * finance-credits:193 应归模式 B(txn([...]) 未被识别为事务)\n- ⚠️ 难判(偏真阳):3/10 = 30%\n * ai-autopilot:649(helper 函数,需追调用方)\n * assembly:404(紧跟 recalculateBomCost 语义未定)\n * groupbuy-influencers:153(createWithBizCodeRetry 包装)\n- ⚠️ 误报倾向:2/10 = 20%\n * ad-placement:405(方法内无事件发布)\n * approval:395(projection 同步非主写入)\n\n保守估计 297 处中:\n- ~50% (约 150 处) 明确真阳性假绿\n- ~30% (约 90 处) 需 helper 追踪确认\n- ~20% (约 60 处) 误报\n\n规则改进建议(V2.1):\n1. 方法作用域判定:仅当 write 所在方法体内也有 publishEvent 才命中\n → 解决 20% 误报\n2. 识别 txn/inTransaction/runInTransaction 别名为事务范围\n → 解决 10% 归类错\n3. helper 深度追踪(Sprint 3 / Q3 再升级)\n → 解决 30% 难判\n4. 可选:projection/refreshView/aggregate 方法白名单\n\n对 Sprint 2 迁移计划的影响:\n- 攻击清单从 297 收敛为 ~150 明确真阳 + ~90 需深挖\n- Sprint 2 W5 前置完成 V2.1 升级(改进 1+2),再用新 audit 重扫\n- Sprint 2 W5-W6 按 V2.1 精确列表迁移\n- Sprint 2 W6 末启用 --strict-v2 硬门禁\n\n本 PR 纯文档,无代码变更。依赖 #38 分支。合并顺序:#38 → 本 PR。\n\n关联:Q2 Sprint 2 迁移前置准备\n前序 PR:#38 V2 审计升级 / #40 BaseServiceV2 PoC\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T14:49:49+08:00"}],"HeadCommit":{"Sha1":"94bdd3e0c36e7ba8e9380ddb74627492acc988dc","Message":"docs(governance): TX-BOUND-WRITE 规则精度抽样验证 · 10 处样本判定\n\n对 PR #38 新增的 TX-BOUND-WRITE 判据(297 处命中)做规则精度验证。\n抽样 10 处覆盖 TOP 2 文件(groupbuy-influencers / supply-chain-platform)\n+ 中等命中(ad-biddings / ad-placement / ai-autopilot / assembly /\nfinance-credits)+ 代表性小模块(alliance-campaigns / approvals /\ngeo-keywords),每处读 20-40 行上下文逐个判定。\n\n抽样结果:\n- 🔴 明确真阳性:4/10 = 40%\n * ad-biddings:124(create + 事务外事件)\n * alliance-campaign:46(super.create + 独立 createMany,模式 C)\n * geo-keywords:65(create + 事务外 publishLifecycleEvent)\n * supply-chain-platform:418(updateMany + create 分离,模式 C)\n- 🟠 归类错误(仍是假绿):1/10 = 10%\n * finance-credits:193 应归模式 B(txn([...]) 未被识别为事务)\n- ⚠️ 难判(偏真阳):3/10 = 30%\n * ai-autopilot:649(helper 函数,需追调用方)\n * assembly:404(紧跟 recalculateBomCost 语义未定)\n * groupbuy-influencers:153(createWithBizCodeRetry 包装)\n- ⚠️ 误报倾向:2/10 = 20%\n * ad-placement:405(方法内无事件发布)\n * approval:395(projection 同步非主写入)\n\n保守估计 297 处中:\n- ~50% (约 150 处) 明确真阳性假绿\n- ~30% (约 90 处) 需 helper 追踪确认\n- ~20% (约 60 处) 误报\n\n规则改进建议(V2.1):\n1. 方法作用域判定:仅当 write 所在方法体内也有 publishEvent 才命中\n → 解决 20% 误报\n2. 识别 txn/inTransaction/runInTransaction 别名为事务范围\n → 解决 10% 归类错\n3. helper 深度追踪(Sprint 3 / Q3 再升级)\n → 解决 30% 难判\n4. 可选:projection/refreshView/aggregate 方法白名单\n\n对 Sprint 2 迁移计划的影响:\n- 攻击清单从 297 收敛为 ~150 明确真阳 + ~90 需深挖\n- Sprint 2 W5 前置完成 V2.1 升级(改进 1+2),再用新 audit 重扫\n- Sprint 2 W5-W6 按 V2.1 精确列表迁移\n- Sprint 2 W6 末启用 --strict-v2 硬门禁\n\n本 PR 纯文档,无代码变更。依赖 #38 分支。合并顺序:#38 → 本 PR。\n\n关联:Q2 Sprint 2 迁移前置准备\n前序 PR:#38 V2 审计升级 / #40 BaseServiceV2 PoC\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T14:49:49+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/8a95110c2f089d5e800363910dee9bd22993258c...94bdd3e0c36e7ba8e9380ddb74627492acc988dc","Len":1}...
|
1776408604
|
Edit
Delete
|
|
1118
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/docs/tx-bound-write-samples
|
0
|
|
1776408604
|
Edit
Delete
|
|
1117
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/feat/base-service-v2-poc
|
0
|
{"Commits":[{"Sha1":"c438f31da {"Commits":[{"Sha1":"c438f31dae2fd15bc8ae3fd5419a19394c7191cc","Message":"feat(shared): BaseServiceV2 PoC(RFC-0001 方案 B 类型签名验证)\n\nSprint 2 样本 PoC:验证 RFC-0001 方案 B 的 TypeScript 泛型约束\n(TModelKey extends keyof Prisma.TransactionClient) 在 Prisma 5.22 下可\n编译,且能让子类在编译期被强制声明真实的 Prisma model key。\n\n核心设计(对应 RFC-0001 方案 B):\n\n1. backend/src/shared/services/base-service-v2.ts(226 行)\n - abstract class BaseServiceV2\u003cTEntity, TCreate, TUpdate, TModelKey\u003e\n - TModelKey 泛型约束:extends keyof Prisma.TransactionClient\n - 子类通过 protected abstract readonly modelKey: TModelKey 声明\n - create/update/delete 内部 prisma.$transaction(async tx =\u003e ...):\n * 数据写入走 tx[this.modelKey](绑定到 tx 客户端)\n * 事件发布走 publishEventInTransaction(tx, ...)(同事务)\n * 共享同一 $transaction → 彻底消除模式 A \"data write 绕 tx\" 假绿\n - 30s 事务超时默认值\n\n2. backend/src/shared/services/__examples__/base-service-v2-samples.ts(144 行)\n - 3 个样本子类演示 modelKey 泛型锁定:\n * ReconciliationServiceV2Sample(modelKey='auto_match_rules')\n * RenewalsServiceV2Sample(modelKey='renewals')\n * CourseServiceV2Sample(modelKey='hr_courses')\n - 含反例注释:bogus_table 会触发 TypeScript 编译错误\n \"Type '\\\"not_a_real_table\\\"' does not satisfy the constraint\n 'keyof TransactionClient'\",证明编译期约束有效\n\n验证:\n- tsc --noEmit 对新增文件零错误(全工作区其他错误均来自预存在的\n journey-orchestration 模块 Prisma schema 不同步问题,与本 PR 无关)\n- 本 PoC 不在生产路径上使用,不导入任何生产 controller/routes/main.ts\n- 纯技术可行性验证,供技术委员会评审 RFC-0001 方案 B\n\nSprint 2 正式迁移路线(RFC-0001 W5-W6):\n1. 合并本 PoC 后,Backend Architect 基于 BaseServiceV2 产出 PR\n2. 按优先级顺序迁移:22 真 D → 6 A-override → 8 良性 override → 4 微竞态\n3. 用 V2 审计判据(PR #38)作为 gate,迁移完成后启用 --strict-v2\n\n关联:Q2 Sprint 2 预研 · RFC-0001 方案 B 技术可行性验证\n前序:#36 D-class 盘点 / #37 RFC-0001 / #38 V2 审计升级 / #39 Sprint 1 复盘\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T14:15:21+08:00"}],"HeadCommit":{"Sha1":"c438f31dae2fd15bc8ae3fd5419a19394c7191cc","Message":"feat(shared): BaseServiceV2 PoC(RFC-0001 方案 B 类型签名验证)\n\nSprint 2 样本 PoC:验证 RFC-0001 方案 B 的 TypeScript 泛型约束\n(TModelKey extends keyof Prisma.TransactionClient) 在 Prisma 5.22 下可\n编译,且能让子类在编译期被强制声明真实的 Prisma model key。\n\n核心设计(对应 RFC-0001 方案 B):\n\n1. backend/src/shared/services/base-service-v2.ts(226 行)\n - abstract class BaseServiceV2\u003cTEntity, TCreate, TUpdate, TModelKey\u003e\n - TModelKey 泛型约束:extends keyof Prisma.TransactionClient\n - 子类通过 protected abstract readonly modelKey: TModelKey 声明\n - create/update/delete 内部 prisma.$transaction(async tx =\u003e ...):\n * 数据写入走 tx[this.modelKey](绑定到 tx 客户端)\n * 事件发布走 publishEventInTransaction(tx, ...)(同事务)\n * 共享同一 $transaction → 彻底消除模式 A \"data write 绕 tx\" 假绿\n - 30s 事务超时默认值\n\n2. backend/src/shared/services/__examples__/base-service-v2-samples.ts(144 行)\n - 3 个样本子类演示 modelKey 泛型锁定:\n * ReconciliationServiceV2Sample(modelKey='auto_match_rules')\n * RenewalsServiceV2Sample(modelKey='renewals')\n * CourseServiceV2Sample(modelKey='hr_courses')\n - 含反例注释:bogus_table 会触发 TypeScript 编译错误\n \"Type '\\\"not_a_real_table\\\"' does not satisfy the constraint\n 'keyof TransactionClient'\",证明编译期约束有效\n\n验证:\n- tsc --noEmit 对新增文件零错误(全工作区其他错误均来自预存在的\n journey-orchestration 模块 Prisma schema 不同步问题,与本 PR 无关)\n- 本 PoC 不在生产路径上使用,不导入任何生产 controller/routes/main.ts\n- 纯技术可行性验证,供技术委员会评审 RFC-0001 方案 B\n\nSprint 2 正式迁移路线(RFC-0001 W5-W6):\n1. 合并本 PoC 后,Backend Architect 基于 BaseServiceV2 产出 PR\n2. 按优先级顺序迁移:22 真 D → 6 A-override → 8 良性 override → 4 微竞态\n3. 用 V2 审计判据(PR #38)作为 gate,迁移完成后启用 --strict-v2\n\n关联:Q2 Sprint 2 预研 · RFC-0001 方案 B 技术可行性验证\n前序:#36 D-class 盘点 / #37 RFC-0001 / #38 V2 审计升级 / #39 Sprint 1 复盘\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T14:15:21+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/7b47df3186db279cfc071517a6c034aa213d926d...c438f31dae2fd15bc8ae3fd5419a19394c7191cc","Len":1}...
|
1776406533
|
Edit
Delete
|
|
1116
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/feat/base-service-v2-poc
|
0
|
|
1776406532
|
Edit
Delete
|
|
1115
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/docs/sprint-1-retro
|
0
|
{"Commits":[{"Sha1":"56a7df27f {"Commits":[{"Sha1":"56a7df27f1e7a0b2b9f9136862a817427c4704be","Message":"docs(retro): Q2 Sprint 1 复盘 - 三类假绿发现与 Sprint 2 修订建议\n\n整合 Sprint 1 执行的 6 个 PR(#33-#38)产出,归档本 Sprint 的发现、\n对 Q2 12 周计划的影响、以及 Sprint 2 的修订建议。\n\nTL;DR:Sprint 1 原计划主题 \"BLOCKER 清零 + 底座加固\",实际完成 1 个\nBLOCKER + 挖出 3 类系统性假绿 + 完成 RFC + 自动化审计升级。最重大发现:\nHarness v5.3 宣称的 \"原子化率 100%\" 是建立在有漏洞的审计判据之上的\n虚假基线,V2 审计扫出 297 处 TX-BOUND-WRITE + 5 处 ARRAY-TXN-WITH-EVENT\n系统性假绿。\n\n文档内容:\n- 6 个 PR 的交付清单与净增(代码 +274 / 文档 +1145)\n- 三类假绿模式(A 架构级 / B 数组事务 / C 业务前置 side-effect)\n 及各自影响面统计\n- 其他发现:4 个预检查微竞态 / 8 个良性 override / 6 个 A-override\n- 原计划 vs 实际进度对比(实际只完成 Data Squad,其他 Squad 未启动)\n- 超出原计划范围的 7 项高价值交付\n- 对 Q2 12 周计划的修订建议:\n * 阶段 A 验收门新增 v2TxBoundWrite + v2ArrayTxnWithEvent = 0\n * Sprint 2 工作量重估(+30% 架构重构开销)\n * 推荐选项 B 并行分攻(Backend Architect 主攻架构 /\n SRE/Data 并行推进原计划 SRE 项)\n- 执行层面洞察:做对了什么 + 应该做得更好\n- Sprint 2 启动清单\n\n纯文档 PR,无代码变更。作为技术委员会评审 Sprint 2 走向的依据。\n\n关联:Q2 12 周落地计划 Sprint 1 收尾\n前序 PR: #33 (计划) / #34 (BLOCKER) / #35 (bom 测试) /\n #36 (D-class 盘点) / #37 (RFC) / #38 (审计升级)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T13:59:46+08:00"}],"HeadCommit":{"Sha1":"56a7df27f1e7a0b2b9f9136862a817427c4704be","Message":"docs(retro): Q2 Sprint 1 复盘 - 三类假绿发现与 Sprint 2 修订建议\n\n整合 Sprint 1 执行的 6 个 PR(#33-#38)产出,归档本 Sprint 的发现、\n对 Q2 12 周计划的影响、以及 Sprint 2 的修订建议。\n\nTL;DR:Sprint 1 原计划主题 \"BLOCKER 清零 + 底座加固\",实际完成 1 个\nBLOCKER + 挖出 3 类系统性假绿 + 完成 RFC + 自动化审计升级。最重大发现:\nHarness v5.3 宣称的 \"原子化率 100%\" 是建立在有漏洞的审计判据之上的\n虚假基线,V2 审计扫出 297 处 TX-BOUND-WRITE + 5 处 ARRAY-TXN-WITH-EVENT\n系统性假绿。\n\n文档内容:\n- 6 个 PR 的交付清单与净增(代码 +274 / 文档 +1145)\n- 三类假绿模式(A 架构级 / B 数组事务 / C 业务前置 side-effect)\n 及各自影响面统计\n- 其他发现:4 个预检查微竞态 / 8 个良性 override / 6 个 A-override\n- 原计划 vs 实际进度对比(实际只完成 Data Squad,其他 Squad 未启动)\n- 超出原计划范围的 7 项高价值交付\n- 对 Q2 12 周计划的修订建议:\n * 阶段 A 验收门新增 v2TxBoundWrite + v2ArrayTxnWithEvent = 0\n * Sprint 2 工作量重估(+30% 架构重构开销)\n * 推荐选项 B 并行分攻(Backend Architect 主攻架构 /\n SRE/Data 并行推进原计划 SRE 项)\n- 执行层面洞察:做对了什么 + 应该做得更好\n- Sprint 2 启动清单\n\n纯文档 PR,无代码变更。作为技术委员会评审 Sprint 2 走向的依据。\n\n关联:Q2 12 周落地计划 Sprint 1 收尾\n前序 PR: #33 (计划) / #34 (BLOCKER) / #35 (bom 测试) /\n #36 (D-class 盘点) / #37 (RFC) / #38 (审计升级)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T13:59:46+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/7b47df3186db279cfc071517a6c034aa213d926d...56a7df27f1e7a0b2b9f9136862a817427c4704be","Len":1}...
|
1776405595
|
Edit
Delete
|
|
1114
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/docs/sprint-1-retro
|
0
|
|
1776405595
|
Edit
Delete
|
|
1113
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/feat/audit-outbox-tx-bound
|
0
|
{"Commits":[{"Sha1":"8a95110c2 {"Commits":[{"Sha1":"8a95110c2f089d5e800363910dee9bd22993258c","Message":"feat(audit): outbox-atomicity 新增 V2 判据 TX-BOUND-WRITE / ARRAY-TXN-WITH-EVENT\n\n对应 RFC-0001(BaseService 真正原子化)的审计脚本升级。在保留原有\nA/B/C/D 四分类判据不变的前提下,新增两类 WARNING 级判据暴露 Sprint 1 手工\n盘点中发现的两类系统性假绿:\n\n1. TX-BOUND-WRITE(模式 A · BaseService 架构级)\n - 扫描任一含 publishEvent/publishLifecycleEvent 调用的 service 文件\n - 对所有 this.model.\u003cwrite\u003e / prisma.\u003cmodel\u003e.\u003cwrite\u003e 出现位置,若其不在\n 任何 $transaction 回调 / tx-helper 函数范围内,记为 TX-BOUND-WRITE\n - 语义:data write 在默认 prisma client 上执行(未绑定 tx),publishEvent\n 失败或 tx 回滚时数据与事件会分裂\n\n2. ARRAY-TXN-WITH-EVENT(模式 B · 数组事务 + 事务外事件)\n - 扫描 prisma.$transaction([...]) / txn([...]) 数组形式事务\n - 若其所在方法体内(数组事务结束行之后)还有事务外的 publishEvent /\n publishLifecycleEvent 调用,则判 ARRAY-TXN-WITH-EVENT\n - 语义:数组事务无法传递 tx 客户端,后续事件必然独立事务\n\n输出设计:\n- V2 判据默认输出为 WARNING 级(不阻塞 CI),summary 新增\n v2TxBoundWrite / v2ArrayTxnWithEvent 两个计数\n- JSON 报告新增 v2Findings 数组记录 {ruleId, severity, file, line, code, hint}\n- 控制台输出前 15 条 finding,其余存档 JSON\n- 新增 --strict-v2 flag(B+C 为 0 时才触发),Sprint 2 完成迁移后可启用为\n 硬门禁\n\n首次运行结果(main HEAD):\n- A=1633 / B=0 / C=0 / D=43 / 原子化率 100%(未退化)\n- TX-BOUND-WRITE: 297 命中(顶部文件 groupbuy-influencers=20 /\n supply-chain-platform=19 / geo-keywords=10 / price-books=10 /\n finance-credits=9)\n- ARRAY-TXN-WITH-EVENT: 5 命中(finance-credits 4 处 + 新发现\n price-books 1 处)\n\nARRAY-TXN-WITH-EVENT 5 处 100% 对应 Sprint 1 手工盘点(finance-credits 4 处\n+ 1 处 price-books 新发现),印证规则精度高。TX-BOUND-WRITE 297 处为 Sprint 2\n架构级迁移的全量攻击清单。\n\ntsc --noEmit 无新增错误。\n\n关联:Q2 Sprint 1 · Backend Architect RFC-0001 预研\n前序:#36 D-class 首轮盘点 / #37 D-class 深挖 + RFC-0001\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T13:14:22+08:00"}],"HeadCommit":{"Sha1":"8a95110c2f089d5e800363910dee9bd22993258c","Message":"feat(audit): outbox-atomicity 新增 V2 判据 TX-BOUND-WRITE / ARRAY-TXN-WITH-EVENT\n\n对应 RFC-0001(BaseService 真正原子化)的审计脚本升级。在保留原有\nA/B/C/D 四分类判据不变的前提下,新增两类 WARNING 级判据暴露 Sprint 1 手工\n盘点中发现的两类系统性假绿:\n\n1. TX-BOUND-WRITE(模式 A · BaseService 架构级)\n - 扫描任一含 publishEvent/publishLifecycleEvent 调用的 service 文件\n - 对所有 this.model.\u003cwrite\u003e / prisma.\u003cmodel\u003e.\u003cwrite\u003e 出现位置,若其不在\n 任何 $transaction 回调 / tx-helper 函数范围内,记为 TX-BOUND-WRITE\n - 语义:data write 在默认 prisma client 上执行(未绑定 tx),publishEvent\n 失败或 tx 回滚时数据与事件会分裂\n\n2. ARRAY-TXN-WITH-EVENT(模式 B · 数组事务 + 事务外事件)\n - 扫描 prisma.$transaction([...]) / txn([...]) 数组形式事务\n - 若其所在方法体内(数组事务结束行之后)还有事务外的 publishEvent /\n publishLifecycleEvent 调用,则判 ARRAY-TXN-WITH-EVENT\n - 语义:数组事务无法传递 tx 客户端,后续事件必然独立事务\n\n输出设计:\n- V2 判据默认输出为 WARNING 级(不阻塞 CI),summary 新增\n v2TxBoundWrite / v2ArrayTxnWithEvent 两个计数\n- JSON 报告新增 v2Findings 数组记录 {ruleId, severity, file, line, code, hint}\n- 控制台输出前 15 条 finding,其余存档 JSON\n- 新增 --strict-v2 flag(B+C 为 0 时才触发),Sprint 2 完成迁移后可启用为\n 硬门禁\n\n首次运行结果(main HEAD):\n- A=1633 / B=0 / C=0 / D=43 / 原子化率 100%(未退化)\n- TX-BOUND-WRITE: 297 命中(顶部文件 groupbuy-influencers=20 /\n supply-chain-platform=19 / geo-keywords=10 / price-books=10 /\n finance-credits=9)\n- ARRAY-TXN-WITH-EVENT: 5 命中(finance-credits 4 处 + 新发现\n price-books 1 处)\n\nARRAY-TXN-WITH-EVENT 5 处 100% 对应 Sprint 1 手工盘点(finance-credits 4 处\n+ 1 处 price-books 新发现),印证规则精度高。TX-BOUND-WRITE 297 处为 Sprint 2\n架构级迁移的全量攻击清单。\n\ntsc --noEmit 无新增错误。\n\n关联:Q2 Sprint 1 · Backend Architect RFC-0001 预研\n前序:#36 D-class 首轮盘点 / #37 D-class 深挖 + RFC-0001\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T13:14:22+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/7b47df3186db279cfc071517a6c034aa213d926d...8a95110c2f089d5e800363910dee9bd22993258c","Len":1}...
|
1776402871
|
Edit
Delete
|
|
1112
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/feat/audit-outbox-tx-bound
|
0
|
|
1776402871
|
Edit
Delete
|
|
1111
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/docs/base-service-atomicity-rfc
|
0
|
{"Commits":[{"Sha1":"7e9fa6922 {"Commits":[{"Sha1":"7e9fa692276960419fa95d57ebe7395c49960b4c","Message":"docs(rfcs): RFC-0001 BaseService 真正原子化 + D-class 深挖续集\n\n本 PR 是 #36(D-class 首轮盘点)的续集,包含:\n\n1. docs/governance/outbox-d-class-deep-dive-2026-04-17.md\n - 逐个人工判读 11 个\"待查 override\" D-class 文件:\n * 8 个良性(仅 input 预处理 + super.xxx)\n * 4 个预检查微竞态(findFirst 在事务外):expense-category, hr-competency,\n commission-rule, channels\n - 深查 finance-credits 的 4 处 this.model:\n * 🔴 确认为真实假绿(模式 B:数组事务 + 事务外 publishLifecycleEvent)\n * 4 处 publishLifecycleEvent 全在 txn([...]) 外,事件与数据写集彻底分裂\n - 归纳三类系统性假绿:\n * 模式 A:BaseService 架构级(crud.createOne 的 model.create 绕过 tx)\n * 模式 B:数组事务 + 事务外事件\n * 模式 C:业务前置 side-effect 非同事务\n - D-class 43 最终分类:22 真 D / 6 A-override / 8 良性 override / 4 微竞态\n / 2 真假绿(contract-templates + finance-credits)\n\n2. docs/rfcs/0001-base-service-atomicity.md\n - 针对三类假绿模式提出 3 个重构候选方案对比:\n * 方案 A:crud.* 新增 modelOnTx 参数(最小侵入,但类型不安全)\n * 方案 B:BaseService 泛型约束 modelKey,编译期类型锁定(推荐)\n * 方案 C:引入 UnitOfWork 抽象(大侵入,延后到 Q3)\n - 推荐采用方案 B,Sprint 2 Week 5-6 分阶段实施:\n * W5 基础设施:BaseService 泛型 + 22 真 D 文件迁移 + contract-templates /\n finance-credits 手动修复\n * W6 迁移 override:6 A-override + 8 良性 override + 4 微竞态\n * W6 审计升级:audit-outbox-atomicity.ts 新增 TX-BOUND-WRITE /\n ARRAY-TXN-WITH-EVENT / PRE-SIDE-EFFECT 三个判据\n - 含详细迁移风险矩阵与验收标准\n\n纯文档 PR,无代码变更。audit:outbox-atomicity 保持 A=1633/D=43/原子化率 100%\n(未退化)。\n\n关联:Q2 12 周落地计划 Sprint 1 · Data/Governance Squad + Backend Architect\n前序 PR #36(D-class 首轮盘点)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T11:32:29+08:00"}],"HeadCommit":{"Sha1":"7e9fa692276960419fa95d57ebe7395c49960b4c","Message":"docs(rfcs): RFC-0001 BaseService 真正原子化 + D-class 深挖续集\n\n本 PR 是 #36(D-class 首轮盘点)的续集,包含:\n\n1. docs/governance/outbox-d-class-deep-dive-2026-04-17.md\n - 逐个人工判读 11 个\"待查 override\" D-class 文件:\n * 8 个良性(仅 input 预处理 + super.xxx)\n * 4 个预检查微竞态(findFirst 在事务外):expense-category, hr-competency,\n commission-rule, channels\n - 深查 finance-credits 的 4 处 this.model:\n * 🔴 确认为真实假绿(模式 B:数组事务 + 事务外 publishLifecycleEvent)\n * 4 处 publishLifecycleEvent 全在 txn([...]) 外,事件与数据写集彻底分裂\n - 归纳三类系统性假绿:\n * 模式 A:BaseService 架构级(crud.createOne 的 model.create 绕过 tx)\n * 模式 B:数组事务 + 事务外事件\n * 模式 C:业务前置 side-effect 非同事务\n - D-class 43 最终分类:22 真 D / 6 A-override / 8 良性 override / 4 微竞态\n / 2 真假绿(contract-templates + finance-credits)\n\n2. docs/rfcs/0001-base-service-atomicity.md\n - 针对三类假绿模式提出 3 个重构候选方案对比:\n * 方案 A:crud.* 新增 modelOnTx 参数(最小侵入,但类型不安全)\n * 方案 B:BaseService 泛型约束 modelKey,编译期类型锁定(推荐)\n * 方案 C:引入 UnitOfWork 抽象(大侵入,延后到 Q3)\n - 推荐采用方案 B,Sprint 2 Week 5-6 分阶段实施:\n * W5 基础设施:BaseService 泛型 + 22 真 D 文件迁移 + contract-templates /\n finance-credits 手动修复\n * W6 迁移 override:6 A-override + 8 良性 override + 4 微竞态\n * W6 审计升级:audit-outbox-atomicity.ts 新增 TX-BOUND-WRITE /\n ARRAY-TXN-WITH-EVENT / PRE-SIDE-EFFECT 三个判据\n - 含详细迁移风险矩阵与验收标准\n\n纯文档 PR,无代码变更。audit:outbox-atomicity 保持 A=1633/D=43/原子化率 100%\n(未退化)。\n\n关联:Q2 12 周落地计划 Sprint 1 · Data/Governance Squad + Backend Architect\n前序 PR #36(D-class 首轮盘点)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T11:32:29+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/7b47df3186db279cfc071517a6c034aa213d926d...7e9fa692276960419fa95d57ebe7395c49960b4c","Len":1}...
|
1776396760
|
Edit
Delete
|
|
1110
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/docs/base-service-atomicity-rfc
|
0
|
|
1776396760
|
Edit
Delete
|
|
1109
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/chore/outbox-d-class-audit
|
0
|
{"Commits":[{"Sha1":"b213d6b0c {"Commits":[{"Sha1":"b213d6b0c2dbf7d8a481f02c4a65e5fca8069a3d","Message":"docs(governance): Outbox D-class 43 处深度盘点 + 假绿告警\n\n对 audit:outbox-atomicity 计入\"已原子化\"的 43 个 D-class 文件(isBaseService=true\n且自身无 publishEvent 直接调用)做细粒度代码分析,按 override/this.model/tx.model/\ntransaction 四维分类,输出 docs/governance/outbox-d-class-audit-2026-04-17.md。\n\n关键发现:\n\n1. 🔴 contract-templates/contract-template.service.ts 存在 business-logic 竞态\n create/update/setDefault 在 super.create 之前用 this.model.updateMany 取消其他\n default,两者不在同一事务内;如 super.create 失败,留下\"默认被取消但新模板未\n 创建\"的数据不一致。\n\n2. 🟠 BaseService 架构级假绿(系统性问题)\n backend/src/shared/services/base.service.ts#L206 的 $transaction 回调把 tx 只\n 传给 publishEvent,而 crud.createOne 内部 model.create 用的是默认 prisma\n client,未绑定到 tx。结果:data 在独立连接上自动 commit,outbox 事件在外层 tx\n commit 时写入;publishEvent 失败时 data 已落库 outbox 丢事件。\n 此问题跨所有 BaseService 派生模块(43 D + 6 A-override),但 audit 脚本只看\n \"publishEvent 是否传 tx\"无法识别。\n\n3. ✅ 已正确原子化的 override 6 个(shipments/quotes/contracts/orders/\n price-books/invoice),override 了 CRUD 且全部用 tx.\u003cmodel\u003e.\u003cop\u003e。\n\n4. 🟡 11 个 override 文件需 Sprint 2 人工细查(override 存在但无直接写库命中,\n 多数可能只做业务前处理 + 调 super.xxx())。\n\n5. 🟡 finance-credits 4 处 this.model 无 override,应为查询类方法(非 CRUD),\n 需 Sprint 2 人工判读。\n\n本 PR 纯诊断输出,无代码变更,audit:outbox-atomicity 保持 A=1633/D=43/原子化率\n100%(未退化)。建议的修复动作按优先级归入 Q2 Sprint 2 路线:\n- P0: 修 contract-templates 竞态 + BaseService 架构级重构\n- P0: audit-outbox-atomicity.ts 新增 \"tx-bound data write\" 维度\n- P1: 细查 11 个 override / finance-credits\n\n关联:Q2 12 周落地计划 Sprint 1 · Data/Governance Squad · KR2.1\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T10:16:06+08:00"}],"HeadCommit":{"Sha1":"b213d6b0c2dbf7d8a481f02c4a65e5fca8069a3d","Message":"docs(governance): Outbox D-class 43 处深度盘点 + 假绿告警\n\n对 audit:outbox-atomicity 计入\"已原子化\"的 43 个 D-class 文件(isBaseService=true\n且自身无 publishEvent 直接调用)做细粒度代码分析,按 override/this.model/tx.model/\ntransaction 四维分类,输出 docs/governance/outbox-d-class-audit-2026-04-17.md。\n\n关键发现:\n\n1. 🔴 contract-templates/contract-template.service.ts 存在 business-logic 竞态\n create/update/setDefault 在 super.create 之前用 this.model.updateMany 取消其他\n default,两者不在同一事务内;如 super.create 失败,留下\"默认被取消但新模板未\n 创建\"的数据不一致。\n\n2. 🟠 BaseService 架构级假绿(系统性问题)\n backend/src/shared/services/base.service.ts#L206 的 $transaction 回调把 tx 只\n 传给 publishEvent,而 crud.createOne 内部 model.create 用的是默认 prisma\n client,未绑定到 tx。结果:data 在独立连接上自动 commit,outbox 事件在外层 tx\n commit 时写入;publishEvent 失败时 data 已落库 outbox 丢事件。\n 此问题跨所有 BaseService 派生模块(43 D + 6 A-override),但 audit 脚本只看\n \"publishEvent 是否传 tx\"无法识别。\n\n3. ✅ 已正确原子化的 override 6 个(shipments/quotes/contracts/orders/\n price-books/invoice),override 了 CRUD 且全部用 tx.\u003cmodel\u003e.\u003cop\u003e。\n\n4. 🟡 11 个 override 文件需 Sprint 2 人工细查(override 存在但无直接写库命中,\n 多数可能只做业务前处理 + 调 super.xxx())。\n\n5. 🟡 finance-credits 4 处 this.model 无 override,应为查询类方法(非 CRUD),\n 需 Sprint 2 人工判读。\n\n本 PR 纯诊断输出,无代码变更,audit:outbox-atomicity 保持 A=1633/D=43/原子化率\n100%(未退化)。建议的修复动作按优先级归入 Q2 Sprint 2 路线:\n- P0: 修 contract-templates 竞态 + BaseService 架构级重构\n- P0: audit-outbox-atomicity.ts 新增 \"tx-bound data write\" 维度\n- P1: 细查 11 个 override / finance-credits\n\n关联:Q2 12 周落地计划 Sprint 1 · Data/Governance Squad · KR2.1\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T10:16:06+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/7b47df3186db279cfc071517a6c034aa213d926d...b213d6b0c2dbf7d8a481f02c4a65e5fca8069a3d","Len":1}...
|
1776392173
|
Edit
Delete
|
|
1108
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/chore/outbox-d-class-audit
|
0
|
|
1776392173
|
Edit
Delete
|
|
1107
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/feat/api-tests-bom-crud
|
0
|
{"Commits":[{"Sha1":"7031b8c0b {"Commits":[{"Sha1":"7031b8c0b8d37548dac36f74e76bc0e887ba8005","Message":"test(bom): 扩充 API 测试至完整 CRUD + 状态机 + 租户隔离\n\napi-test-coverage 审计之前将 bom 标为 probe-only (缺 detail/create/update/delete),\n仅覆盖 list / stats / auth401 三个浅层断言。本次扩充将 bom 升级至 complete-crud:\n\n覆盖维度:\n- create / detail / update / delete 全链路(含 draft 状态守卫)\n- 状态机:activate → update 被拒 / delete 被拒 / deactivate 回滚\n- 跨租户隔离:foreign tenant 对 detail / update / delete 均返回 404\n- auth401:未携带 token 请求返回 401\n- list / stats:保留原结构化响应校验\n\naudit:api-test-coverage 复跑验证 bom.status = \"complete-crud\",\ncoverage.list/detail/create/update/delete/stats/auth401 全部 true,\n覆盖 activate action。全量 complete-crud 模块数由 62 升至 63。\n\n⚠️ 本地 Docker daemon 未运行,依赖 postgres-test / redis-test 的 supertest\n执行未在本地跑通。依靠 GitHub Actions CI 的 e2e-tests.yml / migration-safety.yml\n在真实容器中执行验证。\n\nTypeScript 类型检查通过(tsc --noEmit 无 bom.test.ts 相关错误)。\n\n关联:Q2 12 周落地计划 Sprint 1 · Backend Quality Squad · KR2.2\n(API 测试覆盖 probe-only 93 → ≤ 20 / 完整 CRUD 62 → ≥ 140)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T10:03:09+08:00"}],"HeadCommit":{"Sha1":"7031b8c0b8d37548dac36f74e76bc0e887ba8005","Message":"test(bom): 扩充 API 测试至完整 CRUD + 状态机 + 租户隔离\n\napi-test-coverage 审计之前将 bom 标为 probe-only (缺 detail/create/update/delete),\n仅覆盖 list / stats / auth401 三个浅层断言。本次扩充将 bom 升级至 complete-crud:\n\n覆盖维度:\n- create / detail / update / delete 全链路(含 draft 状态守卫)\n- 状态机:activate → update 被拒 / delete 被拒 / deactivate 回滚\n- 跨租户隔离:foreign tenant 对 detail / update / delete 均返回 404\n- auth401:未携带 token 请求返回 401\n- list / stats:保留原结构化响应校验\n\naudit:api-test-coverage 复跑验证 bom.status = \"complete-crud\",\ncoverage.list/detail/create/update/delete/stats/auth401 全部 true,\n覆盖 activate action。全量 complete-crud 模块数由 62 升至 63。\n\n⚠️ 本地 Docker daemon 未运行,依赖 postgres-test / redis-test 的 supertest\n执行未在本地跑通。依靠 GitHub Actions CI 的 e2e-tests.yml / migration-safety.yml\n在真实容器中执行验证。\n\nTypeScript 类型检查通过(tsc --noEmit 无 bom.test.ts 相关错误)。\n\n关联:Q2 12 周落地计划 Sprint 1 · Backend Quality Squad · KR2.2\n(API 测试覆盖 probe-only 93 → ≤ 20 / 完整 CRUD 62 → ≥ 140)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T10:03:09+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/7b47df3186db279cfc071517a6c034aa213d926d...7031b8c0b8d37548dac36f74e76bc0e887ba8005","Len":1}...
|
1776391397
|
Edit
Delete
|
|
1106
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/feat/api-tests-bom-crud
|
0
|
|
1776391397
|
Edit
Delete
|
|
1105
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/fix/ticket-workflow-defs-format
|
0
|
{"Commits":[{"Sha1":"27f01c5f3 {"Commits":[{"Sha1":"27f01c5f3786ed44f603c6ca9a35156d956b1315","Message":"fix(ticket-workflows): workflow_defs 写链显式携带 format 字段\n\napproval-governance 审计通过 WORKFLOW_DEF_WRITE 正则扫描 workflow_defs.(create|update|upsert) 调用点后 800 字符范围,若未命中 `format:` 即判 BLOCKER。原 update 函数 updateData 未包含 format,BPMN/GRAPH_JSON 可能隐式漂移。\n\n本次修复:\n- schema.ts 新增 workflowFormatSchema 枚举(BPMN/GRAPH_JSON),createSchema/updateSchema body 加入 format 字段(create 默认 GRAPH_JSON,update 可选)\n- service.ts create/update 函数签名扩展 format 参数,写入 data 时显式落盘;update 未显式传入则保留 existing.format 而非隐式默认\n- docs.ts workflowSchema/createUpdateSchema 同步暴露 format 枚举,保证 OpenAPI 真源一致\n\n验证:\n- audit:approval-governance blockers=0 warnings=0 workflow_format_drift_files=0\n- audit:outbox-atomicity A=1633 / B=0 / C=0,原子化率 100%\n- ticket-workflow.service.test.ts 19/19 全通过\n- backend tsc --noEmit 无新增错误\n\n关联:Q2 12 周落地计划 Sprint 1 · Data Squad · KR2.1\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T09:53:33+08:00"}],"HeadCommit":{"Sha1":"27f01c5f3786ed44f603c6ca9a35156d956b1315","Message":"fix(ticket-workflows): workflow_defs 写链显式携带 format 字段\n\napproval-governance 审计通过 WORKFLOW_DEF_WRITE 正则扫描 workflow_defs.(create|update|upsert) 调用点后 800 字符范围,若未命中 `format:` 即判 BLOCKER。原 update 函数 updateData 未包含 format,BPMN/GRAPH_JSON 可能隐式漂移。\n\n本次修复:\n- schema.ts 新增 workflowFormatSchema 枚举(BPMN/GRAPH_JSON),createSchema/updateSchema body 加入 format 字段(create 默认 GRAPH_JSON,update 可选)\n- service.ts create/update 函数签名扩展 format 参数,写入 data 时显式落盘;update 未显式传入则保留 existing.format 而非隐式默认\n- docs.ts workflowSchema/createUpdateSchema 同步暴露 format 枚举,保证 OpenAPI 真源一致\n\n验证:\n- audit:approval-governance blockers=0 warnings=0 workflow_format_drift_files=0\n- audit:outbox-atomicity A=1633 / B=0 / C=0,原子化率 100%\n- ticket-workflow.service.test.ts 19/19 全通过\n- backend tsc --noEmit 无新增错误\n\n关联:Q2 12 周落地计划 Sprint 1 · Data Squad · KR2.1\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T09:53:33+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/7b47df3186db279cfc071517a6c034aa213d926d...27f01c5f3786ed44f603c6ca9a35156d956b1315","Len":1}...
|
1776390832
|
Edit
Delete
|
|
1104
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/fix/ticket-workflow-defs-format
|
0
|
|
1776390832
|
Edit
Delete
|
|
1103
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/docs/q2-2026-landing-plan
|
0
|
{"Commits":[{"Sha1":"faf34a7bb {"Commits":[{"Sha1":"faf34a7bb942869bf4cc111c51215701378d2397","Message":"docs(playbook): 归档 Q2 12 周生产落地计划(三轴并行)\n\n- 三阶段路线图(4+4+4 周)覆盖治理债清零、SRE 加固、灰度 GA\n- 6 个 Squad 编制与 RACI,覆盖 SRE/Data/Backend/Frontend/AI/BI\n- 成功标准含 3 组 OKR 共 13 个 KR,均可度量\n- 验收包含 harness 审计命令、SLO 查询、灾难演练场景\n- 关键文件清单明确必须修改/新增/复用的路径\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T09:23:33+08:00"}],"HeadCommit":{"Sha1":"faf34a7bb942869bf4cc111c51215701378d2397","Message":"docs(playbook): 归档 Q2 12 周生产落地计划(三轴并行)\n\n- 三阶段路线图(4+4+4 周)覆盖治理债清零、SRE 加固、灰度 GA\n- 6 个 Squad 编制与 RACI,覆盖 SRE/Data/Backend/Frontend/AI/BI\n- 成功标准含 3 组 OKR 共 13 个 KR,均可度量\n- 验收包含 harness 审计命令、SLO 查询、灾难演练场景\n- 关键文件清单明确必须修改/新增/复用的路径\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T09:23:33+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/7b47df3186db279cfc071517a6c034aa213d926d...faf34a7bb942869bf4cc111c51215701378d2397","Len":1}...
|
1776389054
|
Edit
Delete
|
|
1102
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/docs/q2-2026-landing-plan
|
0
|
|
1776389054
|
Edit
Delete
|
|
1101
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"7b47df318 {"Commits":[{"Sha1":"7b47df3186db279cfc071517a6c034aa213d926d","Message":"Merge gitea/main: harness/outbox/migration updates\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T08:50:00+08:00"},{"Sha1":"debdf5680e9bd056fb75e681e4d79cb74c02de9f","Message":"fix: override existing env vars in dev mode to prevent empty REDIS_PASSWORD issue\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-13T22:22:30+08:00"}],"HeadCommit":{"Sha1":"7b47df3186db279cfc071517a6c034aa213d926d","Message":"Merge gitea/main: harness/outbox/migration updates\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-17T08:50:00+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/fd1878b707f31b05ee314173ac91491adb28bc30...7b47df3186db279cfc071517a6c034aa213d926d","Len":2}...
|
1776387182
|
Edit
Delete
|
|
1072
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"fd1878b70 {"Commits":[{"Sha1":"fd1878b707f31b05ee314173ac91491adb28bc30","Message":"Tighten outbox atomicity and refresh readiness audits\n","AuthorEmail":"jh.sj@jhsjdeMac-Studio.local","AuthorName":"jh.sj","CommitterEmail":"jh.sj@jhsjdeMac-Studio.local","CommitterName":"jh.sj","Timestamp":"2026-04-15T15:00:11+08:00"}],"HeadCommit":{"Sha1":"fd1878b707f31b05ee314173ac91491adb28bc30","Message":"Tighten outbox atomicity and refresh readiness audits\n","AuthorEmail":"jh.sj@jhsjdeMac-Studio.local","AuthorName":"jh.sj","CommitterEmail":"jh.sj@jhsjdeMac-Studio.local","CommitterName":"jh.sj","Timestamp":"2026-04-15T15:00:11+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/110abcc02b429bfac3ebe16a02a876c0ba2f4f62...fd1878b707f31b05ee314173ac91491adb28bc30","Len":1}...
|
1776236457
|
Edit
Delete
|
|
1057
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"110abcc02 {"Commits":[{"Sha1":"110abcc02b429bfac3ebe16a02a876c0ba2f4f62","Message":"Implement Hermes-style harness context and fix alliance API tests\n","AuthorEmail":"jh.sj@jhsjdeMac-Studio.local","AuthorName":"jh.sj","CommitterEmail":"jh.sj@jhsjdeMac-Studio.local","CommitterName":"jh.sj","Timestamp":"2026-04-15T09:04:03+08:00"},{"Sha1":"e8baa3afde7621a8179f33a82639b86936d2242a","Message":"Improve Harness prompt assembly and context compression\n","AuthorEmail":"jh.sj@jhsjdeMac-Studio.local","AuthorName":"jh.sj","CommitterEmail":"jh.sj@jhsjdeMac-Studio.local","CommitterName":"jh.sj","Timestamp":"2026-04-15T08:23:29+08:00"}],"HeadCommit":{"Sha1":"110abcc02b429bfac3ebe16a02a876c0ba2f4f62","Message":"Implement Hermes-style harness context and fix alliance API tests\n","AuthorEmail":"jh.sj@jhsjdeMac-Studio.local","AuthorName":"jh.sj","CommitterEmail":"jh.sj@jhsjdeMac-Studio.local","CommitterName":"jh.sj","Timestamp":"2026-04-15T09:04:03+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/551c4d2e9b42cd14481ec48c3b2e2526cab4d58c...110abcc02b429bfac3ebe16a02a876c0ba2f4f62","Len":2}...
|
1776215055
|
Edit
Delete
|
|
1056
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"551c4d2e9 {"Commits":[{"Sha1":"551c4d2e9b42cd14481ec48c3b2e2526cab4d58c","Message":"Update governance docs and refresh harness baseline guidance\n","AuthorEmail":"jh.sj@jhsjdeMac-Studio.local","AuthorName":"jh.sj","CommitterEmail":"jh.sj@jhsjdeMac-Studio.local","CommitterName":"jh.sj","Timestamp":"2026-04-14T20:35:36+08:00"}],"HeadCommit":{"Sha1":"551c4d2e9b42cd14481ec48c3b2e2526cab4d58c","Message":"Update governance docs and refresh harness baseline guidance\n","AuthorEmail":"jh.sj@jhsjdeMac-Studio.local","AuthorName":"jh.sj","CommitterEmail":"jh.sj@jhsjdeMac-Studio.local","CommitterName":"jh.sj","Timestamp":"2026-04-14T20:35:36+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/204e3356f50776130b4976cf96f4deedfe36ab5f...551c4d2e9b42cd14481ec48c3b2e2526cab4d58c","Len":1}...
|
1776170150
|
Edit
Delete
|
|
1055
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"204e3356f {"Commits":[{"Sha1":"204e3356f50776130b4976cf96f4deedfe36ab5f","Message":"chore: add backend .env configuration\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"jh.sj@jhsjdeMac-Studio.local","AuthorName":"jh.sj","CommitterEmail":"jh.sj@jhsjdeMac-Studio.local","CommitterName":"jh.sj","Timestamp":"2026-04-14T20:34:24+08:00"}],"HeadCommit":{"Sha1":"204e3356f50776130b4976cf96f4deedfe36ab5f","Message":"chore: add backend .env configuration\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"jh.sj@jhsjdeMac-Studio.local","AuthorName":"jh.sj","CommitterEmail":"jh.sj@jhsjdeMac-Studio.local","CommitterName":"jh.sj","Timestamp":"2026-04-14T20:34:24+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/7c66dac1fd83d4b9dc05198d7589827309ba5922...204e3356f50776130b4976cf96f4deedfe36ab5f","Len":1}...
|
1776170075
|
Edit
Delete
|
|
1054
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"7c66dac1f {"Commits":[{"Sha1":"7c66dac1fd83d4b9dc05198d7589827309ba5922","Message":"fix(database): improve migration system with dedup, rollback strategy, and CI/CD\n\n- Fix 6 duplicate migration timestamps by adding _a/_b suffixes for deterministic ordering\n- Remove nested backend/backend/ directory anomaly (accidental copy)\n- Deprecate process-designer.prisma (models already merged in main schema)\n- Deprecate machine-specific create-extension.sh, point to portable alternatives\n- Create database-migration-guide-v2.md as single source of truth\n- Add rollback strategy generator for recent migrations (cross-platform)\n- Add CI/CD migration safety checks (7-point validation)\n- Add GitHub Actions workflow for automatic migration validation\n- Add legacy migration cleanup script to standardize on Prisma\n- Archive old migration guide with deprecation notice\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"jh.sj@jhsjdeMac-Studio.local","AuthorName":"jh.sj","CommitterEmail":"jh.sj@jhsjdeMac-Studio.local","CommitterName":"jh.sj","Timestamp":"2026-04-14T20:18:15+08:00"}],"HeadCommit":{"Sha1":"7c66dac1fd83d4b9dc05198d7589827309ba5922","Message":"fix(database): improve migration system with dedup, rollback strategy, and CI/CD\n\n- Fix 6 duplicate migration timestamps by adding _a/_b suffixes for deterministic ordering\n- Remove nested backend/backend/ directory anomaly (accidental copy)\n- Deprecate process-designer.prisma (models already merged in main schema)\n- Deprecate machine-specific create-extension.sh, point to portable alternatives\n- Create database-migration-guide-v2.md as single source of truth\n- Add rollback strategy generator for recent migrations (cross-platform)\n- Add CI/CD migration safety checks (7-point validation)\n- Add GitHub Actions workflow for automatic migration validation\n- Add legacy migration cleanup script to standardize on Prisma\n- Archive old migration guide with deprecation notice\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"jh.sj@jhsjdeMac-Studio.local","AuthorName":"jh.sj","CommitterEmail":"jh.sj@jhsjdeMac-Studio.local","CommitterName":"jh.sj","Timestamp":"2026-04-14T20:18:15+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/d2c68b13960de626f7a8d496bf1977d263eb7931...7c66dac1fd83d4b9dc05198d7589827309ba5922","Len":1}...
|
1776170068
|
Edit
Delete
|
|
829
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"d2c68b139 {"Commits":[{"Sha1":"d2c68b13960de626f7a8d496bf1977d263eb7931","Message":"feat: 同步最新代码更改,包括后端API、前端组件、测试和报告更新\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-13T15:39:52+08:00"}],"HeadCommit":{"Sha1":"d2c68b13960de626f7a8d496bf1977d263eb7931","Message":"feat: 同步最新代码更改,包括后端API、前端组件、测试和报告更新\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-13T15:39:52+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/98cc8da660b8d4dba9887432490471d976c03f5f...d2c68b13960de626f7a8d496bf1977d263eb7931","Len":1}...
|
1776066083
|
Edit
Delete
|
|
786
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"98cc8da66 {"Commits":[{"Sha1":"98cc8da660b8d4dba9887432490471d976c03f5f","Message":"feat: E2E 表单测试框架 + P0/P1/P2 治理完成\n\nE2E 表单测试 (新):\n- 新增 4 个测试文件,21 个测试用例,983 行代码\n- helpers/form-test-helpers.ts: 12 个通用测试工具函数\n- 覆盖 Lead-to-Cash/营销/审批/财务 4 大业务域\n- 测试矩阵: F01创建/F02验证错误/F03编辑回填/F04草稿恢复\n\nP0 治理完成:\n- ES 安全配置: xpack.security.enabled=true + 密码认证\n- Dockerfile.dev: 前后端统一 pnpm + frozen-lockfile\n- customers/Index.vue: reactive\u003cany\u003e → CustomerQueryParams 接口\n- CLAUDE.md 红线 9: 列表页必须使用 useListPage\n- useListPage 覆盖: 13 → 23/208 (11.1%),新增 10 个页面\n\nP1 治理完成:\n- Prisma 升级: 5.7.0 → 5.22.0,prismaSchemaFolder 启用\n- schema 拆分: 27 个子文件,prisma validate 通过\n- 大组件拆分: sms-marketing 1774 → 840 行 (↓53%)\n - SmsTemplateManager.vue (514 行)\n - SmsCampaignManager.vue (598 行)\n- 测试覆盖率: 后端 65→70%, 前端 60→65%\n- Dockerfile prune: pnpm prune --prod --no-optional\n\nP2 治理完成:\n- Kafka HA: Makefile deploy-ha 命令\n- SBOM: CI anchore/sbom-action 集成\n- ECharts 按需引入: echarts/core\n- 虚拟列表方案: @tanstack/vue-virtual 实施计划\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-13T00:24:31+08:00"}],"HeadCommit":{"Sha1":"98cc8da660b8d4dba9887432490471d976c03f5f","Message":"feat: E2E 表单测试框架 + P0/P1/P2 治理完成\n\nE2E 表单测试 (新):\n- 新增 4 个测试文件,21 个测试用例,983 行代码\n- helpers/form-test-helpers.ts: 12 个通用测试工具函数\n- 覆盖 Lead-to-Cash/营销/审批/财务 4 大业务域\n- 测试矩阵: F01创建/F02验证错误/F03编辑回填/F04草稿恢复\n\nP0 治理完成:\n- ES 安全配置: xpack.security.enabled=true + 密码认证\n- Dockerfile.dev: 前后端统一 pnpm + frozen-lockfile\n- customers/Index.vue: reactive\u003cany\u003e → CustomerQueryParams 接口\n- CLAUDE.md 红线 9: 列表页必须使用 useListPage\n- useListPage 覆盖: 13 → 23/208 (11.1%),新增 10 个页面\n\nP1 治理完成:\n- Prisma 升级: 5.7.0 → 5.22.0,prismaSchemaFolder 启用\n- schema 拆分: 27 个子文件,prisma validate 通过\n- 大组件拆分: sms-marketing 1774 → 840 行 (↓53%)\n - SmsTemplateManager.vue (514 行)\n - SmsCampaignManager.vue (598 行)\n- 测试覆盖率: 后端 65→70%, 前端 60→65%\n- Dockerfile prune: pnpm prune --prod --no-optional\n\nP2 治理完成:\n- Kafka HA: Makefile deploy-ha 命令\n- SBOM: CI anchore/sbom-action 集成\n- ECharts 按需引入: echarts/core\n- 虚拟列表方案: @tanstack/vue-virtual 实施计划\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-13T00:24:31+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/2e3188c85a6cfc38ac7d3643b1cbbfc2e3e850d0...98cc8da660b8d4dba9887432490471d976c03f5f","Len":1}...
|
1776011085
|
Edit
Delete
|
|
785
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"2e3188c85 {"Commits":[{"Sha1":"2e3188c85a6cfc38ac7d3643b1cbbfc2e3e850d0","Message":"feat: 更新项目配置和脚本\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-12T21:30:41+08:00"},{"Sha1":"83f8b781d7305c9badf23edd7d8523a626a5a18c","Message":"Improve governance guidance and audit coverage\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-12T12:31:56+08:00"},{"Sha1":"5d02d3ff4d71ee63ba8c3bd03fe70b152daa2c33","Message":"Refactor governance baselines and remove obsolete module code\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-11T17:16:05+08:00"},{"Sha1":"1b6a3f7493a79f95a2db09aff9c57350ae135c1b","Message":"Harden create form coverage and fix broken create flows\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-11T13:18:09+08:00"},{"Sha1":"e224c0ecaa34df97ef5acd412d614a7362bfa6c3","Message":"Harden harness reporting and add regression tests\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-11T08:45:25+08:00"}],"HeadCommit":{"Sha1":"2e3188c85a6cfc38ac7d3643b1cbbfc2e3e850d0","Message":"feat: 更新项目配置和脚本\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"mluo@MluodeMacBook-Air.local","AuthorName":"Mluo","CommitterEmail":"mluo@MluodeMacBook-Air.local","CommitterName":"Mluo","Timestamp":"2026-04-12T21:30:41+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/9d69e1960ec649a49c0c6f307c0fc197f47ee4c4...2e3188c85a6cfc38ac7d3643b1cbbfc2e3e850d0","Len":29}...
|
1776001250
|
Edit
Delete
|
|
669
|
5
|
9
|
5
|
6
|
0
|
0
|
refs/tags/v1.0.0-RC1
|
0
|
{"Commits":null,"HeadCommit":{" {"Commits":null,"HeadCommit":{"Sha1":"84c900df1e544e4eb7070be9278918676c4aec69","Message":"Release(v1.0.0-RC1): 巨嗨全域智库 1.0.0 封版交付\n","AuthorEmail":"laoluojuhai@users.noreply.github.com","AuthorName":"laoluojuhai","CommitterEmail":"laoluojuhai@users.noreply.github.com","CommitterName":"laoluojuhai","Timestamp":"2026-03-04T17:53:20+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/0000000000000000000000000000000000000000...7f6c4805d0719ce236bfd86ac50cc40cc6f5e5c5","Len":0}...
|
1775181686
|
Edit
Delete
|
|
668
|
5
|
9
|
5
|
6
|
0
|
0
|
refs/tags/v1.0.0
|
0
|
{"Commits":null,"HeadCommit":{" {"Commits":null,"HeadCommit":{"Sha1":"bd59e5501292cb061719f669c7a7b7afd4f1a0b7","Message":"Prepare v1.0.0 release\n","AuthorEmail":"laoluojuhai@users.noreply.github.com","AuthorName":"laoluojuhai","CommitterEmail":"laoluojuhai@users.noreply.github.com","CommitterName":"laoluojuhai","Timestamp":"2026-03-19T17:33:01+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/0000000000000000000000000000000000000000...e1e571dea3e53faf951b331ac647da4b96e0d01b","Len":0}...
|
1775181685
|
Edit
Delete
|
|
667
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"9d69e1960 {"Commits":[{"Sha1":"9d69e1960ec649a49c0c6f307c0fc197f47ee4c4","Message":"Merge remote-tracking branch 'origin/codex/finance-smoke-sync-20260331'\n\n# Conflicts:\n#\tfrontend/src/views/invoices/Detail.vue\n","AuthorEmail":"laoluojuhai@users.noreply.github.com","AuthorName":"laoluojuhai","CommitterEmail":"laoluojuhai@users.noreply.github.com","CommitterName":"laoluojuhai","Timestamp":"2026-04-03T09:41:29+08:00"},{"Sha1":"0152aae7b8ff9440c5f4e7aad113420208e6c304","Message":"Merge remote-tracking branch 'origin/codex/design-scalable-autopilot-os-architecture'\n\n# Conflicts:\n#\te2e/agents/playwright-agent/index.ts\n#\te2e/agents/playwright-agent/inspectors/index.ts\n#\te2e/agents/playwright-agent/reporters/backend-reporter.ts\n#\te2e/package.json\n","AuthorEmail":"laoluojuhai@users.noreply.github.com","AuthorName":"laoluojuhai","CommitterEmail":"laoluojuhai@users.noreply.github.com","CommitterName":"laoluojuhai","Timestamp":"2026-04-03T09:41:05+08:00"},{"Sha1":"e2587fae3d50e6ef7c30450199abd1bfc910a016","Message":"test(finance): add finance mainline smoke and harden invoice detail formatting","AuthorEmail":"158980461+laoluojuhai@users.noreply.github.com","AuthorName":"laoluojuhai","CommitterEmail":"158980461+laoluojuhai@users.noreply.github.com","CommitterName":"laoluojuhai","Timestamp":"2026-03-31T13:47:05+08:00"},{"Sha1":"803578ebec2d6f4c0d00335c1f5c61067112d923","Message":"feat(e2e): add playwright agent mvp skeleton","AuthorEmail":"158980461+laoluojuhai@users.noreply.github.com","AuthorName":"laoluojuhai","CommitterEmail":"158980461+laoluojuhai@users.noreply.github.com","CommitterName":"laoluojuhai","Timestamp":"2026-03-19T19:55:36+08:00"}],"HeadCommit":{"Sha1":"9d69e1960ec649a49c0c6f307c0fc197f47ee4c4","Message":"Merge remote-tracking branch 'origin/codex/finance-smoke-sync-20260331'\n\n# Conflicts:\n#\tfrontend/src/views/invoices/Detail.vue\n","AuthorEmail":"laoluojuhai@users.noreply.github.com","AuthorName":"laoluojuhai","CommitterEmail":"laoluojuhai@users.noreply.github.com","CommitterName":"laoluojuhai","Timestamp":"2026-04-03T09:41:29+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/40dae5944f158653af8288a3f38b6c97e8ce9f06...9d69e1960ec649a49c0c6f307c0fc197f47ee4c4","Len":4}...
|
1775180534
|
Edit
Delete
|
|
666
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"40dae5944 {"Commits":[{"Sha1":"40dae5944f158653af8288a3f38b6c97e8ce9f06","Message":"feat: 单机 Docker 生产部署 + 治理基线对齐 (#18)\n\nfeat: 单机 Docker 生产部署 + 治理基线对齐","AuthorEmail":"158980461+laoluojuhai@users.noreply.github.com","AuthorName":"laoluojuhai","CommitterEmail":"noreply@github.com","CommitterName":"GitHub","Timestamp":"2026-04-02T22:53:05+08:00"},{"Sha1":"588c47ea1f151f20d7e919cd87a5b07385b02022","Message":"chore: 将 .env.production 加入 .gitignore 防止密钥泄露\n\nhttps://claude.ai/code/session_0178CfAo3ibEjsJuMqDCHR7X\n","AuthorEmail":"noreply@anthropic.com","AuthorName":"Claude","CommitterEmail":"noreply@anthropic.com","CommitterName":"Claude","Timestamp":"2026-04-02T14:47:51Z"},{"Sha1":"3b9130b7e0040b49d5bc08307c9e050175994903","Message":"feat: 单机 Docker 生产部署成功 - 全套本地构建方案\n\n新增本地部署配套文件:\n- docker-compose.local-prod.yml: 本地单机生产编排(pgvector + apache/kafka + minio + api + frontend + nginx)\n- backend/Dockerfile.local: 后端本地构建镜像(tsx 运行源码,避免路径别名问题)\n- frontend/Dockerfile.local: 前端本地构建镜像\n- .dockerignore.local: 本地构建专用忽略规则(保留 dist/node_modules)\n\n修改:\n- backend/prisma/schema/_base.prisma: 添加 binaryTargets linux-musl-openssl-3.0.x(Alpine 容器支持)\n\n部署验证通过:\n- PostgreSQL (pgvector:pg16) + Redis + Kafka + MinIO + API + Frontend + Nginx 全部在线\n- 135+ 数据库迁移全部应用成功\n- API /health 返回 {\"status\":\"ok\"}\n- Nginx HTTP→HTTPS 重定向正常,SSL 自签名证书工作\n\nhttps://claude.ai/code/session_0178CfAo3ibEjsJuMqDCHR7X\n","AuthorEmail":"noreply@anthropic.com","AuthorName":"Claude","CommitterEmail":"noreply@anthropic.com","CommitterName":"Claude","Timestamp":"2026-04-02T14:46:47Z"},{"Sha1":"a5244b9fafc440f46250c8a1b72b7fea82d6d1ef","Message":"chore: 部署准备 - 补齐 deploy/ssl 目录 + 修复 fast-xml-parser 缺失依赖\n\n- 创建 deploy/ssl/.gitkeep,确保 Nginx 生产环境 SSL 挂载目录存在\n- 添加 fast-xml-parser 依赖,修复微信企业号 webhook 模块的类型错误\n- 后端 tsc 0 错误 / 前端 vue-tsc 0 错误,类型检查双清零\n\nhttps://claude.ai/code/session_0178CfAo3ibEjsJuMqDCHR7X\n","AuthorEmail":"noreply@anthropic.com","AuthorName":"Claude","CommitterEmail":"noreply@anthropic.com","CommitterName":"Claude","Timestamp":"2026-04-02T14:04:59Z"}],"HeadCommit":{"Sha1":"40dae5944f158653af8288a3f38b6c97e8ce9f06","Message":"feat: 单机 Docker 生产部署 + 治理基线对齐 (#18)\n\nfeat: 单机 Docker 生产部署 + 治理基线对齐","AuthorEmail":"158980461+laoluojuhai@users.noreply.github.com","AuthorName":"laoluojuhai","CommitterEmail":"noreply@github.com","CommitterName":"GitHub","Timestamp":"2026-04-02T22:53:05+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/624893ef324e57874ecb721dfd5539eb58d49b8e...40dae5944f158653af8288a3f38b6c97e8ce9f06","Len":4}...
|
1775180411
|
Edit
Delete
|
|
665
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"624893ef3 {"Commits":[{"Sha1":"624893ef324e57874ecb721dfd5539eb58d49b8e","Message":"fix(schema): annotate 47 Prisma String? fields + fix assembly types + sync E2E\n\n- Add @db.Text (18) and @db.VarChar(2000) (29) to all bare String?\n fields, eliminating 47 pre-commit Prisma warnings\n- Fix assembly.controller.ts 10 type errors using Parameters\u003c\u003e utility\n- Sync E2E test results and playwright reports\n- Update audit reports and governance docs\n\nGate: tsc 0 | vue-tsc 0 | 408 files 6410 tests 100%\nPre-commit Prisma warnings: 47 → 0\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"laoluojuhai@users.noreply.github.com","AuthorName":"laoluojuhai","CommitterEmail":"laoluojuhai@users.noreply.github.com","CommitterName":"laoluojuhai","Timestamp":"2026-04-02T06:59:18+08:00"},{"Sha1":"ad579baf8043eb72ed26d4b2750a83bf39888acf","Message":"Advance harness governance and align enum sources\n","AuthorEmail":"laoluojuhai@users.noreply.github.com","AuthorName":"laoluojuhai","CommitterEmail":"laoluojuhai@users.noreply.github.com","CommitterName":"laoluojuhai","Timestamp":"2026-04-02T06:46:31+08:00"},{"Sha1":"a11d601814a16c9221a3a43172d3ba80e47ab5d8","Message":"chore: refresh outbox and harness dashboard reports\n","AuthorEmail":"laoluojuhai@users.noreply.github.com","AuthorName":"laoluojuhai","CommitterEmail":"laoluojuhai@users.noreply.github.com","CommitterName":"laoluojuhai","Timestamp":"2026-04-02T06:45:42+08:00"},{"Sha1":"2b5617f7972d9e2e8d8714659d24a0629a387ff9","Message":"chore: clean up E2E reports and sync audit scripts\n\n- Remove stale playwright report artifacts\n- Update outbox-atomicity audit script\n- Refresh E2E auth session\n- Add new E2E test fixtures\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"laoluojuhai@users.noreply.github.com","AuthorName":"laoluojuhai","CommitterEmail":"laoluojuhai@users.noreply.github.com","CommitterName":"laoluojuhai","Timestamp":"2026-04-02T06:45:27+08:00"},{"Sha1":"5276d7aba4c8e857b2fb6c26eb6445143fbf9802","Message":"fix: resolve remaining field-payload ERRORs and update audit reports\n\n- Fix 3 remaining field-payload ERROR (commissions/payments/price-books\n createSchema optional→required alignment)\n- Update geo-pois service and tests\n- Refresh all audit reports (enum/field-payload/outbox/type-debt)\n- Update governance docs and project documentation\n\nGate: tsc 0 | vue-tsc 0 | 408 files 6410 tests 100%\n\nfield-payload: ERROR 3→0, WARNING 61 (stable)\nenum: ERROR 5 (audit mismatch), WARNING 14\nOutbox B-class: 3 (all passing tx — audit false positive)\nNon-test as any: 0 (all remaining are comments only)\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"laoluojuhai@users.noreply.github.com","AuthorName":"laoluojuhai","CommitterEmail":"laoluojuhai@users.noreply.github.com","CommitterName":"laoluojuhai","Timestamp":"2026-04-02T06:45:05+08:00"}],"HeadCommit":{"Sha1":"624893ef324e57874ecb721dfd5539eb58d49b8e","Message":"fix(schema): annotate 47 Prisma String? fields + fix assembly types + sync E2E\n\n- Add @db.Text (18) and @db.VarChar(2000) (29) to all bare String?\n fields, eliminating 47 pre-commit Prisma warnings\n- Fix assembly.controller.ts 10 type errors using Parameters\u003c\u003e utility\n- Sync E2E test results and playwright reports\n- Update audit reports and governance docs\n\nGate: tsc 0 | vue-tsc 0 | 408 files 6410 tests 100%\nPre-commit Prisma warnings: 47 → 0\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"laoluojuhai@users.noreply.github.com","AuthorName":"laoluojuhai","CommitterEmail":"laoluojuhai@users.noreply.github.com","CommitterName":"laoluojuhai","Timestamp":"2026-04-02T06:59:18+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/7212eb23c82b2ecae9ea1f22fa928fc6382f842d...624893ef324e57874ecb721dfd5539eb58d49b8e","Len":6}...
|
1775097114
|
Edit
Delete
|
|
664
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"7212eb23c {"Commits":[{"Sha1":"7212eb23c82b2ecae9ea1f22fa928fc6382f842d","Message":"feat(statuses): add 61 missing enum definitions to statuses.ts\n\nCentralize status enums that were previously only hardcoded in frontend\nviews. Reduces enum-consistency audit WARNING from 77 to 14 (-82%).\n\nCovers: assembly, asset, invoice, treasury, marketing, fulfillment,\npredictive-analytics, journey-orchestration, and 53 other modules.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"laoluojuhai@users.noreply.github.com","AuthorName":"laoluojuhai","CommitterEmail":"laoluojuhai@users.noreply.github.com","CommitterName":"laoluojuhai","Timestamp":"2026-04-02T01:59:43+08:00"},{"Sha1":"f94b12e56bac07b085d726a5205b134f3b46d56c","Message":"fix: schema字段补齐 + 枚举审计补全 + leads N+1修复 + API测试扩展\n\n- 补齐 alliance-agreements/coupons/campaigns、community-tasks/bots、groupbuy-promotions 的 Zod schema 缺失字段\n- statuses.ts 新增审计补齐的枚举定义(ABM/approval/AR-ledger 等)\n- leads 列表去除 AI enrichment 避免 N+1 性能瓶颈\n- dashboard-cache 增加 destroy() 防止定时器泄漏,main.ts 注册关闭钩子\n- 扩展 assets/auth/financial-reports API 测试用例\n- 刷新 7 份审计报告\n","AuthorEmail":"laoluojuhai@users.noreply.github.com","AuthorName":"laoluojuhai","CommitterEmail":"laoluojuhai@users.noreply.github.com","CommitterName":"laoluojuhai","Timestamp":"2026-04-02T01:57:16+08:00"},{"Sha1":"83dba3313659e6cae54f44e9b5f92ed76cdc6930","Message":"fix(outbox): move publishEvent outside $transaction for 20 B-class calls\n\nEnsure Kafka events are only published after transaction commits\nsuccessfully, preventing phantom events on rollback.\n\nModules: customer-balance(6), rma(3), targets(2), swot(2), devices(1),\nproducts(1), renewals(1), ar-ledger(1), commission-settlement(1),\nserial-numbers(1), lead-collector(1 - already A-class on review)\n\nGate: tsc 0 | 408 files 6410 tests 100%\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"laoluojuhai@users.noreply.github.com","AuthorName":"laoluojuhai","CommitterEmail":"laoluojuhai@users.noreply.github.com","CommitterName":"laoluojuhai","Timestamp":"2026-04-02T01:50:02+08:00"},{"Sha1":"030461be827686bdc356980b5b9194d818d792b9","Message":"Harden deployment checks and expand API coverage\n","AuthorEmail":"laoluojuhai@users.noreply.github.com","AuthorName":"laoluojuhai","CommitterEmail":"laoluojuhai@users.noreply.github.com","CommitterName":"laoluojuhai","Timestamp":"2026-04-02T01:41:49+08:00"},{"Sha1":"7502b39b876a708302cebd203aa34871ea2a5e1b","Message":"fix(docker): increase Node memory for frontend Vite build in Docker\n\nLarge project (735 JS chunks) needs more heap to avoid OOM during\nproduction build inside Alpine container.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"laoluojuhai@users.noreply.github.com","AuthorName":"laoluojuhai","CommitterEmail":"laoluojuhai@users.noreply.github.com","CommitterName":"laoluojuhai","Timestamp":"2026-04-02T01:37:34+08:00"}],"HeadCommit":{"Sha1":"7212eb23c82b2ecae9ea1f22fa928fc6382f842d","Message":"feat(statuses): add 61 missing enum definitions to statuses.ts\n\nCentralize status enums that were previously only hardcoded in frontend\nviews. Reduces enum-consistency audit WARNING from 77 to 14 (-82%).\n\nCovers: assembly, asset, invoice, treasury, marketing, fulfillment,\npredictive-analytics, journey-orchestration, and 53 other modules.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"laoluojuhai@users.noreply.github.com","AuthorName":"laoluojuhai","CommitterEmail":"laoluojuhai@users.noreply.github.com","CommitterName":"laoluojuhai","Timestamp":"2026-04-02T01:59:43+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/46635b50050ba09e31518824f56b1e2176e7b0b7...7212eb23c82b2ecae9ea1f22fa928fc6382f842d","Len":15}...
|
1775066750
|
Edit
Delete
|
|
663
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"46635b500 {"Commits":[{"Sha1":"46635b50050ba09e31518824f56b1e2176e7b0b7","Message":"Harden invoice detail formatting and finance smoke coverage\n","AuthorEmail":"jh.sj@jhsjdeMac-Studio.local","AuthorName":"jh.sj","CommitterEmail":"jh.sj@jhsjdeMac-Studio.local","CommitterName":"jh.sj","Timestamp":"2026-03-31T10:44:07+08:00"},{"Sha1":"fb960500246fc412cf02a20cc0b316e9100eeb7f","Message":"Fix release gate type regressions in dashboard and query schemas\n","AuthorEmail":"jh.sj@jhsjdeMac-Studio.local","AuthorName":"jh.sj","CommitterEmail":"jh.sj@jhsjdeMac-Studio.local","CommitterName":"jh.sj","Timestamp":"2026-03-30T21:10:48+08:00"},{"Sha1":"1ce3f3ee5a8099af3c2b00d92ab83aa31d4d803a","Message":"Harden role-based smoke flows and permission guards\n","AuthorEmail":"jh.sj@jhsjdeMac-Studio.local","AuthorName":"jh.sj","CommitterEmail":"jh.sj@jhsjdeMac-Studio.local","CommitterName":"jh.sj","Timestamp":"2026-03-30T20:59:20+08:00"},{"Sha1":"704bdd5de0d4b0661c28286c0cbb71bae53e26cc","Message":"Refine governance baselines and align module acceptance evidence\n","AuthorEmail":"jh.sj@jhsjdeMac-Studio.local","AuthorName":"jh.sj","CommitterEmail":"jh.sj@jhsjdeMac-Studio.local","CommitterName":"jh.sj","Timestamp":"2026-03-30T20:25:39+08:00"},{"Sha1":"8a7978e163a401654f636377fc9ca790391d8779","Message":"Fix role query transforms and update evidence reports\n","AuthorEmail":"jh.sj@jhsjdeMac-Studio.local","AuthorName":"jh.sj","CommitterEmail":"jh.sj@jhsjdeMac-Studio.local","CommitterName":"jh.sj","Timestamp":"2026-03-30T19:55:47+08:00"}],"HeadCommit":{"Sha1":"46635b50050ba09e31518824f56b1e2176e7b0b7","Message":"Harden invoice detail formatting and finance smoke coverage\n","AuthorEmail":"jh.sj@jhsjdeMac-Studio.local","AuthorName":"jh.sj","CommitterEmail":"jh.sj@jhsjdeMac-Studio.local","CommitterName":"jh.sj","Timestamp":"2026-03-31T10:44:07+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/dffb3332733fb56fd51632938c4379422125381c...46635b50050ba09e31518824f56b1e2176e7b0b7","Len":47}...
|
1774957472
|
Edit
Delete
|
|
662
|
5
|
23
|
-2
|
6
|
24
|
0
|
|
0
|
1|✅ E2E 测试通过!
|
1774950242
|
Edit
Delete
|
|
660
|
5
|
7
|
5
|
6
|
0
|
0
|
|
0
|
1|test(finance): add finance mainline smoke and ha 1|test(finance): add finance mainline smoke and harden invoice detail formatting...
|
1774950059
|
Edit
Delete
|
|
659
|
5
|
5
|
5
|
6
|
0
|
0
|
refs/heads/codex/finance-mainline-gitea-main-20260 refs/heads/codex/finance-mainline-gitea-main-20260331...
|
0
|
{"Commits":[{"Sha1":"8c225d732 {"Commits":[{"Sha1":"8c225d73253fe95a23618816b2f7e6a03010cae4","Message":"test(finance): add finance mainline smoke\n","AuthorEmail":"law@g-hi.com","AuthorName":"luoanwu","CommitterEmail":"law@g-hi.com","CommitterName":"luoanwu","Timestamp":"2026-03-31T17:38:36+08:00"}],"HeadCommit":{"Sha1":"8c225d73253fe95a23618816b2f7e6a03010cae4","Message":"test(finance): add finance mainline smoke\n","AuthorEmail":"law@g-hi.com","AuthorName":"luoanwu","CommitterEmail":"law@g-hi.com","CommitterName":"luoanwu","Timestamp":"2026-03-31T17:38:36+08:00"},"CompareURL":"luoanwu/juhi-omni-knowledge-hub/compare/615a7ad3acd756e166c477d55fff803749b7a2f9...8c225d73253fe95a23618816b2f7e6a03010cae4","Len":1}...
|
1774949918
|
Edit
Delete
|