ejclaw
eabb085cb9
Clarify finalize verdict semantics
2026-04-07 19:27:18 +09:00
ejclaw
38461d9337
Route fresh review-ready input to owner
2026-04-07 19:07:25 +09:00
ejclaw
cbdc00fcec
Restore reviewer wake-up after owner delivery
2026-04-07 18:39:19 +09:00
ejclaw
90bc154dcf
Fix paired owner completion handoff race
2026-04-07 17:57:36 +09:00
ejclaw
1c22d6e56b
Deduplicate paired reviewer handoffs
2026-04-07 08:11:32 +09:00
ejclaw
10e10b499c
Complete paired-room SSOT cleanup and logger singleton
2026-04-07 05:12:22 +09:00
ejclaw
9d8c97a8e2
Fix reviewer-to-owner follow-up race
2026-04-07 01:22:27 +09:00
ejclaw
0363021218
Fix owner follow-up after reviewer bot output
2026-04-06 23:28:53 +09:00
ejclaw
bf55ad65fd
Format files touched by reviewer runtime cleanup
2026-04-06 07:56:59 +09:00
ejclaw
d75d26c23d
Stabilize paired reviewer recovery and owner follow-up
2026-04-06 07:49:26 +09:00
Eyejoker
b6c8546f25
Dedup reviewer finals only after actual IPC delivery
2026-04-05 08:02:02 +09:00
Eyejoker
e560fe6536
Deduplicate direct terminal reviewer deliveries
2026-04-05 06:57:56 +09:00
Eyejoker
f5e9400b9b
Avoid duplicate merge_ready finalize follow-ups
2026-04-05 01:08:13 +09:00
Eyejoker
ac225f2b1e
Add paired delivery diagnostic logging
2026-04-05 00:00:09 +09:00
Eyejoker
6ae9468a45
Inline merge_ready finalize handoff
2026-04-04 23:34:32 +09:00
Eyejoker
4a331c5036
Fix paired-room delivery role persistence
2026-04-04 22:28:41 +09:00
Eyejoker
e9c400424d
Add reviewer host evidence and verification shims
2026-04-04 20:51:24 +09:00
Eyejoker
3019d9bf31
test: format fallback delivery retry regression
2026-04-04 05:21:52 +09:00
Eyejoker
dfd9eb0f47
fix: recover fallback delivery retries across agent types
2026-04-04 05:21:25 +09:00
Eyejoker
3dd772c229
Refactor local memory and role-fixed runtime routing
2026-04-04 03:50:28 +09:00
Eyejoker
60f360b5ea
fix: preserve handoff roles during failover
2026-04-01 02:54:35 +09:00
Eyejoker
141898f764
refactor: scope runtime log context
2026-03-31 17:23:43 +09:00
Eyejoker
509e4c24a3
refactor: cut over room mode from paired legacy
2026-03-31 14:47:59 +09:00
Eyejoker
1c87616c44
fix: support same-service tribunal runtime
2026-03-31 14:01:31 +09:00
Eyejoker
a81e5aea63
style: format pending paired turn helpers
2026-03-31 05:43:54 +09:00
Eyejoker
43f8341c17
refactor: extract pending paired turn helpers
2026-03-31 05:43:17 +09:00
Eyejoker
3283522be5
feat: enrich finalize prompts and raise round-trip default
2026-03-31 04:40:56 +09:00
Eyejoker
e1b9501e87
feat: add completion_reason to paired_tasks (done/escalated/stopped/arbiter_escalated)
...
- owner can summon arbiter via BLOCKED/NEEDS_CONTEXT verdict
- completion_reason tracks why task ended: done (success), escalated
(reviewer gave up), stopped (/stop), arbiter_escalated
2026-03-31 04:10:33 +09:00
Eyejoker
61c9b8c2e9
fix: reviewer auto-trigger now receives owner turn outputs instead of static prompt
2026-03-31 03:55:45 +09:00
Eyejoker
f98dd27712
refactor: MoA uses lightweight API references + SDK arbiter as aggregator
...
Instead of spawning separate processes or using OpenRouter, MoA now:
- Queries external API models (Kimi, GLM) in parallel for opinions
- Injects opinions into the SDK arbiter's prompt
- The existing subscription-based arbiter aggregates all perspectives
No extra SDK processes, no OpenRouter dependency. Per-model config via
MOA_REF_MODELS + MOA_{NAME}_MODEL/BASE_URL/API_KEY env vars.
2026-03-31 00:26:24 +09:00
Eyejoker
f4b04d6c4d
feat: add Mixture of Agents (MoA) for arbiter verdicts
...
When MOA_ENABLED=true, arbiter queries multiple LLM models in parallel
via OpenAI-compatible API, then an aggregator model synthesizes the
final verdict from all opinions. Falls back to single-agent arbiter
when MoA is disabled.
Config: MOA_BASE_URL, MOA_API_KEY, MOA_REFERENCE_MODELS, MOA_AGGREGATOR_MODEL
2026-03-31 00:20:41 +09:00
Eyejoker
4a5edaceb6
refactor: remove SERVICE_AGENT_TYPE legacy constant
...
SERVICE_AGENT_TYPE was always 'claude-code' in the unified service,
making it a misleading constant. Each group already has its own
agentType field.
- Removed SERVICE_AGENT_TYPE from config.ts
- Session functions now accept agentType parameter (default: 'claude-code')
- Task scheduler uses task-level agent_type for token rotation decisions
- All fallback defaults changed to 'claude-code' literal
- Logging uses 'unified' instead of the misleading type
2026-03-30 23:10:48 +09:00
Eyejoker
46926f32f3
fix: use role-specific cursor keys in review_ready and arbiter_requested paths
...
The review_ready and arbiter_requested paths in processGroupMessages
were advancing the default (owner) cursor instead of the role-specific
cursor. This caused the reviewer to miss the owner's messages because
the owner cursor had already moved past them.
Now review_ready advances chatJid:reviewer cursor only, and
arbiter_requested advances chatJid:arbiter cursor only.
2026-03-30 22:50:26 +09:00
Eyejoker
a043f2b79a
feat: implement MAGI 3-agent arbiter system for deadlock resolution
...
Introduces a third agent role (arbiter) that is summoned on-demand
when owner and reviewer reach a deadlock (same verdict 3+ rounds).
Architecture:
- 3 Discord bots: owner (codex), reviewer (claude), arbiter (claude/codex)
- Arbiter is NOT always-on — only invoked when deadlock detected
- Arbiter renders binding verdict: PROCEED/REVISE/RESET/ESCALATE
- Non-escalate verdicts reset round_trip_count and resume ping-pong
- Backward compatible: ARBITER_AGENT_TYPE unset = existing 2-agent mode
Changes across 13 source files + 7 test files:
- types.ts: PairedRoomRole += 'arbiter', new statuses, ArbiterVerdict type
- config.ts: ARBITER_AGENT_TYPE, ARBITER_SERVICE_ID, ARBITER_DEADLOCK_THRESHOLD
- db.ts: schema migration (arbiter columns in channel_owner + paired_tasks)
- service-routing.ts: arbiter_service_id in lease
- room-role-context.ts: arbiter role detection
- paired-execution-context.ts: deadlock->arbiter, verdict handling
- message-runtime.ts: arbiter turn routing, cursor, sender labeling
- message-agent-executor.ts: arbiter mode, failover
- agent-runner.ts + environment.ts: arbiter container mode
- platform-prompts.ts: arbiter prompt loading
New files:
- prompts/arbiter-paired-room.md: arbiter system prompt
- src/arbiter-context.ts: builds conversation context for arbiter judgment
2026-03-30 22:20:42 +09:00
Eyejoker
17e92d4c3d
fix: isolate stale finals from next runs
2026-03-30 05:23:29 +09:00
Eyejoker
5221fb8b33
style: fix prettier drift after merge
2026-03-30 03:44:58 +09:00
Eyejoker
e863db61a8
refactor: remove dead output suppression path
2026-03-30 03:22:08 +09:00
Eyejoker
6edf5aebbd
refactor: remove explicit paired review command path
2026-03-30 01:43:48 +09:00
Eyejoker
9e0de1297c
fix: /clear now resets both owner and reviewer sessions in paired rooms
2026-03-29 19:00:42 +09:00
Eyejoker
a1e5418a2f
feat: auto-trigger reviewer after owner completion with round trip limit
...
- Owner finishes → auto mark review_ready → reviewer executes
- Reviewer finishes → task back to active → owner can respond
- Automatic ping-pong until consensus or round trip limit
- PAIRED_MAX_ROUND_TRIPS env var (default 10, 0 = unlimited)
- round_trip_count tracked per task in DB
2026-03-29 18:57:16 +09:00
Eyejoker
d01f98bd61
feat: unify 3 bot services into single process
...
- Add UNIFIED_MODE flag (default on, disable with UNIFIED_MODE=0)
- Register all 3 Discord bots in one process (claude, codex, review)
- Load all registered groups regardless of agent_type (codex/owner priority)
- Start credential proxy and container cleanup at unified startup
- shouldServiceProcessChat returns true in unified mode
- Add findChannelByName for role-based response routing
- Backward compatible: UNIFIED_MODE=0 restores per-service behavior
2026-03-29 18:37:17 +09:00
Eyejoker
fc9f2867b9
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
2026-03-29 18:24:56 +09:00
Eyejoker
0e12a560a4
feat: finalize paired tasks on deploy completion
2026-03-29 06:42:03 +09:00
Eyejoker
29310ce67f
feat: recover paired executions after restart
2026-03-29 05:06:25 +09:00
Eyejoker
2d8f8151dd
style: sync high-risk plan gate formatting
2026-03-29 02:14:44 +09:00
Eyejoker
b536c90716
feat: add high-risk paired plan gate
2026-03-29 02:13:57 +09:00
Eyejoker
c76ed1d10a
fix: reconcile governance scaffold follow-up
2026-03-29 01:38:30 +09:00
Eyejoker
dc8dd98e84
feat: scaffold paired governance state
2026-03-29 01:35:57 +09:00
Eyejoker
b97d1a6260
refactor: unify typing policy across services
2026-03-28 06:52:57 +09:00
Eyejoker
de913985ba
fix: promote visible progress after silent final
2026-03-28 06:27:36 +09:00