fix(paired): auto-provision paired workspace so tribunal rooms get a reviewer on registration

Rooms registered as tribunal had no work_dir and no paired_projects row, so
ensurePairedProject() returned null, no paired task was ever created, and only
the owner ran — the reviewer/arbiter never fired (web-vstock and 4 other rooms).

Add ensurePairedWorkspaceProvisioned(): defaults canonical work_dir to
groups/<folder>, guarantees it is a standalone git repo with an initial commit
(detected via a LOCAL .git so we never walk up into the EJClaw checkout and
create a stray worktree), and upserts the paired_projects row. Wire it into
setup/register.ts so every newly registered room is immediately usable by the
full owner→reviewer→arbiter flow. Adds a regression test.
This commit is contained in:
Codex
2026-07-30 01:45:28 +09:00
parent 6036430c60
commit 44c54a759c
3 changed files with 108 additions and 1 deletions

View File

@@ -9,6 +9,7 @@ import path from 'path';
import { GROUPS_DIR } from '../src/config.js';
import { assignRoom, initDatabase } from '../src/db.js';
import { isValidGroupFolder } from '../src/group-folder.js';
import { ensurePairedWorkspaceProvisioned } from '../src/paired-workspace-manager.js';
import { logger } from '../src/logger.js';
import { emitStatus } from './status.js';
@@ -109,6 +110,24 @@ export async function run(args: string[]): Promise<void> {
});
logger.info('Assigned room through canonical room service');
// Provision the paired workspace so a tribunal room's reviewer/arbiter work
// immediately on registration. Without this the room has work_dir=null and
// the paired flow never creates a task, so only the owner ever runs.
const canonicalWorkDir = ensurePairedWorkspaceProvisioned({
chatJid: parsed.jid,
groupFolder: parsed.folder,
});
assignRoom(parsed.jid, {
name: parsed.name,
folder: parsed.folder,
isMain: parsed.isMain,
workDir: canonicalWorkDir,
});
logger.info(
{ folder: parsed.folder, canonicalWorkDir },
'Provisioned paired workspace for room so reviewer/arbiter run on registration',
);
fs.mkdirSync(path.join(GROUPS_DIR, parsed.folder, 'logs'), {
recursive: true,
});