Spec Studio

The evaluation sink runs one body and prints its return

spec:consumers.agent-surface.evaluation-sinkUse Case / Behavior · storyready floor ready

Packs: pack:adopter-speed-v1, pack:self-hosting-v1

Design: 7 design entries · 3 pinned declarations · 1 decision

Findings: no errors, no warnings

specs/consumers/agent-surface.evaluation-sink.sdp.md

No open questions and no blocking questions; implementation binding present, verifier binding present, and expected-outcome oracle present.

Without a way to call a shipped recipe, a body that needs its answer pastes the recipe's file into its own text, and a rules file keeps its own copy of the recipe's code. The recipes binding lets a body call a shipped recipe by its catalog number over the graph it already holds, so the answer is the recipe's own and nothing derives twice. A recipe call is a binding, never a reader verb: the catalog stays the one owner of the bodies, and the reader gains no query vocabulary. The package exports the same evaluator, so a script that holds a graph runs a body, or a shipped recipe through that body, without deriving the graph again.

Intent
problem
How sdp q takes a body, prints its answer and refuses is stated only in the CLI help and the reading skill, so a caller and a script that runs a recipe learn the contract by trial.
outcome
State how the evaluation sink takes a body, renders its return and refuses, so every caller relies on one contract.
Behavior
rule line 19 · specs/consumers/agent-surface.evaluation-sink.sdp.md:19
sdp q takes one positional JavaScript async-function body, which takes precedence over stdin; with no positional body it reads non-terminal stdin, and absent, unreadable or empty input refuses with exit 1 before evaluation.
rule line 20 · specs/consumers/agent-surface.evaluation-sink.sdp.md:20
The sink supplies g, graph, report and params, permits await and prints the returned value using bounded util.inspect by default or JSON.stringify with --json; it does not suppress console output, so machine-consumed bodies must avoid it.
rule line 21 · specs/consumers/agent-surface.evaluation-sink.sdp.md:21
A body that returns undefined prints no answer, reports on stderr that return is the output contract and exits 0; a --json result with no JSON form or one that cannot be serialized refuses with exit 1 and no rendered answer.
rule line 22 · specs/consumers/agent-surface.evaluation-sink.sdp.md:22
An extraction error prevents evaluation, renders the extraction findings and exits 1; validation findings are supplied as report and do not gate evaluation. A compilation, evaluation or rendering failure exits 1 and reports its error on stderr.
rule line 23 · specs/consumers/agent-surface.evaluation-sink.sdp.md:23
A body that fails to parse is reported with the line and column of the error in the body the caller wrote.
rule.fifthBinding line 24 · specs/consumers/agent-surface.evaluation-sink.sdp.md:24
The sink supplies a fifth binding, recipes, beside g, graph, report and params, and every body it, the rules runner or the exported evaluator runs receives it, a recipe called through it included.

spec:consumers.agent-surface.evaluation-sink.recipe-call · enabled

rule.recipeCall line 25 · specs/consumers/agent-surface.evaluation-sink.sdp.md:25
A body calls a shipped recipe as a function of its catalog number and one parameters object; the call runs the recipe's body over the caller's own g, graph and report, with no second derivation and no copy, and resolves to the recipe's answer unchanged, { unknownParams, accepts } and { diagnostics } included.

spec:consumers.agent-surface.evaluation-sink.exported-evaluator · enabled, spec:consumers.agent-surface.evaluation-sink.recipe-call · enabled

rule.callRefusals line 26 · specs/consumers/agent-surface.evaluation-sink.sdp.md:26
A call names a recipe the catalog holds and passes one plain object or nothing; any other number or parameters reject the call with a message naming the recipe, and a recipe that throws rejects the call with its error, so a mistaken call fails loudly instead of answering for a sample.

spec:consumers.agent-surface.evaluation-sink.unknown-recipe · enabled

rule.oneEvaluator line 27 · specs/consumers/agent-surface.evaluation-sink.sdp.md:27
sdp q, the rules runner and the exported evaluator compile and run a body one way: the same compilation, the same parse error with its line and column, worded by each surface in its own pinned text, and the same five bindings.

spec:consumers.agent-surface.evaluation-sink.exported-evaluator · enabled

rule.exportedEvaluator line 28 · specs/consumers/agent-surface.evaluation-sink.sdp.md:28
The package exports the body evaluator, so a script that holds a graph runs a body, or a shipped recipe through recipes, without deriving the graph again; the evaluator writes and prints nothing and claims no sandbox, as the sink claims none.

spec:consumers.agent-surface.evaluation-sink.exported-evaluator · enabled

5 unkeyed rules.

Verifying examples

A script holding a graph runs a shipped recipe through the exported evaluator · spec:consumers.agent-surface.evaluation-sink.exported-evaluator · ready floor ready

Executable Spec

Given a probe corpus in which two Specs depend on each other through dependsOn
Given a body that calls {call: "recipe 26 with the severity warning"}
When the body runs {entrance: "through the exported evaluator over a graph derived once"}
Then the call {outcome: "resolves"}
Then the answer equals the shipped recipe file's own answer over the same graph and parameters: {sameAnswer: true}

