Skip to main content

AgentXchain v2.149.0

Superseded by v2.149.1. v2.149.0 was tagged but never reached npm — the publish-gate preflight test correctly failed on a CI-specific ordering bug in connector-probe.js:probeLocalCommand where auth-preflight was checked after spawn-probe, so a missing claude binary on CI runners returned probe_kind: 'command_presence' before ever reaching the auth-preflight branch. v2.149.1 reorders the check so auth-preflight fires first (config-shape defect is independent of binary resolution) and ships the same BUG-54/52/55/53 payload. Operators should install [email protected] directly.


v2.149.0 turns BUG-54 from “better diagnostics” into an actual fail-fast product contract. Claude local_cli runtimes now refuse the known non-interactive keychain-auth hang shape before spawn when neither env-based auth nor --bare is present, and that refusal now surfaces consistently across adapter dispatch, connector check, and connector validate, with doctor warning on the same shape. The release also carries BUG-52’s four-lane reconciler recovery proof, BUG-55’s checkpoint/verification hardening, and BUG-53’s continuous auto-chain proof. None of BUG-52/53/54/55 flip to closed here — closure still requires tester-quoted shipped-package output per rule #12.

Bug Fixes

  • BUG-52 reconciler recovery — needs_human orphan path (Turn 93): unblock now advances the phase when the most recent accepted turn is needs_human with a declared phase_transition_request but no recorded gate failure. The operator chain accept-turncheckpoint-turnunblock <hesc> clears the planning_signoff escalation, transitions planning → implementation, and dispatches dev without manual state.json surgery. Packaged claim-reality proof runs the real shipped CLI through the full chain.

  • BUG-52 queued-transition resume (Turn 94): resume advances from queued_phase_transition even when the latest accepted turn carries no fresh phase_transition_request. Packaged claim-reality proof drives the tarball through implementation → qa from the queued state, asserts queued_phase_transition is cleared, and verifies the next dispatch is qa rather than a redundant dev.

  • BUG-52 phase-reconcile lookup hardening: the reconciler is now resilient to accepted-turn lookup paths that previously mis-identified the candidate turn, eliminating the narrow shape the Turn 98-class false closure could still hide behind.

  • BUG-54 Claude auth preflight across live surfaces: dispatchLocalCli, connector validate, and now connector check refuse the known-hanging Claude local_cli shape before launching the subprocess when neither env-based auth nor --bare is present. All three surfaces use the same canonical claude_auth_preflight_failed contract so operators can grep one identifier across logs, JSON output, and release notes.

  • BUG-54 connector readiness truthfulness: connector check no longer downgrades the known-hanging Claude shape to a soft warning. It now fails with probe_kind: 'auth_preflight', error_code: 'claude_auth_preflight_failed', boolean-only auth_env_present, and fix text naming ANTHROPIC_API_KEY, CLAUDE_CODE_OAUTH_TOKEN, and --bare.

  • BUG-54 process_exit forensic field coverage: the local_cli adapter emits first_output_stream, exit_signal, and watchdog_fired directly on the process_exit diagnostic line, alongside stderr_excerpt. Single-record triage can now discriminate between watchdog-kill (SIGTERM + watchdog_fired: true), stderr-only natural exit (first_output_stream: null + exit_signal: null + non-null stderr_excerpt), and healthy exit (first_output_stream: 'stdout' or 'staged_result') without cross-line correlation.

  • BUG-54 stderr-classification correctness: stderr-only startup activity now renders as diagnostic_only rather than "Producing output," and stays in the BUG-54 failure bucket across progress/watchdog/run paths. Dashboard no longer paints stderr-only subprocesses as healthy work-in-progress. The startup_failure_type vocabulary is normalized to typed subtypes on both the adapter emission side and the status consumer side.

  • BUG-54 per-runtime startup_watchdog_ms: operators can override the startup watchdog per runtimes.<id> without changing the global run_loop.startup_watchdog_ms. The ghost detector honors the same override, so watchdog and ghost detection stay parity-aligned instead of computing drift from two separate source-of-truths.

  • BUG-54 reproduction harness + tester runbook: cli/scripts/reproduce-bug-54.mjs mirrors the adapter’s resolveCommand + spawn shape exactly, captures per-attempt spawn_attached / first_output timestamps, watchdog_fired, exit_code / exit_signal, full stderr/stdout, and boolean-only auth-key presence flags. The in-tree runbook maps the 9 classification buckets directly onto the BUG-54 hypothesis set, so non-auth failures still have a deterministic next diagnostic step instead of another guess cycle.

  • BUG-55 sub-A wrong-lineage path distinct surfacing: checkpoint-turn now distinguishes genuinely_missing (declared path absent and never committed upstream) from divergent_from_accepted_lineage (declared path already committed on a different lineage than the accepted baseline). Operators get a wrong-lineage hint with actionable remediation instead of a generic missing-path error. Upstream presence is now anchored to the accepted baseline rather than arbitrary HEAD state.

  • BUG-55 sub-A silent-filter tester-path regression lock: normalizeCheckpointableFiles now carries an explicit tester-path regression assertion for .planning/RELEASE_NOTES.md, .planning/acceptance-matrix.md, src/cli.js, and tests/smoke.mjs. A future widening of OPERATIONAL_PATH_PREFIXES, ORCHESTRATOR_STATE_FILES, or BASELINE_EXEMPT_PATH_PREFIXES that silently strips the tester-reported paths before checkpoint-turn ever sees them will now fail in CI at the exact filter boundary the tester encounters, not downstream.

  • BUG-55 combined tester-shape regression: a dedicated scenario exercises the full combined shape — QA turn with declared files_changed AND verification commands that produce fixture outputs — as a child-process CLI chain. Locks both sub-A and sub-B behavior in a single tester-reproduction-shaped test.

  • BUG-53 CLI auto-chain + idle_exit regressions: both paths (auto-chain through --max-runs and idle_exit on vision exhaustion) are now locked by child-process CLI-chain tests in bug-53-continuous-auto-chain.test.js. Source-only coverage is augmented; the packaged claim-reality suite still covers the shipped-tarball emission of session_continuation and the paused-only-on-blocked invariant.

  • Dashboard BUG-54 output rendering: false "Producing output" rendering on stderr-only failing subprocesses is eliminated so operators get a truthful dashboard state during BUG-54 reproductions.

Decisions

  • DEC-BUG54-REPRO-SCRIPT-CONTRACT-001
  • DEC-BUG54-REPRO-SCRIPT-SHARED-RESOLVER-001
  • DEC-BUG54-REPRO-SCRIPT-NO-PACKED-PREFLIGHT-001
  • DEC-BUG54-TESTER-RUNBOOK-001
  • DEC-BUG54-NO-ADAPTER-VOCAB-WIDENING-001
  • DEC-BUG54-PROCESS-EXIT-FIELD-COVERAGE-001
  • DEC-BUG54-CLAUDE-AUTH-PREFLIGHT-001
  • DEC-BUG54-VALIDATE-AUTH-PREFLIGHT-001
  • DEC-BUG52-PACKED-TURN93-94-PROOF-001
  • DEC-BUG55A-WRONG-LINEAGE-DISTINCT-001

Operator Notes

  • The BUG-54 reproduction harness is a repo-side diagnostic. Tester runs it directly from the repo checkout inside the failing worktree, then attaches the resulting JSON. It is not a shipped runtime feature of the npm package. The shipped runtime features in v2.149.0 are the fail-fast auth-preflight contract and the richer process_exit forensic fields.
  • BUG-52 recovery paths from Turn 93/94 are shipped behavior. Operators who previously had to patch .agentxchain/state.json to recover from needs_human + queued_phase_transition states should no longer need that manual surgery on v2.149.0.

Tester Re-Run Contract

Run the shipped package, not the source tree:

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

