Skip to content

ci(windows): git-objects 'packs loose objects' test hits the 60s timeout on unit (windows) — observed on unrelated PR #640 #652

Closed

Description

@dezren39

Problem

The unit (windows) CI job failed on PR #640 (run 40566963428, job 122410699777) with a single non-#565 failure:

  • (fail) Git objects > packs loose objects and combines packs without losing or delegating any object [60001.52ms]

The test hit the 60-second test timeout almost exactly (60001.52ms). PR #640's diff touches only packages/core/src/quota-snapshot.ts and its test — no git-object code — and the same job's linux counterpart passed this test; the quota tests themselves passed on both platforms. This looks like a slow-runner / timeout-margin problem in the git-objects pack test on Windows rather than a behavior regression, but it is not covered by any existing issue (#565 covers the two permission-focus failures in the same job).

Evidence

Acceptance criteria

  • Determine whether the test is genuinely slow on Windows runners (profile it) or whether the timeout is runner contention; cite timings from at least two runs
  • Make the test pass reliably on Windows without weakening its assertions (e.g. fewer/smaller objects, or a justified per-test timeout where the suite's conventions allow one)
  • If it recurs only under contention, say so with evidence and close

Activity

  1. added
    kind/bugSomething isn't working (prefixed form of the classic bug label)
    on Oct 27, 2026
  2. developing-today commented on Oct 27, 2026

    @developing-today
  3. added
    priority/normalOrdinary priority (the default)
    effort/sSmall: expected under 2 hours of work
    source/humanFiled directly by a human
    area/ciCI, workflows, and build infrastructure
    meta/enrichedIntake review done: acceptance criteria, links, and normalized labels added
    on Oct 28, 2026
  4. dezren39 commented on Oct 28, 2026

    @dezren39
    Author

    Intake review

    Related: #631 (the standing e2e/app-2 redness item — different suite, same CI-congestion pattern); #565 (known TUI permission flakes — explicitly NOT this failure). No merged PR resolves this; the body reproduces it from run 40563040142 job logs on current main.

    Notes: Clear, well-scoped CI-timeout bug: a single git-objects test takes ~63s of the ~70s job on the Windows runner while the same suite takes ~35s total on Linux. The issue already carries a complete Acceptance section in substance ("done when the test completes within the job timeout on windows CI"), so none was appended.

    Risks: Raising the timeout or splitting the test without measuring where the 63s goes (loose-object packing on NTFS vs process spawn cost) could mask a real performance regression in the test's setup.

    Suggested approach: Reproduce the timing split locally or from CI logs first (which phase of the test eats the time), then either reduce the object count, reuse a packed fixture, or give this one test a bounded, justified timeout — with the measurement recorded on the issue.

    Labels normalized by the fleet monitor (intake enrichment): priority/normal, effort/s, source/human, status/needs-triage, area/ci, meta/enriched.

  5. dezren39 commented on Oct 28, 2026

    @dezren39
    Author

    🤖 Agent note · picked up

  6. added
    work/self-assignedAn agent grabbed this item directly, outside the queue
    and removed on Oct 28, 2026
  7. dezren39 commented on Oct 28, 2026

    @dezren39
    Author

    🤖 Agent note · done (triage)

    Triage finding — NO RECURRENCE in the two most recent completed windows-unit runs (2026-10-28):

  8. 33 remaining items

  9. added
    queue/parkedQueue task is parked (waiting on CI, time, or an event)
    on Oct 28, 2026
  10. dezren39 commented on Oct 28, 2026

    @dezren39
    Author

    🤖 Agent note · fix PR open, parked on CI evidence

  11. dezren39 commented on Oct 28, 2026

    @dezren39
    Author

    Checkpoint (queue task 2648, branch queue/2648-652-git-pack-timeout, PR #757).

    Changed, in packages/core/test/git.test.ts only:

    • The 16 batch captures now capture the one file the batch just wrote (scopes = that file) instead of rescanning all 2100 generated paths. Same objects, because capture writes its tree from the whole snapshot index; only the redundant stat walk of unchanged paths goes away.
    • This test's per-test timeout is 60s → 180s, with the reasoning at the call site.

    No assertion touched: loose > 2048 before the first pack, packs >= 16 → 1, object set equality before/after merging, final diff 2100 + 16 files.

    Windows measurement (the thing the earlier probe draft was closed before collecting): the unit (windows) job of run 40758205279 ran the test with phase logs and a 300s budget:

    • write 2100 files 0.67s, first capture 23.24s (hashing the generated tree), first pack 1.01s, 16 batches ~6.9s, final pack + diff 0.3s → ~32s total.
    • 60s therefore left under 2x headroom before in-job contention; 180s is ~5.6x the measured run.
    • That job's red conclusion was the two pre-existing @opencode/tui permission tests, which also fail on unmodified main (run 40759067888). git.test.ts passed.

    Linux (packages/core, junit per-test time, 5 runs): median 4.24s before → 3.67s after, no regression. Whole file 18 pass, 0 fail; bun typecheck clean.

    Still pending: two unit (windows) runs on the final commit (#757 CI is queued behind the repo's backlog). Note #750 and #756 are duplicate PRs for this issue — #757 adds the loop cost reduction on top of the same 180s budget, and it is fine to consolidate on whichever you prefer.

  12. dezren39 commented on Oct 28, 2026

    @dezren39
    Author

    Resume update: duplicate PRs reconciled — PR #757 is the single canonical PR

    Task 2648 had three open PRs for this issue. Reconciled this shift per protocol §8:

    State: task 2648 parked 30 min. Resume brief: on PR #757's CI, the pack test inside 180s is windows run 1; re-run the windows job for run 2; cite both timings here; merge #757 when both pass (the #565 pair, if present, is pre-existing).

  13. dezren39 commented on Oct 28, 2026

    @dezren39
    Author

    Done — PR #757 (queue/2648-652-git-pack-timeout), not merged.

    Change (packages/core/test/git.test.ts only):

    • batch captures now capture the file the batch just wrote instead of re-scanning all 2100 unchanged paths (same objects: capture writes its tree from the whole snapshot index);
    • this test's per-test timeout 60s → 180s, with the measure at the call site.

    Assertions untouched: loose > 2048 before packing, packs >= 16 → 1, object-set equality across merging, final diff 2100 + 16.

    Windows timing (unit (windows), run 40758205279, head e36b7864a — identical test body, temporary phase logs and a 300s budget): write 2100 files 0.67s, first capture 23.24s, first pack 1.01s, 16 batches ~6.9s, final pack + diff 0.3s → ~32s total. So 60s had under 2x headroom before the in-job contention that was hitting the cap; 180s is ~5.6x the measured run.

    Windows CI on the final commit 7dd3e2a3ab (run 40764588027, two attempts: jobs 123085190972 and 123115619735): unit (windows) is red both times only on the two pre-existing @opencode/tui permission tests, which also fail on unmodified main (run 40759067888) and on unit (linux) for this commit. turbo aborts on that first failure, so core's own summary never prints and bun's --only-failures prints nothing for a passing test; the logs show core's stable file order running past git.test.ts in both attempts with zero failures in the core group, so the pack test ran and passed both times. Its explicit duration is the instrumented measurement above.

    Linux: junit per-test median 4.24s → 3.67s over 5 runs (no regression, ~13% faster); whole file 18 pass, 0 fail; bun typecheck clean.

    Note: #750 and #756 are independent PRs for the same issue (timeout-only). #757 adds the hot-loop reduction on top of the same 180s budget; happy to consolidate on whichever you prefer, and I did not touch the others.

  14. dezren39 commented on Oct 28, 2026

    @dezren39
    Author

    🤖 Agent note · done, PR #757 merged

  15. removed
    status/parkedDeliberately paused with a recorded resume condition
    queue/parkedQueue task is parked (waiting on CI, time, or an event)
    work/assignedAn agent holds this item via the queue (claimed task)
    on Oct 28, 2026
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/ciCI, workflows, and build infrastructureeffort/sSmall: expected under 2 hours of workkind/bugSomething isn't working (prefixed form of the classic bug label)meta/enrichedIntake review done: acceptance criteria, links, and normalized labels addedpriority/lowNice to have; do when convenientsource/humanFiled directly by a humanstatus:donetask/small-fixQueue packet kind: bounded fix with reproduction and targeted tests

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions