fix(honcho): add Ollama Token Auth bridge and JSON fallback #360

Merged
pdurlej merged 1 commit from codex/honcho-ollama-runtime-secret-json-fallback into main 2026-05-18 07:56:25 +02:00
Collaborator

Canary status: missing — fire canary 3+3 manually before merge

Canary Context Pack

Product story

Honcho's Gemma/Ollama switch needs a durable way to read OLLAMA_CLOUD_API_KEY on RS2000. The key exists in Infisical under /home-platform/providers, but the deploy runner token path must be explicit and testable instead of depending on an interactive Infisical CLI session.

What changed

  • Added token-auth backend support to write_canary_env.py, including configurable parent/output modes for runtime env files.
  • Updated Honcho's Ollama/Gemma compatibility smoke so JSON checks can fall back from native response_format to strict plain-prompt JSON when needed.
  • Documented the RS2000 provider-env render flow and deploy-runner PLATFORMCTL_COMPOSE_ENV_FILE update.
  • Added contract tests for Token Auth env rendering and JSON fallback behavior.

Why it changed

The first Honcho deploy path failed because the deploy runner's existing Infisical Token Auth access was scoped for Forgejo PAT lookup, not /home-platform/providers. This PR makes the intended provider-secret bridge explicit and keeps the Ollama key out of git, Forgejo variables, Forgejo secrets, and logs.

Files touched

  • control-plane/platformctl/ci/write_canary_env.py
  • scripts/honcho/ollama-gemma-compat-smoke.py
  • control-plane/platformctl/tests/test_forgejo_ci_scripts_contract.py
  • control-plane/platformctl/tests/test_honcho_ollama_contract.py
  • runbooks/honcho-ollama-gemma-switch.md
  • runbooks/forgejo-actions-runner.md
  • docs/ci/README.md
  • docs/ci/runner-contract.md
  • docs/forgejo-agent-operations.md

Relevant context

  • Honcho LLM-only switch remains separate from BGE-M3 embedding migration.
  • /home-platform/providers:OLLAMA_CLOUD_API_KEY is the Infisical source of truth.
  • Runtime env files may need 0640 root:platform-host-agent; canary env files still default to 0600.

Runtime evidence

  • Local Infisical raw-secret fetch for /home-platform/providers:OLLAMA_CLOUD_API_KEY: HTTP 200, value present, value not printed.
  • Synthetic Ollama smoke against https://ollama.com/v1 and gemma4:31b-cloud: chat_completion=pass, json_response=pass json_mode=response_format, tool_call=pass.

