Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
314 commits
Select commit Hold shift + click to select a range
2d7f559
translate: the twin inverse-pair guard is gone; G7 refuses those twin…
psaegert Oct 19, 2026
beb6419
rewrite pass: one per-node protocol for both entries
psaegert Oct 19, 2026
1ff73f7
rewrite pass: a binding step cap is counted, and pinned at 0 on the c…
psaegert Oct 19, 2026
a75f1a8
matcher: the near-miss signal lives in the match context, not a threa…
psaegert Oct 19, 2026
e8ca128
tests: the in-suite corpus walk pins the step-cap count at 0
psaegert Oct 19, 2026
0195b5d
FFI: probe and diagnostic exports with no caller are gone
psaegert Oct 19, 2026
1a9d98f
clippy: the lib's warnings outside expr.rs are fixed
psaegert Oct 19, 2026
37f1734
max_passes: a safety cap whose 0 means 0; one pass is asserted to be …
psaegert Oct 19, 2026
5c15786
FFI: the simplify entries default to the public effort (None), not 0
psaegert Oct 19, 2026
b4d2c42
docs: misplaced doc comments outside expr.rs sit on their items; cite…
psaegert Oct 19, 2026
a032a80
core: test-only code is cfg(test), stale dead-code allows and the emp…
psaegert Oct 19, 2026
7d45783
stub: `_core.pyi` matches the compiled surface, and a test keeps it so
psaegert Oct 19, 2026
af5501a
Numerals: the grammar and the reserved spellings have one definition,…
psaegert Oct 19, 2026
e81d515
Errors: four `except` blocks no longer hide their cause
psaegert Oct 19, 2026
1f20044
Library output goes through logging; an installed asset loads without…
psaegert Oct 19, 2026
45d27e9
Tests: temporary files stay in pytest's tree; the monitor builds its …
psaegert Oct 19, 2026
ebfcd34
Judge: the self-tests speak the live vocabulary; remove_pow1 is gone
psaegert Oct 19, 2026
1feda83
Reader: realization notation is read back only through an injective map
psaegert Oct 19, 2026
792cdb1
translate: the asset inverse-pair guard is gone; G7 is the reason tho…
psaegert Oct 19, 2026
c407eca
Literals: an integer spelling of zero reads +0 in the core, as the de…
psaegert Oct 19, 2026
9e3096b
One mode vocabulary: 'f64' and 'default' name the same mode at every …
psaegert Oct 19, 2026
5b6ffc0
Messages: no internal ledger IDs in raised errors
psaegert Oct 19, 2026
329ba90
CLI help: find-rules says what it mines; prune-covered-rules names th…
psaegert Oct 19, 2026
53d54a5
formal.md: the gates, folds, search and measured numbers as the build…
psaegert Oct 19, 2026
57568ca
_core: docstrings and error messages state conclusions only
psaegert Oct 19, 2026
285969f
Rust comments: describe the search, folds and suppression as they run…
psaegert Oct 19, 2026
7341833
CHANGELOG 0.15: upgrade notes by audience first, then highlights, the…
psaegert Oct 19, 2026
4376d6e
Docs: offline loading, measured memory, the 0.15 signatures, the empt…
psaegert Oct 19, 2026
ee5fae3
README: mark the benchmark for re-measurement and the citation versio…
psaegert Oct 19, 2026
e77778d
CHANGELOG and rules guide: 'f64' and 'default' name one mode
psaegert Oct 19, 2026
1af0e49
test_public_api: the mining column declares verify_mine and cross_mod…
psaegert Oct 19, 2026
0aa56a6
Docstrings: accurate for 0.15, for a first-time reader
psaegert Oct 19, 2026
5eaa77b
Docstrings: conclusions, not tracker narrative
psaegert Oct 19, 2026
c5f5178
_core.pyi: no tracker IDs or campaign notes in the stub
psaegert Oct 19, 2026
ea205cc
Docstrings: the masking front door is not "ratified"; set_mode_rules
psaegert Oct 19, 2026
3e1df19
CHANGELOG: the mode TypeError and the two names simplipy.mining declares
psaegert Oct 19, 2026
c0392c6
Tests: name the training-data generator, not an internal run
psaegert Oct 19, 2026
b056ca7
Rules: a file is read in the canon it was certified in
psaegert Oct 19, 2026
cbbd49a
Miner: each mode's mine starts from its own set
psaegert Oct 19, 2026
9226979
verify-mine: the sign pull is a strict xfail until the sign rule; the…
psaegert Oct 19, 2026
b5081c8
G8: the engine-owned-law gate takes the search's own FACTOR move and …
psaegert Oct 19, 2026
d23a487
Miner: no judge timeout inside mines; a watchdog logs and fails instead
psaegert Oct 19, 2026
6384a09
Miner: the checkpoint key holds the operators, the data and the numer…
psaegert Oct 19, 2026
fdd4915
Miner: the judge loop's rounds cap is per source, and a stubborn sour…
psaegert Oct 19, 2026
a5a857a
verify-mine: no gate passes vacuously
psaegert Oct 19, 2026
2efa6a5
Miner: the final gate judges before every prune and once more on what…
psaegert Oct 19, 2026
8d031f1
requires_simplipy: an empty specifier is malformed; an exact pre-rele…
psaegert Oct 19, 2026
9370235
Core: the pushed-rules digest is stored after the push compiles
psaegert Oct 19, 2026
3ae5b6d
Core: a push translates only the set it replaces
psaegert Oct 19, 2026
e6da17e
Tests: the shipped asset, read in the canon it was certified in, tran…
psaegert Oct 19, 2026
6ada94b
Promotion refund: the probe rows are read off the constructor's own d…
psaegert Oct 19, 2026
5403a5b
CHANGELOG: the miner and rule-loading fix round
psaegert Oct 19, 2026
23ca4c0
Tests: the registry pin reads the shipped asset in its own canon
psaegert Oct 19, 2026
7eaa1e8
Core access: real fails closed under the call's own read guard; no gu…
psaegert Oct 19, 2026
ef4f10b
Permissive ground fold: a folded float is read as its written decimal…
psaegert Oct 19, 2026
276eb05
Input reading: a token that is no str or number is refused
psaegert Oct 19, 2026
3f76117
utils: the core import is guarded as the engine's is
psaegert Oct 19, 2026
066ae85
Infix reader: the legacy pow1/pow_1 spellings are read where they are…
psaegert Oct 19, 2026
58d8f64
Tests: the D1 xfails cover only the sign-placement assertion
psaegert Oct 19, 2026
f9e887d
to_tagged: every quotient carries a bag, so the tagged dialect is dec…
psaegert Oct 19, 2026
624cf98
Search: the distributive law keeps a one-signed pole joined (Reading A)
psaegert Oct 19, 2026
2863df0
Tests: the infix-entry scan reads the core simplify captures
psaegert Oct 19, 2026
855095c
to_tagged docstring: a fraction token is the one literal it re-spells
psaegert Oct 19, 2026
b842f71
CHANGELOG: the core and concurrency fix round
psaegert Oct 19, 2026
fd8348b
Search: an addend holds a piece's pole wherever the pole sits inside it
psaegert Oct 19, 2026
ec56d1f
Core access: mode_rules_canon takes its read guard with the GIL released
psaegert Oct 19, 2026
d659c95
Fewest signs, then outermost, on every equal price
psaegert Oct 18, 2026
b65c022
Docs: the sign key, defined, and where it decides
psaegert Oct 18, 2026
07c3c4c
Tests: interim pins for the staged asset under the sign key
psaegert Oct 18, 2026
0cef4c8
G7 refuses only a rule that climbs in price
psaegert Oct 18, 2026
39d881d
simplify takes no work budget
psaegert Oct 19, 2026
123649b
evaluate_constants answers in the input's dialect only
psaegert Oct 19, 2026
6f94589
find_rules takes no save_every, and find-rules no -s
psaegert Oct 19, 2026
8e982d7
Compatibility policy: a removal is a hard cut
psaegert Oct 19, 2026
34f4963
Loading docs: memory figures name the artifact they were measured on
psaegert Oct 19, 2026
334350b
Judge: f64 accepts the true value where an operation overflows or und…
psaegert Oct 19, 2026
5f06ff4
prettify writes numbers and decides no value
psaegert Oct 19, 2026
6456c4e
Miner: the permissive mine is offered the finished f64 and real files
psaegert Oct 19, 2026
a4b581c
Miner: the judge watchdog fails the mine from any thread, and leaves …
psaegert Oct 19, 2026
0b588f8
verify-mine: the preempted gate is the census of ground facts the eng…
psaegert Oct 19, 2026
8be7938
A sign costs one bit wherever it sits
psaegert Oct 19, 2026
d859e80
prettify: one slash, every divisor in one denominator
psaegert Oct 19, 2026
a6619bf
prettify(precision=): significant digits for floats, None the default
psaegert Oct 19, 2026
a1899ee
The engine folds ground NaN facts itself
psaegert Oct 19, 2026
17615f5
Miner: the f64 scan accepts the true value where an operation overflo…
psaegert Oct 19, 2026
906b240
Miner: a rerun reuses a mode whose file is finished
psaegert Oct 19, 2026
3b8838e
f64 folds a ground constant as a step of the walk
psaegert Oct 19, 2026
f88df32
Permissive lands a literal on the shorter of its two floats
psaegert Oct 19, 2026
22b034a
Docs: a pole sum whose shared factor is undefined on a region stays s…
psaegert Oct 19, 2026
d893563
An overflow cuts no f64 collapse band
psaegert Oct 19, 2026
567eb3e
Merge work/judge015: the f64 judge and miner accept the true value pa…
psaegert Oct 19, 2026
8fc0e65
Merge work/display015: prettify writes numbers and decides no value; …
psaegert Oct 19, 2026
a4f4175
Tests: a ground NaN fact of a non-integer root index is preempted
psaegert Oct 19, 2026
16c8b51
Tests: f64's constructor performs asinh(sinh(x)), so no mined file ca…
psaegert Oct 19, 2026
65aaded
prettify examples: one slash shown on a divisor the canonical form keeps
psaegert Oct 19, 2026
41937ca
Tests: a power the canonical form keeps, shown as a power
psaegert Oct 19, 2026
c5e6dec
A literal held in pieces costs at most what its float costs
psaegert Oct 19, 2026
8a06c74
The core counts no work
psaegert Oct 20, 2026
2dc1c24
prettify writes an exact number as simplify writes it
psaegert Oct 20, 2026
b31903a
Powers of e collect by their exponents
psaegert Oct 20, 2026
e689adc
prettify folds a function of floats into one float, rounded to the pr…
psaegert Oct 20, 2026
eb22b6c
A constant absorbs the orientation sign of every class beside it
psaegert Oct 20, 2026
cf4150a
prettify repeats its display until the display is its own display
psaegert Oct 20, 2026
3fc0ec8
A zero keeps its IEEE sign where it is inverted
psaegert Oct 20, 2026
9b0d1f0
prettify writes one display and reads nothing back
psaegert Oct 20, 2026
c2ecd4f
prettify at a precision writes a shortened float as the number it rea…
psaegert Oct 20, 2026
e104041
prettify writes a number with its rest where its spelling would chang…
psaegert Oct 20, 2026
d99c5c1
A class takes one orientation wherever it stands
psaegert Oct 20, 2026
4fcd023
The tagged form writes a reciprocal and a negative power as a quotient
psaegert Oct 20, 2026
4e9f4cb
Merge work/core015c: the core's 0.15 sign, zero and orientation fixes
psaegert Oct 20, 2026
6bcd897
Merge work/display015c: prettify writes numbers as simplify does and …
psaegert Oct 20, 2026
dd14755
Tests: the watchdog tests choose which judgment overruns
psaegert Oct 20, 2026
52fdb86
prettify factors pi out at every precision
psaegert Oct 20, 2026
da28ac1
prettify writes the factored pi as the symbol pi
psaegert Oct 20, 2026
bfb8733
prettify writes the rest of a number that would show as a short numbe…
psaegert Oct 20, 2026
1aa254e
The certificates read a variable whatever it is called
psaegert Oct 20, 2026
d47af54
Merge work/core015d: the certificates read a variable whatever it is …
psaegert Oct 21, 2026
b76cb41
prettify keeps the grouping of the explicit tokens on request
psaegert Oct 21, 2026
e82f8a5
A zero set is read on the expression's domain
psaegert Oct 21, 2026
a657c8c
In f64 the zero-set certificate reads tanh and atan on their float64 …
psaegert Oct 21, 2026
be7646e
In f64 the ! and $ certificates read tanh and atan on their float64 r…
psaegert Oct 21, 2026
27747b4
In f64 the symbolic-exponent merge reads tanh and atan on their float…
psaegert Oct 21, 2026
6602141
Merge work/core015e: a zero set is read on the expression's domain, a…
psaegert Oct 21, 2026
7a7d915
In f64 a sum that vanishes on a region keeps its zero's sign where it…
psaegert Oct 21, 2026
b96dbe1
Merge work/core015e: in f64 a sum that vanishes on a region keeps its…
psaegert Oct 21, 2026
5ac4bf1
CHANGELOG: prettify's display moves a sign as the f64 constructors no…
psaegert Oct 21, 2026
b984073
Float64 kernels for floor, ceil, max, min, mod and harmonic, with vec…
psaegert Oct 21, 2026
40e28b1
Every realization is the engine's own float64 kernel; erf and atan2 j…
psaegert Oct 22, 2026
97263e7
A call takes its operator's arity in arguments; max and min nest vari…
psaegert Oct 22, 2026
ea34e08
masking: Role.ORDER for besselj's order, structural like an exponent
psaegert Oct 22, 2026
b52924a
besselj kernel: scipy 1.18.1's jv carried in the core, bit for bit
psaegert Oct 22, 2026
7776af3
besselj realization and the acj2-4 engine config
psaegert Oct 22, 2026
b881050
The evaluator dispatches the nine 0.15 heads
psaegert Oct 22, 2026
b9d4768
Interval enclosures for the nine 0.15 heads
psaegert Oct 22, 2026
99d2070
Fail closed on heads without high-precision or contract kernels
psaegert Oct 22, 2026
75eae57
Fingerprint probes for the 0.15 heads; acj2-4 and acj2-5-4-llm mine kits
psaegert Oct 22, 2026
280b9cf
One deployed-only bar for the judge and the mint; discontinuities probed
psaegert Oct 22, 2026
3a36dd8
Signed zeros of the 0.15 heads; max and min are order-independent
psaegert Oct 22, 2026
d790df1
besselj takes torch tensors; the port drops branches no real argument…
psaegert Oct 22, 2026
2c0f282
f64 writes the negative zero; atan2 reads both zero signs however it …
psaegert Oct 22, 2026
0fbcd4e
f64: a written product or negation of numbers that is zero has float6…
psaegert Oct 22, 2026
74c7f50
A term's coefficient is all of its literals
psaegert Oct 24, 2026
5e9a525
A negative partition writes its sign on its smallest literal
psaegert Oct 24, 2026
fc42c8a
A class reads its polynomial multiples: 9 - x1^2 holds 3 - x1
psaegert Oct 24, 2026
11f13b1
prettify: the budget counts significant digits; a short exact sum bef…
psaegert Oct 24, 2026
b1ca176
The zero-set certificate reads a sum one variable at a time; f64 subt…
psaegert Oct 24, 2026
f5deb26
Merge work/a3-idem: a term's coefficient is all of its literals; pret…
psaegert Oct 24, 2026
8289e1b
Merge work/a1-zerosign: the zero-set certificate reads a sum one vari…
psaegert Oct 24, 2026
ae0705a
prettify keeps its contract where a fold or a literal's size broke it
psaegert Oct 24, 2026
ba2b3b8
max and min are lattice bags; the search moves inside atan2
psaegert Oct 24, 2026
f5dadf4
besselj is complete at every real order
psaegert Oct 24, 2026
c1e6425
Outside f64, pi and e are numbers of a max/min bag
psaegert Oct 24, 2026
d7dcad4
besselj: a NaN or infinite order classifies in the interval layer; an…
psaegert Oct 24, 2026
656daf8
High-precision and contract kernels for eight of the 0.15 heads
psaegert Oct 24, 2026
a76cd60
CHANGELOG: besselj of an infinite order
psaegert Oct 24, 2026
d168721
The libm fingerprint probes besselj
psaegert Oct 24, 2026
cd92d39
The float64 fit keeps the witness it found
psaegert Oct 24, 2026
4a8f962
Sort promotion reads the eight 0.15 heads
psaegert Oct 24, 2026
e2044ab
besselj of an odd order is an odd head; of an integer order, certainl…
psaegert Oct 24, 2026
223bf7c
f64 ground folds keep float64's zero sign
psaegert Oct 24, 2026
d22babb
CHANGELOG: x + 0 at -0 is a known f64 limit
psaegert Oct 24, 2026
5f8b57f
Promotion's ground tier skips an undecided probe instead of dropping …
psaegert Oct 24, 2026
7efa627
Merge work/b5-kernels: high-precision and contract kernels for eight …
psaegert Oct 24, 2026
f60ddc7
Merge work/b9-bessel: besselj complete; the deployed-only lane retires
psaegert Oct 24, 2026
34007d1
Exact ground folds by certified enclosure replace the mined ground facts
psaegert Oct 25, 2026
d6cdf97
The match-time certificates read the nine 0.15 heads
psaegert Oct 25, 2026
ea209fe
A constant collapse owes a witness only where its source is defined
psaegert Oct 25, 2026
a31c570
Sort promotion is deterministic and decides every bar exactly
psaegert Oct 25, 2026
2a671a7
pow takes numpy's fast paths
psaegert Oct 25, 2026
7cce630
f64: the reciprocal of -inf is -0.0 in a ground expression
psaegert Oct 25, 2026
bb24a97
The core's test targets pass clippy -D warnings
psaegert Oct 25, 2026
6d22154
A ground max/min folds to its cheapest equal member
psaegert Oct 25, 2026
a47e72f
A ground fold returns the member of its value
psaegert Oct 25, 2026
fc1bc72
real decides lattice member orders at high precision
psaegert Oct 25, 2026
1802ec5
Merge work/c2-miner: one source_defined criterion for the judge and p…
psaegert Oct 25, 2026
aee5a61
A source's evidence is decided from its domain, and a refutation need…
psaegert Oct 25, 2026
a768427
A source without evidence is not scanned
psaegert Oct 25, 2026
2ec6449
f64 sums keep a +0 term where their other terms may all be -0 on a re…
psaegert Oct 25, 2026
64b48ca
The most specific rule fires first; verify-mine checks that every rul…
psaegert Oct 25, 2026
388e2ae
CHANGELOG: the re-mine is unchanged and simplify takes the same time
psaegert Oct 25, 2026
17e9834
A constant collapse is minted where the judge licenses it
psaegert Oct 25, 2026
0dde3ab
Merge work/d2-shadow: the most specific rule fires first; verify-mine…
psaegert Oct 26, 2026
aecd867
Merge work/d3-ceil: f64 sums keep a +0 term where their other terms m…
psaegert Oct 26, 2026
244f800
Each mode reads a source's evidence in its own semantics
psaegert Oct 26, 2026
e9b9ed0
The engine collapses a constant-only subtree wherever the mint would
psaegert Oct 26, 2026
272c2bc
The covered prune and the liveness gate read every alphabet
psaegert Oct 26, 2026
ec3dbe1
The mine completes the overlaps of its rules; verify-mine checks the …
psaegert Oct 26, 2026
b1a903e
find-rules --modes mines only the listed modes
psaegert Oct 26, 2026
4e3a88b
The grouped display writes every number as the expression holds it
psaegert Oct 26, 2026
c1e2c25
Comments and docstrings state reasons, not internal labels
psaegert Oct 26, 2026
d70ef77
The prune's composite probe is no bag a narrower slot can take apart
psaegert Oct 26, 2026
0e7e05a
Tests read the constant collapse where the mint would collapse
psaegert Oct 26, 2026
df3955e
Overlap completion stays within the mine's cell, and reports its prog…
psaegert Oct 26, 2026
8456e98
The evidence certificate splits a cell it cannot read
psaegert Oct 26, 2026
a12856c
The completion step promotes its own rows, and the sidecar counts the…
psaegert Oct 26, 2026
987bcee
CHANGELOG: the reduced mine's counts, the completion step's cost and …
psaegert Oct 26, 2026
edb71cf
The completion step keeps promotion's seeds out of its rows
psaegert Oct 26, 2026
12f843e
CHANGELOG: the reduced mine's numbers on the final build
psaegert Oct 26, 2026
69059ff
besselj's complex product and quotient are the C runtime's own
psaegert Oct 27, 2026
dbfd173
A rule with more than one <constant> on its left side is refused
psaegert Oct 27, 2026
c66032f
Docs: besselj's complex division depends on the platform
psaegert Oct 27, 2026
5d628c0
The differential test: every step against the one semantics
psaegert Oct 27, 2026
6dd4ba8
The table: each mode's values, defined once in the core
psaegert Oct 27, 2026
5453f89
The judge on the table: one criterion per mode
psaegert Oct 27, 2026
b451dfa
The judge on the owner's rulings: isolated infinities, guards, coinci…
psaegert Oct 27, 2026
1518a1b
One collapse licence for the engine's constant fold
psaegert Oct 28, 2026
0881819
real and permissive read ground values from the table
psaegert Oct 28, 2026
932bb8a
The interval layer reads each mode's values
psaegert Oct 28, 2026
f5961ef
permissive's own simplifications are one named list
psaegert Oct 28, 2026
83cf4eb
The judge reads every literal the engine writes
psaegert Oct 28, 2026
2052081
permissive composes powers naively: (x^a)^b is x^(a*b)
psaegert Oct 28, 2026
c9d619b
permissive writes the table's ground values as floats
psaegert Oct 28, 2026
1d2625e
The judge reads P3 as ruled: real's values up to float resolution
psaegert Oct 28, 2026
1d8e0cf
The mint reads the judge's values and licences
psaegert Oct 28, 2026
8a61988
rustfmt: the ground-composite filter's condition on one line
psaegert Oct 28, 2026
6dae2c8
Sort promotion asks the judge; the monitor judges with the judge
psaegert Oct 28, 2026
b6966af
The gates ask verify.licensed: the completion step, the overlap gate,…
psaegert Oct 28, 2026
efe9f4c
Rules with several constants on the left: mined and loaded where lice…
psaegert Oct 28, 2026
c3a0a98
The mint's evidence decision counts the rows in the mode's values
psaegert Oct 28, 2026
ba414d2
The mint refuses only what the judge refuses; a rule that never fires…
psaegert Oct 28, 2026
4596bb8
table_row reads at the demanded precision only: an unreadable row is …
psaegert Oct 28, 2026
0263425
permissive's isolated point vanishes on both sides of it
psaegert Oct 28, 2026
46395e0
The reduced mine of phase 3b, recorded; a stream fold read in each mo…
psaegert Oct 28, 2026
782d773
The multi-constant witness fit gives the same bits on every machine
psaegert Oct 28, 2026
ebb385c
The judge reads a jump at its preimage and the rows the mint reads
psaegert Oct 28, 2026
8e3cae2
Phase 3c: one P4, the mint no stricter than the judge, F8's monitor, …
psaegert Oct 28, 2026
c022201
A wide miss is read where float64 misreads the source
psaegert Oct 28, 2026
81009bf
P4: an extension on a side of the point is no disagreement
psaegert Oct 28, 2026
aa25d5b
An unread wide miss is refused; the saturation rule reads a battery atom
psaegert Oct 29, 2026
64cc318
The table reads a harmonic number exactly
psaegert Oct 29, 2026
3255647
The acj2-4-llm engine: the complete 4->4 mine with the LLM channel
psaegert Oct 29, 2026
9c15585
The shipped triple's gate names its offenders when it fails
psaegert Oct 29, 2026
e3eac4e
The shipped triple's gate allows the one f64 verdict the platform's l…
psaegert Oct 29, 2026
7621f32
Permissive rules are judged at the sort the permissive matcher binds
psaegert Oct 31, 2026
80496d5
The NaN-family fold writes nan only where the family is NaN at every …
psaegert Oct 31, 2026
97db589
The f64 bar of the 0.15 heads reads float64's agreement, not bits
psaegert Oct 31, 2026
96cf1c0
The witness fit stays in moderate environments, and a definite counte…
psaegert Oct 31, 2026
8f0096c
The judge loop asks `licensed`, and the final gate only checks
psaegert Oct 31, 2026
872c3c9
The mint reads a row it cannot read as the judge reads its point
psaegert Oct 31, 2026
528758e
The table reads a step of an approximation on an integer as undecided
psaegert Oct 31, 2026
9b44463
The loader refuses rule files mined before 0.15, and the legacy cells…
psaegert Oct 31, 2026
d1c4927
Two claims corrected, and a left side the engine folds is reported as…
psaegert Oct 31, 2026
4c64463
The effort suite reads its pre-0.15 artifacts through the legacy opt-in
psaegert Oct 31, 2026
381803a
The real mode is retired
psaegert Oct 31, 2026
dfb5275
A division by zero has no value, however it is written
psaegert Oct 31, 2026
22fcc51
One policy predicate for the load, licensed and the gates
psaegert Oct 31, 2026
fb6ccba
Loading keeps manifest paths in the cache, checks native arities, rea…
psaegert Oct 31, 2026
4e4f745
Helpers: tensors on either side, distinct generated names, whole plac…
psaegert Oct 31, 2026
9afceeb
The docs say what is promised and what is measured
psaegert Oct 31, 2026
a888c18
The tier-table check reads the docs with the docs tests
psaegert Nov 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/check_sdist_boundary.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
test suite loads them, so a tarball missing one is a tarball whose tests cannot run
(audit C54). The required set is DERIVED from the checkout, not hardcoded: a
hardcoded list demanded the retired `acj-2-1`/`acj-3-2` cells forever (audit U1),
and would go stale again the day the acj-4-3 cell grows its `real`/`corpus` thirds.
and would go stale again the day the acj-4-3 cell grows its permissive file.
Deriving it keeps the meaning fixed while the inventory moves: whatever the tree
ships, the sdist ships whole.

