/

Developer Guide

Quality Attributes

Quality Attributes are the measurable how well — as opposed to the Non-Functional Requirements, which are binary must/must-not constraints. Each is written as a Quality Attribute Scenario: a six-part structure — Source of stimulus, Stimulus, Artifact, Environment, Response, Response Measure — that turns a vague "-ility” into something testable.

The Response Measure is where every number lives. A scenario whose measure reads “perceived as instantaneous” is not testable, and a target duplicated onto the User Stories it grounds is a target that drifts on one of the two pages. So the stories state what must be true, this page states how well and under which envelope, and the stories link back here. Each measure below is written so a load or integration test can decide it without further interpretation.

Where a scenario measures how well an NFR constraint is satisfied, that relationship is called out rather than restated.


Performance

QA-1: Live Data Freshness

Grounded in **LD-4, AL-3. Expressed as executable acceptance criteria in Acceptance Criteria.*

The split is deliberate. The 1s boundary is the one that becomes a production SLO: it is measured entirely from server-side signals, and every hop inside it is a hop CrowdVision controls. The 5s boundary covers the last hop — the client’s network and render — which the platform cannot control and therefore must not promise in production; it is asserted in the end-to-end acceptance test instead, where the client is part of the harness and its network is a known quantity. Reporting only the inner boundary would let the dashboard stay green while a user on a degraded connection reads stale values, so both are stated, each measured where it is honest to measure it.

QA-2: Tenancy Check Latency

Grounded in **AA-5, BT-4, AI-4. This is the measurable counterpart of NFR-1, Decentralized Authorization Evaluation — that constraint is what makes this response measure achievable.*

QA-7: Building Upload

Grounded in **BT-1. Expressed as executable acceptance criteria in Acceptance Criteria.*

Validation staying synchronous, ahead of acceptance, is the load-bearing part of this scenario rather than an implementation detail. Once an upload has been acknowledged it is the system’s responsibility to complete, so anything that can be known to be impossible must be discovered before the acknowledgement is issued — otherwise a malformed description is accepted, fails in a worker minutes later, and BT-1’s edge case (the administrator learns what failed, at the moment they upload) becomes unimplementable. Structural validation is cheap and local; provisioning is neither. The boundary belongs exactly between them.

QA-8: Upload Burst

Grounded in **BT-1, under stress. Expressed as executable acceptance criteria in Acceptance Criteria.*

The invariant is what dictates the design, so it is worth being explicit about what has to be true for it to hold. Three things, together: the upload is appended durably before it is acknowledged (an acknowledgement issued ahead of the write is a promise the system cannot keep across a crash); the worker acknowledges the queue only after the twin is committed, so a worker dying mid-provision redelivers rather than silently drops; and the upload carries an idempotency key, so that redelivery reconciles onto the same building instead of creating a second one. Delivery is at-least-once — no broker offers more — and it is the idempotent write, not the transport, that makes the effect exactly-once.

Note also what this scenario does not promise. Unbounded acceptance is not achievable: the queue is finite, so a burst large enough or long enough will still be refused. What changes against a synchronous design is where that threshold sits and what a crossing means — refusal happens at durable capacity rather than at in-flight request capacity, and an upload that got past it is guaranteed, not merely likely, to be provisioned.


Availability

QA-9: Instance Loss

No user story grounds this: it is an operational quality owned by the Platform Administrator persona. It is the availability counterpart of NFR-7, which governs what a caller sees when a dependency is the thing that failed.

Not currently met, by construction. Nothing in k8s/ sets a replica count or an autoscaler, so every service runs a single instance and losing it is an outage, not a degradation. Satisfying this scenario needs replicas ≥ 2 plus a PodDisruptionBudget per service — and, for twin-service specifically, moving the rate limiter’s counters out of per-instance memory, since a limiter backed by an in-process DashMap multiplies its effective limit by the replica count.


Scalability

QA-3: Organization Growth

Grounded in **AA-7, LD-5.*


Recoverability

QA-4: Deployment Rollback

No user story grounds this: it is an operational quality owned by the Platform Administrator persona. It is the measurable counterpart of NFR-7, Graceful Degradation.


Observability

QA-5: Incident Detection & Diagnosis

No user story grounds this: it is an operational quality owned by the Platform Administrator persona, and the mechanism that satisfies it is described in Observability.


Usability

QA-6: Trustworthy Uncertainty

Grounded in **AI-2, AI-5.*