|
850
|
83
|
7
|
5
|
|
0
|
ci: per-run docker PostgreSQL/Redis for acceptance ci: per-run docker PostgreSQL/Redis for acceptance, with reports rebound to e8591c7...
|
Two commits:
- e8591c7 ci: the runtime job no l Two commits:
- e8591c7 ci: the runtime job no longer uses `services:` (never started on this host-mode runner; 127.0.0.1:5432 reached an unrelated PostgreSQL on the runner host in run 26519). scripts/ci-acceptance-services.sh fails without docker; otherwise it starts per-run PostgreSQL/Redis containers on docker-assigned high ports with a random masked password and removes them in an if: always() step. G14 updated.
- 8cf50a6 chore(reports): runtime, UI and static reports rerun on the clean final source e8591c7.
Local evidence (isolated containers, recreated database):
- check:runtime 452/452 (floor 452), frozen oracle 12, outbox 1 scenario / 0 duplicates, outage health 2.
- check:ui 46/46.
- pnpm check with DIGITAL_EMPLOYEE_OS_ROOT at e12d0f2: exit 0, provenance violations 0.
- Script checks: start/connect/stop with no leftovers, repeated stop, and failures for missing docker, a non-prefixed database name and an invalid run id.
Not yet verified: docker on the runner host and its ability to pull postgres:16 / redis:7 (override with CI_POSTGRES_IMAGE / CI_REDIS_IMAGE repository variables).
🤖 Generated with [Claude Code](https://claude.com/claude-code)...
|
0
|
0
|
0
|
1
|
0
|
|
0
|
1793102531
|
1793190011
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
846
|
83
|
3
|
5
|
|
0
|
fix(ci): fetch locked OS with a Gitea token header fix(ci): fetch locked OS with a Gitea token header and probe access first...
|
actions/checkout presented OS_REPO_READ_TOKEN as B actions/checkout presented OS_REPO_READ_TOKEN as Basic credentials and
Gitea answered 401 (git fell back to a username prompt) for two
different correctly scoped tokens. Fetch the locked SHA with plain git
and an "Authorization: token" header into RUNNER_TEMP instead, after a
Gitea API probe that prints only the HTTP status, so a missing secret,
unusable token or missing repository access fails with a clear reason.
This step also no longer downloads an action from github.com.
🤖 Generated with [Claude Code](https://claude.com/claude-code)...
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1793096204
|
1793096226
|
1793096226
|
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
|
|
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
|
|
130
|
6
|
5
|
5
|
|
0
|
feat: 培训管理种子 + MQL 评分规则 + Gitea CI 迁移
|
对应 GitHub PR #52。
- backend/prisma/seeds/22-hr-tr 对应 GitHub PR #52。
- backend/prisma/seeds/22-hr-training-content.ts: 培训管理 12 张表种子
- backend/prisma/seeds/23-lead-scoring-rules.ts: MQL 默认评分规则集(修复 /lead-qualification 评估 400)
- .gitea/workflows/ci.yml: Gitea Actions CI(取代账户计费阻塞的 GitHub Actions)
- frontend course-marketplace.ts: array-guard 修复
- 已合并 origin/main 至 97a07d598,冲突全部解决
GitHub Actions 已仓库级禁用,CI 迁移到本 Gitea PR 验证。...
|
0
|
0
|
0
|
1
|
0
|
|
0
|
1778885087
|
1778891427
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
743
|
57
|
3
|
5
|
|
0
|
feat(script): 接入大语言模型——歌词/文案 → 拍摄脚本 → 角色确认 → 定格图
|
本仓此前零 LLM 接入(全仓只有 DashScope 的图像调用),「歌词成图」屏是纯前端
原型 本仓此前零 LLM 接入(全仓只有 DashScope 的图像调用),「歌词成图」屏是纯前端
原型(procedural.ts 画色块 + setTimeout 假装推理,不落库不接后端)。本轮把这条
动线升级为真链路 + 真持久化。
契约单源(packages/contracts/src/script.ts)
- 角色确认状态机 scriptRoleMachine、脚本状态机 shootingScriptMachine
- 景别/运镜用枚举而非自由文本:LLM 一旦自由发挥,下游 prompt 与统计就没有稳定口径
- scriptDraftSchema 是 LLM 输出的唯一判据;prompt 构造器单源,两后端禁止各拼一份
- evaluateRoleReadiness:本域核心不变量,双后端硬拦截 + 前端同源即时反馈
- 前端私有的 findBannedHits 上收为 contracts 的 findBannedWords(后端也要逐镜标记,
两份并行就是双真源)
LLM 不是权威
- sidecar /v1/script 只保证「返回长得像脚本的 JSON」,两个后端各自再 parse 一次才落库
- 模型引用未声明角色键 → 422 SCRIPT_ROLE_KEYS_DANGLING(幻觉护栏)
- 连续给不出合法 JSON → 502 LLM_OUTPUT_UNPARSEABLE,绝不返回占位脚本
- parse_json_object 只剥围栏、截首尾花括号,不做字段猜测或补齐
角色必须先确认才允许出定格图
- 判据 = status CONFIRMED 且有 referenceAssetId(没有参考图就没有一致性锚点)
- CONFIRMED --reset--> DRAFT 会解除参考图绑定:人确认的是那一张图,不是那个名字
- 出图时按 roleKeys 顺序喂参考图,与指令里「第 N 张参考图」编号严格对齐
写链纪律与物料链路同构:tenant 全覆盖、updateMany 带状态前置条件(0 行即 409)、
终态与 outbox 同 tx、能力不可用 → job BLOCKED + 诚实 reason,禁止静默降级。
品牌准绳只逐镜标记不拒绝整份脚本(脚本属创作内容),硬拦截点在出定格图这个受控出口,
显式放行需带参数且落审计事件。
顺带修掉三个既有缺陷
1. 合并遗留:sidecarEdit 用 sidecarGenerateResponseSchema 校验响应(要求 steps/
loadSeconds),但 run_hosted_edit 两个字段都不返回 —— 托管改字会在客户端边界
直接 Zod 抛错(本地路径返回这两个字段,所以一直没暴露)
2. check-migrations 的列检查只扫 CREATE TABLE,凡 ALTER TABLE ADD COLUMN 追加的
@map 列一律误报 drift(此前唯一的 ALTER 列 brand_kits.profile 没 @map 才没现形)
3. ktv-poster-master.png 血统在合并两侧打架,git log --all 证明该文件自初始化提交后
从未重新生成,取诚实标注 prototype-demo-master
验收
- 新增 pnpm check:script → reports/script-acceptance.latest.json(双后端各 8 passed
+ 1 skipped-live);own-tests floor 10→14,棘轮已收紧
- pnpm check / check:runtime 均 exit 0
- 浏览器实测:未确认角色 → 按钮 disabled 且提示缺哪个角色;绕过前端直打后端 → 422
ROLE_NOT_CONFIRMED;跨租户 404;无凭证生成 → UI 显示 503 且不产生占位脚本
诚实边界(已写入 CLAUDE.md)
- liveLlmAsserted=false:本机无 DASHSCOPE_API_KEY,真调 LLM 的 live 断言被 skip,
门禁成立 ≠ LLM 出脚本已验证
- check:inference 在本机为 failed(动手前即为 failed):本工作副本的模型权重是
git-lfs 指针存根,非本轮改动导致;基线表该行已从 GREEN 改为 OPEN
- ui-acceptance 报告早于本屏,未覆盖 script 屏,已标 STALE
- 新开缺口 G16(LLM 只做结构校验、无事实性校验)、G17(同步 HTTP 挂分钟级推理 /
render_jobs 索引非 CONCURRENTLY / 本地多图 I2I 未在本机验证)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
<!--
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,路由符合 `/api/v1/{resources}` 规范
- [ ] 已更新 `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` 已刷新
- [ ] 已补充/更新必要的测试
- [ ] 不需要回滚方案
- [ ] 需要回滚方案,已在下方说明
## 回滚方案 / 其他说明
-
...
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1787029791
|
1787032807
|
1787032807
|
0
|
0
|
0
|
Edit
Delete
|
|
21
|
2
|
21
|
1
|
|
0
|
11111
|
测试
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1773910676
|
1773910796
|
1773910698
|
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
|