From 549ad06ab8fe46d2de424d905931e4cfb49a7905 Mon Sep 17 00:00:00 2001 From: ccsert Date: Sat, 24 Oct 2026 15:16:39 +0800 Subject: [PATCH 1/3] fix: attach draft summary automatically after human submission --- .opencode-review/agents/code-review.md | 4 +- .opencode-review/draft-watch.ts | 20 +++ .opencode-review/lib/draft-review.ts | 9 +- .opencode-review/lib/draft-summary.ts | 106 +++++++++++++ .opencode-review/lib/review-state.ts | 1 + .opencode-review/run-review.ts | 7 +- .opencode-review/tsconfig.json | 2 +- README.md | 18 ++- README_zh.md | 6 +- docs/draft-review.md | 49 +++++- entrypoint.sh | 12 ++ tests/draft-summary.test.ts | 154 +++++++++++++++++++ tests/integration/model-smoke.ts | 33 +++- tests/integration/review.integration.test.ts | 30 ++++ tests/review-startup.test.ts | 17 +- 15 files changed, 444 insertions(+), 24 deletions(-) create mode 100644 .opencode-review/draft-watch.ts create mode 100644 .opencode-review/lib/draft-summary.ts create mode 100644 tests/draft-summary.test.ts diff --git a/.opencode-review/agents/code-review.md b/.opencode-review/agents/code-review.md index 6e99b2f..ca5104f 100644 --- a/.opencode-review/agents/code-review.md +++ b/.opencode-review/agents/code-review.md @@ -21,7 +21,9 @@ You are an expert code reviewer specializing in identifying bugs, security issue Delivery is enforced by the runtime. When the run says `Delivery mode: draft`, `gitea-review` only saves a PENDING review for human editing and exports its summary locally. A verified saved/reused draft or a draft already submitted by -the reviewer completes the task. Stop then; never try to publish it through any +the reviewer completes the model's task. The trusted runner waits for human +submission and then automatically attaches the local summary as a PR comment. +Stop then; never try to publish it through any other tool. Draft conflicts or edits require the reviewer to finish in the UI. The mandatory tool call below applies to both delivery modes; "submit" means deliver to the configured mode, not permission to publish a draft. diff --git a/.opencode-review/draft-watch.ts b/.opencode-review/draft-watch.ts new file mode 100644 index 0000000..f7a91dd --- /dev/null +++ b/.opencode-review/draft-watch.ts @@ -0,0 +1,20 @@ +import { configuredReviewTarget, GiteaClient } from "./lib/gitea" +import { watchDraftSummary } from "./lib/draft-summary" + +export async function runDraftWatcher(key: string) { + const controller = new AbortController() + const stop = () => controller.abort(new Error("DRAFT_WAIT_INTERRUPTED: Waiting stopped; resume with the same output mount and draft key")) + process.once("SIGINT", stop) + process.once("SIGTERM", stop) + try { + return await watchDraftSummary(new GiteaClient(), configuredReviewTarget(true)!, key, { signal: controller.signal }) + } finally { + process.removeListener("SIGINT", stop) + process.removeListener("SIGTERM", stop) + } +} + +if (import.meta.main) { + try { await runDraftWatcher(process.argv[2] ?? "") } + catch (error) { console.error(error instanceof Error ? error.message : String(error)); process.exitCode = 1 } +} diff --git a/.opencode-review/lib/draft-review.ts b/.opencode-review/lib/draft-review.ts index e675f2d..bb1302b 100644 --- a/.opencode-review/lib/draft-review.ts +++ b/.opencode-review/lib/draft-review.ts @@ -5,7 +5,7 @@ import { commentsDigest } from "./review-confirmation" import { digest, readJSON, stateDirectory, writeJSON, writeReceipt, type Snapshot } from "./review-state" export interface DraftComment { path: string; body: string; new_position: number; old_position: number } -interface DraftRecord { +export interface DraftRecord { key: string target: ReturnType userId: number @@ -18,6 +18,7 @@ interface DraftRecord { recommendation: string nativeBody: string reviewId?: number + summaryPublication?: { body: string; commentId?: number } } interface TimelineEntry { id: number; type: string; review_id?: number; user?: { id: number }; body?: string } @@ -90,7 +91,7 @@ export async function saveDraft(api: GiteaClient, args: RepositoryPR, snapshot: if (!record) { record = { key, target, userId, head: snapshot.head, base: snapshot.base, context: snapshot.context, summary, comments, commentsDigest: commentsDigest(comments), recommendation, - nativeBody: `OpenCode draft: copy the locally exported Markdown summary into the review form before submitting.\n\n` } + nativeBody: `OpenCode draft: edit the pending comments and submit in the native UI. Keep the review container running; it will attach the AI summary after submission.\n\n` } await exportDraft(record) // Persist before POST: an ambiguous response must never cause another POST. await writeJSON(recordPath, record) @@ -143,7 +144,7 @@ export async function saveDraft(api: GiteaClient, args: RepositoryPR, snapshot: await checkCurrent(api, args, snapshot) const artifacts = await exportDraft(record) const url = `${api.baseURL}/${args.owner}/${args.repo}/pulls/${args.pull_number}/files` - await writeReceipt({ mode: "draft", status, target, head: record.head, reviewId: current.id, url, artifacts, warnings }) - return `${status === "draft_submitted" ? "Draft already submitted by reviewer; no new review created" : "Draft saved and verified; not published"}: ${url}\nCommit: ${record.head}\nSummary: ${artifacts.markdown}\nData: ${artifacts.json}\n${warnings.join("\n")}\nUse the same account in the native UI. Copy the Markdown summary, edit the pending comments, then manually submit.` + await writeReceipt({ mode: "draft", status, target, head: record.head, reviewId: current.id, url, artifacts, warnings, draftKey: key }) + return `${status === "draft_submitted" ? "Draft already submitted by reviewer; no new review created" : "Draft saved and verified; not published"}: ${url}\nCommit: ${record.head}\nSummary: ${artifacts.markdown}\nData: ${artifacts.json}\n${warnings.join("\n")}\nUse the same account in the native UI. Edit the pending comments and manually submit. The runner will attach the summary automatically after submission; keep the container running.` } finally { await rm(lock, { recursive: true, force: true }) } } diff --git a/.opencode-review/lib/draft-summary.ts b/.opencode-review/lib/draft-summary.ts new file mode 100644 index 0000000..90ca010 --- /dev/null +++ b/.opencode-review/lib/draft-summary.ts @@ -0,0 +1,106 @@ +import { mkdir, readFile, rm } from "node:fs/promises" +import { join, resolve } from "node:path" +import { GiteaClient, matchesReviewTarget, PRChangedError, prPath, pullRefHead, receiptTarget, requireOpen, type PullRequest, type RepositoryPR, type Review } from "./gitea" +import { digest, readJSON, stateDirectory, writeJSON } from "./review-state" +import type { DraftRecord } from "./draft-review" + +interface Comment { id: number; body: string; user: { id: number } } +export function draftWaitSeconds() { + const seconds = Number(process.env.DRAFT_WAIT_TIMEOUT_SECONDS ?? 3600) + if (!Number.isSafeInteger(seconds) || seconds < 0) throw new Error("DRAFT_WAIT_TIMEOUT_SECONDS must be a non-negative integer") + return seconds +} + +// This runs outside the model. It never submits a review or edits human content. +export async function watchDraftSummary(api: GiteaClient, args: RepositoryPR, key: string, + options: { timeoutMs?: number; pollMs?: number; signal?: AbortSignal } = {}) { + if (!process.env.REVIEW_OUTPUT_DIR) throw new Error("DRAFT_OUTPUT_REQUIRED: Mount the original REVIEW_OUTPUT_DIR to resume") + if (!/^[a-f0-9]{64}$/.test(key)) throw new Error("DRAFT_STATE_REQUIRED: A valid persisted draft key is required") + const timeout = options.timeoutMs ?? draftWaitSeconds() * 1000 + const recordPath = join(stateDirectory(), `draft-${key}.json`) + const target = receiptTarget(api.baseURL, args) + const user = await api.json<{ id: number }>("/user") + const lock = join(stateDirectory(), `draft-lock-${digest(JSON.stringify([target, user.id]))}`) + await mkdir(stateDirectory(), { recursive: true, mode: 0o700 }) + try { await mkdir(lock, { mode: 0o700 }) } + catch (error) { + if ((error as NodeJS.ErrnoException).code === "EEXIST") throw new Error("DRAFT_BUSY: Another run owns this account/PR lock") + throw error + } + try { + const record = await readJSON(recordPath) + if (!record || record.key !== key || !matchesReviewTarget(record.target, target) || record.userId !== user.id || + !Number.isSafeInteger(record.reviewId) || record.reviewId! <= 0) { + throw new Error("DRAFT_STATE_REQUIRED: Draft state does not match this account and target; no summary published") + } + const path = prPath(args) + const commentsPath = `${path.slice(0, path.lastIndexOf("/pulls/"))}/issues/${args.pull_number}/comments` + const marker = `` + async function currentReview() { + const review = await api.json(`${path}/reviews/${record!.reviewId}`) + if (review.user.id !== user.id || review.commit_id !== record!.head || review.dismissed || + !["PENDING", "COMMENT", "APPROVED", "REQUEST_CHANGES"].includes(review.state)) { + throw new Error("DRAFT_CHANGED: Review owner, commit, dismissal or state changed; no summary published") + } + const pr = await api.json(path) + requireOpen(pr) + if (pr.head.sha !== record!.head || pr.base.sha !== record!.base || await pullRefHead(api, args) !== record!.head) { + throw new PRChangedError("The draft snapshot is stale; no summary published") + } + return review + } + const deadline = Date.now() + timeout + console.log(`Waiting for reviewer to submit: ${api.baseURL}/${args.owner}/${args.repo}/pulls/${args.pull_number}/files`) + console.log(`Keep this container running. The summary will appear automatically after submission. Resume key: ${key}`) + while (true) { + options.signal?.throwIfAborted() + const review = await currentReview() + if (review.state !== "PENDING") break + if (Date.now() >= deadline) throw new Error(`DRAFT_WAIT_TIMEOUT: Review is still pending. Resume with the same output mount and target: draft-watch ${key}`) + await new Promise((resolve, reject) => { + const signal = options.signal + const abort = () => { clearTimeout(timer); reject(signal!.reason) } + const timer = setTimeout(() => { signal?.removeEventListener("abort", abort); resolve() }, Math.min(options.pollMs ?? 3000, Math.max(0, deadline - Date.now()))) + signal?.addEventListener("abort", abort, { once: true }) + if (signal?.aborted) { signal.removeEventListener("abort", abort); abort() } + }) + } + const url = (id: number) => `${api.baseURL}/${args.owner}/${args.repo}/pulls/${args.pull_number}#issuecomment-${id}` + if (record.summaryPublication?.commentId) { + console.log(`AI summary already attached: ${url(record.summaryPublication.commentId)}`) + return url(record.summaryPublication.commentId) + } + const findPublished = async () => { + const matches = (await api.list(commentsPath)).filter(comment => comment.user.id === user.id && comment.body.includes(marker)) + if (matches.length > 1) throw new Error("DRAFT_SUMMARY_AMBIGUOUS: Multiple matching summary comments; no further write") + return matches[0] + } + let published = await findPublished() + if (!published && !record.summaryPublication) { + // Read the editable local export only after the human submits. Never put + // confidential findings in a PENDING body, which some timeline APIs leak. + const markdown = await readFile(join(resolve(process.env.REVIEW_OUTPUT_DIR!), `review-${key}.md`), "utf8") + if (!markdown.trim()) throw new Error("DRAFT_SUMMARY_EMPTY: Local summary is empty; no comment published") + record.summaryPublication = { body: `### AI review summary\n\nAutomatically attached after the reviewer submitted review \`${record.reviewId}\`. Reviewed commit: \`${record.head}\`.\n\n${markdown.trim()}\n\n${marker}` } + const confirmed = await currentReview() + if (confirmed.state === "PENDING") throw new Error("DRAFT_CHANGED: The review is pending again; no summary published") + options.signal?.throwIfAborted() + // Record intent before POST. An uncertain response or restart only reads + // back this marker; it must never repeat a potentially successful write. + await writeJSON(recordPath, record) + try { + await api.request(commentsPath, { method: "POST", body: JSON.stringify({ body: record.summaryPublication.body }) }) + } catch { /* Reconcile an accepted POST even if its response was lost. */ } + published = await findPublished() + } + if (!published) throw new Error("DRAFT_SUMMARY_UNKNOWN: Publication could not be confirmed; preserve state. No automatic POST retry") + // A new publication must read back exactly. Later human edits are preserved. + if (record.summaryPublication && published.body !== record.summaryPublication.body) { + throw new Error("DRAFT_SUMMARY_CHANGED: Published summary differs from the saved intent; no content overwritten") + } + record.summaryPublication = { body: published.body, commentId: published.id } + await writeJSON(recordPath, record) + console.log(`AI summary attached: ${url(published.id)}`) + return url(published.id) + } finally { await rm(lock, { recursive: true, force: true }) } +} diff --git a/.opencode-review/lib/review-state.ts b/.opencode-review/lib/review-state.ts index 3977ae8..65decbf 100644 --- a/.opencode-review/lib/review-state.ts +++ b/.opencode-review/lib/review-state.ts @@ -28,6 +28,7 @@ export interface Receipt { reviewId: number url: string artifacts?: { json: string; markdown: string } + draftKey?: string warnings?: string[] } diff --git a/.opencode-review/run-review.ts b/.opencode-review/run-review.ts index 4144f1d..a381d0f 100644 --- a/.opencode-review/run-review.ts +++ b/.opencode-review/run-review.ts @@ -4,9 +4,12 @@ import { tmpdir } from "node:os" import { readJSON, stateDirectory, type Receipt } from "./lib/review-state" import { configuredReviewTarget, matchesReviewTarget, reviewURL } from "./lib/gitea" import { reviewMode } from "./lib/review-mode" +import { draftWaitSeconds } from "./lib/draft-summary" +import { runDraftWatcher } from "./draft-watch" export async function runReview(prompt: string) { const mode = reviewMode() + const wait = mode === "draft" ? draftWaitSeconds() : 0 const target = configuredReviewTarget(true)! const runID = crypto.randomUUID() const state = resolve(stateDirectory()) @@ -46,8 +49,10 @@ export async function runReview(prompt: string) { } console.log(`Verified ${mode === "draft" ? "draft" : "review"}: ${receipt.url} (${receipt.head}, ${receipt.status})`) if (mode === "draft") { - console.log(`Copy the summary from: ${receipt.artifacts!.markdown}`) + console.log(`Local summary preview: ${receipt.artifacts!.markdown}`) for (const warning of receipt.warnings ?? []) console.warn(warning) + if (wait > 0) await runDraftWatcher(receipt.draftKey ?? "") + else console.log(`Draft saved without waiting (DRAFT_WAIT_TIMEOUT_SECONDS=0). To attach the summary after submission, resume: draft-watch ${receipt.draftKey ?? ""}`) } await rm(receiptPath, { force: true }) return 0 diff --git a/.opencode-review/tsconfig.json b/.opencode-review/tsconfig.json index ffc9c41..197c798 100644 --- a/.opencode-review/tsconfig.json +++ b/.opencode-review/tsconfig.json @@ -8,5 +8,5 @@ "skipLibCheck": true, "types": ["bun"] }, - "include": ["lib/**/*.ts", "run-review.ts", "tools/*.ts", "env.d.ts"] + "include": ["lib/**/*.ts", "run-review.ts", "draft-watch.ts", "tools/*.ts", "env.d.ts"] } diff --git a/README.md b/README.md index 7796f84..fab95a0 100644 --- a/README.md +++ b/README.md @@ -392,11 +392,19 @@ docker run --rm \ "${REVIEW_IMAGE:-ghcr.io/ccsert/opencode-review:latest}" ``` -Use the actual human reviewer's token. Open the returned **Files** page with that -same account, edit its pending line comments, copy the exported Markdown summary -into the review form, and manually choose Comment, Approve or Request Changes. -The native editor does not prefill summaries. AI summaries stay local: some -server versions expose pending review bodies through their timeline API. +Use the actual human reviewer's token. When the runner starts waiting, keep the +container running, open the returned **Files** page with that account, edit the +pending line comments, and choose Comment, Approve or Request Changes. After +submission the container automatically attaches the summary as a separate PR +comment identifying the review and commit. No copy/paste is needed. Any human +text in the native review form is preserved. Before submission the AI summary +stays local, because some server versions expose pending review bodies through +their timeline API. You may preview or edit the exported Markdown locally. + +The default wait is one hour (`DRAFT_WAIT_TIMEOUT_SECONDS=3600`). After a timeout +or interruption, use the same output mount, account and target with +`draft-watch ` to resume without calling the model again. Setting the +timeout to `0` saves without waiting and requires that separate watcher command. Repeated draft runs reuse the original review. Manual edits and existing pending reviews are preserved; conflicts stop the run. A manually submitted draft is diff --git a/README_zh.md b/README_zh.md index 152a888..0c57f8b 100644 --- a/README_zh.md +++ b/README_zh.md @@ -383,9 +383,11 @@ docker run --rm \ "${REVIEW_IMAGE:-ghcr.io/ccsert/opencode-review:latest}" ``` -使用**实际审查者账号的 Token**。运行结束后,以同一账号打开返回的 Files 页面,修改待定行评论,把导出的 Markdown 总结复制到评审框,再手动选择“评论 / 通过 / 请求变更”。原生页面不会自动预填总结。 +使用**实际审查者账号的 Token**。出现等待提示后,保持 Docker 容器运行,以同一账号打开返回的 Files 页面,修改待定行评论,再手动选择“评论 / 通过 / 请求变更”。提交后,容器自动把总结作为一条关联该评审和代码版本的 PR 评论发布,无需复制粘贴。你在原生评审框填写的补充意见会保留。 -AI 总结仅保存在本地,因为部分服务器版本的时间线 API 会返回待定 review 的正文。重复运行复用原草稿;已有人工草稿或被人工修改的内容会触发停止,避免覆盖。手动提交后可识别原 review,且不会把它算成自动增量审查基准。 +提交前 AI 总结仅保存在本地,因为部分服务器版本的时间线 API 会返回待定 review 的正文;可查看或编辑导出的 Markdown,提交后会自动读取它。默认等待一小时,可用 `DRAFT_WAIT_TIMEOUT_SECONDS` 调整。超时或中断后,用相同挂载、账号和目标运行 `draft-watch <草稿 key>` 即可继续等待,无需再次调用模型。设为 `0` 时只保存草稿,需要另行启动等待命令。 + +重复运行复用原草稿;已有人工草稿或被人工修改的内容会触发停止,避免覆盖。等待程序允许正常的人工编辑,且不会把人工提交算成自动增量审查基准。 生命周期、并发限制、恢复方法及 Forgejo 时间线显示限制见 [草稿模式说明](docs/draft-review.md)。 diff --git a/docs/draft-review.md b/docs/draft-review.md index e1c5ced..1d3458e 100644 --- a/docs/draft-review.md +++ b/docs/draft-review.md @@ -108,7 +108,7 @@ use a Docker network shared with the service. ### Finish the review -The output contains `review-.md` (copyable AI summary), `review-.json` +The output contains `review-.md` (editable local AI summary), `review-.json` (target, immutable base/head, recommendation and formatted comments), and a private `.state/` directory. `OPENCODE_REVIEW_STATE_DIR` overrides the latter when explicitly configured; keep it persistent too. Files are created with @@ -129,8 +129,48 @@ docker run --rm --entrypoint cat \ 1. Open the returned `/pulls//files` page as the token's account. 2. Review/edit the pending line comments. -3. Copy the Markdown summary into the native review form; it is not prefilled. -4. Manually select Comment, Approve or Request Changes. +3. Keep the container running. Optionally add your own assessment in the native review form. +4. Select Comment, Approve or Request Changes. The runner detects submission and + automatically attaches the local Markdown summary as a separate PR comment. + It names the reviewed commit and review ID; it does not modify your native + review body, line comments or chosen verdict. No summary copying is needed. + +Before submitting, you can preview or edit `review-.md` locally. The watcher +reads that file after submission, then persists the exact publication intent. +It never publishes the summary while the review is PENDING. Its comment uses +the same token/account as the draft, and is labelled as an AI summary. + +### Waiting and recovery + +`DRAFT_WAIT_TIMEOUT_SECONDS` defaults to `3600` (one hour). On timeout the process +exits with an explicit incomplete-handoff error and preserves the pending review +and output. `0` explicitly saves without waiting, for separately scheduled +watchers. To resume, keep the original output mount, account and exact target: + +```bash +docker run --rm \ + -v "$(pwd)/review-output:/review-output" \ + -e GITEA_TOKEN -e GITEA_SERVER_URL \ + -e REPO_OWNER=your-org -e REPO_NAME=your-repo -e PR_NUMBER=123 \ + -e REVIEW_OUTPUT_DIR=/review-output \ + "${REVIEW_IMAGE:-ghcr.io/ccsert/opencode-review:latest}" \ + draft-watch +``` + +The key is printed when waiting starts. This command does not call a model or +create another review. It accepts human edits to pending comments and the native +review body. It refuses to publish for a changed base/head, wrong account, +deleted/dismissed review, or closed PR. Graceful interruption releases the local +lock; after a forced kill, establish that no process owns the lock before +removing its abandoned `draft-lock-*` directory. + +Publication intent is persisted before POST. A lost response is reconciled +through a unique comment marker; an unknown result is never retried as a write. +Preserve state and rerun `draft-watch` for another read-back. Once the comment ID +is confirmed, subsequent runs do not overwrite human edits or recreate a +manually deleted summary. This follow-up comment is separate from the native +review, so it may create an additional notification. The container must remain +running (or be resumed) to observe native submission. Drafts belong to an account, not to a team. A different ordinary collaborator cannot open the pending review. Site administrators have special access. Use @@ -167,7 +207,8 @@ ambiguous native results are not automatically recreated. Gitea 1.24.6 and Forgejo 17.0.0 may expose the body of a PENDING review through the issue timeline API. Therefore the model's summary is **never put in that body**. A non-sensitive handoff placeholder and opaque key are used instead; -AI findings stay in pending line comments and local exports. +Until the human submits, AI findings stay in pending line comments and local +exports. The automatic summary comment is created only after submission. On Gitea 1.24.6 the runtime removes only the exact placeholder timeline entry belonging to the new pending review. Its owner, review ID, type and exact body diff --git a/entrypoint.sh b/entrypoint.sh index 33d58e6..4f0b5bc 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -297,6 +297,16 @@ main() { exec bun "$runner" "$prompt" ;; + draft-watch) + infer_gitea_server_url + normalize_repo_context + local watcher="/app/.opencode-review/draft-watch.ts" + if [ ! -f "$watcher" ]; then + watcher="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/.opencode-review/draft-watch.ts" + fi + exec bun "$watcher" "$@" + ;; + shell|bash|sh) log_info "Starting interactive shell..." exec /bin/bash @@ -313,6 +323,7 @@ main() { echo "" echo "Commands:" echo " review [prompt] Run code review (default)" + echo " draft-watch KEY Resume automatic summary delivery after a human submits a draft (no model call)" echo " shell Start interactive shell" echo " version Show version" echo " help Show this help" @@ -338,6 +349,7 @@ main() { echo " REVIEW_LANGUAGE auto|en|zh-CN (default: auto)" echo " REVIEW_MODE submit|draft (default: submit). Draft saves PENDING; human submits." echo " REVIEW_OUTPUT_DIR Persistent draft output directory; mount it to retain summaries and state." + echo " DRAFT_WAIT_TIMEOUT_SECONDS Wait for human submission, then attach summary (default: 3600; 0 saves only)." echo " REVIEW_STYLE concise|balanced|thorough|security (default: balanced)" echo " REVIEW_TEMPLATE standard|concise|thorough|security|performance|compliance, or a path/URL" echo " (default: derived from REVIEW_STYLE)" diff --git a/tests/draft-summary.test.ts b/tests/draft-summary.test.ts new file mode 100644 index 0000000..6c1b422 --- /dev/null +++ b/tests/draft-summary.test.ts @@ -0,0 +1,154 @@ +import { afterEach, beforeEach, expect, test } from "bun:test" +import { mkdtemp, readFile, rm, writeFile } from "node:fs/promises" +import { tmpdir } from "node:os" +import { join } from "node:path" +import { GiteaClient, type Review } from "../.opencode-review/lib/gitea" +import { watchDraftSummary } from "../.opencode-review/lib/draft-summary" +import { digest, readJSON, writeJSON } from "../.opencode-review/lib/review-state" +import type { DraftRecord } from "../.opencode-review/lib/draft-review" + +const args = { owner: "owner", repo: "repo", pull_number: 1 } +const key = digest("test-draft") +let env: NodeJS.ProcessEnv +let directory: string +let server: ReturnType +let record: DraftRecord +let review: Review +let head: string +let ref: string +let posts: number +let loseResponse: boolean +let rejectPost: boolean +let comments: { id: number; user: { id: number }; body: string }[] +let pendingReads: number + +const watch = (options: Parameters[3] = {}) => + watchDraftSummary(new GiteaClient(), args, key, { timeoutMs: 200, pollMs: 5, ...options }) + +beforeEach(async () => { + env = { ...process.env } + directory = await mkdtemp(join(tmpdir(), "draft-summary-")) + head = ref = "head"; posts = 0; comments = []; loseResponse = rejectPost = false; pendingReads = 0 + review = { id: 42, user: { id: 7, login: "human" }, state: "PENDING", commit_id: "head", body: "Human edits" } + server = Bun.serve({ port: 0, fetch: async request => { + const path = new URL(request.url).pathname + if (path === "/api/v1/user") return Response.json({ id: 7 }) + if (path.endsWith("/reviews/42")) { pendingReads++; return Response.json(review) } + if (path.endsWith("/pulls/1")) return Response.json({ head: { sha: head }, base: { sha: "base" }, state: "open", merged: false }) + if (path.endsWith("/git/refs/pull/1/head")) return Response.json([{ ref: "refs/pull/1/head", object: { sha: ref } }]) + if (path.endsWith("/issues/1/comments")) { + if (request.method === "POST") { + posts++ + if (!rejectPost) comments.push({ id: 99, user: { id: 7 }, body: (await request.json() as any).body }) + if (loseResponse || rejectPost) return new Response("lost response", { status: 503 }) + return Response.json(comments.at(-1)) + } + return Response.json(comments) + } + throw new Error(`Unexpected request: ${request.method} ${path}`) + } }) + Object.assign(process.env, { GITEA_SERVER_URL: server.url.origin, GITEA_TOKEN: "test", REVIEW_OUTPUT_DIR: directory, + OPENCODE_REVIEW_STATE_DIR: join(directory, ".state"), REPO_OWNER: args.owner, REPO_NAME: args.repo, PR_NUMBER: "1" }) + delete process.env.OPENCODE_REVIEW_TARGET + record = { key, target: { server: server.url.origin, ...args }, userId: 7, head: "head", base: "base", + summary: "Private AI summary", comments: [], commentsDigest: "", recommendation: "comment", nativeBody: "placeholder", reviewId: 42 } + await writeJSON(join(directory, ".state", `draft-${key}.json`), record) + await writeFile(join(directory, `review-${key}.md`), record.summary) +}) +afterEach(async () => { + server.stop(true) + await rm(directory, { recursive: true, force: true }) + for (const name of Object.keys(process.env)) if (!(name in env)) delete process.env[name] + Object.assign(process.env, env) +}) + +test("waits privately for native submission, then attaches exactly one summary without changing human content", async () => { + const completed = watch() + while (!pendingReads) await Bun.sleep(1) + expect(posts).toBe(0) + expect(comments).toHaveLength(0) + review.state = "COMMENT" + expect(await completed).toContain("#issuecomment-99") + expect(comments[0].body).toContain(record.summary) + expect(comments[0].body).toContain("review `42`") + expect(review.body).toBe("Human edits") + expect(posts).toBe(1) + await watch() + expect(posts).toBe(1) +}) +test("reads the locally edited summary automatically after submission", async () => { + await writeFile(join(directory, `review-${key}.md`), "Edited local summary") + review.state = "APPROVED" + await watch() + expect(comments[0].body).toContain("Edited local summary") + expect(comments[0].body).not.toContain("Private AI summary") +}) +test("timeout preserves the draft and a later invocation resumes without a model call", async () => { + await expect(watch({ timeoutMs: 5 })).rejects.toThrow("DRAFT_WAIT_TIMEOUT") + expect(posts).toBe(0) + review.state = "REQUEST_CHANGES" + await watch() + expect(posts).toBe(1) +}) +test("lost POST response reconciles a successful comment without another POST", async () => { + review.state = "COMMENT"; loseResponse = true + await watch(); await watch() + expect(posts).toBe(1) +}) +test("ambiguous failed POST persists intent and never retries a write after restart", async () => { + review.state = "COMMENT"; rejectPost = true + await expect(watch()).rejects.toThrow("DRAFT_SUMMARY_UNKNOWN") + rejectPost = false + await expect(watch()).rejects.toThrow("DRAFT_SUMMARY_UNKNOWN") + expect(posts).toBe(1) + expect((await readJSON(join(directory, ".state", `draft-${key}.json`)))!.summaryPublication?.body).toContain(record.summary) +}) +test("reconciles a crash after POST but before saving the comment ID", async () => { + review.state = "COMMENT"; await watch() + const statePath = join(directory, ".state", `draft-${key}.json`) + const saved = (await readJSON(statePath))! + delete saved.summaryPublication!.commentId + await writeJSON(statePath, saved) + await watch() + expect(posts).toBe(1) +}) +test("does not recreate or overwrite a summary the human edited or deleted after publication", async () => { + review.state = "COMMENT"; await watch() + comments[0].body = "Human revised the published summary" + await watch() + expect(comments[0].body).toBe("Human revised the published summary") + comments = []; await watch() + expect(posts).toBe(1) +}) +for (const change of ["head", "ref", "owner", "review-commit", "dismissed", "state", "target", "account"]) { + test(`blocks stale or mismatched ${change} before publication`, async () => { + review.state = "COMMENT" + if (change === "head") head = "new-head" + if (change === "ref") ref = "new-head" + if (change === "owner") review.user.id = 8 + if (change === "review-commit") review.commit_id = "new-head" + if (change === "dismissed") review.dismissed = true + if (change === "state") review.state = "INVALID" + if (change === "target") record.target.repo = "other" + if (change === "account") record.userId = 8 + await writeJSON(join(directory, ".state", `draft-${key}.json`), record) + await expect(watch()).rejects.toThrow() + expect(posts).toBe(0) + }) +} +test("empty summary is never published", async () => { + review.state = "COMMENT"; await writeFile(join(directory, `review-${key}.md`), " ") + await expect(watch()).rejects.toThrow("DRAFT_SUMMARY_EMPTY") + expect(posts).toBe(0) +}) +test("concurrent watchers serialize; cancellation releases the lock for resumption", async () => { + const controller = new AbortController() + const first = watch({ signal: controller.signal }) + while (!pendingReads) await Bun.sleep(1) + await expect(watch()).rejects.toThrow("DRAFT_BUSY") + controller.abort(new Error("Stopped")) + await expect(first).rejects.toThrow("Stopped") + review.state = "COMMENT"; await watch() + expect(posts).toBe(1) + expect(await readFile(join(directory, `review-${key}.md`), "utf8")).toBe(record.summary) +}) diff --git a/tests/integration/model-smoke.ts b/tests/integration/model-smoke.ts index 46a2888..ffb4a2f 100644 --- a/tests/integration/model-smoke.ts +++ b/tests/integration/model-smoke.ts @@ -71,23 +71,48 @@ for (const lab of await labs()) { ...(process.platform === "linux" ? ["--add-host", "host.docker.internal:host-gateway"] : []), "-v", `${resolve(configPath)}:/app/.opencode-review/opencode.json:ro`, "-v", `${resolve(workspace)}:/workspace:ro`, - ...(draft ? ["-v", `${output}:/review-output`, "-e", "REVIEW_MODE=draft", "-e", "REVIEW_OUTPUT_DIR=/review-output"] : []), + ...(draft ? ["-v", `${output}:/review-output`, "-e", "REVIEW_MODE=draft", "-e", "REVIEW_OUTPUT_DIR=/review-output", "-e", "DRAFT_WAIT_TIMEOUT_SECONDS=30"] : []), "-e", "GITEA_TOKEN", "-e", `GITEA_SERVER_URL=http://${lab.name}:3000`, "-e", "MODEL=review-test/review", "-e", "OPENCODE_REFRESH_MODELS=false", "-e", "OPENAI_API_KEY=local-fixture", "-e", `PR_NUMBER=${f.args.pull_number}`, "-e", `REPO_OWNER=${f.args.owner}`, "-e", `REPO_NAME=${f.args.repo}`, image, "review"], { stdout: "pipe", stderr: "pipe", env: { ...process.env, GITEA_TOKEN: lab.botToken } }) + let humanSubmitted = false + const collectOutput = async () => { + let text = "" + for await (const chunk of processHandle.stdout) { + text += new TextDecoder().decode(chunk, { stream: true }) + if (draft && !humanSubmitted && text.includes("Waiting for reviewer to submit:")) { + const actor = { ...lab, adminToken: lab.botToken } + const review = (await api(actor, `${f.path}/reviews`))[0] + const other = { ...lab, adminToken: lab.humanToken } + const timeline = await api(other, `${f.path.replace("/pulls/", "/issues/")}/timeline`) + if (review?.state !== "PENDING" || JSON.stringify(timeline).includes("Deterministic local model integration")) { + throw new Error(`${lab.name}: draft was not private before human submission`) + } + // Deterministic harness simulates the human's native Submit action. + // Browser acceptance separately exercises the real native UI. + await api(actor, `${f.path}/reviews/${review.id}`, { event: "COMMENT", body: "Human final assessment" }) + humanSubmitted = true + } + } + return text + } const [status, stdout, stderr] = await Promise.all([processHandle.exited, - new Response(processHandle.stdout).text(), new Response(processHandle.stderr).text()]) + collectOutput(), new Response(processHandle.stderr).text()]) await writeFile(join(directory, `model-${lab.name}${draft ? "-draft" : ""}.log`), stdout + stderr) if (status !== 0) throw new Error(`${lab.name} OpenCode exited ${status}: ${(stdout + stderr).slice(-3500)}`) const actor = draft ? { ...lab, adminToken: lab.botToken } : lab const reviews = await api(actor, `${f.path}/reviews`) if (reviews.length !== 1 || reviews[0].commit_id !== f.head || reviews[0].comments_count !== 1 || calls.filter(name => name === "gitea-pr-diff").length < 2 || !calls.includes("gitea-review") || !stdout.includes(draft ? "Verified draft:" : "Verified review:") || leakedProjectInstructions || - (draft && (reviews[0].state !== "PENDING" || reviews[0].body.includes("Deterministic local model integration")))) { + (draft && (!humanSubmitted || reviews[0].state !== "COMMENT" || reviews[0].body !== "Human final assessment" || !stdout.includes("AI summary attached:")))) { throw new Error(`${lab.name}: missing tool dispatch, review, line comment or verified receipt`) } if (draft) { + const summaries = await api(actor, `${f.path.replace("/pulls/", "/issues/")}/comments`) + if (summaries.length !== 1 || !summaries[0].body.includes("Deterministic local model integration")) { + throw new Error(`${lab.name}: summary did not appear automatically after native submission`) + } const { readdir } = await import("node:fs/promises") const markdown = (await readdir(output)).find(name => name.endsWith(".md")) if (!markdown) throw new Error("Missing persisted draft summary") @@ -99,7 +124,7 @@ for (const lab of await labs()) { throw new Error("Missing persisted draft summary") } } - console.log(`${lab.name}: real OpenCode → production tools → ${draft ? "PENDING draft" : "review"} #${reviews[0].id} → verified receipt PASS`) + console.log(`${lab.name}: real OpenCode → production tools → ${draft ? "PENDING → human submission → automatic summary" : "review"} #${reviews[0].id} → verified receipt PASS`) console.log(` ${lab.url}/${f.args.owner}/${f.args.repo}/pulls/${f.args.pull_number}`) } finally { model.stop(true) } } diff --git a/tests/integration/review.integration.test.ts b/tests/integration/review.integration.test.ts index e4aa275..322f457 100644 --- a/tests/integration/review.integration.test.ts +++ b/tests/integration/review.integration.test.ts @@ -8,6 +8,8 @@ import diffTool from "../../.opencode-review/tools/gitea-pr-diff" import incrementalTool from "../../.opencode-review/tools/gitea-incremental-diff" import reviewTool from "../../.opencode-review/tools/gitea-review" import filesTool from "../../.opencode-review/tools/gitea-pr-files" +import { GiteaClient } from "../../.opencode-review/lib/gitea" +import { watchDraftSummary } from "../../.opencode-review/lib/draft-summary" const context = () => ({ sessionID: crypto.randomUUID(), messageID: "integration", agent: "code-review", abort: new AbortController().signal, metadata() {}, async ask() {} }) @@ -65,6 +67,34 @@ function proxyFor(lab: Lab, fault: (request: Request, response: Response) => Pro for (const lab of await labs()) { describe(lab.name, () => { + test("native human submission automatically receives its local summary once, preserving human edits", async () => { + const f = await fixture(lab); configure(lab) + process.env.REVIEW_MODE = "draft"; process.env.REVIEW_OUTPUT_DIR = join(state!, "output") + const receiptPath = join(state!, "receipt.json"); process.env.OPENCODE_REVIEW_RECEIPT_PATH = receiptPath + const ctx = context(); await fetchDiff(f.args, ctx); await submit(f.args, ctx) + const receipt = await Bun.file(receiptPath).json() + const actor = { ...lab, adminToken: lab.botToken } + const other = { ...lab, adminToken: lab.humanToken } + const completed = watchDraftSummary(new GiteaClient(), f.args, receipt.draftKey, { timeoutMs: 5000, pollMs: 20 }) + await Bun.sleep(60) + expect(await api(other, `${f.path.replace("/pulls/", "/issues/")}/comments`)).toHaveLength(0) + expect((await api(actor, `${f.path}/reviews/${receipt.reviewId}`)).state).toBe("PENDING") + await Bun.write(receipt.artifacts.markdown, "Human refined local AI summary") + const line = (await api(actor, `${f.path}/reviews/${receipt.reviewId}/comments`))[0] + const repo = f.path.slice(0, f.path.lastIndexOf("/pulls/")) + await api(actor, `${repo}/issues/comments/${line.id}`, { body: "Human refined line comment" }, "PATCH") + await api(actor, `${f.path}/reviews/${receipt.reviewId}`, { event: "COMMENT", body: "My additional human assessment" }) + expect(await completed).toContain("#issuecomment-") + const summaries = await api(other, `${f.path.replace("/pulls/", "/issues/")}/comments`) + expect(summaries).toHaveLength(1) + expect(summaries[0].body).toContain("Human refined local AI summary") + expect(summaries[0].body).toContain(`review \`${receipt.reviewId}\``) + expect((await api(actor, `${f.path}/reviews/${receipt.reviewId}`)).body).toBe("My additional human assessment") + expect((await api(actor, `${f.path}/reviews/${receipt.reviewId}/comments`))[0].body).toBe("Human refined line comment") + await watchDraftSummary(new GiteaClient(), f.args, receipt.draftKey) + expect(await api(other, `${f.path.replace("/pulls/", "/issues/")}/comments`)).toHaveLength(1) + }, 30000) + test("draft exports private summary, hides line comments and reuses the same pending review", async () => { const f = await fixture(lab); configure(lab) process.env.REVIEW_MODE = "draft"; process.env.REVIEW_OUTPUT_DIR = join(state!, "output") diff --git a/tests/review-startup.test.ts b/tests/review-startup.test.ts index a8f00ac..802cb0f 100644 --- a/tests/review-startup.test.ts +++ b/tests/review-startup.test.ts @@ -130,15 +130,28 @@ test("Docker version does not refresh models", () => { expect(result.invocations.map(call => call.args)).toEqual([["--version"]]) }) -test("Docker draft mode freezes delivery and accepts a verified saved draft receipt", () => { +test("Docker draft mode freezes delivery and can explicitly save without waiting", () => { const result = runReview([join(root, "entrypoint.sh"), "review"], { env: { - REVIEW_MODE: "draft", TEST_DRAFT_RECEIPT: "true", TEST_RECEIPT_STATUS: "draft_saved", + REVIEW_MODE: "draft", TEST_DRAFT_RECEIPT: "true", TEST_RECEIPT_STATUS: "draft_saved", DRAFT_WAIT_TIMEOUT_SECONDS: "0", } }) expect(result.status).toBe(0) expect(result.invocations.at(-1).mode).toBe("draft") expect(result.invocations.at(-1).output).toBe(result.directory) expect(result.invocations.at(-1).args.at(-1)).toContain("Delivery mode: draft") expect(result.stdout).toContain("Verified draft:") + expect(result.stdout).toContain("Draft saved without waiting") +}) +test("invalid draft wait configuration fails before starting the model", () => { + const result = runReview([join(root, "entrypoint.sh"), "review"], { env: { REVIEW_MODE: "draft", DRAFT_WAIT_TIMEOUT_SECONDS: "-1" } }) + expect(result.status).toBe(1) + expect(result.invocations.some(call => call.args[0] === "run")).toBe(false) +}) +test("the default draft handoff requires persisted state instead of trusting a receipt alone", () => { + const result = runReview([join(root, "entrypoint.sh"), "review"], { env: { + REVIEW_MODE: "draft", TEST_DRAFT_RECEIPT: "true", TEST_RECEIPT_STATUS: "draft_saved", + } }) + expect(result.status).toBe(1) + expect(result.stderr).toContain("DRAFT_STATE_REQUIRED") }) test("a published receipt cannot certify draft mode", () => { const result = runReview([join(root, "entrypoint.sh"), "review"], { env: { REVIEW_MODE: "draft" } }) From f9da76ce3727c93ce68b49e5efc24b436584aa2d Mon Sep 17 00:00:00 2001 From: ccsert Date: Sat, 24 Oct 2026 15:41:14 +0800 Subject: [PATCH 2/3] docs: show automatic draft summary handoff and editing limits --- README.md | 4 ++ README_zh.md | 2 + docs/draft-review-validation.md | 36 ++++++++++++++++++ docs/draft-review.md | 5 +++ .../draft-review/summary-after-submit.png | Bin 0 -> 87039 bytes .../draft-review/summary-empty-form.png | Bin 0 -> 83885 bytes 6 files changed, 47 insertions(+) create mode 100644 docs/images/draft-review/summary-after-submit.png create mode 100644 docs/images/draft-review/summary-empty-form.png diff --git a/README.md b/README.md index fab95a0..3aa6761 100644 --- a/README.md +++ b/README.md @@ -406,6 +406,10 @@ or interruption, use the same output mount, account and target with `draft-watch ` to resume without calling the model again. Setting the timeout to `0` saves without waiting and requires that separate watcher command. +Editing/deleting line comments does not regenerate the summary. Preview or +edit the local Markdown when your changes affect its conclusions; that file +is what the watcher publishes after submission. + Repeated draft runs reuse the original review. Manual edits and existing pending reviews are preserved; conflicts stop the run. A manually submitted draft is acknowledged without becoming an automatic incremental-review baseline. diff --git a/README_zh.md b/README_zh.md index 0c57f8b..1174923 100644 --- a/README_zh.md +++ b/README_zh.md @@ -389,6 +389,8 @@ docker run --rm \ 重复运行复用原草稿;已有人工草稿或被人工修改的内容会触发停止,避免覆盖。等待程序允许正常的人工编辑,且不会把人工提交算成自动增量审查基准。 +修改或删除行评论不会自动重写总结。总结的预览、编辑目前通过本地 Markdown 完成;如果人工修改影响总结中的结论,请同步修改该文件,提交后会自动发布它。 + 生命周期、并发限制、恢复方法及 Forgejo 时间线显示限制见 [草稿模式说明](docs/draft-review.md)。 ### 本地测试(源码) diff --git a/docs/draft-review-validation.md b/docs/draft-review-validation.md index afd10da..8868d90 100644 --- a/docs/draft-review-validation.md +++ b/docs/draft-review-validation.md @@ -5,6 +5,42 @@ This is the local acceptance record for the implementation proposed in on 2026-10-24. See [the usage guide](draft-review.md) for Docker commands, custom model configuration and recovery instructions. +## Automatic summary handoff + +The current flow removes the copy/paste step from the original acceptance +below. Keep the container running, edit the pending line comments, then submit +through the native review form. The form can be empty: the trusted runner +observes the submitted review and automatically adds the local summary as a +separate PR comment, identifying the review and captured commit. + +![Native review form left empty before submission](images/draft-review/summary-empty-form.png) + +![AI summary automatically attached after native submission](images/draft-review/summary-after-submit.png) + +Both Gitea 1.24.6 and Forgejo 17.0.0 were exercised with a clean Dockerfile build +and OpenCode 1.19.4. A real MiniMax run on each platform created the pending +comments. Browser submission left the native summary form empty; API read-back +confirmed an empty submitted review body and one follow-up summary matching +the local export. Separate API tests preserved edited native review text and +line comments, and repeated watching did not add a second summary. + +The local regression suite passed 161 tests (401 assertions); the two-server +API suite passed 50 tests (268 assertions). Container checks used real OpenCode +tool dispatch and a deterministic model protocol fixture for both submit mode +and draft-to-human-submission-to-summary delivery. Those protocol checks do not +measure model quality. The real-model/browser run is a separate evidence layer. + +Waiting defaults to one hour and resumes with `draft-watch ` using the +same output mount, account and PR, without another model call. Pending comments +remain private to their owner under the tested ordinary-account permissions; +the summary is not published until submission. The existing Forgejo placeholder +timeline limitation still applies. + +Editing line comments does not regenerate the summary; preview/edit its local +Markdown if those changes affect the conclusions. The sections below record +the original manual-summary handoff, including its historical test counts and +build limitations. They are not the current usage instructions. + ## What the reviewer sees The demo used a private test repository with three identical PR diffs. An diff --git a/docs/draft-review.md b/docs/draft-review.md index 1d3458e..248b03e 100644 --- a/docs/draft-review.md +++ b/docs/draft-review.md @@ -140,6 +140,11 @@ reads that file after submission, then persists the exact publication intent. It never publishes the summary while the review is PENDING. Its comment uses the same token/account as the draft, and is labelled as an AI summary. +Editing or deleting a pending line comment does not regenerate the summary. +The watcher publishes the original or locally edited Markdown; review that +file too when your changes affect its conclusions. Summary preview/editing is +currently through the local file, not a prefilled native review form. + ### Waiting and recovery `DRAFT_WAIT_TIMEOUT_SECONDS` defaults to `3600` (one hour). On timeout the process diff --git a/docs/images/draft-review/summary-after-submit.png b/docs/images/draft-review/summary-after-submit.png new file mode 100644 index 0000000000000000000000000000000000000000..ebf577dbe313a9ce8239ac10755b7a885eb12851 GIT binary patch literal 87039 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 *jq}3xST66#Q$LN`{hgkXiXCSQ(!V{ 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

