prreviewbuddy 0.90.0 → 0.91.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,31 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.91.1
4
+
5
+ **Issues lead with what they mean.** Each issue from a new analysis now opens with its consequence:
6
+ a short title saying what can happen, a sentence or two on when and how, and, when there is a
7
+ specific one, the step that would settle it, marked **To verify** or **To decide**. The technical
8
+ title, the reasoning, the code location and the history are under **Technical details** on the
9
+ card, one click (or Enter) away, with nothing to wait for.
10
+
11
+ Outstanding issues are grouped by the decision they ask of you: **Failures**, **Possible risks**,
12
+ **Intent to confirm** and **Maintenance**, each ordered by severity. The group comes from the
13
+ evidence the analysis read, not from its severity or how confident it is; both are still shown on
14
+ every card. The pane opens with one sentence on what the change touches, a count of what is
15
+ outstanding, and buttons to jump to each group. Folding a group is remembered for the next review.
16
+
17
+ Resolved and dismissed issues stay in the closed list at the bottom. An issue the new commits fixed
18
+ leads with what the code now does, when the update could see it in the code; one settled by a
19
+ comment never claims a fix. Updates keep each issue's consequence true: they are shown it, and
20
+ restate or withdraw it when the new commits change what it describes.
21
+
22
+ Reviews made before this are shown as they were, and are not rewritten. Beside the new groups their
23
+ issues sit under **Other issues**; on their own they need no heading.
24
+
25
+ For coding agents, `list_findings` and `get_finding` (and `prreviewbuddy findings --json` and
26
+ `finding --json`) carry each issue's `consequence` and, on an issue the code resolved,
27
+ `resolved_behaviour`, so a list of findings can be triaged without fetching each one.
28
+
3
29
  ## 0.90.0
4
30
 
5
31
  **Connect your coding agent from Settings.** A new **AI integrations** section in Settings shows,
package/dist/main.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { $ as readAskRequest, $i as explanationOf, Ar as attemptIdOf, At as UpdateAlreadyRunningError, Bt as append, Dt as parkedUpdateRefusal, E as relativeTime, Ea as resolveTarget, Er as forgeResolver, F as spawnRunner, Fa as git, Ft as prepareReview, G as reviewTag, Ga as AGENT_IDS, Gr as isClaimed, Gt as recordTelemetryUploadConsent, H as findingRef, Ha as writeAgentPreference, Hr as purposeOf, I as applyUpdate, It as settleReview, J as forgetAskRequest, Ja as agentIdentityOf, Ji as reviewerDispositions, Jr as followedRefName, Jt as BUILD_VERSION, Ka as agentById, Kt as telemetryUploadConsent, L as modelProvenanceOf, La as resolveAgent, Lr as PHASES, Lt as reanalyseReview, Ma as AmbiguousRefError, Mt as runningJobs, Nr as isTerminal$1, Nt as failureOf, P as runDetached, Pr as loadJob, Qa as runnableAgents, Ra as resolveModel, T as runBatch, Ta as kissOutcome, Ua as CONFIG_PATH, Ui as isIssueOutstanding, Ur as clearClaim, Ut as stamp, Va as readAgentPreference, Vr as progressSteps, Wa as STORE_ROOT, Wi as isQuestionOutstanding, Wr as driverGone, Wt as deliver, Xa as isAgentId, Y as interruption, Ya as detectAgents, Yi as verdictClosure, Yt as PACKAGE_NAME, Z as isTerminalAsk, Za as parkedReason, _t as parseWorkspacePort, at as healthyPort, br as findExistingReview, bt as writePortPreference, ca as findingAssessment, di as reviewedRepositories, dr as MANAGED_ROOT, dt as stopServer, et as recordAskAccepted, fi as summarise, ft as workspaceUrl, gr as removeWorktree, gt as MIN_WORKSPACE_PORT, hr as readMarker, ht as MAX_WORKSPACE_PORT, i as deleteReview$1, ii as matchingWorkspaceIds, it as ensureServer, j as RUNNER_KINDS, jt as liveUpdateFor, k as queueForReview, ka as TargetError, kr as allJobs, li as recentWorkspaces, mi as workspaceRevision, mt as DEFAULT_WORKSPACE_PORT, ni as lineagePosition, nt as bootstrapUrl, o as liveJobsFor, oi as positionInLineage, ot as readServerRecord, q as endAskRequest, qt as telemetryUploadEnabled, ri as loadWorkspace, s as wasBlocked, sr as modelHelpLines, st as reviewsUrl, t as MCP_SERVER_INFO_NAME, tt as readIndexToken, u as recordKissRun, ua as findingStatus, ui as reviewedCommit, vr as describeMovement, wa as WITHHELD_REASON, x as batchIdentity, xt as COMMIT_REVIEW_CANNOT_UPDATE, yr as describeSubject, yt as statedWorkspacePort, za as agentIdOf, zt as startJob } from "./mcp_tools-CSj5vcSE.js";
2
+ import { $ as readAskRequest, $a as runnableAgents, $i as explanationOf, Aa as TargetError, Ar as attemptIdOf, At as UpdateAlreadyRunningError, Ba as agentIdOf, Bt as append, Da as resolveTarget, Dt as parkedUpdateRefusal, E as relativeTime, Ea as kissOutcome, Er as forgeResolver, F as spawnRunner, Ft as prepareReview, G as reviewTag, Ga as STORE_ROOT, Gr as isClaimed, Gt as recordTelemetryUploadConsent, H as findingRef, Ha as readAgentPreference, Hr as purposeOf, I as applyUpdate, Ia as git, It as settleReview, J as forgetAskRequest, Ji as reviewerDispositions, Jr as followedRefName, Jt as BUILD_VERSION, Ka as AGENT_IDS, Kt as telemetryUploadConsent, L as modelProvenanceOf, Lr as PHASES, Lt as reanalyseReview, Mt as runningJobs, Na as AmbiguousRefError, Nr as isTerminal$1, Nt as failureOf, P as runDetached, Pr as loadJob, Qa as parkedReason, Ra as resolveAgent, T as runBatch, Ta as WITHHELD_REASON, Ua as writeAgentPreference, Ui as isIssueOutstanding, Ur as clearClaim, Ut as stamp, Vr as progressSteps, Wa as CONFIG_PATH, Wi as isQuestionOutstanding, Wr as driverGone, Wt as deliver, Xa as detectAgents, Y as interruption, Ya as agentIdentityOf, Yi as verdictClosure, Yt as PACKAGE_NAME, Z as isTerminalAsk, Za as isAgentId, _t as parseWorkspacePort, at as healthyPort, br as findExistingReview, bt as writePortPreference, ca as findingAssessment, di as reviewedRepositories, dr as MANAGED_ROOT, dt as stopServer, et as recordAskAccepted, fi as summarise, ft as workspaceUrl, gr as removeWorktree, gt as MIN_WORKSPACE_PORT, hr as readMarker, ht as MAX_WORKSPACE_PORT, i as deleteReview$1, ii as matchingWorkspaceIds, it as ensureServer, j as RUNNER_KINDS, jt as liveUpdateFor, k as queueForReview, kr as allJobs, li as recentWorkspaces, mi as workspaceRevision, mt as DEFAULT_WORKSPACE_PORT, ni as lineagePosition, nt as bootstrapUrl, o as liveJobsFor, oi as positionInLineage, ot as readServerRecord, q as endAskRequest, qa as agentById, qt as telemetryUploadEnabled, ri as loadWorkspace, s as wasBlocked, sr as modelHelpLines, st as reviewsUrl, t as MCP_SERVER_INFO_NAME, tt as readIndexToken, u as recordKissRun, ua as findingStatus, ui as reviewedCommit, vr as describeMovement, x as batchIdentity, xt as COMMIT_REVIEW_CANNOT_UPDATE, yr as describeSubject, yt as statedWorkspacePort, za as resolveModel, zt as startJob } from "./mcp_tools-BR7_XprF.js";
3
3
  import { basename, dirname, isAbsolute, join, resolve } from "node:path";
4
4
  import { spawn } from "node:child_process";
5
5
  import { existsSync, mkdirSync, readdirSync, realpathSync, rmSync, statSync, writeFileSync } from "node:fs";
@@ -1044,7 +1044,14 @@ function summaryOf(tag, entry, judge) {
1044
1044
  ...finding.file ? { location: {
1045
1045
  path: finding.file,
1046
1046
  ...issue?.line ? { line: issue.line } : {}
1047
- } } : {}
1047
+ } } : {},
1048
+ ...issue?.consequence ? { consequence: {
1049
+ title: issue.consequence.title,
1050
+ scenario: issue.consequence.scenario,
1051
+ ...issue.consequence.group ? { group: issue.consequence.group } : {},
1052
+ ...issue.consequence.next ? { next: { ...issue.consequence.next } } : {}
1053
+ } } : {},
1054
+ ...issue?.resolvedBehaviour && status === "resolved" ? { resolved_behaviour: issue.resolvedBehaviour } : {}
1048
1055
  };
1049
1056
  }
1050
1057
  /** A question can run to a paragraph. The list carries its first line; `get_finding` has the rest. */
@@ -4206,6 +4206,13 @@ var REVIEW_ATTENTIONS = [
4206
4206
  "medium",
4207
4207
  "low"
4208
4208
  ];
