# R9.5.2 任务报告

## 结果

NC01 的 `24317` 由 Docker proxy 监听。host 访问该端口有 HTTP 响应，但 `selfmedia` namespace 现有 Pod 访问 `10.42.0.1:24317` 明确连接失败，确认问题位于 Pod 到 host Docker published port 的 hairpin 路径。

`config/platform-infra/selfmedia-voice.yaml` 新增 `systemd-socket-proxyd` bridge 声明：监听 `10.42.0.1:24318`，转发至 `127.0.0.1:24317`。`platform-infra selfmedia-voice bridge plan|apply|status|validate` 负责渲染、安装和核对 systemd socket/service unit，不新增 Caddy、Ingress、NodePort 或第二配置来源。

bridge apply 会先比较已安装 unit 与 YAML 渲染结果。unit 未变化且 socket 已工作时不再重启 socket；unit 变化或 socket 未运行时，由 CLI 自行停止占用监听 FD 的 socket-activated service，再重载并启动 socket，不要求操作者手动 stop。apply 失败时继续保持 `mutation=false`，成功时保持 `mutation=true`。

`config/selfmedia.yaml` 只修改开发目标：`SELFMEDIA_TTS_BASE_URL` 与 `networkPolicy.allowedTcpEndpoints` 切到 `10.42.0.1:24318`；生产目标继续保持空 endpoint 和空允许列表。

## 验证

- Target worktree：`NC01:/root/unidesk/.worktree/selfmedia-voice-bridge`。
- `bun --check scripts/src/platform-infra-selfmedia-voice.ts` 通过。
- `bun test scripts/src/selfmedia-config.test.ts` 通过，结果为 `1 pass, 0 fail`。
- bridge plan 渲染 socket/service unit。
- 在 socket 和 socket-activated service 均为 active 的现场，连续执行两次 `bridge apply --confirm --json` 均为 `ok=true`、`exitCode=0`，两次都报告 `socketChanged=false`、`serviceChanged=false`，未再出现端口占用。
- apply 后 `bridge status --json` 和 `bridge validate --json` 均为 `ok=true`；socket 为 `active/enabled`，unit 内容匹配，host probe `http://10.42.0.1:24318/v1/models` 返回 HTTP `404`，证明请求已到达 upstream 而非连接拒绝。
- 在 `selfmedia` namespace 创建带唯一标签的短生命周期 smoke Pod 和只允许 `10.42.0.1/32:24318` 的临时 NetworkPolicy，请求 `/v1/models` 返回 HTTP `404`、`connectionRefused=false`；随后 Pod 与临时 NetworkPolicy 均已删除。
- 配置解析确认开发 endpoint/egress 为 `24318`，生产 endpoint 仍为空且允许列表仍为空。

## 边界

未修改现有 Deployment/Pod，未修改生产 SelfMedia endpoint，未打印 Secret，未人工创建 PipelineRun、mirror sync 或 Argo sync。bridge 已通过当前分支受控 CLI 部署到 NC01；PR 合并前，Git source authority 尚未进入 `master`，因此运行面与 source 的最终收敛依赖本任务 PR 正常合并。
