The Release Machine

Which blocker is really costing you?

City Pulse Live has two blockers. Both are 90% complete and both are late. One holds a local launch asset; the other keeps nine unfinished tasks across four teams from even becoming possible.

SnapshotDay 1120 tasks / 5 work lanes
Machine story arc
0changes
0edits
0redraws
offnothing yet
One analytical question

Which blocker prevents the most downstream work from becoming possible?

Count the unfinished tasks that depend on each blocker. That identifies how widely a delay reaches; estimating a launch date would also require task durations and capacity.

View 1 / temporal position

The schedule looks busy and nearly ready.

Use the schedule to compare planned dates, task duration, progress and team ownership.

City Pulse Live project swimlane
Planned task intervals through snapshot day 11
Skip to data table
10 of 20 tasks are the selected blocker and its downstream reach.
Same rows, different coordinate system
Swimlanex = planned dayanswers when and who
Release machiney = dependency depthanswers what can propagate
View 2 / dependency position

The machine stalls at a decision.

A completed task tips its tile and releases a ball for each dependency. Follow those balls to see which tasks have all their prerequisites and can begin.

Recorded replay mode
What can move once a blocker clears
Logical task transitions with physics-guided prerequisite tokens
live
Approve event-retention policy affects 9 unfinished tasks across 4 lanes. Finish launch illustration affects 2 unfinished tasks across 1 lanes. Selected task reaches 9 unfinished tasks across 4 lanes.
Approve event-retention policy affects 9 unfinished tasks across 4 lanes. Finish launch illustration affects 2 unfinished tasks across 1 lanes.
TaskLaneProgressStateWaiting onDownstream reach
Approve product briefProduct100%ArmedNone15 tasks /5 lanes
Finalize interaction specificationProduct100%Waitingbrief8 tasks /3 lanes
Approve event-retention policyProduct90%BlockedLegal decision on 30-day event retention9 tasks /4 lanes
Build representative event fixtureData100%Waitingbrief12 tasks /4 lanes
Finalize event schemaData25%Waitingprivacy-approval, sample-fixture8 tasks /4 lanes
Implement streaming ingestData0%Waitingevent-schema4 tasks /3 lanes
Implement aggregation APIData10%Waitingevent-schema4 tasks /3 lanes
Build dashboard shellFrontend100%Waitinginteraction-spec5 tasks /3 lanes
Build static dashboard viewFrontend100%Waitingapp-shell, sample-fixture5 tasks /3 lanes
Add replay and pause controlsFrontend70%Waitingstatic-view0 tasks /0 lanes
Connect the live event streamFrontend15%Waitingaggregate-api, stream-ingest3 tasks /2 lanes
Implement keyboard navigationQuality60%Waitingstatic-view2 tasks /1 lanes
Validate settled SSR renderingQuality80%Waitingstatic-view2 tasks /1 lanes
Complete security threat modelQuality10%Waitingevent-schema, privacy-approval2 tasks /1 lanes
Run live-stream load testQuality0%Waitinglive-binding2 tasks /1 lanes
Finalize documentation copyLaunch45%Waitingevent-schema, interaction-spec2 tasks /1 lanes
Finish launch illustrationLaunch90%BlockedAsset license has not been cleared2 tasks /1 lanes
Produce social preview cardLaunch0%Waitinghero-art1 tasks /1 lanes
Cut release candidateLaunch0%Waitingdocs-copy, keyboard-nav, live-binding, load-test, ssr-settle, threat-model1 tasks /1 lanes
Launch City Pulse LiveLaunch0%Waitingrelease-candidate, social-card0 tasks /0 lanes
Selected task

Approve event-retention policy

Legal decision on 30-day event retention

9unfinished descendants
4affected lanes

Data / Frontend / Quality / Launch

Semantic observationsPlay or step the machine to collect task-level events.
Semantic contract

Physics performs the enactment; chart logic preserves the claim.

Task completion

Recorded completedDay, pushed done state, or a clearly labelled mechanical completion.

Ball delivery

One prerequisite became satisfied. It does not mean the target work happened.

AND socket

Every incoming edge must be delivered before the task becomes armed.

Visible brace

Blocking is a readable pin, never hidden friction, mass, or restitution.

Accessible static projection

The analysis survives without animation.

TaskLaneProgressStateWaiting onDownstream reach
Product100%doneNone15 tasks / 5 lanes
Product100%donebrief8 tasks / 3 lanes
Product90%blockedLegal decision on 30-day event retention9 tasks / 4 lanes
Data100%donebrief12 tasks / 4 lanes
Data25%waitingprivacy-approval, sample-fixture8 tasks / 4 lanes
Data0%waitingevent-schema4 tasks / 3 lanes
Data10%waitingevent-schema4 tasks / 3 lanes
Frontend100%doneinteraction-spec5 tasks / 3 lanes
Frontend100%doneapp-shell, sample-fixture5 tasks / 3 lanes
Frontend70%in-progressstatic-view0 tasks / 0 lanes
Frontend15%waitingaggregate-api, stream-ingest3 tasks / 2 lanes
Quality60%in-progressstatic-view2 tasks / 1 lanes
Quality80%in-progressstatic-view2 tasks / 1 lanes
Quality10%waitingevent-schema, privacy-approval2 tasks / 1 lanes
Quality0%waitinglive-binding2 tasks / 1 lanes
Launch45%waitingevent-schema, interaction-spec2 tasks / 1 lanes
Launch90%blockedAsset license has not been cleared2 tasks / 1 lanes
Launch0%waitinghero-art1 tasks / 1 lanes
Launch0%waitingdocs-copy, keyboard-nav, live-binding, load-test, ssr-settle, threat-model1 tasks / 1 lanes
Launch0%waitingrelease-candidate, social-card0 tasks / 0 lanes
Shared functionality

The machine is compiled from a dependency graph.

The chart extracts DAG validation, longest-path levels, lane placement, socket IDs, point-based track routes, logical joins, replay folding, and blocker amplification. The kernel has no angular dynamics, so task tipping remains honest logical rendering; StreamPhysicsFrame owns the dependency-token motion and settling.

JSX
const commonTaskProps = { data: cityPulseTasks, taskIDAccessor: "id", labelAccessor: "title", laneAccessor: "lane", startAccessor: "startDay", endAccessor: "endDay", progressAccessor: "progress", statusAccessor: "status", dependencyAccessor: "dependsOn", completionTimeAccessor: "completedDay", blockerAccessor: "blockerReason", } // View 1 — conventional swimlane, via the shipped recipe. <OrdinalCustomChart data={cityPulseTasks} layout={intervalLanesLayout} categoryAccessor="lane" oExtent={LANES} layoutConfig={{ laneAccessor: "lane", startAccessor: "startDay", endAccessor: "endDay", domain: [0, 18], lanes: LANES, axisTicks: [0, 3, 6, 9, 12, 15, 18], periods: [{ start: 0, end: 11, name: "Elapsed through day 11" }], color: (task) => STATUS_FILL[task.status], }} /> <ChainReactionChart {...commonTaskProps} currentTime={11} mechanism="domino-ball" orientation="vertical" mode="replay" insight="blocker-amplification" /> // A preview changes mechanical state, never supplied data. machineRef.current.previewResolve("privacy-approval")