|
887
|
146
|
2
|
1
|
|
0
|
1
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1793614942
|
1793614948
|
1793614948
|
0
|
0
|
0
|
Edit
Delete
|
|
843
|
146
|
1
|
1
|
|
0
|
php8.3
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1793066913
|
1793066921
|
1793066921
|
0
|
0
|
0
|
Edit
Delete
|
|
894
|
144
|
2
|
1
|
|
0
|
0915 版本内容
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1793695809
|
1793695849
|
1793695849
|
0
|
0
|
0
|
Edit
Delete
|
|
889
|
144
|
1
|
1
|
|
0
|
1
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1793673556
|
1793673561
|
1793673561
|
0
|
0
|
0
|
Edit
Delete
|
|
893
|
143
|
1
|
1
|
|
0
|
0915版本
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1793695768
|
1793695782
|
1793695782
|
0
|
0
|
0
|
Edit
Delete
|
|
823
|
124
|
17
|
5
|
|
0
|
feat(AC79): move video wall layout controls into t feat(AC79): move video wall layout controls into the domain and add evidence...
|
AC79 (HQR04) was the only non-external acceptance AC79 (HQR04) was the only non-external acceptance case without named
evidence: group/flat, 4/9/16, paging, sorting and rotation switches must
keep the scope, and mobile focus/return must stay reachable.
- hq-wall-domain: wallControl() owns slots/sort/pin/mode/page/tour changes
and never touches store, region, type or point scope; wallSections()
derives group/flat sections for the current page.
- HeadquartersConsole/VideoWall use them instead of inline setters; the
behavior is unchanged (layout, risk-first, manual paging, focus and talk
stop rotation; group/flat keeps the page; sort/pin/layout reset to page 1).
- New AC79 test walks every switch over three scopes and checks each page
covers the scope exactly once; AC79 maps to it.
- Browser (store dev server, demo data): 北区 scope stayed 12 cameras/3
stores through 4->flat->risk->16; next-page stopped rotation; at 375px,
focus moved to the detail panel and return restored scroll and the
original focus button.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>...
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1791589290
|
1791589300
|
1791589300
|
0
|
0
|
0
|
Edit
Delete
|
|
822
|
124
|
16
|
5
|
|
0
|
docs: 开发默认值口头确认,并刷新验收矩阵
|
- required-business-decisions.md:开发默认值表标为“2026-10- - required-business-decisions.md:开发默认值表标为“2026-10-09 已口头确认,待正式审批记录”,包括秒杀迟到支付转人工退款核对、转写中断片段不能校对两条补充规则;仍待定的部分(门店地址随 BD01、暂锁到期是否通知、可校对岗位、真实开票能力)单独写明。
- 这只是口头确认:代码里的策略仍是 approved:false,要等正式批准记录到位后再改;没有启用任何真实支付、设备、平台、开票或语音识别能力。
- 重新生成验收矩阵:#12/#13 合并后 main 上的矩阵已过期,重跑 903/903 通过,--check 恢复为 0。
🤖 Generated with [Claude Code](https://claude.com/claude-code)...
|
0
|
0
|
0
|
1
|
0
|
|
0
|
1791588968
|
1791588968
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
821
|
124
|
15
|
5
|
|
0
|
docs: record verbal confirmation of development de docs: record verbal confirmation of development defaults (2026-10-09)...
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1791561736
|
1791561742
|
1791561742
|
0
|
0
|
0
|
Edit
Delete
|
|
820
|
124
|
14
|
5
|
|
0
|
Merge remote-tracking branch 'origin/main' Merge remote-tracking branch 'origin/main' into claude/vid01-adv03...
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1791560682
|
1791560687
|
1791560687
|
0
|
0
|
0
|
Edit
Delete
|
|
819
|
124
|
13
|
5
|
|
0
|
feat(GOV01): allow 90-day development registration feat(GOV01): allow 90-day development registration renewals and renew again...
|
At the user's request the renewal cap and defa At the user's request the renewal cap and default go from 30 to 90 days
(DEVELOPMENT_RENEWAL_MAX_DAYS); first-time generation still issues 30 days.
Renewed the fixture again with the same identities: bindings now expire
2027-01-07T15:38:57Z. Both renewals are recorded in `renewals`.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>...
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1791560579
|
1791560584
|
1791560584
|
0
|
0
|
0
|
Edit
Delete
|
|
818
|
124
|
12
|
5
|
|
0
|
feat(GOV01): renew development test registration w feat(GOV01): renew development test registration without rotating identities...
|
The registered development scope had no renewal pa The registered development scope had no renewal path: rerunning the script
only re-validated the file, and bindings expire 30 days after generation.
- renewDevelopmentRegistration() keeps tenant, store, registration, binding
and person UUIDs; only active bindings get expiresAt = now + days
(1-30, default 30). Revoked/suspended people are never revived. Each
renewal records time, authorization and previous expiry in `renewals`.
- ops/register-development-test-scope.mjs --renew "<authorization>".
- Renewed the fixture once: 2026-11-07T02:15Z -> 2026-11-08T15:33Z.
- Running registered gateways read their release copy and need a redeploy.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>...
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1791560333
|
1791560339
|
1791560339
|
0
|
0
|
0
|
Edit
Delete
|
|
817
|
124
|
11
|
5
|
|
0
|
test: dedicated evidence for 14 P1/P2 requirements test: dedicated evidence for 14 P1/P2 requirements and strict licence dates...
|
|
0
|
0
|
0
|
1
|
0
|
|
0
|
1791559480
|
1791559480
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
816
|
124
|
10
|
5
|
|
0
|
test: dedicated evidence for 14 P1/P2 requirements test: dedicated evidence for 14 P1/P2 requirements and strict licence dates...
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1791559454
|
1791559459
|
1791559459
|
0
|
0
|
0
|
Edit
Delete
|
|
815
|
124
|
9
|
5
|
|
0
|
test: move remaining hardcoded booking fixtures on test: move remaining hardcoded booking fixtures onto future dates...
|
The CRM04/BRD04 20:30 failures were already fixed The CRM04/BRD04 20:30 failures were already fixed on main (3e41516,
4941806). Running the self-contained suites under a shifted clock found
two more booking fixtures that would start failing once their date passed:
- composition-fixtures.mjs booked 2026-10-20, so all seven PER07 tests
fail from 20:30 Asia/Shanghai that day.
- prototype-enhancement.persistence.test.mjs defaulted to 2026-10-12 and
used 10-13/14/15 for its other bookings.
Both now go through futureBookingDate(), which keeps weekdays and distinct
dates while staying ahead of the server day.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>...
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1791559271
|
1791559275
|
1791559275
|
0
|
0
|
0
|
Edit
Delete
|
|
814
|
124
|
8
|
5
|
|
0
|
fix(AUD-EXIT): keep fulfilling original obligation fix(AUD-EXIT): keep fulfilling original obligations after cooperation exit...
|
Exit used to freeze an exiting cooperation: delive Exit used to freeze an exiting cooperation: deliveries were rejected, so
open promises had no continued-handling path (ALI01, AC30).
- deliver accepts active or exiting cooperations, still capped by each
original obligation; after-exit entries are tagged phase:'after-exit'
with the acting principal.
- exit records which obligations were open at that moment; there is still
no action that adds new obligations, and approve stays draft-only.
- new completeExit moves exiting -> exited only when every original
obligation is delivered (OBLIGATIONS_OPEN otherwise); exited rejects
further deliveries. Finance reconcile is unaffected and funds remain
unverified.
- store workbench mirrors the rules and adds a 完成退出 action.
- ALI01/AC30 named test mapping for the new rule test.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>...
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1791559039
|
1791559044
|
1791559044
|
0
|
0
|
0
|
Edit
Delete
|
|
813
|
124
|
7
|
5
|
|
0
|
test: prepare CON01 sandbox sign-off for booking s test: prepare CON01 sandbox sign-off for booking slots...
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1791558679
|
1791558684
|
1791558684
|
0
|
0
|
0
|
Edit
Delete
|
|
812
|
124
|
6
|
5
|
|
0
|
feat(SUP01): public FAQ and pre-booking customer h feat(SUP01): public FAQ and pre-booking customer help on current main...
|
Port the public FAQ, pre-booking general help and Port the public FAQ, pre-booking general help and original help-record
targeting from codex/ktv-delivery-integration (5d56fcc) onto main's
consumer workspace reader (f295ce8), instead of the older readSerial guard.
- Signed-out and no-booking customers can open the FAQ; it exposes no
customer, store, price or device facts.
- Signed-in customers without a booking can save a store-level general
help request; payment/redeem/door topics still require the original
booking. Results reuse independent review and customer confirmation.
- Receipts locate the exact original help record; help drafts and result
notes are cleared only within the same identity and help scope.
- SUP01 gets named test mappings (consumer-help, prototype-enhancement,
persistence).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>...
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1791558540
|
1791558556
|
1791558556
|
0
|
0
|
0
|
Edit
Delete
|
|
811
|
124
|
5
|
5
|
|
0
|
feat: add review invitation guardrail to manager c feat: add review invitation guardrail to manager cockpit (SCO11)...
|
基于 PR #2(`claude/sco11-invite`,已包含 PR #3)。PR #2 合并 基于 PR #2(`claude/sco11-invite`,已包含 PR #3)。PR #2 合并后,请把本 PR 的目标改为 `main`。
## 内容
- **14 项 P0 逐条证据**:为 CON03、SELF04/05/08/09/12、JRN01/03–06、CLN03、INS03、OPN02 补 58 条测试,不改源码。查到的缺口写入 `docs/acceptance-unimplemented.md`,例如:上一场私人欢迎和素材的清除逻辑缺失、限制名单没有批准生效动作、经营指标是固定样例、没有节假日价格日历
- **GRP06 拼团**(活动执行页)
- 规则须经 D29 批准才能开团
- 参与时校验团版本,防止并发超额
- 成团只产生"已成团待预约",预约另查容量,且不等于入场
- 未成团时逐人生成"待退款核对",不自动退款
- **GAM05 奖品额度**(活动执行页)
- 额度负责人、成本负责人、单价没登记就不能发奖
- 多个活动共用一个奖品池,数量和预算都不超
- 参与授权与音视频宣传授权分开
- **外部对接推进清单** `docs/integration-readiness.md`:按卡住的 P0 数量排序,列出每项依赖要业务方提供什么、接通前怎么降级、由哪个工程包承接
- 验收矩阵:未实现 2 项 → 0 项;有命名证据的需求 165 → 179
## 验证
- 原型测试 369/370:唯一失败是缺 `dist` 构建产物的打包测试
- `node ops/check-acceptance.mjs --check`、`node ops/sync-package-status.mjs --check`、`python3 scripts/verify-development-plan.py` 均通过
- 拼团与奖品两条流程已在浏览器中走通,控制台无报错
## 注意
- 所有拼团规则与奖品参数都是演示值,要等 D29 和 GAM05 的负责人确定后才能正式使用
- 签认仍为 0;30 项 P0 需等外部对接
🤖 Generated with [Claude Code](https://claude.com/claude-code)...
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1791510471
|
1791510481
|
1791510481
|
0
|
0
|
0
|
Edit
Delete
|
|
810
|
124
|
4
|
5
|
|
0
|
test: add clause-level evidence for 14 thinly cove test: add clause-level evidence for 14 thinly covered P0 requirements...
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1791510359
|
1791510367
|
1791510367
|
0
|
0
|
0
|
Edit
Delete
|
|
809
|
124
|
3
|
5
|
|
0
|
feat: 补齐 9 项需求的原型规则与证据(HQR04 REV04 MKT05 LEA04 INS feat: 补齐 9 项需求的原型规则与证据(HQR04 REV04 MKT05 LEA04 INS05 SUP06 STO05 ALI05 DAT03)...
|
基于 PR #2(`claude/sco11-invite`)。PR #2 合并后请将目标分支改为 基于 PR #2(`claude/sco11-invite`)。PR #2 合并后请将目标分支改为 `main`。
## 内容
- **HQR04 视频墙**:筛选、排序、分页、轮巡规则抽到 `hq-wall-domain.mjs`,页面行为不变
- **REV04 评价统计**:按周趋势并注明覆盖范围、处理时长中位数和 P90、整改后复发、是否能宣称口碑提升
- **MKT05 活动复盘**:继续、调整、扩大、暂停、停止建议,标注为关联观察,不计算增量;复盘决定会联动门店活动执行
- **LEA04 线索分析**:去重、只计可靠关联的转化、跟进及时性、渠道费用核对后才算获客成本、观察期满才计流失
- **INS05 巡检分析**:计划完成、整改耗时(算到独立核实)、复发、交接;每个指标可追溯到来源记录;只看关闭数量时给出提醒
- **SUP06 辅助答复**:知识只管措辞且有版本;状态句只取自已查询的业务事实;事实无法确认时转人工;发送须客服确认
- **STO05 跨店替代**:冻结原承诺快照;顾客明确选择;补差须单独同意;目标店独立接收后责任才转移
- **ALI05 合作素材**:素材授权核验,缺授权、渠道不符或过期则拒绝验收;合作费用单列;合作复盘只计明确关联
- **DAT03 品牌指标**:曝光、态度、消费、复购四项并列;复购须整组观察期满才给比率;缺来源显示空值而不是 0
## 验证
- 原型测试 303/304:唯一失败是缺 `dist` 构建产物的打包测试
- 服务端可独立运行的测试 363/366:3 个失败是本工作区未编译框架 `dist`,与本改动无关
- `node ops/check-acceptance.mjs --check`、`node ops/sync-package-status.mjs --check`、`python3 scripts/verify-development-plan.py` 均通过
- 每项都在浏览器中走通主流程,控制台无报错
## 注意
- 改动到共享代码的地方:
- `services/ktv/application.mjs`:活动状态联动改用共享函数 `linkedActivityStatus`
- 合作验收新增素材授权检查:种子素材已补授权,原有流程测试不受影响
- 所有阈值和演示数据都标为演示参数,待 D19、D25 等决策确认;真实渠道和数据源仍依赖 DEP09、DEP15
🤖 Generated with [Claude Code](https://claude.com/claude-code)...
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1791508977
|
1791508987
|
1791508987
|
0
|
0
|
0
|
Edit
Delete
|
|
808
|
124
|
2
|
5
|
|
0
|
feat: add review invitation guardrail to manager c feat: add review invitation guardrail to manager cockpit (SCO11)...
|
## 内容
- **SCO11 评价邀请话术护栏**:五类演示规则(诱导好评、利益换评价、删改差评 ## 内容
- **SCO11 评价邀请话术护栏**:五类演示规则(诱导好评、利益换评价、删改差评、截图回传、施压),先规整全角、空格、符号再匹配防绕过;总部独立审核,审核时复查;邀请任务只能用已审核版本完成
- **CLN04 遗失物品**(远程运营台 → 事件与售后)
- 保洁只能从本人进行中的保洁单登记,范围限清洁可见区域
- 运营确认保管,贵重物品入加锁柜,保管链留痕
- 凭同包厢订单或人工依据认领,只存打码电话
- 移交本人、代领(证件除外)、警方或平台;到期处置不能由登记人操作
- **MKT01 活动计划**:客群、门店、责任人、周期、停止条件在批准前必填(草稿可不完整,兼容持久化服务的创建调用);周期外或非适用门店拒绝预约与投放
- **测试证据**:11 项只有模块、没有测试的需求补 45 条测试;GRP06 拼团无代码,改判为未实现;各项"已证明 / 仍缺"见 `docs/acceptance-unimplemented.md`
- **任务包状态**:新增 `ops/sync-package-status.mjs`,从验收矩阵算出状态,写入开发计划追踪和任务包矩阵(文档 22),带 `--check`
## 验证
- 原型测试 255/256:唯一失败是缺 `dist` 构建产物的打包测试
- 服务端可独立运行的测试 363/366:3 个失败是本工作区未编译框架 `dist`,与本改动无关
- `node ops/check-acceptance.mjs --check`、`node ops/sync-package-status.mjs --check`、`python3 scripts/verify-development-plan.py` 均通过
- 矩阵:127 项部分实现、2 项未实现(GAM05、GRP06)、83 项外部依赖、0 签认
- 浏览器验证:话术拦截与审核、遗失物品全流程、活动计划缺项拦截与批准
## 注意
- 话术规则、保管期 30 天、停止条件均为演示参数,待 D35 和门店政策确认
- 合并后如果再改源文件或测试:先运行 `node ops/sync-package-status.mjs`,再运行 `node ops/check-acceptance.mjs` 重新生成矩阵
🤖 Generated with [Claude Code](https://claude.com/claude-code)...
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1791470731
|
1791510657
|
1791510657
|
0
|
0
|
0
|
Edit
Delete
|
|
807
|
124
|
1
|
5
|
|
0
|
feat: add store manager cockpit prototype (tasks, feat: add store manager cockpit prototype (tasks, board, leaderboard)...
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1791453499
|
1791453507
|
1791453507
|
0
|
0
|
0
|
Edit
Delete
|
|
806
|
121
|
4
|
5
|
|
0
|
untracked files on codex/resource-health-axis: 5ef untracked files on codex/resource-health-axis: 5ef0d78 feat(integration): prepare trusted external SalesOrder fact inbox...
|
|
0
|
0
|
0
|
1
|
0
|
|
0
|
1790675336
|
1790675336
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
805
|
121
|
3
|
5
|
|
0
|
untracked files on codex/resource-health-axis: f0f untracked files on codex/resource-health-axis: f0ff3df docs(scope): 重梳 V1.0 三图与31章开发缺口...
|
|
0
|
0
|
0
|
1
|
0
|
|
0
|
1790675329
|
1790675330
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
804
|
121
|
2
|
5
|
|
0
|
feat(work): gate Task on latest confirmed Outcome
|
|
0
|
0
|
0
|
1
|
0
|
|
0
|
1790675319
|
1790675319
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
803
|
121
|
1
|
5
|
|
0
|
wip(K3.3): PolicyDefinition — preserved snapshot o wip(K3.3): PolicyDefinition — preserved snapshot of uncommitted work (base 0.71, not for merge)...
|
Preservation snapshot (R0, 2026-09-29) of work tha Preservation snapshot (R0, 2026-09-29) of work that only existed as uncommitted changes in a /tmp worktree.
Nothing here was verified by this commit: no tests were ever written for it and it was not run against a database.
What the snapshot contains:
- sql/072_policy_definition.sql: governance.policy_definition_version (EXECUTION_AUTHORIZATION with maxTtlSeconds),
a ten-state lifecycle, immutable content, one ACTIVE version per tenant and type, FORCE RLS; also replaces the
authority_assignment action CHECK with governance.manage_policy / governance.approve_policy added. The file header
is a copy of the K3.2 header.
- src/contexts/policy-definition.js: the PolicyDefinition commands (create, validate, request review, approve,
reject, publish, activate, deprecate, retire, revoke) with self-approval denial and authority checks.
- registrations in commands.js, owner-roles.js, rejection-target.js, kernel.js, catalog and the payload / event
contracts.
Known state when preserved:
- Based on 0490b8e (0.71). Main is 0.103.x with migrations up to 095; 072 already exists there
(072_task_case_correlation_immutable), so the migration must be renumbered, and kernel.js / catalog / contracts
will need a real rebase.
- Missing for the slice: tests, contract document, smoke, and the binding of a GovernanceDecision to the active
policy version with drift rejection (K3.3b).
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>...
|
0
|
0
|
0
|
1
|
0
|
|
0
|
1790675308
|
1790675308
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
892
|
116
|
13
|
5
|
|
0
|
chore(reports): adopt Runtime static originals at chore(reports): adopt Runtime static originals at dc13b515 and clarify evidence snapshot...
|
|
0
|
0
|
0
|
1
|
0
|
|
0
|
1793674166
|
1793710134
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
891
|
116
|
12
|
5
|
|
0
|
docs: archive IdentityWeb launcher preparation and docs: archive IdentityWeb launcher preparation and independent v2 evidence...
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1793674146
|
1793674154
|
1793674154
|
0
|
0
|
0
|
Edit
Delete
|
|
890
|
116
|
11
|
5
|
|
0
|
feat(payment): add candidate provider port and det feat(payment): add candidate provider port and deterministic simulator; verify pure Node safety cases...
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1793674092
|
1793674128
|
1793674128
|
0
|
0
|
0
|
Edit
Delete
|
|
888
|
116
|
10
|
5
|
|
0
|
docs(credential): 补齐恢复与生产签收待签材料
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1793617972
|
1793617980
|
1793617980
|
0
|
0
|
0
|
Edit
Delete
|
|
886
|
116
|
9
|
5
|
|
0
|
docs(credential): 补齐M2真实请求键与双侧授权验收前置
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1793610828
|
1793610838
|
1793610838
|
0
|
0
|
0
|
Edit
Delete
|
|
885
|
116
|
8
|
5
|
|
0
|
feat(notification): bind signing credentials to co feat(notification): bind signing credentials to controlled M2 access...
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1793610788
|
1793610798
|
1793610798
|
0
|
0
|
0
|
Edit
Delete
|
|
884
|
116
|
7
|
5
|
|
0
|
docs(permission): preserve natural idle discard ev docs(permission): preserve natural idle discard evidence and incomplete recovery...
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1793605980
|
1793605990
|
1793605990
|
0
|
0
|
0
|
Edit
Delete
|
|
883
|
116
|
6
|
5
|
|
0
|
fix(notification-client): bind delivery receipts a fix(notification-client): bind delivery receipts and prepare remaining stage inputs...
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1793605952
|
1793605961
|
1793605961
|
0
|
0
|
0
|
Edit
Delete
|
|
881
|
116
|
5
|
5
|
|
0
|
ci(diagnostic): 只读核对现有runner的维护边界
|
|
0
|
0
|
0
|
1
|
0
|
|
0
|
1793581907
|
1793596652
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
870
|
116
|
4
|
5
|
|
0
|
docs(release): R1 运行器与分支保护变更规格(rc.8 合规发布前置)
|
## 内容
给现役 Gitea / runner 维护者的逐项变更规格,作为 `@juhai/ ## 内容
给现役 Gitea / runner 维护者的逐项变更规格,作为 `@juhai/*` 发布列车 `1.0.0-rc.8` 走合规通道(同源 main 合格 Platform CI → clean tag → `.gitea/workflows/publish-packages.yml`)的前置(R1)。
- 新增 `docs/R1运行器与分支保护变更规格-2026-10-28.md`:
1. Gitea 升到含上游 PR #37119(ActionRunAttempt)的正式版,`MAX_RERUN_ATTEMPTS ≥ 2`,升级前一致性备份与隔离恢复;
2. act_runner 升到下发真实 `GITHUB_RUN_ATTEMPT` 的版本,保持 `ubuntu-latest`、Docker、github.com 访问与 fork Secret 隔离;
3. main 保护 9 个字段逐一对应 `governance/lib/release-ci.mjs` 第 30–31 行;
4. 交付后验收顺序与 rc.8 发布步骤。
- `docs/正式发布材料待办-2026-10-10.md` 顶部加指针。
## 依据(2026-10-28 PDT 只读实测)
- main 最近 15 次 Platform run 全部 failure,均在第一步「Candidate tag」因 `GITHUB_RUN_ATTEMPT` 缺失失败关闭(例:run 26610 @ `485db734d`,`run_attempt=0`,`attempts/1` → 404);runner act_runner v0.2.13;版本 API 仅返回 `development`。
- `branch_protections` 为空列表。
## 影响提示
启用 main 保护后禁止直推(10-21 起 main 首父链 492 个提交中约 435 个为直推),所有会话须改走 PR,且每个 PR 要通过完整 Platform CI;规格要求先有一个 PR 全绿再落规则,避免锁死 main。
## 边界
只改文档;发布门不变,未恢复本地旁路(G-12),未打 tag、未写 Registry、未改服务。`pnpm check:doc-claims` 通过。
🤖 Generated with [Claude Code](https://claude.com/claude-code)...
|
0
|
0
|
0
|
1
|
0
|
|
0
|
1793191041
|
1793191041
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
842
|
116
|
3
|
5
|
|
0
|
fix(channel-sdk): bound response bodies and reject fix(channel-sdk): bound response bodies and reject redirected results...
|
|
0
|
0
|
0
|
1
|
0
|
|
0
|
1792411267
|
1792411267
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
841
|
116
|
2
|
5
|
|
0
|
fix(credential-sdk): harden bounded responses and fix(credential-sdk): harden bounded responses and redirect cleanup...
|
|
0
|
0
|
0
|
1
|
0
|
|
0
|
1792411245
|
1792411245
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
790
|
116
|
1
|
5
|
|
0
|
fix(contracts): 注册中心规则补失败关闭与摘要规范化——三个入口此前抛 TypeErr fix(contracts): 注册中心规则补失败关闭与摘要规范化——三个入口此前抛 TypeError,同一摘要的两种写法此前分叉成两个复核键...
|
蓝图 docs/domain/registry-snapshot-blueprint.md 从迁入起 蓝图 docs/domain/registry-snapshot-blueprint.md 从迁入起就写着「失败关闭」与
「review key 仅用于人工复核幂等」两条不变量,实测三处不成立。本次按蓝图自己的口径补齐,
改动只在 contracts/src/domain/application-contract-registry/:不新增写入点、不新增宿主、
不动 Catalog 与 Schema,每条输出仍固定 activationAllowed=false / registryWriteAllowed=false /
humanApprovalRequired=true。
1. 失败关闭:assessRegistrySnapshot / assessRegistryTransition /
reviewCandidateSnapshotUpgrade 对畸形输入抛 TypeError(快照缺字段、now 不是 Date、
decisions 整个缺失都会抛),四个入口里只有 LocalManifestAdmissionPlanner.plan 是
失败关闭的。现四个入口一致返回 REJECT + 原因码。这不是洁癖:check-fixtures 把抛出当
配置错误处理,实测一次 TypeError 会让整套 15 例逐例判定塌成一条 configuration 失败。
2. 十六进制引用规范化:digest / commit 的正则带 /i 收大小写两种写法,比较与入键却
大小写敏感——同一摘要写成大写会得到另一个 reviewIdempotencyKey,同版本大小写翻转被判成
SAME_VERSION_DIGEST_CHANGED,大写回滚 pin 被判成 ROLLBACK_PIN_MUST_MATCH_CURRENT。
现一律规范化为小写后再比较、再入键,ACCEPT 回吐规范化后的值。
3. 版本文法收敛:一个模块三套(快照流与清单准入用 \d+\.\d+\.\d+,升级复核用严格 SemVer),
新增 registry-primitives.ts 作单一来源,含预发布序;DEC-009—012 此前在两份文件各写一份,
一并收敛。snapshot-upgrade-review.ts 因此净减约 60 行重复实现。
两处语义变化(蓝图新增一节已如实登记):
- 收紧:1.02.0 这类前导零版本此前被放行,现在拒;assessRegistrySnapshot 另开始拒 latest
这类可变标签——此前它能过体检却必然过不了迁移规则。
- 放宽:1.0.0-rc.1 这类预发布版本此前被快照流整条挡在外面,现在按 SemVer 序参与迁移。
平台自己发的就是 1.0.0-rc.N,升级复核那一侧本来就这么判。风险面有限:本模块所有出口
都不激活、不写 Registry,多进人工复核队列不等于多放行制品。
证据(本分支隔离工作树,clean):注册中心单测 44/44(原 34 + 加固 10);
contracts check:local 302/302;check:fixtures 九个契约域套件 100 例 0 失败,
其中本套件 15 例(正 4 / 反 11,原 8 例)。篡改必红实测两次:sameHexRef 退回大小写敏感
→ 单测 1 红 + 夹具 P03 红;去掉快照入口守卫 → 整套塌成 0 例 1 配置失败。
仍为仓内候选 sdk_e2,不代表正式 Registry、Snapshot 发布或跨仓 Required Check 已上线。
清单登记的 C01.04 / C01.06 是「接线」型缺口且前置 Q01 运行宿主未裁,本次未动。
reports/fixtures.latest.json 未回绑:它是 17 套件的聚合报告,只跑 9 个套件去覆盖会缩小结论面,
应在整批(含并行会话的 public-file / IM / 跨域流程改动)落定后统一重跑回绑。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>...
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1789742918
|
1790248458
|
1789742925
|
0
|
0
|
0
|
Edit
Delete
|
|
773
|
85
|
8
|
4
|
|
0
|
按省市统计设备月度新增上线数量报表
|
## 功能概述
在 PC 管理后台「数据报表」模块,按省市统计各 KTV 设备每月新增上线数量,支 ## 功能概述
在 PC 管理后台「数据报表」模块,按省市统计各 KTV 设备每月新增上线数量,支持全国省份分布视图 + 城市下钻。
## 完整产物链路
| 阶段 | 产物 | 链接 | 状态 |
|------|------|------|------|
| 需求意图 | Intent 文档 | PR #1 | ✅ 已合并 |
| 设计原型 | Design 文档 | PR #3 | ✅ 已合并 |
| 技术方案(后台) | Plan 文档 | PR #6 | ✅ 已合并 |
| 开发实现(后台) | admin 仓库代码 | admin PR #1 | ✅ 已合并 |
| 开发实现(Web前端) | admin 仓库代码 | admin PR #2 | ✅ 已合并 |
| 测试验收 | — | 本 Issue | 🧪 待测试 |
## 验收标准
- 后台 API 返回省份/城市维度的月度新增上线设备数,分页正确
- PC 管理后台菜单「数据报表 > 设备上线分布」可正常点击进入
- 省份视图正常渲染(横向柱状图),点击下钻到城市视图
- 城市视图面包屑可返回全国
- 月份切换后数据刷新正确
- 无数据月份显示空状态,不报错...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1789379887
|
1789380277
|
0
|
0
|
2
|
0
|
Edit
Delete
|
|
770
|
85
|
7
|
4
|
|
0
|
[Skill] build-complete 新增接口文档归档步骤
|
Related to #8
## 说明
在 `build-complete` skill 里新增 Related to #8
## 说明
在 `build-complete` skill 里新增一步:Plan 阶段确定接口设计后、代码开发完成时,如涉及新增/修改接口,需要生成并归档接口文档:
- Apifox(规范化 OpenAPI 文档,Claude 通过 API 增量导入)
- `docs/frontend-specs/<功能名>.md`(面向其他端的对接说明文档,固定五章结构)
背景:issue #4 实现完成后发现接口文档一直没有归档,靠事后补做;这次把它固化成流程里的正式一步,插在"提交 plan.md"和"开代码 PR"之间。
同时补充了代码仓库与 jh-project 分离时的注意事项(milestone/label 可能不存在、Close #N 跨仓库不生效)。...
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1788247386
|
1789379900
|
1788247940
|
0
|
1
|
0
|
Edit
Delete
|
|
768
|
85
|
6
|
4
|
|
0
|
[Plan] 按省市统计设备月度新增上线数量报表 (后台管理)
|
Related to #8
## 关联 Issue
[#4 — [后台] 按省市统计设备月度新增 Related to #8
## 关联 Issue
[#4 — [后台] 按省市统计设备月度新增上线数量报表](https://gitea.g-hi.com/laiqiaojie/jh-project/issues/4)
## 说明
补交 Plan 阶段产物(此前误提交到已合并关闭的 design 分支,未能进入 main,见此 PR 重新提交)。
代码已实现并提交:[laiqiaojie/admin#1](https://gitea.g-hi.com/laiqiaojie/admin/pulls/1)
按 REVIEW.md「跳过评审的路径」,`plan/` 产物文件不需要 Tech Lead 单独审核,随此 PR 直接入库。...
|
0
|
0
|
1
|
1
|
1
|
|
0
|
1788245555
|
1789379899
|
1788245966
|
0
|
1
|
0
|
Edit
Delete
|
|
760
|
85
|
5
|
4
|
|
0
|
[Web] 按省市统计设备月度新增上线数量报表
|
> 子任务,属于主 Issue #8「按省市统计设备月度新增上线数量报表」
## 关联 De > 子任务,属于主 Issue #8「按省市统计设备月度新增上线数量报表」
## 关联 Design PR
[PR #3 — Design: 按省市统计设备月度新增上线数量报表](https://gitea.g-hi.com/laiqiaojie/jh-project/pulls/3)
## 工作范围
负责 Web 前端页面实现:
- 数据报表 → 设备上线分布 页面
- 月份筛选器 + 当月总数卡片 + 省份横向柱状图
- 点击省份下钻到城市视图,支持面包屑返回
## 产物
- plan/device-online-stats-by-region-web.md(实现前提交,Tech Lead 审核后开始 Build)
## 参考
- 需求说明:[design/device-online-stats-by-region.md](https://gitea.g-hi.com/laiqiaojie/jh-project/src/branch/design/device-online-stats-by-region/design/device-online-stats-by-region.md)
- 在线原型:https://claude.ai/code/artifact/b50eaa98-689b-4742-8024-cdf74f95d5c8...
|
1
|
0
|
1
|
0
|
3
|
|
0
|
1787909556
|
1789380193
|
1789380193
|
0
|
1
|
0
|
Edit
Delete
|
|
759
|
85
|
4
|
4
|
|
0
|
[后台] 按省市统计设备月度新增上线数量报表
|
> 子任务,属于主 Issue #8「按省市统计设备月度新增上线数量报表」
## 关联 De > 子任务,属于主 Issue #8「按省市统计设备月度新增上线数量报表」
## 关联 Design PR
[PR #3 — Design: 按省市统计设备月度新增上线数量报表](https://gitea.g-hi.com/laiqiaojie/jh-project/pulls/3)
## 工作范围
负责后台接口实现:
- 新增查询接口,按月份统计各省份新增上线设备数量
- 支持下钻查询:指定省份,返回城市级别数据
- 按权限过滤:超管返回全国数据,运营商返回自己区域
## 产物
- (实现前提交,Tech Lead 审核后开始 Build)
## 参考
- 需求说明:[design/device-online-stats-by-region.md](https://gitea.g-hi.com/laiqiaojie/jh-project/src/branch/design/device-online-stats-by-region/design/device-online-stats-by-region.md)
- 在线原型:https://claude.ai/code/artifact/b50eaa98-689b-4742-8024-cdf74f95d5c8...
|
1
|
0
|
1
|
0
|
2
|
|
0
|
1787909526
|
1789380193
|
1789380193
|
0
|
1
|
0
|
Edit
Delete
|
|
758
|
85
|
3
|
4
|
|
0
|
[Design] 按省市统计设备月度新增上线数量报表
|
Related to #8
## 关联 Intent
[PR #1 — 按省市统计设备月度新增上 Related to #8
## 关联 Intent
[PR #1 — 按省市统计设备月度新增上线数量报表](https://gitea.g-hi.com/laiqiaojie/jh-project/pulls/1)
---
## PM 确认原型
**需求说明文档:**
[design/device-online-stats-by-region.md](https://gitea.g-hi.com/laiqiaojie/jh-project/src/branch/design/device-online-stats-by-region/design/device-online-stats-by-region.md)
**在线原型(点击直接打开,可交互,无需登录):**
https://claude.ai/code/artifact/b50eaa98-689b-4742-8024-cdf74f95d5c8
**页面状态:**
- 全国省份视图 — 月份筛选器 + 当月总数卡片 + 各省份横向柱状图
- 城市下钻视图 — 点击省份柱子进入,面包屑「全国 › 广东省」+ 城市排行
**交互流程:** 点击省份柱子进入城市视图,点击面包屑「全国」或「返回全国」按钮返回。
**审核 checklist:**
- [ ] 页面布局和组件符合预期?
- [ ] 交互路径(下钻、返回)正确?
- [ ] 数据定义(新增上线 = 首次上线,归属 = 门店注册地址)理解一致?
- [ ] 权限范围(超管看全国,运营商看自己区域)正确?
**确认方式:在本 PR 评论「原型确认 ✅」,然后 Approve + Merge**...
|
1
|
0
|
1
|
1
|
0
|
|
0
|
1787829439
|
1789379899
|
1787908921
|
0
|
7
|
0
|
Edit
Delete
|
|
757
|
85
|
2
|
4
|
|
0
|
[Design] 按省市统计设备月度新增上线数量报表
|
## 关联 Intent
[PR #1 — 按省市统计设备月度新增上线数量报表](https:// ## 关联 Intent
[PR #1 — 按省市统计设备月度新增上线数量报表](https://gitea.g-hi.com/laiqiaojie/jh-project/pulls/1)
---
## 审核顺序:PM 先确认原型,再由 Tech Lead Approve
---
## 第一步:PM 确认原型
**原型文件:**
(从仓库拉取后浏览器直接双击打开,可点击交互)
页面状态:
- 全国省份视图 — 月份筛选器 + 当月总数卡片 + 各省份横向柱状图
- 城市下钻视图 — 点击省份柱子进入,面包屑「全国 › 广东省」+ 城市排行
交互流程:点击省份柱子进入城市视图,点击面包屑「全国」或「返回全国」按钮返回。
**PM 审核 checklist:**
- [ ] 页面布局和组件符合预期?
- [ ] 交互路径(下钻、返回)正确?
- [ ] 数据定义(新增上线 = 首次激活,归属 = 门店地址)理解一致?
- [ ] 权限范围(超管看全国,运营商看自己区域)正确?
**PM 确认方式:在本 PR 评论「原型确认 ✅」即可,无需 Approve**
---
## 第二步:Tech Lead 审核(PM 确认后进行)
**数据链路:**
> 待确认:ahead_family_servers._shop_id 是否关联 ahead_yc_shop._id,Build 阶段查库验证。
**新增接口(新建控制器 DeviceOnlineReport.php):**
- POST /DeviceOnlineReport/getStats — 省份排行 + 当月总数
- POST /DeviceOnlineReport/getCityStats — 城市下钻
**权限:** agent_id 从 session 取,= 0 为超管不过滤
**安全:** month 正则校验、province_id intval()、agent_id 不信任前端
**Tech Lead 审核 checklist:**
- [ ] 数据链路正确?表关联关系有无误判?
- [ ] 接口设计合理?参数和响应格式符合规范?
- [ ] 权限处理方式正确?
- [ ] 安全检查要点覆盖?
- [ ] 前端方案可行(ECharts 按需引入)?
**Tech Lead Approve → Merge → 评审会议(里程碑内所有需求一起)→ Plan 阶段**...
|
1
|
0
|
1
|
1
|
0
|
|
0
|
1787824027
|
1789379887
|
1787829412
|
0
|
3
|
0
|
Edit
Delete
|
|
756
|
85
|
1
|
4
|
|
0
|
[Intent] 按省市统计设备月度新增上线数量报表
|
Related to #8
## 需求摘要
在「数据报表 > 设备分析」下新增报表,按月筛 Related to #8
## 需求摘要
在「数据报表 > 设备分析」下新增报表,按月筛选展示各省份新激活上线设备数量柱状图排行,支持下钻到城市维度。
## 核心决策
- 统计口径:当月**新激活**上线设备(首次上线,取 ahead_authenticate_log 表的 create_time 字段)
- 地区归属:取设备绑定**门店地址**的省/市字段
- 交互方式:点击省份**下钻**到城市排行(非 Tab 切换)
- 权限:跟随现有 agent_id 角色体系,超管看全国,运营商看自己区域
## 不在范围内
- 不做 Excel 导出
- 不做地图热力图
- 不做区/县级别
- 不做跨月趋势
## 产物文件
[intent/device-online-stats-by-region.md](https://gitea.g-hi.com/laiqiaojie/jh-project/src/branch/intent/device-online-stats-by-region/intent/device-online-stats-by-region.md)
## PM 审核清单(参考 REVIEW.md)
- [ ] 需求背景和问题描述是否准确反映了原始诉求?
- [ ] 期望结果是否可验证?
- [ ] 不在范围内的排除项是否合理?
- [ ] 受影响系统判断是否正确(admin / ahead_authenticate_log)?
- [ ] 本次是否接受排期,进入 Design 阶段?...
|
1
|
0
|
1
|
1
|
2
|
|
0
|
1787817232
|
1789379898
|
1787823622
|
0
|
5
|
0
|
Edit
Delete
|
|
871
|
83
|
18
|
5
|
|
0
|
feat(personnel): D-13 组织类型字段与宿主 Schema 受控通道(PKG-00 feat(personnel): D-13 组织类型字段与宿主 Schema 受控通道(PKG-006)...
|
> **叠在 #17 之上(#17 又叠在 #13 之上),请按 #13 → #17 → 本 > **叠在 #17 之上(#17 又叠在 #13 之上),请按 #13 → #17 → 本 PR 的顺序合入。** 本 PR 自身只有最后 2 个提交:`4fa64f1`(D-13)、`6912ab7`(报告回绑)。
## 背景
- F1 `OrganizationUnitMoved` 要求 `unit_type` 必填(CHG-061 Q5),而 HR 组织原本没有类型字段。
- 02 已于 10-27 定下词表(D73):采用 CHG-061 的三值,02 侧分别映射为 `BUSINESS_UNIT` / `DEPARTMENT` / `TEAM`。
- 加字段要改 D3 冻结的宿主 `schema.prisma`。用户 2026-10-28 裁定 D-13:开受控通道并实现。
## 内容(对接蓝图 §4.17)
- **D3 受控通道**(`scripts/lib/d3-protection.mjs`):`packageUpdates` 只多放行一个文件,即宿主 `apps/api-nestjs/prisma/schema.prisma`。既有迁移、`migration_lock.toml` 和已退役的 Fastify schema 仍不得登记;结构变更一律以新迁移追加。
- **字段**:组织新增可空的 `unitType`(`ORGANIZATION` / `DEPARTMENT` / `TEAM`)。迁移 `20261028090000_organization_unit_type` 只追加这一列;已有组织的值为 null,不做推断。
- **contracts**(台账 PKG-006):
- 创建时可选,缺省为 null;
- 编辑时省略即保留原值,显式传 null 则清除;
- 命令视图与组织摘要必带该字段;
- 双时间快照读取该字段,D-13 之前的快照读为 null。
- **服务**:创建和编辑写入该字段,仍沿用原有乐观锁和 outbox;当前读取与双时间读取两条路径都输出该字段。
- **Web**:组织增改表单新增「组织类型」,组织详情显示类型。
- **未做**:
- OS 产品副本还没有这一列,登记为 H29。0.19.6 尚未进入 OS main,0.19.7 现在注册不了,等它进入后再随产品版本补上。
- F1 本身:等 contracts 发版后,与 F2–F4 一起实现。
- 已有组织的类型补录:需要业务按实际情况登记。
## 验证(本地,报告绑定 `4fa64f1`、clean)
- `d3-protection` 27/27,新增 2 例;2 个变异探针(去掉放行、放宽到整个 prisma 目录)都判红。
- contracts 232/232,新增 5 例。
- 真实 DB 的 HTTP 测试 3/3,覆盖:带类型 / 不带类型创建;编辑时省略保留、修改、清除;词表外取值返回 400 且不落库;用 `knownAt` 能回看到旧类型。另有 3 个服务层变异探针都判红。
- `check:runtime` 482/482,`check:ui` 46/46(在原有组织增改场景里加入了类型选择和读回),用一次性 PostgreSQL / Redis 跑,跑完已删。
- 静态检查:D3 / schema / migrations / RLS / write-guard 等门禁全部通过;静态链在 O22 处如实停止,`check:governance` 只剩 O22。
- 远端 CI 见本页。
🤖 Generated with [Claude Code](https://claude.com/claude-code)...
|
0
|
0
|
0
|
1
|
0
|
|
0
|
1793194416
|
1793194416
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
861
|
83
|
17
|
5
|
|
0
|
feat(contracts): P1 前置片——CHG-061 三条 HR 事实的载荷与信封 Sc feat(contracts): P1 前置片——CHG-061 三条 HR 事实的载荷与信封 Schema(PKG-005)...
|
> **叠在 #13 之上,请先合 #13。** 本分支已合入更新后的 #13(#13 已含 > **叠在 #13 之上,请先合 #13。** 本分支已合入更新后的 #13(#13 已含 main 上的 #16)。#13 合入后,这里的差异只剩 P1 前置片与报告回绑。
## 为什么重建(2026-10-28)
PR #16 已在 main 上以 PKG-004 落地 V-04(来源域按事实类型;注册表条目的 `source_domain` 须为字面量)。本 PR 原先也用 PKG-004 实现了另一版 V-04,与 #16 冲突。重建时:
- contracts 与台账取 main 版本;
- 去掉本分支自己的 `sourceDomain` 放宽;
- 改按 #16 的注册表类型重做,台账改为 **PKG-005**,蓝图记为 **§4.16**。
## 内容(对接蓝图 §4.16,P1 / H5)
- **contracts**(`packages/contracts/src/enterprise-fact.ts`,台账 PKG-005)
- 新增 `organizationCanonicalIdSchema`(`org_`)。
- 新增 `EmploymentStarted`、`EmploymentTerminated`、`OrganizationUnitStatusChanged` v1 的载荷 Schema,逐字段对应 04 `contracts/schemas/facts/*.v1.json`(CHG-061)。组织状态载荷另要求 `change_kind` 与 `state_after` 一致。
- 三份信封 Schema 保持 ZodObject,`source_domain` 为字面量(hr / organization),满足 #16 的注册表类型(typecheck 已证明),升 pin 后可以直接登记。
- `buildEnterpriseFactEnvelope` 在注册表 Schema 解析之后统一校验两条:载荷里的实体 ID 等于 `entity_id`;组织事实的 `valid_from` 等于 `effective_at`。校验失败抛 ZodError,Relay 记为 `FACT_SCHEMA_INVALID` 并进死信。这条同样约束已登记的 `EmploymentTransferred`;HR 写入时两者本来就相同。
- **刻意不做**:出站注册表、`facts.owns`、生效事务写 Intent。原因是 M6 只认 pinned `@juhai/contracts` 的 Catalog,而 Registry 上最新的 rc.7 只有 11 条事实。发版已交给单独的 04 会话推进,真实发布前须用户同意;HR 侧的请求草稿是 `docs/domain/request-draft-04-contracts-release-chg061-2026-10-28.md`。
- **F1 `OrganizationUnitMoved`**:组织类型词表已由 02 D73 定为 CHG-061 三值(`organization` / `department` / `team`)。HR 加这个字段要改 D3 冻结的宿主 Prisma 和产品迁移,已登记为待裁决 D-13(用户已同意开受控通道并实现,另起 PR)。
- **文档**:蓝图 §4.16、H5 / P1 行,矩阵 #19 按 02 D72 订正(Site / Space / SiteOperator 的现用写点改为 EES 物包),新增 D-13;同步更新 CLAUDE.md G23、CHG 草案和发版请求草稿。
## 验证(本地,报告绑定 `b8f85d3`、clean)
- contracts 227/227(enterprise-fact 24 例,其中新增 8 例)。
- 5 个变异探针各判红:去掉实体 ID 一致、去掉状态一致、去掉 `valid_from` 一致、封装不调用一致性校验、组织事实来源域改为 hr。
- `check:d3` 通过;去掉 PKG-005 后判红(6 项)。
- `check:app-manifest`、`check:contract-consumers`、`check:validation`、lint、typecheck 均通过。
- `check:runtime` 474/474、`check:ui` 46/46,用一次性 PostgreSQL / Redis 跑完已删。静态检查链如实停在 O22,`check:governance` 只剩 O22。
- 远端 CI 结果见本页。
🤖 Generated with [Claude Code](https://claude.com/claude-code)...
|
0
|
0
|
0
|
1
|
0
|
|
0
|
1793153681
|
1793194416
|
0
|
0
|
1
|
0
|
Edit
Delete
|
|
859
|
83
|
16
|
5
|
|
0
|
feat(contracts): 出站事实来源域按事实类型收紧(V-04,D-12 台账 PKG-0 feat(contracts): 出站事实来源域按事实类型收紧(V-04,D-12 台账 PKG-004)...
|
<!--
PR 治理模板。提交前请逐项确认,确保符合 docs/standards 下的 <!--
PR 治理模板。提交前请逐项确认,确保符合 docs/standards 下的工程规范。
CI 会执行:pnpm check(命名 + 单源漂移 + 治理棘轮 + lint + typecheck);
有测试 DB 的流水线另执行 DATABASE_URL=... pnpm check:runtime。
-->
## 变更内容
<!-- 简述这次改了什么、为什么改(聚焦 why) -->
-
## 涉及业务概念
<!-- 列出涉及的业务词典英文名,例如 store / order / verification。参见 docs/domain-glossary.md -->
-
## 检查清单
### 命名一致性
- [ ] 业务概念使用了词典中的标准英文名(未出现 shop/branch/seller/voucher/writeOff 等禁用词)
- [ ] 数据库 snake_case + 复数表名;API/JSON 字段 camelCase;类型 PascalCase;常量 SCREAMING_SNAKE_CASE
- [ ] `pnpm check:naming` 通过
- [ ] `pnpm check:schema` 通过,未新增第二份状态/契约真源
### API / 契约
- [ ] 不涉及 API 变更
- [ ] 新增/修改了 API,路由符合当前生命周期规范:既有 Personnel Core 保持 `/api/personnel/*`,HR v2 领域使用 `/api/v2/{domain}/*`,身份协议使用标准 OIDC 端点
- [ ] 已更新 `packages/contracts` 中的 Zod schema / DTO / 类型(前后端共用同一份)
- [ ] 无破坏前端兼容的字段删除/重命名(如有,已在描述中说明迁移方案)
### 数据库
- [ ] 不涉及数据库变更
- [ ] 新增/修改了表或字段,已通过 migration review(表名复数、字段 snake_case、外键 xxx_id、时间 _at、状态 status)
- [ ] 高增长表已考虑分区;涉及多租户的表带 tenant_id
- [ ] 写链显式带 tenant_id;跨租户读写按 404/隔离口径处理
### 数据库迁移(迁移即代码:版本/顺序/内容/环境/发布/回滚一致)
- [ ] 改 schema.prisma 的同时**已生成并提交 migration**(`pnpm db:migrate:dev --name <change>`),未只改 schema 不落迁移
- [ ] **未修改已发布过的历史 migration 文件**(内容一致:历史不可变,新变更走新迁移)
- [ ] `pnpm check:migrations` 通过(迁移历史在位 / 无未豁免高危 DDL / schema 表、enum、`@map` 列均已落迁移)
- [ ] 破坏性变更(删表/删列/改名/改类型/加 NOT NULL/加唯一约束)走 **expand→migrate→contract** 三阶段,不一次切
- [ ] 大表加索引用 `CREATE INDEX CONCURRENTLY`;大批量回填走 BullMQ 分批任务,不塞进 migration
- [ ] 高危但确需的 DDL 已加 `-- migration-allow:<原因>` 留痕,并在下方回滚方案说明
- [ ] 非开发环境只用 `migrate deploy`(禁止 `db push` / 线上手动 ALTER);发布前 `pnpm db:migrate:status` 无 drift
### 实时 / 队列
- [ ] 不涉及
- [ ] 关键业务事件进入 BullMQ 或持久化事件表(未仅依赖 Redis Pub/Sub)
- [ ] 写库事件与真实写操作在同一 tx 写入 outbox,未在 commit 后旁路 publish
- [ ] 实时通道选型符合规范(订单/看板/通知用 SSE;设备在线/包间控制/IM 用 WebSocket)
### 质量与发布
- [ ] 通过 `pnpm lint` 与 `pnpm typecheck`
- [ ] 通过 `pnpm check:governance`,`reports/*.latest.json` 已刷新且无棘轮回退
- [ ] 涉及写链 / DB / 租户 / 状态机时,通过 `DATABASE_URL=... pnpm check:runtime`,`reports/runtime-acceptance.latest.json` 已刷新
- [ ] 涉及页面或浏览器行为时,`pnpm check:ui` 与 `pnpm check:ui:fastify` 均通过,未只验证一个后端
- [ ] 已补充/更新必要的测试
- [ ] 不需要回滚方案
- [ ] 需要回滚方案,已在下方说明
## 回滚方案 / 其他说明
-
...
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1793153388
|
1793191535
|
1793153395
|
0
|
0
|
0
|
Edit
Delete
|