diff --git a/.specgit.yaml b/.specgit.yaml index 938528e25..7052e1e8c 100644 --- a/.specgit.yaml +++ b/.specgit.yaml @@ -1,8 +1,8 @@ version: 1 -delivery: issue409 +delivery: issue410 context: kind: branch - branch: feat/409-issue409 + branch: feat/410-issue410 issues: - - 409 -pr: 411 + - 410 +pr: 422 diff --git a/packages/opencode/src/dag/review-lifecycle.ts b/packages/opencode/src/dag/review-lifecycle.ts index b33c19dec..d94218287 100644 --- a/packages/opencode/src/dag/review-lifecycle.ts +++ b/packages/opencode/src/dag/review-lifecycle.ts @@ -133,7 +133,7 @@ export function validateReviewResult(output: unknown, currentFingerprint: string : ["review result verdict must be ACCEPT or REJECT"]), ...(reviewedFingerprint.trim() === "" ? ["review result must include implementation_fingerprint"] - : reviewedFingerprint === currentFingerprint + : reviewedFingerprint.trim() === currentFingerprint.trim() ? [] : [`review result fingerprint ${reviewedFingerprint} does not match current implementation ${currentFingerprint}`]), ] diff --git a/packages/opencode/test/dag/dag-review-lifecycle.test.ts b/packages/opencode/test/dag/dag-review-lifecycle.test.ts index 47e7daa22..0c26c3341 100644 --- a/packages/opencode/test/dag/dag-review-lifecycle.test.ts +++ b/packages/opencode/test/dag/dag-review-lifecycle.test.ts @@ -365,6 +365,38 @@ describe("DAG review lifecycle", () => { }) }) + it("accepts fingerprints that match after trimming surrounding whitespace (issue #410)", () => { + expect(validateReviewResult({ + verdict: "ACCEPT", + implementation_fingerprint: "\n sha256:revision-2\n", + }, "sha256:revision-2")).toEqual({ + valid: true, + action: "proceed", + reviewed_fingerprint: "\n sha256:revision-2\n", + errors: [], + }) + expect(validateReviewResult({ + verdict: "ACCEPT", + implementation_fingerprint: "sha256:revision-2", + }, "\n sha256:revision-2\n")).toEqual({ + valid: true, + action: "proceed", + reviewed_fingerprint: "sha256:revision-2", + errors: [], + }) + expect(validateReviewResult({ + verdict: "ACCEPT", + implementation_fingerprint: "sha256:revision 2", + }, "sha256:revision-2")).toEqual({ + valid: false, + action: "invalidate", + reviewed_fingerprint: "sha256:revision 2", + errors: [ + "review result fingerprint sha256:revision 2 does not match current implementation sha256:revision-2", + ], + }) + }) + it("keeps a deep workflow from succeeding with an unresolved review outcome", () => { const rejected = workflow("deep", validDiffFlow()) expect(unresolvedReviewOutcomes(rejected, [