lazycodex-ai 5.1.35 → 5.1.40

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 (138) hide show
  1. package/dist/cli/index.js +211 -189
  2. package/dist/cli-node/index.js +211 -189
  3. package/package.json +1 -1
  4. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  5. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +8 -2
  6. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  7. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  8. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  9. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  10. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  11. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  12. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  13. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  14. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  15. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  16. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  17. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  18. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  19. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  20. package/packages/omo-codex/plugin/components/teammode/package.json +2 -2
  21. package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +157 -151
  22. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +157 -151
  23. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  24. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  25. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  26. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  27. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +1 -1
  28. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +5 -4
  29. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  30. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  31. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  32. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  33. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  34. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  35. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  36. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  37. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  38. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  39. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  40. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  41. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  42. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  43. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  44. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  45. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  46. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  47. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  48. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  49. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  50. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  51. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  52. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  53. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  54. package/packages/omo-codex/plugin/package-lock.json +18 -17
  55. package/packages/omo-codex/plugin/package.json +1 -1
  56. package/packages/omo-codex/plugin/shared/package.json +1 -1
  57. package/packages/omo-codex/plugin/skills/browser/runtime/omowright/index.js +4 -4
  58. package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +2 -2
  59. package/packages/omo-codex/plugin/skills/frontend/SKILL.md +8 -1
  60. package/packages/omo-codex/plugin/skills/frontend/references/design/README.md +3 -2
  61. package/packages/omo-codex/plugin/skills/frontend/references/perfection/README.md +2 -1
  62. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/accent-stripes/color.ts +132 -0
  63. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/accent-stripes/css-parse.ts +103 -0
  64. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/accent-stripes/declarations.ts +156 -0
  65. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/accent-stripes/findings.ts +34 -0
  66. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/accent-stripes/gradient.ts +70 -0
  67. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/accent-stripes/lint.ts +110 -0
  68. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/accent-stripes/markup.ts +148 -0
  69. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/accent-stripes/selector.ts +46 -0
  70. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/accent-stripes/tailwind.ts +117 -0
  71. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/check-accent-stripes.ts +50 -0
  72. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/accent-stripes/negative/exempt-states.css +4 -0
  73. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/accent-stripes/negative/flat-stripe-side.tsx +11 -0
  74. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/accent-stripes/negative/full-surface-gradients.css +34 -0
  75. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/accent-stripes/negative/inline-ok.tsx +7 -0
  76. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/accent-stripes/negative/neutral-and-flat.css +6 -0
  77. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/accent-stripes/negative/pseudo-overlays.css +3 -0
  78. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/accent-stripes/negative/tailwind-ok.tsx +11 -0
  79. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/accent-stripes/negative/uniform-and-rings.css +3 -0
  80. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/accent-stripes/negative/wide-blocks-and-hairlines.css +3 -0
  81. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/accent-stripes/positive/apply.css +3 -0
  82. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/accent-stripes/positive/border-top-card.css +5 -0
  83. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/accent-stripes/positive/cva-variant.ts +1 -0
  84. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/accent-stripes/positive/gradient-edges.css +26 -0
  85. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/accent-stripes/positive/inline-styles.tsx +6 -0
  86. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/accent-stripes/positive/inset-shadow.css +4 -0
  87. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/accent-stripes/positive/non-visible-focus-and-nested.tsx +6 -0
  88. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/accent-stripes/positive/pseudo-bar.css +13 -0
  89. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/accent-stripes/positive/split-rule-and-token.scss +14 -0
  90. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/accent-stripes/positive/styled-components.tsx +14 -0
  91. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/accent-stripes/positive/tailwind-cards.tsx +8 -0
  92. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/accent-stripes/positive/tailwind-inset-and-style.vue +11 -0
  93. package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/accent-stripes/positive/tailwind-pseudo.html +3 -0
  94. package/packages/omo-codex/plugin/skills/git-master/SKILL.md +1 -1
  95. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +1 -1
  96. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +5 -4
  97. package/packages/omo-codex/scripts/install-dist/install-local.mjs +180 -169
  98. package/packages/shared-skills/skills/browser/runtime/omowright/index.js +4 -4
  99. package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +2 -2
  100. package/packages/shared-skills/skills/frontend/SKILL.md +8 -1
  101. package/packages/shared-skills/skills/frontend/references/design/README.md +3 -2
  102. package/packages/shared-skills/skills/frontend/references/perfection/README.md +2 -1
  103. package/packages/shared-skills/skills/frontend/scripts/perfection/accent-stripes/color.ts +132 -0
  104. package/packages/shared-skills/skills/frontend/scripts/perfection/accent-stripes/css-parse.ts +103 -0
  105. package/packages/shared-skills/skills/frontend/scripts/perfection/accent-stripes/declarations.ts +156 -0
  106. package/packages/shared-skills/skills/frontend/scripts/perfection/accent-stripes/findings.ts +34 -0
  107. package/packages/shared-skills/skills/frontend/scripts/perfection/accent-stripes/gradient.ts +70 -0
  108. package/packages/shared-skills/skills/frontend/scripts/perfection/accent-stripes/lint.ts +110 -0
  109. package/packages/shared-skills/skills/frontend/scripts/perfection/accent-stripes/markup.ts +148 -0
  110. package/packages/shared-skills/skills/frontend/scripts/perfection/accent-stripes/selector.ts +46 -0
  111. package/packages/shared-skills/skills/frontend/scripts/perfection/accent-stripes/tailwind.ts +117 -0
  112. package/packages/shared-skills/skills/frontend/scripts/perfection/check-accent-stripes.test.ts +86 -0
  113. package/packages/shared-skills/skills/frontend/scripts/perfection/check-accent-stripes.ts +50 -0
  114. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/accent-stripes/negative/exempt-states.css +4 -0
  115. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/accent-stripes/negative/flat-stripe-side.tsx +11 -0
  116. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/accent-stripes/negative/full-surface-gradients.css +34 -0
  117. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/accent-stripes/negative/inline-ok.tsx +7 -0
  118. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/accent-stripes/negative/neutral-and-flat.css +6 -0
  119. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/accent-stripes/negative/pseudo-overlays.css +3 -0
  120. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/accent-stripes/negative/tailwind-ok.tsx +11 -0
  121. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/accent-stripes/negative/uniform-and-rings.css +3 -0
  122. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/accent-stripes/negative/wide-blocks-and-hairlines.css +3 -0
  123. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/accent-stripes/positive/apply.css +3 -0
  124. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/accent-stripes/positive/border-top-card.css +5 -0
  125. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/accent-stripes/positive/cva-variant.ts +1 -0
  126. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/accent-stripes/positive/gradient-edges.css +26 -0
  127. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/accent-stripes/positive/inline-styles.tsx +6 -0
  128. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/accent-stripes/positive/inset-shadow.css +4 -0
  129. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/accent-stripes/positive/non-visible-focus-and-nested.tsx +6 -0
  130. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/accent-stripes/positive/pseudo-bar.css +13 -0
  131. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/accent-stripes/positive/split-rule-and-token.scss +14 -0
  132. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/accent-stripes/positive/styled-components.tsx +14 -0
  133. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/accent-stripes/positive/tailwind-cards.tsx +8 -0
  134. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/accent-stripes/positive/tailwind-inset-and-style.vue +11 -0
  135. package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/accent-stripes/positive/tailwind-pseudo.html +3 -0
  136. package/packages/shared-skills/skills/git-master/SKILL.md +1 -1
  137. package/packages/shared-skills/skills/ulw-plan/SKILL.md +1 -1
  138. package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +5 -4
