Skip to content

Dev#1

Merged
a9lim merged 138 commits into
mainfrom
dev
Jul 16, 2026
Merged

Dev#1
a9lim merged 138 commits into
mainfrom
dev

Conversation

@a9lim

@a9lim a9lim commented Jul 16, 2026

Copy link
Copy Markdown
Owner

No description provided.

a9lim and others added 30 commits June 9, 2026 23:16
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>
a9lim and others added 29 commits July 9, 2026 13:48
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
@a9lim
a9lim merged commit 8145f27 into main Jul 16, 2026
10 of 12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant