Cap time.sleep and asyncio.sleep globally at 10ms in before_all to
eliminate retry/backoff waits (tenacity wait_fixed, retry_auto_debug
exponential backoff). Save originals as time._original_sleep and
asyncio._original_sleep for tests that need real wall-clock delays
(CircuitBreaker recovery, debounce timers, validation timeouts).
Enhance template-DB patch: add "db." prefix to _SCENARIO_DB_PREFIXES
and check db_path.stat().st_size > 0 so 0-byte auto-created SQLite
files receive the template copy instead of falling through to real
migrations.
Replace subprocess.run CLI invocations with typer.testing.CliRunner
in module_coverage, main_coverage_complete, and coverage_extras step
files, eliminating ~6s Python cold-start overhead per call.
Switch plan_persistence and action_persistence to in-memory SQLite by
default; only cross-restart scenarios use file-based via an explicit
Given step.
Replace MigrationRunner.run_migrations with Base.metadata.create_all
in plan_service_steps for freshly created in-memory engines.
Removed leftover debug comment in environment.py.
Total tier runtime: 565s -> 21s (96% reduction), 20 features all
under 5s behave-internal time.
ISSUES CLOSED: #480
Three issues prevented the behave suite from running:
1. plan_persistence_steps.py and plan_repository_steps.py both defined
@then('the retrieved plan description should be "..."'), causing an
AmbiguousStep error that broke all ~50 feature files. Renamed the
persistence step to "the persisted plan description should be".
2. The three-level hierarchy scenario used plan IDs containing O, I,
and L which are excluded from the ULID charset. Replaced with valid
characters (O->0, I->0, L->K).
3. resource_repository_steps.py flushed but never committed the edge
row, so the delete method's separate session could not see it.