@inetafrica/open-claudia 3.4.22 → 3.4.24

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.
@@ -494,7 +494,19 @@ assert.match(pkg.description, /provider-agnostic coding-agent harness/i);
494
494
  // removing those would push recall, pack review and the enforcer onto opus.
495
495
  // Removal is cosmetic by design: /model accepts a typed name without checking
496
496
  // the list, so `/model claude-opus-4-8` remains a working rollback.
497
- assert.strictEqual(pkg.version, "3.4.22", "release version must remain unchanged without explicit approval");
497
+ // 3.4.23 approved by Sumeet 2026-09-24 ("push", answering "Shall I install
498
+ // 3.4.23 once that is done?" after "can you fix this in open claudia"): watch and
499
+ // wakeup turns stream like chat turns; /stop keeps the room busy until the
500
+ // stopped run unwinds and its flag names that run, so it no longer cancels the
501
+ // next messages; "Queued." names what it waits on; a watch alarm stuck 15 min
502
+ // behind a busy room posts one line.
503
+ // 3.4.24 approved by Sumeet 2026-09-24 20:30 EAT ("If there's fixes needed for open
504
+ // Claudia proceed."): a repeating watch keeps polling while its delivery waits or
505
+ // retries, and new hits fold into it; 3 check timeouts in a row alarm once; far
506
+ // wakeups sleep in chunks instead of firing at once; a failed jobs-store write
507
+ // keeps the retry armed; listings say where a fired job stands; loopback says
508
+ // which step failed; the pack-review release gate no longer flakes on 30 s.
509
+ assert.strictEqual(pkg.version, "3.4.24", "release version must remain unchanged without explicit approval");
498
510
  for (const keyword of ["claude", "codex", "coding-agent", "provider-agnostic"]) {
499
511
  assert.ok(pkg.keywords.includes(keyword), `package keyword missing: ${keyword}`);
500
512
  }
@@ -404,21 +404,43 @@ async function lifecycleProbe() {
404
404
  return { serialized: true, staleProtected: true, failureRecorded: true, shutdownDrained: true };
405
405
  }
406
406
 
407
+ // A loaded CI runner has taken over 30 s for one probe child; the kill then
408
+ // read as "failed (null)" and failed the release gate (v3.4.19, job 43703).
409
+ const CHILD_TIMEOUT_MS = 120000;
410
+
411
+ // Why a child did not exit 0: killed by the timeout, killed by a signal, never
412
+ // started, or a real non-zero exit.
413
+ function childFailure(child, timeoutMs = CHILD_TIMEOUT_MS) {
414
+ if (child.error?.code === "ETIMEDOUT") return `timed out after ${timeoutMs / 1000} s (killed with ${child.signal || "SIGTERM"})`;
415
+ if (child.signal) return `was killed by ${child.signal}`;
416
+ if (child.error) return `could not start (${child.error.code || child.error.message})`;
417
+ return `failed (exit ${child.status})`;
418
+ }
419
+
407
420
  function runChild(args) {
408
421
  const child = spawnSync(process.execPath, [__filename, ...args], {
409
422
  cwd: __dirname,
410
423
  env: { ...process.env },
411
424
  encoding: "utf8",
412
- timeout: 30000,
425
+ timeout: CHILD_TIMEOUT_MS,
413
426
  });
414
427
  if (child.status !== 0) {
415
- throw new Error(`child ${args.join(" ")} failed (${child.status})\n${child.stdout}\n${child.stderr}`);
428
+ throw new Error(`child ${args.join(" ")} ${childFailure(child)}\n${child.stdout}\n${child.stderr}`);
416
429
  }
417
430
  const line = child.stdout.split("\n").find((entry) => entry.startsWith(RESULT_PREFIX));
418
431
  if (!line) throw new Error(`child ${args.join(" ")} returned no result\n${child.stdout}\n${child.stderr}`);
419
432
  return JSON.parse(line.slice(RESULT_PREFIX.length));
420
433
  }
421
434
 
435
+ function childFailureProbe() {
436
+ const hung = spawnSync(process.execPath, ["-e", "setTimeout(() => {}, 10000)"], { encoding: "utf8", timeout: 200 });
437
+ assert.strictEqual(childFailure(hung, 200), "timed out after 0.2 s (killed with SIGTERM)", "a timeout reads as a timeout");
438
+ const failing = spawnSync(process.execPath, ["-e", "process.exit(3)"], { encoding: "utf8", timeout: 10000 });
439
+ assert.strictEqual(childFailure(failing), "failed (exit 3)", "a failing probe keeps its exit code");
440
+ const killed = spawnSync(process.execPath, ["-e", "process.kill(process.pid, 'SIGKILL')"], { encoding: "utf8", timeout: 10000 });
441
+ assert.strictEqual(childFailure(killed), "was killed by SIGKILL");
442
+ }
443
+
422
444
  async function main() {
423
445
  if (process.argv[2] === "--provider-probe") {
424
446
  const result = await providerProbe(process.argv[3]);
@@ -431,6 +453,7 @@ async function main() {
431
453
  return;
432
454
  }
433
455
 
456
+ childFailureProbe();
434
457
  const claude = runChild(["--provider-probe", "claude"]);
435
458
  const codex = runChild(["--provider-probe", "codex"]);
436
459
  assert.deepStrictEqual(codex.mutations, claude.mutations, "identical fixture decisions produce identical memory mutations under Claude and Codex");
@@ -21,7 +21,9 @@ const SUPPORT_SUITES = Object.freeze({
21
21
  scheduler: ["test-provider-scheduler.js", "provider scheduler OK"],
22
22
  sideChat: ["test-provider-side-chat.js", "provider side chat OK"],
23
23
  recall: ["test-provider-recall.js", "provider recall OK"],
24
- review: ["test-provider-pack-review.js", "provider pack review OK"],
24
+ // Three probe children, each allowed 120 s under a loaded runner; the suite
25
+ // cap must not undercut them (a 90 s cap would move the v3.4.19 flake here).
26
+ review: ["test-provider-pack-review.js", "provider pack review OK", 8 * 60 * 1000],
25
27
  mutationQueue: ["test-memory-mutation-queue.js", "memory mutation queue OK"],
26
28
  dream: ["test-provider-dream.js", "provider dream OK"],
27
29
  subagent: ["test-provider-subagent.js", "provider subagent OK"],
@@ -457,7 +459,7 @@ function runProviderChild(kind) {
457
459
  function runSupportSuites(provider) {
458
460
  assert.ok(["claude", "codex"].includes(provider));
459
461
  const passed = new Set();
460
- for (const [key, [script, marker]] of Object.entries(SUPPORT_SUITES)) {
462
+ for (const [key, [script, marker, suiteTimeoutMs = 90000]] of Object.entries(SUPPORT_SUITES)) {
461
463
  const root = fs.mkdtempSync(path.join(os.tmpdir(), `open-claudia-parity-suite-${key}-`));
462
464
  try {
463
465
  fs.mkdirSync(path.join(root, "home"));
@@ -466,7 +468,7 @@ function runSupportSuites(provider) {
466
468
  cwd: repoRoot,
467
469
  env: isolatedEnv(root, provider),
468
470
  encoding: "utf8",
469
- timeout: 90000,
471
+ timeout: suiteTimeoutMs,
470
472
  maxBuffer: 8 * 1024 * 1024,
471
473
  });
472
474
  assert.ifError(result.error);