requirement-to-tlaplus-property-generator — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited requirement-to-tlaplus-property-generator (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
This skill transforms natural-language requirements into formal TLA+ properties, enabling rigorous verification of system specifications. It handles invariants, safety properties, and liveness properties, resolving ambiguities and seeking clarification when needed.
Parse and understand the input requirement:
When ambiguities are detected, use one of these strategies:
Strategy A: Reasonable Interpretation If the ambiguity has a standard interpretation in the domain, resolve it automatically and document the assumption.
Example:
Strategy B: Ask Clarifying Questions For critical or non-obvious ambiguities, ask the user:
See references/clarification_patterns.md for common question templates.
Translate the requirement into TLA+ syntax:
Invariants (Type Invariant or State Predicate):
TypeOK == /\ var1 \in ValidSet1
/\ var2 \in ValidSet2
/\ condition
StateInvariant == predicate_over_state_variablesSafety Properties (Always):
Safety == []P \* P holds in all reachable statesLiveness Properties (Eventually):
Liveness == <>P \* P eventually holds
Liveness2 == [](P => <>Q) \* If P holds, Q eventually holdsFairness:
Fairness == WF_vars(Action) \* Weak fairness
Fairness2 == SF_vars(Action) \* Strong fairnessSee references/tlaplus_syntax.md for comprehensive syntax reference.
Create the complete property definition:
Example output:
\* Property: Buffer never overflows
\* Requirement: "The system must ensure the buffer size never exceeds capacity"
\* Type: Safety (Invariant)
BufferSafety == buffer_size <= MAX_BUFFER_SIZE
\* Add to specification:
\* Spec == Init /\ [][Next]_vars /\ BufferSafetyExplain what the property means:
Requirement: "At most one process can be in the critical section"
TLA+ Property:
MutualExclusion ==
\A p1, p2 \in Processes :
(p1 # p2) => ~(pc[p1] = "critical" /\ pc[p2] = "critical")Requirement: "Every request is eventually served"
TLA+ Property:
EventualService ==
\A req \in Requests :
(req.status = "pending") ~> (req.status = "completed")Requirement: "The system responds within N steps"
TLA+ Property:
\* Note: TLA+ doesn't directly express bounded liveness
\* Use auxiliary counter variable
BoundedResponse ==
[](request_made => <>(response_sent \/ timeout_counter > N))Requirement: "Event A must occur before event B"
TLA+ Property:
OrderingConstraint ==
[](event_B_occurred => event_A_occurred_before)See references/requirement_patterns.md for more patterns.
Break down complex requirements into multiple properties:
Requirement: "The system must process requests in FIFO order and complete each within 10 steps"
Decomposition:
Use implication for conditional properties:
Requirement: "If the system is in safe mode, no writes are allowed"
TLA+ Property:
SafeModeConstraint == [](safe_mode => ~write_enabled)Use TLA+ quantifiers appropriately:
Requirement: "All active processes eventually terminate"
TLA+ Property:
AllTerminate ==
\A p \in Processes :
(status[p] = "active") ~> (status[p] = "terminated")Pitfall 1: Confusing safety and liveness
Pitfall 2: Unbounded liveness without fairness
Pitfall 3: Over-specification
Pitfall 4: Implicit state assumptions
For each requirement, provide:
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.