- Rename user-facing env var CF_ORCH_URL → GPU_SERVER_URL with full
backward-compat alias (closes#116). Priority chain: GPU_SERVER_URL
→ CF_ORCH_URL → orch.circuitforge.tech when CF_LICENSE_KEY present.
Write-back to os.environ[CF_ORCH_URL] keeps all downstream callers
unchanged.
- Add four task-routed llm.yaml backends (cf_cover_letter, cf_ats_rewrite,
cf_job_research, cf_interview_prep) using cf_orch.product + cf_orch.task.
Coordinator resolves model/node from assignments.yaml (closes#115).
- Update compose.yml, compose.cloud.yml, compose.test-cfcore.yml,
.env.example to use GPU_SERVER_URL as primary documented var.
Threads coordinator_url from CF_ORCH_URL env var (default localhost:7700)
into the cfcore TaskScheduler so Docker instances can point at
host.docker.internal:7700 instead of the container's own loopback.
Also adds CF_ORCH_URL to compose.test-cfcore.yml and mounts persistent
patched configs (llm.docker.yaml, user.docker.yaml) for the test instance.
sync_ui_cookie() was calling window.parent.location.reload() on every
render when user.yaml has ui_preference=vue, but no Caddy is in the
traffic path (test instances, bare Docker). This caused an infinite
reload loop because the reload just came back to Streamlit.
Gate the reload on PEREGRINE_CADDY_PROXY=1. Without it, the cookie is
still written silently but no reload is attempted. Add the env var to
compose.yml and compose.cloud.yml (both are behind Caddy); omit from
compose.test-cfcore.yml so test instances stay stable.
- Dockerfile: restored to original (build: . context, no cfcore) so
existing compose.yml / compose.cloud.yml builds are unaffected
- Dockerfile.cfcore: parent-context build that copies circuitforge-core/
alongside peregrine/ before pip install; resolves -e ../circuitforge-core
- compose.test-cfcore.yml: single-user test instance on port 8516;
run from parent dir with context: .. so both repos are in scope
Use this to smoke-test cfcore shims before promoting to prod cloud.