Planning no longer offers a path through a step that produces nothing. A cap that takes anything
and gives nothing, such as discard, was a step a path could continue from, so capdag plan --to png could list a candidate that could not be made into a machine and failed with an
internal error. The same holds in the Go and Python libraries.
A live source runs into a first step that takes a sequence again. capdag run with a microphone
or webcam source, and a single cap run on one, refused the capture as a gather instead of
sending the feed to the step.
A cap a cartridge bundled with capdag provides is answered by that cartridge. capdag install
of such a cap installs nothing and prints the bundled cartridge, capdag find names it, and a
run hosts it without asking the cartridge registry; capdag install render-page-image-txt was
refused because only the registry was asked.
A run that needs a cartridge from the registry beside other cartridges starts it. Only the first
cartridge a run hosted was started on its own; a registry cartridge hosted after another one,
bundled or from the registry, never started, and its caps waited 15 seconds and failed with “no
master advertised a cap dispatchable for this request”.
A webcam opens on macOS when no frame rate is given. The capture asked for 29.97 frames per
second, which Mac cameras do not offer, and failed with “Input/output error”; it now asks for 30.
When a camera refuses the mode it is asked for, the error says which size and rate were asked
for and that the width, height and framerate params choose another.
An editor model types every node of a machine written in canonical notation, where each member
and target is named: a named target holds the output it takes, and a named member the type its
argument accepts. It marks a step that maps per item wherever a sequence feeds an argument
taking one value, named or not. build_editor_model takes the cap definitions instead of their
sequence shapes.
The summary of capdag run counts runs. A machine of several independent parts counted each
part as a run of its own, so one input could be reported as two completed runs.
A plan can be handed back and run as it was shown. StrandPlan carries its strand, serializes
whole, and StrandPlan::check_is_a_resolution_of says whether it is the plan its machine
resolves to now for the same run inputs — equal in everything but the values of its step
tokens — or where they differ. A host that keyed argument values by the tokens of the plan it was
shown runs that plan, and every value reaches its step. input_slots() and output_names()
read the plan’s own nodes.