Slice 1 S6. packages/harness runs a role session under the pi or claude
adapter behind a tool gate, and packages/seat holds the session and its
process. The bus host gains a launch socket: `mosaic bus start
<business> --pm <harness>:<model>` runs the PM without a window, the PM
launches role sessions through the broker within the business file's
`launch.max`, and every launch, refusal and end is a launch-log line and
a broker event. `mosaic talk`, `mosaic launches off|on|list` and
`mosaic stop <run>` are new CLI verbs. packages/bus gains the IPC ops
identity, authorize, refuse, endLaunch and credentialStatus, plus
Broker.endLaunch (decision 77); no socket verb, event kind or schema
changed. The session environment is an allowlist, and the runner exits
before claiming if a founder credential reaches it.
Filbert built it (agents/filbert/work/s6). Darkwing reviewed on #1523:
round 1 changes (26991/26995), round 2 changes (27004/27010), round 3
changes (27012/27032), round 4 approve (27033/27034) on manifest
08a78972, 42 paths.
Sage's gate on 64b0f9f1 (12:32Z), sequential and teed: node suites
business 60, bus 74, cli 83, control-board 124, conversation 182,
discord 178, harness 56, ledger 78, mosaic 69, queue 149, runs 41,
seat 27, tasks 51, webui 39, every one 0 failed; test-auth 15,
test-conductor 17, test-config 24, test-discord 66,
test-extension-package 18, test-foundation 44, test-queue 27,
test-release 14, test-task 98 and 26 without Docker, all 0 failed.
64b0f9f1..ee7f909b touches none of the 42 paths. It landed after the
Q14 hold ended at 2026-10-11T17:19:23.857Z. The recorded PM-to-coder
run on a scratch data root is still owed before row 41 moves to done.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
37 lines
1.4 KiB
JavaScript
37 lines
1.4 KiB
JavaScript
// A stand-in harness turn for the runner tests. MOSAIC_REQUEST's body
|
|
// (after the blank line) picks the behaviour:
|
|
// TOOL <name> <json> call a typed tool through the tool socket, print the result or refusal
|
|
// SLEEP hang until killed
|
|
// FAIL exit 3
|
|
// NOMARKER answer without writing the turn marker
|
|
// anything else answer "echo: <request>"
|
|
// Every turn appends its pid to $FAKE_PIDS when set.
|
|
|
|
import { appendFileSync, writeFileSync } from "node:fs";
|
|
import { callTool } from "../../src/tools.mjs";
|
|
|
|
const request = process.env.MOSAIC_REQUEST ?? "";
|
|
const body = request.split("\n\n").slice(1).join("\n\n");
|
|
if (process.env.FAKE_PIDS) appendFileSync(process.env.FAKE_PIDS, `${process.pid}\n`);
|
|
process.stderr.write(`fake adapter: ${process.env.MOSAIC_MODEL}\n`);
|
|
const done = () => writeFileSync(process.env.MOSAIC_TURN_MARKER, "done\n");
|
|
|
|
if (body.startsWith("TOOL ")) {
|
|
const [, name, ...rest] = body.split(" ");
|
|
try {
|
|
process.stdout.write(JSON.stringify(await callTool(process.env.MOSAIC_TOOL_SOCKET, name, JSON.parse(rest.join(" ") || "{}"))));
|
|
} catch (e) {
|
|
process.stdout.write(e.message);
|
|
}
|
|
done();
|
|
} else if (body === "SLEEP") {
|
|
setInterval(() => {}, 1000);
|
|
} else if (body === "FAIL") {
|
|
process.exit(3);
|
|
} else if (body === "NOMARKER") {
|
|
process.stdout.write("half an answer");
|
|
} else {
|
|
process.stdout.write(`echo: ${request}\n`);
|
|
done();
|
|
}
|