luv

Workshop wiki

work

Work

The work marks of the wiki: figures whose title starts with a status word. They live beside the design they move; this is only a view.

NEXT the current best small bets

Bridge styled Ghostty render-state rows into the block wallworld-terminalIntent: replace the formatter fixture bridge in #7ZM22R with world-native render-state rows, while keeping process and input concerns out of the first crossing. The unified surface-wide fit and native-body/Slug-overlay split remain projections of the…
Parameterized M-x prompts through presentation typesagent-in-the-worldIntent. Finish what #0IF4TY promised: the command menu should offer commands with arguments, prompting through accept with the presentation types the agent already uses, so place-block-at is one definition reachable by key, M-x, and tool. Evidence. The tool…
Give dynamic columnar populations explicit compactiondomains-and-bundlesThe block-particle population is the next honest client. Its block reference, position, velocity, size, age, and lifetime naturally form quantity-aware SoA lanes, but its update removes arbitrary expired rows while preserving survivor order, and overflow…
Compare Slug coverage at glyph edgesslug-bezierIntent: distinguish “a shaped run renders” from evidence that Slug's edge coverage and geometry expansion are correct across backends. Evidence needed: exercise the portable draw on Vulkan, compare boundary pixels with a small CPU winding oracle, and test…
Grow the workbench and the game as one command vocabularyluftIntent. Add atelier tools, authored-world interaction, and eventually game features as panes, presentations, commands, and command-table layers of this one frame. A feature crosses from luvcraft when LUFT owns its semantic command and state transition; the…
Implement the site-stream LUFT renderer backboneluft-sitesIntent. Rebuild LUFT's surface rendering on the decomposition of #8UGGY0: integer lattice cells (a=8, m=1 to start), three instance streams with fixed templates, CPU-side star classification into per-site records, and turn-don't-die junctions per #GT4Y9J.…

TODO visible and likely, not yet selected

