Skip to content

ci: re-census and justify real-time test waits added since the #1849 wait inventory #3332

Open

Description

@schlessera

Problem

Epic #1849's definition of done requires every real-time wait to be justified. The inventory that satisfied this was taken at 5dc2595c. The #2763 audit (#1849 (comment)) found 197 files with wait calls added after it. The maintainer ruled on 2026-11-02 (Q2, option B) that the requirement is a standing one, so the later waits must be censused and classified before #1849 closes.

Acceptance criteria

  • Re-run the ci: audit the test-cost epic's coverage and performance acceptance #2763 wait census at a current main SHA and record the SHA and the command used.
  • Classify every wait in the 197 files, and in any added since, as justified (real-time behaviour under test, with the reason stated in or next to the test) or replaceable.
  • Replace each replaceable wait with a deterministic signal: an event, a fake clock or a condition. Never raise a timeout. The work lands in reviewable slices, with mutation receipts where a replacement removes a race.
  • Record the census output on archive/measurements next to the ci: audit the test-cost epic's coverage and performance acceptance #2763 audit data.
  • Out of scope: a standing guard that requires attribution for new waits. That was option C, which was not chosen and needs its own ruling.

Refs #1849, #2763.

Activity

  1. added
    type: choreTooling, CI, release plumbing, dependencies.
    area: ciCI workflows, the gates they run, release scripts, packaging.
    priority: p2Wanted, not scheduled. Pulled in when a milestone has room.
    agent-readyContext and acceptance criteria are complete enough for an agent to take this unattended.
    on Nov 2, 2026
  2. self-assigned this
    on Nov 2, 2026
  3. schlessera commented on Nov 2, 2026

    @schlessera
    OwnerAuthor

    Claimed (token wc3332-7f1e). Branch test/3332-census-realtime-waits from epic/1849-test-cost at 3bee06dce. This PR covers the re-census at current main, the per-line classification (archived on archive/measurements) and a first replacement slice in packages/ui-server/tests/private-index-cache.test.ts. Later slices follow in separate PRs. Collision check on the cited paths: no path collisions. There are closure-only overlaps in the ui-server workspace with open PRs (#3059, #3069, #3292, #3293, #3295, #3305, #3309, #3310, #3312, #3316, #3317, #3319, #3320, #3325, #3328, #3335, #3336, #3338, #3342, #3343, #3345, #3352).

  4. added this to the 0.45.0 milestone on Nov 2, 2026
  5. schlessera commented on Nov 2, 2026

    @schlessera
    OwnerAuthor

    Slice 1 is open as #3362 against epic/1849-test-cost (head bfb26af8ecbe, base 3bee06dce) and is marked ready. Its hosted proof is CI run 41525551038.

    • Census: taken at main 3984040f199cbadbee6e4ce3f1beff816b68dc36 with the test-waits.md expression. In scope are 604 lines in 204 files: the 197 files ci: audit the test-cost epic's coverage and performance acceptance #2763 listed plus 7 newer ones. The rule-based classification gives 374 justified, 89 replaceable and 142 not a wait. It is archived at a13f2247a on archive/measurements.
    • Slice 1: private-index-cache.test.ts now uses its existing clock and readiness signals. The six changed cases drop from 1.362 s to 0.050 s, with five mutation receipts in the PR.
    • Remaining: 83 replaceable rows in 45 files, in five slices listed in the PR. A sixth slice covers the negative observations: 84 rows, of which 71 in 38 files have no reason stated in source.

    This issue stays open (the PR uses Refs) until the epic batch lands on main and every slice is done.

  6. schlessera commented on Nov 2, 2026

    @schlessera
    OwnerAuthor

    Slice 1 (census, classification and the private-index-cache replacements) delivered to epic/1849-test-cost as f61599e6b via #3362. The remaining slices listed in #3362 stay open under this issue. Releasing the claim so the next slice can pick it up.

  7. schlessera commented on Nov 2, 2026

    @schlessera
    OwnerAuthor

    Claimed (token wc3332-u2b9) for the next slices from #3362: reference-source/reference-tools and the other ui-server unit files, then ui-sdk/backends/geo and root tests if they fit. Branch test/3332-unit-wait-slices from epic/1849-test-cost at f61599e6b.

  8. schlessera commented on Nov 2, 2026

    @schlessera
    OwnerAuthor

    Slices 1 (reference-source/reference-tools) and 3 (the other ui-server unit files) are open as #3395 against epic/1849-test-cost (head 910eee3f5c9b, base f61599e6b), marked ready; its hosted proof is CI run 41547783884.

    • The changed cases drop from 5.54 s to 3.76 s (median of 3 runs). The PR records eleven mutation receipts.
    • Re-reading reclassified 11 rows: some are justified, some are negative observations for slice 6, and one is not a wait. One row stays replaceable: private-index 176 fails on the untouched base on the local host, so a replacement couldn't be shown green there.
    • Remaining:

    This issue stays open under Refs.

  9. 7 remaining items

  10. schlessera commented on Nov 3, 2026

    @schlessera
    OwnerAuthor

    Slices 4 and 5 delivered to epic/1849-test-cost as 42b4e81f1 via #3440. Still open: slice 2 (browser/layout), the private-index 176 residue, and slice 6 (negative observations), as listed in #3440.

  11. schlessera commented on Nov 3, 2026

    @schlessera
    OwnerAuthor

    Claimed (token wc3332-s6n) for slice 6 (negative observations) from #3440. Branch test/3332-negative-observations from epic/1849-test-cost at 42b4e81f1. Browser/layout rows stay with slice 2.

  12. schlessera commented on Nov 3, 2026

    @schlessera
    OwnerAuthor

    Slice 6 (negative observations), ui-server part plus the six reclassified windows, is open as #3463 against epic/1849-test-cost (head c857a2b7f, base 42b4e81f1), marked ready; hosted proof is CI run 41625311098.

    • 28 census windows, plus storage-scan-offloop 272, now use deterministic signals: write-worker hold replies, a held step then one macrotask, ordered timer/socket markers. 17 keep their wait with the reason in source (10 of them are failure maxima). The 5 other reclassified windows state why a window is the only observable. Every replacement has a mutation receipt in the PR. No timeout changed; proof-system classify: not a proof-system change.
    • Still open in slice 6: 16 non-browser rows outside ui-server (Claude worker-event-loop, Pi early-cancel-lifecycle/worker-stdio-release, ui-react untrusted-marks-runtime, ui-sdk identity-broker-qualification.native/worker-steps-event-loop, root build-concurrency/test-invocation-lifetime). The 5 browser/layout rows stay with slice 2.
  13. schlessera commented on Nov 3, 2026

    @schlessera
    OwnerAuthor

    Claimed (token wc3332-s6r) for the rest of slice 6 (negative observations) outside ui-server, as listed in #3463: Claude worker-event-loop, Pi early-cancel-lifecycle/worker-stdio-release, ui-react untrusted-marks-runtime, ui-sdk identity-broker-qualification.native/worker-steps-event-loop, root build-concurrency/test-invocation-lifetime. Branch test/3332-negative-observations-rest from epic/1849-test-cost at 42b4e81f1. Path collisions: #3439 edits test-invocation-lifetime (kept off its lines); #3426, #3446, #3448 and #3463 edit docs/process/test-waits.md, which this slice leaves alone.

  14. schlessera commented on Nov 3, 2026

    @schlessera
    OwnerAuthor

    The rest of slice 6 (non-ui-server negative observations) is open as #3469 against epic/1849-test-cost (head e658129d7ca8, base 42b4e81f1), marked ready. Its hosted proof is CI run 41633660429.

    • 4 windows now use deterministic signals: Claude worker-event-loop 135, Pi worker-stdio-release 113, and ui-sdk worker-steps-event-loop 139 and 180. Each has a mutation receipt in the PR.
    • 11 keep their wait, with the reason now stated in source: Claude 115, Pi 215 and 67, ui-sdk identity qualification 494/497/519/540, worker-steps-event-loop 136 and 595, build-concurrency 80 and test-invocation-lifetime 205. build-concurrency 80 now opens its window only after the failing compiler has exited.
    • No timeout changed. proof-system classify: not a proof-system change.
    • Still open:
  15. schlessera commented on Nov 3, 2026

    @schlessera
    OwnerAuthor

    Slice 6 (the ui-server part) delivered to epic/1849-test-cost as 429804d3e via #3463. The rest is listed in #3469 and #3463.

  16. schlessera commented on Nov 3, 2026

    @schlessera
    OwnerAuthor

    Claimed (token wc3332-s2b) for slice 2 (browser and layout): the 25 replaceable rows listed in #3362, the five browser/layout negative windows from #3463 (conversation-consent, conversation-controls, storage-guidance.layout, transcript-qualifiers ×2), and ui-react untrusted-marks-runtime 406 from #3469. Branch test/3332-browser-layout-waits from epic/1849-test-cost at 429804d3e, with origin/main (d142e997b) merged in so the branch carries untrusted-marks-runtime.test.ts. Path collisions: #3054, #3056, #3059 and #3069 (drafts) edit conversation.offline.tsx; #3426, #3446 and #3448 edit docs/process/test-waits.md. This slice keeps off #3469's files.

  17. schlessera commented on Nov 3, 2026

    @schlessera
    OwnerAuthor

    Pointer from #3475 (PR #3480, targeting epic/1849-test-cost): packages/ui-react/tests/browser/recordings.offline.tsx has the same pattern, expect.poll with the default 1 s timeout waiting on native committed events, at lines 63, 165, 228, 288, 560 and 580. #3480 adds recordingCell(ctx).committed(n), an event-based wait, which these could use once it lands. They are left for this census, so I haven't changed them.

  18. schlessera commented on Nov 3, 2026

    @schlessera
    OwnerAuthor

    Slice 2 (browser and layout) is open as #3487 against epic/1849-test-cost (head f747c34e8, base fce827eba) and is marked ready. Hosted proof: CI run 41652100147.

    • Deterministic signals replace the waits in share-review (12 rows: admission decided through native lock-request settlement, scan-input checks, the dismiss queue, the flushed lost response), storage-guidance.layout (3), transcript-qualifiers (2), the conversation-controls reply gap, conversation-endpoint, conversation-consent and conversation.offline. Kept, with the reason now in source: recording-limits starvation and the dialogue/contextual fixture drains. Reclassified as justified: hygiene-lifecycle-command 234, storage-server-command 39 and liveness-clock 53. Mutation receipts are in the PR. No timeout changed. proof-system classify: not a proof-system change.
    • Still open:
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

agent-readyContext and acceptance criteria are complete enough for an agent to take this unattended.area: ciCI workflows, the gates they run, release scripts, packaging.priority: p2Wanted, not scheduled. Pulled in when a milestone has room.type: choreTooling, CI, release plumbing, dependencies.

Projects

No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions