25 days of progress

Changelog

Atlox is built in public. This changelog follows the product as it becomes usable—from language and runtime changes to editing, deployment, and the everyday building experience. Each entry explains what changed that day, what you can do with it, and why it matters.

Isometric editor showing syntax-highlighted At counter functions

Three executable research slices connected the minimal function language to crash recovery, external effects, and a more precise model of logical continuity.

Ordinary functions lowered to durable runs

Typed functions compiled to durable continuations and state deltas. After crashes, they resumed without replaying committed code or admitting stale activations. See the durable-runtime results.

External effects became durable protocols

Effects commit intent before dispatch and receipt before resumption. Deduplicated calls retry one identity; uncertain calls run at most once and may return Unknown. Read the [external-effect results][external-effect-results].

Runs became replaceable machinery, not source values

An application became a graph of typed causal continuities: stable subjects with replaceable runs and activations. Once results, maintained values, and occurrences retain distinct contracts.

Lifetime requires more than demand

Interest, rooted retention, obligation, and attachment follow different lifetime laws. Reclamation requires causal reachability plus obligations; disconnecting a socket does not end an attachment. See the causal-continuity results.

The language was reduced again: ordinary typed functions, lexical closures, values, and imports were tested as the smallest source computation kernel.

Actors disappeared from the source kernel

Actors left the source kernel. Mutable closures keep logical owners while the runtime may inline, serialize, persist, or remotely activate them without changing behavior.

Functions retained one meaning across sites

The model checked lexical execution, closure conversion, immutable copying, routed mutation, site movement, and a typed nested closure running in Chrome.

Definitions, values, invocations, runs, and activations stayed distinct

Versioned definitions, captured function values, invocations, continuing runs, logical owners, and physical activations remain separate semantic categories.

Thirteen missing semantics were named instead of assumed

The kernel named thirteen missing semantics instead of inventing them, including durability, effects, maintained values, collections, lifecycle, and evolution. Read the function-kernel validation.

The language-foundation pieces were composed into complete application witnesses, then challenged with authority, tenancy, restart, and a working counter interface.

One workboard exercised the whole candidate model

One workboard combined durable structures, maintained queries, occurrences, effects, cancellation, browser materialization, and imports without adding another fundamental binding form. See the [integrated results][integrated-results].

Revocation gained a deterministic admission point

Revocable capabilities are authorized when governing authority admits the operation: admitted work may finish after revocation, while work still in transit is rejected.

Tenant and incarnation identities stayed separate

Equal keys remained isolated across tenants; deleted incarnations stayed tombstoned; recreated actors rejected old references and checkpoints. Read the [authority results][authority-results].

A durable counter survived restart

A root-owned durable counter drove browser patches, denied browser write authority, and resumed the same logical state after server restart. See the counter results.

The language-foundation proposal moved from vocabulary to executable transition systems for values, places, maintained computation, structural data, and physical plans.

Facts, places, and maintained laws received distinct semantics

The model distinguished one-time facts, replaceable places, and maintained laws. Bounded schedules checked sharing, temporal reads, atomic assignment, provider fencing, and live replacement. See the [fundamental results][fundamental-results].

Structural values remained ordinary values

Records and lists remain ordinary values. Materializing a copy gives the target fresh member identities rather than aliasing equal source values.

Queries became inspectable plans before execution

Function-composed queries lowered to revision-pinned plans that stores could execute, recover, or reject without silently loading entire collections. See the [structural-plan results][structural-plan-results].

Harder counterexamples widened the model

Further gates exercised occurrences, nested edits, code shipment, joins, uncertainty, cancellation, recursion, and live-cycle rejection. Read the generality results.

A new clean-slate language and runtime investigation began from the product vision rather than from the current parser or implementation.

Continuity became the central question

The research asked what remains identical as state, execution, placement, and representation change. Actors were a continuity hypothesis, not a thread-per-value design.

Source remained higher-level than runtime machinery