Open example

A body calls a shipped recipe and returns its answer unchanged · spec:consumers.agent-surface.evaluation-sink.recipe-call · ready floor ready

Executable Spec

Given a probe corpus in which two Specs depend on each other through dependsOn
Given a body that calls {call: "recipe 26 with no parameters"}
When the body runs {entrance: "through sdp q"}
Then the call {outcome: "resolves"}
Then the answer equals the shipped recipe file's own answer over the same graph and parameters: {sameAnswer: true}

Open example

A call to a recipe the catalog does not hold fails the body · spec:consumers.agent-surface.evaluation-sink.unknown-recipe · ready floor ready

Executable Spec

Given a probe corpus in which two Specs depend on each other through dependsOn
Given a body that calls {call: "a recipe number the catalog does not hold"}
When the body runs {entrance: "through sdp q"}
Then the call {outcome: "rejects"}
Then the rejection reads {rejection: "recipes: the catalog holds no recipe 99"}

Open example

Example space

Given a probe corpus in which two Specs depend on each other through dependsOn
Given a body that calls {call:"recipe 26 with no parameters"|"recipe 26 with the severity warning"|"a recipe number the catalog does not hold"}
When the body runs {entrance:"through sdp q"|"through the exported evaluator over a graph derived once"}
Then the call {outcome:"resolves"|"rejects"}
Then the answer equals the shipped recipe file's own answer over the same graph and parameters: {sameAnswer:boolean}
Then the rejection reads {rejection:string}
Design
parseErrorLine line 31 · specs/consumers/agent-surface.evaluation-sink.sdp.md:31
A body that does not parse prints one stderr line, sdp q: the body does not parse at line L, column C: <message>, with 1-based positions in the caller's body, exits 1 and prints nothing on stdout.
recipesBinding line 32 · specs/consumers/agent-surface.evaluation-sink.sdp.md:32
recipes(number, parameters?), where number is a recipe number the catalog's index lists, an integer, and parameters is one plain object, {} when omitted; it returns a promise of the value the recipe's body returns, the same value and never a copy or a JSON round trip.

no citation recorded

recipeSource line 33 · specs/consumers/agent-surface.evaluation-sink.sdp.md:33
a call runs the body the package ships for that number as dist/recipes/<NN>-<slug>.js, the file the catalog derives, read from the package that runs the engine and never from the corpus or the working directory.
calledBindings line 34 · specs/consumers/agent-surface.evaluation-sink.sdp.md:34
a called recipe receives the caller's g, graph and report, the same objects; its parameters object as params; and recipes itself, so one recipe may call another.
callRejections line 35 · specs/consumers/agent-surface.evaluation-sink.sdp.md:35
recipes: the catalog holds no recipe <number> rejects an integer the catalog does not list; recipes: <value> is not a recipe number rejects a value that is not an integer; recipes: recipe <number> takes one parameters object rejects parameters that are null, an array, a string, a number or a boolean.

no citation recorded

evaluatorExport line 36 · specs/consumers/agent-surface.evaluation-sink.sdp.md:36
evaluateBody(body: string, input: { graph: GraphSchema; report?: ValidationReport; params?: Readonly<Record<string, unknown>> }): Promise<unknown>, exported from the package's main entry, @libar-dev/software-delivery-protocol; it binds g to the reader over graph, report to the given report or, when absent, the validation report of graph, params to the given object or {}, and recipes over the same three, and resolves to the body's return.

no citation recorded

evaluatorRejections line 37 · specs/consumers/agent-surface.evaluation-sink.sdp.md:37
a body that does not parse rejects with an Error whose message is the body does not parse at line L, column C: <message>, the text the sink prints after sdp q: ; a body that throws rejects with what it threw; params that are not a plain object reject before the body runs.
Verification

