AI Unified Process core - stack-agnostic requirements, entity model, and use cases, plus the construction orchestrators for layer plugins
95%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
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 (or its module diagram), 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/ with /business-process.
Do not report a "Manage " use case in which one actor adds, changes, and removes one business
object in one sitting (Manage Catalog): that CRUD use case is a user goal.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))_None — the use case changes no data._ instead; a
guarantee such as "the catalog is unchanged" there is info, a placeholder in a use case that writes is warning**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)A use case without a **Mockup:** line is not incomplete: the line is optional, and the mockup is layout input for
the UI layer skills, never part of the specification this checklist reviews. The same holds for a use case without
an **API:** line: the agreed API contract is input for the API layer skills, and field names, paths, and status
codes belong in the contract, not in the steps.
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 and its module files.
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 (or the module diagram), 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:**ACTOR_MISMATCH; review only which side is right (a renamed role, a missing link, or a
role that should not take part)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).
Where: the Accepted ADRs (ADR-*.md under a decisions/, adr/, or adrs/ folder) against each other and against the NFR-* and C-* rows of
requirements.md.
The lint checks that every ADR links an NFR or a constraint, that the links resolve, and that a supersession is
recorded on both sides; it cannot tell whether the decisions agree. Report two Accepted ADRs that cannot both hold
(one decides server-side sessions, another keeps the session in the browser) and name both; an Accepted ADR whose
Decision breaks a constraint it does not link (a decision for MySQL next to C-002 System must use PostgreSQL 16); an
ADR whose Consequences put the threshold of an NFR at risk without saying how it is still met; and an ADR that links
an NFR or constraint its Context and Decision never address — a link added to silence the lint.
Skip this check when the project has no ADRs. Severity: warning for two contradicting Accepted ADRs and for a
broken constraint, info otherwise. The fix is /architecture-decision (supersede, or add the link) or
/requirements when the constraint itself has to change.
.tessl-plugin
skills
acceptance-protocol
references
business-process
entity-model
references
next
open-questions
references
release-notes
references
requirements
reverse-engineer
spec-review
stack
references
test-case
test-case-coverage
test-case-implement
use-case-coverage
use-case-diagram
references
use-case-implement
references
use-case-spec
use-case-test
references
user-guide