You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat: error reference, device matrix, soak tests and a release pipeline
Four things, all of which exist to make the project's claims checkable
rather than asserted.
**The error reference** documents every one of the thirty `NfcErrorCode`
values with a cause and a remedy, and a test compares it against
`NFC_ERROR_CODES` in both directions. A code with no row is the worst
omission an error reference can have -- the reader concludes the error is
undocumented and guesses -- and a row for a code that no longer exists
sends them looking for something they will never see. Rows with empty
cells fail too, since a code that has been listed rather than explained is
not documented.
**The soak test** is the automatable half of "it works the first five
times". Thirty iterations of every entry point, then an assertion that the
library is back where it started: no active session, no native listener,
every handle released. Including the interleaved case, because a leak that
only appears when one entry point follows another is exactly what a
per-entry-point test misses. Writing it turned up nothing, which is the
result worth having.
**The device matrix** is 45 rows covering every claim the library makes,
each with the setup that tests it and what passed means -- and every row is
marked not run, on the first line, because it has not been. Row 21 is
called out as the one place the library makes an inference it could not
check: the Android 17 `DISPATCH_NFC_MESSAGE` behaviour.
**The release pipeline** uses npm trusted publishing, so there is no token
in the repository and none should ever be added. The requirements were read
from npm's documentation rather than recalled, which corrected two things:
Node 22.14 is the floor, not just npm 11.5.1, and the workflow filename is
part of the trust configuration -- renaming it breaks publishing with an
error that looks like authentication. Every gate runs again inside the
release job, because a release is the one place where "it passed earlier"
is not good enough.
The version becomes 0.9.0. `RELEASING.md` says what a 1.0.0 needs first,
and it is not code: the matrix, row 21 settled on hardware, and weeks of
real use. A 1.0.0 that has not survived somebody else's tags is a version
number rather than a promise.
Maestro flows are deliberately not here. They would test the example app's
UI, not the library -- whose error paths are already at 100% -- and would
need a runtime mock switch inside the example, which means a test seam in
shipping code. The reason is recorded rather than the work half-done.
1342 tests.
Copy file name to clipboardExpand all lines: README.md
+26-13Lines changed: 26 additions & 13 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -195,6 +195,18 @@ npx pod-install
195
195
There is no `prebuild` in a bare project, so entitlements and the Android manifest are
196
196
edited by hand. See [docs/setup/bare-react-native.md](docs/setup/bare-react-native.md).
197
197
198
+
## What has not been validated on hardware
199
+
200
+
Nothing, yet — and that is stated here rather than left to be discovered.
201
+
[docs/device-matrix.md](docs/device-matrix.md) is the checklist: 45 rows covering
202
+
every claim this library makes, each with the setup that tests it and what "passed"
203
+
means. Not one has been run.
204
+
205
+
The automated suite proves the bookkeeping — including a soak test that runs thirty
206
+
iterations of every entry point and asserts nothing is left held. Only a tag proves
207
+
the radio, which is why the version is `0.9.0` and why
208
+
[RELEASING.md](RELEASING.md) lists what a `1.0.0` needs first.
209
+
198
210
## Documentation
199
211
200
212
The full documentation lives under [docs/](docs/) and is built as a Mintlify site
@@ -244,6 +256,7 @@ Nothing here is claimed to work because it looks right.
244
256
| Wallet passes | Validation and decoding tested against the fake native module; the read itself needs an entitlement Apple grants case by case |
245
257
| Card emulation | The emulated Type 4 tag is driven through a whole reader conversation, using the same functions an app uses to talk to a real card |
246
258
| Config plugin | 104 tests through Expo's own introspection compiler, so the assertions are about what `expo prebuild` produces |
259
+
| Leaks | 30 iterations of every entry point, asserting no session, no native listener and no handle is left behind |
247
260
| The documentation | Every import in a code block is checked against the barrels that define it, and the site's navigation against the files on disk |
248
261
| The published package |`publint` and `arethetypeswrong` against a packed tarball, so a broken `exports` map fails before a user finds it |
249
262
@@ -253,19 +266,19 @@ release requirement, not an afterthought.
0 commit comments