Repository navigation
Description
Follow-ups from the review of #1001 that were deliberately left out of it. Each was reproduced or read against that pull request's final revision; files and symbols are named rather than line numbers.
-
A decision's route is the first thing cut on a tasks-board card.
ui-web/src/features/tasks/styles.cssgives.tkrunselflex: 0 1 auto; min-width: 0, while the agent name and the tool chip never shrink, so the selection absorbs the whole overflow. Measured in Chromium on the 196px card: "Raven-Research" plus "3 tools" leaves the selection 12px wide ("->..."), and "Raven" plus "@triage" plus "1 tool" cuts even "bug". Direction: let the selection keep at least its first route name, or show it beside the status as the design describes (triage -> question). -
Route conditions are neither filled nor validated for
${params.X}.raven/playbook/executor.pyfills parameters only inpromptTemplate, andraven/playbook/validate.pychecks parameter references only inpromptTemplateandinputs. A condition such as "the deal is above ${params.threshold}" reaches the judge as written, and${params.nobody}, an undeclared parameter, passes validation. Direction: fill and validate parameters in route conditions too, or refuse a placeholder there. -
Hand-written playbook YAML with route names
yes,no,on,off,true,falseor bare digits does not load.raven/playbook/store.pyreads the file withyaml.safe_load, which follows YAML 1.1 and turns those keys into booleans or integers:nodes.0.routes.1.[key] Input should be a valid string, and the runtime logs "Skipping unloadable playbook" and drops it from the library. Files the store writes quote such keys and round-trip. Direction: read route keys as strings, or refuse with a message that names the quoting fix. -
The dag-mode part of the playbook generation prompt does not mention branches.
raven/playbook/prompt.pystill says "dependsOnis the whole graph language" and never mentionsroutes,when, or the rule that a node depending on a decision node must name it inwhen, although creation emits dag mode only and the emit schema offers the fields. Only the prompt-mode paragraph was updated, and the test over it reads that paragraph alone. Direction: one paragraph for dag mode, and a test over its wording. -
Nothing pins an ordinary node's judge request to its pre-branching form.
test_judge_without_routes_sends_the_old_request_verbatimcompares the request with the module's own constants: three mutants that change it (a prefix on the instruction, a schema property's description, a message label) pass all five DAG test files. The request is still byte-identical to the one before the change, checked over 17 input combinations. Direction: commit one literal golden of the full request, messages and tools, with the fence nonce patched. -
Domain terms around branches. In
CONTEXT.md, "Decision node" has no Avoid note although "decision" already names the adjudication answer (exceptionwaits for the main agent to decide;resolve_dag_nodetakes adecision); "Not executed" is set apart fromskippedonly in prose; and "branch" now means a route's path while the DAG orchestration skill (the paragraphs onabandon) and the docs site still use it for any part of a graph. Direction: Avoid notes, and a pass over the older uses of "branch". -
On native Windows, every workdir reference is refused as outside its roots. This one predates feat(*): let a dag decision node choose which of its branches run #1001 and is on main.
raven/agent/subagent/prompt_paths.pyresolves a reference that does not start with@nodes/withposixpath(check_confined, throughresolve_referencesince feat(*): let a dag decision node choose which of its branches run #1001) and compares the result with each root throughwithin, which tests for a/prefix. A Windows drive path is not absolute toposixpath, a backslash is not its separator, and the resolved path carries backslashes, so a{{ ref:... }}or{{ ref_path:... }}placeholder or a{"file": ...}input naming a workdir file is refused as "outside the session workdir and its sub-agent history", even a relativenotes.mdinside the workdir. Reproduced by running the check under NT path rules (ntpathin place ofos.path) on a POSIX host: an absolute path into the node root, the same path with backslashes,notes.mdand a../path were all refused. Not yet measured on a Windows host.@nodes/references, and graphs validated without roots, take the shape-only check and are unaffected. feat(*): let a dag decision node choose which of its branches run #1001 marks its new tests that pass such a reference POSIX-only for this reason. Direction: resolve and compare with the host's path rules, and run the confinement tests in the Windows CI job.
Activity
feat(*): let a dag decision node choose which of its branches run (#1001
fix(playbook): fill and declare-check a route condition's params
fix(playbook): fill and declare-check a route condition's params (#1058)
fix(agent): resolve DAG file references by the host's path rules (#1066)
fix(*): finish conditional branches in playbooks, the tasks board and…
LivXue commentedon Oct 28, 2026
All seven follow-ups have landed on main, so this can close. None of the three pull requests that carried them used a closing keyword, which is why it stayed open.
${params.X}in a route condition is filled on the same terms as a prompt, and validation refuses an undeclared one.yes,no,on,off,true,falseand bare digits now load as the text they were written as.routes,select,when) and the rule about them, and a test pins that wording.abandonparagraphs in the DAG orchestration skill and the docs site's use of "branch" were reworded. The bare "decision" still left in tool schemas, prompts and the UIs is tracked in docs(*): bare "decision" still names a decision node in tool schemas, prompts and the UIs #1065.