verify¶
Source: src/verify.ts
Running the code, rather than asking two agents whether they like it.
This exists because of a real run: a pair wrote a helper and its tests, the
reviewer approved, the auditor approved, and the test file imported
./slugify.js for a file named slugify.ts. The suite did not even load.
Both agents had read the code; neither had run it.
So a flow’s check node runs a script of the project through a port,
like {@link AskUser}. The pattern is the one git.ts already follows: the
agents produce text, our code performs the act, and the result comes back as
evidence nobody can argue with.
bashCheck¶
function
export function bashCheck(bash = "bash"): CheckScript { /* … */ }
A {@link CheckScript} that runs the content with bash -c, $0 being the
script’s path, and stdout and stderr mixed in the order they came.
The script leads a process group of its own, and the whole group is killed
when it exits, times out or is stopped: a test runner leaves workers behind,
and a worker holding the pipes open would hold the check open with it.
bash is the executable, a knob so a test can name one that is not there.
CheckScript¶
type
export type CheckScript = (request: ScriptRequest) => Promise<ScriptOutcome>;
Runs a check script. Injected, so a flow’s dry run and its tests spawn nothing.
ScriptOutcome¶
type
export type ScriptOutcome =
| { readonly ok: true; readonly passed: boolean; readonly report: string }
| { readonly ok: false; readonly kind: "unavailable" | "timeout" | "stopped"; readonly message: string };
How a check script ended. passed: false is any exit but 0: a red check,
which the work can fix. Not ending is apart: the script could not start, it
ran past its bound, or it was stopped, and no change to the code answers that.
ScriptRequest¶
type
export type ScriptRequest = {
/** Its path from the root of the tree: `$0` inside it, and what a report names. */
readonly script: string;
/** What runs. Never read again from disk, so an agent editing the file changes nothing. */
readonly content: string;
/** The working tree it runs in. */
readonly cwd: string;
/** How long it may run before it is killed. */
readonly timeoutMs: number;
/** Aborting it kills the script. */
readonly signal?: AbortSignal;
};
A check script to run, its content read before the run started.