| content |
{"Commits":[{"Sha1":"9dc4f3236 {"Commits":[{"Sha1":"9dc4f3236199294415bd7cb15547687667940246","Message":"chore(reports): deployed-runtime 回绑 —— 常驻容器跑的是 c0bc8c0 的镜像\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-19T06:57:37-07:00"},{"Sha1":"68438d6e12f25645ca806681c661340cf989889d","Message":"chore(reports): C12 升格影响的门禁回绑 @ 3602f99 —— 仓根十五份 + runtime 十六份 + 夹具两份\n\nreports:rebind 在干净检出里跑完 14 个零依赖门禁(含两份工作台快照),pnpm --dir runtime\ncheck:governance 重出 runtime/reports 十六份,需构建产物的 fixtures / fixture-coverage 在主工作树\n(此刻干净)重跑——rebind 明确拒收那两份。全部绑 3602f99 / dirty=false。\n\n工作台快照因此记入 notification-webhook 的新档位:form=runtime-module、模块 state=authority、\nconsumption=runtime-service,Catalog 仍 candidate_e0 / E0(authority≠E2 标注保留)。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-19T06:57:36-07:00"},{"Sha1":"3602f991ed80441050696984fc530f114a8bedfe","Message":"chore(reports): 镜像与冒烟回绑 @ c0bc8c0 —— C12 四个实现提交后重建并切换常驻运行时\n\n在 .worktrees/image-c0bc8c0 的干净检出里 image:build(enterprise-platform/runtime:c0bc8c05d14c,\nworktreeDirty=false),冒烟 6/6,up -d --no-deps runtime 切换后 healthy,check:deployed passed。\n运行面实测:/api/health 200;通知的四个端点已随控制器挂载,无凭证调 effects:classify 得 401(鉴权先拦)。\n**两个新模块的 profile 都未装**——数据未迁,装上只会制造\"已可用\"的假象。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-19T06:56:44-07:00"},{"Sha1":"c0bc8c05d14cd036625d6b44bdb7bb3d53e8f2be","Message":"feat(modules): C12 收尾三步——投递实现迁入、客户端改写、运行时与控制器落地\n\n一口气把 C11 走过的三步在 C12 上做完:\n\n**① 投递实现迁入**(288 行,原文照搬未改语义):签名、验签、重放随机数、主机白名单、可重试判定、\n模板渲染,从 runtime/clients/notification-webhook 迁到 runtime/modules/notification-webhook/src/delivery/。\n\n**② 客户端改写成远程调用**(482 → 113 行):把 notification-delivery-api.v1 的四个操作实现为对平台端点的\n调用。消费者从此不再自己持有签名密钥与出口白名单。未配置 baseUrl / 非 2xx / 返回体不合形状 / 传输异常\n四条路径都是拒绝,各有单测。clients/README 的 B 类段落随之从两项减到一项(只剩配置平台)。\n\n**③ 运行时与控制器**:kit 加 notificationWebhookRuntime 钩子;模块给实现(规则一律调 @juhai/contracts,\n一条都不在模块里重写;租户取自 principal 不从请求体取;无已批准快照时用域自带 deny-all);\n装配点加 NotificationWebhookController,四条路由挂在 /api/v1/notification-deliveries 下。\n\n**一处映射必须写实而不是编**:两个分类器返回的是字符串联合(DELIVER / DUPLICATE / DLQ / REJECT_REPLAY /\nREJECT),不带原因码。我读了规则源码才定映射:effect 的 REJECT = 入参形状不合法(标识为空、次数非正整数、\n三个布尔位不是字面布尔)→ WEBHOOK_EFFECT_ATTEMPT_INVALID;REJECT_REPLAY → WEBHOOK_REPLAY_NOT_AUTHORIZED;\nprovider 的 REJECT → PROVIDER_OUTCOME_INVALID。非拒绝的分类结果走 outcome 原样透传,**不塞进拒绝词表**。\n\n**④ 迁移与对账工具**,形态同 C11(生成 SQL + 对账,不连库)。本域最需要写明的判断是**幂等键从哪来**:\n平台的唯一键是 (tenant_id, idempotency_key),而宿主 Notification 没有这一列(它靠含 escalation_id 的五元组)。\n迁移因此确定性派生:sha256(五元组) 前 32 位 + `host:` 前缀——带前缀是为了让迁来的键与平台自生成的键一眼可分,\n用确定性哈希是因为迁移要可重跑(随机键会让 ON CONFLICT 失效、重跑翻倍)。\n对账**单列幂等键碰撞**:宿主那组唯一键里 escalation_id 可空,两条只差 ticket 的记录会撞出同一个键,\n这类必须在迁移前被人看见,不能靠 ON CONFLICT 悄悄合并成一条。\n\n门禁反向记账两条随控制器落地清掉:registry-only(前缀有控制器应答了)与一条 fixture-only\n(域规则从\"只有夹具在调\"变成有运行时消费者)。CLAUDE.md 清单 12 / 7 / 8 / 8 → **12 / 6 / 7 / 8**。\n模块单测 22 例;治理单测 480 例 479 通过 / 0 失败;contracts 416 例全过;六道门禁 passed;api-nestjs typecheck 0 error。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-19T06:54:00-07:00"},{"Sha1":"394ad9b7cd96348b1d2d83e50c9b26ddffa4a842","Message":"feat(modules): C12 两个作业处理器落地——认领+退避调度与过期认领释放\n\n- **claim-expiry 完全自洽**:只读写平台账本。释放 = claim_owner / claim_expires_at 置空、\n next_attempt_at 置为现在。**不改 attempts**——认领过期不是一次投递尝试,把它算成尝试会让一条消息\n 因为工作进程崩溃而提前耗尽重试额度。\n- **delivery-retry 只做账本侧调度**:认领、计次、按退避排下次时间;**不发请求**。外发实现(签名 / 超时 / HTTP)\n 今天仍在 runtime/clients/notification-webhook,照 C11 先例将迁入。这不是占位——调度与外发本就该分开,\n 而认领 + 退避正是\"同一条消息不被两个工作进程同时投\"的保证。\n\n认领做成**乐观抢占**:updateMany + 条件(claim 为空或已过期),并发下只有一个进程 count=1,其余拿 0 并跳过。\n用\"先读后写\"会在两个进程之间留竞态窗口——这条在 store 注释里写明了。\n退避是纯函数(base 指数增长、封顶),base/max 由路由策略给,作业不自己发明节奏。\n\nPrisma store 的每个操作都在事务里先 set_config('app.current_tenant_id', …, true)(FORCE RLS 下不设读不到;\ntrue 限定本事务内,避免连接复用带租户)。描述符同批补 health 真检查项(database up/down)。\n\n单测 5 例:三条失败关闭前提、认领成功才记尝试且退避指数封顶、已被他人认领则跳过且不记尝试、\n过期认领释放且不动 attempts、退避纯函数取值。\ncheck:stub-surface 反向逼着删两条桩登记,CLAUDE.md 桩数 14 → 12;治理单测 480 例 479 通过 / 0 失败。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-19T06:39:06-07:00"}],"HeadCommit":{"Sha1":"9dc4f3236199294415bd7cb15547687667940246","Message":"chore(reports): deployed-runtime 回绑 —— 常驻容器跑的是 c0bc8c0 的镜像\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-09-19T06:57:37-07:00"},"CompareURL":"luoanwu/enterprise-platform/compare/3b55095e3aac481fdce7fde36f0dcc24309d5ef4...9dc4f3236199294415bd7cb15547687667940246","Len":7}... |