Skip to content

Commit c25d728

Browse files
committed
TLAi linter: Check consistency of natural language comments and TLA+ formulas.
[Build] Signed-off-by: Markus Alexander Kuppe <[email protected]>
1 parent 7bd4889 commit c25d728

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed

.github/scripts/TLAi-linter.genai.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// learn more at https://aka.ms/genaiscript
2+
script({ title: "TLAi-linter", description: "Check if the prose comments and their TLA+ declarations and definitions are syntactically and semantically consistent" })
3+
4+
// use def to emit LLM variables
5+
def("TLA+", env.files.filter(f => f.filename.endsWith(".tla")), {lineNumbers: true})
6+
7+
// use $ to output formatted text to the prompt
8+
$`You are an expert at TLA+/TLAPLUS. Your task is to check if the prose comments and their TLA+ declarations and definitions are syntactically and semantically consistent!!!
9+
Explain any consistencies and inconsistencies you may find. Report inconsistent and consistent pairs in a single ANNOTATION section.
10+
11+
## TLA+ Syntax Hints
12+
- A formula [A]_v is called a temporal formula, and is shorthand for the formula A \/ v' = v. In other words, the formula is true if A is true or if the value of v remains unchanged. Usually, v is a tuple of the spec's variables.
13+
- The symbol \`#\` is alternative syntax used for inequality in TLA+; the other symbol is \`/=\".
14+
15+
## TLA+ Semantics Hints
16+
- Do NOT add any invariants or properties to the behavior specification Spec or any of its subformulas. This would change THEOREM Spec => Inv into THEOREM Spec /\ Inv => Inv, which is vacuously true.
17+
- TLA+ specs are always stuttering insensitive, i.e., the next-state relation is always [A]_v. In other words, one cannot write a stuttering sensitive specification.
18+
19+
## TLA+ Convention Hints
20+
- The type correctness invariant is typically called TypeOK.
21+
- Users can employ TLA labels as a means to conceptually associate a comment with a sub-formula like a specific disjunct or conjunct of a TLA formula. Even though these labels have no other function, they facilitate referencing particular parts of the formula from a comment.
22+
23+
## Formal and informal math Hints
24+
- Take into account that humans may write informal math that is syntactically different from the formal math, yet semantically equivalent. For example, humans may write \`N > 3T\` instead of \`N > 3 * T\`.
25+
`

.github/workflows/PR.yml

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
name: TLAi linter
2+
3+
on: [pull_request]
4+
5+
jobs:
6+
linting:
7+
name: TLAi linter
8+
9+
runs-on: ubuntu-latest
10+
11+
env:
12+
## https://microsoft.github.io/genaiscript/reference/token/
13+
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
14+
OPENAI_API_BASE: ${{ secrets.OPENAI_API_BASE }}
15+
OPENAI_API_TYPE: ${{ secrets.OPENAI_API_TYPE }}
16+
17+
defaults:
18+
run:
19+
shell: bash
20+
21+
steps:
22+
- name: Clone repo
23+
uses: actions/checkout@v4
24+
with:
25+
## All history for git diff below to succeed.
26+
fetch-depth: 0
27+
28+
- name: Setup NodeJS
29+
## https://github.com/actions/setup-node
30+
uses: actions/setup-node@v4
31+
with:
32+
node-version: "20"
33+
34+
- name: Run GenAIscript on the TLA+ specs that are added in this pull request.
35+
## Identify git diff: $(git diff --name-only HEAD^ | grep '.tla')
36+
## Install genaiscript runtime: https://microsoft.github.io/genaiscript/reference/cli/
37+
## Output LLM response in SARIF format: https://microsoft.github.io/genaiscript/reference/scripts/annotations/ (redirect other output to /dev/null for GH not to also show the annotations)
38+
run: npx --yes genaiscript-cli run .github/scripts/TLAi-Linter.genai.js $(git diff --name-only HEAD^ | grep '.tla') --max-tokens 2000 --out-annotations results.sarif > /dev/null
39+
40+
- name: Upload SARIF file
41+
## https://sarifweb.azurewebsites.net
42+
## https://docs.github.com/en/code-security/code-scanning/integrating-with-code-scanning/uploading-a-sarif-file-to-github
43+
if: success() || failure()
44+
uses: github/codeql-action/upload-sarif@v3
45+
with:
46+
sarif_file: results.sarif

0 commit comments

Comments
 (0)