/

CrowdVision · source-available, not open source · © 2026 Nicolò Ghignatti

Acceptance Criteria

Contracts, not implementation: each entry is a Given/When/Then pre/postcondition, with no test framework, runner, or service named. Numbers are asserted here, never invented — each one is the target owned by the matching Quality Attribute Scenario. Every criterion below traces to something the story actually says; a criterion that tests a different story’s concern (tenancy scoping) or a different environment (peak load) is kept separate rather than folded in.

Where each contract is checked in code — and how it is measured, including what the measurement does not cover — is kept out of the criteria themselves and collected in Verification at the end of the page, so a criterion never has to change when a test file moves.


BT-1 — digital twin provisioning

Performance

Target owned by QA-P-03.

Behavior under a burst — redelivery, a dying worker, backlog drain — is QA-P-04’s concern, not this story’s: it describes a different environment than BT-1 was written for, and belongs entirely on the Quality Attributes page.


LD-4 — live dashboard freshness

Performance

Target owned by QA-P-01.


Verification

Both stories’ performance criteria are implemented and asserted as numbers, not described. The functional criteria around them are covered too, with the two exceptions named below. Paths are repository-relative.

BT-1 — where

Suite: backend/digital-twin/tests/. Cucumber features in tests/features/, their steps in tests/steps/, endpoint-level tests in tests/api/. Runner just test twin-integration — real MongoDB on a shared Docker network, no mocks at the boundary. CI runs it on every digital-twin change (tpl-rust-ci.ymlscripts/test/rust-integration-tests.sh).

Not yet asserted. Two clauses of the first criterion have no check behind them: that each room carries the position and dimensions the uploaded description declared (tests/api/rooms.rs covers geometry on the room-update endpoint, not on the provisioning path), and that the twin is editable straight after provisioning (tests/steps/load.rs, every_twin_available, only confirms that availability was tracked). “Nothing is left pending” after a refusal is likewise unchecked against the pending_uploads queue.

BT-1 — how the performance criterion is measured

tests/features/load.feature with tests/steps/load.rs. 100 Domain Administrators upload concurrently, once for a 20-room building and once for a 200-room one — both sizes inside QA-P-03’s stated envelope.

LD-4 — where

Suite: backend/acceptance/acceptance/ld4_dashboard_freshness/, pytest against a composed stack (telemetry, socket, dashboard and their infra), started by backend/acceptance/run-integration-tests.sh behind just test integration.

Not yet asserted. That the UI itself repaints on reconnect — proving it needs a real browser, out of this suite’s scope. Separately, this suite has no CI job: it runs only on demand via just test integration.

LD-4 — how the performance criterion is measured

test_performance.py. 100 round trips across 20 threads, each with its own room, dashboard subscription and socket connection.