Keep the DB binding and fail closed on svc.sh start rebuilds #188

Merged
weichen merged 3 commits from feature/svc-start-keep-db-binding into main 2026-10-05 02:18:07 +00:00
Owner

Why

2026-10-05 01:23 dev 服务事故:svc.sh dev restart --addr 0.0.0.0:8788 走显式参数重建分支,重建逻辑对 dev 环境刻意不拼 --dsn/--auth,持久化的 pg1 数据库绑定被静默丢弃;二进制 --auth auto 无 DSN 判定认证关,被 backend 8eda35f 引入的 listen guard 拒启(进程即退)。且 record_state 在健康探测前写盘,坏 exec= 持久化后裸 start 复用导致二次失败。

What

  1. 重建分支 dbref 兜底:新增 dsn_from_dbref,重建启动参数时由 dbref= 从 pg 实例登记重建 --dsn(优先级 CLI_DSN > SVC_*_DSN > dbref;mock 档除外);dev 环境同样尊重显式 --dsn/--auth(此前传入即被静默丢弃)。
  2. 失败不落坏配置:agent/static 启动的 record_state 后移至健康探测通过后——进程即退时保留上次配置并在报错中明示;超时(进程存活)按实际运行参数登记。pg 路径原本就正确,不动。
  3. 预检拦截:非回环地址且认证判定关(按二进制 AuthEnabled 口径)时在 svc.sh 层提前拒绝,报错给出四条可操作出路;二进制 listen guard 仍是权威。
  4. 日志泄漏对齐:启动/复用/旧产物过滤三处日志对 DSN 掩码(此前裸打密码,违背脚本自述掩码原则)。

Evidence

  • bash -n 通过;沙箱登记(stub 二进制)5 场景:dbref DSN 重建保留并落盘、无认证组合预检拒绝(登记未变更)、--auth on 解析式与透传式均放行、restart 携解析式参数正常、启动即退保留上次好配置(事故场景沙箱重演)。
  • make test 全绿(exit 0;含 test-boundaries/pins/libs/core/backend/frontend/ui/agentcmd)。
  • make precheck verdict READY;make task-sync synced(base 4d59610fd1 → head 4215107)。

Impact

  • 显式参数重启/换端口/换地址不再丢数据库绑定;启动失败不再污染登记。
  • 非回环+无认证组合在脚本层得到可操作报错,不再以"进程即退"暴露。
  • 不改后端 listen guard 语义、不改 deploy 物化链路。

Refs

  • backend 8eda35f(listen guard 引入)
  • runtime/dev history.jsonl 2026-10-05T01:23 两次 start fail
  • 任务卡:.task/feature-svc-start-keep-db-binding.md
## Why 2026-10-05 01:23 dev 服务事故:`svc.sh dev restart --addr 0.0.0.0:8788` 走显式参数重建分支,重建逻辑对 dev 环境刻意不拼 `--dsn/--auth`,持久化的 pg1 数据库绑定被静默丢弃;二进制 `--auth auto` 无 DSN 判定认证关,被 backend 8eda35f 引入的 listen guard 拒启(进程即退)。且 `record_state` 在健康探测前写盘,坏 `exec=` 持久化后裸 start 复用导致二次失败。 ## What 1. **重建分支 dbref 兜底**:新增 `dsn_from_dbref`,重建启动参数时由 `dbref=` 从 pg 实例登记重建 `--dsn`(优先级 CLI_DSN > SVC_*_DSN > dbref;mock 档除外);dev 环境同样尊重显式 `--dsn/--auth`(此前传入即被静默丢弃)。 2. **失败不落坏配置**:agent/static 启动的 `record_state` 后移至健康探测通过后——进程即退时保留上次配置并在报错中明示;超时(进程存活)按实际运行参数登记。pg 路径原本就正确,不动。 3. **预检拦截**:非回环地址且认证判定关(按二进制 AuthEnabled 口径)时在 svc.sh 层提前拒绝,报错给出四条可操作出路;二进制 listen guard 仍是权威。 4. **日志泄漏对齐**:启动/复用/旧产物过滤三处日志对 DSN 掩码(此前裸打密码,违背脚本自述掩码原则)。 ## Evidence - `bash -n` 通过;沙箱登记(stub 二进制)5 场景:dbref DSN 重建保留并落盘、无认证组合预检拒绝(登记未变更)、`--auth on` 解析式与透传式均放行、restart 携解析式参数正常、启动即退保留上次好配置(事故场景沙箱重演)。 - `make test` 全绿(exit 0;含 test-boundaries/pins/libs/core/backend/frontend/ui/agentcmd)。 - `make precheck` verdict READY;`make task-sync` synced(base 4d59610fd1 → head 4215107)。 ## Impact - 显式参数重启/换端口/换地址不再丢数据库绑定;启动失败不再污染登记。 - 非回环+无认证组合在脚本层得到可操作报错,不再以"进程即退"暴露。 - 不改后端 listen guard 语义、不改 deploy 物化链路。 ## Refs - backend 8eda35f(listen guard 引入) - runtime/dev history.jsonl 2026-10-05T01:23 两次 start fail - 任务卡:.task/feature-svc-start-keep-db-binding.md
weichen added 3 commits 2026-10-05 02:17:18 +00:00
Why: the 2026-10-05 dev outage — a restart with an explicit --addr rebuilt
the start args, and the rebuild branch dropped the persisted --dsn for the
dev env, so the binary resolved auth=auto to off on 0.0.0.0 and the new
listen guard refused to spawn; record_state then persisted the broken exec=
before the health probe, so bare starts kept failing.

Evidence: bash -n clean; sandbox registry with stub binaries — dbref DSN is
re-derived on rebuild (priority CLI > env > dbref), the pre-flight blocks
non-loopback without auth with actionable remedies, immediate-death starts
leave the previous exec= intact, and DSN masking covers all start-path log
lines; make test green.

Impact: dev/prod agent starts keep their DB binding across explicit-arg
rebuilds; failed starts no longer corrupt the registry; static/pg paths get
the same persist-after-probe ordering (pg already had it); no change to
deploy materialization or the binary guard semantics.

Refs: backend 8eda35f (listen guard), runtime/dev history.jsonl 01:23 fail
Record the sync checkpoint
ci / test (pull_request) Successful in 1m52s
36a1b363ad
weichen merged commit 73041b49fd into main 2026-10-05 02:18:07 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: weichen/Agent-System-Dev#188