66e8bfbab3
OnScriptSetVirtualTag updated the value cache, notified observers, and recorded history for the written path but never scheduled a cascade for tags depending on that path. This contradicts docs/VirtualTags.md, which states ctx.SetVirtualTag writes "still participate in change-trigger cascades": a change-triggered virtual tag reading a script-written tag went stale until an unrelated trigger fired. OnScriptSetVirtualTag now launches a fire-and-forget CascadeAsync for the written path, mirroring OnUpstreamChange. The cascade is scheduled rather than invoked inline because the callback runs inside EvaluateInternalAsync while the non-reentrant _evalGate semaphore is held. Added regression test SetVirtualTag_within_script_cascades_to_dependents_of_the_written_tag. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>