Fix 'failed to fetch workflow' parse error: ocr.yml referenced a local reusable workflow path (./.github/workflows/ocr-review.yml) that does not exist in this repo. Point at Heretek-AI/.github org reusable workflow pinned to main HEAD (a440b485).
Bifrost now enforces inference auth with a virtual key
(env.BIFROST_VIRTUAL_KEY) that agentgateway's /v1 route sends as x-bf-vk,
enables management auth with env-referenced admin credentials, publishes
no host port and sits only on an `llm` network shared with agentgateway.
The OpenRouter fallback names anthropic/claude-default, a model its key
allows.
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_012AuVk4nEvBXaTjs4G6wdW4
Bifrost v2.3.0 loads $APP_DIR/config.json (APP_DIR=/app/data) at startup
and never read the mounted compose/bifrost.yaml, so no providers or
failover routes were configured. Replace it with compose/bifrost.config.json
(validated against the transports/v2.3.0 config.schema.json), bind-mounted
read-only at /app/data/config.json over the writable bifrost-data volume:
- providers opencode-go (host :11434), openrouter, vllm (host :8000), keys
as env.BIFROST_API_KEY / env.OPENROUTER_API_KEY references
- one global routing rule targeting opencode-go with fallbacks
openrouter -> vllm
session_affinity and the Retry-After clamp have no config.json equivalent
in v2.3.0 (the schema rejects unknown top-level keys) and are dropped.
The verifier now applies its generic rules to compose/*.json; tests, the
wave-1 gate, README, .env.example and agentgateway.yaml point at the new file.
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_012AuVk4nEvBXaTjs4G6wdW4
make images / validate-gateway / validate-compose / validate-units; CI runs
check, accept and the gateway, compose and unit validations with
SHA-pinned actions and a checksum-verified agentgateway binary. The wave-3
gate uses mktemp -d instead of /tmp/opencode, and the gates follow the new
pins and socket units.
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_012AuVk4nEvBXaTjs4G6wdW4
verify-stack gains --root, local-build and Dockerfile pin checks, and the
SELINUX_CONFINED and QUADLET_SOCKET_ACTIVATION rules over quadlet .container,
.socket and .service files. Fixture trees under test/fixtures/verify break
one rule each; tests assert exit 1 with exactly that rule, replacing the
source-contains-rule-names test. scripts/check-images.ts resolves every
pinned remote image against Docker Hub or the OCI registry API.
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_012AuVk4nEvBXaTjs4G6wdW4
Each heavy service now has a loopback .socket and a systemd-socket-proxyd
service (Requires=/After= the container, --exit-idle-time) on a shifted
container port. Container units keep StopWhenUnneeded=true, lose their
[Install] section and SecurityLabelType=spc, use Notify=healthy, and the
emulator uses AddDevice=/dev/kvm under default container_t confinement.
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_012AuVk4nEvBXaTjs4G6wdW4
The old config was rejected by agentgateway (unknown field version) and
core.yml ran a nonexistent serve subcommand. The gateway now runs
agentgateway -f /etc/agentgateway.yaml with binds/listeners/routes: one
/mcp/<target> route per MCP service (single target, same name, per the
context-router contract), API-key roles with admin-only mdb and gui, and an
OpenAI-compatible /v1 route to bifrost. Bifrost drops its invalid -config
flag. A test checks every labelled MCP service has its route.
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_012AuVk4nEvBXaTjs4G6wdW4
11 of 15 pinned images did not exist in their registries. Published images
now use real release tags (bifrost v2.3.0, searxng 2026.10.16-0ce72dd2c,
docker-android emulator_14.0_v3.8.0-p1, devcontainers/base 2.2.3-bookworm).
Upstreams with no usable image get images/<service>/Dockerfile on a pinned
base, installing a checksum- or commit-verified upstream release, tagged
localhost/heretek/<service>:<version> with pull_policy: build. Stdio-only
servers are wrapped with a pinned mcp-proxy so every MCP service serves
streamable HTTP; compose labels declare each endpoint.
radare2-mcp now runs with -R (read-only); the previous -r enabled the
dangerous run_* tools.
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_012AuVk4nEvBXaTjs4G6wdW4