Honest accounting: prior 8 waves (63-70) shipped duplications.
Reading every Cargo.toml against the additions revealed multiple
near-duplicates of existing crates. This commit consolidates the
recent waves AND ships the two GENUINELY missing primitives the
field has been naming.
R1 — Consolidation
R1.1 jouleclaw-otel-genai (wave-60) vs existing jouleclaw-otel:
Scope-clarification README. Existing crate is the projection
layer (Receipt → SpanData with gen_ai.* string keys); wave-60
is the typed-attribute namespace (GenAiOperation,
GenAiSpanAttrs). Both coexist; jouleclaw-openinference (wave-61)
is the consumer of the typed shapes.
R1.2 jouleclaw-sandbox-tier (wave-56) vs jouleclaw-sandbox-protocol:
Trait-name collision resolved. Renamed wave-56 trait
SandboxRuntime → TierIsolation. Different layers (subprocess
lifecycle vs in-process closure isolation); name now reflects
that. README delineates when to use which.
R1.3 jouleclaw-oracle-lean (wave-55) vs jouleclaw-formalize:
Complementary, not duplicate. README documents the chain:
faithfulness check (formalize) → compile (oracle-lean) →
Verdict. AlphaProof / AlphaGeometry doctrine: compiler exit
rules out hallucinations only if formalization is faithful.
R1.4 jouleclaw-determinism-check (wave-70) wired to consume
jouleclaw-pin::InferencePin. ProbeBackend::pin() default = None
for legacy backends; full DeterminismReport now carries the
signed pin as the receipt-grade truth alongside the coarse
DeterminismMode label. New check_pin_well_formed verifies
batch_invariant ⇒ batch_size pinned. 12 tests pass (was 12).
G3 — MDL + AIC scorers (no new crate)
jouleclaw-revise::information_criteria new sub-module. MDL +
AIC information criteria as jouleclaw_bounded::Scored impls
over a typed ModelCandidate (description_bits, residual_bits,
num_parameters, log_likelihood). Sign convention:
score.value = -criterion so the revise loop's higher-is-better
threshold logic accepts iff the criterion improves. Required by
the Buehler 2026 categorical framework's MDL/AIC gates.
8 new tests; 18 total pass on jouleclaw-revise.
G1 — Categorical typed shapes (new crate jouleclaw-category)
Implements the substrate of Wang & Buehler 2026 (arxiv
2606.01444): self-revising discovery systems. The schema-
mutation case the existing event-log + graph (fixed-schema
endofunctors) didn't have.
- Schema (objects + morphisms; the category S_b)
- Copresheaf<T> (typed I_t: S → Set; system state)
- Element<T> + category_of_elements (∫_S I_t provenance walk)
- Endofunctor trait + apply_endofunctor (same-schema update)
- SchemaMigration (u: S → S' object map)
- left_kan_extension(state, migration) → LeftKanResult:
transported copresheaf over the new schema + residual
artifacts whose source object had no image. The 'novel
content beyond functorial transport' Buehler names.
15 tests pass.
G2 — Prime Intellect Verifiers env exporter (new crate
jouleclaw-verifiers-export)
Closes Lewis Tunstall's explicit 2026 gap ('no Rust-native
receipt-sealed RL envs'). Adapter that emits a typed
VerifiersEnvManifest a Python harness can publish via
'prime env push'.
Mapping:
- jouleclaw-oracle Verdict → Rubric reward function
- jouleclaw-event-log EventLog → trajectory state
- jouleclaw-sandbox-protocol SandboxRuntime → harness execution
- jouleclaw-jcr1 Receipt → signed eval transcript
VerifiersEnvManifest + RewardFunctionSpec + HarnessSpec
(Subprocess / Ffi / Wasm bridges) + TasksetSpec (HfDataset /
LocalJsonl / Procedural) + from_substrate convenience builder +
canonical JSON + BLAKE3 seal.
12 tests pass.
CRATES NOT SHIPPED (correcting prior plan):
- jouleclaw-mdl-gate (planned wave-71) — became
jouleclaw-revise::information_criteria sub-module.
- jouleclaw-builder-breaker (planned wave-72) — duplicates
jouleclaw-critic; not built.
Workspace check clean; cargo check --workspace --all-targets
passes. 47 new tests across G1+G2+G3+R1.4 wiring.
Co-Authored-By: Claude Opus 4.7 <[email protected]>