feat(site-runtime): InstanceActor trace arm stamps the device echo of a traced write; Trace rides on published changes

Flow Debugger (design 2026-09-05 §5.3): a traced SetStaticAttributeCommand on a data-sourced
attribute records (attribute → writer, expiry) for TraceArmWindowSeconds (new option,
default 30, validated > 0); the next DCL echo for that attribute is published with the
writer's SourceExecutionId + Trace whatever its value, and the arm is consumed once. Static
writes publish Trace directly. Untraced writes never arm (pinned).

Claude-Session: https://claude.ai/code/session_01GSLkkHKz9JrAtmJjmQK3cP
This commit is contained in:
Joseph Doherty
2026-09-05 23:43:33 -04:00
parent eca1434160
commit 01be39019e
5 changed files with 243 additions and 4 deletions
@@ -232,4 +232,15 @@ public class SiteRuntimeOptions
/// (the row-67 <c>EnsureInstanceStartedCommand</c> path is unaffected). Default: 60.
/// </summary>
public int InstanceSweepIntervalSeconds { get; set; } = 60;
/// <summary>
/// Flow Debugger trace arm window (design 2026-09-05 §5.3). When a TRACED script write
/// targets a data-sourced attribute, the Instance Actor remembers
/// <c>(attribute → writer's ExecutionId)</c> for this many seconds; the next DCL value
/// change for that attribute — whatever the value — is published stamped with that
/// <c>SourceExecutionId</c> and <c>Trace</c>, and the arm is consumed. An arm that expires
/// unconsumed emits nothing. Only traced writes arm, so production behaviour is unchanged.
/// Default: 30.
/// </summary>
public int TraceArmWindowSeconds { get; set; } = 30;
}