Expand Down
78 changes: 64 additions & 14 deletions .github/workflows/pytest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,11 @@ name: pytest
jobs:
pytest:
runs-on: ubuntu-latest
# A hung job runs to GitHub's 6h default. On 2026-08-19 three runs hung on
# "Run tests" for 2h+ each (3 jobs apiece) while the suite passed locally in
# 107s against the same commit -- an environment stall, not a code deadlock.
# 20 minutes is ~11x the observed runtime: generous for a slow runner, cheap
# for a hang.
timeout-minutes: 20
# A hung job runs to GitHub's 6h default, so the job carries its own bound. The
# suite takes about 13 minutes on a development host (the shipped-triple sweep of
# the permissive-dominance gate alone about 5); 60 minutes leaves room for a slower
# runner and still bounds a hang.
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
Expand Down Expand Up @@ -70,8 +69,8 @@ jobs:
print("staged legacy 4-3 ->", os.path.join(cache, info["directory"]))
PY

# The engine suites load the SERVED acj-4 asset from the cache, exactly like a
# user install (the tree carries no artifact copy).
# The engine suites load the acj-4 cell the tree carries under assets/engines/, and
# the staged cache copy where the tree has none (tests/conftest.py, acj_asset_dir).
- name: Stage the acj-4 and acj-4-3 engine assets (the asset-gated suites load them)
run: |
python - <<'PY'
Expand All @@ -86,17 +85,68 @@ jobs:
print("staged", name, "->", os.path.join(cache, info["directory"]))
PY

