Domain Model
fushinryu-model is built around four entity types that form a containment hierarchy.
graph TD
S[Scope] -->|contains| US[UserStory]
US -->|contains| AC[AcceptanceCriterion]
AC -->|contains| V[ValidationEntry\nManualValidation · AutomatedValidation]
Scope
A Scope is the top-level organisational unit. It groups related UserStory instances under a named, identifiable container. Scopes can declare parent scopes, forming a directed acyclic graph (DAG) that supports inheritance — see Scope Hierarchy.
Key constraints
idmust follow programming identifier rules: start with a letter or_letter, followed by letters, digits, or underscores.- User story
idvalues must be unique within a scope.
UserStory
A UserStory captures a high-level requirement from the perspective of a role using the classic As a / I want / so that structure, stored as who, what, and why fields.
Stories are classified as either functional or technical via the UserStoryType enum.
Key constraints
- Acceptance criterion
idvalues must be unique within a story. - A story is considered validated (
is_validated = True) only when it is active, has at least one active acceptance criterion, and all active criteria are validated.
AcceptanceCriterion
An AcceptanceCriterion encodes the Given / When / Then structure of a testable condition.
| Field | Required | Description |
|---|---|---|
id |
yes | Integer, unique within the enclosing story |
then |
yes | The expected outcome |
given |
no | Initial context or state |
when |
no | Trigger condition |
A criterion is validated (is_validated = True) when its validations set is non-empty and every record has passed=True.
ValidationEntry
Validation evidence is stored as a discriminated union of two frozen record types.
ManualValidation
Recorded by a human reviewer. Requires a verdict string explaining why the criterion passed or failed.
AutomatedValidation
Linked to an automated test or check. Identified by source (the file or module) and name (the test name). During merges, automated validations are deduplicated by (source, name), keeping the most recent timestamp.
The active flag
All three entity types carry an active: bool field (default True). Setting it to False performs a soft deletion — the entity is retained in the data but excluded from validation checks. An inactive UserStory implicitly deactivates all its acceptance criteria for validation purposes, regardless of their individual active values.