From 5b800653a360d8a733e8c60ccb160491dcfa92e7 Mon Sep 17 00:00:00 2001 From: wassname <1103714+wassname@users.noreply.github.com> Date: Sat, 25 Apr 2026 18:18:48 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20two-tier=20task=20model=20=E2=80=94=20t?= =?UTF-8?q?rivial=20tasks=20self-complete,=20lgtm=20gates=20significant=20?= =?UTF-8?q?claims?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewer feedback: the LGTM extension's epistemic core is good but UX is too ceremonial — every task forced through lgtm_ask + /lgtm even bookkeeping like "monitor pueue 30". Two-tier split: - Tasks: agent-managed. TaskUpdate(status=completed) now allowed when no lgtm evidence is stored. Trivial subtasks lead up to verification without ceremony. - LGTMs: significant claims. lgtm_ask still triggers robot review; once evidence is stored, completion is locked to /lgtm so the gate can't be bypassed. Other UX: - TaskList output grouped: Active / Awaiting sign-off / Pending / Completed. - New getDisplayStatus(task) derives awaiting_signoff from pending_approval. - Widget header shows N awaiting sign-off count. - /lgtm accepts multiple ids: /lgtm 1 2 3 (also #1, commas). - lgtm_ask field descriptions encourage one short sentence per field — keep thinking discipline, drop verbosity. - SYSTEM_REMINDER nudges progress updates and cleanup of completed/irrelevant tasks, not just lgtm_ask. Also includes pending rubric extension on RobotReviewRecord. Co-Authored-By: Claude Opus 4.7 --- img/README-1776381151332-image.png | Bin 0 -> 147389 bytes src/index.ts | 295 +++++++++++++++++++++-------- src/review-badges.ts | 30 +-- src/robot-review.ts | 15 ++ src/task-store.ts | 11 +- src/ui/task-widget.ts | 21 +- test/review-badges.test.ts | 36 +++- test/robot-review.test.ts | 1 + test/task-store.test.ts | 22 ++- 9 files changed, 315 insertions(+), 116 deletions(-) create mode 100644 img/README-1776381151332-image.png diff --git a/img/README-1776381151332-image.png b/img/README-1776381151332-image.png new file mode 100644 index 0000000000000000000000000000000000000000..91b4178351e0e3d1142ac203a7e793d6d2690af7 GIT binary patch literal 147389 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 — Human signs off on a task (only way to complete) + * /tasks — Interactive task management menu + * /lgtm — Human signs off on one or more tasks + * /lgtm * — Sign off all tasks awaiting human review with passing robot review */ import { spawn } from "node:child_process"; @@ -19,7 +26,7 @@ import { join, resolve } from "node:path"; import type { ExtensionAPI, ExtensionCommandContext, ExtensionContext } from "@mariozechner/pi-coding-agent"; import { Type } from "@sinclair/typebox"; import { AutoClearManager } from "./auto-clear.js"; -import { getReviewBadges, REVIEW_BADGES } from "./review-badges.js"; +import { type DisplayStatus, getDisplayStatus, getReviewBadges } from "./review-badges.js"; import { appendRobotReviewMetadata, getLatestRobotReview, @@ -55,6 +62,29 @@ export function getRobotReviewTimeoutMs(env: NodeJS.ProcessEnv = process.env): n return Number.isFinite(configured) && configured > 0 ? configured : DEFAULT_ROBOT_REVIEW_TIMEOUT_MS; } +/** + * Pick a reviewer model from a different provider than the current one. + * Prefers cheap/fast models suitable for review tasks. + * Returns undefined if no alternate provider is available (falls back to same model). + */ +export function pickAlternateReviewerModel(currentProviderId?: string): string | undefined { + // Ordered by: cheap, fast, good enough for structured review + const providerModels: Record = { + anthropic: "anthropic/claude-haiku-4-5", + "github-copilot": "github-copilot/gemini-3-flash-preview", + openrouter: "openrouter/google/gemini-2.5-flash", + }; + const providers = Object.keys(providerModels); + const current = currentProviderId ?? ""; + + // Try a different provider first + for (const p of providers) { + if (p !== current) return providerModels[p]; + } + // All same? Just return the first non-current + return providers.length > 0 ? providerModels[providers[0]] : undefined; +} + function getAssistantTextFromPiEvent(event: any): string | undefined { if (event?.type !== "message_end" || event.message?.role !== "assistant" || !Array.isArray(event.message.content)) { return undefined; @@ -150,11 +180,19 @@ function formatRobotReview(review: RobotReviewRecord): string { `Robot review #${review.iteration} (${review.submitted_at})`, `Reviewer: ${review.reviewer}${review.mode === "auto" ? " [auto]" : ""}`, `Scope: ${review.scope}`, - `Accepted: ${review.accepted ? "yes" : "no"}`, - `Evidence complete: ${review.evidence_complete ? "yes" : "no"}`, - `Evidence convincing: ${review.evidence_convincing ? "yes" : "no"}`, - `Observations:\n- ${review.observations.join("\n- ")}`, ]; + if (review.rubric) { + const rubricLines = Object.entries(review.rubric).map(([key, val]) => + ` ${val.pass ? "PASS" : "FAIL"} ${key}: ${val.reason}` + ); + parts.push(`Rubric:\n${rubricLines.join("\n")}`); + } + parts.push( + `**Accepted: ${review.accepted ? "yes" : "no"}**`, + `**Evidence complete: ${review.evidence_complete ? "yes" : "no"}**`, + `**Evidence convincing: ${review.evidence_convincing ? "yes" : "no"}**`, + `Observations:\n- ${review.observations.join("\n- ")}`, + ); if (review.missing_evidence.length > 0) parts.push(`Missing evidence:\n- ${review.missing_evidence.join("\n- ")}`); if (review.blind_spots) parts.push(`Blind spots: ${review.blind_spots}`); return parts.join("\n"); @@ -166,13 +204,31 @@ function buildRobotReviewPrompt(task: any): string { ? `\nPrevious robot reviews:\n${priorReviews.map(formatRobotReview).join("\n\n")}\n` : "\nPrevious robot reviews:\n(none)\n"; return [ - "Review the task evidence with a fresh perspective.", - "Observations should stay concrete and source-grounded.", - "Set evidence_complete=false if the supplied evidence does not cover the claimed done criterion.", - "Set evidence_convincing=false if the evidence exists but would not convince a skeptical reviewer.", + "You are a VALIDATION reviewer, not a flaw-finder. Your job is to sanity-check that the evidence addresses the done criterion.", + "Your role: validate and sanity-check. Comment and suggest, but the gate is only the rubric below.", + "", + "## Critical: Evidence must be verbatim", + "", + "Evidence should contain literal output — verbatim command output, exact log lines, markdown block quotes, table rows, URLs — not summaries or interpretations. If the evidence only says 'it worked' or 'returned 5 results' without showing the actual output, flag it under verification_hints_actionable or evidence_covers_done_criterion.", + "A human must be able to verify the claim from the evidence alone, without re-running anything. Summaries are not evidence. Literal output is evidence.", + "", + "## Rubric (rate each item pass/fail)", + "", + "1. evidence_covers_done_criterion: Does the evidence directly address the stated done criterion? Evidence must be verbatim (literal output, not 'it worked').", + "2. falsification_test_runnable: Is the falsification test concrete enough that someone could run it and get a yes/no result? Must include actual output, not just 'ran X and it worked'.", + "3. failure_modes_addressed: Are the failure_likely and failure_sneaky plausibly the top failure modes? (Not: are there OTHER failure modes?)", + "4. verification_hints_actionable: Can a human follow the verification hints to check the claim without re-running experiments? Hints must reference specific content (line ranges, output snippets, URLs), not bare paths or counts.", + "", + "Set evidence_complete=true only if items 1 and 2 pass.", + "Set evidence_convincing=true only if items 1, 2, AND 4 pass.", + "Set accepted=true only if ALL rubric items pass.", + "", + "Observations: report what you see, not what might be missing. Comments and suggestions go in observations.", + "missing_evidence: ONLY items from the rubric that failed. Do NOT add new dimensions.", + "", "Return exactly one JSON object between the markers ROBOT_REVIEW_JSON_START and ROBOT_REVIEW_JSON_END.", - "JSON schema:", - '{"reviewer":"string","scope":"string","observations":["string"],"blind_spots":"string","accepted":true,"evidence_complete":true,"evidence_convincing":true,"missing_evidence":["string"]}', + "JSON schema (reasoning before booleans — think first, then judge):", + '{"reviewer":"string","scope":"string","rubric":{"evidence_covers_done_criterion":{"reason":"...","pass":true},"falsification_test_runnable":{"reason":"...","pass":true},"failure_modes_addressed":{"reason":"...","pass":true},"verification_hints_actionable":{"reason":"...","pass":true}},"observations":["string"],"blind_spots":"string","missing_evidence":["string"],"evidence_complete":true,"evidence_convincing":true,"accepted":true}', "", `Task #${task.id}: ${task.subject}`, `Done criterion: ${task.done_criterion}`, @@ -188,7 +244,7 @@ function buildRobotReviewPrompt(task: any): string { priorSection, "Output format:", "ROBOT_REVIEW_JSON_START", - '{"reviewer":"...","scope":"...","observations":["..."],"blind_spots":"...","accepted":true,"evidence_complete":true,"evidence_convincing":true,"missing_evidence":["..."]}', + '{"reviewer":"...","scope":"...","rubric":{...},"observations":["..."],"blind_spots":"...","missing_evidence":["..."],"evidence_complete":true,"evidence_convincing":true,"accepted":true}', "ROBOT_REVIEW_JSON_END", ].join("\n"); } @@ -196,10 +252,11 @@ function buildRobotReviewPrompt(task: any): string { async function runAutomaticRobotReview( task: any, signal?: AbortSignal, + currentProviderId?: string, ): Promise<{ review: Omit; command: string }> { const prompt = buildRobotReviewPrompt(task); - const args = ["--mode", "json", "-p", "--no-session"]; - const reviewerModel = process.env.PI_LGTM_ROBOT_REVIEW_MODEL?.trim(); + const args = ["--mode", "json", "-p", "--no-session", "--no-tools", "--no-extensions"]; + const reviewerModel = process.env.PI_LGTM_ROBOT_REVIEW_MODEL?.trim() || pickAlternateReviewerModel(currentProviderId); if (reviewerModel) args.push("--model", reviewerModel); args.push(prompt); const invocation = getPiInvocation(args); @@ -212,9 +269,22 @@ async function runAutomaticRobotReview( const parsed = extractRobotReviewJson(result.stdout); const observations = Array.isArray(parsed.observations) ? parsed.observations.filter((item): item is string => typeof item === "string") : []; if (observations.length === 0) throw new Error("Robot reviewer returned no observations."); - const missing_evidence = Array.isArray(parsed.missing_evidence) + const rawMissing: string[] = Array.isArray(parsed.missing_evidence) ? parsed.missing_evidence.filter((item): item is string => typeof item === "string") : []; + const missing_evidence = rawMissing; + // Extract rubric with per-item reasoning + let rubric: Record | undefined; + if (parsed.rubric && typeof parsed.rubric === "object") { + const r: Record = {}; + for (const [key, val] of Object.entries(parsed.rubric as Record)) { + if (val && typeof val === "object" && "reason" in (val as any) && "pass" in (val as any)) { + const v = val as { reason: unknown; pass: unknown }; + r[key] = { reason: typeof v.reason === "string" ? v.reason : "", pass: v.pass === true }; + } + } + if (Object.keys(r).length > 0) rubric = r; + } return { command: commandLabel, review: { @@ -231,12 +301,17 @@ async function runAutomaticRobotReview( submitted_at: new Date().toISOString(), mode: "auto", raw_output: result.stdout.trim(), + rubric, }, }; } const SYSTEM_REMINDER = ` -The LGTM sign-off task tools haven't been used recently. If working on tasks, use TaskCreate (requires done_criterion), TaskUpdate for status, and lgtm_ask when ready for human sign-off. Tasks can only be completed via /lgtm after calling lgtm_ask. These are sign-off tasks: agents propose evidence, humans approve. One task per piece of evidence or decision gate. Ignore if not applicable. Never mention this reminder to the user. +Task tools haven't been used recently. Check the task list and keep it accurate: +- Mark tasks in_progress when you start them (TaskUpdate status=in_progress). +- Complete trivial subtasks directly: TaskUpdate(status=completed). Drop irrelevant ones with status=deleted. +- For significant claims with uncertainty (a feature, an experiment result, run-until-X), call lgtm_ask with evidence — that triggers robot review and a human /lgtm gate. +A stale list is worse than no list. Ignore this reminder if not applicable. Never mention it to the user. `; export default function (pi: ExtensionAPI) { @@ -291,11 +366,14 @@ export default function (pi: ExtensionAPI) { let currentTurn = 0; let lastTaskToolUseTurn = 0; let reminderInjectedThisCycle = false; + let currentProvider: string | undefined; pi.on("turn_start", async (_event, ctx) => { currentTurn++; widget.setUICtx(ctx.ui as UICtx); upgradeStoreIfNeeded(ctx); + const model = ctx.model; + if (model) currentProvider = (model as any).providerId ?? (model as any).provider; if (autoClear.onTurnStart(currentTurn)) widget.update(); }); @@ -369,25 +447,22 @@ export default function (pi: ExtensionAPI) { pi.registerTool({ name: "TaskCreate", label: "TaskCreate", - description: `Create an LGTM sign-off task with a clear done_criterion. + description: `Create a task with a clear done_criterion. -## When to Use +## Two tiers -- Complex multi-step tasks (3+ steps) -- When user provides a list of things to do +- **Tasks**: agent-managed. Trivial bookkeeping (e.g. "monitor pueue 30") can be completed directly via TaskUpdate(status=completed). Subtasks lead up to verification. +- **LGTMs**: for significant claims with uncertainty (implement a feature, run-until-X). Call lgtm_ask with evidence — that triggers robot review and routes completion through /lgtm. ## Task Fields - **subject**: Brief actionable title - **description**: Detailed description with context - **done_criterion**: REQUIRED. Falsifiable observation that distinguishes done from fail/null/incomplete/silent-fail. State expected AND wrong-case observations (e.g., "All 92 tests pass. If wrong: type errors in build or test failures in task-store.test.ts") -- **progress_label** (optional): What the agent is currently doing, shown during in-progress tasks - -Tasks are completed only via /lgtm after calling lgtm_ask with evidence.`, +- **progress_label** (optional): What the agent is currently doing, shown during in-progress tasks`, promptGuidelines: [ "Use TaskCreate for complex tasks. Include a specific done_criterion.", - "Mark tasks in_progress before starting. Use lgtm_ask when done.", - "Tasks cannot be marked completed directly — human must /lgtm them.", + "Mark tasks in_progress before starting. Complete trivial tasks via TaskUpdate; call lgtm_ask for significant claims, then human /lgtm.", ], parameters: Type.Object({ subject: Type.String({ description: "Brief task title" }), @@ -412,24 +487,15 @@ Tasks are completed only via /lgtm after calling lgtm_ask with evidence.`, pi.registerTool({ name: "TaskList", label: "TaskList", - description: `List all LGTM sign-off tasks. Review badges: ${REVIEW_BADGES.tool}=tool evidence, ${REVIEW_BADGES.robot}=robot review, ${REVIEW_BADGES.human}=pending human sign-off via /lgtm.`, + description: `List all tasks grouped by status. Pipeline stages: [🛠🤖👀] = evidence→review→signoff (·=pending).`, parameters: Type.Object({}), execute(_toolCallId, _params, _signal, _onUpdate, _ctx) { const tasks = store.list(); if (tasks.length === 0) return Promise.resolve(textResult("No tasks found")); - const statusOrder: Record = { pending: 0, in_progress: 1, completed: 2 }; - const sorted = [...tasks].sort((a, b) => { - const so = (statusOrder[a.status] ?? 0) - (statusOrder[b.status] ?? 0); - if (so !== 0) return so; - return Number(a.id) - Number(b.id); - }); - - const lines = sorted.map(task => { - let line = `#${task.id} [${task.status}] ${task.subject}`; - const reviewBadges = getReviewBadges(task); - if (reviewBadges.length > 0) line += ` ${reviewBadges.join(" ")}`; + const renderTask = (task: typeof tasks[number]) => { + let line = ` #${task.id} ${task.subject} ${getReviewBadges(task)}`; if (task.blockedBy.length > 0) { const openBlockers = task.blockedBy.filter(bid => { const blocker = store.get(bid); @@ -438,9 +504,25 @@ Tasks are completed only via /lgtm after calling lgtm_ask with evidence.`, if (openBlockers.length > 0) line += ` [blocked by ${openBlockers.map(id => "#" + id).join(", ")}]`; } return line; - }); + }; - return Promise.resolve(textResult(lines.join("\n"))); + const buckets: { label: string; status: DisplayStatus }[] = [ + { label: "Active", status: "in_progress" }, + { label: "Awaiting sign-off", status: "awaiting_signoff" }, + { label: "Pending", status: "pending" }, + { label: "Completed", status: "completed" }, + ]; + + const sections: string[] = []; + for (const { label, status } of buckets) { + const inBucket = tasks + .filter(t => getDisplayStatus(t) === status) + .sort((a, b) => Number(a.id) - Number(b.id)); + if (inBucket.length === 0) continue; + sections.push(`${label}:\n${inBucket.map(renderTask).join("\n")}`); + } + + return Promise.resolve(textResult(sections.join("\n\n"))); }, }); @@ -461,11 +543,10 @@ Tasks are completed only via /lgtm after calling lgtm_ask with evidence.`, if (!task) return Promise.resolve(textResult("Task not found")); const desc = task.description.replace(/\\n/g, "\n"); - const reviewBadges = getReviewBadges(task); const robotReviews = getRobotReviews(task); const lines: string[] = [ `Task #${task.id}: ${task.subject}`, - `Status: ${task.status}${reviewBadges.length ? ` ${reviewBadges.join(" ")}` : ""}${task.pending_approval && task.status !== "completed" ? " (pending human sign-off)" : ""}`, + `Status: ${task.status} ${getReviewBadges(task)}${task.pending_approval && task.status !== "completed" ? " (pending human sign-off)" : ""}`, `Done criterion: ${task.done_criterion}`, ]; lines.push(`Description: ${desc}`); @@ -495,19 +576,19 @@ Tasks are completed only via /lgtm after calling lgtm_ask with evidence.`, pi.registerTool({ name: "TaskUpdate", label: "TaskUpdate", - description: `Update LGTM sign-off task fields or status. + description: `Update task fields or status. -Status: pending -> in_progress -> (call lgtm_ask) -> /lgtm -> completed - -Cannot set status=completed here. Use lgtm_ask then /lgtm .`, +Two-tier model: +- Trivial bookkeeping tasks (e.g. "monitor pueue 30") can be marked completed directly here. +- Tasks that called lgtm_ask are gated: completion requires /lgtm . Strengthen evidence and re-run lgtm_ask if the robot review rejected it.`, parameters: Type.Object({ taskId: Type.String({ description: "Task ID to update" }), - status: Type.Optional(Type.Unsafe<"pending" | "in_progress" | "deleted">({ + status: Type.Optional(Type.Unsafe<"pending" | "in_progress" | "completed" | "deleted">({ anyOf: [ - { type: "string", enum: ["pending", "in_progress"] }, + { type: "string", enum: ["pending", "in_progress", "completed"] }, { type: "string", const: "deleted" }, ], - description: "New status. Cannot set completed — use /lgtm after lgtm_ask.", + description: "New status. Setting completed is allowed for trivial tasks; tasks with lgtm evidence must complete via /lgtm.", })), subject: Type.Optional(Type.String({ description: "Brief task title" })), description: Type.Optional(Type.String({ description: "Detailed description" })), @@ -536,8 +617,12 @@ Cannot set status=completed here. Use lgtm_ask then /lgtm .`, autoClear.resetBatchCountdown(); } else if (fields.status === "pending") { autoClear.resetBatchCountdown(); + } else if (fields.status === "completed") { + widget.setActiveTask(taskId, false); + autoClear.trackCompletion(taskId, currentTurn); } else if (fields.status === "deleted") { widget.setActiveTask(taskId, false); + warnings.push("Task deleted via agent tool. Use /tasks to confirm or undo. Deleting tasks without human sign-off is discouraged — tasks should be completed via /lgtm or explicitly dismissed by the user."); } widget.update(); @@ -559,22 +644,26 @@ Cannot set status=completed here. Use lgtm_ask then /lgtm .`, Forces structured thinking about failure modes. All text fields required. After this, task enters pending sign-off state — only completable via /lgtm . +## CRITICAL: Evidence must be verbatim + +Do NOT summarize or interpret. Paste literal command output, exact log lines, markdown block quotes, table rows, URLs. 'I ran X and it worked' is not evidence — paste the actual output of X. A human must be able to verify from the evidence alone without re-running anything. + ## Fields -- **evidence**: Auditable proof — command output, table, file path, link +- **evidence**: Verbatim auditable proof — literal output, not summaries - **failure_likely**: Most likely way this could be wrong despite evidence - **failure_sneaky**: Most perverse or sneaky failure -- one that looks like success superficially, corrupts silently, or only breaks under specific conditions (scale, time, edge case). E.g. feature active but wrong mechanism, works in tests but degrades in prod, correct output for wrong reason. -- **falsification_test**: What you ran and what you got -- presented so both you and the human can sanity-check it. State: what you ran (command, experiment, log inspection), the actual output or result, and why that result could not occur if a failure mode were real. Must be traceable: include file paths, log snippets, counts, or commit. Human should be able to verify without re-running anything. -- **verification_hints**: Where to look and what to check. Descriptions of evidence locations, not bare file paths. E.g. "lines 45-60 in src/loss.py show the gradient check" not "src/loss.py". +- **falsification_test**: What you ran and the literal output you got, with reasoning why that output disproves the failure mode +- **verification_hints**: Where to look and what to check, with specific content quoted (not bare paths or counts) - **remaining_uncertainty**: What's NOT tested, known limitations, deferred edge cases`, parameters: Type.Object({ taskId: Type.String({ description: "Task ID to submit for sign-off" }), - evidence: Type.String({ description: "Auditable proof: exact command run + output, commit, config/seeds, file paths. Re-runnable by the human. 'I wrote X' is not evidence -- 'I ran X and got Y' is. Include counts, snippets, test output." }), - failure_likely: Type.String({ description: "Most likely way this could be wrong despite evidence" }), - failure_sneaky: Type.String({ description: "Most perverse or sneaky failure: looks like success superficially, corrupts silently, or only breaks at scale/time/edge case. E.g. correct output for wrong reason, feature active but wrong mechanism, passes tests but degrades in prod." }), - falsification_test: Type.String({ description: "What you ran and what you got, presented so both you and the human can sanity-check it. State: what you ran (command/experiment/log check), the actual output or result, and why that result could not occur if a failure mode were real. Must be traceable: include file paths, log snippets, counts, or commit. The human should be able to verify without re-running anything." }), - verification_hints: Type.Array(Type.String(), { description: "Where to look and what to check. Descriptions of evidence locations, not bare file paths. E.g. 'lines 45-60 in src/loss.py show the gradient check' not 'src/loss.py'." }), - remaining_uncertainty: Type.String({ description: "What's NOT tested, known limitations, edge cases deferred. If you can't articulate uncertainty, you haven't thought hard enough." }), + evidence: Type.String({ description: "Verbatim auditable proof: literal command output, exact log lines, markdown block quotes, table rows, URLs. NOT summaries or interpretations. 'I ran X and got Y' is not evidence -- paste the actual output of X. A human must verify from this alone without re-running. (One short paragraph is fine; verbatim matters more than length.)" }), + failure_likely: Type.String({ description: "Most likely way this could be wrong despite evidence. One short sentence preferred — pick the top one, not a list." }), + failure_sneaky: Type.String({ description: "Most perverse failure: looks like success superficially, corrupts silently, or only breaks at scale/time/edge case. One short sentence preferred." }), + falsification_test: Type.String({ description: "What you ran and the literal output you got. Include verbatim command + output, not 'it worked'. State why that output could not occur if a failure mode were real. Brevity is fine; the verbatim output is what counts." }), + verification_hints: Type.Array(Type.String(), { description: "Where to look, with specific content quoted (not bare paths or counts). E.g. 'src/loss.py:45-60 shows grad_norm=0.001'. One or two short hints is enough." }), + remaining_uncertainty: Type.String({ description: "What's NOT tested, known limitations, deferred edges. One short sentence preferred. If you can't articulate uncertainty, you haven't thought hard enough." }), }), async execute(_toolCallId, params, signal, _onUpdate, _ctx) { @@ -600,7 +689,7 @@ After this, task enters pending sign-off state — only completable via /lgtm `- ${v.pass ? "PASS" : "FAIL"} ${k}: ${v.reason}`).join("\n")}\n` + : "") + `${review.observations.map(o => `- ${o}`).join("\n")}`; if (review.missing_evidence.length > 0) { robotReviewNote += `\nMissing evidence:\n${review.missing_evidence.map(item => `- ${item}`).join("\n")}`; @@ -661,6 +753,7 @@ After this, task enters pending sign-off state — only completable via /lgtm `- ${o}`).join("\n")}\n\n` + `${(params.missing_evidence?.length ?? 0) > 0 ? `### Missing evidence\n${(params.missing_evidence ?? []).map(item => `- ${item}`).join("\n")}\n\n` : ""}` + `### Blind spots\n${params.blind_spots}\n\n` + - `${REVIEW_BADGES.robot} Robot review stored. Human sign-off still requires \`/lgtm ${task.id}\`.`; + `🤖 Robot review stored. Human sign-off still requires \`/lgtm ${task.id}\`.`; return Promise.resolve(textResult(result)); }, @@ -739,7 +832,7 @@ This appends a new robot-review iteration. If the reviewer marks evidence incomp return textResult(`Task #${params.taskId} has no stored evidence yet. Call lgtm_ask first.`); } - const { review, command } = await runAutomaticRobotReview(task, signal); + const { review, command } = await runAutomaticRobotReview(task, signal, currentProvider); store.update(params.taskId, { pending_approval: review.accepted ? task.pending_approval : false, metadata: appendRobotReviewMetadata(task, review), @@ -753,6 +846,9 @@ This appends a new robot-review iteration. If the reviewer marks evidence incomp `Accepted: ${review.accepted ? "yes" : "no"}\n` + `Evidence complete: ${review.evidence_complete ? "yes" : "no"}\n` + `Evidence convincing: ${review.evidence_convincing ? "yes" : "no"}\n\n` + + (review.rubric + ? `### Rubric\n${Object.entries(review.rubric).map(([k, v]) => `- ${v.pass ? "PASS" : "FAIL"} ${k}: ${v.reason}`).join("\n")}\n\n` + : "") + `### Observations\n${review.observations.map(o => `- ${o}`).join("\n")}\n\n` + `${review.missing_evidence.length > 0 ? `### Missing evidence\n${review.missing_evidence.map(item => `- ${item}`).join("\n")}\n\n` : ""}` + `### Blind spots\n${review.blind_spots}`, @@ -810,8 +906,7 @@ This appends a new robot-review iteration. If the reviewer marks evidence incomp }; const choices = tasks.map(t => { - const badges = getReviewBadges(t); - return `${statusIcon(t)} #${t.id} [${t.status}] ${t.subject}${badges.length ? ` ${badges.join(" ")}` : ""}`; + return `${statusIcon(t)} #${t.id} [${t.status}] ${t.subject} ${getReviewBadges(t)}`; }); choices.push("← Back"); @@ -835,7 +930,7 @@ This appends a new robot-review iteration. If the reviewer marks evidence incomp actions.push("✗ Delete"); actions.push("← Back"); - const pendingNote = task.pending_approval && task.status !== "completed" ? `\n${REVIEW_BADGES.human} Pending /lgtm sign-off` : ""; + const pendingNote = task.pending_approval && task.status !== "completed" ? `\n👀 Pending /lgtm sign-off` : ""; const em = task.metadata; let evidenceNote = ""; if (em.lgtm_evidence) { @@ -906,11 +1001,11 @@ This appends a new robot-review iteration. If the reviewer marks evidence incomp return; } - // Show stored evidence for review before sign-off + // Print evidence to the conversation so the user can review it there const m = task.metadata; const evidenceParts: string[] = []; if (m.lgtm_evidence) { - evidenceParts.push(`Evidence:\n${m.lgtm_evidence}`); + evidenceParts.push(`**Evidence:**\n${m.lgtm_evidence}`); evidenceParts.push(`Failure (likely): ${m.lgtm_failure_likely}`); evidenceParts.push(`Failure (sneaky): ${m.lgtm_failure_sneaky}`); if (m.lgtm_falsification_test) evidenceParts.push(`Falsification test: ${m.lgtm_falsification_test}`); @@ -927,9 +1022,11 @@ This appends a new robot-review iteration. If the reviewer marks evidence incomp evidenceParts.push("Latest robot review says the evidence is not yet complete/convincing."); } } - const evidenceSummary = evidenceParts.length > 0 ? evidenceParts.join("\n\n") : "(no stored evidence)"; + if (evidenceParts.length > 0) { + ctx.ui.notify(evidenceParts.join("\n\n"), "info"); + } const confirm = await ctx.ui.select( - `Sign off #${taskId}: ${task.subject}\nDone criterion: ${task.done_criterion}\n\n${evidenceSummary}`, + `Sign off #${taskId}: ${task.subject}\nDone: ${task.done_criterion}`, ["✓ LGTM — sign off", "✗ Cancel"], ); if (confirm !== "✓ LGTM — sign off") return; @@ -947,10 +1044,35 @@ This appends a new robot-review iteration. If the reviewer marks evidence incomp } pi.registerCommand("lgtm", { - description: "Sign off on a task — /lgtm ", + description: "Sign off on tasks — /lgtm [ ...] or /lgtm * to sign off all pending", handler: async (args: string, ctx: ExtensionCommandContext) => { - const taskId = args.trim(); - if (!taskId) { + const trimmed = args.trim(); + if (trimmed === "*") { + // Sign off all pending tasks at once + const pending = store.list().filter(t => t.pending_approval && t.status !== "completed" && latestRobotReviewPasses(t)); + if (pending.length === 0) { + ctx.ui.notify("No tasks pending sign-off with passing robot review.", "info"); + return; + } + const choice = await ctx.ui.select( + `Sign off ALL ${pending.length} pending tasks?`, + pending.map(t => `#${t.id} ${t.subject}`).concat(["← Cancel"]), + ); + if (!choice || choice === "← Cancel") return; + for (const t of pending) { + try { + store.complete(t.id); + autoClear.trackCompletion(t.id, currentTurn); + widget.setActiveTask(t.id, false); + } catch (err: any) { + ctx.ui.notify(`Failed to sign off #${t.id}: ${err.message}`, "error"); + } + } + widget.update(); + ctx.ui.notify(`Signed off ${pending.length} tasks. ✓`, "info"); + return; + } + if (!trimmed) { const pending = store.list().filter(t => t.pending_approval && t.status !== "completed"); if (pending.length === 0) { ctx.ui.notify("No tasks pending sign-off. Agent must call lgtm_ask first.", "info"); @@ -965,7 +1087,24 @@ This appends a new robot-review iteration. If the reviewer marks evidence incomp if (match) signOff(match[1], ctx); return; } - signOff(taskId, ctx); + // Accept one or more whitespace-separated IDs (also tolerate `#1` and commas). + const ids = trimmed.split(/[\s,]+/).map(t => t.replace(/^#/, "")).filter(Boolean); + if (ids.length === 1) { + await signOff(ids[0], ctx); + return; + } + const results: string[] = []; + for (const id of ids) { + const before = store.get(id); + await signOff(id, ctx); + const after = store.get(id); + if (after?.status === "completed" && before?.status !== "completed") { + results.push(`✓ #${id}`); + } else { + results.push(`✗ #${id}`); + } + } + ctx.ui.notify(`Batch sign-off: ${results.join(", ")}`, "info"); }, }); } diff --git a/src/review-badges.ts b/src/review-badges.ts index 63c41b4..c27d078 100644 --- a/src/review-badges.ts +++ b/src/review-badges.ts @@ -1,16 +1,24 @@ import { getRobotReviews } from "./robot-review.js"; import type { Task } from "./types.js"; -export const REVIEW_BADGES = { - tool: "🛠", - robot: "🤖", - human: "👀", -} as const; +const STAGES = ["🛠", "🤖", "👀"] as const; -export function getReviewBadges(task: Task): string[] { - const badges: string[] = []; - if (task.metadata?.lgtm_evidence) badges.push(REVIEW_BADGES.tool); - if (getRobotReviews(task).length > 0) badges.push(REVIEW_BADGES.robot); - if (task.pending_approval && task.status !== "completed") badges.push(REVIEW_BADGES.human); - return badges; +/** Pipeline stages: `[🛠·🤖·👀]` fills left-to-right as evidence→review→signoff progresses. */ +export function getReviewBadges(task: Task): string { + const filled = [ + !!task.metadata?.lgtm_evidence, + getRobotReviews(task).length > 0, + task.pending_approval && task.status !== "completed", + ]; + const slots = STAGES.map((emoji, i) => filled[i] ? emoji : "·"); + return `[${slots.join("")}]`; +} + +export type DisplayStatus = "awaiting_signoff" | "in_progress" | "pending" | "completed"; + +/** Derived display bucket. `awaiting_signoff` is pending_approval && !completed. */ +export function getDisplayStatus(task: Task): DisplayStatus { + if (task.status === "completed") return "completed"; + if (task.pending_approval) return "awaiting_signoff"; + return task.status; } diff --git a/src/robot-review.ts b/src/robot-review.ts index 1948bd3..b998153 100644 --- a/src/robot-review.ts +++ b/src/robot-review.ts @@ -15,12 +15,25 @@ export interface RobotReviewRecord { submitted_at: string; mode: RobotReviewMode; raw_output?: string; + rubric?: Record; } function toStringArray(value: unknown): string[] { return Array.isArray(value) ? value.filter((item): item is string => typeof item === "string") : []; } +function extractRubric(value: unknown): Record | undefined { + if (!value || typeof value !== "object") return undefined; + const r: Record = {}; + for (const [key, val] of Object.entries(value as Record)) { + if (val && typeof val === "object" && "reason" in (val as any) && "pass" in (val as any)) { + const v = val as { reason: unknown; pass: unknown }; + r[key] = { reason: typeof v.reason === "string" ? v.reason : "", pass: v.pass === true }; + } + } + return Object.keys(r).length > 0 ? r : undefined; +} + function normalizeReview(value: unknown, index: number): RobotReviewRecord | undefined { if (!value || typeof value !== "object") return undefined; const review = value as Record; @@ -44,6 +57,7 @@ function normalizeReview(value: unknown, index: number): RobotReviewRecord | und submitted_at: typeof review.submitted_at === "string" ? review.submitted_at : new Date(0).toISOString(), mode: review.mode === "auto" ? "auto" : "manual", raw_output: typeof review.raw_output === "string" ? review.raw_output : undefined, + rubric: extractRubric(review.rubric), }; } @@ -116,3 +130,4 @@ export function latestRobotReviewPasses(task: Task): boolean { const latest = getLatestRobotReview(task); return latest ? latest.accepted : false; } + diff --git a/src/task-store.ts b/src/task-store.ts index 15732ce..cebdf21 100644 --- a/src/task-store.ts +++ b/src/task-store.ts @@ -112,7 +112,7 @@ export class TaskStore { } update(id: string, fields: { - status?: Exclude | "deleted"; + status?: TaskStatus | "deleted"; subject?: string; description?: string; done_criterion?: string; @@ -129,8 +129,13 @@ export class TaskStore { const changedFields: string[] = []; const warnings: string[] = []; - if ((fields.status as string) === "completed") { - throw new Error(`Use /lgtm ${id} to complete tasks. Call lgtm_ask first to submit evidence.`); + // Self-completion is allowed for trivial tasks that never escalated to lgtm_ask. + // Once a task has stored lgtm evidence, completion must go through /lgtm so the + // human gate + robot review can't be skipped. + if (fields.status === "completed") { + if (task.pending_approval || task.metadata?.lgtm_evidence) { + throw new Error(`Use /lgtm ${id} to complete this task — it has lgtm evidence pending review.`); + } } if (fields.status === "deleted") { diff --git a/src/ui/task-widget.ts b/src/ui/task-widget.ts index f6727f2..c60d8b9 100644 --- a/src/ui/task-widget.ts +++ b/src/ui/task-widget.ts @@ -9,7 +9,7 @@ */ import { truncateToWidth } from "@mariozechner/pi-tui"; -import { getReviewBadges } from "../review-badges.js"; +import { getDisplayStatus, getReviewBadges } from "../review-badges.js"; import type { TaskStore } from "../task-store.js"; // ---- Types ---- @@ -125,15 +125,15 @@ export class TaskWidget { if (tasks.length === 0) return []; - const completed = tasks.filter(t => t.status === "completed"); - const inProgress = tasks.filter(t => t.status === "in_progress"); - const pending = tasks.filter(t => t.status === "pending"); + const counts = { completed: 0, awaiting_signoff: 0, in_progress: 0, pending: 0 }; + for (const t of tasks) counts[getDisplayStatus(t)]++; const parts: string[] = []; - if (completed.length > 0) parts.push(`${completed.length} done`); - if (inProgress.length > 0) parts.push(`${inProgress.length} in progress`); - if (pending.length > 0) parts.push(`${pending.length} open`); - const statusText = `${tasks.length} lgtm's (${parts.join(", ")})`; + if (counts.completed > 0) parts.push(`${counts.completed} done`); + if (counts.awaiting_signoff > 0) parts.push(`${counts.awaiting_signoff} awaiting sign-off`); + if (counts.in_progress > 0) parts.push(`${counts.in_progress} in progress`); + if (counts.pending > 0) parts.push(`${counts.pending} open`); + const statusText = `${tasks.length} tasks (${parts.join(", ")})`; const spinnerChar = SPINNER[this.widgetFrame % SPINNER.length]; const lines: string[] = [truncate(theme.fg("accent", "●") + " " + theme.fg("accent", statusText))]; @@ -142,8 +142,7 @@ export class TaskWidget { for (let i = 0; i < visible.length; i++) { const task = visible[i]; const isActive = this.activeTaskIds.has(task.id) && task.status === "in_progress"; - const reviewBadges = getReviewBadges(task); - const reviewSuffix = reviewBadges.length > 0 ? ` ${reviewBadges.join(" ")}` : ""; + const reviewSuffix = ` ${getReviewBadges(task)}`; let icon: string; if (isActive) { @@ -194,7 +193,7 @@ export class TaskWidget { } lines.push(truncate(text + suffix)); - if (!isActive && task.status !== "completed" && (task as any).done_criterion) { + if (task.status !== "completed" && (task as any).done_criterion) { lines.push(truncate(` test: ${(task as any).done_criterion}`)); } } diff --git a/test/review-badges.test.ts b/test/review-badges.test.ts index 6f5b073..176b6cd 100644 --- a/test/review-badges.test.ts +++ b/test/review-badges.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import { getReviewBadges, REVIEW_BADGES } from "../src/review-badges.js"; +import { getDisplayStatus, getReviewBadges } from "../src/review-badges.js"; import type { Task } from "../src/types.js"; function makeTask(overrides: Partial = {}): Task { @@ -21,11 +21,11 @@ function makeTask(overrides: Partial = {}): Task { } describe("getReviewBadges", () => { - it("returns no badges when no review artifacts exist", () => { - expect(getReviewBadges(makeTask())).toEqual([]); + it("renders all dots when no artifacts exist", () => { + expect(getReviewBadges(makeTask())).toBe("[···]"); }); - it("returns tool, robot, and human badges independently", () => { + it("fills tool/robot/human slots independently", () => { const task = makeTask({ pending_approval: true, metadata: { @@ -46,11 +46,7 @@ describe("getReviewBadges", () => { }, }); - expect(getReviewBadges(task)).toEqual([ - REVIEW_BADGES.tool, - REVIEW_BADGES.robot, - REVIEW_BADGES.human, - ]); + expect(getReviewBadges(task)).toBe("[🛠🤖👀]"); }); it("hides the human badge once the task is completed", () => { @@ -60,6 +56,26 @@ describe("getReviewBadges", () => { metadata: { lgtm_evidence: "ok" }, }); - expect(getReviewBadges(task)).toEqual([REVIEW_BADGES.tool]); + expect(getReviewBadges(task)).toBe("[🛠··]"); + }); +}); + +describe("getDisplayStatus", () => { + it("returns pending for fresh tasks", () => { + expect(getDisplayStatus(makeTask())).toBe("pending"); + }); + + it("returns in_progress for active tasks not yet escalated", () => { + expect(getDisplayStatus(makeTask({ status: "in_progress" }))).toBe("in_progress"); + }); + + it("returns awaiting_signoff when pending_approval is set", () => { + expect(getDisplayStatus(makeTask({ status: "in_progress", pending_approval: true }))) + .toBe("awaiting_signoff"); + }); + + it("returns completed regardless of pending_approval flag", () => { + expect(getDisplayStatus(makeTask({ status: "completed", pending_approval: true }))) + .toBe("completed"); }); }); diff --git a/test/robot-review.test.ts b/test/robot-review.test.ts index d8f77b1..66e5a15 100644 --- a/test/robot-review.test.ts +++ b/test/robot-review.test.ts @@ -76,3 +76,4 @@ describe("robot review helpers", () => { expect(task2.metadata.robot_review_iteration_count).toBe(2); }); }); + diff --git a/test/task-store.test.ts b/test/task-store.test.ts index b1e4741..ca6c3b4 100644 --- a/test/task-store.test.ts +++ b/test/task-store.test.ts @@ -168,9 +168,25 @@ describe("TaskStore (in-memory)", () => { expect(store.list()[0].id).toBe("2"); }); - it("throws on update status=completed (must use /lgtm)", () => { - store.create("Test", "Desc", "done"); - expect(() => store.update("1", { status: "completed" as any })).toThrow("Use /lgtm"); + it("allows TaskUpdate(status=completed) for trivial tasks (no lgtm evidence)", () => { + store.create("Trivial", "Desc", "done"); + const { task, changedFields } = store.update("1", { status: "completed" }); + expect(task!.status).toBe("completed"); + expect(changedFields).toContain("status"); + }); + + it("blocks TaskUpdate(status=completed) when pending_approval=true", () => { + store.create("Significant", "Desc", "done"); + store.update("1", { pending_approval: true }); + expect(() => store.update("1", { status: "completed" })).toThrow("/lgtm"); + }); + + it("blocks TaskUpdate(status=completed) when lgtm evidence is stored (even if review rejected)", () => { + store.create("Escalated", "Desc", "done"); + // lgtm_ask path stores evidence; if robot review rejects, pending_approval becomes false. + // The agent must not be able to bypass the gate by self-completing afterwards. + store.update("1", { metadata: { lgtm_evidence: "literal output" }, pending_approval: false }); + expect(() => store.update("1", { status: "completed" })).toThrow("/lgtm"); }); it("returns not found for update on non-existent task", () => {