From e54e9a90b8599241428eac6186bd658fb85b0c02 Mon Sep 17 00:00:00 2001 From: Andrew Helwer Date: Thu, 31 Jul 2025 12:48:32 -0500 Subject: [PATCH 1/6] Updated generate_manifest.py to separate manifest Signed-off-by: Andrew Helwer --- .github/scripts/generate_manifest.py | 88 +++++++++++++--------------- 1 file changed, 40 insertions(+), 48 deletions(-) diff --git a/.github/scripts/generate_manifest.py b/.github/scripts/generate_manifest.py index ce857983..64bc24b5 100644 --- a/.github/scripts/generate_manifest.py +++ b/.github/scripts/generate_manifest.py @@ -69,50 +69,45 @@ def get_cfg_files(examples_root, tla_path): ]) ] -def generate_new_manifest(examples_root, ignored_dirs, parser, queries): +def generate_new_manifest(examples_root, spec_path, spec_name, parser, queries): """ - Generate new base manifest.json from files in specifications dir. + Generate new manifest.json file for a given specification directory. """ return { - 'specifications': [ + 'path': to_posix(spec_path), + 'title': spec_name, + 'description': '', + 'sources': [], + 'authors': [], + 'tags': [], + 'modules': [ { - 'path': to_posix(spec_path), - 'title': spec_name, - 'description': '', - 'sources': [], - 'authors': [], - 'tags': [], - 'modules': [ + 'path': to_posix(tla_path), + 'communityDependencies': sorted(list(get_community_module_imports(examples_root, parser, tla_path, queries))), + 'tlaLanguageVersion': 2, + 'features': sorted(list(get_module_features(examples_root, tla_path, parser, queries))), + 'models': [ { - 'path': to_posix(tla_path), - 'communityDependencies': sorted(list(get_community_module_imports(examples_root, parser, tla_path, queries))), - 'tlaLanguageVersion': 2, - 'features': sorted(list(get_module_features(examples_root, tla_path, parser, queries))), - 'models': [ - { - 'path': to_posix(cfg_path), - 'runtime': 'unknown', - 'size': 'unknown', - 'mode': 'exhaustive search', - 'features': sorted(list(get_model_features(examples_root, cfg_path))), - 'result': 'unknown' - } - for cfg_path in sorted(get_cfg_files(examples_root, tla_path)) - ] + 'path': to_posix(cfg_path), + 'runtime': 'unknown', + 'size': 'unknown', + 'mode': 'exhaustive search', + 'features': sorted(list(get_model_features(examples_root, cfg_path))), + 'result': 'unknown' } - for tla_path in sorted(get_tla_files(examples_root, spec_path)) + for cfg_path in sorted(get_cfg_files(examples_root, tla_path)) ] } - for (spec_path, spec_name) in get_spec_dirs(examples_root, ignored_dirs) + for tla_path in sorted(get_tla_files(examples_root, spec_path)) ] } # Integrate human-written info from existing manifest.json -def find_corresponding_spec(old_spec, new_manifest): +def find_corresponding_spec(old_manifest, new_spec): specs = [ - spec for spec in new_manifest['specifications'] - if to_posix(spec['path']) == old_spec['path'] + spec for spec in old_manifest['specifications'] + if spec['path'] == new_spec['path'] ] return specs[0] if any(specs) else None @@ -146,22 +141,19 @@ def integrate_model_info(old_model, new_model): if field in old_model: new_model[field] = old_model[field] -def integrate_old_manifest_into_new(old_manifest, new_manifest): - for old_spec in old_manifest['specifications']: - new_spec = find_corresponding_spec(old_spec, new_manifest) - if new_spec is None: +def integrate_old_manifest_into_new(old_manifest, new_spec): + old_spec = find_corresponding_spec(old_manifest, new_spec) + integrate_spec_info(old_spec, new_spec) + for old_module in old_spec['modules']: + new_module = find_corresponding_module(old_module, new_spec) + if new_module is None: continue - integrate_spec_info(old_spec, new_spec) - for old_module in old_spec['modules']: - new_module = find_corresponding_module(old_module, new_spec) - if new_module is None: + integrate_module_info(old_module, new_module) + for old_model in old_module['models']: + new_model = find_corresponding_model(old_model, new_module) + if new_model is None: continue - integrate_module_info(old_module, new_module) - for old_model in old_module['models']: - new_model = find_corresponding_model(old_model, new_module) - if new_model is None: - continue - integrate_model_info(old_model, new_model) + integrate_model_info(old_model, new_model) if __name__ == '__main__': parser = ArgumentParser(description='Generates a new manifest.json derived from files in the repo.') @@ -179,8 +171,8 @@ def integrate_old_manifest_into_new(old_manifest, new_manifest): queries = build_queries(TLAPLUS_LANGUAGE) old_manifest = tla_utils.load_json(manifest_path) - new_manifest = generate_new_manifest(examples_root, ignored_dirs, parser, queries) - integrate_old_manifest_into_new(old_manifest, new_manifest) - - tla_utils.write_json(new_manifest, manifest_path) + for (spec_path, spec_name) in get_spec_dirs(examples_root, ignored_dirs): + new_manifest = generate_new_manifest(examples_root, spec_path, spec_name, parser, queries) + integrate_old_manifest_into_new(old_manifest, new_manifest) + tla_utils.write_json(new_manifest, join(spec_path, 'manifest.json')) From 44751ef1ecc8df8cc63c4b3b9ffddf9c5a7064f7 Mon Sep 17 00:00:00 2001 From: Andrew Helwer Date: Thu, 31 Jul 2025 12:57:27 -0500 Subject: [PATCH 2/6] Generated split manifests Signed-off-by: Andrew Helwer --- .../Bakery-Boulangerie/manifest.json | 72 ++ specifications/CarTalkPuzzle/manifest.json | 96 +++ specifications/Chameneos/manifest.json | 35 + .../CheckpointCoordination/manifest.json | 52 ++ specifications/CigaretteSmokers/manifest.json | 33 + specifications/CoffeeCan/manifest.json | 57 ++ specifications/DieHard/manifest.json | 53 ++ .../DiningPhilosophers/manifest.json | 37 + specifications/Disruptor/manifest.json | 81 ++ specifications/EinsteinRiddle/manifest.json | 29 + specifications/FiniteMonotonic/manifest.json | 138 ++++ specifications/GameOfLife/manifest.json | 33 + specifications/Huang/manifest.json | 37 + specifications/KeyValueStore/manifest.json | 100 +++ specifications/KnuthYao/manifest.json | 55 ++ specifications/LearnProofs/manifest.json | 55 ++ .../LeastCircularSubstring/manifest.json | 57 ++ specifications/LevelChecking/manifest.json | 21 + specifications/LoopInvariance/manifest.json | 88 +++ specifications/Majority/manifest.json | 51 ++ .../MisraReachability/manifest.json | 134 ++++ .../MissionariesAndCannibals/manifest.json | 30 + .../Moving_Cat_Puzzle/manifest.json | 48 ++ specifications/MultiCarElevator/manifest.json | 69 ++ specifications/MultiPaxos-SMR/manifest.json | 56 ++ specifications/N-Queens/manifest.json | 82 ++ specifications/NanoBlockchain/manifest.json | 60 ++ specifications/Paxos/manifest.json | 103 +++ .../PaxosHowToWinATuringAward/manifest.json | 113 +++ specifications/Prisoners/manifest.json | 42 + .../Prisoners_Single_Switch/manifest.json | 74 ++ specifications/ReadersWriters/manifest.json | 40 + specifications/SDP_Verification/manifest.json | 76 ++ .../SimplifiedFastPaxos/manifest.json | 54 ++ specifications/SingleLaneBridge/manifest.json | 40 + specifications/SlidingPuzzles/manifest.json | 28 + specifications/SlushProtocol/manifest.json | 52 ++ specifications/SpanningTree/manifest.json | 86 ++ .../SpecifyingSystems/manifest.json | 741 ++++++++++++++++++ specifications/Stones/manifest.json | 33 + specifications/TLC/manifest.json | 42 + .../TeachingConcurrency/manifest.json | 60 ++ .../TransitiveClosure/manifest.json | 31 + specifications/TwoPhase/manifest.json | 48 ++ specifications/YoYo/manifest.json | 100 +++ specifications/aba-asyn-byz/manifest.json | 32 + specifications/acp/manifest.json | 92 +++ specifications/allocator/manifest.json | 96 +++ specifications/bcastByz/manifest.json | 50 ++ specifications/bcastFolklore/manifest.json | 32 + specifications/bosco/manifest.json | 30 + specifications/braf/manifest.json | 37 + specifications/byihive/manifest.json | 122 +++ specifications/byzpaxos/manifest.json | 104 +++ specifications/c1cs/manifest.json | 32 + specifications/cbc_max/manifest.json | 21 + specifications/cf1s-folklore/manifest.json | 32 + specifications/chang_roberts/manifest.json | 43 + specifications/detector_chan96/manifest.json | 46 ++ specifications/dijkstra-mutex/manifest.json | 75 ++ specifications/diskpaxos/manifest.json | 52 ++ specifications/echo/manifest.json | 47 ++ specifications/ewd426/manifest.json | 60 ++ specifications/ewd687a/manifest.json | 82 ++ specifications/ewd840/manifest.json | 123 +++ specifications/ewd998/manifest.json | 326 ++++++++ specifications/glowingRaccoon/manifest.json | 77 ++ specifications/lamport_mutex/manifest.json | 49 ++ specifications/nbacc_ray97/manifest.json | 33 + specifications/nbacg_guer01/manifest.json | 35 + specifications/spanning/manifest.json | 37 + specifications/sums_even/manifest.json | 42 + specifications/tcp/manifest.json | 45 ++ specifications/tower_of_hanoi/manifest.json | 66 ++ .../transaction_commit/manifest.json | 95 +++ 75 files changed, 5435 insertions(+) create mode 100644 specifications/Bakery-Boulangerie/manifest.json create mode 100644 specifications/CarTalkPuzzle/manifest.json create mode 100644 specifications/Chameneos/manifest.json create mode 100644 specifications/CheckpointCoordination/manifest.json create mode 100644 specifications/CigaretteSmokers/manifest.json create mode 100644 specifications/CoffeeCan/manifest.json create mode 100644 specifications/DieHard/manifest.json create mode 100644 specifications/DiningPhilosophers/manifest.json create mode 100644 specifications/Disruptor/manifest.json create mode 100644 specifications/EinsteinRiddle/manifest.json create mode 100644 specifications/FiniteMonotonic/manifest.json create mode 100644 specifications/GameOfLife/manifest.json create mode 100644 specifications/Huang/manifest.json create mode 100644 specifications/KeyValueStore/manifest.json create mode 100644 specifications/KnuthYao/manifest.json create mode 100644 specifications/LearnProofs/manifest.json create mode 100644 specifications/LeastCircularSubstring/manifest.json create mode 100644 specifications/LevelChecking/manifest.json create mode 100644 specifications/LoopInvariance/manifest.json create mode 100644 specifications/Majority/manifest.json create mode 100644 specifications/MisraReachability/manifest.json create mode 100644 specifications/MissionariesAndCannibals/manifest.json create mode 100644 specifications/Moving_Cat_Puzzle/manifest.json create mode 100644 specifications/MultiCarElevator/manifest.json create mode 100644 specifications/MultiPaxos-SMR/manifest.json create mode 100644 specifications/N-Queens/manifest.json create mode 100644 specifications/NanoBlockchain/manifest.json create mode 100644 specifications/Paxos/manifest.json create mode 100644 specifications/PaxosHowToWinATuringAward/manifest.json create mode 100644 specifications/Prisoners/manifest.json create mode 100644 specifications/Prisoners_Single_Switch/manifest.json create mode 100644 specifications/ReadersWriters/manifest.json create mode 100644 specifications/SDP_Verification/manifest.json create mode 100644 specifications/SimplifiedFastPaxos/manifest.json create mode 100644 specifications/SingleLaneBridge/manifest.json create mode 100644 specifications/SlidingPuzzles/manifest.json create mode 100644 specifications/SlushProtocol/manifest.json create mode 100644 specifications/SpanningTree/manifest.json create mode 100644 specifications/SpecifyingSystems/manifest.json create mode 100644 specifications/Stones/manifest.json create mode 100644 specifications/TLC/manifest.json create mode 100644 specifications/TeachingConcurrency/manifest.json create mode 100644 specifications/TransitiveClosure/manifest.json create mode 100644 specifications/TwoPhase/manifest.json create mode 100644 specifications/YoYo/manifest.json create mode 100644 specifications/aba-asyn-byz/manifest.json create mode 100644 specifications/acp/manifest.json create mode 100644 specifications/allocator/manifest.json create mode 100644 specifications/bcastByz/manifest.json create mode 100644 specifications/bcastFolklore/manifest.json create mode 100644 specifications/bosco/manifest.json create mode 100644 specifications/braf/manifest.json create mode 100644 specifications/byihive/manifest.json create mode 100644 specifications/byzpaxos/manifest.json create mode 100644 specifications/c1cs/manifest.json create mode 100644 specifications/cbc_max/manifest.json create mode 100644 specifications/cf1s-folklore/manifest.json create mode 100644 specifications/chang_roberts/manifest.json create mode 100644 specifications/detector_chan96/manifest.json create mode 100644 specifications/dijkstra-mutex/manifest.json create mode 100644 specifications/diskpaxos/manifest.json create mode 100644 specifications/echo/manifest.json create mode 100644 specifications/ewd426/manifest.json create mode 100644 specifications/ewd687a/manifest.json create mode 100644 specifications/ewd840/manifest.json create mode 100644 specifications/ewd998/manifest.json create mode 100644 specifications/glowingRaccoon/manifest.json create mode 100644 specifications/lamport_mutex/manifest.json create mode 100644 specifications/nbacc_ray97/manifest.json create mode 100644 specifications/nbacg_guer01/manifest.json create mode 100644 specifications/spanning/manifest.json create mode 100644 specifications/sums_even/manifest.json create mode 100644 specifications/tcp/manifest.json create mode 100644 specifications/tower_of_hanoi/manifest.json create mode 100644 specifications/transaction_commit/manifest.json diff --git a/specifications/Bakery-Boulangerie/manifest.json b/specifications/Bakery-Boulangerie/manifest.json new file mode 100644 index 00000000..1d9f1394 --- /dev/null +++ b/specifications/Bakery-Boulangerie/manifest.json @@ -0,0 +1,72 @@ +{ + "path": "specifications/Bakery-Boulangerie", + "title": "The Boulangerie Algorithm", + "description": "Spec of a variant of the Bakery Algorithm", + "sources": [], + "authors": [ + "Leslie Lamport", + "Stephan Merz" + ], + "tags": [], + "modules": [ + { + "path": "specifications/Bakery-Boulangerie/Bakery.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "pluscal", + "proof" + ], + "models": [] + }, + { + "path": "specifications/Bakery-Boulangerie/Boulanger.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "pluscal", + "proof" + ], + "models": [] + }, + { + "path": "specifications/Bakery-Boulangerie/MCBakery.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/Bakery-Boulangerie/MCBakery.cfg", + "runtime": "00:00:10", + "size": "small", + "mode": "exhaustive search", + "features": [ + "ignore deadlock" + ], + "result": "success", + "distinctStates": 655200, + "totalStates": 3403584, + "stateDepth": 1 + } + ] + }, + { + "path": "specifications/Bakery-Boulangerie/MCBoulanger.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/Bakery-Boulangerie/MCBoulanger.cfg", + "runtime": "00:01:00", + "size": "medium", + "mode": "exhaustive search", + "features": [ + "state constraint" + ], + "result": "success" + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/CarTalkPuzzle/manifest.json b/specifications/CarTalkPuzzle/manifest.json new file mode 100644 index 00000000..0e29df03 --- /dev/null +++ b/specifications/CarTalkPuzzle/manifest.json @@ -0,0 +1,96 @@ +{ + "path": "specifications/CarTalkPuzzle", + "title": "The Car Talk Puzzle", + "description": "Math puzzle involving a farmer, a stone, and a balance scale", + "sources": [], + "authors": [ + "Leslie Lamport" + ], + "tags": [ + "beginner" + ], + "modules": [ + { + "path": "specifications/CarTalkPuzzle/CarTalkPuzzle.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/CarTalkPuzzle/CarTalkPuzzle.toolbox/Model_1/CarTalkPuzzle.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/CarTalkPuzzle/CarTalkPuzzle.toolbox/Model_1/MC.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/CarTalkPuzzle/CarTalkPuzzle.toolbox/Model_1/MC.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [], + "result": "success", + "distinctStates": 0, + "totalStates": 0, + "stateDepth": 0 + } + ] + }, + { + "path": "specifications/CarTalkPuzzle/CarTalkPuzzle.toolbox/Model_2/CarTalkPuzzle.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/CarTalkPuzzle/CarTalkPuzzle.toolbox/Model_2/MC.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/CarTalkPuzzle/CarTalkPuzzle.toolbox/Model_2/MC.cfg", + "runtime": "00:00:05", + "size": "small", + "mode": "exhaustive search", + "features": [], + "result": "success", + "distinctStates": 0, + "totalStates": 0, + "stateDepth": 0 + } + ] + }, + { + "path": "specifications/CarTalkPuzzle/CarTalkPuzzle.toolbox/Model_3/CarTalkPuzzle.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/CarTalkPuzzle/CarTalkPuzzle.toolbox/Model_3/MC.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/CarTalkPuzzle/CarTalkPuzzle.toolbox/Model_3/MC.cfg", + "runtime": "unknown", + "size": "large", + "mode": "exhaustive search", + "features": [], + "result": "unknown" + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/Chameneos/manifest.json b/specifications/Chameneos/manifest.json new file mode 100644 index 00000000..c6d9bd76 --- /dev/null +++ b/specifications/Chameneos/manifest.json @@ -0,0 +1,35 @@ +{ + "path": "specifications/Chameneos", + "title": "Chameneos, a Concurrency Game", + "description": "A concurrency game requiring concurrent & symmetric cooperation", + "sources": [ + "https://github.com/mryndzionek/tlaplus_specs#chameneostla" + ], + "authors": [ + "Mariusz Ryndzionek" + ], + "tags": [], + "modules": [ + { + "path": "specifications/Chameneos/Chameneos.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/Chameneos/Chameneos.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "ignore deadlock" + ], + "result": "success", + "distinctStates": 34534, + "totalStates": 104697, + "stateDepth": 13 + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/CheckpointCoordination/manifest.json b/specifications/CheckpointCoordination/manifest.json new file mode 100644 index 00000000..06038025 --- /dev/null +++ b/specifications/CheckpointCoordination/manifest.json @@ -0,0 +1,52 @@ +{ + "path": "specifications/CheckpointCoordination", + "title": "Checkpoint Coordination", + "description": "An algorithm for controlling checkpoint leases in a Paxos ring", + "sources": [ + "https://github.com/Azure/RingMaster", + "https://ahelwer.ca/post/2023-04-05-checkpoint-coordination/" + ], + "authors": [ + "Andrew Helwer" + ], + "tags": [], + "modules": [ + { + "path": "specifications/CheckpointCoordination/CheckpointCoordination.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/CheckpointCoordination/MCCheckpointCoordination.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/CheckpointCoordination/MCCheckpointCoordination.cfg", + "runtime": "00:01:00", + "size": "medium", + "mode": "exhaustive search", + "features": [ + "state constraint", + "symmetry" + ], + "result": "success" + }, + { + "path": "specifications/CheckpointCoordination/MCCheckpointCoordinationFailure.cfg", + "runtime": "00:00:10", + "size": "small", + "mode": "exhaustive search", + "features": [ + "state constraint", + "symmetry" + ], + "result": "safety failure" + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/CigaretteSmokers/manifest.json b/specifications/CigaretteSmokers/manifest.json new file mode 100644 index 00000000..53a402fd --- /dev/null +++ b/specifications/CigaretteSmokers/manifest.json @@ -0,0 +1,33 @@ +{ + "path": "specifications/CigaretteSmokers", + "title": "The Cigarette Smokers Problem", + "description": "A concurrency problem described in 1971 by Suhas Patil", + "sources": [ + "https://github.com/mryndzionek/tlaplus_specs#cigarettesmokerstla" + ], + "authors": [ + "Mariusz Ryndzionek" + ], + "tags": [], + "modules": [ + { + "path": "specifications/CigaretteSmokers/CigaretteSmokers.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/CigaretteSmokers/CigaretteSmokers.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [], + "result": "success", + "distinctStates": 6, + "totalStates": 15, + "stateDepth": 2 + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/CoffeeCan/manifest.json b/specifications/CoffeeCan/manifest.json new file mode 100644 index 00000000..8784457c --- /dev/null +++ b/specifications/CoffeeCan/manifest.json @@ -0,0 +1,57 @@ +{ + "path": "specifications/CoffeeCan", + "title": "The Coffee Can Bean Problem", + "description": "Math problem published by Dijkstra attributed to Carel Scholten", + "sources": [ + "https://stackoverflow.com/a/66304920/2852699" + ], + "authors": [ + "Andrew Helwer" + ], + "tags": [ + "beginner" + ], + "modules": [ + { + "path": "specifications/CoffeeCan/CoffeeCan.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/CoffeeCan/CoffeeCan1000Beans.cfg", + "runtime": "00:00:15", + "size": "medium", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success" + }, + { + "path": "specifications/CoffeeCan/CoffeeCan100Beans.cfg", + "runtime": "00:00:05", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success", + "distinctStates": 5150, + "totalStates": 20002, + "stateDepth": 1 + }, + { + "path": "specifications/CoffeeCan/CoffeeCan3000Beans.cfg", + "runtime": "00:02:30", + "size": "medium", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success" + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/DieHard/manifest.json b/specifications/DieHard/manifest.json new file mode 100644 index 00000000..a3e313c2 --- /dev/null +++ b/specifications/DieHard/manifest.json @@ -0,0 +1,53 @@ +{ + "path": "specifications/DieHard", + "title": "The Die Hard Problem", + "description": "Obtain 4 gallons of water using only 3 and 5 gallon jugs", + "sources": [], + "authors": [ + "Leslie Lamport" + ], + "tags": [ + "beginner" + ], + "modules": [ + { + "path": "specifications/DieHard/DieHard.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/DieHard/DieHard.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [], + "result": "safety failure" + } + ] + }, + { + "path": "specifications/DieHard/DieHarder.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/DieHard/MCDieHarder.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/DieHard/MCDieHarder.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [], + "result": "safety failure" + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/DiningPhilosophers/manifest.json b/specifications/DiningPhilosophers/manifest.json new file mode 100644 index 00000000..0ef64316 --- /dev/null +++ b/specifications/DiningPhilosophers/manifest.json @@ -0,0 +1,37 @@ +{ + "path": "specifications/DiningPhilosophers", + "title": "The Dining Philosophers Problem", + "description": "The Chandy-Misra solution to the Dining Philosophers concurrency problem", + "sources": [], + "authors": [ + "Jeff Hemphill" + ], + "tags": [ + "beginner" + ], + "modules": [ + { + "path": "specifications/DiningPhilosophers/DiningPhilosophers.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "pluscal" + ], + "models": [ + { + "path": "specifications/DiningPhilosophers/DiningPhilosophers.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success", + "distinctStates": 67, + "totalStates": 336, + "stateDepth": 29 + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/Disruptor/manifest.json b/specifications/Disruptor/manifest.json new file mode 100644 index 00000000..b1b1ba30 --- /dev/null +++ b/specifications/Disruptor/manifest.json @@ -0,0 +1,81 @@ +{ + "path": "specifications/Disruptor", + "title": "Disruptor", + "description": "Models single and multi producer scenarios of the Disruptor library and checks for data races.", + "sources": [ + "https://github.com/nicholassm/disruptor-rs" + ], + "authors": [ + "Nicholas Schultz-Møller" + ], + "tags": [], + "modules": [ + { + "path": "specifications/Disruptor/Disruptor_MPMC.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/Disruptor/Disruptor_MPMC.cfg", + "runtime": "00:00:10", + "size": "small", + "mode": "exhaustive search", + "features": [ + "ignore deadlock", + "state constraint" + ], + "result": "success", + "distinctStates": 112929, + "totalStates": 422781, + "stateDepth": 81 + }, + { + "path": "specifications/Disruptor/Disruptor_MPMC_liveliness.cfg", + "runtime": "00:00:10", + "size": "small", + "mode": "exhaustive search", + "features": [ + "ignore deadlock", + "liveness", + "state constraint" + ], + "result": "success", + "distinctStates": 14365, + "totalStates": 44581, + "stateDepth": 61 + } + ] + }, + { + "path": "specifications/Disruptor/Disruptor_SPMC.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/Disruptor/Disruptor_SPMC.cfg", + "runtime": "00:00:10", + "size": "small", + "mode": "exhaustive search", + "features": [ + "ignore deadlock", + "liveness", + "state constraint" + ], + "result": "success", + "distinctStates": 8496, + "totalStates": 28049, + "stateDepth": 82 + } + ] + }, + { + "path": "specifications/Disruptor/RingBuffer.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + } + ] +} \ No newline at end of file diff --git a/specifications/EinsteinRiddle/manifest.json b/specifications/EinsteinRiddle/manifest.json new file mode 100644 index 00000000..843e9c19 --- /dev/null +++ b/specifications/EinsteinRiddle/manifest.json @@ -0,0 +1,29 @@ +{ + "path": "specifications/EinsteinRiddle", + "title": "Einstein's Riddle", + "description": "Five houses, five people, various facts, who lives in what house?", + "sources": [], + "authors": [ + "Isaac DeFrain", + "Giuliano Losa" + ], + "tags": [], + "modules": [ + { + "path": "specifications/EinsteinRiddle/Einstein.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/EinsteinRiddle/Einstein.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "symbolic", + "features": [], + "result": "safety failure" + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/FiniteMonotonic/manifest.json b/specifications/FiniteMonotonic/manifest.json new file mode 100644 index 00000000..4bc747a1 --- /dev/null +++ b/specifications/FiniteMonotonic/manifest.json @@ -0,0 +1,138 @@ +{ + "path": "specifications/FiniteMonotonic", + "title": "Finitizing Monotonic Systems", + "description": "Illustration of technique for making ordinarily-infinite monotonic systems finite for the purposes of model-checking.", + "sources": [ + "https://ahelwer.ca/post/2023-11-01-tla-finite-monotonic/" + ], + "authors": [ + "Andrew Helwer", + "Stephan Merz", + "Markus Kuppe" + ], + "tags": [ + "intermediate" + ], + "modules": [ + { + "path": "specifications/FiniteMonotonic/CRDT.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/FiniteMonotonic/CRDT_proof.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "proof" + ], + "models": [] + }, + { + "path": "specifications/FiniteMonotonic/DistributedReplicatedLog.tla", + "communityDependencies": [ + "FiniteSetsExt", + "SequencesExt" + ], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/FiniteMonotonic/Folds.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/FiniteMonotonic/Functions.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/FiniteMonotonic/MCCRDT.tla", + "communityDependencies": [ + "FiniteSetsExt" + ], + "tlaLanguageVersion": 2, + "features": [ + "action composition" + ], + "models": [ + { + "path": "specifications/FiniteMonotonic/MCCRDT.cfg", + "runtime": "00:00:05", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness", + "state constraint" + ], + "result": "success", + "distinctStates": 25000, + "totalStates": 1350001, + "stateDepth": 16 + } + ] + }, + { + "path": "specifications/FiniteMonotonic/MCDistributedReplicatedLog.tla", + "communityDependencies": [ + "FiniteSetsExt" + ], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/FiniteMonotonic/MCDistributedReplicatedLog.cfg", + "runtime": "00:00:05", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness", + "view" + ], + "result": "liveness failure" + } + ] + }, + { + "path": "specifications/FiniteMonotonic/MCReplicatedLog.tla", + "communityDependencies": [ + "FiniteSetsExt" + ], + "tlaLanguageVersion": 2, + "features": [ + "action composition" + ], + "models": [ + { + "path": "specifications/FiniteMonotonic/MCReplicatedLog.cfg", + "runtime": "00:00:05", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness", + "state constraint" + ], + "result": "success", + "distinctStates": 1363, + "totalStates": 17425, + "stateDepth": 13 + } + ] + }, + { + "path": "specifications/FiniteMonotonic/ReplicatedLog.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + } + ] +} \ No newline at end of file diff --git a/specifications/GameOfLife/manifest.json b/specifications/GameOfLife/manifest.json new file mode 100644 index 00000000..fb010955 --- /dev/null +++ b/specifications/GameOfLife/manifest.json @@ -0,0 +1,33 @@ +{ + "path": "specifications/GameOfLife", + "title": "Conway's Game of Life", + "description": "The famous cellular automata simulation", + "sources": [ + "https://github.com/mryndzionek/tlaplus_specs#gameoflifetla" + ], + "authors": [ + "Mariusz Ryndzionek" + ], + "tags": [], + "modules": [ + { + "path": "specifications/GameOfLife/GameOfLife.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/GameOfLife/GameOfLife.cfg", + "runtime": "00:00:05", + "size": "small", + "mode": "exhaustive search", + "features": [], + "result": "success", + "distinctStates": 65536, + "totalStates": 131072, + "stateDepth": 1 + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/Huang/manifest.json b/specifications/Huang/manifest.json new file mode 100644 index 00000000..ad97b83c --- /dev/null +++ b/specifications/Huang/manifest.json @@ -0,0 +1,37 @@ +{ + "path": "specifications/Huang", + "title": "Huang's Algorithm", + "description": "An algorithm for detecting termination in a distributed system", + "sources": [], + "authors": [ + "Markus Kuppe" + ], + "tags": [], + "modules": [ + { + "path": "specifications/Huang/Huang.tla", + "communityDependencies": [ + "DyadicRationals", + "Functions", + "SequencesExt" + ], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/Huang/Huang.cfg", + "runtime": "00:00:40", + "size": "medium", + "mode": "exhaustive search", + "features": [ + "alias", + "ignore deadlock", + "liveness", + "state constraint" + ], + "result": "success" + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/KeyValueStore/manifest.json b/specifications/KeyValueStore/manifest.json new file mode 100644 index 00000000..a208b824 --- /dev/null +++ b/specifications/KeyValueStore/manifest.json @@ -0,0 +1,100 @@ +{ + "path": "specifications/KeyValueStore", + "title": "Snapshot Key-Value Store", + "description": "A simple KVS implementing snapshot isolation", + "sources": [], + "authors": [ + "Andrew Helwer", + "Murat Demirbas" + ], + "tags": [], + "modules": [ + { + "path": "specifications/KeyValueStore/ClientCentric.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/KeyValueStore/KVsnap.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "pluscal" + ], + "models": [] + }, + { + "path": "specifications/KeyValueStore/KeyValueStore.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/KeyValueStore/MCKVS.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/KeyValueStore/MCKVSSafetyLarge.cfg", + "runtime": "07:16:00", + "size": "large", + "mode": "exhaustive search", + "features": [ + "symmetry" + ], + "result": "success" + }, + { + "path": "specifications/KeyValueStore/MCKVSSafetyMedium.cfg", + "runtime": "00:04:30", + "size": "medium", + "mode": "exhaustive search", + "features": [ + "symmetry" + ], + "result": "success" + }, + { + "path": "specifications/KeyValueStore/MCKVSSafetySmall.cfg", + "runtime": "00:00:40", + "size": "medium", + "mode": "exhaustive search", + "features": [], + "result": "success" + } + ] + }, + { + "path": "specifications/KeyValueStore/MCKVsnap.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/KeyValueStore/MCKVsnap.cfg", + "runtime": "00:00:50", + "size": "medium", + "mode": "exhaustive search", + "features": [ + "liveness", + "symmetry" + ], + "result": "success" + } + ] + }, + { + "path": "specifications/KeyValueStore/Util.tla", + "communityDependencies": [ + "Functions" + ], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + } + ] +} \ No newline at end of file diff --git a/specifications/KnuthYao/manifest.json b/specifications/KnuthYao/manifest.json new file mode 100644 index 00000000..8cccd558 --- /dev/null +++ b/specifications/KnuthYao/manifest.json @@ -0,0 +1,55 @@ +{ + "path": "specifications/KnuthYao", + "title": "The Knuth-Yao Method", + "description": "A method for simulating a fair 6-sided die using only coin flips", + "sources": [ + "https://old.reddit.com/r/tlaplus/comments/j06ohw/how_do_you_reason_about_a_probabilistic/g6owlxy/" + ], + "authors": [ + "Markus Kuppe", + "Ron Pressler" + ], + "tags": [], + "modules": [ + { + "path": "specifications/KnuthYao/KnuthYao.tla", + "communityDependencies": [ + "DyadicRationals" + ], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/KnuthYao/Prob.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/KnuthYao/SimKnuthYao.tla", + "communityDependencies": [ + "CSV", + "Functions", + "IOUtils", + "Statistics" + ], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/KnuthYao/SimKnuthYao.cfg", + "runtime": "unknown", + "size": "unknown", + "mode": "generate", + "features": [ + "ignore deadlock", + "state constraint" + ], + "result": "unknown" + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/LearnProofs/manifest.json b/specifications/LearnProofs/manifest.json new file mode 100644 index 00000000..44d8c413 --- /dev/null +++ b/specifications/LearnProofs/manifest.json @@ -0,0 +1,55 @@ +{ + "path": "specifications/LearnProofs", + "title": "Learn TLA⁺ Proofs", + "description": "Some specs of very simple algorithms & formal proofs of their correctness", + "sources": [], + "authors": [ + "Andrew Helwer" + ], + "tags": [ + "beginner" + ], + "modules": [ + { + "path": "specifications/LearnProofs/AddTwo.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "pluscal", + "proof" + ], + "models": [] + }, + { + "path": "specifications/LearnProofs/FindHighest.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "pluscal", + "proof" + ], + "models": [] + }, + { + "path": "specifications/LearnProofs/MCFindHighest.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/LearnProofs/MCFindHighest.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "state constraint" + ], + "result": "success", + "distinctStates": 742, + "totalStates": 1523, + "stateDepth": 5 + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/LeastCircularSubstring/manifest.json b/specifications/LeastCircularSubstring/manifest.json new file mode 100644 index 00000000..a0ba5c1b --- /dev/null +++ b/specifications/LeastCircularSubstring/manifest.json @@ -0,0 +1,57 @@ +{ + "path": "specifications/LeastCircularSubstring", + "title": "Minimal Circular Substring", + "description": "Booth's 1980 algorithm to find the lexicographically-least circular substring", + "sources": [ + "https://ahelwer.ca/post/2023-03-30-pseudocode/" + ], + "authors": [ + "Andrew Helwer" + ], + "tags": [], + "modules": [ + { + "path": "specifications/LeastCircularSubstring/LeastCircularSubstring.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "pluscal" + ], + "models": [] + }, + { + "path": "specifications/LeastCircularSubstring/MCLeastCircularSubstring.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/LeastCircularSubstring/MCLeastCircularSubstringMedium.cfg", + "runtime": "00:01:00", + "size": "medium", + "mode": "exhaustive search", + "features": [], + "result": "success" + }, + { + "path": "specifications/LeastCircularSubstring/MCLeastCircularSubstringSmall.cfg", + "runtime": "00:00:05", + "size": "small", + "mode": "exhaustive search", + "features": [], + "result": "success", + "distinctStates": 8554, + "totalStates": 8681, + "stateDepth": 95 + } + ] + }, + { + "path": "specifications/LeastCircularSubstring/ZSequences.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + } + ] +} \ No newline at end of file diff --git a/specifications/LevelChecking/manifest.json b/specifications/LevelChecking/manifest.json new file mode 100644 index 00000000..a3ee7810 --- /dev/null +++ b/specifications/LevelChecking/manifest.json @@ -0,0 +1,21 @@ +{ + "path": "specifications/LevelChecking", + "title": "TLA⁺ Level Checking", + "description": "Level-checking of TLA⁺ formulas as described in Specifying Systems", + "sources": [ + "https://github.com/tlaplus/tlaplus/blob/6bc82f7746ccdfbdf49cdef24448666d11e5e218/tlatools/org.lamport.tlatools/src/tla2sany/semantic/LevelNode.java#L354-L2778" + ], + "authors": [ + "Leslie Lamport" + ], + "tags": [], + "modules": [ + { + "path": "specifications/LevelChecking/LevelSpec.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + } + ] +} \ No newline at end of file diff --git a/specifications/LoopInvariance/manifest.json b/specifications/LoopInvariance/manifest.json new file mode 100644 index 00000000..32a1597c --- /dev/null +++ b/specifications/LoopInvariance/manifest.json @@ -0,0 +1,88 @@ +{ + "path": "specifications/LoopInvariance", + "title": "Loop Invariance", + "description": "Examples of finding and proving loop invariants in PlusCal", + "sources": [ + "http://lamport.azurewebsites.net/tla/proving-safety.pdf" + ], + "authors": [ + "Leslie Lamport" + ], + "tags": [ + "beginner" + ], + "modules": [ + { + "path": "specifications/LoopInvariance/BinarySearch.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "pluscal", + "proof" + ], + "models": [] + }, + { + "path": "specifications/LoopInvariance/MCBinarySearch.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/LoopInvariance/MCBinarySearch.cfg", + "runtime": "00:00:05", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success", + "distinctStates": 27953, + "totalStates": 34383, + "stateDepth": 6 + } + ] + }, + { + "path": "specifications/LoopInvariance/MCQuicksort.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/LoopInvariance/MCQuicksort.cfg", + "runtime": "00:00:05", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success", + "distinctStates": 4548, + "totalStates": 11223, + "stateDepth": 9 + } + ] + }, + { + "path": "specifications/LoopInvariance/Quicksort.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "pluscal", + "proof" + ], + "models": [] + }, + { + "path": "specifications/LoopInvariance/SumSequence.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "pluscal", + "proof" + ], + "models": [] + } + ] +} \ No newline at end of file diff --git a/specifications/Majority/manifest.json b/specifications/Majority/manifest.json new file mode 100644 index 00000000..ee135f5e --- /dev/null +++ b/specifications/Majority/manifest.json @@ -0,0 +1,51 @@ +{ + "path": "specifications/Majority", + "title": "Boyer-Moore Majority Vote", + "description": "An efficient algorithm for detecting a majority value in a sequence", + "sources": [], + "authors": [ + "Stephan Merz" + ], + "tags": [ + "beginner" + ], + "modules": [ + { + "path": "specifications/Majority/MCMajority.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/Majority/MCMajority.cfg", + "runtime": "00:00:05", + "size": "small", + "mode": "exhaustive search", + "features": [ + "ignore deadlock" + ], + "result": "success", + "distinctStates": 2733, + "totalStates": 3459, + "stateDepth": 6 + } + ] + }, + { + "path": "specifications/Majority/Majority.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/Majority/MajorityProof.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "proof" + ], + "models": [] + } + ] +} \ No newline at end of file diff --git a/specifications/MisraReachability/manifest.json b/specifications/MisraReachability/manifest.json new file mode 100644 index 00000000..a9ade888 --- /dev/null +++ b/specifications/MisraReachability/manifest.json @@ -0,0 +1,134 @@ +{ + "path": "specifications/MisraReachability", + "title": "Misra Reachability Algorithm", + "description": "A sequential algorithm for computing the set of reachable nodes in a directed graph", + "sources": [], + "authors": [ + "Leslie Lamport" + ], + "tags": [], + "modules": [ + { + "path": "specifications/MisraReachability/MCParReach.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/MisraReachability/MCParReach.cfg", + "runtime": "00:00:30", + "size": "medium", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success" + } + ] + }, + { + "path": "specifications/MisraReachability/MCReachabilityTest.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/MisraReachability/MCReachabilityTestAllGraphs.cfg", + "runtime": "00:00:20", + "size": "medium", + "mode": "exhaustive search", + "features": [], + "result": "success" + }, + { + "path": "specifications/MisraReachability/MCReachabilityTestRandomGraphs.cfg", + "runtime": "00:00:10", + "size": "small", + "mode": "exhaustive search", + "features": [], + "result": "success", + "distinctStates": 0, + "totalStates": 0, + "stateDepth": 0 + } + ] + }, + { + "path": "specifications/MisraReachability/MCReachable.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/MisraReachability/MCReachable.cfg", + "runtime": "00:01:30", + "size": "medium", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success" + } + ] + }, + { + "path": "specifications/MisraReachability/ParReach.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "pluscal" + ], + "models": [] + }, + { + "path": "specifications/MisraReachability/ParReachProofs.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "proof" + ], + "models": [] + }, + { + "path": "specifications/MisraReachability/Reachability.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/MisraReachability/ReachabilityProofs.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "proof" + ], + "models": [] + }, + { + "path": "specifications/MisraReachability/ReachabilityTest.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/MisraReachability/Reachable.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "pluscal" + ], + "models": [] + }, + { + "path": "specifications/MisraReachability/ReachableProofs.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "proof" + ], + "models": [] + } + ] +} \ No newline at end of file diff --git a/specifications/MissionariesAndCannibals/manifest.json b/specifications/MissionariesAndCannibals/manifest.json new file mode 100644 index 00000000..8e9f3c7f --- /dev/null +++ b/specifications/MissionariesAndCannibals/manifest.json @@ -0,0 +1,30 @@ +{ + "path": "specifications/MissionariesAndCannibals", + "title": "Missionaries and Cannibals", + "description": "Spec of a river-crossing puzzle", + "sources": [], + "authors": [ + "Leslie Lamport" + ], + "tags": [ + "beginner" + ], + "modules": [ + { + "path": "specifications/MissionariesAndCannibals/MissionariesAndCannibals.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/MissionariesAndCannibals/MissionariesAndCannibals.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [], + "result": "safety failure" + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/Moving_Cat_Puzzle/manifest.json b/specifications/Moving_Cat_Puzzle/manifest.json new file mode 100644 index 00000000..b9cc3776 --- /dev/null +++ b/specifications/Moving_Cat_Puzzle/manifest.json @@ -0,0 +1,48 @@ +{ + "path": "specifications/Moving_Cat_Puzzle", + "title": "The Moving Cat Puzzle", + "description": "Demonstrating the solution for the moving cat puzzle is correct.", + "sources": [], + "authors": [ + "Florian Schanda" + ], + "tags": [ + "beginner" + ], + "modules": [ + { + "path": "specifications/Moving_Cat_Puzzle/Cat.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/Moving_Cat_Puzzle/CatEvenBoxes.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success", + "distinctStates": 48, + "totalStates": 128, + "stateDepth": 1 + }, + { + "path": "specifications/Moving_Cat_Puzzle/CatOddBoxes.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success", + "distinctStates": 30, + "totalStates": 78, + "stateDepth": 1 + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/MultiCarElevator/manifest.json b/specifications/MultiCarElevator/manifest.json new file mode 100644 index 00000000..be2ee916 --- /dev/null +++ b/specifications/MultiCarElevator/manifest.json @@ -0,0 +1,69 @@ +{ + "path": "specifications/MultiCarElevator", + "title": "Multi-Car Elevator System", + "description": "A simple multi-car elevator system servicing a multi-floor building", + "sources": [ + "https://groups.google.com/g/tlaplus/c/5Xd8kv288jE/m/IrliJIatBwAJ" + ], + "authors": [ + "Andrew Helwer" + ], + "tags": [], + "modules": [ + { + "path": "specifications/MultiCarElevator/Elevator.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/MultiCarElevator/ElevatorLivenessLarge.cfg", + "runtime": "00:11:00", + "size": "large", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success" + }, + { + "path": "specifications/MultiCarElevator/ElevatorLivenessMedium.cfg", + "runtime": "00:00:30", + "size": "medium", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success" + }, + { + "path": "specifications/MultiCarElevator/ElevatorSafetyLarge.cfg", + "runtime": "00:10:00", + "size": "large", + "mode": "exhaustive search", + "features": [], + "result": "success" + }, + { + "path": "specifications/MultiCarElevator/ElevatorSafetyMedium.cfg", + "runtime": "00:03:00", + "size": "medium", + "mode": "exhaustive search", + "features": [], + "result": "success" + }, + { + "path": "specifications/MultiCarElevator/ElevatorSafetySmall.cfg", + "runtime": "00:00:15", + "size": "small", + "mode": "exhaustive search", + "features": [], + "result": "success", + "distinctStates": 4122, + "totalStates": 14296, + "stateDepth": 37 + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/MultiPaxos-SMR/manifest.json b/specifications/MultiPaxos-SMR/manifest.json new file mode 100644 index 00000000..7a9b05ab --- /dev/null +++ b/specifications/MultiPaxos-SMR/manifest.json @@ -0,0 +1,56 @@ +{ + "path": "specifications/MultiPaxos-SMR", + "title": "MultiPaxos in SMR-Style", + "description": "MultiPaxos in practical state machine replication system style", + "sources": [ + "https://www.josehu.com/technical/2024/02/19/practical-MultiPaxos-TLA-spec.html" + ], + "authors": [ + "Guanzhou Hu" + ], + "tags": [ + "intermediate" + ], + "modules": [ + { + "path": "specifications/MultiPaxos-SMR/MultiPaxos.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "pluscal" + ], + "models": [] + }, + { + "path": "specifications/MultiPaxos-SMR/MultiPaxos_MC.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/MultiPaxos-SMR/MultiPaxos_MC.cfg", + "runtime": "00:07:53", + "size": "large", + "mode": "exhaustive search", + "features": [ + "symmetry" + ], + "result": "success" + }, + { + "path": "specifications/MultiPaxos-SMR/MultiPaxos_MC_small.cfg", + "runtime": "00:00:10", + "size": "small", + "mode": "exhaustive search", + "features": [ + "symmetry" + ], + "result": "success", + "distinctStates": 343796, + "totalStates": 736012, + "stateDepth": 28 + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/N-Queens/manifest.json b/specifications/N-Queens/manifest.json new file mode 100644 index 00000000..664dca0e --- /dev/null +++ b/specifications/N-Queens/manifest.json @@ -0,0 +1,82 @@ +{ + "path": "specifications/N-Queens", + "title": "The N-Queens Puzzle", + "description": "Place N queens on an NxN chess board such that no two queens threaten each other", + "sources": [], + "authors": [ + "Stephan Merz" + ], + "tags": [ + "beginner" + ], + "modules": [ + { + "path": "specifications/N-Queens/Queens.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/N-Queens/Queens.toolbox/FourQueens/MC.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/N-Queens/Queens.toolbox/FourQueens/MC.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "ignore deadlock" + ], + "result": "safety failure" + } + ] + }, + { + "path": "specifications/N-Queens/Queens.toolbox/FourQueens/Queens.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/N-Queens/QueensPluscal.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "pluscal" + ], + "models": [] + }, + { + "path": "specifications/N-Queens/QueensPluscal.toolbox/FourQueens/MC.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/N-Queens/QueensPluscal.toolbox/FourQueens/MC.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "safety failure" + } + ] + }, + { + "path": "specifications/N-Queens/QueensPluscal.toolbox/FourQueens/QueensPluscal.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "pluscal" + ], + "models": [] + } + ] +} \ No newline at end of file diff --git a/specifications/NanoBlockchain/manifest.json b/specifications/NanoBlockchain/manifest.json new file mode 100644 index 00000000..ac4fc2a8 --- /dev/null +++ b/specifications/NanoBlockchain/manifest.json @@ -0,0 +1,60 @@ +{ + "path": "specifications/NanoBlockchain", + "title": "Nano Blockchain Protocol", + "description": "A specification of the protocol originally used by the Nano blockchain", + "sources": [], + "authors": [ + "Andrew Helwer" + ], + "tags": [], + "modules": [ + { + "path": "specifications/NanoBlockchain/MCNano.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/NanoBlockchain/MCNanoLarge.cfg", + "runtime": "00:20:00", + "size": "large", + "mode": "exhaustive search", + "features": [ + "view" + ], + "result": "success" + }, + { + "path": "specifications/NanoBlockchain/MCNanoMedium.cfg", + "runtime": "00:00:30", + "size": "medium", + "mode": "exhaustive search", + "features": [ + "view" + ], + "result": "success" + }, + { + "path": "specifications/NanoBlockchain/MCNanoSmall.cfg", + "runtime": "00:00:05", + "size": "small", + "mode": "exhaustive search", + "features": [ + "view" + ], + "result": "success", + "distinctStates": 3003, + "totalStates": 6083, + "stateDepth": 7 + } + ] + }, + { + "path": "specifications/NanoBlockchain/Nano.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + } + ] +} \ No newline at end of file diff --git a/specifications/Paxos/manifest.json b/specifications/Paxos/manifest.json new file mode 100644 index 00000000..cd0d97ff --- /dev/null +++ b/specifications/Paxos/manifest.json @@ -0,0 +1,103 @@ +{ + "path": "specifications/Paxos", + "title": "The Paxos Protocol", + "description": "A protocol for error-tolerant consensus", + "sources": [], + "authors": [ + "Leslie Lamport" + ], + "tags": [], + "modules": [ + { + "path": "specifications/Paxos/Consensus.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "proof" + ], + "models": [] + }, + { + "path": "specifications/Paxos/MCConsensus.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/Paxos/MCConsensus.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "ignore deadlock" + ], + "result": "success", + "distinctStates": 4, + "totalStates": 7, + "stateDepth": 1 + } + ] + }, + { + "path": "specifications/Paxos/MCPaxos.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/Paxos/MCPaxos.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness", + "symmetry" + ], + "result": "success", + "distinctStates": 25, + "totalStates": 82, + "stateDepth": 9 + } + ] + }, + { + "path": "specifications/Paxos/MCVoting.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/Paxos/MCVoting.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "ignore deadlock", + "liveness", + "symmetry" + ], + "result": "success", + "distinctStates": 77, + "totalStates": 451, + "stateDepth": 11 + } + ] + }, + { + "path": "specifications/Paxos/Paxos.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/Paxos/Voting.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "proof" + ], + "models": [] + } + ] +} \ No newline at end of file diff --git a/specifications/PaxosHowToWinATuringAward/manifest.json b/specifications/PaxosHowToWinATuringAward/manifest.json new file mode 100644 index 00000000..473829da --- /dev/null +++ b/specifications/PaxosHowToWinATuringAward/manifest.json @@ -0,0 +1,113 @@ +{ + "path": "specifications/PaxosHowToWinATuringAward", + "title": "Paxos (How to Win a Turing Award)", + "description": "Exercises from the lecture The Paxos Algorithm - or How to Win a Turing Award", + "sources": [ + "https://www.youtube.com/watch?v=tw3gsBms-f8" + ], + "authors": [ + "Leslie Lamport" + ], + "tags": [], + "modules": [ + { + "path": "specifications/PaxosHowToWinATuringAward/Consensus.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "proof" + ], + "models": [] + }, + { + "path": "specifications/PaxosHowToWinATuringAward/MCConsensus.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/PaxosHowToWinATuringAward/MCConsensus.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "ignore deadlock" + ], + "result": "success", + "distinctStates": 4, + "totalStates": 4, + "stateDepth": 2 + } + ] + }, + { + "path": "specifications/PaxosHowToWinATuringAward/MCPaxos.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/PaxosHowToWinATuringAward/MCPaxosSmall.cfg", + "runtime": "00:01:00", + "size": "medium", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success" + }, + { + "path": "specifications/PaxosHowToWinATuringAward/MCPaxosTiny.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success", + "distinctStates": 3921, + "totalStates": 23563, + "stateDepth": 17 + } + ] + }, + { + "path": "specifications/PaxosHowToWinATuringAward/MCVoting.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/PaxosHowToWinATuringAward/MCVoting.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "ignore deadlock", + "liveness" + ], + "result": "success", + "distinctStates": 6752, + "totalStates": 41017, + "stateDepth": 16 + } + ] + }, + { + "path": "specifications/PaxosHowToWinATuringAward/Paxos.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/PaxosHowToWinATuringAward/Voting.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "proof" + ], + "models": [] + } + ] +} \ No newline at end of file diff --git a/specifications/Prisoners/manifest.json b/specifications/Prisoners/manifest.json new file mode 100644 index 00000000..117d63d8 --- /dev/null +++ b/specifications/Prisoners/manifest.json @@ -0,0 +1,42 @@ +{ + "path": "specifications/Prisoners", + "title": "The Prisoners & Switches Puzzle", + "description": "Given a room containing two switches prisoners enter one by one, they must develop a strategy to free themselves", + "sources": [], + "authors": [ + "Leslie Lamport" + ], + "tags": [ + "beginner" + ], + "modules": [ + { + "path": "specifications/Prisoners/MCPrisoners.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/Prisoners/Prisoners.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/Prisoners/Prisoners.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success", + "distinctStates": 214, + "totalStates": 860, + "stateDepth": 14 + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/Prisoners_Single_Switch/manifest.json b/specifications/Prisoners_Single_Switch/manifest.json new file mode 100644 index 00000000..55738336 --- /dev/null +++ b/specifications/Prisoners_Single_Switch/manifest.json @@ -0,0 +1,74 @@ +{ + "path": "specifications/Prisoners_Single_Switch", + "title": "The Prisoners & Switch Puzzle", + "description": "Given a room containing a single light switch prisoners enter one by one, they must develop a strategy to free themselves.", + "sources": [], + "authors": [ + "Florian Schanda" + ], + "tags": [ + "beginner" + ], + "modules": [ + { + "path": "specifications/Prisoners_Single_Switch/Prisoner.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/Prisoners_Single_Switch/Prisoner.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success", + "distinctStates": 16, + "totalStates": 49, + "stateDepth": 5 + }, + { + "path": "specifications/Prisoners_Single_Switch/PrisonerLightUnknown.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success", + "distinctStates": 62, + "totalStates": 188, + "stateDepth": 11 + }, + { + "path": "specifications/Prisoners_Single_Switch/PrisonerSolo.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success", + "distinctStates": 2, + "totalStates": 3, + "stateDepth": 2 + }, + { + "path": "specifications/Prisoners_Single_Switch/PrisonerSoloLightUnknown.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success", + "distinctStates": 4, + "totalStates": 6, + "stateDepth": 2 + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/ReadersWriters/manifest.json b/specifications/ReadersWriters/manifest.json new file mode 100644 index 00000000..9c2762cc --- /dev/null +++ b/specifications/ReadersWriters/manifest.json @@ -0,0 +1,40 @@ +{ + "path": "specifications/ReadersWriters", + "title": "The Readers-Writers Problem", + "description": "Controlling concurrent access to a resource", + "sources": [], + "authors": [ + "Isaac DeFrain" + ], + "tags": [], + "modules": [ + { + "path": "specifications/ReadersWriters/MC.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/ReadersWriters/MC.cfg", + "runtime": "00:00:05", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success", + "distinctStates": 21527, + "totalStates": 59674, + "stateDepth": 13 + } + ] + }, + { + "path": "specifications/ReadersWriters/ReadersWriters.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + } + ] +} \ No newline at end of file diff --git a/specifications/SDP_Verification/manifest.json b/specifications/SDP_Verification/manifest.json new file mode 100644 index 00000000..4f80409b --- /dev/null +++ b/specifications/SDP_Verification/manifest.json @@ -0,0 +1,76 @@ +{ + "path": "specifications/SDP_Verification", + "title": "Software-Defined Perimeter", + "description": "Specifying and verifying SDP-protocol-based zero trust architecture", + "sources": [ + "https://github.com/10227694/SDP_Verification" + ], + "authors": [ + "Luming Dong", + "Zhi Niu" + ], + "tags": [], + "modules": [ + { + "path": "specifications/SDP_Verification/SDP_Attack_New_Solution_Spec/MC.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/SDP_Verification/SDP_Attack_New_Solution_Spec/MC.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "ignore deadlock", + "liveness" + ], + "result": "success", + "distinctStates": 2881, + "totalStates": 6826, + "stateDepth": 21 + } + ] + }, + { + "path": "specifications/SDP_Verification/SDP_Attack_New_Solution_Spec/SPA_Attack_New.tla", + "communityDependencies": [ + "Bitwise", + "Functions" + ], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SDP_Verification/SDP_Attack_Spec/MC.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/SDP_Verification/SDP_Attack_Spec/MC.cfg", + "runtime": "00:00:05", + "size": "small", + "mode": "exhaustive search", + "features": [ + "ignore deadlock", + "liveness" + ], + "result": "safety failure" + } + ] + }, + { + "path": "specifications/SDP_Verification/SDP_Attack_Spec/SPA_Attack.tla", + "communityDependencies": [ + "Bitwise", + "Functions" + ], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + } + ] +} \ No newline at end of file diff --git a/specifications/SimplifiedFastPaxos/manifest.json b/specifications/SimplifiedFastPaxos/manifest.json new file mode 100644 index 00000000..707ad668 --- /dev/null +++ b/specifications/SimplifiedFastPaxos/manifest.json @@ -0,0 +1,54 @@ +{ + "path": "specifications/SimplifiedFastPaxos", + "title": "Simplified Fast Paxos", + "description": "Spec of simplified Fast Paxos from Lamport's 2006 paper Fast Paxos", + "sources": [], + "authors": [ + "Lim Ngian Xin Terry", + "Gaurav Gandhi" + ], + "tags": [], + "modules": [ + { + "path": "specifications/SimplifiedFastPaxos/FastPaxos.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/SimplifiedFastPaxos/FastPaxos.cfg", + "runtime": "00:00:30", + "size": "medium", + "mode": "exhaustive search", + "features": [ + "liveness", + "symmetry" + ], + "result": "success" + } + ] + }, + { + "path": "specifications/SimplifiedFastPaxos/Paxos.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/SimplifiedFastPaxos/Paxos.cfg", + "runtime": "00:00:05", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness", + "symmetry" + ], + "result": "success", + "distinctStates": 1207, + "totalStates": 13290, + "stateDepth": 22 + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/SingleLaneBridge/manifest.json b/specifications/SingleLaneBridge/manifest.json new file mode 100644 index 00000000..5d949346 --- /dev/null +++ b/specifications/SingleLaneBridge/manifest.json @@ -0,0 +1,40 @@ +{ + "path": "specifications/SingleLaneBridge", + "title": "Single-Lane Bridge Problem", + "description": "Controlling cars moving over a single-lange bridge in opposite directions", + "sources": [], + "authors": [ + "Younes Akhouayri" + ], + "tags": [], + "modules": [ + { + "path": "specifications/SingleLaneBridge/MC.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/SingleLaneBridge/MC.cfg", + "runtime": "00:00:10", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success", + "distinctStates": 3605, + "totalStates": 20181, + "stateDepth": 29 + } + ] + }, + { + "path": "specifications/SingleLaneBridge/SingleLaneBridge.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + } + ] +} \ No newline at end of file diff --git a/specifications/SlidingPuzzles/manifest.json b/specifications/SlidingPuzzles/manifest.json new file mode 100644 index 00000000..b5771801 --- /dev/null +++ b/specifications/SlidingPuzzles/manifest.json @@ -0,0 +1,28 @@ +{ + "path": "specifications/SlidingPuzzles", + "title": "Sliding Block Puzzle", + "description": "A spec of the Klotski sliding block puzzle", + "sources": [], + "authors": [ + "Mariusz Ryndzionek" + ], + "tags": [], + "modules": [ + { + "path": "specifications/SlidingPuzzles/SlidingPuzzles.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/SlidingPuzzles/SlidingPuzzles.cfg", + "runtime": "00:00:05", + "size": "small", + "mode": "exhaustive search", + "features": [], + "result": "safety failure" + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/SlushProtocol/manifest.json b/specifications/SlushProtocol/manifest.json new file mode 100644 index 00000000..52983159 --- /dev/null +++ b/specifications/SlushProtocol/manifest.json @@ -0,0 +1,52 @@ +{ + "path": "specifications/SlushProtocol", + "title": "The Slush Protocol", + "description": "An attempt to use TLA⁺ to analyze a probabilistic protocol in the Avalanche family", + "sources": [ + "https://github.com/ahelwer/avalanche-analysis", + "https://ahelwer.ca/post/2020-09-11-probabilistic-distsys/" + ], + "authors": [ + "Andrew Helwer" + ], + "tags": [], + "modules": [ + { + "path": "specifications/SlushProtocol/Slush.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "pluscal" + ], + "models": [ + { + "path": "specifications/SlushProtocol/SlushLarge.cfg", + "runtime": "00:50:00", + "size": "large", + "mode": "exhaustive search", + "features": [], + "result": "success" + }, + { + "path": "specifications/SlushProtocol/SlushMedium.cfg", + "runtime": "00:01:00", + "size": "medium", + "mode": "exhaustive search", + "features": [], + "result": "success" + }, + { + "path": "specifications/SlushProtocol/SlushSmall.cfg", + "runtime": "00:00:15", + "size": "small", + "mode": "exhaustive search", + "features": [], + "result": "success", + "distinctStates": 274678, + "totalStates": 1621541, + "stateDepth": 43 + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/SpanningTree/manifest.json b/specifications/SpanningTree/manifest.json new file mode 100644 index 00000000..65ac2813 --- /dev/null +++ b/specifications/SpanningTree/manifest.json @@ -0,0 +1,86 @@ +{ + "path": "specifications/SpanningTree", + "title": "Span Tree Exercise", + "description": "Simplified algorithm from the Lamport paper *An Assertional Correctness Proof of a Distributed Program*", + "sources": [], + "authors": [ + "Leslie Lamport" + ], + "tags": [], + "modules": [ + { + "path": "specifications/SpanningTree/SpanTree.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/SpanningTree/SpanTree.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "ignore deadlock", + "liveness" + ], + "result": "success", + "distinctStates": 1236, + "totalStates": 10278, + "stateDepth": 6 + } + ] + }, + { + "path": "specifications/SpanningTree/SpanTreeRandom.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/SpanningTree/SpanTreeRandom.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "ignore deadlock", + "liveness" + ], + "result": "success" + } + ] + }, + { + "path": "specifications/SpanningTree/SpanTreeTest.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/SpanningTree/SpanTreeTest4Nodes.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "ignore deadlock", + "liveness" + ], + "result": "success", + "distinctStates": 3984, + "totalStates": 21784, + "stateDepth": 4 + }, + { + "path": "specifications/SpanningTree/SpanTreeTest5Nodes.cfg", + "runtime": "unknown", + "size": "large", + "mode": "exhaustive search", + "features": [ + "ignore deadlock", + "liveness" + ], + "result": "unknown" + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/SpecifyingSystems/manifest.json b/specifications/SpecifyingSystems/manifest.json new file mode 100644 index 00000000..6f92284b --- /dev/null +++ b/specifications/SpecifyingSystems/manifest.json @@ -0,0 +1,741 @@ +{ + "path": "specifications/SpecifyingSystems", + "title": "Specs from Specifying Systems", + "description": "All specs seen in the textbook Specifying Systems by Leslie Lamport", + "sources": [ + "http://lamport.azurewebsites.net/tla/book.html" + ], + "authors": [ + "Leslie Lamport" + ], + "tags": [ + "beginner" + ], + "modules": [ + { + "path": "specifications/SpecifyingSystems/AdvancedExamples/BNFGrammars.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/AdvancedExamples/DifferentialEquations.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/AdvancedExamples/Graphs.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/AdvancedExamples/InnerSequential.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/AdvancedExamples/InnerSerial.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/AdvancedExamples/MCInnerSequential.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/SpecifyingSystems/AdvancedExamples/MCInnerSequential.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness", + "state constraint" + ], + "result": "success", + "distinctStates": 3528, + "totalStates": 24368, + "stateDepth": 9 + } + ] + }, + { + "path": "specifications/SpecifyingSystems/AdvancedExamples/MCInnerSerial.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/SpecifyingSystems/AdvancedExamples/MCInnerSerial.cfg", + "runtime": "00:01:30", + "size": "medium", + "mode": "exhaustive search", + "features": [ + "liveness", + "state constraint" + ], + "result": "success" + } + ] + }, + { + "path": "specifications/SpecifyingSystems/AdvancedExamples/RegisterInterface.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/AdvancedExamples/SerialMemory.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/AsynchronousInterface/AsynchInterface.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/SpecifyingSystems/AsynchronousInterface/AsynchInterface.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [], + "result": "success", + "distinctStates": 12, + "totalStates": 30, + "stateDepth": 2 + } + ] + }, + { + "path": "specifications/SpecifyingSystems/AsynchronousInterface/Channel.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/SpecifyingSystems/AsynchronousInterface/Channel.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [], + "result": "success", + "distinctStates": 12, + "totalStates": 30, + "stateDepth": 2 + } + ] + }, + { + "path": "specifications/SpecifyingSystems/AsynchronousInterface/PrintValues.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/SpecifyingSystems/AsynchronousInterface/PrintValues.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [], + "result": "success", + "distinctStates": 0, + "totalStates": 0, + "stateDepth": 0 + } + ] + }, + { + "path": "specifications/SpecifyingSystems/CachingMemory/InternalMemory.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/CachingMemory/MCInternalMemory.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/SpecifyingSystems/CachingMemory/MCInternalMemory.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [], + "result": "success", + "distinctStates": 4408, + "totalStates": 21400, + "stateDepth": 10 + } + ] + }, + { + "path": "specifications/SpecifyingSystems/CachingMemory/MCWriteThroughCache.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/SpecifyingSystems/CachingMemory/MCWriteThroughCache.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success", + "distinctStates": 5196, + "totalStates": 28170, + "stateDepth": 18 + } + ] + }, + { + "path": "specifications/SpecifyingSystems/CachingMemory/Memory.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/CachingMemory/MemoryInterface.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/CachingMemory/WriteThroughCache.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/CachingMemory/WriteThroughCacheInstanced.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/Composing/BinaryHourClock.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/Composing/Channel.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/Composing/ChannelRefinement.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/Composing/CompositeFIFO.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/Composing/HourClock.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/Composing/InternalMemory.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/Composing/JointActionMemory.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/Composing/MemoryInterface.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/FIFO/Channel.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/FIFO/FIFO.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/FIFO/InnerFIFO.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/FIFO/InnerFIFOInstanced.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/FIFO/MCInnerFIFO.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/SpecifyingSystems/FIFO/MCInnerFIFO.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "state constraint" + ], + "result": "success", + "distinctStates": 3864, + "totalStates": 9660, + "stateDepth": 11 + } + ] + }, + { + "path": "specifications/SpecifyingSystems/HourClock/HourClock.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/SpecifyingSystems/HourClock/HourClock.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [], + "result": "success", + "distinctStates": 12, + "totalStates": 24, + "stateDepth": 1 + } + ] + }, + { + "path": "specifications/SpecifyingSystems/HourClock/HourClock2.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/SpecifyingSystems/HourClock/HourClock2.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success", + "distinctStates": 12, + "totalStates": 24, + "stateDepth": 1 + } + ] + }, + { + "path": "specifications/SpecifyingSystems/Liveness/HourClock.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/Liveness/InternalMemory.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/Liveness/LiveHourClock.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/SpecifyingSystems/Liveness/LiveHourClock.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success", + "distinctStates": 12, + "totalStates": 24, + "stateDepth": 1 + } + ] + }, + { + "path": "specifications/SpecifyingSystems/Liveness/LiveInternalMemory.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/Liveness/LiveWriteThroughCache.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/Liveness/MCInternalMemory.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/Liveness/MCLiveInternalMemory.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/SpecifyingSystems/Liveness/MCLiveInternalMemory.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success", + "distinctStates": 4408, + "totalStates": 21400, + "stateDepth": 10 + } + ] + }, + { + "path": "specifications/SpecifyingSystems/Liveness/MCLiveWriteThroughCache.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/SpecifyingSystems/Liveness/MCLiveWriteThroughCache.cfg", + "runtime": "00:00:05", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success", + "distinctStates": 5196, + "totalStates": 28170, + "stateDepth": 18 + } + ] + }, + { + "path": "specifications/SpecifyingSystems/Liveness/Memory.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/Liveness/MemoryInterface.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/Liveness/WriteThroughCacheInstanced.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/RealTime/HourClock.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/RealTime/InternalMemory.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/RealTime/MCRealTime.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/RealTime/MCRealTimeHourClock.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/SpecifyingSystems/RealTime/MCRealTimeHourClock.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "liveness failure" + } + ] + }, + { + "path": "specifications/SpecifyingSystems/RealTime/Memory.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/RealTime/MemoryInterface.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/RealTime/RTMemory.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/RealTime/RTWriteThroughCache.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/RealTime/RealTimeHourClock.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/RealTime/RealTime_SS.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/RealTime/WriteThroughCache.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/SimpleMath/SimpleMath.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/SpecifyingSystems/SimpleMath/SimpleMath.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [], + "result": "success", + "distinctStates": 0, + "totalStates": 0, + "stateDepth": 0 + } + ] + }, + { + "path": "specifications/SpecifyingSystems/Standard/Bags.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/Standard/FiniteSets.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/Standard/Integers.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/Standard/Naturals.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/Standard/Peano.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/Standard/ProtoReals.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/Standard/Reals.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/Standard/Sequences.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/Syntax/BNFGrammars.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/Syntax/TLAPlusGrammar.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/TLC/ABCorrectness.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/SpecifyingSystems/TLC/ABCorrectness.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [], + "result": "success", + "distinctStates": 20, + "totalStates": 36, + "stateDepth": 3 + } + ] + }, + { + "path": "specifications/SpecifyingSystems/TLC/AlternatingBit.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/TLC/BNFGrammars.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/TLC/ConfigFileGrammar.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/SpecifyingSystems/TLC/MCAlternatingBit.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/SpecifyingSystems/TLC/MCAlternatingBit.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness", + "state constraint" + ], + "result": "success", + "distinctStates": 240, + "totalStates": 1392, + "stateDepth": 10 + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/Stones/manifest.json b/specifications/Stones/manifest.json new file mode 100644 index 00000000..69736d28 --- /dev/null +++ b/specifications/Stones/manifest.json @@ -0,0 +1,33 @@ +{ + "path": "specifications/Stones", + "title": "Stone Scale Puzzle", + "description": "Alternative implementation of the Car Talk Puzzle", + "sources": [], + "authors": [ + "Leslie Lamport" + ], + "tags": [ + "beginner" + ], + "modules": [ + { + "path": "specifications/Stones/Stones.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/Stones/Stones.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [], + "result": "success", + "distinctStates": 0, + "totalStates": 0, + "stateDepth": 0 + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/TLC/manifest.json b/specifications/TLC/manifest.json new file mode 100644 index 00000000..fc91fa35 --- /dev/null +++ b/specifications/TLC/manifest.json @@ -0,0 +1,42 @@ +{ + "path": "specifications/TLC", + "title": "The TLC Safety Checking Algorithm", + "description": "Spec of the safety checking algorithm used by the TLC model-checker", + "sources": [], + "authors": [ + "Markus Kuppe" + ], + "tags": [], + "modules": [ + { + "path": "specifications/TLC/TLCMC.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "pluscal" + ], + "models": [] + }, + { + "path": "specifications/TLC/TestGraphs.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/TLC/TestGraphs.cfg", + "runtime": "00:00:05", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success", + "distinctStates": 2790, + "totalStates": 2990, + "stateDepth": 52 + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/TeachingConcurrency/manifest.json b/specifications/TeachingConcurrency/manifest.json new file mode 100644 index 00000000..d15402c9 --- /dev/null +++ b/specifications/TeachingConcurrency/manifest.json @@ -0,0 +1,60 @@ +{ + "path": "specifications/TeachingConcurrency", + "title": "Teaching Concurrency", + "description": "Simple problem useful for teaching and learning about concurrency", + "sources": [ + "http://lamport.azurewebsites.net/pubs/teaching-concurrency.pdf" + ], + "authors": [ + "Leslie Lamport" + ], + "tags": [ + "beginner" + ], + "modules": [ + { + "path": "specifications/TeachingConcurrency/Simple.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "pluscal", + "proof" + ], + "models": [ + { + "path": "specifications/TeachingConcurrency/Simple.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [], + "result": "success", + "distinctStates": 723, + "totalStates": 1842, + "stateDepth": 11 + } + ] + }, + { + "path": "specifications/TeachingConcurrency/SimpleRegular.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "pluscal", + "proof" + ], + "models": [ + { + "path": "specifications/TeachingConcurrency/SimpleRegular.cfg", + "runtime": "00:00:05", + "size": "small", + "mode": "exhaustive search", + "features": [], + "result": "success", + "distinctStates": 277726, + "totalStates": 1454776, + "stateDepth": 25 + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/TransitiveClosure/manifest.json b/specifications/TransitiveClosure/manifest.json new file mode 100644 index 00000000..6b1820b2 --- /dev/null +++ b/specifications/TransitiveClosure/manifest.json @@ -0,0 +1,31 @@ +{ + "path": "specifications/TransitiveClosure", + "title": "Transitive Closure", + "description": "Spec defining the transitive closure of a relation", + "sources": [], + "authors": [ + "Stephan Merz" + ], + "tags": [], + "modules": [ + { + "path": "specifications/TransitiveClosure/TransitiveClosure.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/TransitiveClosure/TransitiveClosure.cfg", + "runtime": "00:00:05", + "size": "small", + "mode": "exhaustive search", + "features": [], + "result": "success", + "distinctStates": 0, + "totalStates": 0, + "stateDepth": 0 + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/TwoPhase/manifest.json b/specifications/TwoPhase/manifest.json new file mode 100644 index 00000000..9bdad45b --- /dev/null +++ b/specifications/TwoPhase/manifest.json @@ -0,0 +1,48 @@ +{ + "path": "specifications/TwoPhase", + "title": "Two-Phase Handshaking", + "description": "Specification of a very simple hardware protocol called two-phase handshaking", + "sources": [], + "authors": [ + "Leslie Lamport", + "Stephan Merz" + ], + "tags": [], + "modules": [ + { + "path": "specifications/TwoPhase/Alternate.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/TwoPhase/MCTwoPhase.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/TwoPhase/MCTwoPhase.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [], + "result": "success", + "distinctStates": 4, + "totalStates": 5, + "stateDepth": 4 + } + ] + }, + { + "path": "specifications/TwoPhase/TwoPhase.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "proof" + ], + "models": [] + } + ] +} \ No newline at end of file diff --git a/specifications/YoYo/manifest.json b/specifications/YoYo/manifest.json new file mode 100644 index 00000000..e8806f29 --- /dev/null +++ b/specifications/YoYo/manifest.json @@ -0,0 +1,100 @@ +{ + "path": "specifications/YoYo", + "title": "Yo-Yo Leader Election", + "description": "Algorithm due to Nicola Santoro for leader election in a connected undirected network", + "sources": [ + "https://research.nicola-santoro.com/DADA.html" + ], + "authors": [ + "Ludovic Yvoz", + "Stephan Merz" + ], + "tags": [], + "modules": [ + { + "path": "specifications/YoYo/MCYoYoNoPruning.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/YoYo/MCYoYoNoPruning.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success", + "distinctStates": 60, + "totalStates": 110, + "stateDepth": 19 + } + ] + }, + { + "path": "specifications/YoYo/MCYoYoPruning.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/YoYo/MCYoYoPruning.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "ignore deadlock", + "liveness" + ], + "result": "success", + "distinctStates": 102, + "totalStates": 157, + "stateDepth": 31 + } + ] + }, + { + "path": "specifications/YoYo/YoYoAllGraphs.tla", + "communityDependencies": [ + "UndirectedGraphs" + ], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/YoYo/YoYoAllGraphs.cfg", + "runtime": "00:00:02", + "size": "medium", + "mode": "exhaustive search", + "features": [ + "ignore deadlock", + "liveness" + ], + "result": "success", + "distinctStates": 26731, + "totalStates": 48535, + "stateDepth": 39 + } + ] + }, + { + "path": "specifications/YoYo/YoYoNoPruning.tla", + "communityDependencies": [ + "UndirectedGraphs" + ], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/YoYo/YoYoPruning.tla", + "communityDependencies": [ + "UndirectedGraphs" + ], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + } + ] +} \ No newline at end of file diff --git a/specifications/aba-asyn-byz/manifest.json b/specifications/aba-asyn-byz/manifest.json new file mode 100644 index 00000000..a0434c80 --- /dev/null +++ b/specifications/aba-asyn-byz/manifest.json @@ -0,0 +1,32 @@ +{ + "path": "specifications/aba-asyn-byz", + "title": "Asynchronous Byzantine Consensus", + "description": "Spec of the protocol from paper *Asynchronous Consensus and Broadcast Protocols* (1985)", + "sources": [], + "authors": [ + "Igor Konnov", + "Josef Widder", + "Thanh Hai Tran" + ], + "tags": [], + "modules": [ + { + "path": "specifications/aba-asyn-byz/aba_asyn_byz.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/aba-asyn-byz/aba_asyn_byz.cfg", + "runtime": "00:10:00", + "size": "large", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success" + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/acp/manifest.json b/specifications/acp/manifest.json new file mode 100644 index 00000000..da270153 --- /dev/null +++ b/specifications/acp/manifest.json @@ -0,0 +1,92 @@ +{ + "path": "specifications/acp", + "title": "Atomic Commitment Protocol", + "description": "TLA⁺ specs from CS-986: Advanced Topics in Program Verification", + "sources": [ + "https://members.loria.fr/SMerz/talks/argentina2005/Charpentier/charpov/Teaching/CS-986/TLC/", + "https://dl.acm.org/doi/10.5555/302430.302436" + ], + "authors": [ + "Stephan Merz" + ], + "tags": [], + "modules": [ + { + "path": "specifications/acp/ACP_NB.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/acp/ACP_NB_TLC.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/acp/ACP_NB_TLC.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "ignore deadlock", + "liveness" + ], + "result": "success", + "distinctStates": 4284, + "totalStates": 23988, + "stateDepth": 19 + } + ] + }, + { + "path": "specifications/acp/ACP_NB_WRONG_TLC.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/acp/ACP_NB_WRONG_TLC.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "ignore deadlock", + "liveness" + ], + "result": "safety failure" + } + ] + }, + { + "path": "specifications/acp/ACP_SB.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/acp/ACP_SB_TLC.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/acp/ACP_SB_TLC.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "ignore deadlock", + "liveness" + ], + "result": "success", + "distinctStates": 54944, + "totalStates": 218352, + "stateDepth": 21 + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/allocator/manifest.json b/specifications/allocator/manifest.json new file mode 100644 index 00000000..86e60fdf --- /dev/null +++ b/specifications/allocator/manifest.json @@ -0,0 +1,96 @@ +{ + "path": "specifications/allocator", + "title": "Resource Allocator", + "description": "Specification of a resource allocator", + "sources": [], + "authors": [ + "Stephan Merz" + ], + "tags": [], + "modules": [ + { + "path": "specifications/allocator/AllocatorImplementation.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/allocator/AllocatorImplementation.cfg", + "runtime": "00:00:15", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success", + "distinctStates": 17701, + "totalStates": 64414, + "stateDepth": 16 + } + ] + }, + { + "path": "specifications/allocator/AllocatorRefinement.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/allocator/AllocatorRefinement.cfg", + "runtime": "00:00:05", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success", + "distinctStates": 1690, + "totalStates": 5854, + "stateDepth": 7 + } + ] + }, + { + "path": "specifications/allocator/SchedulingAllocator.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/allocator/SchedulingAllocator.cfg", + "runtime": "00:00:10", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success", + "distinctStates": 1690, + "totalStates": 5854, + "stateDepth": 7 + } + ] + }, + { + "path": "specifications/allocator/SimpleAllocator.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/allocator/SimpleAllocator.cfg", + "runtime": "00:00:05", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success", + "distinctStates": 400, + "totalStates": 1633, + "stateDepth": 6 + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/bcastByz/manifest.json b/specifications/bcastByz/manifest.json new file mode 100644 index 00000000..25f06b8f --- /dev/null +++ b/specifications/bcastByz/manifest.json @@ -0,0 +1,50 @@ +{ + "path": "specifications/bcastByz", + "title": "Asynchronous Reliable Broadcast", + "description": "Algorithm from paper *Simulating authenticated broadcasts to derive simple fault-tolerant algorithms* (1987)", + "sources": [], + "authors": [ + "Igor Konnov", + "Josef Widder", + "Thanh Hai Tran" + ], + "tags": [], + "modules": [ + { + "path": "specifications/bcastByz/bcastByz.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "proof" + ], + "models": [ + { + "path": "specifications/bcastByz/bcastByz.cfg", + "runtime": "00:00:10", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success", + "distinctStates": 14424, + "totalStates": 227344, + "stateDepth": 7 + }, + { + "path": "specifications/bcastByz/bcastByzNoBcast.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success", + "distinctStates": 45, + "totalStates": 90, + "stateDepth": 1 + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/bcastFolklore/manifest.json b/specifications/bcastFolklore/manifest.json new file mode 100644 index 00000000..db141b34 --- /dev/null +++ b/specifications/bcastFolklore/manifest.json @@ -0,0 +1,32 @@ +{ + "path": "specifications/bcastFolklore", + "title": "Folklore Reliable Broadcast", + "description": "Algorithm from paper *Unreliable failure detectors for reliable distributed systems* (1996)", + "sources": [], + "authors": [ + "Igor Konnov", + "Josef Widder", + "Thanh Hai Tran" + ], + "tags": [], + "modules": [ + { + "path": "specifications/bcastFolklore/bcastFolklore.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/bcastFolklore/bcastFolklore.cfg", + "runtime": "00:30:00", + "size": "large", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success" + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/bosco/manifest.json b/specifications/bosco/manifest.json new file mode 100644 index 00000000..08258ad6 --- /dev/null +++ b/specifications/bosco/manifest.json @@ -0,0 +1,30 @@ +{ + "path": "specifications/bosco", + "title": "The Bosco Byzantine Consensus Algorithm", + "description": "Algorithm from paper *Bosco: One-step byzantine asynchronous consensus* (2008)", + "sources": [], + "authors": [ + "Igor Konnov", + "Josef Widder", + "Thanh Hai Tran" + ], + "tags": [], + "modules": [ + { + "path": "specifications/bosco/bosco.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/bosco/bosco.cfg", + "runtime": "00:03:00", + "size": "medium", + "mode": "exhaustive search", + "features": [], + "result": "success" + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/braf/manifest.json b/specifications/braf/manifest.json new file mode 100644 index 00000000..919f49df --- /dev/null +++ b/specifications/braf/manifest.json @@ -0,0 +1,37 @@ +{ + "path": "specifications/braf", + "title": "Buffered Random Access File", + "description": "Specification of a Java file caching layer", + "sources": [ + "https://github.com/tlaplus/tlaplus/tree/4613109641676389d97b8df209d6cf4d90d31c1c/tlatools/org.lamport.tlatools/src/tlc2/util/BufferedRandomAccessFile.tla" + ], + "authors": [ + "Calvin Loncaric" + ], + "tags": [], + "modules": [ + { + "path": "specifications/braf/BufferedRandomAccessFile.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/braf/BufferedRandomAccessFile.cfg", + "runtime": "00:00:09", + "size": "small", + "mode": "exhaustive search", + "features": [ + "alias", + "liveness", + "symmetry" + ], + "result": "success", + "distinctStates": 3316, + "totalStates": 128581, + "stateDepth": 11 + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/byihive/manifest.json b/specifications/byihive/manifest.json new file mode 100644 index 00000000..d031a1eb --- /dev/null +++ b/specifications/byihive/manifest.json @@ -0,0 +1,122 @@ +{ + "path": "specifications/byihive", + "title": "RFC 3506: Voucher Transaction System", + "description": "Formal specification of a peer-to-peer ledger protocol", + "sources": [ + "https://github.com/byisystems/byihive" + ], + "authors": [ + "Santhosh Raju", + "Cherry G. Mathew", + "Fransisca Andriani" + ], + "tags": [], + "modules": [ + { + "path": "specifications/byihive/VoucherCancel.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/byihive/VoucherCancel.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "ignore deadlock" + ], + "result": "success", + "distinctStates": 4199, + "totalStates": 26848, + "stateDepth": 11 + } + ] + }, + { + "path": "specifications/byihive/VoucherIssue.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/byihive/VoucherIssue.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "ignore deadlock", + "liveness" + ], + "result": "success", + "distinctStates": 4199, + "totalStates": 26848, + "stateDepth": 11 + } + ] + }, + { + "path": "specifications/byihive/VoucherLifeCycle.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/byihive/VoucherLifeCycle.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "ignore deadlock" + ], + "result": "success", + "distinctStates": 64, + "totalStates": 193, + "stateDepth": 7 + } + ] + }, + { + "path": "specifications/byihive/VoucherRedeem.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/byihive/VoucherRedeem.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "ignore deadlock" + ], + "result": "success", + "distinctStates": 4199, + "totalStates": 26848, + "stateDepth": 11 + } + ] + }, + { + "path": "specifications/byihive/VoucherTransfer.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/byihive/VoucherTransfer.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "ignore deadlock" + ], + "result": "success", + "distinctStates": 4197, + "totalStates": 26848, + "stateDepth": 11 + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/byzpaxos/manifest.json b/specifications/byzpaxos/manifest.json new file mode 100644 index 00000000..326e1b7f --- /dev/null +++ b/specifications/byzpaxos/manifest.json @@ -0,0 +1,104 @@ +{ + "path": "specifications/byzpaxos", + "title": "Byzantizing Paxos by Refinement", + "description": "Mechanically-checked safety proof of a Byzantine Paxos algorithm", + "sources": [ + "http://lamport.azurewebsites.net/pubs/pubs.html#web-byzpaxos", + "http://lamport.azurewebsites.net/pubs/web-byzpaxos.pdf", + "http://lamport.azurewebsites.net/tla/byzpaxos.html" + ], + "authors": [ + "Leslie Lamport" + ], + "tags": [], + "modules": [ + { + "path": "specifications/byzpaxos/BPConProof.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "pluscal", + "proof" + ], + "models": [ + { + "path": "specifications/byzpaxos/BPConProof.cfg", + "runtime": "unknown", + "size": "large", + "mode": "exhaustive search", + "features": [], + "result": "unknown" + } + ] + }, + { + "path": "specifications/byzpaxos/Consensus.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "pluscal", + "proof" + ], + "models": [ + { + "path": "specifications/byzpaxos/Consensus.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "ignore deadlock", + "liveness" + ], + "result": "success", + "distinctStates": 4, + "totalStates": 4, + "stateDepth": 2 + } + ] + }, + { + "path": "specifications/byzpaxos/PConProof.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "pluscal", + "proof" + ], + "models": [ + { + "path": "specifications/byzpaxos/PConProof.cfg", + "runtime": "00:06:00", + "size": "large", + "mode": "exhaustive search", + "features": [], + "result": "success" + } + ] + }, + { + "path": "specifications/byzpaxos/VoteProof.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "pluscal", + "proof" + ], + "models": [ + { + "path": "specifications/byzpaxos/VoteProof.cfg", + "runtime": "00:00:05", + "size": "small", + "mode": "exhaustive search", + "features": [ + "ignore deadlock", + "liveness" + ], + "result": "success", + "distinctStates": 6962, + "totalStates": 318877, + "stateDepth": 15 + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/c1cs/manifest.json b/specifications/c1cs/manifest.json new file mode 100644 index 00000000..ed1e6069 --- /dev/null +++ b/specifications/c1cs/manifest.json @@ -0,0 +1,32 @@ +{ + "path": "specifications/c1cs", + "title": "Consensus in One Communication Step", + "description": "Algorithm from paper *Consensus in one communication step* (2001)", + "sources": [], + "authors": [ + "Igor Konnov", + "Josef Widder", + "Thanh Hai Tran" + ], + "tags": [], + "modules": [ + { + "path": "specifications/c1cs/c1cs.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/c1cs/c1cs.cfg", + "runtime": "unknown", + "size": "large", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "unknown" + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/cbc_max/manifest.json b/specifications/cbc_max/manifest.json new file mode 100644 index 00000000..bb0bf4a1 --- /dev/null +++ b/specifications/cbc_max/manifest.json @@ -0,0 +1,21 @@ +{ + "path": "specifications/cbc_max", + "title": "Condition-Based Consensus", + "description": "Algorithm from paper *Evaluating the condition-based approach to solve consensus* (2003)", + "sources": [], + "authors": [ + "Igor Konnov", + "Josef Widder", + "Thanh Hai Tran" + ], + "tags": [], + "modules": [ + { + "path": "specifications/cbc_max/cbc_max.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + } + ] +} \ No newline at end of file diff --git a/specifications/cf1s-folklore/manifest.json b/specifications/cf1s-folklore/manifest.json new file mode 100644 index 00000000..6c3cba23 --- /dev/null +++ b/specifications/cf1s-folklore/manifest.json @@ -0,0 +1,32 @@ +{ + "path": "specifications/cf1s-folklore", + "title": "One-Step Consensus with Zero-Degradation", + "description": "Algorithm from paper *One-step Consensus with Zero-Degradation* (2006)", + "sources": [], + "authors": [ + "Igor Konnov", + "Josef Widder", + "Thanh Hai Tran" + ], + "tags": [], + "modules": [ + { + "path": "specifications/cf1s-folklore/cf1s_folklore.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/cf1s-folklore/cf1s_folklore.cfg", + "runtime": "00:01:00", + "size": "medium", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success" + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/chang_roberts/manifest.json b/specifications/chang_roberts/manifest.json new file mode 100644 index 00000000..91590ceb --- /dev/null +++ b/specifications/chang_roberts/manifest.json @@ -0,0 +1,43 @@ +{ + "path": "specifications/chang_roberts", + "title": "Chang-Roberts Algorithm for Leader Election in a Ring", + "description": "Algorithm from paper *An improved algorithm for decentralized extrema-finding in circular configurations of processes* (1979)", + "sources": [], + "authors": [ + "Stephan Merz" + ], + "tags": [], + "modules": [ + { + "path": "specifications/chang_roberts/ChangRoberts.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "pluscal" + ], + "models": [] + }, + { + "path": "specifications/chang_roberts/MCChangRoberts.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/chang_roberts/MCChangRoberts.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "ignore deadlock", + "liveness" + ], + "result": "success", + "distinctStates": 137, + "totalStates": 227, + "stateDepth": 10 + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/detector_chan96/manifest.json b/specifications/detector_chan96/manifest.json new file mode 100644 index 00000000..6372ce38 --- /dev/null +++ b/specifications/detector_chan96/manifest.json @@ -0,0 +1,46 @@ +{ + "path": "specifications/detector_chan96", + "title": "Failure Detector", + "description": "Algorithm from paper *Unreliable failure detectors for reliable distributed systems* (1996)", + "sources": [], + "authors": [ + "Igor Konnov", + "Josef Widder", + "Thanh Hai Tran" + ], + "tags": [], + "modules": [ + { + "path": "specifications/detector_chan96/Age_Channel.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/detector_chan96/EPFailureDetector.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/detector_chan96/EnvironmentController.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/detector_chan96/EnvironmentController.cfg", + "runtime": "02:00:00", + "size": "large", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success" + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/dijkstra-mutex/manifest.json b/specifications/dijkstra-mutex/manifest.json new file mode 100644 index 00000000..915d6ca5 --- /dev/null +++ b/specifications/dijkstra-mutex/manifest.json @@ -0,0 +1,75 @@ +{ + "path": "specifications/dijkstra-mutex", + "title": "Dijkstra's Mutual Exclusion Algorithm", + "description": "Algorithm from paper *Solution of a Problem in Concurrent Programming Control* (1965)", + "sources": [], + "authors": [ + "Leslie Lamport" + ], + "tags": [ + "ewd" + ], + "modules": [ + { + "path": "specifications/dijkstra-mutex/DijkstraMutex.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "pluscal" + ], + "models": [] + }, + { + "path": "specifications/dijkstra-mutex/DijkstraMutex.toolbox/LSpec-model/DijkstraMutex.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "pluscal" + ], + "models": [] + }, + { + "path": "specifications/dijkstra-mutex/DijkstraMutex.toolbox/LSpec-model/MC.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/dijkstra-mutex/DijkstraMutex.toolbox/LSpec-model/MC.cfg", + "runtime": "00:00:50", + "size": "medium", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success" + } + ] + }, + { + "path": "specifications/dijkstra-mutex/DijkstraMutex.toolbox/Safety-4-processors/DijkstraMutex.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "pluscal" + ], + "models": [] + }, + { + "path": "specifications/dijkstra-mutex/DijkstraMutex.toolbox/Safety-4-processors/MC.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/dijkstra-mutex/DijkstraMutex.toolbox/Safety-4-processors/MC.cfg", + "runtime": "00:02:00", + "size": "medium", + "mode": "exhaustive search", + "features": [], + "result": "success" + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/diskpaxos/manifest.json b/specifications/diskpaxos/manifest.json new file mode 100644 index 00000000..1d0bef79 --- /dev/null +++ b/specifications/diskpaxos/manifest.json @@ -0,0 +1,52 @@ +{ + "path": "specifications/diskpaxos", + "title": "SWMR Shared Memory Disk Paxos", + "description": "A formalization of the SWMR-Shared-Memory Disk Paxos", + "sources": [ + "https://github.com/nano-o/MultiPaxos/blob/master/DiskPaxos.tla" + ], + "authors": [ + "Giuliano Losa", + "Leslie Lamport" + ], + "tags": [], + "modules": [ + { + "path": "specifications/diskpaxos/DiskSynod.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/diskpaxos/HDiskSynod.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/diskpaxos/MC_HDiskSynod.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/diskpaxos/MC_HDiskSynod.cfg", + "runtime": "unknown", + "size": "large", + "mode": "exhaustive search", + "features": [], + "result": "unknown" + } + ] + }, + { + "path": "specifications/diskpaxos/Synod.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + } + ] +} \ No newline at end of file diff --git a/specifications/echo/manifest.json b/specifications/echo/manifest.json new file mode 100644 index 00000000..8951863c --- /dev/null +++ b/specifications/echo/manifest.json @@ -0,0 +1,47 @@ +{ + "path": "specifications/echo", + "title": "The Echo Algorithm", + "description": "Algorithm for constructing a spanning tree in an undirected graph", + "sources": [], + "authors": [ + "Stephan Merz" + ], + "tags": [], + "modules": [ + { + "path": "specifications/echo/Echo.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "pluscal" + ], + "models": [] + }, + { + "path": "specifications/echo/MCEcho.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/echo/MCEcho.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [], + "result": "success", + "distinctStates": 75, + "totalStates": 116, + "stateDepth": 16 + } + ] + }, + { + "path": "specifications/echo/Relation.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + } + ] +} \ No newline at end of file diff --git a/specifications/ewd426/manifest.json b/specifications/ewd426/manifest.json new file mode 100644 index 00000000..88b8dd76 --- /dev/null +++ b/specifications/ewd426/manifest.json @@ -0,0 +1,60 @@ +{ + "path": "specifications/ewd426", + "title": "EWD 426: Token Stabilization", + "description": "Dijkstra's classical stabilizing token ring algorithm, EWD426", + "sources": [], + "authors": [ + "Markus Kuppe", + "Murat Demirbas" + ], + "tags": [ + "ewd" + ], + "modules": [ + { + "path": "specifications/ewd426/SimTokenRing.tla", + "communityDependencies": [ + "CSV", + "IOUtils" + ], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/ewd426/SimTokenRing.cfg", + "runtime": "unknown", + "size": "large", + "mode": "generate", + "features": [ + "ignore deadlock", + "state constraint" + ], + "result": "unknown" + } + ] + }, + { + "path": "specifications/ewd426/TokenRing.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/ewd426/TokenRing.cfg", + "runtime": "00:00:05", + "size": "small", + "mode": "exhaustive search", + "features": [ + "alias", + "ignore deadlock", + "liveness" + ], + "result": "success", + "distinctStates": 46656, + "totalStates": 248832, + "stateDepth": 1 + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/ewd687a/manifest.json b/specifications/ewd687a/manifest.json new file mode 100644 index 00000000..2346ac69 --- /dev/null +++ b/specifications/ewd687a/manifest.json @@ -0,0 +1,82 @@ +{ + "path": "specifications/ewd687a", + "title": "EWD687a: Detecting Termination in Distributed Computations", + "description": "Dijkstra's Termination Detection Algorithm", + "sources": [], + "authors": [ + "Leslie Lamport", + "Markus Kuppe", + "Stephan Merz" + ], + "tags": [ + "ewd", + "beginner" + ], + "modules": [ + { + "path": "specifications/ewd687a/EWD687a.tla", + "communityDependencies": [ + "Graphs" + ], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/ewd687a/EWD687aPlusCal.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "pluscal" + ], + "models": [] + }, + { + "path": "specifications/ewd687a/EWD687a_anim.tla", + "communityDependencies": [ + "IOUtils", + "SVG" + ], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/ewd687a/EWD687a_anim.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": { + "simulate": { + "traceCount": 100 + } + }, + "features": [ + "alias", + "ignore deadlock", + "liveness" + ], + "result": "safety failure" + } + ] + }, + { + "path": "specifications/ewd687a/MCEWD687a.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/ewd687a/MCEWD687a.cfg", + "runtime": "00:01:00", + "size": "medium", + "mode": "exhaustive search", + "features": [ + "ignore deadlock", + "liveness", + "state constraint" + ], + "result": "success" + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/ewd840/manifest.json b/specifications/ewd840/manifest.json new file mode 100644 index 00000000..a48add5f --- /dev/null +++ b/specifications/ewd840/manifest.json @@ -0,0 +1,123 @@ +{ + "path": "specifications/ewd840", + "title": "EWD840: Termination Detection in a Ring", + "description": "EWD840: Termination Detection in a Ring", + "sources": [ + "Dijkstra's termination detection algorithm for ring topologies" + ], + "authors": [ + "Stephan Merz" + ], + "tags": [ + "ewd" + ], + "modules": [ + { + "path": "specifications/ewd840/EWD840.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/ewd840/EWD840.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "ignore deadlock", + "liveness" + ], + "result": "success", + "distinctStates": 302, + "totalStates": 2001, + "stateDepth": 10 + } + ] + }, + { + "path": "specifications/ewd840/EWD840_anim.tla", + "communityDependencies": [ + "SVG" + ], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/ewd840/EWD840_anim.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": { + "simulate": { + "traceCount": 100 + } + }, + "features": [ + "alias", + "ignore deadlock" + ], + "result": "safety failure" + } + ] + }, + { + "path": "specifications/ewd840/EWD840_json.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/ewd840/EWD840_json.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "ignore deadlock" + ], + "result": "success", + "distinctStates": 1566, + "totalStates": 15986, + "stateDepth": 12 + } + ] + }, + { + "path": "specifications/ewd840/EWD840_proof.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "proof" + ], + "models": [] + }, + { + "path": "specifications/ewd840/SyncTerminationDetection.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/ewd840/SyncTerminationDetection.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success", + "distinctStates": 129, + "totalStates": 3722, + "stateDepth": 1 + } + ] + }, + { + "path": "specifications/ewd840/SyncTerminationDetection_proof.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "proof" + ], + "models": [] + } + ] +} \ No newline at end of file diff --git a/specifications/ewd998/manifest.json b/specifications/ewd998/manifest.json new file mode 100644 index 00000000..fda6d089 --- /dev/null +++ b/specifications/ewd998/manifest.json @@ -0,0 +1,326 @@ +{ + "path": "specifications/ewd998", + "title": "EWD998: Termination Detection in a Ring with Asynchronous Message Delivery", + "description": "Variant of EWD 840 given by Shmuel Safra", + "sources": [], + "authors": [ + "Markus Kuppe", + "Stephan Merz" + ], + "tags": [ + "ewd" + ], + "modules": [ + { + "path": "specifications/ewd998/AsyncTerminationDetection.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/ewd998/AsyncTerminationDetection.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness", + "state constraint" + ], + "result": "success", + "distinctStates": 4097, + "totalStates": 53271, + "stateDepth": 14 + } + ] + }, + { + "path": "specifications/ewd998/AsyncTerminationDetection_proof.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "proof" + ], + "models": [] + }, + { + "path": "specifications/ewd998/EWD998.tla", + "communityDependencies": [ + "SequencesExt" + ], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/ewd998/EWD998.cfg", + "runtime": "00:50:00", + "size": "large", + "mode": "exhaustive search", + "features": [ + "ignore deadlock", + "liveness", + "state constraint" + ], + "result": "success" + }, + { + "path": "specifications/ewd998/EWD998Small.cfg", + "runtime": "00:05:00", + "size": "medium", + "mode": "exhaustive search", + "features": [ + "ignore deadlock", + "state constraint" + ], + "result": "success" + } + ] + }, + { + "path": "specifications/ewd998/EWD998Chan.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/ewd998/EWD998Chan.cfg", + "runtime": "00:05:00", + "size": "medium", + "mode": "exhaustive search", + "features": [ + "ignore deadlock", + "liveness", + "state constraint" + ], + "result": "success" + } + ] + }, + { + "path": "specifications/ewd998/EWD998ChanID.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/ewd998/EWD998ChanID.cfg", + "runtime": "00:00:05", + "size": "small", + "mode": "exhaustive search", + "features": [ + "ignore deadlock", + "liveness", + "state constraint", + "view" + ], + "result": "success", + "distinctStates": 14, + "totalStates": 15, + "stateDepth": 14 + } + ] + }, + { + "path": "specifications/ewd998/EWD998ChanID_export.tla", + "communityDependencies": [ + "IOUtils" + ], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/ewd998/EWD998ChanID_export.cfg", + "runtime": "unknown", + "size": "large", + "mode": "exhaustive search", + "features": [ + "ignore deadlock" + ], + "result": "unknown" + } + ] + }, + { + "path": "specifications/ewd998/EWD998ChanID_shiviz.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/ewd998/EWD998ChanID_shiviz.cfg", + "runtime": "unknown", + "size": "large", + "mode": "exhaustive search", + "features": [ + "alias", + "ignore deadlock" + ], + "result": "unknown" + } + ] + }, + { + "path": "specifications/ewd998/EWD998ChanTrace.tla", + "communityDependencies": [ + "IOUtils", + "VectorClocks" + ], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/ewd998/EWD998ChanTrace.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "alias", + "view" + ], + "result": "success" + } + ] + }, + { + "path": "specifications/ewd998/EWD998Chan_opts.tla", + "communityDependencies": [ + "CSV", + "IOUtils" + ], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/ewd998/EWD998PCal.tla", + "communityDependencies": [ + "BagsExt" + ], + "tlaLanguageVersion": 2, + "features": [ + "pluscal" + ], + "models": [ + { + "path": "specifications/ewd998/EWD998PCal.cfg", + "runtime": "00:00:21", + "size": "medium", + "mode": "exhaustive search", + "features": [ + "alias", + "liveness", + "state constraint" + ], + "result": "success" + } + ] + }, + { + "path": "specifications/ewd998/EWD998_anim.tla", + "communityDependencies": [ + "IOUtils", + "SVG" + ], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/ewd998/EWD998_opts.tla", + "communityDependencies": [ + "CSV", + "IOUtils" + ], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/ewd998/EWD998_optsSC.tla", + "communityDependencies": [ + "CSV", + "IOUtils" + ], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/ewd998/EWD998_proof.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "proof" + ], + "models": [] + }, + { + "path": "specifications/ewd998/Folds.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/ewd998/Functions.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/ewd998/SmokeEWD998.tla", + "communityDependencies": [ + "CSV", + "IOUtils" + ], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/ewd998/SmokeEWD998.cfg", + "runtime": "00:00:05", + "size": "small", + "mode": { + "simulate": { + "traceCount": 100 + } + }, + "features": [ + "ignore deadlock", + "liveness", + "state constraint" + ], + "result": "success" + } + ] + }, + { + "path": "specifications/ewd998/SmokeEWD998_SC.tla", + "communityDependencies": [ + "CSV", + "IOUtils" + ], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/ewd998/SmokeEWD998_SC.cfg", + "runtime": "unknown", + "size": "unknown", + "mode": "exhaustive search", + "features": [], + "result": "unknown" + } + ] + }, + { + "path": "specifications/ewd998/Utils.tla", + "communityDependencies": [ + "SequencesExt" + ], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + } + ] +} \ No newline at end of file diff --git a/specifications/glowingRaccoon/manifest.json b/specifications/glowingRaccoon/manifest.json new file mode 100644 index 00000000..df590f02 --- /dev/null +++ b/specifications/glowingRaccoon/manifest.json @@ -0,0 +1,77 @@ +{ + "path": "specifications/glowingRaccoon", + "title": "PCR Testing for Snippets of DNA", + "description": "Specification of a PCR test process", + "sources": [], + "authors": [ + "Martin Harrison" + ], + "tags": [], + "modules": [ + { + "path": "specifications/glowingRaccoon/clean.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/glowingRaccoon/clean.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success", + "distinctStates": 63, + "totalStates": 99, + "stateDepth": 10 + } + ] + }, + { + "path": "specifications/glowingRaccoon/product.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/glowingRaccoon/product.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "ignore deadlock", + "liveness" + ], + "result": "success", + "distinctStates": 305, + "totalStates": 376, + "stateDepth": 23 + } + ] + }, + { + "path": "specifications/glowingRaccoon/stages.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/glowingRaccoon/stages.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "ignore deadlock", + "liveness" + ], + "result": "success", + "distinctStates": 83, + "totalStates": 93, + "stateDepth": 23 + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/lamport_mutex/manifest.json b/specifications/lamport_mutex/manifest.json new file mode 100644 index 00000000..58af8dfa --- /dev/null +++ b/specifications/lamport_mutex/manifest.json @@ -0,0 +1,49 @@ +{ + "path": "specifications/lamport_mutex", + "title": "Distributed Mutual Exclusion", + "description": "Specification of Lamport's distributed mutual exclusion algorithm", + "sources": [], + "authors": [ + "Stephan Merz" + ], + "tags": [], + "modules": [ + { + "path": "specifications/lamport_mutex/LamportMutex.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/lamport_mutex/LamportMutex_proofs.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "proof" + ], + "models": [] + }, + { + "path": "specifications/lamport_mutex/MCLamportMutex.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/lamport_mutex/MCLamportMutex.cfg", + "runtime": "00:00:10", + "size": "small", + "mode": "exhaustive search", + "features": [ + "state constraint" + ], + "result": "success", + "distinctStates": 724274, + "totalStates": 2729079, + "stateDepth": 61 + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/nbacc_ray97/manifest.json b/specifications/nbacc_ray97/manifest.json new file mode 100644 index 00000000..9796261a --- /dev/null +++ b/specifications/nbacc_ray97/manifest.json @@ -0,0 +1,33 @@ +{ + "path": "specifications/nbacc_ray97", + "title": "Asynchronous Non-Blocking Atomic Commit", + "description": "Algorithm from paper *A case study of agreement problems in distributed systems: non-blocking atomic commitment* (1997)", + "sources": [], + "authors": [ + "Igor Konnov", + "Josef Widder", + "Thanh Hai Tran" + ], + "tags": [], + "modules": [ + { + "path": "specifications/nbacc_ray97/nbacc_ray97.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/nbacc_ray97/nbacc_ray97.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [], + "result": "success", + "distinctStates": 3016, + "totalStates": 49592, + "stateDepth": 7 + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/nbacg_guer01/manifest.json b/specifications/nbacg_guer01/manifest.json new file mode 100644 index 00000000..a52d0a4a --- /dev/null +++ b/specifications/nbacg_guer01/manifest.json @@ -0,0 +1,35 @@ +{ + "path": "specifications/nbacg_guer01", + "title": "Asynchronous Non-Blocking Atomic Commitment with Failure Detectors", + "description": "Algorithm from paper *On the hardness of failure-sensitive agreement problems* (2001)", + "sources": [], + "authors": [ + "Igor Konnov", + "Josef Widder", + "Thanh Hai Tran" + ], + "tags": [], + "modules": [ + { + "path": "specifications/nbacg_guer01/nbacg_guer01.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/nbacg_guer01/nbacg_guer01.cfg", + "runtime": "00:00:05", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness" + ], + "result": "success", + "distinctStates": 24922, + "totalStates": 159538, + "stateDepth": 16 + } + ] + } + ] +} \ No newline at end of file diff --git a/specifications/spanning/manifest.json b/specifications/spanning/manifest.json new file mode 100644 index 00000000..e6097cf2 --- /dev/null +++ b/specifications/spanning/manifest.json @@ -0,0 +1,37 @@ +{ + "path": "specifications/spanning", + "title": "Spanning Tree Broadcast Algorithm", + "description": "A spanning tree broadcast algorithm", + "sources": [], + "authors": [ + "Igor Konnov", + "Josef Widder", + "Thanh Hai Tran" + ], + "tags": [], + "modules": [ + { + "path": "specifications/spanning/MC_spanning.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/spanning/MC_spanning.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [], + "result": "safety failure" + } + ] + }, + { + "path": "specifications/spanning/spanning.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + } + ] +} \ No newline at end of file diff --git a/specifications/sums_even/manifest.json b/specifications/sums_even/manifest.json new file mode 100644 index 00000000..778b9297 --- /dev/null +++ b/specifications/sums_even/manifest.json @@ -0,0 +1,42 @@ +{ + "path": "specifications/sums_even", + "title": "Proof x+x is Even", + "description": "Two proofs that x+x is even for every natural number x", + "sources": [], + "authors": [ + "Martin Riener" + ], + "tags": [ + "beginner" + ], + "modules": [ + { + "path": "specifications/sums_even/MC_sums_even.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/sums_even/MC_sums_even.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [], + "result": "success", + "distinctStates": 0, + "totalStates": 0, + "stateDepth": 0 + } + ] + }, + { + "path": "specifications/sums_even/sums_even.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "proof" + ], + "models": [] + } + ] +} \ No newline at end of file diff --git a/specifications/tcp/manifest.json b/specifications/tcp/manifest.json new file mode 100644 index 00000000..6694091a --- /dev/null +++ b/specifications/tcp/manifest.json @@ -0,0 +1,45 @@ +{ + "path": "specifications/tcp", + "title": "TCP as defined in RFC 9293", + "description": "Transmission Control Protocol (TCP)", + "sources": [ + "https://datatracker.ietf.org/doc/html/rfc9293" + ], + "authors": [ + "Markus Kuppe" + ], + "tags": [], + "modules": [ + { + "path": "specifications/tcp/MCtcp.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/tcp/MCtcp.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "liveness", + "state constraint" + ], + "result": "success", + "distinctStates": 1182, + "totalStates": 6322, + "stateDepth": 14 + } + ] + }, + { + "path": "specifications/tcp/tcp.tla", + "communityDependencies": [ + "SequencesExt" + ], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + } + ] +} \ No newline at end of file diff --git a/specifications/tower_of_hanoi/manifest.json b/specifications/tower_of_hanoi/manifest.json new file mode 100644 index 00000000..dca026b3 --- /dev/null +++ b/specifications/tower_of_hanoi/manifest.json @@ -0,0 +1,66 @@ +{ + "path": "specifications/tower_of_hanoi", + "title": "The Tower of Hanoi Puzzle", + "description": "Famous puzzle involving stacking disks on towers", + "sources": [], + "authors": [ + "Alexander Niederbühl", + "Markus Kuppe" + ], + "tags": [ + "beginner" + ], + "modules": [ + { + "path": "specifications/tower_of_hanoi/Bits.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/tower_of_hanoi/Hanoi.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/tower_of_hanoi/Hanoi.toolbox/Model_1/Bits.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/tower_of_hanoi/Hanoi.toolbox/Model_1/Hanoi.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + }, + { + "path": "specifications/tower_of_hanoi/Hanoi.toolbox/Model_1/MC.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/tower_of_hanoi/Hanoi.toolbox/Model_1/MC.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [], + "result": "safety failure" + } + ] + }, + { + "path": "specifications/tower_of_hanoi/HanoiSeq.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [] + } + ] +} \ No newline at end of file diff --git a/specifications/transaction_commit/manifest.json b/specifications/transaction_commit/manifest.json new file mode 100644 index 00000000..d042e855 --- /dev/null +++ b/specifications/transaction_commit/manifest.json @@ -0,0 +1,95 @@ +{ + "path": "specifications/transaction_commit", + "title": "Transaction Commit Models", + "description": "Ordinary transaction commit, two-phase commit, and Paxos commit", + "sources": [ + "http://research.microsoft.com/en-us/um/people/lamport/pubs/pubs.html#paxos-commit", + "https://www.microsoft.com/en-us/research/uploads/prod/2004/01/consensus-on-transaction-commit.pdf", + "https://github.com/muratdem/PlusCal-examples/tree/master/2PCTM" + ], + "authors": [ + "Jim Gray", + "Leslie Lamport", + "Murat Demirbas" + ], + "tags": [], + "modules": [ + { + "path": "specifications/transaction_commit/2PCwithBTM.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [ + "pluscal" + ], + "models": [ + { + "path": "specifications/transaction_commit/2PCwithBTM.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [], + "result": "success", + "distinctStates": 1245, + "totalStates": 5841, + "stateDepth": 15 + } + ] + }, + { + "path": "specifications/transaction_commit/PaxosCommit.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/transaction_commit/PaxosCommit.cfg", + "runtime": "00:00:30", + "size": "medium", + "mode": "exhaustive search", + "features": [], + "result": "success" + } + ] + }, + { + "path": "specifications/transaction_commit/TCommit.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/transaction_commit/TCommit.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [ + "ignore deadlock" + ], + "result": "success", + "distinctStates": 34, + "totalStates": 94, + "stateDepth": 7 + } + ] + }, + { + "path": "specifications/transaction_commit/TwoPhase.tla", + "communityDependencies": [], + "tlaLanguageVersion": 2, + "features": [], + "models": [ + { + "path": "specifications/transaction_commit/TwoPhase.cfg", + "runtime": "00:00:01", + "size": "small", + "mode": "exhaustive search", + "features": [], + "result": "success", + "distinctStates": 288, + "totalStates": 1146, + "stateDepth": 11 + } + ] + } + ] +} \ No newline at end of file From 9beb57fb8c3027f35d8024f02f572464a51a0594 Mon Sep 17 00:00:00 2001 From: Andrew Helwer Date: Thu, 31 Jul 2025 13:26:03 -0500 Subject: [PATCH 3/6] JSON schema and validation script now check split manifest Signed-off-by: Andrew Helwer --- .github/scripts/check_manifest_schema.py | 37 +- .github/scripts/tla_utils.py | 10 + manifest-schema.json | 124 +- manifest.json | 5437 ---------------------- 4 files changed, 90 insertions(+), 5518 deletions(-) delete mode 100644 manifest.json diff --git a/.github/scripts/check_manifest_schema.py b/.github/scripts/check_manifest_schema.py index f7429d76..87b377a3 100644 --- a/.github/scripts/check_manifest_schema.py +++ b/.github/scripts/check_manifest_schema.py @@ -1,29 +1,38 @@ """ -Checks to ensure manifest.json is valid according to schema; this can also -be done manually at https://www.jsonschemavalidator.net/ +Checks to ensure manifest.json in each specifications/ subdirectory is valid +according to schema; this can also be done manually at +https://www.jsonschemavalidator.net/ + Learn about the JSON schema format at https://json-schema.org/understanding-json-schema/ """ from argparse import ArgumentParser from jsonschema import validate -from os.path import normpath +from jsonschema.exceptions import ValidationError +from os.path import normpath, dirname, join +from sys import stderr import tla_utils -parser = ArgumentParser(description='Checks tlaplus/examples manifest.json against JSON schema file.') -parser.add_argument('--manifest_path', help='Path to the tlaplus/examples manifest.json file', required=True) +parser = ArgumentParser(description='Checks tlaplus/examples manifest.json files against JSON schema file.') parser.add_argument('--schema_path', help='Path to the tlaplus/examples manifest-schema.json file', required=True) args = parser.parse_args() +examples_root = dirname(args.schema_path) schema = tla_utils.load_json(normpath(args.schema_path)) -manifest = tla_utils.load_json(normpath(args.manifest_path)) +failures = [] +for manifest in tla_utils.load_all_manifests(examples_root): + manifest_path = join(manifest['path'], "manifest.json") + try: + validate(instance=manifest, schema=schema) + except ValidationError as error: + print(f'FAILURE: schema NOT matched by {manifest_path}', file=stderr) + failures.append((manifest_path, error)) + else: + print(f'SUCCESS: schema matched by {manifest_path}') + +for (manifest_path, manifest_error) in failures: + print(f'\nSchema failure in {manifest_path}:\n{manifest_error}\n', file=stderr) -result = validate(instance=manifest, schema=schema) -if None == result: - print('SUCCESS: Manifest correctly follows schema') - exit(0) -else: - print('ERROR: Manifest does not follow schema') - print(result) - exit(1) +exit(1 if any(failures) else 0) diff --git a/.github/scripts/tla_utils.py b/.github/scripts/tla_utils.py index 510bde56..aab8d2e9 100644 --- a/.github/scripts/tla_utils.py +++ b/.github/scripts/tla_utils.py @@ -4,6 +4,7 @@ from os.path import join, normpath, pathsep import subprocess import re +import glob def from_cwd(root, path): """ @@ -44,6 +45,15 @@ def load_json(path): with open(normpath(path), 'r', encoding='utf-8') as file: return json.load(file) +def load_all_manifests(examples_root): + """ + Loads all manifest.json files in the specifications subdirectories. + """ + return [ + load_json(manifest_path) + for manifest_path in glob.glob(f'specifications/*/manifest.json', root_dir=examples_root) + ] + def write_json(data, path): """ Writes the given json to the given file. diff --git a/manifest-schema.json b/manifest-schema.json index 1f803c16..54b41d54 100644 --- a/manifest-schema.json +++ b/manifest-schema.json @@ -1,93 +1,83 @@ { - "type" : "object", - "required": ["specifications"], + "type": "object", + "required": ["title", "description", "sources", "authors", "path", "tags", "modules"], "additionalProperties": false, - "properties" : { - "specifications" : { + "properties": { + "path": {"type": "string"}, + "title": {"type": "string"}, + "description": {"type": "string"}, + "sources": { + "type": "array", + "items": {"type": "string"} + }, + "authors": { + "type": "array", + "items": {"type": "string"} + }, + "tags": { + "type": "array", + "items": {"enum": ["beginner", "intermediate", "ewd"]} + }, + "modules": { "type": "array", "items": { "type": "object", - "required": ["title", "description", "sources", "authors", "path", "tags", "modules"], + "required": ["path", "communityDependencies", "tlaLanguageVersion", "features", "models"], "additionalProperties": false, "properties": { "path": {"type": "string"}, - "title": {"type": "string"}, - "description": {"type": "string"}, - "sources": { + "communityDependencies": { "type": "array", "items": {"type": "string"} }, - "authors": { + "tlaLanguageVersion": {"type": "number"}, + "features": { "type": "array", - "items": {"type": "string"} + "items": {"enum": ["pluscal", "proof", "action composition"]} }, - "tags": { - "type": "array", - "items": {"enum": ["beginner", "intermediate", "ewd"]} - }, - "modules": { + "models": { "type": "array", "items": { "type": "object", - "required": ["path", "communityDependencies", "tlaLanguageVersion", "features", "models"], "additionalProperties": false, + "required": ["path", "runtime", "size", "mode", "features", "result"], "properties": { "path": {"type": "string"}, - "communityDependencies": { - "type": "array", - "items": {"type": "string"} + "runtime": { + "type": "string", + "pattern": "^(([0-9][0-9]:[0-9][0-9]:[0-9][0-9])|unknown)$" + }, + "size": {"enum": ["small", "medium", "large", "unknown"]}, + "distinctStates": {"type": "integer"}, + "totalStates": {"type": "integer"}, + "stateDepth": {"type": "integer"}, + "mode": { + "oneOf": [ + { + "enum": ["exhaustive search", "generate", "symbolic"] + }, + { + "type": "object", + "additionalProperties": false, + "required": ["simulate"], + "properties": { + "simulate": { + "type": "object", + "additionalProperties": false, + "required": ["traceCount"], + "properties": { + "traceCount": {"type": "number"} + } + } + } + } + ] }, - "tlaLanguageVersion": {"type": "number"}, "features": { "type": "array", - "items": {"enum": ["pluscal", "proof", "action composition"]} + "items": {"enum": ["liveness", "symmetry", "view", "alias", "state constraint", "ignore deadlock"]} }, - "models": { - "type": "array", - "items": { - "type": "object", - "additionalProperties": false, - "required": ["path", "runtime", "size", "mode", "features", "result"], - "properties": { - "path": {"type": "string"}, - "runtime": { - "type": "string", - "pattern": "^(([0-9][0-9]:[0-9][0-9]:[0-9][0-9])|unknown)$" - }, - "size": {"enum": ["small", "medium", "large", "unknown"]}, - "distinctStates": {"type": "integer"}, - "totalStates": {"type": "integer"}, - "stateDepth": {"type": "integer"}, - "mode": { - "oneOf": [ - { - "enum": ["exhaustive search", "generate", "symbolic"] - }, - { - "type": "object", - "additionalProperties": false, - "required": ["simulate"], - "properties": { - "simulate": { - "type": "object", - "additionalProperties": false, - "required": ["traceCount"], - "properties": { - "traceCount": {"type": "number"} - } - } - } - } - ] - }, - "features": { - "type": "array", - "items": {"enum": ["liveness", "symmetry", "view", "alias", "state constraint", "ignore deadlock"]} - }, - "result": {"enum": ["success", "assumption failure", "deadlock failure", "safety failure", "liveness failure", "unknown"]} - } - } - } + "result": {"enum": ["success", "assumption failure", "deadlock failure", "safety failure", "liveness failure", "unknown"]} } } } diff --git a/manifest.json b/manifest.json deleted file mode 100644 index 05d877a5..00000000 --- a/manifest.json +++ /dev/null @@ -1,5437 +0,0 @@ -{ - "specifications": [ - { - "path": "specifications/Bakery-Boulangerie", - "title": "The Boulangerie Algorithm", - "description": "Spec of a variant of the Bakery Algorithm", - "sources": [], - "authors": [ - "Leslie Lamport", - "Stephan Merz" - ], - "tags": [], - "modules": [ - { - "path": "specifications/Bakery-Boulangerie/Bakery.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "pluscal", - "proof" - ], - "models": [] - }, - { - "path": "specifications/Bakery-Boulangerie/Boulanger.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "pluscal", - "proof" - ], - "models": [] - }, - { - "path": "specifications/Bakery-Boulangerie/MCBakery.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/Bakery-Boulangerie/MCBakery.cfg", - "runtime": "00:00:10", - "size": "small", - "mode": "exhaustive search", - "features": [ - "ignore deadlock" - ], - "result": "success", - "distinctStates": 655200, - "totalStates": 3403584, - "stateDepth": 1 - } - ] - }, - { - "path": "specifications/Bakery-Boulangerie/MCBoulanger.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/Bakery-Boulangerie/MCBoulanger.cfg", - "runtime": "00:01:00", - "size": "medium", - "mode": "exhaustive search", - "features": [ - "state constraint" - ], - "result": "success" - } - ] - } - ] - }, - { - "path": "specifications/CarTalkPuzzle", - "title": "The Car Talk Puzzle", - "description": "Math puzzle involving a farmer, a stone, and a balance scale", - "sources": [], - "authors": [ - "Leslie Lamport" - ], - "tags": [ - "beginner" - ], - "modules": [ - { - "path": "specifications/CarTalkPuzzle/CarTalkPuzzle.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/CarTalkPuzzle/CarTalkPuzzle.toolbox/Model_1/CarTalkPuzzle.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/CarTalkPuzzle/CarTalkPuzzle.toolbox/Model_1/MC.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/CarTalkPuzzle/CarTalkPuzzle.toolbox/Model_1/MC.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [], - "result": "success", - "distinctStates": 0, - "totalStates": 0, - "stateDepth": 0 - } - ] - }, - { - "path": "specifications/CarTalkPuzzle/CarTalkPuzzle.toolbox/Model_2/CarTalkPuzzle.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/CarTalkPuzzle/CarTalkPuzzle.toolbox/Model_2/MC.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/CarTalkPuzzle/CarTalkPuzzle.toolbox/Model_2/MC.cfg", - "runtime": "00:00:05", - "size": "small", - "mode": "exhaustive search", - "features": [], - "result": "success", - "distinctStates": 0, - "totalStates": 0, - "stateDepth": 0 - } - ] - }, - { - "path": "specifications/CarTalkPuzzle/CarTalkPuzzle.toolbox/Model_3/CarTalkPuzzle.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/CarTalkPuzzle/CarTalkPuzzle.toolbox/Model_3/MC.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/CarTalkPuzzle/CarTalkPuzzle.toolbox/Model_3/MC.cfg", - "runtime": "unknown", - "size": "large", - "mode": "exhaustive search", - "features": [], - "result": "unknown" - } - ] - } - ] - }, - { - "path": "specifications/Chameneos", - "title": "Chameneos, a Concurrency Game", - "description": "A concurrency game requiring concurrent & symmetric cooperation", - "sources": [ - "https://github.com/mryndzionek/tlaplus_specs#chameneostla" - ], - "authors": [ - "Mariusz Ryndzionek" - ], - "tags": [], - "modules": [ - { - "path": "specifications/Chameneos/Chameneos.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/Chameneos/Chameneos.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "ignore deadlock" - ], - "result": "success", - "distinctStates": 34534, - "totalStates": 104697, - "stateDepth": 13 - } - ] - } - ] - }, - { - "path": "specifications/CheckpointCoordination", - "title": "Checkpoint Coordination", - "description": "An algorithm for controlling checkpoint leases in a Paxos ring", - "sources": [ - "https://github.com/Azure/RingMaster", - "https://ahelwer.ca/post/2023-04-05-checkpoint-coordination/" - ], - "authors": [ - "Andrew Helwer" - ], - "tags": [], - "modules": [ - { - "path": "specifications/CheckpointCoordination/CheckpointCoordination.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/CheckpointCoordination/MCCheckpointCoordination.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/CheckpointCoordination/MCCheckpointCoordination.cfg", - "runtime": "00:01:00", - "size": "medium", - "mode": "exhaustive search", - "features": [ - "state constraint", - "symmetry" - ], - "result": "success" - }, - { - "path": "specifications/CheckpointCoordination/MCCheckpointCoordinationFailure.cfg", - "runtime": "00:00:10", - "size": "small", - "mode": "exhaustive search", - "features": [ - "state constraint", - "symmetry" - ], - "result": "safety failure" - } - ] - } - ] - }, - { - "path": "specifications/CigaretteSmokers", - "title": "The Cigarette Smokers Problem", - "description": "A concurrency problem described in 1971 by Suhas Patil", - "sources": [ - "https://github.com/mryndzionek/tlaplus_specs#cigarettesmokerstla" - ], - "authors": [ - "Mariusz Ryndzionek" - ], - "tags": [], - "modules": [ - { - "path": "specifications/CigaretteSmokers/CigaretteSmokers.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/CigaretteSmokers/CigaretteSmokers.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [], - "result": "success", - "distinctStates": 6, - "totalStates": 15, - "stateDepth": 2 - } - ] - } - ] - }, - { - "path": "specifications/CoffeeCan", - "title": "The Coffee Can Bean Problem", - "description": "Math problem published by Dijkstra attributed to Carel Scholten", - "sources": [ - "https://stackoverflow.com/a/66304920/2852699" - ], - "authors": [ - "Andrew Helwer" - ], - "tags": [ - "beginner" - ], - "modules": [ - { - "path": "specifications/CoffeeCan/CoffeeCan.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/CoffeeCan/CoffeeCan1000Beans.cfg", - "runtime": "00:00:15", - "size": "medium", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success" - }, - { - "path": "specifications/CoffeeCan/CoffeeCan100Beans.cfg", - "runtime": "00:00:05", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success", - "distinctStates": 5150, - "totalStates": 20002, - "stateDepth": 1 - }, - { - "path": "specifications/CoffeeCan/CoffeeCan3000Beans.cfg", - "runtime": "00:02:30", - "size": "medium", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success" - } - ] - } - ] - }, - { - "path": "specifications/DieHard", - "title": "The Die Hard Problem", - "description": "Obtain 4 gallons of water using only 3 and 5 gallon jugs", - "sources": [], - "authors": [ - "Leslie Lamport" - ], - "tags": [ - "beginner" - ], - "modules": [ - { - "path": "specifications/DieHard/DieHard.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/DieHard/DieHard.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [], - "result": "safety failure" - } - ] - }, - { - "path": "specifications/DieHard/DieHarder.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/DieHard/MCDieHarder.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/DieHard/MCDieHarder.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [], - "result": "safety failure" - } - ] - } - ] - }, - { - "path": "specifications/DiningPhilosophers", - "title": "The Dining Philosophers Problem", - "description": "The Chandy-Misra solution to the Dining Philosophers concurrency problem", - "sources": [], - "authors": [ - "Jeff Hemphill" - ], - "tags": [ - "beginner" - ], - "modules": [ - { - "path": "specifications/DiningPhilosophers/DiningPhilosophers.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "pluscal" - ], - "models": [ - { - "path": "specifications/DiningPhilosophers/DiningPhilosophers.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success", - "distinctStates": 67, - "totalStates": 336, - "stateDepth": 29 - } - ] - } - ] - }, - { - "path": "specifications/Disruptor", - "title": "Disruptor", - "description": "Models single and multi producer scenarios of the Disruptor library and checks for data races.", - "sources": [ - "https://github.com/nicholassm/disruptor-rs" - ], - "authors": [ - "Nicholas Schultz-Møller" - ], - "tags": [], - "modules": [ - { - "path": "specifications/Disruptor/Disruptor_MPMC.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/Disruptor/Disruptor_MPMC.cfg", - "runtime": "00:00:10", - "size": "small", - "mode": "exhaustive search", - "features": [ - "ignore deadlock", - "state constraint" - ], - "result": "success", - "distinctStates": 112929, - "totalStates": 422781, - "stateDepth": 81 - }, - { - "path": "specifications/Disruptor/Disruptor_MPMC_liveliness.cfg", - "runtime": "00:00:10", - "size": "small", - "mode": "exhaustive search", - "features": [ - "ignore deadlock", - "liveness", - "state constraint" - ], - "result": "success", - "distinctStates": 14365, - "totalStates": 44581, - "stateDepth": 61 - } - ] - }, - { - "path": "specifications/Disruptor/Disruptor_SPMC.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/Disruptor/Disruptor_SPMC.cfg", - "runtime": "00:00:10", - "size": "small", - "mode": "exhaustive search", - "features": [ - "ignore deadlock", - "liveness", - "state constraint" - ], - "result": "success", - "distinctStates": 8496, - "totalStates": 28049, - "stateDepth": 82 - } - ] - }, - { - "path": "specifications/Disruptor/RingBuffer.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - } - ] - }, - { - "path": "specifications/EinsteinRiddle", - "title": "Einstein's Riddle", - "description": "Five houses, five people, various facts, who lives in what house?", - "sources": [], - "authors": [ - "Isaac DeFrain", - "Giuliano Losa" - ], - "tags": [], - "modules": [ - { - "path": "specifications/EinsteinRiddle/Einstein.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/EinsteinRiddle/Einstein.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "symbolic", - "features": [], - "result": "safety failure" - } - ] - } - ] - }, - { - "path": "specifications/FiniteMonotonic", - "title": "Finitizing Monotonic Systems", - "description": "Illustration of technique for making ordinarily-infinite monotonic systems finite for the purposes of model-checking.", - "sources": [ - "https://ahelwer.ca/post/2023-11-01-tla-finite-monotonic/" - ], - "authors": [ - "Andrew Helwer", - "Stephan Merz", - "Markus Kuppe" - ], - "tags": [ - "intermediate" - ], - "modules": [ - { - "path": "specifications/FiniteMonotonic/CRDT.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/FiniteMonotonic/CRDT_proof.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "proof" - ], - "models": [] - }, - { - "path": "specifications/FiniteMonotonic/DistributedReplicatedLog.tla", - "communityDependencies": [ - "FiniteSetsExt", - "SequencesExt" - ], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/FiniteMonotonic/Functions.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/FiniteMonotonic/Folds.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/FiniteMonotonic/MCCRDT.tla", - "communityDependencies": [ - "FiniteSetsExt" - ], - "tlaLanguageVersion": 2, - "features": [ - "action composition" - ], - "models": [ - { - "path": "specifications/FiniteMonotonic/MCCRDT.cfg", - "runtime": "00:00:05", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness", - "state constraint" - ], - "result": "success", - "distinctStates": 25000, - "totalStates": 1350001, - "stateDepth": 16 - } - ] - }, - { - "path": "specifications/FiniteMonotonic/MCDistributedReplicatedLog.tla", - "communityDependencies": [ - "FiniteSetsExt" - ], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/FiniteMonotonic/MCDistributedReplicatedLog.cfg", - "runtime": "00:00:05", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness", - "view" - ], - "result": "liveness failure" - } - ] - }, - { - "path": "specifications/FiniteMonotonic/MCReplicatedLog.tla", - "communityDependencies": [ - "FiniteSetsExt" - ], - "tlaLanguageVersion": 2, - "features": [ - "action composition" - ], - "models": [ - { - "path": "specifications/FiniteMonotonic/MCReplicatedLog.cfg", - "runtime": "00:00:05", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness", - "state constraint" - ], - "result": "success", - "distinctStates": 1363, - "totalStates": 17425, - "stateDepth": 13 - } - ] - }, - { - "path": "specifications/FiniteMonotonic/ReplicatedLog.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - } - ] - }, - { - "path": "specifications/GameOfLife", - "title": "Conway's Game of Life", - "description": "The famous cellular automata simulation", - "sources": [ - "https://github.com/mryndzionek/tlaplus_specs#gameoflifetla" - ], - "authors": [ - "Mariusz Ryndzionek" - ], - "tags": [], - "modules": [ - { - "path": "specifications/GameOfLife/GameOfLife.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/GameOfLife/GameOfLife.cfg", - "runtime": "00:00:05", - "size": "small", - "mode": "exhaustive search", - "features": [], - "result": "success", - "distinctStates": 65536, - "totalStates": 131072, - "stateDepth": 1 - } - ] - } - ] - }, - { - "path": "specifications/Huang", - "title": "Huang's Algorithm", - "description": "An algorithm for detecting termination in a distributed system", - "sources": [], - "authors": [ - "Markus Kuppe" - ], - "tags": [], - "modules": [ - { - "path": "specifications/Huang/Huang.tla", - "communityDependencies": [ - "DyadicRationals", - "Functions", - "SequencesExt" - ], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/Huang/Huang.cfg", - "runtime": "00:00:40", - "size": "medium", - "mode": "exhaustive search", - "features": [ - "alias", - "ignore deadlock", - "liveness", - "state constraint" - ], - "result": "success" - } - ] - } - ] - }, - { - "path": "specifications/KeyValueStore", - "title": "Snapshot Key-Value Store", - "description": "A simple KVS implementing snapshot isolation", - "sources": [], - "authors": [ - "Andrew Helwer", - "Murat Demirbas" - ], - "tags": [], - "modules": [ - { - "path": "specifications/KeyValueStore/ClientCentric.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/KeyValueStore/KVsnap.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "pluscal" - ], - "models": [] - }, - { - "path": "specifications/KeyValueStore/KeyValueStore.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/KeyValueStore/MCKVS.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/KeyValueStore/MCKVSSafetyLarge.cfg", - "runtime": "07:16:00", - "size": "large", - "mode": "exhaustive search", - "features": [ - "symmetry" - ], - "result": "success" - }, - { - "path": "specifications/KeyValueStore/MCKVSSafetyMedium.cfg", - "runtime": "00:04:30", - "size": "medium", - "mode": "exhaustive search", - "features": [ - "symmetry" - ], - "result": "success" - }, - { - "path": "specifications/KeyValueStore/MCKVSSafetySmall.cfg", - "runtime": "00:00:40", - "size": "medium", - "mode": "exhaustive search", - "features": [], - "result": "success" - } - ] - }, - { - "path": "specifications/KeyValueStore/MCKVsnap.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/KeyValueStore/MCKVsnap.cfg", - "runtime": "00:00:50", - "size": "medium", - "mode": "exhaustive search", - "features": [ - "liveness", - "symmetry" - ], - "result": "success" - } - ] - }, - { - "path": "specifications/KeyValueStore/Util.tla", - "communityDependencies": [ - "Functions" - ], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - } - ] - }, - { - "path": "specifications/KnuthYao", - "title": "The Knuth-Yao Method", - "description": "A method for simulating a fair 6-sided die using only coin flips", - "sources": [ - "https://old.reddit.com/r/tlaplus/comments/j06ohw/how_do_you_reason_about_a_probabilistic/g6owlxy/" - ], - "authors": [ - "Markus Kuppe", - "Ron Pressler" - ], - "tags": [], - "modules": [ - { - "path": "specifications/KnuthYao/KnuthYao.tla", - "communityDependencies": [ - "DyadicRationals" - ], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/KnuthYao/Prob.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/KnuthYao/SimKnuthYao.tla", - "communityDependencies": [ - "CSV", - "Functions", - "IOUtils", - "Statistics" - ], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/KnuthYao/SimKnuthYao.cfg", - "runtime": "unknown", - "size": "unknown", - "mode": "generate", - "features": [ - "ignore deadlock", - "state constraint" - ], - "result": "unknown" - } - ] - } - ] - }, - { - "path": "specifications/LearnProofs", - "title": "Learn TLA⁺ Proofs", - "description": "Some specs of very simple algorithms & formal proofs of their correctness", - "sources": [], - "authors": [ - "Andrew Helwer" - ], - "tags": [ - "beginner" - ], - "modules": [ - { - "path": "specifications/LearnProofs/AddTwo.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "pluscal", - "proof" - ], - "models": [] - }, - { - "path": "specifications/LearnProofs/FindHighest.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "pluscal", - "proof" - ], - "models": [] - }, - { - "path": "specifications/LearnProofs/MCFindHighest.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/LearnProofs/MCFindHighest.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "state constraint" - ], - "result": "success", - "distinctStates": 742, - "totalStates": 1523, - "stateDepth": 5 - } - ] - } - ] - }, - { - "path": "specifications/LeastCircularSubstring", - "title": "Minimal Circular Substring", - "description": "Booth's 1980 algorithm to find the lexicographically-least circular substring", - "sources": [ - "https://ahelwer.ca/post/2023-03-30-pseudocode/" - ], - "authors": [ - "Andrew Helwer" - ], - "tags": [], - "modules": [ - { - "path": "specifications/LeastCircularSubstring/LeastCircularSubstring.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "pluscal" - ], - "models": [] - }, - { - "path": "specifications/LeastCircularSubstring/MCLeastCircularSubstring.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/LeastCircularSubstring/MCLeastCircularSubstringMedium.cfg", - "runtime": "00:01:00", - "size": "medium", - "mode": "exhaustive search", - "features": [], - "result": "success" - }, - { - "path": "specifications/LeastCircularSubstring/MCLeastCircularSubstringSmall.cfg", - "runtime": "00:00:05", - "size": "small", - "mode": "exhaustive search", - "features": [], - "result": "success", - "distinctStates": 8554, - "totalStates": 8681, - "stateDepth": 95 - } - ] - }, - { - "path": "specifications/LeastCircularSubstring/ZSequences.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - } - ] - }, - { - "path": "specifications/LevelChecking", - "title": "TLA⁺ Level Checking", - "description": "Level-checking of TLA⁺ formulas as described in Specifying Systems", - "sources": [ - "https://github.com/tlaplus/tlaplus/blob/6bc82f7746ccdfbdf49cdef24448666d11e5e218/tlatools/org.lamport.tlatools/src/tla2sany/semantic/LevelNode.java#L354-L2778" - ], - "authors": [ - "Leslie Lamport" - ], - "tags": [], - "modules": [ - { - "path": "specifications/LevelChecking/LevelSpec.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - } - ] - }, - { - "path": "specifications/LoopInvariance", - "title": "Loop Invariance", - "description": "Examples of finding and proving loop invariants in PlusCal", - "sources": [ - "http://lamport.azurewebsites.net/tla/proving-safety.pdf" - ], - "authors": [ - "Leslie Lamport" - ], - "tags": [ - "beginner" - ], - "modules": [ - { - "path": "specifications/LoopInvariance/BinarySearch.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "pluscal", - "proof" - ], - "models": [] - }, - { - "path": "specifications/LoopInvariance/MCBinarySearch.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/LoopInvariance/MCBinarySearch.cfg", - "runtime": "00:00:05", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success", - "distinctStates": 27953, - "totalStates": 34383, - "stateDepth": 6 - } - ] - }, - { - "path": "specifications/LoopInvariance/MCQuicksort.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/LoopInvariance/MCQuicksort.cfg", - "runtime": "00:00:05", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success", - "distinctStates": 4548, - "totalStates": 11223, - "stateDepth": 9 - } - ] - }, - { - "path": "specifications/LoopInvariance/Quicksort.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "pluscal", - "proof" - ], - "models": [] - }, - { - "path": "specifications/LoopInvariance/SumSequence.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "pluscal", - "proof" - ], - "models": [] - } - ] - }, - { - "path": "specifications/Majority", - "title": "Boyer-Moore Majority Vote", - "description": "An efficient algorithm for detecting a majority value in a sequence", - "sources": [], - "authors": [ - "Stephan Merz" - ], - "tags": [ - "beginner" - ], - "modules": [ - { - "path": "specifications/Majority/MCMajority.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/Majority/MCMajority.cfg", - "runtime": "00:00:05", - "size": "small", - "mode": "exhaustive search", - "features": [ - "ignore deadlock" - ], - "result": "success", - "distinctStates": 2733, - "totalStates": 3459, - "stateDepth": 6 - } - ] - }, - { - "path": "specifications/Majority/Majority.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/Majority/MajorityProof.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "proof" - ], - "models": [] - } - ] - }, - { - "path": "specifications/MisraReachability", - "title": "Misra Reachability Algorithm", - "description": "A sequential algorithm for computing the set of reachable nodes in a directed graph", - "sources": [], - "authors": [ - "Leslie Lamport" - ], - "tags": [], - "modules": [ - { - "path": "specifications/MisraReachability/MCParReach.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/MisraReachability/MCParReach.cfg", - "runtime": "00:00:30", - "size": "medium", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success" - } - ] - }, - { - "path": "specifications/MisraReachability/MCReachabilityTest.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/MisraReachability/MCReachabilityTestAllGraphs.cfg", - "runtime": "00:00:20", - "size": "medium", - "mode": "exhaustive search", - "features": [], - "result": "success" - }, - { - "path": "specifications/MisraReachability/MCReachabilityTestRandomGraphs.cfg", - "runtime": "00:00:10", - "size": "small", - "mode": "exhaustive search", - "features": [], - "result": "success", - "distinctStates": 0, - "totalStates": 0, - "stateDepth": 0 - } - ] - }, - { - "path": "specifications/MisraReachability/MCReachable.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/MisraReachability/MCReachable.cfg", - "runtime": "00:01:30", - "size": "medium", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success" - } - ] - }, - { - "path": "specifications/MisraReachability/ParReach.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "pluscal" - ], - "models": [] - }, - { - "path": "specifications/MisraReachability/ParReachProofs.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "proof" - ], - "models": [] - }, - { - "path": "specifications/MisraReachability/Reachability.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/MisraReachability/ReachabilityProofs.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "proof" - ], - "models": [] - }, - { - "path": "specifications/MisraReachability/ReachabilityTest.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/MisraReachability/Reachable.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "pluscal" - ], - "models": [] - }, - { - "path": "specifications/MisraReachability/ReachableProofs.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "proof" - ], - "models": [] - } - ] - }, - { - "path": "specifications/MissionariesAndCannibals", - "title": "Missionaries and Cannibals", - "description": "Spec of a river-crossing puzzle", - "sources": [], - "authors": [ - "Leslie Lamport" - ], - "tags": [ - "beginner" - ], - "modules": [ - { - "path": "specifications/MissionariesAndCannibals/MissionariesAndCannibals.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/MissionariesAndCannibals/MissionariesAndCannibals.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [], - "result": "safety failure" - } - ] - } - ] - }, - { - "path": "specifications/Moving_Cat_Puzzle", - "title": "The Moving Cat Puzzle", - "description": "Demonstrating the solution for the moving cat puzzle is correct.", - "sources": [], - "authors": [ - "Florian Schanda" - ], - "tags": [ - "beginner" - ], - "modules": [ - { - "path": "specifications/Moving_Cat_Puzzle/Cat.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/Moving_Cat_Puzzle/CatOddBoxes.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success", - "distinctStates": 30, - "totalStates": 78, - "stateDepth": 1 - }, - { - "path": "specifications/Moving_Cat_Puzzle/CatEvenBoxes.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success", - "distinctStates": 48, - "totalStates": 128, - "stateDepth": 1 - } - ] - } - ] - }, - { - "path": "specifications/MultiCarElevator", - "title": "Multi-Car Elevator System", - "description": "A simple multi-car elevator system servicing a multi-floor building", - "sources": [ - "https://groups.google.com/g/tlaplus/c/5Xd8kv288jE/m/IrliJIatBwAJ" - ], - "authors": [ - "Andrew Helwer" - ], - "tags": [], - "modules": [ - { - "path": "specifications/MultiCarElevator/Elevator.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/MultiCarElevator/ElevatorLivenessLarge.cfg", - "runtime": "00:11:00", - "size": "large", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success" - }, - { - "path": "specifications/MultiCarElevator/ElevatorLivenessMedium.cfg", - "runtime": "00:00:30", - "size": "medium", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success" - }, - { - "path": "specifications/MultiCarElevator/ElevatorSafetyLarge.cfg", - "runtime": "00:10:00", - "size": "large", - "mode": "exhaustive search", - "features": [], - "result": "success" - }, - { - "path": "specifications/MultiCarElevator/ElevatorSafetyMedium.cfg", - "runtime": "00:03:00", - "size": "medium", - "mode": "exhaustive search", - "features": [], - "result": "success" - }, - { - "path": "specifications/MultiCarElevator/ElevatorSafetySmall.cfg", - "runtime": "00:00:15", - "size": "small", - "mode": "exhaustive search", - "features": [], - "result": "success", - "distinctStates": 4122, - "totalStates": 14296, - "stateDepth": 37 - } - ] - } - ] - }, - { - "path": "specifications/MultiPaxos-SMR", - "title": "MultiPaxos in SMR-Style", - "description": "MultiPaxos in practical state machine replication system style", - "sources": [ - "https://www.josehu.com/technical/2024/02/19/practical-MultiPaxos-TLA-spec.html" - ], - "authors": [ - "Guanzhou Hu" - ], - "tags": [ - "intermediate" - ], - "modules": [ - { - "path": "specifications/MultiPaxos-SMR/MultiPaxos.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "pluscal" - ], - "models": [] - }, - { - "path": "specifications/MultiPaxos-SMR/MultiPaxos_MC.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/MultiPaxos-SMR/MultiPaxos_MC.cfg", - "runtime": "00:07:53", - "size": "large", - "mode": "exhaustive search", - "features": [ - "symmetry" - ], - "result": "success" - }, - { - "path": "specifications/MultiPaxos-SMR/MultiPaxos_MC_small.cfg", - "runtime": "00:00:10", - "size": "small", - "mode": "exhaustive search", - "features": [ - "symmetry" - ], - "result": "success", - "distinctStates": 343796, - "totalStates": 736012, - "stateDepth": 28 - } - ] - } - ] - }, - { - "path": "specifications/N-Queens", - "title": "The N-Queens Puzzle", - "description": "Place N queens on an NxN chess board such that no two queens threaten each other", - "sources": [], - "authors": [ - "Stephan Merz" - ], - "tags": [ - "beginner" - ], - "modules": [ - { - "path": "specifications/N-Queens/Queens.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/N-Queens/Queens.toolbox/FourQueens/MC.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/N-Queens/Queens.toolbox/FourQueens/MC.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "ignore deadlock" - ], - "result": "safety failure" - } - ] - }, - { - "path": "specifications/N-Queens/Queens.toolbox/FourQueens/Queens.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/N-Queens/QueensPluscal.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "pluscal" - ], - "models": [] - }, - { - "path": "specifications/N-Queens/QueensPluscal.toolbox/FourQueens/MC.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/N-Queens/QueensPluscal.toolbox/FourQueens/MC.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "safety failure" - } - ] - }, - { - "path": "specifications/N-Queens/QueensPluscal.toolbox/FourQueens/QueensPluscal.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "pluscal" - ], - "models": [] - } - ] - }, - { - "path": "specifications/NanoBlockchain", - "title": "Nano Blockchain Protocol", - "description": "A specification of the protocol originally used by the Nano blockchain", - "sources": [], - "authors": [ - "Andrew Helwer" - ], - "tags": [], - "modules": [ - { - "path": "specifications/NanoBlockchain/MCNano.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/NanoBlockchain/MCNanoLarge.cfg", - "runtime": "00:20:00", - "size": "large", - "mode": "exhaustive search", - "features": [ - "view" - ], - "result": "success" - }, - { - "path": "specifications/NanoBlockchain/MCNanoMedium.cfg", - "runtime": "00:00:30", - "size": "medium", - "mode": "exhaustive search", - "features": [ - "view" - ], - "result": "success" - }, - { - "path": "specifications/NanoBlockchain/MCNanoSmall.cfg", - "runtime": "00:00:05", - "size": "small", - "mode": "exhaustive search", - "features": [ - "view" - ], - "result": "success", - "distinctStates": 3003, - "totalStates": 6083, - "stateDepth": 7 - } - ] - }, - { - "path": "specifications/NanoBlockchain/Nano.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - } - ] - }, - { - "path": "specifications/Paxos", - "title": "The Paxos Protocol", - "description": "A protocol for error-tolerant consensus", - "sources": [], - "authors": [ - "Leslie Lamport" - ], - "tags": [], - "modules": [ - { - "path": "specifications/Paxos/Consensus.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "proof" - ], - "models": [] - }, - { - "path": "specifications/Paxos/MCConsensus.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/Paxos/MCConsensus.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "ignore deadlock" - ], - "result": "success", - "distinctStates": 4, - "totalStates": 7, - "stateDepth": 1 - } - ] - }, - { - "path": "specifications/Paxos/MCPaxos.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/Paxos/MCPaxos.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness", - "symmetry" - ], - "result": "success", - "distinctStates": 25, - "totalStates": 82, - "stateDepth": 9 - } - ] - }, - { - "path": "specifications/Paxos/MCVoting.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/Paxos/MCVoting.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "ignore deadlock", - "liveness", - "symmetry" - ], - "result": "success", - "distinctStates": 77, - "totalStates": 451, - "stateDepth": 11 - } - ] - }, - { - "path": "specifications/Paxos/Paxos.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/Paxos/Voting.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "proof" - ], - "models": [] - } - ] - }, - { - "path": "specifications/PaxosHowToWinATuringAward", - "title": "Paxos (How to Win a Turing Award)", - "description": "Exercises from the lecture The Paxos Algorithm - or How to Win a Turing Award", - "sources": [ - "https://www.youtube.com/watch?v=tw3gsBms-f8" - ], - "authors": [ - "Leslie Lamport" - ], - "tags": [], - "modules": [ - { - "path": "specifications/PaxosHowToWinATuringAward/Consensus.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "proof" - ], - "models": [] - }, - { - "path": "specifications/PaxosHowToWinATuringAward/MCConsensus.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/PaxosHowToWinATuringAward/MCConsensus.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "ignore deadlock" - ], - "result": "success", - "distinctStates": 4, - "totalStates": 4, - "stateDepth": 2 - } - ] - }, - { - "path": "specifications/PaxosHowToWinATuringAward/MCPaxos.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/PaxosHowToWinATuringAward/MCPaxosSmall.cfg", - "runtime": "00:01:00", - "size": "medium", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success" - }, - { - "path": "specifications/PaxosHowToWinATuringAward/MCPaxosTiny.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success", - "distinctStates": 3921, - "totalStates": 23563, - "stateDepth": 17 - } - ] - }, - { - "path": "specifications/PaxosHowToWinATuringAward/MCVoting.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/PaxosHowToWinATuringAward/MCVoting.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "ignore deadlock", - "liveness" - ], - "result": "success", - "distinctStates": 6752, - "totalStates": 41017, - "stateDepth": 16 - } - ] - }, - { - "path": "specifications/PaxosHowToWinATuringAward/Paxos.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/PaxosHowToWinATuringAward/Voting.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "proof" - ], - "models": [] - } - ] - }, - { - "path": "specifications/Prisoners", - "title": "The Prisoners & Switches Puzzle", - "description": "Given a room containing two switches prisoners enter one by one, they must develop a strategy to free themselves", - "sources": [], - "authors": [ - "Leslie Lamport" - ], - "tags": [ - "beginner" - ], - "modules": [ - { - "path": "specifications/Prisoners/MCPrisoners.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/Prisoners/Prisoners.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/Prisoners/Prisoners.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success", - "distinctStates": 214, - "totalStates": 860, - "stateDepth": 14 - } - ] - } - ] - }, - { - "path": "specifications/Prisoners_Single_Switch", - "title": "The Prisoners & Switch Puzzle", - "description": "Given a room containing a single light switch prisoners enter one by one, they must develop a strategy to free themselves.", - "sources": [], - "authors": [ - "Florian Schanda" - ], - "tags": [ - "beginner" - ], - "modules": [ - { - "path": "specifications/Prisoners_Single_Switch/Prisoner.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/Prisoners_Single_Switch/Prisoner.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success", - "distinctStates": 16, - "totalStates": 49, - "stateDepth": 5 - }, - { - "path": "specifications/Prisoners_Single_Switch/PrisonerLightUnknown.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success", - "distinctStates": 62, - "totalStates": 188, - "stateDepth": 11 - }, - { - "path": "specifications/Prisoners_Single_Switch/PrisonerSolo.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success", - "distinctStates": 2, - "totalStates": 3, - "stateDepth": 2 - }, - { - "path": "specifications/Prisoners_Single_Switch/PrisonerSoloLightUnknown.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success", - "distinctStates": 4, - "totalStates": 6, - "stateDepth": 2 - } - ] - } - ] - }, - { - "path": "specifications/ReadersWriters", - "title": "The Readers-Writers Problem", - "description": "Controlling concurrent access to a resource", - "sources": [], - "authors": [ - "Isaac DeFrain" - ], - "tags": [], - "modules": [ - { - "path": "specifications/ReadersWriters/MC.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/ReadersWriters/MC.cfg", - "runtime": "00:00:05", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success", - "distinctStates": 21527, - "totalStates": 59674, - "stateDepth": 13 - } - ] - }, - { - "path": "specifications/ReadersWriters/ReadersWriters.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - } - ] - }, - { - "path": "specifications/SDP_Verification", - "title": "Software-Defined Perimeter", - "description": "Specifying and verifying SDP-protocol-based zero trust architecture", - "sources": [ - "https://github.com/10227694/SDP_Verification" - ], - "authors": [ - "Luming Dong", - "Zhi Niu" - ], - "tags": [], - "modules": [ - { - "path": "specifications/SDP_Verification/SDP_Attack_New_Solution_Spec/MC.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/SDP_Verification/SDP_Attack_New_Solution_Spec/MC.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "ignore deadlock", - "liveness" - ], - "result": "success", - "distinctStates": 2881, - "totalStates": 6826, - "stateDepth": 21 - } - ] - }, - { - "path": "specifications/SDP_Verification/SDP_Attack_New_Solution_Spec/SPA_Attack_New.tla", - "communityDependencies": [ - "Bitwise", - "Functions" - ], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SDP_Verification/SDP_Attack_Spec/MC.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/SDP_Verification/SDP_Attack_Spec/MC.cfg", - "runtime": "00:00:05", - "size": "small", - "mode": "exhaustive search", - "features": [ - "ignore deadlock", - "liveness" - ], - "result": "safety failure" - } - ] - }, - { - "path": "specifications/SDP_Verification/SDP_Attack_Spec/SPA_Attack.tla", - "communityDependencies": [ - "Bitwise", - "Functions" - ], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - } - ] - }, - { - "path": "specifications/SimplifiedFastPaxos", - "title": "Simplified Fast Paxos", - "description": "Spec of simplified Fast Paxos from Lamport's 2006 paper Fast Paxos", - "sources": [], - "authors": [ - "Lim Ngian Xin Terry", - "Gaurav Gandhi" - ], - "tags": [], - "modules": [ - { - "path": "specifications/SimplifiedFastPaxos/FastPaxos.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/SimplifiedFastPaxos/FastPaxos.cfg", - "runtime": "00:00:30", - "size": "medium", - "mode": "exhaustive search", - "features": [ - "liveness", - "symmetry" - ], - "result": "success" - } - ] - }, - { - "path": "specifications/SimplifiedFastPaxos/Paxos.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/SimplifiedFastPaxos/Paxos.cfg", - "runtime": "00:00:05", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness", - "symmetry" - ], - "result": "success", - "distinctStates": 1207, - "totalStates": 13290, - "stateDepth": 22 - } - ] - } - ] - }, - { - "path": "specifications/SingleLaneBridge", - "title": "Single-Lane Bridge Problem", - "description": "Controlling cars moving over a single-lange bridge in opposite directions", - "sources": [], - "authors": [ - "Younes Akhouayri" - ], - "tags": [], - "modules": [ - { - "path": "specifications/SingleLaneBridge/MC.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/SingleLaneBridge/MC.cfg", - "runtime": "00:00:10", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success", - "distinctStates": 3605, - "totalStates": 20181, - "stateDepth": 29 - } - ] - }, - { - "path": "specifications/SingleLaneBridge/SingleLaneBridge.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - } - ] - }, - { - "path": "specifications/SlidingPuzzles", - "title": "Sliding Block Puzzle", - "description": "A spec of the Klotski sliding block puzzle", - "sources": [], - "authors": [ - "Mariusz Ryndzionek" - ], - "tags": [], - "modules": [ - { - "path": "specifications/SlidingPuzzles/SlidingPuzzles.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/SlidingPuzzles/SlidingPuzzles.cfg", - "runtime": "00:00:05", - "size": "small", - "mode": "exhaustive search", - "features": [], - "result": "safety failure" - } - ] - } - ] - }, - { - "path": "specifications/SlushProtocol", - "title": "The Slush Protocol", - "description": "An attempt to use TLA⁺ to analyze a probabilistic protocol in the Avalanche family", - "sources": [ - "https://github.com/ahelwer/avalanche-analysis", - "https://ahelwer.ca/post/2020-09-11-probabilistic-distsys/" - ], - "authors": [ - "Andrew Helwer" - ], - "tags": [], - "modules": [ - { - "path": "specifications/SlushProtocol/Slush.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "pluscal" - ], - "models": [ - { - "path": "specifications/SlushProtocol/SlushLarge.cfg", - "runtime": "00:50:00", - "size": "large", - "mode": "exhaustive search", - "features": [], - "result": "success" - }, - { - "path": "specifications/SlushProtocol/SlushMedium.cfg", - "runtime": "00:01:00", - "size": "medium", - "mode": "exhaustive search", - "features": [], - "result": "success" - }, - { - "path": "specifications/SlushProtocol/SlushSmall.cfg", - "runtime": "00:00:15", - "size": "small", - "mode": "exhaustive search", - "features": [], - "result": "success", - "distinctStates": 274678, - "totalStates": 1621541, - "stateDepth": 43 - } - ] - } - ] - }, - { - "path": "specifications/SpanningTree", - "title": "Span Tree Exercise", - "description": "Simplified algorithm from the Lamport paper *An Assertional Correctness Proof of a Distributed Program*", - "sources": [], - "authors": [ - "Leslie Lamport" - ], - "tags": [], - "modules": [ - { - "path": "specifications/SpanningTree/SpanTree.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/SpanningTree/SpanTree.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "ignore deadlock", - "liveness" - ], - "result": "success", - "distinctStates": 1236, - "totalStates": 10278, - "stateDepth": 6 - } - ] - }, - { - "path": "specifications/SpanningTree/SpanTreeRandom.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/SpanningTree/SpanTreeRandom.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "ignore deadlock", - "liveness" - ], - "result": "success" - } - ] - }, - { - "path": "specifications/SpanningTree/SpanTreeTest.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/SpanningTree/SpanTreeTest4Nodes.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "ignore deadlock", - "liveness" - ], - "result": "success", - "distinctStates": 3984, - "totalStates": 21784, - "stateDepth": 4 - }, - { - "path": "specifications/SpanningTree/SpanTreeTest5Nodes.cfg", - "runtime": "unknown", - "size": "large", - "mode": "exhaustive search", - "features": [ - "ignore deadlock", - "liveness" - ], - "result": "unknown" - } - ] - } - ] - }, - { - "path": "specifications/SpecifyingSystems", - "title": "Specs from Specifying Systems", - "description": "All specs seen in the textbook Specifying Systems by Leslie Lamport", - "sources": [ - "http://lamport.azurewebsites.net/tla/book.html" - ], - "authors": [ - "Leslie Lamport" - ], - "tags": [ - "beginner" - ], - "modules": [ - { - "path": "specifications/SpecifyingSystems/AdvancedExamples/BNFGrammars.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/AdvancedExamples/DifferentialEquations.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/AdvancedExamples/Graphs.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/AdvancedExamples/InnerSequential.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/AdvancedExamples/InnerSerial.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/AdvancedExamples/MCInnerSequential.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/SpecifyingSystems/AdvancedExamples/MCInnerSequential.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness", - "state constraint" - ], - "result": "success", - "distinctStates": 3528, - "totalStates": 24368, - "stateDepth": 9 - } - ] - }, - { - "path": "specifications/SpecifyingSystems/AdvancedExamples/MCInnerSerial.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/SpecifyingSystems/AdvancedExamples/MCInnerSerial.cfg", - "runtime": "00:01:30", - "size": "medium", - "mode": "exhaustive search", - "features": [ - "liveness", - "state constraint" - ], - "result": "success" - } - ] - }, - { - "path": "specifications/SpecifyingSystems/AdvancedExamples/RegisterInterface.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/AdvancedExamples/SerialMemory.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/AsynchronousInterface/AsynchInterface.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/SpecifyingSystems/AsynchronousInterface/AsynchInterface.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [], - "result": "success", - "distinctStates": 12, - "totalStates": 30, - "stateDepth": 2 - } - ] - }, - { - "path": "specifications/SpecifyingSystems/AsynchronousInterface/Channel.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/SpecifyingSystems/AsynchronousInterface/Channel.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [], - "result": "success", - "distinctStates": 12, - "totalStates": 30, - "stateDepth": 2 - } - ] - }, - { - "path": "specifications/SpecifyingSystems/AsynchronousInterface/PrintValues.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/SpecifyingSystems/AsynchronousInterface/PrintValues.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [], - "result": "success", - "distinctStates": 0, - "totalStates": 0, - "stateDepth": 0 - } - ] - }, - { - "path": "specifications/SpecifyingSystems/CachingMemory/InternalMemory.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/CachingMemory/MCInternalMemory.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/SpecifyingSystems/CachingMemory/MCInternalMemory.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [], - "result": "success", - "distinctStates": 4408, - "totalStates": 21400, - "stateDepth": 10 - } - ] - }, - { - "path": "specifications/SpecifyingSystems/CachingMemory/MCWriteThroughCache.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/SpecifyingSystems/CachingMemory/MCWriteThroughCache.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success", - "distinctStates": 5196, - "totalStates": 28170, - "stateDepth": 18 - } - ] - }, - { - "path": "specifications/SpecifyingSystems/CachingMemory/Memory.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/CachingMemory/MemoryInterface.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/CachingMemory/WriteThroughCache.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/CachingMemory/WriteThroughCacheInstanced.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/Composing/BinaryHourClock.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/Composing/Channel.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/Composing/ChannelRefinement.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/Composing/CompositeFIFO.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/Composing/HourClock.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/Composing/InternalMemory.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/Composing/JointActionMemory.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/Composing/MemoryInterface.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/FIFO/Channel.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/FIFO/FIFO.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/FIFO/InnerFIFO.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/FIFO/InnerFIFOInstanced.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/FIFO/MCInnerFIFO.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/SpecifyingSystems/FIFO/MCInnerFIFO.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "state constraint" - ], - "result": "success", - "distinctStates": 3864, - "totalStates": 9660, - "stateDepth": 11 - } - ] - }, - { - "path": "specifications/SpecifyingSystems/HourClock/HourClock.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/SpecifyingSystems/HourClock/HourClock.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [], - "result": "success", - "distinctStates": 12, - "totalStates": 24, - "stateDepth": 1 - } - ] - }, - { - "path": "specifications/SpecifyingSystems/HourClock/HourClock2.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/SpecifyingSystems/HourClock/HourClock2.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success", - "distinctStates": 12, - "totalStates": 24, - "stateDepth": 1 - } - ] - }, - { - "path": "specifications/SpecifyingSystems/Liveness/HourClock.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/Liveness/InternalMemory.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/Liveness/LiveHourClock.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/SpecifyingSystems/Liveness/LiveHourClock.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success", - "distinctStates": 12, - "totalStates": 24, - "stateDepth": 1 - } - ] - }, - { - "path": "specifications/SpecifyingSystems/Liveness/LiveInternalMemory.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/Liveness/LiveWriteThroughCache.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/Liveness/MCInternalMemory.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/Liveness/MCLiveInternalMemory.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/SpecifyingSystems/Liveness/MCLiveInternalMemory.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success", - "distinctStates": 4408, - "totalStates": 21400, - "stateDepth": 10 - } - ] - }, - { - "path": "specifications/SpecifyingSystems/Liveness/MCLiveWriteThroughCache.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/SpecifyingSystems/Liveness/MCLiveWriteThroughCache.cfg", - "runtime": "00:00:05", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success", - "distinctStates": 5196, - "totalStates": 28170, - "stateDepth": 18 - } - ] - }, - { - "path": "specifications/SpecifyingSystems/Liveness/Memory.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/Liveness/MemoryInterface.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/Liveness/WriteThroughCacheInstanced.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/RealTime/HourClock.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/RealTime/InternalMemory.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/RealTime/MCRealTime.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/RealTime/MCRealTimeHourClock.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/SpecifyingSystems/RealTime/MCRealTimeHourClock.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "liveness failure" - } - ] - }, - { - "path": "specifications/SpecifyingSystems/RealTime/Memory.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/RealTime/MemoryInterface.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/RealTime/RTMemory.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/RealTime/RTWriteThroughCache.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/RealTime/RealTimeHourClock.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/RealTime/RealTime_SS.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/RealTime/WriteThroughCache.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/SimpleMath/SimpleMath.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/SpecifyingSystems/SimpleMath/SimpleMath.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [], - "result": "success", - "distinctStates": 0, - "totalStates": 0, - "stateDepth": 0 - } - ] - }, - { - "path": "specifications/SpecifyingSystems/Standard/Bags.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/Standard/FiniteSets.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/Standard/Integers.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/Standard/Naturals.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/Standard/Peano.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/Standard/ProtoReals.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/Standard/Reals.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/Standard/Sequences.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/Syntax/BNFGrammars.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/Syntax/TLAPlusGrammar.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/TLC/ABCorrectness.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/SpecifyingSystems/TLC/ABCorrectness.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [], - "result": "success", - "distinctStates": 20, - "totalStates": 36, - "stateDepth": 3 - } - ] - }, - { - "path": "specifications/SpecifyingSystems/TLC/AlternatingBit.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/TLC/BNFGrammars.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/TLC/ConfigFileGrammar.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/SpecifyingSystems/TLC/MCAlternatingBit.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/SpecifyingSystems/TLC/MCAlternatingBit.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness", - "state constraint" - ], - "result": "success", - "distinctStates": 240, - "totalStates": 1392, - "stateDepth": 10 - } - ] - } - ] - }, - { - "path": "specifications/Stones", - "title": "Stone Scale Puzzle", - "description": "Alternative implementation of the Car Talk Puzzle", - "sources": [], - "authors": [ - "Leslie Lamport" - ], - "tags": [ - "beginner" - ], - "modules": [ - { - "path": "specifications/Stones/Stones.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/Stones/Stones.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [], - "result": "success", - "distinctStates": 0, - "totalStates": 0, - "stateDepth": 0 - } - ] - } - ] - }, - { - "path": "specifications/TLC", - "title": "The TLC Safety Checking Algorithm", - "description": "Spec of the safety checking algorithm used by the TLC model-checker", - "sources": [], - "authors": [ - "Markus Kuppe" - ], - "tags": [], - "modules": [ - { - "path": "specifications/TLC/TLCMC.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "pluscal" - ], - "models": [] - }, - { - "path": "specifications/TLC/TestGraphs.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/TLC/TestGraphs.cfg", - "runtime": "00:00:05", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success", - "distinctStates": 2790, - "totalStates": 2990, - "stateDepth": 52 - } - ] - } - ] - }, - { - "path": "specifications/TeachingConcurrency", - "title": "Teaching Concurrency", - "description": "Simple problem useful for teaching and learning about concurrency", - "sources": [ - "http://lamport.azurewebsites.net/pubs/teaching-concurrency.pdf" - ], - "authors": [ - "Leslie Lamport" - ], - "tags": [ - "beginner" - ], - "modules": [ - { - "path": "specifications/TeachingConcurrency/Simple.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "pluscal", - "proof" - ], - "models": [ - { - "path": "specifications/TeachingConcurrency/Simple.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [], - "result": "success", - "distinctStates": 723, - "totalStates": 1842, - "stateDepth": 11 - } - ] - }, - { - "path": "specifications/TeachingConcurrency/SimpleRegular.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "pluscal", - "proof" - ], - "models": [ - { - "path": "specifications/TeachingConcurrency/SimpleRegular.cfg", - "runtime": "00:00:05", - "size": "small", - "mode": "exhaustive search", - "features": [], - "result": "success", - "distinctStates": 277726, - "totalStates": 1454776, - "stateDepth": 25 - } - ] - } - ] - }, - { - "path": "specifications/TransitiveClosure", - "title": "Transitive Closure", - "description": "Spec defining the transitive closure of a relation", - "sources": [], - "authors": [ - "Stephan Merz" - ], - "tags": [], - "modules": [ - { - "path": "specifications/TransitiveClosure/TransitiveClosure.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/TransitiveClosure/TransitiveClosure.cfg", - "runtime": "00:00:05", - "size": "small", - "mode": "exhaustive search", - "features": [], - "result": "success", - "distinctStates": 0, - "totalStates": 0, - "stateDepth": 0 - } - ] - } - ] - }, - { - "path": "specifications/TwoPhase", - "title": "Two-Phase Handshaking", - "description": "Specification of a very simple hardware protocol called two-phase handshaking", - "sources": [], - "authors": [ - "Leslie Lamport", - "Stephan Merz" - ], - "tags": [], - "modules": [ - { - "path": "specifications/TwoPhase/Alternate.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/TwoPhase/MCTwoPhase.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/TwoPhase/MCTwoPhase.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [], - "result": "success", - "distinctStates": 4, - "totalStates": 5, - "stateDepth": 4 - } - ] - }, - { - "path": "specifications/TwoPhase/TwoPhase.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "proof" - ], - "models": [] - } - ] - }, - { - "path": "specifications/YoYo", - "title": "Yo-Yo Leader Election", - "description": "Algorithm due to Nicola Santoro for leader election in a connected undirected network", - "sources": [ - "https://research.nicola-santoro.com/DADA.html" - ], - "authors": [ - "Ludovic Yvoz", - "Stephan Merz" - ], - "tags": [], - "modules": [ - { - "path": "specifications/YoYo/MCYoYoNoPruning.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/YoYo/MCYoYoNoPruning.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success", - "distinctStates": 60, - "totalStates": 110, - "stateDepth": 19 - } - ] - }, - { - "path": "specifications/YoYo/MCYoYoPruning.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/YoYo/MCYoYoPruning.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "ignore deadlock", - "liveness" - ], - "result": "success", - "distinctStates": 102, - "totalStates": 157, - "stateDepth": 31 - } - ] - }, - { - "path": "specifications/YoYo/YoYoAllGraphs.tla", - "communityDependencies": [ - "UndirectedGraphs" - ], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/YoYo/YoYoAllGraphs.cfg", - "runtime": "00:00:02", - "size": "medium", - "mode": "exhaustive search", - "features": [ - "ignore deadlock", - "liveness" - ], - "result": "success", - "distinctStates": 26731, - "totalStates": 48535, - "stateDepth": 39 - } - ] - }, - { - "path": "specifications/YoYo/YoYoNoPruning.tla", - "communityDependencies": [ - "UndirectedGraphs" - ], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/YoYo/YoYoPruning.tla", - "communityDependencies": [ - "UndirectedGraphs" - ], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - } - ] - }, - { - "path": "specifications/aba-asyn-byz", - "title": "Asynchronous Byzantine Consensus", - "description": "Spec of the protocol from paper *Asynchronous Consensus and Broadcast Protocols* (1985)", - "sources": [], - "authors": [ - "Igor Konnov", - "Josef Widder", - "Thanh Hai Tran" - ], - "tags": [], - "modules": [ - { - "path": "specifications/aba-asyn-byz/aba_asyn_byz.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/aba-asyn-byz/aba_asyn_byz.cfg", - "runtime": "00:10:00", - "size": "large", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success" - } - ] - } - ] - }, - { - "path": "specifications/acp", - "title": "Atomic Commitment Protocol", - "description": "TLA⁺ specs from CS-986: Advanced Topics in Program Verification", - "sources": [ - "https://members.loria.fr/SMerz/talks/argentina2005/Charpentier/charpov/Teaching/CS-986/TLC/", - "https://dl.acm.org/doi/10.5555/302430.302436" - ], - "authors": [ - "Stephan Merz" - ], - "tags": [], - "modules": [ - { - "path": "specifications/acp/ACP_NB.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/acp/ACP_NB_TLC.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/acp/ACP_NB_TLC.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "ignore deadlock", - "liveness" - ], - "result": "success", - "distinctStates": 4284, - "totalStates": 23988, - "stateDepth": 19 - } - ] - }, - { - "path": "specifications/acp/ACP_NB_WRONG_TLC.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/acp/ACP_NB_WRONG_TLC.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "ignore deadlock", - "liveness" - ], - "result": "safety failure" - } - ] - }, - { - "path": "specifications/acp/ACP_SB.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/acp/ACP_SB_TLC.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/acp/ACP_SB_TLC.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "ignore deadlock", - "liveness" - ], - "result": "success", - "distinctStates": 54944, - "totalStates": 218352, - "stateDepth": 21 - } - ] - } - ] - }, - { - "path": "specifications/allocator", - "title": "Resource Allocator", - "description": "Specification of a resource allocator", - "sources": [], - "authors": [ - "Stephan Merz" - ], - "tags": [], - "modules": [ - { - "path": "specifications/allocator/AllocatorImplementation.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/allocator/AllocatorImplementation.cfg", - "runtime": "00:00:15", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success", - "distinctStates": 17701, - "totalStates": 64414, - "stateDepth": 16 - } - ] - }, - { - "path": "specifications/allocator/AllocatorRefinement.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/allocator/AllocatorRefinement.cfg", - "runtime": "00:00:05", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success", - "distinctStates": 1690, - "totalStates": 5854, - "stateDepth": 7 - } - ] - }, - { - "path": "specifications/allocator/SchedulingAllocator.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/allocator/SchedulingAllocator.cfg", - "runtime": "00:00:10", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success", - "distinctStates": 1690, - "totalStates": 5854, - "stateDepth": 7 - } - ] - }, - { - "path": "specifications/allocator/SimpleAllocator.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/allocator/SimpleAllocator.cfg", - "runtime": "00:00:05", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success", - "distinctStates": 400, - "totalStates": 1633, - "stateDepth": 6 - } - ] - } - ] - }, - { - "path": "specifications/bcastByz", - "title": "Asynchronous Reliable Broadcast", - "description": "Algorithm from paper *Simulating authenticated broadcasts to derive simple fault-tolerant algorithms* (1987)", - "sources": [], - "authors": [ - "Igor Konnov", - "Josef Widder", - "Thanh Hai Tran" - ], - "tags": [], - "modules": [ - { - "path": "specifications/bcastByz/bcastByz.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "proof" - ], - "models": [ - { - "path": "specifications/bcastByz/bcastByz.cfg", - "runtime": "00:00:10", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success", - "distinctStates": 14424, - "totalStates": 227344, - "stateDepth": 7 - }, - { - "path": "specifications/bcastByz/bcastByzNoBcast.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success", - "distinctStates": 45, - "totalStates": 90, - "stateDepth": 1 - } - ] - } - ] - }, - { - "path": "specifications/bcastFolklore", - "title": "Folklore Reliable Broadcast", - "description": "Algorithm from paper *Unreliable failure detectors for reliable distributed systems* (1996)", - "sources": [], - "authors": [ - "Igor Konnov", - "Josef Widder", - "Thanh Hai Tran" - ], - "tags": [], - "modules": [ - { - "path": "specifications/bcastFolklore/bcastFolklore.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/bcastFolklore/bcastFolklore.cfg", - "runtime": "00:30:00", - "size": "large", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success" - } - ] - } - ] - }, - { - "path": "specifications/bosco", - "title": "The Bosco Byzantine Consensus Algorithm", - "description": "Algorithm from paper *Bosco: One-step byzantine asynchronous consensus* (2008)", - "sources": [], - "authors": [ - "Igor Konnov", - "Josef Widder", - "Thanh Hai Tran" - ], - "tags": [], - "modules": [ - { - "path": "specifications/bosco/bosco.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/bosco/bosco.cfg", - "runtime": "00:03:00", - "size": "medium", - "mode": "exhaustive search", - "features": [], - "result": "success" - } - ] - } - ] - }, - { - "path": "specifications/braf", - "title": "Buffered Random Access File", - "description": "Specification of a Java file caching layer", - "sources": [ - "https://github.com/tlaplus/tlaplus/tree/4613109641676389d97b8df209d6cf4d90d31c1c/tlatools/org.lamport.tlatools/src/tlc2/util/BufferedRandomAccessFile.tla" - ], - "authors": [ - "Calvin Loncaric" - ], - "tags": [], - "modules": [ - { - "path": "specifications/braf/BufferedRandomAccessFile.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/braf/BufferedRandomAccessFile.cfg", - "runtime": "00:00:09", - "size": "small", - "mode": "exhaustive search", - "features": [ - "alias", - "liveness", - "symmetry" - ], - "result": "success", - "distinctStates": 3316, - "totalStates": 128581, - "stateDepth": 11 - } - ] - } - ] - }, - { - "path": "specifications/byihive", - "title": "RFC 3506: Voucher Transaction System", - "description": "Formal specification of a peer-to-peer ledger protocol", - "sources": [ - "https://github.com/byisystems/byihive" - ], - "authors": [ - "Santhosh Raju", - "Cherry G. Mathew", - "Fransisca Andriani" - ], - "tags": [], - "modules": [ - { - "path": "specifications/byihive/VoucherCancel.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/byihive/VoucherCancel.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "ignore deadlock" - ], - "result": "success", - "distinctStates": 4199, - "totalStates": 26848, - "stateDepth": 11 - } - ] - }, - { - "path": "specifications/byihive/VoucherIssue.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/byihive/VoucherIssue.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "ignore deadlock", - "liveness" - ], - "result": "success", - "distinctStates": 4199, - "totalStates": 26848, - "stateDepth": 11 - } - ] - }, - { - "path": "specifications/byihive/VoucherLifeCycle.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/byihive/VoucherLifeCycle.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "ignore deadlock" - ], - "result": "success", - "distinctStates": 64, - "totalStates": 193, - "stateDepth": 7 - } - ] - }, - { - "path": "specifications/byihive/VoucherRedeem.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/byihive/VoucherRedeem.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "ignore deadlock" - ], - "result": "success", - "distinctStates": 4199, - "totalStates": 26848, - "stateDepth": 11 - } - ] - }, - { - "path": "specifications/byihive/VoucherTransfer.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/byihive/VoucherTransfer.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "ignore deadlock" - ], - "result": "success", - "distinctStates": 4197, - "totalStates": 26848, - "stateDepth": 11 - } - ] - } - ] - }, - { - "path": "specifications/byzpaxos", - "title": "Byzantizing Paxos by Refinement", - "description": "Mechanically-checked safety proof of a Byzantine Paxos algorithm", - "sources": [ - "http://lamport.azurewebsites.net/pubs/pubs.html#web-byzpaxos", - "http://lamport.azurewebsites.net/pubs/web-byzpaxos.pdf", - "http://lamport.azurewebsites.net/tla/byzpaxos.html" - ], - "authors": [ - "Leslie Lamport" - ], - "tags": [], - "modules": [ - { - "path": "specifications/byzpaxos/BPConProof.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "pluscal", - "proof" - ], - "models": [ - { - "path": "specifications/byzpaxos/BPConProof.cfg", - "runtime": "unknown", - "size": "large", - "mode": "exhaustive search", - "features": [], - "result": "unknown" - } - ] - }, - { - "path": "specifications/byzpaxos/Consensus.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "pluscal", - "proof" - ], - "models": [ - { - "path": "specifications/byzpaxos/Consensus.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "ignore deadlock", - "liveness" - ], - "result": "success", - "distinctStates": 4, - "totalStates": 4, - "stateDepth": 2 - } - ] - }, - { - "path": "specifications/byzpaxos/PConProof.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "pluscal", - "proof" - ], - "models": [ - { - "path": "specifications/byzpaxos/PConProof.cfg", - "runtime": "00:06:00", - "size": "large", - "mode": "exhaustive search", - "features": [], - "result": "success" - } - ] - }, - { - "path": "specifications/byzpaxos/VoteProof.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "pluscal", - "proof" - ], - "models": [ - { - "path": "specifications/byzpaxos/VoteProof.cfg", - "runtime": "00:00:05", - "size": "small", - "mode": "exhaustive search", - "features": [ - "ignore deadlock", - "liveness" - ], - "result": "success", - "distinctStates": 6962, - "totalStates": 318877, - "stateDepth": 15 - } - ] - } - ] - }, - { - "path": "specifications/c1cs", - "title": "Consensus in One Communication Step", - "description": "Algorithm from paper *Consensus in one communication step* (2001)", - "sources": [], - "authors": [ - "Igor Konnov", - "Josef Widder", - "Thanh Hai Tran" - ], - "tags": [], - "modules": [ - { - "path": "specifications/c1cs/c1cs.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/c1cs/c1cs.cfg", - "runtime": "unknown", - "size": "large", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "unknown" - } - ] - } - ] - }, - { - "path": "specifications/cbc_max", - "title": "Condition-Based Consensus", - "description": "Algorithm from paper *Evaluating the condition-based approach to solve consensus* (2003)", - "sources": [], - "authors": [ - "Igor Konnov", - "Josef Widder", - "Thanh Hai Tran" - ], - "tags": [], - "modules": [ - { - "path": "specifications/cbc_max/cbc_max.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - } - ] - }, - { - "path": "specifications/cf1s-folklore", - "title": "One-Step Consensus with Zero-Degradation", - "description": "Algorithm from paper *One-step Consensus with Zero-Degradation* (2006)", - "sources": [], - "authors": [ - "Igor Konnov", - "Josef Widder", - "Thanh Hai Tran" - ], - "tags": [], - "modules": [ - { - "path": "specifications/cf1s-folklore/cf1s_folklore.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/cf1s-folklore/cf1s_folklore.cfg", - "runtime": "00:01:00", - "size": "medium", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success" - } - ] - } - ] - }, - { - "path": "specifications/chang_roberts", - "title": "Chang-Roberts Algorithm for Leader Election in a Ring", - "description": "Algorithm from paper *An improved algorithm for decentralized extrema-finding in circular configurations of processes* (1979)", - "sources": [], - "authors": [ - "Stephan Merz" - ], - "tags": [], - "modules": [ - { - "path": "specifications/chang_roberts/ChangRoberts.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "pluscal" - ], - "models": [] - }, - { - "path": "specifications/chang_roberts/MCChangRoberts.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/chang_roberts/MCChangRoberts.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "ignore deadlock", - "liveness" - ], - "result": "success", - "distinctStates": 137, - "totalStates": 227, - "stateDepth": 10 - } - ] - } - ] - }, - { - "path": "specifications/detector_chan96", - "title": "Failure Detector", - "description": "Algorithm from paper *Unreliable failure detectors for reliable distributed systems* (1996)", - "sources": [], - "authors": [ - "Igor Konnov", - "Josef Widder", - "Thanh Hai Tran" - ], - "tags": [], - "modules": [ - { - "path": "specifications/detector_chan96/Age_Channel.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/detector_chan96/EPFailureDetector.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/detector_chan96/EnvironmentController.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/detector_chan96/EnvironmentController.cfg", - "runtime": "02:00:00", - "size": "large", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success" - } - ] - } - ] - }, - { - "path": "specifications/dijkstra-mutex", - "title": "Dijkstra's Mutual Exclusion Algorithm", - "description": "Algorithm from paper *Solution of a Problem in Concurrent Programming Control* (1965)", - "sources": [], - "authors": [ - "Leslie Lamport" - ], - "tags": [ - "ewd" - ], - "modules": [ - { - "path": "specifications/dijkstra-mutex/DijkstraMutex.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "pluscal" - ], - "models": [] - }, - { - "path": "specifications/dijkstra-mutex/DijkstraMutex.toolbox/LSpec-model/DijkstraMutex.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "pluscal" - ], - "models": [] - }, - { - "path": "specifications/dijkstra-mutex/DijkstraMutex.toolbox/LSpec-model/MC.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/dijkstra-mutex/DijkstraMutex.toolbox/LSpec-model/MC.cfg", - "runtime": "00:00:50", - "size": "medium", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success" - } - ] - }, - { - "path": "specifications/dijkstra-mutex/DijkstraMutex.toolbox/Safety-4-processors/DijkstraMutex.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "pluscal" - ], - "models": [] - }, - { - "path": "specifications/dijkstra-mutex/DijkstraMutex.toolbox/Safety-4-processors/MC.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/dijkstra-mutex/DijkstraMutex.toolbox/Safety-4-processors/MC.cfg", - "runtime": "00:02:00", - "size": "medium", - "mode": "exhaustive search", - "features": [], - "result": "success" - } - ] - } - ] - }, - { - "path": "specifications/diskpaxos", - "title": "SWMR Shared Memory Disk Paxos", - "description": "A formalization of the SWMR-Shared-Memory Disk Paxos", - "sources": [ - "https://github.com/nano-o/MultiPaxos/blob/master/DiskPaxos.tla" - ], - "authors": [ - "Giuliano Losa", - "Leslie Lamport" - ], - "tags": [], - "modules": [ - { - "path": "specifications/diskpaxos/DiskSynod.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/diskpaxos/HDiskSynod.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/diskpaxos/MC_HDiskSynod.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/diskpaxos/MC_HDiskSynod.cfg", - "runtime": "unknown", - "size": "large", - "mode": "exhaustive search", - "features": [], - "result": "unknown" - } - ] - }, - { - "path": "specifications/diskpaxos/Synod.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - } - ] - }, - { - "path": "specifications/echo", - "title": "The Echo Algorithm", - "description": "Algorithm for constructing a spanning tree in an undirected graph", - "sources": [], - "authors": [ - "Stephan Merz" - ], - "tags": [], - "modules": [ - { - "path": "specifications/echo/Echo.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "pluscal" - ], - "models": [] - }, - { - "path": "specifications/echo/MCEcho.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/echo/MCEcho.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [], - "result": "success", - "distinctStates": 75, - "totalStates": 116, - "stateDepth": 16 - } - ] - }, - { - "path": "specifications/echo/Relation.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - } - ] - }, - { - "path": "specifications/ewd426", - "title": "EWD 426: Token Stabilization", - "description": "Dijkstra's classical stabilizing token ring algorithm, EWD426", - "sources": [], - "authors": [ - "Markus Kuppe", - "Murat Demirbas" - ], - "tags": [ - "ewd" - ], - "modules": [ - { - "path": "specifications/ewd426/SimTokenRing.tla", - "communityDependencies": [ - "CSV", - "IOUtils" - ], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/ewd426/SimTokenRing.cfg", - "runtime": "unknown", - "size": "large", - "mode": "generate", - "features": [ - "ignore deadlock", - "state constraint" - ], - "result": "unknown" - } - ] - }, - { - "path": "specifications/ewd426/TokenRing.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/ewd426/TokenRing.cfg", - "runtime": "00:00:05", - "size": "small", - "mode": "exhaustive search", - "features": [ - "alias", - "ignore deadlock", - "liveness" - ], - "result": "success", - "distinctStates": 46656, - "totalStates": 248832, - "stateDepth": 1 - } - ] - } - ] - }, - { - "path": "specifications/ewd687a", - "title": "EWD687a: Detecting Termination in Distributed Computations", - "description": "Dijkstra's Termination Detection Algorithm", - "sources": [], - "authors": [ - "Leslie Lamport", - "Markus Kuppe", - "Stephan Merz" - ], - "tags": [ - "ewd", - "beginner" - ], - "modules": [ - { - "path": "specifications/ewd687a/EWD687a.tla", - "communityDependencies": [ - "Graphs" - ], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/ewd687a/EWD687aPlusCal.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "pluscal" - ], - "models": [] - }, - { - "path": "specifications/ewd687a/EWD687a_anim.tla", - "communityDependencies": [ - "IOUtils", - "SVG" - ], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/ewd687a/EWD687a_anim.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": { - "simulate": { - "traceCount": 100 - } - }, - "features": [ - "alias", - "ignore deadlock", - "liveness" - ], - "result": "safety failure" - } - ] - }, - { - "path": "specifications/ewd687a/MCEWD687a.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/ewd687a/MCEWD687a.cfg", - "runtime": "00:01:00", - "size": "medium", - "mode": "exhaustive search", - "features": [ - "ignore deadlock", - "liveness", - "state constraint" - ], - "result": "success" - } - ] - } - ] - }, - { - "path": "specifications/ewd840", - "title": "EWD840: Termination Detection in a Ring", - "description": "EWD840: Termination Detection in a Ring", - "sources": [ - "Dijkstra's termination detection algorithm for ring topologies" - ], - "authors": [ - "Stephan Merz" - ], - "tags": [ - "ewd" - ], - "modules": [ - { - "path": "specifications/ewd840/EWD840.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/ewd840/EWD840.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "ignore deadlock", - "liveness" - ], - "result": "success", - "distinctStates": 302, - "totalStates": 2001, - "stateDepth": 10 - } - ] - }, - { - "path": "specifications/ewd840/EWD840_anim.tla", - "communityDependencies": [ - "SVG" - ], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/ewd840/EWD840_anim.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": { - "simulate": { - "traceCount": 100 - } - }, - "features": [ - "alias", - "ignore deadlock" - ], - "result": "safety failure" - } - ] - }, - { - "path": "specifications/ewd840/EWD840_json.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/ewd840/EWD840_json.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "ignore deadlock" - ], - "result": "success", - "distinctStates": 1566, - "totalStates": 15986, - "stateDepth": 12 - } - ] - }, - { - "path": "specifications/ewd840/EWD840_proof.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "proof" - ], - "models": [] - }, - { - "path": "specifications/ewd840/SyncTerminationDetection.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/ewd840/SyncTerminationDetection.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success", - "distinctStates": 129, - "totalStates": 3722, - "stateDepth": 1 - } - ] - }, - { - "path": "specifications/ewd840/SyncTerminationDetection_proof.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": ["proof"], - "models": [] - } - ] - }, - { - "path": "specifications/ewd998", - "title": "EWD998: Termination Detection in a Ring with Asynchronous Message Delivery", - "description": "Variant of EWD 840 given by Shmuel Safra", - "sources": [], - "authors": [ - "Markus Kuppe", - "Stephan Merz" - ], - "tags": [ - "ewd" - ], - "modules": [ - { - "path": "specifications/ewd998/AsyncTerminationDetection.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/ewd998/AsyncTerminationDetection.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness", - "state constraint" - ], - "result": "success", - "distinctStates": 4097, - "totalStates": 53271, - "stateDepth": 14 - } - ] - }, - { - "path": "specifications/ewd998/AsyncTerminationDetection_proof.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "proof" - ], - "models": [] - }, - { - "path": "specifications/ewd998/EWD998.tla", - "communityDependencies": [ - "SequencesExt" - ], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/ewd998/EWD998.cfg", - "runtime": "00:50:00", - "size": "large", - "mode": "exhaustive search", - "features": [ - "ignore deadlock", - "state constraint", - "liveness" - ], - "result": "success" - }, - { - "path": "specifications/ewd998/EWD998Small.cfg", - "runtime": "00:05:00", - "size": "medium", - "mode": "exhaustive search", - "features": [ - "ignore deadlock", - "state constraint" - ], - "result": "success" - } - ] - }, - { - "path": "specifications/ewd998/EWD998Chan.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/ewd998/EWD998Chan.cfg", - "runtime": "00:05:00", - "size": "medium", - "mode": "exhaustive search", - "features": [ - "ignore deadlock", - "liveness", - "state constraint" - ], - "result": "success" - } - ] - }, - { - "path": "specifications/ewd998/EWD998ChanID.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/ewd998/EWD998ChanID.cfg", - "runtime": "00:00:05", - "size": "small", - "mode": "exhaustive search", - "features": [ - "ignore deadlock", - "liveness", - "state constraint", - "view" - ], - "result": "success", - "distinctStates": 14, - "totalStates": 15, - "stateDepth": 14 - } - ] - }, - { - "path": "specifications/ewd998/EWD998ChanID_export.tla", - "communityDependencies": [ - "IOUtils" - ], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/ewd998/EWD998ChanID_export.cfg", - "runtime": "unknown", - "size": "large", - "mode": "exhaustive search", - "features": [ - "ignore deadlock" - ], - "result": "unknown" - } - ] - }, - { - "path": "specifications/ewd998/EWD998ChanID_shiviz.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/ewd998/EWD998ChanID_shiviz.cfg", - "runtime": "unknown", - "size": "large", - "mode": "exhaustive search", - "features": [ - "alias", - "ignore deadlock" - ], - "result": "unknown" - } - ] - }, - { - "path": "specifications/ewd998/EWD998ChanTrace.tla", - "communityDependencies": [ - "IOUtils", - "VectorClocks" - ], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/ewd998/EWD998ChanTrace.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "alias", - "view" - ], - "result": "success" - } - ] - }, - { - "path": "specifications/ewd998/EWD998Chan_opts.tla", - "communityDependencies": [ - "CSV", - "IOUtils" - ], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/ewd998/EWD998PCal.tla", - "communityDependencies": [ - "BagsExt" - ], - "tlaLanguageVersion": 2, - "features": [ - "pluscal" - ], - "models": [ - { - "path": "specifications/ewd998/EWD998PCal.cfg", - "runtime": "00:00:21", - "size": "medium", - "mode": "exhaustive search", - "features": [ - "alias", - "liveness", - "state constraint" - ], - "result": "success" - } - ] - }, - { - "path": "specifications/ewd998/EWD998_anim.tla", - "communityDependencies": [ - "IOUtils", - "SVG" - ], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/ewd998/EWD998_opts.tla", - "communityDependencies": [ - "CSV", - "IOUtils" - ], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/ewd998/EWD998_optsSC.tla", - "communityDependencies": [ - "CSV", - "IOUtils" - ], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/ewd998/EWD998_proof.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "proof" - ], - "models": [] - }, - { - "path": "specifications/ewd998/Functions.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/ewd998/Folds.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/ewd998/SmokeEWD998.tla", - "communityDependencies": [ - "CSV", - "IOUtils" - ], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/ewd998/SmokeEWD998.cfg", - "runtime": "00:00:05", - "size": "small", - "mode": { - "simulate": { - "traceCount": 100 - } - }, - "features": [ - "ignore deadlock", - "liveness", - "state constraint" - ], - "result": "success" - } - ] - }, - { - "path": "specifications/ewd998/SmokeEWD998_SC.tla", - "communityDependencies": [ - "CSV", - "IOUtils" - ], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/ewd998/SmokeEWD998_SC.cfg", - "runtime": "unknown", - "size": "unknown", - "mode": "exhaustive search", - "features": [], - "result": "unknown" - } - ] - }, - { - "path": "specifications/ewd998/Utils.tla", - "communityDependencies": [ - "SequencesExt" - ], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - } - ] - }, - { - "path": "specifications/glowingRaccoon", - "title": "PCR Testing for Snippets of DNA", - "description": "Specification of a PCR test process", - "sources": [], - "authors": [ - "Martin Harrison" - ], - "tags": [], - "modules": [ - { - "path": "specifications/glowingRaccoon/clean.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/glowingRaccoon/clean.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success", - "distinctStates": 63, - "totalStates": 99, - "stateDepth": 10 - } - ] - }, - { - "path": "specifications/glowingRaccoon/product.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/glowingRaccoon/product.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "ignore deadlock", - "liveness" - ], - "result": "success", - "distinctStates": 305, - "totalStates": 376, - "stateDepth": 23 - } - ] - }, - { - "path": "specifications/glowingRaccoon/stages.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/glowingRaccoon/stages.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "ignore deadlock", - "liveness" - ], - "result": "success", - "distinctStates": 83, - "totalStates": 93, - "stateDepth": 23 - } - ] - } - ] - }, - { - "path": "specifications/lamport_mutex", - "title": "Distributed Mutual Exclusion", - "description": "Specification of Lamport's distributed mutual exclusion algorithm", - "sources": [], - "authors": [ - "Stephan Merz" - ], - "tags": [], - "modules": [ - { - "path": "specifications/lamport_mutex/LamportMutex.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/lamport_mutex/LamportMutex_proofs.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "proof" - ], - "models": [] - }, - { - "path": "specifications/lamport_mutex/MCLamportMutex.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/lamport_mutex/MCLamportMutex.cfg", - "runtime": "00:00:10", - "size": "small", - "mode": "exhaustive search", - "features": [ - "state constraint" - ], - "result": "success", - "distinctStates": 724274, - "totalStates": 2729079, - "stateDepth": 61 - } - ] - } - ] - }, - { - "path": "specifications/nbacc_ray97", - "title": "Asynchronous Non-Blocking Atomic Commit", - "description": "Algorithm from paper *A case study of agreement problems in distributed systems: non-blocking atomic commitment* (1997)", - "sources": [], - "authors": [ - "Igor Konnov", - "Josef Widder", - "Thanh Hai Tran" - ], - "tags": [], - "modules": [ - { - "path": "specifications/nbacc_ray97/nbacc_ray97.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/nbacc_ray97/nbacc_ray97.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [], - "result": "success", - "distinctStates": 3016, - "totalStates": 49592, - "stateDepth": 7 - } - ] - } - ] - }, - { - "path": "specifications/nbacg_guer01", - "title": "Asynchronous Non-Blocking Atomic Commitment with Failure Detectors", - "description": "Algorithm from paper *On the hardness of failure-sensitive agreement problems* (2001)", - "sources": [], - "authors": [ - "Igor Konnov", - "Josef Widder", - "Thanh Hai Tran" - ], - "tags": [], - "modules": [ - { - "path": "specifications/nbacg_guer01/nbacg_guer01.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/nbacg_guer01/nbacg_guer01.cfg", - "runtime": "00:00:05", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness" - ], - "result": "success", - "distinctStates": 24922, - "totalStates": 159538, - "stateDepth": 16 - } - ] - } - ] - }, - { - "path": "specifications/spanning", - "title": "Spanning Tree Broadcast Algorithm", - "description": "A spanning tree broadcast algorithm", - "sources": [], - "authors": [ - "Igor Konnov", - "Josef Widder", - "Thanh Hai Tran" - ], - "tags": [], - "modules": [ - { - "path": "specifications/spanning/MC_spanning.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/spanning/MC_spanning.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [], - "result": "safety failure" - } - ] - }, - { - "path": "specifications/spanning/spanning.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - } - ] - }, - { - "path": "specifications/sums_even", - "title": "Proof x+x is Even", - "description": "Two proofs that x+x is even for every natural number x", - "sources": [], - "authors": [ - "Martin Riener" - ], - "tags": [ - "beginner" - ], - "modules": [ - { - "path": "specifications/sums_even/MC_sums_even.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/sums_even/MC_sums_even.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [], - "result": "success", - "distinctStates": 0, - "totalStates": 0, - "stateDepth": 0 - } - ] - }, - { - "path": "specifications/sums_even/sums_even.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "proof" - ], - "models": [] - } - ] - }, - { - "path": "specifications/tcp", - "title": "TCP as defined in RFC 9293", - "description": "Transmission Control Protocol (TCP)", - "sources": [ - "https://datatracker.ietf.org/doc/html/rfc9293" - ], - "authors": [ - "Markus Kuppe" - ], - "tags": [], - "modules": [ - { - "path": "specifications/tcp/MCtcp.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/tcp/MCtcp.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "liveness", - "state constraint" - ], - "result": "success", - "distinctStates": 1182, - "totalStates": 6322, - "stateDepth": 14 - } - ] - }, - { - "path": "specifications/tcp/tcp.tla", - "communityDependencies": [ - "SequencesExt" - ], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - } - ] - }, - { - "path": "specifications/tower_of_hanoi", - "title": "The Tower of Hanoi Puzzle", - "description": "Famous puzzle involving stacking disks on towers", - "sources": [], - "authors": [ - "Alexander Niederbühl", - "Markus Kuppe" - ], - "tags": [ - "beginner" - ], - "modules": [ - { - "path": "specifications/tower_of_hanoi/Bits.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/tower_of_hanoi/Hanoi.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/tower_of_hanoi/Hanoi.toolbox/Model_1/Bits.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/tower_of_hanoi/Hanoi.toolbox/Model_1/Hanoi.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - }, - { - "path": "specifications/tower_of_hanoi/Hanoi.toolbox/Model_1/MC.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/tower_of_hanoi/Hanoi.toolbox/Model_1/MC.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [], - "result": "safety failure" - } - ] - }, - { - "path": "specifications/tower_of_hanoi/HanoiSeq.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [] - } - ] - }, - { - "path": "specifications/transaction_commit", - "title": "Transaction Commit Models", - "description": "Ordinary transaction commit, two-phase commit, and Paxos commit", - "sources": [ - "http://research.microsoft.com/en-us/um/people/lamport/pubs/pubs.html#paxos-commit", - "https://www.microsoft.com/en-us/research/uploads/prod/2004/01/consensus-on-transaction-commit.pdf", - "https://github.com/muratdem/PlusCal-examples/tree/master/2PCTM" - ], - "authors": [ - "Jim Gray", - "Leslie Lamport", - "Murat Demirbas" - ], - "tags": [], - "modules": [ - { - "path": "specifications/transaction_commit/2PCwithBTM.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [ - "pluscal" - ], - "models": [ - { - "path": "specifications/transaction_commit/2PCwithBTM.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [], - "result": "success", - "distinctStates": 1245, - "totalStates": 5841, - "stateDepth": 15 - } - ] - }, - { - "path": "specifications/transaction_commit/PaxosCommit.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/transaction_commit/PaxosCommit.cfg", - "runtime": "00:00:30", - "size": "medium", - "mode": "exhaustive search", - "features": [], - "result": "success" - } - ] - }, - { - "path": "specifications/transaction_commit/TCommit.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/transaction_commit/TCommit.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [ - "ignore deadlock" - ], - "result": "success", - "distinctStates": 34, - "totalStates": 94, - "stateDepth": 7 - } - ] - }, - { - "path": "specifications/transaction_commit/TwoPhase.tla", - "communityDependencies": [], - "tlaLanguageVersion": 2, - "features": [], - "models": [ - { - "path": "specifications/transaction_commit/TwoPhase.cfg", - "runtime": "00:00:01", - "size": "small", - "mode": "exhaustive search", - "features": [], - "result": "success", - "distinctStates": 288, - "totalStates": 1146, - "stateDepth": 11 - } - ] - } - ] - } - ] -} From c0f1a20a30585dab0a1e6c2b053418819b3dd67c Mon Sep 17 00:00:00 2001 From: Andrew Helwer Date: Thu, 31 Jul 2025 13:59:50 -0500 Subject: [PATCH 4/6] Changed all scripts and CI to use split manifest Signed-off-by: Andrew Helwer --- .github/scripts/check_manifest_features.py | 10 ++++------ .github/scripts/check_manifest_files.py | 10 ++++------ .github/scripts/check_markdown_table.py | 7 +++---- .github/scripts/check_proofs.py | 9 ++++----- .github/scripts/check_small_models.py | 9 ++++----- .github/scripts/parse_modules.py | 9 ++++----- .github/scripts/smoke_test_large_models.py | 9 ++++----- .github/scripts/translate_pluscal.py | 9 ++++----- .github/scripts/unicode_conversion.py | 9 ++++----- .github/scripts/unicode_number_set_shim.py | 9 ++++----- .github/workflows/CI.yml | 23 ++++++++++------------ 11 files changed, 49 insertions(+), 64 deletions(-) diff --git a/.github/scripts/check_manifest_features.py b/.github/scripts/check_manifest_features.py index ce57630b..2ba837b6 100644 --- a/.github/scripts/check_manifest_features.py +++ b/.github/scripts/check_manifest_features.py @@ -183,7 +183,7 @@ def check_features(parser, queries, manifest, examples_root): Validates every field of the manifest that can be validated. """ success = True - for spec in manifest['specifications']: + for spec in manifest: if spec['title'] == '': success = False logging.error(f'Spec {spec["path"]} does not have a title') @@ -235,18 +235,16 @@ def check_features(parser, queries, manifest, examples_root): if __name__ == '__main__': parser = ArgumentParser(description='Checks metadata in tlaplus/examples manifest.json against module and model files in repository.') - parser.add_argument('--manifest_path', help='Path to the tlaplus/examples manifest.json file', required=True) + parser.add_argument('--examples_root', help='Root directory of the tlaplus/examples repository', required=True) args = parser.parse_args() - manifest_path = normpath(args.manifest_path) - manifest = tla_utils.load_json(manifest_path) - examples_root = dirname(manifest_path) + manifest = tla_utils.load_all_manifests(args.examples_root) TLAPLUS_LANGUAGE = Language(tree_sitter_tlaplus.language()) parser = Parser(TLAPLUS_LANGUAGE) queries = build_queries(TLAPLUS_LANGUAGE) - if check_features(parser, queries, manifest, examples_root): + if check_features(parser, queries, manifest, args.examples_root): logging.info('SUCCESS: metadata in manifest is correct') exit(0) else: diff --git a/.github/scripts/check_manifest_files.py b/.github/scripts/check_manifest_files.py index ca40383a..1daed03d 100644 --- a/.github/scripts/check_manifest_files.py +++ b/.github/scripts/check_manifest_files.py @@ -11,17 +11,15 @@ import glob import tla_utils -parser = ArgumentParser(description='Checks tlaplus/examples manifest.json against module and model files in repository.') -parser.add_argument('--manifest_path', help='Path to the tlaplus/examples manifest.json file', required=True) +parser = ArgumentParser(description='Checks manifests against module and model files in repository.') parser.add_argument('--ci_ignore_path', help='Path to the .ciignore file', required=True) args = parser.parse_args() -manifest_path = normpath(args.manifest_path) ci_ignore_path = normpath(args.ci_ignore_path) -examples_root = dirname(manifest_path) -manifest = tla_utils.load_json(manifest_path) +examples_root = dirname(ci_ignore_path) +manifest = tla_utils.load_all_manifests(examples_root) -module_lists = [spec["modules"] for spec in manifest["specifications"]] +module_lists = [spec["modules"] for spec in manifest] modules = [module for module_list in module_lists for module in module_list] model_lists = [module["models"] for module in modules] diff --git a/.github/scripts/check_markdown_table.py b/.github/scripts/check_markdown_table.py index 0b6bfd37..42c4e451 100644 --- a/.github/scripts/check_markdown_table.py +++ b/.github/scripts/check_markdown_table.py @@ -4,7 +4,7 @@ from argparse import ArgumentParser from dataclasses import dataclass -from os.path import normpath +from os.path import normpath, dirname from typing import Any, Set import tla_utils import mistletoe @@ -75,11 +75,10 @@ def from_json(spec): ) parser = ArgumentParser(description='Validates the spec table in README.md against the manifest.json.') -parser.add_argument('--manifest_path', help='Path to the tlaplus/examples manifest.json file', required=True) parser.add_argument('--readme_path', help='Path to the tlaplus/examples README.md file', required=True) args = parser.parse_args() -manifest = tla_utils.load_json(normpath(args.manifest_path)) +manifest = tla_utils.load_all_manifests(dirname(args.readme_path)) readme = None with open(normpath(args.readme_path), 'r', encoding='utf-8') as readme_file: @@ -88,7 +87,7 @@ def from_json(spec): spec_table = next((child for child in readme.children if isinstance(child, Table))) table_specs = dict([(record.path, record) for record in [from_markdown(node) for node in spec_table.children]]) -manifest_specs = dict([(record.path, record) for record in [from_json(spec) for spec in manifest['specifications']]]) +manifest_specs = dict([(record.path, record) for record in [from_json(spec) for spec in manifest]]) # Checks that set of specs in manifest and table are equivalent success = True diff --git a/.github/scripts/check_proofs.py b/.github/scripts/check_proofs.py index f06309d9..14a43629 100644 --- a/.github/scripts/check_proofs.py +++ b/.github/scripts/check_proofs.py @@ -11,16 +11,15 @@ parser = ArgumentParser(description='Validate all proofs in all modules with TLAPM.') parser.add_argument('--tlapm_path', help='Path to TLAPM install dir; should have bin and lib subdirs', required=True) -parser.add_argument('--manifest_path', help='Path to the tlaplus/examples manifest.json file', required=True) +parser.add_argument('--examples_root', help='Root directory of the tlaplus/examples repository', required=True) parser.add_argument('--skip', nargs='+', help='Space-separated list of .tla modules to skip checking', required=False, default=[]) parser.add_argument('--only', nargs='+', help='If provided, only check proofs in this space-separated list', required=False, default=[]) parser.add_argument('--verbose', help='Set logging output level to debug', action='store_true') args = parser.parse_args() tlapm_path = normpath(args.tlapm_path) -manifest_path = normpath(args.manifest_path) -manifest = tla_utils.load_json(manifest_path) -examples_root = dirname(manifest_path) +examples_root = args.examples_root +manifest = tla_utils.load_all_manifests(examples_root) skip_modules = args.skip only_modules = args.only @@ -28,7 +27,7 @@ proof_module_paths = [ module['path'] - for spec in manifest['specifications'] + for spec in manifest for module in spec['modules'] if 'proof' in module['features'] and module['path'] not in skip_modules diff --git a/.github/scripts/check_small_models.py b/.github/scripts/check_small_models.py index c52344d1..b4d92ac1 100644 --- a/.github/scripts/check_small_models.py +++ b/.github/scripts/check_small_models.py @@ -16,7 +16,7 @@ parser.add_argument('--apalache_path', help='Path to the Apalache directory', required=True) parser.add_argument('--tlapm_lib_path', help='Path to the TLA+ proof manager module directory; .tla files should be in this directory', required=True) parser.add_argument('--community_modules_jar_path', help='Path to the CommunityModules-deps.jar file', required=True) -parser.add_argument('--manifest_path', help='Path to the tlaplus/examples manifest.json file', required=True) +parser.add_argument('--examples_root', help='Root directory of the tlaplus/examples repository', required=True) parser.add_argument('--skip', nargs='+', help='Space-separated list of models to skip checking', required=False, default=[]) parser.add_argument('--only', nargs='+', help='If provided, only check models in this space-separated list', required=False, default=[]) parser.add_argument('--verbose', help='Set logging output level to debug', action='store_true') @@ -29,8 +29,7 @@ apalache_path = normpath(args.apalache_path) tlapm_lib_path = normpath(args.tlapm_lib_path) community_jar_path = normpath(args.community_modules_jar_path) -manifest_path = normpath(args.manifest_path) -examples_root = dirname(manifest_path) +examples_root = args.examples_root skip_models = args.skip only_models = args.only enable_assertions = args.enable_assertions @@ -87,11 +86,11 @@ def check_model(module, model, expected_runtime): return False # Ensure longest-running modules go first -manifest = tla_utils.load_json(manifest_path) +manifest = tla_utils.load_all_manifests(examples_root) small_models = sorted( [ (module, model, tla_utils.parse_timespan(model['runtime'])) - for spec in manifest['specifications'] + for spec in manifest for module in spec['modules'] for model in module['models'] if model['size'] == 'small' diff --git a/.github/scripts/parse_modules.py b/.github/scripts/parse_modules.py index a666909f..5c6f6f1a 100644 --- a/.github/scripts/parse_modules.py +++ b/.github/scripts/parse_modules.py @@ -15,7 +15,7 @@ parser.add_argument('--apalache_path', help='Path to the Apalache directory', required=True) parser.add_argument('--tlapm_lib_path', help='Path to the TLA+ proof manager module directory; .tla files should be in this directory', required=True) parser.add_argument('--community_modules_jar_path', help='Path to the CommunityModules-deps.jar file', required=True) -parser.add_argument('--manifest_path', help='Path to the tlaplus/examples manifest.json file', required=True) +parser.add_argument('--examples_root', help='Root directory of the tlaplus/examples repository', required=True) parser.add_argument('--skip', nargs='+', help='Space-separated list of .tla modules to skip parsing', required=False, default=[]) parser.add_argument('--only', nargs='+', help='If provided, only parse models in this space-separated list', required=False, default=[]) parser.add_argument('--verbose', help='Set logging output level to debug', action='store_true') @@ -28,8 +28,7 @@ apalache_jar_path = normpath(join(args.apalache_path, 'lib', 'apalache.jar')) tlaps_modules = normpath(args.tlapm_lib_path) community_modules = normpath(args.community_modules_jar_path) -manifest_path = normpath(args.manifest_path) -examples_root = dirname(manifest_path) +examples_root = args.examples_root skip_modules = args.skip only_modules = args.only enable_assertions = args.enable_assertions @@ -64,12 +63,12 @@ def parse_module(path): logging.error(output) return False -manifest = tla_utils.load_json(manifest_path) +manifest = tla_utils.load_all_manifests(examples_root) # List of all modules to parse and whether they should use TLAPS imports modules = [ tla_utils.from_cwd(examples_root, module['path']) - for spec in manifest['specifications'] + for spec in manifest for module in spec['modules'] if module['path'] not in skip_modules and (only_modules == [] or module['path'] in only_modules) diff --git a/.github/scripts/smoke_test_large_models.py b/.github/scripts/smoke_test_large_models.py index e818ec74..8e502aac 100644 --- a/.github/scripts/smoke_test_large_models.py +++ b/.github/scripts/smoke_test_large_models.py @@ -16,7 +16,7 @@ parser.add_argument('--apalache_path', help='Path to the Apalache directory', required=True) parser.add_argument('--tlapm_lib_path', help='Path to the TLA+ proof manager module directory; .tla files should be in this directory', required=True) parser.add_argument('--community_modules_jar_path', help='Path to the CommunityModules-deps.jar file', required=True) -parser.add_argument('--manifest_path', help='Path to the tlaplus/examples manifest.json file', required=True) +parser.add_argument('--examples_root', help='Root directory of the tlaplus/examples repository', required=True) parser.add_argument('--skip', nargs='+', help='Space-separated list of models to skip checking', required=False, default=[]) parser.add_argument('--only', nargs='+', help='If provided, only check models in this space-separated list', required=False, default=[]) parser.add_argument('--verbose', help='Set logging output level to debug', action='store_true') @@ -27,8 +27,7 @@ apalache_path = normpath(args.apalache_path) tlapm_lib_path = normpath(args.tlapm_lib_path) community_jar_path = normpath(args.community_modules_jar_path) -manifest_path = normpath(args.manifest_path) -examples_root = dirname(manifest_path) +examples_root = args.examples_root skip_models = args.skip only_models = args.only enable_assertions = args.enable_assertions @@ -80,11 +79,11 @@ def check_model(module, model): logging.basicConfig(level = logging.DEBUG if args.verbose else logging.INFO) -manifest = tla_utils.load_json(manifest_path) +manifest = tla_utils.load_all_manifests(examples_root) large_models = [ (module, model) - for spec in manifest['specifications'] + for spec in manifest for module in spec['modules'] for model in module['models'] if model['size'] != 'small' diff --git a/.github/scripts/translate_pluscal.py b/.github/scripts/translate_pluscal.py index dbbc2931..6f38eb94 100644 --- a/.github/scripts/translate_pluscal.py +++ b/.github/scripts/translate_pluscal.py @@ -13,7 +13,7 @@ parser = ArgumentParser(description='Run PlusCal translation on all modules.') parser.add_argument('--tools_jar_path', help='Path to the tla2tools.jar file', required=True) -parser.add_argument('--manifest_path', help='Path to the tlaplus/examples manifest.json file', required=True) +parser.add_argument('--examples_root', help='Root directory of the tlaplus/examples repository', required=True) parser.add_argument('--skip', nargs='+', help='Space-separated list of .tla modules to skip converting', required=False, default=[]) parser.add_argument('--only', nargs='+', help='If provided, only convert models in this space-separated list', required=False, default=[]) parser.add_argument('--verbose', help='Set logging output level to debug', action='store_true') @@ -23,18 +23,17 @@ logging.basicConfig(level = logging.DEBUG if args.verbose else logging.INFO) tools_path = normpath(args.tools_jar_path) -manifest_path = normpath(args.manifest_path) -examples_root = dirname(manifest_path) +examples_root = args.examples_root skip_modules = args.skip only_modules = args.only enable_assertions = args.enable_assertions -manifest = tla_utils.load_json(manifest_path) +manifest = tla_utils.load_all_manifests(examples_root) # List of all modules to translate modules = [ tla_utils.from_cwd(examples_root, module['path']) - for spec in manifest['specifications'] + for spec in manifest for module in spec['modules'] if 'pluscal' in module['features'] and module['path'] not in skip_modules diff --git a/.github/scripts/unicode_conversion.py b/.github/scripts/unicode_conversion.py index 0fddbff4..1a37e27b 100644 --- a/.github/scripts/unicode_conversion.py +++ b/.github/scripts/unicode_conversion.py @@ -13,7 +13,7 @@ parser = ArgumentParser(description='Converts all TLA+ modules from ASCII to Unicode or vice-versa.') parser.add_argument('--tlauc_path', help='Path to the TLAUC executable', required=True) -parser.add_argument('--manifest_path', help='Path to the tlaplus/examples manifest.json file', required=True) +parser.add_argument('--examples_root', help='Root directory of the tlaplus/examples repository', required=True) parser.add_argument('--to_ascii', help='Convert to ASCII instead of Unicode', action='store_true') parser.add_argument('--skip', nargs='+', help='Space-separated list of .tla modules to skip converting', required=False, default=[]) parser.add_argument('--only', nargs='+', help='If provided, only convert models in this space-separated list', required=False, default=[]) @@ -24,17 +24,16 @@ tlauc_path = normpath(args.tlauc_path) to_ascii = args.to_ascii -manifest_path = normpath(args.manifest_path) -examples_root = dirname(manifest_path) +examples_root = args.examples_root skip_modules = args.skip only_modules = args.only -manifest = tla_utils.load_json(manifest_path) +manifest = tla_utils.load_all_manifests(examples_root) # List of all modules to convert modules = [ tla_utils.from_cwd(examples_root, module['path']) - for spec in manifest['specifications'] + for spec in manifest for module in spec['modules'] if module['path'] not in skip_modules and (only_modules == [] or module['path'] in only_modules) diff --git a/.github/scripts/unicode_number_set_shim.py b/.github/scripts/unicode_number_set_shim.py index 0b649407..c84f2fdd 100644 --- a/.github/scripts/unicode_number_set_shim.py +++ b/.github/scripts/unicode_number_set_shim.py @@ -110,14 +110,13 @@ def write_module(examples_root, module_path, module_bytes): if __name__ == '__main__': parser = ArgumentParser(description='Adds ℕ/ℤ/ℝ Unicode number set shim definitions to modules as needed.') - parser.add_argument('--manifest_path', help='Path to the tlaplus/examples manifest.json file', required=True) + parser.add_argument('--examples_root', help='Root directory of the tlaplus/examples repository', required=True) parser.add_argument('--skip', nargs='+', help='Space-separated list of .tla modules to skip', required=False, default=[]) parser.add_argument('--only', nargs='+', help='If provided, only modify models in this space-separated list', required=False, default=[]) args = parser.parse_args() - manifest_path = normpath(args.manifest_path) - manifest = tla_utils.load_json(manifest_path) - examples_root = dirname(manifest_path) + examples_root = args.examples_root + manifest = tla_utils.load_all_manifests(examples_root) skip_modules = args.skip only_modules = args.only @@ -127,7 +126,7 @@ def write_module(examples_root, module_path, module_bytes): modules = [ module['path'] - for spec in manifest['specifications'] + for spec in manifest for module in spec['modules'] if module['path'] not in skip_modules and (only_modules == [] or module['path'] in only_modules) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 1aec20d7..97b8549c 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -48,33 +48,30 @@ jobs: - name: Check manifest.json format run: | python "$SCRIPT_DIR/check_manifest_schema.py" \ - --manifest_path manifest.json \ --schema_path manifest-schema.json - name: Check manifest files run: | python "$SCRIPT_DIR/check_manifest_files.py" \ - --manifest_path manifest.json \ --ci_ignore_path .ciignore - name: Check manifest feature flags run: | python "$SCRIPT_DIR/check_manifest_features.py" \ - --manifest_path manifest.json + --examples_root . - name: Check README spec table run: | python "$SCRIPT_DIR/check_markdown_table.py" \ - --manifest_path manifest.json \ --readme_path README.md - name: Convert specs to unicode if: matrix.unicode run: | python "$SCRIPT_DIR/unicode_conversion.py" \ --tlauc_path "$DEPS_DIR/tlauc/tlauc" \ - --manifest_path manifest.json + --examples_root . - name: Add unicode shims if: matrix.unicode run: | python "$SCRIPT_DIR/unicode_number_set_shim.py" \ - --manifest_path manifest.json + --examples_root . - name: Translate PlusCal # PlusCal translations will be reverted at the end of this step, # since we want to support people manually editing the generated TLA+ @@ -94,7 +91,7 @@ jobs: ) python $SCRIPT_DIR/translate_pluscal.py \ --tools_jar_path $DEPS_DIR/tools/tla2tools.jar \ - --manifest_path manifest.json \ + --examples_root . \ --skip "${SKIP[@]}" git reset --hard HEAD # Restore specs to their original state - name: Parse all modules @@ -104,7 +101,7 @@ jobs: --apalache_path $DEPS_DIR/apalache \ --tlapm_lib_path $DEPS_DIR/tlapm/library \ --community_modules_jar_path $DEPS_DIR/community/modules.jar \ - --manifest_path manifest.json + --examples_root . - name: Check small models run: | # Need to have a nonempty list to pass as a skip parameter @@ -121,7 +118,7 @@ jobs: --apalache_path $DEPS_DIR/apalache \ --tlapm_lib_path $DEPS_DIR/tlapm/library \ --community_modules_jar_path $DEPS_DIR/community/modules.jar \ - --manifest_path manifest.json \ + --examples_root . \ --skip "${SKIP[@]}" - name: Smoke-test large models run: | @@ -139,7 +136,7 @@ jobs: --apalache_path $DEPS_DIR/apalache \ --tlapm_lib_path $DEPS_DIR/tlapm/library \ --community_modules_jar_path $DEPS_DIR/community/modules.jar \ - --manifest_path manifest.json \ + --examples_root . \ --skip "${SKIP[@]}" - name: Check proofs if: matrix.os != 'windows-latest' && !matrix.unicode @@ -159,12 +156,12 @@ jobs: ) python $SCRIPT_DIR/check_proofs.py \ --tlapm_path $DEPS_DIR/tlapm \ - --manifest_path manifest.json \ + --examples_root . \ --skip "${SKIP[@]}" - name: Smoke-test manifest generation script run: | python $SCRIPT_DIR/generate_manifest.py \ - --manifest_path manifest.json \ + --examples_root . \ --ci_ignore_path .ciignore git diff -a - name: Smoke-test state space script @@ -174,6 +171,6 @@ jobs: --tools_jar_path $DEPS_DIR/tools/tla2tools.jar \ --tlapm_lib_path $DEPS_DIR/tlapm/library \ --community_modules_jar_path $DEPS_DIR/community/modules.jar \ - --manifest_path manifest.json + --examples_root . git diff -a From 0e903de27674628b9f017fef201dcf239cb4e531 Mon Sep 17 00:00:00 2001 From: Andrew Helwer Date: Thu, 31 Jul 2025 15:17:55 -0500 Subject: [PATCH 5/6] Manifest generation and state space recording scripts now use split manifests Signed-off-by: Andrew Helwer --- .github/scripts/generate_manifest.py | 30 +++++++++------------ .github/scripts/record_model_state_space.py | 14 +++++----- .github/workflows/CI.yml | 1 - 3 files changed, 20 insertions(+), 25 deletions(-) diff --git a/.github/scripts/generate_manifest.py b/.github/scripts/generate_manifest.py index 64bc24b5..3cf1573b 100644 --- a/.github/scripts/generate_manifest.py +++ b/.github/scripts/generate_manifest.py @@ -9,7 +9,7 @@ from check_manifest_features import * import os -from os.path import basename, dirname, join, normpath, relpath, splitext +from os.path import basename, dirname, join, normpath, relpath, splitext, isfile from pathlib import PureWindowsPath import glob import tla_utils @@ -104,17 +104,14 @@ def generate_new_manifest(examples_root, spec_path, spec_name, parser, queries): # Integrate human-written info from existing manifest.json -def find_corresponding_spec(old_manifest, new_spec): - specs = [ - spec for spec in old_manifest['specifications'] - if spec['path'] == new_spec['path'] - ] - return specs[0] if any(specs) else None +def get_old_manifest(spec_path): + old_manifest_path = join(spec_path, 'manifest.json') + return tla_utils.load_json(old_manifest_path) if isfile(old_manifest_path) else None -def integrate_spec_info(old_spec, new_spec): +def integrate_spec_info(old_manifest, new_spec): fields = ['title', 'description', 'authors', 'sources', 'tags'] for field in fields: - new_spec[field] = old_spec[field] + new_spec[field] = old_manifest[field] def find_corresponding_module(old_module, new_spec): modules = [ @@ -142,9 +139,10 @@ def integrate_model_info(old_model, new_model): new_model[field] = old_model[field] def integrate_old_manifest_into_new(old_manifest, new_spec): - old_spec = find_corresponding_spec(old_manifest, new_spec) - integrate_spec_info(old_spec, new_spec) - for old_module in old_spec['modules']: + if old_manifest is None: + return + integrate_spec_info(old_manifest, new_spec) + for old_module in old_manifest['modules']: new_module = find_corresponding_module(old_module, new_spec) if new_module is None: continue @@ -156,22 +154,20 @@ def integrate_old_manifest_into_new(old_manifest, new_spec): integrate_model_info(old_model, new_model) if __name__ == '__main__': - parser = ArgumentParser(description='Generates a new manifest.json derived from files in the repo.') - parser.add_argument('--manifest_path', help='Path to the current tlaplus/examples manifest.json file', default='manifest.json') + parser = ArgumentParser(description='Generates new manifest.json files derived from files in the repo.') parser.add_argument('--ci_ignore_path', help='Path to the CI ignore file', default='.ciignore') args = parser.parse_args() - manifest_path = normpath(args.manifest_path) - examples_root = dirname(manifest_path) ci_ignore_path = normpath(args.ci_ignore_path) + examples_root = dirname(ci_ignore_path) ignored_dirs = tla_utils.get_ignored_dirs(ci_ignore_path) TLAPLUS_LANGUAGE = Language(tree_sitter_tlaplus.language()) parser = Parser(TLAPLUS_LANGUAGE) queries = build_queries(TLAPLUS_LANGUAGE) - old_manifest = tla_utils.load_json(manifest_path) for (spec_path, spec_name) in get_spec_dirs(examples_root, ignored_dirs): + old_manifest = get_old_manifest(spec_path) new_manifest = generate_new_manifest(examples_root, spec_path, spec_name, parser, queries) integrate_old_manifest_into_new(old_manifest, new_manifest) tla_utils.write_json(new_manifest, join(spec_path, 'manifest.json')) diff --git a/.github/scripts/record_model_state_space.py b/.github/scripts/record_model_state_space.py index 1da8e763..dd94b3a2 100644 --- a/.github/scripts/record_model_state_space.py +++ b/.github/scripts/record_model_state_space.py @@ -13,7 +13,7 @@ parser.add_argument('--tools_jar_path', help='Path to the tla2tools.jar file', required=True) parser.add_argument('--tlapm_lib_path', help='Path to the TLA+ proof manager module directory; .tla files should be in this directory', required=True) parser.add_argument('--community_modules_jar_path', help='Path to the CommunityModules-deps.jar file', required=True) -parser.add_argument('--manifest_path', help='Path to the tlaplus/examples manifest.json file', required=True) +parser.add_argument('--examples_root', help='Root directory of the tlaplus/examples repository', required=True) parser.add_argument('--skip', nargs='+', help='Space-separated list of models to skip checking', required=False, default=[]) parser.add_argument('--only', nargs='+', help='If provided, only check models in this space-separated list', required=False, default=[]) parser.add_argument('--enable_assertions', help='Enable Java assertions (pass -enableassertions to JVM)', action='store_true') @@ -25,8 +25,7 @@ tools_jar_path = normpath(args.tools_jar_path) tlapm_lib_path = normpath(args.tlapm_lib_path) community_jar_path = normpath(args.community_modules_jar_path) -manifest_path = normpath(args.manifest_path) -examples_root = dirname(manifest_path) +examples_root = args.examples_root skip_models = args.skip only_models = args.only run_all = args.all @@ -77,11 +76,11 @@ def check_model(module, model): return False # Ensure longest-running modules go first -manifest = tla_utils.load_json(manifest_path) +manifest = tla_utils.load_all_manifests(examples_root) small_models = sorted( [ - (module, model, tla_utils.parse_timespan(model['runtime'])) - for spec in manifest['specifications'] + (spec, module, model, tla_utils.parse_timespan(model['runtime'])) + for spec in manifest for module in spec['modules'] for model in module['models'] if model['size'] == 'small' @@ -105,7 +104,8 @@ def check_model(module, model): for path in skip_models: logging.info(f'Skipping {path}') -for module, model, _ in small_models: +for spec, module, model, _ in small_models: + manifest_path = join(spec['path'], 'manifest.json') success = check_model(module, model) if not success: exit(1) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 97b8549c..de05abf0 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -161,7 +161,6 @@ jobs: - name: Smoke-test manifest generation script run: | python $SCRIPT_DIR/generate_manifest.py \ - --examples_root . \ --ci_ignore_path .ciignore git diff -a - name: Smoke-test state space script From 1916fb5946e72aad845f3353f2712ee3f649c616 Mon Sep 17 00:00:00 2001 From: Andrew Helwer Date: Fri, 1 Aug 2025 11:08:08 -0500 Subject: [PATCH 6/6] Documentation now reflects split manifest.json Signed-off-by: Andrew Helwer --- .github/scripts/check_manifest_features.py | 4 +- .github/scripts/check_manifest_files.py | 4 +- .github/scripts/check_markdown_table.py | 2 +- .github/scripts/check_small_models.py | 2 +- .github/scripts/generate_manifest.py | 2 +- .github/scripts/parse_modules.py | 2 +- .github/scripts/record_model_state_space.py | 2 +- .github/scripts/smoke_test_large_models.py | 2 +- .github/scripts/unicode_number_set_shim.py | 2 +- CONTRIBUTING.md | 27 +++++++------ DEVELOPING.md | 42 ++++++++++----------- README.md | 16 ++++---- 12 files changed, 53 insertions(+), 54 deletions(-) diff --git a/.github/scripts/check_manifest_features.py b/.github/scripts/check_manifest_features.py index 2ba837b6..f7605a82 100644 --- a/.github/scripts/check_manifest_features.py +++ b/.github/scripts/check_manifest_features.py @@ -1,6 +1,6 @@ """ This script performs whatever validations are possible on the metadata in -the manifest.json file. Prominent checks include: +the manifest.json files. Prominent checks include: * .tla files containing pluscal or proofs are marked as such * .tla files importing community modules have those modules listed * .cfg files with certain features are marked as such @@ -234,7 +234,7 @@ def check_features(parser, queries, manifest, examples_root): return success if __name__ == '__main__': - parser = ArgumentParser(description='Checks metadata in tlaplus/examples manifest.json against module and model files in repository.') + parser = ArgumentParser(description='Checks metadata in manifest.json files against module and model files in repository.') parser.add_argument('--examples_root', help='Root directory of the tlaplus/examples repository', required=True) args = parser.parse_args() diff --git a/.github/scripts/check_manifest_files.py b/.github/scripts/check_manifest_files.py index 1daed03d..35b4e4d5 100644 --- a/.github/scripts/check_manifest_files.py +++ b/.github/scripts/check_manifest_files.py @@ -1,8 +1,8 @@ """ Checks to ensure all files in manifest.json exist, that all .tla and .cfg files in repo are recorded in manifest.json (except for those in .ciignore), -and that no files are present twice in the manifest. Also checks to ensure -no files in .ciignore are in the manifest.json. +and that no files are present twice in the manifests. Also checks to ensure +no files in .ciignore are in the manifest.json files. """ from argparse import ArgumentParser diff --git a/.github/scripts/check_markdown_table.py b/.github/scripts/check_markdown_table.py index 42c4e451..56035e1b 100644 --- a/.github/scripts/check_markdown_table.py +++ b/.github/scripts/check_markdown_table.py @@ -1,5 +1,5 @@ """ -Validates the spec table in README.md, ensuring it matches manifest.json. +Validates the spec table in README.md, ensuring it matches manifest.json files. """ from argparse import ArgumentParser diff --git a/.github/scripts/check_small_models.py b/.github/scripts/check_small_models.py index b4d92ac1..633a1ced 100644 --- a/.github/scripts/check_small_models.py +++ b/.github/scripts/check_small_models.py @@ -1,5 +1,5 @@ """ -Check all models marked as size "small" in the manifest with TLC. Small +Check all models marked as size "small" in each manifest with TLC. Small models should finish executing in less than ten seconds on the GitHub CI machines. """ diff --git a/.github/scripts/generate_manifest.py b/.github/scripts/generate_manifest.py index 3cf1573b..a44a1dd8 100644 --- a/.github/scripts/generate_manifest.py +++ b/.github/scripts/generate_manifest.py @@ -1,5 +1,5 @@ """ -Generates a best-effort manifest.json file. This is done by scanning all +Generates best-effort manifest.json files. This is done by scanning all .tla and .cfg files in the specifications dir then attempting to sort them into a spec/module/model hierarchy. Files are parsed to check for features and imports. Human-written fields (title/description/source/authors for diff --git a/.github/scripts/parse_modules.py b/.github/scripts/parse_modules.py index 5c6f6f1a..92c1982e 100644 --- a/.github/scripts/parse_modules.py +++ b/.github/scripts/parse_modules.py @@ -1,5 +1,5 @@ """ -Parse all modules in the manifest with SANY. +Parse all modules in the manifests with SANY. """ from argparse import ArgumentParser diff --git a/.github/scripts/record_model_state_space.py b/.github/scripts/record_model_state_space.py index dd94b3a2..377a2322 100644 --- a/.github/scripts/record_model_state_space.py +++ b/.github/scripts/record_model_state_space.py @@ -1,6 +1,6 @@ """ Records the number of unique & total states encountered by TLC for each small -model where that info is not present, then writes it to the manifest.json. +model where that info is not present, then writes it to a manifest.json file. """ from argparse import ArgumentParser diff --git a/.github/scripts/smoke_test_large_models.py b/.github/scripts/smoke_test_large_models.py index 8e502aac..7a27e8ea 100644 --- a/.github/scripts/smoke_test_large_models.py +++ b/.github/scripts/smoke_test_large_models.py @@ -1,5 +1,5 @@ """ -Smoke-test all models not marked as size "small" in the manifest. This +Smoke-test all models not marked as size "small" in each manifest. This entails running them for five seconds to ensure they can actually start and work with the spec they're supposed to be modeling. """ diff --git a/.github/scripts/unicode_number_set_shim.py b/.github/scripts/unicode_number_set_shim.py index c84f2fdd..0e959f08 100644 --- a/.github/scripts/unicode_number_set_shim.py +++ b/.github/scripts/unicode_number_set_shim.py @@ -2,7 +2,7 @@ While Unicode support in the Java tools goes through a trial period, the core Naturals/Integers/Reals modules will remain Unicode-free. So, the Unicode number sets ℕ, ℤ, and ℝ must be defined in any module that wishes to use -them. This script iterates through all modules in the manifest and replaces +them. This script iterates through all modules in the manifests and replaces their imports of the Naturals/Integers/Reals modules with shims containing a definition of the Unicode number sets. """ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d12282af..d6e3d18d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -22,26 +22,25 @@ Licensing your contributed specs under MIT is most appreciated, for consistency; This makes it clear which model files are associated with which spec. 1. Include a `README.md` in the spec directory explaining the significance of the spec with links to any relevant websites or publications, or integrate this info as comments in the spec itself. -At this point, you have the option of adding your spec directory to the [`.ciignore`](.ciignore) file to simply contribute the spec files & exclude it from automated validation. +At this point, you have the option of adding your spec directory to the [`.ciignore`](.ciignore) file to simply contribute the spec files & exclude it from automated validation, although this precludes your spec from the table of CI-validated specs in [`README.md`](README.md). Contribution volume is low enough that maintainers will be able to onboard your spec to the validation process eventually. However, if you are willing to put in the addition work of onboarding your spec to continuous integration yourself, follow the steps below. ## Adding Spec to Continuous Integration All specs & models in this repository are subject to many validation checks; for a full listing, see [`DEVELOPING.md`](DEVELOPING.md). -While many of these checks concern basic properties like whether the spec parses properly and its models do not crash, they also check whether the spec correctly reflects metadata stored about it in [`manifest.json`](manifest.json) and a table in [`README.md`](README.md). +While many of these checks concern basic properties like whether the spec parses properly and its models do not crash, they also check whether the spec correctly reflects metadata stored about it in the spec's `manifest.json` file and a table in [`README.md`](README.md). -The central file containing metadata about all specs is [`manifest.json`](manifest.json). -You will need to add an entry to it for your spec & model files. +CI validation requires creating a `manifest.json` metadata file in your specification's root directory. This can either be done manually (by looking at existing examples) or largely automated using the instructions below; note that if done manually you are very likely to miss tagging your spec with some feature flags detected & enforced by the CI. -Before submitted your changes to run in the CI, you can quickly check your [`manifest.json`](manifest.json) against the schema [`manifest-schema.json`](manifest-schema.json) at https://www.jsonschemavalidator.net/. +Before submitted your changes to run in the CI, you can quickly check your `manifest.json` against the schema [`manifest-schema.json`](manifest-schema.json) at https://www.jsonschemavalidator.net/. Steps: 1. Ensure you have Python 3.11+ installed; open a terminal in the root of this repository 1. It is considered best practice to create & initialize a Python virtual environment so the required packages are not installed globally; run `python -m venv .` then `source ./bin/activate` on Linux & macOS or `.\Scripts\activate.bat` on Windows (run `deactivate` to exit) 1. Run `pip install -r .github/scripts/requirements.txt` -1. Run `python .github/scripts/generate_manifest.py` to auto-generate your spec entry in [`manifest.json`](manifest.json) with as many details as possible -1. Locate your spec's entry in the [`manifest.json`](manifest.json) file and ensure the following fields are filled out: +1. Run `python .github/scripts/generate_manifest.py` to auto-generate your spec's `manifest.json` file with as many details as possible +1. Locate your spec directory's `manifest.json` file and ensure the following fields are filled out: - Spec title: an appropriate title for your specification - Spec description: a short description of your specification - Spec sources: links relevant to the source of the spec (papers, blog posts, repositories) @@ -69,18 +68,18 @@ Steps: - Recording these turns your model into a powerful regression test for TLC - Other fields are auto-generated by the script; if you are adding an entry manually, ensure their values are present and correct (see other entries or the [`manifest-schema.json`](manifest-schema.json) file) 1. Add your spec somewhere in the **topmost** table (not the bottom one, don't get them mixed up!) in [`README.md`](README.md); this must have: - - The spec name as a link to the spec's directory, matching the name in the [`manifest.json`](manifest.json) - - A comma-separated list of authors, which must also match the list of authors in [`manifest.json`](manifest.json) + - The spec name as a link to the spec's directory, matching the name in the `manifest.json` + - A comma-separated list of authors, which must also match the list of authors in the `manifest.json` - A checkmark indicating whether the spec is appropriate for beginners - - Checked IFF (if and only if) `beginner` is present in the `tags` field of your spec in [`manifest.json`](manifest.json) + - Checked IFF (if and only if) `beginner` is present in the `tags` field of your spec in `manifest.json` - A checkmark indicating whether the spec contains a formal proof - - Checked IFF a `proof` tag is present in the `features` field of least one module under your spec in [`manifest.json`](manifest.json) + - Checked IFF a `proof` tag is present in the `features` field of least one module under your spec in `manifest.json` - A checkmark indicating whether the spec contains PlusCal - - Checked IFF a `pluscal` tag is present in the `features` field of least one module under your spec in [`manifest.json`](manifest.json) + - Checked IFF a `pluscal` tag is present in the `features` field of least one module under your spec in `manifest.json` - A checkmark indicating whether the spec contains a TLC-checkable model - - Checked IFF `exhaustive search`, `generate`, or `simulate` tags are present in the `mode` field of at least one model under your spec in [`manifest.json`](manifest.json) + - Checked IFF `exhaustive search`, `generate`, or `simulate` tags are present in the `mode` field of at least one model under your spec in `manifest.json` - A checkmark indicating whether the spec contains an Apalache-checkable model - - Checked IFF `symbolic` tag is present in the `mode` field of at least one model under your spec in [`manifest.json`](manifest.json) + - Checked IFF `symbolic` tag is present in the `mode` field of at least one model under your spec in `manifest.json` At this point you can open a pull request and the CI will run against your spec, alerting you to any details that you missed. These scripts can be run locally for a faster development loop; see [`DEVELOPING.md`](DEVELOPING.md) for details. diff --git a/DEVELOPING.md b/DEVELOPING.md index c91301a6..0a063d5a 100644 --- a/DEVELOPING.md +++ b/DEVELOPING.md @@ -9,10 +9,10 @@ This document covers three topics: All scripts live in the [`.github/scripts`](.github/scripts) directory. Here is a brief overview of each script in the order they are run in [the CI](.github/workflows/CI.yml): -1. [`check_manifest_schema.py`](.github/scripts/check_manifest_schema.py): this uses the [jsonschema](https://pypi.org/project/jsonschema/) python package to validate the contents of the [`manifest.json`](manifest.json) file against its schema, [`manifest-schema.json`](manifest-schema.json). -1. [`check_manifest_files.py`](.github/scripts/check_manifest_files.py): this ensures the modules & models recorded in [`manifest.json`](manifest.json) concord with the set of modules & models found under the [`specifications`](specifications) directory, while also respecting the exclusion of any specs in the [`.ciignore`](.ciignore) file. -1. [`check_manifest_features.py`](.github/scripts/check_manifest_features.py`): this uses the [tree-sitter-tlaplus](https://pypi.org/project/tree-sitter-tlaplus/) python package to run queries on all the `.tla` files and ensure their features (`proof`, `pluscal`, `action composition`) are correctly recorded in [`manifest.json`](manifest.json); it also does best-effort regex parsing of all `.cfg` files to ensure their features (`view`, `alias`, etc.) are similarly correctly recorded. -1. [`check_markdown_table.py`](.github/scripts/check_markdown_table.py): this uses the [mistletoe](https://pypi.org/project/mistletoe/) markdown parser python package to parse [`README.md`](README.md), extract the spec table, then validate its format & contents against [`manifest.json`](manifest.json); before this script was developed the table tended to diverge wildly from the actual content of this repo. +1. [`check_manifest_schema.py`](.github/scripts/check_manifest_schema.py): this uses the [jsonschema](https://pypi.org/project/jsonschema/) python package to validate the contents of the `manifest.json` files against their schema, [`manifest-schema.json`](manifest-schema.json). +1. [`check_manifest_files.py`](.github/scripts/check_manifest_files.py): this ensures the modules & models recorded in each `manifest.json` concord with the set of modules & models found under the [`specifications`](specifications) directory, while also respecting the exclusion of any specs in the [`.ciignore`](.ciignore) file. +1. [`check_manifest_features.py`](.github/scripts/check_manifest_features.py`): this uses the [tree-sitter-tlaplus](https://pypi.org/project/tree-sitter-tlaplus/) python package to run queries on all the `.tla` files and ensure their features (`proof`, `pluscal`, `action composition`) are correctly recorded in each `manifest.json`; it also does best-effort regex parsing of all `.cfg` files to ensure their features (`view`, `alias`, etc.) are similarly correctly recorded. +1. [`check_markdown_table.py`](.github/scripts/check_markdown_table.py): this uses the [mistletoe](https://pypi.org/project/mistletoe/) markdown parser python package to parse [`README.md`](README.md), extract the spec table, then validate its format & contents against each `manifest.json`; before this script was developed the table tended to diverge wildly from the actual content of this repo. 1. [`unicode_conversion.py`](.github/scripts/unicode_conversion.py): this script uses [tlauc](https://github.com/tlaplus-community/tlauc) to convert each spec into its Unicode form to ensure TLA⁺ tooling functions identically on ASCII & Unicode specs. The CI spawns separate runs with and without conversion of specs to Unicode. 1. [`unicode_number_set_shim.py`](.github/scripts/unicode_number_set_shim.py): since Unicode adoption is not yet fully ratified, Unicode definitions like `ℕ`, `ℤ`, and `ℝ` (as synonyms for `Nat`, `Int`, and `Real` respectively) are not yet included in the standard modules. @@ -23,15 +23,15 @@ Here is a brief overview of each script in the order they are run in [the CI](.g This can get quite complicated as many modules import specs defined in Apalache, TLAPM, or the community modules. 1. [`check_small_models.py`](.github/scripts/check_small_models.py): this script runs TLC or Apalache to completion against all models marked as "small", which means they should complete within 30 seconds. The script ensures the models don't crash and that their result is as expected, either success or a specific type of failure. - If applicable, the script also checks the size of the state graph against the values recorded in [`manifest.json`](manifest.json). + If applicable, the script also checks the size of the state graph against the values recorded in `manifest.json`. 1. [`smoke_test_large_models.py`](.github/scripts/smoke_test_large_models.py): not all models in this repository can be run to completion within 30 seconds, so this script runs medium & large models for five seconds before terminating their process - just to ensure they basically function and don't immediately crash. 1. [`check_proofs.py`](.github/scripts/check_proofs.py): this script runs TLAPM against all modules that contain formal proofs, to ensure the proofs are valid. There are also a number of utility scripts: -1. [`generate_manifest.py`](.github/scripts/generate_manifest.py): this can be run by users to automatically find & generate an entry for their new specs in the [`manifest.json`](manifest.json) file. +1. [`generate_manifest.py`](.github/scripts/generate_manifest.py): this can be run by users to automatically generate a new `manifest.json` file for their specs. It uses the [tree-sitter-tlaplus](https://pypi.org/project/tree-sitter-tlaplus/) python package to find all required tags and features. 1. [`tla_utils.py`](.github/scripts/tla_utils.py): not a script by itself, but contains common functions used by all the other scripts. -1. [`record_model_state_space.py`](.github/scripts/record_model_state_space.py): this script runs all small models that lack state space info, extracts their state space info, and records it in the [`manifest.json`](manifest.json) file; useful if a large number of specs need to have this info recorded in a batch. +1. [`record_model_state_space.py`](.github/scripts/record_model_state_space.py): this script runs all small models that lack state space info, extracts their state space info, and records it in the relevant `manifest.json` file; useful if a large number of specs need to have this info recorded in a batch. 1. [`format_markdown_table.py`](.github/scripts/format_markdown_table.py): this script is intended for use by developers to script formatting updates to the markdown table (add columns, reorder columns, etc.) to avoid the tedium of having to do this by hand. ### Running the Scripts @@ -58,47 +58,47 @@ Scripts will output a descriptive error message and nonzero exit code on failure Most scripts accept `--skip` and `--only` parameters to skip running on specific files or only run on specific files, which is helpful for quickly testing your changes against the longer-running scripts like `check_small_models.py`. Many scripts also accept the `--verbose` flag which will output the full command-line arguments and output of any tools they run. ```sh -python .github/scripts/check_manifest_schema.py --manifest_path manifest.json --schema_path manifest-schema.json +python .github/scripts/check_manifest_schema.py --schema_path manifest-schema.json ``` ```sh -python .github/scripts/check_manifest_files.py --manifest_path manifest.json --ci_ignore_path .ciignore +python .github/scripts/check_manifest_files.py --ci_ignore_path .ciignore ``` ```sh -python .github/scripts/check_manifest_features.py --manifest_path manifest.json +python .github/scripts/check_manifest_features.py --examples_root . ``` ```sh -python .github/scripts/check_markdown_table.py --manifest_path manifest.json --readme_path README.md +python .github/scripts/check_markdown_table.py --readme_path README.md ``` **WARNING:** the `unicode_conversion.py`, `unicode_number_set_shim.py`, and `translate_pluscal.py` scripts make large numbers of changes to files in your local repository, so be sure to run them on a clean branch where your own changes can't be clobbered and you can easily revert with `git reset --hard HEAD`. ```sh -python .github/scripts/unicode_conversion.py --tlauc_path deps/tlauc/tlauc --manifest_path manifest.json +python .github/scripts/unicode_conversion.py --tlauc_path deps/tlauc/tlauc --examples_root . ``` Delete all the shim files generated by `unicode_number_set_shim.py` with `find . -iname "*_UnicodeShim.tla" -delete`. ```sh -python .github/scripts/unicode_number_set_shim.py --manifest_path manifest.json +python .github/scripts/unicode_number_set_shim.py --examples_root . ``` ```sh -python .github/scripts/translate_pluscal.py --tools_jar_path deps/tools/tla2tools.jar --manifest_path manifest.json +python .github/scripts/translate_pluscal.py --tools_jar_path deps/tools/tla2tools.jar --examples_root . ``` ```sh -python .github/scripts/parse_modules.py --tools_jar_path deps/tools/tla2tools.jar --apalache_path deps/apalache --tlapm_lib_path deps/tlapm/library --community_modules_jar_path deps/community/modules.jar --manifest_path manifest.json +python .github/scripts/parse_modules.py --tools_jar_path deps/tools/tla2tools.jar --apalache_path deps/apalache --tlapm_lib_path deps/tlapm/library --community_modules_jar_path deps/community/modules.jar --examples_root . ``` ```sh -python .github/scripts/check_small_models.py --tools_jar_path deps/tools/tla2tools.jar --apalache_path deps/apalache --tlapm_lib_path deps/tlapm/library --community_modules_jar_path deps/community/modules.jar --manifest_path manifest.json +python .github/scripts/check_small_models.py --tools_jar_path deps/tools/tla2tools.jar --apalache_path deps/apalache --tlapm_lib_path deps/tlapm/library --community_modules_jar_path deps/community/modules.jar --examples_root . ``` ```sh -python .github/scripts/smoke_test_large_models.py --tools_jar_path deps/tools/tla2tools.jar --apalache_path deps/apalache --tlapm_lib_path deps/tlapm/library --community_modules_jar_path deps/community/modules.jar --manifest_path manifest.json +python .github/scripts/smoke_test_large_models.py --tools_jar_path deps/tools/tla2tools.jar --apalache_path deps/apalache --tlapm_lib_path deps/tlapm/library --community_modules_jar_path deps/community/modules.jar --examples_root . ``` Note: `check_proofs.py` does not run on Windows. ```sh -python .github/scripts/check_proofs.py --tlapm_path deps/tlapm --manifest_path manifest.json +python .github/scripts/check_proofs.py --tlapm_path deps/tlapm --examples_root . ``` You can also run the non-CI utility scripts as follows: ```sh -python .github/scripts/generate_manifest.py --manifest_path manifest.json --ci_ignore_path .ciignore +python .github/scripts/generate_manifest.py --ci_ignore_path .ciignore ``` ```sh -python .github/scripts/record_model_state_space.py --tools_jar_path deps/tools/tla2tools.jar --tlapm_lib_path deps/tlapm/library --community_modules_jar_path deps/community/modules.jar --manifest_path manifest.json +python .github/scripts/record_model_state_space.py --tools_jar_path deps/tools/tla2tools.jar --tlapm_lib_path deps/tlapm/library --community_modules_jar_path deps/community/modules.jar --examples_root . ``` Exit your Python virtual environment by running `deactivate`. @@ -112,7 +112,7 @@ Several TLA⁺ tools already import this repository for testing purposes in thei - The [TLA⁺ Unicode converter](https://github.com/tlaplus-community/tlauc) Here is some advice for consuming this repo in your own project: -- The most important file to consider is [`manifest.json`](manifest.json); almost all languages have binding libraries for JSON, and you can use it to get a list of spec/module paths along with various features to filter on. +- The most important files to consider are the `manifest.json` metadata files; almost all languages have binding libraries for JSON, and you can use it to get a list of spec/module paths along with various features to filter on. - Consider using a [release of this repo](https://github.com/tlaplus/Examples/releases) instead of just pulling from the head of the main branch, since the manifest format is occasionally changed and these changes are captured in minor version bumps. Releases with a patch version bump only contain new specs or other non-breaking changes. - If using this repo to test your tool requires additional metadata or scripting that could be commonly useful, consider [opening an issue](https://github.com/tlaplus/Examples/issues) explaining your use case; we are always interested in supporting new TLA⁺ tooling development! diff --git a/README.md b/README.md index c4c726a2..c75b6a0a 100644 --- a/README.md +++ b/README.md @@ -14,15 +14,15 @@ To contribute a spec of your own, see [`CONTRIBUTING.md`](CONTRIBUTING.md). The table below lists all specs and indicates whether a spec is beginner-friendly, includes an additional PlusCal variant `(✔)`, or uses PlusCal exclusively. Additionally, the table specifies which verification tool—[TLC](https://github.com/tlaplus/tlaplus), [Apalache](https://github.com/apalache-mc/apalache), or [TLAPS](https://github.com/tlaplus/tlapm)—can be used to verify each specification. -Space contraints limit the information displayed in the table; detailed spec metadata can be found in the [`manifest.json`](manifest.json) file. -You can search this file for examples exhibiting a number of features, like: - - Specs (`.tla` files) including `pluscal`, `proof`, or `action composition` (the `\cdot` operator) +Space contraints limit the information displayed in the table; detailed spec metadata can be found in the `manifest.json` files in each specification's directory. +You can search these files for examples exhibiting a number of features, either using the GitHub repository search or locally with the command `ls specifications/*/manifest.json | xargs grep -l $keyword`, where `$keyword` can be a value like: + - `pluscal`, `proof`, or `action composition` (the `\cdot` operator) - Specs intended for trace generation (`generate`), `simulate`, or checked symbolically with Apalache (`symbolic`) - Models (`.cfg` files) using the `symmetry`, `view`, `alias`, `state constraint`, or `ignore deadlock` features - Models failing in interesting ways, like `deadlock failure`, `safety failure`, `liveness failure`, or `assumption failure` -## Examples Included Here -Here is a list of specs included in this repository, with links to the relevant directory and flags for various features: +## Validated Examples Included Here +Here is a list of specs included in this repository which are validated by the CI, with links to the relevant directory and flags for various features: | Name | Author(s) | Beginner | TLAPS Proof | PlusCal | TLC Model | Apalache | | --------------------------------------------------------------------------------------------------- | --------------------------------------------------- | :------: | :---------: | :-----: | :-------: | :------: | | [Teaching Concurrency](specifications/TeachingConcurrency) | Leslie Lamport | ✔ | ✔ | ✔ | ✔ | | @@ -102,9 +102,9 @@ Here is a list of specs included in this repository, with links to the relevant | [Disruptor](specifications/Disruptor) | Nicholas Schultz-Møller | | | | ✔ | | -## Examples Elsewhere -Here is a list of specs stored in locations outside this repository, including submodules. -They are not covered by CI testing so it is possible they contain errors, the reported details are incorrect, or they are no longer available. +## Other Examples +Here is a list of specs stored in locations outside this repository or not validated by the CI, such as submodules. +Since these specs are not covered by CI testing it is possible they contain errors, the reported details are incorrect, or they are no longer available. Ideally these will be moved into this repo over time. | Spec | Details | Author(s) | Beginner | TLAPS Proof | TLC Model | PlusCal | Apalache | | --------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- | :------: | :---------: | :-------: | :-----: | :------: |