Conversation
CI (ci.yml): fmt; clippy on both the default and `python` feature sets; test on ubuntu + macos; cold rustdoc under -D warnings; and a maturin abi3 build that installs the wheel and runs demo.py (Display paths don't surface in cargo test). Release (release.yml): version-gated and dormant at 0.0.0. On a bumped version it publishes to crates.io and PyPI -- both via OIDC trusted publishing, no stored tokens -- through a cross-platform abi3 wheel matrix, then tags vX.Y.Z and cuts a GitHub release. Per-artifact existence checks make a partial-failure run resume cleanly. Project docs: dependabot (github-actions + cargo), math-flavored issue templates, a PR template wired to the real gates, CONTRIBUTING, SECURITY (zero-unsafe, small-surface threat model), and a README badge block. crates.io/PyPI packaging metadata added to Cargo.toml and pyproject.toml; version bumped 0.0.0 -> 1.0.0. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Route unit/mantissa products through the existing mul_mod_u128 instead of checked_mul().expect(), which panicked on validator-sanctioned precision: e.g. Qp<3,80> has modulus 3^80 ~ 2^127, so a unit*unit product overflows u128 even though both factors are in range. Covers Qp/Zp/LocalQp mul and the Qp/LocalQp addition mantissa-shift path; adds a regression test pinning Qp<3,80>. Surfaced by the correctness audit (finding H-2). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…on folds ROADMAP: add proposed third-wave bridges — J (valuation-as-tropicalization / Newton polygons), K (cyclic-algebra Q/Z Brauer lift), L (deferred Drinfeld mirror) — and fold the formalization-pass corrections: lax tropicalization, the Newton orientation trap, and Newton-slope = Springer-residue-layer (J); the load-bearing ramified caveat, the F_q(t) reciprocity route, the corrected trace-form tie, and the Wedderburn non-tie (K). OPEN: add the extraspecial-2-group reframing of the Gold-quadric problem, with the abelian-obstruction explanation of the misere R8 result and the E-equivariance Tier-2 criterion. OPEN-3: cross-reference the shared relative-norm-over-Frobenius-orbit primitive the p=719 wall and Bridge K both need. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Four reports from the parallel research/audit run — AUDIT-FABLE (correctness
sweep), RESEARCH-GOLDARF (Gold-quadric Tier-2 assault), RESEARCH-EXCESS
(transfinite nim excess), BRIDGES-DRAFT (formal Bridge J/K lemmas and the
extraspecial LaTeX) — plus the experiment probes that back them, rescued from
ephemeral /tmp into experiments/{gold,audit,excess}/ with provenance READMEs.
Machine-generated and adversarially gated once; treated as leads, not verified
results (each report's header says so). The committed H-2 fix is the one finding
verified against code so far.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Triaged and fixed all 27 enumerated findings from the second-pass
"fable assault" audit (H-1, H-2, M-1..M-9, L-1..L-16), composed from six
parallel per-unit fix agents and verified together.
Behavioral fixes (with regression tests):
- H-1 divided_power: Lucas-theorem embed_binom (char-p, O(log n)) +
checked_mul binom (char-0 loud overflow) -- no more u128 overflow/hang
- M-1 Surreal::from_ordinal: i128::try_from instead of silent `as` wrap
- M-2 Laurent/Qq add+coeff: compare valuation gap vs K as i128 before
any usize cast
- M-3 reverse(): assert !has_upper() -- loud reject on a-metrics instead
of silently returning a non-anti-automorphism
- M-4 isometric_nimber/_ordinal_finite: compare Arf at a common field
degree (the cross-subfield isometry bug)
- M-6 Hackenbush::new: apply grounded() prune at construction
- M-7 misere_outcome -> Option<bool>; PyValueError at the binding
- L-3 Integer add/mul/neg: checked ops with expect
- L-4 drop dead (8*base+32).min(12), use literal 12
- L-12 theta: |Aut(E8+E8)| = 2|W(E8)|^2, exact Siegel-Weil mass assertion
- L-14 delete dead unchecked mod_pow_u128 chain
- L-15 py kernel/list inputs: shared check_succ_bounds -> PyValueError
- clifford even_subalgebra: require a unit pivot (ring-backend isomorphism)
Doc-only corrections: M-5, M-8, M-9, L-1, L-2, L-5..L-11, L-13, L-16,
clifford_conjugate.
H-2 (p-adic mantissa overflow) was already fixed upstream in 9f41371 --
the audit ran against a pre-fix tree. L-11 is partial: the LDL d<=0 guard
plus honest docs landed; the proven-eps backward-error bound is left as
documented residual.
Removed three stale "before-fix" reproduction test modules left behind by
the fix agents (reverse_m3_witness_tests, test_misere_cycle_m7,
test_floating_m6), each superseded by an after-fix test in the same file.
Folded AUDIT-FABLE.md into AUDIT.md as a "Second pass" section and removed
the standalone file.
Gate: cargo test --all-targets (691 lib + property/example suites), clippy
--all-targets and --features python (-D warnings), cold rustdoc, maturin
develop + demo.py + experiment probes -- all green; M-6/M-7/L-15 confirmed
through the live Python binding.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Bridge F (rational Brauer class) — forms/witt/brauer_rational.rs: the ungraded 2-torsion Brauer class of a Q-form as its set of ramified places (Brauer2Class, XOR law). The Hasse-Witt invariant s(q) and the Clifford invariant c(q) = [C(q)] (n even) / [C0(q)] (n odd) differ by the n mod 8 / discriminant correction delta (Lam GSM 67 pp. 117-119, cross- checked against SageMath's clifford_invariant). Independent oracles: C(<a,b>) = (a,b) and C0(<a,b,c>) = (-ab,-ac). Place gains Ord/PartialOrd so the ramification set is a BTreeSet (R before Q_2, Q_3, ...). Bridge J (valuation = tropicalization; Newton polygons): scalar/valued.rs gains the tropicalize() adaptor into Tropical<MinPlus> and lax-homomorphism docs (J.1); new scalar/newton.rs adds NewtonPolygon::of over any K: Valued, with root_valuations() (negated slopes, dodging the orientation trap), slopes(), zero_root_multiplicity(). The slope <-> Springer-residue-layer cross-check lands in springer/local.rs tests (polygon_is_the_springer_shadow, polygon_outlives_springer). Both are standard math made computational, the status A-I shipped at. 18 new tests; full suite + clippy --all-targets + cold rustdoc clean, --features python builds. ROADMAP marks F/J implemented; TABLES records the Lam correction as a sourced finite case table. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- ROADMAP.md -> roadmap/{DONE.md,TBD.md}: implemented & tested bridges
(A-D, E/F/H/I, J) in DONE; proposed/deferred (G, K, L) in TBD. Math
prose moved by byte-exact extraction, claim-levels preserved.
- Fold OPEN-3.md into writeups/RESEARCH-EXCESS.md (same research
thread): adds the up-front Notation/implemented-state section and a
closing provenance section (oracle, files, verification, sources).
- Route the former BRIDGES-DRAFT.md by status: Bridge J formal proofs
appended to DONE.md, Bridge K formal draft appended to TBD.md, the
extraspecial reframing -> writeups/goldarf-extraspecial.md (it is
goldarf.tex paste material).
- Land the file moves into writeups/ (RESEARCH-EXCESS, RESEARCH-GOLDARF).
- Update cross-refs (AGENTS, README, OPEN, AUDIT, brauer_rational.rs,
experiments/*) and fix stale pointers to moved/folded docs
(RESEARCH-GOLDARF -> writeups/, AUDIT-FABLE -> AUDIT.md).
cargo doc --no-deps warning-clean (only .rs change was a //! comment path).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
roadmap/TBD.md gains the fourth wave, picked by symmetry-table gaps
rather than new number systems:
- Bridge M (Brown): the char-2 cell of the mod-8 spine — Z/4-valued
quadratic refinements with the Brown invariant beta in Z/8, containing
the shipped Arf bit as 2-torsion (beta = 4*Arf) and computing the
Milgram phase exactly (no f64) on 2-elementary discriminant forms.
- Bridge N (unification pass): four independent joins of shipped parts —
Milnor's exact sequences over Q and F_q(t) (Springer residues lifted
to WittClassG::OddChar), the Scharlau-transfer naming with Frobenius
reciprocity and Springer's odd-degree theorem, Nikulin's genus <=>
(signature, discriminant form) criterion, and one shared Bernoulli
source for the Eisenstein 240/504 and the mass constants.
- Bridge O (lexicodes): the missing games <-> integral edge — greedy =
mex, binary lexicodes linear by Sprague-Grundy theory (Conway-Sloane
1986, verified citation), d = 8 length-24 lexicode = extended Golay,
linear over the Fermat-power nim-fields F_{2^(2^k)}.
OPEN.md section 1 and writeups/RESEARCH-GOLDARF.md (post-assault, after
Theorem A) gain the lexicode shadow: lexicodes are the rich linear floor,
coin-turning linearity is the ceiling, the two coincide at degree 1, and
Problem 1 is exactly the first quadratic step above the meeting line.
Marked context-not-progress; turning-game realization flagged for
transcription from the 1986 paper before citing in goldarf.tex.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… excess.tex Fold goldarf-extraspecial.md and RESEARCH-GOLDARF.md into goldarf.tex (Theorem A-H lettering and Table 1/2 numbering preserved for external references; the ECHO-FIFO+dummy claim stays flagged unverified) and formalize RESEARCH-EXCESS.md as excess.tex (exact power criterion with the Wieferich caveat; De Feo-Randriam-Rousseau attribution fixed). Update cross-references in OPEN.md, AGENTS.md, the run READMEs, and cyclotomic_3k_family.py; rebuild goldarf.pdf and add excess.pdf (tectonic-clean, no unresolved refs). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
N — four small joins of already-shipped parts: - N.1 Milnor's exact sequence: forms/witt/milnor.rs global_residues (signature + odd-p second residues, exact from i128; springer_decompose_qp cross-check). ∂₂ shipped as a documented boundary, odd-p only. - N.2 Scharlau transfer: trace_form::transfer_diagonal; the k=0 twisted form is s_*(⟨1⟩). Frobenius reciprocity + Springer's odd-degree theorem. - N.3 Nikulin: DiscriminantForm::is_isomorphic (budgeted homomorphism- extension search); are_in_same_genus ⟺ (signature, disc form) across the zoo, pinned by the Milnor pair. - N.4 one Bernoulli source: bernoulli is pub(crate); eisenstein_e4/e6 derive 240/-504 from it, literals kept as the pinned oracle. O — lexicodes (games ↔ integral edge): games/lexicode.rs. greedy = mex; binary lexicodes are linear; lexicode(24,8) is the Golay code. Production route carries the full distance array and updates via the coset recurrence d(v, C∪(g⊕C)) = min(d(v,C), d(v⊕g,C)), so the n=24 build is sub-second. Chain rung: Construction A is even unimodular rank 24 with roots (≠ Leech). Roadmap: N and O moved to DONE.md (fourth wave); TODO.md keeps M proposed. +18 test fns; cargo test/clippy(+python)/doc(cold)/fmt all clean. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Audited every AGENTS.md against live code and fixed accumulated drift.
Missing modules/APIs now documented:
- scalar: newton.rs / NewtonPolygon
- forms: witt/brauer_rational.rs, witt/milnor.rs, transfer_diagonal
- forms/integral: short_vectors exact-rational fast path, DiscriminantForm
is_isomorphic (Nikulin), theta_series_via_weight_enumerator, D16_PLUS_AUT_ORDER
- games: lexicode.rs (Bridge O) — an entire undocumented module
- py: GameRelation/certificates, LoopyNimber, PartizanOutcome, cayley_inverse, version()
Factual corrections:
- clifford: frobenius bound is CoordinateCyclicGaloisExtension; spinor's
char-0 nonorthogonal path + SpinorRep fields; reverse panics on a!=0; CGA point_pair
- games: sub_pl is not a tropical op; LoopyValue was missing Zero/Star
- linalg: f2.rs is plain nim_rank over F_{2^128}, not "Dickson computations"
- py: backend! stamps Algebra/MV/LinearMap triplets, not pairs
README (symmetry-focused): added the lexicode bridge (mex -> lexicode -> Golay
-> Construction A -> theta, crossing three pillars) and Milnor's exact sequence
as the global capstone of the local<->global story. Top-level AGENTS.md gets a
matching fourth-wave summary.
Markdown only — not include_str!'d into rustdoc, so cargo test/doc unaffected.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The mod-8 spine had four char-0 routes to σ mod 8 (rational signature, genus oddity, Milgram phase, Weil S prefactor) and only the ℤ/2 Arf bit on the char-2 side. Bridge M fills the char-2 cell with the Brown invariant β ∈ ℤ/8 of a ℤ/4-valued quadratic refinement (Brown 1972; Wall 1963). New src/forms/char2/brown.rs (the pure-F₂ core): - brown_f2(n, q4, bmat) -> BrownResult, mirroring arf_f2/ArfResult. Enumeration route with exact-integer phase recovery: peel rad(b), enumerate the 2^rank core, tally into the Gaussian integer (n0-n2)+i(n1-n3), read β by integer sign/magnitude — no floating point. Anisotropic radical vanishes the full sum; β reports the core. - double_f2: the q' ↦ 2q' doubling bridge, with β(2q') = 4·Arf(q'). DiscriminantForm::brown_invariant (integral/discriminant.rs): Some only on 2-elementary A_L, giving β ≡ sign(L) mod 8 exactly — a fifth, float-free route to σ mod 8, cross-checked against the shipped f64 milgram_signature_mod8. Tests: the generators (⟨1⟩→1, ⟨−1⟩→7), order-8 relation, split objects, additivity under ⊥, anisotropic-radical detection, β(2q')=4·Arf across the arf zoo; the lattice route on A1/E7/D4/D8/E8 vs Milgram, None off the slice. Docs: move M from TODO.md (proposed) to DONE.md (built); correct the two stale "Place needs an Ord derive" notes in the Bridge K draft (F already shipped it); update forms/AGENTS.md, root AGENTS.md; fix a TBD.md→TODO.md typo in brauer_rational.rs. Verified: 741 lib tests pass, --features python compiles, clippy --all-targets clean, cold cargo doc -D warnings clean, fmt clean. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…oadmap
Bridge K — the last non-deferred cross-pillar bridge. Lifts the shipped
2-torsion rational Brauer surface (adelic.rs, Bridge F) to the full local
Brauer group Br(K_v) ≅ ℚ/ℤ via the cyclic-algebra invariant of local class
field theory. Standard math made computational — not a new theorem.
Surface:
- forms/witt/cyclic.rs: BrauerClass (ℚ/ℤ-valued ungraded Brauer class with
add mod ℤ / invariant_sum / from_two_torsion / two_torsion — Bridge F's
Brauer2Class embeds as the ½-slice) and cyclic_algebra_invariant::<E>(a) =
v(a)/n mod ℤ for the unramified local class (Qq leg; reads only the
valuation, so exact even on the capped model).
- forms/local_global/function_field.rs: constant_extension_invariants(n, a) =
deg(v)·v(a)/n — full-strength ℚ/ℤ reciprocity over F_q(t) (constant
extension unramified everywhere ⇒ Σ_v inv_v = deg(div a)/n = 0, no ramified
symbols), plus constant_extension_invariant_sum.
14 new tests: degree-2 compat vs the shipped brauer_local_invariants (the lift
is a lift), splitting law + norm-classes-split, n=3 image/additivity/convention
pin, full reciprocity over F_q(t) for n∈{2,3,4,5} with an independent
deg(div a)=0 check, Bridge F embedding round-trip, and the §6 degree-2
norm-form oracle tying inv to the Hasse–Minkowski layer (trace-form tie shipped
as a test only — the general-n constructor is a composition, not new math).
Roadmap refresh (everything explicitly TODO is now done):
- roadmap/CODA.md (new): the built-bridge record + formal appendices
(Bridge J's J.1–J.13 proofs, Bridge K's LCFT statements, etc.) migrated out
of DONE.md — the long-form reference behind the AGENTS.md summaries.
- roadmap/DONE.md: emptied to a go-forward ledger (header + entry template)
for future sessions to refill.
- roadmap/TODO.md: shortened to the two deferred bridges, nimbered *1 (spinor
genus) and *2 (Drinfeld/Carlitz mirror).
- AGENTS.md / forms/AGENTS.md: integrated the structural facts (added the F and
J summary lines that were only in per-pillar docs); reworded the roadmap refs.
- Reference fixes across README/OPEN.md/brauer_rational.rs (incl. Bridge O is
built, not proposed).
cargo test (755 lib + integration/property/doctests) green; clippy clean; cold
cargo doc warning-free.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ge catalog - roadmap/TODO.md: rebuilt as a game-valued multivector ledger — numbers (buildable, slugged), switches (a9-decision-first), ups (chores), stars (deferred; new *4 wild local symbol). Files the N.1 p=2 residue, the echo-solver verification harness, fqm-witt, niemeier/Siegel-Weil, and ~20 more tractable items. - OPEN.md: title fixed (was "TODO"); §1/§3 refreshed against the current goldarf.tex/excess.tex state (N1-N3 criterion, no-go ladder, the unverified echo-fifo+dummy claim; C_k status, Wieferich caveat, 0/1/4 rule evidence); two new problems (over: the mod-8 spine in game semantics; under: thermography <-> Newton polygons); all six regamed as loopy-stopper dual pairs tis/tisn, on/off, over/under — numerals survive as aliases, dud reserved. - README.md: the traveller's bridge catalog — 16 crossings, 5 islands, degrees S=5 C=5 F=8 I=13 G=1 (forms alone balanced, at exactly 8). Four odd islands: Königsberg redux, no Euler circuit — and the two bridge-pairs that would open it are already on the roadmap (machine-verified). - Pointer-line syncs in AGENTS.md, CODA.md, DONE.md. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… (391,680/391,680) The pre-registered adversarial review of the Gold/Arf program's single load-bearing unverified result, executed end to end: - experiments/echo_solver.py (new, stdlib-only, maintained): direct full-state solvers for the echo family — no decomposition, no isomorphism caching, σ in every memo key — validated against explicit tree enumeration, the original direct_fifo_value run verbatim, and the Turning-Corners mex recurrence; Codex cross-ran every stage. - Negative result kept: all 80+ readings of the old §8.3 prose fail at m=8 — the prose misdescribed the rule. The faithful game is σ-valued (the two players are the two central characters; value = forced terminal charge), FIFO retains the one-move ko, a forced pass clears it, and the dummy is an ordinary chargeless coin. - Verdict: 391,680/391,680 checks (765 scaled forms × 256 positions × both stances), zero misses; m=4 family 30/30 with the dummy (15/30 without); decision-live in bulk (1.5–4.4M decision states/instance); torsor-uniform (provably so — the diagonal is play-invariant). - The §8.2 echo-ko table independently reproduced (σ-explicit, miss x=224 included) and identified as the σ=1-stance face of a stance-asymmetric rule. - Docs: goldarf §8 rule prose corrected + verification record, §9 re-ranked (recasting is now move 1); OPEN.md tis(§1) program state; TODO echo-solver → DONE.md (first go-forward entry), successor slug echo-family-sweep; AGENTS.md probes + commands. Boundaries: the realizer is σ-valued (not yet a P-set in normal/misère/loopy semantics); even-a diagonal lemma open; the bounded-window blocker untouched (FIFO memory is unbounded). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…<=7 verification, two-mode strategy
The general-m chase, second 2026-06-10 pass. The sigma-game reduces to the
odd-close parity game (FIFO => no nesting => linked = overlap; D = sigma ^ und
flips only on odd-deg_U(front) closes; ko/passes localize away). The linking
theorem -- isolated coin => flips forced even => exactness for all m -- is
machine-verified on every graph iso class k <= 7 + dummy, both seats (1,044
classes at k=7), with the no-dummy Bad census {3:1, 5:4, 7:34} (all
mover-controlled, none with an isolated vertex). The domination device is the
unique local obstruction (proven); the dummy kills it at every root. A two-mode
prevention/debt defender strategy is strict-verified k <= 7, both seats
(menu-existential; Codex review caught the semantics and a losing in-menu
line). Open residue: the general-n induction -- parity-local invariants
provably insufficient; firewall-segmentation architecture recorded.
New: experiments/linking_game.py (stdlib harness: validate/screen/strategy,
cross-checked against echo_solver via the SynthForm bridge). Docs: goldarf
sec:linking + status/validation, OPEN.md tis(1), DONE.md linking-reduction
entry, TODO.md echo-family-sweep note, AGENTS.md.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The 2026-07-09 design session (a9 + fable): fuel meters steps not depth
(E_Fuel; the depth version failed the no-silent-hang claim); the two
containers — APL over the Clifford worlds (coef/dim), Lisp over the game
world (cons = {h | t}, nil = {|} = 0, list sugar {1, 2, 3}, append ⧺/++,
structural ≡/=== beside value =, canon relating them); Element-=: streams
with ⧺ as the one guardedness-transparent operator; conservative E_Loopy
envelope. Staged corpus docs/ogham/conformance_v3.txt (hand-verified);
*8 converts to CONTINUATIONS.md's numbered ogham-3.0 per ledger convention.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013PCjysqZsg6MGeR8PuWSat
…f/dim Sol's build (gaslamp thread ogham-v3, job cx-20260709-135006-7df5), gated here: lexer/parser/AST/unparser for =:, ⧺/++, ≡/===, braceforms + list sugar (Int-0 spine terminal per the corpus; spec amended to match), brace continuation; evaluator μ semantics with env-scoped self-binding, shared per-statement u128 fuel (E_Fuel, default 2^16), :fuel/@fuel knobs, coef/dim in Clifford worlds, game-world-only rejections everywhere else. Shipped-corpus {0|0} vector updated E_Reserved → E_WrongWorld (braces now parse; the v2 reserved-syntax-revisited precedent). 28/28 runnable staged vectors, 129/129 v3 parses, 16/16 echoes; fmt/test/clippy(both)/check --features python all clean on the gate. Known boundary, recorded for the thread: μ-function bodies skip v2's definition-time world-legality validation (the validator would recurse); world errors in recursive bodies surface at application instead. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013PCjysqZsg6MGeR8PuWSat
Sol's build (gaslamp thread ogham-v3, job cx-20260709-141655-abd5), gated
here: :world game dispatch arm; integer/nimber/factorial literals; negation
and disjunctive sum; the four CGT relation cells via engine comparison;
canon; ordered structural ≡ (the engine's structural_eq sorts option
fingerprints, so the runtime carries its own ordered comparator —
{0, 1 |} ≡ {1, 0 |} is pinned false); option access nleft/nright/left/right;
up()/down(); structural ⧺ spine append with E_Improper; display with
structural-only recognition of literal-built forms (1 + 1 stays {1, 1 |});
all world-boundary rejections with the spec'd hints. Element self-=: is an
explicit stage-D parse error for now. 87/87 A–C staged vectors, 129/129
parses, 16/16 echoes; fmt/test/clippy(both) clean on the gate.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013PCjysqZsg6MGeR8PuWSat
…alidation Sol's build (gaslamp thread ogham-v3, job cx-20260709-143556-1b89), gated here: guarded Element-=: with definition-time reduction (⧺ transparent from the left; E_Unfounded for bare roots, nil-unit unfolds, left-μ appends, and sums); GameElement splits finite engine Games from Arc-shared regular graphs (edges: finite subgame / local node / external graph, so finite grafts never copy cycles); graphs flatten into LoopyPartizanGraph at definition with cached draw sets; drawn(); visited-pair regular-tree ≡; root/interior/composite equation display; the full conservative E_Loopy envelope; repeated-state μ-descent drains remaining fuel instead of overflowing the stack (E_Fuel semantics preserved). Recursive-function validation restored to definition time via scoped sampled μ stubs in every runtime, with the fp5 ordered-comparison regression pin. Full staged corpus runnable: 129/129 inputs, 83 value + 25 error expectations, 16/16 echoes; fmt/test/clippy(both) clean on the gate. Known hole for stage E (repro'd on this commit): deep NON-repeating descent (f =: n ↦ n = 0 ? 0 : f@(n - 1); f@60000) still aborts on stack overflow before E_Fuel fires — needs a depth safety guard. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013PCjysqZsg6MGeR8PuWSat
…dgers Stage E + hardening (sol, gaslamp thread ogham-v3, jobs cx-...-60ac and cx-...-4b91), gated here: the 129-vector v3 slice merged byte-for-byte into conformance.txt (387 inputs, 331 explicit outcomes, 52 echo pins total); conformance_v3.txt rewritten as blessing/provenance; staging machinery removed from the harness; @fuel a shipped directive. No input reaches a host abort any more: evaluation runs on a 64 MiB worker stack (REPL, ogham_eval, and harness identically), the μ-descent guard is 1024 active frames (E_Fuel naming the depth guard and remaining steps), and source + constructed-AST depth is audited iteratively at 1536 (honest E_Parse — the list sugar builds deep trees from flat text). Verified here: len over a 1000-element list = 1000; the 2000-item literal errors instead of aborting; f@60000 depth-guards; fib@25/fuel-5000 keeps the step message. Spec side: §19 status flipped to implemented-and-tested with the §19.2 host-guard constants recorded; §1 gains the two-containers principle; §2/§3 gain ⧺ ++, ≡ ===, =:, and real braces; §6.1 lists the game world; §11/§12/ §14/§15 updated; trampoline evaluator joins the §19.6 owed list. CONTINUATIONS.md's 4·e_o ogham-3.0 archived to DONE.md (designed and shipped 2026-07-09). Gates: fmt, cargo test (1025), clippy both feature sets, cold rustdoc -D warnings — all clean. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013PCjysqZsg6MGeR8PuWSat
Append is now coinductively total on the left (spec §19.4.5, decided
2026-07-09): the right-spine walk grafts at nil, returns the left operand
unchanged when the walk cycles (ones ⧺ {5 | 0} = ones, Arc identity
preserved; finite prefixes into cycles likewise), and keeps E_Improper
for non-cons non-nil nodes — improperness is orthogonal to cyclicity.
Definition-time reduction mirrors it: a closed cyclic left discards the
symbolic right with its μ-occurrences, so l =: ones ⧺ {5 | l} degenerates
to l := ones. Sol's implementation (gaslamp thread ogham-v3, job
cx-...-8863), gated here: corpus vector replaced + coherence and
finite-prefix-display vectors added (389 inputs, 333 explicit outcomes),
unit coverage for all three walk outcomes and the reduction case,
conformance_v3.txt carries the superseded-vector provenance note; 1,026
tests, clippy both feature sets, cold rustdoc all clean; live-probed
l ≡ ones = true.
§20 v3.1 stub (a9's staging: 3.1 pre-reflect, 4.0 after ogham-reflect):
the envelope release — loopy comparison/sums/canon at the engine's
verified surface, per-mover outcome predicates, negation behind the
anonymous-cycle display decision, mutual =: groups, array-side coef
extensions, and the trampoline implementation floor; 4.0 deliberately
unsketched with the functions-as-values gate as its one standing agenda
item. CONTINUATIONS gains star *16; DONE.md and AGENTS.md updated.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013PCjysqZsg6MGeR8PuWSat
…ch, and 0-prefixed versions - fold the v0.3.1 envelope stub into the v0.4.0 envelope-release sketch (§20: gate first, pillar stage with survival-order stopper comparison, total loopy sums, synthesized-name negation display, adjacent-binding mutual =: groups, measured implementation floor); star *16 converts to 4·e_o: ogham-0.4.0 (value proposed, a9 to re-value) - make ∥ (U+2225) the canonical fuzzy relop with \ as its lexer sugar (the TeX reflex, affordable under never-strings); | becomes the structural braceform bar only, its relop reading removed with an E_Parse hint; live corpus re-blessed, the v0.3 archive's two fuzzy vectors transcribed under a dated note - renumber versions 0-prefixed repo-wide (unpublished, a9's call): ogham N.M → 0.N.M across spec/corpus/ledgers, crate + pyproject 1.0.0 → 0.1.0, conformance archives renamed to _v0.2/_v0.3 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01R86kfaSCPkQbv8YChcXHNR
…ations The reflection pass (a9 + fable, four codex-seat perspectives + sol adversarial verification): docs/ogham/ogham.md rewritten as one 19-section contract — lisp-for-games identity, presentation<form<value<outcome strata, multiset form equality, # Index literals, [...] two-face container, ! fuzzy sugar, up/down/dim atoms, right-lazy append, nine-cell outcome relations with stopper-projected value singles (Siegel GSM 146 VI.2.1 pinned), total loopy sums/negation, hasdraw/stopper, E_GraphBudget. Five verified 0.3.0 defects chartered for repair; deltas marked [0.3.5] until the build lands. Staging seed conformance_v0.3.5.txt; CONTINUATIONS gains ogham-0.3.6 (the second adversarial pass gating release) and the slimmed ogham-0.4.0. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RbvQ1QuEEYWXvQ7WAPMLuY
…d worker sol implementing over gaslamp thread ogham-v35, fable gating. One generic SharedRuntime over a WorldOps trait replaces the quadruplicated function/binding machinery (eval.rs 7073 -> 6239); World forwarding is macro-generated; OghamSession owns one persistent 64 MiB worker and routes :world/metric parsing through the 1536-node depth preflight (the world-decl stack-overflow abort is now honest E_Parse, world and worker preserved); error constructors centralized with guidance in the hint field (one corpus vector adjusted to the message/hint split); validation_stub renamed validation_sample_function. Frozen 0.3.0 surface: all 998 unit tests and the full conformance corpus green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RbvQ1QuEEYWXvQ7WAPMLuY
sol over gaslamp thread ogham-v35, fable gating. // and nesting /* */ comments (# is Index-only now; the /*2 reciprocal collision resolved — comments win lexically, the unparser emits /(*2)); # Index literals with minimal-mark display and capture preservation (the 0.3.0 capture-lowering defect closed); prefix factorial removed and ! reborn as the fuzzy ∥ sugar (\ retired, != gets the teaching hint); [...] containers in both faces with value-level spine display, mandatory brace bars, dim-0 []; up/down/dim literal atoms with call-form guidance; full-expression right-assoc ternary branches; the parse-side hint package. Corpus: 419 active vectors — 12 factorial vectors dropped, 41 added under migrated 0.3.5-B headers, 131 comment lines and all barless/call-form/\-sugar spellings migrated. Gate fix folded at review (fable): eval_index now routes BinaryOp::At through eval_value in every runtime, so application is legal inside Index positions (t↑(f@0); pinned in the corpus) — the game copy already had the arm, three copies gained it. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RbvQ1QuEEYWXvQ7WAPMLuY
…nd, hasdraw sol over gaslamp thread ogham-v35, fable gating. Form equality quotients presentation by multiset: finite ≡ compares sides as multisets of forms; cyclic ≡ is unordered regular-tree bisimulation (visited pair-set for coinductive assumptions, branch-local cloned state so failed candidate matches cannot leak optimistic assumptions, bipartite perfect matching per node side; α-invariant, multiplicity-exact) — period-1 and period-2 presentations of one stream compare equal. Display recognition shares the multiset walk with precedence integer → nimber → up/down → spine → braces (the delights land: [0] is *1, [0,0] is up, [*1] is down); canon keys go multiset, so the 0.3.0 order-sensitivity defect and its falsified retraction theorem are dead (a = b ⟺ canon(a) ≡ canon(b), corpus-pinned). ⧺ evaluates its right operand only when the left walk reaches nil — the coinductive identity is now the operational rule, and the non-strict positions are exactly ternary branches, and/or right operands, ⧺ right. drawn renamed hasdraw with teaching hint. Corpus 421 → 459 active vectors; staging reduced to the D/E families. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RbvQ1QuEEYWXvQ7WAPMLuY
…stoppers, nine-cell readout sol over gaslamp thread ogham-v35, fable gating. LoopyPartizanGraph gains validated constructors (invalid edge targets error instead of panicking), graph negation, finite-Game embedding, and the root-explicit disjunctive product sum with a u128 node budget counted at first discovery (NodeBudgetExceeded distinct from every theory error; no partial graph escapes). Turn-expanded stopper detection checks both initial movers and returns a closed alternating turn-state cycle witness for stage E's witness-carrying E_Loopy. The exact per-starter outcome-pair readout carries the Siegel GSM 146 pins (Def VI.1.8 p. 284, Thm VI.2.1 p. 290). Catalogue pins: on/off/over/under/dud/ones outcome pairs; on+off and over+under both draw/draw; over, under, ones stoppers, dud and over+under not; neg(over) structurally under; the mixed sum over + * through the finite embedding. Retrograde outcomes match an independent memoryless strategy-enumeration oracle on 256 seeded small graphs. Pillar-only: language surface and corpus untouched; games/AGENTS.md updated. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RbvQ1QuEEYWXvQ7WAPMLuY
…, total loopy arithmetic
sol over gaslamp thread ogham-v35, fable gating. The draw atom ‿ (sugar _,
contextual outside identifiers) and the nine outcome doubles land as
relop-tier tokens; every double reads the outcome pair of G + neg(H)
through the stage-D product graph (finite operands embedded), total on all
game operands, exactly-one-of-nine and both symmetry laws (negation
rotation, operand swap) tested across every cell. Value singles on loopy
operands gate on both presented operands being stoppers — refusals carry
the alternating turn-state cycle witness (0:L→0:R→0:L) naming the
offending side — then project via the Siegel-pinned nine-to-four table;
finite pairs keep the canonical route with the corner bijections pinned.
Loopy + and - are graph-backed values; unrooted cycles display with
synthesized first-reach names (-on is g1 =: {| g1}; on + off is dud's own
shape g1 =: {g1 | g1}; well-founded exits collapse so -ones shows
g1 =: {g1 | -1}). E_GraphBudget (default 65536, :graph/@graph knobs,
world-reset) is distinct from E_Loopy; stopper(E) joins stdlib; hasdraw is
property-tested as the five-cell union; outcome/winner/who teach the
relations-against-0 readout. ones = ones is an error→value graduation.
Corpus +87 statements under migrated 0.3.5-E; staging file reduced to its
provenance header. eval_index consolidation declined with cause (world-
specific call surfaces), noted for 0.3.6.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RbvQ1QuEEYWXvQ7WAPMLuY
…edgers
sol over gaslamp thread ogham-v35 (REPL + hints + validation), fable (spec
fold + ledgers), closing the six-stage reflection-release build. The REPL
earns the tutor principle: versioned banner, a one-screen :help with the
grouped world menu and five verified seed lines (the factorial seed moved
to integer 0 when live verification showed the game world correctly
refuses ⋅ — the seeds must run), unknown-world menus with edit-distance
suggestions, the omega hint, :graph in the command row. Python surface
validated end-to-end: maturin develop + demo.py green, ogham_eval smoke
across worlds including a nine-cell relation, E_GraphBudget, and
post-error worker recovery; per-call persistent-worker semantics verified
from source. Deep property run OGDOAD_PROPTEST_CASES=64 green. Spec: the
[0.3.5] markers come off (status: implemented), and the build's accumulated
wording repairs fold in — the /(*2) comment collision, bare-IDENT
exponents, the ω-exponent sort-ambiguity, the {5 | 0}-is-[5] recognition
example ({1 | -1} is the honest raw form), branch-local bisimulation
assumptions, the witness format, :graph/@graph, and the §17 architecture
notes. Ledgers: DONE.md gains ogham-0.3.5; CONTINUATIONS trims the reflect
entry to a pointer and seeds ogham-0.3.6 with the build's own punch-list
(eval_index consolidation, the singles/budget seam, synthesized-name
collision risk, multi-SCC display pins). AGENTS.md speaks 0.3.5.
Release remains gated on the ogham-0.3.6 second adversarial pass.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RbvQ1QuEEYWXvQ7WAPMLuY
The seven-perspective sweep's synthesis, decided a9+fable 2026-07-10: docs/ogham/ splits into spec.md (normative v0.3.6 contract) / implementation.md (architecture + guards) / README.md (tour); the ladder moves to CONTINUATIONS (0.3.6 -> 0.3.7 -> 0.3.8 -> 0.4.0 release -> 1.0.0 higher-order). Headlines: display law restored via mutual Element-=: systems + collision-safe alpha-names; total sort-checking at non-strict positions; guardedness by the language's own reduction; if/then/else replaces the ternary (Bool tier all words; : freed for ordinal sum, ? solely the Bool binder mark); the binder mark triad; container totality (fixed/graded/free); dyadic game literals; birthday/integral; world respelling + dim-0 shorthand; Display v4; strata corrections (multiform, outcome-as-observation, predicate refiling); E_StackDepth/E_FixpointSort. Old ogham.md stays until the build's docs swap. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CMdAJFURZigjwqfuiQ1TWg
…, memoized structural equality Law tests (tests/ogham_laws.rs): 64 seeded stopper-pair comparisons of projected singles against an independent Cartesian-difference survival oracle (Siegel VI.2.1 path, separate from project_stopper_outcome); 48 fresh non-self-dual two-operand checks of the negation-rotation and operand-swap laws. Staging corpus conformance_v0.3.6.txt (99 vectors): budget-precedence on the singles' seam, the shared-DAG family. D6: LoopyPartizanGraph::from_game now takes the node budget and counts every option occurrence at discovery (root first, exact budget, nothing partial escapes) — a shared-DAG operand errors E_GraphBudget fast instead of hanging the worker. Finite = and unary - preflight the same bound (the hang lived in Game::eq/neg occurrence-recursion). D7: multiset ≡ memoizes on pointer pairs with an Arc identity short-circuit — g30 ≡ g30 in shared-size time, semantics bit-exact. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CMdAJFURZigjwqfuiQ1TWg
eval.rs 7020 -> 338 lines (consts, World dispatch enum + macro, from_decl,
re-exports). New tree per implementation.md 1.1: session.rs (worker, API,
depth guards); runtime/ (WorldOps + SharedRuntime, value, function,
validate, index helpers, transform; state.rs is the stage-C placeholder);
worlds/ (clifford, polynomial, rational_function, game/{mod,fixpoint,
display,equiv}). Verbatim moves - visibility, use-paths, and reattached
doc attributes only; no signature or logic changes. Gates exact: 1051
tests, 644 vectors, clippy/fmt/cold-doc/python-check clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CMdAJFURZigjwqfuiQ1TWg
…e Index evaluator
Expr::Apply { callee, args } replaces the Binary{At}/Tuple pseudo-value
encoding (12 Tuple=>E_FnSort arms and 26 Tuple references deleted; parse/
unparse byte-compatible). Sort -> DataSort. RuntimeState<E> collapses the
repeated env/fuel/budget/call fields; WorldOps 35 -> 27 methods. The four
eval_index copies (315 body lines) become one 70-line evaluator with the
IndexPrimitive world hook (dim / deg / nleft+nright / ratfunc diagnostic);
the @-inside-Index pin negatively verified against the corpus. Runtime<S>
renamed CliffordRuntime<S>. Behavior unchanged: 1051 tests, 644 vectors,
all gates clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CMdAJFURZigjwqfuiQ1TWg
…quation-system display Spec 9.3: maximal adjacent Element-=: runs are simultaneous equation systems (one shared graph, roots reserved before edge resolution; guardedness over the whole name-set; E_Unfounded names equation + name; :=/expression/Function-=: ends a run). Spec 10.8 rebuilt: anchors collected on every display path, SCC condensation emitted dependency- first with nontrivial SCCs as adjacent =: runs, collision-safe alpha-name allocation with provenance validated against the live environment. Kills all three display-law defects (SCC serialization, named-root anchor bypass incl. the silent-wrong-value variant, g1 collision) — before/after pinned in 26 staging vectors; 42-family seeded display law (display -> fresh session -> structural equality). 0.3.5 blessed display vectors byte-identical. Gates: 1052 tests, 670 vectors, all clean. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CMdAJFURZigjwqfuiQ1TWg
Two literal formulations conflicted with frozen 0.3.5 vectors (sol's stage-D finds): anchor grain is the cyclic component, not every node (a one-name cycle stays one nested equation); provenance names are reused unless the live environment binds them to a different graph (a local name out of scope keeps its q). Display is now same-program up to alpha- renaming, not byte-stable across histories — meaning-stability is the law. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CMdAJFURZigjwqfuiQ1TWg
…ness, honest error kinds, hint discipline Non-strict positions now sort-check what they skip: ones ⧺ true/#2/(x↦x) are E_BoolSort/E_IndexSort/E_FnSort while ones ⧺ (ones+0) and (1/0) stay ones (checked, never evaluated). Guardedness uses the language's own reduction: symbolic heads pass through ⧺'s left-spine walk (g =: [g] ⧺ [] binds as {g | 0}), closed conditional/and/or conditions discard dead branches ({true ? 0 : dead |} degenerates to 1), bare roots stay E_Unfounded. b =: not b and Index self-mention get E_FixpointSort; the 1024-frame host guard fires E_StackDepth, not E_Fuel. Fifteen error constructors across eight families move their teaching into the hint field (asserted absent from messages); the stale "0.3.0 envelope" canon string dies. conformance.txt header now cites spec.md §16 and the real blessing policy. Gates: 1054 tests, 703 vectors, all clean. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CMdAJFURZigjwqfuiQ1TWg
…whitespace exponents, continuation if a then b else c replaces the ? : ternary — the Bool tier is all words, glyphs stay mathematics; else mandatory (dangling-else dissolves), else-if chains flat, branches lazy-but-checked (stage E's law carries over, incl. guardedness reduction); ?/: at expression tier earn the migration hint. The 23 blessed ternary vectors migrated mechanically (29/29 lines, operator-reviewed; provenance corpora untouched). Binder mark triad: #i Index, ?p Bool, bare Element by law; mark-vs-occurrence conflicts error at definition, duplicates E_Shadow, frame mismatch teaches the declaration, display is minimal-mark (gold's #a elides, ?p persists). Signed exponents confirmed whitespace-agnostic and pinned; lines continue after any trailing token that cannot end a statement (mutual systems enter multi-line via trailing ;). Gates: 1056 tests, 730 vectors, all clean. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CMdAJFURZigjwqfuiQ1TWg
…d respelling, Display v4, birthday, integral
The container is total — fixed/graded/free: poly worlds read [1,2,3] as
the coefficient spine (3*t^2+2*t+1), ratfunc injects it, coef extends to
poly, nonconstant entries E_Domain. Literal-shaped ratios are fraction
literals: in the game world Conway's canonical dyadic ({0 | 1} displays
1/2; recognition structural — {0,-1 | 1} stays braces until canon; 1/3
E_Domain "not born on any finite day"; dynamic division stays fenced).
World names are the mathematics (fp2[t]/fp2(t)/integer[t], old names
aliased; banners/errors/menu respelled) and scalar worlds take dim-0
shorthand. Display v4: Poly joins the monomial family (descending, unit
elision, sign-aware join) through the engine, demo.py verified. birthday
(presented stratum, teaching pair #3/#1, E_Loopy). integral: Oz and
F_p[t] membership on field legs, ring legs true, no fake defaults
elsewhere. Expr::Ternary renamed Expr::If. Nineteen blessed-vector
migrations in five itemized operator-authorized classes; provenance
corpora untouched. Gates: 1057 tests, 785 vectors, maturin+demo.py clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CMdAJFURZigjwqfuiQ1TWg
OGHAM_VERSION 0.3.6. The 240-vector staging corpus merges into conformance.txt (785 total; conformance_v0.3.6.txt retained as provenance beside its siblings; the staging test fn dissolves into the main corpus run). ogham.md becomes a pointer stub — spec.md/implementation.md/README are the living documents; every source and pillar-doc reference repointed (Display v2/v3 stamps swept to v4 + spec.md §12). AGENTS.md: ogham row at 0.3.6, the docs/ogham map rewritten for the split, the poly explicit- coefficient scope note reversed to the v4 law. DONE.md gains the ogham-0.3.6 entry (sweep verdicts, decisions, build record); CONTINUATIONS flips 0.3.6 to shipped — the ladder (0.3.7 structural, 0.3.8 envelope + dress, 0.4.0 release, 1.0.0 higher-order) is the standing roadmap. Gates: 1056 tests, 785 vectors, fmt/clippy/cold-doc/python-check clean. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CMdAJFURZigjwqfuiQ1TWg
…oc trues
Sol's end-of-build full-diff review caught the one assembled-work defect:
the Element-=: reduction path applied non-strict reduction without sort-
checking what it skipped (if-branch selection, cyclic-append early return,
and/or short-circuit, nested Bool if). All four sites now static_sort-
check before skipping — dead =: if true then {dead |} else true is
E_BoolSort while kept =: {if true then 0 else kept |} still binds; pinned
test-first (+11 corpus vectors, +1 test). Doc trues from the same review:
the two surviving spec-section stragglers repointed, display_v2 test name
retired, both stage-count sentences harmonized (eight stages, A-G sol, H
lead), DONE counts corrected to the final 1057 tests / 796 vectors.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CMdAJFURZigjwqfuiQ1TWg
a9's call, 2026-07-15: person-name in the Haskell tradition (P. M. Grundy), for the value the language keeps as user code rather than a primitive. crates.io ogham is squatted by an unrelated live crate; grundy is free as of today. Finalization (name + crate slot) is a 0.3.8 release-dress item — see the CONTINUATIONS ladder. Mechanical case-mapped rename of the living surface: src/ogham/ → src/grundy/, docs/ogham/ → docs/grundy/, Ogham* identifiers → Grundy*, OGHAM_VERSION → GRUNDY_VERSION, py surface ogham_eval → grundy_eval, tests/examples/corpus headers, ledgers. History keeps the shipped name: DONE entry keys, gaslamp thread names, and the merged provenance corpora (conformance_v*.txt) are not rewritten. .og stays (after ogdoad, the crate that ships it). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015GmE8cVQe4twoby9SMJC6H
- grundy/ is a workspace member (publish = false, name provisional till 0.3.8): src/grundy -> grundy/src, REPL example -> grundy/examples/repl.rs, law/conformance tests -> grundy/tests, docs/grundy -> grundy/docs - the ogdoad crate and wheel ship with no grundy surface (grundy_eval removed from the bindings; ogdoad.pyi regenerated; demo section dropped) - Metric::has_upper and Game::ptr_eq/ptr_id promoted to public API with honest docs (grundy now consumes them across the crate boundary) - version -> 1.0.0; pyproject version is dynamic from Cargo.toml (the one source of truth, matching the release guard); README relative link made absolute for PyPI; the .crate now also excludes docs/ and grundy/ - CI gates go --workspace (python feature scoped -p ogdoad); release publish scoped -p ogdoad Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JHoeLQKP9gDgaKRe8EtUP9
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.