Authors keep ordinary values, functions, relations, views, and workflows. The compiler may introduce actors, protocols, scopes, and subscriptions where identity requires them.

Application startup received an explicit meaning

Each application incarnation received one runtime-created root. External work begins only after its startup topology commits and readiness is published.

The proposal remained a hypothesis

Every identity, lifetime, communication, and persistence distinction must survive executable counterexamples. Follow the language and runtime foundation.

The foundation program closed its first full research cycle and the public site gained a clearer record of which ideas survived, which were rejected, and which remain open.

Sixteen difficult slices were brought back together

Sixteen semantic slices tested everything from transactions and dataflow to heterogeneous execution and compiler readiness. The [completion audit][completion-audit] records what composed.

Executable evidence stayed attached to the claims

Reference models, broken alternatives, bounded exploration, and selected Lean proofs kept retained claims tied to witnesses and rejected claims tied to counterexamples.

The public research timeline became navigable

The website now presents accepted, researching, returned, and abandoned ideas as one timeline, making architectural changes and reversals visible.

The next foundation was deliberately reopened

The completed work reopened the source-language question instead of declaring a universal model. The reopening rule defines what later foundations must earn.

The Atlox research timeline showing accepted, abandoned, and active ideas

This was a research day rather than a production release. It clarified how Atlox could let developers write one application even when its work spans requests, queues, streams, background jobs, browsers, and several machines.

Calls, jobs, and live updates can share one language

The selected direction keeps ordinary functions and data structures across actions, queries, workflows, and subscriptions. See the communication research.

Different promises remain visible

Notifications, replayable histories, exclusive jobs, and payments may look similar in code, but their replay, ordering, cancellation, and uncertainty guarantees remain explicit.

Offline work stays first-class

Two devices accepted changes independently, observed different orders, preserved conflicts, and later converged without assuming an always-available central writer. See the offline result.

Application meaning comes before syntax or infrastructure

Language design now begins with observable behavior rather than syntax, database APIs, or compiler formats. Read the design-order decision.

The foundation is being checked through working slices

Each difficult semantic slice must now survive executable counterexamples before its concepts enter the language. Follow the structured-rewriting program.

The editor became much closer to normal coding, while a broad research pass tested whether one Atlox application could eventually cover everyday product data, background work, analytics, and live experiences.

The editor understands ordinary typing

Enter, Vim o or O, renames, fields, and HTML edits now start the appropriate structured change at the cursor. See Semantic Editing.

Unfinished code remains safe

Incomplete or invalid text remains as a persisted draft without replacing the last working application. A valid edit refreshes the preview without moving the cursor.

Several edits can become one meaningful change

Independent edits can stay open together, survive renames by identity, and commit as one revision. Larger refactors no longer collapse into fragile file replacement.

One language was tested against the wider data world

Research tested 47 data-intensive workloads. One familiar function language remained promising, provided history, ordering, retry, and freshness stay explicit. Read the data-systems result.

A smaller first answer was rejected

The first proposal hid critical guarantees in library code and failed under crashes, concurrency, evolution, and offline updates. See the falsification record.

The Atlox IDE with files, semantic source, problems, and live preview

The semantic-source project model moved into a runnable Rust service with durable projects, identity-preserving edits, revision history, and exact preview activation.

Projects gained an authoritative semantic program

The runtime stores stable application, file, definition, field, parameter, and HTML-node identities. Source files are generated projections of that program rather than the authority for renames and refactors.

Contextual commands edit meaning instead of replacing files

The workspace exposes commands for the selected semantic node. Restricted text regions accept only the expected fragment, then regenerate the source projection while preserving unaffected identities.

Invalid drafts cannot replace a working application

Incomplete and invalid edits remain in a persisted session. Open intentions and diagnostics block commit, so the accepted branch head and its runnable preview remain unchanged.

History supports atomic commits and non-destructive reset

Completed intentions commit together as one immutable revision. Reset moves the branch head to an earlier revision without deleting the later history.

Preview runs an exact accepted revision