@@ -0,0 +1,5 @@
1
+ .feature-card {
2
+ padding: 24px;
3
+ border-radius: 12px;
4
+ border-top: 4px solid #6366f1;
5
+ }
@@ -0,0 +1 @@
1
+ export const card = cva("rounded-xl bg-white p-6 border-l-4 border-rose-500")
@@ -0,0 +1,26 @@
1
+ .hard-stop {
2
+ border-radius: 12px;
3
+ background: linear-gradient(to right, #6366f1 4px, #fff 4px);
4
+ }
5
+
6
+ .image-border {
7
+ border-radius: 12px;
8
+ border-left: 4px solid;
9
+ border-image: linear-gradient(#6366f1, #a855f7) 1;
10
+ }
11
+
12
+ .glow { position: relative; border-radius: 12px; }
13
+ .glow::before {
14
+ content: "";
15
+ position: absolute;
16
+ top: 0;
17
+ bottom: 0;
18
+ left: 0;
19
+ width: 3px;
20
+ background: linear-gradient(to bottom, #6366f1, #a855f7);
21
+ }
22
+
23
+ .end-band {
24
+ border-radius: 12px;
25
+ background-image: linear-gradient(to right, #fff calc(100% - 4px), #f43f5e calc(100% - 4px));
26
+ }
@@ -0,0 +1,6 @@
1
+ export const Tip = () => (
2
+ <>
3
+ <div style={{ borderRadius: 12, borderLeft: "4px solid #ef4444" }}>Careful</div>
4
+ <div className="rounded-lg" style={{ borderTop: '3px solid var(--brand)' }}>New</div>
5
+ </>
6
+ )
@@ -0,0 +1,4 @@
1
+ .note {
2
+ border-radius: 8px;
3
+ box-shadow: inset 4px 0 0 0 oklch(0.65 0.2 250), 0 1px 2px rgb(0 0 0 / 0.06);
4
+ }
@@ -0,0 +1,6 @@
1
+ const css = css`
2
+ .card:focus-within { border-radius: 12px; border-left: 3px solid #6366f1; }
3
+ td .promo-card { border-radius: 8px; border-left: 4px solid #f43f5e; }
4
+ `
5
+
6
+ export const Focused = () => <div className="rounded-xl focus:border-l-4 focus:border-indigo-500">Card</div>
@@ -0,0 +1,13 @@
1
+ .stat {
2
+ position: relative;
3
+ border-radius: 12px;
4
+ overflow: hidden;
5
+ }
6
+
7
+ .stat::before {
8
+ content: "";
9
+ position: absolute;
10
+ inset: 0 auto 0 0;
11
+ width: 4px;
12
+ background: #10b981;
13
+ }
@@ -0,0 +1,14 @@
1
+ .callout {
2
+ border-radius: 0.75rem;
3
+ border-left: 3px solid var(--color-accent);
4
+ }
5
+
6
+ .tile {
7
+ border-radius: 16px;
8
+ background: var(--surface);
9
+ &.is-featured {
10
+ border-left-width: 4px;
11
+ border-left-style: solid;
12
+ border-left-color: hsl(262 83% 58%);
13
+ }
14
+ }
@@ -0,0 +1,14 @@
1
+ import styled, { createGlobalStyle } from "styled-components"
2
+
3
+ export const Banner = styled.div`
4
+ padding: ${({ theme }) => theme.space[4]}px;
5
+ border-radius: 12px;
6
+ border-left: 4px solid #2563eb;
7
+ `
8
+
9
+ export const Global = createGlobalStyle`
10
+ .promo-card {
11
+ border-radius: 8px;
12
+ border-top: 3px solid var(--color-brand);
13
+ }
14
+ `
@@ -0,0 +1,8 @@
1
+ export function Cards({ featured }: { featured: boolean }) {
2
+ return (
3
+ <section>
4
+ <div className="rounded-xl border-l-4 border-indigo-500 bg-white p-6">Fast</div>
5
+ <article className={cn("rounded-2xl p-4", featured && "border-t-4 border-t-primary")}>Plans</article>
6
+ </section>
7
+ )
8
+ }
@@ -0,0 +1,11 @@
1
+ <template>
2
+ <div class="rounded-md p-4 shadow-[inset_3px_0_0_0_#f59e0b]">Heads up</div>
3
+ <div class="quote">Quote</div>
4
+ </template>
5
+
6
+ <style scoped>
7
+ .quote {
8
+ border-radius: 10px;
9
+ border-left: 5px solid rebeccapurple;
10
+ }
11
+ </style>
@@ -0,0 +1,3 @@
1
+ <div class="relative overflow-hidden rounded-lg p-6 before:absolute before:inset-y-0 before:left-0 before:w-1 before:bg-emerald-500">
2
+ Uptime 99.99%
3
+ </div>
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: git-master
3
- description: "Handles git work: atomic commits, rebase, squash, blame, bisect, reflog, and history questions. Use whenever a task needs a commit or a git-history investigation; skip for ordinary code edits."
3
+ description: "MUST USE for ANY git operations: atomic commits, rebase/squash/fixup, and history search (blame, bisect, log -S, reflog). Load it before running git yourself, or pass load_skills=['git-master'] to the task that commits. Triggers: 'commit', 'rebase', 'squash', 'who wrote', 'when was X added', 'find the commit that'."
4
4
  ---
5
5
 
6
6
  # Git Master
@@ -34,7 +34,7 @@ Example opening (adapt the wording, keep every commitment):
34
34
 
35
35
  ## INTENT ROUTING - pick ONE intent reference
36
36
 
37
- **Review modifiers are a gate trigger, not a style cue.** If the user says "high accuracy", "ultra high accuracy", "고정밀", "deep review", or equivalent - in ANY turn, even appended to a follow-up question and even after the plan already exists - set `review_required: true` in the draft: the dual high-accuracy review (native `momus` + the independent Oracle review) is now REQUIRED before handoff, and if the plan already exists you run it this same turn. The review runs under the bounded convergence contract in `full-workflow.md`: a 5-round cap (unlimited only on explicit user request), evidence-backed blocker eligibility, and approval-with-notes counting as approval. Answering the current question more carefully does NOT satisfy it. This does NOT choose CLEAR/UNCLEAR and does NOT suppress interview.
37
+ **Review modifiers are a gate trigger, not a style cue.** If the user says "high accuracy", "ultra high accuracy", "고정밀", "deep review", or equivalent - in ANY turn, even appended to a follow-up question and even after the plan already exists - set `review_required: true` in the draft: the dual high-accuracy review (native `momus` + the independent Oracle review) is now REQUIRED before handoff, and if the plan already exists you run it this same turn. The review runs under the bounded convergence contract in `full-workflow.md`: convergence-bounded rounds (another round only while the previous one raised a new blocker-eligible finding or closed a ledger blocker; a round with neither that still does not approve stops the review), evidence-backed blocker eligibility, and approval-with-notes counting as approval. Answering the current question more carefully does NOT satisfy it. This does NOT choose CLEAR/UNCLEAR and does NOT suppress interview.
38
38
 
39
39
  After grounding, make ONE judgment, record `intent: clear|unclear` plus `review_required`, **ANNOUNCE both to the user in one line**, then load ONE intent reference (you ALSO read `references/full-workflow.md` for the shared mechanics - see below). The test keys on whether the desired **OUTCOME** is clear, NOT on request length. This verdict line and the opening announcement above are the two mandatory user-visible signals of a planning session - it tells the user whether they will be interviewed and whether high-accuracy review is already requested; never skip either.
40
40
 
@@ -214,14 +214,15 @@ Every reviewer prompt must carry this intake contract with all angle-bracket val
214
214
  The first action must open the literal workspace root as a directory descriptor, then traverse `.omo`, `plans`, and the final target with descriptor-relative no-follow opens, `fstat` each ancestor as a directory and the final descriptor as a regular file, and hash all bytes read from that same final descriptor. If the platform cannot guarantee this chain, or any path/runtime/launch/receipt/digest check drifts, return `INCONCLUSIVE` before reviewing. Echo the literal workspace, runtime home, target, digest, round, and launch ID; the parent separately matches the completion envelope to the persisted session/process receipt. Never search or use another artifact.
215
215
 
216
216
  ### Bounded convergence (the review must terminate)
217
- Review rounds are capped at 5 (unlimited only on explicit user request), and an approval whose only remaining items are notes counts as approval. A finding may BLOCK only when it names at least one `blocker_eligibility` category below with its concrete evidence - an IS row no todo closes, no QA scenario proves, or the approach cannot reach for the named user is such a category; every other finding - speculative durability, replay/crash-recovery, schema, CLI-parsing, state-machine, or hardening concerns the accepted scope never required - is recorded as a non-blocking note and becomes implementation/test work, never plan expansion. After round 1 the blocker ledger FREEZES: later rounds verify accepted ledger blockers, regressions introduced by fixes, and new findings that pass eligibility - they never rediscover the plan from scratch. Fixes apply the smallest edit that resolves the cited blocker; neither reviews nor fixes grow the plan's scope. Every reviewer prompt carries this convergence contract alongside the intake contract. On cap exhaustion without approval: STOP, report outstanding blockers, ask the user - continue / accept / adjust.
217
+ Review continues until unconditional approval, but a further round runs only while the previous round made progress: it raised at least one NEW blocker-eligible finding (one not already in the ledger and not a restatement of a closed blocker), or it confirmed at least one ledger blocker closed. A round that does neither and still does not approve ends the review: stop, report the outstanding blockers, and ask the user. This is the non-convergence guard, so there is no fixed round count; it terminates because the ledger is frozen after round 1, so every closure shrinks it. An approval whose only remaining items are notes counts as approval. A finding may BLOCK only when it names at least one `blocker_eligibility` category below with its concrete evidence - an IS row no todo closes, no QA scenario proves, or the approach cannot reach for the named user is such a category; every other finding - speculative durability, replay/crash-recovery, schema, CLI-parsing, state-machine, or hardening concerns the accepted scope never required - is recorded as a non-blocking note and becomes implementation/test work, never plan expansion. After round 1 the blocker ledger FREEZES: later rounds verify accepted ledger blockers, regressions introduced by fixes, and new findings that pass eligibility - they never rediscover the plan from scratch. Fixes apply the smallest edit that resolves the cited blocker; neither reviews nor fixes grow the plan's scope. Every reviewer prompt carries this convergence contract alongside the intake contract. On cap exhaustion without approval: STOP, report outstanding blockers, ask the user - continue / accept / adjust.
218
218
 
219
219
  <!-- ulw-plan-review-convergence-contract -->
220
220
  ```json
221
221
  {
222
- "max_rounds": 5,
223
- "max_rounds_override": "explicit_user_request_only",
224
- "on_cap_reached": "stop_report_outstanding_blockers_ask_user",
222
+ "max_rounds": null,
223
+ "continue_while": "previous_round_raised_new_blocker_eligible_finding_or_closed_ledger_blocker",
224
+ "stop_on": "round_without_new_blocker_eligible_finding_or_ledger_blocker_closure",
225
+ "on_stop_without_approval": "stop_report_outstanding_blockers_ask_user",
225
226
  "blocker_eligibility": [
226
227
  "explicit_requirement_or_accepted_decision",
227
228
  "existing_failing_regression",