Skip to content

Releases

Loka 0.0.7

Choose a tag to compare

@Lihi-AI Lihi-AI released this 23 Oct 12:59
193129e

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 a Pictures folder beside the application,
    ScrollView(child, {insets}), c.state.viewport(), Card(child),
    Box(child, {width, height, padding}), Row(...).naturalWidth() and ZStack(...)
    lowering. The SmirkyCard window has no outer margin, so the toolbar band reaches the
    window edges. Each card states its own margin with Box(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 Card container with four transparent bands;
    CardStyle names 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); ConfirmDialog on 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 answers WM_QUERYENDSESSION from 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, SmallLabel size 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 renamed expBlurUnit(); only the first unit (second child)
    blurs, on every rail (#1464).
  • NodeComposition::declare is one call per compose and the last declaration wins; the
    append doors (ParentScope, the returned reference) are gone (#1324).
    SceneManager::getCurrentScene() is gone (#1404). LedgerPolicy and
    OPEN_REFUSED_STANDALONE are gone; StandaloneTransactionGuard is the bootstrap
    bracket (#1335). Node::operator delete is gone (#1275).
  • Show accepts only a State<bool> lvalue: a pointer, a bool, a converting value or a
    temporary no longer compiles (#1371).
  • About and Quit come from AboutMenu(), QuitMenu() and StandardMenuPresets();
    composeDefaultMenu apps 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 answers WM_QUERYENDSESSION from the
    edited-document fact (#1512 #1543 #1545).

Evidence and verification

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...
Read more

Loka 0.0.6

Choose a tag to compare

@Lihi-AI Lihi-AI released this 12 Oct 11:02

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 / BlockStyle with + merging replace TextAttr;
    every rail draws the declared size and weight, centered and right-aligned
    paragraphs, and AttributedString / 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 a State<String>; Command-key handling on Classic
    and accelerator tables on Win32; CommandSet<E,N> binds a node's command emitters;
    RibbonControl / RibbonItem give a button band.
  • Documents and windows: DocumentRoster<T,N> drives one window per document
    with a close door; the window factory receives the document's ItemId; 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: TextStyle carries Primary, Secondary and eight named inks; all
    three native rails draw them (Classic through a planar ForeColor scope, 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

  • TextAttr is gone; use TextStyle / BlockStyle (FontSize<N> for sizes).
    TextEditorDocument's per-kind commit doors are gone; applyReplace is the one door.
  • MenuBoundary, MenuController and MENU_ACTION_REBUILD_MENU are gone;
    WindowProps::menuBar is gone; composeMenu is now composeDefaultMenu and a
    Scene declares its own bar.
  • LazyFlex is replaced by LazyView. RectSurfaceProps::clearBackground is 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*). onIdle without
    an idlePolicy asserts. 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.TXT with a visible alert (#1238).
  • Blob readers take the refusing-storage signature; scenario clicks on a disabled
    Button fail by default; SmirkyCard cards are constructed as new 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 .dsk image; ScrapbookUI with ASSETS.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.txt beside 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...
Read more

Loka 0.0.5

Choose a tag to compare

@Lihi-AI Lihi-AI released this 16 Sep 16:06

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 via state(), Reload MAIN.JS re-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 raw MutableState* 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 with ASSETS.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.txt beside 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.TXT if flattened into one folder (keep one folder per app; the .dsk images 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.JS must 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

HelloWorld's BMI round trip on macOS Tahoe 26.7 (MacBook Pro, real hardware; the release matrix's macOS reference rig)

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

Choose a tag to compare

@Lihi-AI Lihi-AI released this 27 Aug 00:53

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 Pre-release
Pre-release

Choose a tag to compare

@Lihi-AI Lihi-AI released this 18 Aug 16:40

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 ByteSource without 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 .profile fingerprint 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.py resolves 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 Pre-release
Pre-release

Choose a tag to compare

@Lihi-AI Lihi-AI released this 25 Jul 03:18
6f7e938

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 RETIRED fact 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/Show subtrees 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

0.0.1 Pre-release
Pre-release

Choose a tag to compare

@cubenoy22 cubenoy22 released this 31 May 14:52

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.