Running a project activates its current semantic commit and records that revision. Drafts and unselected history cannot silently alter the application being previewed.

The selected semantic project model became an executable vertical slice with a real application, durable state, deployment compilation, mixed versions, and operational commands.

The complete project contract was written down

A project joined semantic history, immutable definition revisions, source projections, workspace drafts, and application worlds. The checkpoint defined how these parts coexist.

A real Atlox subset compiled and ran

The isolated prototype parsed and type-checked type, var, and fn, then ran a persistent calculator from ordinary Atlox source. Its behavior was not hard-coded into the Rust harness.

Deployment asked semantic questions

Removing or adding durable fields produced structured obligations. Answers such as rename or prior-value interpretation were stored in semantic history and generated reconciliation behavior.

Old and new programs shared one world

Version-pinned clients, workflows, effects, rollback, and roll-forward operated over the same durable application state. Target-only fields were preserved when older clients wrote.

The prototype included an operational lifecycle

Developers could initialize, compile, run, serve, inspect, deploy, roll back, back up, restore, and package a terminal client. Stages 1–10 and their limits are documented in the prototype guide.

Worldlines and nine semantic-model experiments compressed the previous research into a smaller product model, then tested whether that model could drive real evolution and tooling.

Semantic edits became the source of continuity

Create, relabel, split, merge, retire, forget, and replace operations recorded what a developer meant. Stable identities and localized obligations could therefore survive source rearrangement.

One universal ontology was rejected

An experiment briefly modeled record types as revision-pinned subject views over assertions. The minimal checkpoint instead separated the versioned program semantic model from ordinary durable application state. See the checkpoint decision.

Values became immutable and places owned state

let, var, and durable state separated detached logical values from assignable places. Maps remained ordinary values while indexed state could still have independently addressable coordinates.

Evolution protocols were executed end to end

Prototypes covered online field splitting, relation and view changes, structural evolution, public function protocols, workflows and effects, physical planning, authority movement, and reclamation. The consolidated findings are in the semantic-model decisions.

Semantic editing became a working experiment

A model pane and direct commands created revisions and deployment obligations without pretending that arbitrary invalid text had known meaning. The editor result connected source artifacts to canonical semantic history.

Unity reached its planned endpoint as a compiler-certified local database. The same day, the research deliberately reopened its assumptions through the Worldlines program.

Release capsules made evolution exact

Immutable predecessor relationships, stable identities, and typed forward or reverse transforms defined deployment evolution. Ambiguous paths were rejected rather than chosen by convention.

Forgetting became a governed operation

Authorized forget created logical unreconstructability, invalidated incompatible history and rollback promises, and recorded the loss. Ordinary compaction could never cross a protected frontier. The details are in the retention.

A complete local database assembled without new syntax

Records, maps, exports, authorization, queries, releases, and forgetting compiled into one closed database plan. Recovery returned ready, rebuilding, or quarantined rather than silently guessing.

Logical behavior survived several physical engines

Scan, atomic-image, journal, replay, incremental, and indexed realizations were required to match one semantic oracle. The Stage 21 decision states the exact boundary.

Worldlines challenged the accumulated model

The new campaign asked whether canonical meaning should be a causal history of semantic operations, subjects, assertions, and evidence. It was a reality check, not an automatic replacement of Unity.

Unity connected transactions to queries and physical execution, then applied the same separation of meaning and realization to live program evolution.

Queries read one coherent snapshot

Collection operations described logical results over typed records. Predicate transactions protected inferred query footprints, preventing a concurrent write from invalidating a decision between read and commit.

Live observation gained a resumable contract

Ordinary function results could be observed through initial values, updates, progress, checkpoints, and reset. The protocol made gaps, compaction, and resumption explicit without turning functions into a special query language.

Incremental execution became optional

The reference meaning of a query remained recomputation. The runtime could maintain the same result incrementally when a certified plan was available, or fall back without changing application code. See the materialization decision.

Physical structures stopped leaking into logical types