Known constraints

  • This does not install or widen the RS2000 Token Auth ACL by itself.
  • The deploy runner token must have describeSecret + readValue for /home-platform/providers/** in prod before the Honcho deploy can proceed.
  • No production Honcho service is restarted by this PR.

Explicit out-of-scope

  • BGE-M3 production switch.
  • Honcho vector schema/data migration.
  • Direct production mutation on RS2000.
  • Storing provider keys in Forgejo repository secrets or variables.

Requested decision

Approve the runtime secret bridge and JSON smoke behavior so the operator can merge, then apply the documented RS2000 Token Auth ACL/env-file step before retrying the Honcho LLM deploy.

Merge blockers

  • Any secret value printed or committed.
  • Token Auth backend weakening default canary env permissions.
  • JSON fallback hiding auth/model/timeout errors instead of failing clearly.

Spec sources read

  • runbooks/honcho-ollama-gemma-switch.md — target switch procedure.
  • docs/forgejo-agent-operations.md — Forgejo/Infisical provider-secret rules.
  • docs/ci/runner-contract.md — runner-local secret bridge contract.
  • runbooks/forgejo-actions-runner.md — trusted runner env generation flow.
  • control-plane/platformctl/ci/write_canary_env.py — env-file generator implementation.
  • scripts/honcho/ollama-gemma-compat-smoke.py — compatibility smoke implementation.
  • pdurlej/agent-souls practices via Forgejo API — confirmed Token Auth direct Bearer is the canonical non-interactive MVP.

Test Plan

  • python3 -m py_compile control-plane/platformctl/ci/write_canary_env.py scripts/honcho/ollama-gemma-compat-smoke.py
  • control-plane/.venv/bin/python -m pytest -q control-plane/platformctl/tests/test_forgejo_ci_scripts_contract.py control-plane/platformctl/tests/test_honcho_ollama_contract.py
  • ruff check control-plane/platformctl/ci/write_canary_env.py scripts/honcho/ollama-gemma-compat-smoke.py control-plane/platformctl/tests/test_forgejo_ci_scripts_contract.py control-plane/platformctl/tests/test_honcho_ollama_contract.py
  • git diff --check
  • Local synthetic Ollama smoke through Infisical-fetched key: pass; no secret printed.

Commit: 47e256a

Canary status: missing — fire canary 3+3 manually before merge ## Canary Context Pack ### Product story Honcho's Gemma/Ollama switch needs a durable way to read `OLLAMA_CLOUD_API_KEY` on RS2000. The key exists in Infisical under `/home-platform/providers`, but the deploy runner token path must be explicit and testable instead of depending on an interactive Infisical CLI session. ### What changed - Added `token-auth` backend support to `write_canary_env.py`, including configurable parent/output modes for runtime env files. - Updated Honcho's Ollama/Gemma compatibility smoke so JSON checks can fall back from native `response_format` to strict plain-prompt JSON when needed. - Documented the RS2000 provider-env render flow and deploy-runner `PLATFORMCTL_COMPOSE_ENV_FILE` update. - Added contract tests for Token Auth env rendering and JSON fallback behavior. ### Why it changed The first Honcho deploy path failed because the deploy runner's existing Infisical Token Auth access was scoped for Forgejo PAT lookup, not `/home-platform/providers`. This PR makes the intended provider-secret bridge explicit and keeps the Ollama key out of git, Forgejo variables, Forgejo secrets, and logs. ### Files touched - `control-plane/platformctl/ci/write_canary_env.py` - `scripts/honcho/ollama-gemma-compat-smoke.py` - `control-plane/platformctl/tests/test_forgejo_ci_scripts_contract.py` - `control-plane/platformctl/tests/test_honcho_ollama_contract.py` - `runbooks/honcho-ollama-gemma-switch.md` - `runbooks/forgejo-actions-runner.md` - `docs/ci/README.md` - `docs/ci/runner-contract.md` - `docs/forgejo-agent-operations.md` ### Relevant context - Honcho LLM-only switch remains separate from BGE-M3 embedding migration. - `/home-platform/providers:OLLAMA_CLOUD_API_KEY` is the Infisical source of truth. - Runtime env files may need `0640 root:platform-host-agent`; canary env files still default to `0600`. ### Runtime evidence - Local Infisical raw-secret fetch for `/home-platform/providers:OLLAMA_CLOUD_API_KEY`: HTTP 200, value present, value not printed. - Synthetic Ollama smoke against `https://ollama.com/v1` and `gemma4:31b-cloud`: `chat_completion=pass`, `json_response=pass json_mode=response_format`, `tool_call=pass`. ### Known constraints - This does not install or widen the RS2000 Token Auth ACL by itself. - The deploy runner token must have `describeSecret` + `readValue` for `/home-platform/providers/**` in `prod` before the Honcho deploy can proceed. - No production Honcho service is restarted by this PR. ### Explicit out-of-scope - BGE-M3 production switch. - Honcho vector schema/data migration. - Direct production mutation on RS2000. - Storing provider keys in Forgejo repository secrets or variables. ### Requested decision Approve the runtime secret bridge and JSON smoke behavior so the operator can merge, then apply the documented RS2000 Token Auth ACL/env-file step before retrying the Honcho LLM deploy. ### Merge blockers - Any secret value printed or committed. - Token Auth backend weakening default canary env permissions. - JSON fallback hiding auth/model/timeout errors instead of failing clearly. ## Spec sources read - `runbooks/honcho-ollama-gemma-switch.md` — target switch procedure. - `docs/forgejo-agent-operations.md` — Forgejo/Infisical provider-secret rules. - `docs/ci/runner-contract.md` — runner-local secret bridge contract. - `runbooks/forgejo-actions-runner.md` — trusted runner env generation flow. - `control-plane/platformctl/ci/write_canary_env.py` — env-file generator implementation. - `scripts/honcho/ollama-gemma-compat-smoke.py` — compatibility smoke implementation. - `pdurlej/agent-souls` practices via Forgejo API — confirmed Token Auth direct Bearer is the canonical non-interactive MVP. ## Test Plan - `python3 -m py_compile control-plane/platformctl/ci/write_canary_env.py scripts/honcho/ollama-gemma-compat-smoke.py` - `control-plane/.venv/bin/python -m pytest -q control-plane/platformctl/tests/test_forgejo_ci_scripts_contract.py control-plane/platformctl/tests/test_honcho_ollama_contract.py` - `ruff check control-plane/platformctl/ci/write_canary_env.py scripts/honcho/ollama-gemma-compat-smoke.py control-plane/platformctl/tests/test_forgejo_ci_scripts_contract.py control-plane/platformctl/tests/test_honcho_ollama_contract.py` - `git diff --check` - Local synthetic Ollama smoke through Infisical-fetched key: pass; no secret printed. Commit: `47e256a`
fix(honcho): add ollama token bridge and json fallback
All checks were successful
canary-required / collect-diff (pull_request) Successful in 3s
infra-docs-drift / docs-drift (pull_request) Successful in 4s
patchwarden-pr-sanity / collect-diff (pull_request) Successful in 3s
platformctl plan / auto-apply scope (pull_request) Successful in 19s
pyfallow / Pyfallow gate (control-plane) (pull_request) Successful in 17s
python-ci / Python 3.11 (pull_request) Successful in 36s
python-ci / Python 3.12 (pull_request) Successful in 37s
python-ci / Python 3.13 (pull_request) Successful in 37s
workflow-lint / lint (pull_request) Successful in 5s
canary-required / canary (pull_request) Successful in 13s
base-is-main / guard (pull_request) Successful in 1s
patchwarden-pr-sanity / sanity (pull_request) Successful in 21s
47e256a56f
Sign in to join this conversation.
No reviewers
No labels
W6d-automerge-calibration
agent/claude-code
agent/codex
agent/hermes
agent/iskra
agent/ollama
agent/patchwarden
automerge-candidate
class/security-sensitive
cutover-gate
dependency/blocked
dependency/blocks-others
dependency/cross-repo
dependency/needs-confirmation
domain:agents
domain:ci
domain:docs
domain:forgejo
domain:infra
domain:memory
domain:runtime
domain:signal
domain:ux
flow/architecture
flow/blocked
flow/deployed
flow/done
flow/implementation
flow/intake
flow/maintained
flow/observed
flow/ready
flow/refining
flow/retired
flow/review
iterating
judge/codex-candidate
judge/hermes-candidate
judge/low-confidence
judge/needs-refinement
judge/operator-needed
judge/p0
judge/p1
judge/p2
judge/p3
judge/park
judge/patchwarden-candidate
judge/stale-priority
kind/adr
kind/bug
kind/chore
kind/feature
kind/infra
kind/ops
kind/refactor
kind/research
large-impact
merge/auto
merge/manual
merge/manual-dependency-conflict
merge/manual-failing-tests
merge/manual-merge-conflict
merge/manual-missing-review
merge/manual-operator-preference
merge/manual-red-zone
merge/manual-security-sensitive
merge/manual-unclear-scope
merge/manual-unknown
meta
mode:operator-only
mode:patchwarden-iskra-approved
mode:safe-auto
needs-operator-decision
needs-triage
not-ready
observed/erroring
observed/needs-followup
observed/pending
observed/retire-candidate
observed/unused
observed/used
operator-emotional
owner-attention
phase/02
phase/03
priority:p0
priority:p1
priority:p2
priority:p3
proposed
ready-for-agent
ready-for-operator
recovery
review:claude-reviewed
review:codex-reviewed
review:dziadek-reviewed
review:needs-human
risk/exposure
risk/process
risk/product
risk/runtime
safety:external-write
safety:no-prod-mutation
safety:prod-impact
safety:secret-touch
size/large
size/medium
size/small
size/tiny
size/unknown
source/adr
source/agent-generated
source/manual
source/operator-chat
source/voice-note
status:blocked
status:codex-ready
status:merged:pending-evidence
status:needs-evidence
status:operator-needed
status:parked
tier/full
tier/lite
tier/stacked
tier:0-platform-substrate
tier:1-iskra-value-layer
tier:2-tools-products-modules
type:bug
type:chore
type:docs
type:feat
type:policy
type:research
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
pdurlej/platform!360
No description provided.