4209
+ /** In the order the Issues pane draws them. */
4210
+ var IMPACT_GROUPS = [
4211
+ "failure",
4212
+ "risk",
4213
+ "intent",
4214
+ "maintenance"
4215
+ ];
4209
4216
  /**
4210
4217
  * The JSON in a reply, whether or not the model wrapped it in a fence.
4211
4218
  *
@@ -4373,10 +4380,49 @@ function normalizeIssues(value) {
4373
4380
  line: typeof item.line === "number" ? item.line : void 0,
4374
4381
  sectionId: asSectionId(item),
4375
4382
  confidence: REVIEW_ATTENTIONS.includes(item.confidence) ? item.confidence : void 0,
4376
- existingDiscussion: asClaimedThreadRef(item.existingDiscussion)
4383
+ existingDiscussion: asClaimedThreadRef(item.existingDiscussion),
4384
+ ...withConsequence(normalizeConsequence(item.consequence))
4377
4385
  };
4378
4386
  }).filter((issue) => issue.title.trim() !== "" || issue.description.trim() !== "");
4379
4387
  }
4388
+ /**
4389
+ * An issue's consequence, or nothing.
4390
+ *
4391
+ * Well-formedness only. A consequence with no title or no scenario has nothing to say and is
4392
+ * dropped, so the card falls back to its technical account rather than showing an empty headline.
4393
+ * An unknown group is left out rather than defaulted, because every default would be a claim: the
4394
+ * card then sits under "Other issues". A group is never derived from severity or confidence; the
4395
+ * two stay separate attributes, as the model stated them.
4396
+ */
4397
+ function normalizeConsequence(value) {
4398
+ if (typeof value !== "object" || value === null || Array.isArray(value)) return void 0;
4399
+ const item = value;
4400
+ const title = asString$1(item.title).trim();
4401
+ const scenario = asString$1(item.scenario).trim();
4402
+ if (!title || !scenario) return void 0;
4403
+ const group = IMPACT_GROUPS.includes(item.group) ? item.group : void 0;
4404
+ const next = normalizeStep(item.next);
4405
+ return {
4406
+ title,
4407
+ scenario,
4408
+ ...next ? { next } : {},
4409
+ ...group ? { group } : {}
4410
+ };
4411
+ }
4412
+ function normalizeStep(value) {
4413
+ if (typeof value !== "object" || value === null) return void 0;
4414
+ const item = value;
4415
+ const text = asString$1(item.text).trim();
4416
+ if (!text) return void 0;
4417
+ return item.kind === "verify" || item.kind === "decide" ? {
4418
+ kind: item.kind,
4419
+ text
4420
+ } : { text };
4421
+ }
4422
+ /** Spread form, so an issue without one carries no `consequence` key at all. */
4423
+ function withConsequence(consequence) {
4424
+ return consequence ? { consequence } : {};
4425
+ }
4380
4426
  function asClaimedThreadRef(value) {
4381
4427
  if (typeof value !== "object" || value === null) return void 0;
4382
4428
  const claim = value;
@@ -12503,6 +12549,50 @@ function applyMotivation(result, candidate, authorDescription) {
12503
12549
  */
12504
12550
  var SUMMARY_GUIDANCE = `"summary": WHAT the change does, for a reviewer about to read it. Roughly 80-120 words, and fewer for a small change. Name the parts that change and what each now does. Do not explain why the change exists, and do not judge whether it is correct or safe: other fields carry both.`;
12505
12551
  //#endregion
12552
+ //#region ../../packages/review-harness/src/domain/ai_review/consequence_guidance.ts
12553
+ /**
12554
+ * What an issue's "consequence" is, as every prompt that raises issues asks for it.
12555
+ *
12556
+ * One fragment and one guidance string, so the first analysis, follow-ups, updates and the
12557
+ * extension's investigation cannot drift apart. The fragment is the whole shape, never an
12558
+ * abbreviation: a model cannot follow a schema it was not shown.
12559
+ */
12560
+ var CONSEQUENCE_FIELD = "\"consequence\": { \"title\": string, \"scenario\": string, \"group\": \"failure\" | \"risk\" | \"intent\" | \"maintenance\", \"next\"?: { \"kind\": \"verify\" | \"decide\", \"text\": string } }";
12561
+ /** The same shape on a prior finding's entry in an update, where null withdraws it and absence keeps it. */
12562
+ var CONSEQUENCE_REVISION_FIELD = `${CONSEQUENCE_FIELD.replace("\"consequence\": ", "\"consequence\"?: ")} | null`;
12563
+ var CONSEQUENCE_GUIDANCE = `"consequence" on an issue: the same issue told as what it means, for someone who knows the product but may not know its implementation. It is shown first; "title" and "description" stay the technical account behind it. Reframe around the consequence, do not just simplify the technical wording.
12564
+ - "title": the observable consequence or the meaningful development constraint, as a short sentence (e.g. "Creating a meal can fail halfway, leaving it outside the planner").
12565
+ - "scenario": one or two sentences: the triggering condition and what happens (e.g. "If adding it to the day fails after saving, the user sees an error but the meal still exists. Retrying may then be blocked by its name.").
12566
+ - "next": the one step that would settle it, when there is a specific one. "kind" is "verify" for a check or test that would establish whether it happens (e.g. "Try a receipt with an unreadable amount.") and "decide" for an acceptance or intent call only the reviewer can make (e.g. "Confirm this broader change is intended."). Omit "next" rather than writing a generic step.
12567
+ - "group", by the evidence behind the issue, never by how sure you sound and independently of "severity": "failure" when the code you read establishes an incorrect outcome under a stated condition; "risk" when a plausible undesirable consequence still needs verifying; "intent" when the change has a concrete behavioural consequence whose correctness depends on what was intended; "maintenance" when it constrains future development, maintainability or reliability rather than current behaviour. "confidence" is reported separately and does not decide the group: if the evidence does not establish the failure, it is a "risk", and say what is unverified.
12568
+ - Keep every condition and qualification that affects the decision. Avoid code identifiers unless the consequence cannot be understood without one. Do not state severity.
12569
+ - Never claim user harm, a measured performance effect, a reproduction or a certainty the evidence does not give. A performance concern nobody measured says so (e.g. "Opening a meal may do unnecessary work for nested meals... The effect has not been measured."). A maintenance or intent issue is described as one, not as a user-facing failure.
12570
+ - An issue names a concrete consequence. A request for missing requirements with no concrete consequence is a question for the author, not an issue, and is never raised as both.`;
12571
+ /** What "orientation" is for, as the first analysis and an update ask for it. */
12572
+ var ORIENTATION_GUIDANCE = `"orientation": one sentence, at most about 25 words, naming the behaviour or product area this change touches, for a reviewer about to decide on its issues (e.g. "This change affects receipt extraction and how duplicate receipt details are combined."). Say what it touches, not whether it is safe, and do not summarise the issues.`;
12573
+ /**
12574
+ * How an update keeps a prior finding's consequence and resolution true, beside its status.
12575
+ *
12576
+ * The technical text of a prior finding never changes in an update, but what it means can: the
12577
+ * condition it describes may have narrowed, the evidence moved, or the step become moot. A
12578
+ * consequence that no longer describes the finding is worse than none, so the model is shown each
12579
+ * one and must keep, restate or withdraw it.
12580
+ */
12581
+ var CONSEQUENCE_UPDATE_GUIDANCE = `"consequence" on a finding entry: a finding marked [consequence: ...] has an impact summary the reviewer reads first. Omit "consequence" when it still describes the finding accurately, which is the usual case. Return a restated "consequence" (same shape as on a new issue) when what has changed since alters the condition, the evidence, the next step or the group it describes, most often for an "affected" finding. Return null when it no longer holds and you cannot restate it accurately. Never return "consequence" for a finding without a [consequence: ...] marker.
12582
+ "resolvedBehaviour" on a finding entry: only with "resolved", and only when the changed code shows what now happens under the finding's condition, in one sentence for someone who knows the product (e.g. "If adding the meal to the planner fails, the meal is no longer saved."). Omit it when the code does not show that, and whenever the finding is settled by a comment rather than by code.`;
12583
+ /**
12584
+ * The impact summary the reviewer reads first, shown under a prior finding so a later pass can keep,
12585
+ * restate or withdraw it (`CONSEQUENCE_UPDATE_GUIDANCE`, and the investigation's own rule). Group
12586
+ * and step are included: either can go stale on its own. A finding stored without one shows
12587
+ * nothing, which is also what tells the model not to add one.
12588
+ */
12589
+ function formatPriorConsequence(issue) {
12590
+ const consequence = issue.consequence;
12591
+ if (!consequence) return "";
12592
+ const next = consequence.next ? ` Next (${consequence.next.kind ?? "step"}): ${consequence.next.text}` : "";
12593
+ return `\n [consequence: group ${consequence.group ?? "none"}] ${consequence.title.trim().replace(/[.!?]$/, "")}. ${consequence.scenario.trim()}${next}`;
12594
+ }
12595
+ //#endregion
12506
12596
  //#region ../../packages/review-harness/src/domain/discussion/discussion_delta.ts
12507
12597
  /**
12508
12598
  * Which collections of a snapshot were capped. A snapshot from before coverage was recorded can
@@ -13265,6 +13355,7 @@ var STRUCTURED_OUTPUT_INSTRUCTIONS = `In addition to the review principles above
13265
13355
  "authorQuestion"?: string
13266
13356
  },
13267
13357
  "overallRisk": "low" | "medium" | "high",
13358
+ "orientation": string,
13268
13359
  "sections": [{
13269
13360
  "id": string,
13270
13361
  "order": number,
@@ -13279,7 +13370,7 @@ var STRUCTURED_OUTPUT_INSTRUCTIONS = `In addition to the review principles above
13279
13370
  "reviewWeight": 1 | 2 | 3 | 4 | 5,
13280
13371
  "recommendedStartingPoint": boolean
13281
13372
  }],
13282
- "issues": [{ "id": string, "severity": "critical" | "major" | "minor" | "nit", "title": string, "description": string, "file"?: string, "line"?: number, "sectionId"?: string, "confidence"?: "high" | "medium" | "low", "existingDiscussion"?: { "threadId": string, "relation": "same" | "related" } }],
13373
+ "issues": [{ "id": string, "severity": "critical" | "major" | "minor" | "nit", "title": string, "description": string, "file"?: string, "line"?: number, "sectionId"?: string, "confidence"?: "high" | "medium" | "low", ${CONSEQUENCE_FIELD}, "existingDiscussion"?: { "threadId": string, "relation": "same" | "related" } }],
13283
13374
  "questions": [{ "id": string, "question": string, "importance"?: "high" | "medium" | "low", "whyThisMatters"?: string, "file"?: string, "sectionId"?: string }],
13284
13375
  "recommendation": string,
13285
13376
  "nextSteps": string[]
@@ -13299,6 +13390,8 @@ Field guidance:
13299
13390
  - "recommendation": a 1-2 sentence merge verdict aimed at the developer (e.g. "Approve" or "Request changes — fix the unhandled rejection before merging"). Do not just restate the risk level, and do not copy Guide section content verbatim into this field.
13300
13391
  - "nextSteps": concrete actions to take before merging (specific tests to run, files to double-check), not a restatement of the Guide.
13301
13392
  - "issues": report only issues worth the reviewer's attention — do not invent issues to fill out the array, and do not omit significant issues. Let the count reflect the actual PR (a trivial PR may have zero or one issue; a large or risky PR may have several).
13393
+ - ${CONSEQUENCE_GUIDANCE}
13394
+ - ${ORIENTATION_GUIDANCE}
13302
13395
  - "existingDiscussion" on an issue: set this only when a thread in the PR DISCUSSION CONTEXT block already raises this same concern, and you have independently confirmed from the diff that it still applies. "threadId" must be copied verbatim from that thread's [T_...] marker — never invent an id, never guess, and omit the field entirely if no thread matches. Set "relation" to "same" when the thread already makes this exact point, or "related" when it discusses this area without covering the finding — a reviewer acts differently on "someone said this already" than on "someone was looking near here". Still write the issue normally; this field only records that the point was raised before, so the reviewer is not shown it as a fresh discovery. Do not use it to pad the review with issues you would otherwise have left out.
13303
13396
  - "confidence" on an issue: how sure you are the issue is real, on the same high/medium/low scale as a question's "importance". This is a separate axis from "severity", which is how much it would matter if real — a critical issue you are unsure about and a nit you are certain of are different things to act on, so do not let one field stand in for the other. Use LOW when you are reasoning from a diff excerpt without the surrounding code, and say what would confirm it in the description. Omit the field rather than guessing a middle value.
13304
13397
  - "questions": each one is a genuine open item the reviewer needs answered before they can sign off, not a rhetorical prompt. "importance" is how much attention it deserves, on the same high/medium/low scale as a section's "reviewAttention" (e.g. a question about a possibly-exposed secret is "high"; a naming preference is "low"). "whyThisMatters" is 1-2 sentences explaining the concrete consequence of the question going unanswered — not a restatement of the question itself.
@@ -13356,6 +13449,7 @@ function parseUnchecked(raw) {
13356
13449
  schemaVersion: 1,
13357
13450
  summary,
13358
13451
  overallRisk: RISKS.includes(obj.overallRisk) ? obj.overallRisk : "medium",
13452
+ ...asString$1(obj.orientation).trim() ? { orientation: asString$1(obj.orientation).trim() } : {},
13359
13453
  sections: normalizeSections(obj.sections),
13360
13454
  issues: normalizeIssues(obj.issues),
13361
13455
  questions: normalizeQuestions(obj.questions),
@@ -18001,7 +18095,7 @@ function formatPriorFindings(issues, assess, reassess = /* @__PURE__ */ new Map(
18001
18095
  const related = (issue.relatedFiles ?? []).map((file) => ` [related: ${file}, not changed]`).join("");
18002
18096
  const location = (issue.file ? ` [${issue.file}${issue.line ? `:${issue.line}` : ""}]` : "") + related;
18003
18097
  const description = issue.description.trim();
18004
- return `${index}. (${promptGrade(assess("issue", issue))})${location}${priorFindingVerdict(issue, reassess.get(index))}${acceptedVerdict(status("issue", issue.id))} ${issue.title.trim()}${description ? `\n ${description}` : ""}`;
18098
+ return `${index}. (${promptGrade(assess("issue", issue))})${location}${priorFindingVerdict(issue, reassess.get(index))}${acceptedVerdict(status("issue", issue.id))} ${issue.title.trim()}${description ? `\n ${description}` : ""}${formatPriorConsequence(issue)}`;
18005
18099
  }).join("\n");
18006
18100
  }
