Skip to content

fix: status honours --config, observed liveness for unowned workers, record skipped verification - #63

Merged
smota merged 4 commits into
mainfrom
work/status-liveness-verify
Oct 7, 2026
Merged

smota merged 4 commits into
mainfrom
work/status-liveness-verify

Conversation

@smota

@smota smota commented Oct 7, 2026

Copy link
Copy Markdown
Owner

Summary

Implements #46, #47 and #56. Closes #46, closes #47, closes #56.

How this was built

The work was delivered through Meshloop: graph issues-46-47-56 (nodes 1 and 2), then issues-56. The orchestrator was Claude Code (Opus 5.5) and the workers were Claude Sonnet. You accepted both plans.

Commit Issue Worker Orchestrator fixes
78579d8 #47 node 2, attempt 4 cargo fmt
07be0ee #46 node 1, attempt 3 Removed a duplicated #[test]. An unknown --graph actually fails in the saga.status error path, which still printed only to stderr, so that path now returns a JSON error too.
eab9828 #56 issues-56 node 1, attempt 5 Moved a const that had split #[allow(clippy::too_many_arguments)] from its function
8808951 #47 — (orchestrator) Store the worker's process image name instead of the harness name

All three worker attempts failed Meshloop verification. In each case the logic was right, but there were format or lint problems that cargo fmt or clippy would have caught. The worker log for attempt 5 shows why: the worker command allowed "Bash(cargo:*)", but Claude Code still denied cargo ("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 on 8808951. Windows 11.
  • New tests:
    • parser: status keeps --config/--db/--graph
    • CLI: status with the config outside the current directory; no config; unknown graph
    • engine: six observed_live cases; skipped_verify_evidence
    • CLI: doctor warnings with empty and non-empty verify_command
    • adapters: process_image_name; a spawned child with the right image reads Live, and with the harness name reads Ambiguous
  • Live, against the detached issues-56 run: status --config run from another directory listed the running node. With no config, it returned ok: false.
  • Not run: a live inspect of a running detached worker after 8808951. While that worker was running, the binary built before the image-name fix showed Ambiguous, which is the correct result for a mismatched image. The new adapter test covers the matching-image case.
  • Not run: Linux/macOS. PosixProcessView doesn't compare image names, so a reused PID on POSIX can still read Live. That was already the case for crash_fail.

Limitations

  • attempts.ended_at is never written, so observed_live's finished-attempt check doesn't fire in practice. Finished workers fall through to the PID check, which reports Dead or Ambiguous correctly.
  • Plain meshloop with no arguments runs status. 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

smota and others added 4 commits October 7, 2026 12:28
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>
@smota

smota commented Oct 7, 2026

Copy link
Copy Markdown
Owner Author

Follow-ups found during this run: #64 (verify evidence drops the error), #65 (redaction false positive in worktree paths), #66 (ended_at never written), #67 (second ready node not dispatched while one is verifying), and a comment on #27 (worker tool rules didn't let workers run cargo).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working implemented-by:claude Implementation completed by Claude Code

Projects

None yet

1 participant