6ba9424196
Lint shellcheck (arm64 pilot) / shellcheck-arm64 (pilot) (pull_request) Waiting to run
cascade-list-drift-gate / check (pull_request) Failing after 7s
Block internal-flavored paths / Block forbidden paths (pull_request) Successful in 10s
Check migration collisions / Migration version collision check (pull_request) Successful in 15s
CI / Detect changes (pull_request) Successful in 22s
MCP Stdio Transport Regression / MCP stdio with regular-file stdout (pull_request) Successful in 1m26s
CI / Shellcheck (E2E scripts) (pull_request) Successful in 29s
E2E API Smoke Test / detect-changes (pull_request) Successful in 13s
E2E Chat / detect-changes (pull_request) Successful in 11s
E2E Peer Visibility (literal MCP list_peers) / E2E Peer Visibility (pull_request) Has been skipped
E2E Staging Canvas (Playwright) / detect-changes (pull_request) Successful in 16s
E2E Peer Visibility (literal MCP list_peers) / E2E Peer Visibility (local) (pull_request) Failing after 1m3s
E2E Staging SaaS (full lifecycle) / pr-validate (pull_request) Successful in 35s
E2E Staging SaaS (full lifecycle) / E2E Staging SaaS (pull_request) Has been skipped
Handlers Postgres Integration / detect-changes (pull_request) Successful in 4s
Harness Replays / detect-changes (pull_request) Successful in 4s
CI / Platform (Go) (pull_request) Successful in 4m48s
Lint curl status-code capture / Scan workflows for curl status-capture pollution (pull_request) Successful in 7s
Lint forbidden tenant-env keys / Scan workspace_secrets writers for forbidden env keys (pull_request) Successful in 3s
lint-continue-on-error-tracking / lint-continue-on-error-tracking (pull_request) Successful in 1m29s
Lint no tenant GITEA or GITHUB token write / Scan for repo-host token write into tenant workspace surface (pull_request) Successful in 3s
lint-mask-pr-atomicity / lint-mask-pr-atomicity (pull_request) Successful in 1m23s
CI / Canvas (Next.js) (pull_request) Successful in 6m11s
Lint pre-flip continue-on-error / Verify continue-on-error flips have run-log proof (pull_request) Successful in 1m10s
lint-required-no-paths / lint-required-no-paths (pull_request) Successful in 1m1s
E2E Staging External Runtime / E2E Staging External Runtime (pull_request) Successful in 5m15s
lint-required-context-exists-in-bp / lint-required-context-exists-in-bp (pull_request) Failing after 1m12s
lint-required-workflows-docker-host-pinned / Lint docker-host pin on docker-touching workflows (pull_request) Successful in 4s
publish-runtime-autobump / bump-and-tag (pull_request) Has been skipped
CI / Python Lint & Test (pull_request) Successful in 7m7s
CI / all-required (pull_request) Successful in 6m51s
publish-runtime-autobump / pr-validate (pull_request) Successful in 36s
Runtime PR-Built Compatibility / detect-changes (pull_request) Successful in 7s
Secret scan / Scan diff for credential-shaped strings (pull_request) Failing after 18s
gate-check-v3 / gate-check (pull_request) Failing after 4s
qa-review / approved (pull_request) Failing after 6s
Lint workflow YAML (Gitea-1.22.6-hostile shapes) / Lint workflow YAML for Gitea-1.22.6-hostile shapes (pull_request) Successful in 1m14s
security-review / approved (pull_request) Failing after 4s
sop-checklist / na-declarations (pull_request) N/A: (none)
sop-checklist / all-items-acked (pull_request) Successful in 4s
sop-checklist / review-refire (pull_request) Has been skipped
sop-tier-check / tier-check (pull_request) Successful in 7s
Ops Scripts Tests / Ops scripts (unittest) (pull_request) Successful in 1m16s
Runtime Pin Compatibility / PyPI-latest install + import smoke (pull_request) Successful in 2m16s
Harness Replays / Harness Replays (pull_request) Successful in 20s
E2E API Smoke Test / E2E API Smoke Test (pull_request) Failing after 1m44s
CI / Canvas Deploy Reminder (pull_request) Has been skipped
Handlers Postgres Integration / Handlers Postgres Integration (pull_request) Successful in 2m6s
Runtime PR-Built Compatibility / PR-built wheel + import smoke (pull_request) Successful in 2m36s
E2E Chat / E2E Chat (pull_request) Failing after 5m17s
E2E Staging Canvas (Playwright) / Canvas tabs E2E (pull_request) Successful in 8m1s
audit-force-merge / audit (pull_request) Successful in 10s
The canary short-circuit was moved from molecule-core/workspace/
(deleted in main via 9aa47643) to molecule-ai-workspace-runtime
(molecule_runtime/a2a_executor.py). Update docker-compose comment
so engineers can find the live code.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
59 lines
2.7 KiB
YAML
59 lines
2.7 KiB
YAML
# local-e2e/docker-compose.yml — minimal harness stack.
|
|
#
|
|
# Two services:
|
|
# runtime — the template image under test (TEMPLATE_IMAGE env var).
|
|
# Exposes :8000 for A2A traffic. The simulator POSTs to it.
|
|
# cp_sim — thin Python tenant-CP simulator. Drives the canary turns.
|
|
#
|
|
# Deliberately NO postgres, NO redis, NO platform Go service. SessionStore
|
|
# continuity is a runtime-internal concern (a2a_executor + executor_helpers);
|
|
# we test it without dragging the platform-tenant Go binary into the loop.
|
|
# See README.md "Why a thin Python simulator" for rationale.
|
|
|
|
services:
|
|
runtime:
|
|
image: ${TEMPLATE_IMAGE:?TEMPLATE_IMAGE env required, e.g. ghcr.io/molecule-ai/workspace-template-hermes:latest}
|
|
# The runtime entrypoint (workspace/entrypoint.sh) refuses to start when
|
|
# any operator-scope env var is present. We deliberately set no creds —
|
|
# the canary doesn't invoke a real LLM provider (see TEST_NO_PROVIDER below).
|
|
environment:
|
|
# Disable provider calls during canary — the runtime returns canned
|
|
# echo-style replies so the harness can assert continuity / file-handling
|
|
# behaviour without burning provider quota. The template image must
|
|
# honour MOLECULE_CANARY_MODE=1 (added in molecule-ai-workspace-runtime
|
|
# PR #46 — see molecule_runtime/a2a_executor.py canary short-circuit).
|
|
MOLECULE_CANARY_MODE: "1"
|
|
# Anonymous workspace identity so RBAC paths exercise the same code
|
|
# they would in tenant production.
|
|
WORKSPACE_ID: "canary-${CANARY_RUN_ID:-local}"
|
|
# Memory tool requires a writable scope; point at /tmp inside the
|
|
# container so cross-session canary (#4) works without bind mounts.
|
|
MOLECULE_MEMORY_ROOT: "/tmp/canary-memory"
|
|
# The provisioner's forbidden-env guard exits non-zero when any
|
|
# operator-scope literal is present; the canary intentionally sets
|
|
# zero of them. Leave guard ON (do NOT set MOLECULE_TENANT_GUARD_DISABLE)
|
|
# so we exercise the prod entrypoint code path verbatim.
|
|
ports:
|
|
- "${RUNTIME_PORT:-18000}:8000"
|
|
healthcheck:
|
|
# /agent-card is the universal A2A discovery endpoint — every template
|
|
# exposes it. /health varies per template.
|
|
test: ["CMD-SHELL", "wget -qO /dev/null --tries=1 http://localhost:8000/agent-card || exit 1"]
|
|
interval: 3s
|
|
timeout: 3s
|
|
retries: 20
|
|
start_period: 30s
|
|
|
|
cp_sim:
|
|
build:
|
|
context: ./cp_sim
|
|
depends_on:
|
|
runtime:
|
|
condition: service_healthy
|
|
environment:
|
|
RUNTIME_URL: "http://runtime:8000"
|
|
CANARY_RUN_ID: "${CANARY_RUN_ID:-local}"
|
|
# cp_sim doesn't expose a port — it's a one-shot driver invoked by
|
|
# run-canary.sh via `docker compose run cp_sim pytest ...`.
|
|
profiles: ["driver"]
|