Brand marking an agent as RUNTIME-DRIVEN: its inherited signal wake
(agent.stream under ifIdle:'wake') re-enters the tenant-run-ID-guarded
FlowsafeDurableAgent.executeWorkflow, which drives
runtime.start('durable-agentic-loop', …) rather than the base
createRun + run.start on the default engine. The thread-Durable-Object signal
routes require this brand before honoring an idle wake, because the wake is the
one signal path that starts a run: a plain core Agent (or a STOCK
DurableAgent, whose stream() mints a tenant-less UUID and whose
executeWorkflow runs on the default engine) would start a run OUTSIDE
RunnerRuntime — an unsafe second execution path that is tenant-unscoped and
grant-underivable. Structural (a unique symbol-keyed truthy field) so a test
double can opt in without constructing a real durable agent.
The brand is paired with the host-owned idle-start seam: the thread Durable Object
mints the tenant-salted run id and invokes the wrapper directly, avoiding
core's tenant-less idle-wake id generation.
Brand marking an agent as RUNTIME-DRIVEN: its inherited signal wake (
agent.streamunderifIdle:'wake') re-enters the tenant-run-ID-guarded FlowsafeDurableAgent.executeWorkflow, which drivesruntime.start('durable-agentic-loop', …)rather than the basecreateRun + run.starton the default engine. The thread-Durable-Object signal routes require this brand before honoring an idle wake, because the wake is the one signal path that starts a run: a plain coreAgent(or a STOCKDurableAgent, whosestream()mints a tenant-less UUID and whoseexecuteWorkflowruns on the default engine) would start a run OUTSIDE RunnerRuntime — an unsafe second execution path that is tenant-unscoped and grant-underivable. Structural (aunique symbol-keyed truthy field) so a test double can opt in without constructing a real durable agent.The brand is paired with the host-owned idle-start seam: the thread Durable Object mints the tenant-salted run id and invokes the wrapper directly, avoiding core's tenant-less idle-wake id generation.