{"id":19840923,"url":"https://github.com/torvaney/chaoscat","last_synced_at":"2025-10-29T13:09:31.378Z","repository":{"id":133824033,"uuid":"185682910","full_name":"Torvaney/chaoscat","owner":"Torvaney","description":"Chaos engineering for Pull Requests - Taking a not-even-good joke a bit too far","archived":false,"fork":false,"pushed_at":"2019-05-18T11:34:25.000Z","size":59,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-06-04T17:10:19.437Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Haskell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Torvaney.png","metadata":{"files":{"readme":"README.md","changelog":"ChangeLog.md","contributing":null,"funding":null,"license":"LICENSE","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}},"created_at":"2019-05-08T21:39:32.000Z","updated_at":"2019-05-18T15:03:04.000Z","dependencies_parsed_at":"2024-04-08T11:47:11.721Z","dependency_job_id":null,"html_url":"https://github.com/Torvaney/chaoscat","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Torvaney/chaoscat","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Torvaney%2Fchaoscat","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Torvaney%2Fchaoscat/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Torvaney%2Fchaoscat/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Torvaney%2Fchaoscat/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Torvaney","download_url":"https://codeload.github.com/Torvaney/chaoscat/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Torvaney%2Fchaoscat/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279325505,"owners_count":26148880,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-17T02:00:07.504Z","response_time":56,"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":[],"created_at":"2024-11-12T12:28:43.671Z","updated_at":"2025-10-17T10:18:11.728Z","avatar_url":"https://github.com/Torvaney.png","language":"Haskell","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# ChaosCat\n\nChaos engineering for Pull Requests. ChaosCat merges open pull requests\nat random, subject to configurable parameters.\n\nClone and run with stack:\n\n``` bash\ngit clone\ncd chaoscat\n\n# Set environment variables\nexport CHAOSCAT_OWNER=torvaney\nexport CHAOSCAT_REPO=example-pr-repo\nexport CHAOSCAT_AUTH=abcdefghijklmnop  # Put your actual GitHub auth token here\nexport CHAOSCAT_RATE=0.5       # Avg hours (after minimum) before closing a pull request\nexport CHAOSCAT_MINHOURS=0.15  # Minimum hours before a pull request is closed\n\nstack run\n```\n\n## How does it work?\n\nChaosCat will merge Pull Requests according to an [exponential\ndistribution](https://en.wikipedia.org/wiki/Exponential_distribution).\nThis means that Pull Requests will be merged independently of one\nanother, and at a constant average rate.\n\nThis average rate is configured with the `CHAOSCAT_RATE` environment\nvariable, which sets the average (mean) time before a Pull Request is\nclosed.\n\nYou can also set a minimum amount of time before a Pull Request gets\nmerged, with the `CHAOSCAT_MINHOURS` environment variable.\n\nWe can see what this distribution looks like in practice when applied to\nthe\n[torvaney/example-pr-repo](https://github.com/torvaney/example-pr-repo)\nrepo with a minimum time of 0.15 hours (9 mins) and a rate of 0.5 hours\n(30 mins):\n\n![](README_files/figure-gfm/plot-pr-distribution-1.png)\u003c!-- --\u003e\n\nAs you can see, no Pull Requests are merged initially. But once the\nminimum time threshold is passed, they are merged at random, following\nthe exponential curve as expected (pink line).\n\n## But… why?\n\nChaosCat is a response to the question no one has been asking: what if\nwe applied the principles of [Chaos\nEngineering](https://en.wikipedia.org/wiki/Chaos_engineering) to our\ndevelopment practices themselves?\n\n[principlesofchaos.org](http://principlesofchaos.org) states that\n\n\u003e Chaos Engineering is the discipline of experimenting on a system in\n\u003e order to build confidence in the system’s capability to withstand\n\u003e turbulent conditions in production.\n\nIn the same way, if we want to ensure that you can ship features to\nproduction frequently, and gracefully handle bugs, what better way than\nto ship features… automatically?\n\nChaoscat (named after GitHub’s Octocat and Netflix’s Chaos Monkey)\nmerges your pull requests at random, forcing you to develop robust\nprocesses around code review and feature releases\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftorvaney%2Fchaoscat","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftorvaney%2Fchaoscat","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftorvaney%2Fchaoscat/lists"}