ax25sdl 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/README.md +118 -0
  2. package/package.json +1 -1
package/README.md CHANGED
@@ -57,3 +57,121 @@ binding predicates and action verbs to behaviour (the TS equivalent of
57
57
  AGWPE-over-WebSocket, etc.). That work is intentionally out of scope
58
58
  for the Tier 1c codegen; the goal here is to prove the codegen IR
59
59
  survives a third backend.
60
+
61
+ ## Not yet transcribed
62
+
63
+ > For the **cross-runtime** view of what's implemented where (frame
64
+ > codec coverage, transports, lifecycle features, subroutine wiring,
65
+ > etc.), see
66
+ > [`docs/runtime-capability-matrix.md`](../docs/runtime-capability-matrix.md).
67
+ > The narrative below is the TypeScript-runtime-specific status of the
68
+ > SDL transcription pipeline; the matrix is the multi-runtime
69
+ > companion view.
70
+
71
+ The AX.25 v2.2 SDL chapter is figc4.1 through figc4.7. Each YAML
72
+ transcription's `coverage:` field declares whether it's `complete` or
73
+ `partial`. Current status:
74
+
75
+ | Figure | State / Page | Status |
76
+ | ------ | ------------------------------------- | -------------------------------------------------------------- |
77
+ | figc4.1 | Disconnected | ✅ complete |
78
+ | figc4.2 | AwaitingConnection (v2.0) | ✅ complete |
79
+ | figc4.3 | AwaitingRelease | ✅ complete |
80
+ | figc4.4 | Connected | ✅ complete |
81
+ | figc4.5 | TimerRecovery | ❌ **not transcribed** — see "TimerRecovery" below |
82
+ | figc4.6 | AwaitingConnection (v2.2) | ✅ complete |
83
+ | figc4.7 | Subroutines | ⚠️ partial — see "Subroutine status" below |
84
+
85
+ ### TimerRecovery state (figc4.5)
86
+
87
+ `DataLinkConnected` t38 (T1 expiry) and t39 (T3 expiry) both transition
88
+ to a `TimerRecovery` state that has no transcribed page in
89
+ `spec-sdl/data-link/`. The C# and TS runtimes register `TimerRecovery`
90
+ with an empty transition map so the state-target lint passes (see the
91
+ `StateTargetAllowList` entry in `tools/Packet.Sdl.CodeGen/Program.cs`),
92
+ but any session that enters TimerRecovery currently has no exit path —
93
+ it'll silently stall until a peer-initiated DISC or a `TimerRecovery`
94
+ isn't transcribed.
95
+
96
+ Real consequence: long-running connected sessions where the peer goes
97
+ quiet for > T3 (default 30s in the runtime) will time out and re-poll
98
+ via the unmodelled state. Short-lived sessions never reach it.
99
+
100
+ ### Subroutine status (figc4.7) — TS runtime
101
+
102
+ 13 subroutines are declared in `spec-sdl/data-link/subroutines.sdl.yaml`.
103
+ The TS `SubroutineRegistry` (`web/ax25/src/sdl/subroutine-registry.ts`)
104
+ ships the following coverage. The C# runtime's `DefaultSubroutineRegistry`
105
+ in [`src/Packet.Ax25/Session/`](../src/Packet.Ax25/Session/) routes every
106
+ subroutine through a `Wire(...)` walker that consumes the generated
107
+ `SubroutineSpec.Paths` directly; see the
108
+ [runtime capability matrix](../docs/runtime-capability-matrix.md#figc47-subroutines)
109
+ for the side-by-side view.
110
+
111
+ | Subroutine | TS status |
112
+ | -------------------------------- | --------------------------------------------------- |
113
+ | `Establish_Data_Link` | ✅ inlined into the dispatcher |
114
+ | `Establish_Extended_Data_Link` | ✅ inlined |
115
+ | `Clear_Exception_Conditions` | ✅ inlined |
116
+ | `Check_I_Frame_Acknowledged` | ✅ inlined |
117
+ | `Select_T1_Value` | ❌ no-op stub (dynamic T1V; figure transcribed) |
118
+ | `Transmit_Enquiry` | ❌ no-op stub |
119
+ | `Invoke_Retransmission` | ❌ no-op stub |
120
+ | `N_r_Error_Recovery` | ❌ no-op stub |
121
+ | `Enquiry_Response` | ❌ no-op stub |
122
+ | `Check_Need_For_Response` | ❌ no-op stub |
123
+ | `UI_Check` | ❌ no-op stub |
124
+ | `Set_Version_2_0` | ❌ no-op stub |
125
+ | `Set_Version_2_2` | ❌ no-op stub |
126
+
127
+ The figc4.7 YAML transcriptions are **complete** — every subroutine's
128
+ decision tree, predicate, and action chain is encoded. What's missing
129
+ in the TS runtime is the *walker* that consumes those bodies. The TS
130
+ dispatcher treats a `kind: subroutine` action as a name lookup against
131
+ a registry; nine of the thirteen names map to a no-op that logs a debug
132
+ message instead of executing the SDL-declared body.
133
+
134
+ Real consequence: REJ / SREJ recovery, T1V smoothing, frame
135
+ retransmission on T1 timeout, and v2.2 mode negotiation all degrade to
136
+ "do nothing" at runtime. SABM / UA / DISC / I-frame / RR happy-path
137
+ flows are unaffected.
138
+
139
+ ### Other v2.2 spec gaps
140
+
141
+ These are spec features that have no SDL transitions in the canonical
142
+ figures — they live in spec prose only — and are therefore not modelled
143
+ in this package at all:
144
+
145
+ - **XID negotiation** (v2.2 §5.4, §6.6) — modulus + parameter exchange
146
+ at link-establishment time.
147
+ - **TEST frame** handling (§4.3.3.10) — round-trip diagnostic.
148
+ - **Selective Reject (SREJ)** as a v2.2-only frame — generated /
149
+ consumed only when the link is mod-128 *and* the `srej_enabled`
150
+ predicate is true. Predicate currently returns false.
151
+ - **Mod-128 sequencing** as a runtime path — the SDL guards reference a
152
+ `version_2_2` predicate, which the C# and TS bindings hard-wire to
153
+ `false`. The figc4.6 (`AwaitingConnection22`) page transcribes the
154
+ SABME handshake but the post-connect mod-128 transitions in figc4.4
155
+ never get walked.
156
+
157
+ ## How to keep this section honest
158
+
159
+ When transcribing a new SDL page or wiring a previously-stubbed
160
+ subroutine to its real walker, **update this README in the same PR**.
161
+ The maturity table is the only authoritative summary of which parts of
162
+ the spec are runnable end-to-end; the codegen lints will catch
163
+ predicate / action-verb gaps, but they will not surface "this whole
164
+ state has no transitions" or "this subroutine is a no-op". The README
165
+ is the human-readable backstop.
166
+
167
+ Suggested workflow when status changes:
168
+
169
+ 1. Move a row from ❌ / ⚠️ to ✅ in this README.
170
+ 2. Drop the corresponding `StateTargetAllowList` entry (if the state
171
+ is now transcribed) or remove the no-op stub registration (if a
172
+ subroutine is now wired).
173
+ 3. Bump the version in `ts-spec/package.json` and `web/ax25/package.json`
174
+ in lockstep so consumers pick up the broader behaviour with a
175
+ semver hint. Even a no-op-stub → real-walker transition is worth a
176
+ minor-version bump since previously-quiet code paths now produce
177
+ wire traffic.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ax25sdl",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "description": "AX.25 v2.2 SDL specification as TypeScript data structures, generated from the canonical SDL figure transcriptions in M0LTE/packet.net.",
5
5
  "license": "MIT",
6
6
  "repository": {