Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
138 commits
Select commit Hold shift + click to select a range
633b1c7
Add CI, release pipeline, and GitHub project docs
a9lim Jun 10, 2026
9f41371
Fix p-adic mantissa overflow on high-precision Qp/Zp/LocalQp
a9lim Jun 10, 2026
86cfe22
Docs: third-wave bridges (J/K/L), extraspecial reframing, formalizati…
a9lim Jun 10, 2026
4daf58a
Add fable-assault research artifacts and rescued probes
a9lim Jun 10, 2026
64a6bb9
Resolve fable-assault audit; fold AUDIT-FABLE into AUDIT.md
a9lim Jun 10, 2026
984de69
Implement ROADMAP bridges F and J
a9lim Jun 10, 2026
ca13f17
edit open for numbering
a9lim Jun 10, 2026
20cac8e
Reorg docs: split ROADMAP, fold OPEN-3, route BRIDGES-DRAFT
a9lim Jun 10, 2026
8b82899
Propose fourth-wave bridges M/N/O; add the lexicode shadow to OPEN-1
a9lim Jun 10, 2026
f274579
Consolidate writeups: three goldarf threads -> goldarf.tex, excess ->…
a9lim Jun 10, 2026
2467799
rename
a9lim Jun 10, 2026
bf0264d
rename
a9lim Jun 10, 2026
cf16bdb
rename straggler
a9lim Jun 10, 2026
b24fd12
Build fourth-wave bridges N (unification pass) and O (lexicodes)
a9lim Jun 11, 2026
df3b3f7
Docs sweep: align README + AGENTS.md with current code
a9lim Jun 11, 2026
3467793
Build Bridge M: the Brown ℤ/8 invariant (char-2 cell of the mod-8 spine)
a9lim Jun 11, 2026
5f04ad3
Build Bridge K (full ℚ/ℤ cyclic-algebra Brauer invariant) + refresh r…
a9lim Jun 11, 2026
1a54c56
Gap census: game-valued TODO ledger, loopy-valued OPEN problems, brid…
a9lim Jun 11, 2026
faf7c60
Echo-solver verdict: CONFIRM — echo-fifo+dummy m=8 exactness verified…
a9lim Jun 11, 2026
4816d89
Linking reduction: echo-fifo+dummy mechanism identified, all-graphs k…
a9lim Jun 11, 2026
59bd21d
Reduce Brown invariant without enumeration cap
a9lim Jun 11, 2026
95ec43a
Add cyclic algebra trace form
a9lim Jun 11, 2026
b04018f
Add dyadic Milnor residue
a9lim Jun 11, 2026
5575b49
Implement ordinal subfield detection
a9lim Jun 11, 2026
b920f45
Implement function-field Milnor residues
a9lim Jun 11, 2026
00aee5c
Generate Fpn reduction polynomials
a9lim Jun 11, 2026
7d3e3d0
Compute ordinal Kummer carries from finite excess
a9lim Jun 11, 2026
5f2b51a
Add nim-alphabet lexicode witnesses
a9lim Jun 11, 2026
0db118c
update pdf
a9lim Jun 11, 2026
9c19330
Expand Python parity for bridge waves
a9lim Jun 11, 2026
23f3c46
Implement finite loopy partizan engine
a9lim Jun 11, 2026
4615e3d
Add FQM Gauss phase projection
a9lim Jun 11, 2026
91755b1
Add checked GameClifford deformation
a9lim Jun 11, 2026
48478e3
Add finite quadratic module Witt classes
a9lim Jun 11, 2026
b5c63c6
Split games/loopy.rs and games/game_exterior.rs into layered subdirec…
a9lim Jun 11, 2026
3fcab04
Add Scalar::from_int, Display supertrait, and structural Surreal eq
a9lim Jun 11, 2026
49af9e0
Refactor forms classifier API: Invariants suffix, typed errors, Resul…
a9lim Jun 11, 2026
a610cae
Apply clifford engine TASTE items: encapsulation, terms dedup, metric…
a9lim Jun 11, 2026
2229505
Split discriminant.rs, lattice.rs, and springer/char2.rs into layered…
a9lim Jun 11, 2026
beb4379
Merge taste2/chain-core: scalar from_int/Display + clifford engine items
a9lim Jun 11, 2026
4a81c49
Merge taste2/chain-games: loopy + game_exterior + integral/springer s…
a9lim Jun 11, 2026
146a2bd
Restore games test suites + excise stale helpers dropped/added by the…
a9lim Jun 11, 2026
f8f4ad9
Merge taste2/chain-forms: glossary renames, Result façade, typed errors
a9lim Jun 11, 2026
d3de35f
Retire backward-compat record-type aliases
a9lim Jun 11, 2026
65e6893
Retire legacy ℤ-embedding ctor spellings for Scalar::from_int
a9lim Jun 11, 2026
7268aa9
gen→e rename + collapse the duplicate Multivector rendering paths
a9lim Jun 11, 2026
6228ba8
Docs consistency: glossary, Result façade, retired spellings, split p…
a9lim Jun 11, 2026
0193f0d
Resolve adversarial review findings: py criticals, honest ClassifyErr…
a9lim Jun 11, 2026
27f33dc
Ledger: DONE.md taste-sweep entry + TASTE.md with played statuses
a9lim Jun 11, 2026
7561382
Normalize roadmap heading conventions
a9lim Jun 11, 2026
1d7da75
ogham foundations: language spec + Display v2 + host operator alignment
a9lim Jun 11, 2026
642efc2
ogham v0.4: grab-bag operators, relations, pure-spec cleanup, v1.1 + …
a9lim Jun 12, 2026
a790c5e
Implement ogham backend helpers
a9lim Jun 12, 2026
713dc29
Build Ogham v1 expression language
a9lim Jun 12, 2026
5813700
Implement ogham v1.1 function worlds
a9lim Jun 12, 2026
f530a95
Implement nikulin existence predicate
a9lim Jun 12, 2026
8ab7d5e
Sketch ogham 2.0/2.1 as contract, stub 3.0, bless v2 corpus
a9lim Jun 12, 2026
176270d
Fold loopy =: into the 3.0 stub; ledger ogham-reflect
a9lim Jun 12, 2026
77507a0
Implement ogham 2.0 abstraction
a9lim Jun 12, 2026
2372023
Settle m_p = 4 on the 2*3^k excess column; fix the kappa+4 norm
a9lim Jun 12, 2026
70ab64f
Implement ogham 2.1 programs
a9lim Jun 12, 2026
23851d7
Reorg docs into tasks/; delete CODA
a9lim Jun 12, 2026
ff123d6
Docs reorg: stub TASTE, clear TABLES history, archive AUDIT
a9lim Jun 12, 2026
e992647
Docs reorg: split TODO, rename ledgers, move tasks/→docs/ and spec/→d…
a9lim Jun 13, 2026
b8f96f8
Complete p-adic genus symbols
a9lim Jun 13, 2026
d3ea50a
Add Niemeier catalogue
a9lim Jun 13, 2026
64b7344
Docs: harmonize ledger heading labels; add CORRECTNESS stub
a9lim Jun 13, 2026
488f616
Ordinal excess: source Lenstra m_u from OEIS A380496 (primes 3..=709)
a9lim Jun 14, 2026
f714f5e
Certify finite-excess dependency rows
a9lim Jun 14, 2026
9f59920
Complete odd lattice discriminant surface
a9lim Jun 15, 2026
bdccb49
Implement lexicode turning game witness
a9lim Jun 15, 2026
957f942
Implement rational Brauer-Wall class
a9lim Jun 15, 2026
c1ebdff
Implement spinor gauge transport
a9lim Jun 16, 2026
81bf0f9
Implement code lattice Constructions B and D
a9lim Jun 16, 2026
3c3e687
Implement tame cyclic symbols
a9lim Jun 16, 2026
94cf80b
Add extraspecial char2 group
a9lim Jun 17, 2026
648ee40
Add function-field Brauer-Wall class
a9lim Jun 17, 2026
5307e39
Add follow-up docket items
a9lim Jun 17, 2026
7b8bed3
Ship finite Hermitian form classifier
a9lim Jun 17, 2026
e6ee8e9
Ship odd-prime Construction A codes
a9lim Jun 17, 2026
7608e4b
Add Reed-Muller code route to BW16
a9lim Jun 17, 2026
b88411a
Document m359 excess obstruction
a9lim Jun 17, 2026
081f368
write up thermography Newton bridge
a9lim Jun 17, 2026
2866c4d
Implement clifford-lattices BW16 certificate
a9lim Jun 18, 2026
45d88f1
Augment COMPLETENESS/CONTINUATIONS ledgers with missed mirrors
a9lim Jun 18, 2026
3a91758
update docs
a9lim Jun 18, 2026
2c5b525
Complete heisenberg-weil representation layer
a9lim Jun 19, 2026
3ca3998
Complete overheating game operators
a9lim Jun 19, 2026
ee21c8e
Record under descent obstruction
a9lim Jun 19, 2026
d04e2d2
Add Kneser neighbor reports
a9lim Jun 19, 2026
30a0a1f
Add Weyl versor reports
a9lim Jun 19, 2026
06f5506
Add Python type stubs and pre-release housekeeping
a9lim Jun 19, 2026
4d07117
Docs sweep: fix AGENTS.md drift, rewrite README Conway-style
a9lim Jun 19, 2026
ad74055
Trim crate tarball to the Rust artifact
a9lim Jun 19, 2026
bca4de6
Repopulate CONSISTENCY.md with the 2026-06-20 Rust-core taste audit
a9lim Jun 19, 2026
be5f4a4
Play the 2026-06-20 consistency sweep
a9lim Jun 20, 2026
30588ec
Sweep the played 2026-06-20 consistency audit
a9lim Jul 2, 2026
8b2564c
fable audit
a9lim Jul 3, 2026
78a45bc
Play wave 1 of the 2026-07-02 revision-ledger sweep
a9lim Jul 3, 2026
f573817
Play wave 2 of the 2026-07-02 revision-ledger sweep
a9lim Jul 3, 2026
cda106a
Play wave 3 of the 2026-07-02 revision-ledger sweep
a9lim Jul 3, 2026
362ebed
Play wave 4 + the lead flattening of the 2026-07-02 sweep
a9lim Jul 3, 2026
fc19511
Sweep the played 2026-07-02 revision ledgers
a9lim Jul 3, 2026
b16e40a
Adopt the rendering policy: every classifier report renders
a9lim Jul 3, 2026
9d815bf
Add docs/PY.md: the Python-side audit ledger
a9lim Jul 3, 2026
589ef72
Play wave 1 of the PY.md sweep: truth repairs, path fossils, guards
a9lim Jul 3, 2026
3a5d32f
Play wave 2 of the PY.md sweep: common.py, extraspecial, demo, stubs,…
a9lim Jul 3, 2026
7137f21
Sweep the played PY.md ledger
a9lim Jul 3, 2026
cc35937
Apply the codex review fixups to the played PY.md sweep
a9lim Jul 3, 2026
405cc0c
Grow the ogham v3.0 stub into the build sketch (§19) + staged corpus
a9lim Jul 9, 2026
06f6e64
Implement ogham v3.0 stages A+B: syntax layer, μ-recursion, fuel, coe…
a9lim Jul 9, 2026
df61997
Implement ogham v3.0 stage C: the game world over games::Game
a9lim Jul 9, 2026
1e717d4
Implement ogham v3.0 stage D: loopy Element-=:, streams, restored μ v…
a9lim Jul 9, 2026
9880c12
Ship ogham v3.0: corpus merge, host-resource guards, spec fold-in, le…
a9lim Jul 9, 2026
59ce600
Ship coinductive append (a9's call) and add the §20 v3.1 stub
a9lim Jul 9, 2026
dec7ffa
Ship ogham fuzzy notation (∥ canonical, \ sugar), the §20 v0.4.0 sket…
a9lim Jul 10, 2026
dca5aba
Ship the ogham 0.3.5 reflection spec: unified contract, nine-cell rel…
a9lim Jul 10, 2026
4c4d836
Implement ogham 0.3.5 stage A: runtime unification, persistent guarde…
a9lim Jul 10, 2026
35828af
Implement ogham 0.3.5 stage B: the syntax surface + corpus migration
a9lim Jul 10, 2026
201ea46
Implement ogham 0.3.5 stage C: multiset form stratum, right-lazy appe…
a9lim Jul 10, 2026
98d4321
Implement ogham 0.3.5 stage D: the loopy pillar — neg, budgeted sum, …
a9lim Jul 10, 2026
d60d312
Implement ogham 0.3.5 stage E: nine-cell relations, projected singles…
a9lim Jul 10, 2026
e6d8983
Ship ogham 0.3.5: stage F tutor REPL, python validation, spec fold, l…
a9lim Jul 10, 2026
8237a86
Spec ogham 0.3.6: the second adversarial pass contract
a9lim Jul 10, 2026
0917aaf
Implement ogham 0.3.6 stage A: projection oracles, budgeted embedding…
a9lim Jul 10, 2026
6facfd1
Implement ogham 0.3.6 stage B: the mechanical eval.rs split
a9lim Jul 10, 2026
d632d89
Implement ogham 0.3.6 stage C: Apply node, DataSort, RuntimeState, on…
a9lim Jul 10, 2026
8e0a29b
Implement ogham 0.3.6 stage D: mutual =: systems and self-contained e…
a9lim Jul 10, 2026
208e5b3
Join spec 10.8 wording to the stage-D contract seams
a9lim Jul 10, 2026
49c493e
Implement ogham 0.3.6 stage E: total lazy sort-checks, native guarded…
a9lim Jul 10, 2026
974eef9
Implement ogham 0.3.6 stage F: word conditionals, binder mark triad, …
a9lim Jul 10, 2026
f869aa6
Implement ogham 0.3.6 stage G: container totality, dyadic games, worl…
a9lim Jul 10, 2026
2c35cfc
Ship ogham 0.3.6 stage H: version bump, corpus merge, docs swap, ledgers
a9lim Jul 10, 2026
7b586ea
Close ogham 0.3.6: fixpoint sort-check defect (final-review catch), d…
a9lim Jul 10, 2026
40c86a6
chore: use shared Python 3.12
a9lim Jul 12, 2026
01b0304
cleanup
a9lim Jul 12, 2026
0420354
Rename the language ogham → grundy (provisional)
a9lim Jul 15, 2026
5aef072
Split grundy into an unpublished workspace crate; ogdoad -> 1.0.0
a9lim Jul 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
81 changes: 81 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
name: Bug report
description: A computation is wrong, a build breaks, or something panics where it shouldn't
labels: [bug]
body:
- type: markdown
attributes:
value: |
Before filing:
- `cargo test` is the source of truth. If you can reproduce with a failing
test (or a short `#[test]`), that's the strongest possible report.
- A *wrong number* is a bug. An *unimplemented theorem* usually isn't —
check `docs/OPEN.md` and the per-pillar `AGENTS.md` for documented scope
boundaries first (e.g. `Ordinal` nim-multiplication panics by design
past the verified Kummer boundary; `Nimber` is `F_{2^128}`, not
algebraically closed).

- type: dropdown
id: surface
attributes:
label: Which surface?
options:
- Rust core (cargo)
- Python bindings (the abi3 extension)
- examples/ or demo.py
- docs (rustdoc / README / AGENTS.md)
- not sure
validations:
required: true

- type: dropdown
id: pillar
attributes:
label: Which pillar (if known)?
options:
- "scalar/ (coefficient worlds: Nimber, Surreal, Fp/Fpn, Zp/Qp/..., Ordinal, ...)"
- "clifford/ (the multivector engine + GA layer)"
- "forms/ (quadratic forms, Arf/Brauer-Wall, local-global, integral)"
- "games/ (combinatorial game theory)"
- "py/ (PyO3 bindings)"
- "linalg/ (shared linear algebra)"
- not sure

- type: input
id: backend
attributes:
label: Scalar backend
description: If the bug is backend-specific, which one? (e.g. `Nimber`, `Surreal`, `Fpn<2,8>`, `Qp`, `Ordinal`)
placeholder: Nimber

- type: textarea
id: what-happened
attributes:
label: What happened?
description: What did you compute, what did you expect, and what did you get? Cite the math fact you're checking against if there is one.
validations:
required: true

- type: textarea
id: repro
attributes:
label: Minimal reproduction
description: The shortest Rust snippet / `cargo test` / Python call that reproduces it.
render: rust
validations:
required: true

- type: input
id: version
attributes:
label: ogdoad version
description: "`cargo pkgid` (Rust) or `pip show ogdoad` (Python), or the commit SHA."
placeholder: 1.0.0
validations:
required: true

- type: input
id: toolchain
attributes:
label: Toolchain
description: Output of `rustc --version` (and `python --version` if it's the bindings).
placeholder: rustc 1.85.0
8 changes: 8 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: Open research problems
url: https://github.com/a9lim/ogdoad/blob/main/docs/OPEN.md
about: The natural Gold-quadric play rule, a game-native quadratic deformation, transfinite nim beyond the verified Kummer boundary, and friends are KNOWN-open — not bugs. See docs/OPEN.md before filing.
- name: Security vulnerability
url: https://github.com/a9lim/ogdoad/security/policy
about: Please report security issues privately (see SECURITY.md).
59 changes: 59 additions & 0 deletions .github/ISSUE_TEMPLATE/feature_request.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
name: Feature request
description: Suggest a new backend, invariant, bridge, or ergonomic improvement
labels: [enhancement]
body:
- type: markdown
attributes:
value: |
A few scope boundaries this project deliberately keeps (see AGENTS.md and
the "Claim levels and non-claims" section):

- It is **not** a Clifford algebra over arbitrary partizan games — a
Clifford algebra needs a commutative scalar *ring*, and the full game
group is only an abelian group. New scalar worlds must be commutative
rings.
- The genuine open problems (a natural Gold-quadric play rule, a
game-native quadratic deformation of `GameExterior`, transfinite nim
past the verified Kummer boundary) live in `docs/OPEN.md`. Those are research
questions, not feature requests — open a discussion instead.

New backends, invariants, cross-pillar bridges, and binding/docs
ergonomics are all in scope and welcome.

- type: textarea
id: problem
attributes:
label: Problem
description: What are you trying to do that ogdoad doesn't support today?
validations:
required: true

- type: textarea
id: proposal
attributes:
label: Proposed solution
description: How would it work? A type sketch, an API shape, or the math being implemented is welcome.
validations:
required: true

- type: dropdown
id: surface
attributes:
label: Which surface does this touch?
options:
- New scalar backend (must be a commutative ring)
- Clifford engine / GA layer
- Forms layer (a new invariant or classification)
- Games layer
- A cross-pillar bridge (ROADMAP.md)
- Python bindings / ergonomics
- docs only
- other
validations:
required: true

- type: textarea
id: prior-art
attributes:
label: Reference / prior art
description: A theorem, paper, or standard construction this implements. Helps pin the claim level (standard math vs. interpretation vs. open).
29 changes: 29 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
## What

<!-- One or two sentences on what changed -->

## Why

<!-- What problem does this solve? Link issues with "Fixes #N" if applicable -->

## Test plan

- [ ] `cargo test` passes
- [ ] `cargo clippy --all-targets` is warning-clean
- [ ] `cargo fmt --check` is clean
- [ ] If this touched `src/py/` or any core API the bindings call: `cargo check --features python` **and** `cargo clippy --features python --all-targets`
- [ ] If this touched `clifford/` or `scalar/big/surreal/`: rebuilt (`maturin develop`) and ran `demo.py` — Display changes don't surface in `cargo test`
- [ ] If this touched any doc comment (`//!` / `///`): ran `cargo doc --no-deps` **cold** (`RUSTDOCFLAGS="-D warnings"`) and it's link-clean
- [ ] If this added a new operation: there's a test pinning it to an independent oracle (the `associativity_*` / `general_product_reproduces_*` style)

## Claim level

<!-- If this changes prose / comments / examples, label the claims per AGENTS.md:
standard math · implemented and tested · interpretation · open. New "X is
true" math statements should be backed by a test or cited, not asserted. -->

## Notes

<!-- Anything reviewers should know. If this touches the metric/product, confirm
q and b stay independent and signs go through the scalar's neg() — the two
load-bearing char-2 invariants (see Hard rules in AGENTS.md). -->
23 changes: 23 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
open-pull-requests-limit: 5
commit-message:
prefix: "ci"

# The only runtime/dev crates are PyO3 (optional, `python` feature) and
# proptest (dev). Watch them, but keep PyO3 on a short leash: its abi3 / ABI
# coupling means a major bump is a deliberate decision, not a weekly automerge.
- package-ecosystem: "cargo"
directory: "/"
schedule:
interval: "weekly"
open-pull-requests-limit: 5
commit-message:
prefix: "deps"
ignore:
- dependency-name: "pyo3"
update-types: ["version-update:semver-major"]
101 changes: 101 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
name: CI

on:
push:
branches: [main]
pull_request:
branches: [main]

concurrency:
group: ci-${{ github.ref }}
cancel-in-progress: true

permissions:
contents: read

jobs:
fmt:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt
- run: cargo fmt --all --check

clippy:
# Lint the whole workspace (ogdoad + the unpublished grundy crate) and,
# separately, ogdoad under the `python` feature (what the PyO3 bindings
# compile under — the feature only exists on ogdoad, so it is scoped -p).
# The tree is kept warning-clean, so a warning in either is a failure.
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
with:
components: clippy
- uses: Swatinem/rust-cache@v2
- run: cargo clippy --workspace --all-targets -- -D warnings
- run: cargo clippy -p ogdoad --features python --all-targets -- -D warnings

test:
# The math core is pure Rust and the source of truth (AGENTS.md): no Python
# in the loop. Run it on both platforms ogdoad is developed on. The property
# suites (scalar_axioms / clifford_axioms) fuzz the ring + geometric-product
# axioms here too.
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- run: cargo test --workspace

doc:
# Rustdoc must run COLD with -D warnings. An incremental `cargo doc` only
# re-checks what it recompiles, so it silently under-reports stale intra-doc
# links in untouched modules (AGENTS.md). A fresh checkout is cold by
# construction.
runs-on: ubuntu-latest
env:
RUSTDOCFLAGS: -D warnings
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- run: cargo doc --no-deps --workspace

python:
# Build the abi3 extension with maturin, install the wheel, and run the demo
# tour. Display paths (blade / nimber / surreal rendering) don't surface in
# `cargo test`, so the tour is the smoke test for the binding + Display
# layer. If this is green the release workflow's wheel build can publish
# blind.
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- uses: actions/setup-python@v6
with:
python-version: "3.9"
- name: Build the abi3 wheel
uses: PyO3/maturin-action@v1
with:
command: build
args: --release --out dist
sccache: true
manylinux: auto
- name: Install the wheel and run the demo tour
run: |
pip install --find-links dist --no-index ogdoad
python demo.py
- name: Check the committed type stubs are up to date
# ogdoad.pyi is @generated from the built module by scripts/generate_stubs.py.
# If a binding was added/renamed without regenerating, the committed stub is
# stale — fail here rather than ship a wrong .pyi. The generator output is
# fully sorted, so it is byte-stable across Python versions.
run: python scripts/generate_stubs.py --check
Loading
Loading