Skip to content

id(world): F12.18 denial-of-service test suite in CI #560

Open

Description

@dezren39

What and why

A suite that tries to exhaust fuel, memory, journal size, frame size, session count, schedule count and provider bounds, and asserts each is refused with the documented code while the node stays responsive. Bounds are tested one at a time in different files, so nothing shows the node stays up when a guest pushes on all of them.

Source

Current status

Implemented on main except the journal-size bullet (re-verified 2026-11-03).

pkgs/id/tests/world_dos.rs drives the suite through one probe harness: provider
bounds (CapError codes), wants/args byte bounds, schedule id bounds and the
hostile-program responsiveness probe landed in 06d4ef2e9; fuel
(trap, world poisoned), guest memory growth, out-of-memory output, frame size,
session ceiling (ResolveError::Busy), open-world ceiling (TooManyWorlds) and
schedule count/horizon were folded in by 62c883f2b (queue task 3840), per the
merged design doc/2026-11-01_design_id560.md (PR #3884). Each refusal asserts
its actual documented outcome — F11.13 CapError codes only for capability
denials. CI needs no workflow edit: pkgs/id/scripts/test-shard-sandbox.sh globs
tests/*.rs, so world_dos is picked up automatically (currently shard 1 of 4).

Remaining: journal size only. FileJournal has no absolute byte cap or
refusal to assert, and inventing one is production behaviour, not test work —
open decision for Drew (A/B/C in the design record), tracked by user/escalated.

Acceptance criteria

  • A suite tries to exhaust fuel, memory, journal size, frame size, session count, schedule count and provider bounds
  • Each attempt is refused with the documented error code (F11.13)
  • A probe client stays responsive throughout
  • The suite runs in CI

Size

M

Prerequisites

Activity

  1. dezren39 commented on Oct 24, 2026

    @dezren39
    MemberAuthor

    Progress (Session C, PR #801): added pkgs/id/tests/world_dos.rs — a consolidated DoS suite covering provider bounds (documented F11.13 codes), wants-document size, schedule ids, and a hostile program whose 64 requests are all refused while the node keeps serving chat + caps. Fuel/memory, journal/frame, session/open-world and schedule-count bounds are mapped to their dedicated tests in the module doc; consolidating those into the one probe-driven harness remains (they need the session/hub test harness).

  2. added
    kind/testTest coverage, test infrastructure, or test-only fixes
    source/humanFiled directly by a human
    priority/normalOrdinary priority (the default)
    effort/mMedium: expected under 1 day of work
    app/idPackage/app: id (pkgs/ or apps/ in this repo)
    meta/enrichedIntake review done: acceptance criteria, links, and normalized labels added
    on Oct 26, 2026
  3. dezren39 commented on Oct 26, 2026

    @dezren39
    MemberAuthor

    Intake review

    Fleet-monitor intake pass (2026-10-26). Body already carries a full ## Acceptance criteria section, so this pass is label normalization plus a liveness check — no body edit.

    APPEARS SOLVED — not closed. Commit 06d4ef2e on main, "test(id): F12.18 consolidated denial-of-service suite", added pkgs/id/tests/world_dos.rs, whose header explicitly frames it as the F12.18 suite: a hostile program pushes on provider bounds, wants-document size, and schedule ids in one place, and the header maps the remaining bounds (fuel/memory/message size, journal/frame size, session/open-world ceilings, schedule count/horizon) to their dedicated tests. That covers the shape of every acceptance bullet, including the probe-stays-responsive intent.

    Why this is not being closed by the monitor: no merged PR or commit message explicitly references this issue (#560), and the monitor has not independently verified the suite's CI status or that each refusal asserts the F11.13 documented codes. Per the lifecycle protocol, an issue that only looks solved gets the evidence linked, not a close.

    Remaining check for a worker/sweep: confirm world_dos.rs runs in CI and that the refusal assertions name the documented F11.13 codes; if both hold, close this issue as completed citing 06d4ef2e.

    Related: prerequisite #554 (F11.13 error taxonomy) is still open and unenriched — if its codes are not yet stable, that is the one acceptance bullet that may still be genuinely open.

  4. added
    nextOrg Project gate: queued next — orchestrator adds to the board
    work/assignedQueue worker lifecycle state
    on Oct 27, 2026
  5. 32 remaining items

  6. dezren39 commented on Nov 1, 2026

    @dezren39
    MemberAuthor

    Design summary

    • The existing world_dos target covers capability codes, wants/args limits, schedule IDs, and 64 hostile denials while a probe participant still chats.
    • The remaining bounds return different outcomes: sandbox traps/poison, framing errors, hub variants, and schedule reasons—not F11.13 CapError codes.
    • FileJournal has no absolute byte cap or refusal to assert today.
    • Recommendation: keep F14.17 test-only and assert each bound’s actual documented outcome; use F11.13 codes only for capability denials.
    • Keep node liveness separate from recovery of a target world that is documented to become poisoned.
    • The existing PR-gate shards already discover the world_dos integration target; no new workflow is needed.
    • The decision-ready record includes evidence, invariants, acceptance criteria, alternatives, and the independently mergeable implementation phases.

    Design PR: #3884

    Phased plan: (1) reusable probe helper + sandbox limits; (2) frame and session/open-world ceilings; (3) schedule count/horizon, update the inventory, and verify the existing CI shard.

    Question for Drew — journal size: (A) remove it from this test suite (recommended; no byte budget is invented here); (B) design a separate production cap with its refusal semantics; or (C) add the cap to F14.17 (not recommended: breaks the test-only boundary). The answer does not block existing test-only packet #3840. No other Drew-only questions.

  7. added
    mode/onlineFully doable remotely: design, config, code, cloud
    on Nov 1, 2026
  8. added a commit that references this issue on Nov 2, 2026
  9. added
    queue/queuedHas a queued task in the Supabase agent queue
    work/assignedQueue worker lifecycle state
    queue/claimedQueue worker lifecycle state
    and removed
    queue/queuedHas a queued task in the Supabase agent queue
    on Nov 3, 2026
  10. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    Agent note — task 6888 picked up, handed off (lane L shift)

    • Queue task 6888 (triage, re-triage of issue id(world): F12.18 denial-of-service test suite in CI #560) claimed by lane code-l at 2026-11-03T13:59Z.
    • Execution-lane assignment: opencode (assignment row 745). Per the worker runbook §1b, this task is handed off: the laptop opencode-claimant launches a bound opencode session to drive the triage to a terminal state.
    • Fresh state at handoff: issue id(world): F12.18 denial-of-service test suite in CI #560 OPEN; labels include user/escalated — the claimant/Drew-owned decision flag is preserved and noted in the task checkpoint.
    • Next: claimant launches the bound session; if the lease expires unlaunched, task 6888 returns to the queue.
  11. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    agent-note:v1
    task: 6888
    lane: code-h
    stage: handed_off
    execution_lane: opencode

    Task 6888 (triage: #560 — id(world) F12.18 denial-of-service test suite in CI) re-claimed by lane code-h at 2026-11-03T14:57Z; execution-lane assignment returned opencode with no session bound yet. Handing off to the opencode claimant per the worker runbook — this lane does not work the task directly. Claim labels on #560 were already synced.

    Flag for the claimant: #560 carries user/escalated — a Drew decision may be required on this item; the escalation predates this handoff and is not resolved by it.

  12. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · re-triage verdict: implemented on main; one Drew decision left (task 6888)

    • Agent: queue worker (repo-worker-code), OpenChamber scheduled lane 8ac61616-3815-4e7b-b33d-840a3829154a
    • Session / ID: queue task 6888 (re-triage of id(world): F12.18 denial-of-service test suite in CI #560 after the 2026-11-03 fleet-unblock cancellations); this picks up from the handed-off state and executes the remaining step
    • Found via: queue claim
    • Verified: main f4fce2b90 (fresh fetch, 2026-11-03)

    This issue's "Current status: Not started" was stale — I updated the body. What is actually on main:

    F12.18 bound Covered in pkgs/id/tests/world_dos.rs Refusal asserted
    Provider bounds provider_bounds_refuse_with_the_documented_codes CapError codes by name
    Wants / args bytes a_wants_document_is_bounded_in_bytes_and_args parser refusal
    Schedule ids schedule_ids_are_refused_when_out_of_bounds validation refusal
    Probe responsiveness a_hostile_program_is_refused_without_taking_the_node_down 64 denials, probe still chats
    Fuel fuel_exhaustion_traps_instead_of_hanging trap, not a cap code
    Memory guest_memory_growth_is_bounded_and_poisons_the_world, guest_output_outside_memory_is_rejected poison / output refusal
    Frame size a_frame_over_the_size_bound_is_refused framing error naming the bound
    Session count the_session_ceiling_refuses_with_busy_then_recovers ResolveError::Busy
    Open-world count the_open_world_ceiling_refuses_with_too_many_worlds TooManyWorlds
    Schedule count / horizon schedule_bounds_refuse_with_their_reasons count + "days past" reasons
    Journal size absent no absolute byte cap exists
    • Fold-in landed as 62c883f2b (queue task 3840) against the merged design doc/2026-11-01_design_id560.md (PR design(id): #560 DoS suite contract #3884, merged by Drew 2026-11-02T15:48Z) — every refusal asserts its real documented outcome, CapError codes only for capability denials, exactly as the design recommended.
    • Runs in CI with no workflow change: pkgs/id/scripts/test-shard-sandbox.sh globs tests/*.rs, so world_dos is auto-assigned (currently shard 1 of 4). Caveat: main's id-check runs are all queued right now (backlog since 14:33Z), so I cannot cite a green shard run from today; the code and the discovery mechanism are both on main.
    • Prerequisite id(world): F11.13 error taxonomy: stable codes plus reasons on the wire #554 (F11.13 taxonomy) is closed, as the 2026-11-01 triage recorded.

    Why this is not closed and not a new packet: the only unmet bullet is journal size, and it is not implementable as test work — FileJournal has no absolute byte cap, so a test would have to invent one (production behaviour). The merged design defers that choice to Drew, and merging the record did not answer it. The options from doc/2026-11-01_design_id560.md:

    • (A) Remove journal size from F12.18/F14.17 (design's recommendation — no byte budget invented).
    • (B) Design a separate production cap with its own refusal semantics (its own issue).
    • (C) Add the cap to F14.17 (not recommended: breaks the test-only boundary).

    Drew: answer A/B/C and this closes the same day — A means a one-line plan edit plus closing this issue; B/C means a new production issue and this one narrows to it.

    • No code changed by this triage; user/escalated kept, task blocked as escalated-to-user so the coverage pass stops re-filing triage for it.
  13. added
    queue/blockedQueue or user escalation state
    status/blockedQueue or user escalation state
    and removed
    queue/claimedQueue worker lifecycle state
    on Nov 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

app/idPackage/app: id (pkgs/ or apps/ in this repo)effort/mMedium: expected under 1 day of workenhancementNew feature or requestkind/testTest coverage, test infrastructure, or test-only fixesmeta/enrichedIntake review done: acceptance criteria, links, and normalized labels addedmode/onlineFully doable remotely: design, config, code, cloudnextOrg Project gate: queued next — orchestrator adds to the boardpriority/normalOrdinary priority (the default)queue/blockedQueue or user escalation statesource/humanFiled directly by a humanstatus/blockedQueue or user escalation stateuser/escalatedQueue or user escalation statework/assignedQueue worker lifecycle state

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions