Learning path

Concurrency

Grounded in flowbase/apps/frontend/e2e — 233 Playwright specs, currently scattered-flaky.

Assessed 2026-08-24 · A1 completed 2026-08-25 · MISSION.md · RESOURCES.md

Knowledge graph

Green = mastered. Amber = inner fringe (just learnt, still fragile — A1). Blue = outer fringe / zone of proximal development, lessons written and ready. Grey = locked. Click a node to open its lesson.

graph TD
  A[Async/await mechanics]:::got
  B[Playwright auto-waiting
web-first assertions]:::got C[Locator strategy]:::got D[Worker model:
process per worker]:::got E[Flake taxonomy:
async wait / concurrency / TOD]:::inner F[Symptom-first diagnosis]:::inner G[Retry policy as signal]:::inner H[The isolation ladder]:::zpd I[Fixture scope as a
sharing decision]:::zpd J[Collision surface audit:
what is actually shared]:::zpd K[Per-tenant test isolation]:::locked L[Serialisation primitives:
serial / mutex / lease]:::locked M[Cleanup contracts &
failure-safe teardown]:::locked N[Convergent assertions over
shared collections]:::locked O[Flake budgets & quarantine]:::locked A --> B --> C B --> E D --> J E --> F --> G E --> H E --> J D --> I H --> I H --> J H --> K H --> L J --> M J --> N G --> O click E "lessons/a1-naming-the-flake.html" "A1" click F "lessons/a1-naming-the-flake.html" "A1" click G "lessons/a1-naming-the-flake.html" "A1" click H "lessons/a2-the-isolation-ladder.html" "A2" click J "lessons/a3-collision-surface-audit.html" "A3" click I "lessons/a4-fixture-scope.html" "A4" classDef got fill:#dcfce7,stroke:#16a34a,color:#14532d classDef inner fill:#fed7aa,stroke:#ea580c,color:#7c2d12,stroke-width:2px classDef zpd fill:#dbeafe,stroke:#2563eb,color:#1e3a8a,stroke-width:3px classDef locked fill:#f5f5f4,stroke:#a8a29e,color:#78716c

Assessment · 2026-08-24

ProbeResult
Q1 · slow vs. racyPartial. Defined racy purely as inter-test contention. Missing: a solo test can race the application's own asynchrony. Conflates the ~45% category with the ~20% one.
Q2 · worker collision surfacePartial. Strong on the system under test. Correct instinct that separate processes share little memory. Missed the on-disk and cross-cutting surfaces: storageState, seed artefacts, ports, output dirs.
Q3 · await expect placementCorrect and precise. Named the polling distinction unprompted. Treated as mastered.
Q4 · retry legitimacyHealthy instinct, absolutist. "Never acceptable" is right about retry-as-fix, misses retry-as-instrument (counted, budgeted, ratcheted). Refined in A1 §6.
Q5 · isolation strategiesBlank — the clearest gap. Produced two of six-ish rungs and no cost analysis. This defines the ZPD.

Suite findings feeding the path

Lessons

A1 · inner fringe · completed 2026-08-25
Naming the Flake

Taxonomy, glossary, symptom-first diagnosis, retry policy. Ends with your suite classified.

Covers: E · F · G

A2 · outer fringe · ready · start here
The Isolation Ladder

Seven rungs from share-everything to a tenant per test, priced. A rung per resource, not per suite. Places your six main resources on it.

Covers: H · closes the Q5 blank

A3 · outer fringe · ready
The Collision Surface Audit

Four questions, seven layers. The procedure that catches the non-database surfaces — auth artefacts, filesystem, ports, background jobs. Applied to this repo.

Covers: J · closes the Q2 gap

A4 · outer fringe · ready
Fixture Scope Is a Sharing Decision

Run / worker / test / ambient scope as blast radius. Scope contagion, the three teardown failures, and your suite's scope map.

Covers: I

B-block · locked until A2–A4 land
Per-tenant isolation · serialisation primitives · cleanup contracts · convergent assertions · flake budgets

K, L, M, N, O. Pick which after A2–A4.

Findings surfaced while writing A2–A4

Read from the suite; each is used as a worked example in the lesson noted.

Teaching preferences