Member Junction
    Preparing search index...

    One thing that happened, addressed by the graph it happened in.

    Addressed by ParentTaskID, deliberately not by session. A durable graph outlives the tab that submitted it — it may be started by a schedule with no session at all, and a user who refreshes mid-run should still see the rest. Keying on the graph means "watch this workflow run" works for anyone permitted to read it, whenever they arrive.

    Frames are semantic, not cache invalidations: a consumer renders "step 3 of 7 running" from the frame itself rather than re-reading rows and diffing them to guess what changed.

    type TaskGraphFrame = {
        AssignedUserID?: string;
        ClaimedBy?: string;
        ClaimedCount?: number;
        ClaimEvent?: "claimed" | "heartbeat-lost" | "reclaimed";
        ClaimExpiresAt?: string;
        CompletedCount?: number;
        ConditionText?: string;
        DependsOnTaskID?: string;
        EdgeID?: string;
        EligibleCount?: number;
        ErrorMessage?: string;
        HeldCount?: number;
        InstanceInFlightCount?: number;
        Kind: TaskGraphFrameKind;
        OwnerUserID?: string | null;
        ParentTaskID: string;
        PassNumber?: number;
        ProgressMessage?: string;
        ProgressPercent?: number;
        Reason?: string;
        Status?: string;
        TaskID?: string;
        TaskName?: string;
        TotalCount?: number;
        Verdict?: "satisfied" | "notTaken" | "held";
    }

    Hierarchy (View Summary)

    Index

    Properties

    AssignedUserID?: string

    For a human task, who it is waiting on.

    ClaimedBy?: string

    The dispatcher instance holding (or losing) the claim.

    ClaimedCount?: number

    Tasks this instance claimed on this pass, for THIS graph.

    ClaimEvent?: "claimed" | "heartbeat-lost" | "reclaimed"

    What happened to the claim.

    ClaimExpiresAt?: string

    When the claim lapses unless extended, ISO 8601.

    CompletedCount?: number

    How many nodes have reached a terminal state, and out of how many.

    ConditionText?: string

    The condition text, so a viewer can show WHY without loading the row.

    DependsOnTaskID?: string

    The edge's origin task. TaskID above is the edge's target.

    EdgeID?: string

    The MJ: Task Dependencies row the verdict is about.

    EligibleCount?: number

    Tasks whose prerequisites were satisfied this pass.

    ErrorMessage?: string

    Failure detail on TaskFailed.

    HeldCount?: number

    Tasks held by an unanswerable condition or undecided fork.

    InstanceInFlightCount?: number

    Tasks this INSTANCE is executing right now, across every graph it is working — not this graph's in-flight count.

    Named for what it measures because the two readings differ and a viewer cannot tell them apart: it is the dispatcher's own load against MaxConcurrentTasks, which is what explains a graph whose steps are ready but not starting. A per-graph count would answer a different question (and is visible anyway as the steps rendered running on the canvas).

    OwnerUserID?: string | null

    Who the graph belongs to, from the parent's durable metadata.

    Carried on the frame rather than looked up by the consumer because a consumer's delivery filter runs per frame and synchronously — a database round trip there would make watching a run cost more than running it. Absent means the graph predates ownership being recorded, and a consumer that authorizes on it should fail closed rather than broadcast.

    ParentTaskID: string

    The graph this happened in — the subscription key.

    PassNumber?: number

    Monotonic per-instance pass counter, so a viewer can order and gap-detect ticks.

    ProgressMessage?: string

    What the runner says it is doing.

    ProgressPercent?: number

    0–100 when the runner can quantify it.

    Reason?: string

    Human-readable detail: the hold reason, the override applied, or who paused the graph.

    Status?: string

    The task's (or, for GraphSettled, the graph's) status after the event.

    TaskID?: string

    The node it happened to. Absent on GraphSettled, which is about the graph itself.

    TaskName?: string

    Node name, so a consumer can label the frame without loading the row.

    TotalCount?: number
    Verdict?: "satisfied" | "notTaken" | "held"

    What the gate decided: the edge is open, the branch was not taken, or it cannot be answered yet.