lazycodex-ai 5.1.38 → 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 (64) hide show
  1. package/dist/cli/index.js +206 -187
  2. package/dist/cli-node/index.js +206 -187
  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 +1 -1
  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 +12 -12
  55. package/packages/omo-codex/plugin/package.json +1 -1
  56. package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +1 -1
  57. package/packages/omo-codex/plugin/skills/git-master/SKILL.md +1 -1
  58. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +1 -1
  59. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +5 -4
  60. package/packages/omo-codex/scripts/install-dist/install-local.mjs +179 -168
  61. package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +1 -1
  62. package/packages/shared-skills/skills/git-master/SKILL.md +1 -1
  63. package/packages/shared-skills/skills/ulw-plan/SKILL.md +1 -1
  64. package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +5 -4
@@ -381,6 +381,157 @@ function getTelemetryHost(env = process.env, defaultHost = DEFAULT_POSTHOG_HOST)
381
381
  return env["POSTHOG_HOST"]?.trim() || defaultHost;
382
382
  }
383
383
 
384
+ // ../../../../telemetry-core/src/machine-id.ts
385
+ import { createHash } from "node:crypto";
386
+ import os2 from "node:os";
387
+ function getDefaultTelemetryOsProvider() {
388
+ return os2;
389
+ }
390
+ function getTelemetryDistinctId(machineIdPrefix, osProvider = getDefaultTelemetryOsProvider()) {
391
+ return createHash("sha256").update(`${machineIdPrefix}${osProvider.hostname()}`).digest("hex");
392
+ }
393
+
394
+ // ../../../../telemetry-core/src/injected-client.ts
395
+ var NO_OP_CLIENT = {
396
+ enabled: false,
397
+ trackActive: () => {
398
+ return;
399
+ },
400
+ flush: async () => {
401
+ return;
402
+ },
403
+ shutdown: async () => {
404
+ return;
405
+ }
406
+ };
407
+ function isTelemetryClientEnabled(input) {
408
+ const env = input.env ?? process.env;
409
+ return !shouldDisableTelemetry({ env, productEnvPrefix: input.product.productEnvPrefix }) && hasTelemetryApiKey(env, input.product.defaultApiKey);
410
+ }
411
+ function createTelemetryClient(input) {
412
+ if (!isTelemetryClientEnabled(input)) {
413
+ return NO_OP_CLIENT;
414
+ }
415
+ const transport = createTransport(input);
416
+ if (transport === null) {
417
+ return NO_OP_CLIENT;
418
+ }
419
+ const sharedProperties = getSharedProperties(input);
420
+ return {
421
+ enabled: true,
422
+ trackActive: ({ dayUTC, distinctId, reason }) => {
423
+ try {
424
+ transport.capture({
425
+ distinctId,
426
+ event: input.product.eventName,
427
+ properties: {
428
+ ...sharedProperties,
429
+ $process_person_profile: false,
430
+ day_utc: dayUTC,
431
+ reason
432
+ }
433
+ });
434
+ } catch (error) {
435
+ input.diagnostics?.({
436
+ event: "telemetry_capture_failed",
437
+ source: input.source,
438
+ error,
439
+ errorKind: error instanceof Error ? "error" : "non_error"
440
+ });
441
+ }
442
+ },
443
+ flush: async () => {
444
+ if (transport.flush === undefined) {
445
+ return;
446
+ }
447
+ await transport.flush();
448
+ },
449
+ shutdown: async () => {
450
+ try {
451
+ await transport.shutdown();
452
+ } catch (error) {
453
+ input.diagnostics?.({
454
+ event: "telemetry_shutdown_failed",
455
+ source: input.source,
456
+ error,
457
+ errorKind: error instanceof Error ? "error" : "non_error"
458
+ });
459
+ }
460
+ }
461
+ };
462
+ }
463
+ function createTransport(input) {
464
+ const env = input.env ?? process.env;
465
+ const factory = input.transportFactory;
466
+ try {
467
+ return factory(getTelemetryApiKey(env, input.product.defaultApiKey), {
468
+ enableExceptionAutocapture: false,
469
+ enableLocalEvaluation: false,
470
+ strictLocalEvaluation: true,
471
+ disableRemoteConfig: true,
472
+ flushAt: 1,
473
+ flushInterval: 0,
474
+ host: getTelemetryHost(env, input.product.defaultHost),
475
+ disableGeoip: input.product.disableGeoip ?? false,
476
+ ...input.product.transportOptions
477
+ });
478
+ } catch (error) {
479
+ input.diagnostics?.({
480
+ event: "telemetry_posthog_init_failed",
481
+ source: input.source,
482
+ error,
483
+ errorKind: error instanceof Error ? "error" : "non_error"
484
+ });
485
+ return null;
486
+ }
487
+ }
488
+ function getSharedProperties(input) {
489
+ const osProvider = input.osProvider ?? getDefaultTelemetryOsProvider();
490
+ const cpuInfo = getSafeCpuInfo(osProvider, input);
491
+ return {
492
+ platform: input.product.platform,
493
+ product_name: input.product.productName,
494
+ package_name: input.product.packageName,
495
+ package_version: input.product.packageVersion,
496
+ runtime: "bun",
497
+ runtime_version: process.versions.bun ?? process.version,
498
+ source: input.source,
499
+ $os: osProvider.platform(),
500
+ $os_version: osProvider.release(),
501
+ os_arch: osProvider.arch(),
502
+ os_type: osProvider.type(),
503
+ cpu_count: cpuInfo.count,
504
+ cpu_model: cpuInfo.model,
505
+ total_memory_gb: Math.round(osProvider.totalmem() / 1024 / 1024 / 1024),
506
+ locale: Intl.DateTimeFormat().resolvedOptions().locale,
507
+ timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
508
+ shell: process.env.SHELL,
509
+ ci: Boolean(process.env.CI),
510
+ terminal: process.env.TERM_PROGRAM,
511
+ ...input.product.additionalProperties
512
+ };
513
+ }
514
+ function getSafeCpuInfo(osProvider, input) {
515
+ try {
516
+ const cpuInfo = osProvider.cpus();
517
+ return {
518
+ count: cpuInfo.length,
519
+ model: cpuInfo[0]?.model
520
+ };
521
+ } catch (error) {
522
+ input.diagnostics?.({
523
+ event: "telemetry_cpu_info_unavailable",
524
+ source: "shared",
525
+ error,
526
+ errorKind: error instanceof Error ? "error" : "non_error"
527
+ });
528
+ return {
529
+ count: 0,
530
+ model: undefined
531
+ };
532
+ }
533
+ }
534
+
384
535
  // ../../../../../node_modules/.bun/posthog-node@5.52.4/node_modules/posthog-node/dist/extensions/error-tracking/modifiers/module.node.mjs
