a8455a07

By: Elijah Cavan <eli_cavan@live.ca>

oneloop: wire crate into CI, guard idenso projector expansion

Post-merge fixes to unblock review of PR #86.

CI / build:
- gammaloop-api: add the missing `reduce: None` field to the `Save::Dot`
  test initializer; `cargo check -p gammaloop-api --all-targets` was failing
  with E0063, which broke the clippy and test jobs.
- Add `oneloop` to the nextest package lists in `justfile` (both the local
  `test_gammaloop` and the CI `_test-ci` arrays) so its 40 tests actually run.
- Add an `oneloop` nextest group to `flake.nix` and mirror it into
  `nix-ci.nix`, satisfying the split-package coverage assert.
- Regenerate `nix/ci-workspace-graph.json` and the copy inlined in
  `nix-ci.nix` to include the crate. Generated by reproducing the
  `guppyWorkspaceGraphJson` pipeline from `flake.nix`; verified by
  regenerating the pre-oneloop graph byte-identically first. Needs a
  confirming `nix build .#ci-workspace-graph-json` on a machine with Nix.
- `cargo fmt --all` (21 hunks across the benchmark examples and bridge.rs).

idenso chirality projectors:
- Guard the projector expansion on four-dimensional bispinor endpoints,
  mirroring every other dimension-sensitive rule in the file. Every
  downstream gamma5 rule is 4D-only, so expanding on `bis(d, ...)` stranded
  an irreducible gamma5 and left the expression worse than the inert
  `projp` it replaced. In d dimensions output is now unchanged from main.
- Move the expansion from a `[Replacement; 2]` applied at simplify entry
  into guarded rules on the chain and trace nodes. This also makes
  `simplify_gamma` idempotent on projector-bearing input.
- Fix a capacity underflow in `chain_factors` that panicked on a lone
  projector — `chain(bis(4,a), bis(4,b), projp(in,out))`, i.e. the Yukawa
  vertex, the most common chiral structure in the SM.
- Gate the equal-endpoint `chain(i,i) -> trace` rule on `evaluate_traces`
  so `without_trace_evaluation()` keeps its historical output shape.
- Add `test/chirality_projector.rs`: 15 regression tests covering the 4D
  guard, the d-dimensional inert path, idempotency, the trace gate, the
  lone-projector case, and projector-position epsilon sign.
- Correct the sign-label prose on the existing trace test; the assertion
  was right, the comment described the wrong operator ordering.

reduce_bridge:
- Repair `SpensoPrintSettings::typst().typst_symbolica()`, which the merge
  broke; spenso renamed it to `typst_options()`.
- Drop the redundant `collect_gamma_chains()` — `simplify_gamma` already
  collects, and calling it first could strand an `Add` inside a cyclic
  factor slot.

docs:
- Update 08-projector-traces.md to describe the guarded implementation and
  state the 4D behaviour change plainly; the "every existing gamma/trace
  path is byte-identical" claim was only true in d dimensions.
- Fix the stale printer reference in 05-app.md.

Verified: cargo check --all-targets clean for oneloop, idenso, gammalooprs
and gammaloop-api; `cargo test -p oneloop` 40 passed / 1 ignored;
`cargo fmt --all -- --check` clean. Pre-existing and unrelated: a
`pyo3-stub-gen` build failure from the local Python toolchain, identical on
main.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Lgs5exR1ZjgEDpd9w3xVqs
GitHub
Time to Start Worker time Duration Time to finish Idle
Config 41s 9s 9s 50s 41s
Eval 51s 1m00s 1m00s 1m52s 0s
Build 1m49s 7h17m26s - - 3m23s
Test 1h03m38s 17m52s - - 0s
Deploy - - - - 0s
Suite 41s 7h36m28s - - 4m05s

Timeline

Config Eval Build Test Failed Retried Compressed gap
0s1m4m5m6m7m8m9m10m11m12m13m14m15m16m17m18m19m20m21m22m23m24m25m26m27m28m29m30m31m32m33m34m35m36m37m38m39m40m41m42m43m44m45m46m47m48m49m50m51m52m53m54m55m56m57m58m59m1h0m1h1m1h2m1h3m1h4m1h5m1h6m1h7m1h8m1h9m1h10m1h11m1h12m1h13m1h14m1h15m1h16m1h17m1h18m1h19m1h20m1h21m1h22m1h23m1h24m1h25m1h26m1h27m1h28m1h29m1h30m1h31m1h32m1h33m1h34m1h35m1h36m1h37m1h38m1h39m1h40m1h41m1h42m1h43m1h44m1h45m1h46m1h47m1h48m1h49m1h50m1h51m1h52m1h53m