| event_payload |
{"ref":"refs/heads/main","befo {"ref":"refs/heads/main","before":"e12d0f25ca07d2a70a7bc7520b43a311940d35d5","after":"0c9109de87bdf60dd818cf35dbec34de148a28e9","compare_url":"https://gitea.g-hi.com/luoanwu/digital-employee-os/compare/e12d0f25ca07d2a70a7bc7520b43a311940d35d5...0c9109de87bdf60dd818cf35dbec34de148a28e9","commits":[{"id":"0c9109de87bdf60dd818cf35dbec34de148a28e9","message":"Merge branch 'main' into feat/c19-usage-export\n","url":"https://gitea.g-hi.com/luoanwu/digital-employee-os/commit/0c9109de87bdf60dd818cf35dbec34de148a28e9","author":{"name":"juhailaoluo pro","email":"hillao@juhailaoluodeMacBook-Pro.local","username":""},"committer":{"name":"juhailaoluo pro","email":"hillao@juhailaoluodeMacBook-Pro.local","username":""},"verification":null,"timestamp":"2026-09-23T09:02:54-07:00","added":["products/juhai.hr/acceptance/agent-tools.contract.test.mjs","products/juhai.hr/migrations/juhai.hr.personnel-core/20260828010000_assignment_lineage_indexes.sql","products/juhai.hr/migrations/juhai.hr.personnel-core/20260830120000_employment_canonical_fact_intents.sql","products/juhai.hr/migrations/juhai.hr.personnel-core/20260830130000_enterprise_fact_relay_recovery.sql","products/juhai.hr/migrations/juhai.hr.personnel-core/20260830140000_enterprise_fact_relay_tenant_id_compat.sql","products/juhai.hr/src/delivery-audit-workbench.d.mts","products/juhai.hr/src/delivery-audit-workbench.mjs","products/juhai.hr/src/master-data-workbench.mjs","products/juhai.hr/src/personnel-change-workbench.d.mts","products/juhai.hr/src/personnel-change-workbench.mjs","products/juhai.hr/src/personnel-governance-workbench.d.mts","products/juhai.hr/src/personnel-governance-workbench.mjs","products/juhai.hr/src/privacy-projections.mjs","products/juhai.hr/src/transfer-service.d.mts"],"removed":[],"modified":["kernel.products.json","kernel.products.lock.json","products/juhai.hr/acceptance/runtime-suite.mjs","products/juhai.hr/acceptance/web-workspace.acceptance.spec.ts","products/juhai.hr/distribution.json","products/juhai.hr/manifest.json","products/juhai.hr/src/delivery-audit-service.mjs","products/juhai.hr/src/fastify-adapter.d.mts","products/juhai.hr/src/fastify-adapter.mjs","products/juhai.hr/src/http-errors.mjs","products/juhai.hr/src/implementations.mjs","products/juhai.hr/src/master-data-service.mjs","products/juhai.hr/src/nestjs-adapter.d.mts","products/juhai.hr/src/nestjs-adapter.mjs","products/juhai.hr/src/os-composition.d.mts","products/juhai.hr/src/os-composition.mjs","products/juhai.hr/src/personnel-change-contracts.d.mts","products/juhai.hr/src/personnel-change-contracts.mjs","products/juhai.hr/src/personnel-change-policy.d.mts","products/juhai.hr/src/personnel-change-policy.mjs","products/juhai.hr/src/personnel-change-service.mjs","products/juhai.hr/src/personnel-governance-service.mjs","products/juhai.hr/src/runtime-contracts.mjs","products/juhai.hr/src/transfer-service.mjs","products/juhai.hr/src/web-workspace.d.mts","products/juhai.hr/src/web-workspace.mjs","reports/kernel-boundaries.latest.json","reports/kernel-extensions.latest.json","reports/product-acceptance-runtime.latest.json","reports/product-acceptance.latest.json","reports/product-migrations-runtime.latest.json","reports/product-migrations.latest.json"]},{"id":"aa2a9af749519f94e08694b4bbc7afcdd863d95b","message":"test(llm): C19 双仓联调用例——真实 OS 账本 → 真实平台 cost-capacity → 成本页读回(两后端对等)\n\nC19_PLATFORM_E2E_URL / C19_PLATFORM_E2E_TOKEN 未给即整组 skip,不冒充通过。\n2026-09-23 本地实跑:平台 feat/cost-capacity-authority @ 5e5a2306(:3431,profile cost-capacity,JWT HS256,\nlocal 端口)+ OS 两后端各 1/1 通过:三类口径各一笔全部落账(6 修订 APPLIED)、同修订重发 DUPLICATE_NOOP、\n投递前成本页 unknown 非 0、投递后 syncStatus=current 且三桶与 OS 账本固定水位逐项一致。\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","url":"https://gitea.g-hi.com/luoanwu/digital-employee-os/commit/aa2a9af749519f94e08694b4bbc7afcdd863d95b","author":{"name":"juhailaoluo pro","email":"hillao@juhailaoluodeMacBook-Pro.local","username":""},"committer":{"name":"juhailaoluo pro","email":"hillao@juhailaoluodeMacBook-Pro.local","username":""},"verification":null,"timestamp":"2026-09-23T09:02:37-07:00","added":["apps/api-fastify/test/llm.usage-export.platform-e2e.test.ts","apps/api-nestjs/test/llm.usage-export.platform-e2e.test.ts"],"removed":[],"modified":[]},{"id":"ab9859929a0e71540087a83ddc1c12cea5a2a579","message":"feat(llm): C19 用量投影出站到平台 cost-capacity(DEC-043 消费侧)\n\n- 账本:llm_invocations 新增 usage_revision(唯一单调修订号,不复用对账乐观锁 version);\n claim / recordResponse(改为 $transaction)/ recordFailure / 人工对账各在同一 tx 递增修订并写一条\n llm_usage_exports(id = sourceOutboxId;投影体只含成本事实,不含 prompt/responseBody/凭据/证据)。\n actor 只经本租户 AgentRuntime 解析,解析不到即整笔回滚;显式 MODEL 摘要(runtimeId=会话 id)如实不导出。\n- 中继:两后端 dispatchLlmUsageExportBatch(system RLS、SKIP LOCKED 领取、30s 超时领取退回、\n 201/200 送达、400/403/409/413 死信、其余指数退避封顶 5 分钟、20 次死信),接入独立 dispatcher 与\n API 进程内 dispatcher(DISPATCHERS_ENABLED=0 关闭、验收租户 seam)。凭据按租户\n PLATFORM_COST_USAGE_CREDENTIALS(一枚 token = 一个租户),缺凭据租户保持待发不死信。\n- 成本页:GET /api/llm/usage/actors/:actorId/platform-projection(llm.read),平台不可用只回稳定原因码、\n 不补 0,并给出本地待发/死信/滞后;Web ActorLlmCostPanel 新增「平台成本投影」区块。\n- 契约:@repo/contracts 1.27.0 新增 llm-usage-export.ts(投影体/回执/汇总 Zod、计量依据、响应分类、\n 退避、按租户凭据解析);RLS 表/模型目录、治理注册表、内核边界/包/导出锁同步。\n- 迁移 20261001000000_llm_usage_export 两后端逐字一致(ENABLE+FORCE RLS 双策略)。\n- 测试:两后端同名 llm.usage-export.acceptance(各 6 例真实 PG/Redis)+ contracts 10 例;\n llm.acceptance 并发 claim 用例改用真实 Runtime(claim 现需可解析 actor)。\n\n证据等级:本地工作区真实 DB 模块测试;未跑完整 check:runtime,未做平台联调。\nreports/ 未随本提交刷新(回绑单独成提交)。\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","url":"https://gitea.g-hi.com/luoanwu/digital-employee-os/commit/ab9859929a0e71540087a83ddc1c12cea5a2a579","author":{"name":"juhailaoluo pro","email":"hillao@juhailaoluodeMacBook-Pro.local","username":""},"committer":{"name":"juhailaoluo pro","email":"hillao@juhailaoluodeMacBook-Pro.local","username":""},"verification":null,"timestamp":"2026-09-23T08:01:52-07:00","added":["apps/api-fastify/prisma/migrations/20261001000000_llm_usage_export/migration.sql","apps/api-fastify/src/modules/llm-usage-export.ts","apps/api-fastify/src/plugins/llm-usage-export-dispatcher.ts","apps/api-fastify/test/llm.usage-export.acceptance.test.ts","apps/api-nestjs/prisma/migrations/20261001000000_llm_usage_export/migration.sql","apps/api-nestjs/src/llm-governance/llm-usage-export-dispatcher.service.ts","apps/api-nestjs/src/llm-governance/llm-usage-export.ts","apps/api-nestjs/test/llm.usage-export.acceptance.test.ts","packages/contracts/src/llm-usage-export.test.ts","packages/contracts/src/llm-usage-export.ts"],"removed":[],"modified":["CLAUDE.md","apps/api-fastify/.env.example","apps/api-fastify/prisma/schema.prisma","apps/api-fastify/src/app.ts","apps/api-fastify/src/dispatcher.ts","apps/api-fastify/src/modules/llm-governance.service.ts","apps/api-fastify/src/modules/llm-invocation-ledger.ts","apps/api-fastify/src/routes/llm-governance.ts","apps/api-fastify/test/llm.acceptance.test.ts","apps/api-nestjs/.env.example","apps/api-nestjs/prisma/schema.prisma","apps/api-nestjs/src/dispatcher.ts","apps/api-nestjs/src/llm-governance/llm-governance.controller.ts","apps/api-nestjs/src/llm-governance/llm-governance.module.ts","apps/api-nestjs/src/llm-governance/llm-governance.service.ts","apps/api-nestjs/src/queue/llm-invocation-ledger.service.ts","apps/api-nestjs/test/llm.acceptance.test.ts","apps/web/src/features/llm-governance/api/llm-governance-api.ts","apps/web/src/features/llm-governance/components/LlmInvocationReconciliationPanel.tsx","apps/web/src/features/llm-governance/hooks/use-llm-invocations.ts","deploy/production/.env.production.example","docs/product-extension-guide.md","governance.registry.json","kernel.boundaries.json","kernel.boundaries.lock.json","kernel.downstream.lock.json","kernel.exports.lock.json","kernel.packages.json","kernel.packages.lock.json","packages/contracts/package.json","packages/contracts/src/index.ts","packages/contracts/src/llm-contracts.ts","packages/contracts/src/rls.test.ts","packages/contracts/src/rls.ts"]}],"total_commits":0,"head_commit":{"id":"0c9109de87bdf60dd818cf35dbec34de148a28e9","message":"Merge branch 'main' into feat/c19-usage-export\n","url":"https://gitea.g-hi.com/luoanwu/digital-employee-os/commit/0c9109de87bdf60dd818cf35dbec34de148a28e9","author":{"name":"juhailaoluo pro","email":"hillao@juhailaoluodeMacBook-Pro.local","username":""},"committer":{"name":"juhailaoluo pro","email":"hillao@juhailaoluodeMacBook-Pro.local","username":""},"verification":null,"timestamp":"2026-09-23T09:02:54-07:00","added":["products/juhai.hr/acceptance/agent-tools.contract.test.mjs","products/juhai.hr/migrations/juhai.hr.personnel-core/20260828010000_assignment_lineage_indexes.sql","products/juhai.hr/migrations/juhai.hr.personnel-core/20260830120000_employment_canonical_fact_intents.sql","products/juhai.hr/migrations/juhai.hr.personnel-core/20260830130000_enterprise_fact_relay_recovery.sql","products/juhai.hr/migrations/juhai.hr.personnel-core/20260830140000_enterprise_fact_relay_tenant_id_compat.sql","products/juhai.hr/src/delivery-audit-workbench.d.mts","products/juhai.hr/src/delivery-audit-workbench.mjs","products/juhai.hr/src/master-data-workbench.mjs","products/juhai.hr/src/personnel-change-workbench.d.mts","products/juhai.hr/src/personnel-change-workbench.mjs","products/juhai.hr/src/personnel-governance-workbench.d.mts","products/juhai.hr/src/personnel-governance-workbench.mjs","products/juhai.hr/src/privacy-projections.mjs","products/juhai.hr/src/transfer-service.d.mts"],"removed":[],"modified":["kernel.products.json","kernel.products.lock.json","products/juhai.hr/acceptance/runtime-suite.mjs","products/juhai.hr/acceptance/web-workspace.acceptance.spec.ts","products/juhai.hr/distribution.json","products/juhai.hr/manifest.json","products/juhai.hr/src/delivery-audit-service.mjs","products/juhai.hr/src/fastify-adapter.d.mts","products/juhai.hr/src/fastify-adapter.mjs","products/juhai.hr/src/http-errors.mjs","products/juhai.hr/src/implementations.mjs","products/juhai.hr/src/master-data-service.mjs","products/juhai.hr/src/nestjs-adapter.d.mts","products/juhai.hr/src/nestjs-adapter.mjs","products/juhai.hr/src/os-composition.d.mts","products/juhai.hr/src/os-composition.mjs","products/juhai.hr/src/personnel-change-contracts.d.mts","products/juhai.hr/src/personnel-change-contracts.mjs","products/juhai.hr/src/personnel-change-policy.d.mts","products/juhai.hr/src/personnel-change-policy.mjs","products/juhai.hr/src/personnel-change-service.mjs","products/juhai.hr/src/personnel-governance-service.mjs","products/juhai.hr/src/runtime-contracts.mjs","products/juhai.hr/src/transfer-service.mjs","products/juhai.hr/src/web-workspace.d.mts","products/juhai.hr/src/web-workspace.mjs","reports/kernel-boundaries.latest.json","reports/kernel-extensions.latest.json","reports/product-acceptance-runtime.latest.json","reports/product-acceptance.latest.json","reports/product-migrations-runtime.latest.json","reports/product-migrations.latest.json"]},"repository":{"id":76,"owner":{"id":5,"login":"luoanwu","login_name":"","source_id":0,"full_name":"","email":"law@g-hi.com","avatar_url":"https://gitea.g-hi.com/avatar/627574a890388a2aadc80ab38d22f3a0","html_url":"https://gitea.g-hi.com/luoanwu","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2026-01-30T16:28:30+08:00","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"luoanwu"},"name":"digital-employee-os","full_name":"luoanwu/digital-employee-os","description":"","empty":false,"private":false,"fork":false,"template":false,"mirror":false,"size":95734,"language":"","languages_url":"https://gitea.g-hi.com/api/v1/repos/luoanwu/digital-employee-os/languages","html_url":"https://gitea.g-hi.com/luoanwu/digital-employee-os","url":"https://gitea.g-hi.com/api/v1/repos/luoanwu/digital-employee-os","link":"","ssh_url":"git@gitea.g-hi.com:luoanwu/digital-employee-os.git","clone_url":"https://gitea.g-hi.com/luoanwu/digital-employee-os.git","original_url":"","website":"","stars_count":0,"forks_count":1,"watchers_count":1,"branch_count":3,"open_issues_count":0,"open_pr_counter":0,"release_counter":0,"default_branch":"main","archived":false,"created_at":"2026-08-20T14:46:28+08:00","updated_at":"2026-09-23T23:00:49+08:00","archived_at":"1970-01-01T08:00:00+08:00","permissions":{"admin":true,"push":true,"pull":true},"has_code":true,"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"all","has_releases":true,"has_packages":true,"has_actions":true,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":true,"allow_rebase_update":true,"allow_manual_merge":false,"autodetect_manual_merge":false,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":true,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","topics":[],"licenses":[]},"pusher":{"id":5,"login":"luoanwu","login_name":"","source_id":0,"full_name":"","email":"5+luoanwu@noreply.localhost","avatar_url":"https://gitea.g-hi.com/avatar/627574a890388a2aadc80ab38d22f3a0","html_url":"https://gitea.g-hi.com/luoanwu","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2026-01-30T16:28:30+08:00","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"luoanwu"},"sender":{"id":5,"login":"luoanwu","login_name":"","source_id":0,"full_name":"","email":"5+luoanwu@noreply.localhost","avatar_url":"https://gitea.g-hi.com/avatar/627574a890388a2aadc80ab38d22f3a0","html_url":"https://gitea.g-hi.com/luoanwu","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2026-01-30T16:28:30+08:00","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"luoanwu"}}... |