385
536
  import { dirname as dirname2, posix, sep } from "path";
386
537
  function createModulerModifier() {
@@ -9447,30 +9598,7 @@ class PostHog extends PostHogBackendClient {
9447
9598
  }
9448
9599
  }
9449
9600
 
9450
- // ../../../../telemetry-core/src/machine-id.ts
9451
- import { createHash } from "node:crypto";
9452
- import os2 from "node:os";
9453
- function getDefaultTelemetryOsProvider() {
9454
- return os2;
9455
- }
9456
- function getTelemetryDistinctId(machineIdPrefix, osProvider = getDefaultTelemetryOsProvider()) {
9457
- return createHash("sha256").update(`${machineIdPrefix}${osProvider.hostname()}`).digest("hex");
9458
- }
9459
-
9460
- // ../../../../telemetry-core/src/posthog-client.ts
9461
- var NO_OP_CLIENT = {
9462
- enabled: false,
9463
- trackActive: () => {
9464
- return;
9465
- },
9466
- flush: async () => {
9467
- return;
9468
- },
9469
- shutdown: async () => {
9470
- return;
9471
- }
9472
- };
9473
-
9601
+ // ../../../../telemetry-core/src/posthog-transport.ts
9474
9602
  class PostHogTelemetryTransport {
9475
9603
  #client;
9476
9604
  constructor(apiKey, options) {
@@ -9489,132 +9617,10 @@ class PostHogTelemetryTransport {
9489
9617
  function createDefaultPostHogTransport(apiKey, options) {
9490
9618
  return new PostHogTelemetryTransport(apiKey, options);
9491
9619
  }
9492
- function isTelemetryClientEnabled(input) {
9493
- const env = input.env ?? process.env;
9494
- return !shouldDisableTelemetry({ env, productEnvPrefix: input.product.productEnvPrefix }) && hasTelemetryApiKey(env, input.product.defaultApiKey);
9495
- }
9496
- function createTelemetryClient(input) {
9497
- if (!isTelemetryClientEnabled(input)) {
9498
- return NO_OP_CLIENT;
9499
- }
9500
- const transport = createTransport(input);
9501
- if (transport === null) {
9502
- return NO_OP_CLIENT;
9503
- }
9504
- const sharedProperties = getSharedProperties(input);
9505
- return {
9506
- enabled: true,
9507
- trackActive: ({ dayUTC, distinctId, reason }) => {
9508
- try {
9509
- transport.capture({
9510
- distinctId,
9511
- event: input.product.eventName,
9512
- properties: {
9513
- ...sharedProperties,
9514
- $process_person_profile: false,
9515
- day_utc: dayUTC,
9516
- reason
9517
- }
9518
- });
9519
- } catch (error) {
9520
- input.diagnostics?.({
9521
- event: "telemetry_capture_failed",
9522
- source: input.source,
9523
- error,
9524
- errorKind: error instanceof Error ? "error" : "non_error"
9525
- });
9526
- }
9527
- },
9528
- flush: async () => {
9529
- if (transport.flush === undefined) {
9530
- return;
9531
- }
9532
- await transport.flush();
9533
- },
9534
- shutdown: async () => {
9535
- try {
9536
- await transport.shutdown();
9537
- } catch (error) {
9538
- input.diagnostics?.({
9539
- event: "telemetry_shutdown_failed",
9540
- source: input.source,
9541
- error,
9542
- errorKind: error instanceof Error ? "error" : "non_error"
9543
- });
9544
- }
9545
- }
9546
- };
9547
- }
9548
- function createTransport(input) {
9549
- const env = input.env ?? process.env;
9550
- const factory = input.transportFactory ?? createDefaultPostHogTransport;
9551
- try {
9552
- return factory(getTelemetryApiKey(env, input.product.defaultApiKey), {
9553
- enableExceptionAutocapture: false,
9554
- enableLocalEvaluation: false,
9555
- strictLocalEvaluation: true,
9556
- disableRemoteConfig: true,
9557
- flushAt: 1,
9558
- flushInterval: 0,
9559
- host: getTelemetryHost(env, input.product.defaultHost),
9560
- disableGeoip: input.product.disableGeoip ?? false,
9561
- ...input.product.transportOptions
9562
- });
9563
- } catch (error) {
9564
- input.diagnostics?.({
9565
- event: "telemetry_posthog_init_failed",
9566
- source: input.source,
9567
- error,
9568
- errorKind: error instanceof Error ? "error" : "non_error"
9569
- });
9570
- return null;
9571
- }
9572
- }
9573
- function getSharedProperties(input) {
9574
- const osProvider = input.osProvider ?? getDefaultTelemetryOsProvider();
9575
- const cpuInfo = getSafeCpuInfo(osProvider, input);
9576
- return {
9577
- platform: input.product.platform,
9578
- product_name: input.product.productName,
9579
- package_name: input.product.packageName,
9580
- package_version: input.product.packageVersion,
9581
- runtime: "bun",
9582
- runtime_version: process.versions.bun ?? process.version,
9583
- source: input.source,
9584
- $os: osProvider.platform(),
9585
- $os_version: osProvider.release(),
9586
- os_arch: osProvider.arch(),
9587
- os_type: osProvider.type(),
9588
- cpu_count: cpuInfo.count,
9589
- cpu_model: cpuInfo.model,
9590
- total_memory_gb: Math.round(osProvider.totalmem() / 1024 / 1024 / 1024),
9591
- locale: Intl.DateTimeFormat().resolvedOptions().locale,
9592
- timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
9593
- shell: process.env.SHELL,
9594
- ci: Boolean(process.env.CI),
9595
- terminal: process.env.TERM_PROGRAM,
9596
- ...input.product.additionalProperties
9597
- };
9598
- }
9599
- function getSafeCpuInfo(osProvider, input) {
9600
- try {
9601
- const cpuInfo = osProvider.cpus();
9602
- return {
9603
- count: cpuInfo.length,
9604
- model: cpuInfo[0]?.model
9605
- };
9606
- } catch (error) {
9607
- input.diagnostics?.({
9608
- event: "telemetry_cpu_info_unavailable",
9609
- source: "shared",
9610
- error,
9611
- errorKind: error instanceof Error ? "error" : "non_error"
9612
- });
9613
- return {
9614
- count: 0,
9615
- model: undefined
9616
- };
9617
- }
9620
+
9621
+ // ../../../../telemetry-core/src/posthog-client.ts
9622
+ function createTelemetryClient2(input) {
9623
+ return createTelemetryClient({ ...input, transportFactory: input.transportFactory ?? createDefaultPostHogTransport });
9618
9624
  }
9619
9625
 
9620
9626
  // src/product-identity.ts
@@ -9724,7 +9730,7 @@ function createPluginPostHogClient(options = {}) {
9724
9730
  }),
9725
9731
  source: "plugin"
9726
9732
  };
9727
- const client = createTelemetryClient(options.transportFactory === undefined ? clientInput : {
9733
+ const client = createTelemetryClient2(options.transportFactory === undefined ? clientInput : {
9728
9734
  ...clientInput,
9729
9735
  transportFactory: options.transportFactory
9730
9736
  });
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook session-start",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.1.38) Recording Session Telemetry"
10
+ "statusMessage": "(OmO 5.1.40) Recording Session Telemetry"
11
11
  }
12
12
  ]
13
13
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-telemetry",
3
- "version": "5.1.38",
3
+ "version": "5.1.40",
4
4
  "description": "Codex plugin component that emits omo-codex anonymous daily-active telemetry on SessionStart.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook user-prompt-submit",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.1.38) Checking Ultrawork Trigger"
10
+ "statusMessage": "(OmO 5.1.40) Checking Ultrawork Trigger"
11
11
  }
