Skip to content

test(perf): three calibrated budgets are drifting or disk-bound — the startup margin is 1.4x, not the 1.9x its note records #15235

Description

@mrveiss

Found while fixing #15232. Three sites in the same file, measured on CI, that will produce the next red for reasons unrelated to any diff.

1. Multimodal processor startup — the header's stated margin is out of date

autobot-backend/system_benchmarks_performance_test.py:397, budget 600.0.

PR #15207 left this one deliberately wide after measuring a 2.76× spread in the ratio, recording a worst observation of 315.602 units and describing the budget as roughly 1.9× that. Two dispatched runs since read 372.629 and 428.260.

So the real margin is now about 1.4×, not 1.9×, and the recorded worst case is no longer the worst case. This is the site most likely to go red next, and when it does it will look like a regression rather than drift.

2. Large config file loading — disk-bound with no note saying so

system_benchmarks_performance_test.py:426, budget 420.0. ConfigManager reads a roughly 2000-key YAML, so the numerator is disk-bound and the CPU work unit cannot normalise it — exactly #15232's mechanism.

Its sibling at :397 carries a note recording that calibration cannot normalise it. This one carries none, so the next person to see it flake has no way to know it is expected. Readings: 93.274 units on CI, 132.481 locally — a 1.4× spread between two environments on the same code.

3. test_memory_manager_performance — the module's remaining live storage path

system_benchmarks_performance_test.py:259 writes 50 records through a real MemoryManager. Its assertion is an RSS delta, so it cannot flake on disk timing — but under -n auto it adds SQLite contention that the sibling budgets have to absorb. It is the last live storage path in a module whose other sites were just made storage-free.

Why file these together

They are one question: the calibrated budgets in this file were set from a small number of observations, and some of the sites they cover are not CPU-shaped. #15232 fixed one by removing the disk from the measurement. These three need the same decision made deliberately rather than discovered through a red check on an unrelated PR — which is how #15232 surfaced, blocking a PR that had nothing to do with it.

Acceptance criteria

Refs #15232, #15055, PR #15207, PR #15233.

