Normally, run npm test. Use npm test -- --offline to skip live upstream fetching
(this also skips the WG17 syntax check, which is discovered live and has no
offline snapshot).
For development, run a focused check directly from the repository root:
node test/run-regression.mjs # all regression sections
node test/run-regression.mjs docs # documentation checks only
node test/run-conformance-all.mjs # conformance layers; accepts --offline
node test/run-iso-strict.mjs # strict ISO core
node test/run-iso-part2-amendment.mjs
node test/run-neumerkel.mjs # live upstream; --cached reproduces last fetch
# --verify-report fails on a stale tracked report
node test/run-neumerkel-tests.mjs # upstream-fetch harness
node test/run-examples.mjs
node test/run-playground.mjs
node test/run-architecture.mjs
node test/run-properties.mjs # seeded random-term invariant checks (see below)
node test/run-openrulebench.mjs
node test/run-http-json.mjs
node test/run-interop.mjs # requires the comparison engines
These runners retain their existing options. The single alias is
npm run neumerkel, for node test/run-neumerkel.mjs --verify-report: the
release gate only warns when the tracked upstream report has gone stale, and
that alias makes it an error instead. Every other runner is invoked directly.
Focused checks do not replace the full release gate.
run-properties.mjs is different in kind from the rest of the suite: instead
of hand-picked inputs, it generates many random ground terms from a seeded
PRNG and checks invariants that must hold for any input. It covers term/list/
arithmetic/string library predicates (write/read round-tripping, sort/2
ordering and idempotence, append/3/length/2 agreement, compare/3
symmetry, keysort/2 stability, =.. round-tripping, copy_term/2 sharing,
reverse/2 involution, atom_codes/2/atom_chars/2/char_code/2/
number_codes/2 round-tripping, succ/2 and abs/1/sign/1 arithmetic
identities, nth0/3/nth1/3 agreement, last/2, min_list/2/max_list/2
bounds, sum_list/2 additivity, atom_concat/3/string_concat/3 regrouping,
atom_string/2/number_string/2 round-tripping, list_to_set/2 idempotence,
permutation/2, between/3 range generation, split/3/join/3 inversion)
and, more broadly, control constructs, exceptions, the database, and grammar
rules (catch/3 ball delivery, findall/3 order/duplicate/no-match
behavior, double negation, the exact existence_error indicator for an
undefined predicate, assertz/1+retract/1 leaving no trace, a DCG list
rule accepting exactly the list it was built from, bagof/3 agreeing with
findall/3, and numbervars/3 counting distinct variables) – around 35
properties, each reported as its own trial (currently ~530 individual test
lines) so a failure names exactly which trial of which property broke rather
than leaving a reader to dig through one aggregate error. The whole file
still runs in about two seconds. The seed (SEED in that file) is fixed so a
failure is exactly reproducible by rerunning it – change it only
deliberately, and say why, never to make a transient failure disappear.
There is no separate wall-clock benchmark harness: npm test’s own elapsed
time is the project’s performance indicator.
See the conformance guide for report maintenance.