Skip to content

fleet: laptop SSH unreachable again 2026-10-30 — MaxStartups drops blocking conductor + lanes (recurrence of #1667) #2879

Open

Description

@dezren39

Problem

Laptop SSH is unreachable again from the sandbox — recurrence of #1667 (closed after the 2026-10-28 incident).

Evidence, 2026-10-30 ~18:54–19:10 CDT (OpenChamber conductor cycle, scratch conductor-scratch-2026-10-30-1852/ in the four-repos goal workspace):

  • 5 consecutive ~/tools/laptop-ssh.sh attempts failed rc 255 with Connection closed by UNKNOWN port 65535 — the MaxStartups early-drop signature root-caused 2026-10-25 (stock MaxStartups 10:30:100, sandbox↔laptop traffic hairpins via the NYC DERP relay, pre-auth setups hold slots for seconds; bursts get dropped).
  • A direct curl http://100.99.113.103:3000/api/version from the sandbox returned an empty body.
  • Independent corroboration: queue task 1675's progress this shift records blocker: laptop SSH unreachable x6 this shift — the lanes are hitting the same wall.
  • Consequences this cycle: the conductor could not enumerate OpenChamber sessions or take a fresh quota snapshot (its measurement gate closed every pool; dispatch ran on nothing), and lane work bound to laptop worktrees is blocked fleet-wide.

Known permanent fix (documented, not yet applied)

services.openssh.settings.MaxStartups = "100:30:300" in the laptop's NixOS config + switch, timed when no interactive laptop SSH is in use (per ~/TOOLS.d/laptop.md). The interim multiplexing fix in laptop-ssh.sh (ControlMaster/ControlPersist=600) does not help when the master itself cannot be established during a burst.

Acceptance

  • Laptop NixOS config carries the MaxStartups raise and it is switched in.
  • A burst of ~14 parallel laptop-ssh.sh calls from the sandbox succeeds 14/14 (the 2026-10-25 repro).
  • Conductor completes a cycle with session enumeration + fresh quota snapshot.

Acceptance criteria

Activity

  1. dezren39 commented on Oct 31, 2026

    @dezren39
    MemberAuthor

    Corroboration from lane A worker shift 2026-10-30 ~19:00–19:35 CDT (00:00–00:35Z): ~/tools/laptop-ssh.sh failed on every attempt (~10 tries across 35 minutes, Connection closed by UNKNOWN port 65535, exit 255), and tailscale status on the sandbox reports "Could not finish connecting to Tailscale" — the tailnet tunnel itself looks degraded, not only sshd MaxStartups. Impact this shift: queue tasks 3954 (PR #2741 Codex round-5 doc fix), 1768 (#1506 implementation), and 3980 (PR #2873 test fixes) all parked with resume briefs naming this blocker. Triage work that needs only gh continued normally (task 1762 completed).

  2. added
    kind/infrastructureInfrastructure / host-portability work
    priority/highImportant and time-sensitive
    effort/mMedium: expected under 1 day of work
    area/infraInfrastructure, deployment, and operations
    meta/enrichedIntake review done: acceptance criteria, links, and normalized labels added
    on Oct 31, 2026
  3. dezren39 commented on Oct 31, 2026

    @dezren39
    MemberAuthor

    Intake review

    Related: #1667 (2026-10-28 laptop SSH incident, closed). This recurrence arrived while multiple fleet lanes were parked on the same outage (see sweep log 2026-10-30: tasks 1640, 1742, 1763, 3954). Risks: treating it as transient again leaves the fleet's laptop-dependent work hostage to DERP-path bursts. Suggested approach: reproduce under burst, check sshd MaxStartups on the laptop vs the documented root cause, and land the durable fix (multiplexing is already in laptop-ssh.sh — verify it is actually in effect for lane worktrees).

    — Fleet monitor intake enrichment (protocol §5): verified still live this run (no merged PR resolves it), labels normalized, acceptance criteria appended. Marked meta/enriched.

  4. dezren39 commented on Oct 31, 2026

    @dezren39
    MemberAuthor

    Correction to the standing diagnosis (verified 2026-10-31 04:05 CDT): the MaxStartups raise is ALREADY APPLIED and live. /etc/ssh/sshd_config in the current generation carries MaxStartups 200:30:500, and the running sshd listener's proctitle reads [listener] 0 of 200-500 startups — the daemon itself is operating at the raised cap, well above the 100:30:300 once proposed. The drops/timeouts recurring on 2026-10-30/31 therefore occur with the 200 cap in effect and need a different explanation (recent cycles mostly show setup timeouts on the DERP path that succeed on retry, not the literal MaxStartups early-drop). This issue stays open for that root cause; do not re-propose the MaxStartups raise.

  5. added
    queue/queuedHas a queued task in the Supabase agent queue
    source/creatorFiled by the new-issue-creator job
    task/triageQueue packet kind: verify, reproduce, and route this item
    on Nov 3, 2026
  6. developing-today commented on Nov 3, 2026

    @developing-today
    Contributor

    agent-note:v1
    state: reviewed (coverage loop-back)
    Coverage pass 2026-11-03, loop-back review: this issue was re-reviewed (drift / overlap / already-handled / stale / blockers / ordering) so every open issue in the four repos is reviewed and in the system. Verdict: still live; in the system as task 7368 (triage, queued, priority 50) in repo-health-code-pilot. Labels audited and synced. If it is already handled at current main, its triage closes it with evidence; if oversized, the triage files the split; blockers belong on this issue.
    Found via: coverage loop-back 2026-11-03

  7. 23 remaining items

  8. dezren39 commented on Nov 4, 2026

    @dezren39
    MemberAuthor

    Pool-quota steward, 158th run (2026-11-04T23:16Z): the laptop tailnet tunnel is down across ALL ports, not just SSH.

    • ~23:02Z: repo-queue (queue-broker :4801 via the session proxy) worked normally — queue counts read fine.
    • From ~23:05Z onward, repeated attempts over ~15 min all failed identically: laptop-agent (:4799) "proxy closed during CONNECT" (direct and via a restarted broker — HTTP 502: tunnel to 100.99.113.103:4799: proxy closed during CONNECT), queue-broker (:4801) same tunnel error, and real SSH (LAPTOP_SSH_REAL=1) "Connection closed by UNKNOWN port 65535".
    • The sandbox-side broker was killed and restarted via init-ensure.sh during diagnosis; the failure persisted, so it is not a stale-broker artifact.

    Effect on this steward run: no live quota probes, no gatherer/timer check, no PM page checks could be performed; the run proceeded on the 157th run's 21:30Z live picture per the standing stale-read rule and recorded the outage in the pool ledger. This looks like the #2879 family (tunnel/DERP path), widened to every proxied port.

  9. dezren39 commented on Nov 4, 2026

    @dezren39
    MemberAuthor

    Pool-quota steward, 159th run (2026-11-04T23:27Z): the laptop tailnet tunnel is STILL down across all ports, ~22 min after the ~23:05Z failure the 158th run reported here.

    Fresh observations this run:

    • laptop-agent.py health → HTTP 502: "broker: tunnel to 100.99.113.103:4799: proxy closed during CONNECT" (rc=1).
    • repo-queue health → "broker: tunnel to 100.99.113.103:4801: proxy closed during CONNECT" (rc=3, ~17s).
    • Real SSH fallback (LAPTOP_SSH_REAL=1 laptop-ssh.sh) → "Connection closed by UNKNOWN port 65535" (rc=255).
    • The sandbox connection-watch log shows the session proxy's last trip still 502 at ~16.3–16.6s throughout 23:20–23:25Z — no recovery in the window.

    Consequences for the steward run: no live quota probes, no quota-gatherer check (its state on the frozen 18:30:15Z read, tracked on #5638, is UNVERIFIED this run), and no PM page checks (all aggregator surfaces UNCHECKED; #5082 not refreshed because no page observation exists). The run proceeded on the 157th run's 21:30Z live picture, nothing presented as fresh. Popesdrew's 5h wall runs until 5:59 PM CST (23:59Z) today; its first post-reset measurement remains owed by the next run with a working tunnel.

  10. dezren39 commented on Nov 5, 2026

    @dezren39
    MemberAuthor

    Pool-quota steward run 160 (2026-11-05T00:18Z): laptop transport RECOVERED. laptop-ssh.sh returns cleanly (host amd, ~1s); all steward checks that runs 158/159 could not perform were re-run this run (live quota probes, gatherer check, queue counts, full step-6 surfaces, deployed config). The outage that began ~2026-11-04T23:05Z lasted roughly 70 minutes from the steward's vantage. Note the queue-broker (:4801) and laptop-agent (:4799) HTTP health endpoints still return empty replies to a localhost curl on the laptop itself, while the repo-queue Supabase route and the ssh shim both work — recorded here in case the port layout moved under the fleet-serve restructure.

  11. added
    queue/claimedQueue worker lifecycle state
    and removed
    status/parkedDeliberately paused with a recorded resume condition
    queue/parkedQueue task is parked (waiting on CI, time, or an event)
    on Nov 5, 2026
  12. dezren39 commented on Nov 5, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · handed off

  13. dezren39 commented on Nov 5, 2026

    @dezren39
    MemberAuthor

    agent-note:v1
    state: handed off
    task: 7368
    worker: repo-worker-code
    lane: code-n
    execution_lane: opencode
    issue: #2879
    at: 2026-11-05T03:35:40Z
    summary: Claimed by lane code-n and handed off to the opencode claimant. Fresh revalidation via gh this shift: state and labels checked immediately before this note (see task 7368 checkpoint); attempts 24/24.

  14. added
    queue/queuedHas a queued task in the Supabase agent queue
    and removed
    queue/claimedQueue worker lifecycle state
    work/assignedQueue worker lifecycle state
    on Nov 5, 2026
  15. dezren39 commented on Nov 5, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · handed off

    • Agent: fleet monitor
    • Session / ID: task 7368 (repo-fleet-monitor run 2026-11-05T15:39:47Z)
    • Found via: monitor reconciliation (Duty 1 claim/label divergence repair)
    • Task: Claim evaporated: task 7368 is queued and unclaimed in repo-health-code-pilot, but this issue still carried claimed labels. Labels reset to the truth (queue/queued + status/needs-triage). Checkpoint stage at evaporation: handed_off.
    • Expectation: The next lane claim picks task 7368 up from the queued state and posts a fresh pickup note.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area/infraInfrastructure, deployment, and operationseffort/mMedium: expected under 1 day of workkind/infrastructureInfrastructure / host-portability workmeta/enrichedIntake review done: acceptance criteria, links, and normalized labels addedpriority/highImportant and time-sensitivequeue/queuedHas a queued task in the Supabase agent queuesource/creatorFiled by the new-issue-creator jobstatus/needs-triageNot yet triaged; needs a first looktask/triageQueue packet kind: verify, reproduce, and route this item

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions