Files
Molecule AI Dev Engineer A (Kimi) 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
docs(local-e2e): reference runtime PR #46 for canary mode source
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>
2026-05-23 11:41:16 +00:00
..

local-e2e — session-continuity canary harness

Self-contained Docker-Compose harness that gates RFC#600-class template changes (session continuity, file-only messages, multimodal prompts, cross-session memory) before they reach customer canary.

Per CTO standing directive "fully tested + separate CI": this is a dedicated, fast (target <3 min), small-surface harness that uses a Python tenant-CP simulator (not the full workspace-server Go service) to exercise the runtime image end-to-end against canonical canary turns.

See [feedback_no_single_source_of_truth] — the harness IS the canonical session-continuity validator. Per-runtime unit tests still cover their own guard logic; the harness covers the live conversational behaviour that those unit tests cannot prove.

See [feedback_image_promote_is_not_user_live] — every assertion reads state back from the running container, never from a publish-pipeline ack.

What it tests (the 4 canaries)

# Scenario Asserts
1 2-turn name canary turn 2 reply contains "Hongming" → SessionStore continuity
2 File-only message (no caption) NOT "(empty prompt — nothing to do)" + reply references filename or asks for clarification
3 File + caption ("summarize this") reply addresses attachment + caption
4 Cross-session memory recall new session pulls "blue" via memory tool

Each scenario re-uses the same A2A wire-shape that the production workspace-server POSTs to runtime :8000 (canvas-thread-id semantics via context_id).

Architecture

local-e2e/
  docker-compose.yml           # runtime under test + cp_sim
  cp_sim/                      # ≈300 LoC Python A2A poster + file uploader
    cp_sim.py
    Dockerfile
    requirements.txt
  canary/
    conftest.py
    test_session_continuity.py # 4 canary scenarios
    test_layer_diagnostics.py  # SessionStore state probe + key derivation
  scripts/
    run-canary.sh              # one-shot orchestration entrypoint

The CP simulator emits the exact JSON-RPC message/send envelope that workspace-server produces (verified against tests/e2e/test_chat_attachments_e2e.sh). No Go service is in the loop — this keeps the harness lean per the CTO directive.

Run locally

# from molecule-core repo root:
export TEMPLATE_IMAGE=ghcr.io/molecule-ai/workspace-template-hermes:latest
./local-e2e/scripts/run-canary.sh

Exit code 0 = all 4 canaries pass. Non-zero = at least one canary failed and the harness dumped SessionStore state + last 200 log lines from the runtime container into ./local-e2e/artifacts/.

How it integrates into CI

Each template repo's .gitea/workflows/session-continuity-e2e.yml calls run-canary.sh with its own freshly-built TEMPLATE_IMAGE. The template repo's Gitea branch-protection lists session-continuity-e2e (pull_request) as a required context.

Rollout order (deliberate — per feedback_image_promote_is_not_user_live we bake before we cascade):

  1. molecule-ai-workspace-template-hermes — highest-traffic + most recent RFC#600-class fixes — REQUIRED gate
  2. Bake for 5 business days
  3. Cascade to claude-code, langgraph, autogen, openclaw, smolagents, google-adk (one PR per template — see scripts/onboard-template.sh)

Future extensions (out of scope for the initial PR)

  • Multi-session memory consistency (3+ sessions deep)
  • Tool-use canary (workspace seeded with skills/, agent must invoke)
  • Streaming-cancellation canary (mid-stream client disconnect)
  • Cross-runtime A2A peer call (currently covered by e2e-peer-visibility)

Why a thin Python simulator and not the real workspace-server?

workspace-server is a 60+ MB Go binary that requires Postgres, Redis, admin-token wiring, registry plumbing, and a 30+ second cold-boot. None of that touches session-continuity behaviour, which is fully owned by the runtime container's a2a_executor.py. Per CTO directive "separate CI as possible" + the <3 min target, we excise the platform-tenant Go service from the loop and emit identical wire-shape envelopes from a single Python file.

If the simulator diverges from workspace-server wire shape, the gate goes red — fix the simulator to match production. The wire shape is asserted in tests/e2e/test_chat_attachments_e2e.sh and the runtime's workspace/a2a_executor.py:_core_execute.