Tooling + distribution for the AX.25 SDL state tables: a codegen pipeline that turns the normative SDL transcriptions into ready-to-consume libraries in seven languages. The figc4.x state-machine figures are encoded once, with discipline, in packethacking/ax25spec — the community home of everything normative about AX.25, prose and figures — and this repo emits that single source of truth as native idiomatic code for C#, Go, TypeScript, JSON, Rust, C, and Python. Downstream runtimes walk the generated tables — they don't have an opinion of their own about what AX.25 says.
Where changes go: figure/spec changes (graphml, yaml transcriptions, citations, catalogues) are PRs against
packethacking/ax25spec; a pin-bump PR here then regenerates the language backends. Only tooling (walker/emitters/lint), generated backends and packaging change in this repo.
The SDL sources live in the packethacking/ax25spec git submodule at ax25spec/, pinned to a specific commit (the same pin-bump cadence packet.net uses towards this repo). A spec-sdl -> ax25spec/spec-sdl symlink keeps every historical path working. Clone with git clone --recurse-submodules (or run git submodule update --init after a plain clone).
| Path | What |
|---|---|
spec-sdl/v2.2-errata/data-link/ |
The figc4.1 – figc4.7 data-link state machine (v2.2 + errata), split by artefact kind: sdl/ holds the canonical *.graphml yEd sources, yaml/ holds the *.sdl.yaml transcriptions (derived) plus the *.citations.yaml human-curated sidecars, mmd/ holds the *.g.mmd Mermaid renderings (derived). |
spec-sdl/v2.2/ |
Clean published v2.2 (black-only, no errata). Currently empty — backfill pending. |
spec-sdl/schema/ |
JSON Schema for *.sdl.yaml |
spec-sdl/actions.yaml |
Action-verb normalisation table (figure spellings → canonical verbs) |
spec-sdl/events.yaml |
Canonical event catalog |
| Upstream | The AX.25 v2.2 specification figures themselves — the source of truth for every transcription |
| Artefact | Where | Name | In-repo source |
|---|---|---|---|
| C# library | NuGet | Packet.Ax25.Sdl |
spec/csharp/ |
| TypeScript library | npm | ax25sdl |
spec/ts/ |
| Go module | git | github.com/m0lte/ax25sdl/spec/go |
spec/go/ |
| Rust crate | crates.io (publishable; not yet published) | ax25sdl (no_std-capable) |
spec/rust/ |
| C / Python / JSON | not externally packaged | codegen output for in-tree consumers | per-backend dirs |
Tagging v* on main fires .github/workflows/publish.yml — NuGet + npm publish from the same tag, version taken from the tag stripped of its leading v.
The transcription rules and how to add a new figure live in:
docs/sdl-primer.md— SDL shape referencedocs/sdl-transcription-runbook.md— end-to-end per-figure workflowdocs/sdl-verb-catalogue.md— action-verb normalisationdocs/adr/0001-sdl-dsl.md— why YAML + codegen rather than hand-written tables
Extracted from packet.net (then m0lte/packet.net) on 2026-05-17 — the transcriptions and codegen previously lived alongside the .NET runtime in that monorepo. The SDL transcriptions moved on again to packethacking/ax25spec in 2026-07, making that repo the single normative home (prose + figures) and this one tooling + distribution. History preserved via git filter-repo at both steps.
| Repo | Relationship |
|---|---|
packethacking/ax25spec |
upstream — normative SDL sources, consumed here as a pinned submodule |
packet-net/packet.net |
consumes Packet.Ax25.Sdl (NuGet) |
packet-net/ax25-ts |
consumes ax25sdl (npm) |
packet-net/packet-term-tui |
transitive: Packet.Ax25 → Packet.Ax25.Sdl |
packet-net/packet-term-web |
transitive: @packet-net/ax25 → ax25sdl |
MIT. Spec text and figures derive from the AX.25 v2.2 specification; the transcription discipline that turns figures into machine-checkable YAML is documented in docs/sdl-transcription-runbook.md.