{"id":51342537,"url":"https://github.com/thpani/testing-distsys-devconf26","last_synced_at":"2026-07-02T09:02:55.808Z","repository":{"id":365057010,"uuid":"1270041399","full_name":"thpani/testing-distsys-devconf26","owner":"thpani","description":"Workshop \"Find distributed systems bugs before production\" at DevConf.CZ. Brno, June 2026","archived":false,"fork":false,"pushed_at":"2026-06-15T16:57:49.000Z","size":984,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-15T18:21:40.942Z","etag":null,"topics":["control-plane","controller","distributed-systems","formal-methods","formal-specification","formal-verification","kubernetes","model-based-testing","production-readiness","property-based-testing","reliability","reliability-engineering","site-reliability-engineering","spec-driven-development","specification","sre","testing"],"latest_commit_sha":null,"homepage":"https://wunderspec.com","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/thpani.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-15T10:25:46.000Z","updated_at":"2026-06-15T17:15:59.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/thpani/testing-distsys-devconf26","commit_stats":null,"previous_names":["thpani/testing-distsys-devconf26"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/thpani/testing-distsys-devconf26","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thpani%2Ftesting-distsys-devconf26","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thpani%2Ftesting-distsys-devconf26/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thpani%2Ftesting-distsys-devconf26/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thpani%2Ftesting-distsys-devconf26/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thpani","download_url":"https://codeload.github.com/thpani/testing-distsys-devconf26/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thpani%2Ftesting-distsys-devconf26/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35040024,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-02T02:00:06.368Z","response_time":173,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["control-plane","controller","distributed-systems","formal-methods","formal-specification","formal-verification","kubernetes","model-based-testing","production-readiness","property-based-testing","reliability","reliability-engineering","site-reliability-engineering","spec-driven-development","specification","sre","testing"],"created_at":"2026-07-02T09:02:55.123Z","updated_at":"2026-07-02T09:02:55.799Z","avatar_url":"https://github.com/thpani.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Find distributed systems bugs before production\n\nWorkshop repository for the [DevConf.CZ 2026][] talk **“Find distributed systems\nbugs before production… with executable specifications”** by [Igor Konnov][] and\n[Thomas Pani][].\n\n**Slides:** [https://wunderspec.com/devconf](https://wunderspec.com/devconf)\n\nThe workshop uses a small DNS control-plane system to show how executable\nspecifications, randomized search, and model-based testing can expose\ndistributed-systems bugs before they reach production. The core idea is to use\nexecutable models as test-generation machines.\n\n## Workshop scenario\n\nThe system under test is **ACME CloudDB**, a fictional cloud database endpoint backed by a\nDNS control plane.\n\nThe control plane has a planner, multiple independent deployers, and a fake DNS service\ncalled Wormhole53. It is intentionally small, but it captures a class of real distributed\nsystems problems: bugs caused by timing, ordering, stale state, retries, and cleanup races.\n\nThe goal is to **\"shift left\"**: find the outage-causing behavior before it reaches\nproducation and causes an expensive outage.\n\n## Repository layout\n\n### `dns-control-plane-lab/`\n\nA runnable Python/FastAPI lab application that simulates the ACME Cloud DNS control plane.  \nIt includes:\n\n- a fake Wormhole53 DNS service,\n- a planner that writes immutable DNS plans,\n- three independent deployers that apply and clean up plans,\n- persistence simulated on-disk under `s3-persistence/`, and\n- an `/mbt` API used by the model-based testing harness.\n\nUseful commands:\n\n```sh\ncd dns-control-plane-lab\nmake run    # serve the workshop app at http://localhost:8000\nmake test   # run lab tests\nmake clean  # remove generated local state\n```\n\nSee [`dns-control-plane-lab/README.md`](dns-control-plane-lab/README.md) for details.\n\n### `spec/`\n\nAn executable specification of the DNS balancer/control-plane behavior in [Wunderspec][].\n\nIt contains:\n\n- `dns_balancer.py`, the main WunderSpec model,\n- invariants such as root and rollback consistency checks,\n- randomized search and replay workflows for finding counterexample traces, and\n- `visualize_dns_trace.py` for generating an HTML trace viewer.\n\nSee [`spec/README.md`](spec/README.md) for setup, randomized search, replay, and visualization commands.\n\n### `mbt/`\n\nModel-based testing glue between traces produced by `spec/` and the runnable lab in\n`dns-control-plane-lab/`.\n\nThe replay script reads Wunderspec ITF traces, drives the lab through its `/mbt` API, and checks that\n`clouddb.us-east-1.api.acme` remains resolvable after each relevant action. Counterexample\ntraces are expected to fail and produce the outage behavior.\n\nSee [`mbt/README.md`](mbt/README.md) for replay examples.\n\n## Top-level commands\n\nThe root `Makefile` provides shortcuts for workshop flows:\n\n```sh\nmake spec-story  # check code blocks in spec-story.md\nmake mbt         # replay the checked-in ITF trace against the lab\n```\n\n## Workshop flow\n\nA typical path through the material is:\n\n1. Run and inspect the lab in `dns-control-plane-lab/`.\n2. Discuss what ordinary tests cover, and what distributed-systems bugs they miss.\n3. Explore the executable model in `spec/` and search for invariant violations.\n4. Export an ITF trace from the model.\n5. Replay that trace against the implementation using `mbt/`.\n\n## About\n\nFor more information about the speakers, the talk, and the workshop, see:\n- [wunderspec.com](https://wunderspec.com/): the executable specification framework used in the workshop\n- [konnov.phd][Igor Konnov]: Igor's professional website\n- [protocols-made-fun.com][]: Igor's blog on protocol design and testing\n- [blltprf.xyz][Thomas Pani]: Thomas's professional website and blog\n\n[Igor Konnov]: https://konnov.phd/\n[Thomas Pani]: https://blltprf.xyz/\n[DevConf.CZ 2026]: https://www.devconf.info/cz/\n[Wunderspec]: https://github.com/wunderspec/wunderspec\n[protocols-made-fun.com]: https://protocols-made-fun.com/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthpani%2Ftesting-distsys-devconf26","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthpani%2Ftesting-distsys-devconf26","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthpani%2Ftesting-distsys-devconf26/lists"}