{"id":30396147,"url":"https://github.com/pancsta/asyncmachine-go","last_synced_at":"2026-04-02T21:05:27.392Z","repository":{"id":216789729,"uuid":"741530725","full_name":"pancsta/asyncmachine-go","owner":"pancsta","description":"Batteries-included graph control flow library (AOP, actor model, state-machine)","archived":false,"fork":false,"pushed_at":"2025-12-22T16:31:04.000Z","size":23209,"stargazers_count":157,"open_issues_count":30,"forks_count":3,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-12-24T01:36:38.855Z","etag":null,"topics":["actor-model","aop","concurrency","consensus","control-flow","declarative","distributed","golang","graph","libp2p","negotiation","network","orchestrator","pubsub","rpc","state-machine","sync","workflows"],"latest_commit_sha":null,"homepage":"https://asyncmachine.dev","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pancsta.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":"ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-01-10T15:34:09.000Z","updated_at":"2025-12-22T16:26:46.000Z","dependencies_parsed_at":"2024-01-18T10:31:05.274Z","dependency_job_id":"a3cc6f6b-e446-44a0-84f5-9d05eff555ee","html_url":"https://github.com/pancsta/asyncmachine-go","commit_stats":null,"previous_names":["pancsta/asyncmachine-go"],"tags_count":34,"template":false,"template_full_name":null,"purl":"pkg:github/pancsta/asyncmachine-go","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pancsta%2Fasyncmachine-go","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pancsta%2Fasyncmachine-go/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pancsta%2Fasyncmachine-go/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pancsta%2Fasyncmachine-go/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pancsta","download_url":"https://codeload.github.com/pancsta/asyncmachine-go/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pancsta%2Fasyncmachine-go/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28550464,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T20:59:07.572Z","status":"ssl_error","status_checked_at":"2026-01-18T20:59:02.799Z","response_time":98,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["actor-model","aop","concurrency","consensus","control-flow","declarative","distributed","golang","graph","libp2p","negotiation","network","orchestrator","pubsub","rpc","state-machine","sync","workflows"],"created_at":"2025-08-21T12:22:23.476Z","updated_at":"2026-04-02T21:05:27.377Z","avatar_url":"https://github.com/pancsta.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![](https://goreportcard.com/badge/github.com/pancsta/asyncmachine-go)](https://goreportcard.com/report/github.com/pancsta/asyncmachine-go)\n[![](https://pkg.go.dev/badge/github.com/pancsta/asyncmachine-go.svg)](https://pkg.go.dev/github.com/pancsta/asyncmachine-go)\n[![website](https://img.shields.io/badge/asyncmachine-.dev-blue)](https://asyncmachine.dev)\n![](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/pancsta/c6032233dc1d632732ecdc1a4c119850/raw/loc-pkg.json)\n![](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/pancsta/c6032233dc1d632732ecdc1a4c119850/raw/loc-tools.json)\n![](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/pancsta/c6032233dc1d632732ecdc1a4c119850/raw/tests.json)\n![](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/pancsta/c6032233dc1d632732ecdc1a4c119850/raw/tests-pkg.json)\n![](https://img.shields.io/github/v/release/pancsta/asyncmachine-go)\n[![](https://img.shields.io/github/last-commit/pancsta/asyncmachine-go/main)](https://github.com/pancsta/asyncmachine-go/commits/main/)\n[![](https://matrix.to/img/matrix-badge.svg)](https://matrix.to/#/#room:asyncmachine)\n\n\u003cdiv align=\"center\"\u003e\n    \u003ca href=\"#samples\"\u003eSamples\u003c/a\u003e .\n    \u003ca href=\"#getting-started\"\u003eGetting Started\u003c/a\u003e .\n    \u003ca href=\"#packages\"\u003ePackages\u003c/a\u003e .\n    \u003ca href=\"#devtools\"\u003eDevtools\u003c/a\u003e .\n    \u003ca href=\"#apps\"\u003eApps\u003c/a\u003e .\n    \u003ca href=\"#documentation\"\u003eDocs\u003c/a\u003e .\n    \u003ca href=\"#faq\"\u003eFAQ\u003c/a\u003e .\n    \u003ca href=\"#changes\"\u003eChanges\u003c/a\u003e\n    \u003cbr /\u003e\n\u003c/div\u003e\n\n# \u003cimg src=\"https://pancsta.github.io/assets/asyncmachine-go/logo.png\" height=\"25\" width=\"25\" /\u003e asyncmachine-go\n\n\u003cdiv align=\"center\"\u003e\u003cpicture\u003e\n  \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://pancsta.github.io/assets/asyncmachine-go/lifecycle.dark.png\"\u003e\n  \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://pancsta.github.io/assets/asyncmachine-go/lifecycle.light.png\"\u003e\n  \u003cimg alt=\"OpenTelemetry traces in Jaeger\" src=\"https://pancsta.github.io/assets/asyncmachine-go/lifecycle.light.png\"\u003e\n\u003c/picture\u003e\u003c/div\u003e\n\n\u003e [!NOTE]\n\u003e State machines communicate through states.\n\n**asyncmachine-go** is a distributed workflow engine (technically a pathless control-flow graph with a consensus),\nwhich implements [AOP](https://en.wikipedia.org/wiki/Aspect-oriented_programming) and [actor model](https://en.wikipedia.org/wiki/Actor_model)\nthrough a **[clock-based state-machine](/pkg/machine/README.md)**. It features [atomic transitions](/docs/manual.md#transition-lifecycle),\n[relations](/docs/manual.md#relations), [transparent RPC](/pkg/rpc/README.md), [TUI debugger](/tools/cmd/am-dbg/README.md),\n[telemetry](/pkg/telemetry/README.md), [REPL](/tools/cmd/arpc/README.md), [selective distribution](/pkg/rpc/README.md#selective-distribution),\n[diagrams](/tools/cmd/am-vis/README.md), and [WASM](/docs/wasm.md) support.\n\nAs a control flow library, it decides about running of predefined bits of code (transition handlers) - their order and\nwhich ones to run, according to currently active states (flags). Thanks to a [novel state machine](/pkg/machine/README.md),\nthe number of handlers can be minimized while maximizing scenario coverage. It's lightweight, fault-tolerant by design,\nhas rule-based mutations, and can target virtually *any* step-in-time, in *any* workflow. It's a low-level\ntool with acceptable performance.\n\n**asyncmachine-go** takes care of `context`, `select`, and `panic`, while allowing for graph-structured concurrency\nwith [goroutine cancelation](https://github.com/pancsta/asyncmachine-go/pull/261). The history log and relations have\nvector formats. It aims to create **autonomous** workflows with **organic** control flow and **stateful** APIs.\n\n\u003cdiv align=\"center\" class=\"video\"\u003e\n    \u003ca href=\"https://github.com/pancsta/asyncmachine-go/blob/main/tools/cmd/am-dbg/README.md\"\u003e\n        \u003cimg style=\"min-height: 820px\"\n            src=\"https://github.com/user-attachments/assets/84613447-87dc-48da-9e76-7b4c76705fd3\"\n            alt=\"TUI Debugger\" /\u003e\n    \u003c/a\u003e\n\u003c/div\u003e\n\n#### *Each state represents*\n\n- binary flag\n- node with relations\n- AOP aspect\n- ***logical clock***\n- subscription topic\n- multiple methods\n- metric\n- trace\n- lock\n- breakpoint\n\nBesides the main use-case of **workflows**, it can be used for **stateful applications of any size** - daemons, UIs,\nconfigs, bots, firewalls, synchronization consensus, games, smart graphs, microservice orchestration, robots, contracts,\nstreams, DI containers, message broking, test scenarios, simulators, as well as **\"real-time\" systems** which rely on\ninstant cancelation.\n\n\u003cdiv align=\"center\"\u003e\n    \u003ca href=\"https://github.com/pancsta/assets/blob/main/asyncmachine-go/am-vis.svg?raw=true\"\u003e\n        \u003cimg style=\"min-height: 263px\"\n            src=\"https://pancsta.github.io/assets/asyncmachine-go/am-vis.svg?raw=true\" alt=\"am-vis\" /\u003e\n    \u003c/a\u003e\n\u003c/div\u003e\n\n\u003e [!NOTE]\n\u003e Flow is state, and state is flow, in a graph.\n\n## Samples\n\n**Minimal** - an untyped definition of 2 states and 1 relation, then 1 mutation and a check.\n\n```go\nimport am \"github.com/pancsta/asyncmachine-go/pkg/machine\"\n// ...\nmach := am.New(nil, am.Schema{\n    \"Foo\": {Require: am.S{\"Bar\"}},\n    \"Bar\": {},\n}, nil)\nmach.Add1(\"Foo\", nil)\nmach.Is1(\"Foo\") // false\n```\n\n**Complicated** - wait on a multi state (event) and the Ready state with a 1s\ntimeout, then mutate with typed args, on top of a state context.\n\n```go\n// state ctx is an expiration ctx\nctx := client.Mach.NewStateCtx(ssC.WorkerReady)\n// clock-based subscription\nwhenPayload := client.Mach.WhenTicks(ssC.WorkerPayload, 1, ctx)\n// state mutation\nclient.RpcWorker.NetMach.Add1(ssW.WorkRequested, Pass(\u0026A{\n    Input: 2}))\n// WaitFor* wraps select statements\nerr := amhelp.WaitForAll(ctx, time.Second,\n    // post-mutation subscription\n    mach.When1(ss.BasicStatesDef.Ready, nil),\n    // pre-mutation subscription\n    whenPayload)\n// check cancelation\nif ctx.Err() != nil {\n    return // state ctx expired\n}\n// check error\nif err != nil {\n    // error state mutation\n    client.Mach.AddErr(err, nil)\n    return // no err required\n}\n// client/WorkerPayload and mach/Ready activated\n```\n\n\u003cdiv align=\"center\"\u003e\n    \u003ca href=\"https://github.com/pancsta/asyncmachine-go/blob/main/tools/cmd/arpc/README.md\"\u003e\n        \u003cimg src=\"https://pancsta.github.io/assets/asyncmachine-go/videos/repl-demo1.gif\"\n            alt=\"REPL\" /\u003e\n    \u003c/a\u003e\n\u003c/div\u003e\n\n\u003e [!NOTE]\n\u003e Clock-based navigation in time.\n\n**Handlers** - [Aspect Oriented](https://en.wikipedia.org/wiki/Aspect-oriented_programming) transition handlers.\n\n```go\n// can Foo activate?\nfunc (h *Handlers) FooEnter(e *am.Event) bool {\n    return true\n}\n// with Foo active, can Bar activate?\nfunc (h *Handlers) FooBar(e *am.Event) bool {\n    return true\n}\n// Foo activates\nfunc (h *Handlers) FooState(e *am.Event) {\n    h.foo = NewConn()\n}\n// Foo de-activates\nfunc (h *Handlers) FooEnd(e *am.Event) {\n    h.foo.Close()\n}\n```\n\n**Schemas** - relational schemas ([aRPC server](/pkg/rpc/states/ss_rpc.go)).\n\n```go\nvar ServerSchema = am.Schema{\n    ssF.ClientConnected: {Require: S{ssS.RpcReady}},\n    ssF.ErrDelivery:     {Require: S{ssS.Exception}},\n    ssF.ErrHandlerTimeout: {\n        Add:     S{ssS.Exception},\n        Multi:   true,\n        Require: S{ssS.Exception},\n    },\n    ssF.ErrNetwork: {\n        Remove:  S{ssS.ClientConnected},\n        Require: S{ssS.Exception},\n    },\n    ssF.ErrNetworkTimeout: {Require: S{ssS.Exception}},\n    ssF.ErrOnClient:       {Require: S{ssS.Exception}},\n    ssF.ErrProviding:      {Require: S{ssS.Exception}},\n    ssF.ErrRpc:            {Require: S{ssS.Exception}},\n    ssF.ErrSendPayload:    {Require: S{ssS.Exception}},\n    ssF.Exception:         {Multi: true},\n    ssF.HandshakeDone: {\n        Remove:  S{ssS.Handshaking, ssS.HandshakeDone, ssS.Exception},\n        Require: S{ssS.Start, ssS.ClientConnected},\n    },\n    ssF.Handshaking: {\n        Remove:  S{ssS.Handshaking, ssS.HandshakeDone},\n        Require: S{ssS.Start},\n    },\n    ssF.Healthcheck: {Multi: true},\n    ssF.Heartbeat:   {},\n    ssF.MetricSync:  {Multi: true},\n    ssF.Ready: {\n        Auto:    true,\n        Require: S{ssS.HandshakeDone, ssS.RpcReady},\n    },\n    ssF.RpcAccepting: {\n        Remove:  S{ssS.RpcStarting, ssS.RpcAccepting, ssS.RpcReady},\n        Require: S{ssS.Start},\n    },\n    ssF.RpcReady: {\n        Remove:  S{ssS.RpcStarting, ssS.RpcAccepting, ssS.RpcReady},\n        Require: S{ssS.Start},\n    },\n    ssF.RpcStarting: {\n        Remove:  S{ssS.RpcStarting, ssS.RpcAccepting, ssS.RpcReady},\n        Require: S{ssS.Start},\n    },\n    ssF.SendPayload:     {Multi: true},\n    ssF.Start:           {Add: S{ssS.RpcStarting}},\n    ssF.WebSocketTunnel: {},\n}\n```\n\nAll examples and benchmarks can be found in [`/examples`](/examples/README.md).\n\n\u003cdiv align=\"center\"\u003e\n    \u003ca href=\"https://github.com/pancsta/asyncmachine-go/blob/main/pkg/telemetry/README.md#open-telemetry-traces\"\u003e\n\u003cpicture\u003e\n  \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://pancsta.github.io/assets/asyncmachine-go/otel-jaeger.dark.png\"\u003e\n  \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://pancsta.github.io/assets/asyncmachine-go/otel-jaeger.light.png\"\u003e\n  \u003cimg alt=\"OpenTelemetry traces in Jaeger\" src=\"https://pancsta.github.io/assets/asyncmachine-go/otel-jaeger.light.png\"\u003e\n\u003c/picture\u003e\n\u003c/a\u003e\u003c/div\u003e\n\n## Getting Started\n\n- 🦾 **[`/pkg/machine`](pkg/machine/README.md)** is the main package\n- [`/docs/manual.md`](/docs/manual.md) is the go-to\n- [`/docs/diagrams.md`](/docs/diagrams.md) try to explain things visually\n- [`/examples`](/examples/README.md) show use cases and integrations\n    - with [`/examples/mach_template`](/examples/mach_template) being ready for copy-paste\n    - also [DAG](/examples/dag_dependency_graph), [CLI Daemon](/examples/cli_daemon), [aRPC](/examples/arpc), [WASM](/examples/wasm),\n      [WASM Workflow](/examples/wasm_workflow), [TUI](/examples/tui)\n- [`/tools/cmd/am-gen`](/tools/cmd/am-gen) will bootstrap\n- [`/tools/cmd/am-dbg`](/tools/cmd/am-dbg/README.md) will record every detail\n- [`/pkg/node`](pkg/node) shows a high-level usage\n- and [reading tests](https://github.com/search?q=repo%3Apancsta%2Fasyncmachine-go+path%3A%2F.*_test.go%2F\u0026type=code)\n  is always a good idea\n\n## [Packages](/pkg)\n\nThis monorepo offers the following importable packages, especially:\n\n- 🦾 **[`/pkg/machine`](/pkg/machine) State machine, dependency free, semver compatible.**\n- [`/pkg/states`](/pkg/states) Reusable state schemas, handlers, and piping.\n- [`/pkg/helpers`](/pkg/helpers) Useful functions when working with async state machines.\n- [`/pkg/telemetry`](/pkg/telemetry) Telemetry exporters for dbg, metrics, traces, and logs.\n\nOther packages:\n\n- [`/pkg/rpc`](/pkg/rpc) Remote state machines, with the same API as local ones.\n- [`/pkg/history`](/pkg/history) History tracking and traversal, including Key-Value and SQL.\n- [`/pkg/integrations`](/pkg/integrations) Integrations with NATS and JSON.\n- [`/pkg/graph`](/pkg/graph) Directional multigraph of connected state machines.\n- [`/pkg/node`](/pkg/node) Distributed worker pools with supervisors.\n- [`/pkg/pubsub`](/pkg/pubsub) Decentralized PubSub based on libp2p gossipsub.\n\n## [Devtools](/tools)\n\n- [`/tools/cmd/am-dbg`](/tools/cmd/am-dbg/README.md) Multi-client TUI debugger.\n- [`/tools/cmd/am-gen`](/tools/cmd/am-gen) Generates schema files and Grafana dashboards.\n- [`/tools/cmd/arpc`](/tools/cmd/arpc) Network-native REPL and CLI.\n- [`/tools/cmd/am-vis`](/tools/cmd/am-vis) Generates D2 diagrams.\n- [`/tools/cmd/am-relay`](/tools/cmd/am-relay) Rotates logs and relays WASM.\n\n\u003cdiv align=\"center\"\u003e\n    \u003ca href=\"/tools/cmd/am-dbg/README.md\"\u003e\n        \u003cimg src=\"https://pancsta.github.io/assets/asyncmachine-go/am-dbg-dashboard.png\"\n            alt=\"am-dbg\"\u003e\n    \u003c/a\u003e\n\u003c/div\u003e\n\n\u003e [!NOTE]\n\u003e Inspecting cause-and-effect in distributed systems.\n\n## Apps\n\n**asyncmachine-go** synchronizes state for the following projects:\n\n- [secai](https://github.com/pancsta/secai) - AI Workflows framework\n- [secai Web UI](https://github.com/pancsta/secai/tree/main/web) - WebAssembly [go-app](https://go-app.dev/) PWA\n- Self-hosting of [pkg/rpc](pkg/rpc/states), [pkg/node](pkg/node/states), [pkg/pubsub](pkg/pubsub/states)\n- [arpc REPL](/tools/repl/states) - Cobra-based REPL\n- [am-dbg TUI Debugger](/tools/debugger/states) - Single state-machine TUI app\n- [libp2p PubSub Simulator](https://github.com/pancsta/go-libp2p-pubsub-benchmark/#libp2p-pubsub-simulator) - Sandbox\n  simulator for libp2p-pubsub\n- [libp2p PubSub Benchmark](https://github.com/pancsta/go-libp2p-pubsub-benchmark/#libp2p-pubsub-benchmark) -\n  Benchmark of libp2p-pubsub ported to asyncmachine-go\n\n## Documentation\n\n- API: [pkg.go.dev](https://pkg.go.dev/github.com/pancsta/asyncmachine-go/pkg/machine) / [code.asyncmachine.dev](https://code.asyncmachine.dev)\n- [diagrams](/docs/diagrams.md) / [cookbook](/docs/cookbook.md)\n- [manual MD](/docs/manual.md) / [manual PDF](https://pancsta.github.io/assets/asyncmachine-go/manual.pdf)\n    - [Machine and States](/docs/manual.md#machine-and-states)\n    - [Changing State](/docs/manual.md#changing-state)\n    - [Advanced Topics](/docs/manual.md#advanced-topics)\n    - [Cheatsheet](/docs/manual.md#cheatsheet)\n\n## Goals\n\n- scale up, not down\n- defaults work by default\n- everything can be traced and debugged\n- automation is evolution\n- state != data\n\n## Community\n\n- [GitHub discussions](https://github.com/pancsta/asyncmachine-go/discussions)\n- [Matrix chat](https://matrix.to/#/#room:asyncmachine)\n- [Author's RSS](https://blogic.tech/feed)\n\n\u003cdiv align=\"center\"\u003e\n\u003cpicture\u003e\n  \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://asyncmachine.dev/chart_dark.png?nocache\"\u003e\n  \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://asyncmachine.dev/chart_light.png?nocache\"\u003e\n  \u003cimg alt=\"OpenTelemetry traces in Jaeger\" src=\"https://asyncmachine.dev/chart_light.png?nocache\"\u003e\n\u003c/picture\u003e\u003c/div\u003e\n\n\u003e [!NOTE]\n\u003e Hundreds of clones.\n\n## Status\n\nUnder development, status depends on each package. The bottom layers seem prod grade, the top ones are alpha or testing.\n\n\u003cdiv align=\"center\"\u003e\n    \u003ca href=\"https://pancsta.github.io/assets/asyncmachine-go/grafana.dark.png\"\u003e\n        \u003cimg style=\"min-height: 397px\"\n            src=\"https://pancsta.github.io/assets/asyncmachine-go/grafana.dark.png\"\n            alt=\"grafana dashboard\" /\u003e\n    \u003c/a\u003e\n\u003c/div\u003e\n\n\u003e [!NOTE]\n\u003e Managing distributed concurrency.\n\n## Development\n\n- [good first issues](https://github.com/pancsta/asyncmachine-go/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22)\n- before\n    - `./scripts/dep-taskfile.sh`\n    - `task install-deps`\n- after\n    - `task test`\n    - `task format`\n    - `task lint`\n    - `task precommit`\n\n### Roadmap\n\n- more tooling and diagrams\n- bug fixes, optimizations\n- network security, ACLs\n- [ROADMAP.md](/ROADMAP.md)\n\n\u003cdiv align=\"center\"\u003e\n    \u003ca href=\"https://github.com/pancsta/asyncmachine-go/blob/main/tools/cmd/am-vis/README.md#transition-sequence\"\u003e\n        \u003cimg style=\"min-height: 397px\"\n            src=\"https://pancsta.github.io/assets/asyncmachine-go/am-vis/tx.svg\"\n            alt=\"tx sequence diagram\" /\u003e\n    \u003c/a\u003e\n\u003c/div\u003e\n\n\u003e [!NOTE]\n\u003e Step by step.\n\n## [FAQ](/FAQ.md)\n\n### How does asyncmachine work?\n\nIt calls struct methods according to conventions, a schema, and currently active states (eg `BarEnter`, `FooFoo`,\n`FooBar`, `BarState`). It tackles nondeterminism by embracing it - like an UDP event stream with structure.\n\n### What is a \"state\" in asyncmachine?\n\nState is a binary ID as in status / switch / flag, eg \"process RUNNING\" or \"car BROKEN\".\n\n### What does \"clock-based\" mean?\n\nEach state has a counter of activations \u0026 deactivations, and all state counters create \"machine time\". These are logical\nclocks, and the queue is also (partially) counted.\n\n### What's the difference between states and events?\n\nThe same event happening many times will cause only 1 state activation, until the state becomes inactive.\n\nThe complete FAQ is available at [FAQ.md](/FAQ.md).\n\n## Changes\n\n- [Changelog](/CHANGELOG.md)\n- [Breaking changes](/BREAKING.md)\n- [Repo traffic](https://github.com/pancsta/asyncmachine-go/pulse)\n- [Release feed](https://github.com/pancsta/asyncmachine-go/releases.atom)\n\n\u003cdiv align=\"center\"\u003e\n    \u003cimg src=\"https://pancsta.github.io/assets/asyncmachine-go/video.gif?raw=true\"\n        alt=\"TUI Debugger\" /\u003e\n\u003c/div\u003e\n\n\u003e [!NOTE]\n\u003e Don't lose your sync.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpancsta%2Fasyncmachine-go","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpancsta%2Fasyncmachine-go","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpancsta%2Fasyncmachine-go/lists"}