Skip to main content

AgentXchain v2.150.0

v2.150.0 is a reliability-and-proof release over v2.149.2. It ships two concrete hardenings on the BUG-54 local_cli path (stdout/stderr listener ordering attached before stdin prompt delivery, and a bounded claude --version probe captured in the BUG-54 repro artifact so the next tester JSON can discriminate CLI-version/path differences from adapter-level races), one new BUG-55 coverage slice (the combined files_changed + verification.produced_files[{disposition:"artifact"}] union checkpoint branch) locked at both source-tree and packaged-tarball levels via claim-reality-preflight.test.js, and one benchmark-suite contention fix that restored the local prepublish gate to green so DEC-RELEASE-CUT-AND-PUSH-AS-ATOMIC-001 can run atomically again. No BUG is closed in v2.150.0: BUG-52/53/54/55 remain OPEN pending tester-quoted shipped-package output on a later release.

Current quote-back target: use [email protected] or later for any still-open BUG-52 / BUG-54 / BUG-55 / BUG-53 tester evidence. v2.150.0 predates the BUG-54 watchdog raise (landed in v2.151.0) and the full BUG-52 third-variant fix stack (landed in v2.154.7), so running the closure contracts below against [email protected] can reproduce the BUG-52 standing-gate loop on any run that traverses phase-gate recovery. The canonical BUG-52 runbook is .planning/BUG_52_TESTER_QUOTEBACK_RUNBOOK.md and the canonical BUG-59/54 runbook is .planning/BUG_59_54_TESTER_QUOTEBACK_RUNBOOK.md.

Bug Fixes

  • BUG-54 adapter listener ordering (dispatchLocalCli): stdout and stderr data listeners are now attached before the prompt is written to the subprocess stdin. Prior ordering created a narrow first-byte race where a subprocess that produced output before the adapter's listeners attached could appear as no_subprocess_output even when it had printed on the first event-loop tick. The repro harness cli/scripts/reproduce-bug-54.mjs mirrors the same ordering so tester JSON artifacts continue to match the adapter's real spawn shape. This is a race-removal hardening, not a BUG-54 closure — the underlying tester reproduction of 0/5 stdout on tusq.dev-21480-clean is still un-triaged and cannot be explained by adapter ordering alone.

  • BUG-54 bounded claude --version probe in repro artifact: cli/scripts/reproduce-bug-54.mjs now records a command_probe object on every configured Claude runtime. For Claude command chains the probe shells the same binary the adapter would spawn with --version and a short watchdog, capturing status, signal, stdout, stderr, error, and timed_out. For non-Claude commands (or a command chain that does not resolve to a claude binary) the probe is recorded as skipped with a reason. BUG-56 disproved the auth-env-shape-alone hypothesis; Claude CLI version/path differences between failing and healthy machines are now part of the minimum BUG-54 diagnostic artifact.

  • BUG-54 discriminator runbook for tester JSON reading: .planning/BUG_54_DISCRIMINATOR_RUNBOOK.md is a one-screen (under 60 lines) reading key that tells the tester exactly which command_probe, summary, timing, byte-count, env-boolean, and spawn-shape fields to quote from the repro JSON, and how each combination discriminates "environmental Claude CLI difference" vs "silent watchdog" vs "resource accumulation" vs "stderr-only". Auth env booleans alone are not sufficient evidence after BUG-56 — the runbook enforces the post-BUG-56 quote-back contract. Content locked by cli/test/bug-54-discriminator-runbook-content.test.js.

  • BUG-55 combined tester shape — artifact-disposition union checkpoint: cli/test/beta-tester-scenarios/bug-55-combined-tester-shape.test.js now exercises a third branch that was unprotected before v2.150.0: the case where acceptance seeds both actor-declared files_changed paths AND verification-produced fixtures with verification.produced_files[i].disposition: "artifact". The merge at cli/src/lib/governed-state.js:3692-3700 unions both sets into a single checkpoint commit; the new subtest asserts all 8 declared paths land in one commit's tree and git status --short is empty after. BUG-46 covered the artifact-only path; BUG-55 sub-A covered the files_changed-only path. The union semantic is now packaged into the shipped tarball via the extended claim-reality-preflight.test.js assertion. BUG-55 is still OPEN pending tester-quoted shipped-package output.

  • BUG-57 benchmark-suite contention flake (local gate repair): cli/test/benchmark.test.js previously spawned 20 agentxchain subprocesses, including seven redundant benchmark --json invocations across AT-BENCH-002..008. Under the CICD-SHRINK --test-concurrency=4 gate the combined wall-clock exceeded the 60s file-level timeout and the suite was cancelled whole. Consolidated to a single benchmark --json invocation via a before() hook into a shared sharedBaselinePayload (six subprocess spawns saved, ~15s reclaimed), so the full local gate now completes atomically at ~430s and prepublish-gate.sh can honor DEC-RELEASE-CUT-AND-PUSH-AS-ATOMIC-001 without --skip-preflight.

  • Docs truth: runner-interface CICD-SHRINK wake: cli/test/runner-interface-docs-content.test.js AT-RID-003 now asserts the public runner-interface page references cli/scripts/prepublish-gate.sh rather than the removed .github/workflows/ci-runner-proof.yml. Truth preservation after the Turn 116 workflow shrink — no product behavior change.

  • Collab surface: word-cap guard repair: cli/test/agent-talk-word-cap.test.js required an explicit ### Open questions heading in the latest compressed summary. The prior compression used an inline bullet; the guard now holds the post-Turn-116 header convention.