# REQUIRE_ASSETS: the asset-gated python tests (the staged acj-4 engine and the
# staged legacy refusal input above) must FAIL loudly if the assets vanish, never
# silently skip. The triple-gated tests key on SIMPLIPY_TEST_REQUIRE_TRIPLE
# instead (set it in the job that validates a triple-shipping build): the cell
# ships its f64 third alone while the real/corpus sets are re-mined, and those
# tests self-activate the moment the two files land beside it.
# REQUIRE_ASSETS: the asset-gated python tests (the acj-4 triple and the staged
# legacy refusal input above) must FAIL loudly if an asset vanishes, never
# silently skip.
- name: Run tests
run: pytest tests
env:
SIMPLIPY_TEST_REQUIRE_ASSETS: "1"

# THE RELEASE GATES ON THE BUILT WHEEL. The job above tests an editable install, which
# reads the package from src/ and so cannot see a file the wheel leaves out. This job
# builds the wheel, installs it into a fresh venv, and runs the release-gate suites
# from a directory holding only tests/ and assets/ (no src/), so the package under test
# is the wheel's. A packaging regression -- such as the gate's corpus missing from the
# wheel -- fails here.
wheel-gates:
name: Release gates on the built wheel
runs-on: ubuntu-latest
# A release build of the core plus the gate suites; the shipped-triple sweep alone
# takes about 5 minutes.
timeout-minutes: 60
steps:
- uses: actions/checkout@v4.2.2
with:
lfs: false
- uses: actions/setup-python@v5.6.0
with:
python-version: "3.12"
- name: Setup Rust
uses: dtolnay/rust-toolchain@stable
- name: Build the wheel
run: |
python -m pip install --upgrade pip
pip wheel --no-deps -w dist .
python -m zipfile -l dist/simplipy-*.whl | grep simplipy/verify/data/raw_skeletons_nv.json
- name: Install the wheel into a fresh venv
run: |
python -m venv "$RUNNER_TEMP/wheelenv"
"$RUNNER_TEMP/wheelenv/bin/pip" install dist/simplipy-*.whl pytest
- name: Stage the legacy 4-3 asset (the generation-gate refusal tests read it)
run: |
"$RUNNER_TEMP/wheelenv/bin/python" - <<'PY'
import json, os
from huggingface_hub import hf_hub_download
manifest = json.load(open(hf_hub_download("psaegert/simplipy-assets", "manifest.json", repo_type="dataset")))
info = manifest["4-3"]
cache = os.path.expanduser("~/.cache/simplipy")
for f in info["files"]:
hf_hub_download(repo_id=info["repo_id"], filename=f"{info['directory']}/{f}", repo_type="dataset", local_dir=cache)
PY
- name: Run the release-gate suites outside the source tree
run: |
OUTSIDE="$RUNNER_TEMP/outside"
mkdir -p "$OUTSIDE"
cp -r tests assets "$OUTSIDE/"
cd "$OUTSIDE"
"$RUNNER_TEMP/wheelenv/bin/python" -c "import simplipy, sys; print(simplipy.__file__); sys.exit('wheelenv' not in simplipy.__file__)"
"$RUNNER_TEMP/wheelenv/bin/python" -m pytest -p no:cacheprovider \
tests/test_verify.py tests/test_artifact_compat.py tests/test_mode_rulesets.py \
tests/test_rules_less_warning.py
env:
SIMPLIPY_TEST_REQUIRE_ASSETS: "1"

rust-checks:
name: Rust (fmt / clippy / test / deny)
runs-on: ubuntu-latest
Expand Down
Loading
Loading