12
12
  ]
13
13
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-ultrawork",
3
- "version": "5.1.38",
3
+ "version": "5.1.40",
4
4
  "description": "Codex plugin that injects the ultrawork orchestration directive and ships LazyCodex planning, review, QA, and gate agent roles.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -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 Codex CLI 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 Codex CLI 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
 
@@ -213,14 +213,15 @@ Every reviewer prompt must carry this intake contract with all angle-bracket val
213
213
  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.
214
214
 
215
215
  ### Bounded convergence (the review must terminate)
216
- 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.
216
+ 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.
217
217
 
218
218
  <!-- ulw-plan-review-convergence-contract -->
219
219
  ```json
220
220
  {
221
- "max_rounds": 5,
222
- "max_rounds_override": "explicit_user_request_only",
223
- "on_cap_reached": "stop_report_outstanding_blockers_ask_user",
221
+ "max_rounds": null,
222
+ "continue_while": "previous_round_raised_new_blocker_eligible_finding_or_closed_ledger_blocker",
223
+ "stop_on": "round_without_new_blocker_eligible_finding_or_ledger_blocker_closure",
224
+ "on_stop_without_approval": "stop_report_outstanding_blockers_ask_user",
224
225
  "blocker_eligibility": [
225
226
  "explicit_requirement_or_accepted_decision",
226
227
  "existing_failing_regression",
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ulw-execute-continuation/dist/cli.js\" hook stop",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.1.38) Checking Ulw-Execute Continuation"
10
+ "statusMessage": "(OmO 5.1.40) Checking Ulw-Execute Continuation"
11
11
  }
12
12
  ]
13
13
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-ulw-execute-continuation",
3
- "version": "5.1.38",
3
+ "version": "5.1.40",
4
4
  "description": "Codex Stop hook continuation injector for omo-codex ulw-execute plans.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook user-prompt-submit --with-ultrawork",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.1.38) Checking Ulw-Loop Steering"
10
+ "statusMessage": "(OmO 5.1.40) Checking Ulw-Loop Steering"
11
11
  }
12
12
  ]
13
13
  }
@@ -20,7 +20,7 @@
20
20
  "type": "command",
21
21
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use-spawn",
22
22
  "timeout": 5,
23
- "statusMessage": "(OmO 5.1.38) Recording Spawn Admission"
23
+ "statusMessage": "(OmO 5.1.40) Recording Spawn Admission"
24
24
  }
25
25
  ]
26
26
  }
@@ -33,7 +33,7 @@
33
33
  "type": "command",
34
34
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook pre-tool-use",
35
35
  "timeout": 5,
36
- "statusMessage": "(OmO 5.1.38) Enforcing Unlimited Ulw-Loop Budget"
36
+ "statusMessage": "(OmO 5.1.40) Enforcing Unlimited Ulw-Loop Budget"
37
37
  }
38
38
  ]
39
39
  },
@@ -44,7 +44,7 @@
44
44
  "type": "command",
45
45
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook pre-tool-use-spawn",
46
46
  "timeout": 5,
47
- "statusMessage": "(OmO 5.1.38) Guarding Ulw-Loop Spawns"
47
+ "statusMessage": "(OmO 5.1.40) Guarding Ulw-Loop Spawns"
48
48
  }
49
49
  ]
50
50
  }
@@ -56,7 +56,7 @@
56
56
  "type": "command",
57
57
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook stop",
58
58
  "timeout": 10,
59
- "statusMessage": "(OmO 5.1.38) Checking Ulw-Loop Resume"
59
+ "statusMessage": "(OmO 5.1.40) Checking Ulw-Loop Resume"
60
60
  }
61
61
  ]
62
62
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-ulw-loop",
3
- "version": "5.1.38",
3
+ "version": "5.1.40",
4
4
  "description": "Codex plugin: durable repo-native multi-goal orchestration with embedded success criteria and observable evidence audit.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/git-bash/dist/cli.js\" hook post-compact",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.1.38) Resetting Git Bash MCP Reminder",
10
+ "statusMessage": "(OmO 5.1.40) Resetting Git Bash MCP Reminder",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\git-bash\\dist\\cli.js\" hook post-compact"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/lsp/dist/cli.js\" hook post-compact",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.1.38) Resetting LSP Diagnostics Cache",
10
+ "statusMessage": "(OmO 5.1.40) Resetting LSP Diagnostics Cache",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\lsp\\dist\\cli.js\" hook post-compact"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/rules/dist/cli.js\" hook post-compact",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.1.38) Resetting Project Rule Cache",
10
+ "statusMessage": "(OmO 5.1.40) Resetting Project Rule Cache",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\rules\\dist\\cli.js\" hook post-compact"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/comment-checker/dist/cli.js\" hook post-tool-use",
9
9
  "timeout": 30,
10
- "statusMessage": "(OmO 5.1.38) Checking Comments",
10
+ "statusMessage": "(OmO 5.1.40) Checking Comments",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\comment-checker\\dist\\cli.js\" hook post-tool-use"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/lsp/dist/cli.js\" hook post-tool-use",
9
9
  "timeout": 60,
10
- "statusMessage": "(OmO 5.1.38) Checking LSP Diagnostics",
10
+ "statusMessage": "(OmO 5.1.40) Checking LSP Diagnostics",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\lsp\\dist\\cli.js\" hook post-tool-use"
12
12
  }
13
13
  ],
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/components/teammode/dist/cli.js\" hook post-tool-use",
10
10
  "timeout": 10,
11
- "statusMessage": "(OmO 5.1.38) Checking Thread Title Hygiene",
11
+ "statusMessage": "(OmO 5.1.40) Checking Thread Title Hygiene",
12
12
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\teammode\\dist\\cli.js\" hook post-tool-use"
13
13
  }
14
14
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/rules/dist/cli.js\" hook post-tool-use",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.1.38) Matching Project Rules",
10
+ "statusMessage": "(OmO 5.1.40) Matching Project Rules",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\rules\\dist\\cli.js\" hook post-tool-use"
12
12
  }
13
13
  ],
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/components/ulw-loop/dist/cli.js\" hook post-tool-use-spawn",
10
10
  "timeout": 5,
11
- "statusMessage": "(OmO 5.1.38) Recording Spawn Admission",
11
+ "statusMessage": "(OmO 5.1.40) Recording Spawn Admission",
12
12
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-loop\\dist\\cli.js\" hook post-tool-use-spawn"
13
13
  }
14
14
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ulw-loop/dist/cli.js\" hook pre-tool-use",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.1.38) Enforcing Unlimited Goal Budget",
10
+ "statusMessage": "(OmO 5.1.40) Enforcing Unlimited Goal Budget",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-loop\\dist\\cli.js\" hook pre-tool-use"
12
12
  }
13
13
  ],
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/components/ulw-loop/dist/cli.js\" hook pre-tool-use-spawn",
10
10
  "timeout": 5,
11
- "statusMessage": "(OmO 5.1.38) Guarding Ulw-Loop Spawns",
11
+ "statusMessage": "(OmO 5.1.40) Guarding Ulw-Loop Spawns",
12
12
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-loop\\dist\\cli.js\" hook pre-tool-use-spawn"
13
13
  }
14
14
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/git-bash/dist/cli.js\" hook pre-tool-use",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.1.38) Recommending Git Bash MCP",
10
+ "statusMessage": "(OmO 5.1.40) Recommending Git Bash MCP",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\git-bash\\dist\\cli.js\" hook pre-tool-use"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/scripts/auto-update.mjs\" hook session-start",
9
9
  "timeout": 15,
10
- "statusMessage": "(OmO 5.1.38) Checking Auto Update",
10
+ "statusMessage": "(OmO 5.1.40) Checking Auto Update",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\scripts\\auto-update.mjs\" hook session-start"
12
12
  }
13
13
  ],
@@ -8,7 +8,7 @@
8
8
  "command": "node \"${PLUGIN_ROOT}/components/bootstrap/dist/cli.js\" hook session-start",
9
9
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\bootstrap.ps1\"",
10
10
  "timeout": 30,
11
- "statusMessage": "(OmO 5.1.38) Checking Bootstrap Provisioning"
11
+ "statusMessage": "(OmO 5.1.40) Checking Bootstrap Provisioning"
12
12
  }
13
13
  ]
14
14
  }
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/rules/dist/cli.js\" hook session-start",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.1.38) Loading Project Rules",
10
+ "statusMessage": "(OmO 5.1.40) Loading Project Rules",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\rules\\dist\\cli.js\" hook session-start"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/telemetry/dist/cli.js\" hook session-start",
9
9
  "timeout": 15,
10
- "statusMessage": "(OmO 5.1.38) Recording Session Telemetry",
10
+ "statusMessage": "(OmO 5.1.40) Recording Session Telemetry",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\telemetry\\dist\\cli.js\" hook session-start"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ulw-execute-continuation/dist/cli.js\" hook stop",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.1.38) Checking Ulw-Execute Continuation",
10
+ "statusMessage": "(OmO 5.1.40) Checking Ulw-Execute Continuation",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-execute-continuation\\dist\\cli.js\" hook stop"
12
12
  }
13
13
  ]