Repository navigation
Releases
Loka 0.0.7
Loka v0.0.7
A look-and-feel release: cards with shadows and rounded corners, ZStack units with
blur (a live photo band on Classic and macOS 10.4-10.9), a ScrollView that scrolls
sideways and carries content insets, a real quit and close story on every rail, and
SmirkyTracker, a SmirkyCard (experimental) showcase that exercises all of it.
Highlights
- SmirkyTracker (SmirkyCard): LaptopTracker.JS became SmirkyTracker, a card of 13 Macs
with the owner's artwork (320x200 color plus one-bit renderings chosen by the machine's
display depth), a 1-column / 2-column list, an About window over a static blur, and a
toolbar that is a live band over a scrolling page. JavaScript gains machine facts
(c.machine.cpuClass,c.machine.displayDepth), named picture seats
(c.state.image('STEM')) loaded from aPicturesfolder beside the application,
ScrollView(child, {insets}),c.state.viewport(),Card(child),
Box(child, {width, height, padding}),Row(...).naturalWidth()andZStack(...)
lowering. The SmirkyCard window has no outer margin, so the toolbar band reaches the
window edges. Each card states its own margin withBox(child, {padding: 'standard'}),
and the other cards look exactly as before. (#1382 #1383 #1384 #1385 #1391 #1393 #1397
#1420 #1459 #1463 #1475 #1477 #1479 #1480 #1481 #1483 #1486 #1490 #1505 #1508 #1514
#1525 #1552 #1561) - Cards, shadows and rounded corners: a
Cardcontainer with four transparent bands;
CardStylenames a shadow as extent (NONE, DROP, WIDE) times ink (STENCIL, ALPHA);
every native rail draws it (Toolbox 4/8 patterns and nine-cell borders, Win32 child
windows with clipped masks, macOS views with constant-density runs, about 3x faster);
a style-less Card takes the process's standard look, chosen from the CPU class
(G3-or-faster gets WIDE x ALPHA). Ribbon groups draw their frame edges the same way.
(#1308 #1309 #1310 #1311 #1358 #1360 #1364 #1379 #1392 #1396 #1405 #1407 #1412
#1417 #1426 #1427 #1428 #1434 #1450 #1488) - ZStack units and blur: every ZStack child after the first is an opaque unit on all
rails;ZStack().expBlurUnit()blurs the content beneath it (macOS 10.10+ with
NSVisualEffectView; Toolbox as a milk frost, then a coarse static blur
(expStaticBlurUnit()) and a band blur that recaptures at redraws); macOS 10.4-10.9
shows a blurred photo of the content beneath and the band follows each scroll step.
Toolbox StaticBlur never asks for a redraw of its own. CardShowcase is a macOS sample.
(#1438 #1442 #1444 #1449 #1454 #1455 #1456 #1458 #1464 #1465 #1495 #1503 #1508
#1510 #1517 #1524 #1530 #1531 #1532 #1542 #1549) - ScrollView: horizontal scrolling on Toolbox, Win32 and macOS (content-width range,
bar only while a range exists); content insets (top, bottom) on every rail; a published
viewport fact with the visible size;VStack().naturalHeight()so a vertical list
stacks instead of the first row filling the viewport; the vertical bar and scroller
stay out of the inset rows. (#1341 #1350 #1355 #1356 #1357 #1362 #1367 #1370 #1376
#1377 #1413 #1415 #1418 #1419 #1467 #1472 #1473 #1474 #1516 #1550 #1551) - Quit, close and dialogs: a native close of a keyed document window is a request the
node answers (App::closeAsked,App::requestQuit);ConfirmDialogon Toolbox
(caution icon, Command-D for Don't Save), Win32 (MessageBoxW) and macOS (NSAlert);
SimpleText asks before closing an edited document; Classic Shut Down arrives as File >
Quit; Win32 answersWM_QUERYENDSESSIONfrom the edited-document fact; macOS answers
the quit Apple Event itself (Dock Quit, logout, osascript). (#1282 #1286 #1287 #1290
#1293 #1294 #1295 #1300 #1512 #1543 #1545 #1546 #1555) - Menus: About and Quit come from the app container (
AboutMenu(),QuitMenu(),
StandardMenuPresets()); the Apple menu is always present on Classic, Quit sits at the
end of File on Classic/Win32 and in the app menu on macOS; menu projection keeps the
installed bar on a refused build and submenu IDs no longer collide. (#1312 #1315
#1316 #1317 #1318 #1521 #1526 #1529 #1533 #1535 #1536 #1537 #1538) - Layout and spacing: containers own the gap between seats (
.gap(n)on Stack and
Box), the window owns its outer margin (StandardWindowMargin()),Box().width(n)/
height(n), natural-width Text/Row/Ribbon measurement,SmallLabelsize role,
Buttons at the native push-button height, and an aligned Row ending at its lowest
child. (#1283 #1284 #1285 #1292 #1296 #1297 #1298 #1329 #1334 #1342 #1353 #1361 #1363
#1369 #1373 #1374 #1375 #1386 #1387 #1388 #1389 #1390 #1402 #1432 #1470 #1509) - TextEditor: Toolbox editor shows a vertical scroll bar; Page Up/Down/Home/End move
the view; control bytes are ignored and 0x7F deletes forward; KanjiTalk two-byte
characters are refused as one unit; macOS no longer crashes on input-method typing and
Tab moves focus between fields (Toolbox Tab too). (#1303 #1431 #1436 #1441 #1443 #1451
#1452 #1462 #1468) - Input and paint (Toolbox): presses go through one render-order press ledger;
hidden or covered rows no longer take presses, keys on parked fields or hover; controls
draw in the composition walk; word-aligned gradient patterns fix a Mac Plus Address
Error; a back window's first click selects it. (#1322 #1338 #1405 #1446 #1485 #1492
#1496 #1504 #1507) - macOS 10.4-10.9 performance and fixes: ImageView converts a bitmap to device RGB once, so
drawing under a scroll stops color-matching; relayout applies a frame only when it
changed, so unchanged scroll content is not repainted every pass; on 10.4 the About
card no longer leaves the window undrawn (a ZStack unit marks its own rectangles
when its frame changes), and the application menu is registered with AppKit so no
second "App" menu appears. (#1540 #1541 #1569)
Breaking changes for application authors
ZStack().expBlurUnits()is renamedexpBlurUnit(); only the first unit (second child)
blurs, on every rail (#1464).NodeComposition::declareis one call per compose and the last declaration wins; the
append doors (ParentScope, the returned reference) are gone (#1324).
SceneManager::getCurrentScene()is gone (#1404).LedgerPolicyand
OPEN_REFUSED_STANDALONEare gone;StandaloneTransactionGuardis the bootstrap
bracket (#1335).Node::operator deleteis gone (#1275).Showaccepts only aState<bool>lvalue: a pointer, a bool, a converting value or a
temporary no longer compiles (#1371).- About and Quit come from
AboutMenu(),QuitMenu()andStandardMenuPresets();
composeDefaultMenuapps declare them through the presets (#1538). Windows shows Exit. - The window owns its outer margin (
StandardWindowMargin()); containers own the gap
between seats, so apps that padded by hand may need to drop their own margins (#1386
#1390). The SmirkyCard window has no outer margin (#1561). - A vertical ScrollView list stacks its rows only with
VStack().naturalHeight();
without it the first row fills the viewport as before (#1516). - A native close of a keyed document window is a request the node answers
(App::closeAsked,App::requestQuit); Win32 answersWM_QUERYENDSESSIONfrom the
edited-document fact (#1512 #1543 #1545).
Evidence and verification
- Classic verdicts: MAME maciix golden bundle grew from 29 to 38 approved cells across
this cycle; owner approvals recorded at 49a8be3 (#1368), 33 cells (#1409), 34 (#1440),
35 (#1445), 36 (#1457), 37 (#1478 #1489 #1491 #1511 #1518), 38 (#1548 #1554). - macOS 10.4-10.9 blur: runtime-verified on Tiger 10.4.11 (MacBook2,1) and
Mavericks 10.9.5 (#1465 #1530 #1549). - Build-verified toolchain fixes: Tiger UB1 under GCC 4.0 (#1253 #1304 #1528), macOS tests
on GCC 4.2 / 10.6 SDK and Mavericks (#1277 #1288 #1556), pre-DR 253 clang (#1276 #1381). - Release tooling and aftercare: Windows archives assembled from WSL with SHA-256 match,
SimpleText and SmirkyCard scripts in every stage, repo links moved to the org
(#1252 #1254 #1255 #1256 #1257 #1260 #1261 #1262 #1263 #1269 #1270 #1271 #1274 #1281). - Process and docs: AGENTS.md refresh (rules only, review policy moved to
docs/ReviewPolicy.md) (#1339 #1340 #1343 #1344 #1345 #1346 #1347); CI refuses a
by-value QuickDraw Pattern (#1410); Win32 VM interactive tasks run under a desktop lock
(#1501); focus-test and host-fake hardening (#1424 #1497). - Internal ownership work with no app-facing change: roster/document windows, node
provenance, Win32/macOS leaf registries and HWND ownership (#1266 #1267 #1268 #1314
#1332 #1333 #1348 #1349 #1351 #1352 #1365 #1400 #1494).
Support matrix changes
- macOS 10.4-10.9: photo blur runtime-verified (above); Tiger 10.4.11 on a MacBook (2006) ran the RC3 UB1 archive (i386) on 2026-10-23.
- Windows XP (x86): runtime-verified on the owner's VAIO P (RC3 archive, 2026-10-23; SmirkyTracker by hand).
- Classic PowerBook 180c (68030, KanjiTalk 7.1): runtime-verified on the RC3 archive, 2026-10-23 (SmirkyTracker by hand; the blur band scrolls as lightly as on a G4).
- Other rows: unchanged from v0.0.6 unless the release PR says otherwise
(docs PR #1572 updates the README rows and environments.md).
Known issues
- #1460 macOS 10.9: a focused text field beneath a ZStack unit paints its focus ring and
caret over the unit. - #1498 Toolbox: rows fully covered by a ZStack unit still take keys, Tab, caret blink
and direct paints (presses are shielded since #1496). - #1372 Win32 ScrollView: a short-range-refused traversal leaves already placed children
at the refused pass's scroll translation while the bars keep the last good layout. - #1354 Outside any ScrollView, native layout narrows an out-of-range Y to short without
refus...
Loka 0.0.6
Loka v0.0.6
A text release: a real TextEditor on every rail, styled and attributed text,
Scene-owned menus and commands, one window per document, and a first
text color palette. SimpleText, a one-document-per-window plain-text editor,
joins the examples on Classic, macOS and Windows. Classic applications now ship as
.dsk images beside the MacBinaries, Windows archives ship for the first time
(x64, and an x86 build that runs on Windows XP), and SmirkyCard (experimental)
is in every archive. Each archive carries the same eight applications.
Highlights
- TextEditor on all rails: plain multi-line editing through TextEdit (Classic),
EDIT (Win32) and NSTextView (macOS); the owner commits every edit as one range
replacement (applyReplace), the caret is a rail-reported fact plus an app-posted
request, and page up/down go through one editor command seat. Keyboard focus is
app-owned (Focus<K>): every rail reports it and an app can request it. - Styled text:
TextStyle/BlockStylewith+merging replaceTextAttr;
every rail draws the declared size and weight, centered and right-aligned
paragraphs, andAttributedString/AttributedText/ Markup runs. Classic text
goes through a MacRoman/ASCII projection so non-ASCII renders on Roman System 7. - Menus and commands: a Scene owns its menu bar and the App default is merged
with it; item titles can follow aState<String>; Command-key handling on Classic
and accelerator tables on Win32;CommandSet<E,N>binds a node's command emitters;
RibbonControl/RibbonItemgive a button band. - Documents and windows:
DocumentRoster<T,N>drives one window per document
with a close door; the window factory receives the document'sItemId; a Window
carries an edited fact beside its title that the rails project (macOS
document-edited dot, Windows*prefix); no shipped example sets it yet, the
SimpleText wiring is a 0.0.7 item; a launch that opens no window is reported once and quits
by default (Classic shows the out-of-memory Stop alert). - Text color:
TextStylecarries Primary, Secondary and eight named inks; all
three native rails draw them (Classic through a planarForeColorscope, macOS
as dynamic system colors that follow light and dark, Win32 at the Windows 11
light values). Surface grounds are chosen by node kind in one place and text
pairs with its ground. macOS bundles opt into dark appearance. - SimpleText (new example): one ASCII document per window, New / Open / Save /
Save As through the native file dialogs on every rail, a command band, its own
menu, a measured Classic partition. - Layout and lists: buttons answer their natural width;
LazyView(one window
selection, no per-item seats) replaces LazyFlex; the ScrollView band pass lays
out only visible leaves on Classic; one logical-unit scale per rail. - Files and native resources: Save dialogs on all rails; chosen files carry a
sealed native locator; out-of-memory pictures and blobs are refused instead of
quitting the application; native image disposal waits for the platform clock. - SmirkyCard: JS cards gain text style and Markup, block alignment, file and
image seats, dialogs and pictures, constructor Flows and scene-to-scene values;
MINES.JS (Minesweeper) and SimpleViewer.JS ship beside MAIN.JS; a JS scenario
runner drives cards headlessly. - Classic platform: out of memory shows a Stop alert instead of exiting to the
Finder; SIZE minimums are measured need × 1.1; partial repaint merging and
scroll-bar paint answers; busy and I-beam cursors have one owner; backgrounded
applications present their windows. - Kernel: rails open one Operation per turn and every guard, write seat and Flow
bracket joins it; request delivery settles once per entry operation with
RequestQueue<T,N>for accumulating commands; Keyed / LazyScope replacements are
failure-atomic.
Breaking changes for application authors
TextAttris gone; useTextStyle/BlockStyle(FontSize<N>for sizes).
TextEditorDocument's per-kind commit doors are gone;applyReplaceis the one door.MenuBoundary,MenuControllerandMENU_ACTION_REBUILD_MENUare gone;
WindowProps::menuBaris gone;composeMenuis nowcomposeDefaultMenuand a
Scene declares its own bar.- LazyFlex is replaced by
LazyView.RectSurfaceProps::clearBackgroundis gone;
a RectSurface always paints its ground. Classic Row spacing, Box bottom padding
and Row/Grid short-coordinate refusal change some layouts. - The document window factory takes
(ItemId, const T&, void*).onIdlewithout
anidlePolicyasserts. A windowless launch quits by default. macOS
nativeFrame()reports the outer frame, so writing it back no longer moves the
window. - Classic: the Command key goes only to MenuKey; Command-Q quits by default
(Win32: none); EditText deletes forward on Del, refuses lossy edits with a beep;
backgrounded applications present; 68K minimum SIZE values are higher.
RetroCarbon is refused at configure time. Win32/macOS logical-unit scale changed. - Standalone Flow loops refuse a missing
LOG.TXTwith a visible alert (#1238). - Blob readers take the refusing-storage signature; scenario clicks on a disabled
Button fail by default; SmirkyCard cards are constructed asnew F(c).
Archives
Every archive carries the same eight applications: the five standalone
presentation loops, SimpleViewer, SimpleText, and SmirkyCard (experimental, with
MAIN.JS, MINES.JS and VIEWER.JS beside it).
Loka-v0.0.6-classic.zip(24.3 MB) — 68K and PPC MacBinary applications, each
also as a.dskimage; ScrapbookUI withASSETS.LRP; SmirkyCard's disks carry
its scripts.Loka-v0.0.6-win32-x64.zip(7.0 MB) — Windows 10/11 x64; SmirkyCard under
smirkycard\. First Windows archive.Loka-v0.0.6-win32-x86-xp.zip(5.6 MB) — the same as 32-bit builds with the
v141_xp toolset; runtime-verified on a VAIO P running Windows XP.Loka-v0.0.6-macos-ub2.zip(6.2 MB) — arm64 + x86_64 bundles; SmirkyCard's
scripts in the bundle Resources.Loka-v0.0.6-macos-ub1-tiger.zip(7.6 MB) — ppc + i386 universal binaries
(Xcode 3.2.6 / GCC 4.0, 10.4u SDK); runtime-verified on a Pismo running
Tiger 10.4.
Each archive has a.manifest.txtbeside it (tag, commit, allowlist hash,
per-file SHA-256, build commands).
Verified at the release candidate
Tag v0.0.6 (annotated, 137cc66) is main bfeecb4 (39de508 plus the docs PR
#1269) with the release allowlists on top; the archive contents are those of
rehearsal 3. Final smoke on the tagged archives: Windows x64 and x86 XP green;
macOS UB2 on Catalina 10.15.7, UB1 on Mavericks 10.9.5 (i386) and emulated Leopard 10.5.8 (ppc): all eight applications, loops 14/9/9/13/11 with 0 failed steps; Classic MacBinaries identical to rehearsal 3 apart from MacBinary dates and CRC (final smoke). RC = main 39de508 (release branch tip
9699c15, allowlists only). Full matrix at
a536c4e: Classic MAME maciix 29/29 cells, macOS Tahoe 18/18 (renewed at 39de508 for #1263: 0 differing pixels, no reruns),
Win32 VM 18/18, Linux/macOS/Windows/Toolbox CI green; the PRs between a536c4e and
39de508 are argued static no-ops per rail in the release PR. Archive smoke
(rehearsal 3): Windows 8.1 (XP zip), Windows 11 (x64), Catalina 10.15.7 (UB2),
Mavericks 10.9.5 i386 and emulated Leopard 10.5.8 PPC (UB1): all eight apps on
each, loops 14/9/9/13/11, 0 failed. Owner hardware, all passed: PowerBook 550c
(full 68040 with FPU, Mac OS 7.6.1 Japanese; Classic 68K), PowerBook 1400c (Mac OS 8.6;
Classic PPC), PowerBook G3 PDQ (Mac OS 8.6; Classic PPC), Pismo (G3 500 MHz) on
Mac OS X 10.4.11 (UB1 ppc), VAIO P on Windows XP (x86), MacBook Neo on
macOS 27.0.1 (UB2 arm64). The iBook G4 was not run. On the 550c the owner's
impression was that the applications feel fast and comfortable (an impression,
not a measurement). Backgrounded presentation
(#1239) confirmed on the 1400c, and background loops kept running on XP and the
Pismo. App Translocation (#1238) was not observed: the archives reached the Neo by
copy, without the quarantine attribute.
Known issues
- #496 Win32 MineSweeper settles with the bottom rows unpainted on real GPUs
(bare metal only; the VM rig never shows it). - #580 ScrollView is vertical-only; SimpleViewer's actual-size mode clips wide images.
- #1265 Win32: clicking a scroll bar arrow or the track does nothing (the release
republishes the old position); the wheel and thumb drag work. - #800 Classic: HelloWorld's scroll bar visibly redraws after each scroll (OS 9.2.2,
Pismo). #802 macOS UB1 on 10.4: SimpleViewer's buttons below a grown status Text
are not redrawn until clicked. - #501 the standalone audit flushes every record to disk on a 68030.
- Text color: Win32 draws the light appearance only (dark is color rally page 3,
#1196); on Classic, Secondary is black until the color port. - KanjiTalk / Japanese System 7 shows non-ASCII as
?until MacJapanese lands
(#1076); SimpleText is ASCII-only (Japanese editing is a 0.0.7 item). - macOS: typing through an input method (for example Japanese) into SimpleText's
editor can crash the application (#1264, seen on 10.13 during the rehearsal;
the marked-text commit recurses); the editor accepts ASCII only (#862). - Ribbon v1 has push buttons only, with no enabled state. There is no app-facing
alert door yet; each rail hand-builds its refusal alert (#1237). - macOS dark appearance is not runtime-verified on 10.15.
- Editor focus is not restored across a lazy-list window-key change; the editor is
plain text (styled editing is a later track). - Standalone loops on ma...
Loka 0.0.5
Loka v0.0.5
Core hardened, then a runtime on top: the allocation-zero update path (hole B), the paint-damage ledger (#518 rally 2), the write-seat state family, and SmirkyCard, an experimental HyperCard-style example whose cards are written in JavaScript with the same names as Loka's C++ node DSL, loaded from a MAIN.JS beside the application and reloadable without relaunch.
Highlights
- SmirkyCard (experimental): QuickJS-ng on every rail including Classic 68K. Cards are JS classes (
card('first', class { … compose() { return VStack(…) } })), state seats viastate(),Reload MAIN.JSre-reads the file with engine generations so a broken file never replaces a working card. Runs on a PowerBook 180c (68030, 8 MB) and in Infinite Mac's Macintosh Plus configuration (68000, 4 MB, System 7.1; browser emulation, speed not claimed). - Allocation-free update cycle (hole B): the pool allocator is the main line; MineSweeper mount 7.7 s → 0.6 s and LazyList cold 18 s → 1.4 s on the MAME rig.
- Paint damage ledger (#518 rally 2): descriptors, exact damage answers, Win32 damage translation.
- Write seats:
WriteSeat<T>replaces rawMutableState*in control props; the transaction-owning Boundary is the only writer. - macOS UB1 (Tiger, ppc + i386) ships for the first time beside the UB2 (arm64 + x86_64) archive; Classic ships 68K + PPC MacBinaries with ScrapbookUI's package beside its binaries.
Archives
Loka-v0.0.5-classic.zip— 68K and PPC MacBinary applications, ScrapbookUI withASSETS.LRP,experimental/SmirkyCard/(68K bin +MAIN.JS).Loka-v0.0.5-macos-ub2.zip— five standalone presentation loops + SimpleViewer, arm64 + x86_64.Loka-v0.0.5-macos-ub1-tiger.zip— the same six as ppc + i386 universal binaries built with Xcode 3.2.6 / GCC 4.0 against the 10.4u SDK (build-verified; no Tiger/Leopard runtime claim).
Each archive has a.manifest.txtbeside it (tag, commit, allowlist hash, per-file SHA-256, build commands).
Verified at the release candidate
Classic MAME maciix 24/24 cells (bake + confirm); macOS Tahoe 26.7 16/16 (stage + verify, audits 16/16); Win32 VM 16/16 (bake + verify); Linux/macOS/Windows/Toolbox CI green; PowerBook 180c hands-on (all examples + SmirkyCard); Mavericks 10.9 flow run and Tiger UB1 stage; MacBook Neo (macOS 27.0) tests 9/9 and audits 16/16 as a reference rail.
Known issues
- #496 Win32 MineSweeper settles with the bottom rows unpainted on bare metal (omen 11/20, Zenbook SORA 3/10); the VM rig never shows it. Cells blocked; root cause on the #518 rally-3 track.
- #580 ScrollView is vertical-only; SimpleViewer's actual-size mode clips wide images.
- #490 Classic Standalone Loop applications share
LOG.TXTif flattened into one folder (keep one folder per app; the.dskimages are separate volumes). - #503 stale frame when backgrounded; #501 audit flush cadence on 68030; #725/#727 Win32 white window contained.
- LazyList is a measurement bench and feels slow on a real 68030.
- SmirkyCard: state is not carried across reload; 8 seats per card; two named cards;
MAIN.JSmust be UTF-8 (Classic editors: see README).
Environment notes
macOS reference rig moved to Tahoe 26.7 (25G229). The -Werror legacy legs (Mavericks GCC 4.0) caught two C++98 nested-access shapes (#795, #797) that modern compilers accept.
Screenshots
Known issue found after publishing
macOS UB2 note (#803): the standalone loop applications refuse to start when launched straight from the unzipped download. macOS quarantines the folder and runs the app read-only (App Translocation), so the loop cannot write its LOG.TXT beside itself and exits without a window. Move the applications out of the download folder with the Finder, or run xattr -dr com.apple.quarantine <App>.app. SimpleViewer is unaffected. A visible refusal and a README note are on the 0.0.6 track.
Loka 0.0.4
Loka 0.0.4
Loka 0.0.4 hardens the verification system the examples ship on, and turns
the presentation reels into installable, autonomous applications. It
contains 58 commits since v0.0.3.
Highlights
- Presentation builds: autonomous standalone loop applications on Classic,
Win32, and macOS run the scenario reel unattended; a macOS UB2
(arm64+x86_64) standalone release path, standalone debug targets, launch
parity across rails, and reel-cell window titles. - Verification rig: every pixel rail now declares its capture environment
before it bakes and refuses undeclared drift; goldens carry a reference
identity and cannot self-authorize; startup-identity guards refuse a
golden that silently equals startup; each rig is named instead of derived. - Classic correctness: EditText listens to its own State and its border has
one owner; partial redraw punches out overlapped ZStack siblings, with a
discriminating instrument; retained Button and PopupMenu handlers update
correctly. - Cross-platform: DSL names no longer collide with Universal Interfaces
globals; native App teardown completes between runs; SimpleViewer releases
image bytes before its low-memory retry; wide Win32 API builds are
enforced. - CI: per-platform workflows with hosted Toolbox and Win32 standalone
Release builds. - Release evidence: verified at release-candidate commit 59e3262 with green
hosted CI, the Classic 16-cell MAME registry, ten macOS cells on the tahoe
rig, and eight Win32 cells on the omen rig. Win32 MineSweeper is blocked
by the known settle defect #496 and SimpleViewer awaits its scenario door
(#375); both are recorded, not waived. The Classic L3 sample is the real
Mac OS 9 hands-on session that surfaced #490 and #491 (dispositioned to
0.0.5); the Win32 and macOS L3 samples are not taken for this release by
release-owner decision, recorded in the matrix. Evidence and known issues
are recorded on release PR #497.
Loka 0.0.3
Loka 0.0.3 gives the 0.0.x line its resource story and its proof machinery: the LRPK package format with a shipping example built on it, and a scenario verification rail that produces machine-checked evidence on every native target. 159 pull requests since 0.0.2.
Highlights
LRPK resource container
- LRPK V1: a packaged resource container with a tracked on-disk format, a streaming reader, and a pack-side writer (#207), opened from a
ByteSourcewithout holding the whole package in memory (#222). lrpc: a real CLI entry point that builds a package from a manifest (#214), with staged write-failure contracts pinned by tests.- Refusal is a contract, not a crash: corrupt packages produce typed refusals that leave the UI on its last good page, and the refusal fixtures ship in the scenario registry.
ScrapbookUI
- A new shipping example that consumes an LRPK package page by page — image and text pages, Previous/Next, and visible refusal behavior on corrupted bags.
- Classic page flips no longer stall seconds on draw-time PICT rasterization; pages are pre-rasterized at generation time (#298).
Scenario verification rails
- Declarative scene scenario flow (#348): scenarios emit State directly and drive the real scene, on all three native targets, from one shared registry.
- Two-layer machine verdicts: a byte-compared durable audit (step history + embedded snapshot records) plus a settled pixel golden guarded by a rig
.profilefingerprint that refuses to compare across environments (#312 ruling; #399, #403). - Flagship L2 scenarios actuate real controls — EditText and Grid cells included (#400).
- Release preflight is an orchestrated run:
loka-rig.pyresolves an exact commit and delegates to per-platform adapters (macOS VM / Toolbox MAME), collecting artifacts under a shared manifest contract.
Loop-reel presentation builds
- Scenario loop reels cycle every registered scenario continuously for demos, on Classic (#405), macOS (#409), and Win32 with standalone presentation builds (#410), launched the same way everywhere (#413).
- The window title names the running cell and cycle (#416) — presentation builds are no longer silent about where they are.
Lifecycle & memory model
- The ComponentNode / ownership-inversion / structural self-declaration wall merged, closing the #36 / #270 / #277 arc: nodes declare their structure, ownership edges are explicit, and teardown is clock-driven.
- MineSweeper New Game landed for real: key-bank identity swap with a recomposing boundary (#316), with the dirty-replay defect found and fixed in the same push (#317).
- Native destruction defers across the detach line (#300); the Scrapbook page area has a Box owner (#305); a ScrollBar control whose binding hears only settled values (#223).
Menus
- Cross-platform menu bar support with an app-owned composition model, diffed at commit time, projected natively on Win32, macOS, and Classic.
macOS build generations
- UB2 (x86_64 + arm64) builds via
build-ub2.sh, now failure-atomic — a broken lipo can no longer destroy the previous bundle or silently ship a thin binary (#415). - A legacy script family reaching back to Mac OS X 10.4 (
build-10_4.sh/build-10_5.sh/build-10_7.sh, #198): UB1 (ppc + i386) built on a period Xcode 3.2.6 rig. - Apple bundle IDs consolidated under
io.lo-ka.loka.*.
Windows
- Windows XP presets compose with MSVC platform defaults instead of replacing them — a fresh XP configure builds again, and a preset-shape test pins the rule for the whole win32 preset family (#418).
Experimental mobile arms (outside the release matrix)
- iOS UIKit hello-world smoke on current Xcode (#376) and an iPhone OS 3.1 ARMv6 build/deploy path (#377), both runtime-verified on their targets and then parked.
Verified on
| Platform | Evidence |
|---|---|
| Linux (hosted CI) | headless, release, and ASan suites green at the RC and at the tag lineage |
Classic Mac (MAME maciix, 68030+68882, 8 MB) |
full scenario registry, both layers green per cell (expected-audit byte match + settled pixel golden) |
| Classic Mac (real hardware) | PowerBook 1400c on 8.1 (68K), PowerBook G4 Titanium on 9.2.2 — all five PPC examples running simultaneously |
| macOS 26 (Tahoe, x86_64) | rig-verified scenario pairs both layers green; all six examples build-and-launch at the tag lineage |
| macOS real-hardware sweep | Tiger (Intel C2D and Pismo PPC via UB1), Leopard (iBook G4), Mojave |
| Windows 11 (ARM64, ACP=932) | 17/17 scenario rail at RC equivalence |
| Windows XP (VAIO P, x86) | examples run from the repaired XP preset lane |
Release photos from the real-hardware sweep are on the pr-assets evidence branch. The full verification matrix, archives, and hashes are recorded on release PR #387.
Release assets
Loka-v0.0.3-classic.zip — the adjudicated Classic application set: six 68K MacBinary applications, five PPC counterparts (ScrapbookUI has no PPC target in this release), and ScrapbookUI's tracked ASSETS.LRP. The adjacent .manifest.txt records the exact tag, commit, checkout path, and per-file SHA-256 hashes.
Known issues
| Issue | Status |
|---|---|
| #419 SimpleViewer keeps the previous image's bytes alive while opening the next; the second open dies silently on Classic | Open. Confirmed on PowerBook 180c real hardware. Present in all prior releases; adapter-local fix scheduled for 0.0.3a, the structural Flow-cache ownership question tracked for 0.0.4. |
| #411 / #412 / #414 Classic incremental drawing: EditText double frame, ZStack overlap erased to white, EditText text not syncing | Open. One shared root — no owner for a rectangle drawn by multiple nodes — scheduled as the first 0.0.3a work. |
| #398 Classic out-of-memory refusal has no agreed wall | Open. Diagnosis complete with a real backtrace; the fix direction is under design. Related: the Classic operator new aborts on exhaustion, so today's failure mode is silent termination. |
| #404 window sizing clips content on Win32/macOS | Open. Font line-height driven; Classic fits. Scheduled for 0.0.3a. |
| #420 app bundles from the legacy macOS build scripts launch non-Retina | Open. Missing NSHighResolutionCapable; UB2 and non-bundled executables unaffected. |
| #421 dark mode ignored on macOS 10.14–10.15 | Open. That OS window is served by pre-10.14-SDK builds; 11+ (UB2) follows the system appearance. |
| #322 Classic first launch takes ~20 s on 16 MHz-class 68030 | Open. Phase-split measurement planned before choosing a fix. |
| #144 / #145 / #152 lifecycle debts carried from 0.0.2 | Open. #152's confirmed trigger remains mitigated; the underlying in-flight teardown mechanism is on the WR-4 / transactional-kernel design track. |
Loka 0.0.2
Loka 0.0.2 delivers the promise of the 0.0.x line: tightened lifecycle and ownership contracts, verified across four platforms. 88 pull requests since 0.0.1.
Highlights
Lifecycle & ownership contracts
- The Window now owns its Scenes end to end: one-shot props handoff, two-phase retire pools drained at flush boundaries, and an App-owned close queue (#73, #85, #87).
- The node lifecycle was rebuilt around a single fact channel — one enum, one door: living transitions and the terminal
RETIREDfact are delivered at apply time, and the ad-hoc hook surface is gone (#105–#111). - Retired arena and heap nodes are destroyed at the clock, never mid-teardown; pending update targets can no longer dangle across detach/re-attach (#90–#96, #153).
- Conditional/
Showsubtrees keep their seats across recomposition, with boundary-local rebuild consolidated behind one path (#113–#119).
State correctness
- State writes landing during a tracker commit now queue into an explicit next transaction instead of being silently dropped (#158).
- Direct-root boundaries register their observed state on the compose path (#154, #156); flow-level success resume no longer double-fires cleanup (#131).
Allocation discipline
- Every scene allocation now routes through a gated backend with an audit trail; materialization failure travels by value, arena refusal is a contracted degradation, and steady-state per-interaction allocations are pinned by a ratchet budget (#133, #134, #140, #142, #146, #147, #148).
- That work makes allocation failure propagate rather than vanish. It does not by itself make structural materialization failure-atomic — see #144 under Known issues.
Win32 correctness
- Text is UTF-16 end to end: popup items, Text measurement/set, buttons, window title, menus, cells, and edit text — no more mojibake on any ANSI codepage, and Japanese IME input round-trips losslessly into bound state (#161, #162, #168; closes #160). The sweep covers UI text surfaces; file paths still travel through narrow APIs (#15).
- The open-file dialog now holds sibling windows app-modal, closing the confirmed re-entrancy trigger for #152 (#165).
Classic Mac (Toolbox / Retro68)
- Retired subtrees drop their hit-table entries and state bindings; edit focus survives control-vector erases; and a detached EditText now synchronously retires its native TEHandle with per-context identity — two controls sharing one text state each keep their own native binding (#157, #163, #166).
- Classic binaries shed the C++ unwinder and MacsBug names, with compact vs diagnostic build profiles and per-app SIZE partitions (#136–#138).
Verification infrastructure
- 192-test contract/scenario suite registered with CTest, run headless and under ASan (#129, #105).
- A reproducible MAME runtime-verification workflow — scenario isolation, Lua-driven ADB input, headless/visible replay — is documented and already used to runtime-verify fixes (#122, #163, #166).
- Wiring and mechanism changes now require mutation-backed red→green evidence (#114).
Verified on
| Platform | Evidence |
|---|---|
| Linux (headless + ASan) | 192/192 both suites |
| Windows 11 (ARM64, ACP=932) | test suite green incl. Win32-only pins; all 5 examples launch and exercise |
| Retro68 68K (release + diag) & PPC | builds clean; MAME maciix runtime scenarios (#163, #166) |
| macOS (arm64) | test suite green; all 5 examples runtime-verified incl. Japanese text spot check (#164) |
Known issues
| Issue | Status |
|---|---|
| #152 re-entrant detach/unmount during an in-flight compose/apply cycle frees live-stack boundaries | Open. The confirmed Win32 trigger — sibling windows during the open-file dialog — is mitigated in this release by #165. The underlying in-flight teardown mechanism is unfixed, and is scheduled for the owner-clock / transactional-kernel design track (0.0.3+). That track is not issue #144. |
| #144 partially materialized conditional seat is stamped applied and never retried | Open. A Std boundary can publish an incomplete tree when a branch seat is registered with active.root present and active.allocationFailed also true. |
#145 heap-fallback state OOM in a BoundaryInnerStateOwner is silently swallowed |
Open. The default no-op white flag discards the failure. |
#15 fopen fails on Windows for paths containing full-width characters |
Open, and predates this release. The UTF-16 sweep covered UI text; the file dialog and file I/O still use narrow APIs. |
| #45-3 double-notify on forced state set | Deferred to the memory-model track; see also #173. |
#45-7 TEXT_WRAP_CHAR measured as word-wrap on macOS/Win32 |
Design pass pending. The structural cause — layout geometry has no headless coverage — is filed as #174. |
| #125 parked-only conditional branches orphaned on seat shift | Latent until Conditional/For DSL lands; red fixture recorded. |
| #167 Tutorial has no runtime path to exercise EditText | Example-content gap found during the macOS sweep. |
0.0.1
First release of Loka. Designed to run the same application model across both modern and vintage platforms.
This release provides the initial working core of Loka: a small UI DSL with basic building blocks such as Window and VStack, plus the underlying Node, Boundary, State, Flow, compose, and platform projection architecture.
The widget surface is still intentionally small, but the core architecture is now solid enough to serve as the first reference point for future work.
Build-Verified
- latest Windows
- latest macOS
- Retro68 68k
Notes
This is an experimental 0.0.1 release. APIs may still change, but the main ownership, state, and composition model is in place.
