export declare const REVIEW_CONTRACT: { readonly $comment: "Canonical review contract (epic #96, Option B): the single source of truth for constants BOTH reviewers share — the Go server's pr_review runner and the TS CLI's loop review packet. Mirrors: apps/renaissshipflow-server/internal/reviewcontract/review-contract.json (go:embed, byte-identical) and apps/renaissshipflow-cli/src/review-contract-data.ts (generated). Regenerate mirrors with `node scripts/sync-review-contract.mjs`; parity tests on both sides fail on drift. Noise lists are the UNION of the two pre-contract lists (never narrow), split into scopes: the lists under `noise` are shared review-filter noise; `noise.featuremapOnly` is feature-map-only (tracked, reviewable source the loop packet must keep showing). Verdict vocabularies are carried per side AS-IS — reconciliation is a later slice. `ownsTestVectors` pins the directory-boundary `owns` matcher, which stays implemented per language."; readonly version: 1; readonly budgets: { readonly $comment: "perFileDiffCap/packetTotalCap bound each reviewer's diff; briefCap bounds the linked-issue spec + PR body (acceptance criteria sit at the BOTTOM of issue bodies — a tight cap silently drops the checklist)."; readonly perFileDiffCap: 24000; readonly packetTotalCap: 150000; readonly briefCap: 8000; }; readonly noise: { readonly $comment: "Paths excluded from review diffs / the feature map, in two scopes. The lists directly under `noise` are SHARED review-filter noise: excluded from both reviewers' diffs and from the feature map. `featuremapOnly` entries are excluded from the feature map only — and, transitively, from the Go server's review filter, which shares featuremap.IsNoisePath (its pre-contract behavior) — but they are tracked, reviewable source the loop packet MUST keep showing (pre-contract it was the only reviewer that saw them). Matching: substrings whole-segment (issue #651): a token (trailing / stripped) is noise ONLY where it equals a full path segment or run of segments (Go matchesNoiseSegment / CLI isNoiseDiffPath: `/`+p+`/` contains `/`+token+`/`), so nested matches keep working while sibling names that merely CONTAIN a token do not — nested src/out/x stays noise, about/ is not (TS case-insensitively, Go case-sensitively — each side keeps its pre-contract semantics). suffixes: trailing patterns filepath.Ext can't express. basenames: exact filenames (matched against the path's base name, never as a suffix). extensions: final-dot file extensions."; readonly substrings: readonly ["node_modules/", ".git/", "vendor/", "dist/", "build/", ".next/", "__pycache__/", ".mypy_cache/", ".tox/", ".venv/", ".cache/", "coverage/", ".nyc_output/", ".turbo/", "__generated__/", "__snapshots__/", "__mocks__/", "storybook-static/", ".pytest_cache/", ".gradle/", "DerivedData/", "Pods/", "target/", ".rush/", "out/", ".swc/", ".expo/"]; readonly suffixes: readonly [".pb.go", "_pb2.py", "_pb2_grpc.py", "_gen.go", "_generated.go", ".gen.go", ".generated.ts", ".generated.tsx", ".gen.ts", ".min.js", ".min.css", ".tsbuildinfo"]; readonly basenames: readonly ["package-lock.json", "bun.lockb"]; readonly extensions: readonly [".map", ".lock", ".sum", ".png", ".jpg", ".jpeg", ".gif", ".ico", ".svg", ".woff", ".woff2", ".ttf", ".eot", ".snap"]; readonly featuremapOnly: { readonly $comment: ".claude/ is tracked, reviewable source in this repo (63 files incl. plugin-shipped .claude/commands/shipflow-*.md and .claude/skills TS source) — noise for the feature map (and the server reviewer, per its pre-contract IsNoisePath), never for the loop packet."; readonly substrings: readonly [".claude/"]; }; }; readonly verdicts: { readonly $comment: "Carried AS-IS per side; unifying the vocabulary is a later slice of #96. Do not gate on the server enum — the server review is advisory."; readonly loop: readonly ["approve", "comment", "request_changes", "reject"]; readonly server: readonly ["looks_good", "comment", "request_changes"]; }; readonly judgedDecisions: { readonly $comment: "Rules for every LLM-judged auto-decision (issue #209). evalAccept is the default acceptance expression cmd/revieweval evaluates when a -baseline is supplied: grammar ` >= pt [AND ...] over >= runs`, metrics precision|recall|f1, signed deltas in percentage points on mean-of-runs; ACCEPT when every clause holds on the mean deltas with >=N runs per side, PARK when some clause fails in every candidate run, anything else is GRAY-ZONE and escalates to a human. swapAndAggregate: a single-pass LLM judge is position-biased — order consistency is <=65% single-pass (MT-Bench) — so every judged decision MUST run the judge twice with the candidate list order swapped/reversed and count only verdicts BOTH passes agree on; disagreements are reported, never silently resolved."; readonly evalAccept: "recall>=+2pt AND precision>=-1pt over >=2 runs"; readonly swapAndAggregate: true; }; readonly severities: readonly ["critical", "high", "medium", "low"]; readonly defaultSeverity: "medium"; readonly severityBadges: { readonly $comment: "Severity → rendered badge, byte-identical across BOTH reviewers (server runner_pr_review.go severityBadge ↔ CLI review-contract.ts severityBadge). Keys are exactly `severities`; a blank or unknown severity renders defaultSeverity's badge (parity-tested both sides). Badges are Gemini Code Assist's exact hosted SVGs (user request: identical visual language across both reviewers) — GitHub-only surfaces; chat renderers must keep using text severity words."; readonly critical: "![critical](https://www.gstatic.com/codereviewagent/critical.svg)"; readonly high: "![high](https://www.gstatic.com/codereviewagent/high-priority.svg)"; readonly medium: "![medium](https://www.gstatic.com/codereviewagent/medium-priority.svg)"; readonly low: "![low](https://www.gstatic.com/codereviewagent/low-priority.svg)"; }; readonly effortTags: { readonly $comment: "Effort → rendered fix-size tag on the finding badge line, byte-identical across BOTH reviewers (server runner_pr_review.go effortTag ↔ CLI review-contract.ts effortTag). A blank or unknown effort renders \"\" (no tag) — NOT a default tag, unlike severityBadges which falls back to defaultSeverity (parity-tested both sides). Kept in the same CodeRabbit-style visual language as the severity badges."; readonly quick: " · ⚡ quick fix"; readonly involved: " · 🔨 involved"; }; readonly ownsTestVectors: readonly [{ readonly $comment: "Directory-boundary match: a prefix owns itself and everything under it, never a sibling that merely shares the string."; readonly prefix: "src/app/admin"; readonly path: "src/app/admin"; readonly owns: true; }, { readonly prefix: "src/app/admin"; readonly path: "src/app/admin/page.tsx"; readonly owns: true; }, { readonly prefix: "src/app/admin"; readonly path: "src/app/admin/nested/deep/file.ts"; readonly owns: true; }, { readonly prefix: "src/app/admin"; readonly path: "src/app/admin-shop/page.tsx"; readonly owns: false; }, { readonly prefix: "src/app/admin"; readonly path: "src/app/adminx"; readonly owns: false; }, { readonly prefix: "./src/app/admin"; readonly path: "src/app/admin/page.tsx"; readonly owns: true; }, { readonly prefix: "src/app/admin/"; readonly path: "src/app/admin/page.tsx"; readonly owns: true; }, { readonly prefix: "src/app/admin/"; readonly path: "src/app/admin/"; readonly owns: true; }, { readonly prefix: "src/app/admin/"; readonly path: "src/app/admin"; readonly owns: false; }, { readonly prefix: ""; readonly path: "src/anything.ts"; readonly owns: false; }, { readonly prefix: "./"; readonly path: "src/anything.ts"; readonly owns: false; }, { readonly prefix: "apps"; readonly path: "apps/renaissshipflow-cli/src/index.ts"; readonly owns: true; }, { readonly prefix: "src/app/admin"; readonly path: "src"; readonly owns: false; }, { readonly prefix: "app"; readonly path: "src/app/x.ts"; readonly owns: false; }, { readonly prefix: "SRC/App"; readonly path: "src/app/x.ts"; readonly owns: false; }]; readonly noiseTestVectors: readonly [{ readonly $comment: "Whole-segment match for `noise.substrings` (issue #651): a token (trailing / stripped) is noise ONLY where it equals a full path segment, so nested matches keep working while sibling names that merely CONTAIN a token do not. `scope: featuremapOnly` vectors come from noise.featuremapOnly.substrings: noise for the feature map and the Go server's review filter, NEVER for the loop packet (isNoiseDiffPath must return false). Vectors avoid case-divergent paths — TS lowercases, Go does not (deliberate, per the noise $comment)."; readonly path: "app/about/page.tsx"; readonly noise: false; }, { readonly path: "src/layout/Header.tsx"; readonly noise: false; }, { readonly path: "app/checkout/page.tsx"; readonly noise: false; }, { readonly path: "app/logout/route.ts"; readonly noise: false; }, { readonly path: "src/workout/plan.ts"; readonly noise: false; }, { readonly path: "packages/retarget/index.ts"; readonly noise: false; }, { readonly path: "mobile-target/src/main.rs"; readonly noise: false; }, { readonly path: "scripts/rebuild/run.sh"; readonly noise: false; }, { readonly path: "tools/prebuild/step.js"; readonly noise: false; }, { readonly path: "src/main.go"; readonly noise: false; }, { readonly path: "out/static/foo.html"; readonly noise: true; }, { readonly path: "src/node_modules/x.js"; readonly noise: true; }, { readonly path: "node_modules/foo/bar.js"; readonly noise: true; }, { readonly path: "ios/Pods/lib/x.m"; readonly noise: true; }, { readonly path: "build/bundle.js"; readonly noise: true; }, { readonly path: "target/release/y.rs"; readonly noise: true; }, { readonly path: "apps/.claude/commands/shipflow-loop.md"; readonly noise: true; readonly scope: "featuremapOnly"; }, { readonly path: ".claude/skills/foo.md"; readonly noise: true; readonly scope: "featuremapOnly"; }]; }; //# sourceMappingURL=review-contract-data.d.ts.map