Let the animals be part of the saved worldblock-worldIntent. A checkpoint currently saves the world description and the player (#TR2JNQ) and says nothing about who lives in it, so every session grows a fresh population around the player and yesterday's turtle is not the one you meet today. An animal with an…
Reuse Metal frame submission resourcesframe-performanceIntent: stop constructing and releasing one MTL4CommandAllocator and one MTL4CommandBuffer for every frame when a bounded frame-slot owner can reuse them safely. Evidence: the current trace exposes :metal/allocate-frame-resources as a separate region, and…
Separate drawable pacing from encoding distributionsframe-performanceIntent: report how much host frame time is runnable encoding work and how much is waiting for presentation availability, instead of treating both as one “encoding” number. Evidence: native sampling after #WEE1DX found the frame thread mostly sleeping inside…
Structural shader-type identityquantities-and-measurementIntent: make shader-type identity structural — hash-consed composite types mirroring SPIR-V's own type grammar, keywords as parse abbreviations — per #P2KN1D. The CPU-lowering half this mark originally bundled is done: #FTQEQD compiles checked definitions to…
Measure light-to-mesh latencysky-and-lightIntent: find out whether owner-thread relighting plus one mesh capture per frame feels immediate enough during edit bursts and residency churn. Evidence to gather: – SLY-visible counters or capture logs report relight cells popped, chunks touched, light…
Verify resized presentation in a live capturesky-and-lightIntent: the scene colour, depth, presentation, and lens-chain attachments are all created once from the canvas extent at session start. A resized window therefore presents a stale-sized image. The bug predates the lens chain, but the chain multiplies the…
Make films block entities so the material vocabulary closesvocabulariesIntent. Give films the representation terminal walls already have: one static :film material, with per-film state in sparse coordinate-keyed entities outside dense site storage. The material vocabulary then closes, which admits a global material domain, a…
Derive the regular vertex-star table and choose singular topologyluft-sitesIntent. Build the vertex-star table that #8UGGY0's fan stream reads: for each regular star, derive the incident bands, their offset-line intersections, the turn count k, and the tile fan entirely in integer arithmetic. Separately choose whether singular…
Make the Vulkan disocclusion test depth-awaretemporal-antialiasingIntent. Sample the retained current depth in Luft's shader resolve, choose the frontmost velocity from a small neighbourhood at silhouettes, and reject history whose reprojected depth no longer describes the visible surface. This is velocity dilation and…
Pairs, loop tables, and layouts from arglists alonewiki-siteIntent. Smaller layout wins in the order they pay: keyword pairs on rows aligned by a subgrid instead of a guessed min-width for the key; loop as a keyword table, each clause a row of keyword and rest as Emacs indents it; and function calls whose arguments…
A wiki browser frame in mcluvwiki-siteIntent: a McCLIM application frame over the loaded luv-wiki-site documents, with figure and mention presentations, page navigation, and backlinks; the exercise that tells us what the model in #AGTIO4 is missing. Evidence: none yet; the shader lab in…

WAIT blocked on outside evidence or another step

A WIKI package of figure symbolswiki-siteIntent: the second rung of #F6B3NI: intern figure IDs as external symbols of a WIKI package at load-op, attach the heading, and offer wiki:ref for xref-visible references from code. Evidence: waits on #NPZWLR, which should show what accepting or invoking…

IDEA tempting, not allowed to steer implementation yet

Authored edits form sparse swaths, not another terrain fieldagent-in-the-worldIntent. Add a Survey Edits observation over the little world's sparse authored overlay. Nearby edited sites should be clustered into semi-contiguous swaths and each swath presented by its integer bounding box, edited-site count, box fill ratio, and final…
Terrain summits are born at peaks and merge at saddlesagent-in-the-worldIntent. Add a Survey Terrain observation derived from a resident height-field window. Besides elevation range, relief, and slope summaries, report the strongest summits by a discrete merge tree: descend through height levels, birth a component at each local…
Exposure as a logarithmic level in the sky modelfield-notes-mp-unitsIntent: when the HDR path (#WLHDRB, #VG8TGG) introduces exposure and adaptation, model exposure value as a base-2 log-domain point over luminance (photographic stops) and exposure compensation as a gain, as a small first client of the level/gain vocabulary…
March the shadow map for shafts and compare against the screen sweepmoppe-legacyIntent: #VG8TGG shipped the cheap radial sweep because terrain which occludes the sun is already dark in the bright image. #BAP0QU's marched version is strictly better informed: it knows about occluders which are off screen or behind the camera, and it…
Lower checked domains to native SIMD kernelsquantities-and-measurementIntent: eventually let a field or simulation phase select a scalar or SB-SIMD realization of the same semantic operation once per dense kernel. Evidence: #B5L7VG and the native SIMD study describe the representation seam, and #LDP5UR now supplies generated…
A save is a vocabulary table and its columnsvocabulariesIntent. Reshape the save format as a vocabulary table plus columnar world data, per #FTDOCV, and make loading a vocabulary resolution that produces an index remap. Aliases, unknown materials, and reordering all become rows in that remap. Evidence. The format…
Compact surviving faces only when measurement earns another pathluftIntent. If vertex invocations over absent or back-facing sites become a measured bottleneck, compact visible face indices before drawing. Compute compaction plus an indirect draw and a future mesh/subgroup path are competing experiments; this mark does not…
Draw the torus, not only its fundamental domainluftIntent. A camera outside the fundamental domain sees a cut world: faces at x=0 that a solid neighbour at x=period-1 cancels are honestly absent. The vertex stage could translate each site's anchor by the domain period toward the camera, or the host could draw…
Give historical captures an annex retention policywiki-siteIntent. Decide which historical annex keys remain reachable when recipes or figures change, without turning the ordinary source clone into a media archive. Evidence. The initial publication keeps current keys in Chapel and SWA and keeps their metadata on the…
Structural associations through the MOPwiki-siteBeyond textual mentions, a metaclass mixin or class option could make the association between a class or generic function and its wiki figures structural: (defclass ... (:metaclass documented-class) (:figures LNRY72)) or a wiki:figures slot on a metaobject,…
Source-anchored file linkswiki-siteOrg file: links with a ::(defun name search string presently point at the file on GitHub without the search. A later render step could resolve the search to a line number at build time, since the source is in the same tree.

DONE closed, with the evidence that closed them

Give rendering resources one transactional ownertechnical-debtluvcraft-renderer now solely owns named pipelines, layouts, resources, frame state, atlas state, and one atomically published frame-attachment cohort. Startup, resize, atlas replacement, live-session migration, and teardown all use that owner. A failed…
Make command phases an open protocoltechnical-debtThe four command-family type tables are gone. Internal generic functions own rebase, preparation, clipping, and encoding while the command structures and dense arrays stay compact. Direct luvcraft replay builds one dynamic-extent context, so cached frame…
Give the shared shader graph its own hometechnical-debtThe neutral type graph, parser, quantity checks, source revisions, live definition tracking, and lowering generics now live in luv/shader and the LUV.SHADER package. SPIR-V's literal model and lowering context live in the sibling luv/spir-v system; luv/msl…
Make the portable HAL boundary tell the whole truthtechnical-debtPortable create and adopt-native-texture methods now copy and canonicalize buffer/texture descriptors before backend dispatch. Size, dimension, and usage syntax has one error vocabulary; every texture extent is (w h 1); Metal and Vulkan retain only…
Keep one production light solvertechnical-debtProduction from-scratch and incremental dispatch now accept only :compiled; unknown and retired names signal. The handwritten frontier solver and legacy incremental reconciler are gone. A simple from-scratch oracle and the renamed candidate comparator…
Expose the shader, frontier, and reference islands already earnedtechnical-debtluv/shader, luv/spir-v, and luv/msl are now independent sibling systems, and luvcraft/light-reference keeps the oracle out of production loading. luvcraft/frontier now owns the frontier package and compiler over only luv/arithmetic and luvcraft/world; a cold…
Delete the queue without deleting historytechnical-debtThe gnome aliases, literal crosshair module, shader revision alias, palette constructor/install compatibility, and compatibility meshing entry points are gone; their tests now exercise production specifications, chunks, snapshots, and vocabulary-backed…
Persist and resume the authored little worldblock-worldIntent. Let building survive quitting and restarting without treating resident chunks as canonical world storage or blocking a frame on file I/O. Evidence. luvcraft/persistence.lisp implements the versioned description protocol, validation, atomic…
Author the pre-noon ridgeshowcase-gazetteerIntent. Turn #NLCFX0 into the first new subject after the construction proposal: one composed terrain still and one motion proof from the same hidden session, with the seed, camera, sky profile, clock, grade, and layer choices in source. Evidence. The current…
Open the phone-first galleryshowcase-gazetteerIntent. Grow the first folio into something that can be browsed for pleasure: dozens of distinct stills and films, with clean portrait compositions taking the lead on phones and a smaller set of landscape play views retaining the crosshair, hotbar, and…
Put action, inhabitants, and authored surfaces in the galleryshowcase-gazetteerIntent. Make the enlarged folio show things one can do as well as places one can admire: mine a wall, build a brick arch, converse through the focused-FOV inhabitant view, inspect the metabar and M-x command table, use a real terminal wall, and watch a…
The derived 2 by 2 block wall exposed the wrong abstractionworld-terminalIntent: test the literal grid correspondence as aggressively as possible. Every derived display block carried a 2 x 2 tile of terminal cells, so an 80 x 24 viewport became a 40 x 12 wall without losing character resolution. The mapping is exact and…
Attach a live PTY independently of the render boundaryworld-terminalIntent: make the world terminal interactive without folding process ownership or callback reentrancy into its renderer. The PTY owner can now advance beside the render-state work rather than waiting behind it: both meet at the owned Ghostty terminal and…
A luv agent surface would inherit these seamsagent-harnessesClosed by An agent in the little world, whose NEXT mark #YDAQNO is the concrete first slice and whose figures cite the ones below as premises. Intent. Not a plan yet: an agent already talks to luv through the world terminal (#NMAD2U) and through ./sly; if luv…
Give embodied agents a truthful third-person glanceagent-in-the-worldThe basic view-surroundings verb now realizes #IFEAQ6: it captures on the canvas boundary under a temporary over-the-shoulder pose, restores the player's camera, retains one semantic observation, and sends its clean PNG beside the compact textual census. …
Give construction tools a visible possible worldagent-in-the-worldIntent. Let an embodied agent propose a voxel change set which remains inert while the player sees the actual candidate materials in the world, flies around them in focus chat, and approves, denies, or steers in ordinary words. Evidence. Propose Block Box…
Wire three commands into an agent and draw their cassettesagent-in-the-worldIntent. The first slice: a luvcraft.agent layer where a command-tool wraps a CLIM command (#0IF4TY), presentation-type-json-schema derives its schema, tool bodies' values are presented under +model-view+ (#WS5OEX), and a cassette-view draws each call while it…
Discrete destinations, continuously embodiedagent-in-the-worldIntent. An embodied agent acts in places rather than holding a WASD key: Move To (x y z) is one discrete, nearby destination and one terminal result. Intent does not flatten physics. The body has a continuous position and velocity, accelerates through the…
Draw McCLIM text as world geometryclim-in-the-worldIntent. Give an embedded surface a way to emit Slug glyph runs in world space instead of rasterizing its text into the mirror texture, so that a panel's type is as sharp as a terminal wall's at every distance. Evidence. #I3G0S7 for why texture size cannot fix…
Replay the complete McCLIM stream at its destinationclim-in-the-worldIntent. Remove the pane-sized backing texture from embedded GPU mirrors and preserve painter order while drawing every supported command family directly into either the world or HUD pass. Evidence. The GPU medium already retained one ordered command stream…
Extract the application workbench beneath both gamesapplication-workbenchIntent. Give general Lisp-application tools one reusable owner, with thin Luvcraft and LUFT adapters, so improving their reliability improves both experiments without making their gameplay models the same. Evidence. The current systems separate luv/mcclim,…
Extract a quantity-aware columnar bufferdomains-and-bundlesIntent: extract the synchronized specialized storage proven by the lighting frontier into a generated columnar-buffer substrate, while making its physical lanes and concrete row quantity declaration inspectable. Keep level scheduling, spatial stepping, and…
Bind fixed columnar materializations to finite domainsdomains-and-bundlesIntent: make the dynamic lighting buffer one storage policy over reusable columnar layout metadata, add a fixed domain-bound policy, and prove the split with the meshing snapshot rather than a synthetic universal bundle. Evidence: columnar-layout-definition…
Percolate domain-bound representations through voxel storagedomains-and-bundlesIntent: make the fixed materialization vocabulary describe the ordinary resident and captured voxel fields too, and transfer palette-backed block content as one representation rather than as an accidental pair of arrays. Evidence: resident chunk-light-field…
Trace one real frame with nested CPU zonesframe-performanceIntent: make a coarse frame explanation one ordinary benchmark away, with an opt-in macro whose disabled path neither constructs events nor changes backend control flow. Evidence: – The trace buffer records a zone name, parent, depth, monotonic…
Convert the outer runtime boundariesframe-performanceIntent: make one ordinary live capture explain the outer event, frame, production, streaming, simulation, and overlay structure before adding the denser subsystem waves in #1G3ORG. Evidence: the communicator instrumentation already localized a roughly 5.4 MB…
Stream one chunk window under measurementframe-performanceIntent: measure the frames where traversal creates real asynchronous chunk load, lighting, mesh, GPU upload, and publication work, rather than infer that cost from the fully resident steady benchmark. Evidence: This begins from the same settled 9 by 9…
Share function application across arithmetic and shader realizationsmathematical-shadersIntent: make one portable arithmetic definition callable both by compiled Lisp and from a shader body, sharing source identity, parameter normalization, arity, lexical bindings, recursion rejection, and application provenance. Evidence needed: move Slug's two…
The reference's shape, with its constants as knobsslug-bezierRead against the 2026 reference shaders and the retrospective, luv's Slug had the algorithm -- eligibility, two rays, weighted combination, sorted bands -- but not the reference's shape around it. This figure closes the gaps and names what the reference…
One fixed contour proves luv's pixel-stage mathematicsslug-bezierIntent: prove that luv's shader DSL can state, lower, compile, and actually draw the numerically important pixel-stage core before designing texture and font-data machinery. Evidence: – slug-quadratic-outline is now a typed shader function over the…
Teach the shared language Slug's structured band foldslug-bezierIntent: add the smallest shared control-flow and indexed-data vocabulary that states one Slug band traversal without burying its concrete data contract in a generic scene abstraction. Evidence needed: after shared function application #YZS04W, add…
Pack arbitrary quadratic contours into Slug bandsslug-bezierIntent: turn arbitrary connected quadratic contours into dense curve and band data suitable for the shared Slug fold. Evidence needed: a Lisp outline model preserving contour boundaries and orientation, line-to-quadratic encoding, conservative band overlap,…
Shape and draw a HarfBuzz text run through Slugslug-bezierIntent: join HarfBuzz shaping to the proven zpb-ttf outline boundary and render a run as placed Slug glyph quads without a software rasterizer. Evidence: #4G7064 records the owned HarfBuzz binding, ffi ligature and cluster regression, glyph-ID-to-outline…
Put a shaped run into the moving worldslug-bezierIntent: cross #4G7064 from an isolated target into the actual luvcraft scene, with world placement, camera projection, scene depth, and alpha composition all participating in the same frame as terrain. make-world-text-run is now a semantic owner around dense…
Cache shaping and device glyph outlinesslug-bezierIntent: make text runs cheap to reconstruct without hiding GPU lifetime inside glyph occurrences. make-world-text-glyph-cache is owned by the luvcraft session and tied to one device. It retains HarfBuzz results by canonical font path and exact string, and…
Pack one atlas and issue one instanced text drawslug-bezierIntent: remove the command and allocation multiplication caused by treating each glyph occurrence as an independently bound texture pair. create-world-text-glyph-atlas concatenates each distinct serialized outline into one RG16U band texture and one RGBA16F…
Select spatial bands and scale coverage from fragment derivativesslug-bezierThe shared shader language now carries derivative-x and derivative-y through direct Metal dfdx/dfdy and SPIR-V OpDPdx/OpDPdy. The fragment shader forms a screen gradient for each em axis and takes its reciprocal length as pixels-per-em. The same fragment…
One distance function draws the roundrect family analyticallyslug-bezierIntent: reuse the proof discipline learned from Slug without pretending that a fixed GUI primitive is an arbitrary outline. The distinction is now executable. Slug's first proof #OWR8OZ puts reusable pixel mathematics in a typed function, exposes it through…
Present a Metal clear through the existing SDL canvasmetal-backendIntent: prove #SODRMA by adding a metal-canvas-context relationship while leaving SDL window, input, clock, and main-thread ownership intact. Evidence: – The Metal GPU vocabulary implements provider, device, queue, texture, and frame-encoder objects; the…
Lower one mathematical shader directly to MSLmetal-backendIntent: compile the existing block fragment shader-specification through a sibling target context, without translating its spir-v-module and without inventing a new shared IR. Evidence: – The graph already carries types, source forms, resources,…
Join the proofs in one live Metal pipelinemetal-backendIntent: preserve luvcraft's transactional shader-definition loop while the same live mathematical shader methods feed a native Metal render pipeline. Evidence: #58IDSR now supplies a device-owned MSL library and #5A7QDE already owns presentation. The live…
Retire replaced Metal resources without a frontier waitmetal-backendIntent: preserve logical frame-boundary publication while removing the conservative queue stall from Metal resource destruction. Evidence: every currently supported Metal encode relationship captures its buffers, textures, views, samplers, bind groups, and…
Transplant the post stack onto the HDR pathmoppe-legacyIntent: when #WLHDRB lands the linear-HDR scene target, extend it past tone map and restrained bloom toward Moppe's observed order: exposure, ACES, and a small live grade. Treat sun shafts (#BAP0QU) as the first post effect after bloom because both inputs…
Send one declared Objective-C messageobjective-c-and-metalIntent: establish the smallest inspectable Objective-C substrate without trying to bind an entire framework. Evidence: – The runtime defines receivers, declaration metadata, direct sends, opt-in trace snapshots, conditions, and define-objective-c-message. –…
Turn Objective-C exceptions into Lisp conditionsobjective-c-and-metalIntent: provide an explicit safe condition boundary so a diagnostic can catch an NSException without unwinding through CFFI or SBCL frames. Evidence: – The native bridge catches around NSInvocation, validates declared argument/result sizes, and copies…
Make Objective-C exception catching dynamically selectableobjective-c-and-metalIntent: keep exception translation available without imposing NSInvocation on every established framework call. Evidence: – *objective-c-exception-policy* has the closed values :catch and :unchecked; direct sends are the default and the two public macros…
Resolve the Objective-C dispatch entry onceobjective-c-and-metalIntent: keep direct objc_msgSend direct by removing dynamic symbol lookup from every declared message. Evidence: – SBCL call profiling counted 160,400 calls to objective-c-message-send-pointer, CFFI's symbol lookup, and SBCL's dynamic foreign-symbol resolver…
The smallest solver was built: spheres, coloured contacts, four-wide lanesphysics-and-simdIntent. Build the slice #G7Q3XR proposed, no wider: spheres against the voxel lattice and each other, the Soft Step skeleton, persistent contacts, colouring from the first day, one scalar reference kernel and one four-wide kernel per instruction family, and…
Generalize affine-p to a three-valued characterquantities-and-measurementIntent: replace the boolean affine-p on quantity-specification with a character of :point, :absolute, or :difference, add a :non-negative specifier at the definition level, and implement the V3 operation table (#LNRY72) in the arithmetic core — without…
Declare luvcraft's amounts absolute and non-negativequantities-and-measurementIntent: with the character algebra inert-by-default (#SYUACW), make the block-world vocabulary state its truth: :opacity, :ambient-occlusion, :sky-light-level, :block-light-level, :material-emission, :fog-amount, :day-factor, :linear-rgb,…
Declare quantities on Lisp storagequantities-and-measurementIntent: let CLOS slots and defstruct slots state quantity meaning beside their ordinary Common Lisp :type, using the declaration protocol in #OXBSAY. Use the MOP where a CLOS class definition genuinely carries the metadata, but do not make it the only…
Check storage declarations against Lisp arithmeticquantities-and-measurementIntent: make a declared CLOS or structure field usable as an input or output of one checked arithmetic definition without wrapping each runtime value. The boundary should compare the stored representation and quantity declaration with the arithmetic parameter…
Audit quantity-bearing Lisp storagequantities-and-measurementIntent: inventory luvcraft's classes, structures, arrays, constants, and function boundaries which carry physical or domain quantities, then migrate the semantic owners in coherent groups. The audit must preserve distinctions between continuous quantities,…
Describe the repeated block-mesh vertex productquantities-and-measurementOne block-mesh retains the declaration identity current when its flat single-float vector is constructed. The declaration repeats a fixed product at stride 12: cell-valued world position, texture UV, ambient occlusion, world direction, normalized sky and…
Put contextual light-removal meaning on its queuequantities-and-measurementThe two removal frontiers are now small light-removal-queue structures. Each retains the exact :sky-light or :block-light field definition, dense field reader, sky propagation policy, raw item list, and removed-cell set. Items are admitted only through the…
Check the packed frame product across CPU and shaderquantities-and-measurementcamera-uniform-data now publishes the quantity layout of its fixed 20-float prefix, and frame-uniform-data publishes the full 72-float product. These remain ordinary specialized arrays: their declarations describe the cell-valued camera point, basis…
Declare the fullscreen and overlay vertex productsquantities-and-measurementThe fullscreen sky triangle is a raw nine-float vector repeating one :clip-coordinate triple. The crosshair repeats six-float products of clip position and absolute linear RGB. Their constructors check representation, stride, vertex count, and semantic…
Keep quantity contracts at owned function boundariesquantities-and-measurementThe source inventory distinguishes a function which owns a numerical law from one which merely orchestrates already-owned values. The former belongs in define-lisp-arithmetic-function and can bind its raw realization to slot, structure, constant, or ABI…
Review the exercised quantity architecturequantities-and-measurementThe review happened after the declaration protocol had real CLOS slots, structures, constants, dense fields, packed CPU/GPU products, one Lisp arithmetic kernel, and all production shader materials as clients. It keeps the central split: Common Lisp and GPU…
Give luvcraft quantities backend-neutral ownershipquantities-and-measurementIntent: let CPU code name world position, view distance, direction, colour, fog, and related luvcraft quantities without loading their definitions as a side effect of the shader system. Evidence: – The open quantity protocols themselves live in…
Move portable operator semantics below shadersquantities-and-measurementIntent: make the semantic contracts of ordinary numerical operations available to every arithmetic client before extracting the expression frontend. Evidence: – + - * / dot min max already derived quantity specifications in arithmetic/semantics.lisp, while…
Extract a compiled arithmetic frontendquantities-and-measurementIntent: make one inspectable definition and expression vocabulary usable by both CPU and shader realizations while retaining the shader workbench's source provenance. Evidence: – The new :luv/arithmetic/language system depends only on :luv/arithmetic. …
Compile checked arithmetic to Lispquantities-and-measurementIntent: execute arithmetic definitions on the CPU over ordinary Lisp numbers and vectors after checking their semantic contracts once. Evidence: – The separate :luv/arithmetic/lisp system depends only on the common arithmetic language. …
Share one production computation between CPU and GPUquantities-and-measurementIntent: make definition sharing answer a real engine question rather than only demonstrate two toy evaluators. Evidence: fog shaping is a small scalar candidate; the :world-to-light map is a richer candidate already used by production shaders and useful to…
Prove semantic arithmetic in the shadow graphquantities-and-measurementIntent: let one real shader calculation test whether dimensions, named quantity spaces, tensor order, and affine points belong in a reusable arithmetic graph. Keep SPIR-V resources and lowering shader-specific; keep semantic arithmetic in a backend-neutral…
Give GPU components first-class quantity meaningquantities-and-measurementIntent: make homogeneous vector quantities and heterogeneous packed GPU tuples different semantic structures. Let a whole vector already carry quantity meaning, let exact swizzles recover explicitly declared component meanings, and make every undeclared…
Make numerical unit conversion explicitquantities-and-measurementIntent: add a visible arithmetic operation for conversions such as kilometres to metres without weakening exact-unit checking or turning interpret into a scale-changing cast. Learn from mp-units' quantity/reference separation while keeping conversion policy…
Constrain units to semantic quantity kindsquantities-and-measurementIntent: add the mp-units distinction between universally scaled units such as one and percent and kind-specific units such as radian, steradian, or bit. Let semantic quantity definitions form a small open hierarchy without weakening the current exact-name…
Carry semantic units through the vertex and camera ABIquantities-and-measurementIntent: extend the production proof from the heavily annotated fragment and sky calculations into the block vertex boundary. World and camera positions should be cell-valued affine vectors; their subtraction should be a cell difference; camera basis vectors…
Introduce the world-to-light sampling mapquantities-and-measurementIntent: replace the most consequential remaining raw arithmetic island with a first-class map whose domain, codomain, affine-point requirement, packed result, and projective coordinate remap are checked independently of its four-row GPU representation.…
Separate homogeneous projection from shadow samplingquantities-and-measurementIntent: let one semantic world-to-light projective map serve both production uses of the four shadow rows. The shadow vertex stage needs the homogeneous clip result directly, while the block vertex stage additionally divides and remaps it into shadow…
Give the remaining crosshair colour ABI meaningquantities-and-measurementIntent: finish the first production-shader audit at the small crosshair pipeline. Its literal vertex module carries an RGB ink tuple into the mathematical fragment method, where that boundary should state linear RGB and the final alpha construction should…
Quantity-carrying shader typesquantities-and-measurementIntent (as first written): extend the shader expression language's inferred types with an optional quantity-specification component, derived by operator methods and named at abstraction and resource boundaries, erased at lowering. Evidence: this design was…
Give the sRGB atlas seam explicit transfer meaningquantities-and-measurementThe original intent correctly found a seam but proposed the wrong type. rgba8-unorm-srgb stores nonlinear RGB bytes; both Metal and Vulkan apply the sRGB transfer when the texture is sampled, so the value entering shader math is already linear. Alpha is…
First CPU voxel-light proofsky-and-lightIntent: make sky/block light a derived chunk field with its own revisions, incremental reconciliation, raw mesh transport, and shader-side response curves. Evidence: – luvcraft/light.lisp owns reference and incremental solvers. – luvcraft/mesher.lisp…
Player-placeable crystalsky-and-lightIntent: turn the test-only glow block into a real material the player can select, place, remove, and inspect in motion. Evidence: – luvcraft/blocks.lisp defines public *crystal-block* with atlas tile 9, propagated light emission 12, and surface emission 1.2.…
Shadow-ready shader math substratesky-and-lightIntent: prepare the core shader language for shadow-map expressions without adding a high-level shadow primitive. The core vocabulary should remain ordinary typed mathematics and resource sampling. Evidence: – Commit 2d22815 adds spv:step through the…
Shader source abstractions for reusable shadow expressionssky-and-lightIntent: add a source-expansion layer above the core shader operator set, then define shadow vocabulary there instead of teaching the compiler a special shadow primitive. Evidence: – define-shader-abstraction adds an open EQL-method source vocabulary…
Shadow-map producer pass and light projection resourcessky-and-lightIntent: make the renderer capable of producing a shadow depth map as a separate GPU product owned by the luvcraft session, with light-space projection data carried through the ordinary frame uniform. Evidence: – The Vulkan backend accepts a depth-only render…
Sample the shadow map in the block materialsky-and-lightIntent: consume the shadow depth map from the block material using the shadow-visibility abstraction, so moving sun light gets real direct shadows while voxel skylight remains the ambient term. Evidence: – The Vulkan bind-group path now accepts multiple…
First isolated visual evidence standard for shadow changessky-and-lightIntent: keep shadow work from passing on screenshots that are merely plausible or too dark to inspect. This was the first gate; #CH2CD0 records why it was necessary but insufficient for representative-play acceptance. Evidence: – A shadow-map change needs at…
Shadow credibility in representative playsky-and-lightIntent: replace the weak inference "the isolated yard contains a cast shadow, therefore shadows are good" with separate, falsifiable evidence for shadow geometry and for shadow behavior in the moving block world. Evidence: – scripts/luv gazetteer…
Tool and live-definition hardening after the shadow reviewsky-and-lightIntent: remove the review findings which made the shadow evidence or live shader story less trustworthy than their documentation claimed. Evidence: – The tools entrypoint now leaves the process main thread to Cocoa and runs dispatch on a worker, matching the…
Moving-sun shadow shape and temporal evidencesky-and-lightIntent: make rotating sunlight read as a smooth depth cue during the ten-minute day without pretending that pinned-sun camera captures establish temporal quality. Preserve truthful block occlusion, but prefer a round, contact-aware filter footprint over…
Temporal derivatives and continuously filtered shadow decisionssky-and-lightIntent: turn moving-shadow shimmer into inspectable temporal evidence, then remove discrete nearest-sampled comparison flips without adding a whole-scene temporal reconstruction system prematurely. Evidence: – The 17-tap disk in #UDVPDW read nearest depth…
Receiver-plane shadow evidence and self-shadow stabilitysky-and-lightIntent: explain and remove the constant frame-by-frame flicker which survived #GKEHPF, and make temporal capture observe the shadow decision directly rather than infer it from final colour. Evidence: – --shadow-only 1 uses the otherwise-unused fog-colour W…
The shimmer that only noon could showsky-and-lightIntent: #X9Q2YS removed the field-wide receiver-plane acne and left cast shadows shimmering anyway. Play reported the residue as worst near noon, which is a strong clue: a defect with a preferred hour has a mechanism that depends on the sun's elevation.…
The shadow lattice turned about the world originsky-and-lightIntent: play still reported every cast shadow flickering and jittering whenever the clock ran, at any day length, and calm only once the clock stopped. #0604PY had already chosen the best roll for the light basis; the residue was too fast and too uniform to…
HDR crystal bloomsky-and-lightIntent: give emissive materials headroom and bloom without abusing alpha or the current LDR scene target. Observed: the scene attachment is :rgba16-float, presentation applies exposure and a fitted ACES curve, and a quarter-resolution bright/blur/sweep chain…
Materials and sky taken toward physical shadingsky-and-lightIntent: the world read flat because every face of a material was the same card, the specular was a fitted power, everything that was not the sun was one grey, and the sky's lower half was a wall of fog. Take each of those to a physical argument instead:…
Remove the per-admission type constructionfrontier-traversalsIntent: explain and remove the frontier solver's measured allocation excess without weakening the semantic frontier API. Evidence: bucket-frontier-push constructed `(integer 0 ,maximum-priority) for every runtime typep. Three conses per admission predicted…
Begin frontier light beside the oraclefrontier-traversalsThe first greenfield program has its own inspectable declaration, packed brightest-first frontier, relation traversal, counters, exact oracle comparison, and live selector. It reuses capture and publication on purpose: those shared boundaries make the A/B…
Compile the monotone light kernel to scalar Lispfrontier-traversalsIntent: turn the manually staged frontier-light proof into the smallest real compiler path described by #53Q1II. Reify the local transfer, join, admission, and priority arithmetic with checked field meanings; make the program definition drive a scalar…
Compile the sky seeds as boundary transfersfrontier-traversalsIntent: let the realization admit a virtual open-sky source through the program's own transfer law, so seeding stops restating the loss arithmetic in client code and a boundary is just a relation whose source is not a site. Evidence: every realization now…
Give frontier light its own invalidation programfrontier-traversalsIntent: state removal and incremental reconsideration in the same compiled vocabulary after the monotone kernel establishes its source and lowering boundary. Evidence: #ZEENY3. voxel-light-removal is an :invalidation program whose compiled drain reads like…
Make chunk traversal one owned vocabularyvoxel-fields-and-windowsIntent: establish the smallest reusable spatial substrate beneath the current light and meshing products. Add heap-allocation-free decomposition, primitive local stepping with explicit boundary crossings, storage-order site enumeration, and face enumeration…
Give dense traversal coordinate valuesvoxel-fields-and-windowsIntent: replace the positional x y z and dx dy dz protocols exposed by the first extraction with nominal coordinate and direction values. Make dense iteration a macro so those values can be constructed and consumed at the call site, and distinguish its…
Bundle continuous spatial triplesvoxel-fields-and-windowsIntent: replace the parallel camera/player position and velocity components, ad hoc ray sequences, and local camera-basis vector helpers with one small continuous CPU representation. Preserve nominal integer coordinates and directions, semantic shader…
Name the chunk-window protocolvoxel-fields-and-windowsIntent: expose the shared aggregate operation already visible in the live world, resolved meshing neighborhood, immutable halo snapshot, and light-region atlas. Give those four concrete representations a small protocol for locating a world site or resolving…
Keep rejected neighbors at dynamic extentvoxel-fields-and-windowsIntent: make the lifetime distinction in #E4T0PD visible to SBCL while preserving the chunk-domain and chunk-window boundaries from #L84JCX. A six-neighbor visit should use one body-scoped destination at a time and copy a coordinate only when the algorithm…
Pack the lighting worklist, then test level schedulingvoxel-fields-and-windowsIntent: remove the retained frontier's per-item list cell, light-region-site, and copied local-coordinate without prematurely extracting the general fixed-point algebra discussed in #BA9MCA. Represent a lighting site densely as a region entry plus domain…
Pay checked adjacency cost once per visited sitevoxel-fields-and-windowsIntent: preserve checked public domain stepping while avoiding the same bounds and coordinate type validation for each of a trusted worklist site's six neighbors. The packed frontier already proves its entry and offset; adjacency should validate that site…
Attach existing voxel field definitionsvoxel-fields-and-windowsIntent: describe the existing block-content, sky-light, and block-light columns without changing their representations or conflating field identity, per-site quantity, aggregate encoding, product state, and provenance. Evidence: luv.world.fields owns a small…
Name the atlas tiles and give the domain an ownervocabulariesIntent. Replace the hand-allocated atlas tile integers with keywords, and make the tile vocabulary a finite domain object that assigns offsets. Specializers become (eql :urbit) rather than (eql 36); a material's face list names tiles rather than positions;…
Compute atlas coordinates in the shadervocabulariesIntent. Carry a flat tile identity and an interpolated tile-local coordinate in the block vertex, and move the atlas arithmetic of #4SIKJM into the block world shaders, with the atlas width as a uniform. Evidence. The block vertex now carries tile-local UV,…
The mesher gathers first and then runs one dense loopvocabulariesIntent. Stop the mesher from asking a CLOS block object, through a generic function, what it is — once per neighbour sample, some twenty times per face. Gather instead: project the (small, closed) block vocabulary through block-solid-p, block-surface-emission…
The world owns one block vocabularyvocabulariesIntent. Replace the per-chunk palette with one append-only vocabulary per block-world, so that every chunk's u16 column means the same thing, a mesh snapshot needs no palette translation, a block placement is a hash lookup rather than a linear scan, and…
The atelier itself is a McCLIM applicationluftIntent. Make McCLIM the application model of the new atelier, not a widget kit added after a renderer has already invented commands, focus, and lifecycle. LUFT should be able to grow into the next game one feature at a time without growing a second…
Pointing reveals a site's topologyluftIntent. Make the first workbench pane answer the question the picture raises: which packed LUFT site is under the pointer, and how did its local shape rule turn that site into the geometry being seen? Evidence. luft.render:raycast-site walks the retained…
Cell edits are linear boundary updatesluftIntent. Make a voxel edit the sparse chain delta it is, rather than a request to mesh the world again. If the solid is C, its surface is S=\partial C, and an edit is the signed 3-chain \Delta, the complete update is C' = C + \Delta, \qquad S' = S +…
Find a regular site-owned account of mixed bevel junctionsluft-mitersIntent. Understand whether an Arc-like mixed miter can preserve LUFT's site-local ownership, CPU-authored discrete geometry, bounded records, and fixed dense rendering without complicating every ordinary sharp bevel. Evidence. Closed by the offset…
MetalFX resolves Luft's temporal inputstemporal-antialiasingIntent. Make Darwin's default Luft renderer accumulate the same jittered colour and motion contract as Vulkan while letting MetalFX own reconstruction, history, and its required synchronization. Evidence. The Metal renderer test creates a real RGBA16F + D32 +…
First Vulkan temporal resolvetemporal-antialiasingIntent. Give the atelier stable subpixel edges under a still or flying camera, with motion for every surface style and without reviving a second terrain geometry path. Evidence. The renderer test renders real Vulkan RGBA16F + RG16F multiple targets, proves…
Make wiki media executable without committing itwiki-siteIntent. Establish the smallest end-to-end path from a figure-linked Lisp recipe to ignored image or video bytes and a wiki transclusion, while leaving machine selection and artifact publication open. Evidence. Two #Y7X7WK recipes construct the same inert…
Publish generated media out of bandwiki-siteIntent. Put durable capture bytes somewhere the static site can fetch without growing the ordinary source clone, and run expensive recipes on a configured GPU executor. Evidence. The local contract in #IVRWI8 supplies deterministic paths and a source-revision…
Render the wiki as a static site from ASDFwiki-siteIntent: make the wiki browsable outside Emacs without a second source of truth, and express the build as an ASDF operation so it composes with the rest of the project. Evidence: (asdf:make :luv-wiki-site) renders all pages, figures.html, and the stylesheet…
Serve the site from GitHub Pageswiki-siteIntent: publish build/wiki/ at mbrock.github.io/luv on every push that touches the wiki or its tooling. Evidence: wiki.yml installs Nix, restores the closure with hestia (chunked GitHub Actions cache; about a minute warm, replacing the sunsetting…
Boxes hug their widest rowwiki-siteIntent. In the rendered source pages a nested body form stretches to its parent's full width (.body is flex-basis: 100%), and worse, a wrapping flex box's intrinsic width is the single-line sum of its children, so even an argument box like a multi-line…
Clauses as tables: cond, case, typecase, handler-casewiki-siteIntent. A cond clause today stacks its test and its result as two identical rows, so (null vectors) and (find-shader-type :float) look like siblings and the reader cannot tell test from consequent. What the let grid did for bindings (#BGIM3I) should be done…
The stylesheet as Lisp definitionswiki-siteIntent. wiki/style.css is 850 lines of hand-written CSS that the renderer's roles must agree with by convention. luv already compiles several small languages from S-expressions (#C6E3LA the shader language, #SQC5JN the arithmetic language, MSL); the…
Browse the source as dexp pageswiki-siteIntent: make the whole codebase readable from the rendered wiki, per #58SVCM, so that following a figure into code and code back into figures never leaves the site. Evidence: wiki/source.lisp adds source-file objects (path, system, text, nodes, definitions),…
The site shows code references to figureswiki-siteIntent: the first rung of #F6B3NI. Build the definition index of #SKNK2N during render-op on the system and render a "Referenced from" line per figure naming the definitions that mention it, each expandable in place to the definition drawn by the dexp…
Read luv sources with Eclector into a definition indexwiki-siteIntent: the reader of #SKNK2N as part of luv-wiki: an Eclector client that produces a token tree with source ranges and comments without interning, and a definition index over the cl-source-file components ASDF lists. Evidence: wiki/lisp.lisp. source-reader…
The dexp HTML rendererwiki-siteIntent: render a token tree from #YFDCSB as dexp boxes per #N06GKK, with roles assigned in Lisp and painted by the wiki stylesheet, and use it for #+begin_src lisp blocks first, since the wiki already has those. Evidence: wiki/dexp.lisp and the .lisp rules in…