연구소 고도화 P1–P2: the conductor's verification gate grows teeth
The Lab drawer stopped being a notepad. On top of lock-before-reveal it now confronts scope breaches against the locked contract, picks REAL verify commands from the repo, flags the agent's 'tests pass' self-reports for human corroboration, and forces a per-hunk review verdict with an NA-tone linter — all renderer-only on already-registered Tauri commands.
What landed (commit 1529af1)
The founder's directive reframed the whole build: do NOT optimize for convenience — "편의를 위해 나를 노예로 만들지마." So P1–P2 deliberately add friction that teaches, not friction that annoys.
- Scope breach (
scopeBreach) — the locked contract's in/out-scope is confronted against what git actually changed:⛔ 범위 위반(out-of-scope touched) and⚠️ 미이행(in-scope promised, nothing changed). A breach demands a written ruling — no silent rationalization after seeing the diff. - Verify-command picker —
code_detect_commandsreads the repo's realpackage.json/Makefilescripts; the human picks them instead of typing "tests pass". "Done" becomes a concrete command. - Claim ≠ evidence (
scanClaims+pane_capture_text) — the agent's "통과/fixed/passing" lines are surfaced as claims the human must corroborate by capturing the real pane output and marking pass/fail. "The agent says it passed" is no longer accepted. - Per-hunk verdict (
hunkify) — a file diff is split into hunks, each starting with a red unreviewed rail; every hunk needsOK/nit/consider/question/blocking+ a dimension + a one-line why. You can't seal a review you skimmed. - Tone forge (
toneCritique) — the why is linted for the NA review grammar the founder is learning: critique the code not the person, lead with a severity prefix, be specific (observation → suggestion → impact).
Why it's cheap to build
Zero new Rust. Everything rides already-registered commands (workitem_create/remember_action/attach_evidence, code_git_status/diff/detect_commands, read_transcript/read_codex_transcript, pane_capture_text). The hard logic is pure and unit-tested (labHelpers.ts, +14 tests → 371 total). BYO is preserved: the AI-review step routes through the founder's own pane, never a direct LLM call.
Update — P3 + P4 landed (고도화 complete)
Both remaining phases shipped:
- P3 — face-off. His per-hunk verdicts vs his own agent's findings on the same diff, classified
caught / missed / disputed, with forced written reconciliation of every miss ("what did I not know?"). The agent-paste box stays locked until his own review exists — no cheating off the AI first. - P4 — score + gate. A 5-axis review-quality score (hunk-coverage, catch-rate, precision, tone-pass, prediction-accuracy), graded on the gap not the effort. The
ACCEPT / REQUEST-CHANGES / REJECTverdict stays inert until every hunk is judged, every scope breach ruled, every miss reconciled, and a non-paraphrased rationale (≥12 words, not an echo of the transcript) is written. Each sealed rep persists to the operating-memory graph (workitem_attach_evidence+mark_done) so a reviewer-level trend can accrue over months.
381 unit tests green, still zero new Rust. The point of the whole rig: make the human a stronger reviewer/conductor, measured over time — not a faster approval-clicker.