Run fn with the declared services up, disposing them afterwards — even if
fn throws. The scope-guard form of experimental_startServices: it
removes the manual try/finally so a measureArms / measure call can be
wrapped in one line and its containers are always cleaned up.
⚠️ Read the SAFETY note in this module's header first — the container is the
only isolation; keep real credentials out of the run.
LIFECYCLE NOTE (honest): the services live for the WHOLE fn — i.e. per-RUN,
not per-trial. An eval that mutates service state across trials should make its
task self-contained (e.g. drop … if exists; create; migrate) or run
trials: 1. True per-trial reset needs an eval-loop hook and is the next
increment (research/r3-disposable-services.md).
— surface may change without a major-version bump.
Run
fnwith the declared services up, disposing them afterwards — even iffnthrows. The scope-guard form of experimental_startServices: it removes the manualtry/finallyso ameasureArms/measurecall can be wrapped in one line and its containers are always cleaned up.⚠️ Read the SAFETY note in this module's header first — the container is the only isolation; keep real credentials out of the run.
LIFECYCLE NOTE (honest): the services live for the WHOLE
fn— i.e. per-RUN, not per-trial. An eval that mutates service state across trials should make its task self-contained (e.g.drop … if exists; create; migrate) or runtrials: 1. True per-trial reset needs an eval-loop hook and is the next increment (research/r3-disposable-services.md).— surface may change without a major-version bump.