Decisions

  • DEC-BUG54-LISTENERS-BEFORE-STDIN-001local_cli must attach stdout/stderr listeners before stdin prompt delivery. Removes the adapter-side first-byte ordering race without changing the BUG-54 classification vocabulary.
  • DEC-BUG54-REPRO-INCLUDES-CLAUDE-VERSION-001 — BUG-54 repro artifacts for Claude runtimes must include a bounded claude --version probe. Auth env booleans alone are not sufficient discrimination after BUG-56.
  • DEC-BUG54-DISCRIMINATOR-RUNBOOK-001 — BUG-54 tester JSON quote-backs must include the bounded Claude command_probe, aggregate spawn/stdout/watchdog/timing counts, first failing attempt byte/timing fields, env auth booleans, and resolved spawn shape.
  • DEC-BUG55-COMBINED-ARTIFACT-DISPOSITION-COVERAGE-001 — the combined tester-shape scenario must exercise both disposition: 'ignore' (fixture cleanup + checkpoint of declared files) AND disposition: 'artifact' (fixture survives acceptance + lands in the union checkpoint with declared files).
  • DEC-BUG55-PACKAGED-COMBINED-ARTIFACT-PROOF-001 — BUG-55 closure proof must include the source-tree combined tester scenario AND a claim-reality packaged tarball assertion that commits declared actor files and artifact-disposition verification outputs together.

Operator Notes

  • No CLI surface change for operators. The listener-ordering fix is internal to dispatchLocalCli; classification vocabulary and event shapes are unchanged.
  • Testers reporting new BUG-54 evidence on v2.150.0 should quote the command_probe object from reproduce-bug-54.mjs output and follow .planning/BUG_54_DISCRIMINATOR_RUNBOOK.md for which fields to extract. Auth env booleans alone do not prove a machine is healthy/failing after BUG-56.
  • Operators authoring QA turns that mix actor-declared files_changed paths with verification.produced_files[{disposition:"artifact"}] fixture outputs can rely on a single checkpoint-turn committing both sets into one commit and leaving git status clean. Rejected before this turn only when the fixture outputs were declared with ignore disposition.

Tester Re-Run Contract

Run the latest shipped package that carries the full BUG-54 watchdog raise and BUG-52 third-variant fix stack, not the source tree:

npx --yes -p [email protected] -c "agentxchain --version"

The command above supersedes the original v2.150.0 quote-back pin. v2.150.0 is historically installable via npx --yes -p [email protected] for provenance inspection, but every still-open closure contract below must use [email protected] or later so the tester does not reproduce the BUG-52 standing-gate loop while collecting evidence for an unrelated bug.

