chorus-codes 0.8.40 → 0.8.42

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.
Files changed (85) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +1 -1
  3. package/.next/build-manifest.json +2 -2
  4. package/.next/prerender-manifest.json +3 -3
  5. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  6. package/.next/server/app/_global-error.html +1 -1
  7. package/.next/server/app/_global-error.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  14. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  15. package/.next/server/app/_not-found.html +1 -1
  16. package/.next/server/app/_not-found.rsc +1 -1
  17. package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  18. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  20. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  21. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  22. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  23. package/.next/server/app/connect/page_client-reference-manifest.js +1 -1
  24. package/.next/server/app/demo/[scenario]/page_client-reference-manifest.js +1 -1
  25. package/.next/server/app/new/page_client-reference-manifest.js +1 -1
  26. package/.next/server/app/new.html +1 -1
  27. package/.next/server/app/new.rsc +1 -1
  28. package/.next/server/app/new.segments/_full.segment.rsc +1 -1
  29. package/.next/server/app/new.segments/_head.segment.rsc +1 -1
  30. package/.next/server/app/new.segments/_index.segment.rsc +1 -1
  31. package/.next/server/app/new.segments/_tree.segment.rsc +1 -1
  32. package/.next/server/app/new.segments/new/__PAGE__.segment.rsc +1 -1
  33. package/.next/server/app/new.segments/new.segment.rsc +1 -1
  34. package/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  35. package/.next/server/app/onboarding.html +1 -1
  36. package/.next/server/app/onboarding.rsc +1 -1
  37. package/.next/server/app/onboarding.segments/_full.segment.rsc +1 -1
  38. package/.next/server/app/onboarding.segments/_head.segment.rsc +1 -1
  39. package/.next/server/app/onboarding.segments/_index.segment.rsc +1 -1
  40. package/.next/server/app/onboarding.segments/_tree.segment.rsc +1 -1
  41. package/.next/server/app/onboarding.segments/onboarding/__PAGE__.segment.rsc +1 -1
  42. package/.next/server/app/onboarding.segments/onboarding.segment.rsc +1 -1
  43. package/.next/server/app/page_client-reference-manifest.js +1 -1
  44. package/.next/server/app/personas/page_client-reference-manifest.js +1 -1
  45. package/.next/server/app/personas.html +1 -1
  46. package/.next/server/app/personas.rsc +1 -1
  47. package/.next/server/app/personas.segments/_full.segment.rsc +1 -1
  48. package/.next/server/app/personas.segments/_head.segment.rsc +1 -1
  49. package/.next/server/app/personas.segments/_index.segment.rsc +1 -1
  50. package/.next/server/app/personas.segments/_tree.segment.rsc +1 -1
  51. package/.next/server/app/personas.segments/personas/__PAGE__.segment.rsc +1 -1
  52. package/.next/server/app/personas.segments/personas.segment.rsc +1 -1
  53. package/.next/server/app/runs/[runId]/page_client-reference-manifest.js +1 -1
  54. package/.next/server/app/runs/page_client-reference-manifest.js +1 -1
  55. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  56. package/.next/server/app/settings/permissions/page_client-reference-manifest.js +1 -1
  57. package/.next/server/app/settings.html +1 -1
  58. package/.next/server/app/settings.rsc +1 -1
  59. package/.next/server/app/settings.segments/_full.segment.rsc +1 -1
  60. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  61. package/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  62. package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  63. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
  64. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  65. package/.next/server/app/templates/page_client-reference-manifest.js +1 -1
  66. package/.next/server/app/templates.html +1 -1
  67. package/.next/server/app/templates.rsc +1 -1
  68. package/.next/server/app/templates.segments/_full.segment.rsc +1 -1
  69. package/.next/server/app/templates.segments/_head.segment.rsc +1 -1
  70. package/.next/server/app/templates.segments/_index.segment.rsc +1 -1
  71. package/.next/server/app/templates.segments/_tree.segment.rsc +1 -1
  72. package/.next/server/app/templates.segments/templates/__PAGE__.segment.rsc +1 -1
  73. package/.next/server/app/templates.segments/templates.segment.rsc +1 -1
  74. package/.next/server/app-paths-manifest.json +1 -1
  75. package/.next/server/middleware-build-manifest.js +1 -1
  76. package/.next/server/pages/404.html +1 -1
  77. package/.next/server/pages/500.html +1 -1
  78. package/.next/server/server-reference-manifest.json +1 -1
  79. package/.next/trace +20 -20
  80. package/.next/trace-build +1 -1
  81. package/dist/daemon/runner/verdict.js +35 -10
  82. package/dist/daemon/runner/verdict.js.map +1 -1
  83. package/package.json +1 -1
  84. /package/.next/static/{Hi6eefqGYOZt5vMhn8uxn → PMumb0KgX0BaE-POyj5i_}/_buildManifest.js +0 -0
  85. /package/.next/static/{Hi6eefqGYOZt5vMhn8uxn → PMumb0KgX0BaE-POyj5i_}/_ssgManifest.js +0 -0
