refactor: simplify paired review system and add reviewer container isolation

Phase 1 — Strip over-engineering (-3,665 lines):
- DB tables: 7 → 3 (remove executions, approvals, artifacts, events)
- Task statuses: 11 → 5 (active, review_ready, in_review, merge_ready, completed)
- Remove plan governance, event sourcing, gate/verdict, freshness guards
- paired-execution-context: 980 → 299 lines
- Session commands: remove /risk, /plan, /approve-plan, /request-plan-changes

Phase 2 — Container isolation for reviewers:
- Add container-runtime.ts (Docker abstraction)
- Add credential-proxy.ts (API key injection without container exposure)
- Add container-runner.ts (reviewer-specific read-only mount + tmpfs)
- Add container/Dockerfile + agent-runner (Chromium, Claude Code, Codex)
- agent-runner.ts: auto-route reviewer execution to container mode
This commit is contained in:
Eyejoker
2026-03-29 18:16:28 +09:00
parent 3dd41f749e
commit fc9f2867b9
24 changed files with 1174 additions and 4900 deletions

View File

@@ -63,8 +63,7 @@ describe('paired workspace manager', () => {
chat_jid: 'dc:test',
group_folder: 'paired-room',
canonical_work_dir: canonicalDir,
workspace_topology: 'shadow-snapshot',
created_at: now,
created_at: now,
updated_at: now,
});
db.createPairedTask({
@@ -75,11 +74,9 @@ describe('paired workspace manager', () => {
reviewer_service_id: 'codex-review',
title: 'review the owner changes',
source_ref: 'HEAD',
task_policy: 'autonomous',
risk_level: 'low',
plan_status: 'not_requested',
plan_notes: null,
review_requested_at: null,
status: 'draft',
status: 'active',
created_at: now,
updated_at: now,
});
@@ -133,7 +130,7 @@ describe('paired workspace manager', () => {
).toBeTruthy();
expect(
db.getPairedWorkspace('paired-task-1', 'reviewer')
?.snapshot_source_fingerprint,
?.snapshot_ref,
).toBeTruthy();
});
@@ -155,8 +152,7 @@ describe('paired workspace manager', () => {
chat_jid: 'dc:test',
group_folder: 'paired-room',
canonical_work_dir: canonicalDir,
workspace_topology: 'shadow-snapshot',
created_at: now,
created_at: now,
updated_at: now,
});
db.createPairedTask({
@@ -167,11 +163,9 @@ describe('paired workspace manager', () => {
reviewer_service_id: 'codex-review',
title: null,
source_ref: 'HEAD',
task_policy: 'autonomous',
risk_level: 'low',
plan_status: 'not_requested',
plan_notes: null,
review_requested_at: null,
status: 'draft',
status: 'active',
created_at: now,
updated_at: now,
});
@@ -210,8 +204,7 @@ describe('paired workspace manager', () => {
chat_jid: 'dc:test',
group_folder: 'paired-room',
canonical_work_dir: canonicalDir,
workspace_topology: 'shadow-snapshot',
created_at: now,
created_at: now,
updated_at: now,
});
db.createPairedTask({
@@ -222,11 +215,9 @@ describe('paired workspace manager', () => {
reviewer_service_id: 'codex-review',
title: 'cross service review',
source_ref: 'HEAD',
task_policy: 'autonomous',
risk_level: 'high',
plan_status: 'pending',
plan_notes: null,
review_requested_at: null,
status: 'draft',
status: 'active',
created_at: now,
updated_at: now,
});
@@ -288,8 +279,7 @@ describe('paired workspace manager', () => {
chat_jid: 'dc:test',
group_folder: 'paired-room',
canonical_work_dir: canonicalDir,
workspace_topology: 'shadow-snapshot',
created_at: now,
created_at: now,
updated_at: now,
});
db.createPairedTask({
@@ -300,11 +290,9 @@ describe('paired workspace manager', () => {
reviewer_service_id: 'codex-review',
title: null,
source_ref: 'HEAD',
task_policy: 'autonomous',
risk_level: 'low',
plan_status: 'not_requested',
plan_notes: null,
review_requested_at: null,
status: 'draft',
status: 'active',
created_at: now,
updated_at: now,
});
@@ -365,8 +353,7 @@ describe('paired workspace manager', () => {
chat_jid: 'dc:test',
group_folder: 'paired-room',
canonical_work_dir: canonicalDir,
workspace_topology: 'shadow-snapshot',
created_at: now,
created_at: now,
updated_at: now,
});
db.createPairedTask({
@@ -377,11 +364,9 @@ describe('paired workspace manager', () => {
reviewer_service_id: 'codex-review',
title: null,
source_ref: 'HEAD',
task_policy: 'autonomous',
risk_level: 'high',
plan_status: 'pending',
plan_notes: null,
review_requested_at: null,
status: 'draft',
status: 'active',
created_at: now,
updated_at: now,
});
@@ -508,8 +493,7 @@ describe('paired workspace manager', () => {
chat_jid: 'dc:test',
group_folder: 'paired-room',
canonical_work_dir: canonicalDir,
workspace_topology: 'shadow-snapshot',
created_at: now,
created_at: now,
updated_at: now,
});
db.createPairedTask({
@@ -520,11 +504,9 @@ describe('paired workspace manager', () => {
reviewer_service_id: 'codex-review',
title: null,
source_ref: 'HEAD',
task_policy: 'autonomous',
risk_level: 'low',
plan_status: 'not_requested',
plan_notes: null,
review_requested_at: null,
status: 'draft',
status: 'active',
created_at: now,
updated_at: now,
});
@@ -572,8 +554,7 @@ describe('paired workspace manager', () => {
chat_jid: 'dc:test',
group_folder: 'paired-room',
canonical_work_dir: canonicalDir,
workspace_topology: 'shadow-snapshot',
created_at: now,
created_at: now,
updated_at: now,
});
db.createPairedTask({
@@ -584,11 +565,9 @@ describe('paired workspace manager', () => {
reviewer_service_id: 'codex-review',
title: null,
source_ref: 'HEAD',
task_policy: 'autonomous',
risk_level: 'low',
plan_status: 'not_requested',
plan_notes: null,
review_requested_at: null,
status: 'draft',
status: 'active',
created_at: now,
updated_at: now,
});
@@ -630,8 +609,7 @@ describe('paired workspace manager', () => {
chat_jid: 'dc:test',
group_folder: 'paired-room',
canonical_work_dir: canonicalDir,
workspace_topology: 'shadow-snapshot',
created_at: now,
created_at: now,
updated_at: now,
});
db.createPairedTask({
@@ -642,11 +620,9 @@ describe('paired workspace manager', () => {
reviewer_service_id: 'codex-review',
title: null,
source_ref: 'HEAD',
task_policy: 'autonomous',
risk_level: 'low',
plan_status: 'pending',
plan_notes: null,
review_requested_at: '2026-03-28T00:01:00.000Z',
status: 'review_pending',
status: 'review_ready',
created_at: now,
updated_at: '2026-03-28T00:01:00.000Z',
});
@@ -694,8 +670,7 @@ describe('paired workspace manager', () => {
chat_jid: 'dc:test',
group_folder: 'paired-room',
canonical_work_dir: canonicalDir,
workspace_topology: 'shadow-snapshot',
created_at: now,
created_at: now,
updated_at: now,
});
db.createPairedTask({
@@ -706,11 +681,9 @@ describe('paired workspace manager', () => {
reviewer_service_id: 'codex-review',
title: null,
source_ref: 'HEAD',
task_policy: 'autonomous',
risk_level: 'low',
plan_status: 'not_requested',
plan_notes: null,
review_requested_at: null,
status: 'draft',
status: 'active',
created_at: now,
updated_at: now,
});
@@ -760,8 +733,7 @@ describe('paired workspace manager', () => {
chat_jid: 'dc:test',
group_folder: 'paired-room',
canonical_work_dir: canonicalDir,
workspace_topology: 'shadow-snapshot',
created_at: now,
created_at: now,
updated_at: now,
});
db.createPairedTask({
@@ -772,11 +744,9 @@ describe('paired workspace manager', () => {
reviewer_service_id: 'codex-review',
title: null,
source_ref: 'HEAD',
task_policy: 'autonomous',
risk_level: 'high',
plan_status: 'approved',
plan_notes: null,
review_requested_at: null,
status: 'draft',
status: 'active',
created_at: now,
updated_at: now,
});
@@ -851,8 +821,7 @@ describe('paired workspace manager', () => {
chat_jid: 'dc:test',
group_folder: 'paired-room',
canonical_work_dir: canonicalDir,
workspace_topology: 'shadow-snapshot',
created_at: now,
created_at: now,
updated_at: now,
});
db.createPairedTask({
@@ -863,11 +832,9 @@ describe('paired workspace manager', () => {
reviewer_service_id: 'codex-review',
title: null,
source_ref: 'HEAD',
task_policy: 'autonomous',
risk_level: 'high',
plan_status: 'pending',
plan_notes: null,
review_requested_at: null,
status: 'plan_review_pending',
status: 'active',
created_at: now,
updated_at: now,
});