The /endpoints/zdr model-list builder derived ids from name.rsplit(" | "),
which leaks the human-readable display fragment (e.g. "Qwen3 Coder") into
model ids for providers whose name right-half is the model_name rather than
the slug. Read the canonical model_id (then id) first, keeping the
name-rsplit only as a last-resort fallback — mirrors openclaw-zdr-proxy
_parse_zdr_response (PR #421). Updated the test fixture to the real upstream
shape and added a regression assertion that no display name leaks into an id.
Note: nix fmt skipped — formatter (nixpkgs-fmt) is only defined for Linux
systems and this is an aarch64-darwin host; no .nix files changed.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Round-3 retrospective mechanical fixes
Four small, independently-verified fixes surfaced by the commit-history retrospective (epic #454, round 3). Each is one commit, scoped to one issue.
fix(zdr)model_id/idfirst (rsplit only as last-resort fallback) — it was deriving the model id fromname.rsplit(" | "), leaking display fragments likeQwen3 Coderinstead ofqwen/qwen3-coder:free. Same bug the proxy fixed in #421, never propagated to the pipe. Stub updated to the real upstream shape + regression test added.fix(reliability)TimeoutStartSecto non-serve oneshots with wait-loops so they aren't SIGTERM'd at the 90s host default:restic-check(0/unbounded — a killed check also fires a falsebackup-failure-alert),restic-backups(4h),n8n-community-packages(200), and the three Open-WebUI DB-migration oneshots (300).fix(reliability)--max-jobs 1 --cores 1throttle added toinstall.sh+deploy.shbuild/switch so a small-RAM VPS build can't OOM.fix(docs)e098d06.Validation
Run on a darwin host (no aarch64 builder), so validated by evaluation:
pytest tests/test_openrouter_zdr_pipe.py— 7/7 pass (incl. the new fix(open-webui): ZDR pipe builds model id from rsplit(display name) not canonical model_id (proxy bug #421 never propagated) #457 regression test).nix eval …rpi5-full…toplevel.drvPathand…zero-kuzea…toplevel.drvPath— both evaluate cleanly;TimeoutStartSecmerges confirmed ("4h",200).nixpkgs-fmt --check— clean on all changed nix files.CI's Trivy secret scan + aarch64 eval are the canonical gates. Based on top of #461.
Notes
autoUpgrade operation = "boot", the CLAUDE.md deploy-table note, the 6.6 kernel-pin audit) remain open in fix(reliability): remote VPS nixos-rebuild switch is non-atomic — hermes-claw unprotected, --max-jobs throttle enforced nowhere #451.🤖 Generated with Claude Code