├── .github └── workflows │ └── hugo.yaml ├── .gitignore ├── CNAME ├── CONTRIBUTING.md ├── README.md ├── SpecificationLanguageCommittee.md ├── archetypes ├── blog.md ├── default.md ├── grant.md └── section.md ├── assets └── css │ └── theme-tlaplus.css ├── content ├── _index.md ├── blog │ ├── 2024-12-dev-update │ │ └── index.md │ ├── 2025-01-dev-update │ │ └── index.md │ ├── 2025-02-dev-update │ │ └── index.md │ ├── 2025-03-dev-update │ │ └── index.md │ ├── 2025-04-dev-update │ │ └── index.md │ ├── 2025-05-dev-update │ │ └── index.md │ └── _index.md ├── challenge │ ├── _index.md │ └── banner.png └── grants │ ├── 2024-grant-program.md │ ├── TLA+ Grant Template.docx │ └── _index.md ├── documents └── infra-eng-job-post.md ├── go.mod ├── go.sum ├── hugo.toml ├── layouts ├── blog │ └── views │ │ └── article.html └── partials │ ├── content-footer.html │ ├── header.html │ ├── logo.html │ ├── menu-footer.html │ ├── menu.html │ └── opengraph.html ├── minutes ├── 2021-10-11.md ├── 2021-12-22.md ├── 2022-01-25.md ├── 2022-02-25.md ├── 2022-03-02.md ├── 2022-03-25.md └── 2024-05-28.md └── static ├── docs └── TLA+ Project Technical Charter.pdf └── logos ├── amazon-web-services-inc.svg ├── microsoft-corporation.svg ├── oracle-america-inc.png ├── oracle-america-inc.svg └── tla.jpg /.github/workflows/hugo.yaml: -------------------------------------------------------------------------------- 1 | name: GitHub Pages 2 | 3 | env: 4 | PROD_SITE: "https://foundation.tlapl.us" 5 | DEV_SITE: ${{ format('https://{0}.github.io/{1}', github.repository_owner, github.event.repository.name )}} 6 | 7 | on: 8 | push: 9 | branches: 10 | - main # Set a branch to deploy 11 | pull_request: 12 | 13 | jobs: 14 | deploy: 15 | runs-on: ubuntu-22.04 16 | permissions: 17 | contents: write 18 | concurrency: 19 | group: ${{ github.workflow }}-${{ github.ref }} 20 | steps: 21 | - uses: actions/checkout@v4 22 | with: 23 | submodules: true # Fetch Hugo themes (true OR recursive) 24 | fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod 25 | 26 | - name: Setup Hugo 27 | uses: peaceiris/actions-hugo@v3 28 | with: 29 | hugo-version: '0.139.0' 30 | extended: true 31 | 32 | - name: Build Main 33 | if: github.repository_owner == 'tlaplus' 34 | run: hugo --baseURL=$PROD_SITE --minify 35 | 36 | - name: Build Dev 37 | if: github.repository_owner != 'tlaplus' 38 | run: hugo --baseURL=$DEV_SITE --minify 39 | 40 | - name: Deploy 41 | uses: peaceiris/actions-gh-pages@v4 42 | if: github.ref == 'refs/heads/main' 43 | with: 44 | github_token: ${{ secrets.GITHUB_TOKEN }} 45 | publish_dir: ./public 46 | cname: foundation.tlapl.us 47 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | public/ 2 | *~ 3 | .DS_Store 4 | .htpasswd 5 | .hugo_build.lock 6 | .vscode 7 | .keep_vendor 8 | _vendor/ 9 | -------------------------------------------------------------------------------- /CNAME: -------------------------------------------------------------------------------- 1 | foundation.tlapl.us -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to the website 2 | 3 | This website uses Hugo as a static site generator and is hosted on GitHub Pages. To contribute to the website, you will need to install and configure: 4 | 5 | 1. Git 6 | 1. Go 7 | 1. Hugo 8 | 9 | Fork this repository and clone your fork onto your local machine to make modifications. 10 | 11 | Test the site and your modifications locally by running: 12 | 13 | ```zsh 14 | ➜ ~ hugo server --buildDrafts --buildFuture 15 | ``` 16 | 17 | The `--buildDrafts` (or `-D`) option will show you pages still in draft mode, and `--buildFuture` (or `-F`) will show you pages with a publication date in the future. 18 | If Hugo isn't serving your post and isn't displaying any errors then you are probably missing one of these two options. 19 | 20 | ## Writing a blog for the TLA+ website 21 | 22 | If you would like to write a blog for the TLA+ website, follow these steps: 23 | 24 | 1. Create a new markdown file using the blog archetype by running: 25 | 26 | ```zsh 27 | ➜ ~ hugo new --kind blog blog//_index.md 28 | ``` 29 | 30 | This `_index.md` file will be prepopulated with the following markdown frontmatter: 31 | 32 | ```markdown 33 | +++ 34 | type = "blog" 35 | menuPre = " " 36 | title = 'blog title' 37 | linkTitle = '' 38 | description = "" 39 | date = 40 | draft = true 41 | +++ 42 | ``` 43 | 2. Change the information in the `title`, `linkTitle`, and `description` to fit your content. 44 | 45 | 3. Below the last `+++`, write your content normally in markdown. 46 | 47 | 4. Preview your blog entry anytime by running: 48 | 49 | ```zsh 50 | ➜ ~ hugo server -D 51 | ``` 52 | 53 | 5. Once you are happy with your blog entry, take it out of draft mode by changing the flag in the frontmatter: 54 | 55 | ```markdown 56 | draft = false 57 | ``` 58 | 59 | 6. Contribute your blog post upstream to this repository using the normal pull request mechanism. 60 | 61 | While this website does not make use of all features available in the [Hugo Relearn theme](https://github.com/McShelby/hugo-theme-relearn), you can read its [documentation to learn more](https://mcshelby.github.io/hugo-theme-relearn/index.html). 62 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # TLA+ Foundation 2 | 3 | # Goals of the Foundation 4 | The TLA+ Foundation (TLAF) is an independent, non-profit organization dedicated to fostering the adoption of the [TLA+ specification language](https://lamport.azurewebsites.net/tla/tla.html) in industry, academia, and education, guided by the overall goal of advancing the mathematical thinking in software engineering. The TLAF funds development related to TLA+ to broaden its use and facilitate a thriving [TLA+ community](https://groups.google.com/g/tlaplus), encouraging cooperation among members of that community. 5 | 6 | See the [TLA+ Foundation Charter](https://cdn.platform.linuxfoundation.org/agreements/tla.pdf) and the [TLA+ Technical Charter](https://github.com/tlaplus/foundation/blob/main/static/docs/TLA%2B%20Project%20Technical%20Charter.pdf) for more details. 7 | 8 | ## The values of the Foundation 9 | The core principles guide the actions of the foundation: 10 | 11 | * **Open source**. The TLA+ Foundation will embrace the open-source ethos wholeheartedly. Whenever the TLAF develops or sponsors the development of tools and infrastructure, it will all be open-source under a permissive license. This is not limited to the result but also applies to how work is organized and carried out; the community at large has to be able to participate at each step of the journey. 12 | 13 | * **Empowering the community**. While the TLAF raises resources to fund development work, it also encourages volunteer efforts from industry, academia, and individuals. It attempts to coordinate all contributions to maximize their benefit to TLA+ users. 14 | 15 | * **Transparent**. All formal decision-making will be publicly accessible. The TLAF also strives to share ideas early to enhance collaboration and avoid duplicate efforts. Only certain categories of sensitive information (e.g., financial data and matters concerning particular individuals) may be kept confidential. 16 | 17 | * **Open, friendly, and diverse**. The TLAF strives to make sure that everyone is welcome and all can [contribute](https://github.com/tlaplus/tlaplus/blob/master/CONTRIBUTING.md). Also consider attending our [regular project meetings](https://calendar.google.com/calendar/embed?src=cb3f93f188c92378a8fec42b25365ab2a64665d770a8265c1fcec00e03823c6c%40group.calendar.google.com&ctz=America%2FLos_Angeles). 18 | 19 | # Press Release 20 | 21 | The TLA+ Foundation's launch press release can be found [here](https://www.linuxfoundation.org/press/linux-foundation-launches-tlafoundation). 22 | 23 | # Members 24 | 25 | The TLA+ Foundation would not exist without the support of the Member organizations listed below. If your company or organization is interested in joining as a Member, please begin the process [here](https://enrollment.lfx.linuxfoundation.org/?project=tla). 26 | 27 | 28 | 29 | 30 |
AWS LogoOracle Logo
31 | 32 | 33 | ---------------------- 34 | 35 | Copyright © 2023 The Linux Foundation®. All rights reserved. The Linux Foundation has registered trademarks and uses trademarks. For a list of trademarks of The Linux Foundation, please see our [Trademark Usage](https://www.linuxfoundation.org/legal/trademarks) page. Linux is a registered trademark of Linus Torvalds. [Terms of Use](https://www.linuxfoundation.org/legal/terms) | [Privacy Policy](https://www.linuxfoundation.org/legal/privacy-policy) | [Bylaws](https://www.linuxfoundation.org/legal/bylaws) | [Antitrust Policy](https://www.linuxfoundation.org/legal/antitrust-policy) | [Good Standing Policy](https://www.linuxfoundation.org/legal/good-standing-policy) 36 | -------------------------------------------------------------------------------- /SpecificationLanguageCommittee.md: -------------------------------------------------------------------------------- 1 | # TLA+ Foundation Specification Language Committee 2 | 3 | The Specification Language Committee of the TLA+ Foundation has been 4 | created. The initial members are Stephan Merz (chairman), Murat 5 | Demirbas, Leslie Lamport, and Chris Newcombe. 6 | -------------------------------------------------------------------------------- /archetypes/blog.md: -------------------------------------------------------------------------------- 1 | +++ 2 | type = "blog" 3 | menuPre = " " 4 | title = '{{ replace .File.ContentBaseName "-" " " | title }}' 5 | linkTitle = '' 6 | description = "" 7 | date = {{ .Date }} 8 | draft = true 9 | +++ -------------------------------------------------------------------------------- /archetypes/default.md: -------------------------------------------------------------------------------- 1 | +++ 2 | type = "default" 3 | title = '{{ replace .File.ContentBaseName "-" " " | title }}' 4 | linkTitle = '' 5 | description = "" 6 | date = {{ .Date }} 7 | draft = true 8 | +++ -------------------------------------------------------------------------------- /archetypes/grant.md: -------------------------------------------------------------------------------- 1 | +++ 2 | type = "default" 3 | title = '{{ replace .File.ContentBaseName "-" " " | title }}' 4 | linkTitle = '' 5 | description = "" 6 | date = {{ .Date }} 7 | draft = true 8 | +++ -------------------------------------------------------------------------------- /archetypes/section.md: -------------------------------------------------------------------------------- 1 | +++ 2 | type = "default" 3 | menuPre = " " 4 | title = '{{ replace .File.ContentBaseName "-" " " | title }}' 5 | linkTitle = '' 6 | weight = 1 7 | alwaysopen = false 8 | hideifempty = true 9 | +++ 10 | 11 | {{% children containerstyle="div" style="h2" description=true %}} -------------------------------------------------------------------------------- /assets/css/theme-tlaplus.css: -------------------------------------------------------------------------------- 1 | /* my-custom-variant */ 2 | :root { 3 | --SECONDARY-color: rgba(72, 106, 201, 1); /* brand secondary color */ 4 | --ACCENT-color: #67117e; /* brand accent color, used for search highlights */ 5 | --MAIN-LINK-HOVER-color: rgba( 6 | 32, 7 | 40, 8 | 145, 9 | 1 10 | ); /* hoverd link color of content */ 11 | --MAIN-TEXT-color: #222; /* text color of content and h1 titles */ 12 | --MAIN-TITLES-TEXT-color: rgba( 13 | 16, 14 | 16, 15 | 16, 16 | 1 17 | ); /* text color of h2-h6 titles and transparent box titles */ 18 | --MAIN-TITLES-H2-color: #333; /* text color of h2-h6 titles */ 19 | --MAIN-TITLES-H3-color: #444; /* text color of h3-h6 titles */ 20 | --CODE-theme: relearn-light; /* name of the chroma stylesheet file */ 21 | --CODE-BLOCK-color: rgba( 22 | 39, 23 | 40, 24 | 34, 25 | 1 26 | ); /* fallback text color of block code; should be adjusted to your selected chroma style */ 27 | --CODE-BLOCK-BG-color: rgba( 28 | 250, 29 | 250, 30 | 250, 31 | 1 32 | ); /* fallback background color of block code; should be adjusted to your selected chroma style */ 33 | --CODE-BLOCK-BORDER-color: rgba( 34 | 216, 35 | 216, 36 | 216, 37 | 1 38 | ); /* border color of block code */ 39 | --CODE-INLINE-color: rgba(94, 94, 94, 1); /* text color of inline code */ 40 | --CODE-INLINE-BG-color: rgba( 41 | 255, 42 | 250, 43 | 233, 44 | 1 45 | ); /* background color of inline code */ 46 | --CODE-INLINE-BORDER-color: rgba( 47 | 248, 48 | 232, 49 | 200, 50 | 1 51 | ); /* border color of inline code */ 52 | --BROWSER-theme: light; /* name of the theme for browser scrollbars of the main section */ 53 | --MERMAID-theme: default; /* name of the default Mermaid theme for this variant, can be overridden in hugo.toml */ 54 | --OPENAPI-theme: light; /* name of the default OpenAPI theme for this variant, can be overridden in hugo.toml */ 55 | --OPENAPI-CODE-theme: idea; /* name of the default OpenAPI code theme for this variant, can be overridden in hugo.toml */ 56 | --MENU-TOPBAR-BORDER-color: #67117e; /* border color of vertical line between menu and topbar */ 57 | --MENU-HEADER-BG-color: #67117e; /* background color of menu header */ 58 | --MENU-HEADER-BORDER-color: #67117e; /* border color between menu header and menu */ 59 | --MENU-HOME-LINK-color: #ffffff; /* home button color if configured */ 60 | --MENU-HOME-LINK-HOVER-color: rgba( 61 | 0, 62 | 0, 63 | 0, 64 | 1 65 | ); /* hoverd home button color if configured */ 66 | --MENU-SEARCH-color: #ffffff; /* text and icon color of search box */ 67 | --MENU-SEARCH-BG-color: rgba( 68 | 50, 69 | 50, 70 | 50, 71 | 1 72 | ); /* background color of search box */ 73 | --MENU-SEARCH-BORDER-color: #ffffff; /* border color of search box */ 74 | --MENU-SECTIONS-BG-color: #322a38; /* background of the menu; this is NOT just a color value but can be a complete CSS background definition including gradients, etc. */ 75 | --MENU-SECTIONS-ACTIVE-BG-color: rgba( 76 | 0, 77 | 0, 78 | 0, 79 | 0.166 80 | ); /* background color of the active menu section */ 81 | --MENU-SECTIONS-LINK-color: #fff; /* link color of menu topics */ 82 | --MENU-SECTIONS-LINK-HOVER-color: rgba( 83 | 255, 84 | 255, 85 | 255, 86 | 1 87 | ); /* hoverd link color of menu topics */ 88 | --MENU-SECTION-ACTIVE-CATEGORY-color: rgba( 89 | 68, 90 | 68, 91 | 68, 92 | 1 93 | ); /* text color of the displayed menu topic */ 94 | --MENU-SECTION-SEPARATOR-color: rgba( 95 | 96, 96 | 96, 97 | 96, 98 | 1 99 | ); /* separator color between menu sections and menu footer */ 100 | --MENU-VISITED-color: #f5e4e4; /* icon color of visited menu topics if configured */ 101 | --BOX-CAPTION-color: rgba( 102 | 255, 103 | 255, 104 | 255, 105 | 1 106 | ); /* text color of colored box titles */ 107 | --BOX-BG-color: rgba( 108 | 255, 109 | 255, 110 | 255, 111 | 0.833 112 | ); /* background color of colored boxes */ 113 | --BOX-TEXT-color: rgba(16, 16, 16, 1); /* text color of colored box content */ 114 | } 115 | 116 | #R-header-wrapper { 117 | border-bottom-width: 4px; 118 | padding: 0rem; 119 | } 120 | 121 | #R-body-inner { 122 | display: flex; 123 | flex: auto; 124 | flex-direction: column; 125 | overflow-y: auto; 126 | padding: 0 3.25rem 4rem 3.25rem; 127 | position: relative; /* PS */ 128 | } 129 | 130 | #R-body .flex-block-wrapper { 131 | margin-left: auto; 132 | margin-right: auto; 133 | max-width: calc( var(--INTERNAL-MAIN-WIDTH-MAX) - var(--INTERNAL-MENU-WIDTH-L) - 2 * 3.25rem ); 134 | width: 100%; 135 | position: relative; 136 | height: 100%; 137 | } 138 | body:not(.print) #R-body .narrow .flex-block-wrapper { 139 | max-width: calc( var(--INTERNAL-MAIN-WIDTH-MAX) - var(--INTERNAL-MENU-WIDTH-L) - 2 * 9.75rem ); 140 | position: relative; 141 | } 142 | /* we limit width if we have large screens */ 143 | body.main-width-max #R-body .flex-block-wrapper { 144 | width: calc( var(--INTERNAL-MAIN-WIDTH-MAX) - var(--INTERNAL-MENU-WIDTH-L) - 2 * 3.25rem ); 145 | position: relative; 146 | } 147 | body.main-width-max:not(.print) #R-body .narrow .flex-block-wrapper { 148 | width: calc( var(--INTERNAL-MAIN-WIDTH-MAX) - var(--INTERNAL-MENU-WIDTH-L) - 2 * 9.75rem ); 149 | position: relative; 150 | } 151 | article { 152 | display: flex; 153 | flex-direction: column; 154 | min-height: 100%; 155 | } 156 | 157 | .children { 158 | flex-grow: 1; 159 | } 160 | footer { 161 | flex-shrink: 0; 162 | padding-bottom: .5rem; 163 | } 164 | 165 | .blog-container { 166 | flex-grow: 1; 167 | } 168 | -------------------------------------------------------------------------------- /content/_index.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = 'TLA+ Foundation' 3 | linkTitle = 'TLA+ Foundation' 4 | archetype = "home" 5 | description = "" 6 | draft = false 7 | +++ 8 | 9 | ## Goals of the Foundation 10 | The TLA+ Foundation (TLAF) is an independent, non-profit organization dedicated to fostering the adoption of the [TLA+ specification language](https://lamport.azurewebsites.net/tla/tla.html) in industry, academia, and education, guided by the overall goal of advancing the mathematical thinking in software engineering. The TLAF funds development related to TLA+ to broaden its use and facilitate a thriving [TLA+ community](https://groups.google.com/g/tlaplus), encouraging cooperation among members of that community. 11 | 12 | See the [TLA+ Foundation Charter](https://cdn.platform.linuxfoundation.org/agreements/tla.pdf) and the [TLA+ Technical Charter](docs/TLA%2B%20Project%20Technical%20Charter.pdf) for more details. 13 | 14 | {{% notice style="accent" title="Join the GenAI-accelerated TLA+ challenge" icon="bullhorn" %}} 15 | Join the [*GenAI-accelerated TLA+* challenge](challenge/) and win prizes! The challenge is an open call for submissions that explore the intersection of TLA+ and generative AI. Participants are invited to develop engineering-oriented solutions that advance the usability, accessibility, and automation of formal specification through the integration of GenAI. The deadline to submit entries for the challenge is two months from the announcement date on 07/03/2025. 16 | {{% /notice %}} 17 | 18 | {{% notice style="accent" title="TLA+ Grant CFP Now Open" icon="bullhorn" %}} 19 | The TLA+ Foundation Grant Program is aimed at advancing the state of the art in the TLA+ specification and fostering the experience of using TLA+ in research and industry. Learn about the [Grant Program and application process](grants/2024-grant-program). 20 | {{% /notice %}} 21 | 22 | ## The values of the Foundation 23 | The core principles guide the actions of the foundation: 24 | 25 | * **Open source**. The TLA+ Foundation will embrace the open-source ethos wholeheartedly. Whenever the TLAF develops or sponsors the development of tools and infrastructure, it will all be open-source under a permissive license. This is not limited to the result but also applies to how work is organized and carried out; the community at large has to be able to participate at each step of the journey. 26 | 27 | * **Empowering the community**. While the TLAF raises resources to fund development work, it also encourages volunteer efforts from industry, academia, and individuals. It attempts to coordinate all contributions to maximize their benefit to TLA+ users. 28 | 29 | * **Transparent**. All formal decision-making will be publicly accessible. The TLAF also strives to share ideas early to enhance collaboration and avoid duplicate efforts. Only certain categories of sensitive information (e.g., financial data and matters concerning particular individuals) may be kept confidential. 30 | 31 | * **Open, friendly, and diverse**. The TLAF strives to make sure that everyone is welcome and all can [contribute](https://github.com/tlaplus/tlaplus/blob/master/CONTRIBUTING.md). Also consider attending our [regular project meetings](https://zoom-lfx.platform.linuxfoundation.org/meetings/tla). 32 | 33 | ## Press Release 34 | 35 | The TLA+ Foundation's launch press release can be found [here](https://www.linuxfoundation.org/press/linux-foundation-launches-tlafoundation). 36 | 37 | ## Members 38 | 39 | The TLA+ Foundation would not exist without the support of the Member organizations listed below. If your company or organization is interested in joining as a Member, please begin the process [here](https://enrollment.lfx.linuxfoundation.org/?project=tla). 40 | 41 | 42 | 43 | 44 |
AWS LogoOracle Logo
45 | -------------------------------------------------------------------------------- /content/blog/2024-12-dev-update/index.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "December 2024 Monthly Development Update" 3 | type = "blog" 4 | date = 2024-12-15 5 | +++ 6 | 7 | Hello! 8 | You're reading the inaugural edition of the TLA⁺ Foundation monthly development update. 9 | Here I'll summarize the past month of development for the benefit of Foundation patrons and interested members of the community. 10 | These posts are authored by [Andrew Helwer](https://ahelwer.ca/) and while I'll focus a fair bit on my own work (as a way of providing a monthly status update to the Foundation, really), I will also provide a rundown of other happenings in the community! 11 | If I missed your contribution or there was some important part of it I didn't capture in the summary, worry not! 12 | These newsletters will be published monthly so it's easy to hop on the next train; try opening an issue [here](https://github.com/tlaplus/foundation/issues). 13 | 14 | If you're interested in getting involved in the TLA⁺ community: 15 | - Learn TLA⁺ starting [here](https://lamport.azurewebsites.net/tla/learning.html)! 16 | - Read the mailing list [here](https://groups.google.com/g/tlaplus)! 17 | - Join the monthly virtual community meetings [here](https://groups.google.com/g/tlaplus/c/CpAEnrf-DHQ/m/YrORpIfSBwAJ)! 18 | - Start hacking on the tools themselves [here](https://github.com/tlaplus/tlaplus)! 19 | 20 | Let's start with some interesting non-coding-related developments & announcements: 21 | - [Leslie Lamport](https://lamport.azurewebsites.net/) published a new book, titled *A Science of Concurrent Programs*! 22 | It's [freely available for download](https://lamport.azurewebsites.net/tla/science-book.html) but a physical edition is in the works. 23 | I've been reading & enjoying it and asking lots of questions on the mailing list. 24 | It's very much focused on the "TLA" part of TLA⁺ (meaning the Temporal Logic of Actions) so it's a good read if you want to go really in-depth on the logical theory underpinning the TLA⁺ language. 25 | - The [TLA⁺ Community Event 2025](https://conf.tlapl.us/2025-etaps/) was announced, to be co-located with [ETAPS 2025](https://etaps.org/2025/) in Hamilton, Ontario, Canada on May 4th, 2025. 26 | We hope to see you there! 27 | The talk proposal submission deadline is February 7th, 2025. 28 | - East of the Atlantic, [ABZ 2025](https://abz-conf.org/site/2025/) - the 11th International Conference on Rigorous State-Based Methods - will take place from June 10th to 13th of 2025 in Düsseldorf, Germany. 29 | TLA⁺-related papers are welcome; the deadline for submitting abstracts is February 3rd, 2025. 30 | - [Jack Vanlighty](https://jack-vanlightly.com) wrote [a blog post](https://jack-vanlightly.com/blog/2024/11/19/obtaining-statistical-properties-through-modeling-and-simulation) on using TLA⁺ to obtain statistical properties of distributed system designs. 31 | - [Lorin Hochstein](http://lorinhochstein.org/) has been on a TLA⁺ blogging *tear*, publishing three excellent blog posts in quick succession: [*Specifying serializability in TLA⁺*](https://surfingcomplexity.blog/2024/10/28/serializability-and-tla/), [*Multi-version concurrency control in TLA⁺*](https://surfingcomplexity.blog/2024/10/31/multi-version-concurrency-control-in-tla/), and [*Extending MVCC to be serializable, in TLA⁺*](https://surfingcomplexity.blog/2024/11/03/extending-mvcc-to-be-serializable-in-tla/). 32 | The first post is especially effective as an introduction to using refinement to express whole-system safety properties that just can't be done with single-state formulas. 33 | - At the November virtual community meeting, [Feng Wenhan](https://github.com/fwhdzh) presented his work using the TLC state graph export function to drive model-based testing; some shortfalls in the state graph export functionality led to the proposal of designing a [robust state graph export format](https://github.com/tlaplus/tlaplus/issues/1073). 34 | - Also at the November virtual community meeting, Leslie Lamport announced his retirement at the end of the year at the age of 83. 35 | A well-earned rest, although his contributions will be missed! 36 | 37 | Now on to coding-related community developments: 38 | - [Federico Ponzi](https://fponzi.me/) is prototyping a [TLA⁺ Formatter](https://github.com/FedericoPonzi/tlaplus-formatter), including hammering down the [default settings](https://github.com/FedericoPonzi/tlaplus-formatter/pull/6). 39 | If you have opinions on how TLA⁺ should look, now is a great time to weigh in! 40 | - [Julia Ferraioli](https://www.juliaferraioli.com/) updated the TLA⁺ Foundation website with blogging capabilities, facilitating the very post you are reading right now! She chose the Hugo static site generator, of which I am also a fan. 41 | - [William Schultz](https://will62794.github.io/) released [Scimitar](https://github.com/will62794/scimitar), a tool for verifying the safety of distributed protocols based on the technique of inductive proof decomposition in TLA⁺. 42 | - [Hillel Wayne](https://www.hillelwayne.com/) has started contributing to the TLA⁺ VS Code plugin, adding some nice [diagnostic messages for PlusCal](https://github.com/tlaplus/vscode-tlaplus/pull/350). 43 | - [Ioannis Filippidis](https://github.com/johnyf) landed some long-awaited changes [adding support for bound tuple quantification](https://github.com/tlaplus/tlapm/pull/140) to the TLA⁺ Proof Manager (TLAPM), reviewed by [Damien Doligez](http://cambium.inria.fr/~doligez/). 44 | This enables TLAPM to parse quantification expressions that use tuple destructuring, like `∀ ⟨x, y⟩ ∈ ℕ × ℕ : x + y ∈ ℕ`. 45 | - We welcomed [Mathieu Borderé](https://github.com/MathieuBordere) as a new contributor as he landed [his first PR](https://github.com/tlaplus/tlaplus/pull/1067) in the TLA⁺ tools, improving command line help output for the parser! 46 | - Longtime TLA⁺ Tools maintainer [Markus Kuppe](https://github.com/lemmy) submitted many changes, focused on the TLA⁺ debugger ([1](https://github.com/tlaplus/tlaplus/issues/1052), [2](https://github.com/tlaplus/tlaplus/pull/1062)), miscellaneous bugfixes ([1](https://github.com/tlaplus/tlaplus/pull/825), [2](https://github.com/tlaplus/tlaplus/pull/1063), [3](https://github.com/tlaplus/tlaplus/pull/1066), [4](https://github.com/tlaplus/tlaplus/pull/1071), [5](https://github.com/tlaplus/tlaplus/pull/1078), [6](https://github.com/tlaplus/tlaplus/pull/1080), [7](https://github.com/tlaplus/tlaplus/pull/1086), [8](https://github.com/tlaplus/tlaplus/pull/1087)), and some design-level work on shortening & choosing counterexample traces ([1](https://github.com/tlaplus/tlaplus/issues/1084), [2](https://github.com/tlaplus/tlaplus/issues/400)). 47 | - [Finn Hackett](https://github.com/fhackett) found [an issue with TLC](https://github.com/tlaplus/tlaplus/issues/1076) where reading non-ASCII strings from disk causes a crash; [a fix](https://github.com/tlaplus/tlaplus/pull/1079) is pending review. 48 | 49 | Finally, things I worked on over the past month-and-a-half - all funded by the TLA⁺ Foundation: 50 | - I adapted [the TLA⁺ syntax test corpus](https://github.com/tlaplus/rfcs/tree/2a772d9dd11acec5d7dedf30abfab91a49de48b8/language_standard/tests/tlaplus_syntax) for use on TLAPM, which implements its own TLA⁺ parser in OCaml. 51 | These found [a number of issues](https://github.com/tlaplus/tlapm/pull/159) in the parser, and also resulted in me writing around fifty additional syntax tests which were backported to [the TLA⁺ Java-based tools](https://github.com/tlaplus/tlaplus/pull/1050) and [the tree-sitter-tlaplus grammar](https://github.com/tlaplus-community/tree-sitter-tlaplus/pull/131). 52 | - I investigated transitioning TLAPM's parser to use SANY, the Java-based TLA⁺ tools' parser. 53 | SANY has [an XML parse tree exporter](https://github.com/tlaplus/tlaplus/blob/master/tlatools/org.lamport.tlatools/src/tla2sany/xml/XMLExporter.java) which would avoid any FFI weirdness between OCaml and Java code. 54 | I submitted some fixes ([1](https://github.com/tlaplus/tlaplus/pull/1054), [2](https://github.com/tlaplus/tlaplus/pull/1057), [3](https://github.com/tlaplus/tlaplus/pull/1058)) to dust off the XML exporter and wrote [a prototype consumer](https://github.com/ahelwer/tlapm/blob/003f409442bc1fdf6622513ff63ad1fe16e78c97/test/sany/parse_sany_xml_output.ml) in OCaml for the XML output. 55 | After poking at the prospect of translating SANY's parse tree output to TLAPM's internal parse tree format for a couple of weeks, I'm thinking the project has a fairly high risk of dragging on without any intermediate milestones to lock in value. 56 | It remains to be seen whether the TLA⁺ Foundation will commit to it. 57 | I think there are some work possibilities that could smooth the way, for example by developing a large corpus of tests for SANY's semantic- and level-checkers to build familiarity with their workings. 58 | - I played at stepping into the TLAPM maintainer role, just making changes to the development infrastructure like [fixing a flaky CI build](https://github.com/tlaplus/tlapm/pull/179), adding [developer documentation](https://github.com/tlaplus/tlapm/pull/178), hunting for [ways to cut down the release size](https://github.com/tlaplus/tlapm/issues/181), and - most substantially - [setting up rolling pre-releases for TLAPM](https://github.com/tlaplus/tlapm/pull/182)! 59 | TLAPM hasn't seen an official numbered release for a couple of years now, so most people seem to build it from source to get the latest changes; this work just makes the built artifacts from the head of the main branch easily available for download. 60 | - I submitted a few one-off bugfixes and enhancements for the Java-based TLA⁺ tools: some [tests and fixes for the level-checker](https://github.com/tlaplus/tlaplus/pull/1068), and the [removal of a now-unused error logging path in the parser](https://github.com/tlaplus/tlaplus/pull/1069). 61 | - I wrote up a proposal for additional TLA⁺ standardization that has been rolling around my head for a bit, on [standardizing human-readable error codes](https://github.com/tlaplus/rfcs/issues/15) similar to Rust and C# and many other languages. 62 | I think the benefits would be wonderful, especially with regard to stimulating test coverage off the happy path. 63 | 64 | ## Newbie Corner 65 | 66 | Quite a bit of stuff going on in TLA⁺ development! 67 | Don't be intimidated though, there is plenty of room and desire for newcomers. 68 | Join the mailing list and monthly community meeting to introduce yourself if you'd like to join in! 69 | Here I will highlight one issue each month that I think would be good for new contributors. 70 | Before starting work, be sure to read the [contribution guidelines](https://github.com/tlaplus/tlaplus/blob/master/CONTRIBUTING.md) and discuss your planned approach with maintainers. 71 | 72 | This month it's [the inability of the TLA⁺ parser to handle backticks in strings](https://github.com/tlaplus/tlaplus/issues/802). 73 | The primary reason this is a good first issue is that the required change seems very localized and tremendously unlikely to introduce any bugs; the second reason is that it's in a very well-tested part of the codebase (the syntax parser), which has the [standard TLA⁺ syntax test corpus](https://github.com/tlaplus/rfcs/tree/2a772d9dd11acec5d7dedf30abfab91a49de48b8/language_standard/tests/tlaplus_syntax) levied against it - a corpus you will contribute to as part of the fix! 74 | I hope to see somebody pick this up in December! 75 | 76 | -------------------------------------------------------------------------------- /content/blog/2025-01-dev-update/index.md: -------------------------------------------------------------------------------- 1 | +++ 2 | type = "blog" 3 | title = 'January 2025 Monthly Development Update' 4 | date = 2025-01-15 5 | +++ 6 | 7 | You're reading the TLA⁺ Foundation monthly development update. 8 | Here we summarize the past month of development for the benefit of Foundation patrons and interested members of the community. 9 | While things did slow down over the holidays compared to [the blockbuster December update](/blog/2024-12-dev-update/), we do have some material to cover. 10 | If your contribution was missed or some important part of it that wasn't captured in the summary, worry not! 11 | These newsletters will be published monthly so it's easy to hop on the next train; open an issue [here](https://github.com/tlaplus/foundation/issues). 12 | 13 | If you're interested in getting involved in the TLA⁺ community: 14 | - Learn TLA⁺ starting [here](https://lamport.azurewebsites.net/tla/learning.html)! 15 | - Read the mailing list [here](https://groups.google.com/g/tlaplus)! 16 | - Join the monthly virtual community meetings [here](https://groups.google.com/g/tlaplus/c/CpAEnrf-DHQ/m/YrORpIfSBwAJ)! 17 | - Start hacking on the tools themselves [here](https://github.com/tlaplus/tlaplus)! 18 | 19 | Let's start with some interesting non-coding-related developments & announcements: 20 | - The [TLA⁺ Community Event 2025](https://conf.tlapl.us/2025-etaps/) talk submission deadline is coming up soon, on February 7th. 21 | The conference will be co-located with [ETAPS 2025](https://etaps.org/2025/) in Hamilton, Ontario, Canada on May 4th, 2025. 22 | Get your submissions in soon! 23 | - East of the Atlantic, [ABZ 2025](https://abz-conf.org/site/2025/) - the 11th International Conference on Rigorous State-Based Methods - will take place from June 10th to 13th of 2025 in Düsseldorf, Germany. 24 | TLA⁺-related submissions are welcome and the submission deadline is also fast approaching, on February 3rd. 25 | - [Murat Demirbas](https://cse.buffalo.edu/~demirbas/) wrote [a nice blog post](https://muratbuffalo.blogspot.com/2024/12/exploring-naiadclock-tla-model-in-tla.html) about using [tla-web](https://will62794.github.io/tla-web/#!/home?specpath=.%2Fspecs%2FTwoPhase.tla) to learn & explore an unfamiliar TLA⁺ spec. 26 | 27 | Now on to coding-related community developments: 28 | - [Federico Ponzi](https://fponzi.me/) and [Hillel Wayne](https://www.hillelwayne.com/) landed a number of bugfixes in the TLA⁺ VS Code extension, such as [fixing reporting of PlusCal labels](https://github.com/tlaplus/vscode-tlaplus/issues/352). 29 | - [Karolis Petrauskas](https://github.com/kape1395) wrote some fixes for the [TLA⁺ Proof Manager](https://github.com/tlaplus/tlapm) (TLAPM) parser, fixing [a bug](https://github.com/tlaplus/tlapm/pull/189) in the level-checker's handling of quantifier bounds and [another bug](https://github.com/tlaplus/tlapm/pull/191) in the semantic resolver's handling of `USE` statements. 30 | He also updated the TLA⁺ language server (which uses TLAPM's parser) to surface proof obligations [generated by `USE` steps](https://github.com/tlaplus/tlapm/pull/193), and fixed the long-lived [updated_enabled_cdot branch](https://github.com/tlaplus/tlapm/pull/148) to ensure it works with the LSP. 31 | - [Finn Hackett](https://github.com/fhackett) contributed [a fix](https://github.com/tlaplus/tlaplus/pull/1079) supporting the emerging use case of validating implementation logging data with TLC, the inverse of model-based testing where TLC generates traces that the system is driven along. 32 | This requires efficiently reading structured data into TLC, most often using the binary TLC state format. 33 | The [community modules](https://github.com/tlaplus/CommunityModules) expose de/serialization routines for this format. 34 | The fix enabled reading arbitrary string values from the state format, not only those that were generated during initial model checking and thus present in the string interning table. 35 | Finn also proposed an extension from the current ASCII string format to UTF-8. 36 | - Longtime TLA⁺ Tools maintainer [Markus Kuppe](https://github.com/lemmy) collaborated with Andrew Helwer on a PR to support [breakpoint expressions in the TLA⁺ debugger](https://github.com/tlaplus/tlaplus/pull/1099), explored finitizing specifications of monotonic systems, and investigated some fingerprint duplication issues arising during long-running model checking ([1](https://github.com/tlaplus/tlaplus/pull/1119), [2](https://github.com/tlaplus/tlaplus/pull/1115)). 37 | 38 | Finally, things [Andrew Helwer](https://ahelwer.ca/) (author of this post) worked on - all funded by the TLA⁺ Foundation! 39 | - The December community meeting had a long & spirited discussion about the future of the various TLA⁺ parsers (mostly about whether to transition all tools onto a single parser), so I attempted to capture these thoughts in [a long RFC](https://github.com/tlaplus/rfcs/issues/16). 40 | I also opened [a RFC](https://github.com/tlaplus/rfcs/issues/17) to get the ball rolling on standardizing the TLA⁺ file format, which in turn led to questions about the standardization process itself which I tried to summarize [here](https://github.com/tlaplus/rfcs/issues/1#issuecomment-2565920953). 41 | - December was all about getting familiar with the *semantic* part of the Java-based TLA⁺ parser, called SANY; I was already familiar with the syntax part due to past work [adding support for Unicode math symbols](https://ahelwer.ca/post/2024-05-28-tla-unicode/). 42 | To that end I collaborated with Markus Kuppe to add support for [breakpoint expressions in the TLA⁺ debugger](https://github.com/tlaplus/tlaplus/pull/1099), which required the novel functionality of adding new expressions to an existing model, at runtime. 43 | Beyond the actual value of the feature itself this was very helpful for developing my understanding of SANY's semantic & level-checking components, and even offered a tantalizing glimpse into the next level - the interpreter! 44 | - I contributed some minor fixes to SANY such as removing some annoying global static state ([1](https://github.com/tlaplus/tlaplus/pull/1100), [2](https://github.com/tlaplus/tlaplus/pull/1101), [3](https://github.com/tlaplus/tlaplus/pull/1106)) and converting some existing unit test corpuses to use JUnit's parameterized test functionality ([1](https://github.com/tlaplus/tlaplus/pull/1107), [2](https://github.com/tlaplus/tlaplus/pull/1108)). 45 | - I [started prototyping](https://codeberg.org/tlaplus/simple-checker/src/commit/5641793467fafcf86b261be3db6e6d39a21a658f/app/src/main/java/us/tlapl/Parser.java) what a modern SANY API would look like; with the discussion of transitioning TLAPM onto SANY, and with two existing consumers from [Apalache](https://github.com/apalache-mc/apalache/) and the [tlaplus-formatter](https://github.com/FedericoPonzi/tlaplus-formatter), the day is dawning where SANY isn't just something used by the TLC model-checker. 46 | There's even demand from TLC itself for a more flexible SANY API, as we found with the debugger work. 47 | This month will be all about building a semantic test corpus to drive the design of this API, which I hope will be finalized shortly thereafter. 48 | 49 | ## Newbie Corner 50 | 51 | Here we pick one issue to highlight that would be a good choice for new contributors! 52 | Before starting work, be sure to read the [contribution guidelines](https://github.com/tlaplus/tlaplus/blob/master/CONTRIBUTING.md) and discuss your planned approach with maintainers. 53 | 54 | This month it's [fixing the PlusCal CLI `-labelRoot` option](https://github.com/tlaplus/tlaplus/issues/1092) (update: this issue has now been fixed). 55 | PlusCal is a language that automatically transpiles to TLA⁺. 56 | The CLI exposes a few parameters to control this output, and one of them determines the name of the root next-state relation; this parameter wrongfully accepts arbitrary string input instead of ensuring the given name is a valid TLA⁺ identifier. 57 | The fix would require raising an error in the parameter parsing function if the user provides an invalid identifier. 58 | 59 | Last month's [highlighted starter issue](blog/2024-12-dev-update/#newbie-corner) has not yet been claimed; it's also a good choice! 60 | 61 | -------------------------------------------------------------------------------- /content/blog/2025-02-dev-update/index.md: -------------------------------------------------------------------------------- 1 | +++ 2 | type = "blog" 3 | title = 'February 2025 Monthly Development Update' 4 | date = 2025-02-15 5 | +++ 6 | 7 | You're reading the TLA⁺ Foundation monthly development update. 8 | Here we summarize the past month of development for the benefit of Foundation patrons and interested members of the community. 9 | We will also highlight a good bug or small feature for prospective new contributors to look at! 10 | If your TLA⁺ contribution was missed or some important part of it that wasn't captured in the summary, worry not - 11 | these newsletters will be published monthly, so it's easy to hop on the next train; open an issue [here](https://github.com/tlaplus/foundation/issues). 12 | 13 | If you're interested in getting involved in the TLA⁺ community: 14 | - Learn TLA⁺ starting [here](https://lamport.azurewebsites.net/tla/learning.html)! 15 | - Join the monthly virtual community meetings [here](https://groups.google.com/g/tlaplus/c/3CloQYEH0qQ/m/GAIxbKNgBAAJ)! 16 | - Read the mailing list [here](https://groups.google.com/g/tlaplus)! 17 | - Start hacking on the tools themselves [here](https://github.com/tlaplus/tlaplus)! 18 | 19 | Let's start with some interesting non-coding-related developments & announcements: 20 | - The [TLA⁺ Community Event 2025](https://conf.tlapl.us/2025-etaps/) will be co-located with [ETAPS 2025](https://etaps.org/2025/) in Hamilton, Ontario, Canada on May 4th, 2025. 21 | The talk submission deadline is Friday, February 28th; hopefully we'll have some great talks in store and we look forward to seeing you there! 22 | - The TLA⁺ Foundation grant program is continuing on a rolling basis; please [submit a proposal](/grants/2024-grant-program/) if you have ideas to improve TLA⁺ so the Foundation can support you financially as you work on them. 23 | - In Europe, [ABZ 2025](https://abz-conf.org/site/2025/) - the 11th International Conference on Rigorous State-Based Methods - will take place from June 10th to 13th of 2025 in Düsseldorf, Germany and will hopefully have some TLA⁺-related talks. 24 | - [Hillel Wayne](https://www.hillelwayne.com/) wrote [a post](https://buttondown.com/hillelwayne/archive/what-are-the-rosettas-of-formal-specification/) exploring the idea of "Rosetta problems" for formal specification - common simple problems for comparing different formal specification languages by looking at how each language solves each problem. 25 | 26 | Now on to coding-related community developments: 27 | - [Calvin Loncaric](https://calvin.loncaric.us/) ran [some benchmarks](https://github.com/tlaplus/rfcs/issues/16#issuecomment-2563975827) on the SANY TLA⁺ parser and found latency could be greatly improved by using [Graal native images](https://www.graalvm.org/22.1/reference-manual/native-image/index.html). 28 | He contributed [a fix](https://github.com/tlaplus/tlaplus/pull/1116) to SANY's dependency loading code so it works with TLA⁺ modules embedded within the images, also taking the opportunity to improve the code's clarity ([1](https://github.com/tlaplus/tlaplus/pull/1127), [2](https://github.com/tlaplus/tlaplus/pull/1124)). 29 | Latency is important to consider as more applications move to consume SANY as a dependency. 30 | - [Stephan Merz](https://members.loria.fr/SMerz/) explored using TLA⁺'s proof language to analyze monotonic systems. 31 | Distributed system designs commonly use monotonicity with elements like increment-only counters or append-only logs. 32 | Monotonic systems have an unbounded state space so are difficult to analyze with finite model-checking. 33 | Stephan [proved convergence of a conflict-free replicated datatype](https://github.com/tlaplus/Examples/pull/153#issuecomment-2649586427) and validated the proof using [TLAPM](https://github.com/tlaplus/tlapm). 34 | - [Federico Ponzi](https://fponzi.me/) contributed [a fix](https://github.com/tlaplus/vscode-tlaplus/pull/362) for erroneous syntax highlighting in the TLA⁺ VSCode extension, ensuring operator definitions are not highlighted inside comments. 35 | While a tree-sitter grammar for TLA⁺ [does exist](https://github.com/tlaplus-community/tree-sitter-tlaplus/), VSCode [does not support it](https://github.com/microsoft/vscode/issues/50140) and so it is necessary to maintain a regex-based TextMate grammar for syntax highlighting. 36 | - [William Schultz](https://will62794.github.io/) made a number of updates to [spectacle](https://github.com/will62794/spectacle), a JavaScript-based interpreter for TLA⁺ previously known as tla-web. 37 | In particular, support was added for calling operators in modules imported as instances. 38 | - [Karolis Petrauskas](https://github.com/kape1395) landed [a fix](https://github.com/tlaplus/tlapm/pull/194) for a race condition in the TLA⁺ language server when running multiple concurrent TLAPM backend provers. 39 | He also looked into strangely long processing times in the TLAPM parser ([1](https://github.com/tlaplus/tlapm/pull/148#issuecomment-2558607669), [2](https://github.com/tlaplus/tlapm/pull/186)); the level-checker turned out to be the culprit, exhibiting exponential-time behavior on some inputs. 40 | - [Damien Doligez](http://cambium.inria.fr/~doligez/) worked on [speeding up the TLAPM level-checking process using memoization](https://github.com/tlaplus/tlapm/pull/198). 41 | - [Julia Ferraioli](https://www.juliaferraioli.com/) had previously submitted TLA⁺ for inclusion in the [Amazon Web Services Open Source Credits Program](https://aws.amazon.com/blogs/opensource/aws-promotional-credits-open-source-projects/). 42 | It was [recently accepted](https://github.com/tlaplus/tlaplus/issues/864#issuecomment-2578225917), so [Finn Hackett](https://github.com/fhackett) and [Markus Kuppe](https://github.com/lemmy) worked to revive performance tests for the TLC model checker! 43 | - Longtime TLA⁺ Tools maintainer [Markus Kuppe](https://github.com/lemmy) continued investigation of fingerprint duplication issues arising during long-running model checking ([1](https://github.com/tlaplus/tlaplus/pull/1122), [2](https://github.com/tlaplus/tlaplus/pull/1137)), fixed a bug with TLC [using the wrong value in parameterized spec instances](https://github.com/tlaplus/tlaplus/pull/1139), and investigated lasso-shaped liveness examples [failing to reconstruct](https://github.com/tlaplus/tlaplus/pull/1111) when a `VIEW` is defined. 44 | 45 | Finally, things [Andrew Helwer](https://ahelwer.ca/) (author of this post) worked on - all funded by the TLA⁺ Foundation! 46 | - I worked with [Calvin Loncaric](https://calvin.loncaric.us/) to [design a new API for the SANY TLA⁺ parser](https://github.com/tlaplus/tlaplus/pull/1125), supporting emerging use-cases and setting us up to easily expose more capabilities in the future. 47 | - The bulk of my time went toward developing a [semantic test corpus for TLA⁺](https://github.com/tlaplus/tlaplus/pull/1133): a large set of implementation-independent test files filled with assertions about semantic properties like identifier resolution and expression level (roughly analogous to type-checking) which various TLA⁺ tools can adopt to verify conformance with the language specification. 48 | This sort of work is dull, slow, and seemingly endless - but I know from experience how wonderful it is to have an existing test corpus to rely on & add to over time! 49 | At this point the tests cover most of the important parts of the language, although there are always more cases to consider. 50 | - I did some [testing & refactoring](https://github.com/tlaplus/tlaplus/pull/1135) of SANY's error reporting machinery to facilitate future implementation of [standardized error codes](https://github.com/tlaplus/rfcs/issues/15) in TLA⁺ parsing. 51 | In addition to the clear usability improvement of including such codes in user-visible error messages for reference, they would enable development of a negative counterpart to the semantic test corpus: a set of specifications which should each trigger a specific error code when parsed. 52 | - I did some minor refactoring of existing SANY tests ([1](https://github.com/tlaplus/tlaplus/pull/1129), [2](https://github.com/tlaplus/tlaplus/pull/1131)) using JUnit's class parameterization & assume functionality to control test execution. 53 | - I wrote two RFCs proposing un-contentious changes to the TLA⁺ language standard ([1](https://github.com/tlaplus/rfcs/issues/18), [2](https://github.com/tlaplus/rfcs/issues/19)). 54 | While both RFCs address issues that ought to be definitively decided, I think they are primarily useful as exercises for figuring out what the full end-to-end language standard update process *actually is*. 55 | We can then apply that same process to more-exciting RFCs, like [combining set map & filter into a single language construct](https://github.com/tlaplus/rfcs/issues/10)! 56 | 57 | ## Newbie Corner 58 | 59 | Here we highlight an issue that would be a good choice for new contributors! 60 | Before starting work, be sure to read the [contribution guidelines](https://github.com/tlaplus/tlaplus/blob/master/CONTRIBUTING.md) and discuss your planned approach with maintainers. 61 | 62 | This one is a bit more advanced than past months, but hopefully someone can rise to the challenge: we want TLC to [interpret expressions of the form `CHOOSE x : x ∈ S`](https://github.com/tlaplus/tlaplus/issues/619). 63 | Ordinarily this would be an unbounded choose error, but *this specific form* of the expression is obviously bounded (the bound is just given in the body!) and is much nicer to write than the clunky `CHOOSE x ∈ S : TRUE`. 64 | 65 | To solve this issue you will need to: 66 | 1. Figure out where TLC raises the unbounded choose error 67 | 2. Modify the logic to first check whether the choose body is just the `∈` infix operator, defining an expression of the form `x ∈ S` 68 | 3. If so, evaluate the choose expression as though the bound is `S` instead of raising an error 69 | 70 | As a bonus you can extend this work to support larger sets of reasonable expressions, like `CHOOSE x : x ∈ S ∧ …`. 71 | 72 | Issues highlighted in past months have also yet to be claimed! 73 | - January 2025: [fix the PlusCal CLI `-labelRoot` option](blog/2025-01-dev-update/#newbie-corner) 74 | - December 2024: [add parser support for backticks in strings](blog/2024-12-dev-update/#newbie-corner) 75 | 76 | -------------------------------------------------------------------------------- /content/blog/2025-03-dev-update/index.md: -------------------------------------------------------------------------------- 1 | +++ 2 | type = "blog" 3 | title = 'March 2025 Monthly Development Update' 4 | date = 2025-03-15 5 | +++ 6 | 7 | This is the TLA⁺ Foundation monthly development update ([subscribe via RSS](/blog/index.xml)). 8 | Here we summarize the past month of development for the benefit of Foundation patrons and interested members of the community. 9 | We will also highlight a good bug or small feature for prospective new contributors to look at! 10 | If your TLA⁺ contribution was missed, worry not - we publish monthly, so it's easy to hop on the next train; open an issue [here](https://github.com/tlaplus/foundation/issues). 11 | 12 | If you're interested in getting involved in the TLA⁺ community: 13 | - Learn TLA⁺ starting [here](https://lamport.azurewebsites.net/tla/learning.html)! 14 | - Join the monthly virtual community meetings [here](https://groups.google.com/g/tlaplus/c/3CloQYEH0qQ/m/GAIxbKNgBAAJ)! 15 | - Read the mailing list [here](https://groups.google.com/g/tlaplus)! 16 | - Start hacking on the tools themselves [here](https://github.com/tlaplus/tlaplus)! 17 | 18 | Let's start with some organizational, conference, blog post, and user-side TLA⁺ happenings: 19 | - The [TLA⁺ Community Event 2025](https://conf.tlapl.us/2025-etaps/) will be co-located with [ETAPS 2025](https://etaps.org/2025/) in Hamilton, Ontario, Canada on May 4th, 2025. 20 | Hope to see you there! 21 | - The TLA⁺ Foundation grant program is continuing on a rolling basis; please [submit a proposal](/grants/2024-grant-program/) if you have ideas to improve TLA⁺ so the Foundation can support you financially as you work on them. 22 | - [Concur 2025](https://conferences.au.dk/confest2025/concur), the 36th International Conference on Concurrency Theory, will take place August 25-30, 2025, at the University of Aarhus, Denmark. 23 | TLA⁺-related papers are [being solicited](https://groups.google.com/g/tlaplus/c/2k4EJQ-4ZZg/m/NtDIKZmvAQAJ). 24 | The abstract submission deadline is April 3rd. 25 | - [Hillel Wayne](https://www.hillelwayne.com/) wrote [a post](https://buttondown.com/hillelwayne/archive/five-kinds-of-nondeterminism/) categorizing kinds of nondeterminism commonly encountered or used when formally specifying a system. 26 | - [Marc Brooker](https://brooker.co.za/blog/) and [Ankush Desai](https://ankushdesai.github.io/) published a paper titled [*Systems Correctness Practices at AWS: Leveraging Formal and Semi-formal Methods*](https://dl.acm.org/doi/10.1145/3712057), an update of the now-decade-old paper [*How Amazon Web Services uses formal methods*](https://www.amazon.science/publications/how-amazon-web-services-uses-formal-methods). 27 | TLA⁺ is mentioned, along with a diverse array of other formal methods tools; there is a clear trend toward use of deterministic simulation testing (in various flavors) to analyze correctness at the implementation level. 28 | - The paper [*Smart Casual Verification of the Confidential Consortium Framework*](https://www.microsoft.com/en-us/research/publication/smart-casual-verification-of-ccfs-distributed-consensus-and-consistency-protocols/) by [Heidi Howard](https://www.microsoft.com/en-us/research/people/heidihoward/), [Markus Kuppe](https://www.microsoft.com/en-us/research/people/makuppe/), [Eddy Ashton](https://www.microsoft.com/en-us/research/people/edashton/), [Amaury Chamayou](https://www.microsoft.com/en-us/research/people/amchamay/), and Natacha Crooks was accepted into [USENIX NSDI 2025](https://www.usenix.org/conference/nsdi25). 29 | The paper details the method of binding a formal TLA⁺ specification to a C++ implementation of the [Confidential Consortium Framework](https://en.wikipedia.org/wiki/Confidential_Consortium_Framework). 30 | 31 | Now on to coding-related community developments: 32 | - [Calvin Loncaric](https://calvin.loncaric.us/) did some work on the Java-based TLA⁺ interpreter, fixing a recently-discovered [bug](https://github.com/tlaplus/tlaplus/issues/1145) occurring when TLA⁺ functions using `EXCEPT` are coerced into sequences, and performing [some refactoring](https://github.com/tlaplus/tlaplus/pull/1148) of lazy evaluation code. 33 | - [Stephan Merz](https://members.loria.fr/SMerz/) fixed a number ([1](https://github.com/tlaplus/Examples/pull/158), [2](https://github.com/tlaplus/Examples/pull/159), [3](https://github.com/tlaplus/Examples/pull/159), [4](https://github.com/tlaplus/Examples/pull/163)) of proofs in the [tlaplus/examples](https://github.com/tlaplus/examples) repository that were failing in the new [rolling TLAPM pre-release](https://github.com/tlaplus/tlapm/releases/tag/1.6.0-pre). 34 | - [William Schultz](https://will62794.github.io/) worked on his web-based [spectacle TLA⁺ interpreter](https://github.com/will62794/spectacle), improving support for lambda operators and module instance variable substitutions; this was motivated by writing a TLA⁺ specification of [MongoDB's distributed cross-shard transaction protocol](https://github.com/muratdem/MDBTLA/tree/f20b65bbaa21f57f9244528fc28d023fb9811317/MultiShardTxn). 35 | - [rozlynd](https://github.com/rozlynd) contributed [a fix](https://github.com/tlaplus/tlapm/pull/202) for a TLAPM soundness bug involving tuples and `EXCEPT` originally reported by [Uğur Yavuz](https://www.uguryav.uz/). 36 | It's been a rough month for tuples/sequences and the `EXCEPT` keyword! 37 | - [domodwyer](https://github.com/domodwyer) released a [TLA⁺ formatter tool](https://github.com/domodwyer/tlafmt) written in Rust, using the [TLA⁺ tree-sitter grammar](https://github.com/tlaplus-community/tree-sitter-tlaplus) as the parser backend. 38 | That makes a second TLA⁺ formatting tool in existence, including the [Java-based one](https://github.com/FedericoPonzi/tlaplus-formatter)! 39 | It is heartening to see a proliferation of community-written development tooling for TLA⁺. 40 | - [s12f](https://github.com/s12f) contributed some fixes for TLA⁺ Unicode tooling, ensuring the TLA⁺ Unicode Converter tool [preserves end-of-file newlines](https://github.com/tlaplus-community/tlauc/pull/20) and activating the TLA⁺ Neovim Plugin when [opening a new file](https://github.com/tlaplus-community/tlaplus-nvim-plugin/pull/6). 41 | - [Ana Catarina Ribeiro](https://github.com/acm-ribeiro) enhanced TLC state graph output by [including model values in transition labels](https://github.com/tlaplus/tlaplus/pull/1147), as part of using TLA⁺ in a [testing strategy for microservices](https://github.com/acm-ribeiro/state-space-graph); the PR was later merged [with modifications by Markus Kuppe](https://github.com/tlaplus/tlaplus/pull/1158). 42 | - Longtime TLA⁺ Tools maintainer [Markus Kuppe](https://github.com/lemmy) fixed & updated a TLA⁺ example for [finitizing monotonic systems](https://github.com/tlaplus/Examples/pull/155), expanded debug logging [when deserializing states in TLC](https://github.com/tlaplus/tlaplus/pull/1155/), expanded TLC debugger support for [expressions as breakpoint filters](https://github.com/tlaplus/tlaplus/pull/1156), and [fixed](https://github.com/tlaplus/vscode-tlaplus/commit/06da33c124260263ddf3ffe8d7b600bbbd886e95) the VS Code TLA⁺ Extension upload process to open-vsx.org. 43 | 44 | Finally, things [Andrew Helwer](https://ahelwer.ca/) (author of this post) worked on - all funded by the TLA⁺ Foundation! 45 | - I created a [semantic error test corpus](https://github.com/tlaplus/tlaplus/pull/1140) for TLA⁺, a large set of small TLA⁺ files that should each trigger a specific [standardized parse error](https://github.com/tlaplus/rfcs/issues/15). 46 | This corpus was developed by finding all locations in the Java-based SANY TLA⁺ parser where a parse error is reported, then attempting to reverse-engineer a parse input triggering that error. 47 | This greatly improves SANY test coverage, and also serves as an implementation-independent behavior standard for other TLA⁺ parsers to adopt. 48 | - I supported Markus's work on updating the monotonic systems examples by adding some features ([1](https://github.com/tlaplus/Examples/pull/156), [2](https://github.com/tlaplus/Examples/pull/157)) to the TLA⁺ examples automated validation tooling, and also [expanded documentation](https://github.com/tlaplus/Examples/pull/164) to hopefully reduce the difficulty of contributing example specifications. 49 | 50 | ## Newbie Corner 51 | 52 | Here we highlight an issue that would be a good choice for new contributors! 53 | Before starting work, be sure to read the [contribution guidelines](https://github.com/tlaplus/tlaplus/blob/master/CONTRIBUTING.md) and discuss your planned approach with maintainers. 54 | 55 | This one is substantial, similar in genre to last month: extending the Java-based TLA⁺ interpreter to handle a wider variety of expressions. 56 | Calvin Loncaric [proposed](https://github.com/tlaplus/tlaplus/issues/336) allowing `\subseteq`/`⊆` in TLA⁺ next-state relations; currently the interpreter only supports the logically-equivalent `∈ SUBSET` operator. 57 | This work could also be easily extended to support the `\subset`/`⊂` operator (without equality). 58 | Similar to last month, the high-level steps required to implement this feature are: 59 | 1. Figure out where TLC implements the `∈` functionality for next-state relations, while disallowing operators like `\subseteq`/`⊆`. 60 | 1. Modify the logic to translate `⊆` to an execution form equivalent to `∈ SUBSET`. 61 | 1. Write tests to validate these changes. 62 | 63 | Issues highlighted in past months have also yet to be claimed! 64 | - February 2025: [interpret expressions of the form `CHOOSE x : x ∈ S`](blog/2025-02-dev-update/#newbie-corner) 65 | - January 2025: [fix the PlusCal CLI `-labelRoot` option](blog/2025-01-dev-update/#newbie-corner) 66 | - December 2024: [add parser support for backticks in strings](blog/2024-12-dev-update/#newbie-corner) 67 | 68 | -------------------------------------------------------------------------------- /content/blog/2025-04-dev-update/index.md: -------------------------------------------------------------------------------- 1 | +++ 2 | type = "blog" 3 | title = 'April 2025 Monthly Development Update' 4 | date = 2025-04-15 5 | +++ 6 | 7 | This is the TLA⁺ Foundation monthly development update ([subscribe via RSS](/blog/index.xml)). 8 | Here we summarize the past month of development for the benefit of Foundation patrons and interested members of the community. 9 | We will also highlight a good bug or small feature for prospective new contributors to look at! 10 | If your TLA⁺ contribution was missed, worry not - we publish monthly, so it's easy to hop on the next train; open an issue [here](https://github.com/tlaplus/foundation/issues). 11 | 12 | If you're interested in getting involved in the TLA⁺ community: 13 | - Learn TLA⁺ starting [here](https://lamport.azurewebsites.net/tla/learning.html)! 14 | - Join the monthly virtual community meetings [here](https://groups.google.com/g/tlaplus/c/3CloQYEH0qQ/m/GAIxbKNgBAAJ)! 15 | - Read the mailing list [here](https://groups.google.com/g/tlaplus)! 16 | - Start hacking on the tools themselves [here](https://github.com/tlaplus/tlaplus)! 17 | 18 | ### Organization & user updates 19 | 20 | - The program for the [TLA⁺ Community Event 2025](https://conf.tlapl.us/2025-etaps/) has now been announced! 21 | It will be co-located with [ETAPS 2025](https://etaps.org/2025/) in Hamilton, Ontario, Canada on May 4th, 2025. 22 | Hope to see you there! 23 | - The TLA⁺ Foundation grant program is continuing on a rolling basis; please [submit a proposal](/grants/2024-grant-program/) if you have ideas to improve TLA⁺ so the Foundation can support you financially as you work on them. 24 | - TLA⁺ Foundation patron Amazon has appointed a new representative to the TLA⁺ Foundation board! 25 | [Ankush Desai](https://ankushdesai.github.io/) is a Principal Applied Scientist at AWS and one of the original developers of the [P formal specification language](https://p-org.github.io/P/). 26 | He recently co-authored a paper on [formal methods use in AWS](https://dl.acm.org/doi/10.1145/3712057) and [delivered a talk on the same topic](https://www.linkedin.com/posts/antithesis-operations_bugbash-activity-7313942545464467456-jJf3). 27 | TLA⁺ is sure to benefit from his advice and experience! 28 | 29 | ### Community TLA⁺ tooling updates 30 | 31 | Work done by community members on non-TLA⁺ Foundation-managed projects: 32 | - [Dom Dwyer](https://github.com/domodwyer) worked extensively on his new Rust-based [TLA⁺ formatter tool](https://github.com/domodwyer/tlafmt). 33 | - [William Schultz](https://will62794.github.io/) worked on his web-based [spectacle TLA⁺ interpreter](https://github.com/will62794/spectacle), adding an animated Raft example and making many tweaks to the UI. 34 | - [Ioannis Filippidis](https://github.com/johnyf) released a new [TLA⁺ syntax parser](https://pypi.org/project/tla/), written in Python. 35 | The source code can be obtained by downloading & extracting the package file. 36 | - [Hillel Wayne](https://www.hillelwayne.com/) began development of [a set of exercises](https://github.com/hwayne/tlaplus-exercises) to help people learn TLA⁺. 37 | The exercises are all designed with the aim of automatically verifying attempted solutions. 38 | 39 | ### Core TLA⁺ tooling updates 40 | 41 | Work done by community members on TLA⁺ Foundation-managed projects: 42 | - [Karolis Petrauskas](https://github.com/kape1395) added another feature to the [TLAPM-based](https://github.com/tlaplus/tlapm) TLA⁺ language server, [supporting renaming proof steps](https://github.com/tlaplus/tlapm/pull/208). 43 | - First-time contributor [Krishna Padmasola](https://github.com/kpadmasola) added validation for the [`-labelRoot` PlusCal command-line parameter](https://github.com/tlaplus/tlaplus/pull/1164), fixing a bug featured in the January 2025 edition of this newsletter. 44 | - Another first-time contributor [Bruno Felipe Francisco](https://poorlydefinedbehaviour.github.io/) fixed a longstanding bug in the TLA⁺ VS Code extension, adding support for [identifying parameterized constants](https://github.com/tlaplus/vscode-tlaplus/pull/366) as possible symbols for autocompletion and other operations. 45 | - [Federico Ponzi](https://fponzi.me/) worked on the TLA⁺ VS Code extension, [linking directly to error locations in the code](https://github.com/tlaplus/vscode-tlaplus/pull/363) when possible and tweaking the counterexample UI ([1](https://github.com/tlaplus/vscode-tlaplus/pull/365), [2](https://github.com/tlaplus/vscode-tlaplus/pull/354)). 46 | 47 | ### TLA⁺ Foundation-funded updates 48 | 49 | Finally, things [Andrew Helwer](https://ahelwer.ca/) (author of this post) worked on - all funded by the TLA⁺ Foundation! 50 | - After spending the past few months doing a lot of testing & exploration of the various TLA⁺ parsers, I am writing a guide to distill this knowledge for others. 51 | The tutorial series [*Create your own TLA⁺ tools*](https://docs.tlapl.us/creating:start) will teach you how to write TLA⁺ language tooling for a minimal vertical slice of the language (just enough to handle the generalized Die Hard spec, with some inconvenience). 52 | The purpose of the guide is to prepare contributors to make serious contributions to the existing TLA⁺ language tools, by writing their own simple prototype and then contrasting it with the existing implementations. 53 | - I [attempted](https://github.com/tlaplus/tlaplus/issues/880#issuecomment-2744440311) (unsuccessfully) to get the Eclipse-based TLA⁺ Toolbox GUI to build using the [TLA⁺ tools Maven package](https://oss.sonatype.org/content/repositories/snapshots/org/lamport/tla2tools/), so we can split the Toolbox out into its own repository. 54 | If you're reading this and know anything about the OSGi build process, your help would be greatly appreciated! 55 | - I combined some repos and collected TLA⁺ standards documents into the [RFCs repo](https://github.com/tlaplus/rfcs), to be used as a one-stop shop for the TLA⁺ language standard, conformance test suites, and RFC status tracking. 56 | 57 | ### Newbie Corner 58 | 59 | Here we highlight an issue that would be a good choice for new contributors! 60 | Before starting work, be sure to read the [contribution guidelines](https://github.com/tlaplus/tlaplus/blob/master/CONTRIBUTING.md) and discuss your planned approach with maintainers. 61 | 62 | This time we're looking at PlusCal, a language which transpiles into TLA⁺. 63 | The transpilation process includes logic to insert linebreaks so the output TLA⁺ is readable. 64 | Unfortunately, in one case this logic has gone awry and results in [invalid TLA⁺ output on long procedure names](https://github.com/tlaplus/tlaplus/issues/370)! 65 | 66 | There is an [old PR](https://github.com/tlaplus/tlaplus/pull/634) (not merged for some reason or another) which might contain the simple fix necessary. 67 | So, the work required is to evaluate the PR change to see whether it indeed fixes the issue, then find a way to write an automated test for it. 68 | Try various modifications of the reported failing test case to ensure that close input variants don't elude your fix. 69 | Resubmit the combined changes in your own PR with credit to the original, using the `Co-authored-by:` git commit message trailer. 70 | 71 | Issues highlighted in past months have also yet to be claimed! 72 | - March 2025: [interpret expressions of the form `x' ⊆ S`](blog/2025-03-dev-update/#newbie-corner) 73 | - February 2025: [interpret expressions of the form `CHOOSE x : x ∈ S`](blog/2025-02-dev-update/#newbie-corner) 74 | - December 2024: [add parser support for backticks in strings](blog/2024-12-dev-update/#newbie-corner) 75 | 76 | The following past highlighted issues have now been fixed: 77 | - Highlighted January 2025, fixed April 2025: [Krishna Padmasola](https://github.com/kpadmasola) completed [fix the PlusCal CLI `-labelRoot` option](blog/2025-01-dev-update/#newbie-corner) 78 | 79 | -------------------------------------------------------------------------------- /content/blog/2025-05-dev-update/index.md: -------------------------------------------------------------------------------- 1 | +++ 2 | type = "blog" 3 | title = 'May 2025 Monthly Development Update' 4 | date = 2025-05-15 5 | +++ 6 | 7 | This is the TLA⁺ Foundation monthly development update ([subscribe via RSS](/blog/index.xml)). 8 | Here we summarize the past month of development for the benefit of Foundation patrons and interested members of the community. 9 | We will also highlight a good bug or small feature for prospective new contributors to look at! 10 | If your TLA⁺ contribution was missed, worry not - we publish monthly, so it's easy to hop on the next train; open an issue [here](https://github.com/tlaplus/foundation/issues). 11 | 12 | If you're interested in getting involved in the TLA⁺ community: 13 | - Learn TLA⁺ starting [here](https://lamport.azurewebsites.net/tla/learning.html)! 14 | - Join the monthly virtual community meetings [here](https://groups.google.com/g/tlaplus/c/3CloQYEH0qQ/m/GAIxbKNgBAAJ)! 15 | - Read the mailing list [here](https://groups.google.com/g/tlaplus)! 16 | - Start hacking on the tools themselves [here](https://github.com/tlaplus/tlaplus)! 17 | 18 | ### Organizational Updates 19 | 20 | - The [2025 TLA⁺ Community Event](https://conf.tlapl.us/2025-etaps/) was held alongside [ETAPS 2025](https://etaps.org/2025/) in Hamilton, Ontario, Canada on May 4th, 2025. 21 | We had a good slate of talks, and the recordings have now been posted. 22 | Thanks to the organizers [Igor Konnov](https://konnov.phd/), [Markus Kuppe](https://github.com/lemmy/), [Murat Demirbas](https://cse.buffalo.edu/~demirbas/), and [Stephan Merz](https://members.loria.fr/SMerz/index.html) for putting on a great conference! 23 | - The TLA⁺ Foundation, in collaboration with NVIDIA, is holding a [GenAI-Accelerated TLA⁺ Challenge](https://foundation.tlapl.us/challenge/)! 24 | This is an open call for submissions exploring the intersection of TLA⁺ and generative AI. 25 | Entries must be submitted by July 3rd, 2025 and will be judged by the TLA⁺ Specification Language Committee. 26 | First place wins a NVIDIA RTX 5090 GPU! 27 | - The TLA⁺ Foundation grant program is continuing on a rolling basis; please [submit a proposal](/grants/2024-grant-program/) if you have ideas to improve TLA⁺ so the Foundation can support you financially as you work on them. 28 | You can find some desired projects listed [here](https://github.com/tlaplus/tlaplus/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22TLA%2B%20Foundation%20Funding%22). 29 | If you're trying to figure out the next stage of your career and like the sound of being paid a stipend to work on free & open source software in the formal methods space, this is a great opportunity! 30 | 31 | ### Posts & Papers 32 | 33 | - [Heidi Howard](http://www.heidihoward.co.uk/) was at NSDI '25 to present [*Smart Casual Verification of the Confidential Consortium Framework*](https://www.usenix.org/conference/nsdi25/presentation/howard), reporting the experience of binding a formal TLA⁺ specification to a C++ implementation. 34 | - [Derek Egolf](https://www.egolf.io/) was at ETAPS 2025 to present [*Accelerating Protocol Synthesis and Detecting Unrealizability with Interpretation Reduction*](https://link.springer.com/chapter/10.1007/978-3-031-90653-4_8), on his work to automatically synthesize a TLA⁺ specification satisfying a temporal property. 35 | - [Hillel Wayne](https://www.hillelwayne.com/) wrote [a post](https://buttondown.com/hillelwayne/archive/requirements-change-until-they-dont/) on why specifying your system with formal methods makes sense even though system requirements are apt to change. 36 | - [Igor Konnov](https://konnov.phd) wrote [a post](https://protocols-made-fun.com/modelchecking/2025/04/08/value.html) on the value of formal specification & model checking when designing & analyzing protocols. 37 | - [Murat Demirbas](https://cse.buffalo.edu/~demirbas/) wrote [a blog post](https://muratbuffalo.blogspot.com/2025/05/modular-verification-of-mongodb.html) version of his talk at the TLA⁺ community event, on using TLA⁺ to specify cross-shard transactions in MongoDB. 38 | He also wrote a post [summarizing other talks](https://muratbuffalo.blogspot.com/2025/05/notes-from-tla-community-event.html) from the event. 39 | - [A. Jesse Jiryu Davis](https://emptysqua.re/blog/about/) wrote [a blog post](https://emptysqua.re/blog/are-we-serious-about-statistical-properties-tlaplus/) version of his TLA⁺ community event talk, on the possibility of adding statistical & performance modeling capabilities to TLA⁺. 40 | He also posted [his notes](https://emptysqua.re/blog/2025-tlaplus-community-event/) about other talks at the event. 41 | - [Andrew Helwer](https://ahelwer.ca) also [wrote a blog post](https://ahelwer.ca/post/2025-05-15-tla-dev-status/) version of his TLA⁺ community event talk, on the current state of TLA⁺ development and why now is a good time to get into developing TLA⁺ language tooling. 42 | 43 | ### Community TLA⁺ Tooling Updates 44 | 45 | Work done by community members on non-TLA⁺ Foundation-managed projects: 46 | - [Igor Konnov](https://konnov.phd/) added some additional inductive invariant [test cases](https://github.com/apalache-mc/apalache/commit/14c11be5dad94154f6216fed2c387390aa105c29) to the Apalache symbolic model checker. 47 | - [Federico Ponzi](https://fponzi.me/) updated tlaplus-formatter [to reflect an upstream SANY API change](https://github.com/FedericoPonzi/tlaplus-formatter/pull/10) and debugged some issues with handling of TLAPS modules. 48 | - [Hillel Wayne](https://www.hillelwayne.com/) added some more exercises ([1](https://github.com/hwayne/tlaplus-exercises/commit/bb4b407302633510bd7fb12430e473a14f4b8cd3), [2](https://github.com/hwayne/tlaplus-exercises/commit/93dbe922a1ecf26f2801c3ef968dcf668d786322)) building his series intended to help people learn TLA⁺. 49 | - [William Schultz](https://will62794.github.io/) worked on his web-based [spectacle TLA⁺ interpreter](https://github.com/will62794/spectacle), fixing [a bug](https://github.com/will62794/spectacle/commit/4e087252530a8937408828744b5f257f062dfe59) with universal quantifier expressions that modify state variables and making numerous UI tweaks. 50 | He also made many changes to [Scimitar](https://github.com/will62794/scimitar), an inductive invariant synthesis tool for TLA⁺. 51 | 52 | ### Core TLA⁺ Tooling Updates 53 | 54 | Work done by community members on TLA⁺ Foundation-managed projects: 55 | - [Calvin Loncaric](https://calvin.loncaric.us/) worked on compiling the Java-based TLA⁺ tools into a [Graal native image](https://www.graalvm.org/latest/reference-manual/native-image/) to reduce startup time; for this he [removed use of an unsupported library](https://github.com/tlaplus/tlaplus/commit/0613f42b961d41bfeb41d8ef6ee8e9762859ea94) and [added a target to the build](https://github.com/tlaplus/tlaplus/commit/789535d93e64c1c960d265947ae37d50ff805c17). 56 | He also worked on usability, submitting [a PR to TLC](https://github.com/tlaplus/tlaplus/pull/1180) to display values of any ∀-bound names when an invariant is violated. 57 | Finally, he submitted [a PR for the TLC interpreter](https://github.com/tlaplus/tlaplus/pull/1178) simplifying the `isEmpty()` method on set datatypes. 58 | - [Karolis Petrauskas](https://github.com/kape1395) worked on the [TLAPM-based](https://github.com/tlaplus/tlapm) TLA⁺ language server, changing [TLAPM's info output stream](https://github.com/tlaplus/tlapm/pull/209), adding support for [proof step renumbering](https://github.com/tlaplus/tlapm/pull/210), and further refining the [proof step renaming](https://github.com/tlaplus/tlapm/pull/211) feature. 59 | He also improved the language server's integration with the TLA⁺ VS Code Extension ([1](https://github.com/tlaplus/vscode-tlaplus/pull/375), [2](https://github.com/tlaplus/vscode-tlaplus/pull/376)). 60 | - Longtime TLA⁺ tools maintainer [Markus Kuppe](https://github.com/lemmy/) had quite an active month, adding [company-level execution statistics to TLC](https://github.com/tlaplus/tlaplus/issues/1170), multiple user-friendly warnings ([1](https://github.com/tlaplus/tlaplus/pull/1173), [2](https://github.com/tlaplus/tlaplus/pull/1174), [3](https://github.com/tlaplus/tlaplus/pull/1185)), improved error messages when [TLC encounters non-enumerable values](https://github.com/tlaplus/tlaplus/pull/1179), and variable inclusion in [TLC coverage statistics](https://github.com/tlaplus/tlaplus/pull/1183). 61 | He also began writing [a new tool documentation set](https://github.com/tlaplus/tlaplus/pull/1181). 62 | For the TLA⁺ VS Code Extension, he updated it to [incorporate level checking information from SANY](https://github.com/tlaplus/vscode-tlaplus/pull/367) and [exposed some APIs](https://github.com/tlaplus/vscode-tlaplus/pull/372) to be used by LLM agents. 63 | 64 | ### TLA⁺ Foundation-Funded Updates 65 | 66 | Finally, things [Andrew Helwer](https://ahelwer.ca/) (author of this post) worked on - all funded by the TLA⁺ Foundation! 67 | - I spent a lot of time expanding the [*Create your own TLA⁺ tools*](https://docs.tlapl.us/creating:start) tutorial series, trying to encode as much knowledge about parsing TLA⁺ as possible. 68 | As a highlight, the tutorial now has a module on parsing vertically-aligned conjunction & disjunction lists. 69 | The tutorial as a whole is nearly complete; I've finished writing the code for two of the final three modules (operator parameters, actions, then safety checking) and now need to write them up. 70 | - I created & delivered [a talk](https://www.youtube.com/watch?v=KrhZebeRn90) at the TLA⁺ Community Event summarizing the current state of TLA⁺ development, what the TLA⁺ Foundation has been funding to improve it, and what I want to see in the near future. 71 | I also summarized the talk [in a blog post](https://ahelwer.ca/post/2025-05-15-tla-dev-status/). 72 | 73 | In the next month I am hoping to focus on becoming more familiar with the TLAPM parser interface before transitioning it to use SANY. 74 | 75 | ### Newbie Corner 76 | 77 | Here we highlight an issue that would be a good choice for new contributors! 78 | Before starting work, be sure to read the [contribution guidelines](https://github.com/tlaplus/tlaplus/blob/master/CONTRIBUTING.md) and discuss your planned approach with maintainers. 79 | 80 | This is probably one of the most advanced issues yet profiled in this series, but it's very interesting. 81 | William Schultz [reported a bug](https://github.com/tlaplus/tlaplus/issues/220) where TLA⁺ cannot handle constraints like `<>' = <>`, which should be a synonym for `UNCHANGED y` and `y' = y`. 82 | 83 | Why is this bug interesting? 84 | When evaluating an action, TLC has to do a weird double-duty where it both evaluates the action as a simple logical predicate over variables - evaluating to true or false - while also extracting hints about the possible values of those same variables! 85 | Consider what happens when TLC sees an action like: 86 | ``` 87 | Action == 88 | /\ x = 0 89 | /\ x' = x + 1 90 | ``` 91 | When it evaluates the expression `x' = x + 1`, it *doesn't yet know the value of `x'`*! 92 | It has to slyly recognize that the as-yet-undefined value of `x'` is on the left hand side of an equals operator, so can be assigned/constrained to the value `x + 1`; then, having defined the value of `x'`, it evaluates `x' = x + 1` as an ordinary expression which will of course be true. 93 | 94 | Wrapping your head around this weird double-duty of TLC's interpreter will bring you great understanding of TLA⁺ tool internals. 95 | In TLA⁺, it isn't only variables that can be primed - entire expressions can be primed. 96 | When that happens, it is the same as individually priming all the variables within that expression. 97 | So, `<>'` is the same as `<>`. 98 | 99 | There are two plausible approaches to fixing this issue. 100 | First, you could look at how TLC evaluates the equals operator at runtime when both parameters are tuples, and more specifically when the left-hand-side is primed. 101 | Second, you could consider the approach of statically de-sugaring expressions like `<>' = <>` into `x' = e1 /\ y' = e2 /\ z' = e3` in the parser, so the transformation cost is only paid once instead of every time the expression is evaluated. 102 | 103 | It will be a challenge to fix this issue, but you will come out the other side with a very solid grasp of the tools and what sort of TLA⁺ specs are possible to model check. 104 | 105 | Issues highlighted in past months have also yet to be claimed! 106 | - April 2025: [PlusCal translates to invalid TLA⁺ if procedure identifier is too long](blog/2025-04-dev-update/#newbie-corner) 107 | - March 2025: [interpret expressions of the form `x' ⊆ S`](blog/2025-03-dev-update/#newbie-corner) 108 | - February 2025: [interpret expressions of the form `CHOOSE x : x ∈ S`](blog/2025-02-dev-update/#newbie-corner) 109 | - December 2024: [add parser support for backticks in strings](blog/2024-12-dev-update/#newbie-corner) 110 | 111 | -------------------------------------------------------------------------------- /content/blog/_index.md: -------------------------------------------------------------------------------- 1 | +++ 2 | type="default" 3 | menuPre = " " 4 | title = "TLA+ Blog" 5 | weight = 1 6 | alwaysopen = false 7 | hideifempty = true 8 | +++ 9 | 10 | {{% children containerstyle="div" style="h2" description=true %}} -------------------------------------------------------------------------------- /content/challenge/_index.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "GenAI-accelerated TLA+ challenge" 3 | menu = "main" 4 | date = 2025-05-03 5 | weight = 3 6 | +++ 7 | 8 | 9 | {{< figure src="banner.png" alt="My image description" >}} 10 | 11 | ###### The TLA+ Foundation, in collaboration with [NVIDIA](https://www.nvidia.com/en-us/), is pleased to announce the *GenAI-accelerated TLA+* challenge—an open call for submissions that explore the intersection of TLA+ and generative AI. 12 | 13 | ###### This initiative aims to foster practical and innovative tooling, workflows, and approaches that bring the capabilities of generative AI and LLMs to TLA+. Participants are invited to develop engineering-oriented solutions that advance the usability, accessibility, and automation of formal specification through the integration of GenAI. 14 | 15 | #### **Awards** 16 | 17 | * **1st Place**: [Nvidia GeForce RTX 5090](https://www.nvidia.com/en-us/geforce/graphics-cards/50-series/rtx-5090/) (sponsored by NVIDIA) 18 | * **2nd Place**: One-year single seat, individual subscription to [Github Copilot Pro+](https://github.com/github-copilot/pro-plus) (sponsored by the TLA+ Foundation) 19 | * **3rd Place**: One-year single seat, individual subscription to [Github Copilot Pro](https://github.com/github-copilot/pro) (sponsored by the TLA+ Foundation) 20 | 21 | #### **Example Project Areas** 22 | 23 | {{< youtube id="JX_kTGHoYT8" autoplay=true loop=true controls=false >}} 24 | 25 | Participants may submit work including, but not limited to: 26 | 27 | * Intelligent refactoring of TLA+ specifications (e.g., managing `UNCHANGED` correctly when adding variables) 28 | * LLM-enhanced linters, formatters, or other development tools 29 | * LLM-driven tools for automated grading in education 30 | * Visualizations of specifications or execution traces 31 | * Generation of type annotations for tools like Apalache 32 | * Synthesis of inductive invariant candidates, validated via [TLC](https://github.com/tlaplus/tlaplus) or [Apalache](https://github.com/apalache-mc/apalache/) 33 | * Synthesis of [TLAPS](https://github.com/tlaplus/tlapm) proofs 34 | * Synthesis of entire specifications from source code and design documents 35 | 36 | #### **Evaluation** 37 | 38 | Submissions will be judged by the **TLA+ Specification Language Committee (SLC)** 39 | 40 | The Jury will evaluate submissions based on their functionality, relevance to the TLA+ ecosystem, and the thoughtful use of AI. Submissions must be reproducible by the Jury. Passive formats, such as videos alone, are not sufficient. However, the Jury does not require a fully polished product—a prototype is sufficient. All submissions must be released under the [MIT license](https://opensource.org/license/mit), and any underlying AI models must be publicly available. 41 | 42 | The use of GenAI/LLMs is explicitly encouraged, provided that any AI-generated content—such as specs, invariants, visualizations, … —is checked using some form of verification such as the TLA+ tools. 43 | 44 | {{% notice style="accent" title="" icon="bullhorn" %}} 45 | Catch the [live announcement](https://youtu.be/oFfTuHuTnVw) at the [TLA+ Community Event 2025](https://conf.tlapl.us/2025-etaps)! 46 | {{% /notice %}} 47 | 48 | {{< youtube id="oFfTuHuTnVw" autoplay=false loop=true controls=true >}} 49 | 50 | 51 | #### **Participation Criteria** 52 | 53 | Eligible participants must meet the following: 54 | 55 | * Prior engagement with the TLA+ community (e.g., contribution to [mailing lists](https://groups.google.com/g/tlaplus), [forums](https://www.reddit.com/r/tlaplus/), [open-source repositories](https://github.com/tlaplus/), [conference presentations](https://conf.tlapl.us/), or [academic publications](https://scholar.google.com/scholar?q=TLA%2B)) 56 | * Must not be a member of the TLA+ Foundation Board or Specification Language Committee 57 | * Must not be subject to any legal, contractual, export control, or jurisdictional restrictions that would preclude participation 58 | 59 | #### **Submission Timeline & Announcement** 60 | 61 | Submissions will open alongside this announcement. The deadline to submit entries for the challenge is *July 3, 2025*. Submissions must be sent to genai@tlapl.us. The jury will select the winner one month after the submission period closes. We welcome innovative, technically robust, and practically valuable contributions that explore and expand the potential of GenAI within the context of TLA+. 62 | 63 | For longer-term or foundational engineering and research efforts related to TLA+, we encourage you to explore the [TLA+ grant program](../grants/2024-grant-program/). 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /content/challenge/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tlaplus/foundation/0991cfbc396e8528c5f1a0f71bdae9f027c4adb3/content/challenge/banner.png -------------------------------------------------------------------------------- /content/grants/2024-grant-program.md: -------------------------------------------------------------------------------- 1 | +++ 2 | menuPre = " " 3 | title = 'TLA+ Foundation Grant Program Call for Proposals' 4 | linkTitle = 'TLA+ Foundation Grant Program Call for Proposals' 5 | description = "The 2025 TLA+ Foundation Grant Program is aimed at advancing the state of the art in the TLA+ specification and fostering the experience of using TLA+ in research and industry. Depending on the scope of proposed work, grants may range from USD$1000 to USD$100,000. Applicants who receive grants are expected to complete their work within one year, though exceptions may be made on a case-by-case basis." 6 | date = 2024-05-28T15:18:27-07:00 7 | draft = false 8 | +++ 9 | 10 | The 2025 TLA+ Foundation Grant Program is aimed at advancing the state of the art in the TLA+ specification and fostering the experience of using TLA+ in research and industry. Depending on the scope of proposed work, grants may range from USD$1000 to USD$100,000. Applicants who receive grants are expected to complete their work within one year, though exceptions may be made on a case-by-case basis. 11 | 12 | Researchers as well as practitioners are welcome to apply! 13 | 14 | ## Proposal types 15 | 16 | Members of the TLA+ community are encouraged to submit proposals for the grant program. The range of subjects is deliberately left open, both projects focusing on research and on the improvement of existing tools or user interfaces are welcome. The following list gives some examples of subjects that might be relevant: 17 | 18 | - Use of TLA+ specifications for generating test suites for distributed systems 19 | - Check conformance of system implementations with respect to TLA+ specifications 20 | - Automatic techniques for generating inductive invariants 21 | - Improvements to documentation and user experience 22 | - Incorporate TLAPS and the TLC Profiler into VS Code 23 | - Implement partial order reduction techniques in TLC 24 | - Enable first-time users to execute TLC within web browsers 25 | 26 | {{% notice style="primary" title="Communication expectations" icon="circle-exclamation" %}} 27 | All awardees will be expected to provide periodic updates to the TLA+ community through efforts such as participating in the regular community meetings, blog posts, conference talks, etc. 28 | {{% /notice %}} 29 | 30 | ## Awardee eligibility 31 | 32 | To be eligible for the 2025 TLA+ Grant Program, applicants must: 33 | 34 | - Not reside in a country or jurisdiction where participation in the grant program is prohibited under applicable U.S. federal, state or local laws or the laws of other countries 35 | - Not be subject to any existing obligations to third parties (such as contractual obligations to an employer) that would restrict or prohibit your participation in the grants program 36 | - Be able to accept an unrestricted grant on behalf of yourself or your organization 37 | 38 | ## Proposal structure 39 | 40 | When putting together your proposal, please be prepared to provide the following information: 41 | 42 | - Description of proposed work (maximum 2 pages) 43 | - List of project team members (solo applications are acceptable) 44 | - Expected outcomes and benefits to TLA+ technology and/or community (maximum 1 page) 45 | - Projected timeline of work with key milestones (describe the milestones in question) 46 | - Award amount requested and justification (how you plan to apply the grant if awarded) 47 | - Description of relevant work and how it applies to your proposal (if any) 48 | - Up-to-date CV or résumé (maximum 3 pages per team member) 49 | 50 | {{% notice style="primary" title="Software licensing requirements" icon="circle-exclamation" %}} 51 | To ensure compatibility with existing TLA+ tooling, we _strongly_ recommend that any modification of an existing TLA+ tool developed as a part of your proposal be licensed under the same license as that tool, and any new software developed be licensed under an Apache 2.0, 2-Clause BSD, or MIT license. 52 | 53 | Preference will be given to proposals that follow this recommendation. 54 | {{% /notice %}} 55 | 56 | ## Application details 57 | 58 | The TLA+ grant applications are now open. To apply, fill out the [application template](https://docs.google.com/document/d/17OF2InWnwELb1NzwamyXsfglu1F57JGfYra1lsodmF0/edit) with your proposal details and submit it through the form below. 59 | 60 | {{% notice style="primary" title="Funding amount justification" icon="circle-exclamation" %}} 61 | Applications for USD$50,000 or more will need to provide thorough justification for the amount requested. Please use the requested format for your application and give as much detail as possible in the measuring success, projected timeline, and funding justification sections. 62 | {{% /notice %}} 63 | 64 | 65 | 72 | 73 | ## Questions 74 | 75 | If you have any questions, please reach out to [grants@tlapl.us](mailto:grants@tlapl.us). 76 | -------------------------------------------------------------------------------- /content/grants/TLA+ Grant Template.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tlaplus/foundation/0991cfbc396e8528c5f1a0f71bdae9f027c4adb3/content/grants/TLA+ Grant Template.docx -------------------------------------------------------------------------------- /content/grants/_index.md: -------------------------------------------------------------------------------- 1 | +++ 2 | type= "default" 3 | menuPre = " " 4 | title = "TLA+ Foundation Grants" 5 | weight = 2 6 | alwaysopen = true 7 | hideifempty = true 8 | +++ 9 | 10 | {{% children containerstyle="div" style="h2" description=true %}} -------------------------------------------------------------------------------- /documents/infra-eng-job-post.md: -------------------------------------------------------------------------------- 1 | # Job Posting for a TLA+ Infrastructure Engineer 2 | 3 | ## Motivation (note: not part of the actual post) 4 | 5 | This is a job posting for a hypothetical TLA+ Foundation first hire. 6 | This person's responsibilities would primarily involve "infrastructure" work, rather than feature work or bugfixes for the tools. 7 | In particular, this person would be responsible for coordinating versioned releases of the TLA+ tools (possibly expanding to TLAPS and the VS Code extension). 8 | What sort of work is required of this position? Here are some examples I can think of: 9 | * Expanding & improving automated testing (UI, performance, regression, integration, functional, unit tests) 10 | * Maintaining a benchmark database of time/memory performance for the tools over time 11 | * Writing detailed release notes describing changes 12 | * Writing CI/CD scripts to automate as much of the testing & release process as possible 13 | * Improving build times and reducing size of build outputs 14 | * Maintaining, improving, and documenting developer experience (setup, local build, local testing on various platforms) 15 | 16 | Note that while these responsibilities are not "complicated" in any theoretical or algorithmic sense, given the low amount of overhead available for mentorship it is desirable to hire a candidate with some work experience as they will need to be fairly self-directed. 17 | 18 | One interesting question is whether we should require a Bachelor's in Computer Science or Software Engineering for this position. 19 | It is not my impression that bootcamps or alternative forms of education focus much on infrastructure tasks of this sort, but I could be wrong. 20 | It's not like CS degrees focus on this much either, although I'm a decade out of college so maybe they actually do teach how to set up a CI/CD pipeline these days. 21 | 22 | Some other things to decide: 23 | * Location? US-only? Global? 24 | * Type of employment: contract? W-2 (or equivalent)? 25 | * Human language proficiency 26 | 27 | ## The Post 28 | 29 | **Title** 30 | 31 | (Remote) Infrastructure & Release Engineer II at the TLA+ Foundation 32 | 33 | **Job Description** 34 | 35 | Use your skills to provide valuable infrastructure work for an open-source project blending the best aspects of industry and academia! 36 | TLA+ is a formal specification language developed by Microsoft Research, Inria, and many others in the global community. 37 | It is widely used in both industry & academia to specify and validate the design of complex systems such as consensus protocols or databases. 38 | Take on the first development role created by the nonprofit TLA+ Foundation to support the growth of the TLA+ tools and ecosystem! 39 | This remote role features & requires a large degree of autonomy. 40 | The selected candidate will work to expand automated test coverage, maintain a benchmark database, write CI/CD scripts, optimize builds, and coordinate all aspects of the software release process. 41 | 42 | **Responsibilities** 43 | 44 | * Expand automated test coverage of UI, performance, functional, and unit tests 45 | * Maintain a benchmark database of time & memory performance across releases 46 | * Write CI/CD scripts to automate as much of the release process as possible 47 | * Optimize the build process to reduce build time and size of outputs 48 | * Maintain & improve developer experience for the tools themselves 49 | 50 | **Required Skills/Experience** 51 | 52 | * Bachelor's degree in Computer Science or Software Engineering 53 | * At least 4 years of industry experience as a software engineer 54 | * At least 1 year of experience in a remote work environment 55 | * At least 1 year of experience writing software in the Java ecosystem 56 | * Strong technical writing skills 57 | 58 | **Preferred Skills/Experience** 59 | 60 | * Experience with a variety of automated test paradigms, including model- or property-based testing 61 | * Experience writing CI/CD scripts 62 | * Experience with TLA+ or other formal methods tools 63 | * Experience working in a self-directed environment 64 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github/tlaplus/foundation 2 | 3 | go 1.22.1 4 | 5 | require github.com/McShelby/hugo-theme-relearn v0.0.0-20241118130711-6cb54ccb05c2 // indirect 6 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/McShelby/hugo-theme-relearn v0.0.0-20240507204003-21b4289ecf44 h1:AKT4XmMcPBvNx6/aIjCMZxKj7Gwl1j7CSJLszuyRRLc= 2 | github.com/McShelby/hugo-theme-relearn v0.0.0-20240507204003-21b4289ecf44/go.mod h1:mKQQdxZNIlLvAj8X3tMq+RzntIJSr9z7XdzuMomt0IM= 3 | github.com/McShelby/hugo-theme-relearn v0.0.0-20241118130711-6cb54ccb05c2 h1:cg1nWrSarc38tRJv+iAICOqB0tj7gf3FDxvcR8bDpVc= 4 | github.com/McShelby/hugo-theme-relearn v0.0.0-20241118130711-6cb54ccb05c2/go.mod h1:mKQQdxZNIlLvAj8X3tMq+RzntIJSr9z7XdzuMomt0IM= 5 | -------------------------------------------------------------------------------- /hugo.toml: -------------------------------------------------------------------------------- 1 | languageCode = 'en-us' 2 | title = 'TLA+ Foundation' 3 | pygmentsUseClassic = true 4 | PygmentsCodeFences = true 5 | enableRobotsTXT = true 6 | noChmod = true 7 | staticDir = ['static'] 8 | 9 | [Params] 10 | disableInlineCopyToClipBoard = false 11 | disableAssetsBusting = true 12 | disableLandingPageButton = false 13 | disableNextPrev = true 14 | disableSearch = true 15 | disableShortcutsTitle = false 16 | [Params.Author] 17 | Name = "TLA+ Foundation" 18 | [Params.ThemeVariant] 19 | identifier = 'tlaplus' 20 | 21 | [markup] 22 | [markup.goldmark.renderer] 23 | unsafe = true 24 | 25 | [menu] 26 | [[menu.shortcuts]] 27 | pre = ' ' 28 | name = 'GitHub' 29 | url = 'https://github.com/tlaplus/' 30 | weight = 10 31 | 32 | [[menu.shortcuts]] 33 | pre = ' ' 34 | name = 'Mailing List' 35 | url = 'https://groups.google.com/g/tlaplus/' 36 | weight = 30 37 | 38 | [[menu.shortcuts]] 39 | pre = ' ' 40 | name = 'Mailing List Archive' 41 | url = 'https://discuss.tlapl.us/' 42 | weight = 40 43 | 44 | [[menu.shortcuts]] 45 | pre = ' ' 46 | name = 'Conferences and Events' 47 | url = 'https://conf.tlapl.us/home/' 48 | weight = 50 49 | 50 | 51 | [module] 52 | [[module.imports]] 53 | path = 'github.com/McShelby/hugo-theme-relearn' -------------------------------------------------------------------------------- /layouts/blog/views/article.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 | {{- partial "content-header.html" . }} 5 |
6 | {{ partial "heading-pre.html" . }}{{ partial "heading.html" . }}{{ partial "heading-post.html" . }} 7 |
8 | {{ partial "article-content.html" . }} 9 |
10 |
11 | {{- partial "content-footer.html" . }} 12 |
13 |
-------------------------------------------------------------------------------- /layouts/partials/content-footer.html: -------------------------------------------------------------------------------- 1 | {{- partial "term-list.html" (dict 2 | "page" . 3 | "taxonomy" "categories" 4 | "icon" "layer-group" 5 | ) }} 6 |
7 |

Copyright © 2025 The Linux Foundation ®. All rights reserved. 8 | The Linux Foundation has registered trademarks and uses trademarks. 9 | For a list of trademarks of The Linux Foundation, please see our 10 | Trademark Usage page. 11 |

-------------------------------------------------------------------------------- /layouts/partials/header.html: -------------------------------------------------------------------------------- 1 | 2 | {{- $format := partial "get-format.hugo" . }} 3 | {{- $outputFormat := partial "output-format.hugo" (dict "page" . "format" $format) }} 4 | {{- $basename := "index" }} 5 | {{- if eq $outputFormat "searchpage" }} 6 | {{- $basename = partial "BaseName.hugo" $format.RelPermalink }} 7 | {{- end }} 8 | {{- if eq . .Site.Sites.First.Home }} 9 | {{- $hugoVersion := "0.121.0" }} 10 | {{- if lt hugo.Version $hugoVersion }} 11 | {{- errorf "The Relearn theme requires Hugo %s or later" $hugoVersion }} 12 | {{- end }} 13 | {{- end }} 14 | {{- if .Site.Params.description }} 15 | {{- warnf "UNSUPPORTED usage of 'params.description' config parameter found, move it to the frontmatter of your home page; see https://mcshelby.github.io/hugo-theme-relearn/basics/migration#600" }} 16 | {{- end }} 17 | 18 | 19 | {{- partial "meta.html" . }} 20 | {{- $page := . }} 21 | {{- $link := "" }} 22 | {{- $title := partial "pageHelper/title.hugo" (dict "page" . "fullyQualified" true "reverse" true "format" $format "outputFormat" $outputFormat) }} 23 | {{ $title }} 24 | 25 | {{- if .IsTranslated -}} 26 | {{- range $index, $trans := .AllTranslations }} 27 | {{- if eq $index 0 }} 28 | 29 | {{- end }} 30 | 31 | {{- end }} 32 | {{- end }} 33 | 34 | {{- if not (and .Title (or (ne (.Scratch.Get "relearnIsHiddenStem") true) (ne .Site.Params.disableSeoHiddenPages true) ) ) }} 35 | {{- else }} 36 | {{- range .AlternativeOutputFormats }} 37 | {{- if eq .Rel "canonical" }} 38 | {{ (printf $link (partial "relLangPrettyUglyURL.hugo" (dict "to" . "abs" true "basename" $basename)) .Rel .MediaType.Type ($title | htmlEscape)) | safeHTML }} 39 | {{- else if eq $outputFormat "searchpage" }} 40 | {{- else if eq .Name "searchpage" }} 41 | {{- else if ne .Name "search" }} 42 | {{ (printf $link (partial "relLangPrettyUglyURL.hugo" (dict "to" .)) .Rel .MediaType.Type ($title | htmlEscape)) | safeHTML }} 43 | {{- end }} 44 | {{- end }} 45 | {{- end }} 46 | 47 | {{- partialCached "favicon.html" . }} 48 | {{- partial "stylesheet.html" (dict "page" . "outputFormat" $outputFormat) }} 49 | {{- partial "dependencies.html" (dict "page" . "location" "header" "outputFormat" $outputFormat) }} 50 | {{- partial "custom-header.html" . }} 51 | 52 | 53 |
54 |
55 | 76 | {{- $hook := "styleclass" }} 77 |
78 |
79 |
-------------------------------------------------------------------------------- /layouts/partials/logo.html: -------------------------------------------------------------------------------- 1 | The TLA+ logo -------------------------------------------------------------------------------- /layouts/partials/menu-footer.html: -------------------------------------------------------------------------------- 1 | {{ if .Site.Copyright }} 2 |

{{ .Site.Copyright }}

3 | {{ end }} -------------------------------------------------------------------------------- /layouts/partials/menu.html: -------------------------------------------------------------------------------- 1 | 2 | {{- $showvisitedlinks := .Site.Params.showVisitedLinks }} 3 | 102 | {{- define "partials/inline/page-tree" }} 103 | {{- $currentNode := .currentnode }} 104 | {{- $config := .config }} 105 | {{- $showvisitedlinks := .showvisitedlinks }} 106 |
107 | {{- with site.Home.GetPage ($config.pageRef | default "") }} 108 | {{- $entry := . }} 109 | {{- $entries := partialCached "_relearn/pages.gotmpl" (dict "page" $entry) $entry.Path }} 110 | {{- $title := "" }} 111 | {{- if not ($config.disableTitle | default true) }} 112 | {{ $title = $entry.Params.menuTitle | default (T (print $config.identifier "-menuTitle")) }} 113 | {{- end }} 114 | {{- with $title }} 115 | 116 | {{- end }} 117 | {{- $classes := "space " }} 118 | {{- if ($config.main | default true) }} 119 | {{- $classes = "enlarge morespace " }} 120 | {{- end }} 121 | {{- range .Site.Menus.main }} 122 | {{- end }} 123 |
    124 | {{- $defaultAlwaysopen := site.Params.alwaysopen | default false }} 125 | {{- range $entries }} 126 | {{- $isSubSelf := eq . $currentNode }} 127 | {{- $isSubAncestor := and (not $isSubSelf) (.IsAncestor $currentNode) }} 128 | {{- $isSubHidden := or (.Params.hidden) (eq .Title "") }} 129 | {{- $isSubCollapsible := .Params.collapsibleMenu | default site.Params.collapsibleMenu }} 130 | {{- if and (lt (.Pages | len) 1) .Params.hideifempty }} 131 | {{ continue }} 132 | {{- end }} 133 | {{- if or $isSubSelf $isSubAncestor }} 134 | {{- partial "partials/inline/page-walker" (dict "sect" . "currentnode" $currentNode "showvisitedlinks" $showvisitedlinks "alwaysopen" $defaultAlwaysopen "isSelf" $isSubSelf "isAncestor" $isSubAncestor "isHidden" $isSubHidden) }} 135 | {{- else if and (not $isSubHidden) (or $isSubCollapsible (not $entry.RelPermalink) (eq $entry $currentNode) ($entry.IsAncestor $currentNode)) }} 136 | {{- $id := md5 .Path }} 137 | {{- partialCached "partials/inline/page-walker" (dict "sect" . "currentnode" $currentNode "showvisitedlinks" $showvisitedlinks "alwaysopen" $defaultAlwaysopen "isSelf" $isSubSelf "isAncestor" $isSubAncestor "isHidden" $isSubHidden) $id }} 138 | {{- end }} 139 | {{- end }} 140 |
141 |
142 | {{- else }} 143 | {{- warnf "WARNING: page '%s' not found for sidebar menu '%s'" ($config.pageRef | default "") $config.identifier }} 144 | {{- end }} 145 | {{- end }} 146 | {{- define "partials/inline/page-walker" }} 147 | {{- $currentNode := .currentnode }} 148 | {{- $showvisitedlinks := .showvisitedlinks }} 149 | {{- $alwaysopen := .alwaysopen }} 150 | {{- $isSelf := .isSelf }} 151 | {{- $isAncestor := .isAncestor }} 152 | {{- $isHidden := .isHidden }} 153 | {{- with .sect }} 154 | {{- $isActive := $isSelf }} 155 | {{- $entry := . }} 156 | {{- $entries := partialCached "_relearn/pages.gotmpl" (dict "page" .) .Path }} 157 | {{- $hasVisibleChildren := false }} 158 | {{- range $entries }} 159 | {{- $isSubSelf := eq . $currentNode }} 160 | {{- $isSubAncestor := and (not $isSubSelf) (.IsAncestor $currentNode) }} 161 | {{- $isSubHidden := or (.Params.hidden) (eq .Title "") }} 162 | {{- if or $isSubAncestor $isSubSelf (not $isSubHidden) }} 163 | {{- $hasVisibleChildren = true }} 164 | {{- break }} 165 | {{- end }} 166 | {{- end }} 167 | {{- $title := partial "title.gotmpl" (dict "page" . "linkTitle" true) }} 168 | {{- $url := partial "permalink.gotmpl" (dict "to" .) }} 169 | {{- $isCrosslink := false }} 170 | {{- $target := "" }} 171 | {{- if .Params.menuPageRef }} 172 | {{- with site.Home.GetPage (.Params.menuPageRef) }} 173 | {{- $url = partial "permalink.gotmpl" (dict "to" .) }} 174 | {{- $isCrosslink = true }} 175 | {{- end }} 176 | {{- else if .Params.menuUrl }} 177 | {{- $url = .Params.menuUrl }} 178 | {{- $isCrosslink = true }} 179 | {{- $u := urls.Parse $url }} 180 | {{- if $u.IsAbs }} 181 | {{- $target = "_blank" }} 182 | {{- if isset site.Params "externallinktarget" }} 183 | {{- $target = site.Params.externalLinkTarget }} 184 | {{- end }} 185 | {{- end }} 186 | {{- end }} 187 | {{- $pre := partial "menu-pre.html" . }} 188 | {{- $post := partial "menu-post.html" . }} 189 | {{- if and $hasVisibleChildren (not $isCrosslink) }} 190 | {{- $isCollapsible := .Params.collapsibleMenu | default site.Params.collapsibleMenu }} 191 | {{- $currentAlwaysopen := .Params.alwaysopen | default $alwaysopen }} 192 | {{- if and (not $url) (not $isCollapsible) }} 193 | {{- $currentAlwaysopen = true }} 194 | {{- end }} 195 | {{- $entryId := md5 .Path }} 196 | {{- $isOpen := or $currentAlwaysopen $isSelf $isAncestor }} 197 |
  • 198 | {{- if $isCollapsible }}{{ end }} 199 | {{- if $url }}{{ else }}{{ end }} 200 | {{- $pre }}{{ $title }}{{ $post }} 201 | {{- if $url }}{{ if $showvisitedlinks }}{{ end }}{{ else }}{{ end }}
      202 | {{- $defaultAlwaysopen := site.Params.alwaysopen | default true }} 203 | {{- range $entries }} 204 | {{- $isSubSelf := eq . $currentNode }} 205 | {{- $isSubAncestor := and (not $isSubSelf) (.IsAncestor $currentNode) }} 206 | {{- $isSubHidden := or (.Params.hidden) (eq .Title "") }} 207 | {{- $isSubCollapsible := .Params.collapsibleMenu | default site.Params.collapsibleMenu }} 208 | {{- if or (not $isSubHidden) $isSubSelf $isSubAncestor }} 209 | {{- partial "partials/inline/page-walker" 210 | (dict "sect" . "currentnode" $currentNode "showvisitedlinks" $showvisitedlinks "alwaysopen" $defaultAlwaysopen "isSelf" $isSubSelf "isAncestor" $isSubAncestor "isHidden" $isSubHidden) }} 211 | {{- else if and (not $isSubHidden) (or $isSubCollapsible (not $entry.RelPermalink) (eq $entry $currentNode) ($entry.IsAncestor $currentNode)) }} 212 | {{- $id := md5 .Path }} 213 | {{- partialCached "partials/inline/page-walker" (dict "sect" . "currentnode" $currentNode "showvisitedlinks" $showvisitedlinks "alwaysopen" $defaultAlwaysopen "isSelf" $isSubSelf "isAncestor" $isSubAncestor "isHidden" $isSubHidden) $id }} 214 | {{- end }} 215 | {{- end }}
  • 216 | {{- else if $url }} 217 | 221 | {{- end }} 222 | {{- end }} 223 | {{- end }} 224 | {{- define "partials/inline/menu-tree" }} 225 | {{- $currentNode := .currentnode }} 226 | {{- $config := .config }} 227 | {{- $showvisitedlinks := .showvisitedlinks }} 228 | {{- with index site.Menus $config.identifier }} 229 |
    230 | {{- $entry := "" }} 231 | {{- $entries := . }} 232 | {{- if eq (len $entries) 1 }} 233 | {{- with index $entries 0 }} 234 | {{- if not (partial "menupermalink.gotmpl" .) }} 235 | {{- /* because in Hugo menus can not have parameter but menu entries can, 236 | we can flag a single top level menu entry as a container; this container 237 | entry carrys just meta information and parameter, uses its children 238 | to build the "real" menu, and has no own `url` or `pageRef` */}} 239 | {{- $entry = . }} 240 | {{- $entries = .Children }} 241 | {{- end }} 242 | {{- end }} 243 | {{- end }} 244 | {{- $title := "" }} 245 | {{- if not ($config.disableTitle | default false) }} 246 | {{- if $entry }} 247 | {{- $title = partial "menutitle.gotmpl" $entry }} 248 | {{- else if eq $config.identifier "shortcuts" }} 249 | {{- if not site.Params.DisableShortcutsTitle }} 250 | {{- $title = T (print $config.identifier "-menuTitle") }} 251 | {{- end }} 252 | {{- else }} 253 | {{- $title = T (print $config.identifier "-menuTitle") }} 254 | {{- end }} 255 | {{- end }} 256 | {{- with $title }} 257 | 258 | {{- end }} 259 | {{- $classes := "space " }} 260 | {{- if ($config.main | default false) }} 261 | {{- $classes = "enlarge morespace " }} 262 | {{- end }} 263 |
      264 | {{- $root := or $entry site }} 265 | {{- $defaultAlwaysopen := site.Params.alwaysopen | default false }} 266 | {{- range $entries }} 267 | {{- $isSubSelf := eq .Page $currentNode }} 268 | {{- $isSubAncestor := and (not $isSubSelf) ($currentNode.HasMenuCurrent .Menu .) }} 269 | {{- $isSubHidden := or (.Params.hidden) (eq (partial "menutitle.gotmpl" .) "") }} 270 | {{- $isSubCollapsible := .Params.collapsibleMenu | default $root.Params.collapsibleMenu | default site.Params.collapsibleMenu }} 271 | {{- if or $isSubSelf $isSubAncestor }} 272 | {{- partial "partials/inline/menu-walker" (dict "menu" . "currentnode" $currentNode "showvisitedlinks" $showvisitedlinks "alwaysopen" $defaultAlwaysopen "isSelf" $isSubSelf "isAncestor" $isSubAncestor "isHidden" $isSubHidden "root" $root) }} 273 | {{- else if and (not $isSubHidden) (or $isSubCollapsible (not (partial "menupermalink.gotmpl" $entry)) (and $entry (eq $entry.Page $currentNode)) (and $entry ($currentNode.HasMenuCurrent $entry.Menu $entry))) }} 274 | {{- $id := md5 (print .) }} 275 | {{- partialCached "partials/inline/menu-walker" (dict "menu" . "currentnode" $currentNode "showvisitedlinks" $showvisitedlinks "alwaysopen" $defaultAlwaysopen "isSelf" $isSubSelf "isAncestor" $isSubAncestor "isHidden" $isSubHidden "root" $root) $id }} 276 | {{- end }} 277 | {{- end }} 278 |
    279 |
    280 | {{- else }} 281 | {{ if ne $config.identifier "shortcuts" }} 282 | {{- warnf "WARNING: menu '%s' not found for sidebar menu '%s'" $config.identifier $config.identifier }} 283 | {{- end }} 284 | {{- end }} 285 | {{- end }} 286 | {{- define "partials/inline/menu-walker" }} 287 | {{- $currentNode := .currentnode }} 288 | {{- $showvisitedlinks := .showvisitedlinks }} 289 | {{- $alwaysopen := .alwaysopen }} 290 | {{- $isSelf := .isSelf }} 291 | {{- $isAncestor := .isAncestor }} 292 | {{- $isHidden := .isHidden }} 293 | {{- $root := .root }} 294 | {{- with .menu }} 295 | {{- $isActive := $isSelf }} 296 | {{- $entry := . }} 297 | {{- $entries := .Children }} 298 | {{- $hasVisibleChildren := false }} 299 | {{- range $entries }} 300 | {{- $isSubSelf := eq .Page $currentNode }} 301 | {{- $isSubAncestor := and (not $isSubSelf) ($currentNode.HasMenuCurrent .Menu .) }} 302 | {{- $isSubHidden := or (.Params.hidden) (eq (partial "menutitle.gotmpl" .) "") }} 303 | {{- if or $isSubAncestor $isSubSelf (not $isSubHidden) }} 304 | {{- $hasVisibleChildren = true }} 305 | {{- break }} 306 | {{- end }} 307 | {{- end }} 308 | {{- $title := partial "menutitle.gotmpl" . }} 309 | {{- $url := partial "menupermalink.gotmpl" . }} 310 | {{- $target := "" }} 311 | {{- $u := urls.Parse $url }} 312 | {{- if $u.IsAbs }} 313 | {{- $target = "_blank" }} 314 | {{- if isset site.Params "externallinktarget" }} 315 | {{- $target = site.Params.externalLinkTarget }} 316 | {{- end }} 317 | {{- end }} 318 | {{- $pre := .Pre }} 319 | {{- $post := .Post }} 320 | {{- with .Page }} 321 | {{- $pre = or $pre (partial "menu-pre.html" .) }} 322 | {{- $post = or $post (partial "menu-post.html" .) }} 323 | {{- end }} 324 | {{- if $hasVisibleChildren }} 325 | {{- $isCollapsible := .Params.collapsibleMenu | default $root.Params.collapsibleMenu | default site.Params.collapsibleMenu }} 326 | {{- $currentAlwaysopen := .Params.alwaysopen | default $root.Params.alwaysopen | default $alwaysopen }} 327 | {{- if and (not $url) (not $isCollapsible) }} 328 | {{- $currentAlwaysopen = true }} 329 | {{- end }} 330 | {{- $entryId := md5 (print .) }} 331 | {{- $isOpen := or $currentAlwaysopen $isSelf $isAncestor }} 332 | 333 |
  • 334 | {{- if $isCollapsible }}{{ end }} 335 | {{- if $url }}{{ else }}{{ end }} 336 | {{- $pre }}{{ $title }}{{ $post }} 337 | {{- if $url }}{{ if $showvisitedlinks }}{{ end }}{{ else }}{{ end }}
      338 | {{- $defaultAlwaysopen := site.Params.alwaysopen | default true }} 339 | {{- range $entries }} 340 | {{- $isSubSelf := eq .Page $currentNode }} 341 | {{- $isSubAncestor := and (not $isSubSelf) ($currentNode.HasMenuCurrent .Menu .) }} 342 | {{- $isSubHidden := or (.Params.hidden) (eq (partial "menutitle.gotmpl" .) "") }} 343 | {{- $isSubCollapsible := .Params.collapsibleMenu | default $root.Params.collapsibleMenu | default site.Params.collapsibleMenu }} 344 | {{- if or $isSubSelf $isSubAncestor }} 345 | {{- partial "partials/inline/menu-walker" (dict "menu" . "currentnode" $currentNode "showvisitedlinks" $showvisitedlinks "alwaysopen" $defaultAlwaysopen "isSelf" $isSubSelf "isAncestor" $isSubAncestor "isHidden" $isSubHidden "root" $root) }} 346 | {{- else if and (not $isSubHidden) (or $isSubCollapsible (not (partial "menupermalink.gotmpl" $entry)) (eq $entry.Page $currentNode) ($currentNode.HasMenuCurrent $entry.Menu $entry)) }} 347 | {{- $id := md5 (print .) }} 348 | {{- partialCached "partials/inline/menu-walker" (dict "menu" . "currentnode" $currentNode "showvisitedlinks" $showvisitedlinks "alwaysopen" $defaultAlwaysopen "isSelf" $isSubSelf "isAncestor" $isSubAncestor "isHidden" $isSubHidden "root" $root) $id }} 349 | {{- end }} 350 | {{- end }}
  • 351 | {{- else if $url }} 352 |
  • 353 | {{- if $url }}{{ else }}{{ end }} 354 | {{- $pre }}{{ $title }}{{ $post }} 355 | {{- if $url }}{{ if $showvisitedlinks }}{{ end }}{{ else }}{{ end }}
  • 356 | {{- end }} 357 | {{- end }} 358 | {{- end }} -------------------------------------------------------------------------------- /layouts/partials/opengraph.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | {{- with or site.Title site.Params.title | plainify }} 4 | 5 | {{- end }} 6 | 7 | {{- with or .Title site.Title site.Params.title | plainify}} 8 | 9 | {{- end }} 10 | 11 | {{- with or .Description .Summary site.Params.description | plainify }} 12 | 13 | {{- end }} 14 | 15 | {{- with or .Params.locale site.Language.LanguageCode site.Language.Lang }} 16 | 17 | {{- end }} 18 | 19 | {{- if .IsPage }} 20 | 21 | 22 | {{- $ISO8601 := "2006-01-02T15:04:05-07:00" }} 23 | {{- with .PublishDate }} 24 | 25 | {{- end }} 26 | {{- with .Lastmod }} 27 | 28 | {{- end }} 29 | {{- range .GetTerms "tags" | first 6 }} 30 | 31 | {{- end }} 32 | {{- else }} 33 | 34 | {{- end }} 35 | 36 | {{- with partial "_funcs/get-page-images" . }} 37 | {{- range . | first 6 }} 38 | 39 | {{- end }} 40 | {{- end }} 41 | 42 | {{- with .Params.audio }} 43 | {{- range . | first 6 }} 44 | 45 | {{- end }} 46 | {{- end }} 47 | 48 | {{- with .Params.videos }} 49 | {{- range . | first 6 }} 50 | 51 | {{- end }} 52 | {{- end }} 53 | 54 | {{- range .GetTerms "series" }} 55 | {{- range .Pages | first 7 }} 56 | {{- if ne $ . }} 57 | 58 | {{- end }} 59 | {{- end }} 60 | {{- end }} 61 | 62 | {{- with site.Params.social }} 63 | {{- if reflect.IsMap . }} 64 | {{- with .facebook_app_id }} 65 | 66 | {{- else }} 67 | {{- with .facebook_admin }} 68 | 69 | {{- end }} 70 | {{- end }} 71 | {{- end }} 72 | {{- end }} -------------------------------------------------------------------------------- /minutes/2021-10-11.md: -------------------------------------------------------------------------------- 1 | # TLA+ Meeting 10/11/2021 2 | 10:07 - Begin meeting 3 | 4 | 10:08 - Agenda: 5 | * Hear from Haskell & Rust Foundations, Microsoft Open Source Office 6 | * Decide scope & mission: use Leslie's name? What is the mission statement? 7 | * Join existing foundation? Linux, Eclipse, Cloud Native, etc. 8 | 9 | 10:11 - Haskell Foundation (HF) Simon Peyton Jones 10 | * Simon Peyton Jones is leaving Microsoft 11 | * Should we just fork the HF goals, values, and mission statement? 12 | * HF did not join an existing foundation (did not know it was an option) 13 | * HF seems to be focusing more on small individual donors rather than FAMANG companies 14 | * Benefits of sponsorship is basically only getting your logo on the website 15 | 16 | 10:14 - Rust Foundation (RF) Florian Gilcher 17 | * RF forced to begin when Mozilla ended funding for project - rushed to get it started 18 | * Much larger than HF 19 | * More professional-type relations compared to HF, has competing factions 20 | * HF does not fund development, RF does fund development 21 | * RF did not join existing foundation, large enough to do everything in-house 22 | 23 | 10:18 - Microsoft Open Source Office (MOSO) 24 | * Recommends joining Linux or Eclipse foundations 25 | * Both are tax-exempt, based in US 26 | 27 | 10:18 - EU vs. US-based foundation 28 | * EU companies more willing to donate workers 29 | * US companies more willing to donate money 30 | * Eclipse moved from US to EU 31 | 32 | 10:20 - Which foundation to join? 33 | * Linux and Eclipse Foundations have both outgrown their original project, fairly diverse 34 | * IBM has influence in Eclipse foundation 35 | * Several Open Networking Foundation (ONF) projects used to be part of LF 36 | * Apache Foundation? They probably require Apache license 37 | * What are the requirements to join these foundations? 38 | * EF requires ownership (copyright) of the source code 39 | * EF very strict about external dependencies - focus on licensing for industry use 40 | 41 | 10:27 - TLA+ user/market study 42 | * What area of the world should we be focusing on for TLA+ growth? 43 | * Europe, US, China? 44 | * Nokia just left an open-source telecom standards org because of US/China hostilities 45 | * Would be issue regardless of whether foundation is in US or EU 46 | * Do we go for individual users or large companies? 47 | 48 | 10:31 - TLA+ Foundation website 49 | * Currently owned by Markus; he can transfer ownership to foundation 50 | * NVIDIA, Cockroach Labs both interested in joining foundation 51 | * Need to have good wording on Foundation landing page 52 | * Do we need to have joined a foundation before reaching out to companies? 53 | 54 | 10:34 - Linux vs. Eclipse 55 | * Early TLA+ Foundation (TLAF) will fund development directly - more aligned with EF? 56 | * Companies unlikely to donate worker time at first 57 | * TLA+ use inside companies is generally fairly organic, sporadic rather than ongoing 58 | * TLA+ is not a critical resource compared to Rust - does not need to continue functioning 59 | * TLA+ is not something you build on top of - a tool, not a library or framework 60 | * Is TLAF eligible for funding from MSR? 61 | * Could TLAF get funding or work with INRIA? Can Stephan apply? 62 | * Individual researchers can get grant from INRIA to work on TLA+ 63 | 64 | 10:38 - Funding sources 65 | * Blockchain communities largely situated in Switzerland and Singapore 66 | * Would Leslie himself help with fundraising? Will he be part of the TLAF? 67 | * Leslie wants us to be the future 68 | 69 | 10:41 - What do we need to do? 70 | * Some people work on landing page and mission statement 71 | * Some people figure out where foundation should be based 72 | * Some people figure out which foundation to join 73 | * Find more founding members 74 | * MOSO can arrange meetings with foundation members 75 | 76 | 10:46 - Assignments 77 | * Markus will write the first draft of the TLAF goals/values/etc. 78 | * Andrew, Ron, Jordan will talk to fundations through MOSO 79 | * Hillel will look into user study 80 | 81 | 10:48 - Should we expand foundation scope beyond TLA+? 82 | * Mathematical thinking in software engineering 83 | * Formal Methods Europe foundation? 84 | * Could we eventually be a parent foundation for multiple formal methods projects? 85 | * INRIA has a parent foundation but doesn't seem we can join 86 | * Easier to expand mission of foundation than contract it 87 | 88 | 10:52 - Foundation starting point 89 | * If we were to join a foundation, could we ever leave? 90 | * EF has copyright so it would be more difficult to leave 91 | * RF just hired execs their first year who went around knocking on doors 92 | * Talk to companies, get an idea of how much funding we can theoretically get 93 | * Hybrid model - join Linux foundation while also starting own foundation? 94 | * Timeline for user study - sooner the better 95 | * Go into hibernation - with programming tools do you have to sprint to stay in place? 96 | 97 | 10:59 - Membership levels 98 | * Individual levels vs. company levels 99 | * Annual fees vs. one-time donation 100 | 101 | 11:01 - Schedule next meeting 102 | * When will we have progress on mission statement & foundation details? 103 | * Markus will schedule next meeting - one month? 104 | -------------------------------------------------------------------------------- /minutes/2021-12-22.md: -------------------------------------------------------------------------------- 1 | # TLA+ Meeting 12/22/2021 2 | 3 | 12m: 4 | * Recap of previous meeting; Linux foundation sounds best 5 | * INRIA does not seem like a good idea for entities outside of France 6 | * Apache foundation seems similar to Eclipse foundation 7 | 8 | 19m: 9 | * Linux foundation seems like the path forward 10 | * Markus attempted to join as a project but this was rejected for some reason 11 | * Difficult part of joining Linux foundation: figuring out membership tiers 12 | * Also need to identify possible member companies 13 | * How much influence would companies have? What could they even influence? 14 | 15 | 23m: 16 | * How do we identify member companies? 17 | * See employers of people who follow TLA+ entity on LinkedIn 18 | * Should we make the foundation effort public? 19 | * Possible drawbacks: being sued for not being inclusive 20 | 21 | 29m: 22 | * Shortlist of member companies 23 | * Blockchain companies? 24 | 25 | 33m: 26 | * Benefits of Linux foundation 27 | * What level of commitment do we need from companies? 28 | * Letters of intent should probably be the goal 29 | * Talk with Chris from Linux foundation about how to approach this 30 | 31 | 42m: 32 | * Action item: collect list of foundation members 33 | * Head in direction of getting letter of intent 34 | * Certification in TLA+? 35 | -------------------------------------------------------------------------------- /minutes/2022-01-25.md: -------------------------------------------------------------------------------- 1 | # TLA+ Meeting 01/25/2022 2 | 3 | 2m: 4 | * Ron in contact with Oracle over some program to get money for researchers 5 | * Meeting in late February 6 | * Oracle had posted a verification engineer job based in India 7 | * Ron is unsure which team inside Oracle posted this job; cloud? Blockchain? 8 | 9 | 11m: 10 | * Going over chart of who should speak with what company 11 | * Andrew & Hillel - ask about Facebook? Have they used TLA+? 12 | * Facebook has asked around about TLA+ classes, uncertain whether any use 13 | * Need to finish one-pager to send to companies; Ron will work on this 14 | * Should membership structure be included in one-pager? 15 | 16 | 15m: 17 | * What about mid-size companies like CockroachDB, etc. 18 | * What would those mid-size companies want out of funding the foundation? 19 | * Anything less than $50k/year commitment from companies probably not worth effort 20 | 21 | 20m: 22 | * Use foundation as certification entity? Certified TLA+ engineer 23 | * Many other Linux foundation projects take this approach 24 | * Can certify teachers of TLA+ instead of engineers themselves 25 | * Markus is teaching TLA+ at Microsoft now 26 | 27 | 23m: 28 | * Consensus seems to be joining the Linux foundation 29 | * Trademark has to be moved to open source entity 30 | * For leaving, if we remain open source we can get trademark back (probably) 31 | * Onboarding to Linux foundation temporarily blocked for non-blockchain projects? 32 | 33 | 28m: 34 | * If we just get Microsoft and Amazon, that should be enough to start 35 | * Microsoft already gives a lot of money to TLA+ internally 36 | * Letters of intent - they have to talk to legal departments 37 | * Is it required to have donors before graduating from project to foundation? 38 | * Can Microsoft's internal TLA+ support be redirected to foundation? 39 | 40 | 47m: 41 | * Action items 42 | 43 | 50m: 44 | * Discussion about model-based testing vs. trace validation 45 | -------------------------------------------------------------------------------- /minutes/2022-02-25.md: -------------------------------------------------------------------------------- 1 | # TLA+ Meeting 02/25/2022 2 | 3 | 2m: 4 | * Discuss Hillel's community survey questions 5 | * Leslie reached out to Facebook 6 | * Government support for TLA+? 7 | 8 | 10m: 9 | * Linux foundation gave us material from GraphQL foundation 10 | * How can we actually decide membership & governance levels? 11 | * We don't know what our budget is 12 | 13 | 16m: 14 | * Should we allow funds to be earmarked through the foundation? 15 | * If companies want earmarks they can contract people directly 16 | 17 | 21m: 18 | * How many people are needed to just maintain the software? 19 | * Probably around two full-time people are needed 20 | * Two people might be able to implement some simple features too 21 | * If we get $300k/year that would be good 22 | 23 | 25m: 24 | * $150k/year is not that much for a large company 25 | * Focus on how to get the first dollar 26 | * Regular membership is much lower than $150k/year usually 27 | * Membership is mostly for individuals and small companies? 28 | * $150k/year large company membership? Ideally committing to multiple years. 29 | 30 | 31m: 31 | * Who manages the engineers we hire? 32 | * Do large FOSS projects even have managers? 33 | * Depends on scale: they're called reviewers 34 | * There will be a board, they set a general agenda & roadmap 35 | * Hire senior engineer (self-managing) and junior engineer 36 | 37 | 37m: 38 | * Can senior engineer make modifications to TLA+ language itself? 39 | * No, it has to go through RFC process and steering community 40 | * Who sits on the steering committee? What does governance look like? 41 | * On OpenJDK you need to get voted into the steering committee 42 | * Linux foundation would take around 9% of membership fees 43 | 44 | 42m: 45 | * Need to decide process by which people are appointed to steering committee 46 | * How much do we need to figure out before we form the foundation? 47 | * Do member companies care about the steering committee? 48 | 49 | 47m: 50 | * Scope of board vs. steering community 51 | * Generally people appointed to board aren't technical? 52 | 53 | 50m: 54 | * Is governance structure a roadblock? 55 | * There will be feedback loops between steering cmte & board 56 | * Should there be a BDFL-type person who holds ultimate appeal? 57 | * BFT-type 66% vote threshold on steering community? 58 | * We currently have BDFL-type setup with Leslie right now 59 | 60 | 60m: 61 | * What level of detail do we need for the constitution? 62 | * Have any books been written about this stuff? 63 | * Ron update: work with Oracle ERO (work with external researches) 64 | * Ron presented to ERO board about online trace checking 65 | * Stefan Merz will get the funding 66 | * Ron also integrated Leslie's comments into executive summary 67 | 68 | 66m: 69 | * Work items before next meeting 70 | -------------------------------------------------------------------------------- /minutes/2022-03-02.md: -------------------------------------------------------------------------------- 1 | # TLA+ Meeting 03/02/2022 2 | 0m: 3 | * What alternatives to TLA+ exist? 4 | * How can we improve/unify the TLA+ ecosystem? 5 | * How can we improve the toolbox dev experience? 6 | 7 | 30m: 8 | * Will have individual contributor representative on the board 9 | * Smaller companies get aggregated into one rep 10 | * If board is nontechnical then we need a CTO? 11 | * Do we need a release/infrastructure engineer? 12 | * Infra also includes advanced testing like benchmarking 13 | 14 | 40m: 15 | * Foundation mostly funds "tragedy of the commons" type projects 16 | * We should hire an infrastructure engineer first 17 | * We should start with writing a job description 18 | * Can copy Informal Systems' reliability engineer job description 19 | 20 | 47m: 21 | * Hiring people in other countries seems like a good idea 22 | * Countries that have socialized healthcare for example 23 | * Are individual membership levels discounted for people in other countries? 24 | 25 | 55m: 26 | * Changes to strange loop conf: more academic focus? 27 | 28 | 65m: 29 | * TLA+ type checking 30 | -------------------------------------------------------------------------------- /minutes/2022-03-25.md: -------------------------------------------------------------------------------- 1 | # TLA+ Meeting 03/25/2022 2 | 3 | 7m: 4 | * Markus reached out to Linux foundation 5 | * Do members of TLA+ foundation have to become members of Linux Foundation (LF)? 6 | * $15k for big companies to be members of LF 7 | * $5k for smaller companies 8 | * TLA+ project onboarded to LF Insights service 9 | 10 | 10m: 11 | * Go over initial community survey responses 12 | * Most people located in USA and Western Europe 13 | * Community channels: mostly google group and github issues 14 | * Plurality of people never use PlusCal, just TLA+ 15 | * TLA+ toolbox still used by majority of people 16 | * Almost everyone uses TLC, most have no experience with Apalache and TLAPS 17 | 18 | 30m: 19 | * Limited interest in spec-to-code translation/correspondence 20 | * There is demand for documentation - what kind of documentation? 21 | * It would be good to have documentation in HTML, not just PDF 22 | 23 | 40m: 24 | * Very few people said they were experts of TLA+ 25 | * Most people don't have reason/time to contribute to TLA+ 26 | 27 | 46m: 28 | * Show opening community modules repo in github codespaces 29 | 30 | 52m: 31 | * Surprising number of TLA+ users in industry vs. academia compared to other formal methods 32 | 33 | 63m: 34 | * Ron helped Stephan get funding from Oracle 35 | * Executive summary 36 | * Recast TLA+ as improving value of software rather than reducing dev costs -------------------------------------------------------------------------------- /minutes/2024-05-28.md: -------------------------------------------------------------------------------- 1 | # TLA+ Meeting 05/28/2024 2 | 3 | MINUTES OF GOVERNING BOARD (FOR PUBLIC RELEASE) 4 | 5 | A meeting of the Governing Board of the TLA+ Foundation was held on 28th MAY 2024 at 11:04 am Eastern Time via teleconference. 6 | 7 | **Governing Board Members In Attendance** 8 | 9 | 10 | 11 | 13 | 15 | 17 | 18 | 19 | 21 | 23 | 25 | 26 | 27 | 29 | 31 | 33 | 34 | 35 | 37 | 39 | 41 | 42 |
    TLA+ Board Members 12 | Present 14 | Company 16 |
    Chris Newcombe 20 | X 22 | Oracle America Inc. 24 |
    Leslie Lamport 28 | X 30 | Microsoft Corporation 32 |
    julia ferraioli 36 | X 38 | Amazon Web Services 40 |
    43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 |
    Linux Foundation StaffPresentTitle
    Khahil WhiteXProgram Manager
    Dr. Amanda MartinXProgram Director
    John WalickiXDirector of Program Management
    66 | 67 | ### Introduction 68 | 69 | Khahil White (KW) called the meeting to order at 11:00 am Eastern Time, Khahil White (KW) recorded the minutes. A quorum of Governing Board Members was established for the conduct of business, and the meeting, having been duly convened, was ready to proceed with business. 70 | 71 | ### Attendance, Antitrust, Voting 72 | 73 | KW introduced the objectives and agenda for the meeting. There were no additional topics added. 74 | 75 | ### Staffing Update 76 | 77 | KW introduced Dr. Amanda Martin, who will be taking over PMO responsibilities on the TLA+ Foundation. 78 | 79 | ### Governing Board Meeting Cadence 80 | 81 | KW introduced the topic of scheduling the GB meeting cadence. No consensus was reached, so the PMO will follow up via email and establish a schedule. 82 | 83 | ### Grant Decisions 84 | 85 | KW facilitated a discussion on the range of TLA+ Foundation grants. 86 | 87 | Decisions: Grants will range from $1,000 USD to $100,000 USD. 88 | 89 | Chris Newcombe (CN) to build a list of people to review grant applications. 90 | 91 | ### Additional Topics 92 | 93 | KW called for additional topics, and Chris Newcombe (CN) mentioned renewal cycle timing. 94 | 95 | John Walicki explained the process for membership renewal, stating that since Oracle has already signed a participation agreement and is not changing it, the renewal would occur automatically based on the previous agreement. 96 | 97 | ### Closing 98 | 99 | KW called the meeting to a close, and the Governing Board's meeting was adjourned at 11:52 AM Eastern Time. 100 | 101 | **Action Items** 102 | 103 | - [x] PMO to deliver embed code to Julia 104 | - [ ] Revise copy on submission form 105 | - [x] PMO to revise timelines 106 | - Announcement of Call for Proposals - June 15 107 | - Form and website online (TLA+ conf) 108 | - Submission Deadline - July 31 109 | - Review of proposals from July 31 to approximately August 30, 2024. 110 | - Notification to Applicants - September 2 111 | - Decisions communicated by September 2, 2024. 112 | - [x] PMO to send board grant proposal template examples 113 | - [x] PMO to establish GB meeting cadence 114 | - [x] PMO to follow up on Gsuite and MX records with LF IT team 115 | - [ ] Asynchronous: TLA+ Website discussion 116 | - [x] Review the TLA+ Foundation charter for any other unfulfilled obligations 117 | 118 | **Topics for the next meeting** 119 | 120 | - Website 121 | - Getting new members and building a pitch deck 122 | - Building a Specifications Committee, as stated in the charter 123 | - Building an Outreach Committee, as stated in the charter 124 | 125 | **Async Vote:** 126 | 127 | Stephan Merz is the chair of the Specification Language Committee (“SLC”). 128 | -------------------------------------------------------------------------------- /static/docs/TLA+ Project Technical Charter.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tlaplus/foundation/0991cfbc396e8528c5f1a0f71bdae9f027c4adb3/static/docs/TLA+ Project Technical Charter.pdf -------------------------------------------------------------------------------- /static/logos/amazon-web-services-inc.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /static/logos/microsoft-corporation.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 32 | 33 | 34 | 36 | 37 | 45 | 47 | 53 | 58 | 64 | 70 | 77 | 81 | 83 | 84 | 85 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /static/logos/oracle-america-inc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tlaplus/foundation/0991cfbc396e8528c5f1a0f71bdae9f027c4adb3/static/logos/oracle-america-inc.png -------------------------------------------------------------------------------- /static/logos/oracle-america-inc.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /static/logos/tla.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tlaplus/foundation/0991cfbc396e8528c5f1a0f71bdae9f027c4adb3/static/logos/tla.jpg --------------------------------------------------------------------------------