Two errors in the merged caveat (#107):
1. Claimed the stub RequestContext "carries an empty user message"
— actually carries "smoke test" text (smoke_mode.py:76 calls
`new_text_message("smoke test")`, with the explicit comment
that it's "enough that extract_message_text(context) returns
non-empty input"). Adapter authors gating smoke-mode behavior
on extract_message_text(ctx) == "" would have a logic that
never fires.
2. Described only the timeout-pass path. The harness also returns
0 on ANY non-import exception (smoke_mode.py:135-143) — the
bare `except Exception` block treats RuntimeError, auth errors,
validation errors etc. as "downstream of the import gate" and
exits clean. Spelling out all three pass cases (clean return,
timeout, non-import exception) is the honest description.
Caught while re-reading smoke_mode.py to verify claims for a
review pass — found I had asserted both behaviors from memory
without checking, exactly the failure mode my e2e-test memory
just got a worked-example update about.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
A green gate means imports are healthy enough that
executor.execute() reaches its body. It does NOT prove that
execute() produces the right output: adapters with real I/O
inside execute() (subprocess to a gateway, httpx call upstream)
time out under the 5s harness window, and the gate treats a clean
timeout as success.
Surfaced while running publish-image across all 8 templates: the
openclaw smoke "passed" with timing-out behavior in execute()
because OpenClawA2AExecutor proxies to a subprocess that doesn't
exist in the smoke env. Reading the green check, future operators
might over-trust it as a runtime-correctness signal — it isn't.
Add a "What the gate does NOT prove" subsection so readers don't
mistake the import-regression coverage for an integration test.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The publish-image boot-smoke gate (molecule-core#2275) invokes the
runtime with MOLECULE_SMOKE_MODE=1 + stub creds to catch lazy
imports inside executor.execute(). Adapters whose setup() does
real I/O (subprocess spawn, network calls, uid-sensitive writes)
need to opt out of that I/O when MOLECULE_SMOKE_MODE=1, otherwise
the gate fails before reaching the runtime's smoke short-circuit.
This documents:
- the contract (one-line opt-out for Python adapter.setup() and
shell entrypoints that wrap molecule-runtime)
- which boot stages the gate exercises
- the stub env the harness sets so adapters can reason about what
they can rely on under smoke mode
Surfaced when running publish-image across all 8 workspace
templates: openclaw and hermes hit the contract gap because both
spawn real gateway subprocesses in setup; six others passed
without any contract awareness because their setup is light.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The secrets endpoint is GET /workspaces/:id/secrets, not
GET /workspaces/:id/secrets/values. Fix three occurrences in:
- workspace-runtime.md: comparison table and curl example
- remote-workspaces.md: ASCII diagram and Phase 30.2 table
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>