Essential session storage is required to sign in. Optional analytics remain off unless you allow them.
Build a Scala application that does real concurrent or effectful work (a web scraper/aggregator, a small API client, a job runner). Requirements: (1) model the domain with case classes + sealed ADTs and pattern matching; (2) do concurrent I/O either with FUTURES (composed via map/flatMap/for + recover, an ExecutionContext in scope — no Await in the hot path) OR with an EFFECT SYSTEM (Cats Effect IO / ZIO) that describes effects as values run at the edge; (3) handle errors functionally with Either/Try (no swallowed exceptions); (4) use the type system for safety — an opaque type or a sealed error ADT; (5) a test suite (ScalaTest/munit, plus a ScalaCheck property where it fits); (6) an sbt build with pinned dependencies. Document your concurrency choice (Future vs effect system) and why.
Correct concurrent I/O via composed Futures (with an ExecutionContext) OR an effect system (IO/ZIO) with effects run at the edge; not blocking by default.
case-class/sealed-ADT modeling + pattern matching; functional error handling with Either/Try; an opaque type or sealed error ADT for safety.
ScalaTest/munit (a ScalaCheck property where it fits); an sbt build with pinned dependencies; the concurrency choice documented.
Use this README structure to make the work reviewable.
DevPath fetches a read-only, size-capped snapshot. Submitted code is never executed.
# A concurrent, effectful Scala application ## Goal Build a Scala application that does real concurrent or effectful work (a web scraper/aggregator, a small API client, a job runner). Requirements: (1) model the domain with case classes + sealed ADTs and pattern matching; (2) do concurrent I/O either with FUTURES (composed via map/flatMap/for + recover, an ExecutionContext in scope — no Await in the hot path) OR with an EFFECT SYSTEM (Cats Effect IO / ZIO) that describes effects as values run at the edge; (3) handle errors functionally with Either/Try (no swallowed exceptions); (4) use the type system for safety — an opaque type or a sealed error ADT; (5) a test suite (ScalaTest/munit, plus a ScalaCheck property where it fits); (6) an sbt build with pinned dependencies. Document your concurrency choice (Future vs effect system) and why. ## Acceptance criteria - [ ] Concurrency & effects: Correct concurrent I/O via composed Futures (with an ExecutionContext) OR an effect system (IO/ZIO) with effects run at the edge; not blocking by default. - [ ] Types & error handling: case-class/sealed-ADT modeling + pattern matching; functional error handling with Either/Try; an opaque type or sealed error ADT for safety. - [ ] Tests & build: ScalaTest/munit (a ScalaCheck property where it fits); an sbt build with pinned dependencies; the concurrency choice documented. ## Verification - [ ] Document installation and run commands. - [ ] Record automated checks and their exact commands. - [ ] Add representative output, screenshots, or a short demo where useful. - [ ] Confirm failure paths and known constraints. ## Decision log ### Decision title - Context: - Choice: - Alternatives considered: - Tradeoffs: ## Evidence - Link each rubric criterion to the file, test, or artifact that demonstrates it. ## Known limitations - List what is intentionally out of scope and what should be improved next.