AgentXchain v2.149.1
v2.149.1 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):
unblocknow advances the phase when the most recent accepted turn isneeds_humanwith a declaredphase_transition_requestbut no recorded gate failure. The operator chainaccept-turn→checkpoint-turn→unblock <hesc>clears the planning_signoff escalation, transitionsplanning → implementation, and dispatchesdevwithout manualstate.jsonsurgery. Packaged claim-reality proof runs the real shipped CLI through the full chain. -
BUG-52 queued-transition resume (Turn 94):
resumeadvances fromqueued_phase_transitioneven when the latest accepted turn carries no freshphase_transition_request. Packaged claim-reality proof drives the tarball throughimplementation → qafrom the queued state, assertsqueued_phase_transitionis cleared, and verifies the next dispatch isqarather than a redundantdev. -
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 nowconnector checkrefuse the known-hanging Claudelocal_clishape before launching the subprocess when neither env-based auth nor--bareis present. All three surfaces use the same canonicalclaude_auth_preflight_failedcontract so operators can grep one identifier across logs, JSON output, and release notes. -
BUG-54 connector readiness truthfulness:
connector checkno longer downgrades the known-hanging Claude shape to a soft warning. It now fails withprobe_kind: 'auth_preflight',error_code: 'claude_auth_preflight_failed', boolean-onlyauth_env_present, and fix text namingANTHROPIC_API_KEY,CLAUDE_CODE_OAUTH_TOKEN, and--bare. -
BUG-54
process_exitforensic field coverage: thelocal_cliadapter emitsfirst_output_stream,exit_signal, andwatchdog_fireddirectly on theprocess_exitdiagnostic line, alongsidestderr_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-nullstderr_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_onlyrather 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. Thestartup_failure_typevocabulary 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 perruntimes.<id>without changing the globalrun_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.mjsmirrors the adapter’sresolveCommand+ spawn shape exactly, captures per-attemptspawn_attached/first_outputtimestamps,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-turnnow distinguishesgenuinely_missing(declared path absent and never committed upstream) fromdivergent_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:
normalizeCheckpointableFilesnow carries an explicit tester-path regression assertion for.planning/RELEASE_NOTES.md,.planning/acceptance-matrix.md,src/cli.js, andtests/smoke.mjs. A future widening ofOPERATIONAL_PATH_PREFIXES,ORCHESTRATOR_STATE_FILES, orBASELINE_EXEMPT_PATH_PREFIXESthat 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_changedAND 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-runsandidle_exiton vision exhaustion) are now locked by child-process CLI-chain tests inbug-53-continuous-auto-chain.test.js. Source-only coverage is augmented; the packaged claim-reality suite still covers the shipped-tarball emission ofsession_continuationand thepaused-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-001DEC-BUG54-REPRO-SCRIPT-SHARED-RESOLVER-001DEC-BUG54-REPRO-SCRIPT-NO-PACKED-PREFLIGHT-001DEC-BUG54-TESTER-RUNBOOK-001DEC-BUG54-NO-ADAPTER-VOCAB-WIDENING-001DEC-BUG54-PROCESS-EXIT-FIELD-COVERAGE-001DEC-BUG54-CLAUDE-AUTH-PREFLIGHT-001DEC-BUG54-VALIDATE-AUTH-PREFLIGHT-001DEC-BUG52-PACKED-TURN93-94-PROOF-001DEC-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.1are the fail-fast auth-preflight contract and the richerprocess_exitforensic fields. - BUG-52 recovery paths from Turn 93/94 are shipped behavior. Operators who previously had to patch
.agentxchain/state.jsonto recover fromneeds_human+queued_phase_transitionstates should no longer need that manual surgery onv2.149.1.
Tester Re-Run Contract
Run the shipped package, not the source tree:
For closure evidence on v2.149.1, quote the exact command output or diagnostic lines for these checks:
- BUG-54 auth-shape preflight: first run
agentxchain connector check <claude-runtime> --jsonoragentxchain connector validate <claude-runtime> --jsononv2.149.1. If the runtime is still in the known-hanging configuration, quote theclaude_auth_preflight_failedoutput with itsauth_env_presentbooleans 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.1and quote the adapter diagnostic lines that includestartup_latency_ms,elapsed_since_spawn_ms,first_output_stream,watchdog_fired, andexit_signalonprocess_exit. If the runtime only stabilizes after raisingruntimes.<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--bareis set, quote the fullprocess_exitrecord 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.jsoninside the failing worktree. The runbook at.planning/BUG_54_REPRO_SCRIPT_TESTER_RUNBOOK.mdmaps 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:
planning_signoffwith separatedcheckpoint-turn→unblock→ next dispatch isdev, not PM.qa_ship_verdictwith separatedcheckpoint-turn→unblock→ next dispatch islaunch, not QA.needs_humanorphanphase_transition_request→unblock→ phase advances, no redundant same-role dispatch.queued_phase_transition→resume→ phase advances,queued_phase_transitionclears. Quote the dispatched turn'sassigned_roleand thephase_enteredevent line withtrigger: "reconciled_before_dispatch"for each lane. No manualstate.jsonpatching at any step.
- BUG-55 sub-A checkpoint completeness + wrong-lineage: quote
accept-turn+checkpoint-turnresult for a real QA turn and the resultinggit status --short(must be clean). If a declared path was already committed on a divergent lineage, quote thedivergent_from_accepted_lineagefield on the checkpoint result — the wrong-lineage path must be surfaced distinctly fromgenuinely_missing. - BUG-55 sub-B verification outputs: quote the failure showing
undeclared_verification_outputs+verification.produced_filesremediation pointer; then quote the clean acceptance path after the produced file is declared. - BUG-55 combined tester shape: run
accept-turnfollowed bycheckpoint-turnon a QA turn that both declaresfiles_changedand produces fixture outputs; quotegit status --shortafter. Clean tree means BUG-55 is fixed for your reproduction. - BUG-53 continuous auto-chain: run
agentxchain run --continuous --max-runs 3from a clean session and quote thesession_continuationevent lines (formatsession_continuation <previous_run_id> -> <next_run_id> (<next_objective>)). Session status must stayrunningbetween runs and end ascompletedoridle_exit, neverpaused.
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, andconnector validate;doctorwarns on the same shape;process_exitforensic fields, reproduction harness, runbook, per-runtime watchdog override, and dashboard rendering fix remain shipped. Awaiting tester-quotedv2.149.1output. - 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.1with no manualstate.jsonpatching. - 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 --shortclean output onv2.149.1. - BUG-53: CLI auto-chain + idle_exit + packaged session_continuation coverage. Awaiting tester-quoted
session_continuationoutput onv2.149.1.