Repository navigation
fix: status honours --config, observed liveness for unowned workers, record skipped verification - #63
Merged
Merged
Conversation
status() now falls back to the persisted attempt pid (the same ProcessView check crash_fail uses) when the owned harness view says Dead, so inspect/status from a separate process no longer report live: Dead for a detached run's running workers. Recovery paths keep the owned view, where Dead means "this process cannot collect it" (#30). Worker: Meshloop issues-46-47-56 node 2, attempt 4 (Claude Sonnet). Orchestrator fix: cargo fmt (attempt failed verify on fmt only). Implements #47 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…graph status parsed only --graph, so --config/--db were dropped and config discovery ran from cwd; a missing config or unknown graph returned ok: true with no runs. Both are now ok: false errors with exit code 2. Worker: Meshloop issues-46-47-56 node 1, attempt 3 (Claude Sonnet). Orchestrator fixes: removed a duplicated #[test] attribute (clippy duplicated_attributes); emit a JSON error from the saga.status error branch, where an unknown --graph actually fails (MissingGraph). Implements #46 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An empty verify_command added no evidence at all, so nodes advanced as if checked (ADR 0007 requires deterministic checks). Verification now writes a `verify: skipped` deterministic row; doctor reports a `warnings` entry and run prints the same warning to stderr. Worker: Meshloop issues-56 node 1, attempt 5 (Claude Sonnet), on top of the #46/#47 commits. Orchestrator fix: moved EMPTY_VERIFY_WARNING above cmd_run's #[allow(clippy::too_many_arguments)], which the worker had split from its function. Implements #56 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Attempts stored the harness name ("claude") as image_name, so
WindowsProcessView never matched the real process (e.g. pwsh.exe) and a
running detached worker showed as Ambiguous rather than Live. Harnesses
now expose process_image() from their configured executable, and the
run loop persists that. orphan_identity_matches shares the helper.
Orchestrator change (Claude Opus 5.5), found while live-testing #47.
Implements #47
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 7, 2026
Open
Open
Owner
Author
3 tasks
4 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Implements #46, #47 and #56. Closes #46, closes #47, closes #56.
statusnow parses and honours--configand--db. A missing config, or a--graphthat doesn't resolve, returnsok: falseand exits 2. Before, both returnedok: truewith no runs.status/inspectused to showlive: Deadfor workers started by a different Meshloop process. They now fall back to the attempt's saved PID and image name, the same checkcrash_failalready uses. Recovery deliberately keeps the old check, whereDeadmeans "this process can't collect the worker", so orphaned workers are still killed and retried (feat: contain harness descendants on posix when meshloop aborts #30).image_namewas the harness name ("claude") rather than the process image (pwsh.exe). So no saved attempt could ever match its process. Harnesses now reportprocess_image()from their configured executable.verify_commandused to add no evidence, so a node advanced as if it had been checked. It now records averify: skippedevidence row,doctor --jsonreports it underwarnings, andrunprints a warning to stderr.How this was built
The work was delivered through Meshloop: graph
issues-46-47-56(nodes 1 and 2), thenissues-56. The orchestrator was Claude Code (Opus 5.5) and the workers were Claude Sonnet. You accepted both plans.78579d8cargo fmt07be0ee#[test]. An unknown--graphactually fails in thesaga.statuserror path, which still printed only to stderr, so that path now returns a JSON error too.eab9828issues-56node 1, attempt 5constthat had split#[allow(clippy::too_many_arguments)]from its function8808951All three worker attempts failed Meshloop verification. In each case the logic was right, but there were format or lint problems that
cargo fmtor clippy would have caught. The worker log for attempt 5 shows why: the worker command allowed"Bash(cargo:*)", but Claude Code still deniedcargo("requires approval"), so no worker could run fmt, clippy or its tests. I salvaged each attempt's diff onto this branch, made the fixes listed above, and re-ran the workspace check. These attempts never reached Meshloop's technical acceptance. This PR is the review point.Checks
cargo run --locked -p xtask -- check(fmt, check, clippy-D warnings, workspace tests, xtask scaffold) passes on8808951. Windows 11.statuskeeps--config/--db/--graphstatuswith the config outside the current directory; no config; unknown graphobserved_livecases;skipped_verify_evidencedoctorwarnings with empty and non-emptyverify_commandprocess_image_name; a spawned child with the right image readsLive, and with the harness name readsAmbiguousissues-56run:status --configrun from another directory listed the running node. With no config, it returnedok: false.inspectof a running detached worker after8808951. While that worker was running, the binary built before the image-name fix showedAmbiguous, which is the correct result for a mismatched image. The new adapter test covers the matching-image case.PosixProcessViewdoesn't compare image names, so a reused PID on POSIX can still readLive. That was already the case forcrash_fail.Limitations
attempts.ended_atis never written, soobserved_live's finished-attempt check doesn't fire in practice. Finished workers fall through to the PID check, which reportsDeadorAmbiguouscorrectly.meshloopwith no arguments runsstatus. With no config it now exits 2 with "no config found" instead of printing the banner.Follow-ups, filed separately, are linked in the comments.
🤖 Generated with Claude Code