Files
alkstore/tasks/suite-harness-current-thread.md
T
glm-5.3-flash 6f9cfb5778 suite: async past_stamp_sleep for current-thread flavor readiness
Replace the harness's blocking std::thread::sleep with tokio::time::sleep
across all nine call sites, note the no-blocking-calls-inside-rows posture
in the helper's doc comment, and mark the task completed. Both engines'
contract suites re-run green with assertions and tolerances unchanged
(ADR-024 \u00a75 item 4).
2026-10-10 11:11:09 +00:00

3.5 KiB

id, name, status, depends_on, scope, risk, impact, level, tags
id name status depends_on scope risk impact level tags
suite-harness-current-thread Contract-suite harness — async sleep in `past_stamp_sleep`, current-thread flavor readiness completed
narrow low component implementation
wave-6
contract-suite

Description

The one suite-side change wave 6 carries (ADR-024 §5 item 4; the review-003 posture note at properties.rs:1683): the suite's past_stamp_sleep helper uses a blocking std::thread::sleep inside async rows — safe under the multi-thread test flavors both existing engines' targets use, but it would stall a current-thread runtime. The mem engine's suite column must run under a current-thread flavor (#[tokio::test(flavor = "current_thread")]) to keep the mem engine's internals honestly current-thread-clean — which is what wasm32 needs.

  • Replace past_stamp_sleep's blocking sleep with tokio::time::sleep (async). The helper's semantics are unchanged (a bounded pre-run_at settle before reads); the existing rows' determinism posture is untouched — verify the two legs using it re-run green on both engines with no timing drift (tolerances unchanged).
  • Document (one line in the helper's doc comment or the factory contract notes) the harness posture: no blocking calls inside suite rows — the mem column enforces the flavor that catches violations.

This task is engine-independent and can run any time before mem-engine-integration wires the third column.

Acceptance Criteria

  • past_stamp_sleep is async (tokio::time::sleep)
  • Both engines' existing suites re-run green with identical assertions and tolerances (determinism posture intact)
  • The no-blocking-calls posture noted where the harness's determinism posture is documented
  • Clippy -D warnings, fmt clean; workspace gates green

References

  • docs/architecture/decisions/024-mem-engine.md §5
  • docs/reviews/003-wave-5-general-review.md §Finding 5 (the properties.rs:1683 posture note)
  • docs/architecture/decisions/022-contract-suite-layout.md (the factory contract the flavor rides)

Notes

  • The posture note went into past_stamp_sleep's doc comment rather than the factory contract notes: the posture is a harness rule about row internals (what a row may call), not part of the StoreFactory shape, and the doc comment sits exactly where a row author reaches for a sleep. The comment cites ADR-024 §5 for the current-thread flavor that enforces it.
  • Five rows exercise the helper across its two use shapes (the lapse-settle legs and the scheduler runner-less-pause leg): lock_ttl_expiry_and_reacquisition, job_handle_validity_predicate, queue_depth_reclaim_and_dead_letter, sweep_no_stranded_rows, scheduler_bounded_catchup. All nine call sites gained .await; assertions and tolerances untouched.

Summary

past_stamp_sleep now awaits tokio::time::sleep instead of blocking on std::thread::sleep (alkstore-contract-suite/src/properties.rs), making every suite row current-thread-safe for the mem engine's #[tokio::test(flavor = "current_thread")] column (ADR-024 §5 item 4); the doc comment records the no-blocking-calls-inside-rows posture. Both engines' contract_suite re-ran fully green (25/25 each, SQLite 15.0 s / Postgres 21.3 s — no timing drift, tolerances unchanged); the full workspace build, tests, clippy -D warnings, and fmt --check pass. PostgreSQL leg ran against the POC container (pglo-poc, port 15432, creds per docs/reviews/003 §env note).