2026-06-28 - 2026-09-28

Overview

134 Active Pull Requests
308 Active Issues
Excluding merges, 4 authors have pushed 258 commits to main and 752 commits to all branches. On main, 283 files have changed and there have been 33965 additions and 5385 deletions.

2 Releases published by 2 users

Published v1.1.0 2026-08-17 16:25:43 +02:00

Published v1.0.0 v1.0.0 — One leader, one host, complete 2026-08-10 15:58:06 +02:00

134 Pull requests merged by 2 users

Merged #620 fleetd #612 Unit A: extract main's boot composition into FleetdAssembly/FleetdRuntime 2026-09-22 07:43:40 +02:00

Merged #628 fleetd #612 B3: behavioural replacements for lead-seat, quarantine, lead-rollover guards 2026-09-22 07:36:05 +02:00

Merged #626 fleetd #612 step 2 unit B2: behavioural replacements for the CB-185 pair 2026-09-22 07:19:29 +02:00

Merged #627 fleetd #612 Unit B1: CompletionResolver behavioural test (replaces source-text guard) 2026-09-22 07:14:26 +02:00

Merged #624 fleetd #612 A-gaps: coordinator path + reportRoleFallbackGaps inside the assembly boundary 2026-09-22 06:41:42 +02:00

Merged #623 #608 replace MessageService timing sleeps 2026-09-22 06:38:30 +02:00

Merged #622 fleetd #621: make the context-roll notice obey requireOperatorConfirm 2026-09-22 06:31:02 +02:00

Merged #619 fleetd #618: state the measured auto-compact precedence 2026-09-22 05:53:36 +02:00

Merged #601 CB-617: pass auto-compact window to leads 2026-09-22 05:22:57 +02:00

Merged #617 fleetd #615: write FAILED instead of leaving status(token) stuck at IN_PROGRESS 2026-09-22 05:21:21 +02:00

Merged #616 fleetd #613: boot log for role fallback gaps + heartbeat contextHighNudge 2026-09-22 05:17:53 +02:00

Merged #614 fleetd CI: unreadableFileIsUnknown is red on main under root 2026-09-20 12:43:44 +02:00

Merged #610 fleetd #609: nudge an idle lead to hand over when its own context reads HIGH 2026-09-20 12:37:43 +02:00

Merged #611 fleetd #608: make anAlreadyCollectedTicketProducesNoNudge deterministic 2026-09-20 12:26:16 +02:00

Merged #602 fleetd: report a lead's live context usage in fleet_list 2026-09-20 11:38:31 +02:00

Merged #606 fleetd #602 gauge-wiring: thread a lead's configured configDir into the context gauge 2026-09-20 11:38:22 +02:00

Merged #607 fleetd #603: share HEALTH_WAIT between the pid poll and the health check 2026-09-20 11:30:10 +02:00

Merged #605 #604 item 1: fleet_list reports charterBytes alongside charterSha256 2026-09-20 11:18:17 +02:00

Merged #599 fleetd #589 (Groups 1 & 2): pin 6 main() wiring sites with named factories 2026-09-19 10:39:48 +02:00

Merged #597 fleetd #593 (pid-count half): running_pid() no longer matches the caller 2026-09-19 10:37:50 +02:00

Merged #598 #589 Group 3: wiring-test 5 sites below line 500 in Fleetd.main() 2026-09-19 10:33:07 +02:00

Merged #596 #568: add hunter member role 2026-09-19 10:13:27 +02:00

Merged #583 #582: assert pending message-id cleanup 2026-09-12 15:52:25 +02:00

Merged #574 fleetd #572: pin answer()'s session-lock release across all four exits 2026-09-12 13:30:23 +02:00

Merged #573 fleetd #567: assert inspect closes probe channel 2026-09-12 13:26:31 +02:00

Merged #570 fleetd #561: harden the completion/session TurnListener fan-out 2026-09-12 13:20:56 +02:00

Merged #569 fleetd #551: record the delivery attempt before the irreversible send 2026-09-12 13:19:20 +02:00

Merged #565 fleetd #555: lift 8 main-flow decisions into tested predicate/dispatch functions 2026-09-12 12:19:48 +02:00

Merged #566 fleetd #556: make turn registration structural, independent of any TurnListener 2026-09-12 12:18:16 +02:00

Merged #564 fleetd #513: fix TIMED_OUT_QUEUED javadoc — cancelled, not queued 2026-09-12 11:48:54 +02:00

Merged #558 CLAUDE.md: the ticket is the pull channel, and the brief is write-once 2026-09-12 11:12:55 +02:00

Merged #559 fleetd #544: progress watchdog for StatusPoller and SessionReaper loops 2026-09-12 11:11:47 +02:00

Merged #560 fleetd #552: warn instead of aborting when the post-restart mktemp fails 2026-09-12 10:58:10 +02:00

Merged #557 fleetd #553: register the rendezvous waiter in onStatus's finally backstop 2026-09-12 10:50:25 +02:00

Merged #554 fleetd #550: portable hash256 helper for jar_id, Linux CI job for the shell suite 2026-09-12 10:20:29 +02:00

Merged #549 fleetd #546: widen Injector's delivery catch to Throwable 2026-09-12 09:39:41 +02:00

Merged #548 fleetd #545: fix mktemp -t templates for GNU coreutils, split unclear-supervisor detail 2026-09-12 09:30:30 +02:00

Merged #547 fleetd #512 follow-up: record why the drain-complete line must not move into a finally 2026-09-12 09:29:47 +02:00

Merged #541 fleetd #504 item 1: stop the false ok on the loaded-but-not-running stop path 2026-09-12 09:09:00 +02:00

Merged #543 fleetd #538: recover polling loops after errors 2026-09-12 09:02:49 +02:00

Merged #542 fleetd #426: pin FleetHealthMonitor.coverage and its HealthCoverageSource call site 2026-09-12 08:55:46 +02:00

Merged #539 fleetd #459: lint Javadoc references in CI 2026-09-12 08:46:23 +02:00

Merged #540 fleetd #537: pin CapturedLog.close()'s appender-detach and setLevel-immunity contracts 2026-09-12 08:42:19 +02:00

Merged #536 fleetd #535: convert FleetdLeadMailboxSelectionTest to CapturedLog 2026-09-12 08:25:01 +02:00

Merged #534 fleetd #512 part 2: detect a died shutdown drain the ERROR count is blind to 2026-09-12 08:04:15 +02:00

Merged #533 fleetd #529: promote CapturedLog to a shared test helper, close the logger-level leak 2026-09-12 07:57:25 +02:00

Merged #532 fleetd #528: pin drain_gate_refusal's call site, not just the predicate 2026-09-12 07:41:57 +02:00

Merged #531 charter: separate the blocked forge MCP server from the working GITEA_TOKEN 2026-09-12 07:41:11 +02:00

Merged #527 fleetd #525: restore the logger level, not just the appender, in SessionManagerTest 2026-09-12 07:20:45 +02:00

Merged #524 fleetd #518: FleetMcp caller resolution is an explicit choice, and tested for real 2026-09-12 07:10:22 +02:00

Merged #526 fleetd #521: extract should_swap so the swap guard can't be silently disabled 2026-09-12 07:01:55 +02:00

Merged #523 fleetd #519: test policy probe guards 2026-09-12 06:59:02 +02:00

Merged #522 fleetd #512 (part 1): log a positive completion line when drainAll finishes 2026-09-12 06:34:52 +02:00

Merged #520 fleetd #517: pin the drain-gate abort branch and jar_id absent case 2026-09-12 06:29:09 +02:00

Merged #516 fleetd #500: honest refusal when the policy parse fails, not just when it's empty 2026-09-12 06:09:51 +02:00

Merged #515 fleetd #509: pin the pane-scan completeness fold; harden legacyPrincipal 2026-09-12 06:06:13 +02:00

Merged #514 fleetd #511: fix wrong --no-build wording in drain-gate abort, pin jar_id() default 2026-09-12 06:00:24 +02:00

Merged #510 fleetd #493: never build into the path a running daemon holds 2026-09-12 05:44:17 +02:00

Merged #508 fleetd #505: refuse (not promote) a caller whose pane scan errored 2026-09-12 05:35:42 +02:00

Merged #503 fleetd #501: readiness-grace expiry logs measured elapsed time and poll counter 2026-09-12 05:07:36 +02:00

Merged #499 fleetd #492 follow-up: detect_supervisor must never read "could not tell" as "none" 2026-09-12 05:04:04 +02:00

Merged #502 fleetd #498: awaitHerdr distinguishes deadline-passed from interrupted, with measured elapsed time 2026-09-12 05:01:02 +02:00

Merged #496 fleetd #494: log measured elapsed time, not the configured budget, on lead-rollover failure/success 2026-09-12 04:44:10 +02:00

Merged #490 fleetd #489: nudge the /clear submit keystroke before bootstrapText 2026-09-12 02:52:52 +02:00

Merged #485 fleetd #480 Unit C: fleet_handover MCP tool 2026-09-11 02:27:56 +02:00

Merged #484 fleetd #480 Unit E: BLOCKED is not a settled turn boundary 2026-09-11 02:21:06 +02:00

Merged #483 fleetd #480 Unit A: lead rollover core (config block + executor) 2026-09-11 01:51:21 +02:00

Merged #481 fleetd #480 Unit B: add handover skill for lead handoff 2026-09-11 01:16:40 +02:00

Merged #461 #455: document herdr test socket exception 2026-09-10 13:18:18 +02:00

Merged #456 fleetd #453: document PeerLauncher.defaultProfileFor/place override obligation 2026-09-10 13:04:10 +02:00

Merged #452 fleetd #449: fix stale herdr protocol 14, diagnose AgentControlContractTest timing race, CI selects contract tests by tag 2026-09-10 12:35:10 +02:00

Merged #448 fleetd #437: fleet_ack errors instead of claiming success on a miss 2026-09-10 12:20:49 +02:00

Merged #451 fleetd #450: make PeerLauncher.spawn(SpawnRequest, PlacementDecision) abstract 2026-09-10 12:16:47 +02:00

Merged #447 fleetd #444: test that pins the place()-to-spawn() window PlacementDecision closes 2026-09-10 12:00:59 +02:00

Merged #445 fleetd #442: pin startup report calls 2026-09-10 11:30:31 +02:00

Merged #443 fleetd #440: derive coordinator.heldDurable from queue durability + ack mode 2026-09-10 11:21:41 +02:00

Merged #433 fleetd #425 rework: resolve acquireWithWorktree via real placement routing 2026-09-10 09:35:02 +02:00

Merged #438 fleetd #421: let a lead peek its own held peer mail, primary-only 2026-09-10 09:08:18 +02:00

Merged #436 fleetd #435: FixedPlacementPolicy now honors maxLoad 2026-09-10 08:54:19 +02:00

Merged #434 fleetd #422 follow-up: make the model gate's own state observable 2026-09-10 08:32:55 +02:00

Merged #432 fleetd #431: pin profileForSlot, isSlot, nameForSlot against a live reload 2026-09-10 08:24:27 +02:00

Merged #429 fleetd #422: enforce model allow-list on/off at spawn, hot reload 2026-09-10 07:44:36 +02:00

Merged #423 fleetd #415: split coverage() feature-state wording by pattern fallback semantics 2026-09-10 06:57:34 +02:00

Merged #419 fleetd #418: barrier the throw-path push-loop test on state decide() reads 2026-09-10 06:29:23 +02:00

Merged #420 fleetd #416: fleet_list must enumerate the STARTUP profile set 2026-09-10 06:27:37 +02:00

Merged #414 fleetd #409: deterministic test for the #399 completion-stamp ordering race 2026-09-10 04:48:45 +02:00

Merged #406 fleetd #404: report armed detection from startup map 2026-09-10 04:20:55 +02:00

Merged #402 fleetd #391: refuse lead fleet replies 2026-09-10 04:18:37 +02:00

Merged #405 fleetd #399: fix TTL test race — wait on completion stamp, not Phase.DONE 2026-09-10 04:14:30 +02:00

Merged #363 #362: make the plugin visible, and fix the drift that made it unusable 2026-09-05 07:50:19 +02:00

Merged #235 CB-612: suppress unneeded token warnings 2026-09-03 05:02:27 +02:00

Merged #233 fleetd #176: fail-fast + safe UNKNOWN refinement in the spawn-readiness gate 2026-09-03 04:20:23 +02:00

Merged #231 fleetd #175: check opencode's actual model against the profile, quarantine on a real mismatch 2026-09-02 13:01:34 +02:00

Merged #229 fleetd#222: put the claude-code charter file where the member can read it 2026-09-02 02:56:36 +02:00

Merged #228 fleetd #226: reserve architect slots before launch 2026-09-02 02:54:52 +02:00

Merged #230 fleetd #224 / #225: share worktreeRoot with the group + fix a CWD-dependent group test helper 2026-09-02 02:52:12 +02:00

Merged #223 CB-619 / fleetd #123: refuse an architect spawn with no matching slot 2026-09-01 10:41:47 +02:00

Merged #221 fleetd#219: fix OpenCodeLauncher config/discovery roots under memberHerdrSocket 2026-09-01 10:33:05 +02:00

Merged #198 #197: measure the async ticket TTL from completion, not from creation 2026-08-31 05:10:46 +02:00

Merged #195 CB-189: cover every remote, both URLs, and any non-SSH scheme in the credential check 2026-08-31 04:32:15 +02:00

Merged #196 CB-185: fix two blockers to switching on memberHerdrSocket 2026-08-31 04:30:57 +02:00

Merged #194 CB-192: fix false credential-gap WARN under allow-list+zsh, split its log guard 2026-08-31 04:30:49 +02:00

Merged #193 #168: audit current wiki snapshot 2026-08-31 04:17:07 +02:00

Merged #186 CB-185: route members to separate herdr 2026-08-29 01:24:32 +02:00

Merged #188 CB-185: fix connection-identity/status/health gaps a second herdr daemon exposes 2026-08-29 01:24:26 +02:00

Merged #187 #185: refuse an unowned paneId when more than one herdr daemon could own it 2026-08-29 01:10:22 +02:00

Merged #183 #157: rewrite SSH origin to HTTPS in the worktree 2026-08-28 01:22:57 +02:00

Merged #177 #157: convert forge worktree origins to SSH 2026-08-28 01:10:38 +02:00

Merged #180 fleetd#164: empty or suspiciously fast scrape must fail, not resolve as a success 2026-08-28 01:10:27 +02:00

Merged #179 CB-633 follow-up: union memberCredentials.allow into the derived env allow-list 2026-08-28 01:10:18 +02:00

Merged #181 #154: pin AMQP reply inbox prefetch 2026-08-28 01:06:43 +02:00

Merged #178 #150: report lead readiness from delivery gate 2026-08-28 00:59:44 +02:00

Merged #147 CB-633: constrain a member's environment with a real allow-list (memberCredentials.policy) 2026-08-23 08:22:06 +02:00

Merged #143 CB-624: add scripts/rename-checkout.sh (rename checkout claude-bridge -> fleetd) 2026-08-23 06:09:19 +02:00

Merged #139 CI: drop host port mapping on rabbitmq service in contract job 2026-08-23 05:41:26 +02:00

Merged #138 CB-622: update the canonical block to fleet_*, and fix a broken rung of the fallback ladder 2026-08-22 22:08:45 +02:00

Merged #136 CB-622 lead follow-up: the three changes no worker could make 2026-08-22 21:59:46 +02:00

Merged #133 CB-622: rename bridge_* tool names to fleet_* in Markdown docs 2026-08-22 21:58:16 +02:00

Merged #132 CB-622 (unit C): rename bridge_* tools to fleet_* in scripts, e2e tests, config; mount name bridged -> fleetd 2026-08-22 21:58:10 +02:00

Merged #135 CB-622 Unit A: register fleet_* MCP tools, keep bridge_* working 2026-08-22 21:58:03 +02:00

Merged #92 CB-597: fix bridged.example.yaml inaccuracies (everything else was already documented) 2026-08-16 17:59:41 +02:00

Merged #93 CB-599: a capacity refusal must tell the caller why 2026-08-16 17:54:45 +02:00

Merged #86 CB-594: make supervision and a working fleet possible at the same time 2026-08-16 17:32:57 +02:00

Merged #90 CB-590 follow-up: per-source reminder budgets for the push loop 2026-08-16 17:28:58 +02:00

Merged #88 CB-528: close the recovery race in AmqpReplyInbox 2026-08-16 17:27:22 +02:00

Merged #55 CB-579: resolve a lead by its tab name, drop the terminal-id pin 2026-08-15 09:29:01 +02:00

Merged #56 CB-580: fail a ticket when its member reaches a terminal health state 2026-08-15 08:57:03 +02:00

Merged #53 CB-576: release preserves a dirty worktree instead of deleting it 2026-08-15 08:54:33 +02:00

Merged #23 CB-548: harden send ownership and rendezvous routing 2026-08-13 19:44:02 +02:00

Merged #18 CB-547b: opencode session identity — resume (-s) + post-hoc session discovery 2026-08-13 19:41:07 +02:00

Merged #22 CB-543: neutralize tracked opencode.json and .autoenv in provisioned worktrees 2026-08-13 19:39:55 +02:00

Merged #20 CB-548: config-declared architect slots + Role.ARCHITECT authz (corrected premise) 2026-08-13 18:33:11 +02:00

Merged #17 CB-547a: peer-neutral session-identity contract + Claude Code adapter 2026-08-13 16:56:32 +02:00

Merged #14 CB-539 + CB-542: subscription-profile opt-in, with the env: bypass closed 2026-08-13 15:31:51 +02:00

235 Issues closed from 3 users

Closed #621 contextNotice hardcodes "ask the operator" and ignores requireOperatorConfirm, so the knob cannot actually stop the asking 2026-09-22 06:31:02 +02:00

Closed #615 A herdr throw during a lead roll leaves status(token) reporting IN_PROGRESS forever 2026-09-22 05:21:34 +02:00

Closed #613 A role with no pool and no charter starts anyway, and nothing at boot says so 2026-09-22 05:18:25 +02:00

Closed #608 Flaky: MessageServiceTest.anAlreadyCollectedTicketProducesNoNudge orders an async scheduler with Thread.sleep 2026-09-20 12:27:31 +02:00

Closed #603 redeploy-fleetd.sh reports "no process appeared" on a deploy that fully succeeded 2026-09-20 11:30:10 +02:00

Closed #582 AmqpReplyInbox / LeadMailbox: the pendingByMsgId half of the dual-map cleanup is unasserted at every error-path site (from the #577 sweep) 2026-09-12 15:53:02 +02:00

Closed #562 LoopWatchdog.health() is public and nothing reads it — surface it without breaking the two scripts that parse /healthz 2026-09-12 15:31:21 +02:00

Closed #581 CompletionResolver: 9 sites maintain the CAS-remove invariant, only 2 are asserted (from the #577 sweep) 2026-09-12 15:31:17 +02:00

Closed #571 MessageService collapses the new ATTEMPTED state into TIMED_OUT_QUEUED, so a possibly-delivered message is reported as one that will never arrive 2026-09-12 15:31:13 +02:00

Closed #577 Sweep: find every invariant kept at N sites but asserted at fewer than N 2026-09-12 15:08:09 +02:00

Closed #575 The waiter cleanup in MessageService is maintained at three sites, and one of them is outside any finally 2026-09-12 14:05:24 +02:00

Closed #567 LeadMailbox.inspect leaks a probe channel if the close is removed, and 15 contract tests stay green while the line runs 3 times 2026-09-12 13:26:36 +02:00

Closed #551 Injector records the delivery AFTER the irreversible send, so a failure in the response window marks a delivered brief NOT_DELIVERED 2026-09-12 13:19:20 +02:00

Closed #556 TurnListener implementations are the only thing maintaining the Injector's own invariant 2026-09-12 12:21:09 +02:00

Closed #555 redeploy-fleetd.sh: the 67-test suite covers the functions and barely touches the main flow 2026-09-12 12:19:48 +02:00

Closed #513 MessageService's TIMED_OUT_QUEUED javadoc says the message is still queued; the code 12 lines of behaviour later cancels it 2026-09-12 11:48:54 +02:00

Closed #544 A dead StatusPoller or SessionReaper can now be restarted, but nothing restarts it and nothing notices 2026-09-12 11:13:27 +02:00

Closed #552 redeploy-fleetd.sh exits non-zero after a SUCCESSFUL restart if the post-restart mktemp fails, reporting a working deployment as a failure 2026-09-12 10:58:10 +02:00

Closed #553 A throwable from any listener callback in onStatus skips the delivered-future completion, so a caller waits forever on a message that WAS delivered 2026-09-12 10:51:10 +02:00

Closed #550 shasum is macOS-only: on Linux redeploy-fleetd.sh reports an existing jar as "absent" with exit 0, and the shell suite dies at 127 looking green 2026-09-12 10:21:23 +02:00

Closed #545 redeploy-fleetd.sh cannot run on Linux at all: every mktemp -t NAME fails under GNU coreutils, and the script blames the systemd bus for it 2026-09-12 09:42:33 +02:00

Closed #546 Merging #543 made re-delivery reachable: an Error after Injector's send now loops and types the same brief again 2026-09-12 09:39:41 +02:00

Closed #538 An Error in StatusPoller.loop or SessionReaper.loop kills the thread permanently and silently, and start() then refuses to restart it 2026-09-12 09:03:17 +02:00

Closed #426 FleetHealthMonitor.coverage has no test at all, and it feeds fleet_list's healthCoverage field 2026-09-12 08:56:09 +02:00

Closed #459 Five {@link} targets in main do not exist, and nothing in CI would ever say so 2026-09-12 08:46:50 +02:00

Closed #537 CapturedLog.close() detaches the appender and no test proves it — the fix for #525/#529/#535 is itself unpinned 2026-09-12 08:42:46 +02:00

Closed #535 FleetdLeadMailboxSelectionTest leaks three ListAppenders onto the shared Fleetd logger, and the appender-balance invariant catches it 2026-09-12 08:26:33 +02:00

Closed #512 redeploy-fleetd.sh says "no ERROR lines since restart" while blind to the exact failure #493 is about 2026-09-12 08:05:43 +02:00

Closed #529 Tests pin shared logger levels and never restore them: 9 files, 19 pins, one proven cross-class collision — share SessionManagerTest's CapturedLog 2026-09-12 08:00:33 +02:00

Closed #528 "Extract the decision so the suite can call it" pins the decision and never the wiring — drain_gate_refusal's call site can be bypassed with the suite green 2026-09-12 07:42:32 +02:00

Closed #525 A test pins the shared SessionManager logger to WARN and never restores it, so any later test asserting an INFO line silently sees nothing 2026-09-12 07:22:02 +02:00

Closed #518 Nothing tests that FleetMcp uses the CallerResolver — forcing the legacy identity path leaves the whole suite green at 1696/0 2026-09-12 07:10:23 +02:00

Closed #521 The swap guard can be disabled with the suite green — a "successful" redeploy that never puts the new jar in place 2026-09-12 07:03:29 +02:00

Closed #519 probe-member-credentials.sh has no test harness at all, and its new arity message is off by one on an empty parse 2026-09-12 06:59:54 +02:00

Closed #517 A source-text test pins what a message SAYS and never whether it is REACHED — the drain-gate abort branch can be disabled with the suite green 2026-09-12 06:30:42 +02:00

Closed #500 probe-member-credentials.sh uses mapfile (bash 4+) with no set -e, so on bash 3.2 it silently reports an empty field list 2026-09-12 06:10:43 +02:00

Closed #509 #505 follow-up: the two-client completeness fold is unpinned, and legacyPrincipal can still re-open the escalation 2026-09-12 06:07:06 +02:00

Closed #511 #493 follow-up: the drain-gate abort message names a recovery that does not work, and jar_id()'s default is unpinned 2026-09-12 06:01:13 +02:00

Closed #493 redeploy-fleetd.sh builds into the LIVE jar path, so the shutdown drain can die on a class it never loaded (#413) 2026-09-12 05:53:55 +02:00

Closed #505 A herdr error during the pane scan makes a worker's connection resolve as the primary — #317's escalation, through the door #317 did not close 2026-09-12 05:36:17 +02:00

Closed #492 redeploy-fleetd.sh is launchd-only: on fleet01 it kills the daemon and leaves TWO running 2026-09-12 05:14:39 +02:00

Closed #501 Injector's readiness-grace warn prints the configured budget as if it were elapsed time — #494's defect, in the delivery loop 2026-09-12 05:11:24 +02:00

Closed #498 awaitHerdr has two return-false paths and the caller reports both as "did not answer within 30s" 2026-09-12 05:01:33 +02:00

Closed #494 LeadRollover's failure logs print the CONFIGURED budget, not the measured wait — the exact thing that hid #489 2026-09-12 04:46:18 +02:00

Closed #474 A charter naming an unregistered tool is refused at startup but accepted on reload 2026-09-10 23:15:36 +02:00

Closed #399 MessageServiceTest TTL test races the completedNanos stamp — passes on macOS, fails on Linux 2026-09-10 15:37:45 +02:00

Closed #464 Nothing checks charter text against the tool surface the server registers 2026-09-10 15:36:25 +02:00

Closed #400 SECURITY (receipt): the scrub reports a name as blanked when eval returned 0 without blanking it 2026-09-10 15:35:17 +02:00

Closed #393 "skill seeding: N of M" is logged as success for opencode members, which never read .claude/skills/ 2026-09-10 15:18:57 +02:00

Closed #469 Charter text is still never checked against the live tool surface — one canonical tool-name set (follow-up to #464) 2026-09-10 15:11:23 +02:00

Closed #424 Revoking an architect slot does not revoke it: MemberRegistry freezes fleet.architects, and the reload says it applied 2026-09-10 14:38:59 +02:00

Closed #463 listFleet's compat overloads default callerIsPrimary to true, so the coordinator gate fails open 2026-09-10 14:17:13 +02:00

Closed #446 The model gate can be turned off at runtime but its usage-limit detector cannot be turned on at runtime 2026-09-10 14:17:10 +02:00

Closed #458 Canonical invariant 5 states a mechanism where it means a purpose — restate it (blocked on #455) 2026-09-10 13:59:23 +02:00

Closed #439 fleet_list hands every worker the coordinator row: peer coord-ids and 80-char previews of lead-to-lead bodies 2026-09-10 13:44:30 +02:00

Closed #455 Invariant 5 ("never drive the multiplexer directly, no socket") is unsatisfiable for a worker assigned to herdr code 2026-09-10 13:18:18 +02:00

Closed #453 PeerLauncher.place(role) and defaultProfileFor(role) are default methods that silently ignore the role 2026-09-10 13:07:40 +02:00

Closed #422 Model gating units 2+3: enforce the allow-list at spawn, and turn one model off at runtime without editing profiles 2026-09-10 12:48:01 +02:00

Closed #449 The herdr contract tests were left behind by the protocol-19 port, and nothing runs them 2026-09-10 12:37:27 +02:00

Closed #437 fleet_ack says "acknowledged <msgId>" for a held peer message it never touches 2026-09-10 12:21:13 +02:00

Closed #450 PeerLauncher's default spawn(req, decision) is still the #425 defect, and nothing tests it — make it abstract 2026-09-10 12:17:12 +02:00

Closed #444 PlacementDecision's javadoc claims the place()-to-spawn() window is closed, but no test pins it — and PeerLauncher's default spawn(req, decision) reopens it 2026-09-10 12:01:35 +02:00

Closed #442 Deleting any of the four startup report calls from Fleetd.main leaves the suite green 2026-09-10 11:31:17 +02:00

Closed #440 coordinatorView reports heldDurable as a hardcoded true, so it cannot go false when durability breaks 2026-09-10 11:21:41 +02:00

Closed #425 fleet_profiles reports a frozen "default" profile while placement already moved to a new one 2026-09-10 09:35:44 +02:00

Closed #441 Nothing warns that a profile has no usage-limit detection, so "off when the subscription limit is reached" silently covers only the profiles that opted in 2026-09-10 09:29:04 +02:00

Closed #421 A lead can neither read nor safely keep its own held peer messages — the only drain is an injectable pane 2026-09-10 09:08:18 +02:00

Closed #435 maxLoad says it is excluded from "every automatic policy" — fixed, the default, ignores it 2026-09-10 08:55:03 +02:00

Closed #415 The startup coverage line reports "off" for errorPattern, but legacy classification is still running 2026-09-10 06:57:46 +02:00

Closed #417 Sweep for the REVERSE config mismatch: a boot snapshot read where the key is hot 2026-09-10 06:46:48 +02:00

Closed #418 Second instance of the #399 shape: a test uses Phase.ASKING as a barrier for push-loop state published later 2026-09-10 06:29:43 +02:00

Closed #416 fleet_list advertises free capacity for a profile the spawn gate refuses — CapacitySource reads the live profile keySet 2026-09-10 06:27:37 +02:00

Closed #409 The #399 completion-stamp race is verifiable deterministically — nowNanos is already injectable 2026-09-10 04:49:41 +02:00

Closed #404 exhaustionDetectionArmed reads the LIVE config while detection reads the STARTUP snapshot — after a reload it reports armed when detection is still off 2026-09-10 04:21:58 +02:00

Closed #391 fleet_reply cannot answer a peer lead — the charter documents a path that does not exist 2026-09-10 04:21:39 +02:00

Closed #395 A profile with no exhaustedPattern has usage-limit detection silently OFF — 6 of 8 live profiles, including both Claude subscription ones 2026-09-10 03:46:47 +02:00

Closed #394 SECURITY: the credential scrub aborts silently at the first read-only parameter, leaving every later name unscrubbed 2026-09-10 03:31:31 +02:00

Closed #190 Process argv is a credential channel we never enumerated: 4 secrets are readable by any local user via ps 2026-09-10 02:11:28 +02:00

Closed #386 Every fleetd timer freezes while the macOS host sleeps: System.nanoTime() stops, so the stall detector missed a member that was BUSY for 101 minutes 2026-09-10 02:00:24 +02:00

Closed #384 "left no scrub report" has a third, benign cause it does not name — a group-shared ZDOTDIR cannot receive the receipt 2026-09-10 01:55:28 +02:00

Closed #382 SpawnRequest has the arity trap's two halves, but not yet a colliding arity — CompositePeerLauncher:372 will drop the next component added 2026-09-10 01:55:23 +02:00

Closed #381 Members cannot run shell commands: the classifier refuses every one, so they cannot build, test or open a PR (3 members, 2 profiles) 2026-09-10 01:38:55 +02:00

Closed #385 A lead-coordination message can be delivered forever: ack() returns success when connection recovery cleared the held entry 2026-09-10 01:29:44 +02:00

Closed #377 GITEA_HOST carries a scheme and a trailing slash, and every member builds URLs from it 2026-09-09 02:53:55 +02:00

Closed #365 Three more tool results claim "delivered" for something weaker than delivery 2026-09-09 02:41:39 +02:00

Closed #373 The hermetic env on production GitWorktrees instances is unpinned — stripping it stays green, poisoned or not 2026-09-09 02:39:35 +02:00

Closed #358 Two more records can silently drop a field the way FleetConfig could (MemberSession, FleetConfig.Profile) 2026-09-09 02:39:14 +02:00

Closed #376 A fast model trips the 2000ms crash floor: a real answer is reported as a failed turn 2026-09-09 02:28:43 +02:00

Closed #352 CompositePeerLauncher.clearContext silently stops working for every peer that survives a restart 2026-09-09 02:17:04 +02:00

Closed #375 The idle-sleep guard is a no-op on Linux, so fleet01 still sleeps under a live member 2026-09-09 02:15:30 +02:00

Closed #369 GitWorktreesTest reads the machine's real git config, so it can pass or fail for reasons outside the repo 2026-09-06 15:33:22 +02:00

Closed #368 A lead's delegation binding outlives the lead, so reply nudges keep going to a dead terminal 2026-09-06 15:17:55 +02:00

Closed #360 deploy/fleetd.service silently disables caller identity and the credential scrub 2026-09-06 15:07:06 +02:00

Closed #359 Dead lead tabs accumulate and make lead-to-lead coordination permanently undeliverable 2026-09-06 07:10:47 +02:00

Closed #362 The plugin shipped in CB-527 is invisible and has drifted — and it cannot deliver worker skills 2026-09-05 08:34:39 +02:00

Closed #361 Lead-to-lead coordination has a send half with tools and a receive half without 2026-09-05 08:21:33 +02:00

Closed #334 MessageService: an async ticket is still stranded between clearAsyncQuestion and closeAsk 2026-09-04 12:13:25 +02:00

Closed #348 The same text-match-drives-a-cooldown shape exists for ExhaustionSink, where the penalty is 30x longer 2026-09-04 11:58:11 +02:00

Closed #335 MessageService: three more places a thrown exception has nowhere to go 2026-09-04 11:49:24 +02:00

Closed #342 CompositePeerLauncher's single-daemon stop() shortcut can skip tab teardown, orphaning a worker tab 2026-09-04 11:41:07 +02:00

Closed #345 MessageService's use of Cancellation.DELIVERED is unpinned — the seam is tested, the caller is not 2026-09-04 11:35:46 +02:00

Closed #337 The deferred key set still has no reporting coverage — measured, a dropped comparison is invisible 2026-09-04 11:19:43 +02:00

Closed #341 One flag guards two different memberCredentials WARNs, so a later leaking credential name is never reported 2026-09-04 11:14:41 +02:00

Closed #339 A member's normal report that quotes "API Error:" is recorded as a real backend outage 2026-09-04 11:14:36 +02:00

Closed #338 A TIMED_OUT_QUEUED send leaves its message in the injector queue, and it is delivered later as a stale brief 2026-09-04 11:01:27 +02:00

Closed #333 fleet: is a third split key, sitting in the coverage checker's own escape hatch — and SPLIT_KEYS membership does not prove any reporting code exists 2026-09-04 10:44:36 +02:00

Closed #329 sendAsync's executor catch swallows every exception thrown after the future completes, and that is why a stranded async ticket is invisible 2026-09-04 10:35:24 +02:00

Closed #330 health: and coordinator: are split keys — add a fourth reload class that says so, then make the top-level list prove its own coverage 2026-09-04 10:22:50 +02:00

Closed #326 The top-level deferred-key list has the same drift as #323, and two keys are read both from the startup snapshot and live — no single classification is right for them 2026-09-04 09:58:49 +02:00

Closed #324 answer() mutates a Task under sessionLocks while ask()'s timeout path mutates the same Task under no lock — finishAsyncTask can throw NPE on a null turnId 2026-09-04 09:52:56 +02:00

Closed #323 The reload classifier says "compares every component the launcher reads at spawn" and misses four keys, so those reloads report success and do nothing 2026-09-04 09:32:47 +02:00

Closed #318 A reply delivered while release() is running is stranded unacked forever: #298 closed "already held", not "arrives during release" 2026-09-04 09:24:05 +02:00

Closed #316 The dirty-worktree check runs before the worker is stopped, so work written during teardown is deleted with no preserve and no snapshot 2026-09-04 09:23:58 +02:00

Closed #317 A failed peer-PID lookup promotes a worker to primary: the escalation PaneLocator's own javadoc names, through a trigger CB-161 did not close 2026-09-04 09:05:48 +02:00

Closed #315 The fixed placement policy ignores the retry loop's unreachable set, so an unqualified spawn retries the same dead profile and never tries the healthy one 2026-09-04 08:59:19 +02:00

Closed #307 A worker's report is stranded when its fleet_ask timed out, and the lead is told the worker never replied 2026-09-04 08:34:28 +02:00

Closed #309 A timed-out git worktree add leaks the worktree it half-created: #274's cleanup does not cover the add itself 2026-09-04 08:31:00 +02:00

Closed #308 A worker spawned during the shutdown drain is never drained: its pane is left running and its worktree is never preserved 2026-09-04 08:30:57 +02:00

Closed #310 reapIdle can release a session that just became BUSY, contradicting its own documented invariant 2026-09-04 08:23:27 +02:00

Closed #306 A worker that wedges in unknown during post-turn housekeeping is polled forever and can never be delivered to again 2026-09-04 08:06:34 +02:00

Closed #305 A worker connecting from 127.0.0.2 is resolved as the primary, and gains spawn/stop/send/drain 2026-09-04 07:58:27 +02:00

Closed #304 POST /members and DELETE /members/{paneId} turn a herdr failure into a bare 500, and a stop that already succeeded can never report success 2026-09-04 07:48:27 +02:00

Closed #302 A REST reply with no content field silently becomes an empty reply, and the lead cannot tell it from a member that said nothing 2026-09-04 07:36:58 +02:00

Closed #298 AmqpReplyInbox.release() drops an unacked reply that the broker still holds — a worker's report is lost silently 2026-09-04 07:23:55 +02:00

Closed #297 REST is the weaker door, and it is the door a lead falls back to when MCP drops 2026-09-04 07:20:14 +02:00

Closed #296 Two spawn-side exits leak a live pane, and the caller cannot clean up because it never learns the pane id 2026-09-04 07:10:16 +02:00

Closed #293 A failing tab.close during teardown leaks both the ZDOTDIR and the worktree 2026-09-04 06:50:45 +02:00

Closed #280 Follow-up to #275: a health-detected GONE member whose ask lapses may still strand its ticket 2026-09-04 06:33:48 +02:00

Closed #290 Restore a test for reapIdle's per-session guard, which #283 left uncovered 2026-09-04 06:28:29 +02:00

Closed #285 seedTrustDialog writes the trust seed to fleetd's own home when memberHerdrSocket is set, so the member never sees it 2026-09-04 06:14:08 +02:00

Closed #284 A BACKEND_ERROR member holds its seat forever: counted as live, never reaped, never reclaimable 2026-09-04 06:14:05 +02:00

Closed #283 Two teardown leaks in SessionManager: an unguarded worktree removal, and a branch the spawn-failure catch forgets 2026-09-04 06:00:32 +02:00

Closed #282 A second fleet_ask in the same resumed turn kills its own async ticket: answer() completes it with QUESTION 2026-09-04 06:00:04 +02:00

Closed #281 Pin the Authz.Action every handler chooses, so the next #272 fails a test instead of shipping 2026-09-04 05:53:04 +02:00

Closed #275 Investigate: abandon() skips a task in ASKING, so a torn-down member mid-fleet_ask may strand its ticket forever 2026-09-04 05:19:56 +02:00

Closed #274 GitWorktrees.add() leaks the worktree and branch when a step after git worktree add throws 2026-09-04 05:14:58 +02:00

Closed #273 A malformed exhaustedPattern crashes startup unnamed — only errorPattern is validated at load 2026-09-04 05:14:38 +02:00

Closed #272 fleet_poll{target} drains another session's inbox behind a READ gate — authorization fails open 2026-09-04 05:01:53 +02:00

Closed #276 #269 follow-up: the "allowed N of M" INFO line still claims to describe the member's pane 2026-09-04 05:01:48 +02:00

Closed #267 The #175 model-mismatch check never runs for opencode spawns without a provisioned worktree — the majority of them 2026-09-04 03:50:01 +02:00

Closed #266 memberCredentials.sshAuthSock: rename the values block/allow to omit/inherit — "block" names something fleetd does not do 2026-09-04 03:27:01 +02:00

Closed #103 CB-605: the systemd unit has launchd's login-shell secret gap, and does not mention the two tokens it drops 2026-09-03 11:36:04 +02:00

Closed #257 fleet_list's free and the spawn gate now disagree by one on subscription profiles 2026-09-03 11:35:37 +02:00

Closed #247 Seeding ~/.claude.json can still lose an external writer's change 2026-09-03 11:30:54 +02:00

Closed #141 CB-631: four credential env vars reach every member pane unblocked — the CB-596 policy has drifted 2026-09-03 11:25:08 +02:00

Closed #116 CB-613: one worker branch holds a teardown test that never reached main, and 55 stale branches hide it 2026-09-03 11:19:02 +02:00

Closed #252 The REST surface is a supported operator fallback and is documented nowhere — 14 routes, 0 entries 2026-09-03 11:01:06 +02:00

Closed #258 Two test fixtures write to the operator's real ~/.claude.json on every run (116 dead entries accumulated) 2026-09-03 09:01:54 +02:00

Closed #114 CB-609: docs/MCP-Contract.md is a pre-build design doc that CLAUDE.md still points every session at 2026-09-03 08:39:39 +02:00

Closed #113 CB-611: our checkers keep covering less than they look like they cover — three instances in one day 2026-09-03 08:38:25 +02:00

Closed #111 CB-608: the credential probe hardcodes its own name list, so it silently under-reports the policy 2026-09-03 08:37:57 +02:00

Closed #155 the member credential scrub is zsh-only: a member on any other login shell gets every credential 2026-09-03 08:30:36 +02:00

Closed #176 capacity counts panes, not subscription seats, so a subscription profile reports a free slot that cannot be filled 2026-09-03 08:26:20 +02:00

Closed #249 fleet_list can report another session's agentSessionId, and fleet_spawn{resumeSessionId} will resume it 2026-09-03 07:57:06 +02:00

Closed #115 CB-612: the daemon warns at every boot about a token no profile needs, teaching operators to skim startup warnings 2026-09-03 07:35:03 +02:00

Closed #149 A claude-code member spawned into a fresh worktree blocks forever on the workspace trust dialog 2026-09-03 07:32:29 +02:00

Closed #248 Fleetd's composition root is untested: a feature can be silently unwired and every test stays green 2026-09-03 07:25:13 +02:00

Closed #148 CB-634: the parity overlay copies .env/.envrc into worker worktrees — the same shape as CB-633 2026-09-03 07:05:26 +02:00

Closed #234 #175's model read-back fires a FALSE POSITIVE on any member spawned without a worktree — and the quarantine it announces never happens 2026-09-03 06:58:26 +02:00

Closed #227 A backend outage is invisible at fleet level: repeated backend errors are never correlated, never cool off a credential, and never reach the lead 2026-09-03 06:58:16 +02:00

Closed #201 Backend-error classification needs a real mechanism, not hard-coded strings (#164 points 3 and 4) 2026-09-03 06:58:04 +02:00

Closed #241 Completion fallback can hand the lead back its own brief as the member's "report" 2026-09-03 06:57:19 +02:00

Closed #134 CB-628: a tracked file neutralized by the worktree overlay can never be edited by a worker, and nothing says so 2026-09-03 06:32:34 +02:00

Closed #232 autoCompactWindow is set by flag and never read back — the #175 shape in a second place 2026-09-03 04:10:23 +02:00

Closed #175 fleetd asks opencode for a model and never checks it got that model, so a withdrawn name silently bills a paid credential 2026-09-02 13:06:09 +02:00

Closed #226 A member that loses the architect slot race still runs on the architect charter while the gate treats it as a worker 2026-09-02 03:05:10 +02:00

Closed #222 ClaudeCodeLauncher writes the member's charter file into fleetd's own java.io.tmpdir — the #219 site-1 shape, third instance 2026-09-02 03:04:46 +02:00

Closed #224 worktreeRoot itself is never made group-traversable, so a restrictive umask breaks every member under memberHerdrSocket 2026-09-02 03:04:25 +02:00

Closed #225 Two memberHerdrSocket tests pass or fail depending on where the repo is checked out 2026-09-02 03:04:04 +02:00

Closed #123 CB-619: a spawn asking for a role its profile has no slot for is silently demoted to worker, and the roster still says otherwise 2026-09-01 10:42:42 +02:00

Closed #219 OpenCodeLauncher decides a member's config and discovery roots from fleetd's own filesystem — the #213 defect, twice 2026-09-01 10:34:04 +02:00

Closed #140 CB-630: every subscription claude-code profile fails to spawn — the pane exits and the error names a symptom 2026-09-01 09:18:46 +02:00

Closed #213 #185: the ZDOTDIR scrub decides on fleetd's own shell and writes to fleetd's own TMPDIR, so under memberHerdrSocket it silently protects nothing 2026-09-01 09:13:19 +02:00

Closed #211 A backend-exhausted pane with no ⏺ marker is classified as an empty scrape, so the credential is never quarantined 2026-09-01 09:13:03 +02:00

Closed #214 A plain claude-code spawn mints no session id, so the most common member on the fleet can never be resumed 2026-09-01 09:12:48 +02:00

Closed #220 Launch command is typed into the pane and silently cut at 1024 bytes 2026-09-01 09:12:28 +02:00

Closed #209 agentSessionId is resolved once at spawn and frozen, so an opencode member never reports one 2026-08-31 18:29:04 +02:00

Closed #199 GET /members returns its rows under a "workers" key, so a caller reading "members" sees an empty fleet 2026-08-31 17:20:24 +02:00

Closed #206 opencode session discovery never finds a member's record, so agentSessionId is always null and resume silently does nothing 2026-08-31 16:59:36 +02:00

Closed #137 CB-629: after a bridge_ask round-trip, the worker's final reply orphans its ticket, which then reports a false failure 2026-08-31 09:27:34 +02:00

Closed #172 LAVINMQ_URI reaches every member pane with the broker password inline — on neither credential list, and not credential-shaped 2026-08-31 09:27:33 +02:00

Closed #161 a pane member's grandchild process may be resolved as primary — possible worker→primary escalation 2026-08-31 09:27:32 +02:00

Closed #126 CB-622: rename the MCP tool namespace bridge_* -> fleet_*, with one dual-name release 2026-08-31 09:00:14 +02:00

Closed #164 a member whose backend 400s dies in one second, and fleetd returns the lost turn as a successful empty reply 2026-08-31 05:57:32 +02:00

Closed #168 CB-638: the wiki describes a system that no longer exists — audit index of pages to revise, build and retire 2026-08-31 05:50:02 +02:00

Closed #197 Async ticket TTL runs from creation, so a long task's report is destroyed on arrival 2026-08-31 05:10:46 +02:00

Closed #192 CB-633 follow-up: the credential-gap WARN claims names are inherited unblocked when the scrub does blank them, and one guard can hide the real report 2026-08-31 04:34:01 +02:00

Closed #189 CB-157 follow-up: the remote-URL credential checks only see origin, only https, and never a push URL 2026-08-31 04:32:15 +02:00

Closed #157 the forge token is written into git remote URLs, which defeats the member credential scrub 2026-08-28 01:10:38 +02:00

Closed #154 AmqpReplyInbox pulls a whole queue into memory on ownership, so x-max-length and per-message TTL never fire 2026-08-28 01:06:44 +02:00

Closed #150 status endpoint reports ready:false for every lead, always 2026-08-28 00:59:44 +02:00

Closed #158 tokenEnv defaults to BRIDGED_WORKER_TOKEN for every profile, so opencode profiles warn about a secret they never need 2026-08-23 14:19:56 +02:00

Closed #152 an unreachable broker at startup stops the daemon from booting at all 2026-08-23 14:04:16 +02:00

Closed #151 broker: take the AMQP URI from an env var (uriEnv), not clear text in fleetd.yaml 2026-08-23 14:04:15 +02:00

Closed #127 CB-623: create the fleet org, transfer the repo, rename it to fleetd 2026-08-23 05:43:13 +02:00

Closed #119 CB-616: a configured role charter makes every claude-code member unspawnable — the charter travels through argv 2026-08-22 12:36:05 +02:00

Closed #112 CB-610: subscription: is the knob that spends the operator's Claude plan, and bridged.example.yaml never mentions it 2026-08-17 16:08:39 +02:00

Closed #82 CB-596: CB-592 blocks one credential name out of about thirty that a member's login shell re-sources 2026-08-17 13:46:28 +02:00

Closed #67 CB-586: nothing ever prunes refs/wip/*, so CB-578 stage C's snapshots pin objects forever 2026-08-16 20:13:44 +02:00

Closed #106 CB-606: auth.mode and two placement fields are accepted unvalidated — a typo in auth.mode silently disables authentication 2026-08-16 18:58:52 +02:00

Closed #61 CB-582: bridge_ask is unusable against an async lead — a 55s window vs a lead that polls every few minutes 2026-08-16 18:47:20 +02:00

Closed #102 CB-604: an unknown kind: is silently accepted and routed to the wrong adapter 2026-08-16 18:39:53 +02:00

Closed #81 CB-595: the Features catalogue is ~14 entries behind, so shipped capabilities are invisible to an operator 2026-08-16 18:33:15 +02:00

Closed #65 CB-584: session resume is built end-to-end but connected at neither end — persist agentSessionId and expose it on bridge_spawn 2026-08-16 18:30:13 +02:00

Closed #79 CB-593: finish CB-592's two documentation criteria — inherited tokens decision, and the "only the bridge MCP" claim 2026-08-16 18:22:30 +02:00

Closed #91 CB-600: blockers before the launchd agent is ever installed — the redeploy script can report "ok" while the daemon crash-loops 2026-08-16 18:17:13 +02:00

Closed #96 CB-602: nothing detects a new config key that never reaches bridged.example.yaml 2026-08-16 18:17:13 +02:00

Closed #100 CB-603: FakeHerdr.calls was a plain ArrayList written from scheduler threads — intermittent ConcurrentModificationException 2026-08-16 18:14:22 +02:00

Closed #87 CB-598: work that arrives during a backoff is treated as stale backlog, so at-cap work is abandoned without ever being nudged once 2026-08-16 18:13:30 +02:00

Closed #95 CB-601: AmqpReplyInboxRecoveryRaceTest is non-deterministic — it fails on main under load, and the production code is correct 2026-08-16 18:08:24 +02:00

Closed #85 CB-597: bridged.example.yaml documents a schema five sections out of date, including the one that makes replies durable 2026-08-16 17:59:58 +02:00

Closed #89 CB-599: hitting the fleet capacity cap returns an opaque 500 "Server Error" — the reason exists only in the daemon log 2026-08-16 17:55:05 +02:00

Closed #80 CB-594: the launchd unit cannot carry the secrets the fleet needs, so supervision and a working fleet are mutually exclusive today 2026-08-16 17:32:57 +02:00

Closed #75 CB-590: the two ReplyPushLoop schedules do not gate each other, so one lead pane can get two injections 2026-08-16 17:31:44 +02:00

Closed #11 CB-528: enforce publish — publisher confirms + mandatory flag on a separate channel 2026-08-16 17:31:24 +02:00

Closed #10 CB-527: basicQos prefetch on the AMQP consumer — the queue drains into gateway heap 2026-08-16 17:30:33 +02:00

Closed #13 CB-530: multi-leader registry — recognise N leads, not one pinned primary 2026-08-16 16:49:18 +02:00

Closed #76 CB-591: point member profiles at the new LLM/MCP gateway (claude-code and opencode) 2026-08-15 20:49:05 +02:00

Closed #77 CB-592: every member inherits herdr's whole environment, so workers carry the admin GITEA_ACCESS_TOKEN 2026-08-15 18:49:05 +02:00

Closed #72 CB-588: the CB-307 push loop never fires for an async ticket — the exact mode the charter tells leads to use 2026-08-15 17:07:59 +02:00

Closed #66 CB-585: maxLoad: 0 silently means unlimited — the same trap CB-554 just fixed for weight 2026-08-15 16:01:51 +02:00

Closed #68 CB-587: the CB-578 stage C snapshot loses --skip-worktree flags, so it commits never-commit files and misreports what the worker changed 2026-08-15 16:01:50 +02:00

Closed #12 CB-529: drainReplies javadoc claims "the ack is local" — false for the AMQP adapter 2026-08-15 15:35:02 +02:00

Closed #28 CB-554: weight: 0 does not exclude a profile from placement — it means 1.0, so architect profiles outweigh workers 2026-08-15 13:10:15 +02:00

Closed #50 CB-578: a member killed by a provider usage limit is reported as a normal reply, and its work is lost 2026-08-15 13:10:13 +02:00

Closed #57 CB-581: a throw inside release() orphans the pane and aborts the reaping pass 2026-08-15 10:15:51 +02:00

Closed #51 CB-579: resolve a lead by its tab name, and delete the terminal-id pin 2026-08-15 09:29:01 +02:00

Closed #52 CB-580: fail a ticket when its member reaches a terminal health state (re-brief of the rejected 3b2f395) 2026-08-15 08:57:03 +02:00

Closed #25 CB-553: maxLoad is not enforced on explicit-profile spawns (the cap is effectively dead config) 2026-08-15 07:13:23 +02:00

Closed #7 CB-402: second peer adapter — opencode (Stage B of the Peer Launcher SPI) 2026-07-29 17:48:52 +02:00

Closed #5 CB-307: reliable worker→primary delivery — push worker messages to main with ACK + reminder (at-least-once) 2026-07-19 17:54:04 +02:00

Closed #4 CB-306: spawn-readiness gate — don't hand a session to bridge_send until the peer's bridge MCP has handshaked 2026-07-18 16:31:27 +02:00

Closed #3 CB-401: Peer Launcher SPI — pluggable peers (Stage 4) 2026-07-18 07:56:53 +02:00

Closed #2 CB-118: completion misattribution guard defeated for assistant blocks over the scrape cap 2026-07-16 09:11:30 +02:00

Closed #1 CB-117: reap orphaned worker panes via startup reconciliation 2026-07-16 08:40:05 +02:00

308 Issues created by 2 users

Opened #1 CB-117: reap orphaned worker panes via startup reconciliation 2026-07-16 08:32:20 +02:00

Opened #2 CB-118: completion misattribution guard defeated for assistant blocks over the scrape cap 2026-07-16 09:11:03 +02:00

Opened #3 CB-401: Peer Launcher SPI — pluggable peers (Stage 4) 2026-07-17 17:49:40 +02:00

Opened #4 CB-306: spawn-readiness gate — don't hand a session to bridge_send until the peer's bridge MCP has handshaked 2026-07-18 15:00:59 +02:00

Opened #5 CB-307: reliable worker→primary delivery — push worker messages to main with ACK + reminder (at-least-once) 2026-07-18 15:01:21 +02:00

Opened #6 CB-308: multi-host federation — per-host gateway + per-agent broker channels + federated roster (Stage 5) 2026-07-18 20:20:46 +02:00

Opened #7 CB-402: second peer adapter — opencode (Stage B of the Peer Launcher SPI) 2026-07-21 04:59:07 +02:00

Opened #10 CB-527: basicQos prefetch on the AMQP consumer — the queue drains into gateway heap 2026-08-10 17:35:07 +02:00

Opened #11 CB-528: enforce publish — publisher confirms + mandatory flag on a separate channel 2026-08-10 17:35:24 +02:00

Opened #12 CB-529: drainReplies javadoc claims "the ack is local" — false for the AMQP adapter 2026-08-10 17:35:39 +02:00

Opened #13 CB-530: multi-leader registry — recognise N leads, not one pinned primary 2026-08-12 22:48:55 +02:00

Opened #16 CB-548: architect slots — fresh clean-room advisory peers 2026-08-13 16:28:39 +02:00

Opened #25 CB-553: maxLoad is not enforced on explicit-profile spawns (the cap is effectively dead config) 2026-08-13 20:58:39 +02:00

Opened #28 CB-554: weight: 0 does not exclude a profile from placement — it means 1.0, so architect profiles outweigh workers 2026-08-13 21:18:15 +02:00

Opened #50 CB-578: a member killed by a provider usage limit is reported as a normal reply, and its work is lost 2026-08-15 06:59:06 +02:00

Opened #51 CB-579: resolve a lead by its tab name, and delete the terminal-id pin 2026-08-15 07:03:33 +02:00

Opened #52 CB-580: fail a ticket when its member reaches a terminal health state (re-brief of the rejected 3b2f395) 2026-08-15 07:09:42 +02:00

Opened #57 CB-581: a throw inside release() orphans the pane and aborts the reaping pass 2026-08-15 08:55:20 +02:00

Opened #61 CB-582: bridge_ask is unusable against an async lead — a 55s window vs a lead that polls every few minutes 2026-08-15 10:35:33 +02:00

Opened #65 CB-584: session resume is built end-to-end but connected at neither end — persist agentSessionId and expose it on bridge_spawn 2026-08-15 13:03:50 +02:00

Opened #66 CB-585: maxLoad: 0 silently means unlimited — the same trap CB-554 just fixed for weight 2026-08-15 13:10:48 +02:00

Opened #67 CB-586: nothing ever prunes refs/wip/*, so CB-578 stage C's snapshots pin objects forever 2026-08-15 13:11:07 +02:00

Opened #68 CB-587: the CB-578 stage C snapshot loses --skip-worktree flags, so it commits never-commit files and misreports what the worker changed 2026-08-15 15:21:57 +02:00

Opened #72 CB-588: the CB-307 push loop never fires for an async ticket — the exact mode the charter tells leads to use 2026-08-15 15:59:52 +02:00

Opened #74 CB-589: cost-first placement + a gateway that reports live capacity 2026-08-15 16:28:49 +02:00

Opened #75 CB-590: the two ReplyPushLoop schedules do not gate each other, so one lead pane can get two injections 2026-08-15 16:45:29 +02:00

Opened #76 CB-591: point member profiles at the new LLM/MCP gateway (claude-code and opencode) 2026-08-15 17:00:38 +02:00

Opened #77 CB-592: every member inherits herdr's whole environment, so workers carry the admin GITEA_ACCESS_TOKEN 2026-08-15 18:20:34 +02:00

Opened #79 CB-593: finish CB-592's two documentation criteria — inherited tokens decision, and the "only the bridge MCP" claim 2026-08-15 18:49:32 +02:00

Opened #80 CB-594: the launchd unit cannot carry the secrets the fleet needs, so supervision and a working fleet are mutually exclusive today 2026-08-16 16:48:10 +02:00

Opened #81 CB-595: the Features catalogue is ~14 entries behind, so shipped capabilities are invisible to an operator 2026-08-16 16:51:04 +02:00

Opened #82 CB-596: CB-592 blocks one credential name out of about thirty that a member's login shell re-sources 2026-08-16 16:54:38 +02:00

Opened #85 CB-597: bridged.example.yaml documents a schema five sections out of date, including the one that makes replies durable 2026-08-16 17:04:02 +02:00

Opened #87 CB-598: work that arrives during a backoff is treated as stale backlog, so at-cap work is abandoned without ever being nudged once 2026-08-16 17:18:51 +02:00

Opened #89 CB-599: hitting the fleet capacity cap returns an opaque 500 "Server Error" — the reason exists only in the daemon log 2026-08-16 17:25:27 +02:00

Opened #91 CB-600: blockers before the launchd agent is ever installed — the redeploy script can report "ok" while the daemon crash-loops 2026-08-16 17:33:27 +02:00

Opened #95 CB-601: AmqpReplyInboxRecoveryRaceTest is non-deterministic — it fails on main under load, and the production code is correct 2026-08-16 17:52:10 +02:00

Opened #96 CB-602: nothing detects a new config key that never reaches bridged.example.yaml 2026-08-16 18:00:46 +02:00

Opened #100 CB-603: FakeHerdr.calls was a plain ArrayList written from scheduler threads — intermittent ConcurrentModificationException 2026-08-16 18:14:17 +02:00

Opened #102 CB-604: an unknown kind: is silently accepted and routed to the wrong adapter 2026-08-16 18:32:30 +02:00

Opened #103 CB-605: the systemd unit has launchd's login-shell secret gap, and does not mention the two tokens it drops 2026-08-16 18:32:52 +02:00

Opened #106 CB-606: auth.mode and two placement fields are accepted unvalidated — a typo in auth.mode silently disables authentication 2026-08-16 18:40:17 +02:00

Opened #110 CB-607: a member holds the operator's ssh-agent socket, which outranks the repo-scoped token CB-302 built 2026-08-17 13:28:28 +02:00

Opened #111 CB-608: the credential probe hardcodes its own name list, so it silently under-reports the policy 2026-08-17 13:45:59 +02:00

Opened #112 CB-610: subscription: is the knob that spends the operator's Claude plan, and bridged.example.yaml never mentions it 2026-08-17 14:24:16 +02:00

Opened #113 CB-611: our checkers keep covering less than they look like they cover — three instances in one day 2026-08-17 14:24:44 +02:00

Opened #114 CB-609: docs/MCP-Contract.md is a pre-build design doc that CLAUDE.md still points every session at 2026-08-17 14:25:09 +02:00

Opened #115 CB-612: the daemon warns at every boot about a token no profile needs, teaching operators to skim startup warnings 2026-08-17 14:25:35 +02:00

Opened #116 CB-613: one worker branch holds a teardown test that never reached main, and 55 stale branches hide it 2026-08-17 14:25:58 +02:00

Opened #117 CB-614: the fleet cannot share the IDE MCP — and the lead's own IDE step is currently a no-op 2026-08-17 16:31:59 +02:00

Opened #118 CB-615: there is no way to SEE the fleet — a monitoring dashboard for bridged 2026-08-22 08:52:49 +02:00

Opened #119 CB-616: a configured role charter makes every claude-code member unspawnable — the charter travels through argv 2026-08-22 08:59:08 +02:00

Opened #120 CB-617: deliver a member's role contract as an agent definition file, not as argv — and keep the model in config 2026-08-22 11:55:49 +02:00

Opened #123 CB-619: a spawn asking for a role its profile has no slot for is silently demoted to worker, and the roster still says otherwise 2026-08-22 12:36:32 +02:00

Opened #124 CB-620: give a member indexed code and query tools — a language server per worktree behind an MCP bridge, not an IDE 2026-08-22 14:03:55 +02:00

Opened #125 CB-621 (epic): rename the product to "fleet" and move it to its own Gitea org 2026-08-22 21:34:02 +02:00

Opened #126 CB-622: rename the MCP tool namespace bridge_* -> fleet_*, with one dual-name release 2026-08-22 21:34:29 +02:00

Opened #127 CB-623: create the fleet org, transfer the repo, rename it to fleetd 2026-08-22 21:34:43 +02:00

Opened #128 CB-624: rename the local checkout to fleetd, and carry Claude Code's session and memory state with it 2026-08-22 21:35:13 +02:00

Opened #129 CB-625: extract fleet-agent-kit — write the role bodies once, generate for both backends 2026-08-22 21:35:27 +02:00

Opened #130 CB-626: rename the config key fleet: -> roles:, with a read-both shim 2026-08-22 21:35:43 +02:00

Opened #131 CB-627: enforce package boundaries with an ArchUnit test instead of splitting into Maven modules 2026-08-22 21:35:57 +02:00

Opened #134 CB-628: a tracked file neutralized by the worktree overlay can never be edited by a worker, and nothing says so 2026-08-22 21:53:38 +02:00

Opened #137 CB-629: after a bridge_ask round-trip, the worker's final reply orphans its ticket, which then reports a false failure 2026-08-22 22:01:59 +02:00

