Repository navigation
v0.56.0
BREAKING (behaviour): a node that declares NO output ports now publishes
nothing, and a chain it cuts says so. A terminal node can finally terminate.
Fixed
-
Workflow::import()now READS a node's declaredinputs/outputs, and
export()writes them back (#20). It dropped them, with a comment claiming
it was "matching the TS importer" — and that was measurably false: the
TypeScript importer carries a document's ports ontodata.outputs, and its
exporter writes them precisely so a runtime in another language does not
have to guess at a config-derived port set it cannot compute (switch_case
cases,llm_routerroutes).So the one field written for this runtime was the one field this runtime
threw away. Nothing failed; the fallback quietly substituted the kind's
placeholder ports — aswitch_casewith casesalpha/betareported
case_a,case_b— so the undelivered-edge diagnostic named ports the node
did not have and omitted the ones it did.fancy-flow(Python) andfancy-flow(Rust) had the identical gap and are
fixed in the same release. Three states survive the round trip: absent means
"not declared",[]means "explicitly no ports", a list means those ports.
A port'stypesurvives too — it was written on export and dropped on import,
which made the round trip lossy in one direction.
Changed
-
An empty output declaration means NO PORTS — from the node OR from the
kind.activatedPortsrefused an empty list coming from a kind and
publishedoutinstead, so a terminal kind (log,output) could never
actually terminate and a chain ran straight through it.That refusal was defensible while the alternative was a SILENT cut. The
owner's ruling is strict, but a terminal node must be loud, so the cut now
happens and announces itself.What you must DO: if a graph deliberately chains through a
logor
outputnode, or through any node declaringoutputs: [], that chain now
stops — and the run tells you which edge died. Give the node real output
ports, or route around it.php artisanand every other entry point are
unaffected. -
PortResolution::possible()honours the empty declaration too, and that is
what makes the above safe. It had the SAME empty-to-outcollapse, in the
other of the two gates that shape a port set. Fixing only the runner would
have been half a fix and the dangerous half: the node would publish nothing
while this lookup still reportedoutas deliverable, leaving the
undelivered-edge warning silent for exactly the edge that had just stopped
delivering.A terminal node with nothing downstream stays silent — the warning is keyed on
the EDGE, because a diagnostic that fires on correct graphs is how a real one
stops being read. -
The pinned fixture set moves to
particle-academy/fancy-conformance0.29.
flow/graph-runsrow 0003's golden changed with the ruling (a chain through a
lognode no longer reaches the node after it), andflow/port-activation
row 0303 is no longer skipped for node — it recorded this exact divergence and
now passes everywhere.