For closure evidence on v2.149.0, quote the exact command output or diagnostic lines for these checks:

  • BUG-54 auth-shape preflight: first run agentxchain connector check <claude-runtime> --json or agentxchain connector validate <claude-runtime> --json on v2.149.0. If the runtime is still in the known-hanging configuration, quote the claude_auth_preflight_failed output with its auth_env_present booleans and remediation text. That is the fastest shipped-package proof that the keychain-auth hang shape is being caught before launch.
  • BUG-54 QA startup reliability after auth is corrected: run the tester's normal QA flow on v2.149.0 and quote the adapter diagnostic lines that include 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 so the evidence names the exact override that made the run healthy. Closure requires QA dispatches succeeding at >90% on the tester's real setup. If QA still fails after env auth or --bare is set, quote the full process_exit record for a failing attempt.
  • BUG-54 root-cause triage when reliability stays below 90% after auth is corrected: run node cli/scripts/reproduce-bug-54.mjs --synthetic "Say READY and nothing else." --attempts 10 --out ./bug-54-repro.json inside the failing worktree. The runbook at .planning/BUG_54_REPRO_SCRIPT_TESTER_RUNBOOK.md maps each of the 9 classification buckets to the remaining hypotheses and names the JSON fields to quote back to the agents.
  • BUG-52 phase-gate reconciliation — full four-lane coverage: run the tester's exact CLI chain across all four shapes:
    1. planning_signoff with separated checkpoint-turnunblock → next dispatch is dev, not PM.
    2. qa_ship_verdict with separated checkpoint-turnunblock → next dispatch is launch, not QA.
    3. needs_human orphan phase_transition_requestunblock → phase advances, no redundant same-role dispatch.
    4. queued_phase_transitionresume → phase advances, queued_phase_transition clears. Quote the dispatched turn's assigned_role and the phase_entered event line with trigger: "reconciled_before_dispatch" for each lane. No manual state.json patching at any step.
  • BUG-55 sub-A checkpoint completeness + wrong-lineage: quote accept-turn + checkpoint-turn result for a real QA turn and the resulting git status --short (must be clean). If a declared path was already committed on a divergent lineage, quote the divergent_from_accepted_lineage field on the checkpoint result — the wrong-lineage path must be surfaced distinctly from genuinely_missing.
  • BUG-55 sub-B verification outputs: quote the failure showing undeclared_verification_outputs + verification.produced_files remediation pointer; then quote the clean acceptance path after the produced file is declared.
  • BUG-55 combined tester shape: run accept-turn followed by checkpoint-turn on a QA turn that both declares files_changed and produces fixture outputs; quote git status --short after. Clean tree means BUG-55 is fixed for your reproduction.
  • BUG-53 continuous auto-chain: run agentxchain run --continuous --max-runs 3 from a clean session and quote the session_continuation event lines (format session_continuation <previous_run_id> -> <next_run_id> (<next_objective>)). Session status must stay running between runs and end as completed or idle_exit, never paused.

The closure artifact is the tester's quoted shipped-package output. No source-tree run, local green test, or agent summary is sufficient for BUG-52, BUG-53, BUG-54, or BUG-55.

Evidence

  • node --test cli/test/beta-tester-scenarios/ → 172 tests / 64 suites / 0 failures
  • node --test cli/test/claim-reality-preflight.test.js → 42 tests / 1 suite / 0 failures
  • node --test --test-name-pattern='BUG-52' cli/test/claim-reality-preflight.test.js → 5 passed, 34 skipped (packed four-lane reconciler coverage green)
  • node --test cli/test/local-cli-adapter.test.js → full suite green (watchdog + stderr-only + staged-result paths assert watchdog_fired, exit_signal, first_output_stream, stderr_excerpt)

Status

  • BUG-54: auth preflight now fails fast across adapter dispatch, connector check, and connector validate; doctor warns on the same shape; process_exit forensic fields, reproduction harness, runbook, per-runtime watchdog override, and dashboard rendering fix remain shipped. Awaiting tester-quoted v2.149.0 output.
  • BUG-52: four-lane reconciler coverage shipped (planning/qa separated checkpoint, Turn 93 orphan, Turn 94 queued). Awaiting tester-quoted operator chain output on v2.149.0 with no manual state.json patching.
  • BUG-55: sub-A wrong-lineage distinct surfacing + sub-B undeclared-output rejection + combined tester-shape regression + silent-filter tester-path lock. Awaiting tester-quoted git status --short clean output on v2.149.0.
  • BUG-53: CLI auto-chain + idle_exit + packaged session_continuation coverage. Awaiting tester-quoted session_continuation output on v2.149.0.