Opened #140 CB-630: every subscription claude-code profile fails to spawn — the pane exits and the error names a symptom 2026-08-23 05:48:09 +02:00

Opened #141 CB-631: four credential env vars reach every member pane unblocked — the CB-596 policy has drifted 2026-08-23 05:48:34 +02:00

Opened #144 CB-633: constrain a member's environment with an allow-list — the denylist misses a whole secret file 2026-08-23 06:20:51 +02:00

Opened #145 CB-632: purge "bridge" from the code, the artefacts and the ops surface 2026-08-23 06:21:21 +02:00

Opened #148 CB-634: the parity overlay copies .env/.envrc into worker worktrees — the same shape as CB-633 2026-08-23 07:53:56 +02:00

Opened #149 A claude-code member spawned into a fresh worktree blocks forever on the workspace trust dialog 2026-08-23 09:04:14 +02:00

Opened #150 status endpoint reports ready:false for every lead, always 2026-08-23 12:50:24 +02:00

Opened #151 broker: take the AMQP URI from an env var (uriEnv), not clear text in fleetd.yaml 2026-08-23 13:16:18 +02:00

Opened #152 an unreachable broker at startup stops the daemon from booting at all 2026-08-23 13:37:02 +02:00

Opened #154 AmqpReplyInbox pulls a whole queue into memory on ownership, so x-max-length and per-message TTL never fire 2026-08-23 14:05:10 +02:00

Opened #155 the member credential scrub is zsh-only: a member on any other login shell gets every credential 2026-08-23 14:05:28 +02:00

Opened #156 fleet01 as-built: the full second-host setup, and the gaps a fleet manager would have to own 2026-08-23 14:15:46 +02:00

Opened #157 the forge token is written into git remote URLs, which defeats the member credential scrub 2026-08-23 14:16:12 +02:00

Opened #158 tokenEnv defaults to BRIDGED_WORKER_TOKEN for every profile, so opencode profiles warn about a secret they never need 2026-08-23 14:16:26 +02:00

Opened #159 rotate AI_GATEWAY_TOKEN and WORKER_GITEA_TOKEN — both were printed into an operator transcript 2026-08-23 14:24:05 +02:00

Opened #160 fleet manager: run and drive several fleets on ONE host from a single session 2026-08-23 14:26:11 +02:00

Opened #161 a pane member's grandchild process may be resolved as primary — possible worker→primary escalation 2026-08-23 14:47:20 +02:00

Opened #162 CB-634: let a member use the IDE MCP against its own worktree — opt-in per profile 2026-08-23 15:46:19 +02:00

Opened #164 a member whose backend 400s dies in one second, and fleetd returns the lost turn as a successful empty reply 2026-08-24 16:39:22 +02:00

Opened #168 CB-638: the wiki describes a system that no longer exists — audit index of pages to revise, build and retire 2026-08-24 18:44:37 +02:00

Opened #172 LAVINMQ_URI reaches every member pane with the broker password inline — on neither credential list, and not credential-shaped 2026-08-28 00:23:01 +02:00

Opened #175 fleetd asks opencode for a model and never checks it got that model, so a withdrawn name silently bills a paid credential 2026-08-28 00:52:11 +02:00

Opened #176 capacity counts panes, not subscription seats, so a subscription profile reports a free slot that cannot be filled 2026-08-28 00:52:34 +02:00

Opened #182 ROTATE: a git.ltms.dev token for user ltms was exposed in an agent session, and any credential-resolving command on the Mac will do it again 2026-08-28 01:04:25 +02:00

Opened #184 blocking SSH_AUTH_SOCK is not a control: the forge key is an unencrypted file the member can read 2026-08-28 01:31:50 +02:00

Opened #185 Run members on a second herdr under a dedicated user (optional; single-herdr stays the default) 2026-08-28 04:05:56 +02:00

Opened #189 CB-157 follow-up: the remote-URL credential checks only see origin, only https, and never a push URL 2026-08-31 03:39:04 +02:00

Opened #190 Process argv is a credential channel we never enumerated: 4 secrets are readable by any local user via ps 2026-08-31 03:41:01 +02:00

Opened #192 CB-633 follow-up: the credential-gap WARN claims names are inherited unblocked when the scrub does blank them, and one guard can hide the real report 2026-08-31 03:47:56 +02:00

Opened #197 Async ticket TTL runs from creation, so a long task's report is destroyed on arrival 2026-08-31 04:25:47 +02:00

Opened #199 GET /members returns its rows under a "workers" key, so a caller reading "members" sees an empty fleet 2026-08-31 05:50:23 +02:00

Opened #201 Backend-error classification needs a real mechanism, not hard-coded strings (#164 points 3 and 4) 2026-08-31 05:57:59 +02:00

Opened #206 opencode session discovery never finds a member's record, so agentSessionId is always null and resume silently does nothing 2026-08-31 09:26:10 +02:00

Opened #209 agentSessionId is resolved once at spawn and frozen, so an opencode member never reports one 2026-08-31 16:57:12 +02:00

Opened #211 A backend-exhausted pane with no ⏺ marker is classified as an empty scrape, so the credential is never quarantined 2026-08-31 17:08:58 +02:00

Opened #213 #185: the ZDOTDIR scrub decides on fleetd's own shell and writes to fleetd's own TMPDIR, so under memberHerdrSocket it silently protects nothing 2026-08-31 17:19:02 +02:00

Opened #214 A plain claude-code spawn mints no session id, so the most common member on the fleet can never be resumed 2026-08-31 17:40:20 +02:00

Opened #219 OpenCodeLauncher decides a member's config and discovery roots from fleetd's own filesystem — the #213 defect, twice 2026-09-01 08:27:55 +02:00

Opened #220 Launch command is typed into the pane and silently cut at 1024 bytes 2026-09-01 09:12:17 +02:00

Opened #222 ClaudeCodeLauncher writes the member's charter file into fleetd's own java.io.tmpdir — the #219 site-1 shape, third instance 2026-09-01 10:25:49 +02:00

Opened #224 worktreeRoot itself is never made group-traversable, so a restrictive umask breaks every member under memberHerdrSocket 2026-09-01 10:33:33 +02:00

Opened #225 Two memberHerdrSocket tests pass or fail depending on where the repo is checked out 2026-09-01 10:41:19 +02:00

Opened #226 A member that loses the architect slot race still runs on the architect charter while the gate treats it as a worker 2026-09-01 10:42:14 +02:00

Opened #227 A backend outage is invisible at fleet level: repeated backend errors are never correlated, never cool off a credential, and never reach the lead 2026-09-01 11:10:25 +02:00

Opened #232 autoCompactWindow is set by flag and never read back — the #175 shape in a second place 2026-09-02 13:00:53 +02:00

Opened #234 #175's model read-back fires a FALSE POSITIVE on any member spawned without a worktree — and the quarantine it announces never happens 2026-09-03 04:26:09 +02:00

Opened #241 Completion fallback can hand the lead back its own brief as the member's "report" 2026-09-03 05:42:40 +02:00

Opened #247 Seeding ~/.claude.json can still lose an external writer's change 2026-09-03 06:47:57 +02:00

Opened #248 Fleetd's composition root is untested: a feature can be silently unwired and every test stays green 2026-09-03 06:55:33 +02:00

Opened #249 fleet_list can report another session's agentSessionId, and fleet_spawn{resumeSessionId} will resume it 2026-09-03 06:59:22 +02:00

Opened #252 The REST surface is a supported operator fallback and is documented nowhere — 14 routes, 0 entries 2026-09-03 07:50:04 +02:00

Opened #257 fleet_list's free and the spawn gate now disagree by one on subscription profiles 2026-09-03 08:26:14 +02:00

Opened #258 Two test fixtures write to the operator's real ~/.claude.json on every run (116 dead entries accumulated) 2026-09-03 09:01:28 +02:00

Opened #266 memberCredentials.sshAuthSock: rename the values block/allow to omit/inherit — "block" names something fleetd does not do 2026-09-03 15:05:20 +02:00

Opened #267 The #175 model-mismatch check never runs for opencode spawns without a provisioned worktree — the majority of them 2026-09-03 15:10:34 +02:00

Opened #272 fleet_poll{target} drains another session's inbox behind a READ gate — authorization fails open 2026-09-04 04:52:41 +02:00

Opened #273 A malformed exhaustedPattern crashes startup unnamed — only errorPattern is validated at load 2026-09-04 04:55:51 +02:00

Opened #274 GitWorktrees.add() leaks the worktree and branch when a step after git worktree add throws 2026-09-04 04:56:02 +02:00

Opened #275 Investigate: abandon() skips a task in ASKING, so a torn-down member mid-fleet_ask may strand its ticket forever 2026-09-04 04:56:24 +02:00

Opened #276 #269 follow-up: the "allowed N of M" INFO line still claims to describe the member's pane 2026-09-04 05:00:37 +02:00

Opened #280 Follow-up to #275: a health-detected GONE member whose ask lapses may still strand its ticket 2026-09-04 05:19:53 +02:00

Opened #281 Pin the Authz.Action every handler chooses, so the next #272 fails a test instead of shipping 2026-09-04 05:34:46 +02:00

Opened #282 A second fleet_ask in the same resumed turn kills its own async ticket: answer() completes it with QUESTION 2026-09-04 05:38:40 +02:00

Opened #283 Two teardown leaks in SessionManager: an unguarded worktree removal, and a branch the spawn-failure catch forgets 2026-09-04 05:39:00 +02:00

Opened #284 A BACKEND_ERROR member holds its seat forever: counted as live, never reaped, never reclaimable 2026-09-04 05:39:29 +02:00

Opened #285 seedTrustDialog writes the trust seed to fleetd's own home when memberHerdrSocket is set, so the member never sees it 2026-09-04 05:39:50 +02:00

Opened #290 Restore a test for reapIdle's per-session guard, which #283 left uncovered 2026-09-04 05:55:08 +02:00

Opened #293 A failing tab.close during teardown leaks both the ZDOTDIR and the worktree 2026-09-04 06:27:28 +02:00

Opened #296 Two spawn-side exits leak a live pane, and the caller cannot clean up because it never learns the pane id 2026-09-04 07:00:14 +02:00

Opened #297 REST is the weaker door, and it is the door a lead falls back to when MCP drops 2026-09-04 07:02:57 +02:00

Opened #298 AmqpReplyInbox.release() drops an unacked reply that the broker still holds — a worker's report is lost silently 2026-09-04 07:05:57 +02:00

Opened #302 A REST reply with no content field silently becomes an empty reply, and the lead cannot tell it from a member that said nothing 2026-09-04 07:24:35 +02:00

Opened #304 POST /members and DELETE /members/{paneId} turn a herdr failure into a bare 500, and a stop that already succeeded can never report success 2026-09-04 07:43:27 +02:00

Opened #305 A worker connecting from 127.0.0.2 is resolved as the primary, and gains spawn/stop/send/drain 2026-09-04 07:58:08 +02:00

Opened #306 A worker that wedges in unknown during post-turn housekeeping is polled forever and can never be delivered to again 2026-09-04 08:06:16 +02:00

Opened #307 A worker's report is stranded when its fleet_ask timed out, and the lead is told the worker never replied 2026-09-04 08:08:37 +02:00

Opened #308 A worker spawned during the shutdown drain is never drained: its pane is left running and its worktree is never preserved 2026-09-04 08:11:12 +02:00

Opened #309 A timed-out git worktree add leaks the worktree it half-created: #274's cleanup does not cover the add itself 2026-09-04 08:11:44 +02:00

Opened #310 reapIdle can release a session that just became BUSY, contradicting its own documented invariant 2026-09-04 08:12:15 +02:00

Opened #315 The fixed placement policy ignores the retry loop's unreachable set, so an unqualified spawn retries the same dead profile and never tries the healthy one 2026-09-04 08:44:05 +02:00

Opened #316 The dirty-worktree check runs before the worker is stopped, so work written during teardown is deleted with no preserve and no snapshot 2026-09-04 08:48:06 +02:00

Opened #317 A failed peer-PID lookup promotes a worker to primary: the escalation PaneLocator's own javadoc names, through a trigger CB-161 did not close 2026-09-04 08:51:25 +02:00

Opened #318 A reply delivered while release() is running is stranded unacked forever: #298 closed "already held", not "arrives during release" 2026-09-04 08:53:28 +02:00

Opened #323 The reload classifier says "compares every component the launcher reads at spawn" and misses four keys, so those reloads report success and do nothing 2026-09-04 09:15:04 +02:00

Opened #324 answer() mutates a Task under sessionLocks while ask()'s timeout path mutates the same Task under no lock — finishAsyncTask can throw NPE on a null turnId 2026-09-04 09:26:17 +02:00