Indexes, logs, replicas, and layouts became replaceable realizations constrained by observable equivalence. A later boundary audit limited native code to sealed physical capabilities rather than letting a foreign database own semantic policy.

Evolution became an executable runtime concern

Immutable releases pinned definition identities and creator-supplied transformations. Old and new code could coexist over one logical history, setting up generated rollout and rollback instead of handwritten migrations.

Unity crossed from a single durable writer into application-level security, contention, atomic multi-value change, and typed records.

Authorization used the invocation snapshot

An authenticated Principal came from the runtime, while @authorize named an ordinary read-only policy. Policy and protected function ran against the same pinned state, closing a common time-of-check/time-of-use gap. See the Stage 9 decision.

Concurrent writers received transparent retry

Each invocation ran on a snapshot and committed only if its inferred write footprint still matched. Conflicts retried the whole pure invocation, avoiding user-authored compare-and-swap loops.

One exported call became one atomic transaction

Writes to several keyed values committed together or not at all. Nested calls joined the same scope, and results were released only after the complete change was durable.

Records remained values, not hidden rows

Typed keyed records were introduced without embedding storage handles or partial loading into values. The compiler could understand fields while the runtime retained control of physical representation. The selection is captured in the Stage 12.

The Unity Language campaign restarted from the smallest familiar program and added one unavoidable database pressure at a time. Every later stage had to keep earlier behavior passing.

Pure computation stayed ordinary

Scalar algorithms, structured transformations, recursion, and parallel batches shared one semantic evaluator. Workers, queues, and schedules remained realization choices rather than concepts in business code.

State began as a direct cell

One cell and ordinary functions replaced explicit transition packages. An external export fn opened the atomic scope, while reads, writes, rejection, and durability were inferred from the body.

Durability added no source syntax

The same application passed both atomic-image and commit-log crash campaigns. Success could become visible only after recovery was guaranteed, proving durability as a runtime contract rather than a code annotation.

History became intrinsic and non-destructive

Cells gained qualified revisions, historical reads, and append-only restore branches. Recorded transitions defined history; rerunning current code could verify it but could not rewrite it.

Keyed cells replaced the richer named-object model

Generated handles, registries, lifecycle, and mutable names were initially selected, then rejected as premature. Sparse keyed cells preserved independent history and durability with fewer concepts. The final Stage 7 decision records the replacement.

Stage 1 moved from replaying selected examples to testing whether the same language could survive new values, schedules, and operation shapes.

Thirty thousand histories tested variation

The generalization gate replayed 10,000 histories for each system. It checked changes in keys, namespaces, values, interleavings, and fault schedules against the frozen public traces.

Direct witnesses covered new operation shapes

Generated variation alone could not widen a corpus built from a small number of original executions. A second gate therefore ran new source-system witness families. The generalization certificate states both levels.

Stage 1 became more like ordinary code

Rust-style blocks and last-expression returns, methods on collection values, PascalCase type and variant names, String, and camelCase members removed research notation that obscured the model.

Three live-relation counterexamples were proved

SQLite kept an old reader frontier during a new commit; etcd made a lagging watch unavailable after compaction; Kafka made transaction visibility depend on partition frontiers. One logical program survived different realizations in the live-relation prototype.

Authority was separated from derived data

Parallel work was tested as independent lives that can propose evidence, not as automatically trusted clones of state. The resulting common-problems model kept acceptance and reconciliation explicit.

Atlox opened a deliberately isolated research program: derive a language core from real database behavior, then make that core executable rather than selecting it by taste.

Three unlike systems formed the first test

SQLite, etcd, and Kafka supplied transaction, consensus, watch, log, partition, and visibility pressure. Their source, public behavior, scenarios, and evidence were pinned by the database-core method.

Public behavior became the compatibility boundary

The experiment targeted the chosen version's observable semantics, not historical bugs or every legacy format. Protocol encoding and bit-level mechanisms stayed in Rust so Atlox could concentrate on database-domain logic.

A semantic contract was frozen