Activity

  1. added this to the v0.9.0 milestone on Sep 12, 2026
  2. mrveiss commented on Sep 13, 2026

    @mrveiss
    OwnerAuthor

    What landed today (#16404, e04f1d6)

    Checked against origin/main at b688b3e. #16404 referenced this issue (Refs); it closed #15055, not this one. File: autobot-backend/system_benchmarks_performance_test.py.

    AC Evidence on origin/main Status
    1. Re-derive Multimodal processor startup's budget from CI readings, with a matching note :44-48: the site now has no work budget ("disk-bound … a CPU work-unit ratio can't track it"). The note cites three CI readings (2327/4348/3743 units) that failed the re-based 2200. A deterministic check replaced it (:382, warm construction imports nothing). ⚠️ not ticked: the budget was removed, not re-derived. Owner call whether that satisfies AC1
    2. Decide Large config file loading (drop the disk, or record that it is disk-bound) :426 assert_within_work_budget(load_time, 420.0, "Large config file loading"), with no note about disk or the budget ❌
    3. Decide whether test_memory_manager_performance keeps a live MemoryManager :269-271 still constructs MemoryManager(), with no recorded reason ❌
    4. A budget that stays wide carries its reason at the constant, and an issue owns its reduction :426's 420.0 has neither ❌
    5. A recorded procedure for re-deriving budgets from CI history autobot_shared/perf_work_budget.py:36-49 ("HOW TO CHANGE A BUDGET"): every run writes perf_work_units to the junit XML, which marker-tests.yml uploads as marker-suite-reports. "Read the number off a run, then move the budget …" ⚠️ not ticked: it is a per-run procedure, with no step for collecting readings across a run history

    What remains: AC2 to AC4, and owner calls on AC1 and AC5. Also, the :179 comment still says a disk-bound numerator is "the limitation Multimodal processor startup records at its budget", but that site no longer has one (:44).

  3. added
    needs-decisionBlocked on an owner decision; options and a recommendation are on the issue
    on Sep 13, 2026
  4. modified the milestones: v0.9.0, v0.10.0 on Sep 17, 2026
  5. mrveiss commented on Sep 20, 2026

    @mrveiss
    OwnerAuthor

    Branch-freeze re-verification against current origin/main (2026-09-20). Both tracked branches (train/2026-09-13-batch1, issue-15055-startup-benchmark) are already gone from origin.

    Site 1, Multimodal processor startup — resolved, but by a better fix than the AC literally asked for. Not "re-derived and lowered": the module docstring (system_benchmarks_performance_test.py:36-45) records that a re-based 2200-unit budget (#15342) still failed three later CI runs with no code change (run 33368810264/33364129751/33579228276: 2327/4348/3743 units), and concludes "a baseline ratio can't replace it either (it would time its own numerator as the baseline)." The budget assertion was removed entirely for this site and replaced with a deterministic check (test_system_startup_performance's warm-construction/no-new-imports assertion, visible at line 383) that verifies the thing actually worth verifying without trying to time something admittedly untimeable. This satisfies the AC's intent — margin no longer overstated, because there's no numeric margin claim left to overstate — better than a re-derived number would have, and it's issue-owned (#15055, #15235, #15342 all cited inline).

    Site 2, Large config file loading — not done. Still assert_within_work_budget(load_time, 420.0, "Large config file loading") at line 427, still no comment anywhere near it recording that it's disk-bound or why 420.0 is the number. AC2 and (for this site) AC4 are both unmet — this is exactly the "silence is the defect" case the issue calls out by name.

    Site 3, test_memory_manager_performance — not done. Still constructs a real MemoryManager() and writes 50 records through create_task_record() under an RSS-delta assertion; no comment recording the keep-it-live decision or why, despite the rest of the module having gone storage-free.

    AC5 (recorded re-derivation procedure) — partially: the module docstring documents the original derivation methodology (five local runs, ~3.2x CI conversion factor, headroom multipliers) in detail, which is genuinely useful, but doesn't describe an ongoing cadence for re-checking as CI drifts — closer to "how these numbers were set" than "how to catch the next drift by looking."

    1 of 5 fully resolved (via a superior approach), 2 genuinely untouched, 1 partial. Leaving open — sites 2 and 3 are the real remaining work.

  6. mrveiss commented on Oct 2, 2026

    @mrveiss
    OwnerAuthor

    Duplicate pair: #15235 and #15055 describe one defect. Found during the v0.10.0 full-coverage triage (#17863), by reading bodies — a title-similarity pass over all 44,253 pairs in that milestone returned a maximum of 0.357 and found this pair, and five others, not at all.

    Both concern calibrated wall-clock budgets drifting in the same file; #15235 is the follow-up to #15055's rework. Only #15055 is done — its budgets are now runner-calibrated work units via autobot_shared.perf_work_budget, while #15235's remaining items (the 420.0 budget with no note, and the real-MemoryManager write-through) still hold. This is the pair that proves closing on duplication alone would close live work.

    Evidence both resolve to: autobot-backend/system_benchmarks_performance_test.py — :44 (no-budget note), :270, :427

    Neither issue is being closed, deliberately. A duplicate pair is not a closure argument — closure needs the acceptance criteria checked per issue, which is a separate pass. In at least one of the six pairs only one member's work is actually done, so closing on duplication alone would close a live defect.

    On the relationship type: GitHub's native "duplicate" marker requires closing the issue, so it is unavailable here. This comment creates a bidirectional cross-reference instead, which is a native timeline link discoverable from both issues rather than prose in a third place. If a hierarchy is wanted, a sub-issue link can be added where one member genuinely subsumes the other.

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

    area: test-suite-healthWave 0 · cluster Q — Test suite healthbugSomething isn't workingcineeds-decisionBlocked on an owner decision; options and a recommendation are on the issuetesting

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions