dagger-bridge-hf-model-slash-route-rejected
The solution is written to ~/SOLUTION-dagger-bridge-hf-model-slash-route.md and the fix was verified with a standalone Go 1.26 reproduction (go vet clean, 6/6 tests pass).
Root cause. gatewayRoute splits provider/model on the first slash but then rejects the remainder if it still contains /. That guard is wrong — after the provider is consumed, the rest is an opaque model id, and HuggingFace namespace ids legitimately contain slashes (hf:moonshotai/Kimi-K3). So synthetic/hf:moonshotai/Kimi-K3 hit errRoute, the first tool() node failed, and the DAG dependency-skipped 19/20 nodes.
Fix. Delete the strings.Contains(parts[1], "/") reject; split at the first slash only and pass the model remainder verbatim. Provider and model already travel as separate JSON fields, so an embedded / is unambiguous on the wire. All fail-closed rejects are retained: empty halves, untrimmed whitespace, provider hermes, provider-with-slash, and an explicit provider that disagrees with the model-embedded one.
Verified behavior:
- ("", "synthetic/hf:moonshotai/Kimi-K3") → ("synthetic", "hf:moonshotai/Kimi-K3")
- wire JSON → {"provider":"synthetic","model":"hf:moonshotai/Kimi-K3"}
- all 8 fail-closed cases still return errRoute
- the pre-fix variant is shown to reject the HF route, proving the regression
The doc contains the exact diff/replacement function plus a copy-pasteable test file and acceptance checks.
# Evidence - Problem class: dagger-bridge-hf-model-slash-route-rejected - Model: openrouter/deepseek/deepseek-v4.1-flash - Solved: 2026-09-16T04:01:22.809Z - Verification: solution produced by pi in sandbox; see signatures.json
{"description": "<project> bridge gatewayRoute rejected any model id containing '/' after the provider split, making config-valid HuggingFace-style routes (synthetic/hf:moonshotai/Kimi-K3) inexpressible; DAGGER_TOOL_MODEL launcher lanes with hf:* heads fail at the first tool() node and dependency-skip the whole pipeline", "environment": "linux", "language": "go", "model": "openrouter/deepseek/deepseek-v4.1-flash", "problem_class": "dagger-bridge-hf-model-slash-route-rejected", "provider": "openrouter", "solved_at": "2026-09-16T04:01:22.809Z", "version": "1.26"}The solution is written to ~/SOLUTION-dagger-bridge-hf-model-slash-route.md and the fix was verified with a standalone Go 1.26 reproduction (go vet clean, 6/6 tests pass).
Root cause. gatewayRoute splits provider/model on the first slash but then rejects the remainder if it still contains /. That guard is wrong — after the provider is consumed, the rest is an opaque model id, and HuggingFace namespace ids legitimately contain slashes (hf:moonshotai/Kimi-K3). So synthetic/hf:moonshotai/Kimi-K3 hit errRoute, the first tool() node failed, and the DAG dependency-skipped 19/20 nodes.
Fix. Delete the strings.Contains(parts[1], "/") reject; split at the first slash only and pass the model remainder verbatim. Provider and model already travel as separate JSON fields, so an embedded / is unambiguous on the wire. All fail-closed rejects are retained: empty halves, untrimmed whitespace, provider hermes, provider-with-slash, and an explicit provider that disagrees with the model-embedded one.
Verified behavior:
- ("", "synthetic/hf:moonshotai/Kimi-K3") → ("synthetic", "hf:moonshotai/Kimi-K3")
- wire JSON → {"provider":"synthetic","model":"hf:moonshotai/Kimi-K3"}
- all 8 fail-closed cases still return errRoute
- the pre-fix variant is shown to reject the HF route, proving the regression
The doc contains the exact diff/replacement function plus a copy-pasteable test file and acceptance checks.
# Evidence - Problem class: dagger-bridge-hf-model-slash-route-rejected - Model: openrouter/deepseek/deepseek-v4.1-flash - Solved: 2026-09-16T04:01:22.809Z - Verification: solution produced by pi in sandbox; see signatures.json
{"description": "<project> bridge gatewayRoute rejected any model id containing '/' after the provider split, making config-valid HuggingFace-style routes (synthetic/hf:moonshotai/Kimi-K3) inexpressible; DAGGER_TOOL_MODEL launcher lanes with hf:* heads fail at the first tool() node and dependency-skip the whole pipeline", "environment": "linux", "language": "go", "model": "openrouter/deepseek/deepseek-v4.1-flash", "problem_class": "dagger-bridge-hf-model-slash-route-rejected", "provider": "openrouter", "solved_at": "2026-09-16T04:01:22.809Z", "version": "1.26"}