package/.next/trace-build CHANGED
@@ -1 +1 @@
1
- [{"name":"run-webpack","duration":10616055,"timestamp":7591428153347,"id":14,"parentId":1,"tags":{},"startTime":1778982798579,"traceId":"f9ba0ee77fc34f5f"},{"name":"run-typescript","duration":5913143,"timestamp":7591438772500,"id":2118,"parentId":1,"tags":{},"startTime":1778982809199,"traceId":"f9ba0ee77fc34f5f"},{"name":"static-check","duration":423410,"timestamp":7591444733460,"id":2121,"parentId":1,"tags":{},"startTime":1778982815159,"traceId":"f9ba0ee77fc34f5f"},{"name":"static-generation","duration":1168776,"timestamp":7591445596866,"id":2161,"parentId":1,"tags":{},"startTime":1778982816023,"traceId":"f9ba0ee77fc34f5f"},{"name":"collect-build-traces","duration":6134038,"timestamp":7591445157333,"id":2158,"parentId":1,"tags":{},"startTime":1778982815583,"traceId":"f9ba0ee77fc34f5f"},{"name":"telemetry-flush","duration":33,"timestamp":7591451293114,"id":2170,"parentId":1,"tags":{},"startTime":1778982821719,"traceId":"f9ba0ee77fc34f5f"},{"name":"next-build","duration":23227142,"timestamp":7591428066015,"id":1,"tags":{"buildMode":"default","version":"16.2.4","bundler":"webpack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778982798492,"traceId":"f9ba0ee77fc34f5f"}]
1
+ [{"name":"run-webpack","duration":10400394,"timestamp":7785070234903,"id":14,"parentId":1,"tags":{},"startTime":1779176440661,"traceId":"96c0634f7218b45d"},{"name":"run-typescript","duration":5817929,"timestamp":7785080638605,"id":2118,"parentId":1,"tags":{},"startTime":1779176451065,"traceId":"96c0634f7218b45d"},{"name":"static-check","duration":399936,"timestamp":7785086503435,"id":2121,"parentId":1,"tags":{},"startTime":1779176456929,"traceId":"96c0634f7218b45d"},{"name":"static-generation","duration":1292404,"timestamp":7785087076198,"id":2161,"parentId":1,"tags":{},"startTime":1779176457502,"traceId":"96c0634f7218b45d"},{"name":"collect-build-traces","duration":6348634,"timestamp":7785086903776,"id":2158,"parentId":1,"tags":{},"startTime":1779176457330,"traceId":"96c0634f7218b45d"},{"name":"telemetry-flush","duration":30,"timestamp":7785093254055,"id":2170,"parentId":1,"tags":{},"startTime":1779176463680,"traceId":"96c0634f7218b45d"},{"name":"next-build","duration":23101152,"timestamp":7785070152943,"id":1,"tags":{"buildMode":"default","version":"16.2.4","bundler":"webpack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1779176440579,"traceId":"96c0634f7218b45d"}]
@@ -25,21 +25,46 @@ function verdictFromReviewerText(content) {
25
25
  // `do not approve` / `cannot approve`. Both spellings are common in real
26
26
  // reviews. The optional `['’]?t` segment catches both straight (') and
27
27
  // typographic (’) apostrophes — LLMs emit the latter often.
28
- const negatives = /\b(request changes|requesting changes|disagree|reject(?:ed|ing)?|blocker|(?:do not|don['’]?t) (?:approve|merge)|(?:cannot|can['’]?t) (?:approve|merge)|nack)\b/;
28
+ //
29
+ // Issue #52 expansions (the original list missed real-world rejections
30
+ // that happened to end with a polite "I'd approve once …" kicker):
31
+ // - request(?:s|ed|ing)? changes — covers requests/requested/requesting
32
+ // - not (?:approved|ready|merging|ok|acceptable|good to (?:merge|ship))
33
+ // - approve (?:after|once|when|conditional(?:ly)?|if|provided|assuming)
34
+ // - conditional(?:ly)? approve
35
+ // — both forms reframe conditional approvals as negative, since
36
+ // the reviewer is explicitly NOT approving the current diff.
37
+ // - would(?:\s+not|n['’]?t) approve
38
+ //
39
+ // Round-1 self-review (3 convergent dissenters) flagged candidate
40
+ // patterns `changes (?:are )?(?:needed|required|requested)` and
41
+ // `needs (?:work|changes|fixes)` as too ambiguous — both match in
42
+ // clean-approval contexts like "no changes needed, LGTM" or "the
43
+ // changes requested by the reviewer are fine". They're dropped from
44
+ // the negatives list; the remaining patterns still catch all three
45
+ // concrete leak cases in brianmarr's report (case 2a is caught by
46
+ // `approve after`, case 2 family by `not ready`).
47
+ const negatives = /\b(request(?:s|ed|ing)? changes|not (?:approved|ready|merging|ok|acceptable|good to (?:merge|ship))|approve (?:after|once|when|conditional(?:ly)?|if|provided|assuming)|conditional(?:ly)? approve|would(?:\s+not|n['’]?t) approve|disagree|reject(?:ed|ing)?|blocker|(?:do not|don['’]?t) (?:approve|merge)|(?:cannot|can['’]?t) (?:approve|merge)|nack)\b/;
29
48
  const positives = /\b(approve(?:d|s)?|lgtm|looks good to me|no concerns|ship it|ack)\b/;
30
- // Check verdict keywords FIRST — a terse but explicit reply like
31
- // "approve ## DONE" (15 chars after sentinel strip) is unambiguous and
32
- // shouldn't be filtered out by the length floor. Tail wins over whole
33
- // so an analytical review mentioning "good practice" mid-paragraph
34
- // doesn't get auto-approved without an explicit verdict at the end.
49
+ const whole = stripped.toLowerCase();
35
50
  const tail = stripped.slice(-400).toLowerCase();
36
- if (negatives.test(tail))
51
+ // Negatives win globally. Issue #52: previously the function returned
52
+ // TRUE when the tail contained a positive token even if the body of
53
+ // the answer carried an explicit rejection. Real reviewers routinely
54
+ // write "Request changes. … [substantive critique] … Happy to approve
55
+ // once these are addressed." — that's a rejection, not an approval.
56
+ // Scan the entire stripped answer for negatives first; only fall
57
+ // through to positives once we've confirmed there's no rejection
58
+ // anywhere in the text.
59
+ if (negatives.test(whole))
37
60
  return false;
61
+ // Positives prefer the tail so an analytical review mentioning
62
+ // "good practice" mid-paragraph doesn't get auto-approved without an
63
+ // explicit verdict at the end. Whole-text fallback catches the case
64
+ // where the verdict lives mid-body and the tail is padded with
65
+ // closing matter (test: "falls back to whole-text scan").
38
66
  if (positives.test(tail))
39
67
  return true;
40
- const whole = stripped.toLowerCase();
41
- if (negatives.test(whole))
42
- return false;
43
68
  if (positives.test(whole))
44
69
  return true;
45
70
  // No verdict keyword anywhere — return null (ambiguous). The 20-char
@@ -1 +1 @@
1
- {"version":3,"file":"verdict.js","sourceRoot":"","sources":["../../../src/daemon/runner/verdict.ts"],"names":[],"mappings":";;AAiBA,0DA+BC;AAhDD;;;;;;;;;;;;;;;;GAgBG;AACH,SAAgB,uBAAuB,CAAC,OAAe;IACrD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAE9D,oEAAoE;IACpE,yEAAyE;IACzE,yEAAyE;IACzE,uEAAuE;IACvE,4DAA4D;IAC5D,MAAM,SAAS,GACb,gKAAgK,CAAC;IACnK,MAAM,SAAS,GACb,qEAAqE,CAAC;IAExE,iEAAiE;IACjE,uEAAuE;IACvE,sEAAsE;IACtE,mEAAmE;IACnE,oEAAoE;IACpE,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;IAChD,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtC,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACrC,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvC,qEAAqE;IACrE,qEAAqE;IACrE,uEAAuE;IACvE,wDAAwD;IACxD,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"verdict.js","sourceRoot":"","sources":["../../../src/daemon/runner/verdict.ts"],"names":[],"mappings":";;AAiBA,0DA0DC;AA3ED;;;;;;;;;;;;;;;;GAgBG;AACH,SAAgB,uBAAuB,CAAC,OAAe;IACrD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAE9D,oEAAoE;IACpE,yEAAyE;IACzE,yEAAyE;IACzE,uEAAuE;IACvE,4DAA4D;IAC5D,EAAE;IACF,uEAAuE;IACvE,mEAAmE;IACnE,4EAA4E;IAC5E,0EAA0E;IAC1E,0EAA0E;IAC1E,iCAAiC;IACjC,oEAAoE;IACpE,mEAAmE;IACnE,sCAAsC;IACtC,EAAE;IACF,kEAAkE;IAClE,gEAAgE;IAChE,kEAAkE;IAClE,iEAAiE;IACjE,oEAAoE;IACpE,mEAAmE;IACnE,kEAAkE;IAClE,kDAAkD;IAClD,MAAM,SAAS,GACb,6VAA6V,CAAC;IAChW,MAAM,SAAS,GACb,qEAAqE,CAAC;IAExE,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;IAEhD,sEAAsE;IACtE,oEAAoE;IACpE,qEAAqE;IACrE,sEAAsE;IACtE,oEAAoE;IACpE,iEAAiE;IACjE,iEAAiE;IACjE,wBAAwB;IACxB,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAExC,+DAA+D;IAC/D,qEAAqE;IACrE,oEAAoE;IACpE,+DAA+D;IAC/D,0DAA0D;IAC1D,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvC,qEAAqE;IACrE,qEAAqE;IACrE,uEAAuE;IACvE,wDAAwD;IACxD,OAAO,IAAI,CAAC;AACd,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "chorus-codes",
3
- "version": "0.8.40",
3
+ "version": "0.8.42",
4
4
  "description": "Driver-agnostic multi-LLM peer review for code decisions. Bring your own CLI; Chorus convenes 2-4 other LLMs to review the work before you ship.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "99x Agency",