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.
- package/README.md +118 -0
- 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