Give the project ordered goals and let them decide what a decision record is

This commit is contained in:
2026-09-01 12:21:58 +02:00
parent 2fe36fa4e8
commit a99e1227ac
2 changed files with 230 additions and 225 deletions
+12 -17
View File
@@ -1,18 +1,17 @@
# todo.md
Remaining work for the `@larvit/smpp` 1.0.0 rewrite. Read [AGENTS.md](AGENTS.md) first — the hard
rules there constrain every item below.
Remaining work for the `@larvit/smpp` 1.0.0 rewrite. Read [AGENTS.md](AGENTS.md) first — the goals
and hard rules there constrain every item below.
This is a temporary working file: it is deleted when 1.0.0 ships, and until then it sets its own
rules. The documentation conventions in AGENTS.md do not govern it, and nothing here is a source
anything else may cite.
## Status
The rewrite is **feature complete and green**: the suite, lint and typecheck are clean on Node 18,
20, 22 and 24. What is left is release work and a few things worth adding before or after 1.0.0.
```bash
docker compose run --rm node npm install
docker compose run --rm node npm test
```
## The agreed API
Settled with the maintainer before implementation. Do not change any of it without asking. The
@@ -180,13 +179,9 @@ session message is a change to every call site.
## Declined
- **Throughput throttling — a TPS cap, and backing off on `ESME_RTHROTTLED`.** Two reasons, either
sufficient. An operator's rate limit is scoped to the account, while the widest thing this library
owns is a session: a bucket here cannot see a second process binding the same account, so it is
wrong in exactly the case it exists for. And a rate limiter's queue drains at a fixed ceiling
rather than at the peer's response rate, so a submit rate sustained above the limit grows it
without bound — and a queue holding messages the caller was told were accepted loses them on
restart, which is worse than refusing them up front. Pacing an account needs durable shared state
this library deliberately has none of. `sendSms()` surfaces `ESME_RTHROTTLED` to the caller
instead, and `maxOutstanding` stays: a window slot frees on the peer's next response, which is
self-limiting in a way a rate ceiling is not.
- **Throughput throttling — a TPS cap, and backing off on `ESME_RTHROTTLED`.** Declined by AGENTS.md
goal 7: an operator's rate limit is scoped to the account, while the widest thing this library owns
is a session, so a bucket here cannot see a second process binding the same account and is wrong in
exactly the case it exists for. `sendSms()` surfaces `ESME_RTHROTTLED` to the caller instead, and
`maxOutstanding` stays — a window slot frees on the peer's next response, which is self-limiting in
a way a rate ceiling is not.