Opened #326 The top-level deferred-key list has the same drift as #323, and two keys are read both from the startup snapshot and live — no single classification is right for them 2026-09-04 09:33:58 +02:00

Opened #329 sendAsync's executor catch swallows every exception thrown after the future completes, and that is why a stranded async ticket is invisible 2026-09-04 10:00:04 +02:00

Opened #330 health: and coordinator: are split keys — add a fourth reload class that says so, then make the top-level list prove its own coverage 2026-09-04 10:02:12 +02:00

Opened #333 fleet: is a third split key, sitting in the coverage checker's own escape hatch — and SPLIT_KEYS membership does not prove any reporting code exists 2026-09-04 10:23:45 +02:00

Opened #334 MessageService: an async ticket is still stranded between clearAsyncQuestion and closeAsk 2026-09-04 10:33:46 +02:00

Opened #335 MessageService: three more places a thrown exception has nowhere to go 2026-09-04 10:35:17 +02:00

Opened #337 The deferred key set still has no reporting coverage — measured, a dropped comparison is invisible 2026-09-04 10:44:09 +02:00

Opened #338 A TIMED_OUT_QUEUED send leaves its message in the injector queue, and it is delivered later as a stale brief 2026-09-04 10:47:42 +02:00

Opened #339 A member's normal report that quotes "API Error:" is recorded as a real backend outage 2026-09-04 10:48:09 +02:00

Opened #340 classify() can call an active pane IDLE — measured real, trigger never seen (half A closed) 2026-09-04 10:48:45 +02:00

Opened #341 One flag guards two different memberCredentials WARNs, so a later leaking credential name is never reported 2026-09-04 10:51:10 +02:00

Opened #342 CompositePeerLauncher's single-daemon stop() shortcut can skip tab teardown, orphaning a worker tab 2026-09-04 10:51:36 +02:00

Opened #345 MessageService's use of Cancellation.DELIVERED is unpinned — the seam is tested, the caller is not 2026-09-04 11:01:04 +02:00

Opened #348 The same text-match-drives-a-cooldown shape exists for ExhaustionSink, where the penalty is 30x longer 2026-09-04 11:13:50 +02:00

Opened #352 CompositePeerLauncher.clearContext silently stops working for every peer that survives a restart 2026-09-04 11:41:35 +02:00

Opened #358 Two more records can silently drop a field the way FleetConfig could (MemberSession, FleetConfig.Profile) 2026-09-05 00:58:07 +02:00

Opened #359 Dead lead tabs accumulate and make lead-to-lead coordination permanently undeliverable 2026-09-05 02:40:58 +02:00

Opened #360 deploy/fleetd.service silently disables caller identity and the credential scrub 2026-09-05 02:50:14 +02:00

Opened #361 Lead-to-lead coordination has a send half with tools and a receive half without 2026-09-05 07:17:27 +02:00

Opened #362 The plugin shipped in CB-527 is invisible and has drifted — and it cannot deliver worker skills 2026-09-05 07:37:06 +02:00

Opened #365 Three more tool results claim "delivered" for something weaker than delivery 2026-09-05 07:49:59 +02:00

Opened #368 A lead's delegation binding outlives the lead, so reply nudges keep going to a dead terminal 2026-09-05 08:27:05 +02:00

Opened #369 GitWorktreesTest reads the machine's real git config, so it can pass or fail for reasons outside the repo 2026-09-05 08:34:33 +02:00

Opened #373 The hermetic env on production GitWorktrees instances is unpinned — stripping it stays green, poisoned or not 2026-09-06 15:32:56 +02:00

Opened #375 The idle-sleep guard is a no-op on Linux, so fleet01 still sleeps under a live member 2026-09-08 11:57:05 +02:00

Opened #376 A fast model trips the 2000ms crash floor: a real answer is reported as a failed turn 2026-09-08 23:06:12 +02:00

Opened #377 GITEA_HOST carries a scheme and a trailing slash, and every member builds URLs from it 2026-09-08 23:10:21 +02:00

Opened #381 Members cannot run shell commands: the classifier refuses every one, so they cannot build, test or open a PR (3 members, 2 profiles) 2026-09-09 02:29:11 +02:00

Opened #382 SpawnRequest has the arity trap's two halves, but not yet a colliding arity — CompositePeerLauncher:372 will drop the next component added 2026-09-09 02:42:01 +02:00

Opened #383 FleetHealthMonitor detects TURN_BOUNDARY_LOST but no API surface exposes it — a stalled member reads as healthy on every field a lead can see 2026-09-09 09:02:01 +02:00

Opened #384 "left no scrub report" has a third, benign cause it does not name — a group-shared ZDOTDIR cannot receive the receipt 2026-09-09 20:26:40 +02:00

Opened #385 A lead-coordination message can be delivered forever: ack() returns success when connection recovery cleared the held entry 2026-09-09 23:29:35 +02:00

Opened #386 Every fleetd timer freezes while the macOS host sleeps: System.nanoTime() stops, so the stall detector missed a member that was BUSY for 101 minutes 2026-09-10 01:26:13 +02:00

Opened #388 The credential scrub does not run in a shell that is neither login nor interactive — .zshenv is the only file zsh always reads, and it is the one file the scrub is not in 2026-09-10 01:45:28 +02:00

Opened #391 fleet_reply cannot answer a peer lead — the charter documents a path that does not exist 2026-09-10 02:41:27 +02:00

Opened #392 notifications.mode: webhook reports healthCoverage "full" and sends nothing — the knob relabels the absence of a sink 2026-09-10 02:51:38 +02:00

Opened #393 "skill seeding: N of M" is logged as success for opencode members, which never read .claude/skills/ 2026-09-10 02:51:59 +02:00

Opened #394 SECURITY: the credential scrub aborts silently at the first read-only parameter, leaving every later name unscrubbed 2026-09-10 02:57:08 +02:00

Opened #395 A profile with no exhaustedPattern has usage-limit detection silently OFF — 6 of 8 live profiles, including both Claude subscription ones 2026-09-10 03:00:11 +02:00

Opened #399 MessageServiceTest TTL test races the completedNanos stamp — passes on macOS, fails on Linux 2026-09-10 03:15:02 +02:00

Opened #400 SECURITY (receipt): the scrub reports a name as blanked when eval returned 0 without blanking it 2026-09-10 03:33:27 +02:00

Opened #404 exhaustionDetectionArmed reads the LIVE config while detection reads the STARTUP snapshot — after a reload it reports armed when detection is still off 2026-09-10 03:50:18 +02:00

Opened #407 Five log-only startup reporters in Fleetd.main have unpinned call sites — deleting any one ships a green build 2026-09-10 04:01:31 +02:00

Opened #408 Five places trust a command's exit code as proof of its effect and never read the value back — the #400 shape outside the scrub 2026-09-10 04:03:53 +02:00

Opened #409 The #399 completion-stamp race is verifiable deterministically — nowNanos is already injectable 2026-09-10 04:27:34 +02:00

Opened #410 liveStatus reported "working" for a member that did nothing for 76 minutes — the health snapshot has no progress signal 2026-09-10 04:32:22 +02:00

Opened #411 Warn at load when two profiles share a tokenEnv but quarantine under different credential ids 2026-09-10 04:35:16 +02:00

Opened #412 A daemon-side crash in the completion thread is silently misattributed to the worker 2026-09-10 04:38:21 +02:00

Opened #413 Building in the fleetd tree disarms the running daemon, and nothing warns at either end 2026-09-10 04:38:56 +02:00

Opened #415 The startup coverage line reports "off" for errorPattern, but legacy classification is still running 2026-09-10 04:40:02 +02:00

Opened #416 fleet_list advertises free capacity for a profile the spawn gate refuses — CapacitySource reads the live profile keySet 2026-09-10 04:57:47 +02:00

Opened #417 Sweep for the REVERSE config mismatch: a boot snapshot read where the key is hot 2026-09-10 05:00:41 +02:00

Opened #418 Second instance of the #399 shape: a test uses Phase.ASKING as a barrier for push-loop state published later 2026-09-10 05:03:27 +02:00

Opened #421 A lead can neither read nor safely keep its own held peer messages — the only drain is an injectable pane 2026-09-10 06:30:17 +02:00

Opened #422 Model gating units 2+3: enforce the allow-list at spawn, and turn one model off at runtime without editing profiles 2026-09-10 06:39:58 +02:00

Opened #424 Revoking an architect slot does not revoke it: MemberRegistry freezes fleet.architects, and the reload says it applied 2026-09-10 06:45:35 +02:00

Opened #425 fleet_profiles reports a frozen "default" profile while placement already moved to a new one 2026-09-10 06:46:21 +02:00

Opened #426 FleetHealthMonitor.coverage has no test at all, and it feeds fleet_list's healthCoverage field 2026-09-10 06:50:29 +02:00

Opened #427 A config key's hot/deferred class is a claim about every consumer, and nothing checks it that way 2026-09-10 06:54:03 +02:00

Opened #431 MemberRegistry: profileForSlot, nameForSlot and isSlot were made live with no test pinning any of them 2026-09-10 07:56:06 +02:00

Opened #435 maxLoad says it is excluded from "every automatic policy" — fixed, the default, ignores it 2026-09-10 08:26:46 +02:00

Opened #437 fleet_ack says "acknowledged <msgId>" for a held peer message it never touches 2026-09-10 08:53:36 +02:00

Opened #439 fleet_list hands every worker the coordinator row: peer coord-ids and 80-char previews of lead-to-lead bodies 2026-09-10 09:07:48 +02:00

Opened #440 coordinatorView reports heldDurable as a hardcoded true, so it cannot go false when durability breaks 2026-09-10 09:21:36 +02:00

Opened #441 Nothing warns that a profile has no usage-limit detection, so "off when the subscription limit is reached" silently covers only the profiles that opted in 2026-09-10 09:25:12 +02:00

Opened #442 Deleting any of the four startup report calls from Fleetd.main leaves the suite green 2026-09-10 09:29:37 +02:00

Opened #444 PlacementDecision's javadoc claims the place()-to-spawn() window is closed, but no test pins it — and PeerLauncher's default spawn(req, decision) reopens it 2026-09-10 09:35:37 +02:00

Opened #446 The model gate can be turned off at runtime but its usage-limit detector cannot be turned on at runtime 2026-09-10 11:40:19 +02:00

Opened #449 The herdr contract tests were left behind by the protocol-19 port, and nothing runs them 2026-09-10 11:52:38 +02:00

Opened #450 PeerLauncher's default spawn(req, decision) is still the #425 defect, and nothing tests it — make it abstract 2026-09-10 12:02:44 +02:00

Opened #453 PeerLauncher.place(role) and defaultProfileFor(role) are default methods that silently ignore the role 2026-09-10 12:18:15 +02:00

Opened #454 The herdr protocol number has no single home — 21 sites, no constant, and the fake and reality can disagree silently 2026-09-10 12:37:20 +02:00

Opened #455 Invariant 5 ("never drive the multiplexer directly, no socket") is unsatisfiable for a worker assigned to herdr code 2026-09-10 12:38:30 +02:00

Opened #458 Canonical invariant 5 states a mechanism where it means a purpose — restate it (blocked on #455) 2026-09-10 13:02:52 +02:00

Opened #459 Five {@link} targets in main do not exist, and nothing in CI would ever say so 2026-09-10 13:05:41 +02:00

Opened #460 The /mcp transport has no test: 57 endpoint tests all enter through REST, the door no agent uses 2026-09-10 13:08:33 +02:00

Opened #463 listFleet's compat overloads default callerIsPrimary to true, so the coordinator gate fails open 2026-09-10 13:43:12 +02:00

Opened #464 Nothing checks charter text against the tool surface the server registers 2026-09-10 13:43:26 +02:00

Opened #466 Exhaustion quarantine is a flat 30 minutes, so a weekly subscription limit is retried ~336 times 2026-09-10 13:55:17 +02:00

Opened #469 Charter text is still never checked against the live tool surface — one canonical tool-name set (follow-up to #464) 2026-09-10 14:13:11 +02:00

Opened #474 A charter naming an unregistered tool is refused at startup but accepted on reload 2026-09-10 15:11:17 +02:00

Opened #477 MessageServiceTest.anAlreadyCollectedTicketProducesNoNudge races the push loop's 300ms tick — reproduced on both hosts, under load 2026-09-10 15:48:57 +02:00

Opened #478 A directory in parityOverlay is reported as copied and arrives empty — Files.copy does not recurse 2026-09-10 15:52:38 +02:00

Opened #479 Exhaustion detection is armed on 2 of 8 profiles, and the default profile is not one of them 2026-09-10 23:21:03 +02:00

Opened #480 Lead session rollover: the lead asks for a handover, fleetd verifies it, clears the pane and boots the next lead 2026-09-11 01:09:38 +02:00

Opened #482 A context reset changes the peer's session id, and fleetd keeps reporting the dead one — so resumeSessionId would resume the conversation clearAfterTurn just discarded 2026-09-11 01:22:51 +02:00

Opened #486 LeadRollover's settle poll has no bound of its own, so a regression shows up as a CI hang instead of a red test 2026-09-11 02:20:12 +02:00

Opened #488 fleet.leaders.&lt;name&gt;.cwd is never validated — a relative value is silently accepted 2026-09-12 00:50:03 +02:00

Opened #489 #480 lead rollover: /clear and bootstrapText concatenate into one line — the roll never bootstraps 2026-09-12 02:18:36 +02:00

Opened #491 #480 a relative handoverPath lands in the LEAD'S repo, which is usually not the repo that ignores it 2026-09-12 03:45:49 +02:00

Opened #492 redeploy-fleetd.sh is launchd-only: on fleet01 it kills the daemon and leaves TWO running 2026-09-12 03:48:26 +02:00

Opened #493 redeploy-fleetd.sh builds into the LIVE jar path, so the shutdown drain can die on a class it never loaded (#413) 2026-09-12 03:50:54 +02:00

Opened #494 LeadRollover's failure logs print the CONFIGURED budget, not the measured wait — the exact thing that hid #489 2026-09-12 04:00:31 +02:00

Opened #497 A sentinel that conflates &#34;measured: no&#34; with &#34;could not measure&#34; — three instances, three subsystems 2026-09-12 04:12:52 +02:00

Opened #498 awaitHerdr has two return-false paths and the caller reports both as &#34;did not answer within 30s&#34; 2026-09-12 04:21:39 +02:00

Opened #500 probe-member-credentials.sh uses mapfile (bash 4+) with no set -e, so on bash 3.2 it silently reports an empty field list 2026-09-12 04:24:16 +02:00

Opened #501 Injector's readiness-grace warn prints the configured budget as if it were elapsed time — #494's defect, in the delivery loop 2026-09-12 04:44:37 +02:00

Opened #504 redeploy-fleetd.sh: four places where a failed command is reported as a clean result 2026-09-12 05:04:28 +02:00

Opened #505 A herdr error during the pane scan makes a worker's connection resolve as the primary — #317's escalation, through the door #317 did not close 2026-09-12 05:13:45 +02:00

Opened #506 Tests that stay green when the behaviour is absent: four sites, three mechanisms, one cheap discriminator 2026-09-12 05:27:23 +02:00

Opened #507 MessageServiceTest's coalescing tests sleep because the only observation available collects the ticket — the instrument is missing, not the test 2026-09-12 05:27:44 +02:00

Opened #509 #505 follow-up: the two-client completeness fold is unpinned, and legacyPrincipal can still re-open the escalation 2026-09-12 05:36:12 +02:00

Opened #511 #493 follow-up: the drain-gate abort message names a recovery that does not work, and jar_id()'s default is unpinned 2026-09-12 05:48:58 +02:00

Opened #512 redeploy-fleetd.sh says "no ERROR lines since restart" while blind to the exact failure #493 is about 2026-09-12 05:53:26 +02:00

Opened #513 MessageService's TIMED_OUT_QUEUED javadoc says the message is still queued; the code 12 lines of behaviour later cancels it 2026-09-12 05:56:51 +02:00

Opened #517 A source-text test pins what a message SAYS and never whether it is REACHED — the drain-gate abort branch can be disabled with the suite green 2026-09-12 06:01:07 +02:00

Opened #518 Nothing tests that FleetMcp uses the CallerResolver — forcing the legacy identity path leaves the whole suite green at 1696/0 2026-09-12 06:07:00 +02:00

Opened #519 probe-member-credentials.sh has no test harness at all, and its new arity message is off by one on an empty parse 2026-09-12 06:10:37 +02:00

Opened #521 The swap guard can be disabled with the suite green — a "successful" redeploy that never puts the new jar in place 2026-09-12 06:29:41 +02:00

Opened #525 A test pins the shared SessionManager logger to WARN and never restores it, so any later test asserting an INFO line silently sees nothing 2026-09-12 06:35:25 +02:00

Opened #528 "Extract the decision so the suite can call it" pins the decision and never the wiring — drain_gate_refusal's call site can be bypassed with the suite green 2026-09-12 07:01:05 +02:00

Opened #529 Tests pin shared logger levels and never restore them: 9 files, 19 pins, one proven cross-class collision — share SessionManagerTest's CapturedLog 2026-09-12 07:27:43 +02:00

Opened #530 The idle reaper destroys a member's pane, worktree, ticket and report and logs nothing at info — while the refs sweep beside it reports its count 2026-09-12 07:35:06 +02:00

Opened #535 FleetdLeadMailboxSelectionTest leaks three ListAppenders onto the shared Fleetd logger, and the appender-balance invariant catches it 2026-09-12 07:59:46 +02:00

Opened #537 CapturedLog.close() detaches the appender and no test proves it — the fix for #525/#529/#535 is itself unpinned 2026-09-12 08:25:35 +02:00

Opened #538 An Error in StatusPoller.loop or SessionReaper.loop kills the thread permanently and silently, and start() then refuses to restart it 2026-09-12 08:34:18 +02:00

Opened #544 A dead StatusPoller or SessionReaper can now be restarted, but nothing restarts it and nothing notices 2026-09-12 09:03:48 +02:00

Opened #545 redeploy-fleetd.sh cannot run on Linux at all: every mktemp -t NAME fails under GNU coreutils, and the script blames the systemd bus for it 2026-09-12 09:11:45 +02:00

Opened #546 Merging #543 made re-delivery reachable: an Error after Injector's send now loops and types the same brief again 2026-09-12 09:14:27 +02:00

Opened #550 shasum is macOS-only: on Linux redeploy-fleetd.sh reports an existing jar as "absent" with exit 0, and the shell suite dies at 127 looking green 2026-09-12 09:34:36 +02:00

Opened #551 Injector records the delivery AFTER the irreversible send, so a failure in the response window marks a delivered brief NOT_DELIVERED 2026-09-12 09:35:27 +02:00

Opened #552 redeploy-fleetd.sh exits non-zero after a SUCCESSFUL restart if the post-restart mktemp fails, reporting a working deployment as a failure 2026-09-12 09:39:13 +02:00

Opened #553 A throwable from any listener callback in onStatus skips the delivered-future completion, so a caller waits forever on a message that WAS delivered 2026-09-12 09:41:59 +02:00

Opened #555 redeploy-fleetd.sh: the 67-test suite covers the functions and barely touches the main flow 2026-09-12 10:07:26 +02:00

Opened #556 TurnListener implementations are the only thing maintaining the Injector's own invariant 2026-09-12 10:18:53 +02:00

Opened #561 Fleetd's TurnListener.onDelivered ordering is load-bearing and untested: swapping two lines makes a throw strand the caller for its full timeout 2026-09-12 11:01:31 +02:00

Opened #562 LoopWatchdog.health() is public and nothing reads it — surface it without breaking the two scripts that parse /healthz 2026-09-12 11:15:10 +02:00

Opened #563 A lead cannot ack its own held peer mail, so every lead-to-lead message it polls is delivered a second time and costs a whole lead turn 2026-09-12 11:29:57 +02:00

Opened #567 LeadMailbox.inspect leaks a probe channel if the close is removed, and 15 contract tests stay green while the line runs 3 times 2026-09-12 12:39:56 +02:00

Opened #568 The hunter skill has no MemberRole, so every sweep is spawned under a role whose agent file contradicts it 2026-09-12 12:40:27 +02:00

Opened #571 MessageService collapses the new ATTEMPTED state into TIMED_OUT_QUEUED, so a possibly-delivered message is reported as one that will never arrive 2026-09-12 12:49:15 +02:00

Opened #572 MessageService.answer() can lose its session-lock release and the whole suite stays green 2026-09-12 13:10:36 +02:00

Opened #575 The waiter cleanup in MessageService is maintained at three sites, and one of them is outside any finally 2026-09-12 13:31:12 +02:00

Opened #577 Sweep: find every invariant kept at N sites but asserted at fewer than N 2026-09-12 14:09:14 +02:00

Opened #578 MessageService.Outcome leaks .name() onto the wire; its sibling ReplyOutcome pins a wireName 400 lines up 2026-09-12 14:26:10 +02:00

Opened #581 CompletionResolver: 9 sites maintain the CAS-remove invariant, only 2 are asserted (from the #577 sweep) 2026-09-12 15:05:24 +02:00

Opened #582 AmqpReplyInbox / LeadMailbox: the pendingByMsgId half of the dual-map cleanup is unasserted at every error-path site (from the #577 sweep) 2026-09-12 15:05:46 +02:00

Opened #586 Sweep: enum.name().toLowerCase() is the house idiom for wire tokens at 15 sites across 5 files, and no test pins any of the long-form ones 2026-09-12 15:19:51 +02:00

Opened #587 Fleetd.java: sweep every constructor-arg wiring site and report which ones no test would notice being rewired 2026-09-12 15:57:01 +02:00

Opened #588 Every async ticket dies at a hardcoded 30 minutes, so any unit longer than that always reports failed while the member is still working — 41 measured at exactly 1800s 2026-09-12 16:40:37 +02:00

Opened #589 Fleetd.main's wiring has 1 behavioural test across 44 sites: pin the 11 whose failure silently turns off a control, with runtime tests not source-text ones 2026-09-12 16:53:08 +02:00

Opened #590 A broker unreachable at boot silently disables coordination for the process lifetime, and then reports itself as "not configured" 2026-09-14 08:32:30 +02:00

Opened #591 A lead-side rule has no delivery surface: fleet.charters reaches only spawned members, and it is per-daemon — so an operator policy aimed at "the fleets" cannot reach a single lead 2026-09-19 09:52:16 +02:00

Opened #592 An architect-settled decision leaves no trace the operator can find: there is no event for it, and #392 shows there is no sink to send one to 2026-09-19 09:52:29 +02:00

Opened #593 redeploy-fleetd.sh knows which supervisor it is talking to (#492) but not which one it is watching: the log source and the pid count are both still macOS-shaped, and on systemd they fail in opposite directions 2026-09-19 09:56:43 +02:00

Opened #594 LeadRollover refuses to touch a BLOCKED lead and documents why; LeadHeartbeatLoop:161 gates on injectable() and accepts one — the same question answered both ways in one codebase 2026-09-19 10:00:19 +02:00

Opened #595 Should a lead be rolled on a timer to pick up instruction changes? Measured: the roll is the expensive answer, it contradicts a stated invariant, and it has never been observed working end-to-end 2026-09-19 10:00:33 +02:00

Opened #603 redeploy-fleetd.sh reports "no process appeared" on a deploy that fully succeeded 2026-09-20 11:08:11 +02:00

Opened #604 Charter comparison across hosts: fleet_list drops charterBytes, and a digest cannot tell you what changed 2026-09-20 11:08:29 +02:00

Opened #608 Flaky: MessageServiceTest.anAlreadyCollectedTicketProducesNoNudge orders an async scheduler with Thread.sleep 2026-09-20 11:41:48 +02:00

Opened #609 Act on a HIGH lead context: tell the idle lead to hand over 2026-09-20 11:54:04 +02:00

Opened #612 Fleetd.main's injected wirings are unpinned: 16 call sites go inert with a fully green suite 2026-09-20 12:26:00 +02:00

Opened #613 A role with no pool and no charter starts anyway, and nothing at boot says so 2026-09-20 12:30:38 +02:00

Opened #615 A herdr throw during a lead roll leaves status(token) reporting IN_PROGRESS forever 2026-09-22 05:10:28 +02:00

Opened #618 Measured: CLAUDE_CODE_AUTO_COMPACT_WINDOW beats --autocompact, so fleetd.yaml's comment is backwards 2026-09-22 05:41:20 +02:00

Opened #621 contextNotice hardcodes "ask the operator" and ignores requireOperatorConfirm, so the knob cannot actually stop the asking 2026-09-22 06:01:58 +02:00

Opened #625 The subscription guard's call site is unpinned: deleting assertPrimaryClean from Fleetd.main leaves the whole suite green 2026-09-22 06:45:51 +02:00

Opened #629 FleetdAssembly's herdr boot wait bypasses ResourcePorts: every test with an unhealthy lead herdr pays 30 real seconds 2026-09-22 07:21:17 +02:00

Opened #630 The assembly's requireOperatorConfirm wiring is unpinned: dropping it silently reverts fleetd #621 with a fully green suite 2026-09-22 07:45:26 +02:00