Typed scoped histories, proposals, acceptance, frontiers, observations, authority, and physical refinement formed an evidence-led core. compute described deterministic calculation; derive described logical recomputation at a consistent frontier.

Source closure exposed an invalid metric

The original witness closures contained only a few relevant source nodes. A promised tenfold reduction was therefore mathematically impossible for that corpus. The record kept the denominator visible instead of claiming a misleading compression win.

AtloxStage1 became executable

A parser, type checker, evaluator, native boundary, and multi-file SQLite, etcd, and Kafka programs turned the semantic proposal into a runnable research language. The language reference records its bounded surface.

Two investigations met on the same day: the browser learned to preserve view instances, while a language tournament asked what semantic kernel could support the whole application.

Views gained persistent identity

Reusable view instances could survive reevaluation instead of being replaced wholesale. Props, local adapter state, and lifecycle became part of one browser runtime model.

Client updates became structural

The client program described reusable view plans and reconciled their changing bindings. This was a step away from page replacement and toward a persistent application graph in the browser.

Distributed-language precedents were compared

Erlang, Orleans, Unison, Bloom, CRDT systems, Hydro, Temporal, tierless languages, and other models were analyzed for the problems they solve and the concepts they expose to developers.

A semantic-kernel tournament selected governed transitions

The investigation selected Governed Algebraic Transitions: typed information spaces produce proposals, while trusted acceptance decides authority and atomic visibility.

The decision was tested, not treated as doctrine

An executable kernel lab compared candidates and native information models. This established the practice of carrying evidence and rejected alternatives alongside a selected design.

The hosted editor was hardened around the most important rule of a development environment: never lose or unexpectedly replace what the developer is typing.

Autosave stopped stealing editor state

Remote updates now preserve the CodeMirror selection and scroll position. An acknowledged save no longer reconstructs the editor or moves the cursor away from active work.

Local drafts remained authoritative while dirty

The adapter compared the visible document with the acknowledged server value before clearing its dirty state. Queued edits continued saving instead of being forgotten behind an earlier response.

Revision conflicts became explicit

A stale save returned a real conflict response and explained that another tab had changed the project. The browser could distinguish concurrency from an ordinary validation failure.

Invalid source could recover cleanly

Tests proved that a project could retain its previous active snapshot after invalid input and then activate again when the same file was repaired. The behavior lives in the project store.

Definition navigation stayed local

Cursor movement was removed from round trips through application state. Editor navigation could remain an immediate CodeMirror action while project updates continued through the durable path.

Atlox became something a developer could use through a browser: create a project, edit multiple files, activate a valid revision, and preview it in an isolated runtime.

The hosted workspace opened

A trusted web control plane, project store, runner, and CodeMirror adapter formed the first hosted editing path. The editor gained Atlox highlighting and a workspace designed around project files.

Projects became real file trees

Imports and semantic identities were extended across multiple project-relative files. Email, todo, components, and icons demonstrated that applications no longer had to be assembled into one editor document.

One runtime could serve many projects

The hosted runner moved to a shared, always-running runtime with lazy project loading and atomic activation. This replaced a fragile fixed-port process per preview and improved local macOS and production Linux behavior.

Invalid drafts stopped replacing working applications

File revisions and activation were separated. A user could keep editing invalid source and see diagnostics while the last valid application continued serving traffic.

Deployment became repeatable

Runtime images, system services, Caddy configuration, environment examples, and release scripts formed the first production path. The operational model is recorded in the deployment guide.

Atlox moved from a collection of runtime features toward one stable model of an application. Source files became a representation of meaning rather than the identity of that meaning.

The foundation was consolidated

Several competing foundation drafts were reorganized into one foundation document. It described the application as a live, versioned graph that can be inspected, changed, activated, and repaired.

Definitions gained stable identity

Projects received tracked semantic identity files. A definition could keep its identity when its name or source location changed, creating the basis for semantic comparison and future evolution.

Operations became version-pinned

