Skip to content
Cockpit0.29.0
A snapshot: read at commit 707a04c7ce8 on 2026-10-18T00:06:01Z by majordomus 0.29.0. Nothing on this page is read again. See it live

I2156

A slow or silent HTTP client cannot hold a server worker

Where it stands

devtask.issue
Readiness
complete completion is recorded and every required evidence token is present
Status
DONE
Can start
not now
Milestone
Milestone status
ACTIVE
Wave
0
Waiting on
none
Holds back
none
Behind it in all
0
Evidence
1 of 1
A move writes the repository: it stamps one field of this issue's record and appends one event to the ledger, and a commit will carry both.
The same moves from a terminal

majordomus plan start I2156

majordomus plan verify I2156

majordomus plan done I2156

What it is

Objective
Put a declared deadline on reading each request's head and body, close and count a connection that misses it, and keep handler time off the workers the probe needs.
Why
The HTTP server has four workers (apps/majordomus-cli/src/http/server.rs:23) and reads request bodies with no deadline (apps/majordomus-cli/src/http/server.rs:208-222). Four clients that open a connection and send slowly hold every worker; the lease probe then waits behind them (I2126) and a healthy server can be taken over. Bounded waits exist on the client side only: PROBE_TIMEOUT, BUSY_GRACE and JOIN_TIMEOUT (apps/majordomus-cli/src/lease.rs:43-62) and the link REQUEST_TIMEOUT of 5 s (apps/majordomus-cli/src/mesh/link.rs:76). The gates liveness-check and step-bound cover shell only, and no test has a slow client. Baseline audit of 2026-10-09 at master 1fb8d6be44, failure gap 5 and the slow-peer row.
Now
Any client that reaches the port can occupy a worker indefinitely.
Wanted
Reading a request has a deadline declared beside the lease timings in policy.yaml server:, a connection that misses it is closed and counted in the server's diagnostics, and handler time is bounded or moved off the request workers.
Done when
unknown: the record declares no `completion`
Risk
unknown: the record declares no `risk`

Acceptance

  • Four clients that each send one byte per second hold no worker past the declared deadline, and a fifth client is answered
  • The deadline is a declared policy key and the count of connections closed by it appears in the server's diagnostics
Validation
bin/majordomus plan validatecargo test --test http_serve --test mcp_shared
Evidence required
slow_client_released_test
Evidence present
slow_client_released_test

Scope

Touches
apps/majordomus-cli/src/http/server.rsapps/majordomus-cli/src/lease.rsapps/majordomus-cli/src/policy.rs.ai/repo/policy.yamlshare/schemas/majordomus/policyapps/majordomus-cli/tests/http_serve.rsdocs/MCP.md
Not
unknown: the record declares no `non_scope`
Depends on
none
Priority
p1
Profile
implementation
Parallel safe
false
Owner
unknown: the record declares no `owner`

The work so far

Branches
none
Merged
none
Commits
0
Trunk
master
Sessions
none
Created
2026-10-09
Updated
2026-10-14T08:02:05Z
Started
2026-10-14T08:01:59Z
Verified
unknown: the record declares no `verified_at`
Completed
2026-10-14T08:02:05Z

Synchronisation

Adapter
scripts/github-sync
Repository
unknown: the derived plan's header carries no repository
External issue
unknown: a live GitHub state; this executable makes no network call, so only `scripts/github-sync --check` can answer it
State there
unknown: a live GitHub state; this executable makes no network call, so only `scripts/github-sync --check` can answer it

Findings

Nothing is wrong with these records.