| event_payload |
{"ref":"refs/heads/main","befo {"ref":"refs/heads/main","before":"9690ba98673547cb338309cd66f41ff6dbcaf61b","after":"23c6960de45354e3ea524f9d81ce8b9d2d2fc7af","compare_url":"https://gitea.g-hi.com/luoanwu/base-framework/compare/9690ba98673547cb338309cd66f41ff6dbcaf61b...23c6960de45354e3ea524f9d81ce8b9d2d2fc7af","commits":[{"id":"23c6960de45354e3ea524f9d81ce8b9d2d2fc7af","message":"chore(reports): refresh clean static evidence @ 2ceb5d8(v0.22.0 记录提交;45 文件 / 314 静态用例)\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\n","url":"https://gitea.g-hi.com/luoanwu/base-framework/commit/23c6960de45354e3ea524f9d81ce8b9d2d2fc7af","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-15T03:57:17-07:00","added":[],"removed":[],"modified":["CLAUDE.md","reports/agent-adapters.latest.json","reports/conformance-matrix.latest.json","reports/contract-consumers.latest.json","reports/docs-truth.latest.json","reports/dual-backend-parity.latest.json","reports/fork-readiness.latest.json","reports/governance-docs.latest.json","reports/governance-rules.latest.json","reports/governance-status.latest.json","reports/governance.latest.json","reports/migrations.latest.json","reports/naming.latest.json","reports/runtime-governance.latest.json","reports/schema-sync.latest.json","reports/statemachine-write-guard.latest.json","reports/validation-source.latest.json"]},{"id":"2ceb5d88c1b36c1e5bb92608054e6503bedcc292","message":"docs: record clean commit acceptance @ 6443380(v0.22.0:四级证据同 SHA——runtime 325 / 差分 10×2 / tenantRlsEnforced=1;UI 4×11;部署 13 步 + 回滚演练;生产 14 步 + 故障注入 + 恢复演练)\n\n- CLAUDE.md 动态区四级条目全部改为 clean `6443380`;tests-passing 地板 320 → 325;framework-version 行钉 v0.22.0@6443380\n- reports/baseline.json testsPassed 325\n- registry 实测仍为 0.16.1:0.17.0–0.22.0 未发布,发布动作留给框架 Owner(本轮 publish 未获执行许可)\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\n","url":"https://gitea.g-hi.com/luoanwu/base-framework/commit/2ceb5d88c1b36c1e5bb92608054e6503bedcc292","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-15T03:56:44-07:00","added":[],"removed":[],"modified":["CLAUDE.md","COMPATIBILITY.md","reports/baseline.json","reports/conformance-differential.latest.json","reports/deployment-acceptance.latest.json","reports/docs-truth.latest.json","reports/production-acceptance.latest.json","reports/runtime-acceptance.latest.json","reports/ui-acceptance.latest.json"]},{"id":"64433802b34d1780402486d61a9b6dbf911ac0f7","message":"docs(release): 0.22.0 版本轴收口——录入 C39 告警生产方、证据新鲜度四级断言与地板收紧\n\n- CHANGELOG 0.22.0 补第四项(C39:作业重试耗尽 / Redis 连接异常两个告警生产方,18fba1c 只提交了实现与门禁)\n- CLAUDE.md:C39 处置行、G20 仍缺清单去掉已补的两个生产方、own-tests 45 / own-test-cases 314(此前表内仍写 42 / 286)\n- reports/baseline.json:ownTestCases 311 → 314(棘轮只收紧)\n- COMPATIBILITY.md 0.22.0 小节补告警生产方的派生仓动作\n- check-docs-truth:freshness-sha-* 判定收紧为声明形式(另一会话在途改动,随本提交一并落地)\n- reports/ 为本轮 dirty 运行的中间产物,随后在 clean 提交上重跑刷新\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\n","url":"https://gitea.g-hi.com/luoanwu/base-framework/commit/64433802b34d1780402486d61a9b6dbf911ac0f7","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-15T03:50:54-07:00","added":[],"removed":[],"modified":["CHANGELOG.md","CLAUDE.md","COMPATIBILITY.md","reports/agent-adapters.latest.json","reports/baseline.json","reports/conformance-differential.latest.json","reports/conformance-matrix.latest.json","reports/contract-consumers.latest.json","reports/deployment-acceptance.latest.json","reports/docs-truth.latest.json","reports/dual-backend-parity.latest.json","reports/fork-readiness.latest.json","reports/governance-docs.latest.json","reports/governance-rules.latest.json","reports/governance-status.latest.json","reports/governance.latest.json","reports/migrations.latest.json","reports/naming.latest.json","reports/production-acceptance.latest.json","reports/runtime-acceptance.latest.json","reports/runtime-governance.latest.json","reports/schema-sync.latest.json","reports/statemachine-write-guard.latest.json","reports/ui-acceptance.latest.json","reports/validation-source.latest.json","scripts/check-docs-truth.mjs"]},{"id":"18fba1c6dc228a6b2cf425bd003892e5cfc6feaa","message":"feat(observability): 补两个告警生产方——作业重试耗尽与 Redis 连接异常(G20,C39)\n\nG20 此前只有两个生产方(outbox 死信、流阻断)。另外两类同样该让值班知道的事件此前是静音的:\n\n- 作业重试耗尽:只广播 job.failed 实时事件 + 一行日志——**没人订阅实时事件时它就是静音的**,\n 而\"作业彻底失败\"恰恰最需要有人知道\n- Redis 连接异常:Redis 一断,实时投递与作业队列同时失效,此前只有一行 error 日志\n\n实现:\n- 内核 alert.ts 新增两个码与两个构造函数 buildJobRetryExhaustedAlert / buildRedisConnectionLostAlert\n (两后端共用同一份构造;各写一套会让同一事件在两个后端推出 severity/fingerprint 不同的告警,\n 值班侧无法按同一规则路由与去重)\n- 去重口径:作业按 jobId、Redis 按连接角色(重连风暴压成一条,投递器自带 TTL)\n- 两后端四处接线;Redis 告警失败不再触发告警,避免连接异常时自激\n- 内核 3 个单测(形状/去重/租户维度)+ check:dual-backend C39 绊网,负向已验证\n (把任一侧的构造函数改名即 exit 1)\n\n注:本轮只提交实现与门禁。CHANGELOG / CLAUDE.md 的录入与地板收紧留给正在并行做记录的会话——\n另:先前的 4f45161 因用了 git add -A,把该会话在途的 check-docs-truth.mjs 改动一并提交了,\n本轮起只暂存自己碰过的文件。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","url":"https://gitea.g-hi.com/luoanwu/base-framework/commit/18fba1c6dc228a6b2cf425bd003892e5cfc6feaa","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-15T03:04:54-07:00","added":[],"removed":[],"modified":["apps/api-fastify/src/plugins/queue.ts","apps/api-fastify/src/plugins/redis.ts","apps/api-nestjs/src/queue/jobs.processor.ts","apps/api-nestjs/src/redis/redis.module.ts","packages/kernel/src/alert.test.ts","packages/kernel/src/alert.ts","scripts/check-dual-backend-parity.mjs"]},{"id":"db5e2c0b9e1523e5db3b74b143fae3e6725d640a","message":"feat(gates): 治理聚合报告必须声明结论(0.22.0,受理结论字段 FR-1/FR-2;C38)\n\n兄弟报告(runtime/ui)都写 status,唯独 governance.latest.json 不写:成败只由退出码表达,而退出码\n不进报告、不进证据链。工作区实测 20 份无一携带 status,消费侧两条 blocker 恒红且重跑一千次也不会变。\n更尖锐的一半是写入时机——三处失败关闭都在写入之后,指标 schema 挂了、棘轮回退了,磁盘上留下的仍是\n一份与成功运行无法区分的报告。看起来通过是彻底的静音,比永远红更坏。\n\n- 报告增 status(running → passed/failed)与 failures[{kind,detail}];先落 running,进程被杀也不会\n 留下 passed\n- 单点 finish():四条失败分支(状态清单生成失败、来源绑定违规、指标 schema 缺失、棘轮回退)与两条\n 成功分支(基线初始化、--update-baseline)全部经它定稿后才 exit;将来新增分支走 finish() 即不会漏\n- 负向实做:临时让子门禁少写一个预期指标 key → 退出码 1、磁盘 status=failed、failures 原因可读;\n 恢复后转绿。注入点必须是子门禁脚本而非子报告文件——聚合器每轮重跑子门禁会覆盖报告\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","url":"https://gitea.g-hi.com/luoanwu/base-framework/commit/db5e2c0b9e1523e5db3b74b143fae3e6725d640a","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-15T02:23:17-07:00","added":[],"removed":[],"modified":["CHANGELOG.md","CLAUDE.md","COMPATIBILITY.md","scripts/governance-report.mjs"]}],"total_commits":0,"head_commit":{"id":"23c6960de45354e3ea524f9d81ce8b9d2d2fc7af","message":"chore(reports): refresh clean static evidence @ 2ceb5d8(v0.22.0 记录提交;45 文件 / 314 静态用例)\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\n","url":"https://gitea.g-hi.com/luoanwu/base-framework/commit/23c6960de45354e3ea524f9d81ce8b9d2d2fc7af","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-15T03:57:17-07:00","added":[],"removed":[],"modified":["CLAUDE.md","reports/agent-adapters.latest.json","reports/conformance-matrix.latest.json","reports/contract-consumers.latest.json","reports/docs-truth.latest.json","reports/dual-backend-parity.latest.json","reports/fork-readiness.latest.json","reports/governance-docs.latest.json","reports/governance-rules.latest.json","reports/governance-status.latest.json","reports/governance.latest.json","reports/migrations.latest.json","reports/naming.latest.json","reports/runtime-governance.latest.json","reports/schema-sync.latest.json","reports/statemachine-write-guard.latest.json","reports/validation-source.latest.json"]},"repository":{"id":54,"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":"base-framework","full_name":"luoanwu/base-framework","description":"基础框架 monorepo","empty":false,"private":false,"fork":false,"template":false,"mirror":false,"size":5346,"language":"","languages_url":"https://gitea.g-hi.com/api/v1/repos/luoanwu/base-framework/languages","html_url":"https://gitea.g-hi.com/luoanwu/base-framework","url":"https://gitea.g-hi.com/api/v1/repos/luoanwu/base-framework","link":"","ssh_url":"git@gitea.g-hi.com:luoanwu/base-framework.git","clone_url":"https://gitea.g-hi.com/luoanwu/base-framework.git","original_url":"","website":"","stars_count":0,"forks_count":0,"watchers_count":1,"branch_count":2,"open_issues_count":0,"open_pr_counter":0,"release_counter":0,"default_branch":"main","archived":false,"created_at":"2026-07-03T12:24:18+08:00","updated_at":"2026-09-15T13:47:38+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"}}... |