The semantic application kernel introduced snapshots, activation, operation runs pinned to exact definition versions, and commit metadata. Running behavior could now be connected to the exact program that produced it.

Project layout became explicit

Executable examples moved to project folders with a fixed app.at root. That made imports, runtime data, and semantic identity project-relative instead of depending on a loose source file.

Types became less repetitive

Collection key and row types, together with ordinary function return types, could be inferred. The language kept checked types while removing annotations already established by the program.

This day concentrated on how Atlox should look and what its frontend model should promise. The result was both a brighter landing page and a sharper boundary around application semantics.

The landing page received a distinct visual system

The page adopted a luminous cyan, violet, pink, and warm palette, stronger typography, layered gradients, and a graph-centered hero. Atlox now looked like the live system it was describing.

The application graph became the central visual

Nodes, orbits, connections, and runtime regions made the product idea visible: data, computation, and presentation belong to one connected application rather than separate stacks.

Placement was identified as a compiler decision

The research notes proposed that the compiler place database queries, authorization, server projections, browser replicas, and form drafts from semantic constraints instead of handwritten API boundaries.

Durable state and animation were separated

Application state defines where the interface must end up; animation controls how a local renderer gets there. This avoided forcing ephemeral presentation time into durable application history.

Manual frontend plumbing became an explicit non-goal

The direction rejected arbitrary fetches, subscriptions, global stores, cache invalidation, and hydration protocols in application code. The complete argument survives in the July research notes.

Atlox gained a second delivery mode: an application could be rendered without keeping the development server in the request path.

Static export became a command

The new export path wrote rendered application pages as static output. This made landing pages and other read-only experiences deployable as ordinary files.

Export reused runtime rendering

Static output did not introduce a separate template system. It reused the same parsed application and renderer, keeping server execution and exported pages aligned.

The landing page became an executable example

The public Atlox page moved into a real application project. It demonstrated that the language could express product content and layout, not only CRUD screens.

The code sample was reduced to the essential idea

The landing example was tightened so the visible program emphasized application state, derivation, and view composition. The surviving project can be read in the Atlox example.

The first runtime grew into a recognizable application framework. The browser, server, storage backend, and component system began sharing one compiled program.

Storage stopped meaning one physical backend

Store declarations were separated from backend implementations. Application logic could describe a relation without fixing whether its realization was SQLite, memory, or a browser replica.

Browser state became part of the compiled program

The runtime began producing a client program rather than treating hydration as an ad hoc script. Implicit browser relations let views depend on replicated data without manually declaring a second frontend store.

Reusable views became practical

Shared expressions, component slots, attribute forwarding, utility styles, and predicate lowering made larger interfaces possible. Email and todo examples exercised the same component path that applications would use.

Rendering gained an objective quality gate

A Chrome render harness and component assertions turned visual behavior into repeatable evidence. That harness remains documented in the render-test guide.

The project became Atlox

The language was renamed, Lucide icons and shared components were added, and development hot reload removed the restart loop. The accompanying vision reframed Atlox as a governed application platform rather than a collection of UI conveniences.

Atlox began as a small but complete experiment: describe data, changes, derived relations, and HTML in one typed program, then run that program against durable state.

One program could own state and behavior

The first executable examples combined application declarations, operations, and SQLite-backed state. This established the original promise that an Atlox application should be more than a UI layer over a separately designed database.

HTML became native language syntax

Views could render application state directly with server-side HTML. Derived collections were maintained incrementally, so a change could update a result without rebuilding the whole application.

Joins joined the reactive graph

Incremental joins allowed a change in either source collection to propagate through a composed relation. This was the first important proof that the graph could express more than filtered lists.

Durable relations and browser patches closed the loop

Named stores gained relation storage, while the hydrated browser applied server-produced patches. Together they formed the first complete path from a durable write to an updated interface. The current architecture still documents this lineage in the runtime model.

The graph became explainable

Structured explain output exposed definitions and dependencies instead of hiding them inside the runtime. That decision survives in the current language surface.