18007
18101
  /**
@@ -18012,8 +18106,8 @@ function formatPriorFindings(issues, assess, reassess = /* @__PURE__ */ new Map(
18012
18106
  */
18013
18107
  var QUESTION_SHAPE_LINE = " \"questions\": [{ \"sourceIndex\": number, \"status\": \"answered\" | \"still-open\" | \"affected\", \"answer\"?: string, \"note\"?: string, \"importance\"?: \"high\" | \"medium\" | \"low\", \"importanceReason\"?: string }],";
18014
18108
  var RECONCILIATION_SHAPE = `{
18015
- "findings": [{ "sourceIndex": number, "status": "resolved" | "still-open" | "affected", "note"?: string, "severity"?: "critical" | "major" | "minor" | "nit", "severityReason"?: string }],
18016
- "newIssues": [{ "id": string, "severity": "critical" | "major" | "minor" | "nit", "title": string, "description": string, "file"?: string, "line"?: number, "confidence"?: "high" | "medium" | "low" }],
18109
+ "findings": [{ "sourceIndex": number, "status": "resolved" | "still-open" | "affected", "note"?: string, ${CONSEQUENCE_REVISION_FIELD}, "resolvedBehaviour"?: string, "severity"?: "critical" | "major" | "minor" | "nit", "severityReason"?: string }],
18110
+ "newIssues": [{ "id": string, "severity": "critical" | "major" | "minor" | "nit", "title": string, "description": string, "file"?: string, "line"?: number, ${CONSEQUENCE_FIELD}, "confidence"?: "high" | "medium" | "low" }],
18017
18111
  "newSections": [{
18018
18112
  "id": string,
18019
18113
  "order": number,
@@ -18028,6 +18122,7 @@ var RECONCILIATION_SHAPE = `{
18028
18122
  "reviewWeight": 1 | 2 | 3 | 4 | 5
18029
18123
  }],
