|
15736
|
11
|
5
|
1
|
52
|
0
|
0
|
refs/heads/manage
|
1
|
{"Commits":[{"Sha1":"bd456b0e5 {"Commits":[{"Sha1":"bd456b0e5d7cbd00cbf2a37adac3cd0435cdb5a7","Message":"出货记录。\n","AuthorEmail":"121158035@qq.com","AuthorName":"zhangjunnan","CommitterEmail":"121158035@qq.com","CommitterName":"zhangjunnan","Timestamp":"2026-07-03T10:15:50+08:00"}],"HeadCommit":{"Sha1":"bd456b0e5d7cbd00cbf2a37adac3cd0435cdb5a7","Message":"出货记录。\n","AuthorEmail":"121158035@qq.com","AuthorName":"zhangjunnan","CommitterEmail":"121158035@qq.com","CommitterName":"zhangjunnan","Timestamp":"2026-07-03T10:15:50+08:00"},"CompareURL":"vodtest/manage/compare/d07acc74b001f41a632bd2116b91f2c74474e3d2...bd456b0e5d7cbd00cbf2a37adac3cd0435cdb5a7","Len":1}...
|
1783044962
|
Edit
Delete
|
|
16562
|
11
|
5
|
1
|
52
|
0
|
0
|
refs/heads/manage
|
1
|
{"Commits":[{"Sha1":"4032f805b {"Commits":[{"Sha1":"4032f805b3838168da02235e045439c57ea66cf5","Message":"出货记录。\n","AuthorEmail":"121158035@qq.com","AuthorName":"zhangjunnan","CommitterEmail":"121158035@qq.com","CommitterName":"zhangjunnan","Timestamp":"2026-07-08T10:45:08+08:00"}],"HeadCommit":{"Sha1":"4032f805b3838168da02235e045439c57ea66cf5","Message":"出货记录。\n","AuthorEmail":"121158035@qq.com","AuthorName":"zhangjunnan","CommitterEmail":"121158035@qq.com","CommitterName":"zhangjunnan","Timestamp":"2026-07-08T10:45:08+08:00"},"CompareURL":"vodtest/manage/compare/bd456b0e5d7cbd00cbf2a37adac3cd0435cdb5a7...4032f805b3838168da02235e045439c57ea66cf5","Len":1}...
|
1783478735
|
Edit
Delete
|
|
15801
|
5
|
1
|
5
|
53
|
0
|
0
|
|
1
|
|
1783052283
|
Edit
Delete
|
|
15805
|
5
|
5
|
5
|
53
|
0
|
0
|
refs/heads/main
|
1
|
|
1783052933
|
Edit
Delete
|
|
15806
|
5
|
5
|
5
|
53
|
0
|
0
|
refs/heads/main
|
1
|
{"Commits":[{"Sha1":"ff003fc3f {"Commits":[{"Sha1":"ff003fc3f1a79b3d645cc67ff77f5f806caaebdc","Message":"精准复刻声浪原型(歌曲生成工作台.html)+ 修复中文显示\n\n从设计原型(内嵌 dc 模板)提取精确 token 与交互逻辑逐项对齐:\n\n- 中文显示:字体栈改为 Space Grotesk(拉丁)+ Noto Sans SC(中文)+\n Space Mono(等宽标签,仅拉丁/数字)——中文不再落进默认等宽字体\n- 主题色精确对齐:强调色 lime #d6ff41(原误判为琥珀)、coral/green/violet、\n 四级底色 #0a0a0c/#131317/#1a1a20/#212129,登记为 tailwind sonic.* token\n- 风格标签改原型 chips 模型:已选 chips(×移除)+ 输入回车添加 +\n 15 个中英预设速选;默认 chips 与原型一致\n- 场景模板扩至原型全部 9 个(含 KTV 合唱嗨歌/深情抒情/失恋买醉/热血燃曲/\n 怀旧金曲),渐变图标、EN 分类、完整示例歌词;载入=覆盖歌词与标签(原型语义)\n- 作品库精准复刻:46 根播种伪随机波形、播放键卡片态、底部播放条\n (真实 \u003caudio\u003e 驱动:进度/暂停/上下首/EQ 动画)、编辑载入二次生成、导出\n- ⚡ 生成歌曲 lime 发光按钮;生成中状态条(真实后端状态,不做假进度)\n- 全局 toast(载入场景/提交/导出/重试提示)\n\n浏览器实测:字体加载、9 场景卡、KTV 场景载入+toast、播放条真音频计时均通过。\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-02T07:30:55-07:00"},{"Sha1":"03f2329430ddb5463595da6fcfba500106213d57","Message":"按「声浪 SONIC」设计稿重构交互界面\n\n信息架构从单页升级为工作台三视图(依据 歌曲自动生成界面.zip 设计稿):\n\n- 深色主题(近黑底/暗面板/amber 强调),layout 全局启用 dark\n- 顶栏:声浪品牌 + ENGINE 徽章(当前模型,切换中标注)+ Connected/uptime\n + WebSocket/SSE 传输切换\n- 左侧图标导航:创作 / 场景 / 作品库 + 渐变头像\n- 创作页:/ CREATE 面包屑 + 引擎模型卡(含异步切换全状态)+ 歌词(结构标记\n 提示/字数统计)+ 风格标签三组速选 chips(点击拼进 prompt)+ 时长 + 生成\n- 场景模板页:4 个预设配方卡(广告片/短视频/KTV/门店 BGM),一键填入创作\n 面板(歌词非空不覆盖)\n- 作品库页:任务列表(状态 chip/试听/下载/重试/尝试次数)\n- 右侧 Live Events 面板(mono 风格,songJob 事件按结果着色)\n- 删除被替代的 SongsPanel;框架 demo 组件保留在库中但不再挂载\n\n浏览器实测:三视图渲染、场景→创作联动(tags/时长/歌词骨架)均通过。\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-02T07:19:32-07:00"},{"Sha1":"117953b4b4c75a2873b0e19013f5b089665817c9","Message":"修复模型切换 500:改异步切换 + 轮询确认 + 切换期间延迟派发\n\n用户实测切换 acestep-v15-base 报 Internal Server Error。根因:把 GB 级模型\n下载塞进单个同步 HTTP 请求,Node fetch 底层响应头超时(~5 分钟)早于下载完成,\n超时异常未映射 HTTP 语义 → 裸 500(引擎侧下载其实已开始,连接死了下载也断)。\n\n- switchModel 改异步:校验(引擎存在/无生成中任务/引擎可达/无进行中切换)后\n 立即返回 switching 状态;后台触发 /v1/init 并轮询 loaded 列表确认目标模型\n 就位(不以长请求的成败为准),超时如实记入 lastSwitchError\n- GET models 响应新增 switching / lastSwitchError;重复切换 409 SWITCH_IN_PROGRESS\n- worker 新增切换期间守卫:延迟 30s 重派而不烧 attempts(enqueue 支持 delay)\n- 前端:切换中徽章 + 按钮禁用 + 5s 密集轮询 + 上次失败原因展示\n- 新增 2 个异步切换测试(完成路径/进行中拒绝+延迟派发+超时留痕),19/19 绿\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-02T06:11:29-07:00"},{"Sha1":"2b3b677ca134fa03e3e3b476a1b2919102a54b58","Message":"引擎抽象层:EngineClient 端口 + EngineRegistry 路由\n\n为接入未来引擎(GPU 服务器 ACE-Step、YuE wrapper、新模型)铺路:\n\n- engine-client.interface.ts:引擎端口(任务提交/轮询/下载/模型管理)+\n 跨引擎语义约定(任务真源在 SongJob 表、未知任务号返回空、生成中透出 progress)\n- engine.registry.ts:SongJob.engine → 适配器的唯一路由点(SONG_DEFAULT_ENGINE)\n- AceStepClient 成为第一个实现,模型目录与能力声明(supportedTaskTypes)内聚到适配器\n- contracts/prisma 增加 engine 字段(默认 acestep);未注册引擎、引擎不支持的\n taskType 在 create 入口 400 拒绝,不入队\n- models/switch 端点支持 ?engine=;切换守卫按引擎计数 SUBMITTED\n- 新增 3 个抽象层测试(未注册引擎拒绝/能力校验/路由),31 tests 绿\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-02T05:58:18-07:00"},{"Sha1":"358df6e7dee8d9fdd0998d70cc4eb62884c0bed7","Message":"模型切换:引擎热切换 + 按任务选模型\n\n- GET /api/songs/models:DiT 可加载目录(镜像引擎 model_download.py,登记在\n 适配层唯一入口)× /v1/models 已加载状态;引擎不可达时诚实降级 engineUp=false\n- POST /api/songs/models/switch:代理 /v1/init 热切换默认模型;有 SUBMITTED\n 任务时 409 ENGINE_BUSY(重载会打断在跑生成);未下载模型引擎先下载(同步等待)\n- 按任务 model 参数端到端直通(contracts→prisma 列→引擎入参);引擎对未加载\n 模型会静默回退默认——产物新增 ditModel 如实记录实际使用的模型\n- 前端 SongsPanel 新增引擎模型条:当前模型徽章 + 切换下拉(标注已加载/需下载)\n + 生成中禁用切换\n- 新增 3 个真派发测试(模型直通/切换守卫/降级),28 tests 绿,pnpm check 全绿\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-02T05:24:25-07:00"}],"HeadCommit":{"Sha1":"ff003fc3f1a79b3d645cc67ff77f5f806caaebdc","Message":"精准复刻声浪原型(歌曲生成工作台.html)+ 修复中文显示\n\n从设计原型(内嵌 dc 模板)提取精确 token 与交互逻辑逐项对齐:\n\n- 中文显示:字体栈改为 Space Grotesk(拉丁)+ Noto Sans SC(中文)+\n Space Mono(等宽标签,仅拉丁/数字)——中文不再落进默认等宽字体\n- 主题色精确对齐:强调色 lime #d6ff41(原误判为琥珀)、coral/green/violet、\n 四级底色 #0a0a0c/#131317/#1a1a20/#212129,登记为 tailwind sonic.* token\n- 风格标签改原型 chips 模型:已选 chips(×移除)+ 输入回车添加 +\n 15 个中英预设速选;默认 chips 与原型一致\n- 场景模板扩至原型全部 9 个(含 KTV 合唱嗨歌/深情抒情/失恋买醉/热血燃曲/\n 怀旧金曲),渐变图标、EN 分类、完整示例歌词;载入=覆盖歌词与标签(原型语义)\n- 作品库精准复刻:46 根播种伪随机波形、播放键卡片态、底部播放条\n (真实 \u003caudio\u003e 驱动:进度/暂停/上下首/EQ 动画)、编辑载入二次生成、导出\n- ⚡ 生成歌曲 lime 发光按钮;生成中状态条(真实后端状态,不做假进度)\n- 全局 toast(载入场景/提交/导出/重试提示)\n\n浏览器实测:字体加载、9 场景卡、KTV 场景载入+toast、播放条真音频计时均通过。\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-02T07:30:55-07:00"},"CompareURL":"","Len":7}...
|
1783052933
|
Edit
Delete
|
|
15815
|
5
|
5
|
5
|
53
|
0
|
0
|
refs/heads/main
|
1
|
{"Commits":[{"Sha1":"36288790c {"Commits":[{"Sha1":"36288790cd7118c7109effc2de997f147665531d","Message":"feat: improve song studio mobile playback and engine flow\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-02T22:30:05-07:00"}],"HeadCommit":{"Sha1":"36288790cd7118c7109effc2de997f147665531d","Message":"feat: improve song studio mobile playback and engine flow\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-02T22:30:05-07:00"},"CompareURL":"luoanwu/song-generation/compare/ff003fc3f1a79b3d645cc67ff77f5f806caaebdc...36288790cd7118c7109effc2de997f147665531d","Len":1}...
|
1783056773
|
Edit
Delete
|
|
15824
|
5
|
5
|
5
|
53
|
0
|
0
|
refs/heads/main
|
1
|
{"Commits":[{"Sha1":"a146df273 {"Commits":[{"Sha1":"a146df273f4b5ba09c490cb67458ae8dc8c2fc12","Message":"深度优化:治理缺口闭环 + 规模能力 + 双审计修复\n\n治理:\n- check:schema 泛化为 ENTITIES 登记表,SongJobState 纳入单源门禁(关闭基线 OPEN 项)\n- 端口口径统一:运行时真源 3201,提交层默认值(CLAUDE.md/.env.example/next.config)对齐消除双源漂移\n- .env.example 补齐 ACESTEP_API_URL/SONG_OUTPUT_DIR/SONG_POLL_*/SONG_STALL_*/SONG_SWITCH_* 全量配置\n\n规模与能力(后端审计修复):\n- 真实进度透出:SongJob.progress 列,worker 轮询回写(state 前置条件防覆盖终态),\n 成功置 1、重试清空;实测 0.68→0.8→1 全程可见\n- DELETE /api/songs/:id:终态与 QUEUED 可删(SUBMITTED 409),级联历史 + outbox\n songJob.deleted 事件 + 产物目录清理;实测 200/404/目录已清\n- GET /api/songs 强制分页(take 默认 50 上限 200 + skip,非法参数 400)\n- outbox 已投递记录 7 天保留期每小时清理(表不再无限增长)\n- persistArtifacts 半落盘防护:任一候选下载失败即清整目录并走失败重试,不卡 SUBMITTED\n- downloadAudio 加 10 分钟超时 + 500MB 大小护栏(流式计数)\n\n前端(审计修复):\n- 播放器换源原子性(先停旧源)+ play() 异常捕获置回暂停态 + 删除正在播放的歌时停播并释放 blob\n- 作品库删除按钮(确认后删,生成中隐藏);生成中 chip 与创作页进度条显示真实百分比\n- 播放控制补 aria-label\n\n测试:songs 集成 19→24(删除/跨租户/分页钳制/进度回写/半落盘清理),全仓 45 tests 绿,\n门禁 8 项 + 棘轮通过。\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-02T23:00:58-07:00"},{"Sha1":"b49310ecdcf2532cb430c13cf8e97faad0b72a78","Message":"chore: ignore local git bundle artifact\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-02T22:36:11-07:00"}],"HeadCommit":{"Sha1":"a146df273f4b5ba09c490cb67458ae8dc8c2fc12","Message":"深度优化:治理缺口闭环 + 规模能力 + 双审计修复\n\n治理:\n- check:schema 泛化为 ENTITIES 登记表,SongJobState 纳入单源门禁(关闭基线 OPEN 项)\n- 端口口径统一:运行时真源 3201,提交层默认值(CLAUDE.md/.env.example/next.config)对齐消除双源漂移\n- .env.example 补齐 ACESTEP_API_URL/SONG_OUTPUT_DIR/SONG_POLL_*/SONG_STALL_*/SONG_SWITCH_* 全量配置\n\n规模与能力(后端审计修复):\n- 真实进度透出:SongJob.progress 列,worker 轮询回写(state 前置条件防覆盖终态),\n 成功置 1、重试清空;实测 0.68→0.8→1 全程可见\n- DELETE /api/songs/:id:终态与 QUEUED 可删(SUBMITTED 409),级联历史 + outbox\n songJob.deleted 事件 + 产物目录清理;实测 200/404/目录已清\n- GET /api/songs 强制分页(take 默认 50 上限 200 + skip,非法参数 400)\n- outbox 已投递记录 7 天保留期每小时清理(表不再无限增长)\n- persistArtifacts 半落盘防护:任一候选下载失败即清整目录并走失败重试,不卡 SUBMITTED\n- downloadAudio 加 10 分钟超时 + 500MB 大小护栏(流式计数)\n\n前端(审计修复):\n- 播放器换源原子性(先停旧源)+ play() 异常捕获置回暂停态 + 删除正在播放的歌时停播并释放 blob\n- 作品库删除按钮(确认后删,生成中隐藏);生成中 chip 与创作页进度条显示真实百分比\n- 播放控制补 aria-label\n\n测试:songs 集成 19→24(删除/跨租户/分页钳制/进度回写/半落盘清理),全仓 45 tests 绿,\n门禁 8 项 + 棘轮通过。\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-02T23:00:58-07:00"},"CompareURL":"luoanwu/song-generation/compare/36288790cd7118c7109effc2de997f147665531d...a146df273f4b5ba09c490cb67458ae8dc8c2fc12","Len":2}...
|
1783058922
|
Edit
Delete
|
|
19663
|
5
|
5
|
5
|
53
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"d28a8594e {"Commits":[{"Sha1":"d28a8594e6cf9091cdf9ccd0fad377041dfaf727","Message":"feat: 完善 Tesla P4 GPU 部署链路\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-28T23:05:20-07:00"},{"Sha1":"6560bc5e5d9063cabf3af62b0b6287ebbc67f38d","Message":"feat: 接入嗨赞声浪模型别名并刷新验收\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-28T21:52:33-07:00"},{"Sha1":"24aa37882d5e85cd043071b232c7e4a12ea25382","Message":"feat(web): add brief-driven lyric drafting\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-06T01:17:00-07:00"}],"HeadCommit":{"Sha1":"d28a8594e6cf9091cdf9ccd0fad377041dfaf727","Message":"feat: 完善 Tesla P4 GPU 部署链路\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-28T23:05:20-07:00"},"CompareURL":"luoanwu/song-generation/compare/a146df273f4b5ba09c490cb67458ae8dc8c2fc12...d28a8594e6cf9091cdf9ccd0fad377041dfaf727","Len":3}...
|
1785305211
|
Edit
Delete
|
|
19838
|
5
|
5
|
7
|
53
|
0
|
0
|
refs/heads/hljTest
|
0
|
|
1785386561
|
Edit
Delete
|
|
19840
|
5
|
5
|
7
|
53
|
0
|
0
|
refs/heads/hljTest
|
0
|
{"Commits":[{"Sha1":"8b0729c9b {"Commits":[{"Sha1":"8b0729c9b6d46b1dd46a9f2f4b7536a5106a812e","Message":"fix(engine): Tesla P4 出歌链路修复(fp32+int8量化+DiT CPU offload)\n\nP4(sm_61 Pascal, 8GB) 上出歌此前必失败,根因是四个耦合约束:\n- fp16(默认)在 DiT 采样溢出产 NaN latents;唯一数值稳定路径是 fp32\n- fp32 DiT 权重 ~7.3GB,引擎「先整体搬 GPU 再量化」,加载即 OOM\n- 引擎 HTTP 出歌懒加载路径漏传 quantization,tier3 的量化默认成死代码\n- Pascal 默认降级的 w8a8_dynamic 张量不支持跨设备搬运,与 DiT offload 冲突\n\n有效组合: fp32 + int8_weight_only 量化 + DiT CPU offload + expandable_segments,\nDiT 在 CPU 上量化为 int8 后分层搬 GPU,常驻显存仅 ~387MB。实测 30s 歌成功落盘 FLAC。\n\n- start-engine-p4.sh: 注入上述全部运行时开关\n- deploy/ace-step/patches/: 固化引擎侧改动(startup_model_init.py 接通 quantization)\n- bootstrap-engine.sh / Dockerfile.tesla-p4: 引擎重建时自动应用补丁(引擎目录 gitignored)\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T12:42:31+08:00"},{"Sha1":"c53b6955d7851b95d797b90087813d6a2a83d32f","Message":"feat: 新增 Tesla P4 引擎启动脚本(禁用 cuDNN)\n\n随 torch 2.5.1+cu121 的 cuDNN 9.1.9 在 Pascal(sm_61) 上找不到卷积算法\n(DiT proj_in Conv1d 报 \"GET was unable to find an engine to execute this\ncomputation\",fp16/fp32 皆然)。P4 无 Tensor Core,cuDNN 不带来加速,\n故启动时注入 torch.backends.cudnn.enabled=False,卷积回退原生 CUDA kernel。\n同时套用 Pascal 兼容开关(5Hz LM/LLM 走 pt backend)。\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T09:40:48+08:00"},{"Sha1":"51cd9fe059767d2377bd6292cf1913a9885f8cd7","Message":"feat: 歌词起草接入豆包大模型 + 本地/公网运行配置\n\n歌词起草从纯前端模板改为调用豆包(火山引擎 Ark,OpenAI 兼容)大模型:\n- contracts 新增 lyrics 域(draftLyricSchema 入参/响应契约)\n- 后端新建 lyrics 模块:POST /api/lyrics/draft,未配置 DOUBAO_API_KEY 时 503\n- 前端起草按钮改调后端,大模型不可用时降级回本地模板草稿,不阻断创作\n- .env.example 登记 DOUBAO_API_KEY/BASE_URL/MODEL(真实密钥仅在 gitignored 的 .env)\n\n运行配置:docker-compose Redis 端口参数化、前端 dev 绑 0.0.0.0 以支持公网访问\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-29T18:01:05+08:00"}],"HeadCommit":{"Sha1":"8b0729c9b6d46b1dd46a9f2f4b7536a5106a812e","Message":"fix(engine): Tesla P4 出歌链路修复(fp32+int8量化+DiT CPU offload)\n\nP4(sm_61 Pascal, 8GB) 上出歌此前必失败,根因是四个耦合约束:\n- fp16(默认)在 DiT 采样溢出产 NaN latents;唯一数值稳定路径是 fp32\n- fp32 DiT 权重 ~7.3GB,引擎「先整体搬 GPU 再量化」,加载即 OOM\n- 引擎 HTTP 出歌懒加载路径漏传 quantization,tier3 的量化默认成死代码\n- Pascal 默认降级的 w8a8_dynamic 张量不支持跨设备搬运,与 DiT offload 冲突\n\n有效组合: fp32 + int8_weight_only 量化 + DiT CPU offload + expandable_segments,\nDiT 在 CPU 上量化为 int8 后分层搬 GPU,常驻显存仅 ~387MB。实测 30s 歌成功落盘 FLAC。\n\n- start-engine-p4.sh: 注入上述全部运行时开关\n- deploy/ace-step/patches/: 固化引擎侧改动(startup_model_init.py 接通 quantization)\n- bootstrap-engine.sh / Dockerfile.tesla-p4: 引擎重建时自动应用补丁(引擎目录 gitignored)\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T12:42:31+08:00"},"CompareURL":"luoanwu/song-generation/compare/d28a8594e6cf9091cdf9ccd0fad377041dfaf727...8b0729c9b6d46b1dd46a9f2f4b7536a5106a812e","Len":3}...
|
1785386561
|
Edit
Delete
|
|
19870
|
5
|
5
|
7
|
53
|
0
|
0
|
refs/heads/hljTest
|
0
|
{"Commits":[{"Sha1":"ea37f6993 {"Commits":[{"Sha1":"ea37f699381c4dbc2445e6be1d3c1fa9bd0feb6a","Message":"chore(deploy): 纳入裸机常驻部署的 systemd 单元\n\n本地 pnpm 直跑方式对外部署时的三个 systemd 单元(引擎/后端/前端),\n开机自启 + 崩溃自动重启。当前生产机即用此方式部署。\n\n- acestep-engine.service: 引擎(8001),跑 start-engine-p4.sh\n- song-api.service: NestJS 后端(3201, start:prod)\n- song-web.service: Next.js 前端(3101, next start),对外唯一入口\n- README: 安装/build 前置/运维命令/注意事项\n\n单元内容与 /etc/systemd/system 已运行版本一致。DB/Redis 为 docker 容器,不在此管理。\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T13:32:08+08:00"}],"HeadCommit":{"Sha1":"ea37f699381c4dbc2445e6be1d3c1fa9bd0feb6a","Message":"chore(deploy): 纳入裸机常驻部署的 systemd 单元\n\n本地 pnpm 直跑方式对外部署时的三个 systemd 单元(引擎/后端/前端),\n开机自启 + 崩溃自动重启。当前生产机即用此方式部署。\n\n- acestep-engine.service: 引擎(8001),跑 start-engine-p4.sh\n- song-api.service: NestJS 后端(3201, start:prod)\n- song-web.service: Next.js 前端(3101, next start),对外唯一入口\n- README: 安装/build 前置/运维命令/注意事项\n\n单元内容与 /etc/systemd/system 已运行版本一致。DB/Redis 为 docker 容器,不在此管理。\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T13:32:08+08:00"},"CompareURL":"luoanwu/song-generation/compare/8b0729c9b6d46b1dd46a9f2f4b7536a5106a812e...ea37f699381c4dbc2445e6be1d3c1fa9bd0feb6a","Len":1}...
|
1785389542
|
Edit
Delete
|
|
19911
|
5
|
5
|
7
|
53
|
0
|
0
|
refs/heads/hljTest
|
0
|
{"Commits":[{"Sha1":"e8b913f56 {"Commits":[{"Sha1":"e8b913f5667fb8a1812a240ef11d6dc579839351","Message":"chore(deploy): 纳入 nginx HTTPS 总入口配置与部署说明\n\ngeneration.g-hi.com 经 nginx(443) 分流:/ws→3201、其余→3101(Next),\nHTTP 跳转 HTTPS;IP/其它域名兜底回退到同机 voiceprint(8443)。\n配置与说明沉淀到 deploy/nginx/,并同步更新 systemd/README 的服务拓扑。\n证书与 .env 不入库。\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T14:22:31+08:00"}],"HeadCommit":{"Sha1":"e8b913f5667fb8a1812a240ef11d6dc579839351","Message":"chore(deploy): 纳入 nginx HTTPS 总入口配置与部署说明\n\ngeneration.g-hi.com 经 nginx(443) 分流:/ws→3201、其余→3101(Next),\nHTTP 跳转 HTTPS;IP/其它域名兜底回退到同机 voiceprint(8443)。\n配置与说明沉淀到 deploy/nginx/,并同步更新 systemd/README 的服务拓扑。\n证书与 .env 不入库。\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T14:22:31+08:00"},"CompareURL":"luoanwu/song-generation/compare/ea37f699381c4dbc2445e6be1d3c1fa9bd0feb6a...e8b913f5667fb8a1812a240ef11d6dc579839351","Len":1}...
|
1785392662
|
Edit
Delete
|
|
19934
|
5
|
5
|
7
|
53
|
0
|
0
|
refs/heads/hljTest
|
0
|
{"Commits":[{"Sha1":"04835a06e {"Commits":[{"Sha1":"04835a06e70f200230a21a912961afcbd6c503fd","Message":"docs: 重写 docs/README 为本项目(歌词→歌曲批量生产)说明\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T14:45:29+08:00"}],"HeadCommit":{"Sha1":"04835a06e70f200230a21a912961afcbd6c503fd","Message":"docs: 重写 docs/README 为本项目(歌词→歌曲批量生产)说明\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T14:45:29+08:00"},"CompareURL":"luoanwu/song-generation/compare/e8b913f5667fb8a1812a240ef11d6dc579839351...04835a06e70f200230a21a912961afcbd6c503fd","Len":1}...
|
1785395827
|
Edit
Delete
|
|
20460
|
5
|
5
|
7
|
53
|
0
|
0
|
refs/heads/hljTest
|
0
|
{"Commits":[{"Sha1":"da3f6895d {"Commits":[{"Sha1":"da3f6895d371408052023bc1698549e1f348f04a","Message":"chore(web): 整合服务器部署接入 basePath: '/song'\n\nnginx 整合服务器 (/etc/nginx/sites-enabled/00-incoming.conf) 已按\nbasePath 模式把 /song/* 反代到本仓 web(:3101)、/song-api/* 反代到\nAPI(:3201)。web 不加 basePath 时 next 端对 /_next/* 资源按根路径\n提供,nginx 转发到 :3101 后 404。\n\n改动:\n- 非 capacitor 构建启用 basePath: '/song'(capacitor 静态导出仍\n 走 out/,绝对 URL 直连后端,不需 basePath)。\n- 增补一段注释说明与 nginx /song 路由的对应关系。\n\ndev 访问 http://localhost:3101/song/,与 generation.g-hi.com\n线上 /song/ 同源。\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"luoanwu@g-hi.com","AuthorName":"luoanwu","CommitterEmail":"luoanwu@g-hi.com","CommitterName":"luoanwu","Timestamp":"2026-08-04T14:13:00+08:00"}],"HeadCommit":{"Sha1":"da3f6895d371408052023bc1698549e1f348f04a","Message":"chore(web): 整合服务器部署接入 basePath: '/song'\n\nnginx 整合服务器 (/etc/nginx/sites-enabled/00-incoming.conf) 已按\nbasePath 模式把 /song/* 反代到本仓 web(:3101)、/song-api/* 反代到\nAPI(:3201)。web 不加 basePath 时 next 端对 /_next/* 资源按根路径\n提供,nginx 转发到 :3101 后 404。\n\n改动:\n- 非 capacitor 构建启用 basePath: '/song'(capacitor 静态导出仍\n 走 out/,绝对 URL 直连后端,不需 basePath)。\n- 增补一段注释说明与 nginx /song 路由的对应关系。\n\ndev 访问 http://localhost:3101/song/,与 generation.g-hi.com\n线上 /song/ 同源。\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"luoanwu@g-hi.com","AuthorName":"luoanwu","CommitterEmail":"luoanwu@g-hi.com","CommitterName":"luoanwu","Timestamp":"2026-08-04T14:13:00+08:00"},"CompareURL":"luoanwu/song-generation/compare/04835a06e70f200230a21a912961afcbd6c503fd...da3f6895d371408052023bc1698549e1f348f04a","Len":1}...
|
1785824016
|
Edit
Delete
|
|
20957
|
5
|
5
|
5
|
53
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"5fc0d4e18 {"Commits":[{"Sha1":"5fc0d4e18a5b865a166b486b4836bc822e8392d0","Message":"Merge branch 'hljTest' into main\n\n集成豆包歌词起草、Tesla P4 出歌修复(fp32+int8+DiT offload)、\nnginx HTTPS 总入口 + systemd 常驻部署、web basePath '/song'。\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-05T20:59:21-07:00"},{"Sha1":"67970c1b0a1dcb0e91d17be0a26611d01e28f35c","Message":"feat: 歌曲在线回放链路 + 曲库播放 UI\n\n- 新增 song-playback.service.ts:短时随机凭证签发,浏览器分段播放\n- songs.controller.ts:Range 响应支持 FLAC 分段流式回放,不预下载\n- LibraryView 接入在线播放交互;api.ts/contracts 同步回放契约\n- 刷新治理 reports 与 GPU 部署校验(check-deployment.mjs)\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-05T20:59:07-07:00"},{"Sha1":"da3f6895d371408052023bc1698549e1f348f04a","Message":"chore(web): 整合服务器部署接入 basePath: '/song'\n\nnginx 整合服务器 (/etc/nginx/sites-enabled/00-incoming.conf) 已按\nbasePath 模式把 /song/* 反代到本仓 web(:3101)、/song-api/* 反代到\nAPI(:3201)。web 不加 basePath 时 next 端对 /_next/* 资源按根路径\n提供,nginx 转发到 :3101 后 404。\n\n改动:\n- 非 capacitor 构建启用 basePath: '/song'(capacitor 静态导出仍\n 走 out/,绝对 URL 直连后端,不需 basePath)。\n- 增补一段注释说明与 nginx /song 路由的对应关系。\n\ndev 访问 http://localhost:3101/song/,与 generation.g-hi.com\n线上 /song/ 同源。\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"luoanwu@g-hi.com","AuthorName":"luoanwu","CommitterEmail":"luoanwu@g-hi.com","CommitterName":"luoanwu","Timestamp":"2026-08-04T14:13:00+08:00"},{"Sha1":"04835a06e70f200230a21a912961afcbd6c503fd","Message":"docs: 重写 docs/README 为本项目(歌词→歌曲批量生产)说明\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T14:45:29+08:00"},{"Sha1":"e8b913f5667fb8a1812a240ef11d6dc579839351","Message":"chore(deploy): 纳入 nginx HTTPS 总入口配置与部署说明\n\ngeneration.g-hi.com 经 nginx(443) 分流:/ws→3201、其余→3101(Next),\nHTTP 跳转 HTTPS;IP/其它域名兜底回退到同机 voiceprint(8443)。\n配置与说明沉淀到 deploy/nginx/,并同步更新 systemd/README 的服务拓扑。\n证书与 .env 不入库。\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T14:22:31+08:00"}],"HeadCommit":{"Sha1":"5fc0d4e18a5b865a166b486b4836bc822e8392d0","Message":"Merge branch 'hljTest' into main\n\n集成豆包歌词起草、Tesla P4 出歌修复(fp32+int8+DiT offload)、\nnginx HTTPS 总入口 + systemd 常驻部署、web basePath '/song'。\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-05T20:59:21-07:00"},"CompareURL":"luoanwu/song-generation/compare/d28a8594e6cf9091cdf9ccd0fad377041dfaf727...5fc0d4e18a5b865a166b486b4836bc822e8392d0","Len":9}...
|
1785990478
|
Edit
Delete
|
|
20995
|
5
|
5
|
7
|
53
|
0
|
0
|
refs/heads/hljTest
|
0
|
{"Commits":[{"Sha1":"109f2b36f {"Commits":[{"Sha1":"109f2b36f24f3ecc422affedfb31de25af25977c","Message":"Merge origin/main into hljTest\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-06T13:45:25+08:00"},{"Sha1":"5fc0d4e18a5b865a166b486b4836bc822e8392d0","Message":"Merge branch 'hljTest' into main\n\n集成豆包歌词起草、Tesla P4 出歌修复(fp32+int8+DiT offload)、\nnginx HTTPS 总入口 + systemd 常驻部署、web basePath '/song'。\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-05T20:59:21-07:00"},{"Sha1":"67970c1b0a1dcb0e91d17be0a26611d01e28f35c","Message":"feat: 歌曲在线回放链路 + 曲库播放 UI\n\n- 新增 song-playback.service.ts:短时随机凭证签发,浏览器分段播放\n- songs.controller.ts:Range 响应支持 FLAC 分段流式回放,不预下载\n- LibraryView 接入在线播放交互;api.ts/contracts 同步回放契约\n- 刷新治理 reports 与 GPU 部署校验(check-deployment.mjs)\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-05T20:59:07-07:00"}],"HeadCommit":{"Sha1":"109f2b36f24f3ecc422affedfb31de25af25977c","Message":"Merge origin/main into hljTest\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-06T13:45:25+08:00"},"CompareURL":"luoanwu/song-generation/compare/da3f6895d371408052023bc1698549e1f348f04a...109f2b36f24f3ecc422affedfb31de25af25977c","Len":3}...
|
1785995712
|
Edit
Delete
|
|
19837
|
7
|
5
|
7
|
53
|
0
|
0
|
refs/heads/hljTest
|
0
|
|
1785386561
|
Edit
Delete
|
|
19839
|
7
|
5
|
7
|
53
|
0
|
0
|
refs/heads/hljTest
|
0
|
{"Commits":[{"Sha1":"8b0729c9b {"Commits":[{"Sha1":"8b0729c9b6d46b1dd46a9f2f4b7536a5106a812e","Message":"fix(engine): Tesla P4 出歌链路修复(fp32+int8量化+DiT CPU offload)\n\nP4(sm_61 Pascal, 8GB) 上出歌此前必失败,根因是四个耦合约束:\n- fp16(默认)在 DiT 采样溢出产 NaN latents;唯一数值稳定路径是 fp32\n- fp32 DiT 权重 ~7.3GB,引擎「先整体搬 GPU 再量化」,加载即 OOM\n- 引擎 HTTP 出歌懒加载路径漏传 quantization,tier3 的量化默认成死代码\n- Pascal 默认降级的 w8a8_dynamic 张量不支持跨设备搬运,与 DiT offload 冲突\n\n有效组合: fp32 + int8_weight_only 量化 + DiT CPU offload + expandable_segments,\nDiT 在 CPU 上量化为 int8 后分层搬 GPU,常驻显存仅 ~387MB。实测 30s 歌成功落盘 FLAC。\n\n- start-engine-p4.sh: 注入上述全部运行时开关\n- deploy/ace-step/patches/: 固化引擎侧改动(startup_model_init.py 接通 quantization)\n- bootstrap-engine.sh / Dockerfile.tesla-p4: 引擎重建时自动应用补丁(引擎目录 gitignored)\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T12:42:31+08:00"},{"Sha1":"c53b6955d7851b95d797b90087813d6a2a83d32f","Message":"feat: 新增 Tesla P4 引擎启动脚本(禁用 cuDNN)\n\n随 torch 2.5.1+cu121 的 cuDNN 9.1.9 在 Pascal(sm_61) 上找不到卷积算法\n(DiT proj_in Conv1d 报 \"GET was unable to find an engine to execute this\ncomputation\",fp16/fp32 皆然)。P4 无 Tensor Core,cuDNN 不带来加速,\n故启动时注入 torch.backends.cudnn.enabled=False,卷积回退原生 CUDA kernel。\n同时套用 Pascal 兼容开关(5Hz LM/LLM 走 pt backend)。\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T09:40:48+08:00"},{"Sha1":"51cd9fe059767d2377bd6292cf1913a9885f8cd7","Message":"feat: 歌词起草接入豆包大模型 + 本地/公网运行配置\n\n歌词起草从纯前端模板改为调用豆包(火山引擎 Ark,OpenAI 兼容)大模型:\n- contracts 新增 lyrics 域(draftLyricSchema 入参/响应契约)\n- 后端新建 lyrics 模块:POST /api/lyrics/draft,未配置 DOUBAO_API_KEY 时 503\n- 前端起草按钮改调后端,大模型不可用时降级回本地模板草稿,不阻断创作\n- .env.example 登记 DOUBAO_API_KEY/BASE_URL/MODEL(真实密钥仅在 gitignored 的 .env)\n\n运行配置:docker-compose Redis 端口参数化、前端 dev 绑 0.0.0.0 以支持公网访问\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-29T18:01:05+08:00"}],"HeadCommit":{"Sha1":"8b0729c9b6d46b1dd46a9f2f4b7536a5106a812e","Message":"fix(engine): Tesla P4 出歌链路修复(fp32+int8量化+DiT CPU offload)\n\nP4(sm_61 Pascal, 8GB) 上出歌此前必失败,根因是四个耦合约束:\n- fp16(默认)在 DiT 采样溢出产 NaN latents;唯一数值稳定路径是 fp32\n- fp32 DiT 权重 ~7.3GB,引擎「先整体搬 GPU 再量化」,加载即 OOM\n- 引擎 HTTP 出歌懒加载路径漏传 quantization,tier3 的量化默认成死代码\n- Pascal 默认降级的 w8a8_dynamic 张量不支持跨设备搬运,与 DiT offload 冲突\n\n有效组合: fp32 + int8_weight_only 量化 + DiT CPU offload + expandable_segments,\nDiT 在 CPU 上量化为 int8 后分层搬 GPU,常驻显存仅 ~387MB。实测 30s 歌成功落盘 FLAC。\n\n- start-engine-p4.sh: 注入上述全部运行时开关\n- deploy/ace-step/patches/: 固化引擎侧改动(startup_model_init.py 接通 quantization)\n- bootstrap-engine.sh / Dockerfile.tesla-p4: 引擎重建时自动应用补丁(引擎目录 gitignored)\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T12:42:31+08:00"},"CompareURL":"luoanwu/song-generation/compare/d28a8594e6cf9091cdf9ccd0fad377041dfaf727...8b0729c9b6d46b1dd46a9f2f4b7536a5106a812e","Len":3}...
|
1785386561
|
Edit
Delete
|
|
19869
|
7
|
5
|
7
|
53
|
0
|
0
|
refs/heads/hljTest
|
0
|
{"Commits":[{"Sha1":"ea37f6993 {"Commits":[{"Sha1":"ea37f699381c4dbc2445e6be1d3c1fa9bd0feb6a","Message":"chore(deploy): 纳入裸机常驻部署的 systemd 单元\n\n本地 pnpm 直跑方式对外部署时的三个 systemd 单元(引擎/后端/前端),\n开机自启 + 崩溃自动重启。当前生产机即用此方式部署。\n\n- acestep-engine.service: 引擎(8001),跑 start-engine-p4.sh\n- song-api.service: NestJS 后端(3201, start:prod)\n- song-web.service: Next.js 前端(3101, next start),对外唯一入口\n- README: 安装/build 前置/运维命令/注意事项\n\n单元内容与 /etc/systemd/system 已运行版本一致。DB/Redis 为 docker 容器,不在此管理。\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T13:32:08+08:00"}],"HeadCommit":{"Sha1":"ea37f699381c4dbc2445e6be1d3c1fa9bd0feb6a","Message":"chore(deploy): 纳入裸机常驻部署的 systemd 单元\n\n本地 pnpm 直跑方式对外部署时的三个 systemd 单元(引擎/后端/前端),\n开机自启 + 崩溃自动重启。当前生产机即用此方式部署。\n\n- acestep-engine.service: 引擎(8001),跑 start-engine-p4.sh\n- song-api.service: NestJS 后端(3201, start:prod)\n- song-web.service: Next.js 前端(3101, next start),对外唯一入口\n- README: 安装/build 前置/运维命令/注意事项\n\n单元内容与 /etc/systemd/system 已运行版本一致。DB/Redis 为 docker 容器,不在此管理。\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T13:32:08+08:00"},"CompareURL":"luoanwu/song-generation/compare/8b0729c9b6d46b1dd46a9f2f4b7536a5106a812e...ea37f699381c4dbc2445e6be1d3c1fa9bd0feb6a","Len":1}...
|
1785389542
|
Edit
Delete
|
|
19910
|
7
|
5
|
7
|
53
|
0
|
0
|
refs/heads/hljTest
|
0
|
{"Commits":[{"Sha1":"e8b913f56 {"Commits":[{"Sha1":"e8b913f5667fb8a1812a240ef11d6dc579839351","Message":"chore(deploy): 纳入 nginx HTTPS 总入口配置与部署说明\n\ngeneration.g-hi.com 经 nginx(443) 分流:/ws→3201、其余→3101(Next),\nHTTP 跳转 HTTPS;IP/其它域名兜底回退到同机 voiceprint(8443)。\n配置与说明沉淀到 deploy/nginx/,并同步更新 systemd/README 的服务拓扑。\n证书与 .env 不入库。\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T14:22:31+08:00"}],"HeadCommit":{"Sha1":"e8b913f5667fb8a1812a240ef11d6dc579839351","Message":"chore(deploy): 纳入 nginx HTTPS 总入口配置与部署说明\n\ngeneration.g-hi.com 经 nginx(443) 分流:/ws→3201、其余→3101(Next),\nHTTP 跳转 HTTPS;IP/其它域名兜底回退到同机 voiceprint(8443)。\n配置与说明沉淀到 deploy/nginx/,并同步更新 systemd/README 的服务拓扑。\n证书与 .env 不入库。\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T14:22:31+08:00"},"CompareURL":"luoanwu/song-generation/compare/ea37f699381c4dbc2445e6be1d3c1fa9bd0feb6a...e8b913f5667fb8a1812a240ef11d6dc579839351","Len":1}...
|
1785392662
|
Edit
Delete
|
|
19933
|
7
|
5
|
7
|
53
|
0
|
0
|
refs/heads/hljTest
|
0
|
{"Commits":[{"Sha1":"04835a06e {"Commits":[{"Sha1":"04835a06e70f200230a21a912961afcbd6c503fd","Message":"docs: 重写 docs/README 为本项目(歌词→歌曲批量生产)说明\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T14:45:29+08:00"}],"HeadCommit":{"Sha1":"04835a06e70f200230a21a912961afcbd6c503fd","Message":"docs: 重写 docs/README 为本项目(歌词→歌曲批量生产)说明\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T14:45:29+08:00"},"CompareURL":"luoanwu/song-generation/compare/e8b913f5667fb8a1812a240ef11d6dc579839351...04835a06e70f200230a21a912961afcbd6c503fd","Len":1}...
|
1785395827
|
Edit
Delete
|
|
20459
|
7
|
5
|
7
|
53
|
0
|
0
|
refs/heads/hljTest
|
0
|
{"Commits":[{"Sha1":"da3f6895d {"Commits":[{"Sha1":"da3f6895d371408052023bc1698549e1f348f04a","Message":"chore(web): 整合服务器部署接入 basePath: '/song'\n\nnginx 整合服务器 (/etc/nginx/sites-enabled/00-incoming.conf) 已按\nbasePath 模式把 /song/* 反代到本仓 web(:3101)、/song-api/* 反代到\nAPI(:3201)。web 不加 basePath 时 next 端对 /_next/* 资源按根路径\n提供,nginx 转发到 :3101 后 404。\n\n改动:\n- 非 capacitor 构建启用 basePath: '/song'(capacitor 静态导出仍\n 走 out/,绝对 URL 直连后端,不需 basePath)。\n- 增补一段注释说明与 nginx /song 路由的对应关系。\n\ndev 访问 http://localhost:3101/song/,与 generation.g-hi.com\n线上 /song/ 同源。\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"luoanwu@g-hi.com","AuthorName":"luoanwu","CommitterEmail":"luoanwu@g-hi.com","CommitterName":"luoanwu","Timestamp":"2026-08-04T14:13:00+08:00"}],"HeadCommit":{"Sha1":"da3f6895d371408052023bc1698549e1f348f04a","Message":"chore(web): 整合服务器部署接入 basePath: '/song'\n\nnginx 整合服务器 (/etc/nginx/sites-enabled/00-incoming.conf) 已按\nbasePath 模式把 /song/* 反代到本仓 web(:3101)、/song-api/* 反代到\nAPI(:3201)。web 不加 basePath 时 next 端对 /_next/* 资源按根路径\n提供,nginx 转发到 :3101 后 404。\n\n改动:\n- 非 capacitor 构建启用 basePath: '/song'(capacitor 静态导出仍\n 走 out/,绝对 URL 直连后端,不需 basePath)。\n- 增补一段注释说明与 nginx /song 路由的对应关系。\n\ndev 访问 http://localhost:3101/song/,与 generation.g-hi.com\n线上 /song/ 同源。\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"luoanwu@g-hi.com","AuthorName":"luoanwu","CommitterEmail":"luoanwu@g-hi.com","CommitterName":"luoanwu","Timestamp":"2026-08-04T14:13:00+08:00"},"CompareURL":"luoanwu/song-generation/compare/04835a06e70f200230a21a912961afcbd6c503fd...da3f6895d371408052023bc1698549e1f348f04a","Len":1}...
|
1785824016
|
Edit
Delete
|
|
20994
|
7
|
5
|
7
|
53
|
0
|
0
|
refs/heads/hljTest
|
0
|
{"Commits":[{"Sha1":"109f2b36f {"Commits":[{"Sha1":"109f2b36f24f3ecc422affedfb31de25af25977c","Message":"Merge origin/main into hljTest\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-06T13:45:25+08:00"},{"Sha1":"5fc0d4e18a5b865a166b486b4836bc822e8392d0","Message":"Merge branch 'hljTest' into main\n\n集成豆包歌词起草、Tesla P4 出歌修复(fp32+int8+DiT offload)、\nnginx HTTPS 总入口 + systemd 常驻部署、web basePath '/song'。\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-05T20:59:21-07:00"},{"Sha1":"67970c1b0a1dcb0e91d17be0a26611d01e28f35c","Message":"feat: 歌曲在线回放链路 + 曲库播放 UI\n\n- 新增 song-playback.service.ts:短时随机凭证签发,浏览器分段播放\n- songs.controller.ts:Range 响应支持 FLAC 分段流式回放,不预下载\n- LibraryView 接入在线播放交互;api.ts/contracts 同步回放契约\n- 刷新治理 reports 与 GPU 部署校验(check-deployment.mjs)\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-05T20:59:07-07:00"}],"HeadCommit":{"Sha1":"109f2b36f24f3ecc422affedfb31de25af25977c","Message":"Merge origin/main into hljTest\n\nCo-authored-by: Qwen-Coder \u003cqwen-coder@alibabacloud.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-06T13:45:25+08:00"},"CompareURL":"luoanwu/song-generation/compare/da3f6895d371408052023bc1698549e1f348f04a...109f2b36f24f3ecc422affedfb31de25af25977c","Len":3}...
|
1785995712
|
Edit
Delete
|
|
15802
|
5
|
1
|
5
|
54
|
0
|
0
|
|
1
|
|
1783052658
|
Edit
Delete
|
|
15803
|
5
|
5
|
5
|
54
|
0
|
0
|
refs/heads/main
|
1
|
|
1783052672
|
Edit
Delete
|
|
15804
|
5
|
5
|
5
|
54
|
0
|
0
|
refs/heads/main
|
1
|
{"Commits":[{"Sha1":"f98acd04c {"Commits":[{"Sha1":"f98acd04c6fe50956d8cf89552a352c8893f037d","Message":"chore(reports): refresh runtime acceptance evidence\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-02T21:23:52-07:00"},{"Sha1":"1dc0c63efdf29c804f63ca2849e4e570a9cb9120","Message":"feat: harden runtime HTTP acceptance\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-02T21:23:06-07:00"},{"Sha1":"f8ff9b87e68449c3a4d226bf55bbb73180d7c4e8","Message":"feat: harden base framework governance\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-02T01:31:50-07:00"},{"Sha1":"4146021846591d0eb7b5cd8b797c198c00b6aec2","Message":"Add Capacitor export config and absolute API base\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-06-22T20:52:41-07:00"},{"Sha1":"3ad7df35c22d175062b25f5a0456046e65582136","Message":"feat(skills): React+Next.js 前端技能四件套纳入本仓 .claude/skills/\n\n把对应 Vue3+Element Plus 参考样板深化复刻的 React 系技能落入仓库版本管理:\n- frontend-view-react:Next.js App Router + shadcn/ui 列表/表单/详情页 + 完善页面体检清单\n- frontend-api-react:feature api 纯函数 + TanStack Query Hook + Query Key 工厂\n- fullstack-7layer-react:全栈七层(后端 1~5 同源,前端 6~7 用 React 栈)\n- zustand-store:仅 UI/全局态,落实「服务端数据绝不进 Zustand」红线\n\n锚定 docs/standards/frontend-standard.md 与 apps/web 实际运行栈;contracts 入参 Zod\n单源贯穿前端 RHF。CLAUDE.md 同步标注技能已随仓库管理。\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-06-14T19:40:51-07:00"}],"HeadCommit":{"Sha1":"f98acd04c6fe50956d8cf89552a352c8893f037d","Message":"chore(reports): refresh runtime acceptance evidence\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-02T21:23:52-07:00"},"CompareURL":"luoanwu/base-framework/compare/7e269a0aa062715c1751b544cce7e7a8e8bd8bc7...f98acd04c6fe50956d8cf89552a352c8893f037d","Len":10}...
|
1783052672
|
Edit
Delete
|
|
18220
|
5
|
5
|
5
|
54
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"2fa1666f6 {"Commits":[{"Sha1":"2fa1666f6bb69b7784199199afde715a54856ac8","Message":"feat(governance): machineize docs-truth gate, fix Fastify Redis parsing, harden test-base guard\n\n- Add check:docs-truth (C14 machineized): targeted assertions catching README/standards\n drift from runtime truth (dual-backend positioning, tenant-aware envelope shape, NestJS\n HTTP engine, ghost assets like commitlint/RHF), wired into pnpm check + governance ratchet.\n- Fix Fastify BullMQ Redis URL parsing to include password/db (C15), matching NestJS's\n parseRedisConnection; adds a check:dual-backend tripwire so this can't silently regress.\n Without this, authenticated/non-zero-db Redis environments would split pub/sub and\n BullMQ onto different logical Redis instances.\n- Close G15: check:runtime / check:ui preflight now requires explicit REDIS_URL (no more\n silent localhost:6379 default) and enforces a base_framework* db name convention, with\n GOVERNANCE_DB_NAME_OVERRIDE=1 as an explicit escape hatch.\n- Correct stale doc claims across README/docs/standards to match actual code (Fastify is a\n full dual-backend peer per ADR-0009, not an optional fallback; envelope carries tenantId;\n NestJS uses platform-express not the Fastify adapter; annotate unimplemented commitlint/RHF\n plans as not-yet-landed).\n- Refresh governance reports/baseline after re-running pnpm check and check:runtime (56/56).\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-22T01:11:05-07:00"},{"Sha1":"8501dc9731b4f0f44ea36d2ffe557577354ebb31","Message":"Refactor governance documentation structure\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-21T08:01:24-07:00"},{"Sha1":"d799b176f2db4f3e538563eeb8228543d24ca639","Message":"feat(runtime): close outbox failure governance gaps\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-05T07:03:20-07:00"},{"Sha1":"43b8c8c943c406733084427f3ad27d836ae75681","Message":"Update governance baseline for UI acceptance\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-04T23:37:30-07:00"}],"HeadCommit":{"Sha1":"2fa1666f6bb69b7784199199afde715a54856ac8","Message":"feat(governance): machineize docs-truth gate, fix Fastify Redis parsing, harden test-base guard\n\n- Add check:docs-truth (C14 machineized): targeted assertions catching README/standards\n drift from runtime truth (dual-backend positioning, tenant-aware envelope shape, NestJS\n HTTP engine, ghost assets like commitlint/RHF), wired into pnpm check + governance ratchet.\n- Fix Fastify BullMQ Redis URL parsing to include password/db (C15), matching NestJS's\n parseRedisConnection; adds a check:dual-backend tripwire so this can't silently regress.\n Without this, authenticated/non-zero-db Redis environments would split pub/sub and\n BullMQ onto different logical Redis instances.\n- Close G15: check:runtime / check:ui preflight now requires explicit REDIS_URL (no more\n silent localhost:6379 default) and enforces a base_framework* db name convention, with\n GOVERNANCE_DB_NAME_OVERRIDE=1 as an explicit escape hatch.\n- Correct stale doc claims across README/docs/standards to match actual code (Fastify is a\n full dual-backend peer per ADR-0009, not an optional fallback; envelope carries tenantId;\n NestJS uses platform-express not the Fastify adapter; annotate unimplemented commitlint/RHF\n plans as not-yet-landed).\n- Refresh governance reports/baseline after re-running pnpm check and check:runtime (56/56).\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-22T01:11:05-07:00"},"CompareURL":"luoanwu/base-framework/compare/f98acd04c6fe50956d8cf89552a352c8893f037d...2fa1666f6bb69b7784199199afde715a54856ac8","Len":4}...
|
1784707902
|
Edit
Delete
|
|
18221
|
5
|
5
|
5
|
54
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"d846832eb {"Commits":[{"Sha1":"d846832ebbe1d481019744f038672b935ad09937","Message":"fix(web): scope E2E user-CRUD assertion to users panel, not full page\n\nPorted from the claude/gallant-diffie-a541dd worktree, whose committed\nhistory was already fully contained in main but whose working tree held\nthis un-landed fix.\n\nNarrow the delete-then-hidden assertion in acceptance.spec.ts to\ngetByTestId(\"users-panel\") instead of the whole page. After d799b17's\noutbox fix, user.created events reliably reach the EventFeed and echo\nthe created user's name in the event JSON, so a page-wide getByText\ncould still match the name via the event log after the row itself was\nremoved, producing a false \"still visible\" read on flaky runs.\n\nRecords this as C16 in CLAUDE.md / governance-experience.md (C14 was\nalready taken by the docs-truth work landed in 2fa1666).\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-22T01:23:10-07:00"}],"HeadCommit":{"Sha1":"d846832ebbe1d481019744f038672b935ad09937","Message":"fix(web): scope E2E user-CRUD assertion to users panel, not full page\n\nPorted from the claude/gallant-diffie-a541dd worktree, whose committed\nhistory was already fully contained in main but whose working tree held\nthis un-landed fix.\n\nNarrow the delete-then-hidden assertion in acceptance.spec.ts to\ngetByTestId(\"users-panel\") instead of the whole page. After d799b17's\noutbox fix, user.created events reliably reach the EventFeed and echo\nthe created user's name in the event JSON, so a page-wide getByText\ncould still match the name via the event log after the row itself was\nremoved, producing a false \"still visible\" read on flaky runs.\n\nRecords this as C16 in CLAUDE.md / governance-experience.md (C14 was\nalready taken by the docs-truth work landed in 2fa1666).\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-22T01:23:10-07:00"},"CompareURL":"luoanwu/base-framework/compare/2fa1666f6bb69b7784199199afde715a54856ac8...d846832ebbe1d481019744f038672b935ad09937","Len":1}...
|
1784708606
|
Edit
Delete
|
|
18222
|
5
|
5
|
5
|
54
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"4e0ae0a55 {"Commits":[{"Sha1":"4e0ae0a55bf748faaa3a1f2b937b4375c1cf7fa8","Message":"chore(reports): refresh publish acceptance evidence\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-22T01:26:24-07:00"}],"HeadCommit":{"Sha1":"4e0ae0a55bf748faaa3a1f2b937b4375c1cf7fa8","Message":"chore(reports): refresh publish acceptance evidence\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-22T01:26:24-07:00"},"CompareURL":"luoanwu/base-framework/compare/d846832ebbe1d481019744f038672b935ad09937...4e0ae0a55bf748faaa3a1f2b937b4375c1cf7fa8","Len":1}...
|
1784708793
|
Edit
Delete
|
|
18223
|
5
|
5
|
5
|
54
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"e109e8057 {"Commits":[{"Sha1":"e109e80574304306c9a5911d5e923d2dc7e6c0f4","Message":"docs(governance): record verified publish baseline\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-22T01:27:34-07:00"}],"HeadCommit":{"Sha1":"e109e80574304306c9a5911d5e923d2dc7e6c0f4","Message":"docs(governance): record verified publish baseline\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-22T01:27:34-07:00"},"CompareURL":"luoanwu/base-framework/compare/4e0ae0a55bf748faaa3a1f2b937b4375c1cf7fa8...e109e80574304306c9a5911d5e923d2dc7e6c0f4","Len":1}...
|
1784709216
|
Edit
Delete
|
|
18224
|
5
|
5
|
5
|
54
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"02a656716 {"Commits":[{"Sha1":"02a656716b10d2a5a4937ba01086cbd0a9ff4b85","Message":"chore(reports): refresh post-merge acceptance evidence\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-22T01:34:39-07:00"}],"HeadCommit":{"Sha1":"02a656716b10d2a5a4937ba01086cbd0a9ff4b85","Message":"chore(reports): refresh post-merge acceptance evidence\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-22T01:34:39-07:00"},"CompareURL":"luoanwu/base-framework/compare/e109e80574304306c9a5911d5e923d2dc7e6c0f4...02a656716b10d2a5a4937ba01086cbd0a9ff4b85","Len":1}...
|
1784709310
|
Edit
Delete
|
|
20054
|
5
|
5
|
5
|
54
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"da8f52db3 {"Commits":[{"Sha1":"da8f52db37f5b42d035f92ad27a45067bc57dfa9","Message":"feat(governance): harden report provenance and UI acceptance\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T07:40:06-07:00"},{"Sha1":"4940be24ba6bfff2eefb2284f8ce66c9cbd1f326","Message":"docs(governance): record remote branch consolidation\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-22T01:35:33-07:00"}],"HeadCommit":{"Sha1":"da8f52db37f5b42d035f92ad27a45067bc57dfa9","Message":"feat(governance): harden report provenance and UI acceptance\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T07:40:06-07:00"},"CompareURL":"luoanwu/base-framework/compare/02a656716b10d2a5a4937ba01086cbd0a9ff4b85...da8f52db37f5b42d035f92ad27a45067bc57dfa9","Len":2}...
|
1785422433
|
Edit
Delete
|
|
20055
|
5
|
5
|
5
|
54
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"94e3f1b52 {"Commits":[{"Sha1":"94e3f1b529034c902d205637ed69033238b5b594","Message":"docs(governance): record Gitea publish baseline\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T07:41:37-07:00"}],"HeadCommit":{"Sha1":"94e3f1b529034c902d205637ed69033238b5b594","Message":"docs(governance): record Gitea publish baseline\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T07:41:37-07:00"},"CompareURL":"luoanwu/base-framework/compare/da8f52db37f5b42d035f92ad27a45067bc57dfa9...94e3f1b529034c902d205637ed69033238b5b594","Len":1}...
|
1785422513
|
Edit
Delete
|
|
20056
|
5
|
5
|
5
|
54
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"03ef2eb6d {"Commits":[{"Sha1":"03ef2eb6d9d8f94868d95821c22f3c23f7dc7f38","Message":"chore(reports): refresh clean publish evidence\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T07:43:05-07:00"}],"HeadCommit":{"Sha1":"03ef2eb6d9d8f94868d95821c22f3c23f7dc7f38","Message":"chore(reports): refresh clean publish evidence\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-07-30T07:43:05-07:00"},"CompareURL":"luoanwu/base-framework/compare/94e3f1b529034c902d205637ed69033238b5b594...03ef2eb6d9d8f94868d95821c22f3c23f7dc7f38","Len":1}...
|
1785422600
|
Edit
Delete
|
|
24397
|
5
|
5
|
5
|
54
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"4d95adb2e {"Commits":[{"Sha1":"4d95adb2ebe583e4dddbd233cbb4ffb574b17862","Message":"chore(reports): refresh clean publish evidence for realtime work\n\n三级门禁在 clean commit c223f35 上重跑,所有 reports/*.latest.json 的\nprovenance 记为 gitSha=c223f35 / worktreeDirty=false——证据自此绑定具体\n提交,而非「某次本地 dirty 运行」。\n\nCLAUDE.md 证据新鲜度同步改为绑定该提交,并显式声明这只证明「该提交在\n本机通过三级门禁」,推不出远端 CI 已拦截或已部署(G14 仍 OPEN)。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-19T04:35:15-07:00"},{"Sha1":"c223f35e380114edfe1331619928f405cf77eee2","Message":"feat(realtime): 可靠投递 + 定向推送 + 双向控制帧 + 连接可观测\n\n把实时通讯从单向广播推进到「可靠 + 定向 + 双向 + 可观测」四块,\n两后端对等实现,判定逻辑统一收敛到 @repo/contracts 单源。\n\nA 可靠投递闭环(G16 主体闭环)\n- 信封加 id(= outbox 行 id,稳定幂等键)与 seq(自增重放游标);\n 前端去重从内容指纹改为 envelope.id——指纹依赖「重投时 ts 不变」\n 这个不成立的假设,补发路径上必然误判。\n- dispatcher 改 SELECT ... FOR UPDATE SKIP LOCKED 领取,publish 在同一\n 事务内完成;先提交再 publish 会从 at-least-once 退化成 at-most-once。\n- 断线重放:SSE 走标准 Last-Event-ID,WS 走 ?since=;补不齐时回\n replay.gap 让客户端全量重取,绝不静默截断。\n- 新增 outbox.seq 迁移(显式建序列,DEFAULT 在 SQL 里可见)。\n\nB 定向推送(订阅过滤)\n- matchesSubscription / parseSubscription 单源在 contracts;\n types 前缀 + ids 维度,未声明 = 收本租户全部。\n- 定位是租户内的带宽减法,不是权限边界;租户隔离仍是唯一安全边界。\n- ping / replay.gap / connection.* 为连接级消息,无视订阅条件必送。\n\nC 双向通讯(刻意限定为连接控制平面)\n- WS 接受 subscribe / ping 控制帧,应答 connection.ack / connection.error。\n- 红线:控制帧不承载任何业务写入。HTTP 写链上挂着 Zod、状态机守卫、\n 租户绑定、outbox 同事务(P4 四同边界),WS 若能写业务,要么重实现\n 一遍那套保证(P1 双真源),要么绕过(写链治理失守)。\n- 三道闸按成本排序:限流 → 大小/解析 → 应用。\n\nD 连接可观测与背压\n- GET /api/realtime/stats 按请求方租户收口:租户只从鉴权上下文取,\n 不接受 ?tenantId= 覆盖,也不返回全局/分租户明细。\n- 单租户连接上限背压:超限 WS 回 1013、SSE 回 429;被拒连接不登记计数。\n\n验收(本地工作区,PG:55432 + Redis:6382)\n- pnpm check 全绿;pnpm check:runtime 155 tests / 0 failures;\n pnpm check:ui 4 用例 / 0 失败。\n- 棘轮收紧:ownTests 11→24、ownTestCases 60→146、testsPassed 56→155。\n- 负向测试已验证有牙:退回裸 findMany → 20 行被投递 40 次;摘掉订阅\n 过滤 → types/ids 断言红;stats 接受调用方指定租户 → 越权探测红。\n\n治理回灌:CLAUDE.md 真源地图新增 5 条实时口径、基线表新增 5 行指标、\nG16 改为「部分闭环」并列明仍缺的死信告警与多实例端到端验收;\n战役叙事外迁 docs/governance-experience.md。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-19T04:33:54-07:00"}],"HeadCommit":{"Sha1":"4d95adb2ebe583e4dddbd233cbb4ffb574b17862","Message":"chore(reports): refresh clean publish evidence for realtime work\n\n三级门禁在 clean commit c223f35 上重跑,所有 reports/*.latest.json 的\nprovenance 记为 gitSha=c223f35 / worktreeDirty=false——证据自此绑定具体\n提交,而非「某次本地 dirty 运行」。\n\nCLAUDE.md 证据新鲜度同步改为绑定该提交,并显式声明这只证明「该提交在\n本机通过三级门禁」,推不出远端 CI 已拦截或已部署(G14 仍 OPEN)。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-19T04:35:15-07:00"},"CompareURL":"luoanwu/base-framework/compare/03ef2eb6d9d8f94868d95821c22f3c23f7dc7f38...4d95adb2ebe583e4dddbd233cbb4ffb574b17862","Len":2}...
|
1787139335
|
Edit
Delete
|
|
24398
|
5
|
5
|
5
|
54
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"ccbc413ea {"Commits":[{"Sha1":"ccbc413eaf556c59a5c14707ce87d264c050180f","Message":"docs(migration): 回灌 P9——文档内部数字自相矛盾\n\n下游 Digital Employee OS 移植时实测:只改了 CLAUDE.md 的「证据新鲜度」块\n(49 tests),漏了下方 GOVERNANCE-BASELINE 表(仍是源仓的 11/60/56),\n同一份文件里两个数字互相矛盾,而三级门禁全绿。\n\ncheck:docs-truth 是 targeted 断言集,不覆盖数字类事实,抓不到这类漂移。\n数字矛盾比数字过时更险:过时只是陈旧,矛盾意味着至少有一个是编的,\n而读者无从判断是哪个。\n\n按 §5 回灌纪律(「换个移植目标还会再踩吗」→ 会 → 回灌上游),三处同步补齐:\n- 踩坑档案新增 P9\n- 步骤 8 显式点名 GOVERNANCE-BASELINE 表每个数字与发布状态快照,\n 并加警告说明 check:docs-truth 的覆盖边界\n- 验收标准把「证据日期」扩为「证据日期 + 基线表每个数字」\n\n暂未机器化:数字类断言仍靠人工核对,属手册明记的已知缺口。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-19T05:10:13-07:00"}],"HeadCommit":{"Sha1":"ccbc413eaf556c59a5c14707ce87d264c050180f","Message":"docs(migration): 回灌 P9——文档内部数字自相矛盾\n\n下游 Digital Employee OS 移植时实测:只改了 CLAUDE.md 的「证据新鲜度」块\n(49 tests),漏了下方 GOVERNANCE-BASELINE 表(仍是源仓的 11/60/56),\n同一份文件里两个数字互相矛盾,而三级门禁全绿。\n\ncheck:docs-truth 是 targeted 断言集,不覆盖数字类事实,抓不到这类漂移。\n数字矛盾比数字过时更险:过时只是陈旧,矛盾意味着至少有一个是编的,\n而读者无从判断是哪个。\n\n按 §5 回灌纪律(「换个移植目标还会再踩吗」→ 会 → 回灌上游),三处同步补齐:\n- 踩坑档案新增 P9\n- 步骤 8 显式点名 GOVERNANCE-BASELINE 表每个数字与发布状态快照,\n 并加警告说明 check:docs-truth 的覆盖边界\n- 验收标准把「证据日期」扩为「证据日期 + 基线表每个数字」\n\n暂未机器化:数字类断言仍靠人工核对,属手册明记的已知缺口。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-19T05:10:13-07:00"},"CompareURL":"luoanwu/base-framework/compare/4d95adb2ebe583e4dddbd233cbb4ffb574b17862...ccbc413eaf556c59a5c14707ce87d264c050180f","Len":1}...
|
1787141425
|
Edit
Delete
|
|
24399
|
5
|
5
|
5
|
54
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"9513a941a {"Commits":[{"Sha1":"9513a941af257b779d7d2c095dff71172edcefaf","Message":"chore(reports): 刷新静态门禁证据至 e15fa81\n\nCLAUDE.md 改动后静态子报告的 provenance 仍指向 ccbc413,与当前 checkout\n不一致(report-provenance 门禁会红)。在 clean commit 上重跑 pnpm check,\n14 份静态报告统一记为 gitSha=e15fa81 / worktreeDirty=false。\n\nruntime/ui 报告未重跑:本轮为纯文档改动,未触碰任何被它们覆盖的代码,\n其证据仍诚实绑定 c223f35 的实跑,不做无意义刷新。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-19T08:53:15-07:00"},{"Sha1":"e15fa814108637f2484a5be50900fd35a0f05d9d","Message":"docs(claude): 补齐常用命令与运行时拓扑,收敛验证命令双源\n\n对照 /init 的两条标准补齐本文件的实际缺口,治理正文一字未动(纯增量)。\n\n1) 新增「常用命令」小节\n原先只有文件最末尾一个块(install / generate / 三级门禁),缺三类信息:\n- 开发入口与端口(web:3000 / NestJS:3001 / Fastify:3002)\n- 单个测试怎么跑(单文件 / -t 按用例名 / watch)\n- 13 个 check:* 子门禁只写了聚合入口,未说明可单独执行\n同时记入两条本机实证的判责提示:\n- pnpm 锁定 9.15.9,被 pnpm 10 装过会写 store v11,须全量重装 + prisma:generate\n- G15 基座守卫只校验库名前缀、**不校验端口**,故「端口连得上」推不出\n 「基座正确」(2026-08-19 在下游 Digital Employee OS 实际踩到:误用上游\n 容器 PG:55432/Redis:6382 通过守卫,共用 Redis 导致两次时序偶发红)\n\n2) 新增「运行时拓扑」小节\n「真源地图」回答的是「哪份文件说了算」,不回答「请求怎么流」。补一条从\nHTTP 写请求到前端缓存失效的完整事件通路,以及两条读单个文件发现不了的约定:\nNestJS 全局前缀 /api 但 GET /sse/events 被 exclude;WS 用原生 ws 而非\nsocket.io,故协议与 Fastify 侧兼容。\n\n3) 收敛验证命令双源\n文末旧「验证命令」块与新章节重复——同一事实两处维护正是 P1 禁止的漂移温床。\n改为指回顶部,只保留各级门禁的覆盖范围差异(含 check:ui 不覆盖 Fastify\n链路这条 G17 事实)。\n\nAGENTS.md 符号链接完好,check:governance-docs / check:docs-truth 均绿。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-19T08:52:41-07:00"}],"HeadCommit":{"Sha1":"9513a941af257b779d7d2c095dff71172edcefaf","Message":"chore(reports): 刷新静态门禁证据至 e15fa81\n\nCLAUDE.md 改动后静态子报告的 provenance 仍指向 ccbc413,与当前 checkout\n不一致(report-provenance 门禁会红)。在 clean commit 上重跑 pnpm check,\n14 份静态报告统一记为 gitSha=e15fa81 / worktreeDirty=false。\n\nruntime/ui 报告未重跑:本轮为纯文档改动,未触碰任何被它们覆盖的代码,\n其证据仍诚实绑定 c223f35 的实跑,不做无意义刷新。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-19T08:53:15-07:00"},"CompareURL":"luoanwu/base-framework/compare/ccbc413eaf556c59a5c14707ce87d264c050180f...9513a941af257b779d7d2c095dff71172edcefaf","Len":2}...
|
1787154806
|
Edit
Delete
|
|
26405
|
5
|
5
|
5
|
54
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"53991090b {"Commits":[{"Sha1":"53991090b821b76dff11eee3a2e92806ed3ab173","Message":"chore(reports): 刷新 OS 产品验收证据\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-26T16:22:27-07:00"},{"Sha1":"71e6ef64d1ee41cb39ffae15a73f049c42fb82b1","Message":"feat(os): 增加可装载基础框架产品\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-26T16:20:54-07:00"}],"HeadCommit":{"Sha1":"53991090b821b76dff11eee3a2e92806ed3ab173","Message":"chore(reports): 刷新 OS 产品验收证据\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"luoguoguo","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"luoguoguo","Timestamp":"2026-08-26T16:22:27-07:00"},"CompareURL":"luoanwu/base-framework/compare/9513a941af257b779d7d2c095dff71172edcefaf...53991090b821b76dff11eee3a2e92806ed3ab173","Len":2}...
|
1787787571
|
Edit
Delete
|
|
26781
|
5
|
5
|
5
|
54
|
0
|
0
|
refs/heads/governance/deep-optimization
|
0
|
|
1788061409
|
Edit
Delete
|
|
26782
|
5
|
5
|
5
|
54
|
0
|
0
|
refs/heads/governance/deep-optimization
|
0
|
{"Commits":[{"Sha1":"4a707c3d3 {"Commits":[{"Sha1":"4a707c3d3ec98b8ab45864a1b40b941589433914","Message":"chore(reports): 刷新治理证据至 b1510b5(clean,192 tests)\n\n静态 11 项门禁 + 治理棘轮 + lint + typecheck 全绿;\n真实 PG + Redis 验收 192 tests / 0 failures,provenance 绑定 clean commit b1510b5。\n\n⚠️ 作用域:本轮证据只覆盖静态与运行态两级。浏览器级 check:ui **未重跑**——\n本机无 Node 运行时(全部门禁在 node:22 容器内挂载工作树执行),而容器内没有\nLinux 版 Playwright 浏览器(宿主缓存的是 macOS 构建)。按事实作用域表,\n不得据此宣称 UI 层已验证。\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-08-29T20:40:42-07:00"},{"Sha1":"b1510b5a203f7847dc99a0962cd30f36e6901dce","Message":"docs(standards): 修正与实现相悖的 API 标准 + 幽灵路径机器化(批次④·下)\n\n## api-standard 的四项核心约定与实现系统性相悖\n\nCLAUDE.md 真源地图把 docs/standards/*.md 列为「工程标准口径」,使用入口表还直接路由读者\n去读它。但 api-standard 的四项核心约定没有一项与两后端实际实现一致:\n`/api/v1/` 前缀(实际 `/api`,未版本化)、`{ data: ... }` 响应包裹(实际裸资源)、\n嵌套 `error.{code,statusCode,timestamp,path}` 错误体(实际是顶层扁平的 ApiErrorBody)、\n以及一个从不存在的 `packages/contracts/src/errors/error-codes.ts`。\n\n照着它落地新模块,会做出与 contracts `ApiErrorBody` 及 web `ApiError` 消费方直接冲突的接口。\n而 review-standard 的检查清单还会让 reviewer 去核对那个幽灵文件。\n\n- 按本仓既有的 C14「标准 vs 现状」惯例(frontend-standard / backend-standard / git-standard\n 都已有)在 api-standard 头部加对照表,逐项写明目标态与当前真相,并说明改动方向:\n 要落地目标态先改实现与契约,不要反过来照着文档改接口\n- 修正 review-standard 的检查项指向真实位置\n\n## 幽灵路径机器化(C14-⑤ 同族,扫描面扩到 standards)\n\n新增 docs-truth 断言:standards 引用的 `packages/contracts/src/**.ts` 路径必须真实存在,\n否则须在同一行显式标注「目标态 / 当前不存在」。扫描面用 readdirSync 覆盖 docs/standards 全量,\n不硬编码文件清单——旧的幽灵路径断言正是因为清单式扫描漏掉了 docs/README.md 本身而失守过。\n\n该断言上线即多抓到一处此前没人发现的幽灵路径(naming-standard 的\n`packages/contracts/src/store/store.types.ts`),已一并标注。\n负向测试:去掉 review-standard 的诚实标注即红。\n\n## owner-matrix 补录 OS 产品两张业务表\n\n「先登记后建表」是本仓自己立的规则,却被自己的 C20/G23 战役打破:OS 产品包新建了\n`juhai_baseframework_orders` / `..._order_events` 两张带状态机的表却从未登记。\n补录两行并写明 `products/` 下的对象同样要登记(归属真源是 product.manifest.json 的\npersistence.tenantModels,本表挂索引行)。\n\n验收:naming / docs-truth / governance-docs / 治理棘轮均 exit 0。\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-08-29T20:39:02-07:00"},{"Sha1":"033e8159c23f4766493fd140ffa7aa923ebe1182","Message":"fix(ops): 优雅停机接线——Fastify 的 onClose 钩子此前全是死代码(批次④·中)\n\n## Fastify 从不优雅停机\n\nserver.ts 没有任何信号处理,也从不调用 app.close():进程收到 SIGTERM 走默认处理直接终止。\n后果是 prisma / redis / outbox / queue 四个插件里**精心写好的 onClose 钩子从未被执行过**——\nBullMQ worker 不 close(在途 job 只能靠 stalled 恢复)、outbox 轮询事务可能被拦腰砍断、\nWS/SSE 连接收不到 close 帧。而 NestJS 侧早有 enableShutdownHooks,两后端停机行为实质分叉。\n\n存在性门禁看得见「钩子写了」,看不见「它从来没被调用过」——这正是 G17 说的行为级盲区。\n\n- server.ts 补 SIGTERM/SIGINT → app.close()(Fastify 会按注册逆序执行全部 onClose),\n 带 10s 超时兜底(卡住的清理不能让容器一直不退)与重复信号防抖\n\n## NestJS 的 Redis 连接从不 quit,且注释谎称有人管\n\nREDIS_PUB / REDIS_SUB 由 useFactory 裸建,没有任何销毁钩子;而 event-bus.service.ts\n的注释写着「redisSub 连接由 RedisModule 统一关闭」——注释与行为相反,于是没人会去查。\n真实后果:停机时连接不回收(两个 acceptance 测试的 afterAll 至今还得手动 quit 才能让进程退出)。\n\n- RedisModule 实现 onApplicationShutdown,quit 两个连接\n- 修正 event-bus 的失实注释\n\n## 防回潮\n\ncheck:dual-backend 新增 4 条停机接线绊网(两后端各自的信号处理 / app.close /\nenableShutdownHooks / Redis 关闭钩子),负向测试已验证删掉信号处理即红。\n\n验收:真实 PG + Redis 192 tests / 0 failures;静态门禁 + 棘轮 + typecheck 5/5 + lint 2/2 全绿。\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-08-29T20:35:43-07:00"},{"Sha1":"44cbbaeacf5f53e08e6e3f48a6d8bd2c3327d2de","Message":"fix(governance): 写链守护补齐五条已验证绕过(批次④·上)\n\ncheck:write-guard 守的是 P4「所有写显式带 tenant_id + 状态迁移乐观锁」这条最高优先级红线,\n但它自身存在五条可复现的绕过——每一条都能让违规代码拿到绿盘:\n\n1. **折行**:逐行匹配下 `await tx.order\\n .update({...})` 完全隐形。这甚至无需恶意——\n Prettier 对长链式调用本来就这样折行。\n2. **方括号访问**:`tx[\"order\"].update(` 用 `\\w+` 匹配不到,换个写法整条溜过去。\n3. **upsert 不在禁止模式里**:它与 update/delete 同源(同样只接受唯一键定位),\n TOCTOU 缝隙一模一样,却从未被拦。\n4. **where 里的 tenantId 从未被验证**:门禁 reason 一直宣称 where 是 `{ id, tenantId }`,\n 但只检查了方法名与 state 前置条件——`updateMany({ where: { id } })` 照样绿,\n 而那正是跨租户写。\n5. **0 行拒绝可被一行注释满足**:断言对原始源码做 includes,\n `// if (updated.count === 0)` 就能让一段被注释掉的防护报绿。\n\n修法:\n- 新增 scripts/lib/source-text.mjs 作为公共单源(stripComments / blankComments / lineOf)。\n 「注释掉的代码仍满足断言」这个形态 check-schema-sync 在 2026-08-15 已实锤并就地修过,\n 但同类断言散布在多个脚本里各自对原始源码匹配——按 P5,实锤过的教训必须推广,\n 否则只是把同一个洞留在别处。\n- A 部分改为「注释置空但保持字符偏移」后整体跨行匹配,再由偏移反推行号\n (逐行挡不住折行,整体匹配又需要能定位);禁止模式补 upsert 与方括号访问。\n- B 部分先提取 updateMany 的 where 块再逐项断言(state 前置条件 + tenantId),\n 且全部在剥注释后的源码上跑。\n\n验收:五条绕过逐一注入验证必红、逐一恢复现场;正向 10 项静态门禁 + 治理棘轮全绿。\nCLAUDE.md 基线表 write-guard 行同步为实际覆盖面(此前的描述比实际防线宽)。\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-08-29T20:32:47-07:00"},{"Sha1":"c494fc7d2e6b1497647b2ca9601766626dd4775d","Message":"feat(auth): G8 生产级租户验签闭环——回退翻转 + 401 判责 + 降级通道清除(批次③)\n\nCLAUDE.md 里标注「动工前须用户点名」的最大 OPEN 缺口,验签半边落地。\n\n## 回退翻转(G8 的核心)\n\ndemo 期口径是 `Bearer 解析 ?? x-tenant-id`。接入验签后这个 `??` 会变成**降级攻击面**:\n伪造一个签名无效的 Bearer → 验签失败 → 自动落回客户端自报的 demo 头,等于没验。\n且只翻转这一处并不够——裸 `?tenantId=` 是另一条更彻底的通道,它连伪造 token 都不需要。\n\n- jwt 模式下:带 Authorization 或 ?access_token= 即**强制验签,失败一律 401,绝不回退**;\n x-tenant-id / ?tenantId= / `tenant:\u003cid\u003e` 简写整条不承认\n- demo 模式保留原型四级来源(本地与既有验收测试零改动),但**生产跑 demo 即拒绝启动**——\n 漏配鉴权应当是「起不来」,不是「起来了但谁都能进」\n\n## 架构切分:策略在 contracts,验签由后端注入\n\ncontracts 被 web 直接 import,把 jose 与密钥语义拉进去会泄漏到浏览器包。故:\n- `decideTenantResolution`(谁可信、失败怎么判)在 contracts,两后端共用,13 条单测覆盖\n- jose 验签在各后端(NestJS `src/auth/`、Fastify `src/plugins/auth.ts`)\n- `tenantFromBearerToken` 更名 `unsafeTenantClaimFromToken`:函数名里的 unsafe 是给 review 看的,\n 它只该用于浏览器 UI 预填与 demo 模式\n\nNestJS 的判定必须放 Guard 而非 `@TenantId()` 参数装饰器——后者的回调是同步的,\n判定留在那里就永远接不上异步的 JWKS 验签。\n\n## 顺带堵掉的三个额外攻击面(安全审计发现,均在已登记 G8 描述之外)\n\n1. **tenantId 是攻击者可控的自由文本**:无格式/长度约束时可凭空创建租户分区、\n 可用超长值撑爆 `@@unique([tenantId,email])` 的 btree 索引行打出稳定 500、\n 可用换行伪造日志行。现统一过 normalizeTenantId(≤128 + 受控字符集)。\n2. **重复查询参数的类型混淆**:Fastify 把 `?access_token=a\u0026access_token=b` 解析成数组,\n `typeof v === 'string'` 判定直接落空 → 静默跳过 token 分支 → 落到裸 ?tenantId=;\n 而 NestJS 的 `URLSearchParams.get()` 取第一个值。**同一条请求两后端两种身份判定**——\n 既是真实越权通道,也是 G17 行为分叉的活体实证。两侧统一取第一个值。\n3. **凭证进日志**:浏览器 EventSource/WS 无法自定义头,token 只能进 `?access_token=`,\n 而 pino 默认序列化器把完整 url 写进日志——接入真实验签后就是每次建连落盘一枚有效 JWT。\n Fastify logger 加 redact(authorization / cookie / req.url)。\n\n## 判责矩阵补上 401\n\n此前缺凭证一律回 400,把「未认证」伪装成「参数写错了」,客户端无从区分「该去登录」\n和「该改请求」。现 contracts 定义 UNAUTHENTICATED / INVALID_TOKEN / TENANT_FORBIDDEN;\n响应体**只回稳定错误码**,验签失败细节只进日志(区分「签名不对/已过期/issuer 不符」\n对攻击者是免费的探测反馈)。WS 保持 close(1008) 而非握手期 401——两后端同口径,\n且浏览器对握手 401 不暴露任何原因。\n\n## 验收\n\n真实 PG + Redis:**192 tests / 0 failures**(地板 161 → 192,只收紧)。\n两后端各 9 条 jwt 判责用例:正确签名放行 / 无凭证 401 / **伪造签名 + 合法 x-tenant-id 仍 401**\n/ 裸 demo 头 401 / 过期 401 / alg:none 401 / 无租户 claim 401 / health 免鉴权 / 重复参数不落 victim。\n新增 check:dual-backend 的 G8 绊网 5 条,每条均有负向红证据;其中「算法白名单」一条初版\n被自身的类型声明 `algorithms: string[]` 满足而无法变红,已改绑 jwtVerify 实参后重测。\n静态门禁 10/10 + 治理棘轮 + typecheck 5/5 + lint 2/2 全绿。\n\nRLS 未叠加(结构已就绪,阻碍在 CI 超级用户/单例 Prisma/dispatcher 跨租户扫描三处),\nweb 构建期内联 token 与 WS Origin 白名单同样登记为 G8 剩余项。\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-08-29T20:27:41-07:00"}],"HeadCommit":{"Sha1":"4a707c3d3ec98b8ab45864a1b40b941589433914","Message":"chore(reports): 刷新治理证据至 b1510b5(clean,192 tests)\n\n静态 11 项门禁 + 治理棘轮 + lint + typecheck 全绿;\n真实 PG + Redis 验收 192 tests / 0 failures,provenance 绑定 clean commit b1510b5。\n\n⚠️ 作用域:本轮证据只覆盖静态与运行态两级。浏览器级 check:ui **未重跑**——\n本机无 Node 运行时(全部门禁在 node:22 容器内挂载工作树执行),而容器内没有\nLinux 版 Playwright 浏览器(宿主缓存的是 macOS 构建)。按事实作用域表,\n不得据此宣称 UI 层已验证。\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-08-29T20:40:42-07:00"},"CompareURL":"luoanwu/base-framework/compare/53991090b821b76dff11eee3a2e92806ed3ab173...4a707c3d3ec98b8ab45864a1b40b941589433914","Len":10}...
|
1788061409
|
Edit
Delete
|
|
26785
|
5
|
5
|
5
|
54
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"4a707c3d3 {"Commits":[{"Sha1":"4a707c3d3ec98b8ab45864a1b40b941589433914","Message":"chore(reports): 刷新治理证据至 b1510b5(clean,192 tests)\n\n静态 11 项门禁 + 治理棘轮 + lint + typecheck 全绿;\n真实 PG + Redis 验收 192 tests / 0 failures,provenance 绑定 clean commit b1510b5。\n\n⚠️ 作用域:本轮证据只覆盖静态与运行态两级。浏览器级 check:ui **未重跑**——\n本机无 Node 运行时(全部门禁在 node:22 容器内挂载工作树执行),而容器内没有\nLinux 版 Playwright 浏览器(宿主缓存的是 macOS 构建)。按事实作用域表,\n不得据此宣称 UI 层已验证。\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-08-29T20:40:42-07:00"},{"Sha1":"b1510b5a203f7847dc99a0962cd30f36e6901dce","Message":"docs(standards): 修正与实现相悖的 API 标准 + 幽灵路径机器化(批次④·下)\n\n## api-standard 的四项核心约定与实现系统性相悖\n\nCLAUDE.md 真源地图把 docs/standards/*.md 列为「工程标准口径」,使用入口表还直接路由读者\n去读它。但 api-standard 的四项核心约定没有一项与两后端实际实现一致:\n`/api/v1/` 前缀(实际 `/api`,未版本化)、`{ data: ... }` 响应包裹(实际裸资源)、\n嵌套 `error.{code,statusCode,timestamp,path}` 错误体(实际是顶层扁平的 ApiErrorBody)、\n以及一个从不存在的 `packages/contracts/src/errors/error-codes.ts`。\n\n照着它落地新模块,会做出与 contracts `ApiErrorBody` 及 web `ApiError` 消费方直接冲突的接口。\n而 review-standard 的检查清单还会让 reviewer 去核对那个幽灵文件。\n\n- 按本仓既有的 C14「标准 vs 现状」惯例(frontend-standard / backend-standard / git-standard\n 都已有)在 api-standard 头部加对照表,逐项写明目标态与当前真相,并说明改动方向:\n 要落地目标态先改实现与契约,不要反过来照着文档改接口\n- 修正 review-standard 的检查项指向真实位置\n\n## 幽灵路径机器化(C14-⑤ 同族,扫描面扩到 standards)\n\n新增 docs-truth 断言:standards 引用的 `packages/contracts/src/**.ts` 路径必须真实存在,\n否则须在同一行显式标注「目标态 / 当前不存在」。扫描面用 readdirSync 覆盖 docs/standards 全量,\n不硬编码文件清单——旧的幽灵路径断言正是因为清单式扫描漏掉了 docs/README.md 本身而失守过。\n\n该断言上线即多抓到一处此前没人发现的幽灵路径(naming-standard 的\n`packages/contracts/src/store/store.types.ts`),已一并标注。\n负向测试:去掉 review-standard 的诚实标注即红。\n\n## owner-matrix 补录 OS 产品两张业务表\n\n「先登记后建表」是本仓自己立的规则,却被自己的 C20/G23 战役打破:OS 产品包新建了\n`juhai_baseframework_orders` / `..._order_events` 两张带状态机的表却从未登记。\n补录两行并写明 `products/` 下的对象同样要登记(归属真源是 product.manifest.json 的\npersistence.tenantModels,本表挂索引行)。\n\n验收:naming / docs-truth / governance-docs / 治理棘轮均 exit 0。\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-08-29T20:39:02-07:00"},{"Sha1":"033e8159c23f4766493fd140ffa7aa923ebe1182","Message":"fix(ops): 优雅停机接线——Fastify 的 onClose 钩子此前全是死代码(批次④·中)\n\n## Fastify 从不优雅停机\n\nserver.ts 没有任何信号处理,也从不调用 app.close():进程收到 SIGTERM 走默认处理直接终止。\n后果是 prisma / redis / outbox / queue 四个插件里**精心写好的 onClose 钩子从未被执行过**——\nBullMQ worker 不 close(在途 job 只能靠 stalled 恢复)、outbox 轮询事务可能被拦腰砍断、\nWS/SSE 连接收不到 close 帧。而 NestJS 侧早有 enableShutdownHooks,两后端停机行为实质分叉。\n\n存在性门禁看得见「钩子写了」,看不见「它从来没被调用过」——这正是 G17 说的行为级盲区。\n\n- server.ts 补 SIGTERM/SIGINT → app.close()(Fastify 会按注册逆序执行全部 onClose),\n 带 10s 超时兜底(卡住的清理不能让容器一直不退)与重复信号防抖\n\n## NestJS 的 Redis 连接从不 quit,且注释谎称有人管\n\nREDIS_PUB / REDIS_SUB 由 useFactory 裸建,没有任何销毁钩子;而 event-bus.service.ts\n的注释写着「redisSub 连接由 RedisModule 统一关闭」——注释与行为相反,于是没人会去查。\n真实后果:停机时连接不回收(两个 acceptance 测试的 afterAll 至今还得手动 quit 才能让进程退出)。\n\n- RedisModule 实现 onApplicationShutdown,quit 两个连接\n- 修正 event-bus 的失实注释\n\n## 防回潮\n\ncheck:dual-backend 新增 4 条停机接线绊网(两后端各自的信号处理 / app.close /\nenableShutdownHooks / Redis 关闭钩子),负向测试已验证删掉信号处理即红。\n\n验收:真实 PG + Redis 192 tests / 0 failures;静态门禁 + 棘轮 + typecheck 5/5 + lint 2/2 全绿。\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-08-29T20:35:43-07:00"},{"Sha1":"44cbbaeacf5f53e08e6e3f48a6d8bd2c3327d2de","Message":"fix(governance): 写链守护补齐五条已验证绕过(批次④·上)\n\ncheck:write-guard 守的是 P4「所有写显式带 tenant_id + 状态迁移乐观锁」这条最高优先级红线,\n但它自身存在五条可复现的绕过——每一条都能让违规代码拿到绿盘:\n\n1. **折行**:逐行匹配下 `await tx.order\\n .update({...})` 完全隐形。这甚至无需恶意——\n Prettier 对长链式调用本来就这样折行。\n2. **方括号访问**:`tx[\"order\"].update(` 用 `\\w+` 匹配不到,换个写法整条溜过去。\n3. **upsert 不在禁止模式里**:它与 update/delete 同源(同样只接受唯一键定位),\n TOCTOU 缝隙一模一样,却从未被拦。\n4. **where 里的 tenantId 从未被验证**:门禁 reason 一直宣称 where 是 `{ id, tenantId }`,\n 但只检查了方法名与 state 前置条件——`updateMany({ where: { id } })` 照样绿,\n 而那正是跨租户写。\n5. **0 行拒绝可被一行注释满足**:断言对原始源码做 includes,\n `// if (updated.count === 0)` 就能让一段被注释掉的防护报绿。\n\n修法:\n- 新增 scripts/lib/source-text.mjs 作为公共单源(stripComments / blankComments / lineOf)。\n 「注释掉的代码仍满足断言」这个形态 check-schema-sync 在 2026-08-15 已实锤并就地修过,\n 但同类断言散布在多个脚本里各自对原始源码匹配——按 P5,实锤过的教训必须推广,\n 否则只是把同一个洞留在别处。\n- A 部分改为「注释置空但保持字符偏移」后整体跨行匹配,再由偏移反推行号\n (逐行挡不住折行,整体匹配又需要能定位);禁止模式补 upsert 与方括号访问。\n- B 部分先提取 updateMany 的 where 块再逐项断言(state 前置条件 + tenantId),\n 且全部在剥注释后的源码上跑。\n\n验收:五条绕过逐一注入验证必红、逐一恢复现场;正向 10 项静态门禁 + 治理棘轮全绿。\nCLAUDE.md 基线表 write-guard 行同步为实际覆盖面(此前的描述比实际防线宽)。\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-08-29T20:32:47-07:00"},{"Sha1":"c494fc7d2e6b1497647b2ca9601766626dd4775d","Message":"feat(auth): G8 生产级租户验签闭环——回退翻转 + 401 判责 + 降级通道清除(批次③)\n\nCLAUDE.md 里标注「动工前须用户点名」的最大 OPEN 缺口,验签半边落地。\n\n## 回退翻转(G8 的核心)\n\ndemo 期口径是 `Bearer 解析 ?? x-tenant-id`。接入验签后这个 `??` 会变成**降级攻击面**:\n伪造一个签名无效的 Bearer → 验签失败 → 自动落回客户端自报的 demo 头,等于没验。\n且只翻转这一处并不够——裸 `?tenantId=` 是另一条更彻底的通道,它连伪造 token 都不需要。\n\n- jwt 模式下:带 Authorization 或 ?access_token= 即**强制验签,失败一律 401,绝不回退**;\n x-tenant-id / ?tenantId= / `tenant:\u003cid\u003e` 简写整条不承认\n- demo 模式保留原型四级来源(本地与既有验收测试零改动),但**生产跑 demo 即拒绝启动**——\n 漏配鉴权应当是「起不来」,不是「起来了但谁都能进」\n\n## 架构切分:策略在 contracts,验签由后端注入\n\ncontracts 被 web 直接 import,把 jose 与密钥语义拉进去会泄漏到浏览器包。故:\n- `decideTenantResolution`(谁可信、失败怎么判)在 contracts,两后端共用,13 条单测覆盖\n- jose 验签在各后端(NestJS `src/auth/`、Fastify `src/plugins/auth.ts`)\n- `tenantFromBearerToken` 更名 `unsafeTenantClaimFromToken`:函数名里的 unsafe 是给 review 看的,\n 它只该用于浏览器 UI 预填与 demo 模式\n\nNestJS 的判定必须放 Guard 而非 `@TenantId()` 参数装饰器——后者的回调是同步的,\n判定留在那里就永远接不上异步的 JWKS 验签。\n\n## 顺带堵掉的三个额外攻击面(安全审计发现,均在已登记 G8 描述之外)\n\n1. **tenantId 是攻击者可控的自由文本**:无格式/长度约束时可凭空创建租户分区、\n 可用超长值撑爆 `@@unique([tenantId,email])` 的 btree 索引行打出稳定 500、\n 可用换行伪造日志行。现统一过 normalizeTenantId(≤128 + 受控字符集)。\n2. **重复查询参数的类型混淆**:Fastify 把 `?access_token=a\u0026access_token=b` 解析成数组,\n `typeof v === 'string'` 判定直接落空 → 静默跳过 token 分支 → 落到裸 ?tenantId=;\n 而 NestJS 的 `URLSearchParams.get()` 取第一个值。**同一条请求两后端两种身份判定**——\n 既是真实越权通道,也是 G17 行为分叉的活体实证。两侧统一取第一个值。\n3. **凭证进日志**:浏览器 EventSource/WS 无法自定义头,token 只能进 `?access_token=`,\n 而 pino 默认序列化器把完整 url 写进日志——接入真实验签后就是每次建连落盘一枚有效 JWT。\n Fastify logger 加 redact(authorization / cookie / req.url)。\n\n## 判责矩阵补上 401\n\n此前缺凭证一律回 400,把「未认证」伪装成「参数写错了」,客户端无从区分「该去登录」\n和「该改请求」。现 contracts 定义 UNAUTHENTICATED / INVALID_TOKEN / TENANT_FORBIDDEN;\n响应体**只回稳定错误码**,验签失败细节只进日志(区分「签名不对/已过期/issuer 不符」\n对攻击者是免费的探测反馈)。WS 保持 close(1008) 而非握手期 401——两后端同口径,\n且浏览器对握手 401 不暴露任何原因。\n\n## 验收\n\n真实 PG + Redis:**192 tests / 0 failures**(地板 161 → 192,只收紧)。\n两后端各 9 条 jwt 判责用例:正确签名放行 / 无凭证 401 / **伪造签名 + 合法 x-tenant-id 仍 401**\n/ 裸 demo 头 401 / 过期 401 / alg:none 401 / 无租户 claim 401 / health 免鉴权 / 重复参数不落 victim。\n新增 check:dual-backend 的 G8 绊网 5 条,每条均有负向红证据;其中「算法白名单」一条初版\n被自身的类型声明 `algorithms: string[]` 满足而无法变红,已改绑 jwtVerify 实参后重测。\n静态门禁 10/10 + 治理棘轮 + typecheck 5/5 + lint 2/2 全绿。\n\nRLS 未叠加(结构已就绪,阻碍在 CI 超级用户/单例 Prisma/dispatcher 跨租户扫描三处),\nweb 构建期内联 token 与 WS Origin 白名单同样登记为 G8 剩余项。\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-08-29T20:27:41-07:00"}],"HeadCommit":{"Sha1":"4a707c3d3ec98b8ab45864a1b40b941589433914","Message":"chore(reports): 刷新治理证据至 b1510b5(clean,192 tests)\n\n静态 11 项门禁 + 治理棘轮 + lint + typecheck 全绿;\n真实 PG + Redis 验收 192 tests / 0 failures,provenance 绑定 clean commit b1510b5。\n\n⚠️ 作用域:本轮证据只覆盖静态与运行态两级。浏览器级 check:ui **未重跑**——\n本机无 Node 运行时(全部门禁在 node:22 容器内挂载工作树执行),而容器内没有\nLinux 版 Playwright 浏览器(宿主缓存的是 macOS 构建)。按事实作用域表,\n不得据此宣称 UI 层已验证。\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-08-29T20:40:42-07:00"},"CompareURL":"luoanwu/base-framework/compare/53991090b821b76dff11eee3a2e92806ed3ab173...4a707c3d3ec98b8ab45864a1b40b941589433914","Len":10}...
|
1788064993
|
Edit
Delete
|
|
26786
|
5
|
5
|
5
|
54
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"a9e18b959 {"Commits":[{"Sha1":"a9e18b9599335b3ad128ac8c761fc93b83de8711","Message":"fix(governance): 收口实时顺序与验收缺口\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-08-29T22:20:28-07:00"}],"HeadCommit":{"Sha1":"a9e18b9599335b3ad128ac8c761fc93b83de8711","Message":"fix(governance): 收口实时顺序与验收缺口\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-08-29T22:20:28-07:00"},"CompareURL":"luoanwu/base-framework/compare/4a707c3d3ec98b8ab45864a1b40b941589433914...a9e18b9599335b3ad128ac8c761fc93b83de8711","Len":1}...
|
1788067980
|
Edit
Delete
|
|
26934
|
5
|
5
|
5
|
54
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"644942151 {"Commits":[{"Sha1":"6449421518ff6b2dd62b6ff862ff44aedcbbea29","Message":"chore(reports): 刷新三级治理证据至 3bb349d(clean,202 tests / 8 UI)\n\n三级门禁均在 clean 工作区、同一提交 3bb349d 上实跑:\n\n- 静态 pnpm check:13 项门禁 + lint + typecheck,exit 0\n- 真实 DB pnpm check:runtime:202 tests / 0 failures、两后端迁移 deploy+status、\n 双后端同夹具差分 0 differences(PG base_framework_rt_final + Redis db11)\n- 浏览器 pnpm check:ui:8 用例 / 0 失败 / 0 跳过(PG base_framework_ui_final + db12)\n\n三份报告的 provenance 均为 gitSha=3bb349d、worktreeDirty=false,\n不再是此前绑定 a9e18b9 dirty 的 STALE 证据。\n\n新增报告:conformance-matrix、conformance-differential、governance-rules、\ngovernance-profile-kernel、governance-status(四层 profile 当前均为 PARTIAL——\nADR-0010 仍是 Proposed,observe 模式只诊断,不构成发布放行)。\n\n作用域声明:以上仅证明「本机 hillao 在 3bb349d 这个 clean commit 上通过三级门禁」,\n推不出远端已发布或 CI 已拦截(G14 仍 OPEN)。\ncheck:os-product 本轮显式 SKIPPED(上游 OS 检出不在场),未写 osProduct* 指标。\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-08-31T16:36:45-07:00"},{"Sha1":"3bb349d8ab4351f7f17927b50c94255a7d8abbef","Message":"fix(test): outbox 幂等键用例按租户收窄——移除它自己保证不了的全局隔离假设\n\n`dispatchOutboxBatch` 按设计跨租户全局扫描(outbox dispatcher 的\nwrite-guard-allow 豁免正为此),而 check:runtime 让两后端套件经 turbo 并行\n打同一个库。该用例却断言「全库只有我这一行待投递」——兄弟套件此刻产生的\n未投递行会被一并领走,于是期望 1 实得 2/3,数量随并行时序漂移。\n\n实测:连续两次全量红且失败对象不同(realtime.tenant 一次、outbox 一次),\n换全新库仍红且计数从 2 涨到 3;单独复跑该文件恒绿——典型的共享基座污染\n(G18 已登记族、审计发现「两后端共享 DB/Redis」的又一实证)。\n\n本用例要证的是「信封 id 恒等于 outbox 行 id」这条幂等键稳定性,与其他租户\n有多少行无关,故 publish 回调按 tenantId 过滤后再断言。这是移除伪假设,\n不是放宽断言:跨实例不重复投递由同文件上一条用例独立守护。\n\ncheck:runtime:202 tests、0 failures、差分 0 differences(exit 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-08-31T16:34:17-07:00"},{"Sha1":"886537eae83f56d3b662e070575ddf3d9a72307f","Message":"feat(governance): ADR-0010 阶段一/二——治理分层与同 SHA 证据模型\n\n把「一堆各自为政的门禁 + 最近一次运行的报告」升级为分层规则与可聚合证据。\nADR-0010 当前为 Proposed,本批只落 observe 模式的实现,不改变现行放行口径。\n\n规则生命周期\n- governance.rules.json + schema:16 条规则,每条带 owner、作用域、严重度、\n 证据映射、profile 归属、ADR 引用与例外期限;check:governance-rules 校验\n 规则无主/入口缺失/例外过期/profile 循环依赖,registryVersion=3。\n\n四层 profile 入口\n- check:kernel / check:production / check:conformance / check:extension,\n 经 check-governance-profile.mjs 统一编排(非 Kernel 的 profile 先跑 Kernel)。\n- governance:status 生成同 SHA 状态清单:缺失、陈旧、dirty、跨 SHA 或未绑定\n registryVersion 的证据一律不产出 VERIFIED,当前四层均为 PARTIAL——\n 这正是它没在拿旧证据冒充绿盘的证明。\n\n双后端行为身份\n- conformance.matrix.json 锁 8 cases × 2 backends 的 case 身份;\n- check:conformance:differential 用**同一夹具**逐字段比较两端 HTTP/DB/outbox\n 的 7 个 checkpoint。存在性门禁看不见语义漂移,差分才看得见。\n\n证据来源加固\n- report-provenance 增加 registryVersion / run URL / artifact 身份;\n- 验收 runner(check:runtime / check:ui)拒绝 GOV_REPORT_* 覆盖变量并 exit 2\n ——此前可用它们一行伪造出「clean@HEAD 通过」的验收报告;\n- governance-report 的缺失指标改 fail-closed:预期指标 key 消失时不再落到\n `?? -1`/`?? 0` 被当成「变好」静默过闸(C18 同族,发生在 current 侧)。\n\n其他\n- runtime-governance 审计与验收基座守卫抽到 scripts/lib,供多入口复用;\n- check 链移出 check:os-product(它依赖仓外 OS 检出,会让静态门禁不自包含、\n GitHub CI 结构性必红);缺失时显式 SKIPPED,要真实校验用 check:full;\n- governance.yml 改三段 artifact 汇总;\n- baseline 仅收紧:ownTests 24→28、ownTestCases 146→197、testsPassed 192→202、\n uiTestsPassed 4→8,另加 5 项新地板,无任何放宽。\n\npnpm check:13 项静态门禁 + lint + typecheck 全绿(exit 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-08-31T16:28:40-07:00"},{"Sha1":"ec489eae037f3a7bc6b027898804a8b1bde0fc23","Message":"fix(app): 404 不泄露资源 id + 前端断网桥接\n\n两处由治理证据实锤出来的产品缺陷:\n\n1. NestJS 订单 404 回显了资源 id(`Order \u003cid\u003e not found`),跨租户探测据此\n 可确认某 id 是否存在——404 的意义正是不泄露存在性。同时 Nest 默认异常体\n 带 statusCode/error 元数据,与 Fastify 的 `{message}` 形成两套对外契约。\n 现统一为稳定 ApiErrorBody `{ message: \"Order not found\" }`。\n\n2. useRealtime 缺 offline/online 桥接:WS/SSE 的 close/error 只在 TCP 真正\n 断开时触发,而「网络没了但连接还挂着」(拔网线、飞行模式、Playwright\n setOffline)不会立刻断 TCP,服务端 30s 心跳也只是数据帧——状态徽章会停在\n Connected 假绿。现监听 window offline/online:offline 主动断开并入既有退避\n 重连路径;online 清退避定时器立即重连,但不直接置 open——navigator.onLine\n 只有 false 是确定的,恢复后仍由真实连接结果决定状态。\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-08-31T16:28:00-07:00"}],"HeadCommit":{"Sha1":"6449421518ff6b2dd62b6ff862ff44aedcbbea29","Message":"chore(reports): 刷新三级治理证据至 3bb349d(clean,202 tests / 8 UI)\n\n三级门禁均在 clean 工作区、同一提交 3bb349d 上实跑:\n\n- 静态 pnpm check:13 项门禁 + lint + typecheck,exit 0\n- 真实 DB pnpm check:runtime:202 tests / 0 failures、两后端迁移 deploy+status、\n 双后端同夹具差分 0 differences(PG base_framework_rt_final + Redis db11)\n- 浏览器 pnpm check:ui:8 用例 / 0 失败 / 0 跳过(PG base_framework_ui_final + db12)\n\n三份报告的 provenance 均为 gitSha=3bb349d、worktreeDirty=false,\n不再是此前绑定 a9e18b9 dirty 的 STALE 证据。\n\n新增报告:conformance-matrix、conformance-differential、governance-rules、\ngovernance-profile-kernel、governance-status(四层 profile 当前均为 PARTIAL——\nADR-0010 仍是 Proposed,observe 模式只诊断,不构成发布放行)。\n\n作用域声明:以上仅证明「本机 hillao 在 3bb349d 这个 clean commit 上通过三级门禁」,\n推不出远端已发布或 CI 已拦截(G14 仍 OPEN)。\ncheck:os-product 本轮显式 SKIPPED(上游 OS 检出不在场),未写 osProduct* 指标。\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-08-31T16:36:45-07:00"},"CompareURL":"luoanwu/base-framework/compare/a9e18b9599335b3ad128ac8c761fc93b83de8711...6449421518ff6b2dd62b6ff862ff44aedcbbea29","Len":4}...
|
1788219424
|
Edit
Delete
|
|
26935
|
5
|
5
|
5
|
54
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"a9bf41341 {"Commits":[{"Sha1":"a9bf41341677134557538182b87a1339aa7b7616","Message":"docs(governance): 动态区回灌至 clean @ 3bb349d + 把「动态区与报告同步」机器化\n\n回灌\n- 三级证据新鲜度从 `dirty @ a9e18b9` 更正为 **clean @ `3bb349d`**(静态 exit 0、\n runtime 202 tests / 差分 0 differences、UI 8 用例),并记录本轮实际基座库名与端口覆盖;\n- G0 余项(clean commit 三级重跑)标记完成;\n- 基线表 6 行「本地 dirty」改为 clean 绑定;\n- OS 两级本轮 SKIPPED / 未实跑,诚实标为 🟡 STALE——不随其他行一起蹭 clean。\n\n机器化(P5:机器门禁 \u003e 手册条目 \u003e 口头经验)\ncheck:docs-truth 新增 freshness-sha-runtime / freshness-sha-ui 两条断言:\n动态区声明的 SHA 必须等于对应 latest 报告的 provenance.gitSha。\n\n实锤依据:连续两轮报告刷新提交都没回灌动态区(报告 clean @ 3bb349d,\n动态区仍写 dirty @ a9e18b9);而 CLAUDE.md 自己规定「判定治理状态只认动态区 + reports」,\n两份真源打架时该规矩直接失效。同一轮人工回灌时我又把「本轮根本没跑」的 OS 行\n误标成 clean——人肉同步不可靠,正是 P5 要求机器化的形态。\n\n刻意不含静态级:governance.latest.json 每次 pnpm check 都重新生成并绑定当时 HEAD,\n对它断言等价于「每次提交都必须改文档」、提交报告后必红,那是会误杀的门禁。\nruntime/UI 报告只有显式跑真实验收才会变,「报告动了而文档没跟上」才是真信号。\n\n负向测试(收尾清单要求):\n① 把 runtime 行 SHA 篡改为 a9e18b9 → freshness-sha-runtime 精确红;\n② 删掉 UI 行的 SHA 声明 → freshness-sha-ui 精确红;\n两次均恢复现场后复跑转绿。pnpm check exit 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-08-31T17:00:44-07:00"}],"HeadCommit":{"Sha1":"a9bf41341677134557538182b87a1339aa7b7616","Message":"docs(governance): 动态区回灌至 clean @ 3bb349d + 把「动态区与报告同步」机器化\n\n回灌\n- 三级证据新鲜度从 `dirty @ a9e18b9` 更正为 **clean @ `3bb349d`**(静态 exit 0、\n runtime 202 tests / 差分 0 differences、UI 8 用例),并记录本轮实际基座库名与端口覆盖;\n- G0 余项(clean commit 三级重跑)标记完成;\n- 基线表 6 行「本地 dirty」改为 clean 绑定;\n- OS 两级本轮 SKIPPED / 未实跑,诚实标为 🟡 STALE——不随其他行一起蹭 clean。\n\n机器化(P5:机器门禁 \u003e 手册条目 \u003e 口头经验)\ncheck:docs-truth 新增 freshness-sha-runtime / freshness-sha-ui 两条断言:\n动态区声明的 SHA 必须等于对应 latest 报告的 provenance.gitSha。\n\n实锤依据:连续两轮报告刷新提交都没回灌动态区(报告 clean @ 3bb349d,\n动态区仍写 dirty @ a9e18b9);而 CLAUDE.md 自己规定「判定治理状态只认动态区 + reports」,\n两份真源打架时该规矩直接失效。同一轮人工回灌时我又把「本轮根本没跑」的 OS 行\n误标成 clean——人肉同步不可靠,正是 P5 要求机器化的形态。\n\n刻意不含静态级:governance.latest.json 每次 pnpm check 都重新生成并绑定当时 HEAD,\n对它断言等价于「每次提交都必须改文档」、提交报告后必红,那是会误杀的门禁。\nruntime/UI 报告只有显式跑真实验收才会变,「报告动了而文档没跟上」才是真信号。\n\n负向测试(收尾清单要求):\n① 把 runtime 行 SHA 篡改为 a9e18b9 → freshness-sha-runtime 精确红;\n② 删掉 UI 行的 SHA 声明 → freshness-sha-ui 精确红;\n两次均恢复现场后复跑转绿。pnpm check exit 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-08-31T17:00:44-07:00"},"CompareURL":"luoanwu/base-framework/compare/6449421518ff6b2dd62b6ff862ff44aedcbbea29...a9bf41341677134557538182b87a1339aa7b7616","Len":1}...
|
1788220856
|
Edit
Delete
|
|
26936
|
5
|
5
|
5
|
54
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"742f865d0 {"Commits":[{"Sha1":"742f865d0672599ba182b16012b7671b114f273f","Message":"chore(os-product): OS 两级验收在 clean commit 上重跑并回灌动态区\n\n上一轮 OS 两级因上游检出未显式提供而 SKIPPED,动态区据实标为 STALE。\n本轮显式给 DIGITAL_EMPLOYEE_OS_ROOT 后重跑,两级均绿:\n\n- check:os-product(静态兼容):juhai.baseframework@0.1.0 / protocol 1.3.0\n / 2 migrations / 1 acceptance suite,0 违规\n- check:os-product:runtime(双宿主真实验收):NestJS + Fastify / 8 cases / 0 failures\n (DB base_framework_os_product_a9bf413 + Redis db13,Node 22.23.2)\n\n证据绑定:本仓 clean @ a9bf413;上游 OS 本机检出源码 clean @ 89b2ade。\n\n关于上游 clean 的判定依据(不接受「报告说 clean 就是 clean」):\n上游工作树 git status 有 24 个变更,但已逐条核实全部匹配 reports/*.latest.json;\nreport-provenance 的 worktreeDirty 按文档化语义刻意排除该模式(报告是运行产物,\n前一个门禁刷新它们不应被后续门禁误判为「被验收源码 dirty」)。\n用同一排除规则跑 `git status --porcelain=v1 -- ':(exclude)reports/*.latest.json'`\n结果为空——源码确实 clean,dirty=false 不是假绿。\n\npnpm check exit 0;check:docs-truth 的动态区 SHA 断言仍绿。\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-08-31T17:04:22-07:00"}],"HeadCommit":{"Sha1":"742f865d0672599ba182b16012b7671b114f273f","Message":"chore(os-product): OS 两级验收在 clean commit 上重跑并回灌动态区\n\n上一轮 OS 两级因上游检出未显式提供而 SKIPPED,动态区据实标为 STALE。\n本轮显式给 DIGITAL_EMPLOYEE_OS_ROOT 后重跑,两级均绿:\n\n- check:os-product(静态兼容):juhai.baseframework@0.1.0 / protocol 1.3.0\n / 2 migrations / 1 acceptance suite,0 违规\n- check:os-product:runtime(双宿主真实验收):NestJS + Fastify / 8 cases / 0 failures\n (DB base_framework_os_product_a9bf413 + Redis db13,Node 22.23.2)\n\n证据绑定:本仓 clean @ a9bf413;上游 OS 本机检出源码 clean @ 89b2ade。\n\n关于上游 clean 的判定依据(不接受「报告说 clean 就是 clean」):\n上游工作树 git status 有 24 个变更,但已逐条核实全部匹配 reports/*.latest.json;\nreport-provenance 的 worktreeDirty 按文档化语义刻意排除该模式(报告是运行产物,\n前一个门禁刷新它们不应被后续门禁误判为「被验收源码 dirty」)。\n用同一排除规则跑 `git status --porcelain=v1 -- ':(exclude)reports/*.latest.json'`\n结果为空——源码确实 clean,dirty=false 不是假绿。\n\npnpm check exit 0;check:docs-truth 的动态区 SHA 断言仍绿。\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-08-31T17:04:22-07:00"},"CompareURL":"luoanwu/base-framework/compare/a9bf41341677134557538182b87a1339aa7b7616...742f865d0672599ba182b16012b7671b114f273f","Len":1}...
|
1788221065
|
Edit
Delete
|
|
26937
|
5
|
5
|
5
|
54
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"75189f878 {"Commits":[{"Sha1":"75189f8787bc51f9cf16ba7b2fdcb735aea2ec15","Message":"chore(reports): 刷新三级证据至 cb2a1f0(clean)+ 动态区同步回灌\n\n结构化日志接线后在 clean commit 上重跑取证:\n- 静态 pnpm check:exit 0\n- 真实 DB check:runtime:202 tests / 0 failures、差分 0 differences\n (PG base_framework_rt_cb2a1f0 + Redis db15)\n- 浏览器 check:ui:8 用例 / 0 失败 / 0 跳过\n (PG base_framework_ui_cb2a1f0 + Redis db12,端口经 UI_WEB_PORT/UI_API_PORT 覆盖)\n\n三份报告 provenance 均为 gitSha=cb2a1f0、worktreeDirty=false,动态区同步更新。\n本轮回灌由上一提交新增的 freshness-sha-runtime / freshness-sha-ui 断言强制——\n报告动了而文档没跟上会直接红,不再依赖人肉记得。\n\n作用域不变:仅证明「本机在 cb2a1f0 这个 clean commit 上通过三级门禁」,\n推不出远端已发布或 CI 已拦截(G14 仍 OPEN)。\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-08-31T17:21:01-07:00"},{"Sha1":"cb2a1f09fde2e86e3a4263b59e3565efaed5b104","Message":"feat(observability): NestJS 接结构化日志,与 Fastify 拉平(G20 第一子项)\n\n此前 Fastify 侧是 pino 结构化 JSON,NestJS 全程默认 ConsoleLogger 输出彩色纯文本——\n同一套写链在两后端产出两种不可对齐的日志格式,生产上无法用同一条查询捞两边。\ncheck:dual-backend 是存在性门禁,看不见这层格式差异(G17 行为级盲区的又一实例)。\nG20「无可观测性」里性价比最高的一半其实早就免费存在,只差把另一半接上。\n\n- 新增 common/logger.ts:pino 支撑的 Nest LoggerService,口径与 api-fastify/src/app.ts\n 逐条对齐(同一个 LOG_LEVEL、同样的凭证脱敏路径、production 单行 JSON);\n Nest 传入的 context(类名)映射为结构化字段而非拼进消息串——拼进去就又要靠正则解析。\n- 在 create-app.ts 这个装配单源接线,测试与 bootstrap 共用同一份(禁止 main.ts 另起一套);\n- main.ts 的 4 行 console.log 改走 Logger,否则启动横幅纯文本、其余日志 JSON,同进程两种格式;\n bootstrap catch 保留 console.error 兜底(此时应用可能尚未装配成功)。\n\n顺带修掉一个两后端都有的启动崩溃模式:pino-pretty 是 devDependency,用\n`pnpm install --prod` 部署且 NODE_ENV 未设 production 时它不存在,pino 解析不到\ntransport target 会直接抛错——为一个开发期美化依赖把服务搞得起不来。\n两侧均改为先探测可用性、不可用则降级为 JSON。\n\n验证:\n- production:单行 JSON,context 为结构化字段,Error 序列化为 err{type,message,stack}\n- 开发态:pino-pretty 正常着色\n- 负向:临时移走 node_modules 里的 pino-pretty → 降级输出 JSON 而非崩溃,恢复后复原\n- pnpm check exit 0;pnpm check:runtime exit 0(202 tests、差分 0 differences)\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-08-31T17:18:41-07:00"}],"HeadCommit":{"Sha1":"75189f8787bc51f9cf16ba7b2fdcb735aea2ec15","Message":"chore(reports): 刷新三级证据至 cb2a1f0(clean)+ 动态区同步回灌\n\n结构化日志接线后在 clean commit 上重跑取证:\n- 静态 pnpm check:exit 0\n- 真实 DB check:runtime:202 tests / 0 failures、差分 0 differences\n (PG base_framework_rt_cb2a1f0 + Redis db15)\n- 浏览器 check:ui:8 用例 / 0 失败 / 0 跳过\n (PG base_framework_ui_cb2a1f0 + Redis db12,端口经 UI_WEB_PORT/UI_API_PORT 覆盖)\n\n三份报告 provenance 均为 gitSha=cb2a1f0、worktreeDirty=false,动态区同步更新。\n本轮回灌由上一提交新增的 freshness-sha-runtime / freshness-sha-ui 断言强制——\n报告动了而文档没跟上会直接红,不再依赖人肉记得。\n\n作用域不变:仅证明「本机在 cb2a1f0 这个 clean commit 上通过三级门禁」,\n推不出远端已发布或 CI 已拦截(G14 仍 OPEN)。\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-08-31T17:21:01-07:00"},"CompareURL":"luoanwu/base-framework/compare/742f865d0672599ba182b16012b7671b114f273f...75189f8787bc51f9cf16ba7b2fdcb735aea2ec15","Len":2}...
|
1788222064
|
Edit
Delete
|
|
26938
|
5
|
5
|
5
|
54
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"5af8e60ea {"Commits":[{"Sha1":"5af8e60ea25ac2d24a90b8f103092f30d96b909a","Message":"fix(ci): checkout 取全历史——浅克隆让 F5 把本仓证据误判为「来自另一个仓库」\n\n加回 GitHub 远端后跑出第一份真实远端证据,static job 立刻红,但**不是治理违规**:\n\n ✗ [F5] reports/runtime-acceptance.latest.json: provenance.gitSha=cb2a1f0\n 不存在于本仓 git 历史——该证据来自**另一个仓库**\n\nF5 用 `git cat-file -e \u003csha\u003e^{commit}` 校验验收证据是否绑定本仓历史(防移植时照搬\n源项目的「测试跑过了」假证据)。而 actions/checkout@v4 默认 fetch-depth:1 只克隆\ntip 提交——验收证据一旦绑定任何祖先提交(正常工作流必然如此:先跑验收再提交报告),\nF5 就必然误判。三处 checkout 均补 fetch-depth: 0。\n\n本地负向复现:`git clone --depth 1` 后提交数=1,`git cat-file -e cb2a1f0` 找不到,\n与 CI 报错一致;全历史下同一命令通过。\n\n值得记的是:这条缺陷**只有真跑远端 CI 才暴露得出来**——本地永远是全历史,\n门禁正向绿;G14 登记的「远端拦截未验证」正是为防这类盲区而存在。\n上一轮修掉的是 check:os-product 依赖仓外检出(结构性必红),这是它后面藏着的第二个。\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-08-31T17:29:21-07:00"}],"HeadCommit":{"Sha1":"5af8e60ea25ac2d24a90b8f103092f30d96b909a","Message":"fix(ci): checkout 取全历史——浅克隆让 F5 把本仓证据误判为「来自另一个仓库」\n\n加回 GitHub 远端后跑出第一份真实远端证据,static job 立刻红,但**不是治理违规**:\n\n ✗ [F5] reports/runtime-acceptance.latest.json: provenance.gitSha=cb2a1f0\n 不存在于本仓 git 历史——该证据来自**另一个仓库**\n\nF5 用 `git cat-file -e \u003csha\u003e^{commit}` 校验验收证据是否绑定本仓历史(防移植时照搬\n源项目的「测试跑过了」假证据)。而 actions/checkout@v4 默认 fetch-depth:1 只克隆\ntip 提交——验收证据一旦绑定任何祖先提交(正常工作流必然如此:先跑验收再提交报告),\nF5 就必然误判。三处 checkout 均补 fetch-depth: 0。\n\n本地负向复现:`git clone --depth 1` 后提交数=1,`git cat-file -e cb2a1f0` 找不到,\n与 CI 报错一致;全历史下同一命令通过。\n\n值得记的是:这条缺陷**只有真跑远端 CI 才暴露得出来**——本地永远是全历史,\n门禁正向绿;G14 登记的「远端拦截未验证」正是为防这类盲区而存在。\n上一轮修掉的是 check:os-product 依赖仓外检出(结构性必红),这是它后面藏着的第二个。\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-08-31T17:29:21-07:00"},"CompareURL":"luoanwu/base-framework/compare/75189f8787bc51f9cf16ba7b2fdcb735aea2ec15...5af8e60ea25ac2d24a90b8f103092f30d96b909a","Len":1}...
|
1788222564
|
Edit
Delete
|
|
26939
|
5
|
5
|
5
|
54
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"74b464480 {"Commits":[{"Sha1":"74b464480301493d008b476e72247f7289ccbffb","Message":"fix(gate): 差分门禁自包含——不再依赖磁盘上残留的 contracts dist\n\n远端 CI 第二次真跑,static job 首次转绿,runtime job 接着暴露下一条:\n\n Error: Failed to resolve entry for package \"@repo/contracts\".\n\ncheck:conformance:differential 直接调 vitest(不经 turbo),因此拿不到 turbo 声明的\n`test → build` 依赖;而 contracts 是 TS 项目引用,没有 dist 时 vite 解析包入口即失败。\n本地长期通过是因为先跑过 pnpm check 把 dist 留在磁盘上——门禁被环境残留掩盖,\n正是本仓「静态门禁必须自包含」纪律要防的形态。\n\n修复时踩到第二层:contracts 的 tsconfig 是 composite(增量),tsbuildinfo 还在而 dist\n已被删时,`tsc -p` 会认为「一切最新」而**不产出任何文件**——构建退出码 0、dist 依旧为空。\n故重建前先清 tsbuildinfo,并在构建后断言 dist/index.js 真的存在,否则显式报错。\n\n负向验证:`rm -rf packages/contracts/dist packages/contracts/tsconfig.tsbuildinfo`\n后直接跑 check:conformance:differential → 自动重建并通过\n(7 checkpoints × 2 backends,0 differences)。\n\n本地:pnpm check exit 0;pnpm check:runtime exit 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-08-31T17:36:59-07:00"}],"HeadCommit":{"Sha1":"74b464480301493d008b476e72247f7289ccbffb","Message":"fix(gate): 差分门禁自包含——不再依赖磁盘上残留的 contracts dist\n\n远端 CI 第二次真跑,static job 首次转绿,runtime job 接着暴露下一条:\n\n Error: Failed to resolve entry for package \"@repo/contracts\".\n\ncheck:conformance:differential 直接调 vitest(不经 turbo),因此拿不到 turbo 声明的\n`test → build` 依赖;而 contracts 是 TS 项目引用,没有 dist 时 vite 解析包入口即失败。\n本地长期通过是因为先跑过 pnpm check 把 dist 留在磁盘上——门禁被环境残留掩盖,\n正是本仓「静态门禁必须自包含」纪律要防的形态。\n\n修复时踩到第二层:contracts 的 tsconfig 是 composite(增量),tsbuildinfo 还在而 dist\n已被删时,`tsc -p` 会认为「一切最新」而**不产出任何文件**——构建退出码 0、dist 依旧为空。\n故重建前先清 tsbuildinfo,并在构建后断言 dist/index.js 真的存在,否则显式报错。\n\n负向验证:`rm -rf packages/contracts/dist packages/contracts/tsconfig.tsbuildinfo`\n后直接跑 check:conformance:differential → 自动重建并通过\n(7 checkpoints × 2 backends,0 differences)。\n\n本地:pnpm check exit 0;pnpm check:runtime exit 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-08-31T17:36:59-07:00"},"CompareURL":"luoanwu/base-framework/compare/5af8e60ea25ac2d24a90b8f103092f30d96b909a...74b464480301493d008b476e72247f7289ccbffb","Len":1}...
|
1788223021
|
Edit
Delete
|
|
26940
|
5
|
5
|
5
|
54
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"5f156175e {"Commits":[{"Sha1":"5f156175e6f2397c334fcd3eb5cde4e45423b68b","Message":"fix(gate): 测试数解析先剥 ANSI——地板校验在 CI 上恒读 0(假红)\n\n远端第三次真跑:static job 绿,runtime job 报\n\n Tests passed regressed: expected \u003e= 202, got 0.\n\n但下载 CI 上传的证据 artifact 看,test 步骤 status=0、4 个 turbo 任务全成功、\nFastify 明明 58 passed——测试全跑过了,是 runner 的**解析**失效。\n\n根因:GitHub Actions 支持颜色,vitest/turbo 因此输出带色汇总行,\"Tests\" 与数字之间\n夹着 ANSI 转义序列,`/Tests\\s+(\\d+)\\s+passed/` 匹配不到。本地非 TTY 无色所以一直有效——\n这条地板在本地有牙、在 CI 上恒读 0,属于「同一门禁在两个环境语义不同」。\n方向上它是 fail-closed(0 \u003c 202 判红)而非假绿,但仍是假红,会把真实回归淹没在噪声里。\n\ncountPassedTests 改为先 stripAnsi 再匹配。\n验证:用真实 CI 那行带色文本喂解析器,剥离前 0、剥离后 58;\n本地 check:runtime 仍读到 202(exit 0)。\n\nUI runner 不受影响:它读 Playwright 的 JSON 统计,不解析终端文本。\n\n这是加回 GitHub 远端后暴露的第三条「只有远端才看得见」的缺陷\n(前两条:checkout 浅克隆让 F5 误判、差分门禁依赖磁盘残留的 contracts dist)。\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-08-31T17:43:13-07:00"}],"HeadCommit":{"Sha1":"5f156175e6f2397c334fcd3eb5cde4e45423b68b","Message":"fix(gate): 测试数解析先剥 ANSI——地板校验在 CI 上恒读 0(假红)\n\n远端第三次真跑:static job 绿,runtime job 报\n\n Tests passed regressed: expected \u003e= 202, got 0.\n\n但下载 CI 上传的证据 artifact 看,test 步骤 status=0、4 个 turbo 任务全成功、\nFastify 明明 58 passed——测试全跑过了,是 runner 的**解析**失效。\n\n根因:GitHub Actions 支持颜色,vitest/turbo 因此输出带色汇总行,\"Tests\" 与数字之间\n夹着 ANSI 转义序列,`/Tests\\s+(\\d+)\\s+passed/` 匹配不到。本地非 TTY 无色所以一直有效——\n这条地板在本地有牙、在 CI 上恒读 0,属于「同一门禁在两个环境语义不同」。\n方向上它是 fail-closed(0 \u003c 202 判红)而非假绿,但仍是假红,会把真实回归淹没在噪声里。\n\ncountPassedTests 改为先 stripAnsi 再匹配。\n验证:用真实 CI 那行带色文本喂解析器,剥离前 0、剥离后 58;\n本地 check:runtime 仍读到 202(exit 0)。\n\nUI runner 不受影响:它读 Playwright 的 JSON 统计,不解析终端文本。\n\n这是加回 GitHub 远端后暴露的第三条「只有远端才看得见」的缺陷\n(前两条:checkout 浅克隆让 F5 误判、差分门禁依赖磁盘残留的 contracts dist)。\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-08-31T17:43:13-07:00"},"CompareURL":"luoanwu/base-framework/compare/74b464480301493d008b476e72247f7289ccbffb...5f156175e6f2397c334fcd3eb5cde4e45423b68b","Len":1}...
|
1788223468
|
Edit
Delete
|
|
26941
|
5
|
5
|
5
|
54
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"b1695a678 {"Commits":[{"Sha1":"b1695a6780efbc95449a553d313599695c0b22ab","Message":"docs(governance): 回灌首份远端 CI 绿盘证据 + 三级证据刷新至 5f15617\n\n远端证据(G14 部分推进,**未闭环**)\nGitHub 远端已加回(github → laoluojuhai/base-framework,私有仓)。\n在 5f15617 上三个 job 全绿:Static governance / Runtime and UI acceptance /\nAggregate same-SHA governance evidence\nrun: https://github.com/laoluojuhai/base-framework/actions/runs/33455966984\n该 run 的 headSha 与本地 HEAD 逐字符对齐。这是本仓历史上第一次远端 CI 绿——\n此前每一次远端运行都是 failure(最近一次 2026-08-26,正是 check:os-product 并入\npnpm check 那一提交)。\n\n三条「只有远端才看得见」的缺陷已在本轮依次修掉,均已单独提交并在本条登记:\n① checkout 浅克隆 → F5 把本仓证据误判为「来自另一个仓库」\n② 差分门禁依赖磁盘残留的 contracts dist(外加 composite 增量陷阱)\n③ 测试数地板正则未剥 ANSI,CI 下恒读 0\n共同点:本地全绿、远端必红——正是 G14「远端拦截未验证」这条缺口存在的意义。\n\n⚠️ ci-gate 仍不标 GREEN:required checks / 分支保护未配置,受控失败 PR 未做。\n「门禁能跑绿」推不出「违规会被挡住」,缺这两项不得宣称 PR 已被机器拦截。\n\n三级证据刷新\n静态 exit 0、runtime 202 tests / 差分 0 differences、UI 8 用例,\n三份报告 provenance 均为 gitSha=5f15617、worktreeDirty=false。\n本轮回灌过程中 freshness-sha-runtime 断言真的挡了我一次(报告已刷到 74b4644 而\n动态区仍写 cb2a1f0),按其要求重跑取证后才通过——新门禁有牙。\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-08-31T17:52:26-07:00"}],"HeadCommit":{"Sha1":"b1695a6780efbc95449a553d313599695c0b22ab","Message":"docs(governance): 回灌首份远端 CI 绿盘证据 + 三级证据刷新至 5f15617\n\n远端证据(G14 部分推进,**未闭环**)\nGitHub 远端已加回(github → laoluojuhai/base-framework,私有仓)。\n在 5f15617 上三个 job 全绿:Static governance / Runtime and UI acceptance /\nAggregate same-SHA governance evidence\nrun: https://github.com/laoluojuhai/base-framework/actions/runs/33455966984\n该 run 的 headSha 与本地 HEAD 逐字符对齐。这是本仓历史上第一次远端 CI 绿——\n此前每一次远端运行都是 failure(最近一次 2026-08-26,正是 check:os-product 并入\npnpm check 那一提交)。\n\n三条「只有远端才看得见」的缺陷已在本轮依次修掉,均已单独提交并在本条登记:\n① checkout 浅克隆 → F5 把本仓证据误判为「来自另一个仓库」\n② 差分门禁依赖磁盘残留的 contracts dist(外加 composite 增量陷阱)\n③ 测试数地板正则未剥 ANSI,CI 下恒读 0\n共同点:本地全绿、远端必红——正是 G14「远端拦截未验证」这条缺口存在的意义。\n\n⚠️ ci-gate 仍不标 GREEN:required checks / 分支保护未配置,受控失败 PR 未做。\n「门禁能跑绿」推不出「违规会被挡住」,缺这两项不得宣称 PR 已被机器拦截。\n\n三级证据刷新\n静态 exit 0、runtime 202 tests / 差分 0 differences、UI 8 用例,\n三份报告 provenance 均为 gitSha=5f15617、worktreeDirty=false。\n本轮回灌过程中 freshness-sha-runtime 断言真的挡了我一次(报告已刷到 74b4644 而\n动态区仍写 cb2a1f0),按其要求重跑取证后才通过——新门禁有牙。\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-08-31T17:52:26-07:00"},"CompareURL":"luoanwu/base-framework/compare/5f156175e6f2397c334fcd3eb5cde4e45423b68b...b1695a6780efbc95449a553d313599695c0b22ab","Len":1}...
|
1788223950
|
Edit
Delete
|