cu&M4uo0=aINn7}^d%dxXw~e}AYC{#cABmcR zhZDmP+)5$Z^OqkDn}l(QavJF|jAw*ZO7ONj)o?Inb?_q#-H%eDUX}hdir@|(c~(x2 z7d6_{YA5hLApZEe`qlHV2`&F~%*cPo#qdrCn^KWWxWeu2=NC=}j?qd-)4r@~Mt8C5 zCcVtltp}q08f$~ajQgQk!_6-;!#?fRB<>a;zAoZ#m|`ls(>KNKruHKy{wfd9eU`3< zFB>)Xee`t3rutK*$KPb5f0Lnd>xLsEHmhL^>HYL}S6S`9{B>dj1>ficl|&nv`DBP1 z$e^>@*-VoQ@zkUm_E2eKX^>l{yTHW{Df)lBb`O*0o=pwlq;-^>OKce+M4zHRKWNhWZe_< z1G$H3z_c==td0w7-%GJvukwydX_tq#=%^tYm?k+J6p8wE^;1+UYlhF-;SUdEqyMNG zkhCDwxF`h)E=>$_?F4K}6d}kF-SaKHN`2{YotROm!q5uIK~yMa-mjuFy+zd0^G>N% zkUi5@&&H(=;$~fat+aO@1MxB68%F7;1igT5#`YJdNYLSnF?8@H#?Dm%EqDE|&V25sSH^<;XA3sIRlw8P1S#Wqsla3eC{uHZC zcjA7Fz0(S7DmlgAHOQ-i4}qugf`hOboUvVSR>)SX)dPBF8{hq|r!LuOA0DJJJ?@Ik z@4CXZX4qAZIT3RcG-$O5-e>8FZ%1)_cTm@YEzt_}k)6@nlg~B%Zie#KYrvLU{R5tM z+Lk#dfmbwqfY&_evf6nlMevGplhxD z2&jmSd@}=lzSv%RsCU`>y%y+MNtME=ww*>le&v^fZ}8%jN#j3o>pQMR%#e0zbMpO% z{5a0v^kOj{!|2$*$#&i1)d{~9NZ79!UMH6Ii9ZkW+M9YT@-n*AXZbn|B|k!9c&F&| z$Un)EDqxNRZPfg1`WNM5q9@+b+ReU+9K@LoyF+ulO}Z0*;%ra41SpI)=Bu zL3dqcHdni6N6}A?{6w@!ZBmG?cbi;JFjJEYocg)jy`RMyneFPpHC;q@yy6vfI2Rzn z8Br-9Z&Khz=K6=7cf}@#acK)@_5CMJY+31}ITU3rh-6@!M*122UgU-ZvIBm3>>Fu$ zN>w;vdb?v*nPLiz%7$jvbA9)XotTmHdi4gxJ~}S1HX}BhtJzQ_`;gxiLDw>45*a4! z64;s+cq3uvg_CPDUB4H*PN;XvSz6VOn#q9Q$5^-0sj0J!scPprrL%kT6CGyN(Y3&a zfD|M=#y`I8U<_=frs5w#<*B>9JQ=ISmQY9K+`-fO>d^)c=|@tUvS4Bzw_ zm+=X(woifoJaJhg?S{%TM#gK5Br@;+>)VafOYIN8^Ubz@<=^i6PYiGWmu;{9nQTNp zXpNE4-u3^kU5exXL)ED=6@@APP2O(w*#0XFIQq|?`H$D#IE^^ zadIsl)n@-q=6#P?Gk^L%#L-qFq%S|8*%?rX^!vTccz`{RHR?T2{D>8DeH-TbhjYe@ zLy7~^gCdOE(+-L&2(@jJ&R5f6Kv!#)*c`9tU1GNjmicU-$^r^^Tf9$2qy6o)%<^mo zJNb$enakK>@{CHWWP=Z{HBsv}>Ci@YyvkD+^3>pncd9nT)L3PkTi7qt@iWQF(pxo( zzDS1~_TBEB#E<4$9L-}|`Tc|(_d8oV6@rv2)a7ruSo!VU2GfQl+-*xNm5djJYD_WD z3Ru_!2E{#pFBX$g&Ba&H@%$X?x7eHg?8?o3KSU zZ}8%&!&uSO`#zq=-AFme$L2A}{KF|uD6qe{%Vmgo&ODkYkYc3TtFiKlK6|ljm9oxuy)w!-QNQ^wo;5GNpAz0BwSqE|LI8idu z|APH_Ev&?-XL-7}{jKD4!LVKc#fIgAiV=ZnoR*o>5p70Psyn zAOOoV$Q%>|oVE*I@|_{4pZL3Inm> zyQeS@5zG!~8$OC-jcn8IvTV5%9sLK(*rlz(B~V~u)$_eN#cBq4v2R1wK9fu%PTC-4-~gi* z#Ooc$lbW^kgB_Ui6>7Ir?VXuG|Ett3Lq^8`Da-O-ES1iGV%-ZC_hspa3g1=VE)Y8h bjrm_qKCCO<31(yq`!8?&w@eP@-xL1}0R-}^ literal 0 HcmV?d00001 diff --git a/docs/images/draft-review/summary-empty-form.png b/docs/images/draft-review/summary-empty-form.png new file mode 100644 index 0000000000000000000000000000000000000000..7ec0ea3e08ef39ac4171e0c5356069a9b85b06f7 GIT binary patch literal 83885 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 literal 0 HcmV?d00001 From fcd514afd3b3c1c61088406b53ddc9c4ee3223be Mon Sep 17 00:00:00 2001 From: ccsert Date: Sat, 24 Oct 2026 15:43:58 +0800 Subject: [PATCH 3/3] fix: cancel draft watcher requests without losing recovery state --- .opencode-review/lib/draft-summary.ts | 13 +++++++------ .opencode-review/lib/gitea.ts | 11 ++++++----- docs/draft-review-validation.md | 6 +++++- tests/draft-summary.test.ts | 21 +++++++++++++++++++-- tests/gitea-client.test.ts | 18 ++++++++++++++++++ 5 files changed, 55 insertions(+), 14 deletions(-) diff --git a/.opencode-review/lib/draft-summary.ts b/.opencode-review/lib/draft-summary.ts index 90ca010..51ae6b3 100644 --- a/.opencode-review/lib/draft-summary.ts +++ b/.opencode-review/lib/draft-summary.ts @@ -19,7 +19,8 @@ export async function watchDraftSummary(api: GiteaClient, args: RepositoryPR, ke const timeout = options.timeoutMs ?? draftWaitSeconds() * 1000 const recordPath = join(stateDirectory(), `draft-${key}.json`) const target = receiptTarget(api.baseURL, args) - const user = await api.json<{ id: number }>("/user") + const requestOptions = { signal: options.signal } + const user = await api.json<{ id: number }>("/user", requestOptions) const lock = join(stateDirectory(), `draft-lock-${digest(JSON.stringify([target, user.id]))}`) await mkdir(stateDirectory(), { recursive: true, mode: 0o700 }) try { await mkdir(lock, { mode: 0o700 }) } @@ -37,14 +38,14 @@ export async function watchDraftSummary(api: GiteaClient, args: RepositoryPR, ke const commentsPath = `${path.slice(0, path.lastIndexOf("/pulls/"))}/issues/${args.pull_number}/comments` const marker = `` async function currentReview() { - const review = await api.json(`${path}/reviews/${record!.reviewId}`) + const review = await api.json(`${path}/reviews/${record!.reviewId}`, requestOptions) if (review.user.id !== user.id || review.commit_id !== record!.head || review.dismissed || !["PENDING", "COMMENT", "APPROVED", "REQUEST_CHANGES"].includes(review.state)) { throw new Error("DRAFT_CHANGED: Review owner, commit, dismissal or state changed; no summary published") } - const pr = await api.json(path) + const pr = await api.json(path, requestOptions) requireOpen(pr) - if (pr.head.sha !== record!.head || pr.base.sha !== record!.base || await pullRefHead(api, args) !== record!.head) { + if (pr.head.sha !== record!.head || pr.base.sha !== record!.base || await pullRefHead(api, args, requestOptions) !== record!.head) { throw new PRChangedError("The draft snapshot is stale; no summary published") } return review @@ -71,7 +72,7 @@ export async function watchDraftSummary(api: GiteaClient, args: RepositoryPR, ke return url(record.summaryPublication.commentId) } const findPublished = async () => { - const matches = (await api.list(commentsPath)).filter(comment => comment.user.id === user.id && comment.body.includes(marker)) + const matches = (await api.list(commentsPath, requestOptions)).filter(comment => comment.user.id === user.id && comment.body.includes(marker)) if (matches.length > 1) throw new Error("DRAFT_SUMMARY_AMBIGUOUS: Multiple matching summary comments; no further write") return matches[0] } @@ -89,7 +90,7 @@ export async function watchDraftSummary(api: GiteaClient, args: RepositoryPR, ke // back this marker; it must never repeat a potentially successful write. await writeJSON(recordPath, record) try { - await api.request(commentsPath, { method: "POST", body: JSON.stringify({ body: record.summaryPublication.body }) }) + await api.request(commentsPath, { ...requestOptions, method: "POST", body: JSON.stringify({ body: record.summaryPublication.body }) }) } catch { /* Reconcile an accepted POST even if its response was lost. */ } published = await findPublished() } diff --git a/.opencode-review/lib/gitea.ts b/.opencode-review/lib/gitea.ts index 5a09b77..dcb3511 100644 --- a/.opencode-review/lib/gitea.ts +++ b/.opencode-review/lib/gitea.ts @@ -80,7 +80,8 @@ export class GiteaClient { if (options.body) headers.set("Content-Type", "application/json") // Never automatically retry a write: a lost response does not imply a failed write. const response = await fetch(`${this.baseURL}/api/v1${endpoint}`, { - ...options, headers, signal: options.signal ?? AbortSignal.timeout(timeoutMs()), + ...options, headers, signal: options.signal + ? AbortSignal.any([options.signal, AbortSignal.timeout(timeoutMs())]) : AbortSignal.timeout(timeoutMs()), }) if (!response.ok) { const detail = (await response.text()).slice(0, 1000) @@ -106,10 +107,10 @@ export class GiteaClient { return response.text() } - async list(endpoint: string): Promise { + async list(endpoint: string, options?: RequestInit): Promise { const result: T[] = [] for (let page = 1; page <= 1000; page++) { - const response = await this.request(`${endpoint}${endpoint.includes("?") ? "&" : "?"}limit=50&page=${page}`) + const response = await this.request(`${endpoint}${endpoint.includes("?") ? "&" : "?"}limit=50&page=${page}`, options) const rows = await response.json() as T[] if (!Array.isArray(rows)) throw new Error(`Expected a list from ${endpoint}`) result.push(...rows) @@ -143,10 +144,10 @@ export function prPath(pr: RepositoryPR) { return `/repos/${encodeURIComponent(pr.owner)}/${encodeURIComponent(pr.repo)}/pulls/${pr.pull_number}` } -export async function pullRefHead(api: GiteaClient, args: RepositoryPR): Promise { +export async function pullRefHead(api: GiteaClient, args: RepositoryPR, options?: RequestInit): Promise { const path = prPath(args) const refs = await api.json<{ ref: string; object: { sha: string } }[]>( - `${path.slice(0, path.lastIndexOf("/pulls/"))}/git/refs/pull/${args.pull_number}/head`) + `${path.slice(0, path.lastIndexOf("/pulls/"))}/git/refs/pull/${args.pull_number}/head`, options) return refs.find(ref => ref.ref === `refs/pull/${args.pull_number}/head`)?.object.sha } diff --git a/docs/draft-review-validation.md b/docs/draft-review-validation.md index 8868d90..5d456a2 100644 --- a/docs/draft-review-validation.md +++ b/docs/draft-review-validation.md @@ -24,12 +24,16 @@ confirmed an empty submitted review body and one follow-up summary matching the local export. Separate API tests preserved edited native review text and line comments, and repeated watching did not add a second summary. -The local regression suite passed 161 tests (401 assertions); the two-server +The local regression suite passed 163 tests (404 assertions); the two-server API suite passed 50 tests (268 assertions). Container checks used real OpenCode tool dispatch and a deterministic model protocol fixture for both submit mode and draft-to-human-submission-to-summary delivery. Those protocol checks do not measure model quality. The real-model/browser run is a separate evidence layer. +Review follow-up also verified cancellation during an in-flight API request: +the watcher promptly releases its lock for resumption, while per-request timeouts +remain enforced alongside the cancellation signal. + Waiting defaults to one hour and resumes with `draft-watch ` using the same output mount, account and PR, without another model call. Pending comments remain private to their owner under the tested ordinary-account permissions; diff --git a/tests/draft-summary.test.ts b/tests/draft-summary.test.ts index 6c1b422..821734a 100644 --- a/tests/draft-summary.test.ts +++ b/tests/draft-summary.test.ts @@ -21,6 +21,7 @@ let loseResponse: boolean let rejectPost: boolean let comments: { id: number; user: { id: number }; body: string }[] let pendingReads: number +let stallReview: boolean const watch = (options: Parameters[3] = {}) => watchDraftSummary(new GiteaClient(), args, key, { timeoutMs: 200, pollMs: 5, ...options }) @@ -28,12 +29,16 @@ const watch = (options: Parameters[3] = {}) => beforeEach(async () => { env = { ...process.env } directory = await mkdtemp(join(tmpdir(), "draft-summary-")) - head = ref = "head"; posts = 0; comments = []; loseResponse = rejectPost = false; pendingReads = 0 + head = ref = "head"; posts = 0; comments = []; loseResponse = rejectPost = false; pendingReads = 0; stallReview = false review = { id: 42, user: { id: 7, login: "human" }, state: "PENDING", commit_id: "head", body: "Human edits" } server = Bun.serve({ port: 0, fetch: async request => { const path = new URL(request.url).pathname if (path === "/api/v1/user") return Response.json({ id: 7 }) - if (path.endsWith("/reviews/42")) { pendingReads++; return Response.json(review) } + if (path.endsWith("/reviews/42")) { + pendingReads++ + if (stallReview) await Bun.sleep(1000) + return Response.json(review) + } if (path.endsWith("/pulls/1")) return Response.json({ head: { sha: head }, base: { sha: "base" }, state: "open", merged: false }) if (path.endsWith("/git/refs/pull/1/head")) return Response.json([{ ref: "refs/pull/1/head", object: { sha: ref } }]) if (path.endsWith("/issues/1/comments")) { @@ -152,3 +157,15 @@ test("concurrent watchers serialize; cancellation releases the lock for resumpti expect(posts).toBe(1) expect(await readFile(join(directory, `review-${key}.md`), "utf8")).toBe(record.summary) }) +test("cancellation aborts an in-flight API read and releases the lock promptly", async () => { + stallReview = true + const controller = new AbortController() + const first = watch({ signal: controller.signal, timeoutMs: 2000 }) + while (!pendingReads) await Bun.sleep(1) + controller.abort(new Error("Stopped during API read")) + await expect(Promise.race([first, Bun.sleep(250).then(() => { throw new Error("Cancellation did not stop the API request") })])) + .rejects.toThrow("Stopped during API read") + stallReview = false; review.state = "COMMENT" + await watch() + expect(posts).toBe(1) +}) diff --git a/tests/gitea-client.test.ts b/tests/gitea-client.test.ts index a186e92..b9f2020 100644 --- a/tests/gitea-client.test.ts +++ b/tests/gitea-client.test.ts @@ -24,3 +24,21 @@ test("production API client reads every review page", async () => { if (oldToken === undefined) delete process.env.GITEA_TOKEN; else process.env.GITEA_TOKEN = oldToken } }) + +test("a caller cancellation signal does not disable the API request timeout", async () => { + const previous = { ...process.env } + const server = Bun.serve({ port: 0, async fetch() { await Bun.sleep(1000); return Response.json([]) } }) + try { + process.env.GITEA_SERVER_URL = server.url.origin + process.env.GITEA_TOKEN = "test-token" + process.env.GITEA_API_TIMEOUT_MS = "20" + delete process.env.OPENCODE_REVIEW_TARGET + const request = new GiteaClient().list("/reviews", { signal: new AbortController().signal }) + await expect(Promise.race([request, Bun.sleep(250).then(() => { throw new Error("Timeout was disabled") })])) + .rejects.toThrow(/timeout|timed out/i) + } finally { + server.stop(true) + for (const name of Object.keys(process.env)) if (!(name in previous)) delete process.env[name] + Object.assign(process.env, previous) + } +})