18030
18124
  "summary": string,
18125
+ "orientation": string,
18031
18126
  "overallRisk": "low" | "medium" | "high",
18032
18127
  "recommendation": string,
18033
18128
  "nextSteps": string[]
@@ -18168,7 +18263,7 @@ ${REASSESS_TASK}` : ""}
18168
18263
  ${GRADE_TASK.question}`] : [],
18169
18264
  conversationOnly ? `No commits were pushed, so there is no new code to review. Report a problem in "newIssues" only where the conversation points at something in the code the earlier analysis missed and you have confirmed it by reading the code. Do NOT repeat a previous finding here: if it still stands, that is what "still-open" is for.` : `Read the changed code above as a reviewer, not only as an auditor of the numbered list. These commits have not been reviewed by anyone. Report every genuinely NEW problem you find in them in "newIssues", whether or not it relates to anything on the list — code written to fix a finding is exactly where a regression gets introduced, and reassessing the list and stopping there is half the job. Do NOT repeat a previous finding here: if it still stands, that is what "still-open" is for.`,
18170
18265
  `If the new changes introduce an area the earlier analysis had no section for, add it to "newSections". Otherwise return an empty array. Do not restate or restructure the earlier analysis's existing sections.`,
18171
- `Give a fresh "summary", "overallRisk", "recommendation" and "nextSteps" for the pull request AS IT NOW STANDS, taking both the earlier findings that survive and the new changes into account. Unlike a partial review, you have been shown the earlier analysis in full and are expected to revise its verdict where the new changes justify it. ${SUMMARY_GUIDANCE}`
18266
+ `Give a fresh "summary", "overallRisk", "recommendation" and "nextSteps" for the pull request AS IT NOW STANDS, taking both the earlier findings that survive and the new changes into account. Unlike a partial review, you have been shown the earlier analysis in full and are expected to revise its verdict where the new changes justify it. ${SUMMARY_GUIDANCE} ${ORIENTATION_GUIDANCE}`
18172
18267
  ].map((task, index) => `${index + 1}. ${task}`).join("\n");
18173
18268
  return `${conversationOnly ? `You are RECONCILING an earlier analysis of this pull request against what has changed in its conversation since that analysis was made.
18174
18269
 
@@ -18194,6 +18289,10 @@ ${reconciliationShape(includeQuestions, discussion !== void 0)}
18194
18289
 
18195
18290
  "note" is one short sentence on *why* the status is what it is — name the change that resolved it, or what leaves it standing.${discussion ? " Where a comment is the reason, name its author." : ""} Omit it rather than restating the finding.
18196
18291
 
18292
+ ${CONSEQUENCE_UPDATE_GUIDANCE}
18293
+
18294
+ ${CONSEQUENCE_GUIDANCE}
18295
+
18197
18296
  "severity" on a new issue is how much it would matter if real; "confidence" is how sure you are that it is real. Separate axes — do not let one stand in for the other, and omit "confidence" rather than guessing a middle. Report only what is worth the reviewer's attention: empty arrays are valid answers and are far better than padded ones.`;
18198
18297
  }
