Skip to content

fix(api): prevent slow-drip bypass of loopback receive deadline #756

Open

Description

@seonghobae

Defect and accepted boundary

A same-host client can keep the serialized TEPP loopback receiver busy by sending each header/body fragment faster than the one-second socket inactivity timeout. The existing public constant is described as a deadline, but the whole-request allowance is reset by partial progress. Related to #174 and approved PRD v0.4 §17; this issue concerns the current bounded transport contract, not production tenancy or scientific estimators.

Actual reproduction

The existing tepp-loopback binary remained unanswered after 2.424 seconds of header bytes every0.4 seconds, returning400 only when the sender closed. A valid trickled request also succeeded after about2.420 seconds. Prompt valid200 and idle~1second413 controls distinguish this from generic framing failure.

The permanent cargo test --locked -p tepp_api --test live_request_deadline regression reproduces the shared cause in all four Naruon/Analysis header/body combinations. Before repair all4 failed400instead413; new private borrowed-socket reader applies one monotonic deadline across each partial read/read_exact phase. It checks positive remaining time before read and checks expiration after success, retaining error mapping and socket ownership.

Acceptance

  • all four real-socket slow-header/body regressions pass; immediate authorized positives remain green;
  • exhausted-budget and partial-read ownership private tests pass;
  • independent full eight-path source verdict, formatter/docstrings, actual standalone API178 outcomes and strictClippy pass;
  • API authored lines1818/1818 and branches814/814 pass with unchanged verifier on fresh source-bound build targets; earlier reused-target814/970 and1802/1822 failures retained separately;
  • fresh exact-head hosted evidence and qualifying approvals before protected-main integration; fix(coverage): reconcile contradictory LCOV opener counts #538/fix(actions): align hourly quality contract with central admission (#647) #648 baseline dependency/admission prerequisites retained;
  • response writing, accept waiting, model processing, arbitrary generic Read preemption, durability, production authentication and GPU/scientific acceptance explicitly out of scope.

The initial scope is a receive-budget repair only. Do not normalize the defect by increasing the time allowance, lowering coverage or ignoring native regressions. The CI account billing lock remains an independent execution blocker; skipped reviews and runner0/steps[] are not approval or test success.

Activity

  1. seonghobae commented on Oct 4, 2026

    @seonghobae
    ContributorAuthor

    The reviewed receive-budget repair is now published as Draft PR #757 at exact commit df8a576. Standalone API178 tests/Clippy PASS; source-aware API lines1818/1818 and branches814/814 PASS on unchanged source in dedicated targets; independent8file source review PASS. Earlier timeout and reused-target coverage failures are retained. Actual PR757 foundation job111385702692 did not start: runner_id0, steps[], GitHub annotation account locked due billing issue. This is not runtime test failure or passing hosted evidence. Normal CI/qualifying review/main integration remain open; broader #174 scope is not completed.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions