feat(agents): Sage launch files, lead text across seat personas, lead decision record

- agents/sage/ launch files committed after Dewey's review (R1 revise, R2
  approve). The launcher test now covers sage with its zai/glm-5.3 high pin.
  The README states the lead role and its limits, and the seat reads but
  never writes the old DYOR records under ~/.mosaic.
- N6 (Dewey authored, Sage reviewed against pins): seat personas and the
  Rocko launcher name Sage as project lead and Darkwing as a collaborating
  engineering seat, per Jason's 2026-09-26 ruling.
- docs/plans/2026-09-26_lead-decisions.md: the push, no merge into next and
  its conditions, the board restart, queue-as-data rulings, Gate F waiting
  on a T3 source, and what stays with Jason.

Launcher tests 6/6 and 1/1, eight suites green. Not pushed.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
2026-09-26 15:11:10 -05:00
co-authored by Claude Opus 5.5
parent 42c08d5285
commit d41f81aafe
26 changed files with 849 additions and 42 deletions
+5 -4
View File
@@ -11,7 +11,7 @@ const source = resolve(import.meta.dirname, '..');
// forgets inherits these and fails instead of registering into a real data root.
process.env.MOSAIC_CONFIG = join(tmpdir(), 'mosaic-launch-test-no-config.json');
process.env.MOSAIC_LAUNCH_REGISTERED = '';
for (const agent of ['darkwing', 'dewey', 'filbert', 'researcher']) test(`${agent} launch context, resources, session recovery, and refusals`, () => {
for (const agent of ['darkwing', 'dewey', 'filbert', 'researcher', 'sage']) test(`${agent} launch context, resources, session recovery, and refusals`, () => {
const root = mkdtempSync(join(tmpdir(), `${agent} launch `));
try {
for (const dir of ['agents', 'scripts', 'contracts', 'user', 'node_modules/.bin', 'extensions/goal']) {
@@ -86,9 +86,10 @@ fs.writeFileSync('capture.json', JSON.stringify({args: process.argv.slice(2), ag
assert.equal(record.sessionsDir, join(root, `.pi/state/${agent}/sessions`));
assert.ok(Number.isInteger(record.pid) && record.pid > 0);
const firstStart = record.startedAt;
assert.equal(captured.args[captured.args.indexOf('--provider') + 1], agent === 'filbert' ? 'openai-codex' : 'test');
assert.equal(captured.args[captured.args.indexOf('--model') + 1], agent === 'filbert' ? 'gpt-6-astra' : 'test-model');
if (agent === 'filbert') assert.equal(captured.args[captured.args.indexOf('--thinking') + 1], 'low');
const pinned = { filbert: ['openai-codex', 'gpt-6-astra', 'low'], sage: ['zai', 'glm-5.3', 'high'] }[agent];
assert.equal(captured.args[captured.args.indexOf('--provider') + 1], pinned ? pinned[0] : 'test');
assert.equal(captured.args[captured.args.indexOf('--model') + 1], pinned ? pinned[1] : 'test-model');
if (pinned) assert.equal(captured.args[captured.args.indexOf('--thinking') + 1], pinned[2]);
assert.equal(captured.args[captured.args.indexOf('--session-dir') + 1], join(root, `.pi/state/${agent}/sessions`));
assert.equal(captured.args.includes('--continue'), false);
assert.ok(captured.args.includes('--no-context-files'));