18199
18298
  /**
@@ -18312,10 +18411,14 @@ function parseReconciliationResult(raw, priorCount, options = {}) {
18312
18411
  const note = asString$1(item.note).trim();
18313
18412
  const grade = parseGrade("issue", item.severity, item.severityReason);
18314
18413
  const cites = parseCitation(item.evidence);
18414
+ const resolvedBehaviour = asString$1(item.resolvedBehaviour).trim();
18415
+ const consequence = item.consequence === null ? null : normalizeConsequence(item.consequence);
18315
18416
  findings.push({
18316
18417
  sourceIndex,
18317
18418
  status,
18318
18419
  ...note ? { note } : {},
18420
+ ...consequence !== void 0 ? { consequence } : {},
18421
+ ...resolvedBehaviour && status === "resolved" ? { resolvedBehaviour } : {},
18319
18422
  ...grade ? { grade: {
18320
18423
  to: grade.to,
18321
18424
  reason: grade.reason
@@ -18333,6 +18436,7 @@ function parseReconciliationResult(raw, priorCount, options = {}) {
18333
18436
  recommendedStartingPoint: false
18334
18437
  })),
18335
18438
  summary: asString$1(obj.summary).trim(),
18439
+ orientation: asString$1(obj.orientation).trim(),
18336
18440
  overallRisk: RISKS.includes(obj.overallRisk) ? obj.overallRisk : null,
18337
18441
  recommendation: asString$1(obj.recommendation).trim(),
18338
18442
  nextSteps: asStringArray(obj.nextSteps)
@@ -18357,8 +18461,9 @@ function reconcileIssues(prior, findings, record) {
18357
18461
  const flag = issue.reconciliationStatus === "resolved" ? record?.flags?.get(index) : void 0;
18358
18462
  if (flag && record) {
18359
18463
  const entry = reassessedEntry(verdict, flag, record);
18464
+ const { resolvedBehaviour: _reopened, ...reassessed } = withRevisedConsequence(issue, verdict);
18360
18465
  return {
18361
- ...issue,
18466
+ ...reassessed,
18362
18467
  reconciliationStatus: entry.status,
18363
18468
  ...entry.reason ? { reconciliationNote: entry.reason } : {},
18364
18469
  statusHistory: appendStatusChange(issue, entry),
@@ -18368,8 +18473,11 @@ function reconcileIssues(prior, findings, record) {
18368
18473
  if (issue.reconciliationStatus === "resolved") return issue;
18369
18474
  const status = verdict?.status ?? "still-open";
18370
18475
  const recorded = record && isStatusChange(issue.reconciliationStatus, status) ? { statusHistory: appendStatusChange(issue, changeEntry(status, verdict, record)) } : {};
18476
+ const fixedInCode = status === "resolved" && !verdict?.evidence && record?.basis !== "conversation";
18477
+ const { resolvedBehaviour: _previous, ...current } = withRevisedConsequence(issue, verdict);
18371
18478
  return {
18372
- ...issue,
18479
+ ...current,
18480
+ ...fixedInCode && verdict?.resolvedBehaviour ? { resolvedBehaviour: verdict.resolvedBehaviour } : {},
18373
18481
  reconciliationStatus: status,
18374
18482
  ...verdict?.note ? { reconciliationNote: verdict.note } : {},
18375
18483
  ...recorded,
@@ -18378,6 +18486,24 @@ function reconcileIssues(prior, findings, record) {
18378
18486
  });
18379
18487
  }
18380
18488
  /**
18489
+ * The issue with its consequence kept, restated or withdrawn, as the update said.
18490
+ *
18491
+ * Only for an issue that already had one. An update is never the place a historical issue gains
18492
+ * an impact summary it was not written with, so an answer for one without is ignored. Silence
18493
+ * keeps it: the model was shown it and asked to change it only where it no longer holds.
18494
+ */
18495
+ function withRevisedConsequence(issue, verdict) {
18496
+ if (!issue.consequence || verdict?.consequence === void 0) return issue;
18497
+ if (verdict.consequence === null) {
18498
+ const { consequence: _withdrawn, ...rest } = issue;
18499
+ return rest;
18500
+ }
18501
+ return {
18502
+ ...issue,
18503
+ consequence: verdict.consequence
18504
+ };
18505
+ }
18506
+ /**
18381
18507
  * The same defences the findings get, applied to questions.
18382
18508
  *
18383
18509
  * Out-of-range and duplicate indices are dropped rather than allowed to throw, and the first answer
@@ -18571,6 +18697,7 @@ function applyReconciliation(previous, parsed, context) {
18571
18697
  const composed = {
18572
18698
  schemaVersion: 1,
18573
18699
  summary: parsed.summary || previous.summary,
18700
+ ...parsed.orientation || previous.orientation ? { orientation: parsed.orientation || previous.orientation } : {},
18574
18701
  ...motivation ? { motivation } : {},
18575
18702
  overallRisk: parsed.overallRisk ?? previous.overallRisk,
18576
18703
  recommendation: parsed.recommendation || previous.recommendation,
@@ -21233,4 +21360,4 @@ var MCP_TOOL_NAMES = [
21233
21360
  "ask_buddy"
21234
21361
  ];
21235
21362
  //#endregion
21236
- export { readAskRequest as $, versionFrom as $a, explanationOf as $i, authorPreview as $n, kissDecisionsOf as $r, recordRuntimeBestEffort as $t, settleQueue as A, isCommitReview as Aa, createWithMembers as Ai, moveIds as An, attemptIdOf as Ar, UpdateAlreadyRunningError as At, humanizeModelId as B, clearAgentPreference as Ba, queueStamp as Bi, existingPaths as Bn, phasesFor as Br, append as Bt, parsePullRequestLink as C, describeAuthorship as Ca, lifecyclePillAction as Ci, createPrState as Cn, followedBranch as Cr, RefreshUnavailableError as Ct, activateQueued as D, originRemote as Da, sectionOf as Di, markAllRead as Dn, fillFileUrlTemplate as Dr, parkedUpdateRefusal as Dt, relativeTime as E, resolveTarget as Ea, parseLifecycle as Ei, listNotifications as En, forgeResolver as Er, mergeUpdateInto as Et, spawnRunner as F, git as Fa, setMembership as Fi, retireNotification as Fn, pruneJobResidue as Fr, prepareReview as Ft, reviewTag as G, AGENT_IDS as Ga, issuesOutstanding as Gi, storedConversation as Gn, isClaimed as Gr, recordTelemetryUploadConsent as Gt, findingRef as H, writeAgentPreference as Ha, doneVerb as Hi, adoptLegacyBaseline as Hn, purposeOf as Hr, record as Ht, applyUpdate as I, refExists as Ia, updateCollections as Ii, toneOf as In, saveJob as Ir, settleReview as It, forgetAskRequest as J, agentIdentityOf as Ja, reviewerDispositions as Ji, isUnchanged as Jn, followedRefName as Jr, BUILD_VERSION as Jt, reviewTagsIn as K, agentById as Ka, questionsOutstanding as Ki, unforeseenFailure as Kn, CLAIM_LEASE_MS as Kr, telemetryUploadConsent as Kt, modelProvenanceOf as L, resolveAgent as La, queueAdd as Li, unreadAround as Ln, PHASES as Lr, reanalyseReview as Lt, RUNNER_MARKER as M, AmbiguousRefError as Ma, nameProblemText as Mi, readNotification as Mn, fail as Mr, runningJobs as Mt, cliEntry as N, shortNameOf as Na, readCollections as Ni, readStateOf as Nn, isTerminal as Nr, failureOf as Nt, compactQueue as O, DetachedHeadError as Oa, collectionsStamp as Oi, markRead as On, RUN_RECORD_RETENTION_MS as Or, updateReview as Ot, runDetached as P, shorthandOf as Pa, renameCollection as Pi, removeNotification as Pn, loadJob as Pr, observeReview as Pt, markAskRunning as Q, runnableAgents as Qa, explanationActionOf as Qi, UNESTABLISHED_MOTIVATION as Qn, kissDecisionRefusal as Qr, mapRuntimes as Qt, provenanceDetailLines as R, resolveModel as Ra, queueAddMany as Ri, unreadCount as Rn, isLiveJob as Rr, runJob as Rt, extractPullRequestLinks as S, objectWithAnyOf as Sa, lifecycleName as Si, createArchitectureNotification as Sn, checkReview as Sr, FETCH_TIMEOUT_MS as St, runBatch as T, kissOutcome as Ta, offersLifecycle as Ti, eventName as Tn, fetchHead as Tr, cancellableHere as Tt, findingRefs as U, CONFIG_PATH as Ua, isIssueOutstanding as Ui, prepareConversationWithin as Un, clearClaim as Ur, stamp as Ut, findingAtRef as V, readAgentPreference as Va, readQueue as Vi, ASK_REREAD_CEILING_MS as Vn, progressSteps as Vr, readEvents as Vt, refOf as W, STORE_ROOT as Wa, isQuestionOutstanding as Wi, saveRefresh as Wn, driverGone as Wr, deliver as Wt, isRequestId as X, isAgentId as Xa, processDiscussion as Xi, EXPLAIN_SIMPLY_PROMPT as Xn, indexKeptIds as Xr, feedbackUrl as Xt, interruption as Y, detectAgents as Ya, verdictClosure as Yi, agentEnvOf as Yn, groupByLineage as Yr, PACKAGE_NAME as Yt, isTerminalAsk as Z, parkedReason as Za, recommendationsOf as Zi, chatConversationSection as Zn, indexReviewGroups as Zr, waitingHistory as Zt, endRun as _, statusLookup as _a, activityAttributes as _i, writeJsonAtomically as _n, requestJobStop as _r, parseWorkspacePort as _t, lineageIds as a, assessmentLookup as aa, mutateWorkspace as ai, loadArchitecture as an, escapeHtml as ar, healthyPort as at, stopRun as b, asString$1 as ba, lifecycleChip as bi, subjectOf as bn, findExistingReview as br, writePortPreference as bt, discardJob as c, findingAssessment as ca, previousKissResult as ci, repositoryKey as cn, ReviewBeingDeletedError as cr, serverEntryExists as ct, startKissJob as d, gradeScale as da, reviewedRepositories as di, trackedFiles as dn, MANAGED_ROOT as dr, stopServer as dt, isExplanationAction as ea, latestKissRun as ei, RUNTIME_WORDS as en, AGENT_RUN_MARKER as eo, hasAuthorContent as er, recordAskAccepted as et, isDriving as f, isGradeFor as fa, summarise as fi, ownersOf as fn, createWorktree as fr, workspaceUrl as ft, completeRun as g, sourcePhrase as ga, LIFECYCLES as gi, isArchitectureId as gn, removeWorktree as gr, MIN_WORKSPACE_PORT as gt, beginRun as h, reassessIn as ha, workspaceStamps as hi, ancestorsOf as hn, readMarker as hr, MAX_WORKSPACE_PORT as ht, deleteReview as i, analysisRefOf as ia, matchingWorkspaceIds as ii, checkArchitecture as in, CODE_COPY_CLASS as ir, ensureServer as it, RUNNER_KINDS as j, resolveBase as ja, deleteCollection as ji, pruneNotifications as jn, endedAt as jr, liveUpdateFor as jt, queueForReview as k, TargetError as ka, createCollection as ki, markReadForReview as kn, allJobs as kr, askCheckout as kt, kissAgentId as l, findingIn as la, recentWorkspaces as li, storeArchitecture as ln, isBusy as lr, spawnServer as lt, RUN_KINDS as m, promptGrade as ma, workspaceRevision as mi, REPOSITORY_SCOPE as mn, isWorktreeHeld as mr, DEFAULT_WORKSPACE_PORT as mt, MCP_TOOL_NAMES as n, ANALYSIS_ONLY as na, lineagePosition as ni, formatDuration as nn, AgentUnavailableError as no, renderMarkdown as nr, bootstrapUrl as nt, liveJobsFor as o, closesFinding as oa, positionInLineage as oi, partFiles as on, renderInlineText as or, readServerRecord as ot, track as p, isOffered as pa, touchWorkspace as pi, QUOTE_LIMITS as pn, holdWorktree as pr, writeServerRecord as pt, endAskRequest as q, agentFor as qa, resolvedByConversation as qi, refreshPrContext as qn, decideKissRecommendation as qr, telemetryUploadEnabled as qt, deleteLineage as r, NO_STATUS as ra, loadWorkspace as ri, ARCHITECTURE_DIR as rn, CODE_BLOCK_CLASS as rr, clearServerRecordOwnedBy as rt, wasBlocked as s, currentGradeIn as sa, presentedKissRunOf as si, readArchitecture as sn, modelHelpLines as sr, reviewsUrl as st, MCP_SERVER_INFO_NAME as t, withExplanation as ta, lineageKey as ti, describeRuntimes as tn, AgentCancelledError as to, GITHUB_MARKDOWN as tr, readIndexToken as tt, recordKissRun as u, findingStatus as ua, reviewedCommit as ui, storedScopes as un, withReviewLock as ur, stopChild as ut, heldRuns as v, wasReassessed as va, activityLabel as vi, announceJob as vn, describeMovement as vr, resolveWorkspacePort as vt, unsupportedReason as w, WITHHELD_REASON as wa, lifecyclePillLabel as wi, createPrUpdate as wn, reviewedShaOf as wr, cancelUpdate as wt, batchIdentity as x, extractJsonText as xa, lifecycleItemLabel as xi, categoryOf as xn, checkCodeFreshness as xr, COMMIT_REVIEW_CANNOT_UPDATE as xt, reportRun as y, followUpFindingId as ya, isLifecycle as yi, branchOf as yn, describeSubject as yr, statedWorkspacePort as yt, agentDisplayName as z, agentIdOf as za, queueRemove as zi, withUsageRecorded as zn, isTerminalJobPhase as zr, startJob as zt };
21363
+ export { readAskRequest as $, runnableAgents as $a, explanationOf as $i, authorPreview as $n, kissDecisionsOf as $r, recordRuntimeBestEffort as $t, settleQueue as A, TargetError as Aa, createWithMembers as Ai, moveIds as An, attemptIdOf as Ar, UpdateAlreadyRunningError as At, humanizeModelId as B, agentIdOf as Ba, queueStamp as Bi, existingPaths as Bn, phasesFor as Br, append as Bt, parsePullRequestLink as C, objectWithAnyOf as Ca, lifecyclePillAction as Ci, createPrState as Cn, followedBranch as Cr, RefreshUnavailableError as Ct, activateQueued as D, resolveTarget as Da, sectionOf as Di, markAllRead as Dn, fillFileUrlTemplate as Dr, parkedUpdateRefusal as Dt, relativeTime as E, kissOutcome as Ea, parseLifecycle as Ei, listNotifications as En, forgeResolver as Er, mergeUpdateInto as Et, spawnRunner as F, shorthandOf as Fa, setMembership as Fi, retireNotification as Fn, pruneJobResidue as Fr, prepareReview as Ft, reviewTag as G, STORE_ROOT as Ga, issuesOutstanding as Gi, storedConversation as Gn, isClaimed as Gr, recordTelemetryUploadConsent as Gt, findingRef as H, readAgentPreference as Ha, doneVerb as Hi, adoptLegacyBaseline as Hn, purposeOf as Hr, record as Ht, applyUpdate as I, git as Ia, updateCollections as Ii, toneOf as In, saveJob as Ir, settleReview as It, forgetAskRequest as J, agentFor as Ja, reviewerDispositions as Ji, isUnchanged as Jn, followedRefName as Jr, BUILD_VERSION as Jt, reviewTagsIn as K, AGENT_IDS as Ka, questionsOutstanding as Ki, unforeseenFailure as Kn, CLAIM_LEASE_MS as Kr, telemetryUploadConsent as Kt, modelProvenanceOf as L, refExists as La, queueAdd as Li, unreadAround as Ln, PHASES as Lr, reanalyseReview as Lt, RUNNER_MARKER as M, resolveBase as Ma, nameProblemText as Mi, readNotification as Mn, fail as Mr, runningJobs as Mt, cliEntry as N, AmbiguousRefError as Na, readCollections as Ni, readStateOf as Nn, isTerminal as Nr, failureOf as Nt, compactQueue as O, originRemote as Oa, collectionsStamp as Oi, markRead as On, RUN_RECORD_RETENTION_MS as Or, updateReview as Ot, runDetached as P, shortNameOf as Pa, renameCollection as Pi, removeNotification as Pn, loadJob as Pr, observeReview as Pt, markAskRunning as Q, parkedReason as Qa, explanationActionOf as Qi, UNESTABLISHED_MOTIVATION as Qn, kissDecisionRefusal as Qr, mapRuntimes as Qt, provenanceDetailLines as R, resolveAgent as Ra, queueAddMany as Ri, unreadCount as Rn, isLiveJob as Rr, runJob as Rt, extractPullRequestLinks as S, extractJsonText as Sa, lifecycleName as Si, createArchitectureNotification as Sn, checkReview as Sr, FETCH_TIMEOUT_MS as St, runBatch as T, WITHHELD_REASON as Ta, offersLifecycle as Ti, eventName as Tn, fetchHead as Tr, cancellableHere as Tt, findingRefs as U, writeAgentPreference as Ua, isIssueOutstanding as Ui, prepareConversationWithin as Un, clearClaim as Ur, stamp as Ut, findingAtRef as V, clearAgentPreference as Va, readQueue as Vi, ASK_REREAD_CEILING_MS as Vn, progressSteps as Vr, readEvents as Vt, refOf as W, CONFIG_PATH as Wa, isQuestionOutstanding as Wi, saveRefresh as Wn, driverGone as Wr, deliver as Wt, isRequestId as X, detectAgents as Xa, processDiscussion as Xi, EXPLAIN_SIMPLY_PROMPT as Xn, indexKeptIds as Xr, feedbackUrl as Xt, interruption as Y, agentIdentityOf as Ya, verdictClosure as Yi, agentEnvOf as Yn, groupByLineage as Yr, PACKAGE_NAME as Yt, isTerminalAsk as Z, isAgentId as Za, recommendationsOf as Zi, chatConversationSection as Zn, indexReviewGroups as Zr, waitingHistory as Zt, endRun as _, statusLookup as _a, activityAttributes as _i, writeJsonAtomically as _n, requestJobStop as _r, parseWorkspacePort as _t, lineageIds as a, assessmentLookup as aa, mutateWorkspace as ai, loadArchitecture as an, escapeHtml as ar, healthyPort as at, stopRun as b, SEVERITIES as ba, lifecycleChip as bi, subjectOf as bn, findExistingReview as br, writePortPreference as bt, discardJob as c, findingAssessment as ca, previousKissResult as ci, repositoryKey as cn, ReviewBeingDeletedError as cr, serverEntryExists as ct, startKissJob as d, gradeScale as da, reviewedRepositories as di, trackedFiles as dn, MANAGED_ROOT as dr, stopServer as dt, isExplanationAction as ea, latestKissRun as ei, RUNTIME_WORDS as en, versionFrom as eo, hasAuthorContent as er, recordAskAccepted as et, isDriving as f, isGradeFor as fa, summarise as fi, ownersOf as fn, createWorktree as fr, workspaceUrl as ft, completeRun as g, sourcePhrase as ga, LIFECYCLES as gi, isArchitectureId as gn, removeWorktree as gr, MIN_WORKSPACE_PORT as gt, beginRun as h, reassessIn as ha, workspaceStamps as hi, ancestorsOf as hn, readMarker as hr, MAX_WORKSPACE_PORT as ht, deleteReview as i, analysisRefOf as ia, matchingWorkspaceIds as ii, checkArchitecture as in, CODE_COPY_CLASS as ir, ensureServer as it, RUNNER_KINDS as j, isCommitReview as ja, deleteCollection as ji, pruneNotifications as jn, endedAt as jr, liveUpdateFor as jt, queueForReview as k, DetachedHeadError as ka, createCollection as ki, markReadForReview as kn, allJobs as kr, askCheckout as kt, kissAgentId as l, findingIn as la, recentWorkspaces as li, storeArchitecture as ln, isBusy as lr, spawnServer as lt, RUN_KINDS as m, promptGrade as ma, workspaceRevision as mi, REPOSITORY_SCOPE as mn, isWorktreeHeld as mr, DEFAULT_WORKSPACE_PORT as mt, MCP_TOOL_NAMES as n, ANALYSIS_ONLY as na, lineagePosition as ni, formatDuration as nn, AgentCancelledError as no, renderMarkdown as nr, bootstrapUrl as nt, liveJobsFor as o, closesFinding as oa, positionInLineage as oi, partFiles as on, renderInlineText as or, readServerRecord as ot, track as p, isOffered as pa, touchWorkspace as pi, QUOTE_LIMITS as pn, holdWorktree as pr, writeServerRecord as pt, endAskRequest as q, agentById as qa, resolvedByConversation as qi, refreshPrContext as qn, decideKissRecommendation as qr, telemetryUploadEnabled as qt, deleteLineage as r, NO_STATUS as ra, loadWorkspace as ri, ARCHITECTURE_DIR as rn, AgentUnavailableError as ro, CODE_BLOCK_CLASS as rr, clearServerRecordOwnedBy as rt, wasBlocked as s, currentGradeIn as sa, presentedKissRunOf as si, readArchitecture as sn, modelHelpLines as sr, reviewsUrl as st, MCP_SERVER_INFO_NAME as t, withExplanation as ta, lineageKey as ti, describeRuntimes as tn, AGENT_RUN_MARKER as to, GITHUB_MARKDOWN as tr, readIndexToken as tt, recordKissRun as u, findingStatus as ua, reviewedCommit as ui, storedScopes as un, withReviewLock as ur, stopChild as ut, heldRuns as v, wasReassessed as va, activityLabel as vi, announceJob as vn, describeMovement as vr, resolveWorkspacePort as vt, unsupportedReason as w, describeAuthorship as wa, lifecyclePillLabel as wi, createPrUpdate as wn, reviewedShaOf as wr, cancelUpdate as wt, batchIdentity as x, asString$1 as xa, lifecycleItemLabel as xi, categoryOf as xn, checkCodeFreshness as xr, COMMIT_REVIEW_CANNOT_UPDATE as xt, reportRun as y, followUpFindingId as ya, isLifecycle as yi, branchOf as yn, describeSubject as yr, statedWorkspacePort as yt, agentDisplayName as z, resolveModel as za, queueRemove as zi, withUsageRecorded as zn, isTerminalJobPhase as zr, startJob as zt };