Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Prompts, flags and what a run is told

Part of the decision log: conditional prompts, the sender, flags and names that travel with a chain, and reports.

Why prompt composition is conditional rather than templated. Prompts wanted to vary — a tester that sometimes runs a remote suite is the same agent with one extra paragraph — and the obvious answer is string interpolation. Booleans chosen at trigger time are deliberately less powerful: every possible prompt is a file somebody can read and review, and layover prompt can render any of them exactly as a run would receive it. A templating language would make prompts programs, and the thing an agent is told would stop being reviewable. The rails around it all exist because the failure mode is silent: an undeclared flag is an error rather than false, because treating it as false would let a typo delete a section of instructions without anyone noticing.

Why a run is told who sent its flight, and in which words. The prompt guide and the routing notes told authors that sender identity is how an agent tells its inputs apart, but the payload held only the body, so factories wrote FROM <agent> into every body by hand — an identity the sender asserts, which is the thing §4.2 of the architecture exists to rule out. The Tower already records who sent each flight, so the payload states it above the body. It says what kind of sender it was, because "fix the retry policy" means one thing from a reviewer and another from a clock nobody is watching; that needed Origin to stop recording a schedule and a resumed layover as a person. A released join states nothing there: its body already labels each flight it folds together, and naming one sender above them would be wrong about the rest.

Why prompt flags are checked per entry point rather than per factory. A run carries the flags of the one pipeline that triggered it, never the union of every pipeline in the factory. Checking a prompt against that union looks equivalent and is not: a second pipeline that reaches the same agent without declaring the flag passes validation and then fails at composition time, hours later, with nobody watching. So validation walks reachability from each entry point and requires every flag a reachable prompt tests to be declared there. The same rule covers a bare entry = true agent, which supplies no flags at all — any conditional prompt downstream of one is unreachable in practice, and saying so at load time is the whole point.

Why a chain's flags travel with its work. A flag is a choice somebody makes when they trigger work, and it was being honoured for nothing: the trigger stored it, and every run then composed its prompt from the pipeline's defaults, so layover prompt --flag previewed text no run received. Remembering the flags per itinerary in the Tower fixed the first run and nothing after a restart, because that memory starts empty. So each queued flight carries its chain's pipeline and flags, the way the first flight always did, and the Tower records them from whichever flight it sees first. The values come from the Tower's record of the run — the token's session — and never from the agent, because an agent that could set a flag could switch on the section of its instructions that lets it publish.

Why a spawned chain belongs to the pipeline that spawned it. A spawn edge gives a chain fresh Hops, Fuel and a run cap; it was also giving it no pipeline, so its prompts were composed from every pipeline's defaults merged — the last declaration winning on a clash — and its runs and cost belonged to no workflow. The first contradicted the operator, the second contradicted the rule that workflow membership crosses spawn edges. A spawned chain now inherits both the flags and the pipeline of the chain that spawned it, and prompt-flag validation follows spawn edges for the same reason: the spawned agent is composed from the spawning entry point's declarations.

Why a resumed layover takes its flag values from the chain that booked it. The follow-up is the same work, and the choices about that work — run the end-to-end suite, keep the pull request a draft — were made when it was triggered; resuming from the resuming pipeline's defaults undid them days later with nobody watching. But the set of flags stays the resuming pipeline's, because validation proves the prompts reachable from there test only what it declares; composing from the booking chain's set instead could fail at runtime on a factory that passed validate. So the layover records the booking chain's flags, and the resumed run takes those values for the flags the resuming pipeline declares and its defaults for the rest.

Why an agent writes its own report rather than the Tower keeping the transcript. A transcript is not a report: it contains every approach the agent abandoned, so reading one to find out what happened is slower than doing the work again. The Tower could store transcripts and separately ask for a summary, but requiring the agent to state its own conclusion has a second effect worth more than the storage — an agent that must write down what it concluded is an agent that has to decide what it concluded. Reports are capped and truncated rather than rejected, because a report is the only account of a run that has already happened and already cost money, and discarding it to punish a formatting mistake loses the thing entirely. A trimmed report says it was trimmed, so a reader knows to look further rather than assuming the agent stopped there.

Why a chain's name and per-agent choices travel exactly as its flags do. A name is how a person finds their run of a workflow among three going at once, so it has to stay with everything that run causes — a hand-off, a spawned review, a follow-up two days later, the continuation a reply starts — or the second half of the work is unnamed. A per-agent choice is the same: asking for the reviewer at max on one hard change means every review in that change. So both ride on the queued flight, the Tower's record of the chain, the MCP session, the layover and the help request, the path flags already proved, and an agent can neither read nor set them through a tool. A trigger may choose a model, effort or context — values a runner already carries through a placeholder — and never arguments, because arguments are how a runner denies things and the dashboard is not where permissions are decided. A choice that could not take effect (an agent the workflow never runs, a value with no placeholder) is refused, because accepted and ignored is the failure this project keeps finding. A chain's own map is captioned from what its runs were recorded running at, rather than from configuration, because configuration can change after a chain ran and the record cannot.

Why [flags] is accepted everywhere but offered narrowly. Every workflow that reaches a prompt testing a flag must accept it, so a factory whose workflows share agents declared the same flags in each — thirty declarations for ten flags in a production factory, one more copy to drift each time. A factory-wide table had two possible meanings: the flag applies where some reachable prompt tests it, or everywhere. Only "everywhere" can be decided from layover.toml alone, which is all the parser has, so every workflow accepts every shared flag and a run is never composed short of one. But a trigger window listing switches that change nothing in that workflow teaches people to ignore switches, so what is offered — the window, explain — is narrowed by reading the prompts: a workflow's own flags, and the shared ones its agents test. A workflow that repeats a shared flag exactly is warned about rather than refused; one that gives it a different default is the disagreement validation already warns about. The merge happens as the file is read, so nothing downstream can forget to apply it.