From 2b4030aff5f797188082541c39729d5e58da3e0c Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Thu, 20 Aug 2026 21:49:18 +0900 Subject: [PATCH 1/2] fix: pin temperature-capable orchestrator runtime --- ....1-orchestrator-temperature-negotiation.md | 7 +++++++ docker/contextual-orchestrator/Dockerfile | 4 ++-- .../0083-orchestrator-runtime-commit-pin.md | 16 +++++++++----- tests/test_orchestrator_runtime_pin.py | 21 +++++++++++++++++++ 4 files changed, 41 insertions(+), 7 deletions(-) create mode 100644 CHANGELOG.d/2.20.1-orchestrator-temperature-negotiation.md create mode 100644 tests/test_orchestrator_runtime_pin.py diff --git a/CHANGELOG.d/2.20.1-orchestrator-temperature-negotiation.md b/CHANGELOG.d/2.20.1-orchestrator-temperature-negotiation.md new file mode 100644 index 000000000..51cf1e144 --- /dev/null +++ b/CHANGELOG.d/2.20.1-orchestrator-temperature-negotiation.md @@ -0,0 +1,7 @@ +# 2.20.1 — Provider temperature capability negotiation + +- Compose now pins contextual-orchestrator PR #779 so providers that accept + only their default sampling temperature can retry the same request without + the unsupported optional field instead of leaving summaries unavailable. +- The pin remains an immutable upstream commit and does not copy provider + behavior or credentials into LineageWeave. diff --git a/docker/contextual-orchestrator/Dockerfile b/docker/contextual-orchestrator/Dockerfile index 4e5726543..e781d82cc 100644 --- a/docker/contextual-orchestrator/Dockerfile +++ b/docker/contextual-orchestrator/Dockerfile @@ -3,10 +3,10 @@ FROM python:3.12-slim@sha256:423ed6ab25b1921a477529254bfeeabf5855151dc2c3141699a WORKDIR /app # Reuse the upstream implementation without copying it into LineageWeave. -# Pin the runtime to PR #765's pushed commit until that protected PR merges; +# Pin the runtime to PR #779's pushed commit until that protected PR merges; # this keeps model selection, structured synthesis, and reasoning policy in # contextual-orchestrator itself. -ADD https://github.com/ContextualWisdomLab/contextual-orchestrator/archive/7df051a.tar.gz /tmp/contextual-orchestrator.tar.gz +ADD https://github.com/ContextualWisdomLab/contextual-orchestrator/archive/cf4a4501fa5057f89b21cad5033c5925755cd150.tar.gz /tmp/contextual-orchestrator.tar.gz RUN mkdir /tmp/contextual-orchestrator \ && tar -xzf /tmp/contextual-orchestrator.tar.gz --strip-components=1 -C /tmp/contextual-orchestrator \ && cp -R /tmp/contextual-orchestrator/contextual_orchestrator /app/contextual_orchestrator \ diff --git a/docs/adr/0083-orchestrator-runtime-commit-pin.md b/docs/adr/0083-orchestrator-runtime-commit-pin.md index f84cc8230..eff7ef4be 100644 --- a/docs/adr/0083-orchestrator-runtime-commit-pin.md +++ b/docs/adr/0083-orchestrator-runtime-commit-pin.md @@ -10,14 +10,17 @@ The orchestrator's `auto` reasoning mode is an internal routing decision and must not be forwarded as an upstream provider `reasoning_effort` value. The runtime also must discover provider models from the configured gateway rather than requiring `LLM_GATEWAY_MODEL`, and structured requests must remain -multi-agent. +multi-agent. Some provider deployments accept only their default sampling +temperature; retrying the same rejected value cannot recover that capability +mismatch. ## Decision `docker/contextual-orchestrator/Dockerfile` pins the downloaded archive to -commit `6db772e`, the pushed head of contextual-orchestrator PR #765. The pin -remains explicit and immutable until the protected PR merges; it is not a -moving `main` reference and it is not a LineageWeave monkey patch. +commit `cf4a4501fa5057f89b21cad5033c5925755cd150`, the pushed head of +contextual-orchestrator PR #779, stacked on PR #765. The pin remains explicit +and immutable until the protected PRs merge; it is not a moving `main` +reference and it is not a LineageWeave monkey patch. The runtime contract is: @@ -33,6 +36,9 @@ The runtime contract is: reconciliation prompt; independent VISION worker evidence is retained instead. - A provider 4xx is reported as a failed orchestration attempt, never as a successful empty semantic result. +- When HTTP 400/422 explicitly proves that `temperature` is unsupported, the + same endpoint is retried once with only that optional field omitted. Invalid + values and unrelated 4xx responses remain fail-closed. - An empty seed model is expanded from the configured gateway `/v1/models` endpoint; embedding-only rows are not added to the chat agent pool. - `json_object`, `json_schema`, and Responses JSON formats run conduct plus @@ -44,4 +50,4 @@ The runtime contract is: implementation. - Rebuilding the image is required after the upstream pin changes. - Protected-branch review and merge remain external gates; this pin does not - bypass PR #765. + bypass PR #765 or PR #779. diff --git a/tests/test_orchestrator_runtime_pin.py b/tests/test_orchestrator_runtime_pin.py new file mode 100644 index 000000000..17a6362a5 --- /dev/null +++ b/tests/test_orchestrator_runtime_pin.py @@ -0,0 +1,21 @@ +"""Keep the reviewed contextual-orchestrator archive pin and ADR synchronized.""" + +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] +ORCHESTRATOR_COMMIT = "cf4a4501fa5057f89b21cad5033c5925755cd150" + + +def test_orchestrator_runtime_pin_matches_adr() -> None: + """The image and decision record must identify the same immutable commit.""" + dockerfile = (ROOT / "docker/contextual-orchestrator/Dockerfile").read_text( + encoding="utf-8" + ) + adr = (ROOT / "docs/adr/0083-orchestrator-runtime-commit-pin.md").read_text( + encoding="utf-8" + ) + + assert f"contextual-orchestrator/archive/{ORCHESTRATOR_COMMIT}.tar.gz" in dockerfile + assert f"commit `{ORCHESTRATOR_COMMIT}`" in adr + assert "PR #779" in dockerfile and "PR #779" in adr From 221f8be9bd27e164abf25fd08e14c429ffd7285b Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Thu, 20 Aug 2026 22:00:24 +0900 Subject: [PATCH 2/2] docs: link upstream orchestrator decisions --- CHANGELOG.d/2.20.1-orchestrator-temperature-negotiation.md | 2 +- docker/contextual-orchestrator/Dockerfile | 2 +- docs/adr/0083-orchestrator-runtime-commit-pin.md | 6 ++++-- tests/test_orchestrator_runtime_pin.py | 3 ++- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.d/2.20.1-orchestrator-temperature-negotiation.md b/CHANGELOG.d/2.20.1-orchestrator-temperature-negotiation.md index 51cf1e144..dc05a43e7 100644 --- a/CHANGELOG.d/2.20.1-orchestrator-temperature-negotiation.md +++ b/CHANGELOG.d/2.20.1-orchestrator-temperature-negotiation.md @@ -1,6 +1,6 @@ # 2.20.1 — Provider temperature capability negotiation -- Compose now pins contextual-orchestrator PR #779 so providers that accept +- Compose now pins ContextualWisdomLab/contextual-orchestrator#779 so providers that accept only their default sampling temperature can retry the same request without the unsupported optional field instead of leaving summaries unavailable. - The pin remains an immutable upstream commit and does not copy provider diff --git a/docker/contextual-orchestrator/Dockerfile b/docker/contextual-orchestrator/Dockerfile index e781d82cc..28eaee190 100644 --- a/docker/contextual-orchestrator/Dockerfile +++ b/docker/contextual-orchestrator/Dockerfile @@ -3,7 +3,7 @@ FROM python:3.12-slim@sha256:423ed6ab25b1921a477529254bfeeabf5855151dc2c3141699a WORKDIR /app # Reuse the upstream implementation without copying it into LineageWeave. -# Pin the runtime to PR #779's pushed commit until that protected PR merges; +# Pin the runtime to ContextualWisdomLab/contextual-orchestrator#779's pushed commit until that protected PR merges; # this keeps model selection, structured synthesis, and reasoning policy in # contextual-orchestrator itself. ADD https://github.com/ContextualWisdomLab/contextual-orchestrator/archive/cf4a4501fa5057f89b21cad5033c5925755cd150.tar.gz /tmp/contextual-orchestrator.tar.gz diff --git a/docs/adr/0083-orchestrator-runtime-commit-pin.md b/docs/adr/0083-orchestrator-runtime-commit-pin.md index eff7ef4be..225032001 100644 --- a/docs/adr/0083-orchestrator-runtime-commit-pin.md +++ b/docs/adr/0083-orchestrator-runtime-commit-pin.md @@ -18,7 +18,8 @@ mismatch. `docker/contextual-orchestrator/Dockerfile` pins the downloaded archive to commit `cf4a4501fa5057f89b21cad5033c5925755cd150`, the pushed head of -contextual-orchestrator PR #779, stacked on PR #765. The pin remains explicit +ContextualWisdomLab/contextual-orchestrator#779, stacked on +ContextualWisdomLab/contextual-orchestrator#765. The pin remains explicit and immutable until the protected PRs merge; it is not a moving `main` reference and it is not a LineageWeave monkey patch. @@ -50,4 +51,5 @@ The runtime contract is: implementation. - Rebuilding the image is required after the upstream pin changes. - Protected-branch review and merge remain external gates; this pin does not - bypass PR #765 or PR #779. + bypass ContextualWisdomLab/contextual-orchestrator#765 or + ContextualWisdomLab/contextual-orchestrator#779. diff --git a/tests/test_orchestrator_runtime_pin.py b/tests/test_orchestrator_runtime_pin.py index 17a6362a5..be37b930c 100644 --- a/tests/test_orchestrator_runtime_pin.py +++ b/tests/test_orchestrator_runtime_pin.py @@ -18,4 +18,5 @@ def test_orchestrator_runtime_pin_matches_adr() -> None: assert f"contextual-orchestrator/archive/{ORCHESTRATOR_COMMIT}.tar.gz" in dockerfile assert f"commit `{ORCHESTRATOR_COMMIT}`" in adr - assert "PR #779" in dockerfile and "PR #779" in adr + upstream_pr = "ContextualWisdomLab/contextual-orchestrator#779" + assert upstream_pr in dockerfile and upstream_pr in adr