You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
workbench-opacity — a translucent monomer (a window pane over a cassette)
New: opacity on any lathe / extrude / sweep / loft / drape / relief monomer (0 < opacity < 1)
stamps a face-level alpha, which the orbitable World and the glTF leg already render per group
(the cellular-view jelly path). A thin opacity: 0.25 extrude over a pocket reads as a window with
whatever sits behind it visible — the Walkman's cassette door. Absent or 1 → faces untouched,
byte-identical; the glass material row's opacity is still not read, so every minted glass part
stays exactly as opaque as it was. Card: solid-vocab/workbench.md (Groups, a hinge, and a bare studio).
The SVG still and CSS-3D shots draw the pane opaque (advisory, unchanged).
relief-unmirror — raised outlines read the right way round
Fixed: every reliefs monomer rendered mirrored.reliefToFaces negated the in-plane
right axis on the belief that the raise flipped handedness; it does not (both contour sources
arrive y-up — text from the font, SVG paths through flipY), so a wordmark embossed on a
workbench part read backwards from the side it faces. The frame is now the plain right-handed (up × normal, up, normal). Emission changes for every already-minted relief, which is the
point: they were all backwards. relief-faces.test.js pins an L's stem on the left for text,
for a path, and under an explicit normal / up frame.
bound-mesh-decollide — a GI-baked object keeps its DCC planes in the World
Fixed: the World's de-collide pass skipped for bound meshes.emitThreeWorld lifts a
face stacked on coincident neighbours a hair along its normal, scaled by the face's size and
by how many it overlaps. A DCC re-triangulates every cap as a fan of large overlapping
triangles, so a meshRef bind-back (a Blender GI bake placed in a world) had its lid cap
floated millimetres through the proud plate in front of it. Faces in a mesh:<name> render
group now bypass the pass (decollideExceptBound); they arrive already resolved. Worlds
without a bound mesh take the unchanged path, byte-identical.
update-sketch-patch — iterate a stored recipe by naming the part
Added: update_sketch { patch } — an ordered list of set / remove / add ops addressed
by monomer id or JSON Pointer path, applied to the stored manifest and then run through the
same mint gates a full replacement pays. The stored row is still the whole resolved manifest;
the archived revision carries the ops as its diff. Exclusive with manifest.
Added: update_sketch { readout } — changed (the default for a patch) returns only the
parts a patch touched or moved (a touched cut operand surfaces its cut's part), removed parts, parts_total, plus new warnings (warnings already present on the previous revision collapse to
one counted line); summary drops parts[]; full is the previous block unchanged, and stays
the default for a manifest replacement. The previous readout comes from an in-process cache of
the last edit's stats when this process made it, else one extra plan.
Added: id on each stats.parts[] row of a workbench readout when the monomer carries one.
Additive; the render is untouched.
Changed: the tools/list payload pin in tool-descriptions.test.js re-pinned for the two new update_sketch input-schema properties (why: a legitimate addition crossed the pin; the
description itself stays under its ceiling).
pixelizer-godot — the 2D reducer games get a Godot leg, and the 3D leg learns to measure
Added: export_game { target: 'godot' } on a pixelizer game (and scripts/export-godot.mjs --ref <ref>) emits a Godot 4 arcade pack instead of refusing. The pack is DATA — game.json, skin.json (the bank tiles, legend and palette), probe/replay.json, the groove and SFX WAVs when music is on — performed by a separate versioned kernel (godot-arcade-kernel/, 0.1.0): brickster.gd is a hand-authored port of the JS reducer (mulberry32 7-bag, SRS kicks, guideline
hold, the same scoring), arcade.gd the shell (the web shell's key map, gravity timer, start
gate, HUD, game-over card, music loop, SFX cues). One reducer, two instruments; the web build
stays the reference. philosophers-stone is not ported yet and refuses with a teaching error.
Added: the replay probe, a machine-gate rung. The pack carries a seeded action script and
the JS reducer's expected outcome; the gate runs godot --headless … -- --mojulo-replay and
compares board, score, lines, hold, queue and game-over flag field by field. A port that drifts
from the reducer fails the gate, not the eyes.
Added: [mojulo-perf] on both headless probes. Process and physics time plus node and object
counts at the probe's last frame, stamped advisory under the gate result; the arcade probe adds replay_ms, the reducer port's wall time for the whole script. Headless has no renderer, so no
render time is claimed. --mojulo-shot=<png> on a windowed arcade run saves the drawn viewport
after the replay, so the eyes gate has a picture without opening the editor.
Changed: 3D kernel 0.2.2. The HUD label is assigned only when its text changes; hazard and
meshless-entity markers share one material and one unit mesh per kind instead of allocating
their own. No visible change; fewer draw states, nothing allocated per frame.
prepack-heap — the publish build gets an 8 GB heap
Fixed: npm publish aborted with JavaScript heap out of memory. The webpack production
build now needs more than V8's default ~4 GB old space; prepack sets NODE_OPTIONS=--max-old-space-size=8192 for the next build --webpack step. Dev and the
standalone runtime are untouched.