BUG-54 adapter reliability (current pin)

For still-open BUG-54 closure proof, pin to [email protected] or later and follow .planning/BUG_59_54_TESTER_QUOTEBACK_RUNBOOK.md. Quote adapter diagnostics from real local_cli dispatches, including startup_latency_ms, elapsed_since_spawn_ms, first_output_stream, watchdog_fired, and exit_signal on process_exit. If the runtime only stabilizes after raising runtimes.<id>.startup_watchdog_ms, quote that config too. The closure evidence must come from the adapter path, not from a standalone spawn harness. The same runbook is the current BUG-59 quote-back contract for routine auto-approval ledger rows and credentialed hard-stop counter-evidence.

The historical reproduce-bug-54.mjs discriminator artifact still ships in the package and remains valid per .planning/BUG_54_DISCRIMINATOR_RUNBOOK.md, but it is no longer sufficient closure proof on its own — the adapter-path evidence above is required.

BUG-56 probe-based auth preflight (still in force)

On a Claude Max + no env auth + no --bare setup, agentxchain connector check <claude-runtime> --json and agentxchain connector validate <claude-runtime> --json MUST both pass; on a hanging-Claude shim they MUST both fail with error_code: "claude_auth_preflight_failed" and smoke_probe.kind: "hang".

BUG-52 phase-gate reconciliation (current pin)

For still-open BUG-52 closure proof, pin to [email protected] or later and follow .planning/BUG_52_TESTER_QUOTEBACK_RUNBOOK.md. The canonical runbook covers all four shapes (planning_signoff orphan, queued_phase_transition resume, gate_failed + last_gate_failure, qa_ship_verdict) plus the realistic PM needs_human handoff (proposed_next_role: "human", phase_transition_request: null) that only lands in 2.154.7. Quote the phase_entered event and confirm the next dispatched role is the next phase's entry role.

BUG-55 checkpoint completeness (coverage validated in v2.150.0)

For still-open BUG-55 regression proof on the current pin, run accept-turn followed by checkpoint-turn on a turn that declares both product files and verification outputs. Include verification.produced_files with at least one artifact or ignored output, prove there are no undeclared_verification_outputs, and quote git status --short after checkpointing. Clean tree means BUG-55 is fixed for your reproduction. Use [email protected] or later.

BUG-53 continuous auto-chain (current pin)

Run agentxchain run --continuous --max-runs 3 from a clean session on [email protected] or later and quote session_continuation <previous_run_id> -> <next_run_id> (<next_objective>). Session status stays running between runs and ends as completed or idle_exit, never paused.

Evidence

  • node --test cli/test/beta-tester-scenarios/ cli/test/claim-reality-preflight.test.js → 219 tests / 66 suites / 0 failures / 5 skipped
  • node --test cli/test/beta-tester-scenarios/bug-52-gate-unblock-phase-advance.test.js bug-53-continuous-auto-chain.test.js bug-54-.test.js bug-55-.test.js → 23 tests / 8 suites / 0 failures
  • Turn 117 full local gate on HEAD: 6639 pass / 0 fail / 5 skipped / ~430s (DEC-RELEASE-CUT-AND-PUSH-AS-ATOMIC-001 unblocked)
  • Turn 118 local reproduce-bug-54.mjs on Claude Max / no env auth → 3/3 exit_clean_with_stdout, command_probe.stdout = "2.1.87 (Claude Code)\n", stdout_attached=3, watchdog_fires=0

Status

  • BUG-54: adapter listener ordering hardened; repro harness now records Claude version probe; discriminator runbook shipped. Closure still requires tester-quoted reliability evidence (>90% across 10 consecutive PM/dev/QA dispatches) on the failing environment.
  • BUG-55: combined tester-shape union checkpoint now covered at source + packaged levels. Closure still requires tester-quoted shipped-package output on v2.150.0.
  • BUG-52, BUG-53, BUG-56: no code change; tester-quoted shipped-package evidence on v2.150.0 is the remaining gate.