Verifier bindings

  • spec:consumers.agent-surface.evaluation-sink.exported-evaluator · A script holding a graph runs a shipped recipe through the exported evaluator · declared · example enabled · specs/consumers/agent-surface.evaluation-sink.exported-evaluator.sdp.md

    External run evidence from test/reach-examples.test.ts

    Test anchors: test:protocol.consumers.agent-surface.address-and-cycle-recipes.chain-reports-nothing, test:protocol.consumers.agent-surface.address-and-cycle-recipes.cycle-fails-a-rules-run, test:protocol.consumers.agent-surface.address-and-cycle-recipes.unresolved-address-fails-a-rules-run, test:protocol.consumers.agent-surface.evaluation-sink.exported-evaluator, test:protocol.consumers.agent-surface.evaluation-sink.recipe-call, test:protocol.consumers.agent-surface.evaluation-sink.unknown-recipe, test:protocol.validation.corpus-rules.params-edit-starts-a-cycle, test:protocol.validation.corpus-rules.rules-edit-starts-a-cycle, test:protocol.validation.corpus-rules.unreadable-params-fail-one-file. Specs verified by those bindings: spec:consumers.agent-surface.address-and-cycle-recipes, spec:consumers.agent-surface.address-and-cycle-recipes.chain-reports-nothing, spec:consumers.agent-surface.address-and-cycle-recipes.cycle-fails-a-rules-run, spec:consumers.agent-surface.address-and-cycle-recipes.unresolved-address-fails-a-rules-run, spec:consumers.agent-surface.evaluation-sink, spec:consumers.agent-surface.evaluation-sink.exported-evaluator, spec:consumers.agent-surface.evaluation-sink.recipe-call, spec:consumers.agent-surface.evaluation-sink.unknown-recipe, spec:validation.corpus-rules, spec:validation.corpus-rules.params-edit-starts-a-cycle, spec:validation.corpus-rules.rules-edit-starts-a-cycle, spec:validation.corpus-rules.unreadable-params-fail-one-file.

    Run 1: external run evidence from vitest 4.1.10

    Build: CI 380 · Branch: feature/roadmap-and-slices-v0 · Commit: 34909918bf0be0e849959644401797191cae379f · Start: 2026-10-22T17:40:31.456Z · Stop: 2026-10-22T17:42:16.171Z

    NameSuiteResultDuration
    gives every watch example the heavy-test timeoutnot recordedpassed2.43 ms
    leaves non-watch corpus-rule points and incomplete points unspecifiednot recordedpassed0.36 ms
    leaves address points outside the oracle's bound probes unspecifiednot recordedpassed0.17 ms
    executes the bound example against a fresh worldA body calls a shipped recipe and returns its answer unchanged (spec:consumers.agent-surface.evaluation-sink.recipe-call)passed21.85 ms
    executes the bound example against a fresh worldA call to a recipe the catalog does not hold fails the body (spec:consumers.agent-surface.evaluation-sink.unknown-recipe)passed3.48 ms
    executes the bound example against a fresh worldA script holding a graph runs a shipped recipe through the exported evaluator (spec:consumers.agent-surface.evaluation-sink.exported-evaluator)passed3.89 ms
    executes the bound example against a fresh worldA dependency chain with no cycle yields no finding (spec:consumers.agent-surface.address-and-cycle-recipes.chain-reports-nothing)passed3.1 ms
    executes the bound example against a fresh worldThe shipped dependency-cycles file fails a rules run on a cycle (spec:consumers.agent-surface.address-and-cycle-recipes.cycle-fails-a-rules-run)passed5.52 ms
    executes the bound example against a fresh worldThe shipped address-resolution file fails a rules run on an address that names no entry (spec:consumers.agent-surface.address-and-cycle-recipes.unresolved-address-fails-a-rules-run)passed3.86 ms
    executes the bound example against a fresh worldRewriting a rules file under node_modules starts a cycle that runs the new body (spec:validation.corpus-rules.rules-edit-starts-a-cycle)passed16.19 ms
    executes the bound example against a fresh worldEditing a parameter file starts a cycle that reads the new parameters (spec:validation.corpus-rules.params-edit-starts-a-cycle)passed46.21 ms
    executes the bound example against a fresh worldA parameter file that stops being JSON fails only its own rules file, and the watcher runs on (spec:validation.corpus-rules.unreadable-params-fail-one-file)passed103.81 ms
  • spec:consumers.agent-surface.evaluation-sink.recipe-call · A body calls a shipped recipe and returns its answer unchanged · declared · example enabled · specs/consumers/agent-surface.evaluation-sink.recipe-call.sdp.md
  • spec:consumers.agent-surface.evaluation-sink.unknown-recipe · A call to a recipe the catalog does not hold fails the body · declared · example enabled · specs/consumers/agent-surface.evaluation-sink.unknown-recipe.sdp.md
  • test:protocol.evaluation-sink · front-door checks verify how the sink takes a body, prints its return and refuses · anchored · test anchor binding present · test/cli-q.test.ts:81

    External run evidence from test/cli-q.test.ts

    Test anchors: test:protocol.evaluation-sink, test:protocol.query-answer-shapes, test:protocol.query-params. Specs verified by those bindings: spec:consumers.agent-surface.evaluation-sink, spec:consumers.agent-surface.recipe-parameters.

    Run 1: external run evidence from vitest 4.1.10

    Build: CI 380 · Branch: feature/roadmap-and-slices-v0 · Commit: 34909918bf0be0e849959644401797191cae379f · Start: 2026-10-22T17:40:31.456Z · Stop: 2026-10-22T17:42:16.171Z

    NameSuiteResultDuration
    evaluates an argv body over the derived graph and prints the pre-shaped returnsdp q — the agent front doorpassed30.42 ms
    reads the body from stdin when stdin is not a terminalsdp q — the agent front doorpassed9.06 ms
    prefers the argv body over stdin when both are availablesdp q — the agent front doorpassed14.89 ms
    refuses with no body when stdin is a terminal instead of waiting on itsdp q — the agent front doorpassed0.38 ms
    refuses an empty body rather than evaluating nothingsdp q — the agent front doorpassed0.26 ms
    prints JSON for --jsonsdp q — the agent front doorpassed6.89 ms
    exits 1 and names the failure when the body throwssdp q — the agent front doorpassed5.4 ms
    exits 1 on a body that does not compilesdp q — the agent front doorpassed10.85 ms
    awaits an asynchronous bodysdp q — the agent front doorpassed6.69 ms
    injects a live reader: the entry adapters answer from the derived graphsdp q — the agent front doorpassed6.81 ms
    injects the raw graph schema alongside the readersdp q — the agent front doorpassed7.44 ms
    injects the validation report as data, never as a gatesdp q — the agent front doorpassed5.16 ms
    runs the body when the graph merely reports findings — checks never gate the read pathsdp q — the agent front doorpassed3.87 ms
    refuses to run the body when the graph does not derive, rendering the extraction findingssdp q — the agent front doorpassed11.48 ms
    reports a body that returns nothing rather than printing a silent blanksdp q — the agent front doorpassed9.5 ms
    refuses an unknown option and a second body without deriving anythingsdp q — the agent front doorpassed0.31 ms
    refuses an empty --root instead of reinterpreting it as the working directorysdp q — the agent front doorpassed0.13 ms
    refuses a root that is not a directory, naming the resolved absolute pathsdp q — the agent front doorpassed0.15 ms
    honours --exclude, so the sink omits exactly the paths the caller namessdp q — the agent front doorpassed3.39 ms
    runs the body when extraction itself only warns — the warning is data, never a gatesdp q — the agent front doorpassed3.56 ms
    detects a terminal from the file descriptor, never from a stream propertysdp q — the agent front doorpassed3.91 ms
    puts --exclude through the strict exclusion contract before deriving anythingsdp q — the agent front doorpassed0.33 ms
    reports a throw from rendering the return value through the one diagnostic currencysdp q — the agent front doorpassed3.17 ms
    refuses a --json return value whose toJSON yields no JSON formsdp q — the agent front doorpassed4.15 ms
    writes nothing: the sink is a pure read toolsdp q — the agent front doorpassed273.64 ms
    injects params as a fourth binding beside g, graph and reportsdp q --params — a recipe parameter as datapassed12.05 ms
    binds params to an empty object without the flagsdp q --params — a recipe parameter as datapassed4.98 ms
    passes any JSON object through unchangedsdp q --params — a recipe parameter as datapassed8.55 ms
    reads params from a file named with @PATH, a byte-order mark droppedsdp q --params — a recipe parameter as datapassed4.8 ms
    refuses inline text that is not JSON before the body runs: exit 1, one line, nothing on stdoutsdp q --params — a recipe parameter as datapassed0.82 ms
    refuses an empty value before the body runs: exit 1, one line, nothing on stdoutsdp q --params — a recipe parameter as datapassed0.34 ms
    refuses null before the body runs: exit 1, one line, nothing on stdoutsdp q --params — a recipe parameter as datapassed0.29 ms
    refuses an array before the body runs: exit 1, one line, nothing on stdoutsdp q --params — a recipe parameter as datapassed0.27 ms
    refuses a string before the body runs: exit 1, one line, nothing on stdoutsdp q --params — a recipe parameter as datapassed0.18 ms
    refuses a number before the body runs: exit 1, one line, nothing on stdoutsdp q --params — a recipe parameter as datapassed0.18 ms
    refuses a boolean before the body runs: exit 1, one line, nothing on stdoutsdp q --params — a recipe parameter as datapassed0.16 ms
    refuses a file that cannot be read before the body runs: exit 1, one line, nothing on stdoutsdp q --params — a recipe parameter as datapassed0.33 ms
    refuses an @ with no path before the body runs: exit 1, one line, nothing on stdoutsdp q --params — a recipe parameter as datapassed0.37 ms
    refuses a missing value before the body runs: exit 1, one line, nothing on stdoutsdp q --params — a recipe parameter as datapassed0.27 ms
    refuses a flag in place of the value before the body runs: exit 1, one line, nothing on stdoutsdp q --params — a recipe parameter as datapassed0.21 ms
    refuses a repeated key before the body runs: exit 1, one line, nothing on stdoutsdp q --params — a recipe parameter as datapassed0.28 ms
    refuses a key outside the lower-camel grammar before the body runs: exit 1, one line, nothing on stdoutsdp q --params — a recipe parameter as datapassed0.23 ms
    refuses a file whose JSON is not an object, in one line naming the filesdp q --params — a recipe parameter as datapassed0.38 ms
    refuses a file whose text is not JSON, in one line naming the filesdp q --params — a recipe parameter as datapassed0.35 ms
    locates a refused body return )query body positions and merged parameterspassed1.02 ms
    locates a refused body return 1; foo barquery body positions and merged parameterspassed0.61 ms
    locates a refused body let x = 'a' 'bcdef';query body positions and merged parameterspassed0.54 ms
    locates a refused body const value = 1; return )query body positions and merged parameterspassed0.46 ms
    locates a refused body return (query body positions and merged parameterspassed0.68 ms
    names a body that stops short instead of the wrapper's closing bracequery body positions and merged parameterspassed0.52 ms
    keeps runtime failures separate, including a thrown SyntaxErrorquery body positions and merged parameterspassed0.39 ms
    refuses repeated top-level keys inside one inline object before extractionquery body positions and merged parameterspassed65.21 ms
    refuses repeated top-level keys inside one file object before extractionquery body positions and merged parameterspassed80.84 ms
    accepts nested duplicates and duplicate-looking text inside valuesquery body positions and merged parameterspassed1.16 ms
    binds a keyed file's JSON value null beside merged objectsquery body positions and merged parameterspassed1 ms
    binds a keyed file's JSON value 1 beside merged objectsquery body positions and merged parameterspassed37.32 ms
    binds a keyed file's JSON value "text" beside merged objectsquery body positions and merged parameterspassed14.05 ms
    binds a keyed file's JSON value 4 beside merged objectsquery body positions and merged parameterspassed46.29 ms
    binds a keyed file's JSON value true beside merged objectsquery body positions and merged parameterspassed58.06 ms
    binds a keyed file's JSON value {"nested":{"a":1}} beside merged objectsquery body positions and merged parameterspassed72.25 ms
    refuses duplicate keys from inline-file before extractionquery body positions and merged parameterspassed0.63 ms
    refuses duplicate keys from file-inline before extractionquery body positions and merged parameterspassed0.28 ms
    refuses duplicate keys from keyed-inline before extractionquery body positions and merged parameterspassed96.72 ms
    refuses duplicate keys from inline-keyed before extractionquery body positions and merged parameterspassed0.58 ms
    refuses duplicate keys from keyed-keyed before extractionquery body positions and merged parameterspassed0.51 ms
    keeps merged parameter keys writable for the caller's bodyquery body positions and merged parameterspassed0.91 ms
    refuses an invalid keyed input key=@ before extractionquery body positions and merged parameterspassed0.34 ms
    refuses an invalid keyed input key=@missing-file.json before extractionquery body positions and merged parameterspassed0.27 ms
    refuses an invalid keyed input bad-key=@missing-file.json before extractionquery body positions and merged parameterspassed0.16 ms
    refuses an invalid keyed input bad_key=@missing-file.json before extractionquery body positions and merged parameterspassed0.29 ms
    reads inline JSON and @PATH before KEY=@PATH when the input contains =@query body positions and merged parameterspassed0.69 ms
    refuses a keyed file holding invalid JSON before extractionquery body positions and merged parameterspassed0.4 ms
    merges own keys without treating __proto__ as an assignmentquery body positions and merged parameterspassed0.57 ms
  • test:protocol.query-answer-shapes · anchored · test anchor binding present · test/cli-q.test.ts:730

Example space

  • call · "recipe 26 with no parameters" | "recipe 26 with the severity warning" | "a recipe number the catalog does not hold" · declared by a body that calls {call}
  • entrance · "through sdp q" | "through the exported evaluator over a graph derived once" · declared by the body runs {entrance}

Bound points

Examplecallentrance
spec:consumers.agent-surface.evaluation-sink.exported-evaluator"recipe 26 with the severity warning""through the exported evaluator over a graph derived once"
spec:consumers.agent-surface.evaluation-sink.recipe-call"recipe 26 with no parameters""through sdp q"
spec:consumers.agent-surface.evaluation-sink.unknown-recipe"a recipe number the catalog does not hold""through sdp q"

Oracle binding: present · oracle:protocol.consumers.agent-surface.evaluation-sink · test/reach-examples.test.ts:92

Coverage

call
Declared valueExamples
"recipe 26 with no parameters"spec:consumers.agent-surface.evaluation-sink.recipe-call
"recipe 26 with the severity warning"spec:consumers.agent-surface.evaluation-sink.exported-evaluator
"a recipe number the catalog does not hold"spec:consumers.agent-surface.evaluation-sink.unknown-recipe

Unbound

  • call: None
  • entrance: None
Design view

Requirement drawing

Requirement drawing for spec:consumers.agent-surface.evaluation-sink
The diagram as text
  • spec:consumers.agent-surface.evaluation-sink: The evaluation sink runs one body and prints its return · declared Spec
  • spec:consumers.agent-surface.evaluation-sink.exported-evaluator: A script holding a graph runs a shipped recipe through the exported evaluator · declared Spec
  • spec:consumers.agent-surface.evaluation-sink.recipe-call: A body calls a shipped recipe and returns its answer unchanged · declared Spec
  • spec:consumers.agent-surface.evaluation-sink.unknown-recipe: A call to a recipe the catalog does not hold fails the body · declared Spec
  • spec:consumers.agent-surface: Agents script a visible typed graph · declared Spec
  • api:protocol.evaluate-body: evaluates bodies and shipped recipes over one in-memory reader, graph and report · anchored code · src/reader/evaluate-body.ts:120
  • impl:protocol.build-pipeline-query: runQuery reads one body, derives the graph once for the reader, raw graph and report, and prints the return or refuses on stderr · anchored code · src/cli/q-command.ts:212
  • oracle:protocol.consumers.agent-surface.evaluation-sink: oracle:protocol.consumers.agent-surface.evaluation-sink · anchored oracle binding · test/reach-examples.test.ts:92
  • test:protocol.consumers.agent-surface.evaluation-sink.exported-evaluator: test:protocol.consumers.agent-surface.evaluation-sink.exported-evaluator · anchored test binding · binding present · test/reach-examples.test.ts:416
  • test:protocol.consumers.agent-surface.evaluation-sink.recipe-call: test:protocol.consumers.agent-surface.evaluation-sink.recipe-call · anchored test binding · binding present · test/reach-examples.test.ts:404
  • test:protocol.consumers.agent-surface.evaluation-sink.unknown-recipe: test:protocol.consumers.agent-surface.evaluation-sink.unknown-recipe · anchored test binding · binding present · test/reach-examples.test.ts:410
  • test:protocol.evaluation-sink: front-door checks verify how the sink takes a body, prints its return and refuses · anchored test binding · binding present · test/cli-q.test.ts:81
  • test:protocol.query-answer-shapes: test:protocol.query-answer-shapes · anchored test binding · binding present · test/cli-q.test.ts:730
  • spec:consumers.agent-surface.evaluation-sink refines spec:consumers.agent-surface · declared
  • spec:consumers.agent-surface.evaluation-sink.exported-evaluator refines spec:consumers.agent-surface.evaluation-sink · declared
  • spec:consumers.agent-surface.evaluation-sink.exported-evaluator verifies spec:consumers.agent-surface.evaluation-sink · declared
  • spec:consumers.agent-surface.evaluation-sink.recipe-call refines spec:consumers.agent-surface.evaluation-sink · declared
  • spec:consumers.agent-surface.evaluation-sink.recipe-call verifies spec:consumers.agent-surface.evaluation-sink · declared
  • spec:consumers.agent-surface.evaluation-sink.unknown-recipe refines spec:consumers.agent-surface.evaluation-sink · declared
  • spec:consumers.agent-surface.evaluation-sink.unknown-recipe verifies spec:consumers.agent-surface.evaluation-sink · declared
  • api:protocol.evaluate-body satisfies spec:consumers.agent-surface.evaluation-sink · anchored
  • impl:protocol.build-pipeline-query satisfies spec:consumers.agent-surface.evaluation-sink · anchored
  • oracle:protocol.consumers.agent-surface.evaluation-sink models spec:consumers.agent-surface.evaluation-sink · anchored
  • test:protocol.consumers.agent-surface.evaluation-sink.exported-evaluator verifies spec:consumers.agent-surface.evaluation-sink.exported-evaluator · anchored
  • test:protocol.consumers.agent-surface.evaluation-sink.recipe-call verifies spec:consumers.agent-surface.evaluation-sink.recipe-call · anchored
  • test:protocol.consumers.agent-surface.evaluation-sink.unknown-recipe verifies spec:consumers.agent-surface.evaluation-sink.unknown-recipe · anchored
  • test:protocol.evaluation-sink verifies spec:consumers.agent-surface.evaluation-sink · anchored
  • test:protocol.query-answer-shapes verifies spec:consumers.agent-surface.evaluation-sink · anchored
Mermaid source

Copyable source; the Studio draws static SVG.

Preferred syntax: requirementDiagram. Chosen syntax: flowchart TB because models, folds require exact labels unavailable in requirement syntax.

Decisions

Runtime
  • api:protocol.evaluate-body · evaluates bodies and shipped recipes over one in-memory reader, graph and report · src/reader/evaluate-body.ts:120

    Component: component:protocol.reader · the typed graph contract and body evaluator · src/reader/reader.ts:671 · layer application · context protocol

    Uses

    None.

  • component:protocol.cli · entry points, shared build and publication · src/cli/build-command.ts:32 · layer edge · context protocol

    Uses

    • component:protocol.adapters · external runtime and source adapters · src/adapters/vitest.ts:23 · layer adapter · context protocol
    • component:protocol.codegen · contracts and registrar output · src/codegen/contracts.ts:633 · layer application · context protocol
    • component:protocol.extract · the carrier and source pipeline · src/extract/index.ts:192 · layer application · context protocol
    • component:protocol.graph · the one graph and its semantic decisions · src/graph/schema.ts:34 · layer domain · context protocol
    • component:protocol.import · canonical conversion with a fidelity boundary · src/import/import.ts:45 · layer application · context protocol
    • component:protocol.model · the authored contracts and stable ids · src/model/anchors.ts:100 · layer domain · context protocol
    • component:protocol.projections · read-only output, layout and owned publication · src/projections/design-review.ts:29 · layer edge · context protocol
    • component:protocol.reader · the typed graph contract and body evaluator · src/reader/reader.ts:671 · layer application · context protocol
    • component:protocol.validate · one finding currency and ordered checks · src/validate/validators.ts:72 · layer domain · context protocol
  • component:protocol.reader · the typed graph contract and body evaluator · src/reader/reader.ts:671 · layer application · context protocol

    Uses

    • component:protocol.graph · the one graph and its semantic decisions · src/graph/schema.ts:34 · layer domain · context protocol
    • component:protocol.model · the authored contracts and stable ids · src/model/anchors.ts:100 · layer domain · context protocol
    • component:protocol.notation · the leaf step codec · src/notation/slots.ts:261 · layer domain · context protocol
    • component:protocol.validate · one finding currency and ordered checks · src/validate/validators.ts:72 · layer domain · context protocol
  • impl:protocol.build-pipeline-query · runQuery reads one body, derives the graph once for the reader, raw graph and report, and prints the return or refuses on stderr · src/cli/q-command.ts:212

    Component: component:protocol.cli · entry points, shared build and publication · src/cli/build-command.ts:32 · layer edge · context protocol

    Uses

    None.

Runtime observation: not tracked.

Evidence

Runtime observation: not tracked.

Build attestations: not tracked.

Deployments: not tracked.

Bills of materials: not tracked.

Impact
Relations of spec:consumers.agent-surface.evaluation-sink
Relations of spec:consumers.agent-surface.evaluation-sinkdependsOn · declaredrefines · declareddecidedBy · declaredrefines · declaredverifies · declaredrefines · declaredverifies · declaredrefines · declaredverifies · declareddependsOn · declareddependsOn · declaredOutgoing refinesspec:consumers.agent-surfaceAgents script a visibletyped graph…consumers.agent-surfaceOutgoing decidedByspec:decisions.agent-front-doorThe agent front door is oneevaluation sink over theexported reader…decisions.agent-front-doorSubjectspec:consumers.agent-surface.evaluation-sinkThe evaluation sink runsone body and prints itsreturn…consumers.agent-surface.evaluation-sinkIncoming refinesspec:consumers.agent-surface.evaluation-sink.exported-evaluatorA script holding a graphruns a shipped recipethrough the exportedevaluator…consumers.agent-surface.evaluation-sink.exported-evaluatorspec:consumers.agent-surface.evaluation-sink.recipe-callA body calls a shippedrecipe and returns itsanswer unchanged…consumers.agent-surface.evaluation-sink.recipe-callspec:consumers.agent-surface.evaluation-sink.unknown-recipeA call to a recipe thecatalog does not hold failsthe body…consumers.agent-surface.evaluation-sink.unknown-recipeIncoming dependsOnspec:consumers.agent-surface.answer-shapesRecipe answers fit anagent's context and explaintheir misses…consumers.agent-surface.answer-shapesspec:consumers.spec-studio.data.recipe-answersA page takes each recipeanswer from the recipe'sshipped body…consumers.spec-studio.data.recipe-answersspec:validation.corpus-rulesCorpus-authored rules runon the one validation path…validation.corpus-rules
The diagram as text
  • spec:consumers.agent-surface: Agents script a visible typed graph
  • spec:consumers.agent-surface.answer-shapes: Recipe answers fit an agent's context and explain their misses
  • spec:consumers.agent-surface.evaluation-sink: The evaluation sink runs one body and prints its return
  • spec:consumers.agent-surface.evaluation-sink.exported-evaluator: A script holding a graph runs a shipped recipe through the exported evaluator
  • spec:consumers.agent-surface.evaluation-sink.recipe-call: A body calls a shipped recipe and returns its answer unchanged
  • spec:consumers.agent-surface.evaluation-sink.unknown-recipe: A call to a recipe the catalog does not hold fails the body
  • spec:consumers.spec-studio.data.recipe-answers: A page takes each recipe answer from the recipe's shipped body
  • spec:decisions.agent-front-door: The agent front door is one evaluation sink over the exported reader
  • spec:validation.corpus-rules: Corpus-authored rules run on the one validation path
  • spec:consumers.agent-surface.evaluation-sink decidedBy spec:decisions.agent-front-door · declared
  • spec:consumers.agent-surface.evaluation-sink refines spec:consumers.agent-surface · declared
  • spec:consumers.agent-surface.answer-shapes dependsOn spec:consumers.agent-surface.evaluation-sink · declared — a caller runs a shipped body, and wraps it in its own body, through the evaluation sink
  • spec:consumers.spec-studio.data.recipe-answers dependsOn spec:consumers.agent-surface.evaluation-sink · declared — the build composes recipe answers through the same body evaluation `sdp q` runs
  • spec:validation.corpus-rules dependsOn spec:consumers.agent-surface.evaluation-sink · declared — a rules file holds the body the sink evaluates, with the sink's bindings and trust
  • spec:consumers.agent-surface.evaluation-sink.exported-evaluator refines spec:consumers.agent-surface.evaluation-sink · declared
  • spec:consumers.agent-surface.evaluation-sink.recipe-call refines spec:consumers.agent-surface.evaluation-sink · declared
  • spec:consumers.agent-surface.evaluation-sink.unknown-recipe refines spec:consumers.agent-surface.evaluation-sink · declared
  • spec:consumers.agent-surface.evaluation-sink.exported-evaluator verifies spec:consumers.agent-surface.evaluation-sink · declared
  • spec:consumers.agent-surface.evaluation-sink.recipe-call verifies spec:consumers.agent-surface.evaluation-sink · declared
  • spec:consumers.agent-surface.evaluation-sink.unknown-recipe verifies spec:consumers.agent-surface.evaluation-sink · declared
Mermaid source

Copyable source; the Studio draws static SVG.

Preferred syntax: flowchart. Chosen syntax: labelled flowchart, preserving exact relations, claims and folds.

Rests on

Rested on by

Distance 1

Distance 2

Distance 3

Relations

Relation and directionOther endClaimReasonExercised keys
decidedBy · outgoingThe agent front door is one evaluation sink over the exported reader
spec:decisions.agent-front-door · resolves
declaredNoneNone
refines · outgoingAgents script a visible typed graph
spec:consumers.agent-surface · resolves
declaredNoneNone
dependsOn · incomingRecipe answers fit an agent's context and explain their misses
spec:consumers.agent-surface.answer-shapes · resolves
declareda caller runs a shipped body, and wraps it in its own body, through the evaluation sinkNone
dependsOn · incomingA page takes each recipe answer from the recipe's shipped body
spec:consumers.spec-studio.data.recipe-answers · resolves
declaredthe build composes recipe answers through the same body evaluation sdp q runsNone
dependsOn · incomingCorpus-authored rules run on the one validation path
spec:validation.corpus-rules · resolves
declareda rules file holds the body the sink evaluates, with the sink's bindings and trustNone
refines · incomingA script holding a graph runs a shipped recipe through the exported evaluator
spec:consumers.agent-surface.evaluation-sink.exported-evaluator · resolves
declaredNoneNone
refines · incomingA body calls a shipped recipe and returns its answer unchanged
spec:consumers.agent-surface.evaluation-sink.recipe-call · resolves
declaredNoneNone
refines · incomingA call to a recipe the catalog does not hold fails the body
spec:consumers.agent-surface.evaluation-sink.unknown-recipe · resolves
declaredNoneNone
verifies · incomingA script holding a graph runs a shipped recipe through the exported evaluator
spec:consumers.agent-surface.evaluation-sink.exported-evaluator · resolves
declaredNoneexportedEvaluator, oneEvaluator, recipeCall
verifies · incomingA body calls a shipped recipe and returns its answer unchanged
spec:consumers.agent-surface.evaluation-sink.recipe-call · resolves
declaredNonefifthBinding, recipeCall
verifies · incomingA call to a recipe the catalog does not hold fails the body
spec:consumers.agent-surface.evaluation-sink.unknown-recipe · resolves
declaredNonecallRefusals

Bindings

Implementation binding: present

  • api:protocol.evaluate-body · evaluates bodies and shipped recipes over one in-memory reader, graph and report · src/reader/evaluate-body.ts:120 · role service · component component:protocol.reader · layer application · context protocol
  • impl:protocol.build-pipeline-query · runQuery reads one body, derives the graph once for the reader, raw graph and report, and prints the return or refuses on stderr · src/cli/q-command.ts:212 · role service · component component:protocol.cli · layer edge · context protocol

Design reference: none

Verifier binding: present

  • spec:consumers.agent-surface.evaluation-sink.exported-evaluator · A script holding a graph runs a shipped recipe through the exported evaluator · declared · specs/consumers/agent-surface.evaluation-sink.exported-evaluator.sdp.md · example enabled
  • spec:consumers.agent-surface.evaluation-sink.recipe-call · A body calls a shipped recipe and returns its answer unchanged · declared · specs/consumers/agent-surface.evaluation-sink.recipe-call.sdp.md · example enabled
  • spec:consumers.agent-surface.evaluation-sink.unknown-recipe · A call to a recipe the catalog does not hold fails the body · declared · specs/consumers/agent-surface.evaluation-sink.unknown-recipe.sdp.md · example enabled
  • test:protocol.evaluation-sink · front-door checks verify how the sink takes a body, prints its return and refuses · anchored · test/cli-q.test.ts:81 · test anchor
  • test:protocol.query-answer-shapes · anchored · test/cli-q.test.ts:730 · test anchor

Expected-outcome oracle: present

  • oracle:protocol.consumers.agent-surface.evaluation-sink · test/reach-examples.test.ts:92

Runtime observation: not tracked.

Run results: not recorded in the graph.

Findings

None.

Composing (0)

Composing needs the script.