docs: 恢复 SelfMedia 交付跟踪主线

This commit is contained in:
Codex
2026-07-15 08:40:51 +02:00
parent c1052d7505
commit d8490fb847
17 changed files with 471 additions and 0 deletions
@@ -0,0 +1,20 @@
# R3.2 任务报告
- 目标:修复 PaC 在 `expectedRevision``observedRevision` 相同时,因补充 owning Git fetch 失败而误判 `relation=unknown` 的问题。
- 交付:
- Issue[UniDesk #2052](https://github.com/pikasTech/unidesk/issues/2052)。
- PR[UniDesk #2055](https://github.com/pikasTech/unidesk/pull/2055)。
- 合并提交:`dbc4169d83b4b856324345d79503862e682d3e86`
- 结果:
- 两个合法 revision 值完全相同时直接判定为 `exact`
- owning Git fetch 失败保留 `pac-owning-git-fetch-failed``blocking=false``mutation=false` 的结构化 warning。
- 不同 revision 继续保持 `unknown``stale``diverged` 的既有阻塞语义。
- remote 输出前与 evaluator 消费前复用同一幂等正规化函数,避免证据字段二次处理漂移。
- 验证:
- evaluator fixture 34/34 通过。
- source-artifact 32/32 通过。
- failure-evidence 5/5 通过。
- 新增具名测试 2/2 通过。
- remote shell 语法与 PaC CLI help 通过。
- 完整三文件测试 47/48;唯一失败是合并前 `origin/master` 已存在的 admission consumer 列表断言未包含 `selfmedia-production-nc01`,不属于本 PR diff。
- 边界:未修改或操作 YAML、Secret、PipelineRun、Argo、Gitea、mirror、rollout 或其他运行面。
@@ -0,0 +1,22 @@
# R3.3 任务报告
## 结论
生产期次 `prod-webterm-20260714174507` 的 Kokoro/Misaki 不可发音字符故障已完成源码修复、release 与 master 双分支交付、生产续跑和公网验收。根因是口播文本中的 `[…]` 经 NFKC 规范化后变成 `[...]`,Misaki 生成未知音素;现由既有 TTS 归一化层恢复为保留停顿语义且受支持的 Unicode 省略号 `…`
## 交付
- release PR `pikainc/selfmedia#37`merge commit `48e92b281ddef06948b1ea158551f93a6caf37a6`
- master 回补 PR `pikainc/selfmedia#38`merge commit `c3872d0c8fb0bba8e9a9f0c36338a98126d42081`
- 定向与关联测试 9 通过、0 失败;真实失败样本修复后未知音素计数为 0。
- 生产 source artifact verifiersource worktree clean、commit exact、embedded PipelineRun 与 runtime provenance aligned。
## 原入口验收
- WebTerm 通过同一后端终端会话触发 `voice -> inspect` 续跑,job `20260714-184250-7841e80a` 成功。
- 生成视频 `output/episode.mp4`,大小 20,572,896 bytesvoice、subtitles、render、inspect 全部成功。
- 公网 `http://152.53.229.148:4319/healthz` 返回 200;匿名 `/api/v1/editions` 返回 401;根页面返回 200。
## 边界
未人工创建 PipelineRun、未直接修改 Pod/Argo/GitOps、未重跑已经成功的前置阶段。
@@ -0,0 +1,29 @@
# R4.1 任务报告
## 目标
依据 [UniDesk #2064](https://github.com/pikasTech/unidesk/issues/2064),为 Pipelines-as-Code 自动交付增加 YAML-first 的 120 秒端到端预算可见性。超预算只输出非阻塞提示,证据不完整时保持 partial,不改变任何业务滚动终态。
## 交付
- PR[UniDesk #2067](https://github.com/pikasTech/unidesk/pull/2067)。
- 实现提交:`c96cab96f763d5256d1e94f7421b8b0f2f33d06d`
- 合并提交:`2a88bc0a8b4d89ef0b9b009e98b73702a65e2a68`
- owning YAML`config/platform-infra/pipelines-as-code.yaml#deliveryTiming.endToEndBudgetSeconds`
- typed warning`pac-automatic-delivery-over-budget`
- 固定语义:`blocking=false``mutation=false`
- hint 只指向 env identity、依赖缓存、BuildKit/cache、stage timing 与现有只读 `status/history` 入口。
- `status/history` 只有流水线耗时、缺少完整端到端证据时投影 `partial``overBudget=null`,不提前报警。
## 验证
- `bun test scripts/src/platform-infra-pac-delivery-timing.test.ts scripts/src/platform-infra-pipelines-as-code-bootstrap.test.ts`15/15 通过。
- `plan --target NC01 --consumer selfmedia-nc01 --json`:正确读取并投影 120 秒 owning YAML 预算,`mutation=false`
- 真实 `delivery-timing`SELFMEDIA 端到端 202 秒,正确输出 `202s/120s` warningArgo 为 `Synced/Healthy`runtime 为 `1/1`
- 真实 `status/history`PipelineRun 为 193 秒但缺少完整端到端时间证据,均保持 `partial` 且无 warning。
- `git diff --check`:通过。
- PR 合并由主代理 guarded merge 完成;本子任务未部署、未创建人工 PipelineRun、未执行 sync/refresh 或其他运行面 mutation。
## 边界
R4.1 已完成超预算事实的非阻塞可见性。实际将 SELFMEDIA 自动交付压缩到 120 秒预算内仍属于 R4 后续 env reuse 与镜像阶段优化,不由本子任务冒充完成。
@@ -0,0 +1,5 @@
# R4.2 任务报告
UniDesk PR #2074 与 SELFMEDIA PR #48 已按依赖顺序合并,merge commits 分别为 7d1af2953d6226d41fd0d7dec898d4a5944daade 与 0dbf92e1abc8d47cf5a9ffd7e8a569429d37ac03。config/env-identity.yaml 声明 package manifest 的依赖语义字段,同一 renderer 同时生成 PaC identity 与 Docker 安装 manifestscripts、name、version 不再使依赖环境失效,依赖、lockfile、工具、模型、runtime 输入仍正确失效。
PR #48 因 Dockerfile、策略和 renderer 首次变化按预期 miss,端到端 193 秒。随后 Web-only PR #50 是真实业务验收:ENV_REUSE=hitsourcePrepare=2 秒、envIdentity=0 秒、imageBuild=34 秒、gitopsPublish=2 秒,PipelineRun 46 秒、端到端 56 秒,低于 owning YAML 的 120 秒预算;Argo Synced/Healthyruntime 1/1,构建与运行 digest 精确一致。全程由正常 master PR merge 自动触发,未人工创建 PipelineRun、刷新 Argo 或修改 release。
@@ -0,0 +1,15 @@
# R5.1 任务报告
## 交付
- PR `pikainc/selfmedia#43`merge commit `44d675eb8b7fba23237d4302b4b5a27ce7b41a0a`
- 登录页、生产导控台、作业监看、产物面板、错误提示与内置 Codex 终端全部改为中文。
- 阶段、作业、终端连接/运行、会话恢复、生成方式和分镜类型使用集中中文映射;技术路径、品牌和协议只在中文语义旁保留。
- `bun test web/tests` 9 项通过,NC01 Web 构建通过。
## 测试集群验收
- 仅由 master PR merge 自动发布到开发公网 `http://152.53.229.148:4317`;未触碰 release/生产 4319。
- 公网登录后的退休英文标签扫描命中 0;页面标题、按钮、状态、空态、终端工具栏与辅助文本均为中文。
- 1920x1080 桌面和 390x844 移动端无页面级横向溢出;工厂保持紧凑工业风、直角/小倒角。
- 后续资源 API PR #46 自动发布后,公网中文界面仍保持一致。
@@ -0,0 +1,16 @@
# R5.2 任务报告
## 交付
- PR `pikainc/selfmedia#44`merge commit `d151cfa87e586d083fce04b10a60b0ce022df5ae`
- 规范路径 `/editions/:editionId/resources/:resourceId`,资源为 `sources|script|article|slides|audio|subtitles|output|artifacts`;期次短路径规范化到 sources。
- 切期立即清除旧详情并显示目标期次中文加载态;AbortController 与 request identity 双重阻止乱序覆盖。
- 非法期次、非法资源和坏路径显示中文不存在状态,不回退其他期次;支持复制期次/资源链接。
## 测试集群验收
- master PR merge 自动交付端到端 59 秒,`ENV_REUSE=hit`Argo `Synced/Healthy`、runtime 1/1exact verifier 对齐。
- 公网 4317 直接打开、刷新、前进/后退均恢复同一 edition/resource。
- 人为延迟旧期请求 900ms 后快速切回:最终 URL、选择器、标题、身份与内容全部为新期,旧期正文计数 0。
- 加载期明确显示 `正在加载期次:<目标期次>`;非法资源刷新后仍显示 `这个资源地址不存在`
- 公网页面健康 200、匿名 API 401;未发布 release/生产 4319。
@@ -0,0 +1,5 @@
# R5.3.1 任务报告
SELFMEDIA PR #46 已合并到 mastermerge commit 为 f0fccd8536c7930be73347be95602c0d480b8493。开发集群提供 GET/PUT /api/v1/editions/:id/resources/:resourceId,并由统一 TypeScript CLI 的 resource show/update 使用同一路径;metadata、sources、script、article、slides 可编辑,固定路径、revision/If-Match、结构校验、原子写入与跨期/越界拒绝均已实现。
公网 4317 真实验收中,Web 保存测试期次标题后,内嵌 WebTerm 的持久 Codex 会话通过 bun /app/scripts/selfmedia-cli.ts resource show 读取到相同标题、metadata 内容和 revisionAPI key 未被读取或打印。随后同源 PUT 先完成外部并发更新,再用旧 revision 请求,返回 HTTP 409 与 revision_conflict;测试期次最终恢复原始标题并刷新确认。未触碰 release、生产 namespace 或 4319。
@@ -0,0 +1,7 @@
# R5.3.2 任务报告
SELFMEDIA PR #50 已合并到 mastermerge commit 为 6125213083a12bdb5bfe8a621b7bc9a7125d2e6b。开发 PaC 自动交付成功,PipelineRun 46 秒、端到端 56 秒,ENV_REUSE=hitimageBuild=34 秒;Argo 最终观测精确 GitOps commit 14c781a9c999runtime digest 与本次构建 sha256:4dd5682c4c8 一致。
公网 4317 验证了期次元数据结构化编辑、来源/文稿/微信文章/分镜资源编辑入口、只读资源说明、中文加载与保存状态、终端协同按钮。真实冲突场景返回 409 revision_conflict,页面显示保存冲突、保留草稿并禁用覆盖;重新加载后恢复原始内容。RESTful 深链可直接打开微信公众号文章资源,浏览器后退恢复原期次/资源,非法资源显示中文 not-found。专用“交付巡检”运行按钮弹出中文确认框,确认后创建单步作业并在 9 秒内成功,作业尾号 1d8be9d2。
桌面 1920x1080 与移动 390x844 均完成截图复核;两种视口 document scrollWidth 等于 innerWidth,未见横向溢出,控制台无 error/warning。未触碰 release、生产 namespace 或 4319。
@@ -0,0 +1,20 @@
# R5.3.3 任务报告
## 结论
SELFMEDIA 已在 `edition.yaml#spec.production` 提供期次级配音、字幕和视频覆盖,REST API、统一 CLI、Web 工具带与 `voice``subtitles``render` 单步共享同一资源真相;空字段继承 `config/tools.yaml`。PR [#51](https://github.com/pikainc/selfmedia/pull/51) 已合并到 `master`merge commit 为 `283034bd05895753675b716b86918b7db306a8d7`
## 实现与验证
- 支持音色、模型语速、后处理语速、分段停顿、字幕字号/边框/边距、输出帧率、CRF 和编码预设。
- metadata 保存继续使用 revision、`If-Match`、结构校验、原子写入与 HTTP 409 冲突合同。
- Artificer 在 NC01 完成 14 项定向测试与 Web 构建,工具带保持紧凑直角工业风,编码预设使用中文标签。
- 正常 PR merge 自动触发 PaCPipelineRun 成功,Argo `Synced/Healthy`runtime `1/1`。本次修改命中环境身份文件,`ENV_REUSE=miss`,镜像构建 148 秒,Pipeline 161 秒,PR merge 至 Pipeline 完成 172 秒;该超预算事实为非阻塞性能证据。
- 公网 `4317` 真实闭环:Web 临时保存 `segmentPauseMs=260`;内嵌 WebTerm 的持久 Codex 会话通过正式 CLI 创建 voice 作业 `20260714-202500-998ac72d`14 秒成功;API/manifest 投影显示有效值 260。
- 验收后 Web 清空覆盖,并由卡片专用“本地配音”运行按钮和中文确认框创建作业 `20260714-202706-48f34f1d`13 秒成功;metadata 不再含 tts 覆盖,音频恢复全局有效值 `segmentPauseMs=150`
- WebTerm 重启按钮已实测,重启代次 42,会话以“恢复上次会话”恢复;默认字号 15 像素、凭据就绪,未打印凭据。
- 桌面 1920x1080 与移动 390x844 均无横向溢出;截图为 `/tmp/selfmedia-r5-production-settings-desktop.png``/tmp/selfmedia-r5-production-settings-mobile.png`
## 边界
只合并和部署 `master` 开发集群;未触碰 `release`、生产 namespace 或公网 `4319`,未人工创建 PipelineRun,未执行 Argo sync/refresh 或 Pod patch。
@@ -0,0 +1,18 @@
# R5.3 任务报告
## 结论
SELFMEDIA 首批 Web 手动编辑工作台已完成。PR [#46](https://github.com/pikainc/selfmedia/pull/46) 建立期次资源 REST API 与统一 CLIPR [#50](https://github.com/pikainc/selfmedia/pull/50) 建立 RESTful 深链内的资源编辑器,PR [#51](https://github.com/pikainc/selfmedia/pull/51) 增加期次级配音、字幕和视频参数工具带;均只合并 `master`
## 能力
- 可编辑 metadata、来源、文稿、微信公众号 Markdown、场景/分镜,以及配音、字幕和视频生产参数。
- 保存状态、未保存草稿、保存中、错误和 revision 冲突均使用中文;冲突时保留草稿并禁止覆盖。
- Web 与 WebTerm/CLI 使用同一 edition/resource API、revision 与磁盘资源,不建立第二状态库。
- 产物资源保持只读,参数通过 metadata 的 `spec.production` 编辑;单步仍由卡片内专用“运行”按钮和确认框创建。
- 公网 `4317` 已完成 Web 保存、WebTerm CLI 回读/运行、manifest 有效值、刷新保持和恢复原值闭环。
- 桌面和移动端均无横向溢出,Web 工厂保持紧凑直角工业风。
## 边界
未发布 `release`、生产 namespace 或公网 `4319`
@@ -0,0 +1,18 @@
# R5 任务报告
## 结论
SELFMEDIA 开发集群 Web 工厂的中文化、RESTful 深链和首批手动编辑能力已完成,并已通过公网 `http://152.53.229.148:4317` 真实验收。交付由 PR [#43](https://github.com/pikainc/selfmedia/pull/43)、[#44](https://github.com/pikainc/selfmedia/pull/44)、[#46](https://github.com/pikainc/selfmedia/pull/46)、[#50](https://github.com/pikainc/selfmedia/pull/50) 和 [#51](https://github.com/pikainc/selfmedia/pull/51) 组成。
## 终态
- 页面按钮、状态、空态、错误、确认框、终端工具栏和辅助文本使用中文;保留技术标识时提供中文语义。
- 每一期与资源使用 `/editions/:editionId/resources/:resourceId` 深链,可复制、刷新恢复、前进后退;切期显示目标期次加载态并清空上一期内容,乱序响应不会覆盖当前选择。
- Web 可编辑期次元数据、来源、文稿、微信公众号文章、场景/分镜、配音、字幕和视频参数;保存、冲突和继承状态中文可见。
- Web、WebTerm 和统一 TypeScript CLI 共享同一 REST API、revision 合同与 edition/resource 真相;单步运行使用独立按钮和确认框。
- 公网真实闭环验证了 Web 编辑、WebTerm CLI、voice 单步、manifest 有效值、恢复原配置、Codex 持久 session/restart、桌面与移动布局。
- 自动交付只由正常 `master` PR merge 触发,运行面最终为 Argo `Synced/Healthy`、runtime `1/1`
## 边界
全程未发布 `release`、生产 namespace 或公网 `4319`
@@ -0,0 +1,43 @@
# R6.1 任务报告
## 目标
修复 SELFMEDIA 生产首次 env-reuse cache miss 时,BuildKit 已推送镜像但在收尾返回 `context deadline exceeded`,导致 GitOps 阶段未执行的问题;保持自动交付,不用手工补跑。
## 现场根因
- 失败发布提交:`91c23dd0e45916336e03e65532dea7daa73b0323`
- 失败 PipelineRun`selfmedia-production-nc01-91c23dd0e45916336e03e65532dea7dacl775`
- PipelineRun 178 秒后在 `image-build` exit 1。
- 日志证明 layers、config、manifest 和 registry push 已完成,digest 为 `sha256:b95b17386db89a5ba5e88a1990eeea8c182c9602d1902e52c78f8194b4e54be7`,随后最后一行才出现 `error: context deadline exceeded`
- 旧生产运行面始终保持 Synced/Healthy,没有错误滚动。
## 实现
- GitHub issuepikainc/selfmedia#56
- Artificer 提交:`5bc294aab2d44371d6facf17228b763501da131c`
- 开发 PRpikainc/selfmedia#57
- master 合并提交:`a97f87756923bf9c82dca9ff5d9956a603f068ff`
- 生产 PRpikainc/selfmedia#58
- release 合并提交:`1b8117de839d6274535e43f17bd2fbb7114ba2a1`
- `deploy/scripts/build-image.sh` 提取单一 POSIX sh 构建函数。
- 只有日志同时证明 layers 和 manifest 推送完成,且最后非空行是 deadline 错误时,才执行一次相同构建重试。
- 正常成功不重试;普通错误不重试;第二次失败原样失败;不把镜像存在当作成功。
- 没有新增阻塞校验;超过 120 秒仍只记非阻塞 warning 和 env-reuse hint。
## 验证
- `sh -n deploy/scripts/build-image.sh deploy/scripts/build-image.test.sh` 通过。
- 四类脚本测试通过:首次成功、特定 deadline 后重试成功、非目标错误不重试、第二次仍失败。
- 开发 PipelineRun`selfmedia-nc01-a97f87756923bf9c82dca9ff5d9956a603f068ff-txkxm`Succeeded88 秒,env reuse hit。
- 开发阶段耗时:source 1 秒、identity 0 秒、image build 66 秒、GitOps 3 秒。
- 开发 GitOps revision`15a48f1585abc45c7998ed504e0c7696482cddbb`
- 开发 ArgoSynced/Healthy;运行镜像 digest`sha256:7b267759a4f0db041dce82d08237ac58bd12d4784d650b2b492b79a2eb0f1125`4317 健康。
- 生产 PipelineRun`selfmedia-production-nc01-1b8117de839d6274535e43f17bd2fbb7j4w42`Succeeded59 秒。
- 生产阶段耗时:source 2 秒、identity 0 秒、image build 41 秒、GitOps 3 秒。
- 生产 GitOps revision`b80059b19aeb4edf6b018c986f17e9d496915f1f`
- 生产 ArgoSynced/Healthy1/1;运行镜像 digest`sha256:8b21258fc6aeb7ad353a7a84ac1dfd7b68e439f16e673910d9dabc4db4c19464`4319 健康。
## 交付边界
全程只通过 PR merge 触发自动 PaC;没有手工 PipelineRun、Argo sync/refresh、Pod patch、mirror sync 或镜像/GitOps 补齐。
@@ -0,0 +1,77 @@
# R6 任务报告
## 目标
完成 Web 导航加载范围与全局增量刷新重构:资源切换只加载目标资源;切期保留大范围加载;手动和自动刷新保留旧内容、增量更新实际所需数据并保护编辑草稿;先验证开发 4317,再自动发布生产 4319。
## 交付
- GitHub issuepikainc/selfmedia#52
- Artificer 功能提交:`92f61c5782fbb1669e1e7dec58102c6dadcabf04`
- 并发边界修正:`d07e436a01daf6a0bc611b62bbb8038ec7467ecd`
- 功能 PRpikainc/selfmedia#53
- master 合并提交:`cb0ae1d1e6e8ede83e0da433724887999edce1a7`
- 首次 master→release PR #54 因生产 PaC add/add 历史冲突关闭。
- 协调分支合并提交:`1d6b5f9c945f4454bb71af3e1b5179a36020a92b`,双亲为 release `48e92b2` 与 master `cb0ae1d`;合并树与 origin/master 内容零差异。
- 生产发布 PRpikainc/selfmedia#55release 合并提交 `91c23dd0e45916336e03e65532dea7daa73b0323`
- 生产首次 cache miss 暴露的 BuildKit 收尾超时已在子任务 R6.1 / issue #56 修复。
- 最终生产 release 提交:`1b8117de839d6274535e43f17bd2fbb7114ba2a1`
## 功能行为
- `config/server.yaml#spec.webRefresh` 是唯一配置真相:
- 默认 5000ms
- 可选 5000/10000/30000/60000ms
- 允许关闭。
- 全局刷新协调器只刷新健康、系统、期次列表、任务、当前期次详情、当前可见资源及打开的元数据。
- 手动和自动刷新保留旧内容,不出现整页加载,不清空当前期次或生产信号链。
- 同一请求在途时不重叠;资源保存只排队一次尾随刷新。
- 刷新响应以 request id 和 edition identity 双重隔离,旧期次响应不能覆盖新期次。
- dirty/saving/conflict 状态保留本地草稿;后台新 revision 只提示,不覆盖编辑内容。
- 切资源只更新资源路由和资源工作台;切期仍清空旧期内容并显示目标期次大范围加载。
- Web 保持中文、紧凑、直角工业风。
## 自动化验证
- Artificer 修正后:18 个测试通过、101 个断言通过。
- Web build 通过。
- 双视口 E2E:2 个测试、26 个断言通过。
- E2E 覆盖双期次、禁用 abort、延迟旧响应、切期加载和资源保存唯一尾随刷新。
- 开发功能 PipelineRun`selfmedia-nc01-cb0ae1d1e6e8ede83e0da433724887999edce1a7-kkbs5`Succeeded79 秒,env reuse hit。
- 最终开发 PipelineRun`selfmedia-nc01-a97f87756923bf9c82dca9ff5d9956a603f068ff-txkxm`Succeeded88 秒。
- 最终开发 GitOps revision`15a48f1585abc45c7998ed504e0c7696482cddbb`Argo Synced/Healthy。
- 最终生产 PipelineRun`selfmedia-production-nc01-1b8117de839d6274535e43f17bd2fbb7j4w42`Succeeded59 秒。
- 最终生产 GitOps revision`b80059b19aeb4edf6b018c986f17e9d496915f1f`Argo Synced/Healthy,运行副本 1/1。
- 开发入口:`http://152.53.229.148:4317`
- 生产入口:`http://152.53.229.148:4319`
## 生产浏览器验收
- 登录鉴权和公网 IP 访问正常。
- 自动刷新实际默认值为 `5000`
- 选项为:关闭、5 秒、10 秒、30 秒、1 分钟。
- 来源证据切换到口播文案:
- 当前期次标题保持;
- 生产信号链 loading 数量 0
- 生产信号链 loading mutation 数量 0。
- 手动刷新:
- 当前期次标题和资源内容保持;
- 生产信号链 loading 数量 0
- loading mutation 数量 0。
- 未保存草稿在增量刷新后保持,状态为“未保存”,生产信号链 loading 数量和 mutation 数量均为 0。
- 通过浏览器侧 500ms 延迟目标期次详情请求,明确观察到切期的大范围 loading,随后目标期次正常 ready。
- 1920×1080 桌面截图通过视觉核验:
- `/tmp/selfmedia-r6-prod-desktop.png`
- SHA-256`82cd37358a42d077af8a2ffd572b44bbfc0a8175a5c2a94636448e8d0c441725`
- 390×844 移动端:
- viewport、body 与 scrollWidth 均为 390
- 刷新控件 x=12、y=67、width=366、height=35
- masthead x=0、y=0、width=390、height=148
- 无横向溢出。
- 移动端截图:
- `/tmp/selfmedia-r6-prod-mobile.png`
- SHA-256`782fd23c7c7b31d67189289edefa5eede14cd02edc41610d5a4b0c260237a9a6`
## 发布约束
全程通过 GitHub PR merge 自动触发 PaC。没有手工 PipelineRun、Argo sync/refresh、Pod patch、mirror sync 或运行面补齐。
@@ -0,0 +1,32 @@
# R7 任务报告
## 结果
已修复全局手动/周期增量刷新清空 SelfMedia 内嵌 WebTerm 的问题,并通过正常 PR merge 自动发布到开发 4317 与生产 4319。
## 实现
- `App` 在 WebTerm 每次打开周期锁定当时的 terminal config;全局刷新产生的新 `system.terminal` 对象不再进入已打开终端的 effect identity。
- 关闭终端后清除锁定配置,再次打开时采纳最新配置。
- 新增 WebTerm 自身“刷新终端”按钮,参考 `../webterm`:发送临时行数 resize60ms 后恢复真实行数 resize,再执行 xterm 全行 refresh 与 focus。
- 手动重绘不关闭 WebSocket、不 reset、不清历史;原有重新连接、重启 Codex、锁定、字号和 resume 保持独立。
- 新增纯逻辑测试覆盖两轮全局刷新配置引用保持、双 resize 顺序、延迟、refresh 与 focus。
## GitHub
- Issue[pikainc/selfmedia#59](https://github.com/pikainc/selfmedia/issues/59)
- 开发 PR[pikainc/selfmedia#60](https://github.com/pikainc/selfmedia/pull/60)master merge `de66aff05d2055af2515737eaef4586c4b352c6e`
- 生产 PR[pikainc/selfmedia#61](https://github.com/pikainc/selfmedia/pull/61)release merge `dab3b629f58556f03f0b99150dd139db5b6b653f`
## 验证
- NC01`bun test web/tests` 20/20、`bun run --cwd web build``git diff --check` 通过。
- 开发自动 PaCPipelineRun 成功,env reuse=hitArgo Synced/HealthyGitOps revision `2827bf77ac6a…`runtime digest `sha256:98afdb185cd…`
- 生产自动 PaCPipelineRun 89 秒成功,env reuse=hitArgo Synced/HealthyGitOps revision `bb91a645582b…`runtime digest `sha256:e31a865d16c…`
- 4317 与 4319:默认 5 秒自动刷新跨两个周期并再执行一次全局手动刷新,均为 WebSocket `starts=1 / closes=0`、新增 snapshot=0、xterm identity 不变。
- 4317 与 4319:“刷新终端”均只发送两次 resize,实测行数 `15→16`WebSocket 不关闭,xterm identity 不变。
- 4317 与 4319:390×844 下按钮完整可见且终端连接未重建。
## 非阻塞观察
PaC 状态仍披露既有 `pac-argo-revision-unknown` 只读诊断;实际 PipelineRun、Argo 与 runtime digest 已一致,未阻断滚动,本任务未执行任何人工补跑。
@@ -0,0 +1,17 @@
# R8.1 任务报告
## 交付结果
- 创建并关闭 [UniDesk #2113](https://github.com/pikasTech/unidesk/issues/2113)。
- [UniDesk PR #2114](https://github.com/pikasTech/unidesk/pull/2114) 已合并到 mastermerge commit 为 db0020863f63104f93cd039ba0cd003c56d3a691。
- unidesk-selfmedia skill 的高频流程已固化唯一源码验证入口:
- trans NC01:/root/.worktrees/selfmedia/<task> argv bun run verify:web。
- skill 明确禁止先探测 node_modules、手工安装依赖,再分别重复 Web 测试、生产构建和差异检查。
- skill 明确源码验证不替代浏览器、公网、鉴权、WebTerm 与 PaC/Argo 运行面验收。
## 验证证据
- unidesk-selfmedia skill quick_validate 通过。
- git diff --check 通过。
- SELFMEDIA #62 的全新 worktree 实测已证明首次单调用自动安装、第二次单调用复用依赖。
- 未修改运行配置,未执行部署。
@@ -0,0 +1,35 @@
# R8 任务报告
## 交付结果
- 创建并关闭 [SELFMEDIA #62](https://github.com/pikainc/selfmedia/issues/62)。
- [SELFMEDIA PR #63](https://github.com/pikainc/selfmedia/pull/63) 已合并到 mastermerge commit 为 9fb96215c15bc38e700922a328181a1680f1a707。
- 新增唯一 CLI 子命令 verify web,并提供 package 脚本 bun run verify:web。
- 现有 CLI 主体迁入 scripts/src/cli-main.tsscripts/selfmedia-cli.ts 保持为 18 行的无第三方依赖自举入口。
- 依赖复用身份由根目录或 web 目录的 package.json 与 bun.lock 哈希生成;身份一致时复用 node_modules,变化时执行 bun install --frozen-lockfile。
- 同一命令依次执行 Web 测试、Web 生产构建与 git diff --check HEAD,按 JSONL 输出阶段、状态、耗时和紧凑失败摘要。
## 验证证据
- 全新 worktree 的根目录和 web/node_modules 均不存在。
- 第一次仅调用 bun scripts/selfmedia-cli.ts verify web
- 根目录依赖 installed506 ms
- Web 依赖 installed426 ms
- Web 测试 passed241 ms
- 生产构建 passed17024 ms
- 差异格式检查 passed19 ms
- 总耗时 18239 ms。
- 第二次仅调用同一命令:
- 根目录依赖 reused
- Web 依赖 reused
- Web 测试、生产构建和差异格式检查全部通过;
- 没有重复安装依赖。
- 暂存变更后使用 bun run verify:web 验证失败契约,命令准确发现 scripts/src/cli-main.ts 末尾多余空行并返回 exit 1;修正后再次运行全部通过。
- 原有 CLI help 和 check 入口仍可运行。
- 仓库全量 typecheck 仍报告既有 web-auth.e2e.test.ts:105 unknown 类型错误;该文件不在本次改动范围,未将既有问题扩大为新门禁。
- 未手工触发 PipelineRun、Argo、rollout 或 release 发布。
## 调用缩减
- 改进前需要依赖存在性探测、根目录安装、Web 安装、Web 测试、生产构建和 diff 检查等多次调用,并可能在首次失败后重复。
- 改进后源码 Web 验证只需一次 bun run verify:web;首次自动准备依赖,后续自动复用。
@@ -27,3 +27,95 @@
### R3.1 [completed]
按用户最新要求将非选中 consumer 的全局配置一致性错误降级为结构化 non-blocking warning,避免开发 source-artifact/状态/交付被生产配置阻塞;当前选中 target/consumer 的字段、权限、ownership 与安全校验仍 fail-closed,并由定向测试证明两类边界,完成任务后将详细报告写入[任务报告](./details/selfmedia-production-delivery/R3.1_Task_Report.md)。
### R3.2 [completed]
依据 [UniDesk #2052](https://github.com/pikasTech/unidesk/issues/2052) 修复 PaC 在 expectedRevision 与 observedRevision 完全相同时仍因 owning Git fetch 失败误判 `relation=unknown`:相同 revision 直接判定 exact,额外 fetch 失败仅输出 `blocking=false` warning,保持真实不一致和 mutation target 安全边界;用独立 worktree/PR 和定向 evaluator/source-artifact/CLI 验证收口,完成任务后将详细报告写入[任务报告](./details/selfmedia-production-delivery/R3.2_Task_Report.md)。
### R3.3 [completed]
依据 [SELFMEDIA #36](https://github.com/pikainc/selfmedia/issues/36) 修复生产期次 prod-webterm-20260714174507 在 voice 阶段因 utterance-story-04-07 含 Kokoro/Misaki 无法发音字符而失败:读取真实文本与 phoneme 定位字符,在既有 TTS 归一化职责内做最小修复并增加定向测试;先用 step run voice 单步验证,release PR 正常自动交付后从 voice 续跑至 inspect,不重跑已成功阶段,再将同一修复回补 master 并完成公网产物验收,完成任务后将详细报告写入[任务报告](./details/selfmedia-production-delivery/R3.3_Task_Report.md)。
## R4 [in_progress]
依据用户最新要求为 SELFMEDIA 自动交付增加 120 秒端到端预算可见性并继续优化 env reuse:超过 owning YAML 阈值只输出 blocking=false、mutation=false 的结构化 warning 与 env reuse hint,不能阻断 PipelineRun、GitOps/Argo、runtime 或 health;针对当前 ENV_REUSE=hit 但 imageBuild 仍为 181-184 秒、端到端为 203-210 秒的事实,定位真实耗时并通过正常 master/release PR 自动交付将流水线优先压到 120 秒预算内,完成任务后将详细报告写入[任务报告](./details/selfmedia-production-delivery/R4_Task_Report.md)。
### R4.1 [completed]
依据 [UniDesk #2064](https://github.com/pikasTech/unidesk/issues/2064) 在 owning YAML 声明 120 秒自动端到端预算;交付超过阈值时在 delivery-timing 与适用状态投影中输出 blocking=false、mutation=false 的 typed warning 和 env reuse 优化 hint,120 秒内不报警、时间证据不完整保持 partial,任何 warning 不得阻断业务滚动,完成任务后将详细报告写入[任务报告](./details/selfmedia-production-delivery/R4.1_Task_Report.md)。
### R4.2 [completed]
依据 [UniDesk #2065](https://github.com/pikasTech/unidesk/issues/2065) 对 SELFMEDIA 已 ENV_REUSE=hit 但 imageBuild 181-184 秒的问题做目标侧阶段定位,优化依赖、模型/工具层和 BuildKit/cache 复用且保持身份变化正确失效;通过正常 master/release PR merge 验收端到端预算、digest、Argo/runtime health 与 exact verifier,完成任务后将详细报告写入[任务报告](./details/selfmedia-production-delivery/R4.2_Task_Report.md)。
## R5 [completed]
依据用户最新要求改进 SELFMEDIA 开发集群 Web 工厂:所有用户可见页面全量中文化;每一期和资源提供可刷新恢复的 RESTful 深链,切期时 URL、数据和加载状态严格同步并防止乱序响应覆盖;尽可能提供期次、文稿、来源、时间轴、文章、场景、图片、TTS、视频参数和单步重跑的手动编辑能力,与 WebTerm/CLI 共享同一 edition/resource 真相。全部只合并 master 并在测试集群验收,禁止发布 release、生产 namespace 或公网 4319,完成任务后将详细报告写入[任务报告](./details/selfmedia-production-delivery/R5_Task_Report.md)。
### R5.1 [completed]
依据 [SELFMEDIA #41](https://github.com/pikainc/selfmedia/issues/41) 将所有用户可见页面、按钮、状态、空态、错误、确认框、终端工具栏和辅助文本统一为中文;技术字段、命令和品牌名保留时补中文语义,建立可审计文案结构和静态/浏览器验证,保持紧凑工业风,只上线 master 测试集群,完成任务后将详细报告写入[任务报告](./details/selfmedia-production-delivery/R5.1_Task_Report.md)。
### R5.2 [completed]
依据 [SELFMEDIA #40](https://github.com/pikainc/selfmedia/issues/40) 为每一期和资源建立可复制、刷新恢复、前进后退一致的 RESTful 深链;切期/切资源时显示目标期次中文加载态,使用请求 identity/abort 防止乱序覆盖,无效深链显示中文 not-found,并在 master 测试集群完成快速切期和慢请求验证,完成任务后将详细报告写入[任务报告](./details/selfmedia-production-delivery/R5.2_Task_Report.md)。
### R5.3 [completed]
依据 [SELFMEDIA #39](https://github.com/pikainc/selfmedia/issues/39) 增强 Web 手动编辑工作台,首批覆盖期次元数据、选题、文稿、来源、时间轴、微信公众号文章、场景文本/图片/缩放、TTS 与视频参数;保存和冲突状态中文可见,复用同一 API/CLI source of truth,卡片独立运行按钮与确认框不变,只上线 master 测试集群,完成任务后将详细报告写入[任务报告](./details/selfmedia-production-delivery/R5.3_Task_Report.md)。
#### R5.3.1 [completed]
依据 [SELFMEDIA #45](https://github.com/pikainc/selfmedia/issues/45) 建立期次资源编辑 REST API 与同路径 CLI:从同一期既有文件读取并通过 revision/If-Match、结构校验和原子写入保存,首批覆盖元数据、来源、文稿、微信 Markdown 与分镜;WebTerm CLI 复用同一 API,禁止任意路径写入、跨期次覆盖、第二状态库和 release/生产发布,完成任务后将详细报告写入[任务报告](./details/selfmedia-production-delivery/R5.3.1_Task_Report.md)。
#### R5.3.2 [completed]
依据 [SELFMEDIA #47](https://github.com/pikainc/selfmedia/issues/47) 在 RESTful 期次/资源深链中加入紧凑工业风手动编辑工作台:消费 #45 的 revision/ETag API,覆盖元数据、来源、文稿、微信 Markdown、场景/分镜以及只读资源说明,中文显示 dirty/saving/saved/conflict/error,切期取消旧草稿并禁止跨期保存;保留卡片独立运行按钮与确认框,只上线 master 测试集群,完成任务后将详细报告写入[任务报告](./details/selfmedia-production-delivery/R5.3.2_Task_Report.md)。
#### R5.3.3 [completed]
依据 [SELFMEDIA #49](https://github.com/pikainc/selfmedia/issues/49) 在现有 edition.yaml 权威资源中加入受结构校验的期次级配音、字幕和视频参数覆盖,由 REST API、CLI、Web 与 voice/subtitles/render 单步共享同一真相;缺省继承 config/tools.yaml,只允许 master 开发集群与公网 4317 验收,禁止 release、生产 namespace 和 4319,完成任务后将详细报告写入[任务报告](./details/selfmedia-production-delivery/R5.3.3_Task_Report.md)。
## R6 [completed]
依据 [SELFMEDIA #52](https://github.com/pikainc/selfmedia/issues/52) 重构 Web 导航加载与全局刷新:同一期切换资源仅加载目标资源,不让当前期次和生产信号链进入重新加载;切期继续显示大范围目标期加载并防乱序;增加 YAML-first 的全局手动刷新和默认 5 秒可选自动刷新,保留旧内容、避免重叠请求并保护 dirty/saving/conflict 草稿。先合并 master 并在 4317 验收,再通过 master 到 release 的正常 PR 自动滚动生产 4319,禁止手工 PipelineRun、Argo sync 或运行面 patch,完成任务后将详细报告写入[任务报告](./details/selfmedia-production-delivery/R6_Task_Report.md)。
### R6.1 [completed]
修复 SELFMEDIA #56:生产首次缓存未命中时 BuildKit 已推送镜像但收尾 context deadline exceeded;实现仅对该特定错误的一次有界重试,覆盖脚本测试,先走 master/4317 自动 PaC 验收,再走 release/4319,禁止手工补跑,完成任务后将详细报告写入[任务报告](./details/selfmedia-production-delivery/R6.1_Task_Report.md)。
## R7 [completed]
依据 [SelfMedia #59](https://github.com/pikainc/selfmedia/issues/59) 修复全局手动/周期增量刷新清空内嵌 WebTerm:终端配置、xterm 与 WebSocket 生命周期独立于业务投影刷新,只有 WebTerm 自身“刷新终端”按钮按 ../webterm 的临时行数 resize→真实行数 resize→本地 refresh 语义无损重绘;先在开发入口 4317 验证终端连接/历史不变,再通过 release PR 自动发布并在生产入口 4319 复测,完成任务后将详细报告写入[任务报告](./details/selfmedia-production-delivery/R7_Task_Report.md)。
## R8 [completed]
依据 [SELFMEDIA #62](https://github.com/pikainc/selfmedia/issues/62) 增加仓库自带的单命令 Web 验证入口:自动按锁文件准备根目录与 web 依赖,依次运行 Web 测试、生产构建和 git diff --check,输出紧凑阶段摘要、耗时、依赖复用状态与失败原因;在全新 worktree 首次调用和同 worktree 第二次调用中证明原有多步探测、安装和重复验证收敛为一次调用,不修改运行配置、不部署开发或生产环境,完成任务后将详细报告写入[任务报告](./details/selfmedia-production-delivery/R8_Task_Report.md)。
### R8.1 [completed]
依据 [UniDesk #2113](https://github.com/pikasTech/unidesk/issues/2113) 在 unidesk-selfmedia skill 固化 SelfMedia Web 源码验证最短路径:通过 trans 在 NC01 目标 worktree 单次运行 bun run verify:web,替代依赖探测、安装、Web 测试、生产构建和差异格式检查的手工多步调用;明确该入口不替代浏览器、公网、鉴权、WebTerm 与 PaC/Argo 运行面验收,通过 skill quick_validate 并证明同类源码验证只需一次受控调用,完成任务后将详细报告写入[任务报告](./details/selfmedia-production-delivery/R8.1_Task_Report.md)。
## R9 [in_progress]
依据 [UniDesk #2132](https://github.com/pikasTech/unidesk/issues/2132) 在 D518 部署先进中文语音推理服务并接入 SELFMEDIA 开发集群:先在 D518 临时目录以 Docker GPU smoke 验证 Qwen3-TTS 0.6B CustomVoice,成功后由 owning YAML 和受控 CLI 固化 D518 推理容器、NC01 FRPS、D518 FRPC、Secret sourceRef 与公网直连端口,再扩展 SelfMedia 远程 TTS 引擎并通过正常 master 自动交付在 4317 完成 voice 单步 smoke;禁止修改 release、生产 namespace/4319、手工长期运维或引入 Caddy,完成任务后将详细报告写入[任务报告](./details/selfmedia-production-delivery/R9_Task_Report.md)。
### R9.1 [in_progress]
依据 [UniDesk #2133](https://github.com/pikasTech/unidesk/issues/2133) 由 Artificer 经 trans 在 D518 /tmp 完成 Qwen3-TTS 0.6B CustomVoice Docker GPU smoke:锁定官方上游 ref、镜像/构建、低显存参数和 health/speech API,以固定中文技术资讯文本验证首次与热调用、WAV 解码、实时率和峰值显存;成功后清理临时容器并留下可接力证据,失败则在一次官方低显存参数尝试后停止且不无界更换模型,完成任务后将详细报告写入[任务报告](./details/selfmedia-production-delivery/R9.1_Task_Report.md)。
### R9.2 [in_progress]
依据 [SELFMEDIA #65](https://github.com/pikainc/selfmedia/issues/65) 由 Artificer 为 voice 单步增加 YAML 显式选择的 remote-openai-speech 自托管引擎:基础地址只从 YAML 声明的环境变量读取,模型、音色、指令、语速和引擎进入缓存身份,cache miss 调用 /v1/audio/speech 并原子写入 WAV,保留现有分段、edition 覆盖、FFmpeg 语速/响度和 timeline,禁止硬编码公网端口或静默回退 Kokoro,完成任务后将详细报告写入[任务报告](./details/selfmedia-production-delivery/R9.2_Task_Report.md)。
### R9.3 [in_progress]
依据 [SELFMEDIA #66](https://github.com/pikainc/selfmedia/issues/66) 由 Artificer 为 SelfMediaDeployment renderer 增加通用 runtime.environment 与 networkPolicy.allowedTcpEndpoints:严格校验并把普通业务环境变量投影到 backend,按 CIDR 和 TCP ports 为被 blockedCidrs 排除的地址生成精确 egress 例外,默认空配置保持现有语义;禁止删除网络隔离、放开全端口、硬编码 D518/语音服务或修改生产配置,完成任务后将详细报告写入[任务报告](./details/selfmedia-production-delivery/R9.3_Task_Report.md)。
#### R9.3.1 [in_progress]
依据 [SELFMEDIA #69](https://github.com/pikainc/selfmedia/issues/69) 将部署校验从全仓唯一 PipelineRun 断言改为按 owning target/环境独立验证:参数化解析开发与生产 PaC 制品,保留缺失、重复、错误归属的真实失败,但不得让合法多环境配置互相阻塞;用一个多环境 smoke 证明通用合同后完成本改进,且不得触碰或阻塞 R9 语音运行面,完成任务后将详细报告写入[任务报告](./details/selfmedia-production-delivery/R9.3.1_Task_Report.md)。
### R9.4 [in_progress]
依据 [UniDesk #2139](https://github.com/pikasTech/unidesk/issues/2139) 将 D518 先进语音推理与 NC01 直连 FRP 固化为 YAML-first 受控服务:owning YAML 声明 Docker GPU 服务、模型/source ref、持久缓存、NC01 FRPS、D518 FRPC、Secret sourceRef、端口和 health/speech smokeCLI 提供 plan、secret init、apply、status、logs、validate;可在 R9.1 下载期间完成代码和渲染,但必须等 GPU HTTP/WAV smoke 成功后才允许正式 apply,且不触碰 release、生产 namespace、4319 或 Caddy,完成任务后将详细报告写入[任务报告](./details/selfmedia-production-delivery/R9.4_Task_Report.md)。