AI Unified Process core - stack-agnostic requirements, entity model, and use cases
90
92%
Does it follow best practices?
Impact
90%
1.16xAverage score across 14 eval scenarios
Low
Low-risk findings worth noting
The checks below need understanding, so spec_lint.py cannot make them. Each one says what to look for, where, and
how to tell a finding from a false alarm. Severity is warning when the defect will make the implementation or the
tests wrong, and info when it only makes the specification harder to read or maintain. Never error.
Where: business rules across all use cases; rules against the Main Success Scenario and alternative flows of
their own use case; rules against NFRs and constraints in requirements.md.
Two statements contradict when no system can satisfy both for the same input: different limits for the same quantity (6 vs 12 months, 18 vs 21 years), a state one use case allows and another forbids, an alternative flow that ends where a rule says the use case must continue. Different rules for different actors or states are not a contradiction — check the conditions before reporting.
Report the finding on the later of the two rules and name the other one (UC-009 BR-001). Severity: warning.
Where: business rules across use cases.
The same rule written differently in two places drifts apart with the next change. The lint catches identical text
(BR_DUPLICATE); you catch the paraphrase — same condition, same consequence, different wording. The fix is to keep
the rule in the use case that owns the data and cite it elsewhere as UC-xxx BR-yyy. Severity: warning when the
two wordings could be read differently, info when they are equivalent.
Where: steps, alternative flows, and business rules of a use case.
A use case states what the actor and the system achieve, not how the screen looks or how the data is stored:
Naming the business action ("Clerk confirms the booking") is fine; naming a button label the business insists on is
fine when the specification says so. validate_use_case.py already flags a fixed list of protocol terms
(TECHNICAL_TERM); report what that list misses. Severity: info, warning when the detail constrains the
implementation in a way nobody decided.
Where, too: the use case as a whole — its name in docs/use_cases.puml, its goal, and its Main Success
Scenario.
Every use case should be a user goal: ask is this use case a complete goal that the primary actor would recognize as valuable? Report a use case that fails the question:
docs/processes/.A subfunction the diagram draws as an <<include>> from several use cases is intended; do not report it. Severity:
warning for a technical step modeled as a use case of its own, info otherwise. The fix belongs to
/use-case-diagram.
Where: the Main Success Scenario, alternative flows, and postconditions.
(step N))**Trigger:**, or its last step and the success postconditions do not achieve what the Overview **Goal:**
promises (the goal says "books a room", the scenario ends when the availability is shown)Severity: warning.
Where: business rules, postconditions, and requirement rows the use case references.
A rule is testable when a test can set up the input and decide pass or fail from what the system shows or stores.
Untestable: "the system handles large volumes", "data is kept secure", "the user is informed in time". Suggest the
measurable version (a number, a limit, an observable message). Severity: warning.
Then judge the use case as a whole as the basis for /test-case and the test skills: every path — the main success
scenario and each alternative flow — must end in a result a test can observe (a success postcondition, a failure
guarantee, or the step where the flow continues), and every business rule must have a path that exercises it. Report
a path that ends without an observable result, or a rule no path reaches, once per use case rather than per step.
Severity: warning.
Where: everywhere.
glossary.md nor explained where it
is used; the same thing called by two names across documentsWeak words from the fixed list are the lint's job (WEAK_WORD); report what the list cannot catch. Severity:
info, warning when the two readings lead to different behavior.
Where: steps, rules, and postconditions against docs/entity_model.md.
Specifications name data in business words, so judge from context, not from spelling: "the guest's email" matches
GUEST.email; "the booking" matches RESERVATION when the model has no other candidate. Report:
Not Null; a rule
lists four statuses, the model's Values: lists three)Skip this check when there is no entity model. Severity: warning.
Where: the Overview's **Trigger:** line (German: **Auslösendes Ereignis:**) and the Preconditions of each use
case.
The trigger is the event that starts the use case — an actor's request, a point in time, a message from an external system. A precondition is a state that is already true and that the use case does not check again. Ask "when does this happen?": an event has a moment, a state does not. Report:
A missing trigger line is info (older documents have none; /use-case-spec writes it for new ones). The validator
already flags an empty trigger, a (step N) in it, and a trigger that copies a precondition verbatim; report what
needs judgment. Severity: warning for a state written as a trigger, an event written as a precondition, or a
precondition the use case evaluates itself, info otherwise.
Where: the Overview's **Primary Actor:** and **Secondary Actors:** lines against the steps, the alternative
flows, docs/use_cases.puml, and the roles in requirements.md and glossary.md.
A use case may have several primary actors, listed comma-separated: roles that can each start the use case on their own and pursue the same goal through the same main success scenario. Report:
**Secondary Actors:**Severity: warning for "System" as a primary actor, for roles that pursue different goals, and for an external system
missing from the actors (an implementation may build it instead of integrating it); info otherwise. The fix for the
diagram belongs to /use-case-diagram.
Where: the **Requirements:** line of each use case against the NFR-* and C-* rows of requirements.md.
The lint checks that every listed id exists and that every FR is covered; it cannot tell whether a use case forgot a quality attribute or a constraint that applies to it. Compare by topic: a response-time NFR for searches and a use case whose main step is a search; a data-protection NFR and a use case that records personal data; a constraint that names an external system and the use case that calls it. Report an NFR or a constraint that clearly applies but is not listed, and name the id.
This is also where UI, API, and technical detail that a use case must respect belongs: a use case does not describe it in its steps (see §3) but references the NFR or constraint that states it. Report detail in a step that should be an NFR or a constraint instead.
Skip this check when there is no requirements.md or it has no NFRs and constraints. Severity: info, warning
when the missing NFR or constraint sets a limit a test would check (a response time, a maximum, a mandatory system).