<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Project Ceylon — Development Journal</title><description>The public Development Journal of Project Ceylon, an IBC Systems Division project.</description><link>https://ceylonprojectng.com/</link><language>en-us</language><item><title>Project Ceylon Development Log — October 4, 2026: Slow, Boring, and Exactly What We Need</title><link>https://ceylonprojectng.com/journal/project-ceylon-development-log-october-4-2026-slow-boring-and-exactly-what-we-need/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/project-ceylon-development-log-october-4-2026-slow-boring-and-exactly-what-we-need/</guid><description>Project Ceylon is under a hard hold on new development: no new features until the current qualification and repair pass proves the platform is a trustworthy baseline to build on.</description><pubDate>Sun, 04 Oct 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A couple of days ago I put Project Ceylon on a hard hold on new development.&lt;/p&gt;
&lt;p&gt;That does not mean work has stopped.&lt;/p&gt;
&lt;p&gt;It means forward development has stopped.&lt;/p&gt;
&lt;p&gt;There is an important difference.&lt;/p&gt;
&lt;p&gt;For the next couple of days, the goal is to test, appraise, repair, and retest what is already there until we are as close as we can reasonably get to a known-good platform.&lt;/p&gt;
&lt;p&gt;That is the point I want to resume coding from.&lt;/p&gt;
&lt;p&gt;Not &amp;quot;mostly working.&amp;quot;&lt;/p&gt;
&lt;p&gt;Not &amp;quot;we think this path is okay.&amp;quot;&lt;/p&gt;
&lt;p&gt;Not &amp;quot;the logs looked healthy last time.&amp;quot;&lt;/p&gt;
&lt;p&gt;The closest thing to a known-good system we can actually prove.&lt;/p&gt;
&lt;h2 id=&quot;we-are-finding-things&quot;&gt;We are finding things&lt;/h2&gt;
&lt;p&gt;The testing is doing exactly what it is supposed to do.&lt;/p&gt;
&lt;p&gt;We are finding issues.&lt;/p&gt;
&lt;p&gt;Some are ordinary bugs. Some are incomplete implementations. Some are places where two parts of the system each make sense by themselves but do not quite agree once they have to work together.&lt;/p&gt;
&lt;p&gt;That is why the hold exists.&lt;/p&gt;
&lt;p&gt;If we find a real problem now, I would much rather stop and fix it correctly than carry it forward underneath another three layers of code.&lt;/p&gt;
&lt;p&gt;That is slower in the short term.&lt;/p&gt;
&lt;p&gt;It is much faster than discovering later that a new feature was built on top of an assumption that was never actually true.&lt;/p&gt;
&lt;p&gt;This phase is not especially exciting to watch.&lt;/p&gt;
&lt;p&gt;There may be a few development logs over the next several days that amount to little more than:&lt;/p&gt;
&lt;p&gt;still testing, still appraising, still repairing.&lt;/p&gt;
&lt;p&gt;That is fine.&lt;/p&gt;
&lt;p&gt;I am not going to manufacture a dramatic milestone every evening just to make the journal look busy.&lt;/p&gt;
&lt;p&gt;The project is busy enough on its own.&lt;/p&gt;
&lt;h2 id=&quot;the-goal-is-a-trustworthy-starting-point&quot;&gt;The goal is a trustworthy starting point&lt;/h2&gt;
&lt;p&gt;What I want at the end of this pass is a baseline we understand.&lt;/p&gt;
&lt;p&gt;I want to know which parts of Ceylon are genuinely solid, which parts are fragile, which assumptions have survived contact with integrated testing, and which ones need to be removed before they become permanent architecture.&lt;/p&gt;
&lt;p&gt;That means looking at the machine from more than one angle.&lt;/p&gt;
&lt;p&gt;Individual subsystems still have to prove their own behavior, but we are also continuing to test the paths between them and the complete behavior of the system when those pieces are connected together.&lt;/p&gt;
&lt;p&gt;We have already learned the hard way that a green local test can coexist with a broken computer.&lt;/p&gt;
&lt;p&gt;So this is not about collecting more green boxes.&lt;/p&gt;
&lt;p&gt;It is about understanding what those green boxes actually prove.&lt;/p&gt;
&lt;h2 id=&quot;advancement-is-on-hold&quot;&gt;Advancement is on hold&lt;/h2&gt;
&lt;p&gt;I have made this a hard rule for the current tranche:&lt;/p&gt;
&lt;p&gt;no new implementation work until this qualification and repair pass is complete.&lt;/p&gt;
&lt;p&gt;That includes application work.&lt;/p&gt;
&lt;p&gt;There are several things waiting in the wings that I would very much like to start building against the system.&lt;/p&gt;
&lt;p&gt;They can wait.&lt;/p&gt;
&lt;p&gt;If Ceylon is going to host applications, development tools, media software, games, and eventually more serious workloads, then the platform under all of that has to be the part we trust first.&lt;/p&gt;
&lt;p&gt;The temptation to move ahead is real.&lt;/p&gt;
&lt;p&gt;It is especially real when a new idea looks more interesting than another hour of testing restart behavior.&lt;/p&gt;
&lt;p&gt;But &amp;quot;interesting&amp;quot; is not a release criterion.&lt;/p&gt;
&lt;h2 id=&quot;the-planning-work-has-not-stopped&quot;&gt;The planning work has not stopped&lt;/h2&gt;
&lt;p&gt;The implementation hold does not mean I have stopped thinking about what comes next.&lt;/p&gt;
&lt;p&gt;Quite the opposite.&lt;/p&gt;
&lt;p&gt;Some of the time that would normally go into coding has gone into tightening the specifications for work we already know is coming.&lt;/p&gt;
&lt;p&gt;We put together a much more serious plan for a Ceylon SDK and application toolchain.&lt;/p&gt;
&lt;p&gt;The initial idea is straightforward: start with a Linux-hosted development path that can build, package, deploy, launch, diagnose, rebuild, and replace a Ceylon application through supported system interfaces.&lt;/p&gt;
&lt;p&gt;The important part is what does not count as success.&lt;/p&gt;
&lt;p&gt;A program linking on Linux is not enough.&lt;/p&gt;
&lt;p&gt;A host-side simulation is not enough.&lt;/p&gt;
&lt;p&gt;A build artifact existing is not enough.&lt;/p&gt;
&lt;p&gt;The application eventually has to run inside Ceylon through the actual runtime and service contracts.&lt;/p&gt;
&lt;p&gt;That specification work is useful now because it gives us something concrete to build toward later without pretending we are ready to start that implementation today.&lt;/p&gt;
&lt;h2 id=&quot;and-eventually-rust-on-ceylon&quot;&gt;And, eventually, Rust on Ceylon&lt;/h2&gt;
&lt;p&gt;That SDK discussion naturally led to another question:&lt;/p&gt;
&lt;p&gt;if Ceylon is eventually supposed to be a real development environment, should Linux remain the permanent place where serious software gets built?&lt;/p&gt;
&lt;p&gt;Probably not.&lt;/p&gt;
&lt;p&gt;So we also started looking at what it would actually take to run a Rust compiler and linker natively on Ceylon.&lt;/p&gt;
&lt;p&gt;Again, this is planning, not implementation.&lt;/p&gt;
&lt;p&gt;There is a fairly large gap between &amp;quot;we want Rust on Ceylon&amp;quot; and &amp;quot;the compiler runs locally.&amp;quot;&lt;/p&gt;
&lt;p&gt;A native compiler needs filesystem behavior, process or job control, memory management, synchronization, timing, executable loading, diagnostics, and enough host support that we are not quietly outsourcing the hard parts to another machine.&lt;/p&gt;
&lt;p&gt;That work comes later.&lt;/p&gt;
&lt;p&gt;But defining the problem now is useful.&lt;/p&gt;
&lt;p&gt;It is much better than discovering halfway through a toolchain port that the operating system is missing three services the compiler quietly assumed every desktop had.&lt;/p&gt;
&lt;h2 id=&quot;nudos-and-nubasic-got-the-same-treatment&quot;&gt;NuDOS and NuBASIC got the same treatment&lt;/h2&gt;
&lt;p&gt;We also spent time tightening the specifications for NuDOS and NuBASIC.&lt;/p&gt;
&lt;p&gt;Both already had substantial material behind them.&lt;/p&gt;
&lt;p&gt;That was not the problem.&lt;/p&gt;
&lt;p&gt;The problem was making sure that &amp;quot;substantial&amp;quot; also means coherent, implementable, testable, and consistent with the Ceylon that exists now.&lt;/p&gt;
&lt;p&gt;NuDOS needed a more serious requirements pass around command parsing, file operations, application launch, session behavior, restart handling, diagnostics, and end-to-end qualification.&lt;/p&gt;
&lt;p&gt;NuBASIC had an even larger existing language corpus, but it still needed the surrounding platform assumptions reconciled with the current architecture.&lt;/p&gt;
&lt;p&gt;Things like files, graphics, audio, timing, sessions, resource lifetime, and service failure cannot just be vaguely implied because the language syntax is well specified.&lt;/p&gt;
&lt;p&gt;The goal with both of these is simple:&lt;/p&gt;
&lt;p&gt;when implementation resumes, I do not want the developer—human or otherwise—to have to invent architecture while writing code.&lt;/p&gt;
&lt;p&gt;The specification should already tell us what the thing is supposed to do, how it fits into Ceylon, and how we will know when it is actually finished.&lt;/p&gt;
&lt;h2 id=&quot;scope-creep-is-still-circling-the-building&quot;&gt;Scope creep is still circling the building&lt;/h2&gt;
&lt;p&gt;There have also been some discussions about future work.&lt;/p&gt;
&lt;p&gt;Some of those are useful.&lt;/p&gt;
&lt;p&gt;Some of them are clearly scope creep wearing a fake mustache.&lt;/p&gt;
&lt;p&gt;I will resist.&lt;/p&gt;
&lt;p&gt;Probably.&lt;/p&gt;
&lt;p&gt;The important part is that discussion is not implementation.&lt;/p&gt;
&lt;p&gt;Ideas can be written down.&lt;/p&gt;
&lt;p&gt;Architectural questions can be researched.&lt;/p&gt;
&lt;p&gt;Specifications can be cleaned up.&lt;/p&gt;
&lt;p&gt;But the source tree stays on hold until the current qualification pass is done.&lt;/p&gt;
&lt;p&gt;That boundary matters.&lt;/p&gt;
&lt;p&gt;Otherwise a &amp;quot;temporary pause for testing&amp;quot; turns into three new subsystems and a completely different roadmap by Thursday.&lt;/p&gt;
&lt;p&gt;I know how this works.&lt;/p&gt;
&lt;h2 id=&quot;then-comes-cleanup&quot;&gt;Then comes cleanup&lt;/h2&gt;
&lt;p&gt;Assuming this qualification pass does what I want it to do, the next likely step is not immediately another feature sprint.&lt;/p&gt;
&lt;p&gt;&apos;Tis the season for a refactor and optimization tranche.&lt;/p&gt;
&lt;p&gt;By then we should have a much clearer picture of where the awkward seams are, where duplicated logic has accumulated, which assumptions need to be simplified, and which parts are worth optimizing because measurement says they need it.&lt;/p&gt;
&lt;p&gt;That is the right time to clean the platform up.&lt;/p&gt;
&lt;p&gt;After we have tested it thoroughly enough to understand its behavior.&lt;/p&gt;
&lt;p&gt;Before we start stacking another layer of applications and services on top.&lt;/p&gt;
&lt;p&gt;Refactoring a known-good system is one thing.&lt;/p&gt;
&lt;p&gt;Refactoring a system while simultaneously wondering whether the old behavior ever worked correctly is quite another.&lt;/p&gt;
&lt;p&gt;I prefer the first option.&lt;/p&gt;
&lt;h2 id=&quot;so-not-much-to-report&quot;&gt;So, not much to report&lt;/h2&gt;
&lt;p&gt;That may be the shape of the journal for a little while.&lt;/p&gt;
&lt;p&gt;If we find something genuinely interesting during testing, I will write about it.&lt;/p&gt;
&lt;p&gt;If a failure teaches us something useful about the architecture, that is worth documenting too.&lt;/p&gt;
&lt;p&gt;But some days may simply end with:&lt;/p&gt;
&lt;p&gt;the testing continued,&lt;/p&gt;
&lt;p&gt;a few things were repaired,&lt;/p&gt;
&lt;p&gt;and the hold remains in place.&lt;/p&gt;
&lt;p&gt;That is not a lack of progress.&lt;/p&gt;
&lt;p&gt;Right now, that is the progress.&lt;/p&gt;
&lt;p&gt;When coding resumes—probably in a couple of days—I want it to resume from the closest thing to a known-good Ceylon platform we can produce.&lt;/p&gt;
&lt;p&gt;Then we clean it up.&lt;/p&gt;
&lt;p&gt;Then we optimize what actually needs optimizing.&lt;/p&gt;
&lt;p&gt;Then we move forward.&lt;/p&gt;
&lt;p&gt;In that order.&lt;/p&gt;
&lt;p&gt;For once.&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Retrocomputing</category><category>Operating Systems</category><category>Testing</category><category>Diagnostics</category><category>Refactoring</category><category>NuDOS</category><category>NuBASIC</category><category>SDK</category><category>Rust</category><author>Mike</author></item><item><title>Project Ceylon Development Log — October 3, 2026: The Computer Has to Prove Itself</title><link>https://ceylonprojectng.com/journal/project-ceylon-development-log-october-3-2026-the-computer-has-to-prove-itself/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/project-ceylon-development-log-october-3-2026-the-computer-has-to-prove-itself/</guid><description>A couple of days ago I wrote that a green test is not the same thing as a working computer. Today we spent more time making that statement inconveniently literal.</description><pubDate>Sat, 03 Oct 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A couple of days ago I wrote that a green test is not the same thing as a working computer.&lt;/p&gt;
&lt;p&gt;Today we spent more time making that statement inconveniently literal.&lt;/p&gt;
&lt;p&gt;The work was not particularly glamorous.&lt;/p&gt;
&lt;p&gt;No dramatic desktop screenshot.&lt;/p&gt;
&lt;p&gt;No new application showing off.&lt;/p&gt;
&lt;p&gt;No sudden miracle where every unfinished subsystem decided to cooperate at once.&lt;/p&gt;
&lt;p&gt;Instead, we kept digging into something that has become increasingly important as Ceylon gets larger:&lt;/p&gt;
&lt;p&gt;how do we prove that the pieces are actually complete, that they are talking to each other correctly, and that the complete machine still behaves the way the architecture says it should?&lt;/p&gt;
&lt;p&gt;That question is starting to change how the project is being built.&lt;/p&gt;
&lt;h2 id=&quot;the-diagnostic-work-is-becoming-part-of-the-system&quot;&gt;The diagnostic work is becoming part of the system&lt;/h2&gt;
&lt;p&gt;We have been developing a more formal system-diagnostic approach rather than relying on a pile of independent unit tests and a few end-to-end smoke tests.&lt;/p&gt;
&lt;p&gt;The reason is simple.&lt;/p&gt;
&lt;p&gt;Ceylon now has enough moving parts that it is entirely possible for several components to pass individually while the complete path is still broken.&lt;/p&gt;
&lt;p&gt;A provider can initialize.&lt;/p&gt;
&lt;p&gt;A client can initialize.&lt;/p&gt;
&lt;p&gt;A protocol can compile.&lt;/p&gt;
&lt;p&gt;A local test can return PASS.&lt;/p&gt;
&lt;p&gt;And the two sides can still disagree about identity, lifetime, ordering, authority, or what a successful response actually means.&lt;/p&gt;
&lt;p&gt;That is not a theoretical concern anymore.&lt;/p&gt;
&lt;p&gt;We have already seen it.&lt;/p&gt;
&lt;p&gt;So the diagnostic model is being built around two questions:&lt;/p&gt;
&lt;p&gt;Does each part do what it is responsible for?&lt;/p&gt;
&lt;p&gt;and:&lt;/p&gt;
&lt;p&gt;Do all of the parts still work together when connected as the actual computer?&lt;/p&gt;
&lt;p&gt;Both have to be true.&lt;/p&gt;
&lt;p&gt;One without the other is not enough.&lt;/p&gt;
&lt;h2 id=&quot;we-are-finding-incomplete-work-not-just-bugs&quot;&gt;We are finding incomplete work, not just bugs&lt;/h2&gt;
&lt;p&gt;One useful consequence of this is that the diagnostic work is exposing a category of problem that is slightly different from an ordinary bug.&lt;/p&gt;
&lt;p&gt;Sometimes the code is not wrong.&lt;/p&gt;
&lt;p&gt;Sometimes the code is simply not finished enough to support the behavior we thought the system already had.&lt;/p&gt;
&lt;p&gt;That distinction matters.&lt;/p&gt;
&lt;p&gt;A bug means an implemented behavior does the wrong thing.&lt;/p&gt;
&lt;p&gt;An implementation gap means some part of the required behavior was never completed, never connected, or never qualified in the first place.&lt;/p&gt;
&lt;p&gt;Those are easy to confuse when you are looking at a large system from the outside.&lt;/p&gt;
&lt;p&gt;Something starts.&lt;/p&gt;
&lt;p&gt;Something logs a plausible message.&lt;/p&gt;
&lt;p&gt;Something returns a success code.&lt;/p&gt;
&lt;p&gt;It is very tempting to mark the box complete.&lt;/p&gt;
&lt;p&gt;The diagnostic work is forcing us to ask harder questions.&lt;/p&gt;
&lt;p&gt;Did the request actually reach the next service?&lt;/p&gt;
&lt;p&gt;Did the next service interpret it the same way?&lt;/p&gt;
&lt;p&gt;Did the resource being referenced still belong to the same generation?&lt;/p&gt;
&lt;p&gt;Did a successful response correspond to the exact operation that was submitted?&lt;/p&gt;
&lt;p&gt;Did the result make it all the way back to the user-visible behavior?&lt;/p&gt;
&lt;p&gt;And if one of those answers is &amp;quot;we don&apos;t know,&amp;quot; then the feature is not proven.&lt;/p&gt;
&lt;h2 id=&quot;inter-system-communication-is-where-the-interesting-failures-live&quot;&gt;Inter-system communication is where the interesting failures live&lt;/h2&gt;
&lt;p&gt;This is becoming one of the bigger lessons from Ceylon.&lt;/p&gt;
&lt;p&gt;Individual components are relatively easy to reason about.&lt;/p&gt;
&lt;p&gt;The boundaries between them are where things get interesting.&lt;/p&gt;
&lt;p&gt;Once two protection domains or services have to cooperate, suddenly we have to care about:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;who owns the object;&lt;/li&gt;
&lt;li&gt;who is allowed to refer to it;&lt;/li&gt;
&lt;li&gt;which generation of that object is current;&lt;/li&gt;
&lt;li&gt;whether a response belongs to the request we think it belongs to;&lt;/li&gt;
&lt;li&gt;what happens if either side restarts;&lt;/li&gt;
&lt;li&gt;what state survives;&lt;/li&gt;
&lt;li&gt;what state must be invalidated;&lt;/li&gt;
&lt;li&gt;whether retries are safe;&lt;/li&gt;
&lt;li&gt;and whether a timeout means &amp;quot;failed&amp;quot; or merely &amp;quot;we no longer know.&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is where a lot of operating-system correctness actually lives.&lt;/p&gt;
&lt;p&gt;Not in the middle of one function.&lt;/p&gt;
&lt;p&gt;At the seam between two things that each believe they are doing the right thing.&lt;/p&gt;
&lt;p&gt;The new diagnostic work is being designed to exercise those seams deliberately.&lt;/p&gt;
&lt;h2 id=&quot;nudos-gave-us-a-very-good-example&quot;&gt;NuDOS gave us a very good example&lt;/h2&gt;
&lt;p&gt;NuDOS was part of today&apos;s work, but it was not the whole story.&lt;/p&gt;
&lt;p&gt;We have been preparing NuDOS for a much more serious implementation pass, which means taking the specification apart and asking whether it actually describes something we can build, test, and ship.&lt;/p&gt;
&lt;p&gt;That produced a fairly substantial gap analysis.&lt;/p&gt;
&lt;p&gt;The encouraging part is that NuDOS is not starting from zero.&lt;/p&gt;
&lt;p&gt;There is already a bounded command/control foundation, existing console work, filesystem foundations, execution-container work, session concepts, logging, and the surrounding desktop architecture.&lt;/p&gt;
&lt;p&gt;The less encouraging part is that &amp;quot;the pieces exist&amp;quot; is not the same thing as &amp;quot;the shell is complete.&amp;quot;&lt;/p&gt;
&lt;p&gt;The audit identified missing or insufficiently defined areas around things like command parsing, line editing, native Terminal attachment, logical locations, file operations, application launch, session isolation, output handling, restart behavior, diagnostics, and release evidence.&lt;/p&gt;
&lt;p&gt;That is exactly the kind of gap the new diagnostic philosophy is meant to expose before we mistake partial infrastructure for a finished product.&lt;/p&gt;
&lt;h2 id=&quot;a-shell-is-not-just-a-command-parser&quot;&gt;A shell is not just a command parser&lt;/h2&gt;
&lt;p&gt;It would be very easy to build NuDOS by starting with:&lt;/p&gt;
&lt;p&gt;DIR&lt;/p&gt;
&lt;p&gt;CD&lt;/p&gt;
&lt;p&gt;TYPE&lt;/p&gt;
&lt;p&gt;RUN&lt;/p&gt;
&lt;p&gt;and calling it a shell when those commands print something.&lt;/p&gt;
&lt;p&gt;That would be quick.&lt;/p&gt;
&lt;p&gt;It would also be sloppy.&lt;/p&gt;
&lt;p&gt;A usable command environment has to answer much less exciting questions.&lt;/p&gt;
&lt;p&gt;What happens when a filename contains spaces?&lt;/p&gt;
&lt;p&gt;What happens with quotes?&lt;/p&gt;
&lt;p&gt;What happens with malformed input?&lt;/p&gt;
&lt;p&gt;What happens if the command is longer than the allowed buffer?&lt;/p&gt;
&lt;p&gt;What happens if the user pastes multiple lines?&lt;/p&gt;
&lt;p&gt;What happens if a file operation is interrupted?&lt;/p&gt;
&lt;p&gt;What happens if a service restarts halfway through a request?&lt;/p&gt;
&lt;p&gt;What happens if the shell receives a stale response from the previous instance of that service?&lt;/p&gt;
&lt;p&gt;What exactly does &amp;quot;success&amp;quot; mean after a destructive operation if the provider disappeared before returning the final status?&lt;/p&gt;
&lt;p&gt;Those are not edge cases you bolt on later.&lt;/p&gt;
&lt;p&gt;They are part of the command environment.&lt;/p&gt;
&lt;p&gt;So the NuDOS specification is being tightened around those behaviors before implementation races ahead of the design.&lt;/p&gt;
&lt;h2 id=&quot;we-attacked-the-parser-instead-of-admiring-it&quot;&gt;We attacked the parser instead of admiring it&lt;/h2&gt;
&lt;p&gt;Part of that work included adversarial parser testing.&lt;/p&gt;
&lt;p&gt;The point was not to prove that normal commands parse.&lt;/p&gt;
&lt;p&gt;That is the easy part.&lt;/p&gt;
&lt;p&gt;The point was to throw quoting combinations, malformed input, boundary cases, and arbitrary data at the proposed grammar and see where the assumptions failed.&lt;/p&gt;
&lt;p&gt;Thousands of quoting cases were exercised.&lt;/p&gt;
&lt;p&gt;Then thousands more arbitrary-input cases.&lt;/p&gt;
&lt;p&gt;That kind of testing is not glamorous, but it is exactly what I want before a command parser becomes the thing standing between user input and operations like file deletion or application launch.&lt;/p&gt;
&lt;p&gt;A parser does not get credit for understanding:&lt;/p&gt;
&lt;p&gt;DIR Home:&lt;/p&gt;
&lt;p&gt;if it becomes confused by:&lt;/p&gt;
&lt;p&gt;DIR &amp;quot;Home:My Folder&amp;quot;&lt;/p&gt;
&lt;p&gt;or silently truncates something it does not understand.&lt;/p&gt;
&lt;p&gt;The boring cases are where trust comes from.&lt;/p&gt;
&lt;h2 id=&quot;the-vertical-test-matters-more-than-the-command-list&quot;&gt;The vertical test matters more than the command list&lt;/h2&gt;
&lt;p&gt;There is one test I particularly want for NuDOS because it crosses several systems at once.&lt;/p&gt;
&lt;p&gt;The idea is simple:&lt;/p&gt;
&lt;p&gt;Open NuBASIC.&lt;/p&gt;
&lt;p&gt;Create something.&lt;/p&gt;
&lt;p&gt;Save it.&lt;/p&gt;
&lt;p&gt;Open NuDOS.&lt;/p&gt;
&lt;p&gt;Find the same object.&lt;/p&gt;
&lt;p&gt;Inspect it.&lt;/p&gt;
&lt;p&gt;Reboot Ceylon.&lt;/p&gt;
&lt;p&gt;Load it again.&lt;/p&gt;
&lt;p&gt;Run it.&lt;/p&gt;
&lt;p&gt;That is not really a NuDOS test.&lt;/p&gt;
&lt;p&gt;It is not really a NuBASIC test either.&lt;/p&gt;
&lt;p&gt;It is a computer test.&lt;/p&gt;
&lt;p&gt;It exercises application behavior, object/file storage, the command environment, persistence, reboot recovery, and the relationships between all of them.&lt;/p&gt;
&lt;p&gt;If every individual subsystem says PASS but that sequence fails, the system is not done.&lt;/p&gt;
&lt;p&gt;That is exactly the kind of vertical test we are going to keep adding.&lt;/p&gt;
&lt;h2 id=&quot;the-rules-are-changing-because-the-project-is-changing&quot;&gt;The rules are changing because the project is changing&lt;/h2&gt;
&lt;p&gt;One result of all this has been a tightening of the engineering rules.&lt;/p&gt;
&lt;p&gt;Earlier in the project, a working demonstration was often enough to justify moving forward.&lt;/p&gt;
&lt;p&gt;That made sense when the primary question was:&lt;/p&gt;
&lt;p&gt;Can this architecture work at all?&lt;/p&gt;
&lt;p&gt;We are past that stage in a lot of areas.&lt;/p&gt;
&lt;p&gt;The question is increasingly:&lt;/p&gt;
&lt;p&gt;Can this architecture work repeatedly, under the intended authority model, across failure and restart, with enough evidence that we know what actually happened?&lt;/p&gt;
&lt;p&gt;That requires a higher standard.&lt;/p&gt;
&lt;p&gt;&amp;quot;Code exists&amp;quot; is not completion.&lt;/p&gt;
&lt;p&gt;&amp;quot;Tests pass&amp;quot; is not completion.&lt;/p&gt;
&lt;p&gt;&amp;quot;A screenshot appeared&amp;quot; is not completion.&lt;/p&gt;
&lt;p&gt;For important functionality, completion increasingly means the requirement exists, the implementation matches it, the target behavior is demonstrated, the negative cases are exercised, the integrated path is tested, and the result is reproducible.&lt;/p&gt;
&lt;p&gt;That is a lot less exciting than declaring victory after the first successful run.&lt;/p&gt;
&lt;p&gt;It is also how I would rather find problems now than six months from now.&lt;/p&gt;
&lt;h2 id=&quot;diagnostics-need-to-test-the-tester&quot;&gt;Diagnostics need to test the tester&lt;/h2&gt;
&lt;p&gt;We are also keeping one particularly important rule from the failures that got us here:&lt;/p&gt;
&lt;p&gt;the diagnostic itself has to prove that it can fail.&lt;/p&gt;
&lt;p&gt;If a test is supposed to reject a stale generation, give it one.&lt;/p&gt;
&lt;p&gt;If a test is supposed to catch an invalid identity, send one.&lt;/p&gt;
&lt;p&gt;If a service is supposed to fail closed when a dependency disappears, remove the dependency.&lt;/p&gt;
&lt;p&gt;If the diagnostic still returns PASS, we did not prove the system.&lt;/p&gt;
&lt;p&gt;We proved the test is optimistic.&lt;/p&gt;
&lt;p&gt;This sounds almost silly when written out.&lt;/p&gt;
&lt;p&gt;It is surprisingly easy not to do.&lt;/p&gt;
&lt;p&gt;Most tests are written to demonstrate success.&lt;/p&gt;
&lt;p&gt;We are deliberately trying to write more tests that demonstrate the ability to recognize failure.&lt;/p&gt;
&lt;h2 id=&quot;the-eventual-goal-is-a-diagnostic-mode-for-the-whole-machine&quot;&gt;The eventual goal is a diagnostic mode for the whole machine&lt;/h2&gt;
&lt;p&gt;As this develops, I want Ceylon to be able to perform several levels of health checking.&lt;/p&gt;
&lt;p&gt;A quick check should answer whether the important subsystems are alive.&lt;/p&gt;
&lt;p&gt;A focused diagnostic should be able to drill into one area.&lt;/p&gt;
&lt;p&gt;A full-system diagnostic should walk the important service relationships.&lt;/p&gt;
&lt;p&gt;Longer runs should exercise soak, restart, reincarnation, stale-state rejection, resource exhaustion, and other failure behavior.&lt;/p&gt;
&lt;p&gt;And the results should be useful after the fact.&lt;/p&gt;
&lt;p&gt;Not:&lt;/p&gt;
&lt;p&gt;ERROR 12&lt;/p&gt;
&lt;p&gt;and good luck.&lt;/p&gt;
&lt;p&gt;The machine should be able to tell us what it was testing, what it expected, what actually happened, and where the path diverged.&lt;/p&gt;
&lt;p&gt;That will be useful during development.&lt;/p&gt;
&lt;p&gt;It will also eventually be useful for support.&lt;/p&gt;
&lt;p&gt;There is a big difference between a user saying:&lt;/p&gt;
&lt;p&gt;&amp;quot;the computer doesn&apos;t work&amp;quot;&lt;/p&gt;
&lt;p&gt;and a diagnostic saying:&lt;/p&gt;
&lt;p&gt;&amp;quot;storage provider is healthy, filesystem is mounted, application launch is healthy, but this particular client cannot reattach after provider generation changed.&amp;quot;&lt;/p&gt;
&lt;p&gt;One of those ruins your afternoon.&lt;/p&gt;
&lt;p&gt;The other gives you somewhere to start.&lt;/p&gt;
&lt;h2 id=&quot;this-is-slower-on-purpose&quot;&gt;This is slower on purpose&lt;/h2&gt;
&lt;p&gt;There is always pressure in a project like this to move to the visible thing.&lt;/p&gt;
&lt;p&gt;Finish the desktop.&lt;/p&gt;
&lt;p&gt;Launch the applications.&lt;/p&gt;
&lt;p&gt;Make the video.&lt;/p&gt;
&lt;p&gt;Get the Alpha out.&lt;/p&gt;
&lt;p&gt;I want all of that too.&lt;/p&gt;
&lt;p&gt;But we have now seen enough cases where &amp;quot;looks finished&amp;quot; and &amp;quot;is finished&amp;quot; were not the same thing.&lt;/p&gt;
&lt;p&gt;So some of the work right now is intentionally slowing us down.&lt;/p&gt;
&lt;p&gt;We are identifying incomplete code.&lt;/p&gt;
&lt;p&gt;We are testing the communication between systems.&lt;/p&gt;
&lt;p&gt;We are tightening specifications.&lt;/p&gt;
&lt;p&gt;We are adding negative cases.&lt;/p&gt;
&lt;p&gt;We are defining vertical tests.&lt;/p&gt;
&lt;p&gt;And when something fails, we are trying to fix the reason it failed instead of teaching the test not to complain.&lt;/p&gt;
&lt;p&gt;It is a good thing I am ex-Navy.&lt;/p&gt;
&lt;p&gt;I have a fairly extensive vocabulary available for the moments when that distinction becomes inconvenient.&lt;/p&gt;
&lt;h2 id=&quot;where-we-ended-october-3&quot;&gt;Where we ended October 3&lt;/h2&gt;
&lt;p&gt;The biggest result today was not one repaired subsystem.&lt;/p&gt;
&lt;p&gt;It was a clearer development rule.&lt;/p&gt;
&lt;p&gt;Ceylon has to prove itself at three levels:&lt;/p&gt;
&lt;p&gt;the component,&lt;/p&gt;
&lt;p&gt;the connection between components,&lt;/p&gt;
&lt;p&gt;and:&lt;/p&gt;
&lt;p&gt;the complete user-visible behavior.&lt;/p&gt;
&lt;p&gt;NuDOS is currently giving us a useful place to apply that discipline because its job touches the Terminal, session state, filesystem, application launch, diagnostics, and persistence.&lt;/p&gt;
&lt;p&gt;The broader diagnostic system will carry the same idea across the rest of Ceylon.&lt;/p&gt;
&lt;p&gt;That means more work now.&lt;/p&gt;
&lt;p&gt;It also means fewer mystery successes.&lt;/p&gt;
&lt;p&gt;I am becoming deeply suspicious of mystery successes.&lt;/p&gt;
&lt;p&gt;They usually turn into tomorrow&apos;s bug report.&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Retrocomputing</category><category>Operating Systems</category><category>Diagnostics</category><category>NuDOS</category><category>Testing</category><category>Architecture</category><category>Reliability</category><author>Mike</author></item><item><title>Project Ceylon Development Log — October 2, 2026: Tested Good. Except for the Part Where It Wasn&apos;t.</title><link>https://ceylonprojectng.com/journal/project-ceylon-development-log-october-2-2026-tested-good-except-for-the-part-where-it-wasnt/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/project-ceylon-development-log-october-2-2026-tested-good-except-for-the-part-where-it-wasnt/</guid><description>I&apos;ve spent an extraordinary amount of time lately testing things that have already been tested.</description><pubDate>Fri, 02 Oct 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I&apos;ve spent an extraordinary amount of time lately testing things that have already been tested.&lt;/p&gt;
&lt;p&gt;That sounds stupid.&lt;/p&gt;
&lt;p&gt;Unfortunately, it has also been productive.&lt;/p&gt;
&lt;p&gt;As Ceylon has grown, we&apos;ve started putting much more emphasis on testing the computer as a complete system instead of proving individual pieces in isolation. That work continued today: building out the system-level diagnostic and qualification approach, exercising communication between services, looking for incomplete implementation paths, and following failures far enough upstream to understand why they existed in the first place.&lt;/p&gt;
&lt;p&gt;We&apos;re getting considerably better at finding problems.&lt;/p&gt;
&lt;p&gt;I&apos;d be lying if I said I was always thrilled about what we&apos;re finding.&lt;/p&gt;
&lt;p&gt;It&apos;s probably a good thing I&apos;m ex-Navy. I have enough expletives in reserve to cover almost any engineering situation.&lt;/p&gt;
&lt;p&gt;Some of them got exercised today.&lt;/p&gt;
&lt;h2 id=&quot;tested-good-has-acquired-an-asterisk&quot;&gt;&amp;quot;Tested good&amp;quot; has acquired an asterisk&lt;/h2&gt;
&lt;p&gt;One of today&apos;s more frustrating examples involved storage.&lt;/p&gt;
&lt;p&gt;We spent several hours troubleshooting something that, according to the existing evidence, was already good.&lt;/p&gt;
&lt;p&gt;Eventually we got far enough down the rabbit hole to discover part of the problem: code involved in that path was still effectively development-level implementation. It had been sufficient for the testing being performed at the time, but it had never subsequently been brought all the way up to the standard the finished subsystem actually required.&lt;/p&gt;
&lt;p&gt;That&apos;s an ugly class of problem.&lt;/p&gt;
&lt;p&gt;I don&apos;t think somebody sat down and deliberately decided to cheat a test. The more likely explanation is considerably more mundane and therefore more useful: development code was written to get a path working, the test passed, attention moved somewhere else, and nobody came back later to ask whether the code that made the test pass was actually suitable for the finished system.&lt;/p&gt;
&lt;p&gt;That is exactly the sort of oversight we&apos;re trying to eliminate.&lt;/p&gt;
&lt;p&gt;The annoying part is that the test wasn&apos;t necessarily lying.&lt;/p&gt;
&lt;p&gt;It may have accurately demonstrated what it was designed to demonstrate.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;We just hadn&apos;t asked it enough questions.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;thats-becoming-the-real-engineering-problem&quot;&gt;That&apos;s becoming the real engineering problem&lt;/h2&gt;
&lt;p&gt;Ceylon has enough pieces now that component testing alone isn&apos;t sufficient.&lt;/p&gt;
&lt;p&gt;A storage service can pass its tests. A filesystem component can pass its tests. IPC can pass its tests. A client can pass its tests. Put them together, exercise a path nobody thought was particularly interesting, and suddenly two components disagree about something that each assumed the other one handled.&lt;/p&gt;
&lt;p&gt;That is where more of the work is moving.&lt;/p&gt;
&lt;p&gt;We&apos;re testing inter-system communication and deliberately looking at the seams: what one service sends, what another thinks it received, who owns state, what happens after something restarts, whether incomplete paths are reachable, and whether a successful result actually represents the operation we think it does.&lt;/p&gt;
&lt;p&gt;When one of those tests fails, we&apos;re also getting stricter about not simply fixing the immediate failure.&lt;/p&gt;
&lt;p&gt;We want to know why the bad code was there, why it wasn&apos;t caught earlier, whether the specification or implementation was incomplete, whether the test was too narrow, and whether a temporary development shortcut became permanent by accident.&lt;/p&gt;
&lt;p&gt;Then comes the question that matters most:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What do we change so we don&apos;t make the same mistake somewhere else?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That is becoming part of the development process itself.&lt;/p&gt;
&lt;p&gt;We&apos;re not just fixing Ceylon.&lt;/p&gt;
&lt;p&gt;We&apos;re fixing the way we build Ceylon.&lt;/p&gt;
&lt;h2 id=&quot;nudos-walked-into-this-at-exactly-the-right-time&quot;&gt;NuDOS walked into this at exactly the right time&lt;/h2&gt;
&lt;p&gt;NuDOS was another substantial piece of today&apos;s work.&lt;/p&gt;
&lt;p&gt;We&apos;re working toward a much more complete specification for Ceylon&apos;s command environment, including the actual logic, behavior, failure cases and interfaces required to implement it.&lt;/p&gt;
&lt;p&gt;The first gap analysis found plenty to work on. An adversarial pass found more.&lt;/p&gt;
&lt;p&gt;Questions that sound trivial at the command-line level become much less trivial when they touch a real capability-based operating system. COPY, for example, isn&apos;t finished when two files happen to contain the same bytes. We have to define what happens if the source changes, storage fills, authority disappears, an operation is cancelled halfway through, or a provider dies while the command is waiting for it.&lt;/p&gt;
&lt;p&gt;We also did some executable work around the command grammar. The host-side model survived the golden cases, 5,000 seeded quoting round trips, 10,000 seeded arbitrary inputs, and explicit boundary testing around malformed or oversized input.&lt;/p&gt;
&lt;p&gt;Useful evidence.&lt;/p&gt;
&lt;p&gt;But after the lessons of the last few weeks, nobody gets to point at that result and say, &amp;quot;NuDOS works.&amp;quot;&lt;/p&gt;
&lt;p&gt;The more important decision was about what happens later.&lt;/p&gt;
&lt;p&gt;NuDOS won&apos;t be considered finished until it has been exercised as part of Ceylon itself. That means real Terminal input, real storage, real application launching, multiple sessions, failures and restarts, persistence across reboot, and interaction with the same system objects the graphical environment uses.&lt;/p&gt;
&lt;p&gt;A useful end-to-end example is NuBASIC creating and saving something, NuDOS seeing and manipulating the same object, and the result surviving a reboot and working afterward.&lt;/p&gt;
&lt;p&gt;That&apos;s one test scenario, not a fifteen-line dramatic reading of one.&lt;/p&gt;
&lt;p&gt;I&apos;m learning.&lt;/p&gt;
&lt;h2 id=&quot;the-specification-isnt-really-the-frustrating-part&quot;&gt;The specification isn&apos;t really the frustrating part&lt;/h2&gt;
&lt;p&gt;There are still gaps in the NuDOS specification, and that&apos;s fine.&lt;/p&gt;
&lt;p&gt;I&apos;d much rather write &lt;strong&gt;UNKNOWN&lt;/strong&gt; beside an interface than invent something plausible and discover later that I specified an operating system we don&apos;t have.&lt;/p&gt;
&lt;p&gt;The frustrating part is discovering that the system underneath a new component isn&apos;t always as ready for that component as our previous evidence suggested.&lt;/p&gt;
&lt;p&gt;That&apos;s the bigger problem we&apos;re dealing with now.&lt;/p&gt;
&lt;p&gt;Before NuDOS—or any other major A1 component—can simply be dropped into place, the underlying services need to be trustworthy enough that we&apos;re not debugging three unrelated layers every time the new component exercises an old path differently.&lt;/p&gt;
&lt;p&gt;So we&apos;re going back through those paths.&lt;/p&gt;
&lt;p&gt;We&apos;re testing them together, finding incomplete code, finding assumptions, finding places where development scaffolding survived longer than intended, and finding tests that proved something narrower than we thought they proved.&lt;/p&gt;
&lt;p&gt;Then we&apos;re fixing the implementation &lt;strong&gt;and&lt;/strong&gt; tightening the engineering process that allowed the problem through.&lt;/p&gt;
&lt;p&gt;It&apos;s tedious.&lt;/p&gt;
&lt;p&gt;Occasionally it inspires colorful nautical terminology.&lt;/p&gt;
&lt;p&gt;But it&apos;s working.&lt;/p&gt;
&lt;h2 id=&quot;were-getting-better-at-finding-our-own-mistakes&quot;&gt;We&apos;re getting better at finding our own mistakes&lt;/h2&gt;
&lt;p&gt;There is a strange kind of progress happening here.&lt;/p&gt;
&lt;p&gt;Every day we seem to get better at making Ceylon fail.&lt;/p&gt;
&lt;p&gt;A month ago, that sentence would have sounded terrible.&lt;/p&gt;
&lt;p&gt;Now I think it&apos;s one of the healthiest things happening in the project.&lt;/p&gt;
&lt;p&gt;The system-level testing is becoming more aggressive. The diagnostic tooling is becoming more useful. We&apos;re paying more attention to communication between components instead of only their behavior in isolation. We&apos;re tracing failures to root causes instead of stopping at the first broken assertion. And when the root cause exposes a weakness in our engineering rules, we&apos;re changing the rules.&lt;/p&gt;
&lt;p&gt;That doesn&apos;t mean we&apos;re going to stop making mistakes.&lt;/p&gt;
&lt;p&gt;This is an operating system. If I ever announce that we&apos;ve developed a process that prevents programmers from overlooking things, somebody should probably check me for a head injury.&lt;/p&gt;
&lt;p&gt;The goal is to make those mistakes harder to hide.&lt;/p&gt;
&lt;p&gt;A development shortcut shouldn&apos;t be able to quietly become production architecture because the associated test happened to turn green.&lt;/p&gt;
&lt;p&gt;An incomplete subsystem shouldn&apos;t be called complete because every implemented function works.&lt;/p&gt;
&lt;p&gt;And two independently tested components shouldn&apos;t automatically be assumed to work together.&lt;/p&gt;
&lt;p&gt;We&apos;re learning how to ask nastier questions.&lt;/p&gt;
&lt;h2 id=&quot;which-is-good-because-the-computer-is-answering-them&quot;&gt;Which is good, because the computer is answering them&lt;/h2&gt;
&lt;p&gt;Some of the answers today required vocabulary that will not be reproduced on the Project Ceylon website.&lt;/p&gt;
&lt;p&gt;Again: ex-Navy.&lt;/p&gt;
&lt;p&gt;We&apos;re covered.&lt;/p&gt;
&lt;p&gt;But I&apos;d rather spend several aggravating hours discovering that &amp;quot;tested good&amp;quot; wasn&apos;t good enough now than build another layer on top of it and discover the same thing six months from now.&lt;/p&gt;
&lt;p&gt;The objective hasn&apos;t changed.&lt;/p&gt;
&lt;p&gt;I don&apos;t want a collection of components that can each demonstrate that they work.&lt;/p&gt;
&lt;p&gt;I want a computer that works.&lt;/p&gt;
&lt;p&gt;Right now, getting there means spending an uncomfortable amount of time proving where it doesn&apos;t.&lt;/p&gt;
&lt;p&gt;And we&apos;re getting pretty damn good at that.&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Retrocomputing</category><category>Operating Systems</category><category>NuDOS</category><category>Testing</category><category>Storage</category><category>System Integration</category><author>Mike</author></item><item><title>Project Ceylon Development Log — October 1, 2026: The Mouse Moved, Asteroids Is Real, and the Hardware Stopped Sitting Still</title><link>https://ceylonprojectng.com/journal/project-ceylon-development-log-october-1-2026-the-mouse-moved-asteroids-is-real-and-the-hardware-stopped-sitting-still/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/project-ceylon-development-log-october-1-2026-the-mouse-moved-asteroids-is-real-and-the-hardware-stopped-sitting-still/</guid><description>Today was one of those days where several things that had been &quot;almost there&quot; finally became a lot more concrete.</description><pubDate>Thu, 01 Oct 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Today was one of those days where several things that had been &amp;quot;almost there&amp;quot; finally became a lot more concrete.&lt;/p&gt;
&lt;p&gt;The short version:&lt;/p&gt;
&lt;p&gt;the real keyboard and pointer path passed, the Asteroids demo turned out to be a real application core instead of a future placeholder, and Clarise proved the same Ceylon image can cope with different PCI resource layouts without rebuilding the operating system around them.&lt;/p&gt;
&lt;p&gt;That is a fairly satisfying day.&lt;/p&gt;
&lt;p&gt;Especially because all three of those things point at the same larger goal:&lt;/p&gt;
&lt;p&gt;Ceylon needs to stop behaving like a carefully staged demonstration and start behaving like a computer.&lt;/p&gt;
&lt;h2 id=&quot;the-mouse-problem-was-not-a-mouse-problem&quot;&gt;The mouse problem was not a mouse problem&lt;/h2&gt;
&lt;p&gt;The first win was NuGUI input.&lt;/p&gt;
&lt;p&gt;Keyboard input has been working for a while, and the pointer path has been under qualification for several development tranches.&lt;/p&gt;
&lt;p&gt;Today the remaining QEMU tablet issue finally got pinned down.&lt;/p&gt;
&lt;p&gt;The parser was rejecting the virtual tablet because it reported itself as:&lt;/p&gt;
&lt;p&gt;class 3, subclass 0, protocol 0&lt;/p&gt;
&lt;p&gt;That was enough to send the existing HID logic down the wrong path.&lt;/p&gt;
&lt;p&gt;Nothing particularly dramatic was wrong with the mouse.&lt;/p&gt;
&lt;p&gt;The machine was simply looking at a perfectly valid HID device and deciding:&lt;/p&gt;
&lt;p&gt;&amp;quot;Nope. I don&apos;t know what that is.&amp;quot;&lt;/p&gt;
&lt;p&gt;Which, in retrospect, is a wonderfully accurate description of quite a bit of operating-system development.&lt;/p&gt;
&lt;p&gt;The parser was corrected.&lt;/p&gt;
&lt;p&gt;Then we went back through the actual path instead of declaring victory because one pointer event appeared.&lt;/p&gt;
&lt;h2 id=&quot;the-input-path-is-now-real&quot;&gt;The input path is now real&lt;/h2&gt;
&lt;p&gt;The path being qualified is the one I actually care about:&lt;/p&gt;
&lt;p&gt;QEMU virtual USB device → xHCI controller → Ceylon HID provider → semantic input service → bounded transport → NuGUI&lt;/p&gt;
&lt;p&gt;No shortcut that writes fake mouse movement directly into the GUI.&lt;/p&gt;
&lt;p&gt;No host-side test pretending to be the target.&lt;/p&gt;
&lt;p&gt;No &amp;quot;we proved the parser works, therefore the desktop works.&amp;quot;&lt;/p&gt;
&lt;p&gt;The complete keyboard and pointer transport passed.&lt;/p&gt;
&lt;p&gt;Then it stayed up under an 11-minute soak.&lt;/p&gt;
&lt;p&gt;The broader workspace test run completed:&lt;/p&gt;
&lt;p&gt;480 tests, 0 failures.&lt;/p&gt;
&lt;p&gt;And the existing Nu-Iris R2 through R8 regression sets stayed green.&lt;/p&gt;
&lt;p&gt;That last part matters because input work should not quietly damage the display path while everybody is celebrating that the mouse moved.&lt;/p&gt;
&lt;p&gt;So this is a genuine milestone.&lt;/p&gt;
&lt;p&gt;Not &amp;quot;pointer code exists.&amp;quot;&lt;/p&gt;
&lt;p&gt;Not &amp;quot;a cursor twitched.&amp;quot;&lt;/p&gt;
&lt;p&gt;The underlying interactive path is now behaving like something we can build on.&lt;/p&gt;
&lt;h2 id=&quot;next-comes-focus-which-sounds-easier-than-it-is&quot;&gt;Next comes focus, which sounds easier than it is&lt;/h2&gt;
&lt;p&gt;The next NuGUI step is focus routing and static application activation.&lt;/p&gt;
&lt;p&gt;That sounds almost trivial.&lt;/p&gt;
&lt;p&gt;Click a window.&lt;/p&gt;
&lt;p&gt;That window gets input.&lt;/p&gt;
&lt;p&gt;Launch an application.&lt;/p&gt;
&lt;p&gt;It becomes active.&lt;/p&gt;
&lt;p&gt;Done.&lt;/p&gt;
&lt;p&gt;Except operating systems have a way of turning every sentence containing the word &amp;quot;just&amp;quot; into a week of work.&lt;/p&gt;
&lt;p&gt;Focus has to answer questions like:&lt;/p&gt;
&lt;p&gt;Which application owns keyboard input right now?&lt;/p&gt;
&lt;p&gt;What happens when a window disappears?&lt;/p&gt;
&lt;p&gt;What happens when an application crashes?&lt;/p&gt;
&lt;p&gt;Can stale input reach a replacement instance?&lt;/p&gt;
&lt;p&gt;What happens when pointer focus and keyboard focus differ?&lt;/p&gt;
&lt;p&gt;What does activation mean if the application has restarted?&lt;/p&gt;
&lt;p&gt;Those are not glamorous questions.&lt;/p&gt;
&lt;p&gt;But they are the difference between a desktop that usually works and one that occasionally types your command into the wrong application.&lt;/p&gt;
&lt;p&gt;The important part is that we have reached that layer now.&lt;/p&gt;
&lt;p&gt;We are no longer debugging whether QEMU can produce a pointer packet.&lt;/p&gt;
&lt;p&gt;We are deciding what the operating system should do with it.&lt;/p&gt;
&lt;p&gt;That is progress.&lt;/p&gt;
&lt;h2 id=&quot;then-i-went-looking-for-asteroids&quot;&gt;Then I went looking for Asteroids&lt;/h2&gt;
&lt;p&gt;A1 Alpha is supposed to include a simple Asteroids-style demo as a lightweight native proof-of-life application.&lt;/p&gt;
&lt;p&gt;The idea is deliberately modest.&lt;/p&gt;
&lt;p&gt;Juggernaut is the heavier game workload.&lt;/p&gt;
&lt;p&gt;Asteroids is supposed to answer a much simpler question:&lt;/p&gt;
&lt;p&gt;Can Ceylon run a small, responsive native arcade application cleanly?&lt;/p&gt;
&lt;p&gt;Input.&lt;/p&gt;
&lt;p&gt;Timing.&lt;/p&gt;
&lt;p&gt;Rendering.&lt;/p&gt;
&lt;p&gt;Collisions.&lt;/p&gt;
&lt;p&gt;Score.&lt;/p&gt;
&lt;p&gt;Sound.&lt;/p&gt;
&lt;p&gt;Nothing fancy.&lt;/p&gt;
&lt;p&gt;Today I went looking for the actual state of that work.&lt;/p&gt;
&lt;p&gt;And found something better than I expected.&lt;/p&gt;
&lt;p&gt;There is already a packaged source drop:&lt;/p&gt;
&lt;p&gt;CeylonAsteroids-0.1.0-drawer-package.zip&lt;/p&gt;
&lt;p&gt;And it is not just a README and a future plan.&lt;/p&gt;
&lt;p&gt;There is a real game core.&lt;/p&gt;
&lt;p&gt;A CPU renderer.&lt;/p&gt;
&lt;p&gt;Tests.&lt;/p&gt;
&lt;p&gt;A host development demo.&lt;/p&gt;
&lt;p&gt;And integration documentation explaining how the application is supposed to connect to Ceylon.&lt;/p&gt;
&lt;p&gt;That was a pleasant surprise.&lt;/p&gt;
&lt;p&gt;Asteroids exists. It just does not live in Ceylon yet.&lt;/p&gt;
&lt;p&gt;The distinction is important.&lt;/p&gt;
&lt;p&gt;The game itself is substantially there.&lt;/p&gt;
&lt;p&gt;The missing part is the Ceylon target adapter.&lt;/p&gt;
&lt;p&gt;That means we still need to connect the portable game core to the operating-system services around it.&lt;/p&gt;
&lt;p&gt;Specifically, it still needs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a Ceylon target binary / protection domain;&lt;/li&gt;
&lt;li&gt;a NuGUI window;&lt;/li&gt;
&lt;li&gt;an application activation endpoint;&lt;/li&gt;
&lt;li&gt;semantic input mapped into the game&apos;s InputState;&lt;/li&gt;
&lt;li&gt;the Ceylon timer path driving Game::step();&lt;/li&gt;
&lt;li&gt;a pixel buffer connected to the game&apos;s renderer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In other words, the game logic is not the blocker.&lt;/p&gt;
&lt;p&gt;The operating-system integration is.&lt;/p&gt;
&lt;p&gt;That is actually exactly where I hoped we would be at this stage.&lt;/p&gt;
&lt;p&gt;I want application developers to be able to build most of their logic without having to run the entire operating system every time they change one line.&lt;/p&gt;
&lt;p&gt;Then the Ceylon adapter should connect that logic to the native platform.&lt;/p&gt;
&lt;p&gt;Asteroids is turning into a nice test of whether that application model is actually practical.&lt;/p&gt;
&lt;h2 id=&quot;this-may-become-the-first-really-obvious-desktop-proof&quot;&gt;This may become the first really obvious desktop proof&lt;/h2&gt;
&lt;p&gt;There is something appealing about using Asteroids as the first simple application activation target.&lt;/p&gt;
&lt;p&gt;A text editor can prove a lot.&lt;/p&gt;
&lt;p&gt;A settings window can prove a lot.&lt;/p&gt;
&lt;p&gt;A terminal can prove a lot.&lt;/p&gt;
&lt;p&gt;But an arcade game makes failures obvious.&lt;/p&gt;
&lt;p&gt;If input is delayed, you know.&lt;/p&gt;
&lt;p&gt;If timing is wrong, you know.&lt;/p&gt;
&lt;p&gt;If rendering tears or stalls, you know.&lt;/p&gt;
&lt;p&gt;If focus gets confused, your spaceship starts doing something stupid immediately.&lt;/p&gt;
&lt;p&gt;And, perhaps most importantly for a project page, it is a lot easier to show somebody a moving ship and flying rocks than it is to show them a correctly bounded IPC queue.&lt;/p&gt;
&lt;p&gt;Both matter.&lt;/p&gt;
&lt;p&gt;Only one of them makes a decent GIF.&lt;/p&gt;
&lt;h2 id=&quot;clarise-also-had-a-good-day&quot;&gt;Clarise also had a good day&lt;/h2&gt;
&lt;p&gt;The other major result today came from Clarise, Ceylon&apos;s Plug-and-Play/device-management work.&lt;/p&gt;
&lt;p&gt;One of the problems we have been steadily trying to eliminate is the idea that Ceylon should only work when PCI devices appear at the exact addresses we happened to see during one QEMU run.&lt;/p&gt;
&lt;p&gt;That is not Plug-and-Play.&lt;/p&gt;
&lt;p&gt;That is a very elaborate static configuration file.&lt;/p&gt;
&lt;p&gt;Clarise Stage 2 pushed against that assumption.&lt;/p&gt;
&lt;p&gt;The current model uses runtime PCI discovery and generation-qualified device bindings rather than treating one set of BAR addresses as universal truth.&lt;/p&gt;
&lt;p&gt;Today the same Ceylon system image was exercised against two different BAR layouts.&lt;/p&gt;
&lt;p&gt;It passed both.&lt;/p&gt;
&lt;p&gt;No rebuilding the image around the new addresses.&lt;/p&gt;
&lt;p&gt;No editing one magic constant until the device appeared.&lt;/p&gt;
&lt;p&gt;The device resources were discovered and bound dynamically.&lt;/p&gt;
&lt;p&gt;That is exactly what I want.&lt;/p&gt;
&lt;h2 id=&quot;same-image-different-machine-layout&quot;&gt;Same image, different machine layout&lt;/h2&gt;
&lt;p&gt;This may be one of those milestones that sounds less important than it is.&lt;/p&gt;
&lt;p&gt;Virtual hardware moves around.&lt;/p&gt;
&lt;p&gt;Physical hardware definitely moves around.&lt;/p&gt;
&lt;p&gt;Firmware changes resource allocation.&lt;/p&gt;
&lt;p&gt;A different device topology can shift PCI BARs.&lt;/p&gt;
&lt;p&gt;Add an audio device and suddenly something else may land somewhere different.&lt;/p&gt;
&lt;p&gt;We have already been bitten by this more than once.&lt;/p&gt;
&lt;p&gt;So the test today was intentionally simple:&lt;/p&gt;
&lt;p&gt;Can the same Ceylon image deal with two legitimate resource layouts?&lt;/p&gt;
&lt;p&gt;Yes.&lt;/p&gt;
&lt;p&gt;The current bounded aperture covered the expected range, and the runtime binding model correctly handled the devices in both configurations.&lt;/p&gt;
&lt;p&gt;The qualification also included a little over 20 minutes of soak time.&lt;/p&gt;
&lt;p&gt;That does not mean Plug-and-Play is finished.&lt;/p&gt;
&lt;p&gt;It means another hard-coded assumption is disappearing.&lt;/p&gt;
&lt;p&gt;And every one of those we remove makes the future bare-metal work a little less terrifying.&lt;/p&gt;
&lt;h2 id=&quot;the-three-stories-are-actually-the-same-story&quot;&gt;The three stories are actually the same story&lt;/h2&gt;
&lt;p&gt;At first glance, today looks like three unrelated development threads.&lt;/p&gt;
&lt;p&gt;Input.&lt;/p&gt;
&lt;p&gt;Asteroids.&lt;/p&gt;
&lt;p&gt;PCI discovery.&lt;/p&gt;
&lt;p&gt;But they all point in the same direction.&lt;/p&gt;
&lt;p&gt;The first version of Ceylon was necessarily full of fixed assumptions.&lt;/p&gt;
&lt;p&gt;One display.&lt;/p&gt;
&lt;p&gt;One known machine.&lt;/p&gt;
&lt;p&gt;One expected resource layout.&lt;/p&gt;
&lt;p&gt;One manually controlled application path.&lt;/p&gt;
&lt;p&gt;That is normal when you are trying to prove anything works at all.&lt;/p&gt;
&lt;p&gt;But a real operating system cannot stay there.&lt;/p&gt;
&lt;p&gt;A pointer device has to be discovered and interpreted rather than faked.&lt;/p&gt;
&lt;p&gt;An application has to be activated and connected to services rather than hand-wired into a demo.&lt;/p&gt;
&lt;p&gt;Hardware has to be bound based on what actually exists rather than where it existed last Tuesday.&lt;/p&gt;
&lt;p&gt;That is the transition we are making now.&lt;/p&gt;
&lt;p&gt;From:&lt;/p&gt;
&lt;p&gt;&amp;quot;Can I make this path work?&amp;quot;&lt;/p&gt;
&lt;p&gt;to:&lt;/p&gt;
&lt;p&gt;&amp;quot;Can the operating system make this path work without me standing next to it?&amp;quot;&lt;/p&gt;
&lt;p&gt;That second question is much closer to a product.&lt;/p&gt;
&lt;h2 id=&quot;what-is-next&quot;&gt;What is next&lt;/h2&gt;
&lt;p&gt;For NuGUI, the immediate work is focus routing and static application activation.&lt;/p&gt;
&lt;p&gt;For Asteroids, that means building the actual Ceylon adapter and making it one of the first applications launched through the real desktop path.&lt;/p&gt;
&lt;p&gt;For Clarise, the dynamic binding work continues toward broader Plug-and-Play authority and lifecycle handling.&lt;/p&gt;
&lt;p&gt;And importantly, none of today&apos;s work required changing Nu-Iris.&lt;/p&gt;
&lt;p&gt;The display regressions stayed green while the input path moved forward.&lt;/p&gt;
&lt;p&gt;I am increasingly fond of days where one subsystem improves without requiring emergency surgery on three others.&lt;/p&gt;
&lt;p&gt;That feels suspiciously like maturity.&lt;/p&gt;
&lt;p&gt;I don&apos;t want to get carried away.&lt;/p&gt;
&lt;h2 id=&quot;where-we-ended-the-night&quot;&gt;Where we ended the night&lt;/h2&gt;
&lt;p&gt;The keyboard works through the real path.&lt;/p&gt;
&lt;p&gt;The pointer works through the real path.&lt;/p&gt;
&lt;p&gt;The input stack survived its soak and regression suite.&lt;/p&gt;
&lt;p&gt;The Asteroids demo is no longer an idea on the Alpha checklist; there is a real portable game core waiting for its Ceylon adapter.&lt;/p&gt;
&lt;p&gt;And the device-management work proved that one system image can survive more than one PCI BAR layout without being rebuilt around the hardware.&lt;/p&gt;
&lt;p&gt;None of those things, individually, is the dramatic &amp;quot;Ceylon is alive&amp;quot; screenshot I am chasing.&lt;/p&gt;
&lt;p&gt;Together, though, they are exactly how we get there.&lt;/p&gt;
&lt;p&gt;A machine that can discover its hardware.&lt;/p&gt;
&lt;p&gt;Accept real input.&lt;/p&gt;
&lt;p&gt;Activate a native application.&lt;/p&gt;
&lt;p&gt;Give that application a window.&lt;/p&gt;
&lt;p&gt;Feed it time and controls.&lt;/p&gt;
&lt;p&gt;And let the user shoot rocks until something breaks.&lt;/p&gt;
&lt;p&gt;Honestly, that sounds like a pretty good next milestone.&lt;/p&gt;
&lt;p&gt;Project Ceylon is an independent retro-futurist operating-system project exploring what a modern creative workstation might look like if some of the best ideas of earlier personal computers had continued evolving instead of being discarded.&lt;/p&gt;
&lt;p&gt;Project site: ceylonprojectng.com&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Retrocomputing</category><category>Operating Systems</category><category>NuGUI</category><category>Input</category><category>Asteroids</category><category>Clarise</category><category>Plug-and-Play</category><category>QEMU</category><author>Mike</author></item><item><title>Project Ceylon Development Log — September 29, 2026: The Website Is Real. So Is the Next Display Bug.</title><link>https://ceylonprojectng.com/journal/project-ceylon-development-log-september-29-2026-the-website-is-real-so-is-the-next-display-bug/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/project-ceylon-development-log-september-29-2026-the-website-is-real-so-is-the-next-display-bug/</guid><description>Yesterday I wrote that Project Ceylon finally had a front door.</description><pubDate>Tue, 29 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Yesterday I wrote that Project Ceylon finally had a front door.&lt;/p&gt;
&lt;p&gt;Today I actually moved some furniture in.&lt;/p&gt;
&lt;p&gt;The new Ceylon site is no longer just a landing page saying, essentially, &amp;quot;yes, this project exists.&amp;quot;&lt;/p&gt;
&lt;p&gt;It now has the beginnings of a real public archive: project information, the development journal, supporting pages, and the plumbing needed to keep publishing without hand-editing a static page every time I do something questionable to the operating system.&lt;/p&gt;
&lt;p&gt;And while that was happening, Nu-Iris finally crossed an important line.&lt;/p&gt;
&lt;p&gt;R4 was promoted.&lt;/p&gt;
&lt;p&gt;Then R5 immediately found another problem.&lt;/p&gt;
&lt;p&gt;So the day ended with the public side of Ceylon looking considerably more finished and the display stack reminding me, once again, that appearances are dangerous.&lt;/p&gt;
&lt;p&gt;Seems appropriate.&lt;/p&gt;
&lt;h2 id=&quot;the-website-became-a-project-site&quot;&gt;The website became a project site&lt;/h2&gt;
&lt;p&gt;The biggest visible change today is at:&lt;/p&gt;
&lt;p&gt;ceylonprojectng.com&lt;/p&gt;
&lt;p&gt;Yesterday it was a proof that the routing, certificates, hosting and deployment worked.&lt;/p&gt;
&lt;p&gt;Today it is much closer to what I actually wanted:&lt;/p&gt;
&lt;p&gt;a real home for Project Ceylon.&lt;/p&gt;
&lt;p&gt;The development journal has been brought over so the project history can live with the project instead of existing only as a scattered collection of posts elsewhere.&lt;/p&gt;
&lt;p&gt;The current site now has the pieces I expect from a proper technical project:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a public project overview;&lt;/li&gt;
&lt;li&gt;development-journal archive;&lt;/li&gt;
&lt;li&gt;individual journal pages;&lt;/li&gt;
&lt;li&gt;responsive layouts;&lt;/li&gt;
&lt;li&gt;RSS;&lt;/li&gt;
&lt;li&gt;sitemap support;&lt;/li&gt;
&lt;li&gt;sensible navigation;&lt;/li&gt;
&lt;li&gt;pages that remain readable even without JavaScript;&lt;/li&gt;
&lt;li&gt;a publishing boundary between public work and things that are not ready to be public.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That last one got tested harder than the pretty pages did.&lt;/p&gt;
&lt;p&gt;Good.&lt;/p&gt;
&lt;h2 id=&quot;publishing-has-failure-modes-too&quot;&gt;Publishing has failure modes too&lt;/h2&gt;
&lt;p&gt;Once you have a site backed by real content, the dangerous question becomes:&lt;/p&gt;
&lt;p&gt;What can accidentally become public?&lt;/p&gt;
&lt;p&gt;Drafts should not appear.&lt;/p&gt;
&lt;p&gt;Unpublished material should not leak into archive pages.&lt;/p&gt;
&lt;p&gt;Private or unannounced research should not wander into RSS.&lt;/p&gt;
&lt;p&gt;A page that has been deliberately withheld should not show up because somebody forgot one filter in one renderer.&lt;/p&gt;
&lt;p&gt;So the publishing path got tested the same way I increasingly test the OS:&lt;/p&gt;
&lt;p&gt;not just by asking whether the expected thing works,&lt;/p&gt;
&lt;p&gt;but whether the thing that is not supposed to happen stays impossible.&lt;/p&gt;
&lt;p&gt;One deliberately missed leak was found during that work.&lt;/p&gt;
&lt;p&gt;It was fixed.&lt;/p&gt;
&lt;p&gt;Then the site was checked again across the normal pages, archive, RSS, and sitemap behavior.&lt;/p&gt;
&lt;p&gt;That matters to me because I want the development journal to remain pretty open.&lt;/p&gt;
&lt;p&gt;Research into things I have already publicly discussed can be written about as research, even when the idea later gets discarded.&lt;/p&gt;
&lt;p&gt;That is part of the point of building this thing in public.&lt;/p&gt;
&lt;p&gt;But &amp;quot;building in public&amp;quot; does not mean &amp;quot;publish every unfinished thought, internal note, or unannounced project because a content query happened to find it.&amp;quot;&lt;/p&gt;
&lt;p&gt;There still has to be a boundary.&lt;/p&gt;
&lt;p&gt;Now the site has one.&lt;/p&gt;
&lt;h2 id=&quot;the-journal-is-becoming-part-of-the-engineering-record&quot;&gt;The journal is becoming part of the engineering record&lt;/h2&gt;
&lt;p&gt;Something else happened once all of these entries started living together.&lt;/p&gt;
&lt;p&gt;The journal stopped feeling like a sequence of blog posts and started looking like a development history.&lt;/p&gt;
&lt;p&gt;That is useful.&lt;/p&gt;
&lt;p&gt;You can see the project change its mind.&lt;/p&gt;
&lt;p&gt;You can see Nu-Day turn into Ceylon.&lt;/p&gt;
&lt;p&gt;You can see early assumptions fail.&lt;/p&gt;
&lt;p&gt;You can see First Light happen and then later learn what First Light actually proved.&lt;/p&gt;
&lt;p&gt;You can see storage break for reasons that had nothing to do with storage.&lt;/p&gt;
&lt;p&gt;You can see the Alpha scope get smaller and more concrete.&lt;/p&gt;
&lt;p&gt;And you can see just how often a supposedly minor question turns into a week of architecture work.&lt;/p&gt;
&lt;p&gt;I like that.&lt;/p&gt;
&lt;p&gt;I do not want to rewrite the history into a neat story where every early decision was obviously leading to the current design.&lt;/p&gt;
&lt;p&gt;It wasn&apos;t.&lt;/p&gt;
&lt;p&gt;Some of this has been exploration.&lt;/p&gt;
&lt;p&gt;Some of it has been wrong.&lt;/p&gt;
&lt;p&gt;Some of it has been very wrong at 3:00 AM.&lt;/p&gt;
&lt;p&gt;The useful part is documenting why the next decision became better.&lt;/p&gt;
&lt;h2 id=&quot;meanwhile-nu-iris-r4-finally-crossed-the-line&quot;&gt;Meanwhile, Nu-Iris R4 finally crossed the line&lt;/h2&gt;
&lt;p&gt;The quieter technical milestone today was Nu-Iris R4.&lt;/p&gt;
&lt;p&gt;R4 had already reached the point where the design, implementation, target evidence, and independent review all said the same thing:&lt;/p&gt;
&lt;p&gt;this exact candidate is ready.&lt;/p&gt;
&lt;p&gt;Today that candidate was promoted into the canonical Ceylon source.&lt;/p&gt;
&lt;p&gt;That sounds simple.&lt;/p&gt;
&lt;p&gt;It wasn&apos;t treated casually.&lt;/p&gt;
&lt;p&gt;The promotion had to prove that the exact reviewed source was the thing being moved forward.&lt;/p&gt;
&lt;p&gt;Not a rebuilt approximation.&lt;/p&gt;
&lt;p&gt;Not &amp;quot;the same changes, basically.&amp;quot;&lt;/p&gt;
&lt;p&gt;Not a branch with one extra helpful tweak.&lt;/p&gt;
&lt;p&gt;The exact qualified candidate.&lt;/p&gt;
&lt;p&gt;The validation harness stayed out.&lt;/p&gt;
&lt;p&gt;Temporary evidence stayed out.&lt;/p&gt;
&lt;p&gt;Unrelated work stayed out.&lt;/p&gt;
&lt;p&gt;Owner work was preserved.&lt;/p&gt;
&lt;p&gt;The result is that R4 is no longer a promising candidate sitting beside Ceylon.&lt;/p&gt;
&lt;p&gt;It is now the current canonical Iris boundary.&lt;/p&gt;
&lt;p&gt;That is a meaningful milestone.&lt;/p&gt;
&lt;h2 id=&quot;what-r4-actually-gives-us&quot;&gt;What R4 actually gives us&lt;/h2&gt;
&lt;p&gt;R4 is not the end of Nu-Iris.&lt;/p&gt;
&lt;p&gt;It is the point where the service has a much stronger internal contract.&lt;/p&gt;
&lt;p&gt;It now deals explicitly with things such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;surface identity;&lt;/li&gt;
&lt;li&gt;buffer identity;&lt;/li&gt;
&lt;li&gt;generations;&lt;/li&gt;
&lt;li&gt;frame tokens;&lt;/li&gt;
&lt;li&gt;lifecycle state;&lt;/li&gt;
&lt;li&gt;stale and replayed requests;&lt;/li&gt;
&lt;li&gt;bounded completion behavior.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In other words, it is increasingly difficult for a frame to simply be &amp;quot;some buffer somewhere that everybody vaguely agrees is current.&amp;quot;&lt;/p&gt;
&lt;p&gt;That is good.&lt;/p&gt;
&lt;p&gt;But R4 still does not actually carry the frame all the way to the physical display provider.&lt;/p&gt;
&lt;p&gt;That is R5&apos;s problem.&lt;/p&gt;
&lt;p&gt;And R5 did not take long to become interesting.&lt;/p&gt;
&lt;h2 id=&quot;the-display-provider-needs-to-be-replaceable&quot;&gt;The display provider needs to be replaceable&lt;/h2&gt;
&lt;p&gt;The current physical display path still goes through the existing Bochs device implementation.&lt;/p&gt;
&lt;p&gt;That is fine for A1.&lt;/p&gt;
&lt;p&gt;What I do not want is for &amp;quot;Bochs&amp;quot; to quietly become part of the permanent Nu-Iris architecture just because it happens to be the first provider.&lt;/p&gt;
&lt;p&gt;So the R5 design work has been focused on putting a provider-neutral contract between Iris and whatever actually owns the physical display hardware.&lt;/p&gt;
&lt;p&gt;Conceptually:&lt;/p&gt;
&lt;p&gt;NuGUI → Nu-Iris → display provider&lt;/p&gt;
&lt;p&gt;For A1, that display provider happens to be the existing Bochs path.&lt;/p&gt;
&lt;p&gt;Later it could be something else.&lt;/p&gt;
&lt;p&gt;A real GPU.&lt;/p&gt;
&lt;p&gt;A different framebuffer device.&lt;/p&gt;
&lt;p&gt;A virtual display.&lt;/p&gt;
&lt;p&gt;A remote display.&lt;/p&gt;
&lt;p&gt;A headless output.&lt;/p&gt;
&lt;p&gt;More than one output.&lt;/p&gt;
&lt;p&gt;More than one provider.&lt;/p&gt;
&lt;p&gt;Potentially even additional Iris domains created by the user.&lt;/p&gt;
&lt;p&gt;The first implementation does not need to do all of those things.&lt;/p&gt;
&lt;p&gt;But it must not make them impossible.&lt;/p&gt;
&lt;p&gt;That distinction is one of the recurring themes in Ceylon:&lt;/p&gt;
&lt;p&gt;do the simple thing now without making the simple thing the permanent shape of the universe.&lt;/p&gt;
&lt;h2 id=&quot;a-frame-needs-more-identity-than-frame&quot;&gt;A frame needs more identity than &amp;quot;frame&amp;quot;&lt;/h2&gt;
&lt;p&gt;The provider contract got fairly serious today.&lt;/p&gt;
&lt;p&gt;A display submission cannot just be:&lt;/p&gt;
&lt;p&gt;&amp;quot;please show this buffer.&amp;quot;&lt;/p&gt;
&lt;p&gt;It needs enough identity that a stale response from an old provider, an old output, an old surface, or an old frame cannot accidentally release or complete something newer.&lt;/p&gt;
&lt;p&gt;So the design is moving toward a hierarchy roughly like:&lt;/p&gt;
&lt;p&gt;Presentation Domain → Output → Provider Binding&lt;/p&gt;
&lt;p&gt;with explicit generations and leases underneath it.&lt;/p&gt;
&lt;p&gt;A submitted frame carries the identities required to prove exactly what operation it belongs to.&lt;/p&gt;
&lt;p&gt;The provider response has to echo enough of that identity that a response for frame N can never be mistaken for frame N+1.&lt;/p&gt;
&lt;p&gt;That may sound like excessive bookkeeping for putting pixels on a screen.&lt;/p&gt;
&lt;p&gt;It stops sounding excessive the first time something restarts while another frame is still in flight.&lt;/p&gt;
&lt;p&gt;Then it becomes the difference between a stale completion being harmless and a stale completion corrupting ownership of the current frame.&lt;/p&gt;
&lt;h2 id=&quot;the-current-bochs-path-also-has-an-honesty-limit&quot;&gt;The current Bochs path also has an honesty limit&lt;/h2&gt;
&lt;p&gt;Another thing I like about the R5 design is that it is being explicit about what the current hardware path can actually prove.&lt;/p&gt;
&lt;p&gt;The Bochs backend can tell us that the framebuffer update completed.&lt;/p&gt;
&lt;p&gt;That is the truthful ceiling.&lt;/p&gt;
&lt;p&gt;It cannot honestly claim:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;vertical blank completion;&lt;/li&gt;
&lt;li&gt;page-flip completion;&lt;/li&gt;
&lt;li&gt;physical scanout completion.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So we are not going to give the result a fancy name and pretend it means more than it does.&lt;/p&gt;
&lt;p&gt;For A1, the strongest valid statement is essentially:&lt;/p&gt;
&lt;p&gt;the framebuffer update completed.&lt;/p&gt;
&lt;p&gt;Later hardware can support stronger presentation semantics.&lt;/p&gt;
&lt;p&gt;When it does, the protocol can represent them.&lt;/p&gt;
&lt;p&gt;Until then, the system should tell the truth.&lt;/p&gt;
&lt;p&gt;I am becoming increasingly fond of boring, truthful status codes.&lt;/p&gt;
&lt;p&gt;They cause fewer interesting evenings.&lt;/p&gt;
&lt;h2 id=&quot;and-then-bar2-raised-its-hand-again&quot;&gt;And then BAR2 raised its hand again&lt;/h2&gt;
&lt;p&gt;Before the physical R5 provider path can be qualified, the Bochs hardware path has to pass its own precondition.&lt;/p&gt;
&lt;p&gt;That is where today&apos;s next problem appeared.&lt;/p&gt;
&lt;p&gt;The BAR2 resource being configured, the BAR2 resource observed at runtime, and the BAR2 value expected by the current profile did not agree.&lt;/p&gt;
&lt;p&gt;The values were not subtly wrong.&lt;/p&gt;
&lt;p&gt;They were different enough that the correct response was obvious:&lt;/p&gt;
&lt;p&gt;stop.&lt;/p&gt;
&lt;p&gt;Do not hide it in Iris.&lt;/p&gt;
&lt;p&gt;Do not compensate inside the provider adapter.&lt;/p&gt;
&lt;p&gt;Do not &amp;quot;just use the runtime address&amp;quot; and move on.&lt;/p&gt;
&lt;p&gt;Figure out why the physical path disagrees with the configuration first.&lt;/p&gt;
&lt;p&gt;That boundary is now explicit.&lt;/p&gt;
&lt;p&gt;R5 is not allowed to absorb a device/resource defect and turn it into an Iris feature.&lt;/p&gt;
&lt;p&gt;I am quite happy about that, even though it means the shiny path is blocked for the moment.&lt;/p&gt;
&lt;h2 id=&quot;a-blocked-test-is-sometimes-the-best-result&quot;&gt;A blocked test is sometimes the best result&lt;/h2&gt;
&lt;p&gt;A few weeks ago I might have described today as:&lt;/p&gt;
&lt;p&gt;&amp;quot;We almost got R5 working but BAR2 stopped us.&amp;quot;&lt;/p&gt;
&lt;p&gt;That is not really the useful interpretation anymore.&lt;/p&gt;
&lt;p&gt;The useful interpretation is:&lt;/p&gt;
&lt;p&gt;the gate caught exactly the kind of problem the gate was designed to catch.&lt;/p&gt;
&lt;p&gt;R4 is cleanly promoted.&lt;/p&gt;
&lt;p&gt;R5 has a bounded design.&lt;/p&gt;
&lt;p&gt;The provider boundary is explicit.&lt;/p&gt;
&lt;p&gt;The current hardware path has a known prerequisite.&lt;/p&gt;
&lt;p&gt;And when that prerequisite failed, work stopped at the correct boundary.&lt;/p&gt;
&lt;p&gt;That is much better than discovering three tranches later that Iris had quietly learned how to compensate for a broken PCI assumption nobody remembered making.&lt;/p&gt;
&lt;h2 id=&quot;ceylon-is-getting-two-kinds-of-infrastructure-now&quot;&gt;Ceylon is getting two kinds of infrastructure now&lt;/h2&gt;
&lt;p&gt;Something about today made this project feel different.&lt;/p&gt;
&lt;p&gt;On one side, there is the infrastructure people can see:&lt;/p&gt;
&lt;p&gt;a real project site,&lt;/p&gt;
&lt;p&gt;a journal archive,&lt;/p&gt;
&lt;p&gt;navigation,&lt;/p&gt;
&lt;p&gt;feeds,&lt;/p&gt;
&lt;p&gt;public documentation,&lt;/p&gt;
&lt;p&gt;a place where somebody new can arrive and understand what Ceylon is without reading forty terminal transcripts first.&lt;/p&gt;
&lt;p&gt;On the other side, there is the infrastructure almost nobody will ever see:&lt;/p&gt;
&lt;p&gt;generation counters,&lt;/p&gt;
&lt;p&gt;leases,&lt;/p&gt;
&lt;p&gt;provider bindings,&lt;/p&gt;
&lt;p&gt;resource authority,&lt;/p&gt;
&lt;p&gt;promotion gates,&lt;/p&gt;
&lt;p&gt;artifact identity,&lt;/p&gt;
&lt;p&gt;hardware preconditions.&lt;/p&gt;
&lt;p&gt;They are both necessary.&lt;/p&gt;
&lt;p&gt;The first makes the project understandable.&lt;/p&gt;
&lt;p&gt;The second makes the machine trustworthy.&lt;/p&gt;
&lt;p&gt;I think I have spent enough time on operating systems now to appreciate that you need both.&lt;/p&gt;
&lt;p&gt;A machine nobody understands is not especially useful.&lt;/p&gt;
&lt;p&gt;A machine everybody understands but that lies about which frame it just completed is also not especially useful.&lt;/p&gt;
&lt;h2 id=&quot;where-we-ended-the-day&quot;&gt;Where we ended the day&lt;/h2&gt;
&lt;p&gt;The Ceylon website is now much closer to being the project&apos;s permanent public home.&lt;/p&gt;
&lt;p&gt;The development journal has a proper archive.&lt;/p&gt;
&lt;p&gt;The publishing boundary has been exercised rather than merely assumed.&lt;/p&gt;
&lt;p&gt;Nu-Iris R4 is now canonical.&lt;/p&gt;
&lt;p&gt;R5 has a much clearer provider-neutral architecture.&lt;/p&gt;
&lt;p&gt;And the first attempt to push that work toward the physical display path hit a BAR2 mismatch and stopped exactly where it should have.&lt;/p&gt;
&lt;p&gt;That is not a dramatic screenshot day.&lt;/p&gt;
&lt;p&gt;But it is the kind of day where the project gets more real in two different directions at once.&lt;/p&gt;
&lt;p&gt;One direction is outward.&lt;/p&gt;
&lt;p&gt;People can find it, read it, and follow the history.&lt;/p&gt;
&lt;p&gt;The other direction is inward.&lt;/p&gt;
&lt;p&gt;The code has to prove more precisely what it means when it says something worked.&lt;/p&gt;
&lt;p&gt;I am pretty comfortable with both of those trends.&lt;/p&gt;
&lt;p&gt;Tomorrow, I suspect BAR2 and I are going to have a conversation.&lt;/p&gt;
&lt;p&gt;I doubt either of us is going to enjoy it.&lt;/p&gt;
&lt;p&gt;Project Ceylon is an independent retro-futurist operating-system project exploring what a modern creative workstation might look like if some of the best ideas of earlier personal computers had continued evolving instead of being discarded.&lt;/p&gt;
&lt;p&gt;Project site: ceylonprojectng.com&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Retrocomputing</category><category>Operating Systems</category><category>Nu-Iris</category><category>Display Architecture</category><category>Website</category><category>Build in Public</category><category>QEMU</category><author>Mike</author></item><item><title>Project Ceylon Development Log — September 28, 2026: Ceylon Got a Website. Then We Started Talking About Robots.</title><link>https://ceylonprojectng.com/journal/project-ceylon-development-log-september-28-2026-ceylon-got-a-website-then-we-started-talking-about-robots/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/project-ceylon-development-log-september-28-2026-ceylon-got-a-website-then-we-started-talking-about-robots/</guid><description>Today Project Ceylon got a real home on the web.</description><pubDate>Mon, 28 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Today Project Ceylon got a real home on the web.&lt;/p&gt;
&lt;p&gt;And then, because apparently I am incapable of doing one normal thing at a time, the day wandered through local-first computing, federation, real-time scheduling, CNC controllers, Raspberry Pis, Roombas, and the possibility of building an actual robot running Ceylon.&lt;/p&gt;
&lt;p&gt;So this one may be a little all over the place.&lt;/p&gt;
&lt;p&gt;In other words, fairly representative of the project.&lt;/p&gt;
&lt;h2 id=&quot;ceylon-finally-has-its-own-front-door&quot;&gt;Ceylon finally has its own front door&lt;/h2&gt;
&lt;p&gt;The new public site is now up at:&lt;/p&gt;
&lt;p&gt;ceylonprojectng.com&lt;/p&gt;
&lt;p&gt;There is also a new site for the parent company at:&lt;/p&gt;
&lt;p&gt;inspirebycraft.com&lt;/p&gt;
&lt;p&gt;Both are currently simple landing pages.&lt;/p&gt;
&lt;p&gt;That is intentional.&lt;/p&gt;
&lt;p&gt;I wanted the routing, hosting, certificates, and deployment path proven before turning either one into a giant content-management project.&lt;/p&gt;
&lt;p&gt;The new sites are running through the same established Cloudflare Tunnel infrastructure already serving The Weekenders Project, without disrupting the existing site.&lt;/p&gt;
&lt;p&gt;That was the first goal:&lt;/p&gt;
&lt;p&gt;put the new doors on the building without knocking down the house next door.&lt;/p&gt;
&lt;p&gt;Done.&lt;/p&gt;
&lt;p&gt;The next stage will be turning the Ceylon site into the proper project home instead of relying on Hackaday alone.&lt;/p&gt;
&lt;p&gt;Hackaday is still where I want this development journal and the contest-facing build story to live.&lt;/p&gt;
&lt;p&gt;The Ceylon site can do the slower-moving jobs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;explain what the project is;&lt;/li&gt;
&lt;li&gt;maintain architecture and roadmap material;&lt;/li&gt;
&lt;li&gt;provide downloads when we reach that point;&lt;/li&gt;
&lt;li&gt;host documentation;&lt;/li&gt;
&lt;li&gt;collect project history;&lt;/li&gt;
&lt;li&gt;eventually support Alpha feedback and release information.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the moment, though, it exists.&lt;/p&gt;
&lt;p&gt;That feels surprisingly significant.&lt;/p&gt;
&lt;p&gt;Ceylon has spent most of its life as source trees, specifications, QEMU windows, terminal logs, and increasingly questionable amounts of coffee.&lt;/p&gt;
&lt;p&gt;Now it has an address.&lt;/p&gt;
&lt;h2 id=&quot;the-project-identity-is-getting-clearer-too&quot;&gt;The project identity is getting clearer too&lt;/h2&gt;
&lt;p&gt;Putting up a public site forced another useful exercise:&lt;/p&gt;
&lt;p&gt;How do I explain what all of these names actually mean?&lt;/p&gt;
&lt;p&gt;The structure is becoming fairly simple.&lt;/p&gt;
&lt;p&gt;Inspire by Craft is the parent maker company.&lt;/p&gt;
&lt;p&gt;The IBC Systems Division is the computing side.&lt;/p&gt;
&lt;p&gt;Project Ceylon is the operating-system and workstation program.&lt;/p&gt;
&lt;p&gt;And The Weekenders Project is a separate community project under the same parent.&lt;/p&gt;
&lt;p&gt;That probably sounds like corporate housekeeping.&lt;/p&gt;
&lt;p&gt;It is.&lt;/p&gt;
&lt;p&gt;But names start mattering once you expect people other than yourself to look at what you are building.&lt;/p&gt;
&lt;p&gt;The parent-company line also finally settled into something that feels like me:&lt;/p&gt;
&lt;p&gt;Jack of all trades. Master of some. Makers of things. Some pretty. Some useful. Some pretty useful.&lt;/p&gt;
&lt;p&gt;That is probably a better description of how I got into this mess than any mission statement I could write.&lt;/p&gt;
&lt;h2 id=&quot;local-first-is-becoming-more-than-a-preference&quot;&gt;Local-first is becoming more than a preference&lt;/h2&gt;
&lt;p&gt;Yesterday I wrote about wanting Ceylon to remain useful without depending on a remote service to grant the computer permission to exist.&lt;/p&gt;
&lt;p&gt;Today that turned into more concrete federation work.&lt;/p&gt;
&lt;p&gt;The question was:&lt;/p&gt;
&lt;p&gt;How should two or more Ceylon machines work together without turning the whole system into a cloud product?&lt;/p&gt;
&lt;p&gt;The answer is starting to take shape as three levels:&lt;/p&gt;
&lt;p&gt;Standalone → Fed-Light → Managed Federation&lt;/p&gt;
&lt;p&gt;Standalone is exactly what it sounds like.&lt;/p&gt;
&lt;p&gt;The machine works by itself.&lt;/p&gt;
&lt;p&gt;Fed-Light is the interesting middle ground.&lt;/p&gt;
&lt;p&gt;Two nearby Ceylon systems should be able to discover one another, explicitly establish trust, and share selected services or resources without requiring a central management server.&lt;/p&gt;
&lt;p&gt;No &amp;quot;every machine on the LAN is automatically trusted.&amp;quot;&lt;/p&gt;
&lt;p&gt;No ambient network authority.&lt;/p&gt;
&lt;p&gt;Discovery can happen automatically.&lt;/p&gt;
&lt;p&gt;Trust cannot.&lt;/p&gt;
&lt;p&gt;That should require an intentional adoption step.&lt;/p&gt;
&lt;p&gt;Once adopted, the systems can negotiate permissions, attach to allowed services, and revoke that relationship later.&lt;/p&gt;
&lt;p&gt;Then, for businesses, labs, schools, production environments, or larger installations, there is the full managed-federation model.&lt;/p&gt;
&lt;p&gt;That adds centralized enrollment, inventory, policy, compliance, application control, conditional access, and the other things you need once &amp;quot;two computers on my desk&amp;quot; becomes &amp;quot;two hundred computers somebody has to support.&amp;quot;&lt;/p&gt;
&lt;p&gt;The important part is that the machine does not become less capable when the management server disappears.&lt;/p&gt;
&lt;p&gt;Local-first failure semantics matter.&lt;/p&gt;
&lt;p&gt;The local computer should degrade gracefully, not become a decorative rectangle because the network is having a bad day.&lt;/p&gt;
&lt;p&gt;That principle is now much more explicit in the federation design.&lt;/p&gt;
&lt;h2 id=&quot;then-cnc-dragged-us-into-real-time-computing&quot;&gt;Then CNC dragged us into real-time computing&lt;/h2&gt;
&lt;p&gt;Another conversation today started with something much more practical.&lt;/p&gt;
&lt;p&gt;Ceylon is eventually intended to control CNC equipment.&lt;/p&gt;
&lt;p&gt;If you are driving motors, reading sensors, and generating motion, &amp;quot;the scheduler will probably get around to this soon&amp;quot; is not a particularly comforting engineering guarantee.&lt;/p&gt;
&lt;p&gt;So the question became:&lt;/p&gt;
&lt;p&gt;Does Ceylon need to be a real-time operating system?&lt;/p&gt;
&lt;p&gt;The answer I like is:&lt;/p&gt;
&lt;p&gt;parts of it do.&lt;/p&gt;
&lt;p&gt;I do not want to turn the entire desktop operating system into one giant hard-real-time environment.&lt;/p&gt;
&lt;p&gt;That would make ordinary desktop work unnecessarily rigid and complicated.&lt;/p&gt;
&lt;p&gt;Instead, the architecture should be able to assign real-time behavior only where it is justified.&lt;/p&gt;
&lt;p&gt;The working model is roughly along the lines of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;normal&lt;/li&gt;
&lt;li&gt;soft real-time&lt;/li&gt;
&lt;li&gt;firm real-time&lt;/li&gt;
&lt;li&gt;hard real-time&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Different services or execution paths can declare what they actually need.&lt;/p&gt;
&lt;p&gt;A CNC motion-control loop may deserve hard real-time treatment.&lt;/p&gt;
&lt;p&gt;An audio render path may need firm real-time deadlines.&lt;/p&gt;
&lt;p&gt;Video capture and playback may need bounded timing without requiring the same guarantees as a motor-control loop.&lt;/p&gt;
&lt;p&gt;Your text editor does not need any of this.&lt;/p&gt;
&lt;p&gt;That seems like a much healthier model.&lt;/p&gt;
&lt;p&gt;And, importantly, it leaves room to assign additional real-time behavior later without redesigning the operating system every time we discover a new workload that needs it.&lt;/p&gt;
&lt;h2 id=&quot;audio-and-video-benefit-from-this-too&quot;&gt;Audio and video benefit from this too&lt;/h2&gt;
&lt;p&gt;The CNC discussion immediately looped back into the workstation side of Ceylon.&lt;/p&gt;
&lt;p&gt;Audio production is full of deadlines.&lt;/p&gt;
&lt;p&gt;Miss one badly enough and you do not get a polite error dialog.&lt;/p&gt;
&lt;p&gt;You get a click, a pop, a dropout, or silence.&lt;/p&gt;
&lt;p&gt;Video has similar problems around frame timing, capture, playback, and synchronization.&lt;/p&gt;
&lt;p&gt;So the real-time work is not some strange industrial branch growing off the side of the OS.&lt;/p&gt;
&lt;p&gt;It actually ties together several things Ceylon already wants to be good at:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;music production;&lt;/li&gt;
&lt;li&gt;video production;&lt;/li&gt;
&lt;li&gt;communications;&lt;/li&gt;
&lt;li&gt;CNC control;&lt;/li&gt;
&lt;li&gt;robotics;&lt;/li&gt;
&lt;li&gt;eventually other instrumentation and control workloads.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The trick is keeping the real-time guarantees narrow enough that they improve those systems without turning every application into a scheduler negotiation.&lt;/p&gt;
&lt;p&gt;That is now part of the design problem.&lt;/p&gt;
&lt;h2 id=&quot;and-then-somebody-mentioned-a-cylon&quot;&gt;And then somebody mentioned a Cylon&lt;/h2&gt;
&lt;p&gt;At some point in that conversation, the obvious joke happened:&lt;/p&gt;
&lt;p&gt;If Ceylon gains real-time control, sensor support, networking, audio, cameras, and embedded hardware support...&lt;/p&gt;
&lt;p&gt;we could build a real Cylon running Ceylon.&lt;/p&gt;
&lt;p&gt;That is the sort of sentence that should probably end a meeting.&lt;/p&gt;
&lt;p&gt;Instead, it started another project idea.&lt;/p&gt;
&lt;p&gt;Because once you stop laughing, there is actually a pretty good systems test hiding inside it.&lt;/p&gt;
&lt;p&gt;A robot is a beautiful way to force an operating system to deal with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;sensors;&lt;/li&gt;
&lt;li&gt;actuators;&lt;/li&gt;
&lt;li&gt;real-time control;&lt;/li&gt;
&lt;li&gt;networking;&lt;/li&gt;
&lt;li&gt;cameras;&lt;/li&gt;
&lt;li&gt;audio;&lt;/li&gt;
&lt;li&gt;power constraints;&lt;/li&gt;
&lt;li&gt;device discovery;&lt;/li&gt;
&lt;li&gt;failure handling;&lt;/li&gt;
&lt;li&gt;remote telemetry;&lt;/li&gt;
&lt;li&gt;local autonomy.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So yes.&lt;/p&gt;
&lt;p&gt;At some point, Project Ceylon probably needs a robotics kit.&lt;/p&gt;
&lt;p&gt;Not for A1.&lt;/p&gt;
&lt;p&gt;Everybody relax.&lt;/p&gt;
&lt;p&gt;I have learned at least some scope control.&lt;/p&gt;
&lt;h2 id=&quot;hack-the-roomba&quot;&gt;Hack the Roomba&lt;/h2&gt;
&lt;p&gt;The version of this idea I like most is deliberately less ambitious than building a humanoid robot from scratch.&lt;/p&gt;
&lt;p&gt;Take a Roomba.&lt;/p&gt;
&lt;p&gt;Put a Raspberry Pi-class computer on it.&lt;/p&gt;
&lt;p&gt;Run Ceylon.&lt;/p&gt;
&lt;p&gt;Talk to the Roomba&apos;s existing control interface.&lt;/p&gt;
&lt;p&gt;Then start adding things.&lt;/p&gt;
&lt;p&gt;More sensors.&lt;/p&gt;
&lt;p&gt;A camera.&lt;/p&gt;
&lt;p&gt;Microphones.&lt;/p&gt;
&lt;p&gt;Speakers.&lt;/p&gt;
&lt;p&gt;Environmental sensing.&lt;/p&gt;
&lt;p&gt;Maybe mapping.&lt;/p&gt;
&lt;p&gt;Maybe remote control.&lt;/p&gt;
&lt;p&gt;Maybe local autonomy.&lt;/p&gt;
&lt;p&gt;Maybe another Ceylon machine acts as the workstation while the robot becomes a Fed-Light peer.&lt;/p&gt;
&lt;p&gt;Now we have a weekend project that is also a legitimate operating-system test platform.&lt;/p&gt;
&lt;p&gt;That could eventually make a fun Hackaday challenge:&lt;/p&gt;
&lt;p&gt;What can you turn an old robot vacuum into when the controller is a general-purpose Ceylon computer?&lt;/p&gt;
&lt;p&gt;There is one fairly large prerequisite.&lt;/p&gt;
&lt;p&gt;Ceylon is x86-64 today.&lt;/p&gt;
&lt;p&gt;A Raspberry Pi would require ARM64 work.&lt;/p&gt;
&lt;p&gt;We have already been discussing tablets as a future ARM64 target, so the robot probably comes after that.&lt;/p&gt;
&lt;p&gt;Which means the current unofficial sequence may be:&lt;/p&gt;
&lt;p&gt;build operating system,&lt;/p&gt;
&lt;p&gt;build tablet,&lt;/p&gt;
&lt;p&gt;hack Roomba,&lt;/p&gt;
&lt;p&gt;accidentally start robotics division.&lt;/p&gt;
&lt;p&gt;Seems reasonable.&lt;/p&gt;
&lt;h2 id=&quot;nu-iris-got-some-quieter-work-today-too&quot;&gt;Nu-Iris got some quieter work today too&lt;/h2&gt;
&lt;p&gt;Not everything today involved dreaming up future hardware.&lt;/p&gt;
&lt;p&gt;Nu-Iris also moved forward a little.&lt;/p&gt;
&lt;p&gt;The current R4 candidate has reached the point where the technical and governance reconciliation is clear for promotion.&lt;/p&gt;
&lt;p&gt;That does not mean I started piling the next round of display features onto it.&lt;/p&gt;
&lt;p&gt;Quite the opposite.&lt;/p&gt;
&lt;p&gt;One thing I am trying to get better at is knowing when to stop touching something.&lt;/p&gt;
&lt;p&gt;The current candidate is being kept separate from the validation harness and from later experimental work.&lt;/p&gt;
&lt;p&gt;No sneaking future display ideas into the promotion.&lt;/p&gt;
&lt;p&gt;No mixing qualification scaffolding into the product tree.&lt;/p&gt;
&lt;p&gt;No &amp;quot;while we&apos;re here, let&apos;s just add...&amp;quot;&lt;/p&gt;
&lt;p&gt;Get the qualified work promoted cleanly.&lt;/p&gt;
&lt;p&gt;Then start the next tranche from a known point.&lt;/p&gt;
&lt;p&gt;That sounds obvious.&lt;/p&gt;
&lt;p&gt;Ceylon has taught me repeatedly that &amp;quot;obvious&amp;quot; is not the same as &amp;quot;automatic.&amp;quot;&lt;/p&gt;
&lt;h2 id=&quot;today-felt-less-like-debugging-and-more-like-defining-the-edges&quot;&gt;Today felt less like debugging and more like defining the edges&lt;/h2&gt;
&lt;p&gt;There was not one giant technical breakthrough today.&lt;/p&gt;
&lt;p&gt;No dramatic new screenshot.&lt;/p&gt;
&lt;p&gt;No airplane flying yet.&lt;/p&gt;
&lt;p&gt;No synthesizer concert.&lt;/p&gt;
&lt;p&gt;Instead, several boundaries got clearer.&lt;/p&gt;
&lt;p&gt;Ceylon has a public home now.&lt;/p&gt;
&lt;p&gt;The company and project identities make more sense.&lt;/p&gt;
&lt;p&gt;Local-first federation has a cleaner path from one machine to peer-to-peer cooperation to managed environments.&lt;/p&gt;
&lt;p&gt;Real-time behavior is becoming something Ceylon can assign where it is actually needed instead of a property the entire OS has to pretend to have.&lt;/p&gt;
&lt;p&gt;And the same architecture that may someday drive a CNC machine could eventually run a robot vacuum with entirely too many sensors attached to it.&lt;/p&gt;
&lt;p&gt;Meanwhile, Nu-Iris quietly moved closer to a clean promotion without dragging tomorrow&apos;s experiments into today&apos;s qualified work.&lt;/p&gt;
&lt;p&gt;That is a pretty good day.&lt;/p&gt;
&lt;p&gt;Also, I would like it noted for the record that the robotics idea was not on the A1 Alpha list when I woke up this morning.&lt;/p&gt;
&lt;p&gt;And it still isn&apos;t.&lt;/p&gt;
&lt;p&gt;Progress.&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Retrocomputing</category><category>Operating Systems</category><category>Local-First</category><category>Federation</category><category>Real-Time</category><category>Robotics</category><category>Nu-Iris</category><author>Mike</author></item><item><title>Project Ceylon Development Log — September 27, 2026: Apparently Housekeeping Is Systems Engineering Too</title><link>https://ceylonprojectng.com/journal/project-ceylon-development-log-september-27-2026-apparently-housekeeping-is-systems-engineering-too/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/project-ceylon-development-log-september-27-2026-apparently-housekeeping-is-systems-engineering-too/</guid><description>Today I deleted almost 300 GiB of Project Ceylon development debris.</description><pubDate>Sun, 27 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Today I deleted almost &lt;strong&gt;300 GiB&lt;/strong&gt; of Project Ceylon development debris.&lt;/p&gt;
&lt;p&gt;And somehow that turned into a desktop-design discussion.&lt;/p&gt;
&lt;p&gt;That sounds about right.&lt;/p&gt;
&lt;p&gt;The short version is that the machine had accumulated months of build trees, validation copies, temporary workspaces, old artifacts, abandoned experiments, duplicated toolchains, test images, and assorted other things that all made perfect sense when they were created and considerably less sense after they had been sitting there for a while.&lt;/p&gt;
&lt;p&gt;The filesystem had reached about &lt;strong&gt;77% used&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;By the time the cleanup was finished, it was down around &lt;strong&gt;53%&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Free space went from roughly &lt;strong&gt;300 GiB to 600 GiB&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;And, most importantly:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;the canonical Ceylon source stayed exactly where it was supposed to be.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That last part is what made the cleanup interesting.&lt;/p&gt;
&lt;p&gt;Deleting files is easy.&lt;/p&gt;
&lt;p&gt;Deleting the &lt;em&gt;right&lt;/em&gt; files in an operating-system project without quietly throwing away the one copy of something important is a different job entirely.&lt;/p&gt;
&lt;h2 id=&quot;rm--rf-was-not-the-plan&quot;&gt;&amp;quot;rm -rf&amp;quot; was not the plan&lt;/h2&gt;
&lt;p&gt;The cleanup was deliberately conservative.&lt;/p&gt;
&lt;p&gt;Every candidate had to earn the right to be deleted.&lt;/p&gt;
&lt;p&gt;Build trees?&lt;/p&gt;
&lt;p&gt;Probably disposable.&lt;/p&gt;
&lt;p&gt;Generated output?&lt;/p&gt;
&lt;p&gt;Usually disposable.&lt;/p&gt;
&lt;p&gt;Temporary validation copies?&lt;/p&gt;
&lt;p&gt;Maybe.&lt;/p&gt;
&lt;p&gt;A directory that looks temporary but contains tracked source?&lt;/p&gt;
&lt;p&gt;Absolutely not.&lt;/p&gt;
&lt;p&gt;That distinction caught one remaining root-owned workspace that otherwise looked like cleanup material.&lt;/p&gt;
&lt;p&gt;The deletion process checked it against the canonical repository, found tracked source inside it, and kept it.&lt;/p&gt;
&lt;p&gt;Exactly what I wanted.&lt;/p&gt;
&lt;p&gt;By the end of the run, &lt;strong&gt;391 out of 392&lt;/strong&gt; residual root-owned paths were removed.&lt;/p&gt;
&lt;p&gt;The one exception was preserved because it still contained canonical source.&lt;/p&gt;
&lt;p&gt;That is a much better result than &amp;quot;we deleted everything and the machine still seems to boot.&amp;quot;&lt;/p&gt;
&lt;h2 id=&quot;cleanup-found-things-i-actually-wanted-to-keep&quot;&gt;Cleanup found things I actually wanted to keep&lt;/h2&gt;
&lt;p&gt;The more useful surprise came before the final deletion pass.&lt;/p&gt;
&lt;p&gt;A proper inventory of the old workspaces found a few pieces of engineering work that had not yet been cleanly reconciled back into the main project.&lt;/p&gt;
&lt;p&gt;That is the dangerous part of long-running experimental development.&lt;/p&gt;
&lt;p&gt;You make a fix in a validation tree.&lt;/p&gt;
&lt;p&gt;Then another fix in another tree.&lt;/p&gt;
&lt;p&gt;Then a branch exists because you were trying to prove one very specific thing at 2:00 AM.&lt;/p&gt;
&lt;p&gt;A week later, the fix is good, the test passed, everybody remembers the result...&lt;/p&gt;
&lt;p&gt;...and the actual source of truth may not yet contain the thing that produced it.&lt;/p&gt;
&lt;p&gt;That is how projects slowly become folklore.&lt;/p&gt;
&lt;p&gt;So before anything was removed, the cleanup process stopped and identified those unique changes.&lt;/p&gt;
&lt;p&gt;No merging by accident.&lt;/p&gt;
&lt;p&gt;No &amp;quot;well, I think this one was already included.&amp;quot;&lt;/p&gt;
&lt;p&gt;No guessing.&lt;/p&gt;
&lt;p&gt;The cleanup became a reconciliation exercise before it became a deletion exercise.&lt;/p&gt;
&lt;p&gt;That may be the least glamorous sentence I have ever written for Hackaday.&lt;/p&gt;
&lt;p&gt;It is also probably one of the more important ones.&lt;/p&gt;
&lt;h2 id=&quot;this-project-is-getting-too-big-to-rely-on-memory&quot;&gt;This project is getting too big to rely on memory&lt;/h2&gt;
&lt;p&gt;I have a decent memory for how Ceylon got here.&lt;/p&gt;
&lt;p&gt;That is not the same thing as having a process.&lt;/p&gt;
&lt;p&gt;As the project has grown, I have become increasingly suspicious of statements that begin with:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;I&apos;m pretty sure...&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&apos;m pretty sure that patch was incorporated.&lt;/p&gt;
&lt;p&gt;I&apos;m pretty sure that workspace is obsolete.&lt;/p&gt;
&lt;p&gt;I&apos;m pretty sure that toolchain is the current one.&lt;/p&gt;
&lt;p&gt;I&apos;m pretty sure we qualified that exact image.&lt;/p&gt;
&lt;p&gt;No.&lt;/p&gt;
&lt;p&gt;&amp;quot;Pretty sure&amp;quot; is how six months from now becomes miserable.&lt;/p&gt;
&lt;p&gt;The system now has enough moving parts that provenance, reconciliation, qualification evidence, and cleanup discipline are becoming part of the engineering itself.&lt;/p&gt;
&lt;p&gt;Apparently housekeeping is systems engineering too.&lt;/p&gt;
&lt;p&gt;I did not expect that to become one of the themes of this project, but here we are.&lt;/p&gt;
&lt;h2 id=&quot;meanwhile-i-have-been-thinking-about-the-desktop-again&quot;&gt;Meanwhile, I have been thinking about the desktop again&lt;/h2&gt;
&lt;p&gt;The cleanup work was not the only thing happening today.&lt;/p&gt;
&lt;p&gt;I also went back to a question I have been circling for a while:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If Ceylon is not going to simply copy Windows, macOS, or Linux, what should actually be different about using it?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Not different for the sake of being weird.&lt;/p&gt;
&lt;p&gt;Different in a way that is genuinely useful.&lt;/p&gt;
&lt;p&gt;I do not want Ceylon to ship with twenty &amp;quot;innovations&amp;quot; that all need a tutorial and make somebody wish we had just left the desktop alone.&lt;/p&gt;
&lt;p&gt;One or two good ideas are enough.&lt;/p&gt;
&lt;p&gt;Then improve them based on evidence.&lt;/p&gt;
&lt;p&gt;The current one is called &lt;strong&gt;Workpad&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;the-workpad-idea-is-very-simple&quot;&gt;The Workpad idea is very simple&lt;/h2&gt;
&lt;p&gt;Imagine you are working on something in a window.&lt;/p&gt;
&lt;p&gt;Maybe a document.&lt;/p&gt;
&lt;p&gt;Maybe a source file.&lt;/p&gt;
&lt;p&gt;Maybe a graphics project.&lt;/p&gt;
&lt;p&gt;Maybe something else entirely.&lt;/p&gt;
&lt;p&gt;Around that work you usually accumulate related stuff:&lt;/p&gt;
&lt;p&gt;another file,&lt;/p&gt;
&lt;p&gt;a reference image,&lt;/p&gt;
&lt;p&gt;a URL,&lt;/p&gt;
&lt;p&gt;a note,&lt;/p&gt;
&lt;p&gt;a clip,&lt;/p&gt;
&lt;p&gt;a shortcut,&lt;/p&gt;
&lt;p&gt;something you dragged over because you will need it again in ten minutes.&lt;/p&gt;
&lt;p&gt;Modern desktops are surprisingly bad at remembering that temporary working context.&lt;/p&gt;
&lt;p&gt;So the Workpad is basically:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;the tray of useful things that belongs with this work.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Not a second desktop.&lt;/p&gt;
&lt;p&gt;Not a replacement for folders.&lt;/p&gt;
&lt;p&gt;Not a giant project-management system hiding behind a paperclip icon.&lt;/p&gt;
&lt;p&gt;A contextual surface attached to the work you are doing.&lt;/p&gt;
&lt;p&gt;You can put related things there and have them stay associated with that context.&lt;/p&gt;
&lt;p&gt;The design has now been formalized far enough that it is no longer just a sketch on my mental whiteboard.&lt;/p&gt;
&lt;h2 id=&quot;it-should-still-look-like-the-thing-it-is&quot;&gt;It should still look like the thing it is&lt;/h2&gt;
&lt;p&gt;One detail I care about is object identity.&lt;/p&gt;
&lt;p&gt;If you put a file on the Workpad, it should still look like that file.&lt;/p&gt;
&lt;p&gt;If you put an application there, it should retain that application&apos;s identity.&lt;/p&gt;
&lt;p&gt;A reference should remain a reference.&lt;/p&gt;
&lt;p&gt;A URL should remain a URL.&lt;/p&gt;
&lt;p&gt;I do not want everything transformed into generic little &amp;quot;cards&amp;quot; because some design system decided all objects need rounded corners and the same icon.&lt;/p&gt;
&lt;p&gt;The object should keep its normal visual identity.&lt;/p&gt;
&lt;p&gt;And where possible, the Workpad should preserve where it came from.&lt;/p&gt;
&lt;p&gt;If you pulled in a file from a folder, you should be able to get back to that file.&lt;/p&gt;
&lt;p&gt;If something came from a document or another context, that provenance should not disappear just because you made it convenient to keep nearby.&lt;/p&gt;
&lt;p&gt;That seems like a small thing.&lt;/p&gt;
&lt;p&gt;I suspect it will matter a lot once people actually use it.&lt;/p&gt;
&lt;h2 id=&quot;the-desktop-should-help-without-becoming-your-manager&quot;&gt;The desktop should help without becoming your manager&lt;/h2&gt;
&lt;p&gt;This is also where some of the local-first research I have been doing starts to connect with the rest of Ceylon.&lt;/p&gt;
&lt;p&gt;I grew up using computers that worked because the computer was sitting in front of you.&lt;/p&gt;
&lt;p&gt;The C64 did not become confused because the Internet was down.&lt;/p&gt;
&lt;p&gt;The Amiga did not ask a remote service whether you still had permission to open your own document.&lt;/p&gt;
&lt;p&gt;A desktop computer was a place.&lt;/p&gt;
&lt;p&gt;Your files were there.&lt;/p&gt;
&lt;p&gt;Your software was there.&lt;/p&gt;
&lt;p&gt;Your work was there.&lt;/p&gt;
&lt;p&gt;You could navigate it without carrying a phone around as an external organ.&lt;/p&gt;
&lt;p&gt;There is quite a bit about modern computing I do not want to throw away.&lt;/p&gt;
&lt;p&gt;Networking is useful.&lt;/p&gt;
&lt;p&gt;Synchronization is useful.&lt;/p&gt;
&lt;p&gt;Remote collaboration is useful.&lt;/p&gt;
&lt;p&gt;Cloud services can be useful.&lt;/p&gt;
&lt;p&gt;But I want Ceylon&apos;s default assumption to be:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;your computer is useful on its own.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Network services should extend the machine.&lt;/p&gt;
&lt;p&gt;They should not be what grants the machine permission to exist.&lt;/p&gt;
&lt;p&gt;That is the direction behind the local-first work.&lt;/p&gt;
&lt;p&gt;Not &amp;quot;never use a server.&amp;quot;&lt;/p&gt;
&lt;p&gt;Not &amp;quot;pretend the Internet was a mistake.&amp;quot;&lt;/p&gt;
&lt;p&gt;Just restore the local computer as the authoritative place where the user&apos;s work can actually happen.&lt;/p&gt;
&lt;h2 id=&quot;local-first-also-fits-the-ownership-philosophy&quot;&gt;Local-first also fits the ownership philosophy&lt;/h2&gt;
&lt;p&gt;That idea meshes with another Ceylon principle I have been getting increasingly stubborn about:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You buy it, you own it.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you buy a machine, it is your machine.&lt;/p&gt;
&lt;p&gt;If you legitimately buy a copy of software, your ability to keep using that copy should not depend forever on whether some company still feels like operating a licensing server.&lt;/p&gt;
&lt;p&gt;If a vendor disappears, your computer should not wake up one morning and decide your purchase has become historical trivia.&lt;/p&gt;
&lt;p&gt;There are obviously details to work out around licensing, updates, services, intellectual property, and network-connected features.&lt;/p&gt;
&lt;p&gt;But the principle itself is not especially complicated.&lt;/p&gt;
&lt;p&gt;The computer should work for its owner.&lt;/p&gt;
&lt;p&gt;That seems like something personal computing used to understand almost automatically.&lt;/p&gt;
&lt;p&gt;Maybe we can remember how.&lt;/p&gt;
&lt;h2 id=&quot;this-is-not-all-going-into-alpha-tomorrow&quot;&gt;This is not all going into Alpha tomorrow&lt;/h2&gt;
&lt;p&gt;One important clarification:&lt;/p&gt;
&lt;p&gt;the local-first research is not an excuse to keep adding things to the A1 Alpha scope.&lt;/p&gt;
&lt;p&gt;I finally got that scope under control yesterday.&lt;/p&gt;
&lt;p&gt;I would like to keep it that way for at least 48 hours.&lt;/p&gt;
&lt;p&gt;The local-first work is being treated as a longer-term architectural direction.&lt;/p&gt;
&lt;p&gt;Where it affects foundational decisions now, I want to avoid painting ourselves into the wrong corner.&lt;/p&gt;
&lt;p&gt;But I am not stopping Alpha so we can invent the ultimate distributed personal-computing architecture first.&lt;/p&gt;
&lt;p&gt;That would be exactly the kind of thing I am trying to stop doing.&lt;/p&gt;
&lt;p&gt;Workpad is much closer to the immediate desktop work because it is a bounded NuGUI facility, and its specification work is now in good shape.&lt;/p&gt;
&lt;p&gt;The larger local-first model can develop behind the release line until it has earned its way forward.&lt;/p&gt;
&lt;p&gt;Look at that.&lt;/p&gt;
&lt;p&gt;I may actually be learning scope control.&lt;/p&gt;
&lt;h2 id=&quot;by-the-end-of-the-day-the-project-weighed-less&quot;&gt;By the end of the day, the project weighed less&lt;/h2&gt;
&lt;p&gt;Literally, in this case.&lt;/p&gt;
&lt;p&gt;We reclaimed just under &lt;strong&gt;300 GiB&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The canonical source remained intact.&lt;/p&gt;
&lt;p&gt;The active development state is cleaner.&lt;/p&gt;
&lt;p&gt;Old workspaces were reconciled instead of blindly discarded.&lt;/p&gt;
&lt;p&gt;The NuGUI research is better organized.&lt;/p&gt;
&lt;p&gt;Workpad has moved from &amp;quot;interesting desktop thought&amp;quot; toward a real specified facility.&lt;/p&gt;
&lt;p&gt;And the local-first work has a clearer principle underneath it:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;the computer should remain useful, understandable, and owned by the person sitting in front of it.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That is not a bad result for a day that started with disk usage.&lt;/p&gt;
&lt;p&gt;Yesterday I failed to take a day off.&lt;/p&gt;
&lt;p&gt;Today I apparently reorganized half the project and reconsidered personal computing.&lt;/p&gt;
&lt;p&gt;I may need somebody else to define &amp;quot;rest&amp;quot; for me.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Project Ceylon is an independent retro-futurist operating-system project exploring what a modern creative workstation might look like if some of the best ideas of earlier personal computers had continued evolving instead of being discarded.&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Retrocomputing</category><category>Operating Systems</category><category>NuGUI</category><category>Workpad</category><category>Local-First</category><category>Development Process</category><author>Mike</author></item><item><title>Project Ceylon Development Log — September 26, 2026: Remember That Day Off I Was Going to Take?</title><link>https://ceylonprojectng.com/journal/project-ceylon-development-log-september-26-2026-remember-that-day-off-i-was-going-to-take/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/project-ceylon-development-log-september-26-2026-remember-that-day-off-i-was-going-to-take/</guid><description>Remember yesterday when I said I was probably going to take a day or two off?</description><pubDate>Sat, 26 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Remember yesterday when I said I was probably going to take a day or two off?&lt;/p&gt;
&lt;p&gt;Yeah.&lt;/p&gt;
&lt;p&gt;About that.&lt;/p&gt;
&lt;p&gt;I did not take the day off.&lt;/p&gt;
&lt;p&gt;Instead, I went looking at Ceylon&apos;s display architecture and discovered that one of the project&apos;s oldest visible milestones was both completely real and not quite what we thought it was.&lt;/p&gt;
&lt;p&gt;Which is a very Project Ceylon way to spend a Saturday.&lt;/p&gt;
&lt;p&gt;The short version is this:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First Light was real. NuGUI really did put graphical output on the screen.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;But the live path that produced those pixels did &lt;strong&gt;not&lt;/strong&gt; travel through Nu-Iris the way the architecture said it eventually should.&lt;/p&gt;
&lt;p&gt;We had graphics.&lt;/p&gt;
&lt;p&gt;We had the screenshot.&lt;/p&gt;
&lt;p&gt;We had a working visible result.&lt;/p&gt;
&lt;p&gt;What we did not yet have was proof that Nu-Iris itself was actually the presentation authority for that result.&lt;/p&gt;
&lt;p&gt;That distinction turned out to matter a lot.&lt;/p&gt;
&lt;h2 id=&quot;first-light-still-counts&quot;&gt;First Light still counts&lt;/h2&gt;
&lt;p&gt;I want to start there, because it would be easy to overcorrect this story.&lt;/p&gt;
&lt;p&gt;Ceylon&apos;s First Light milestone was not fake.&lt;/p&gt;
&lt;p&gt;Pixels appeared on screen through Ceylon code running in the QEMU machine.&lt;/p&gt;
&lt;p&gt;NuGUI produced visible graphical output.&lt;/p&gt;
&lt;p&gt;That happened.&lt;/p&gt;
&lt;p&gt;What changed today is our understanding of &lt;strong&gt;how&lt;/strong&gt; those pixels got there.&lt;/p&gt;
&lt;p&gt;The live path was effectively:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NuGUI → shared display memory → notification → PCI/display service → Bochs framebuffer&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The standalone Nu-Iris service and its intended onboard presentation path were being bypassed.&lt;/p&gt;
&lt;p&gt;So the mistake was not:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;We thought we had graphics, but actually we didn&apos;t.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The mistake was:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;We treated visible graphics as stronger evidence about the architecture than it really was.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Those are very different problems.&lt;/p&gt;
&lt;p&gt;One is embarrassing.&lt;/p&gt;
&lt;p&gt;The other is useful.&lt;/p&gt;
&lt;p&gt;This one is useful.&lt;/p&gt;
&lt;h2 id=&quot;a-screenshot-can-prove-less-than-you-think&quot;&gt;A screenshot can prove less than you think&lt;/h2&gt;
&lt;p&gt;This may sound like nitpicking.&lt;/p&gt;
&lt;p&gt;After all, if the pixels showed up, who cares which service touched the framebuffer?&lt;/p&gt;
&lt;p&gt;I care.&lt;/p&gt;
&lt;p&gt;Because Nu-Iris is supposed to become Ceylon&apos;s display and presentation subsystem.&lt;/p&gt;
&lt;p&gt;That means it eventually needs to own things such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;presentation authority&lt;/li&gt;
&lt;li&gt;buffer ownership&lt;/li&gt;
&lt;li&gt;frame publication&lt;/li&gt;
&lt;li&gt;backpressure&lt;/li&gt;
&lt;li&gt;stale-frame handling&lt;/li&gt;
&lt;li&gt;pacing&lt;/li&gt;
&lt;li&gt;damage tracking&lt;/li&gt;
&lt;li&gt;software-rendering presentation&lt;/li&gt;
&lt;li&gt;future accelerated presentation&lt;/li&gt;
&lt;li&gt;multiple output providers&lt;/li&gt;
&lt;li&gt;media-oriented surfaces&lt;/li&gt;
&lt;li&gt;failure and restart behavior&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If NuGUI can quietly bypass all of that and write through a lower-level path, then Nu-Iris can look complete while the actual desktop is not using it.&lt;/p&gt;
&lt;p&gt;That is exactly the kind of architectural drift I have been trying to prevent elsewhere in the system.&lt;/p&gt;
&lt;p&gt;So once we found it, the answer was not:&lt;/p&gt;
&lt;p&gt;&amp;quot;Well, the picture appeared, so close enough.&amp;quot;&lt;/p&gt;
&lt;p&gt;The answer was:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stop. Figure out what is actually live. Document it. Then fix the architecture deliberately.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-current-display-path-is-very-old-school&quot;&gt;The current display path is very old-school&lt;/h2&gt;
&lt;p&gt;The audit also showed just how primitive the current Bochs presentation path still is.&lt;/p&gt;
&lt;p&gt;And I mean that affectionately.&lt;/p&gt;
&lt;p&gt;Sort of.&lt;/p&gt;
&lt;p&gt;The current path copies a full framebuffer using straightforward CPU writes.&lt;/p&gt;
&lt;p&gt;At 1024×768 with 32-bit pixels, that is 3,145,728 bytes for a full frame.&lt;/p&gt;
&lt;p&gt;There is no sophisticated damage system avoiding unnecessary work.&lt;/p&gt;
&lt;p&gt;No page flipping.&lt;/p&gt;
&lt;p&gt;No DMA presentation path.&lt;/p&gt;
&lt;p&gt;No SIMD-optimized copy path.&lt;/p&gt;
&lt;p&gt;No modern zero-copy surface handoff.&lt;/p&gt;
&lt;p&gt;No clever hardware acceleration hiding underneath it.&lt;/p&gt;
&lt;p&gt;It is basically:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Here are the pixels. Move the pixels.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;And you know what?&lt;/p&gt;
&lt;p&gt;For First Light, that was fine.&lt;/p&gt;
&lt;p&gt;The problem is not that the early implementation was simple.&lt;/p&gt;
&lt;p&gt;The problem would be pretending that the early implementation is the architecture we want to carry forward.&lt;/p&gt;
&lt;p&gt;It isn&apos;t.&lt;/p&gt;
&lt;h2 id=&quot;so-nu-iris-just-became-its-own-modernization-project&quot;&gt;So Nu-Iris just became its own modernization project&lt;/h2&gt;
&lt;p&gt;This is one of those moments where fixing one discovery turns into a new development tranche.&lt;/p&gt;
&lt;p&gt;The immediate job is not &amp;quot;make Iris faster.&amp;quot;&lt;/p&gt;
&lt;p&gt;The immediate job is more basic:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;make the live desktop actually use Nu-Iris correctly.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That work is now being treated separately from the larger modernization effort.&lt;/p&gt;
&lt;p&gt;The first corrective stages are about fundamentals:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;establish real buffer identity and ownership;&lt;/li&gt;
&lt;li&gt;make publication explicit;&lt;/li&gt;
&lt;li&gt;prevent stale generations from being accepted;&lt;/li&gt;
&lt;li&gt;introduce bounded backpressure;&lt;/li&gt;
&lt;li&gt;make the presentation relationship trustworthy;&lt;/li&gt;
&lt;li&gt;then route live NuGUI presentation through Nu-Iris instead of around it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Only after that foundation is proven does it make sense to start piling performance work on top.&lt;/p&gt;
&lt;p&gt;Because optimizing the wrong path very efficiently is still the wrong path.&lt;/p&gt;
&lt;h2 id=&quot;and-yes-there-is-a-much-bigger-iris-list-now&quot;&gt;And yes, there is a much bigger Iris list now&lt;/h2&gt;
&lt;p&gt;Once we started looking seriously at where Nu-Iris eventually needs to go, the list got large quickly.&lt;/p&gt;
&lt;p&gt;Some of the things now on the research and modernization horizon include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;damage-aware presentation;&lt;/li&gt;
&lt;li&gt;stale-frame suppression;&lt;/li&gt;
&lt;li&gt;reusable buffers;&lt;/li&gt;
&lt;li&gt;frame pacing and presentation feedback;&lt;/li&gt;
&lt;li&gt;faster CPU copy and composition paths;&lt;/li&gt;
&lt;li&gt;tiled composition;&lt;/li&gt;
&lt;li&gt;multicore rendering support;&lt;/li&gt;
&lt;li&gt;SIMD where it actually helps;&lt;/li&gt;
&lt;li&gt;direct scanout where appropriate;&lt;/li&gt;
&lt;li&gt;zero-copy or reduced-copy surfaces;&lt;/li&gt;
&lt;li&gt;high-rate 1080p qualification;&lt;/li&gt;
&lt;li&gt;media-friendly pixel formats such as YUV;&lt;/li&gt;
&lt;li&gt;multiple outputs;&lt;/li&gt;
&lt;li&gt;restart-safe presentation;&lt;/li&gt;
&lt;li&gt;measurable latency and throughput;&lt;/li&gt;
&lt;li&gt;future hardware-accelerated providers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That does &lt;strong&gt;not&lt;/strong&gt; mean all of that suddenly became an A1 Alpha requirement.&lt;/p&gt;
&lt;p&gt;It means the architecture now has a clearer road from:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;quot;I can put pixels on a screen&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;to:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;quot;I have a display subsystem I can build a workstation on.&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Those are not the same milestone.&lt;/p&gt;
&lt;p&gt;I know that much more viscerally now than I did a few weeks ago.&lt;/p&gt;
&lt;h2 id=&quot;the-first-corrective-work-is-already-paying-off&quot;&gt;The first corrective work is already paying off&lt;/h2&gt;
&lt;p&gt;The good news is that this was not just an afternoon spent writing a depressing report.&lt;/p&gt;
&lt;p&gt;We started correcting the foundation.&lt;/p&gt;
&lt;p&gt;The current integration work has already established several things that were previously too implicit:&lt;/p&gt;
&lt;p&gt;real buffer identity,&lt;/p&gt;
&lt;p&gt;clear ownership,&lt;/p&gt;
&lt;p&gt;immutable publication through trusted state,&lt;/p&gt;
&lt;p&gt;bounded two-buffer backpressure,&lt;/p&gt;
&lt;p&gt;and protection against stale generations being accepted as current.&lt;/p&gt;
&lt;p&gt;That is exactly the kind of boring infrastructure that makes later optimization possible without turning the display stack into a collection of timing accidents.&lt;/p&gt;
&lt;p&gt;There is still an important next step:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;the live NuGUI path itself has to be routed through the Iris service.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Until that happens, I am not calling the end-to-end architecture finished.&lt;/p&gt;
&lt;p&gt;First Light remains First Light.&lt;/p&gt;
&lt;p&gt;But the next light needs to be honest about the path that produced it.&lt;/p&gt;
&lt;h2 id=&quot;meanwhile-i-started-thinking-about-the-machine-this-eventually-runs-on&quot;&gt;Meanwhile, I started thinking about the machine this eventually runs on&lt;/h2&gt;
&lt;p&gt;Because apparently discovering one architectural problem was not enough for the day, I also spent time looking farther ahead at Ceylon&apos;s eventual certified hardware.&lt;/p&gt;
&lt;p&gt;Not because A1 Alpha suddenly moved to bare metal.&lt;/p&gt;
&lt;p&gt;It hasn&apos;t.&lt;/p&gt;
&lt;p&gt;A1 remains QEMU-first.&lt;/p&gt;
&lt;p&gt;But the whole point of the A-series is eventually to reach a stable enough software environment that the B-series can carry it onto known physical hardware.&lt;/p&gt;
&lt;p&gt;And that raises a practical question:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What kind of computer should Ceylon actually be sold on?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Not a laboratory controller.&lt;/p&gt;
&lt;p&gt;Not an exotic industrial board that costs three times as much because somebody promises to sell the exact same model for ten years.&lt;/p&gt;
&lt;p&gt;A normal, reproducible PC.&lt;/p&gt;
&lt;p&gt;Something serviceable.&lt;/p&gt;
&lt;p&gt;Something expandable.&lt;/p&gt;
&lt;p&gt;Something where replacement parts do not require an archaeological expedition.&lt;/p&gt;
&lt;p&gt;The current direction is toward ordinary commercial PC hardware with a controlled bill of materials rather than weird custom hardware for the sake of being different.&lt;/p&gt;
&lt;p&gt;One candidate baseline we looked at uses a commercial ASUS CSM motherboard with a Core i5-12500-class processor and 32 GB of DDR4.&lt;/p&gt;
&lt;p&gt;Nothing exotic.&lt;/p&gt;
&lt;p&gt;That is intentional.&lt;/p&gt;
&lt;h2 id=&quot;i-want-the-storage-to-be-accessible&quot;&gt;I want the storage to be accessible&lt;/h2&gt;
&lt;p&gt;One requirement I care about more than I expected is physical serviceability.&lt;/p&gt;
&lt;p&gt;If somebody buys a Ceylon machine someday, I do not want routine storage replacement to mean disassembling half the computer.&lt;/p&gt;
&lt;p&gt;So the current hardware thinking includes front-accessible storage.&lt;/p&gt;
&lt;p&gt;The idea is straightforward:&lt;/p&gt;
&lt;p&gt;system storage inside,&lt;/p&gt;
&lt;p&gt;additional independent drives accessible from the front,&lt;/p&gt;
&lt;p&gt;and no requirement to turn the thing into a RAID appliance.&lt;/p&gt;
&lt;p&gt;If a user wants another drive, replaceable storage, project media, scratch space, backups, whatever — I want that to be easy.&lt;/p&gt;
&lt;p&gt;Likewise, users should be able to install their own NVMe drives or add-in hardware.&lt;/p&gt;
&lt;p&gt;Certified hardware means:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;this is the configuration we have qualified and will stand behind.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It should not mean:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;the case is sacred and thou shalt not touch it.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you install unsupported hardware, that hardware is obviously outside the certified configuration.&lt;/p&gt;
&lt;p&gt;But it is still your computer.&lt;/p&gt;
&lt;p&gt;That distinction matters to me.&lt;/p&gt;
&lt;h2 id=&quot;and-the-machine-should-remember-what-changed&quot;&gt;And the machine should remember what changed&lt;/h2&gt;
&lt;p&gt;That hardware discussion led into another idea I like quite a bit.&lt;/p&gt;
&lt;p&gt;Ceylon&apos;s System Information utility should not merely tell you what hardware is installed &lt;strong&gt;right now&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The operating system should maintain a protected history of meaningful hardware changes over the life of the machine.&lt;/p&gt;
&lt;p&gt;Shipped with this memory.&lt;/p&gt;
&lt;p&gt;DIMM replaced on this date.&lt;/p&gt;
&lt;p&gt;Original NVMe removed.&lt;/p&gt;
&lt;p&gt;New drive installed.&lt;/p&gt;
&lt;p&gt;PCIe card added.&lt;/p&gt;
&lt;p&gt;Firmware changed.&lt;/p&gt;
&lt;p&gt;Network device replaced.&lt;/p&gt;
&lt;p&gt;And so on.&lt;/p&gt;
&lt;p&gt;Not because I want to spy on somebody&apos;s upgrades.&lt;/p&gt;
&lt;p&gt;Because if a machine comes back for support two years later, &amp;quot;this is not the hardware configuration we shipped&amp;quot; is useful information.&lt;/p&gt;
&lt;p&gt;The important part is that ordinary applications should not be able to rewrite that history.&lt;/p&gt;
&lt;p&gt;A privileged service should own it.&lt;/p&gt;
&lt;p&gt;The user-facing System Information application gets a controlled read-only view.&lt;/p&gt;
&lt;p&gt;Support tooling can get the deeper diagnostic view when appropriate.&lt;/p&gt;
&lt;p&gt;Again, simple idea on the surface.&lt;/p&gt;
&lt;p&gt;Much more useful once you think about supporting real machines for years instead of demoing one on a workbench.&lt;/p&gt;
&lt;h2 id=&quot;today-was-really-about-correcting-the-story&quot;&gt;Today was really about correcting the story&lt;/h2&gt;
&lt;p&gt;There is a pattern developing in Ceylon that I am starting to appreciate.&lt;/p&gt;
&lt;p&gt;The project gets something working.&lt;/p&gt;
&lt;p&gt;Then we go back and ask what &amp;quot;working&amp;quot; actually proved.&lt;/p&gt;
&lt;p&gt;Sometimes the answer is exactly what we expected.&lt;/p&gt;
&lt;p&gt;Sometimes it isn&apos;t.&lt;/p&gt;
&lt;p&gt;First Light proved that Ceylon could produce visible graphical output.&lt;/p&gt;
&lt;p&gt;It did &lt;strong&gt;not&lt;/strong&gt; prove that the final Nu-Iris architecture was already carrying those pixels.&lt;/p&gt;
&lt;p&gt;Now we know that.&lt;/p&gt;
&lt;p&gt;And because we know it before Alpha, we have the opportunity to fix the architecture instead of documenting the shortcut as if it were intentional.&lt;/p&gt;
&lt;p&gt;That is progress.&lt;/p&gt;
&lt;p&gt;Not the glamorous kind.&lt;/p&gt;
&lt;p&gt;There is no new desktop screenshot tonight.&lt;/p&gt;
&lt;p&gt;There is no airplane to crash yet.&lt;/p&gt;
&lt;p&gt;There is no synthesizer riff to play.&lt;/p&gt;
&lt;p&gt;But the display stack is becoming more honest about what it is, what it isn&apos;t, and what still has to happen.&lt;/p&gt;
&lt;p&gt;And the future hardware is starting to look less like an abstract &amp;quot;bare-metal target&amp;quot; and more like a computer I could actually put on somebody&apos;s desk and expect them to live with.&lt;/p&gt;
&lt;p&gt;So, no.&lt;/p&gt;
&lt;p&gt;I did not take the day off.&lt;/p&gt;
&lt;p&gt;Apparently I am very bad at that.&lt;/p&gt;
&lt;p&gt;Maybe tomorrow.&lt;/p&gt;
&lt;p&gt;No promises.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Project Ceylon is an independent retro-futurist operating-system project exploring what a modern creative workstation might look like if some of the best ideas of earlier personal computers had continued evolving instead of being discarded.&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Retrocomputing</category><category>Operating Systems</category><category>Nu-Iris</category><category>NuGUI</category><category>Display Architecture</category><category>Debugging</category><category>Hardware</category><author>Mike</author></item><item><title>Project Ceylon Development Log — September 25, 2026: Okay, So What Exactly Is A1 Alpha?</title><link>https://ceylonprojectng.com/journal/project-ceylon-development-log-september-25-2026-okay-so-what-exactly-is-a1-alpha/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/project-ceylon-development-log-september-25-2026-okay-so-what-exactly-is-a1-alpha/</guid><description>One of the problems with building an operating system in public is that eventually somebody asks a perfectly reasonable question:</description><pubDate>Fri, 25 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;One of the problems with building an operating system in public is that eventually somebody asks a perfectly reasonable question:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;quot;So what exactly is in the first release?&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;And for a while, my answer to that was basically:&lt;/p&gt;
&lt;p&gt;&amp;quot;Well... a lot of things.&amp;quot;&lt;/p&gt;
&lt;p&gt;Which is not a release plan.&lt;/p&gt;
&lt;p&gt;It is a shopping list with optimism attached.&lt;/p&gt;
&lt;p&gt;Over the last couple of days, Ceylon has finally reached the point where I needed to stop treating &lt;strong&gt;A1 Alpha&lt;/strong&gt; as a vague future event and define what it actually means.&lt;/p&gt;
&lt;p&gt;Not the final A1 release.&lt;/p&gt;
&lt;p&gt;Not the later commercial hardware version.&lt;/p&gt;
&lt;p&gt;Not every application I eventually want.&lt;/p&gt;
&lt;p&gt;The first proof-of-life release somebody besides me will be able to boot inside QEMU, use for a while, complain about, break in unexpected ways, and hopefully understand well enough to tell me what is wrong with it.&lt;/p&gt;
&lt;p&gt;That turned into a much bigger conversation than I expected.&lt;/p&gt;
&lt;p&gt;Because once you define the first release honestly, you have to answer two questions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;What absolutely has to be there?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What are we willing to admit is not there yet?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Today was mostly about answering those.&lt;/p&gt;
&lt;h2 id=&quot;alpha-is-not-the-finish-line&quot;&gt;Alpha is not the finish line&lt;/h2&gt;
&lt;p&gt;The first thing I needed to get straight in my own head was what the word &lt;strong&gt;Alpha&lt;/strong&gt; means for Ceylon.&lt;/p&gt;
&lt;p&gt;A1 Alpha is not a miniature version of the final operating system.&lt;/p&gt;
&lt;p&gt;It is a checkpoint inside A1.&lt;/p&gt;
&lt;p&gt;The sequence is more like this:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A1 Alpha → feedback → fixes → continue A1 → freeze the intended A1 environment → then begin B1 hardware work&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That distinction matters.&lt;/p&gt;
&lt;p&gt;The A-series is the virtual/reference-machine line.&lt;/p&gt;
&lt;p&gt;The B-series is where Ceylon eventually moves onto certified physical hardware.&lt;/p&gt;
&lt;p&gt;So I do not need to drag every future B-series requirement backward into the first Alpha just because I know it will matter someday.&lt;/p&gt;
&lt;p&gt;That would be a fantastic way to make sure Alpha never ships.&lt;/p&gt;
&lt;p&gt;The Alpha has one job:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;prove that Ceylon has become a usable computer instead of a collection of qualified subsystems.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That is the line I am trying to cross.&lt;/p&gt;
&lt;h2 id=&quot;authentication-almost-became-one-of-those-things-that-blocked-everything&quot;&gt;Authentication almost became one of those things that blocked everything&lt;/h2&gt;
&lt;p&gt;Authentication is a good example of where defining Alpha helped.&lt;/p&gt;
&lt;p&gt;Ceylon absolutely needs real authentication.&lt;/p&gt;
&lt;p&gt;The full A1 release will have it.&lt;/p&gt;
&lt;p&gt;But does the first Alpha need to boot into a login screen and refuse to do anything until the entire authentication path is production-complete?&lt;/p&gt;
&lt;p&gt;After looking at what Alpha is actually for, the answer is no.&lt;/p&gt;
&lt;p&gt;The Alpha will boot under a defined local alpha principal.&lt;/p&gt;
&lt;p&gt;That does &lt;strong&gt;not&lt;/strong&gt; mean &amp;quot;accept anything somebody types into a password box.&amp;quot;&lt;/p&gt;
&lt;p&gt;It means authentication is not required to prove the desktop, applications, storage, audio, development environment and interaction model.&lt;/p&gt;
&lt;p&gt;The full A1 still requires the real authentication system.&lt;/p&gt;
&lt;p&gt;Alpha does not.&lt;/p&gt;
&lt;p&gt;That one decision removes a major dependency from the proof-of-life path without weakening the architecture we are actually building.&lt;/p&gt;
&lt;p&gt;There is a difference between postponing a feature and pretending it does not matter.&lt;/p&gt;
&lt;p&gt;This is the first one.&lt;/p&gt;
&lt;h2 id=&quot;so-what-actually-ships&quot;&gt;So what actually ships?&lt;/h2&gt;
&lt;p&gt;This was the useful part.&lt;/p&gt;
&lt;p&gt;Instead of saying &amp;quot;desktop and some apps,&amp;quot; I finally locked the initial Alpha application list.&lt;/p&gt;
&lt;p&gt;The basic system needs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NuGUI&lt;/li&gt;
&lt;li&gt;NuDOS&lt;/li&gt;
&lt;li&gt;Ceylon Terminal&lt;/li&gt;
&lt;li&gt;File Manager&lt;/li&gt;
&lt;li&gt;basic Settings/System Information&lt;/li&gt;
&lt;li&gt;a Welcome/Help application&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That gives somebody an actual machine to navigate.&lt;/p&gt;
&lt;p&gt;Then the development side:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NuBASIC Level 1&lt;/li&gt;
&lt;li&gt;a simple source/text editor&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I have said before that NuBASIC matters to me.&lt;/p&gt;
&lt;p&gt;I grew up in an era where getting a computer home usually meant you also got a way to make the computer do something yourself.&lt;/p&gt;
&lt;p&gt;I want some of that back.&lt;/p&gt;
&lt;p&gt;Not because BASIC is the only language Ceylon should ever support.&lt;/p&gt;
&lt;p&gt;Obviously it isn&apos;t.&lt;/p&gt;
&lt;p&gt;But because a first-time user should be able to boot the Alpha, open the programming environment, type something, run it and immediately understand that this is a machine you can create with.&lt;/p&gt;
&lt;p&gt;Then multimedia:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Image Viewer&lt;/li&gt;
&lt;li&gt;Video Player&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And audio:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;basic Synth&lt;/li&gt;
&lt;li&gt;basic Sequencer&lt;/li&gt;
&lt;li&gt;basic DAW&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Not &amp;quot;basic&amp;quot; in the sense of fake buttons over a demo routine.&lt;/p&gt;
&lt;p&gt;Basic in the sense of a deliberately bounded first version that establishes the real architecture underneath it.&lt;/p&gt;
&lt;p&gt;Then there are two different game/demo workloads.&lt;/p&gt;
&lt;p&gt;The first is a &lt;strong&gt;Ceylon Asteroids-style demo&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;That one is intentionally simple.&lt;/p&gt;
&lt;p&gt;It is there to prove that a native Ceylon application can take input, update game state, render frames, produce sound, keep score, and remain responsive without needing the much larger machinery behind the showcase game.&lt;/p&gt;
&lt;p&gt;It should be something I can launch quickly and use as a visual sanity check:&lt;/p&gt;
&lt;p&gt;Does input work?&lt;/p&gt;
&lt;p&gt;Does timing work?&lt;/p&gt;
&lt;p&gt;Does software rendering work?&lt;/p&gt;
&lt;p&gt;Does audio work?&lt;/p&gt;
&lt;p&gt;Can the machine run a basic native arcade workload without doing anything weird?&lt;/p&gt;
&lt;p&gt;Then there is the game.&lt;/p&gt;
&lt;p&gt;Which, naturally, stopped being a tiny game almost immediately.&lt;/p&gt;
&lt;h2 id=&quot;first-the-simple-game-an-asteroids-style-ceylon-demo&quot;&gt;First, the simple game: an Asteroids-style Ceylon demo&lt;/h2&gt;
&lt;p&gt;Before Juggernaut, Alpha needs something smaller and more immediate.&lt;/p&gt;
&lt;p&gt;The Asteroids-style demo fills that role.&lt;/p&gt;
&lt;p&gt;The point is not to recreate Atari&apos;s game one-for-one.&lt;/p&gt;
&lt;p&gt;The point is to use a familiar arcade structure as a compact Ceylon proof.&lt;/p&gt;
&lt;p&gt;A ship.&lt;/p&gt;
&lt;p&gt;Objects moving through a playfield.&lt;/p&gt;
&lt;p&gt;Shots.&lt;/p&gt;
&lt;p&gt;Collisions.&lt;/p&gt;
&lt;p&gt;Score.&lt;/p&gt;
&lt;p&gt;Sound.&lt;/p&gt;
&lt;p&gt;Responsive controls.&lt;/p&gt;
&lt;p&gt;Nothing about that should require a huge engine or complicated asset pipeline.&lt;/p&gt;
&lt;p&gt;That is exactly why it is useful.&lt;/p&gt;
&lt;p&gt;If the Asteroids-style demo starts behaving badly, I can investigate a relatively small stack without wondering whether a sophisticated AI system, 3D renderer, network path, replay system, or large asset set is getting in the way.&lt;/p&gt;
&lt;p&gt;It is the quick confidence test.&lt;/p&gt;
&lt;p&gt;Juggernaut is something else entirely.&lt;/p&gt;
&lt;h2 id=&quot;apparently-ceylon-needed-a-world-war-i-dogfight&quot;&gt;Apparently Ceylon needed a World War I dogfight&lt;/h2&gt;
&lt;p&gt;I knew A1 also needed a more demanding game.&lt;/p&gt;
&lt;p&gt;Not because Ceylon is a game console.&lt;/p&gt;
&lt;p&gt;Because a game is one of the best ways I can think of to force a general-purpose operating system to prove a bunch of things at once.&lt;/p&gt;
&lt;p&gt;Timing.&lt;/p&gt;
&lt;p&gt;Input.&lt;/p&gt;
&lt;p&gt;Audio.&lt;/p&gt;
&lt;p&gt;Rendering.&lt;/p&gt;
&lt;p&gt;Storage.&lt;/p&gt;
&lt;p&gt;Networking.&lt;/p&gt;
&lt;p&gt;Scheduling.&lt;/p&gt;
&lt;p&gt;Application lifecycle.&lt;/p&gt;
&lt;p&gt;Deterministic replay.&lt;/p&gt;
&lt;p&gt;Sustained load.&lt;/p&gt;
&lt;p&gt;And whether the machine is still fun to use while all of that is happening.&lt;/p&gt;
&lt;p&gt;The working title is &lt;strong&gt;Juggernaut&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The current V1 concept is a WWI-inspired airborne dogfighting game.&lt;/p&gt;
&lt;p&gt;Two aircraft.&lt;/p&gt;
&lt;p&gt;You start in the air.&lt;/p&gt;
&lt;p&gt;No taxiing around an airfield.&lt;/p&gt;
&lt;p&gt;No pre-flight checklist.&lt;/p&gt;
&lt;p&gt;No campaign logistics.&lt;/p&gt;
&lt;p&gt;No pretending this is a military flight simulator.&lt;/p&gt;
&lt;p&gt;Just:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Two aircraft enter the fight. One leaves.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The two initial modes are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;human versus computer&lt;/li&gt;
&lt;li&gt;human versus network human&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The difficulty settings are currently named:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;WALK&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RUN&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OMG!&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you have been following Ceylon long enough, those names probably make sense.&lt;/p&gt;
&lt;p&gt;If not, don&apos;t worry about it.&lt;/p&gt;
&lt;p&gt;They will.&lt;/p&gt;
&lt;p&gt;The important thing is that the difficulty system is not supposed to cheat.&lt;/p&gt;
&lt;p&gt;OMG! does not get magic bullets, secret extra health or impossible physics.&lt;/p&gt;
&lt;p&gt;It gets a better pilot.&lt;/p&gt;
&lt;p&gt;Faster reactions.&lt;/p&gt;
&lt;p&gt;Better energy management.&lt;/p&gt;
&lt;p&gt;Better pursuit.&lt;/p&gt;
&lt;p&gt;Better tactical choices.&lt;/p&gt;
&lt;p&gt;If it beats you, I want the answer to be:&lt;/p&gt;
&lt;p&gt;&amp;quot;That thing flew better than I did.&amp;quot;&lt;/p&gt;
&lt;p&gt;Not:&lt;/p&gt;
&lt;p&gt;&amp;quot;The computer changed the rules.&amp;quot;&lt;/p&gt;
&lt;h2 id=&quot;the-game-is-also-a-benchmark-wearing-goggles&quot;&gt;The game is also a benchmark wearing goggles&lt;/h2&gt;
&lt;p&gt;There is another reason Juggernaut belongs in A1.&lt;/p&gt;
&lt;p&gt;Ceylon&apos;s graphics path is CPU-first.&lt;/p&gt;
&lt;p&gt;The game is expected to render through Nu-Iris in software.&lt;/p&gt;
&lt;p&gt;The aspirational performance target is 1920×1080 at 60 frames per second on an i5-8500-class six-core CPU with 16 GiB of memory and no GPU acceleration helping the game.&lt;/p&gt;
&lt;p&gt;If the evidence eventually tells us that 1280×720 at 60 is the honest target, then that is what we will ship.&lt;/p&gt;
&lt;p&gt;But I want us to earn that conclusion with measurements instead of assuming software rendering has to be slow because everybody stopped caring about it twenty years ago.&lt;/p&gt;
&lt;p&gt;That means the renderer is being designed around the things you would expect if you were serious about CPU graphics:&lt;/p&gt;
&lt;p&gt;multicore tiling,&lt;/p&gt;
&lt;p&gt;cache-aware data layouts,&lt;/p&gt;
&lt;p&gt;SIMD,&lt;/p&gt;
&lt;p&gt;bounded worker queues,&lt;/p&gt;
&lt;p&gt;minimized allocation,&lt;/p&gt;
&lt;p&gt;culling,&lt;/p&gt;
&lt;p&gt;reduced overdraw,&lt;/p&gt;
&lt;p&gt;careful buffer handling,&lt;/p&gt;
&lt;p&gt;and real instrumentation so we know where the frame time actually went.&lt;/p&gt;
&lt;p&gt;The same game core also needs to support AI-versus-AI operation, deterministic replay and a hidden zero-player soak mode.&lt;/p&gt;
&lt;p&gt;So the game can entertain somebody one minute and spend the night trying to break the operating system the next.&lt;/p&gt;
&lt;p&gt;That seems appropriately Ceylon.&lt;/p&gt;
&lt;h2 id=&quot;and-then-the-synthesizer-got-serious&quot;&gt;And then the synthesizer got serious&lt;/h2&gt;
&lt;p&gt;The audio side had a similar moment today.&lt;/p&gt;
&lt;p&gt;The A1 Synth is now specified much more concretely.&lt;/p&gt;
&lt;p&gt;At its center, it is intentionally understandable:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;two oscillators&lt;/li&gt;
&lt;li&gt;white noise&lt;/li&gt;
&lt;li&gt;resonant low-pass filter&lt;/li&gt;
&lt;li&gt;amplifier envelope&lt;/li&gt;
&lt;li&gt;filter envelope&lt;/li&gt;
&lt;li&gt;LFO&lt;/li&gt;
&lt;li&gt;modulation&lt;/li&gt;
&lt;li&gt;mono/poly operation&lt;/li&gt;
&lt;li&gt;glide&lt;/li&gt;
&lt;li&gt;velocity&lt;/li&gt;
&lt;li&gt;presets&lt;/li&gt;
&lt;li&gt;mono or stereo output&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is enough to make a real instrument.&lt;/p&gt;
&lt;p&gt;But the important architectural decision is what sits around it.&lt;/p&gt;
&lt;p&gt;The Alpha synth is also intended to be the first visible proof of Ceylon&apos;s plugin-host architecture.&lt;/p&gt;
&lt;p&gt;The current design includes a Ceylon-native VST3 instrument path and four effect insert slots.&lt;/p&gt;
&lt;p&gt;Before somebody reads that as &amp;quot;Ceylon runs every Windows VST now,&amp;quot; no.&lt;/p&gt;
&lt;p&gt;That is not what I am saying.&lt;/p&gt;
&lt;p&gt;The important part is the architecture.&lt;/p&gt;
&lt;p&gt;Third-party plugin code should not get to wander into the audio engine and take the whole thing down because somebody dereferenced something stupid during a callback.&lt;/p&gt;
&lt;p&gt;Plugins run in isolated workers.&lt;/p&gt;
&lt;p&gt;The real-time audio path remains bounded.&lt;/p&gt;
&lt;p&gt;The host manages lifecycle and state.&lt;/p&gt;
&lt;p&gt;Lyra owns routing, scheduling and deadline accounting.&lt;/p&gt;
&lt;p&gt;Aria owns the native instruments.&lt;/p&gt;
&lt;p&gt;And the same infrastructure is intended to serve the Synth, Sequencer and DAW instead of building three separate audio engines because that was expedient at the time.&lt;/p&gt;
&lt;p&gt;That is one of those decisions that does not make the first screenshot more exciting.&lt;/p&gt;
&lt;p&gt;It does make the second year of development considerably less miserable.&lt;/p&gt;
&lt;h2 id=&quot;applications-should-feel-simple-again&quot;&gt;Applications should feel simple again&lt;/h2&gt;
&lt;p&gt;Another piece that finally became concrete is the application packaging model.&lt;/p&gt;
&lt;p&gt;I miss the era when &amp;quot;installing&amp;quot; an application often meant:&lt;/p&gt;
&lt;p&gt;copy the application somewhere.&lt;/p&gt;
&lt;p&gt;And uninstalling it meant:&lt;/p&gt;
&lt;p&gt;delete it.&lt;/p&gt;
&lt;p&gt;Modern systems gained a lot of capability, but they also accumulated a remarkable amount of ceremony around putting a program on a computer.&lt;/p&gt;
&lt;p&gt;I do not want Ceylon to recreate the worst parts of that.&lt;/p&gt;
&lt;p&gt;So the current application model is built around self-contained bundles.&lt;/p&gt;
&lt;p&gt;An application owns its executable, assets, private runtime, libraries and other private dependencies.&lt;/p&gt;
&lt;p&gt;If two programs need incompatible versions of the same private library, fine.&lt;/p&gt;
&lt;p&gt;Each gets its own.&lt;/p&gt;
&lt;p&gt;Applications do &lt;strong&gt;not&lt;/strong&gt; install random pieces into Ceylon itself.&lt;/p&gt;
&lt;p&gt;They do not patch system libraries.&lt;/p&gt;
&lt;p&gt;They do not replace drivers.&lt;/p&gt;
&lt;p&gt;They do not decide the OS needs an update and quietly perform one.&lt;/p&gt;
&lt;p&gt;Vendors own their applications.&lt;/p&gt;
&lt;p&gt;Ceylon owns Ceylon.&lt;/p&gt;
&lt;p&gt;That boundary is going to be enforced by authority, not by a line in the developer documentation asking people to please behave.&lt;/p&gt;
&lt;p&gt;The bundles are also intended to be location-independent.&lt;/p&gt;
&lt;p&gt;An application might live in the Applications drawer.&lt;/p&gt;
&lt;p&gt;It might live on removable media.&lt;/p&gt;
&lt;p&gt;It might use a hybrid arrangement where the program stays on one device and authorized user data lives somewhere else.&lt;/p&gt;
&lt;p&gt;In the normal case:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;copy bundle = install&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;delete bundle = uninstall&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That feels like the right kind of old idea to bring forward.&lt;/p&gt;
&lt;h2 id=&quot;developers-should-not-have-to-move-into-ceylon-to-develop-for-ceylon&quot;&gt;Developers should not have to move into Ceylon to develop for Ceylon&lt;/h2&gt;
&lt;p&gt;This decision also settled something else I care about.&lt;/p&gt;
&lt;p&gt;I do not want outside developers to have to abandon the tools they already know just to target Ceylon.&lt;/p&gt;
&lt;p&gt;Portable application logic should be buildable and testable substantially outside the running OS.&lt;/p&gt;
&lt;p&gt;Then the Ceylon adapter connects it to NuGUI, storage, audio, networking, Kirk, input and the rest of the platform.&lt;/p&gt;
&lt;p&gt;The host-side version is a development harness.&lt;/p&gt;
&lt;p&gt;Ceylon remains the actual target.&lt;/p&gt;
&lt;p&gt;That means a developer should eventually be able to work in a loop that feels something like:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;build → package → run in Ceylon → debug → rebuild → replace bundle → run again&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;without writing an installer,&lt;/p&gt;
&lt;p&gt;without modifying the system image,&lt;/p&gt;
&lt;p&gt;and without turning their private dependencies into everybody else&apos;s problem.&lt;/p&gt;
&lt;p&gt;If I want people to write software for a new operating system, making their lives unnecessarily difficult seems like a poor recruiting strategy.&lt;/p&gt;
&lt;h2 id=&quot;the-alpha-finally-has-a-shape&quot;&gt;The Alpha finally has a shape&lt;/h2&gt;
&lt;p&gt;That is probably the most important thing that happened today.&lt;/p&gt;
&lt;p&gt;A1 Alpha is no longer just:&lt;/p&gt;
&lt;p&gt;&amp;quot;the point where enough stuff works that I think somebody else should try it.&amp;quot;&lt;/p&gt;
&lt;p&gt;It has a shape.&lt;/p&gt;
&lt;p&gt;It boots into a real desktop.&lt;/p&gt;
&lt;p&gt;It has a command environment.&lt;/p&gt;
&lt;p&gt;It has a terminal.&lt;/p&gt;
&lt;p&gt;It has files.&lt;/p&gt;
&lt;p&gt;It has system information.&lt;/p&gt;
&lt;p&gt;It has help.&lt;/p&gt;
&lt;p&gt;It has BASIC.&lt;/p&gt;
&lt;p&gt;It has an editor.&lt;/p&gt;
&lt;p&gt;It can show an image.&lt;/p&gt;
&lt;p&gt;It can play video.&lt;/p&gt;
&lt;p&gt;It can make sound.&lt;/p&gt;
&lt;p&gt;It has a synthesizer.&lt;/p&gt;
&lt;p&gt;It has a sequencer.&lt;/p&gt;
&lt;p&gt;It has the beginnings of a DAW.&lt;/p&gt;
&lt;p&gt;It has a simple Asteroids-style native arcade demo that can act as a quick visual proof that the core interactive stack is alive.&lt;/p&gt;
&lt;p&gt;And it has a ridiculous little biplane game whose hidden second job is trying to expose every timing and performance problem I failed to notice.&lt;/p&gt;
&lt;p&gt;There is also a feedback utility planned for the Alpha.&lt;/p&gt;
&lt;p&gt;That one is intentionally straightforward:&lt;/p&gt;
&lt;p&gt;write what happened,&lt;/p&gt;
&lt;p&gt;optionally include the relevant logs,&lt;/p&gt;
&lt;p&gt;send it back.&lt;/p&gt;
&lt;p&gt;Because once other people start touching this thing, the most valuable feature in the operating system may briefly become:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;quot;Tell Mike exactly how you broke it.&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;what-still-has-to-happen&quot;&gt;What still has to happen&lt;/h2&gt;
&lt;p&gt;Defining the contents does not magically make them exist.&lt;/p&gt;
&lt;p&gt;There is still a lot of work between here and release.&lt;/p&gt;
&lt;p&gt;NuGUI still needs to become the actual usable desktop environment.&lt;/p&gt;
&lt;p&gt;The application/runtime integration has to close.&lt;/p&gt;
&lt;p&gt;Storage has to become ordinary user-visible persistence instead of just a qualified block path.&lt;/p&gt;
&lt;p&gt;The terminal and file manager have to be finished.&lt;/p&gt;
&lt;p&gt;NuBASIC has to move from specification into the complete Level 1 implementation.&lt;/p&gt;
&lt;p&gt;The audio framework has to move from contracts and pieces into working applications.&lt;/p&gt;
&lt;p&gt;The Asteroids-style demo has to become a clean, dependable native proof-of-life workload.&lt;/p&gt;
&lt;p&gt;Juggernaut has to go from a very detailed specification to an actual airplane somebody can crash into a tree.&lt;/p&gt;
&lt;p&gt;The image and video paths have to become applications.&lt;/p&gt;
&lt;p&gt;The Alpha packaging and feedback flow have to work.&lt;/p&gt;
&lt;p&gt;And all of it has to be integrated into one reproducible QEMU machine without breaking the things underneath it.&lt;/p&gt;
&lt;p&gt;Which, based on the last several weeks, will probably be the part where Ceylon teaches me several entirely new varieties of humility.&lt;/p&gt;
&lt;h2 id=&quot;but-this-feels-different&quot;&gt;But this feels different&lt;/h2&gt;
&lt;p&gt;There is a psychological difference between a project with an endless list of things it could someday contain and a project with a defined first release.&lt;/p&gt;
&lt;p&gt;Yesterday the question was:&lt;/p&gt;
&lt;p&gt;&amp;quot;What else should Ceylon eventually do?&amp;quot;&lt;/p&gt;
&lt;p&gt;Today the much more useful question is:&lt;/p&gt;
&lt;p&gt;&amp;quot;Does this belong before Alpha or after Alpha?&amp;quot;&lt;/p&gt;
&lt;p&gt;That question is going to save us a lot of time.&lt;/p&gt;
&lt;p&gt;There are already things I want that are now firmly on the other side of that line.&lt;/p&gt;
&lt;p&gt;Good.&lt;/p&gt;
&lt;p&gt;They can wait.&lt;/p&gt;
&lt;p&gt;A1 Alpha does not have to prove everything Ceylon may become.&lt;/p&gt;
&lt;p&gt;It has to prove that Ceylon &lt;strong&gt;is&lt;/strong&gt; something.&lt;/p&gt;
&lt;p&gt;A coherent computer.&lt;/p&gt;
&lt;p&gt;A system somebody can sit down in front of, explore, create something with, play with, break, restart, and begin to understand.&lt;/p&gt;
&lt;p&gt;That is enough for the first public checkpoint.&lt;/p&gt;
&lt;p&gt;And, frankly, after the pace of the last couple of weeks, I think I am probably going to take a day or two off.&lt;/p&gt;
&lt;p&gt;The code will still be broken when I get back.&lt;/p&gt;
&lt;p&gt;I am reasonably confident of that.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Project Ceylon is an independent retro-futurist operating-system project exploring what a modern creative workstation might look like if some of the best ideas of earlier personal computers had continued evolving instead of being discarded.&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Retrocomputing</category><category>Operating Systems</category><category>A1 Alpha</category><category>NuBASIC</category><category>Juggernaut</category><category>Audio</category><category>Applications</category><author>Mike</author></item><item><title>Project Ceylon Development Log — September 24, 2026: 55 Out of 55 Passed. Then We Found the Test Was Wrong.</title><link>https://ceylonprojectng.com/journal/project-ceylon-development-log-september-24-2026-55-out-of-55-passed-then-we-found-the-test-was-wrong/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/project-ceylon-development-log-september-24-2026-55-out-of-55-passed-then-we-found-the-test-was-wrong/</guid><description>Yesterday I wrote that &quot;worked once&quot; is no longer one of our engineering states.</description><pubDate>Thu, 24 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Yesterday I wrote that &amp;quot;worked once&amp;quot; is no longer one of our engineering states.&lt;/p&gt;
&lt;p&gt;Apparently Ceylon took that personally.&lt;/p&gt;
&lt;p&gt;Today we got NuGUI through &lt;strong&gt;55 out of 55 requirements&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The compositor was producing reproducible pixels.&lt;/p&gt;
&lt;p&gt;Client crash containment worked.&lt;/p&gt;
&lt;p&gt;Bad handles were rejected.&lt;/p&gt;
&lt;p&gt;The negative tests passed.&lt;/p&gt;
&lt;p&gt;The independent review looked good.&lt;/p&gt;
&lt;p&gt;For a little while, it looked like we had reached the point where the new NuGUI work could be promoted into the main Ceylon line.&lt;/p&gt;
&lt;p&gt;Then we did the reconciliation work.&lt;/p&gt;
&lt;p&gt;And storage disappeared.&lt;/p&gt;
&lt;p&gt;Not &amp;quot;a disk test was flaky.&amp;quot;&lt;/p&gt;
&lt;p&gt;Not &amp;quot;one read failed.&amp;quot;&lt;/p&gt;
&lt;p&gt;Both drives were being rejected.&lt;/p&gt;
&lt;p&gt;The really irritating part?&lt;/p&gt;
&lt;p&gt;One of the smoke tests had already told us storage passed.&lt;/p&gt;
&lt;p&gt;It was wrong.&lt;/p&gt;
&lt;p&gt;That, more than anything else, is what today&apos;s work was about.&lt;/p&gt;
&lt;h2 id=&quot;first-the-good-news-nugui-really-did-make-a-lot-of-progress&quot;&gt;First, the good news: NuGUI really did make a lot of progress&lt;/h2&gt;
&lt;p&gt;I do not want the later failure to erase what actually worked.&lt;/p&gt;
&lt;p&gt;NuGUI&apos;s current D2 work is a substantial step forward.&lt;/p&gt;
&lt;p&gt;The compositor is no longer just an architectural sketch with a few pieces hanging off it.&lt;/p&gt;
&lt;p&gt;We now have bounded per-client resources.&lt;/p&gt;
&lt;p&gt;We have shared ring behavior with explicit ordering.&lt;/p&gt;
&lt;p&gt;We have damage-carrying presentation.&lt;/p&gt;
&lt;p&gt;We have real client-fault containment.&lt;/p&gt;
&lt;p&gt;We have stale-handle rejection.&lt;/p&gt;
&lt;p&gt;We have visible target output.&lt;/p&gt;
&lt;p&gt;And we have been deliberately testing what happens when applications misbehave instead of assuming polite applications forever.&lt;/p&gt;
&lt;p&gt;One of today&apos;s more satisfying tests involved deliberately crashing a client with a real invalid-instruction fault.&lt;/p&gt;
&lt;p&gt;Not once.&lt;/p&gt;
&lt;p&gt;Three times.&lt;/p&gt;
&lt;p&gt;The compositor survived.&lt;/p&gt;
&lt;p&gt;Another client kept running.&lt;/p&gt;
&lt;p&gt;The stale client handles were rejected afterward.&lt;/p&gt;
&lt;p&gt;That is exactly what I want from the architecture.&lt;/p&gt;
&lt;p&gt;If one application falls over, the desktop should not throw itself down the stairs in sympathy.&lt;/p&gt;
&lt;p&gt;The test suite also reached 55/55 requirements for the D2 scope.&lt;/p&gt;
&lt;p&gt;That is a real milestone.&lt;/p&gt;
&lt;p&gt;But it turns out there is a difference between:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;This component passed its requirements.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;and:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;This entire set of changes is safe to promote into the operating system.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Today was mostly about that difference.&lt;/p&gt;
&lt;h2 id=&quot;promotion-is-where-things-got-interesting&quot;&gt;Promotion is where things got interesting&lt;/h2&gt;
&lt;p&gt;The D2 work is not a tiny patch.&lt;/p&gt;
&lt;p&gt;It spans 29 commits and more than a hundred files.&lt;/p&gt;
&lt;p&gt;Along the way, pieces of the low-level development environment changed too: SDK pieces, kernel-facing dependencies, Rust support, launch configuration and some older diagnostic paths.&lt;/p&gt;
&lt;p&gt;That does not automatically make the work wrong.&lt;/p&gt;
&lt;p&gt;But it does mean promotion cannot be treated like copying one compositor binary into a directory and calling it done.&lt;/p&gt;
&lt;p&gt;The question became:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What exactly are we promoting?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;And more importantly:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What assumptions changed underneath the part we were actually testing?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That is where storage raised its hand.&lt;/p&gt;
&lt;h2 id=&quot;the-smoke-test-said-storage-passed&quot;&gt;The smoke test said storage passed&lt;/h2&gt;
&lt;p&gt;During reconciliation, both storage devices were rejected.&lt;/p&gt;
&lt;p&gt;That should have been impossible according to the smoke result.&lt;/p&gt;
&lt;p&gt;So we did what you do when the machine and the test disagree:&lt;/p&gt;
&lt;p&gt;we assumed the test was guilty until proven innocent.&lt;/p&gt;
&lt;p&gt;It was.&lt;/p&gt;
&lt;p&gt;The smoke check was not actually proving that usable volumes had been published.&lt;/p&gt;
&lt;p&gt;It was counting the presence of expected-looking log activity.&lt;/p&gt;
&lt;p&gt;Those are not the same thing.&lt;/p&gt;
&lt;p&gt;A system can print a line that looks encouraging while still failing the actual thing the line was supposed to represent.&lt;/p&gt;
&lt;p&gt;That sounds painfully obvious when written down.&lt;/p&gt;
&lt;p&gt;It is also exactly the kind of mistake automated testing can hide beautifully because the output is green and everybody wants to move on.&lt;/p&gt;
&lt;p&gt;The corrected question is not:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Did storage print the right message?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Did the expected volumes actually appear and remain usable?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is what the test should have been asking in the first place.&lt;/p&gt;
&lt;p&gt;So today we got one of those wonderful development milestones that does not look good on a feature list:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;we found a test that was capable of lying to us.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Honestly, I would rather find that now than after somebody else downloads A1.&lt;/p&gt;
&lt;h2 id=&quot;why-this-matters-more-than-one-storage-bug&quot;&gt;Why this matters more than one storage bug&lt;/h2&gt;
&lt;p&gt;This is not really a story about storage.&lt;/p&gt;
&lt;p&gt;It is a story about qualification.&lt;/p&gt;
&lt;p&gt;As Ceylon gets larger, it is becoming possible for one subsystem to be completely correct inside its own test boundary while the larger integrated machine is still wrong.&lt;/p&gt;
&lt;p&gt;NuGUI can pass its compositor tests.&lt;/p&gt;
&lt;p&gt;Storage can have passed yesterday.&lt;/p&gt;
&lt;p&gt;Networking can work.&lt;/p&gt;
&lt;p&gt;USB can work.&lt;/p&gt;
&lt;p&gt;And a change in the platform underneath all of them can still create a machine that is not the same machine we thought we qualified.&lt;/p&gt;
&lt;p&gt;That is why I keep coming back to the complete QEMU configuration as an artifact.&lt;/p&gt;
&lt;p&gt;The kernel matters.&lt;/p&gt;
&lt;p&gt;The SDK matters.&lt;/p&gt;
&lt;p&gt;The Rust bindings matter.&lt;/p&gt;
&lt;p&gt;The loader matters.&lt;/p&gt;
&lt;p&gt;The firmware matters.&lt;/p&gt;
&lt;p&gt;The launch command matters.&lt;/p&gt;
&lt;p&gt;The virtual devices matter.&lt;/p&gt;
&lt;p&gt;The order of those devices matters.&lt;/p&gt;
&lt;p&gt;Apparently, even a test script&apos;s definition of the word &amp;quot;pass&amp;quot; matters.&lt;/p&gt;
&lt;p&gt;Operating systems are very good at punishing vague nouns.&lt;/p&gt;
&lt;h2 id=&quot;so-we-stopped-promotion&quot;&gt;So we stopped promotion&lt;/h2&gt;
&lt;p&gt;This is the part where it would have been very easy to say:&lt;/p&gt;
&lt;p&gt;&amp;quot;NuGUI passed 55/55. Ship it.&amp;quot;&lt;/p&gt;
&lt;p&gt;We did not.&lt;/p&gt;
&lt;p&gt;The D2 work remains valuable.&lt;/p&gt;
&lt;p&gt;The qualification evidence remains valuable.&lt;/p&gt;
&lt;p&gt;But promotion into the canonical Ceylon tree is being held until the platform ancestry and storage behavior are reconciled properly.&lt;/p&gt;
&lt;p&gt;That also means preserving the exact artifacts that produced the qualified results.&lt;/p&gt;
&lt;p&gt;If a test result depends on a particular build environment, kernel revision, SDK revision or launcher, then that environment is part of the evidence.&lt;/p&gt;
&lt;p&gt;I do not want a future version of me staring at a directory six months from now wondering which mystery toolchain created the binary that everybody once agreed was good.&lt;/p&gt;
&lt;p&gt;Future Mike already has enough reasons to be irritated with Current Mike.&lt;/p&gt;
&lt;p&gt;No need to manufacture more.&lt;/p&gt;
&lt;h2 id=&quot;the-weirdly-good-news-the-rust-side-may-be-cleaner-than-expected&quot;&gt;The weirdly good news: the Rust side may be cleaner than expected&lt;/h2&gt;
&lt;p&gt;While sorting out the platform mismatch, we ran another experiment.&lt;/p&gt;
&lt;p&gt;The concern was that different parts of Ceylon might have quietly become dependent on incompatible Rust/platform combinations.&lt;/p&gt;
&lt;p&gt;If that were true, cleaning up the toolchain could turn into a major source-code migration.&lt;/p&gt;
&lt;p&gt;So we tested the obvious question:&lt;/p&gt;
&lt;p&gt;Can the applicable Ceylon components build against one homogeneous platform tuple?&lt;/p&gt;
&lt;p&gt;Then we tried the other candidate tuple.&lt;/p&gt;
&lt;p&gt;The result was encouraging.&lt;/p&gt;
&lt;p&gt;All &lt;strong&gt;30 applicable MicroKit protection domains&lt;/strong&gt; and &lt;strong&gt;40 host/no_std libraries&lt;/strong&gt; built on either single tuple with &lt;strong&gt;zero source changes&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;That does not yet prove that either tuple is the final answer.&lt;/p&gt;
&lt;p&gt;Build success is not runtime qualification.&lt;/p&gt;
&lt;p&gt;We have learned that lesson enough times now.&lt;/p&gt;
&lt;p&gt;But it strongly suggests that the source tree itself is not hopelessly split between two incompatible worlds.&lt;/p&gt;
&lt;p&gt;The next step is boot and runtime qualification, including proving that real volumes publish, not merely that storage says something pleasant in the log.&lt;/p&gt;
&lt;p&gt;Independent adversarial review is also still part of the closure work.&lt;/p&gt;
&lt;p&gt;So the result tonight is:&lt;/p&gt;
&lt;p&gt;promising, but not promoted.&lt;/p&gt;
&lt;p&gt;There is a phrase I seem to be using a lot lately.&lt;/p&gt;
&lt;h2 id=&quot;this-is-what-the-project-looks-like-now&quot;&gt;This is what the project looks like now&lt;/h2&gt;
&lt;p&gt;One thing I have noticed over the last couple of weeks is that the nature of the failures is changing.&lt;/p&gt;
&lt;p&gt;Early Ceylon failures were things like:&lt;/p&gt;
&lt;p&gt;&amp;quot;Nothing happened.&amp;quot;&lt;/p&gt;
&lt;p&gt;&amp;quot;Why are there no pixels?&amp;quot;&lt;/p&gt;
&lt;p&gt;&amp;quot;Why did the controller never start?&amp;quot;&lt;/p&gt;
&lt;p&gt;&amp;quot;Why is this pointer zero?&amp;quot;&lt;/p&gt;
&lt;p&gt;Those are hard problems, but they are usually fairly local.&lt;/p&gt;
&lt;p&gt;The newer failures are more annoying because the individual components often look healthy.&lt;/p&gt;
&lt;p&gt;The compositor works.&lt;/p&gt;
&lt;p&gt;The storage driver works.&lt;/p&gt;
&lt;p&gt;The build works.&lt;/p&gt;
&lt;p&gt;The machine boots.&lt;/p&gt;
&lt;p&gt;The test is green.&lt;/p&gt;
&lt;p&gt;And then some assumption between those things turns out not to mean what we thought it meant.&lt;/p&gt;
&lt;p&gt;That is a sign of a larger system.&lt;/p&gt;
&lt;p&gt;Not necessarily a mature one yet.&lt;/p&gt;
&lt;p&gt;But definitely a larger one.&lt;/p&gt;
&lt;p&gt;The job now is increasingly about making sure the pieces agree with each other.&lt;/p&gt;
&lt;h2 id=&quot;and-because-apparently-we-needed-another-project&quot;&gt;And because apparently we needed another project...&lt;/h2&gt;
&lt;p&gt;While the platform work was being sorted out, I also spent some time on the A1 audio side.&lt;/p&gt;
&lt;p&gt;The basic synth requirements are becoming more concrete.&lt;/p&gt;
&lt;p&gt;One decision that came out of that work is that I want the A1 synth architecture to be able to support VST3-style plugins rather than building a closed little island that becomes obsolete the moment somebody wants to extend it.&lt;/p&gt;
&lt;p&gt;That is not the same thing as saying every random desktop plugin will magically run on Ceylon tomorrow.&lt;/p&gt;
&lt;p&gt;There is a lot of architecture between those two statements.&lt;/p&gt;
&lt;p&gt;The current direction is to isolate third-party plugin execution, keep real-time audio on bounded low-latency paths, and make plugin failure somebody else&apos;s problem instead of the audio engine&apos;s last words.&lt;/p&gt;
&lt;p&gt;There will be more to say about that later.&lt;/p&gt;
&lt;p&gt;Tonight I am mostly mentioning it because apparently, while debugging an operating system, I needed something relaxing to do.&lt;/p&gt;
&lt;p&gt;So naturally I started designing plugin isolation.&lt;/p&gt;
&lt;h2 id=&quot;where-we-ended-the-night&quot;&gt;Where we ended the night&lt;/h2&gt;
&lt;p&gt;NuGUI D2 has real qualification behind it.&lt;/p&gt;
&lt;p&gt;The compositor work is substantially stronger than it was yesterday.&lt;/p&gt;
&lt;p&gt;Client crashes can be contained.&lt;/p&gt;
&lt;p&gt;Visible pixels are being produced.&lt;/p&gt;
&lt;p&gt;The D2 requirement set reached 55/55.&lt;/p&gt;
&lt;p&gt;Then promotion testing exposed a storage regression.&lt;/p&gt;
&lt;p&gt;That exposed a weak smoke test.&lt;/p&gt;
&lt;p&gt;That exposed a platform-ancestry question.&lt;/p&gt;
&lt;p&gt;And that, in turn, led to an experiment showing that the Rust source may be considerably easier to normalize than we feared.&lt;/p&gt;
&lt;p&gt;That is not a bad day&apos;s work.&lt;/p&gt;
&lt;p&gt;It is not the kind of progress that produces a dramatic screenshot.&lt;/p&gt;
&lt;p&gt;But it does make the eventual screenshot mean more.&lt;/p&gt;
&lt;p&gt;Because when I finally show a Ceylon desktop and say:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This works.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I do not want that sentence to mean:&lt;/p&gt;
&lt;p&gt;&amp;quot;The log looked about right.&amp;quot;&lt;/p&gt;
&lt;p&gt;I want it to mean we actually checked.&lt;/p&gt;
&lt;p&gt;And, increasingly, we&apos;re getting better at checking the checker.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Project Ceylon is an independent retro-futurist operating-system project exploring what a modern creative workstation might look like if some of the best ideas of earlier personal computers had continued evolving instead of being discarded.&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Retrocomputing</category><category>Operating Systems</category><category>NuGUI</category><category>Debugging</category><category>Testing</category><category>QEMU</category><author>Mike</author></item><item><title>Project Ceylon Development Log — September 23, 2026: So, How Much of This Thing Actually Exists?</title><link>https://ceylonprojectng.com/journal/project-ceylon-development-log-september-23-2026-so-how-much-of-this-thing-actually-exists/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/project-ceylon-development-log-september-23-2026-so-how-much-of-this-thing-actually-exists/</guid><description>A little over two weeks ago, I started this journal with a fairly ridiculous question:</description><pubDate>Wed, 23 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A little over two weeks ago, I started this journal with a fairly ridiculous question:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What would the Amiga have turned into if development had never stopped?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Not what would an Amiga emulator look like.&lt;/p&gt;
&lt;p&gt;Not how do we recreate an A500 with modern parts.&lt;/p&gt;
&lt;p&gt;What would the &lt;em&gt;idea&lt;/em&gt; have grown into?&lt;/p&gt;
&lt;p&gt;At that point I had a lot of research, a failed first attempt called Project Nu-Day, some working pieces, a pile of architectural notes, and considerably more confidence than was probably justified.&lt;/p&gt;
&lt;p&gt;Since then, Ceylon has become large enough that even I occasionally have to stop and ask:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Okay, what the hell have we actually built?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So tonight I am not going to bury y&apos;all in another fourteen pages of transaction IDs, PCI BAR addresses and qualification-state abbreviations.&lt;/p&gt;
&lt;p&gt;We&apos;ve done plenty of that lately.&lt;/p&gt;
&lt;p&gt;Instead, I want to zoom out.&lt;/p&gt;
&lt;p&gt;Where did this thing start?&lt;/p&gt;
&lt;p&gt;What actually exists today?&lt;/p&gt;
&lt;p&gt;And what still has to happen before I can put the first A1 proof-of-life image in somebody else&apos;s hands and say:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Here. Break it.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;this-started-as-a-media-workstation&quot;&gt;This started as a media workstation&lt;/h2&gt;
&lt;p&gt;The original project was not an operating system.&lt;/p&gt;
&lt;p&gt;That part is important.&lt;/p&gt;
&lt;p&gt;Project Nu-Day was supposed to be a modern media workstation inspired by some of the things I loved about the Amiga, Video Toaster and DigiPaint.&lt;/p&gt;
&lt;p&gt;Graphics.&lt;/p&gt;
&lt;p&gt;Audio.&lt;/p&gt;
&lt;p&gt;Video.&lt;/p&gt;
&lt;p&gt;Responsiveness.&lt;/p&gt;
&lt;p&gt;Specialized hardware actually doing specialized work.&lt;/p&gt;
&lt;p&gt;I wanted something that felt like a machine built to create things instead of a generic computer that happened to have creative software installed on it.&lt;/p&gt;
&lt;p&gt;Then I made the mistake of getting pieces of it working.&lt;/p&gt;
&lt;p&gt;That is when the scope problem became obvious.&lt;/p&gt;
&lt;p&gt;A serious media workstation needs storage.&lt;/p&gt;
&lt;p&gt;It needs networking.&lt;/p&gt;
&lt;p&gt;It needs applications.&lt;/p&gt;
&lt;p&gt;It needs input.&lt;/p&gt;
&lt;p&gt;It needs authentication.&lt;/p&gt;
&lt;p&gt;It needs device management.&lt;/p&gt;
&lt;p&gt;It needs crash recovery.&lt;/p&gt;
&lt;p&gt;It needs a filesystem.&lt;/p&gt;
&lt;p&gt;It needs some way for applications and services to find each other.&lt;/p&gt;
&lt;p&gt;It needs graphics infrastructure.&lt;/p&gt;
&lt;p&gt;It needs audio infrastructure.&lt;/p&gt;
&lt;p&gt;It needs an actual desktop.&lt;/p&gt;
&lt;p&gt;At some point I had to admit that I wasn&apos;t building a workstation anymore.&lt;/p&gt;
&lt;p&gt;I was building the computer underneath the workstation.&lt;/p&gt;
&lt;p&gt;That is where Project Ceylon really began.&lt;/p&gt;
&lt;h2 id=&quot;first-decision-build-the-machine-in-qemu&quot;&gt;First decision: build the machine in QEMU&lt;/h2&gt;
&lt;p&gt;One of the better decisions I made early was not trying to drag all of this onto bare metal immediately.&lt;/p&gt;
&lt;p&gt;Ceylon A1 is a QEMU-first system.&lt;/p&gt;
&lt;p&gt;That lets me define a reference machine and keep asking the same hardware the same questions.&lt;/p&gt;
&lt;p&gt;Same chipset.&lt;/p&gt;
&lt;p&gt;Same devices.&lt;/p&gt;
&lt;p&gt;Same CPU model.&lt;/p&gt;
&lt;p&gt;Same memory layout.&lt;/p&gt;
&lt;p&gt;Same firmware.&lt;/p&gt;
&lt;p&gt;Same PCI topology.&lt;/p&gt;
&lt;p&gt;Same launch configuration.&lt;/p&gt;
&lt;p&gt;That sounds boring until you spend an evening chasing a bug that turns out to exist because somebody added one virtual audio device and shifted half the PCI resource map.&lt;/p&gt;
&lt;p&gt;Ask me how I know.&lt;/p&gt;
&lt;p&gt;The virtual machine itself is now treated as part of the product being qualified.&lt;/p&gt;
&lt;p&gt;The ISO is not the machine.&lt;/p&gt;
&lt;p&gt;The whole configuration is the machine.&lt;/p&gt;
&lt;p&gt;That lesson cost enough hours that I don&apos;t expect to forget it.&lt;/p&gt;
&lt;h2 id=&quot;the-foundation-is-real-now&quot;&gt;The foundation is real now&lt;/h2&gt;
&lt;p&gt;The low-level Ceylon platform has gone through a fairly major upgrade since the first journal entries.&lt;/p&gt;
&lt;p&gt;That migration is now behind us.&lt;/p&gt;
&lt;p&gt;Ceylon boots on the newer MicroKernel foundation.&lt;/p&gt;
&lt;p&gt;Multiprocessor support works.&lt;/p&gt;
&lt;p&gt;The IOMMU works.&lt;/p&gt;
&lt;p&gt;The system controller starts.&lt;/p&gt;
&lt;p&gt;PCI enumeration works.&lt;/p&gt;
&lt;p&gt;The USB controller initializes.&lt;/p&gt;
&lt;p&gt;Storage works.&lt;/p&gt;
&lt;p&gt;Networking works.&lt;/p&gt;
&lt;p&gt;The display path works.&lt;/p&gt;
&lt;p&gt;The random-number service works.&lt;/p&gt;
&lt;p&gt;And we have been repeatedly rebuilding and booting the system instead of treating one successful run as proof that the problem is solved.&lt;/p&gt;
&lt;p&gt;That last part has become kind of a theme around here.&lt;/p&gt;
&lt;p&gt;&amp;quot;Worked once&amp;quot; is no longer one of our engineering states.&lt;/p&gt;
&lt;h2 id=&quot;we-have-real-storage&quot;&gt;We have real storage&lt;/h2&gt;
&lt;p&gt;Ceylon has functioning block-device paths on the A1 reference machine.&lt;/p&gt;
&lt;p&gt;We can identify the devices.&lt;/p&gt;
&lt;p&gt;We can publish volumes.&lt;/p&gt;
&lt;p&gt;We can read.&lt;/p&gt;
&lt;p&gt;We can write.&lt;/p&gt;
&lt;p&gt;We can flush.&lt;/p&gt;
&lt;p&gt;We have also already managed to break storage in several ways that turned out not to be storage bugs.&lt;/p&gt;
&lt;p&gt;One was a changed PCI resource map.&lt;/p&gt;
&lt;p&gt;Another was a missing virtual-device serial number.&lt;/p&gt;
&lt;p&gt;Another was booting the wrong validation artifact.&lt;/p&gt;
&lt;p&gt;Operating-system development is apparently a wonderful way to discover how many different things can impersonate a disk problem.&lt;/p&gt;
&lt;p&gt;The remaining A1 work is not &amp;quot;can bytes reach a block device?&amp;quot;&lt;/p&gt;
&lt;p&gt;It is building the user-facing persistence path on top of that foundation and proving that something an application saves can be recovered after reboot.&lt;/p&gt;
&lt;p&gt;That is a much more interesting milestone.&lt;/p&gt;
&lt;h2 id=&quot;networking-exists-too&quot;&gt;Networking exists too&lt;/h2&gt;
&lt;p&gt;Ceylon can currently move network traffic on the QEMU reference system.&lt;/p&gt;
&lt;p&gt;Transmit works.&lt;/p&gt;
&lt;p&gt;Receive works.&lt;/p&gt;
&lt;p&gt;ARP works.&lt;/p&gt;
&lt;p&gt;Basic IPv4 connectivity exists.&lt;/p&gt;
&lt;p&gt;We have been doing a larger architecture pass this week because I do not want to complete IPv4 in a way that makes IPv6 a miserable retrofit later.&lt;/p&gt;
&lt;p&gt;The networking design is therefore being pushed toward a real dual-stack model from the start.&lt;/p&gt;
&lt;p&gt;That includes interfaces that can own multiple addresses, routes and prefixes, neighbor state, address lifetimes, source selection and the other things that become awkward if the entire network layer secretly assumes an IPv4 address is just a 32-bit integer attached to one card.&lt;/p&gt;
&lt;p&gt;There is still plenty to build here.&lt;/p&gt;
&lt;p&gt;But &amp;quot;Ceylon has networking&amp;quot; is no longer theoretical.&lt;/p&gt;
&lt;h2 id=&quot;usb-input-is-becoming-an-actual-input-system&quot;&gt;USB input is becoming an actual input system&lt;/h2&gt;
&lt;p&gt;Keyboard input has been working through the virtual USB hardware for a while.&lt;/p&gt;
&lt;p&gt;Not a shortcut.&lt;/p&gt;
&lt;p&gt;Not a key magically inserted into the GUI.&lt;/p&gt;
&lt;p&gt;QEMU USB device, xHCI controller, HID handling, semantic event.&lt;/p&gt;
&lt;p&gt;Pointer work followed.&lt;/p&gt;
&lt;p&gt;That has turned into some of the current NuGUI qualification work.&lt;/p&gt;
&lt;p&gt;We recently found a particularly annoying bug where the GUI consumer could read events but faulted when advancing the shared ring-buffer tail because that mapping was protected incorrectly.&lt;/p&gt;
&lt;p&gt;That one common mistake could lose both pointer and keyboard events.&lt;/p&gt;
&lt;p&gt;The mapping has been corrected in the validation work.&lt;/p&gt;
&lt;p&gt;Pointer and keyboard route records are now passing again.&lt;/p&gt;
&lt;p&gt;The remaining work is closing the complete target interaction path and making sure the final machine definition, boot artifacts and input behavior all agree.&lt;/p&gt;
&lt;p&gt;That is considerably less glamorous than drawing a window.&lt;/p&gt;
&lt;p&gt;It is also the difference between a demo GUI and an input system I can actually trust.&lt;/p&gt;
&lt;h2 id=&quot;and-yes-there-is-a-gui&quot;&gt;And yes, there is a GUI&lt;/h2&gt;
&lt;p&gt;NuGUI is finally moving from architecture diagrams toward something that will eventually resemble a desktop.&lt;/p&gt;
&lt;p&gt;The design is intentionally not &amp;quot;let&apos;s clone Windows.&amp;quot;&lt;/p&gt;
&lt;p&gt;Ceylon owns the desktop and windowing model.&lt;/p&gt;
&lt;p&gt;Applications do not own the framebuffer.&lt;/p&gt;
&lt;p&gt;The display service retains presentation authority.&lt;/p&gt;
&lt;p&gt;Input reaches the desktop as bounded semantic events instead of every application poking at hardware.&lt;/p&gt;
&lt;p&gt;CPU rendering remains a first-class path.&lt;/p&gt;
&lt;p&gt;That last one matters to me.&lt;/p&gt;
&lt;p&gt;Ceylon will eventually benefit tremendously from accelerated graphics, but I do not want &amp;quot;no supported GPU&amp;quot; to mean &amp;quot;congratulations, your workstation is now a serial console.&amp;quot;&lt;/p&gt;
&lt;p&gt;The current NuGUI work is in the compositor/input/window-management stage.&lt;/p&gt;
&lt;p&gt;This is one of the most visible things between the current system and A1.&lt;/p&gt;
&lt;p&gt;Once the desktop begins appearing, I suspect Ceylon is going to suddenly look much farther along than it did the day before.&lt;/p&gt;
&lt;p&gt;Operating systems are funny that way.&lt;/p&gt;
&lt;p&gt;You can spend weeks building infrastructure nobody can see, then draw three windows and everyone assumes you built the OS over the weekend.&lt;/p&gt;
&lt;h2 id=&quot;kirk-exists-because-applications-shouldnt-live-alone&quot;&gt;Kirk exists because applications shouldn&apos;t live alone&lt;/h2&gt;
&lt;p&gt;Another major piece that now exists is Kirk.&lt;/p&gt;
&lt;p&gt;Kirk is Ceylon&apos;s local service and application coordination layer.&lt;/p&gt;
&lt;p&gt;The easiest way to explain it is that applications need some sane way to discover each other and cooperate without hard-coding everybody else&apos;s location and implementation.&lt;/p&gt;
&lt;p&gt;Kirk handles the control-plane side of that.&lt;/p&gt;
&lt;p&gt;Who are you?&lt;/p&gt;
&lt;p&gt;What capability do you provide?&lt;/p&gt;
&lt;p&gt;What generation are you?&lt;/p&gt;
&lt;p&gt;Can I attach to you?&lt;/p&gt;
&lt;p&gt;Did you restart?&lt;/p&gt;
&lt;p&gt;Is the thing I was connected to still the same thing?&lt;/p&gt;
&lt;p&gt;Have I been revoked?&lt;/p&gt;
&lt;p&gt;It does &lt;strong&gt;not&lt;/strong&gt; try to carry every byte in the system.&lt;/p&gt;
&lt;p&gt;Pixels don&apos;t go through Kirk.&lt;/p&gt;
&lt;p&gt;Audio samples don&apos;t go through Kirk.&lt;/p&gt;
&lt;p&gt;Large data transfers get appropriate data paths.&lt;/p&gt;
&lt;p&gt;Kirk coordinates the relationship.&lt;/p&gt;
&lt;p&gt;The implementation exists and has already survived substantial stress testing, including a 100,000-operation target run.&lt;/p&gt;
&lt;p&gt;The long-duration autonomous qualification work is the remaining gate before I treat it as fully qualified infrastructure for A1.&lt;/p&gt;
&lt;p&gt;That is one of those components users may never see directly.&lt;/p&gt;
&lt;p&gt;If it works correctly, they shouldn&apos;t have to.&lt;/p&gt;
&lt;h2 id=&quot;device-management-is-getting-a-grown-up-administrator&quot;&gt;Device management is getting a grown-up administrator&lt;/h2&gt;
&lt;p&gt;This week also introduced Clarise.&lt;/p&gt;
&lt;p&gt;Clarise is the working name for the service intended to administer Plug-and-Play hardware, including PCI/PCIe and USB devices.&lt;/p&gt;
&lt;p&gt;Originally that sounded like:&lt;/p&gt;
&lt;p&gt;&amp;quot;detect device, load driver.&amp;quot;&lt;/p&gt;
&lt;p&gt;That lasted about five minutes.&lt;/p&gt;
&lt;p&gt;Real device management has to deal with devices disappearing halfway through configuration, services restarting, resource assignments, generations changing, composite USB devices and multiple drivers potentially trying to claim the same thing.&lt;/p&gt;
&lt;p&gt;So Clarise is being designed around transactions.&lt;/p&gt;
&lt;p&gt;Either a device operation commits correctly or it doesn&apos;t.&lt;/p&gt;
&lt;p&gt;Recent shadow testing ran 256,000 transaction operations through the model with eleven different crash-injection locations.&lt;/p&gt;
&lt;p&gt;We saw no state corruption, provisional-resource leaks, duplicate commit effects, stale transactions being incorrectly accepted, partial interface binds or overlapping claims.&lt;/p&gt;
&lt;p&gt;That&apos;s the good part.&lt;/p&gt;
&lt;p&gt;The qualification still did &lt;strong&gt;not&lt;/strong&gt; close.&lt;/p&gt;
&lt;p&gt;We successfully triggered the real supervisor restart we wanted to test, but the replacement Clarise instance did not receive the required post-restart event.&lt;/p&gt;
&lt;p&gt;So the reconstruction part of the test could not honestly be claimed.&lt;/p&gt;
&lt;p&gt;We stopped.&lt;/p&gt;
&lt;p&gt;That is one of the changes in how I am building Ceylon that I am happiest about.&lt;/p&gt;
&lt;p&gt;A year ago I probably would have looked at 256,000 successful operations and called the subsystem done.&lt;/p&gt;
&lt;p&gt;Now the answer is:&lt;/p&gt;
&lt;p&gt;&amp;quot;Nope. The thing we said we would prove at the end didn&apos;t happen.&amp;quot;&lt;/p&gt;
&lt;p&gt;So it stays open.&lt;/p&gt;
&lt;h2 id=&quot;we-have-a-command-line-world-too&quot;&gt;We have a command-line world too&lt;/h2&gt;
&lt;p&gt;Ceylon is not going to be a GUI-only operating system.&lt;/p&gt;
&lt;p&gt;NuDOS is the command environment, and there is now a much more complete terminal/session architecture behind it.&lt;/p&gt;
&lt;p&gt;A terminal turned out to be another one of those things that becomes complicated the moment you stop thinking of it as &amp;quot;a rectangle that prints characters.&amp;quot;&lt;/p&gt;
&lt;p&gt;The terminal UI is one thing.&lt;/p&gt;
&lt;p&gt;The terminal protocol is another.&lt;/p&gt;
&lt;p&gt;The session behind it is another.&lt;/p&gt;
&lt;p&gt;The process or service on the other end is another.&lt;/p&gt;
&lt;p&gt;And a persistent or remotely attached session introduces another layer again.&lt;/p&gt;
&lt;p&gt;The basic A1 requirement is simpler than all of the future possibilities:&lt;/p&gt;
&lt;p&gt;I want a usable native terminal and NuDOS environment available in the alpha.&lt;/p&gt;
&lt;p&gt;That is still on the A1 list.&lt;/p&gt;
&lt;h2 id=&quot;nubasic-is-coming-with-a1&quot;&gt;NuBASIC is coming with A1&lt;/h2&gt;
&lt;p&gt;This one matters personally.&lt;/p&gt;
&lt;p&gt;Ceylon A1 is supposed to ship with a real Level 1 NuBASIC environment.&lt;/p&gt;
&lt;p&gt;Not:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PRINT &amp;quot;HELLO&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;followed by a blog post claiming BASIC exists.&lt;/p&gt;
&lt;p&gt;The language specification has been getting beaten on pretty heavily before implementation because apparently BASIC becomes less &amp;quot;basic&amp;quot; the longer you try to specify all of its behavior precisely.&lt;/p&gt;
&lt;p&gt;Procedures.&lt;/p&gt;
&lt;p&gt;Call frames.&lt;/p&gt;
&lt;p&gt;Errors.&lt;/p&gt;
&lt;p&gt;STATIC data.&lt;/p&gt;
&lt;p&gt;STOP and CONTINUE.&lt;/p&gt;
&lt;p&gt;Stack exhaustion.&lt;/p&gt;
&lt;p&gt;Platform bindings.&lt;/p&gt;
&lt;p&gt;Deterministic behavior.&lt;/p&gt;
&lt;p&gt;The specification work is far enough along that the next challenge is implementation.&lt;/p&gt;
&lt;p&gt;So NuBASIC is &lt;strong&gt;not done&lt;/strong&gt; tonight.&lt;/p&gt;
&lt;p&gt;But it is also not a vague someday idea.&lt;/p&gt;
&lt;p&gt;It is part of the A1 target.&lt;/p&gt;
&lt;p&gt;I want somebody downloading this first public image to be able to sit down, open the machine&apos;s native programming environment and make the computer do something.&lt;/p&gt;
&lt;p&gt;There is something appropriately old-school about that.&lt;/p&gt;
&lt;h2 id=&quot;audio-is-being-built-as-infrastructure-not-an-app-trick&quot;&gt;Audio is being built as infrastructure, not an app trick&lt;/h2&gt;
&lt;p&gt;Ceylon also has the foundations of Aria and Lyra, the two major pieces of the native audio path we have been researching and wiring.&lt;/p&gt;
&lt;p&gt;The A1 goal here is deliberately modest.&lt;/p&gt;
&lt;p&gt;I am not trying to replace Pro Tools in the alpha.&lt;/p&gt;
&lt;p&gt;The proof-of-life release needs enough reliable audio infrastructure to play bounded PCM/WAV audio and support the first simple music applications we&apos;re building toward.&lt;/p&gt;
&lt;p&gt;Longer term, the audio work becomes much more interesting.&lt;/p&gt;
&lt;p&gt;For A1, I just need to prove the path correctly.&lt;/p&gt;
&lt;h2 id=&quot;logging-got-more-serious-after-we-crashed-something&quot;&gt;Logging got more serious after we crashed something&lt;/h2&gt;
&lt;p&gt;Ceylon already had structured logging when we deliberately crashed a service and discovered that the most interesting fault information was being printed to the debug serial console instead of going into the structured durable log.&lt;/p&gt;
&lt;p&gt;That was useful.&lt;/p&gt;
&lt;p&gt;Annoying, but useful.&lt;/p&gt;
&lt;p&gt;The logging architecture worked for components that actually published structured events.&lt;/p&gt;
&lt;p&gt;The supervisor fault path wasn&apos;t doing that.&lt;/p&gt;
&lt;p&gt;So logging work has shifted from:&lt;/p&gt;
&lt;p&gt;&amp;quot;Can we collect log messages?&amp;quot;&lt;/p&gt;
&lt;p&gt;to:&lt;/p&gt;
&lt;p&gt;&amp;quot;When the system is broken, can we still trust the evidence it leaves behind?&amp;quot;&lt;/p&gt;
&lt;p&gt;That qualification is still open.&lt;/p&gt;
&lt;p&gt;For an OS intended to isolate and recover services, that matters quite a bit.&lt;/p&gt;
&lt;h2 id=&quot;so-what-is-left-before-a1&quot;&gt;So what is left before A1?&lt;/h2&gt;
&lt;p&gt;This is the part I wanted to get written down tonight.&lt;/p&gt;
&lt;p&gt;Because the project has grown enough that &amp;quot;we&apos;re working on an operating system&amp;quot; doesn&apos;t tell anybody whether we&apos;re three days or three years away from something they can boot.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;basic A1 proof-of-life release&lt;/strong&gt; still needs these pieces brought together:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Finish the current NuGUI compositor, window-management and input qualification work.&lt;/li&gt;
&lt;li&gt;Complete the user-facing persistence path so an application can save something, reboot, and retrieve it.&lt;/li&gt;
&lt;li&gt;Finish the native terminal/NuDOS path.&lt;/li&gt;
&lt;li&gt;Implement the A1 NuBASIC Level 1 environment.&lt;/li&gt;
&lt;li&gt;Close Kirk&apos;s long-duration qualification.&lt;/li&gt;
&lt;li&gt;Finish the production authentication/session path.&lt;/li&gt;
&lt;li&gt;Close the remaining logging and recovery evidence.&lt;/li&gt;
&lt;li&gt;Finish the bounded A1 audio path.&lt;/li&gt;
&lt;li&gt;Complete the required application/runtime integration.&lt;/li&gt;
&lt;li&gt;Provide a basic file browser and ordinary desktop file operations.&lt;/li&gt;
&lt;li&gt;Launch native applications from the desktop.&lt;/li&gt;
&lt;li&gt;View an image.&lt;/li&gt;
&lt;li&gt;Play audio.&lt;/li&gt;
&lt;li&gt;Run the constrained video proof.&lt;/li&gt;
&lt;li&gt;Run at least one real native interactive demonstration instead of a collection of infrastructure tests.&lt;/li&gt;
&lt;li&gt;Expose useful system information and diagnostics.&lt;/li&gt;
&lt;li&gt;Package the whole thing into a reproducible QEMU release another person can actually boot.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is still a decent list.&lt;/p&gt;
&lt;p&gt;I am not pretending otherwise.&lt;/p&gt;
&lt;p&gt;But compare it with where this started.&lt;/p&gt;
&lt;p&gt;The question used to be:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Could we build something that carries the good ideas forward?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now the questions are things like:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Can we recover this transaction after a supervisor restart?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Does the keyboard still work when the pointer queue is under load?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Can the app save a file and get it back after reboot?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Is this exact QEMU machine reproducible on another system?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Those are much better problems to have.&lt;/p&gt;
&lt;h2 id=&quot;a-quick-note-on-ai&quot;&gt;A quick note on AI&lt;/h2&gt;
&lt;p&gt;AI is part of the Project Ceylon toolchain, but it is not the point of the project.&lt;/p&gt;
&lt;p&gt;I use it primarily as a research tool, a governance-management tool, a best-practices helper and a debugger. It also helps keep a project this large moving forward without losing track of architectural decisions, specifications, validation requirements and the reasons behind them.&lt;/p&gt;
&lt;p&gt;Some of that work is supported by proprietary tooling I have developed around the project to help detect architectural drift, compare implementation against specifications, verify that delivered behavior matches the stated intent, and keep safety and security requirements visible as the system evolves.&lt;/p&gt;
&lt;p&gt;The goal is fairly simple: use the tools available to help build Ceylon correctly, keep the project disciplined, and get it delivered in a reasonable amount of time.&lt;/p&gt;
&lt;p&gt;The actual standard for whether something belongs in Ceylon remains the same regardless of how it was produced:&lt;/p&gt;
&lt;p&gt;It has to meet the specification, satisfy the architectural intent, survive the required testing, and behave correctly on the target.&lt;/p&gt;
&lt;h2 id=&quot;this-is-finally-starting-to-look-like-a-computer&quot;&gt;This is finally starting to look like a computer&lt;/h2&gt;
&lt;p&gt;I still don&apos;t have the screenshot I really want to show y&apos;all.&lt;/p&gt;
&lt;p&gt;The one where Ceylon boots, the desktop comes up, you move the mouse, open the terminal, run NuBASIC, save something, launch a native program, play some audio and realize there is now an actual little computer living inside that QEMU window.&lt;/p&gt;
&lt;p&gt;That is the A1 proof-of-life moment I am chasing.&lt;/p&gt;
&lt;p&gt;We&apos;re not there tonight.&lt;/p&gt;
&lt;p&gt;But for the first time, I can look at the remaining list and it mostly consists of joining and finishing systems that already have foundations underneath them.&lt;/p&gt;
&lt;p&gt;That is very different from staring at a blank repository and wondering whether any of this is possible.&lt;/p&gt;
&lt;p&gt;Project Ceylon started with a stupid question about what the Amiga might have become.&lt;/p&gt;
&lt;p&gt;Then it became a media workstation.&lt;/p&gt;
&lt;p&gt;Then the media workstation accidentally became an operating system.&lt;/p&gt;
&lt;p&gt;Now the operating system is starting to become a computer.&lt;/p&gt;
&lt;p&gt;And when that first A1 image finally boots on somebody else&apos;s machine, I fully expect them to find something I missed in about fifteen minutes.&lt;/p&gt;
&lt;p&gt;Honestly, I&apos;m kind of counting on it.&lt;/p&gt;
&lt;p&gt;That&apos;s the point.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Project Ceylon is an independent retro-futurist operating-system project exploring what a modern creative workstation might look like if some of the best ideas of earlier personal computers had continued evolving instead of being discarded.&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Retrocomputing</category><category>Operating Systems</category><category>A1 Alpha</category><category>NuGUI</category><category>NuBASIC</category><category>QEMU</category><author>Mike</author></item><item><title>Project Ceylon Dev Log — September 22, 2026</title><link>https://ceylonprojectng.com/journal/project-ceylon-dev-log-september-22-2026/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/project-ceylon-dev-log-september-22-2026/</guid><description>September 22 was one of those days where a lot of the visible work happened below the surface.</description><pubDate>Tue, 22 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;September 22 was one of those days where a lot of the visible work happened below the surface.&lt;/p&gt;
&lt;p&gt;We did not end the day with a shiny new desktop feature or a finished application to show off. Instead, we spent the day tightening several pieces of Ceylon that will determine whether the system can grow into something dependable rather than simply something that boots.&lt;/p&gt;
&lt;p&gt;A surprising amount got done.&lt;/p&gt;
&lt;h2 id=&quot;building-out-the-networking-roadmap&quot;&gt;Building Out the Networking Roadmap&lt;/h2&gt;
&lt;p&gt;One of the biggest research efforts today was Ceylon&apos;s native networking architecture.&lt;/p&gt;
&lt;p&gt;Ceylon already has active IPv4 work, including pieces of Ethernet, ARP, ICMP, UDP, DNS and early TCP functionality. The goal is not to throw that work away and start over.&lt;/p&gt;
&lt;p&gt;Instead, we began defining what the complete networking system eventually needs to look like.&lt;/p&gt;
&lt;p&gt;The target is now much clearer:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Ethernet
  ↓
Full IPv4
  ↓
Full IPv6
  ↓
True IPv4/IPv6 dual-stack operation
  ↓
Modern physical Ethernet hardware
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The important part is that IPv6 cannot simply be bolted onto an IPv4-centric design later.&lt;/p&gt;
&lt;p&gt;Even while IPv4 is being completed, common components need to understand concepts such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;multiple addresses per interface&lt;/li&gt;
&lt;li&gt;IPv4 and IPv6 address families&lt;/li&gt;
&lt;li&gt;address scopes&lt;/li&gt;
&lt;li&gt;address lifetimes&lt;/li&gt;
&lt;li&gt;routes and prefixes&lt;/li&gt;
&lt;li&gt;neighbor state&lt;/li&gt;
&lt;li&gt;path MTU information&lt;/li&gt;
&lt;li&gt;multicast membership&lt;/li&gt;
&lt;li&gt;interface lifecycle&lt;/li&gt;
&lt;li&gt;source-address selection&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That gives us a common network foundation instead of two unrelated protocol stacks.&lt;/p&gt;
&lt;p&gt;We also expanded the hardware side of the design.&lt;/p&gt;
&lt;p&gt;The eventual Ceylon network driver architecture is expected to support modern NIC capabilities including DMA/IOMMU isolation, multiple receive and transmit queues, MSI-X interrupts, receive-side scaling, checksum offload, VLAN support, multicast filtering, interrupt moderation, and hardware fault recovery.&lt;/p&gt;
&lt;p&gt;VirtIO networking remains extremely useful for development and QEMU testing, but the end goal is a native driver for a modern physical PCIe Ethernet controller.&lt;/p&gt;
&lt;p&gt;After an initial gap analysis, the networking reference architecture was expanded and checked again.&lt;/p&gt;
&lt;p&gt;The result is now mature enough to serve as the R&amp;amp;D baseline from which the actual implementation specification can be built.&lt;/p&gt;
&lt;p&gt;The next networking step is not more theoretical architecture.&lt;/p&gt;
&lt;p&gt;It is an inventory of the networking implementation already inside Ceylon so we can classify each component as something to keep, extend, refactor, replace, or retire.&lt;/p&gt;
&lt;h2 id=&quot;clarise-making-plug-and-play-transactional&quot;&gt;Clarise: Making Plug-and-Play Transactional&lt;/h2&gt;
&lt;p&gt;Another major focus today was Clarise, the administrator we are designing to eventually manage Plug-and-Play devices, including USB devices.&lt;/p&gt;
&lt;p&gt;The problem sounds simple:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Find a device and give it to the right driver.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In a real operating system, it gets complicated quickly.&lt;/p&gt;
&lt;p&gt;A device may disappear halfway through configuration. A driver may restart. A resource may have been provisionally assigned but never committed. A USB device may return as a new hardware generation. Composite devices can have multiple interfaces, and two providers must never silently claim overlapping resources.&lt;/p&gt;
&lt;p&gt;So Clarise is being built around a transactional model rather than simply performing device operations in sequence.&lt;/p&gt;
&lt;p&gt;The I3 work exercised that model heavily.&lt;/p&gt;
&lt;p&gt;Today it completed:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;256,000 transaction operations
11 crash-injection points
3 reconciliation paths
0 unexpected accepts
0 unexpected rejects
0 state corruption
0 provisional resource leaks
0 duplicate commit side effects
0 duplicate abort side effects
0 stale transactions accepted
0 partial atomic interface binds
0 overlapping interface claims
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The transaction machinery itself performed very well.&lt;/p&gt;
&lt;p&gt;However, I3 is not closed.&lt;/p&gt;
&lt;p&gt;That is intentional.&lt;/p&gt;
&lt;p&gt;The remaining requirement was proving that, after a real supervisor-mediated restart, a new Clarise instance could receive its restart event and reconstruct transaction state against the current device, provider and resource generations.&lt;/p&gt;
&lt;p&gt;We successfully caused and observed the supervisor restart.&lt;/p&gt;
&lt;p&gt;Clarise did not receive the required post-restart event.&lt;/p&gt;
&lt;p&gt;That means the reconstruction test could not legitimately continue.&lt;/p&gt;
&lt;p&gt;Rather than replacing that missing target evidence with a simulated result, the run stopped.&lt;/p&gt;
&lt;p&gt;The status tonight is therefore:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CLARISE_I3_STATUS=NOT_COMPLETE

SUPERVISOR_RESTART_OBSERVED=YES
CLARISE_POST_RESTART_EVENT_RECEIVED=NO

TARGET_TRANSACTION_RECONSTRUCTION=NOT_PROVEN
NEXT_TRANCHE_MAY_BEGIN=NO
AUTHORITY_TRANSFER_AUTHORIZED=NO
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is exactly why we have qualification gates.&lt;/p&gt;
&lt;p&gt;The transaction model looks strong, but we have not yet proven the complete target lifecycle.&lt;/p&gt;
&lt;p&gt;The next Clarise session will repair the supervisor-mediated restart path so that a new Clarise instance actually starts and receives the required event. Only then will transaction reconstruction and rollback qualification resume.&lt;/p&gt;
&lt;p&gt;Also important: Clarise still has no live Plug-and-Play authority.&lt;/p&gt;
&lt;p&gt;Today&apos;s testing remained bounded and shadow-only.&lt;/p&gt;
&lt;h2 id=&quot;terminal-architecture&quot;&gt;Terminal Architecture&lt;/h2&gt;
&lt;p&gt;We also spent substantial time defining Ceylon&apos;s terminal architecture.&lt;/p&gt;
&lt;p&gt;A terminal seems like another simple application until you ask what it should mean inside a modern Ceylon system.&lt;/p&gt;
&lt;p&gt;The resulting work distinguishes several concepts that are traditionally collapsed together:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;terminal UI
terminal protocol
session
process/service connection
remote connection
persistent session
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That resulted in a proposed native terminal/session architecture, bounded terminal parsing rules, a Ceylon terminal protocol, and compatibility paths for traditional VT-style terminal behavior.&lt;/p&gt;
&lt;p&gt;One important conclusion was that Ceylon already has pieces of the security/session architecture needed for interactive sessions, but a persistent bridge-session abstraction will eventually be needed for longer-lived or remotely attached sessions.&lt;/p&gt;
&lt;p&gt;That led to another idea worth preserving for later research: a lightweight ANSI-style collaborative text system inspired by the old BBS world.&lt;/p&gt;
&lt;p&gt;The idea is not to make that part of the immediate A1 build.&lt;/p&gt;
&lt;p&gt;Instead, it has been separated into its own R&amp;amp;D work so it can eventually explore low-overhead messaging, collaboration, administration and even Internet-accessible BBS-style hosting without distorting the terminal work itself.&lt;/p&gt;
&lt;p&gt;This was also part of a larger cleanup of the Ceylon R&amp;amp;D library so experimental work is separated from specifications and active implementation material.&lt;/p&gt;
&lt;h2 id=&quot;hardware-layout-reconciliation&quot;&gt;Hardware Layout Reconciliation&lt;/h2&gt;
&lt;p&gt;A less glamorous but important piece of work was cleaning up the current QEMU hardware model.&lt;/p&gt;
&lt;p&gt;We found evidence from multiple generations of PCI layout mixed together in existing artifacts.&lt;/p&gt;
&lt;p&gt;That matters because a device&apos;s BAR addresses, interrupt routing and IOMMU mappings can change when the virtual hardware set changes.&lt;/p&gt;
&lt;p&gt;The current layout was reconciled around the active Q35 configuration, including storage, audio and USB hardware.&lt;/p&gt;
&lt;p&gt;The resulting map successfully covered:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PCI layout
xHCI resources
VirtIO resources
IOMMU mappings
CapDL relationships
storage
network
display
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and passed three reproducibility runs.&lt;/p&gt;
&lt;p&gt;That gives us a much better foundation for future device qualification because we now know which hardware description represents the machine we are actually testing.&lt;/p&gt;
&lt;h2 id=&quot;nugui-input-qualification&quot;&gt;NuGUI Input Qualification&lt;/h2&gt;
&lt;p&gt;NuGUI input work also continued today.&lt;/p&gt;
&lt;p&gt;Static architecture and hardware layout work moved forward, but the next input milestone was deliberately not declared complete.&lt;/p&gt;
&lt;p&gt;The remaining target evidence includes areas such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;real pointer traffic&lt;/li&gt;
&lt;li&gt;stress behavior&lt;/li&gt;
&lt;li&gt;generation handling&lt;/li&gt;
&lt;li&gt;malformed-input handling&lt;/li&gt;
&lt;li&gt;keyboard regression&lt;/li&gt;
&lt;li&gt;latency&lt;/li&gt;
&lt;li&gt;observability&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The current stopping point is USB HID injection qualification.&lt;/p&gt;
&lt;p&gt;Again, this is an example of the engineering approach we are trying to maintain throughout Ceylon:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;quot;the architecture looks right&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;is not the same as:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;quot;the target behavior has been proven&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Until the second statement is true, the gate stays open.&lt;/p&gt;
&lt;h2 id=&quot;kirk-continues-toward-qualification&quot;&gt;Kirk Continues Toward Qualification&lt;/h2&gt;
&lt;p&gt;Kirk, Ceylon&apos;s local service/federation control plane, also continued qualification work.&lt;/p&gt;
&lt;p&gt;Recent testing has exercised:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;service discovery&lt;/li&gt;
&lt;li&gt;registration&lt;/li&gt;
&lt;li&gt;capacity limits&lt;/li&gt;
&lt;li&gt;rejection paths&lt;/li&gt;
&lt;li&gt;revocation&lt;/li&gt;
&lt;li&gt;reincarnation&lt;/li&gt;
&lt;li&gt;stress behavior&lt;/li&gt;
&lt;li&gt;reproducible boot behavior&lt;/li&gt;
&lt;li&gt;clean rebuilds&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A 100,000-operation target stress run passed, and long-duration soak qualification has been underway.&lt;/p&gt;
&lt;p&gt;Kirk is an important piece of the eventual Ceylon application ecosystem because it lets applications and services find each other, identify capabilities, manage lifecycle relationships and coordinate work without becoming the bulk-data transport itself.&lt;/p&gt;
&lt;p&gt;That separation remains deliberate.&lt;/p&gt;
&lt;p&gt;Control traffic goes through the control plane.&lt;/p&gt;
&lt;p&gt;Large or real-time data stays on the appropriate dedicated path.&lt;/p&gt;
&lt;h2 id=&quot;taking-inventory-of-a1&quot;&gt;Taking Inventory of A1&lt;/h2&gt;
&lt;p&gt;Another useful outcome from today&apos;s work was a more disciplined look at what is actually present in the A1 system.&lt;/p&gt;
&lt;p&gt;The current production-readiness inventory identified 32 services and eliminated unclassified repository items from the baseline being examined.&lt;/p&gt;
&lt;p&gt;That doesn&apos;t mean A1 is finished.&lt;/p&gt;
&lt;p&gt;It means we increasingly know exactly what is there, what state it is in, and what still blocks higher-level integration.&lt;/p&gt;
&lt;p&gt;Several areas remain active work, including desktop integration, persistence, audio integration, device input qualification and application-layer completion.&lt;/p&gt;
&lt;p&gt;But an operating system this size becomes much easier to reason about once every component has a name, an owner, a role and a qualification state.&lt;/p&gt;
&lt;h1 id=&quot;what-today-was-really-about&quot;&gt;What Today Was Really About&lt;/h1&gt;
&lt;p&gt;If there was a common theme to September 22, it was this:&lt;/p&gt;
&lt;p&gt;turning implicit architecture into explicit contracts.&lt;/p&gt;
&lt;p&gt;Networking became a defined IPv4/IPv6 architecture rather than simply a collection of protocols.&lt;/p&gt;
&lt;p&gt;Plug-and-Play became a transactional lifecycle problem rather than simply device enumeration.&lt;/p&gt;
&lt;p&gt;The terminal became a session architecture rather than merely a command window.&lt;/p&gt;
&lt;p&gt;PCI configuration became a reproducible hardware baseline rather than accumulated historical artifacts.&lt;/p&gt;
&lt;p&gt;And qualification gates continued to distinguish between things we believe should work and things we can demonstrate actually work.&lt;/p&gt;
&lt;p&gt;That difference is becoming increasingly important as Ceylon gets larger.&lt;/p&gt;
&lt;p&gt;The system is reaching the point where adding another feature is often easier than proving that twenty interacting features still behave correctly together.&lt;/p&gt;
&lt;p&gt;That means some development days are going to end with:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;NOT_COMPLETE
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And sometimes that is the right answer.&lt;/p&gt;
&lt;p&gt;Clarise is a good example tonight.&lt;/p&gt;
&lt;p&gt;We learned exactly where the next failure boundary is:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;supervisor restart succeeds
    ↓
new Clarise instance must start
    ↓
post-restart event must arrive
    ↓
transaction state must be reconstructed
    ↓
only then can I3 close
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That&apos;s a very specific problem.&lt;/p&gt;
&lt;p&gt;Specific problems are solvable.&lt;/p&gt;
&lt;p&gt;Tomorrow, we keep building.&lt;/p&gt;
</content:encoded></item><item><title>Project Ceylon Development Log — September 21, 2026: Turning a Working System Into a Trustworthy One</title><link>https://ceylonprojectng.com/journal/project-ceylon-development-log-september-21-2026-turning-a-working-system-into-a-trustworthy-one/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/project-ceylon-development-log-september-21-2026-turning-a-working-system-into-a-trustworthy-one/</guid><description>Today was one of those days where Project Ceylon kept answering one question with another.</description><pubDate>Mon, 21 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Today was one of those days where Project Ceylon kept answering one question with another.&lt;/p&gt;
&lt;p&gt;The good news is that the questions are getting better.&lt;/p&gt;
&lt;p&gt;A few weeks ago, most of the work was still about proving that individual pieces could function at all.&lt;/p&gt;
&lt;p&gt;Can the machine boot?&lt;/p&gt;
&lt;p&gt;Can a service start?&lt;/p&gt;
&lt;p&gt;Can storage respond?&lt;/p&gt;
&lt;p&gt;Can the keyboard produce an event?&lt;/p&gt;
&lt;p&gt;Can one isolated component communicate with another?&lt;/p&gt;
&lt;p&gt;Those are still important questions, but they are no longer enough.&lt;/p&gt;
&lt;p&gt;The questions now sound more like:&lt;/p&gt;
&lt;p&gt;Can this service be trusted as a dependency?&lt;/p&gt;
&lt;p&gt;Can it recover if something disappears underneath it?&lt;/p&gt;
&lt;p&gt;Can we reproduce the machine configuration tomorrow?&lt;/p&gt;
&lt;p&gt;Does the thing we call the “production path” actually match what the virtual hardware is doing?&lt;/p&gt;
&lt;p&gt;And when we start building the desktop on top of all this, are we building on real foundations or accidentally cementing test code into the operating system?&lt;/p&gt;
&lt;p&gt;That was the theme of September 21.&lt;/p&gt;
&lt;h2 id=&quot;kirk-moves-into-long-duration-qualification&quot;&gt;Kirk Moves Into Long-Duration Qualification&lt;/h2&gt;
&lt;p&gt;One of the biggest milestones today involved Kirk, Ceylon’s local service-discovery and coordination layer.&lt;/p&gt;
&lt;p&gt;Kirk exists so applications and services do not need to know everything about each other ahead of time.&lt;/p&gt;
&lt;p&gt;It handles things such as service discovery, provider identity, generations, lifecycle changes, capability negotiation, attachments, detachments, revocation, and reconnection.&lt;/p&gt;
&lt;p&gt;It is deliberately not the data pipe for everything.&lt;/p&gt;
&lt;p&gt;Audio samples do not go through Kirk.&lt;/p&gt;
&lt;p&gt;Pixels do not go through Kirk.&lt;/p&gt;
&lt;p&gt;High-frequency mouse movement does not go through Kirk.&lt;/p&gt;
&lt;p&gt;Kirk is the control plane.&lt;/p&gt;
&lt;p&gt;That distinction is important because it allows the operating system to coordinate independently developed services without turning one component into a giant central bottleneck.&lt;/p&gt;
&lt;p&gt;Today Kirk completed the remaining bounded functional tests needed before the long-duration qualification stage.&lt;/p&gt;
&lt;p&gt;That included stress testing, capacity edges, unauthorized requests, malformed requests, revocation, reincarnation, isolation between services, and repeated boot verification.&lt;/p&gt;
&lt;p&gt;The result was strong enough that Kirk is now provisionally approved for application-development integration.&lt;/p&gt;
&lt;p&gt;That does not mean final qualification is complete.&lt;/p&gt;
&lt;p&gt;The remaining test is an autonomous eight-hour active soak that is currently running independently. During that run, the system is collecting evidence about memory stability, latency, structured logging behavior, resource use, and continued functionality after sustained operation.&lt;/p&gt;
&lt;p&gt;Most importantly, the test is autonomous.&lt;/p&gt;
&lt;p&gt;Nobody is sitting there babysitting it for eight hours.&lt;/p&gt;
&lt;p&gt;It starts, exercises the service, records checkpoints, gathers measurements, and will produce a final evidence package when it finishes.&lt;/p&gt;
&lt;p&gt;That is how this kind of qualification should work.&lt;/p&gt;
&lt;h2 id=&quot;we-audited-the-foundation-before-building-more-on-it&quot;&gt;We Audited the Foundation Before Building More on It&lt;/h2&gt;
&lt;p&gt;With Kirk running in the background, I did not want the rest of the project sitting idle.&lt;/p&gt;
&lt;p&gt;So the next task was a full A1 production-readiness baseline.&lt;/p&gt;
&lt;p&gt;The question was simple:&lt;/p&gt;
&lt;p&gt;What can we safely build on right now?&lt;/p&gt;
&lt;p&gt;Thirty-two platform services and facilities were inventoried.&lt;/p&gt;
&lt;p&gt;Every one of them was classified according to its actual maturity rather than how much I might want it to be finished.&lt;/p&gt;
&lt;p&gt;That distinction matters.&lt;/p&gt;
&lt;p&gt;The audit did not hand out “production ready” labels just because something compiled or worked once.&lt;/p&gt;
&lt;p&gt;Instead, the services were examined for things such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;authority and security boundaries,&lt;/li&gt;
&lt;li&gt;restart behavior,&lt;/li&gt;
&lt;li&gt;generation handling,&lt;/li&gt;
&lt;li&gt;shared-memory semantics,&lt;/li&gt;
&lt;li&gt;queue bounds,&lt;/li&gt;
&lt;li&gt;failure behavior,&lt;/li&gt;
&lt;li&gt;target evidence,&lt;/li&gt;
&lt;li&gt;logging,&lt;/li&gt;
&lt;li&gt;resource behavior,&lt;/li&gt;
&lt;li&gt;provenance,&lt;/li&gt;
&lt;li&gt;and what higher-level software depends on them.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The result was not a wall of green checkmarks.&lt;/p&gt;
&lt;p&gt;In fact, nothing was classified as fully production complete yet.&lt;/p&gt;
&lt;p&gt;That is fine.&lt;/p&gt;
&lt;p&gt;What matters is that the maturity is now known.&lt;/p&gt;
&lt;p&gt;Twenty-four services are usable with identified gaps.&lt;/p&gt;
&lt;p&gt;Seven remain reference-quality implementations that need further work before they become final public-runtime dependencies.&lt;/p&gt;
&lt;p&gt;One component is deliberately deferred.&lt;/p&gt;
&lt;p&gt;Nothing was left unclassified.&lt;/p&gt;
&lt;p&gt;Most importantly, there are no hidden prototype dependencies in the path currently cleared for development.&lt;/p&gt;
&lt;p&gt;That means the next NuGUI work can move forward without pretending the rest of the operating system is more finished than it really is.&lt;/p&gt;
&lt;h2 id=&quot;nugui-gets-a-real-architectural-baseline&quot;&gt;NuGUI Gets a Real Architectural Baseline&lt;/h2&gt;
&lt;p&gt;That led directly into NuGUI.&lt;/p&gt;
&lt;p&gt;NuGUI is Ceylon’s native graphical environment.&lt;/p&gt;
&lt;p&gt;The exact reviewed NuGUI architecture specification and A1 desktop profile were then imported, cryptographically verified, preserved in the project documentation, and recorded with provenance.&lt;/p&gt;
&lt;p&gt;Once that was done, the architecture reconciliation passed.&lt;/p&gt;
&lt;p&gt;No unresolved contradictions were found between the low-level NuGUI architecture and the A1 desktop profile.&lt;/p&gt;
&lt;p&gt;The major boundaries are now frozen.&lt;/p&gt;
&lt;p&gt;NuGUI owns desktop and windowing behavior.&lt;/p&gt;
&lt;p&gt;The display service owns the actual presentation authority.&lt;/p&gt;
&lt;p&gt;Applications do not get direct hardware access.&lt;/p&gt;
&lt;p&gt;Input is semantic by the time it reaches the GUI.&lt;/p&gt;
&lt;p&gt;Kirk may help discover and coordinate services, but it does not carry pixels or high-frequency input traffic.&lt;/p&gt;
&lt;p&gt;CPU-based rendering remains a first-class path even though future accelerated graphics are planned.&lt;/p&gt;
&lt;p&gt;That gives the desktop team a stable contract to build against.&lt;/p&gt;
&lt;h2 id=&quot;the-pointer-path-starts-becoming-real&quot;&gt;The Pointer Path Starts Becoming Real&lt;/h2&gt;
&lt;p&gt;The first actual implementation step after freezing the NuGUI architecture was semantic pointer input.&lt;/p&gt;
&lt;p&gt;Keyboard input already existed on the target.&lt;/p&gt;
&lt;p&gt;Pointer support existed partially on the host side, but the target input path was still largely keyboard-shaped.&lt;/p&gt;
&lt;p&gt;The new D1 work added a separate bounded semantic pointer page, generation protection, overflow and high-water telemetry, and a clean boundary for NuGUI to consume pointer events later.&lt;/p&gt;
&lt;p&gt;Fourteen host-side tests passed.&lt;/p&gt;
&lt;p&gt;Then the target build failed.&lt;/p&gt;
&lt;p&gt;At first glance, it looked like a new NuGUI problem.&lt;/p&gt;
&lt;p&gt;It was not.&lt;/p&gt;
&lt;p&gt;The failure came from dependency drift in the low-level Rust bindings used by the microkernel environment.&lt;/p&gt;
&lt;p&gt;That dependency mismatch was repaired, preserved, and documented so the same problem should not need to be rediscovered later.&lt;/p&gt;
&lt;p&gt;The system image and bootable ISO built successfully afterward.&lt;/p&gt;
&lt;p&gt;Then the machine failed even earlier during startup.&lt;/p&gt;
&lt;p&gt;Again, not NuGUI.&lt;/p&gt;
&lt;p&gt;This time the virtual machine was launching without the Intel IOMMU configuration that the qualified system expected.&lt;/p&gt;
&lt;p&gt;The initialization code saw zero I/O page-table levels when it expected three and stopped before user services ever started.&lt;/p&gt;
&lt;p&gt;That launcher problem was fixed.&lt;/p&gt;
&lt;p&gt;Three consecutive boots succeeded.&lt;/p&gt;
&lt;p&gt;And then we found the next issue.&lt;/p&gt;
&lt;h2 id=&quot;a-migration-ghost-in-the-pci-map&quot;&gt;A Migration Ghost in the PCI Map&lt;/h2&gt;
&lt;p&gt;The USB controller was now starting, but its hardware-resource address did not match the static authorization recorded inside Ceylon.&lt;/p&gt;
&lt;p&gt;The virtual machine reported the USB controller at one address.&lt;/p&gt;
&lt;p&gt;The operating system still expected another.&lt;/p&gt;
&lt;p&gt;Simply changing that one address would have created a collision with the VirtIO devices.&lt;/p&gt;
&lt;p&gt;That was the clue.&lt;/p&gt;
&lt;p&gt;The system was carrying a mixture of PCI resource assignments from two different virtual-machine layouts.&lt;/p&gt;
&lt;p&gt;The older qualified layout used two virtual drives and no audio device.&lt;/p&gt;
&lt;p&gt;The current machine uses one drive plus the audio device.&lt;/p&gt;
&lt;p&gt;That changed the deterministic resource allocation made by the firmware.&lt;/p&gt;
&lt;p&gt;The old static map had partially survived the migration.&lt;/p&gt;
&lt;p&gt;Rather than moving individual addresses around until the system booted, the entire PCI resource profile was reconstructed and compared against:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;the current virtual hardware,&lt;/li&gt;
&lt;li&gt;the older known-good configuration,&lt;/li&gt;
&lt;li&gt;and the static authorization inside Ceylon.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The result confirmed it.&lt;/p&gt;
&lt;p&gt;The profile contained values from multiple generations.&lt;/p&gt;
&lt;p&gt;The entire map was reconciled to the current one-drive-plus-audio Q35 configuration.&lt;/p&gt;
&lt;p&gt;Three consecutive boots now reproduce the same PCI device ordering, addresses, IOMMU configuration, USB controller location, and VirtIO layout.&lt;/p&gt;
&lt;p&gt;Storage works.&lt;/p&gt;
&lt;p&gt;Networking works.&lt;/p&gt;
&lt;p&gt;Display works.&lt;/p&gt;
&lt;p&gt;The USB controller initializes.&lt;/p&gt;
&lt;p&gt;The pointer device is detected.&lt;/p&gt;
&lt;p&gt;No unexpected IOMMU faults were observed.&lt;/p&gt;
&lt;p&gt;And the complete virtual-machine definition is now being treated as a qualification artifact instead of an incidental command line.&lt;/p&gt;
&lt;p&gt;That may not sound glamorous, but this kind of work is what turns “it booted on my machine” into an operating system someone else can actually reproduce.&lt;/p&gt;
&lt;h2 id=&quot;where-nugui-stands-tonight&quot;&gt;Where NuGUI Stands Tonight&lt;/h2&gt;
&lt;p&gt;The NuGUI architecture phase is complete.&lt;/p&gt;
&lt;p&gt;The semantic pointer implementation is partially complete.&lt;/p&gt;
&lt;p&gt;The host tests pass.&lt;/p&gt;
&lt;p&gt;The pointer hardware is detected on the target.&lt;/p&gt;
&lt;p&gt;The full target event path still needs to be exercised.&lt;/p&gt;
&lt;p&gt;The next step is building a deterministic test harness that can inject real USB pointer movement, button presses, wheel movement, and stress traffic into QEMU while proving that those events travel through the actual path:&lt;/p&gt;
&lt;p&gt;virtual USB device → xHCI controller → Ceylon HID provider → semantic input service → bounded pointer transport → NuGUI&lt;/p&gt;
&lt;p&gt;No shortcuts.&lt;/p&gt;
&lt;p&gt;No writing directly into the semantic page just to make a test turn green.&lt;/p&gt;
&lt;p&gt;Once that path is proven, the remaining D1 tests will cover button integrity, queue behavior, high-rate motion, provider generations, malformed input, keyboard coexistence, latency, and observability.&lt;/p&gt;
&lt;p&gt;Only then do we move on to the compositor and window manager.&lt;/p&gt;
&lt;h2 id=&quot;the-larger-pattern&quot;&gt;The Larger Pattern&lt;/h2&gt;
&lt;p&gt;Today had a recurring pattern:&lt;/p&gt;
&lt;p&gt;We would fix a problem.&lt;/p&gt;
&lt;p&gt;The fix would expose the next deeper assumption.&lt;/p&gt;
&lt;p&gt;And instead of patching around it, we kept following the evidence.&lt;/p&gt;
&lt;p&gt;Dependency drift.&lt;/p&gt;
&lt;p&gt;Launcher drift.&lt;/p&gt;
&lt;p&gt;Static PCI-map drift.&lt;/p&gt;
&lt;p&gt;Input-path qualification.&lt;/p&gt;
&lt;p&gt;None of those are particularly exciting screenshots.&lt;/p&gt;
&lt;p&gt;But each one removes another hidden assumption from the system.&lt;/p&gt;
&lt;p&gt;That matters because Project Ceylon is reaching the point where more visible software is about to arrive.&lt;/p&gt;
&lt;p&gt;NuGUI.&lt;/p&gt;
&lt;p&gt;Applications.&lt;/p&gt;
&lt;p&gt;NuBASIC.&lt;/p&gt;
&lt;p&gt;Audio tools.&lt;/p&gt;
&lt;p&gt;Games.&lt;/p&gt;
&lt;p&gt;Eventually much more.&lt;/p&gt;
&lt;p&gt;Those things will only be worth building if the platform underneath them is understandable and reproducible.&lt;/p&gt;
&lt;p&gt;September 21 was not a day when Ceylon suddenly became visually impressive.&lt;/p&gt;
&lt;p&gt;It was a day when several parts of the system became significantly harder to lie about.&lt;/p&gt;
&lt;p&gt;I consider that progress.&lt;/p&gt;
&lt;p&gt;Project Ceylon is an independent retro-futurist operating-system project focused on building a modern general-purpose workstation environment with strong isolation, native multimedia capabilities, and an architecture intended to remain understandable to the people building and using it.&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Operating Systems</category><category>NuGUI</category><category>Kirk</category><category>Systems Engineering</category><category>QEMU</category><category>Development Log</category><author>Mike</author></item><item><title>Ceylon Development Log — September 20, 2026: Back to Solid Ground</title><link>https://ceylonprojectng.com/journal/ceylon-development-log-september-20-2026-back-to-solid-ground/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/ceylon-development-log-september-20-2026-back-to-solid-ground/</guid><description>The last several days of Project Ceylon development have been dominated by one job: getting the system back to a known, reproducible state after moving the underlying MicroKernel platform forward.</description><pubDate>Sun, 20 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The last several days of Project Ceylon development have been dominated by one job: getting the system back to a known, reproducible state after moving the underlying MicroKernel platform forward.&lt;/p&gt;
&lt;p&gt;By mid-afternoon on September 20, we had already proven quite a bit.&lt;/p&gt;
&lt;p&gt;The new stack booted. Multiprocessing worked. The IOMMU was operational. The system controller started. PCI enumeration worked. USB worked. The random-number service initialized. Both block devices initialized.&lt;/p&gt;
&lt;p&gt;That sounds like a nearly finished migration.&lt;/p&gt;
&lt;p&gt;It wasn&apos;t.&lt;/p&gt;
&lt;p&gt;What followed was several hours of discovering just how many small assumptions can accumulate around a working machine — and how moving one layer underneath them can expose assumptions that had been invisible for months.&lt;/p&gt;
&lt;p&gt;The encouraging part is that, by the end of the night, Ceylon was back on solid ground.&lt;/p&gt;
&lt;p&gt;Not just &amp;quot;it booted once.&amp;quot;&lt;/p&gt;
&lt;p&gt;We now have a repeatable baseline.&lt;/p&gt;
&lt;h2 id=&quot;one-migration-problem-twenty-seven-rust-targets&quot;&gt;One Migration Problem, Twenty-Seven Rust Targets&lt;/h2&gt;
&lt;p&gt;One of the first major discoveries concerned the IPC buffer used by Ceylon&apos;s Rust components.&lt;/p&gt;
&lt;p&gt;The older platform arrangement placed that buffer at one address. The new MicroKernel environment places it much higher in the process address space.&lt;/p&gt;
&lt;p&gt;A stale linker assumption remained in Ceylon&apos;s Rust target profiles.&lt;/p&gt;
&lt;p&gt;That sounds small. It wasn&apos;t.&lt;/p&gt;
&lt;p&gt;The same assumption existed across 27 Rust target profiles, which meant what initially looked like several unrelated failures could actually share one cause.&lt;/p&gt;
&lt;p&gt;We corrected the integration centrally.&lt;/p&gt;
&lt;p&gt;Representative binaries then resolved the IPC buffer at the proper new address, the previous memory fault disappeared, and the controller continued to run normally.&lt;/p&gt;
&lt;p&gt;More importantly, another failure disappeared with it.&lt;/p&gt;
&lt;p&gt;The RNG interface, which had previously faulted during testing, completed 256 out of 256 stress requests successfully.&lt;/p&gt;
&lt;p&gt;That was a useful reminder of a rule we&apos;ve increasingly adopted during this migration:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Fix the version contract first. Diagnose individual services second.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The RNG wasn&apos;t broken.&lt;/p&gt;
&lt;p&gt;Storage wasn&apos;t suffering from the same memory failure anymore.&lt;/p&gt;
&lt;p&gt;One platform assumption had been wrong in several places.&lt;/p&gt;
&lt;h2 id=&quot;then-the-pci-addresses-moved&quot;&gt;Then the PCI Addresses Moved&lt;/h2&gt;
&lt;p&gt;With the IPC issue corrected, storage progressed further — only to stop at PCI resource admission.&lt;/p&gt;
&lt;p&gt;The addresses assigned to the block controllers no longer matched Ceylon&apos;s expected platform profile.&lt;/p&gt;
&lt;p&gt;At first that looked like another configuration mistake.&lt;/p&gt;
&lt;p&gt;It turned out to be more interesting.&lt;/p&gt;
&lt;p&gt;Earlier testing had consistently produced one set of PCI BAR addresses. The new runs consistently produced another.&lt;/p&gt;
&lt;p&gt;We reproduced the new layout with identical QEMU machine inputs and then traced the first divergence back through the boot process.&lt;/p&gt;
&lt;p&gt;Ceylon wasn&apos;t moving them.&lt;/p&gt;
&lt;p&gt;The firmware was.&lt;/p&gt;
&lt;p&gt;The earlier environment had been using SeaBIOS 1.16.2. The current environment was using SeaBIOS 1.16.3.&lt;/p&gt;
&lt;p&gt;That release includes changes in PCI resource allocation, and our testing showed the resource map changing before Ceylon executed its platform-service code.&lt;/p&gt;
&lt;p&gt;That distinction mattered.&lt;/p&gt;
&lt;p&gt;This wasn&apos;t a Ceylon driver changing addresses incorrectly.&lt;/p&gt;
&lt;p&gt;It was the machine presented to Ceylon changing underneath it.&lt;/p&gt;
&lt;h2 id=&quot;turning-the-seabios-problem-into-research&quot;&gt;Turning the SeaBIOS Problem Into Research&lt;/h2&gt;
&lt;p&gt;Instead of immediately reverting the firmware, we stopped and asked a different question:&lt;/p&gt;
&lt;p&gt;Could the new behavior be useful?&lt;/p&gt;
&lt;p&gt;If firmware is responsible for assigning PCI resources, perhaps Ceylon shouldn&apos;t duplicate those assignments as handwritten constants forever.&lt;/p&gt;
&lt;p&gt;So we ran a bounded feasibility experiment.&lt;/p&gt;
&lt;p&gt;The exact QEMU, SeaBIOS and device topology was booted ten separate times.&lt;/p&gt;
&lt;p&gt;Every run produced the same normalized PCI resource manifest.&lt;/p&gt;
&lt;p&gt;Ten out of ten. Identical.&lt;/p&gt;
&lt;p&gt;We then deliberately changed the PCI topology by adding an HDA audio device.&lt;/p&gt;
&lt;p&gt;The resource layout changed predictably.&lt;/p&gt;
&lt;p&gt;We removed it.&lt;/p&gt;
&lt;p&gt;The original manifest returned.&lt;/p&gt;
&lt;p&gt;That established something potentially useful for later development: the QEMU/SeaBIOS platform can act as a deterministic PCI-resource generator for a fixed virtual hardware configuration.&lt;/p&gt;
&lt;p&gt;A future Ceylon build system could potentially probe that configuration and generate both the MicroKernel mappings and driver resource-admission profiles from the same machine-readable source.&lt;/p&gt;
&lt;p&gt;That would remove an entire class of duplicated constants.&lt;/p&gt;
&lt;p&gt;We prototyped enough of that process to establish feasibility.&lt;/p&gt;
&lt;p&gt;Then we stopped.&lt;/p&gt;
&lt;p&gt;The full generator is useful future engineering, but it wasn&apos;t necessary to finish the migration. A1 needs a stable machine now, not another new subsystem to develop.&lt;/p&gt;
&lt;p&gt;So the current SeaBIOS/QEMU/platform tuple is being pinned, while generated resource integration goes onto the later engineering list.&lt;/p&gt;
&lt;h2 id=&quot;meanwhile-what-do-we-want-to-build-with-it&quot;&gt;Meanwhile: What Do We Want to Build With It?&lt;/h2&gt;
&lt;p&gt;The operating-system work wasn&apos;t the only research happening September 20.&lt;/p&gt;
&lt;p&gt;We also spent part of the day looking farther up the stack — at the kinds of serious creative applications Ceylon should eventually support.&lt;/p&gt;
&lt;p&gt;One of those studies focused on 3D design and modeling.&lt;/p&gt;
&lt;p&gt;The goal was not to pick an existing application and clone it.&lt;/p&gt;
&lt;p&gt;Instead, we looked at a range of tools with very different philosophies — including Dust3D, Plasticity, MoI 3D, MagicaVoxel, Crocotile3D, Anim8or, ZModeler and others — and asked a more useful question:&lt;/p&gt;
&lt;p&gt;What does each one get right?&lt;/p&gt;
&lt;p&gt;Some make it extremely easy to block out a shape.&lt;/p&gt;
&lt;p&gt;Some are excellent at direct surface editing.&lt;/p&gt;
&lt;p&gt;Some emphasize mathematical precision.&lt;/p&gt;
&lt;p&gt;Some make low-poly, voxel or tile-based construction fast.&lt;/p&gt;
&lt;p&gt;Others are aimed at fabrication rather than rendering.&lt;/p&gt;
&lt;p&gt;The emerging Ceylon approach is to combine the useful ideas into a coherent workflow rather than inherit one application&apos;s limitations.&lt;/p&gt;
&lt;p&gt;The working concept is currently called NuFormatix.&lt;/p&gt;
&lt;p&gt;Its core idea can be summarized as:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Create the shape first. Add precision only where it matters.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The proposed workflow has four major stages.&lt;/p&gt;
&lt;h3 id=&quot;design&quot;&gt;Design&lt;/h3&gt;
&lt;p&gt;Start with a fast, approachable shape-building environment.&lt;/p&gt;
&lt;p&gt;The emphasis here is getting an idea out of your head and onto the screen without immediately forcing the user into detailed CAD operations.&lt;/p&gt;
&lt;p&gt;A Dust3D-style workflow is one of the inspirations being studied for this mode.&lt;/p&gt;
&lt;h3 id=&quot;direct&quot;&gt;Direct&lt;/h3&gt;
&lt;p&gt;Once the basic form exists, move into freeform direct modeling.&lt;/p&gt;
&lt;p&gt;This is where ideas found in tools such as Plasticity and modern direct-modeling systems become useful: grab geometry, push it, reshape it and refine it without turning every operation into a formal engineering exercise.&lt;/p&gt;
&lt;h3 id=&quot;precision&quot;&gt;Precision&lt;/h3&gt;
&lt;p&gt;When dimensions actually matter, introduce constraints, measurements and CAD-style controls.&lt;/p&gt;
&lt;p&gt;The important design decision is that precision becomes available when the work requires it, rather than making the entire application feel like a traditional CAD program from the first click.&lt;/p&gt;
&lt;h3 id=&quot;fabricate&quot;&gt;Fabricate&lt;/h3&gt;
&lt;p&gt;Finally, the object should be useful outside the modeling program.&lt;/p&gt;
&lt;p&gt;That means thinking from the beginning about manufacturing and output workflows — including image and geometry export, fabrication formats, G-code where appropriate, and eventually direct communication with supported devices.&lt;/p&gt;
&lt;p&gt;The research is also pointing toward a shared Ceylon Design Core rather than a collection of unrelated creative programs.&lt;/p&gt;
&lt;p&gt;The long-term idea is that 2D design, 3D modeling and other creation tools should share common concepts where doing so makes sense: documents, geometry, transforms, units, undo/redo, inspectors, asset handling, import/export and device output.&lt;/p&gt;
&lt;p&gt;That could eventually allow Ceylon to support sibling 2D and 3D design applications without rebuilding the same infrastructure repeatedly.&lt;/p&gt;
&lt;h2 id=&quot;cpu-first-still-matters&quot;&gt;CPU First Still Matters&lt;/h2&gt;
&lt;p&gt;There is another important requirement behind this research.&lt;/p&gt;
&lt;p&gt;Ceylon&apos;s creative applications cannot assume that a powerful GPU is always available.&lt;/p&gt;
&lt;p&gt;Future GPU acceleration is absolutely part of the roadmap, but the CPU path remains first-class.&lt;/p&gt;
&lt;p&gt;For a 3D design application that means the software should remain usable with CPU rendering and CPU geometry processing, even if some operations become faster once hardware acceleration is available.&lt;/p&gt;
&lt;p&gt;That&apos;s an important philosophical difference.&lt;/p&gt;
&lt;p&gt;We don&apos;t want &amp;quot;CPU support&amp;quot; to mean an emergency screen that exists only long enough to install a graphics driver.&lt;/p&gt;
&lt;p&gt;We want it to mean:&lt;/p&gt;
&lt;p&gt;the application still works.&lt;/p&gt;
&lt;p&gt;Then acceleration makes it better.&lt;/p&gt;
&lt;p&gt;That philosophy applies beyond 3D graphics and will influence other Ceylon workstation applications as they develop.&lt;/p&gt;
&lt;h2 id=&quot;research-not-a-product-announcement&quot;&gt;Research, Not a Product Announcement&lt;/h2&gt;
&lt;p&gt;NuFormatix is still a working research direction, not an implemented A1 application or a product announcement.&lt;/p&gt;
&lt;p&gt;There is significant specification work ahead before it would make sense to write application code.&lt;/p&gt;
&lt;p&gt;But this kind of work is important now because the operating system needs targets.&lt;/p&gt;
&lt;p&gt;It is very easy to design an OS around abstract benchmarks and synthetic demos.&lt;/p&gt;
&lt;p&gt;It is much harder — and much more useful — to ask:&lt;/p&gt;
&lt;p&gt;Can this architecture eventually support a serious modeling program?&lt;/p&gt;
&lt;p&gt;Can it move large creative datasets efficiently?&lt;/p&gt;
&lt;p&gt;Can applications share data without becoming tightly coupled?&lt;/p&gt;
&lt;p&gt;Can the graphics stack scale from software rendering today to accelerated rendering later?&lt;/p&gt;
&lt;p&gt;Can a designer move naturally from an idea to a precise object to something that can actually be manufactured?&lt;/p&gt;
&lt;p&gt;Those questions influence the operating system beneath the application.&lt;/p&gt;
&lt;p&gt;That&apos;s why application research is happening before all of the application infrastructure exists.&lt;/p&gt;
&lt;p&gt;We&apos;re trying to make sure Ceylon grows toward something useful.&lt;/p&gt;
&lt;h2 id=&quot;storage-wasnt-broken-either&quot;&gt;Storage Wasn&apos;t Broken Either&lt;/h2&gt;
&lt;p&gt;Back down in the operating-system migration, with the PCI resource profiles reconciled, both storage devices finally reached asynchronous command completion.&lt;/p&gt;
&lt;p&gt;Then both identities were rejected.&lt;/p&gt;
&lt;p&gt;The devices returned successful &lt;code&gt;GET_ID&lt;/code&gt; completions, the identity structures were sealed correctly, but their serial-number lengths were zero.&lt;/p&gt;
&lt;p&gt;Ceylon&apos;s storage router rejected them.&lt;/p&gt;
&lt;p&gt;Correctly.&lt;/p&gt;
&lt;p&gt;We did not weaken the validator.&lt;/p&gt;
&lt;p&gt;Instead, we compared the current QEMU configuration with the previous working environment.&lt;/p&gt;
&lt;p&gt;There was the problem.&lt;/p&gt;
&lt;p&gt;The old virtual disks had stable identities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cylon-vblk0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cylon-vblk1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The migrated launcher had lost those serial-number parameters.&lt;/p&gt;
&lt;p&gt;VirtIO was doing exactly what it was supposed to do: a successful identity request against a virtual block device with no configured serial returned an empty identity.&lt;/p&gt;
&lt;p&gt;We restored the historical serials.&lt;/p&gt;
&lt;p&gt;Immediately:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;both identities validated;&lt;/li&gt;
&lt;li&gt;both volumes published;&lt;/li&gt;
&lt;li&gt;storage reads passed;&lt;/li&gt;
&lt;li&gt;storage writes passed;&lt;/li&gt;
&lt;li&gt;flush operations passed;&lt;/li&gt;
&lt;li&gt;the previous IPC memory fault remained gone;&lt;/li&gt;
&lt;li&gt;no IOMMU faults appeared;&lt;/li&gt;
&lt;li&gt;boot continued.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That was another migration failure that turned out not to be a defective subsystem at all.&lt;/p&gt;
&lt;p&gt;The storage implementation was working.&lt;/p&gt;
&lt;p&gt;Its platform contract had been incomplete.&lt;/p&gt;
&lt;h2 id=&quot;network-usb-rng-and-display&quot;&gt;Network, USB, RNG and Display&lt;/h2&gt;
&lt;p&gt;Once the main platform contracts were restored, we ran the broader parity checks.&lt;/p&gt;
&lt;p&gt;The current results are:&lt;/p&gt;
&lt;p&gt;Storage: operational&lt;br&gt;
Network transmit: pass&lt;br&gt;
Network receive: pass&lt;br&gt;
ARP: pass&lt;br&gt;
Basic network connectivity: pass&lt;br&gt;
RNG stress: 256/256 pass&lt;br&gt;
USB: pass&lt;br&gt;
Display/framebuffer: pass&lt;br&gt;
Controller: pass&lt;br&gt;
IOMMU faults: none observed&lt;/p&gt;
&lt;p&gt;That is very close to the functional platform we had before beginning the migration.&lt;/p&gt;
&lt;p&gt;There is still a networking interrupt question we intend to revisit.&lt;/p&gt;
&lt;p&gt;The current network implementation is clearly able to move traffic, but an expected hardware-notification path was not observed during an instrumented run. Rather than invent a fix based on an assumption, that investigation has been suspended until it can be addressed independently against the clean qualification fixture.&lt;/p&gt;
&lt;p&gt;It is now a production-readiness question, not something we are allowing to hold the migration hostage.&lt;/p&gt;
&lt;h2 id=&quot;the-test-machine-started-moving-under-us&quot;&gt;The Test Machine Started Moving Under Us&lt;/h2&gt;
&lt;p&gt;Late in the evening we encountered what may have been the most useful lesson of the entire session.&lt;/p&gt;
&lt;p&gt;A test that should have reproduced the known-good machine suddenly produced different PCI addresses again.&lt;/p&gt;
&lt;p&gt;Three unrelated devices all moved by exactly 16 KiB.&lt;/p&gt;
&lt;p&gt;That pattern was too clean to be random.&lt;/p&gt;
&lt;p&gt;The culprit was found quickly.&lt;/p&gt;
&lt;p&gt;The HDA audio device that had been deliberately added during the SeaBIOS topology experiment had leaked into a later validation fixture.&lt;/p&gt;
&lt;p&gt;There was a second difference as well: the failing launch had switched from the canonical default VGA configuration to a Bochs display device.&lt;/p&gt;
&lt;p&gt;Once HDA was removed and the proper display configuration restored, the canonical PCI resource map returned exactly.&lt;/p&gt;
&lt;p&gt;That should have ended it.&lt;/p&gt;
&lt;p&gt;It didn&apos;t.&lt;/p&gt;
&lt;p&gt;Storage still failed to publish its volumes.&lt;/p&gt;
&lt;p&gt;This time the PCI layout was correct, the serial arguments were correct, and the machine topology was correct.&lt;/p&gt;
&lt;p&gt;The wrong system artifact was being booted.&lt;/p&gt;
&lt;p&gt;An earlier ISO from the IPC-validation work had been substituted for the later storage-qualified image, and it used a different loader.&lt;/p&gt;
&lt;p&gt;Using the correct storage-qualified artifact restored the entire path:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GET_ID&lt;/code&gt; completion;&lt;/li&gt;
&lt;li&gt;sealed identities;&lt;/li&gt;
&lt;li&gt;volume publication;&lt;/li&gt;
&lt;li&gt;storage read;&lt;/li&gt;
&lt;li&gt;storage write;&lt;/li&gt;
&lt;li&gt;flush.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We then ran the clean parity configuration three times.&lt;/p&gt;
&lt;p&gt;Three out of three passed.&lt;/p&gt;
&lt;h2 id=&quot;the-iso-is-not-the-machine&quot;&gt;The ISO Is Not the Machine&lt;/h2&gt;
&lt;p&gt;This evening changed how we are treating validation artifacts.&lt;/p&gt;
&lt;p&gt;Previously it was tempting to think of &amp;quot;the ISO&amp;quot; as the thing being tested.&lt;/p&gt;
&lt;p&gt;It isn&apos;t.&lt;/p&gt;
&lt;p&gt;For Ceylon A1, the qualification artifact is the entire virtual machine definition:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;exact system image;&lt;/li&gt;
&lt;li&gt;exact loader;&lt;/li&gt;
&lt;li&gt;exact QEMU binary;&lt;/li&gt;
&lt;li&gt;exact firmware;&lt;/li&gt;
&lt;li&gt;exact CPU model;&lt;/li&gt;
&lt;li&gt;processor count;&lt;/li&gt;
&lt;li&gt;memory configuration;&lt;/li&gt;
&lt;li&gt;IOMMU configuration;&lt;/li&gt;
&lt;li&gt;PCI device list;&lt;/li&gt;
&lt;li&gt;device order;&lt;/li&gt;
&lt;li&gt;device addresses;&lt;/li&gt;
&lt;li&gt;display hardware;&lt;/li&gt;
&lt;li&gt;block backends;&lt;/li&gt;
&lt;li&gt;persistent device serials;&lt;/li&gt;
&lt;li&gt;and the exact launch command.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Change one of those and you may have changed the machine.&lt;/p&gt;
&lt;p&gt;That lesson is now being turned into process.&lt;/p&gt;
&lt;p&gt;We have frozen a canonical A1 parity launcher representing the configuration that reproduced successfully three times.&lt;/p&gt;
&lt;p&gt;Future diagnostic experiments will be layered explicitly on top of that baseline instead of quietly modifying it.&lt;/p&gt;
&lt;h2 id=&quot;what-we-did-not-do&quot;&gt;What We Did Not Do&lt;/h2&gt;
&lt;p&gt;Several things are equally important.&lt;/p&gt;
&lt;p&gt;We did not weaken storage identity validation to get a green test.&lt;/p&gt;
&lt;p&gt;We did not keep changing BAR addresses until something happened to boot.&lt;/p&gt;
&lt;p&gt;We did not patch the firmware.&lt;/p&gt;
&lt;p&gt;We did not promote the experimental HDA topology.&lt;/p&gt;
&lt;p&gt;We did not promote the temporary networking IRQ experiment.&lt;/p&gt;
&lt;p&gt;And throughout this work, the canonical Project Ceylon source tree remained untouched.&lt;/p&gt;
&lt;p&gt;The migration and forensic work has taken place in external validation trees while we determined exactly which changes were genuinely required.&lt;/p&gt;
&lt;p&gt;That distinction becomes important now.&lt;/p&gt;
&lt;h2 id=&quot;we-are-entering-closure&quot;&gt;We Are Entering Closure&lt;/h2&gt;
&lt;p&gt;At approximately 12:25 AM Central on September 21, the situation is substantially different from where it was nine hours earlier.&lt;/p&gt;
&lt;p&gt;We have a reproducible A1 parity fixture.&lt;/p&gt;
&lt;p&gt;We have three consecutive successful runs.&lt;/p&gt;
&lt;p&gt;We understand the major compatibility changes that came with the new MicroKernel platform.&lt;/p&gt;
&lt;p&gt;We understand the firmware resource-allocation change.&lt;/p&gt;
&lt;p&gt;We understand why storage identity disappeared.&lt;/p&gt;
&lt;p&gt;We understand the test-fixture contamination that confused later results.&lt;/p&gt;
&lt;p&gt;And we have separated the remaining product-readiness work from the actual migration.&lt;/p&gt;
&lt;p&gt;The next job is not another debugging marathon.&lt;/p&gt;
&lt;p&gt;It is closure.&lt;/p&gt;
&lt;p&gt;Every validated migration change is now being reconciled against the real Project Ceylon source tree.&lt;/p&gt;
&lt;p&gt;Every experimental change has to be excluded.&lt;/p&gt;
&lt;p&gt;Every required tool and runtime artifact has to be preserved with version and provenance information.&lt;/p&gt;
&lt;p&gt;Every relevant worktree has to be clean.&lt;/p&gt;
&lt;p&gt;Every source change has to be committed.&lt;/p&gt;
&lt;p&gt;Every documentation change has to be committed.&lt;/p&gt;
&lt;p&gt;And every strange-looking platform requirement needs an explanation describing not just what changed, but why it exists.&lt;/p&gt;
&lt;p&gt;The migration will not be considered closed simply because the operating system boots.&lt;/p&gt;
&lt;p&gt;There are now two closure requirements:&lt;/p&gt;
&lt;p&gt;Functional closure: the migrated system builds and reproduces the qualified A1 behavior.&lt;/p&gt;
&lt;p&gt;Repository and documentation closure: the source trees are clean, the changes are committed and documented, the toolchain is preserved, and another engineer could reproduce what we did without relying on the contents of someone&apos;s shell history.&lt;/p&gt;
&lt;p&gt;Both have to pass.&lt;/p&gt;
&lt;p&gt;Only then do we move on.&lt;/p&gt;
&lt;h2 id=&quot;back-to-building-ceylon&quot;&gt;Back to Building Ceylon&lt;/h2&gt;
&lt;p&gt;This migration took longer than expected.&lt;/p&gt;
&lt;p&gt;A significant portion of the work amounted to getting capabilities back that Ceylon already had before the upgrade.&lt;/p&gt;
&lt;p&gt;That is frustrating, but the resulting platform is stronger for it.&lt;/p&gt;
&lt;p&gt;We now have a better understanding of the boundaries between the operating system, the MicroKernel environment, firmware, the virtual hardware platform and the qualification fixture itself.&lt;/p&gt;
&lt;p&gt;At the same time, research into applications such as NuFormatix is helping define what that platform eventually needs to support.&lt;/p&gt;
&lt;p&gt;That&apos;s an important balance.&lt;/p&gt;
&lt;p&gt;An operating system should not exist just to boot itself.&lt;/p&gt;
&lt;p&gt;The point is what people can build and create with it.&lt;/p&gt;
&lt;p&gt;More importantly, we now have a reproducible baseline instead of a collection of assumptions.&lt;/p&gt;
&lt;p&gt;There are still things to improve.&lt;/p&gt;
&lt;p&gt;There always will be.&lt;/p&gt;
&lt;p&gt;But we&apos;re reaching the point where the question can change from:&lt;/p&gt;
&lt;p&gt;&amp;quot;What did the upgrade break?&amp;quot;&lt;/p&gt;
&lt;p&gt;back to:&lt;/p&gt;
&lt;p&gt;&amp;quot;What are we building next?&amp;quot;&lt;/p&gt;
&lt;p&gt;And increasingly, we have answers to that question too.&lt;/p&gt;
&lt;p&gt;That&apos;s where Project Ceylon needs to be.&lt;/p&gt;
</content:encoded></item><item><title>Ceylon Development Log — September 19, 2026: The Controller Was Ready. It Still Wouldn’t Run.</title><link>https://ceylonprojectng.com/journal/ceylon-development-log-september-19-2026-the-controller-was-ready-it-still-wouldnt-run/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/ceylon-development-log-september-19-2026-the-controller-was-ready-it-still-wouldnt-run/</guid><description>Today I submitted Project Ceylon to the Hackaday Retrocomputing Contest.</description><pubDate>Sat, 19 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Today I submitted Project Ceylon to the Hackaday Retrocomputing Contest.&lt;/p&gt;
&lt;p&gt;And then, almost immediately, Ceylon reminded me why I am writing this development journal instead of waiting until everything is polished and pretending the path was obvious.&lt;/p&gt;
&lt;p&gt;A controller that should have started did not.&lt;/p&gt;
&lt;p&gt;Not crashed.&lt;/p&gt;
&lt;p&gt;Not faulted.&lt;/p&gt;
&lt;p&gt;Not obviously misconfigured.&lt;/p&gt;
&lt;p&gt;It just sat there.&lt;/p&gt;
&lt;p&gt;That turned the rest of the day — and quite a bit of the night — into one of those debugging sessions where the useful result is not a dramatic fix.&lt;/p&gt;
&lt;p&gt;It is eliminating one wrong explanation after another until the problem finally becomes small enough to understand.&lt;/p&gt;
&lt;h2 id=&quot;first-the-public-side&quot;&gt;First, the public side&lt;/h2&gt;
&lt;p&gt;The Hackaday project page got a fairly substantial cleanup today.&lt;/p&gt;
&lt;p&gt;I uploaded the current architecture and progress graphics, clarified the staged alpha plan, and added an older framebuffer capture as historical proof that Ceylon has already produced native graphics under QEMU.&lt;/p&gt;
&lt;p&gt;That image is the project&apos;s earlier First Light milestone.&lt;/p&gt;
&lt;p&gt;First Light did not happen today.&lt;/p&gt;
&lt;p&gt;The important distinction is that the Hackaday page now has more evidence of what already exists instead of relying mainly on descriptions of where the project is going.&lt;/p&gt;
&lt;p&gt;The alpha plan also became clearer.&lt;/p&gt;
&lt;p&gt;The first A-series release will go to a small curated group of technical testers. The things they break, misunderstand or expose will be addressed before a broader public QEMU evaluation.&lt;/p&gt;
&lt;p&gt;That is slower than throwing an image onto the Internet and calling it an alpha.&lt;/p&gt;
&lt;p&gt;I think it is also more useful.&lt;/p&gt;
&lt;h2 id=&quot;then-the-controller-refused-to-start&quot;&gt;Then the controller refused to start&lt;/h2&gt;
&lt;p&gt;The main engineering problem today was a controller Protection Domain that never produced its expected startup marker.&lt;/p&gt;
&lt;p&gt;The first obvious question was whether I had simply failed to start it.&lt;/p&gt;
&lt;p&gt;That would have been convenient.&lt;/p&gt;
&lt;p&gt;The generated configuration said otherwise.&lt;/p&gt;
&lt;p&gt;The controller had the correct resume flag.&lt;/p&gt;
&lt;p&gt;The system initializer could see it.&lt;/p&gt;
&lt;p&gt;It was included in the generated startup collections.&lt;/p&gt;
&lt;p&gt;Its executable was loaded.&lt;/p&gt;
&lt;p&gt;Its scheduling context was present.&lt;/p&gt;
&lt;p&gt;The initializer attempted to start it.&lt;/p&gt;
&lt;p&gt;The child identifier was valid.&lt;/p&gt;
&lt;p&gt;So the easy explanation disappeared.&lt;/p&gt;
&lt;p&gt;The machine thought this thing should exist.&lt;/p&gt;
&lt;p&gt;The question became:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What does the MicroKernel think the controller is actually doing?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;looking-inside-the-running-system&quot;&gt;Looking inside the running system&lt;/h2&gt;
&lt;p&gt;A diagnostic observation finally gave us the controller&apos;s kernel-visible state.&lt;/p&gt;
&lt;p&gt;Its instruction pointer was sitting exactly at its generated entry point:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;0x2025d8
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Its stack pointer looked correct.&lt;/p&gt;
&lt;p&gt;Its priority was 199.&lt;/p&gt;
&lt;p&gt;It was assigned to CPU 0.&lt;/p&gt;
&lt;p&gt;Its scheduling context was bound.&lt;/p&gt;
&lt;p&gt;Most importantly, its thread state was Restart — a runnable/startable state.&lt;/p&gt;
&lt;p&gt;That was a significant result.&lt;/p&gt;
&lt;p&gt;The controller was not inactive.&lt;/p&gt;
&lt;p&gt;It was not blocked waiting on a message.&lt;/p&gt;
&lt;p&gt;It was not sitting in a fault state.&lt;/p&gt;
&lt;p&gt;And it had not wandered halfway through startup before failing.&lt;/p&gt;
&lt;p&gt;It appeared to have never moved from the front door.&lt;/p&gt;
&lt;h2 id=&quot;a-bad-observation-can-be-worse-than-no-observation&quot;&gt;A bad observation can be worse than no observation&lt;/h2&gt;
&lt;p&gt;The next scheduler snapshot initially looked suspicious.&lt;/p&gt;
&lt;p&gt;The controller was still waiting while a higher-priority supervisor was running.&lt;/p&gt;
&lt;p&gt;Except the supervisor was still inside its own initialization routine when the snapshot was taken.&lt;/p&gt;
&lt;p&gt;That means the observation itself was too early.&lt;/p&gt;
&lt;p&gt;A priority-250 thread running while a priority-199 thread waits is not evidence of a scheduler bug.&lt;/p&gt;
&lt;p&gt;It is the scheduler doing exactly what it was told to do.&lt;/p&gt;
&lt;p&gt;So that result was classified as an observation-timing problem, not a system failure.&lt;/p&gt;
&lt;p&gt;That may sound like splitting hairs.&lt;/p&gt;
&lt;p&gt;It is not.&lt;/p&gt;
&lt;p&gt;One of the easiest ways to manufacture a fake operating-system bug is to instrument the system in a way that changes the thing you are trying to observe.&lt;/p&gt;
&lt;p&gt;So we stopped and changed the observation method rather than changing the system.&lt;/p&gt;
&lt;h2 id=&quot;after-initialization-the-mystery-remained&quot;&gt;After initialization, the mystery remained&lt;/h2&gt;
&lt;p&gt;A valid post-initialization observation came next.&lt;/p&gt;
&lt;p&gt;The controller was still sitting at:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PC = 0x2025d8
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Still in Restart.&lt;/p&gt;
&lt;p&gt;Still ready to go.&lt;/p&gt;
&lt;p&gt;But the existing debug interfaces did not expose enough information to answer the next question.&lt;/p&gt;
&lt;p&gt;Was the controller actually in the ready queue?&lt;/p&gt;
&lt;p&gt;Was the ready bitmap set?&lt;/p&gt;
&lt;p&gt;Was its scheduling context really eligible at that moment?&lt;/p&gt;
&lt;p&gt;Those details live inside the scheduler.&lt;/p&gt;
&lt;p&gt;So I built a temporary diagnostic kernel whose only job was to expose those internal states without changing them.&lt;/p&gt;
&lt;p&gt;That gave us the strongest result of the night.&lt;/p&gt;
&lt;p&gt;The controller was:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;queued                 YES
present in ready queue YES
ready bitmap present   YES
runnable               YES
schedulable            YES
SC refill ready        YES
SC refill sufficient   YES
release queued         NO
CPU/domain match       YES
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In other words:&lt;/p&gt;
&lt;p&gt;the controller itself looked healthy.&lt;/p&gt;
&lt;h2 id=&quot;then-we-found-what-was-ahead-of-it&quot;&gt;Then we found what was ahead of it&lt;/h2&gt;
&lt;p&gt;The highest ready thread on CPU 0 was the PCI service.&lt;/p&gt;
&lt;p&gt;Its priority is 248.&lt;/p&gt;
&lt;p&gt;The controller&apos;s is 199.&lt;/p&gt;
&lt;p&gt;And the PCI service was observed running.&lt;/p&gt;
&lt;p&gt;That explained the scheduler decision at that instant.&lt;/p&gt;
&lt;p&gt;It did not, however, prove that PCI was the bug.&lt;/p&gt;
&lt;p&gt;That distinction became important almost immediately.&lt;/p&gt;
&lt;p&gt;The obvious temptation would have been to lower the PCI service&apos;s priority, raise the controller&apos;s priority, force a resume, or otherwise make the symptom disappear.&lt;/p&gt;
&lt;p&gt;I did none of those things.&lt;/p&gt;
&lt;p&gt;Changing a priority until something starts running is not debugging.&lt;/p&gt;
&lt;p&gt;It is negotiating with the evidence.&lt;/p&gt;
&lt;h2 id=&quot;pci-looked-guilty-then-it-didnt&quot;&gt;PCI looked guilty. Then it didn&apos;t.&lt;/h2&gt;
&lt;p&gt;The next pass audited the PCI service itself.&lt;/p&gt;
&lt;p&gt;Was it spinning?&lt;/p&gt;
&lt;p&gt;Was it sitting in an accidental infinite loop?&lt;/p&gt;
&lt;p&gt;Was it polling forever?&lt;/p&gt;
&lt;p&gt;No.&lt;/p&gt;
&lt;p&gt;Its initialization path was bounded.&lt;/p&gt;
&lt;p&gt;Its notification handler did bounded work.&lt;/p&gt;
&lt;p&gt;It returned to the normal blocking runtime path afterward.&lt;/p&gt;
&lt;p&gt;Lower-priority services were observed getting CPU time after PCI initialization.&lt;/p&gt;
&lt;p&gt;Later PCI wakeups also had legitimate event-driven explanations.&lt;/p&gt;
&lt;p&gt;So the first theory —&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;the high-priority PCI service is simply spinning forever and starving the controller&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;— did not survive inspection.&lt;/p&gt;
&lt;p&gt;That is where the controller investigation stood when I stopped that branch for the night.&lt;/p&gt;
&lt;p&gt;We had proven a great deal about what wasn&apos;t wrong.&lt;/p&gt;
&lt;p&gt;We had not yet proven what was.&lt;/p&gt;
&lt;p&gt;That is still progress.&lt;/p&gt;
&lt;h2 id=&quot;a-provenance-problem-surfaced-too&quot;&gt;A provenance problem surfaced too&lt;/h2&gt;
&lt;p&gt;Late in the investigation another issue became impossible to ignore.&lt;/p&gt;
&lt;p&gt;We are in the middle of validating the move to the newer 2.3 platform stack, but some of the retained build tooling and validation paths still trace back to the older 2.2 environment.&lt;/p&gt;
&lt;p&gt;That means there is a dangerous question sitting underneath all of the scheduler evidence:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Are we actually debugging the exact software stack we think we are debugging?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That needs to be answered before I start accusing the MicroKernel scheduler of doing something impossible.&lt;/p&gt;
&lt;p&gt;So the next stage of this work will include a full provenance check of the build environment: exact source revisions, exact tools, exact generated artifacts, and which copy of what actually produced the test image.&lt;/p&gt;
&lt;p&gt;This sounds like bookkeeping until the day it isn&apos;t.&lt;/p&gt;
&lt;p&gt;Reproducibility only matters when two things that are supposedly the same suddenly are not.&lt;/p&gt;
&lt;p&gt;Then it matters a lot.&lt;/p&gt;
&lt;h2 id=&quot;nubasic-got-another-round-of-scrutiny&quot;&gt;NuBASIC got another round of scrutiny&lt;/h2&gt;
&lt;p&gt;The controller work was not the only thing that made it into the overnight session.&lt;/p&gt;
&lt;p&gt;I also spent time reviewing the proposed NuBASIC Level 1 specification.&lt;/p&gt;
&lt;p&gt;The goal remains to have a complete Level 1 language available for A1 rather than shipping a tiny novelty BASIC that exists only to print &lt;code&gt;HELLO&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;But writing a plausible language specification is surprisingly good at exposing places where hand-waving is not good enough.&lt;/p&gt;
&lt;p&gt;The current review surfaced issues around things such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;grammar consistency&lt;/li&gt;
&lt;li&gt;STOP/CONTINUE lifetime&lt;/li&gt;
&lt;li&gt;procedure and call-frame behavior&lt;/li&gt;
&lt;li&gt;STATIC data reset behavior&lt;/li&gt;
&lt;li&gt;stack exhaustion&lt;/li&gt;
&lt;li&gt;error scope&lt;/li&gt;
&lt;li&gt;platform-binding completeness&lt;/li&gt;
&lt;li&gt;built-in function accounting&lt;/li&gt;
&lt;li&gt;deterministic behavior&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of that is implementation work yet.&lt;/p&gt;
&lt;p&gt;That is deliberate.&lt;/p&gt;
&lt;p&gt;It is much cheaper to discover contradictions in a specification than in a language runtime people have already started using.&lt;/p&gt;
&lt;h2 id=&quot;and-the-applications-are-starting-to-shape-the-machine&quot;&gt;And the applications are starting to shape the machine&lt;/h2&gt;
&lt;p&gt;Near the end of the night I also went back to something I keep returning to with Ceylon:&lt;/p&gt;
&lt;p&gt;I don&apos;t want the operating system to become technically impressive and unpleasant to actually create things with.&lt;/p&gt;
&lt;p&gt;That led into more design research around future 2D/3D tools.&lt;/p&gt;
&lt;p&gt;One principle is becoming firm:&lt;/p&gt;
&lt;p&gt;CPU-only capability stays first-class.&lt;/p&gt;
&lt;p&gt;A GPU can eventually make rendering dramatically faster.&lt;/p&gt;
&lt;p&gt;It should not be the admission ticket for rendering at all.&lt;/p&gt;
&lt;p&gt;If a user wants to let a CPU grind on a final render for a long time, the system should still be capable of producing the result.&lt;/p&gt;
&lt;p&gt;The same philosophy is starting to shape CAD and design-tool thinking.&lt;/p&gt;
&lt;p&gt;Precision needs to exist.&lt;/p&gt;
&lt;p&gt;Exact dimensions need to exist.&lt;/p&gt;
&lt;p&gt;Constraints need to exist.&lt;/p&gt;
&lt;p&gt;But I do not want every creative action to begin with somebody typing measurements into a dialog box.&lt;/p&gt;
&lt;p&gt;There should also be room to sketch, push, pull, shape and experiment — and then have the system help normalize that work into something dimensionally valid and, eventually, fabricatable.&lt;/p&gt;
&lt;p&gt;That is research, not an implementation commitment yet.&lt;/p&gt;
&lt;p&gt;But it is exactly the kind of application pressure that tells us what the platform underneath needs to become.&lt;/p&gt;
&lt;h2 id=&quot;what-today-actually-accomplished&quot;&gt;What today actually accomplished&lt;/h2&gt;
&lt;p&gt;If I reduced today to a release-note list, it would look unimpressive.&lt;/p&gt;
&lt;p&gt;The controller still wasn&apos;t running when this workday ended.&lt;/p&gt;
&lt;p&gt;But that misses what happened.&lt;/p&gt;
&lt;p&gt;We proved that the controller is generated correctly.&lt;/p&gt;
&lt;p&gt;We proved that the initializer starts it.&lt;/p&gt;
&lt;p&gt;We proved that the MicroKernel sees it.&lt;/p&gt;
&lt;p&gt;We proved that it is runnable.&lt;/p&gt;
&lt;p&gt;We proved that it is schedulable.&lt;/p&gt;
&lt;p&gt;We proved that its scheduling context is usable.&lt;/p&gt;
&lt;p&gt;We proved that it is actually present in the ready queue.&lt;/p&gt;
&lt;p&gt;We found a higher-priority contender.&lt;/p&gt;
&lt;p&gt;Then we proved that our first explanation for that contender was incomplete.&lt;/p&gt;
&lt;p&gt;And instead of forcing the machine into the answer we wanted, we stopped.&lt;/p&gt;
&lt;p&gt;That is what development looks like sometimes.&lt;/p&gt;
&lt;p&gt;The project also became public in a new way today.&lt;/p&gt;
&lt;p&gt;It is now entered in the Hackaday Retrocomputing Contest.&lt;/p&gt;
&lt;p&gt;There are architecture diagrams on the page.&lt;/p&gt;
&lt;p&gt;There is an old First Light image showing that the thing really has put pixels on a screen.&lt;/p&gt;
&lt;p&gt;There is a plan for how outside testers will eventually get their hands on it.&lt;/p&gt;
&lt;p&gt;And behind all of that, there is still a stubborn controller sitting at &lt;code&gt;0x2025d8&lt;/code&gt; waiting for us to explain precisely why it has not been given its turn.&lt;/p&gt;
&lt;p&gt;That&apos;s tomorrow&apos;s problem.&lt;/p&gt;
&lt;p&gt;Tonight, the useful result is that the list of possible answers is a whole lot shorter than it was this morning.&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Workshop</category><category>MicroKernel</category><category>Scheduling</category><category>Debugging</category><category>Hackaday</category><category>A1 Alpha</category><author>Mike</author></item><item><title>Ceylon Development Log — September 18, 2026: Why an Operating System Needs a Game</title><link>https://ceylonprojectng.com/journal/ceylon-development-log-september-18-2026-why-an-operating-system-needs-a-game/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/ceylon-development-log-september-18-2026-why-an-operating-system-needs-a-game/</guid><description>Today Ceylon&apos;s first native game stopped being a side idea and became something much more useful: a plan for a real application that can entertain people, stress the operating system, test recovery, and teach us how third-party software should be built on the platform.</description><pubDate>Fri, 18 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Today Ceylon&apos;s first native game stopped being a side idea and became something much more useful: a plan for a real application that can entertain people, stress the operating system, test recovery, and teach us how third-party software should be built on the platform.&lt;/p&gt;
&lt;h2 id=&quot;project-ceylon-nightly-why-an-operating-system-needs-a-game&quot;&gt;Project Ceylon Nightly: Why an Operating System Needs a Game&lt;/h2&gt;
&lt;p&gt;There is an easy way to demonstrate an operating system.&lt;/p&gt;
&lt;p&gt;Draw a window.&lt;/p&gt;
&lt;p&gt;Put some text in it.&lt;/p&gt;
&lt;p&gt;Move a mouse cursor.&lt;/p&gt;
&lt;p&gt;Play a sound.&lt;/p&gt;
&lt;p&gt;Save a file.&lt;/p&gt;
&lt;p&gt;Those are all important milestones, and Ceylon needs them.&lt;/p&gt;
&lt;p&gt;But eventually a collection of technical demonstrations stops answering the harder question:&lt;/p&gt;
&lt;p&gt;Can this machine actually run something interesting?&lt;/p&gt;
&lt;p&gt;That is why I have been spending time on a native game for A1.&lt;/p&gt;
&lt;p&gt;Not a port.&lt;/p&gt;
&lt;p&gt;Not a browser game.&lt;/p&gt;
&lt;p&gt;Not an SDL demo quietly carrying another operating system&apos;s assumptions underneath it.&lt;/p&gt;
&lt;p&gt;A real Ceylon application.&lt;/p&gt;
&lt;h2 id=&quot;why-a-game-is-a-useful-systems-test&quot;&gt;Why a game is a useful systems test&lt;/h2&gt;
&lt;p&gt;Games are brutal in useful ways.&lt;/p&gt;
&lt;p&gt;People notice input lag immediately.&lt;/p&gt;
&lt;p&gt;They notice timing glitches.&lt;/p&gt;
&lt;p&gt;They notice dropped frames.&lt;/p&gt;
&lt;p&gt;They notice audio hiccups.&lt;/p&gt;
&lt;p&gt;They notice when controls feel wrong.&lt;/p&gt;
&lt;p&gt;They notice when a pause in storage, logging or background work interrupts the foreground experience.&lt;/p&gt;
&lt;p&gt;A benchmark can tell me that Ceylon completed a million operations.&lt;/p&gt;
&lt;p&gt;A game can tell me whether graphics, input, audio, timing, memory, storage, scheduling and application lifecycle can all cooperate while somebody is actively using the machine.&lt;/p&gt;
&lt;p&gt;That is much more interesting.&lt;/p&gt;
&lt;p&gt;The goal is not to write a fake game whose only purpose is to tick API boxes.&lt;/p&gt;
&lt;p&gt;If we do this, I want the game to actually be worth playing.&lt;/p&gt;
&lt;p&gt;That matters because an entertaining game creates design pressure that a technical demo does not.&lt;/p&gt;
&lt;p&gt;Controls have to feel good.&lt;/p&gt;
&lt;p&gt;The world has to make sense.&lt;/p&gt;
&lt;p&gt;Difficulty has to be fair enough that people can learn.&lt;/p&gt;
&lt;p&gt;Sound has to communicate something.&lt;/p&gt;
&lt;p&gt;The graphics have to remain readable under pressure.&lt;/p&gt;
&lt;p&gt;Those are human-factors tests as much as software tests.&lt;/p&gt;
&lt;h2 id=&quot;the-research-started-with-sinistar-but-it-did-not-stop-there&quot;&gt;The research started with Sinistar, but it did not stop there&lt;/h2&gt;
&lt;p&gt;The historical starting point was Williams&apos; &lt;em&gt;Sinistar&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Not because I want to remake &lt;em&gt;Sinistar&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I do not.&lt;/p&gt;
&lt;p&gt;What fascinated me was how much that game managed to do on extremely small hardware.&lt;/p&gt;
&lt;p&gt;The world did not simply wait for the player.&lt;/p&gt;
&lt;p&gt;Workers collected resources.&lt;/p&gt;
&lt;p&gt;Other enemies hunted you.&lt;/p&gt;
&lt;p&gt;The larger threat was being assembled while you were busy elsewhere.&lt;/p&gt;
&lt;p&gt;The player was constantly deciding between the problem directly in front of the ship and the bigger problem developing somewhere else.&lt;/p&gt;
&lt;p&gt;And under all of that, the programmers built a tiny multitasking-style executive to coordinate the game&apos;s independent behaviors.&lt;/p&gt;
&lt;p&gt;That is the part I care about.&lt;/p&gt;
&lt;p&gt;They were not building a miniature operating system because that sounded clever.&lt;/p&gt;
&lt;p&gt;They were solving a game-design problem: how do you make many things appear alive at once when the machine cannot afford heavyweight machinery for every object?&lt;/p&gt;
&lt;p&gt;That is a remarkably relevant question for Ceylon.&lt;/p&gt;
&lt;h2 id=&quot;looking-beyond-one-game&quot;&gt;Looking beyond one game&lt;/h2&gt;
&lt;p&gt;One of today&apos;s research goals was deliberately broadening the survey so the new game does not become &amp;quot;&lt;em&gt;Sinistar&lt;/em&gt; with different artwork.&amp;quot;&lt;/p&gt;
&lt;p&gt;I have been looking at preserved source and development material from a number of early games and asking what each one did unusually well.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Defender&lt;/em&gt; made a world larger than the viewport and compressed that world into a useful radar display.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Robotron&lt;/em&gt; produced overwhelming actor density while keeping the player&apos;s controls extremely crisp.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Joust&lt;/em&gt; got enormous depth from a tiny control vocabulary and a good movement model.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Tempest&lt;/em&gt; treated demo and self-test behavior as part of the machine rather than as an afterthought.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Missile Command&lt;/em&gt; used hard object limits and irreversible world damage to turn constrained resources into game rules.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Centipede&lt;/em&gt; let enemies modify the environment instead of merely moving through it.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Battlezone&lt;/em&gt; created convincing spatial scale from minimal geometry and instrumentation.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Elite&lt;/em&gt; generated an enormous perceived universe from compact deterministic data.&lt;/p&gt;
&lt;p&gt;The point of this research is not to copy old routines.&lt;/p&gt;
&lt;p&gt;It is to identify ideas that survived their original hardware.&lt;/p&gt;
&lt;p&gt;What made a game readable?&lt;/p&gt;
&lt;p&gt;What made it feel larger than memory?&lt;/p&gt;
&lt;p&gt;What let many autonomous actors appear active?&lt;/p&gt;
&lt;p&gt;Which limitations produced elegant design?&lt;/p&gt;
&lt;p&gt;Which limitations should be discarded because modern hardware no longer requires them?&lt;/p&gt;
&lt;p&gt;That is the research question.&lt;/p&gt;
&lt;h2 id=&quot;old-source-code-is-a-textbook-not-a-parts-bin&quot;&gt;Old source code is a textbook, not a parts bin&lt;/h2&gt;
&lt;p&gt;I have said this before about the Amiga and Video Toaster work, and the same rule applies here.&lt;/p&gt;
&lt;p&gt;Historical source is useful because it exposes decisions.&lt;/p&gt;
&lt;p&gt;It shows what people were trying to accomplish when memory, CPU time and storage were painfully finite.&lt;/p&gt;
&lt;p&gt;But source being visible does not mean we should translate it into Ceylon.&lt;/p&gt;
&lt;p&gt;The new game needs original code, original art, original audio, original fiction and its own behavior.&lt;/p&gt;
&lt;p&gt;The historical material belongs on the research side.&lt;/p&gt;
&lt;p&gt;The implementation side should receive independent requirements and design lessons.&lt;/p&gt;
&lt;p&gt;That gives us something more valuable than a clone.&lt;/p&gt;
&lt;p&gt;It forces us to answer the same kinds of engineering questions ourselves.&lt;/p&gt;
&lt;h2 id=&quot;the-game-is-starting-to-take-shape&quot;&gt;The game is starting to take shape&lt;/h2&gt;
&lt;p&gt;The current idea is a large-feeling field where the player and autonomous machines compete for the same resource.&lt;/p&gt;
&lt;p&gt;The machines are not simply enemies waiting to be shot.&lt;/p&gt;
&lt;p&gt;They are trying to accomplish something.&lt;/p&gt;
&lt;p&gt;They collect.&lt;/p&gt;
&lt;p&gt;They transport.&lt;/p&gt;
&lt;p&gt;They build.&lt;/p&gt;
&lt;p&gt;Other actors defend that process.&lt;/p&gt;
&lt;p&gt;If the player ignores it long enough, the world changes.&lt;/p&gt;
&lt;p&gt;That gives us a natural game loop:&lt;/p&gt;
&lt;p&gt;explore;&lt;br&gt;
collect;&lt;br&gt;
intercept;&lt;br&gt;
prepare;&lt;br&gt;
disrupt;&lt;br&gt;
survive;&lt;br&gt;
and eventually deal with the thing the autonomous system has been building.&lt;/p&gt;
&lt;p&gt;The large threat should not be a recognizable copy of &lt;em&gt;Sinistar&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I am much more interested in something geometric, mechanical or energetic—a system event rather than a giant face with a health bar.&lt;/p&gt;
&lt;h2 id=&quot;why-this-structure-is-useful-to-ceylon&quot;&gt;Why this structure is useful to Ceylon&lt;/h2&gt;
&lt;p&gt;The nice thing about that design is that the gameplay itself generates a useful operating-system workload.&lt;/p&gt;
&lt;p&gt;Autonomous actors need scheduling.&lt;/p&gt;
&lt;p&gt;Resources need state.&lt;/p&gt;
&lt;p&gt;Projectiles and effects need bounded pools.&lt;/p&gt;
&lt;p&gt;The player needs responsive keyboard, mouse and gamepad input.&lt;/p&gt;
&lt;p&gt;The scanner needs a second view of the same world state.&lt;/p&gt;
&lt;p&gt;Audio can warn about activity that is not currently visible.&lt;/p&gt;
&lt;p&gt;Storage can preserve settings, scores and replays.&lt;/p&gt;
&lt;p&gt;Structured logging can record faults and unusual conditions.&lt;/p&gt;
&lt;p&gt;A developer overlay can expose real frame times, pool usage, task counts and audio problems.&lt;/p&gt;
&lt;p&gt;None of that has to be bolted on merely to make a benchmark.&lt;/p&gt;
&lt;p&gt;The game naturally needs it.&lt;/p&gt;
&lt;h2 id=&quot;a-hidden-player-that-never-gets-tired&quot;&gt;A hidden player that never gets tired&lt;/h2&gt;
&lt;p&gt;One of the stranger ideas may also become one of the most useful.&lt;/p&gt;
&lt;p&gt;The game should have a hidden CPU-controlled player that uses the same logical controls a human uses.&lt;/p&gt;
&lt;p&gt;No cheating.&lt;/p&gt;
&lt;p&gt;No directly changing the world.&lt;/p&gt;
&lt;p&gt;The bot generates movement and action commands exactly like a keyboard, mouse or joystick adapter would.&lt;/p&gt;
&lt;p&gt;That means Ceylon could run the game by itself for hours.&lt;/p&gt;
&lt;p&gt;It can win.&lt;/p&gt;
&lt;p&gt;It can lose.&lt;/p&gt;
&lt;p&gt;It can recover.&lt;/p&gt;
&lt;p&gt;It can create crowded situations.&lt;/p&gt;
&lt;p&gt;It can stress object pools.&lt;/p&gt;
&lt;p&gt;It can exercise audio, rendering, storage and telemetry repeatedly.&lt;/p&gt;
&lt;p&gt;Then it can stop cleanly and leave behind a report.&lt;/p&gt;
&lt;p&gt;That turns the game into a soak-test harness without turning the public experience into a benchmark utility.&lt;/p&gt;
&lt;p&gt;A visible version could even double as an old-fashioned arcade attract mode.&lt;/p&gt;
&lt;h2 id=&quot;replay-as-a-flight-recorder&quot;&gt;Replay as a flight recorder&lt;/h2&gt;
&lt;p&gt;The same design points toward deterministic replay.&lt;/p&gt;
&lt;p&gt;If the world starts from a known seed and consumes a known input stream, then many failures can be reproduced rather than described vaguely.&lt;/p&gt;
&lt;p&gt;A useful replay can contain:&lt;/p&gt;
&lt;p&gt;world seed;&lt;br&gt;
input changes;&lt;br&gt;
important events;&lt;br&gt;
periodic state hashes;&lt;br&gt;
performance checkpoints.&lt;/p&gt;
&lt;p&gt;If a bug only appears after 43 minutes under a particular load pattern, the goal is to replay the conditions that created it.&lt;/p&gt;
&lt;p&gt;For an operating-system alpha, that is extremely valuable.&lt;/p&gt;
&lt;h2 id=&quot;cpu-first-on-purpose&quot;&gt;CPU first, on purpose&lt;/h2&gt;
&lt;p&gt;The first game does not need a GPU.&lt;/p&gt;
&lt;p&gt;That is deliberate.&lt;/p&gt;
&lt;p&gt;A1 should be able to demonstrate itself with software rendering through Ceylon&apos;s native display path.&lt;/p&gt;
&lt;p&gt;Later systems can add acceleration.&lt;/p&gt;
&lt;p&gt;But the first application should prove that the underlying machine is useful before future graphics hardware becomes a requirement.&lt;/p&gt;
&lt;p&gt;This also creates a stable reference path.&lt;/p&gt;
&lt;p&gt;If a later accelerated renderer behaves differently, we have a known software implementation to compare it against.&lt;/p&gt;
&lt;h2 id=&quot;the-research-is-also-changing-how-i-think-about-development-tools&quot;&gt;The research is also changing how I think about development tools&lt;/h2&gt;
&lt;p&gt;Another idea emerged from the game research today.&lt;/p&gt;
&lt;p&gt;If we eventually build more than one kind of game for Ceylon, we should probably not build one giant universal game engine.&lt;/p&gt;
&lt;p&gt;A scrolling arcade game, a sector-based first-person game, a polygonal 3D game and a flight simulator need very different world models.&lt;/p&gt;
&lt;p&gt;What they do share are things like:&lt;/p&gt;
&lt;p&gt;graphics access;&lt;br&gt;
input;&lt;br&gt;
audio;&lt;br&gt;
timing;&lt;br&gt;
storage;&lt;br&gt;
logging;&lt;br&gt;
asset handling;&lt;br&gt;
packaging;&lt;br&gt;
telemetry.&lt;/p&gt;
&lt;p&gt;That suggests a reusable framework underneath multiple engines.&lt;/p&gt;
&lt;p&gt;The first game does not need to wait for that framework.&lt;/p&gt;
&lt;p&gt;In fact, it is probably better if it does not.&lt;/p&gt;
&lt;p&gt;We can build the game first, discover which pieces are genuinely reusable, and then extract those pieces after they have survived real use.&lt;/p&gt;
&lt;p&gt;That is safer than designing a giant abstraction around games we have not written yet.&lt;/p&gt;
&lt;h2 id=&quot;assets-may-become-their-own-platform&quot;&gt;Assets may become their own platform&lt;/h2&gt;
&lt;p&gt;The same logic applies to game assets.&lt;/p&gt;
&lt;p&gt;Not every asset belongs in every engine.&lt;/p&gt;
&lt;p&gt;A 3D character model may become a full animated model in one engine and a prerendered sprite set in another.&lt;/p&gt;
&lt;p&gt;A sound effect may work everywhere.&lt;/p&gt;
&lt;p&gt;A collision mesh may only matter to certain engines.&lt;/p&gt;
&lt;p&gt;So the longer-term idea is an asset store that preserves a canonical source, tracks where it came from and how it is licensed, then lets engine-specific processors generate only the runtime representation a game actually needs.&lt;/p&gt;
&lt;p&gt;That could eventually let first-party and independent engines share one asset ecosystem without requiring them to share one runtime architecture.&lt;/p&gt;
&lt;p&gt;It is a larger idea than today&apos;s game, but today&apos;s game gives us somewhere concrete to start.&lt;/p&gt;
&lt;h2 id=&quot;why-this-may-matter-to-outside-developers&quot;&gt;Why this may matter to outside developers&lt;/h2&gt;
&lt;p&gt;Ceylon is eventually going to need software that I did not write.&lt;/p&gt;
&lt;p&gt;If an independent developer already has an engine, I do not want the platform to say:&lt;/p&gt;
&lt;p&gt;Throw it away and use ours.&lt;/p&gt;
&lt;p&gt;I want Ceylon to say:&lt;/p&gt;
&lt;p&gt;Bring your engine.&lt;/p&gt;
&lt;p&gt;Use our engine.&lt;/p&gt;
&lt;p&gt;Use part of our framework.&lt;/p&gt;
&lt;p&gt;Use our asset system.&lt;/p&gt;
&lt;p&gt;Or just use the native APIs and build your own tools.&lt;/p&gt;
&lt;p&gt;Keep ownership of your work.&lt;/p&gt;
&lt;p&gt;The platform should make development easier without demanding control of the developer&apos;s engine.&lt;/p&gt;
&lt;p&gt;That is a much better way to earn serious developer interest.&lt;/p&gt;
&lt;p&gt;Certification and compatibility logos may make sense someday.&lt;/p&gt;
&lt;p&gt;That is later.&lt;/p&gt;
&lt;p&gt;First we need to make the machine worth developing for.&lt;/p&gt;
&lt;h2 id=&quot;where-this-leaves-a1&quot;&gt;Where this leaves A1&lt;/h2&gt;
&lt;p&gt;The immediate target remains practical.&lt;/p&gt;
&lt;p&gt;Build a standalone native game.&lt;/p&gt;
&lt;p&gt;Keep the architecture clean enough that reusable pieces can be extracted later.&lt;/p&gt;
&lt;p&gt;Use the game to pressure-test the APIs.&lt;/p&gt;
&lt;p&gt;Add deterministic replay and zero-player testing.&lt;/p&gt;
&lt;p&gt;Make it fun.&lt;/p&gt;
&lt;p&gt;Make it measurable.&lt;/p&gt;
&lt;p&gt;Make it shut down cleanly.&lt;/p&gt;
&lt;p&gt;And learn everything we can about what building a real native Ceylon application actually requires.&lt;/p&gt;
&lt;p&gt;If the game succeeds, the most important result may not be the game itself.&lt;/p&gt;
&lt;p&gt;It may be everything Ceylon learns while building it.&lt;/p&gt;
&lt;p&gt;— Mike&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Workshop</category><category>Games</category><category>Developer Platform</category><category>Research</category><category>A1 Alpha</category><author>Mike</author></item><item><title>Ceylon Development Log — September 17, 2026: When a Crash Needs to Leave Evidence</title><link>https://ceylonprojectng.com/journal/ceylon-development-log-september-17-2026-when-a-crash-needs-to-leave-evidence/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/ceylon-development-log-september-17-2026-when-a-crash-needs-to-leave-evidence/</guid><description>A real fault exposed an important distinction today: Ceylon can detect and contain a crashed component, but that is not enough. If the machine is going to recover from failures, it also needs to remember exactly what happened.</description><pubDate>Thu, 17 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A real fault exposed an important distinction today: Ceylon can detect and contain a crashed component, but that is not enough. If the machine is going to recover from failures, it also needs to remember exactly what happened.&lt;/p&gt;
&lt;h2 id=&quot;project-ceylon-nightly-when-a-crash-needs-to-leave-evidence&quot;&gt;Project Ceylon Nightly: When a Crash Needs to Leave Evidence&lt;/h2&gt;
&lt;p&gt;Today started with something that, on the surface, looked encouraging.&lt;/p&gt;
&lt;p&gt;One of Ceylon&apos;s isolated execution components hit a real illegal-instruction fault.&lt;/p&gt;
&lt;p&gt;The system detected it.&lt;/p&gt;
&lt;p&gt;The fault stayed contained.&lt;/p&gt;
&lt;p&gt;The rest of the machine did not fall over with it.&lt;/p&gt;
&lt;p&gt;That is exactly the kind of behavior a componentized operating system is supposed to provide.&lt;/p&gt;
&lt;p&gt;But the fault also exposed a hole.&lt;/p&gt;
&lt;p&gt;Ceylon knew what had happened well enough to print useful information to the debug serial console, yet the same information never entered the structured logging path we have been building for the operating system.&lt;/p&gt;
&lt;p&gt;In other words, the architecture worked well enough to catch the failure, but the evidence stopped at the equivalent of somebody yelling across the workshop.&lt;/p&gt;
&lt;p&gt;That is not good enough for the system Ceylon is intended to become.&lt;/p&gt;
&lt;h2 id=&quot;the-difference-between-a-debug-message-and-an-incident-record&quot;&gt;The difference between a debug message and an incident record&lt;/h2&gt;
&lt;p&gt;Serial output is incredibly useful while an operating system is under construction.&lt;/p&gt;
&lt;p&gt;It is simple.&lt;/p&gt;
&lt;p&gt;It is immediate.&lt;/p&gt;
&lt;p&gt;When something goes wrong at a very low level, there is a good chance the serial console is still alive.&lt;/p&gt;
&lt;p&gt;I do not want to get rid of it.&lt;/p&gt;
&lt;p&gt;But serial output is not a durable incident history.&lt;/p&gt;
&lt;p&gt;If a component faults, gets reclaimed, and is restarted, I eventually want to be able to answer questions such as:&lt;/p&gt;
&lt;p&gt;What fault happened?&lt;/p&gt;
&lt;p&gt;Which exact component instance failed?&lt;/p&gt;
&lt;p&gt;Which build was running?&lt;/p&gt;
&lt;p&gt;What instruction or address was involved?&lt;/p&gt;
&lt;p&gt;What did the supervisor decide to do?&lt;/p&gt;
&lt;p&gt;Was the component reclaimed?&lt;/p&gt;
&lt;p&gt;Was it restarted?&lt;/p&gt;
&lt;p&gt;Did the restart succeed?&lt;/p&gt;
&lt;p&gt;Did any diagnostic information get dropped along the way?&lt;/p&gt;
&lt;p&gt;A line of text on a debug console cannot answer those questions reliably after the fact.&lt;/p&gt;
&lt;p&gt;A structured incident record can.&lt;/p&gt;
&lt;h2 id=&quot;the-good-news-the-logging-architecture-is-not-broken&quot;&gt;The good news: the logging architecture is not broken&lt;/h2&gt;
&lt;p&gt;The useful discovery today is that we do not need to throw away Ceylon&apos;s logging system and start over.&lt;/p&gt;
&lt;p&gt;The existing design already has most of the right ingredients.&lt;/p&gt;
&lt;p&gt;Ceylon has bounded shared-memory error transport.&lt;/p&gt;
&lt;p&gt;It has explicit drop accounting.&lt;/p&gt;
&lt;p&gt;It has a collector boundary separate from the producer.&lt;/p&gt;
&lt;p&gt;It has a path for structured records to reach durable storage.&lt;/p&gt;
&lt;p&gt;That part is important because I do not want a faulting or supervising component trying to perform filesystem I/O while it is dealing with a failure.&lt;/p&gt;
&lt;p&gt;The intended path remains:&lt;/p&gt;
&lt;p&gt;component or supervisor&lt;br&gt;
→ bounded shared-memory record&lt;br&gt;
→ collector&lt;br&gt;
→ durable local log&lt;br&gt;
→ management/query tools&lt;/p&gt;
&lt;p&gt;The problem is much narrower.&lt;/p&gt;
&lt;p&gt;The execution-manager fault path never enters it.&lt;/p&gt;
&lt;p&gt;Right now that path effectively looks like:&lt;/p&gt;
&lt;p&gt;fault&lt;br&gt;
→ supervisor&lt;br&gt;
→ debug serial&lt;/p&gt;
&lt;p&gt;What it needs to become is:&lt;/p&gt;
&lt;p&gt;fault&lt;br&gt;
→ supervisor&lt;br&gt;
→ structured fault event&lt;br&gt;
→ bounded error mailbox&lt;br&gt;
→ collector&lt;br&gt;
→ durable incident record&lt;/p&gt;
&lt;p&gt;Serial can remain as a secondary human-readable path.&lt;/p&gt;
&lt;p&gt;It simply cannot be the only record.&lt;/p&gt;
&lt;h2 id=&quot;one-fault-should-become-one-coherent-story&quot;&gt;One fault should become one coherent story&lt;/h2&gt;
&lt;p&gt;Once I started looking at this, it became obvious that simply logging &amp;quot;component crashed&amp;quot; is not enough either.&lt;/p&gt;
&lt;p&gt;Ceylon is being designed around restartable, generation-safe resources.&lt;/p&gt;
&lt;p&gt;That means one execution slot may host one component instance, be reclaimed, and later be reused for another instance.&lt;/p&gt;
&lt;p&gt;So a useful fault report needs to identify more than a slot number.&lt;/p&gt;
&lt;p&gt;It needs to identify the exact generation of the thing that failed.&lt;/p&gt;
&lt;p&gt;It also needs a correlation identifier so we can connect the complete lifecycle:&lt;/p&gt;
&lt;p&gt;FAULT OBSERVED&lt;br&gt;
↓&lt;br&gt;
CONTAINMENT&lt;br&gt;
↓&lt;br&gt;
RECLAIM&lt;br&gt;
↓&lt;br&gt;
RESTART ATTEMPT&lt;br&gt;
↓&lt;br&gt;
NEW GENERATION&lt;br&gt;
↓&lt;br&gt;
RECOVERY SUCCEEDED / FAILED / QUARANTINED&lt;/p&gt;
&lt;p&gt;That turns a collection of unrelated log lines into an incident.&lt;/p&gt;
&lt;p&gt;If Ceylon is going to recover automatically from failures someday, that distinction is critical.&lt;/p&gt;
&lt;p&gt;The most dangerous kind of &amp;quot;reliable&amp;quot; system would be one that silently restarts things while losing the evidence explaining why they were restarted.&lt;/p&gt;
&lt;h2 id=&quot;no-silent-telemetry-loss&quot;&gt;No silent telemetry loss&lt;/h2&gt;
&lt;p&gt;There is another rule that came out of today&apos;s work.&lt;/p&gt;
&lt;p&gt;If the fault-reporting path itself is full or unavailable, that failure has to be visible too.&lt;/p&gt;
&lt;p&gt;The system should never be allowed to claim that everything was recorded merely because nobody noticed the log buffer overflowing.&lt;/p&gt;
&lt;p&gt;So the design now treats loss as part of the telemetry model.&lt;/p&gt;
&lt;p&gt;If the error mailbox fills, count it.&lt;/p&gt;
&lt;p&gt;If the collector is unavailable, expose it.&lt;/p&gt;
&lt;p&gt;If storage cannot accept records, make that visible.&lt;/p&gt;
&lt;p&gt;If a record is malformed, record the rejection.&lt;/p&gt;
&lt;p&gt;The goal is not to pretend diagnostic infrastructure can never fail.&lt;/p&gt;
&lt;p&gt;The goal is to make sure failure of the diagnostic infrastructure does not disappear silently.&lt;/p&gt;
&lt;p&gt;That is a very Ceylon kind of rule: bounded resources are fine. Unexplained behavior is not.&lt;/p&gt;
&lt;h2 id=&quot;research-before-freezing-the-next-interfaces&quot;&gt;Research before freezing the next interfaces&lt;/h2&gt;
&lt;p&gt;A significant part of today&apos;s work was research rather than implementation.&lt;/p&gt;
&lt;p&gt;That is becoming normal as Ceylon grows.&lt;/p&gt;
&lt;p&gt;I spent time comparing how mature systems separate fault capture from durable logging, how they preserve component identity across restart, and how diagnostic data can remain useful without turning the fault path into another source of failure.&lt;/p&gt;
&lt;p&gt;The same research habit is also being applied to graphics, application integration, compatibility, and device architecture.&lt;/p&gt;
&lt;p&gt;On the graphics side, one important working assumption is deliberately pessimistic: we should design Ceylon so it remains useful even if hardware vendors never write native drivers for us.&lt;/p&gt;
&lt;p&gt;That pushes us toward a native Ceylon presentation architecture that can learn from open drivers, Mesa, firmware interfaces, virtual devices, and other operating systems without making Ceylon dependent on their architecture.&lt;/p&gt;
&lt;p&gt;The same pattern applies elsewhere.&lt;/p&gt;
&lt;p&gt;Study what already exists.&lt;/p&gt;
&lt;p&gt;Understand why it works.&lt;/p&gt;
&lt;p&gt;Keep the durable lessons.&lt;/p&gt;
&lt;p&gt;Reject assumptions that do not fit Ceylon.&lt;/p&gt;
&lt;p&gt;I would rather spend a day understanding why a mature design works than spend a month rediscovering the same failure mode in our own code.&lt;/p&gt;
&lt;h2 id=&quot;the-machine-should-be-able-to-explain-itself&quot;&gt;The machine should be able to explain itself&lt;/h2&gt;
&lt;p&gt;This has become one of the themes I like most about Ceylon.&lt;/p&gt;
&lt;p&gt;I do not just want the system to attempt recovery.&lt;/p&gt;
&lt;p&gt;I want it to be able to explain what it did.&lt;/p&gt;
&lt;p&gt;That applies to memory ownership.&lt;/p&gt;
&lt;p&gt;It applies to device authority.&lt;/p&gt;
&lt;p&gt;It applies to application execution.&lt;/p&gt;
&lt;p&gt;And now it applies to faults.&lt;/p&gt;
&lt;p&gt;The eventual management tools should be able to reconstruct something like:&lt;/p&gt;
&lt;p&gt;At 14:22:31.482, application worker generation 17 faulted with an illegal instruction.&lt;/p&gt;
&lt;p&gt;The supervisor contained the fault.&lt;/p&gt;
&lt;p&gt;The worker was reclaimed.&lt;/p&gt;
&lt;p&gt;No fault telemetry was dropped.&lt;/p&gt;
&lt;p&gt;A new generation was created.&lt;/p&gt;
&lt;p&gt;The application resumed.&lt;/p&gt;
&lt;p&gt;That is much more useful than:&lt;/p&gt;
&lt;p&gt;&amp;quot;Something crashed earlier, but it seems fine now.&amp;quot;&lt;/p&gt;
&lt;h2 id=&quot;this-is-also-part-of-making-ceylon-supportable&quot;&gt;This is also part of making Ceylon supportable&lt;/h2&gt;
&lt;p&gt;The public-facing side of the project is becoming more important as A1 gets closer.&lt;/p&gt;
&lt;p&gt;An operating system that only its author can diagnose is not much of a platform.&lt;/p&gt;
&lt;p&gt;Eventually somebody should be able to send a bounded support record or diagnostic bundle that identifies:&lt;/p&gt;
&lt;p&gt;the Ceylon build;&lt;br&gt;
the boot/session;&lt;br&gt;
the component;&lt;br&gt;
the fault;&lt;br&gt;
the recovery sequence;&lt;br&gt;
and whether the telemetry itself remained healthy.&lt;/p&gt;
&lt;p&gt;That does not require a mandatory cloud service.&lt;/p&gt;
&lt;p&gt;The architecture remains local-first.&lt;/p&gt;
&lt;p&gt;But local-first does not mean opaque.&lt;/p&gt;
&lt;p&gt;It means the machine should keep useful evidence under the user&apos;s control.&lt;/p&gt;
&lt;h2 id=&quot;where-this-leaves-the-work&quot;&gt;Where this leaves the work&lt;/h2&gt;
&lt;p&gt;Today&apos;s conclusion was reassuring.&lt;/p&gt;
&lt;p&gt;The structured logging architecture is viable.&lt;/p&gt;
&lt;p&gt;The fault-containment architecture is viable.&lt;/p&gt;
&lt;p&gt;The missing piece is that one important supervisor path bypasses the structured system.&lt;/p&gt;
&lt;p&gt;So the next work is targeted rather than revolutionary:&lt;/p&gt;
&lt;p&gt;publish supervisor-observed faults into the existing bounded mailbox;&lt;br&gt;
preserve exact identity and generation;&lt;br&gt;
correlate the recovery sequence;&lt;br&gt;
prove that healthy qualification runs lose no fault records;&lt;br&gt;
and make the degraded cases visible when the logging path itself is under stress.&lt;/p&gt;
&lt;p&gt;The larger lesson from the research side is equally important.&lt;/p&gt;
&lt;p&gt;Ceylon is reaching the stage where every major subsystem should be designed with enough historical and modern context that we understand the tradeoffs before we freeze the interface.&lt;/p&gt;
&lt;p&gt;That may look slower on a daily changelog.&lt;/p&gt;
&lt;p&gt;It should make the project much faster over the long run.&lt;/p&gt;
&lt;p&gt;— Mike&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Workshop</category><category>Logging</category><category>Fault Recovery</category><category>Systems Engineering</category><category>Research</category><author>Mike</author></item><item><title>Ceylon Development Log — September 16, 2026: Static Foundations, Dynamic Systems</title><link>https://ceylonprojectng.com/journal/ceylon-development-log-september-16-2026-static-foundations-dynamic-systems/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/ceylon-development-log-september-16-2026-static-foundations-dynamic-systems/</guid><description>Ceylon is learning how to become dynamic without abandoning a static, bounded and predictable foundation: leased execution workers, mirrored VSpace cohorts, bounded page capabilities, and a capability-pool question still open.</description><pubDate>Wed, 16 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ceylon is learning how to become dynamic without abandoning a static, bounded and predictable foundation: leased execution workers, mirrored VSpace cohorts, bounded page capabilities, and a capability-pool question still open.&lt;/p&gt;
&lt;h2 id=&quot;project-ceylon-nightly-static-foundations-dynamic-systems&quot;&gt;Project Ceylon Nightly: Static Foundations, Dynamic Systems&lt;/h2&gt;
&lt;p&gt;Today was one of those days where the most important progress was not a new screen, a new driver, or another user-facing feature.&lt;/p&gt;
&lt;p&gt;It was figuring out what the machine underneath all of those things needs to become.&lt;/p&gt;
&lt;p&gt;Over the last several development cycles, Ceylon has been moving onto an updated microkernel foundation and a newer generation of its surrounding system-construction tooling. That upgrade brought substantial capabilities with it, but it also invalidated a few assumptions that had quietly worked their way into the earlier architecture.&lt;/p&gt;
&lt;p&gt;That forced us to stop and answer a more fundamental question:&lt;/p&gt;
&lt;p&gt;How dynamic can Ceylon become while preserving a system that is deliberately static, bounded, isolated and predictable at its foundation?&lt;/p&gt;
&lt;p&gt;The answer is turning out to be: surprisingly dynamic.&lt;/p&gt;
&lt;h2 id=&quot;the-execution-problem&quot;&gt;The execution problem&lt;/h2&gt;
&lt;p&gt;One of the first challenges was application execution.&lt;/p&gt;
&lt;p&gt;Traditional operating systems tend to build processes and threads dynamically. Ceylon&apos;s underlying platform is intentionally different. Much of the system is constructed ahead of time, with explicit resources, explicit authority and tightly controlled relationships between components.&lt;/p&gt;
&lt;p&gt;Initially, that looked like it might become an obstacle.&lt;/p&gt;
&lt;p&gt;Instead of fighting that design, we tried a different approach.&lt;/p&gt;
&lt;p&gt;We built a bounded pool of isolated execution workers ahead of time, then allowed Ceylon to lease those workers dynamically.&lt;/p&gt;
&lt;p&gt;The underlying execution resources remain static.&lt;/p&gt;
&lt;p&gt;Their use becomes dynamic.&lt;/p&gt;
&lt;p&gt;That means an execution worker can move through a lifecycle resembling:&lt;/p&gt;
&lt;p&gt;FREE
↓
LEASED
↓
ACTIVE
↓
QUIESCING
↓
RESETTING
↓
FREE&lt;/p&gt;
&lt;p&gt;Each lease carries generation information so stale references can be rejected rather than accidentally referring to a newly reused resource.&lt;/p&gt;
&lt;p&gt;More importantly, multiple isolated workers can participate in one logical application environment while retaining separate protection domains.&lt;/p&gt;
&lt;p&gt;That has some useful security properties of its own: sharing memory does not automatically mean sharing authority.&lt;/p&gt;
&lt;h2 id=&quot;making-isolated-workers-feel-like-one-address-space&quot;&gt;Making isolated workers feel like one address space&lt;/h2&gt;
&lt;p&gt;That led directly to the next problem.&lt;/p&gt;
&lt;p&gt;If two workers are supposed to behave somewhat like threads in one application, they need to agree about memory.&lt;/p&gt;
&lt;p&gt;We proved that two—and later four—isolated workers can map the same backing memory at the same virtual address and successfully exchange actual pointers.&lt;/p&gt;
&lt;p&gt;Not offsets.&lt;/p&gt;
&lt;p&gt;Not handles pretending to be pointers.&lt;/p&gt;
&lt;p&gt;The same numeric address.&lt;/p&gt;
&lt;p&gt;One worker can create an object in shared memory, publish a pointer to it, and another worker can dereference that pointer directly.&lt;/p&gt;
&lt;p&gt;That was an important result because it suggested that Ceylon could build a logical shared application address space across independently isolated execution contexts.&lt;/p&gt;
&lt;p&gt;There are caveats.&lt;/p&gt;
&lt;p&gt;Ordinary writable program globals remain private to each worker unless we deliberately place them into shared backing memory. Private stacks and thread-local state also need to remain private.&lt;/p&gt;
&lt;p&gt;But that is an architectural problem we can define clearly rather than an indication that the model is impossible.&lt;/p&gt;
&lt;h2 id=&quot;the-virtual-memory-problem&quot;&gt;The virtual-memory problem&lt;/h2&gt;
&lt;p&gt;The next step was harder.&lt;/p&gt;
&lt;p&gt;Static shared mappings are useful, but a modern workstation eventually needs runtime memory behavior:&lt;/p&gt;
&lt;p&gt;mapping and unmapping memory;
shared heaps;
guard pages;
permission changes;
executable-code transitions;
sparse reservations;
deterministic cleanup;
controlled reuse.&lt;/p&gt;
&lt;p&gt;At first, the upgraded platform appeared not to expose enough authority for that.&lt;/p&gt;
&lt;p&gt;The obvious response would have been to start modifying the microkernel or turn Ceylon into something the underlying platform was never intended to be.&lt;/p&gt;
&lt;p&gt;We resisted that.&lt;/p&gt;
&lt;p&gt;Instead, we asked whether the capacity could remain static while the mappings themselves became dynamic.&lt;/p&gt;
&lt;p&gt;That produced one of today&apos;s most useful findings.&lt;/p&gt;
&lt;p&gt;We can preconstruct bounded virtual-memory arenas during system construction. A tiny reserved page placed at regular intervals causes the required paging hierarchy to exist before the operating system starts.&lt;/p&gt;
&lt;p&gt;Once those structures exist, runtime memory operations do not need the ability to dynamically manufacture page tables.&lt;/p&gt;
&lt;p&gt;They only need authority over the individual physical pages being mapped.&lt;/p&gt;
&lt;p&gt;That greatly simplified the problem.&lt;/p&gt;
&lt;p&gt;Instead of needing a general-purpose runtime memory-object allocator inside the kernel, the problem reduced to:&lt;/p&gt;
&lt;p&gt;Safely provide the memory manager with bounded authority over an explicitly approved pool of pages.&lt;/p&gt;
&lt;p&gt;That is a dramatically smaller requirement.&lt;/p&gt;
&lt;h2 id=&quot;a-tiny-platform-addition&quot;&gt;A tiny platform addition&lt;/h2&gt;
&lt;p&gt;We built an isolated validation extension to test exactly that.&lt;/p&gt;
&lt;p&gt;It does not modify the microkernel.&lt;/p&gt;
&lt;p&gt;It does not create new kernel behavior.&lt;/p&gt;
&lt;p&gt;It simply allows the system-construction layer to expose carefully selected page capabilities to the memory manager.&lt;/p&gt;
&lt;p&gt;The first target proof succeeded.&lt;/p&gt;
&lt;p&gt;The manager could take a page from a bounded provider pool and map it at runtime into a worker&apos;s preconstructed virtual-memory arena.&lt;/p&gt;
&lt;p&gt;The same physical page could also be mapped into multiple isolated workers at the same address.&lt;/p&gt;
&lt;p&gt;We verified four independent address spaces sharing the same backing page while preserving pointer transparency.&lt;/p&gt;
&lt;p&gt;We also confirmed that mappings outside the preconstructed arena fail as expected.&lt;/p&gt;
&lt;p&gt;That distinction matters.&lt;/p&gt;
&lt;p&gt;The system is not secretly turning itself into an unlimited dynamic virtual-memory manager.&lt;/p&gt;
&lt;p&gt;It remains bounded.&lt;/p&gt;
&lt;h2 id=&quot;stressing-it&quot;&gt;Stressing it&lt;/h2&gt;
&lt;p&gt;Once the mechanism worked, the next job was trying to break it.&lt;/p&gt;
&lt;p&gt;The current stress campaign has reached a partial qualification result.&lt;/p&gt;
&lt;p&gt;Among the completed tests:&lt;/p&gt;
&lt;p&gt;four isolated workers sharing one physical page;
identical pointer use across those workers;
repeated map/unmap lifecycle testing;
virtual-address rotation;
physical-frame rotation;
10,000 target lifecycle cycles;
three repeatable hardware-accelerated virtualization runs;
more than 500,000 randomized model operations across several deterministic seeds;
zero resource drift in the executed scope.&lt;/p&gt;
&lt;p&gt;That is encouraging.&lt;/p&gt;
&lt;p&gt;It is not yet enough to call the entire virtual-memory system qualified.&lt;/p&gt;
&lt;p&gt;Several advanced cases remain open, including complete rights transitions, guard-page stress, sparse commit/decommit, cohort rollback, stale target mapping rejection and fault-time cleanup.&lt;/p&gt;
&lt;p&gt;Those should eventually be tested against the architecture we actually intend to ship rather than against a temporary proof configuration.&lt;/p&gt;
&lt;h2 id=&quot;the-next-bottleneck-capability-scale&quot;&gt;The next bottleneck: capability scale&lt;/h2&gt;
&lt;p&gt;The stress work also found the next important architectural issue.&lt;/p&gt;
&lt;p&gt;Each simultaneous mapping needs its own capability instance.&lt;/p&gt;
&lt;p&gt;For a small proof, those can simply be provisioned ahead of time.&lt;/p&gt;
&lt;p&gt;For a large application-memory pool, that becomes expensive.&lt;/p&gt;
&lt;p&gt;So the next question is no longer whether dynamic mapping works.&lt;/p&gt;
&lt;p&gt;It does.&lt;/p&gt;
&lt;p&gt;The next question is:&lt;/p&gt;
&lt;p&gt;How do we build a bounded capability pool that can efficiently create and recycle mapping authority without giving the memory manager broad system authority?&lt;/p&gt;
&lt;p&gt;The direction we are investigating is another example of the same principle that has been emerging throughout Ceylon:&lt;/p&gt;
&lt;p&gt;static capacity
dynamic use
explicit ownership
deterministic exhaustion&lt;/p&gt;
&lt;p&gt;The likely model is a dedicated capability pool owned by the memory manager.&lt;/p&gt;
&lt;p&gt;A small number of master page capabilities would exist within that pool. Individual mapping capabilities could then be copied into bounded slots when needed, used for a mapping, retired, deleted and recycled.&lt;/p&gt;
&lt;p&gt;No unrestricted kernel-object allocator.&lt;/p&gt;
&lt;p&gt;No unlimited memory growth.&lt;/p&gt;
&lt;p&gt;No requirement to share another process&apos;s complete capability space.&lt;/p&gt;
&lt;p&gt;Just a purpose-built pool with explicit limits.&lt;/p&gt;
&lt;h2 id=&quot;research-is-becoming-part-of-the-development-process&quot;&gt;Research is becoming part of the development process&lt;/h2&gt;
&lt;p&gt;A significant portion of today&apos;s work was research rather than implementation, and that is intentional.&lt;/p&gt;
&lt;p&gt;Ceylon has reached a point where blindly writing everything ourselves would be wasteful.&lt;/p&gt;
&lt;p&gt;We have been studying modern componentized operating-system designs, device-driver frameworks, real-time systems, memory-management approaches, multimedia architectures and older workstation designs to identify ideas that can accelerate development without compromising the architecture.&lt;/p&gt;
&lt;p&gt;Some of that research is already paying off.&lt;/p&gt;
&lt;p&gt;One modern driver framework we reviewed has several characteristics very close to decisions Ceylon has independently been moving toward:&lt;/p&gt;
&lt;p&gt;small isolated hardware drivers;
shared-memory data paths;
bounded single-producer/single-consumer queues;
asynchronous notifications rather than synchronous bulk IPC;
separate components for device sharing and address translation;
explicit handling of DMA-visible buffers.&lt;/p&gt;
&lt;p&gt;It also contains working implementations for several device classes directly relevant to our development path, including virtual block devices, virtual networking, high-performance storage, timers and serial hardware.&lt;/p&gt;
&lt;p&gt;That does not mean Ceylon is simply going to import another project&apos;s driver stack.&lt;/p&gt;
&lt;p&gt;It does mean we would be foolish not to study working implementations before reinventing every queue, reset path, interrupt sequence and DMA rule ourselves.&lt;/p&gt;
&lt;p&gt;We are therefore preparing a systematic driver-reuse audit.&lt;/p&gt;
&lt;p&gt;For each candidate component we will decide whether the right answer is:&lt;/p&gt;
&lt;p&gt;direct reuse
port
wrap
reuse the protocol
reuse the algorithm
reuse the tests
reference only
reject&lt;/p&gt;
&lt;p&gt;The highest-value targets initially are storage, networking, PCI, timers, serial devices and the shared-memory transport architecture surrounding them.&lt;/p&gt;
&lt;p&gt;The goal is not to make Ceylon dependent on someone else&apos;s operating system.&lt;/p&gt;
&lt;p&gt;The goal is to avoid spending six weeks rediscovering something another engineering team has already spent six months validating.&lt;/p&gt;
&lt;h2 id=&quot;research-does-not-mean-architectural-drift&quot;&gt;Research does not mean architectural drift&lt;/h2&gt;
&lt;p&gt;There is an important distinction here.&lt;/p&gt;
&lt;p&gt;Ceylon has accumulated a fairly strong architectural identity:&lt;/p&gt;
&lt;p&gt;capability-based authority;
bounded resources;
generation-safe reuse;
isolation by default;
small control messages;
shared and registered bulk-data paths;
predictable real-time behavior where required;
hardware-shaped interfaces that can move from virtualization to bare metal.&lt;/p&gt;
&lt;p&gt;Any external idea has to fit those rules.&lt;/p&gt;
&lt;p&gt;We are not changing the architecture every time we find an interesting project.&lt;/p&gt;
&lt;p&gt;We are using research to ask better questions before freezing our own interfaces.&lt;/p&gt;
&lt;p&gt;That is especially important now because several major pieces are beginning to intersect:&lt;/p&gt;
&lt;p&gt;execution workers
virtual memory
physical memory ownership
buffer sharing
DMA
device drivers
real-time scheduling
audio
graphics
storage
networking&lt;/p&gt;
&lt;p&gt;A bad decision in one layer can create unnecessary copies, authority leaks, reset problems or performance ceilings throughout the rest of the machine.&lt;/p&gt;
&lt;p&gt;This is the point where slowing down long enough to study good prior work can actually make development move faster.&lt;/p&gt;
&lt;h2 id=&quot;the-larger-pattern&quot;&gt;The larger pattern&lt;/h2&gt;
&lt;p&gt;The most interesting lesson from the last several days is that the supposed conflict between a static microkernel architecture and a dynamic workstation may not really be a conflict.&lt;/p&gt;
&lt;p&gt;Ceylon does not need to make its foundation behave like a conventional desktop operating system.&lt;/p&gt;
&lt;p&gt;Instead, we can provision resources deliberately and then build dynamic behavior above them.&lt;/p&gt;
&lt;p&gt;Static worker inventory.&lt;/p&gt;
&lt;p&gt;Dynamic execution leases.&lt;/p&gt;
&lt;p&gt;Static virtual-address capacity.&lt;/p&gt;
&lt;p&gt;Dynamic page mappings.&lt;/p&gt;
&lt;p&gt;Static physical-page pools.&lt;/p&gt;
&lt;p&gt;Dynamic ownership.&lt;/p&gt;
&lt;p&gt;Static capability capacity.&lt;/p&gt;
&lt;p&gt;Dynamic capability leases.&lt;/p&gt;
&lt;p&gt;The lower layers remain understandable and bounded.&lt;/p&gt;
&lt;p&gt;The upper layers gain the flexibility applications expect.&lt;/p&gt;
&lt;p&gt;That combination is starting to look like one of Ceylon&apos;s defining architectural ideas.&lt;/p&gt;
&lt;h2 id=&quot;next&quot;&gt;Next&lt;/h2&gt;
&lt;p&gt;Before the next major implementation push, we are going to close out the current development cycle properly.&lt;/p&gt;
&lt;p&gt;That means cleaning the validation and source trees, preserving the evidence that matters, reconciling the architecture handoffs, updating the project&apos;s durable engineering records, and making sure the next development session begins from a known state.&lt;/p&gt;
&lt;p&gt;After that, two research tracks move to the front:&lt;/p&gt;
&lt;p&gt;designing and proving the bounded capability pool needed for larger dynamic-memory workloads;
performing a systematic driver and data-path reuse audit to determine where existing work can accelerate Ceylon&apos;s storage, networking, timing and device architecture.&lt;/p&gt;
&lt;p&gt;Neither is particularly glamorous.&lt;/p&gt;
&lt;p&gt;Both could save an enormous amount of development time.&lt;/p&gt;
&lt;p&gt;And both move us toward the same goal:&lt;/p&gt;
&lt;p&gt;a machine that is dynamic where users need it to be, but predictable where engineering demands it.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Originally published on The Weekend Report: https://theweekendersproject.com/report/ceylon-development-log-september-16-2026-static-foundations-dynamic-systems&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Workshop</category><category>Microkernel</category><category>Virtual Memory</category><category>Systems Engineering</category><author>Mike</author></item><item><title>Ceylon Development Log — September 15, 2026: Locking the Baseline Before Moving Forward</title><link>https://ceylonprojectng.com/journal/ceylon-development-log-september-15-2026-locking-the-baseline/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/ceylon-development-log-september-15-2026-locking-the-baseline/</guid><description>A day spent proving the new low-level foundation: DMA and interrupt isolation, multicore FPU safety, runtime boundaries, and an integrated harness that learned to trust shared state instead of notification counts.</description><pubDate>Wed, 16 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A day spent proving the new low-level foundation: DMA and interrupt isolation, multicore FPU safety, runtime boundaries, and an integrated harness that learned to trust shared state instead of notification counts.&lt;/p&gt;
&lt;p&gt;September 15 was one of those days where a lot of work happened without producing something flashy on the screen. That is not a complaint. For an operating system project, these are some of the most important days.&lt;/p&gt;
&lt;p&gt;The focus was on getting Project Ceylon&apos;s current reference build into a state where we could confidently say: this is the known-good machine, and anything we change from here has to prove that it is at least as trustworthy. That baseline is now locked.&lt;/p&gt;
&lt;h2 id=&quot;the-last-known-good-build&quot;&gt;The last known-good build&lt;/h2&gt;
&lt;p&gt;Before beginning the next major low-level system update, I wanted a reproducible reference point. Not the last version that seemed to work. Not whatever happened to be in the build directory. A real baseline.&lt;/p&gt;
&lt;p&gt;That meant capturing the exact source revision, system image, kernel image, dependency versions, test results and performance measurements associated with the current working system.&lt;/p&gt;
&lt;p&gt;The reference build completed its regression suite successfully, including 407 workspace tests, 86 documentation and contract checks, RTC and time synchronization tests, software-emulated and hardware-assisted virtualization boot testing, and baseline IPC, notification, shared-memory and floating-point performance measurements.&lt;/p&gt;
&lt;p&gt;That build is now the project&apos;s GOLDEN-PRE23 reference. It gives us something extremely valuable: a control group. From this point forward, a major platform change cannot simply say, &amp;quot;it boots.&amp;quot; It has to answer a much harder question: is it actually better—or at least no worse—than the system we already know works?&lt;/p&gt;
&lt;h2 id=&quot;why-i-am-being-so-conservative&quot;&gt;Why I am being so conservative&lt;/h2&gt;
&lt;p&gt;The low-level platform underneath Ceylon is going through a fairly substantial upgrade. This affects process isolation, memory ownership, shared memory, device access, DMA isolation, interrupts, multicore execution, inter-process communication, floating-point and SIMD state, and runtime and linker behavior.&lt;/p&gt;
&lt;p&gt;Those are not areas where I want to rely on optimism. A bug in a graphical application is irritating. A bug in the part of the system that decides which device is allowed to write to which physical memory is an entirely different class of problem.&lt;/p&gt;
&lt;p&gt;The goal is to eventually take Ceylon from the virtual development machine to real x86-64 hardware. The more of these architectural assumptions we can prove now, the fewer surprises we should encounter when that transition begins.&lt;/p&gt;
&lt;h2 id=&quot;dma-isolation-passed&quot;&gt;DMA isolation passed&lt;/h2&gt;
&lt;p&gt;One of today&apos;s major validation areas involved device DMA. In simple terms, DMA allows hardware devices to access memory without asking the CPU to copy every byte. It is important for high-performance storage, networking, graphics and media processing—and it needs strict boundaries.&lt;/p&gt;
&lt;p&gt;The test system defines separate, bounded DMA windows for multiple virtual devices and verifies that a device cannot wander outside the memory assigned to it. The validation included attempts below and above an allowed window, across its boundary, through unmapped holes, into memory owned by another device, and into memory belonging to another authority domain.&lt;/p&gt;
&lt;p&gt;Those tests passed in both software-emulated and hardware-accelerated environments. That may not make for a glamorous screenshot, but for the kind of workstation Ceylon is intended to become, this is foundational.&lt;/p&gt;
&lt;h2 id=&quot;interrupt-ownership-found-a-real-defect&quot;&gt;Interrupt ownership found a real defect&lt;/h2&gt;
&lt;p&gt;The interrupt tests did exactly what good validation is supposed to do: they found something. A network device still had an interrupt assignment left over from an earlier configuration, even though that network path had evolved into a polling-based design.&lt;/p&gt;
&lt;p&gt;The stale route was removed, the candidate was rebuilt, and the interrupt tests were repeated. The corrected build demonstrated proper interrupt ownership and no cross-delivery between unrelated components. That corrected build became the current upgrade candidate.&lt;/p&gt;
&lt;h2 id=&quot;multicore-floating-point-isolation&quot;&gt;Multicore floating-point isolation&lt;/h2&gt;
&lt;p&gt;Another major test involved floating-point and SIMD state across multiple CPU cores. The validation exercised vector registers, traditional floating-point state, control registers and fault behavior while placing independent owners on separate processor cores.&lt;/p&gt;
&lt;p&gt;The state remained isolated. One component could fault without exposing its floating-point state to the surviving component. That is important evidence that the upgraded low-level system is behaving the way Ceylon&apos;s architecture expects.&lt;/p&gt;
&lt;h2 id=&quot;runtime-and-shared-memory-testing&quot;&gt;Runtime and shared-memory testing&lt;/h2&gt;
&lt;p&gt;The upgraded runtime was also put through tests covering IPC buffer placement, stack alignment, linker layout, thread-local storage, protected procedure calls, notifications, shared memory, runtime identity, fault-entry behavior and multicore operation.&lt;/p&gt;
&lt;p&gt;Some of this work is specifically important because seemingly small changes to the underlying runtime can alter assumptions made by Rust, the linker or the system&apos;s memory layout. I&apos;d rather expose those assumptions now.&lt;/p&gt;
&lt;h2 id=&quot;then-came-the-integrated-test&quot;&gt;Then came the integrated test&lt;/h2&gt;
&lt;p&gt;Individual tests are useful, but eventually all these pieces have to operate at the same time. So the next step was an integrated multicore workload combining many of the previously tested paths.&lt;/p&gt;
&lt;p&gt;That test initially failed. Interestingly, the operating system itself was not the culprit. The validation harness was. We found synchronization problems in the test machinery, particularly around how completion notifications and shared-state bookkeeping interacted.&lt;/p&gt;
&lt;p&gt;That resulted in an important design correction to the test framework: notifications are treated as doorbells, not counters. The actual truth lives in monotonically advancing shared state. A notification says, essentially, &amp;quot;something may have changed; go look.&amp;quot; It does not attempt to encode exactly how many things changed.&lt;/p&gt;
&lt;p&gt;By the end of the day&apos;s work, the corrected harness had progressed through increasing workloads, including the longer integrated test horizon.&lt;/p&gt;
&lt;h2 id=&quot;validation-tools-need-validation-too&quot;&gt;Validation tools need validation too&lt;/h2&gt;
&lt;p&gt;One recurring theme in this phase is that test software deserves the same skepticism as production software. We&apos;ve found several occasions where an apparent operating-system failure was actually a flaw in the test fixture itself.&lt;/p&gt;
&lt;p&gt;That isn&apos;t wasted work. A test that cannot prove it would detect the thing it claims to detect is not very useful. The validation framework includes negative controls and deliberately incorrect states intended to demonstrate that failures really are observable.&lt;/p&gt;
&lt;h2 id=&quot;where-ceylon-stands&quot;&gt;Where Ceylon stands&lt;/h2&gt;
&lt;p&gt;The previous system remains the governing baseline. The upgraded system is still a candidate. That distinction is intentional. The new build does not become &amp;quot;the operating system&amp;quot; merely because it compiled, booted or completed a few demonstrations.&lt;/p&gt;
&lt;p&gt;The remaining process includes integrated validation, regression reconciliation and performance comparison against the known-good baseline. Only after that evidence is complete will I consider replacing the current reference.&lt;/p&gt;
&lt;h2 id=&quot;why-this-matters-later&quot;&gt;Why this matters later&lt;/h2&gt;
&lt;p&gt;Ceylon is being built in a virtual machine first, but the VM is not the destination. It is the laboratory. The eventual goal is real x86-64 hardware, with real storage controllers, real networking, real graphics hardware, real DMA and real timing behavior.&lt;/p&gt;
&lt;p&gt;I want the virtual implementation to give us a tested architecture for those systems before we begin dealing with hardware-specific complications. Then moving to bare metal becomes a hardware-enablement problem instead of an architectural reinvention.&lt;/p&gt;
&lt;p&gt;That is the theory, anyway. And September 15 moved us quite a bit closer to finding out whether it works.&lt;/p&gt;
&lt;p&gt;— Mike&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Originally published on The Weekend Report: https://theweekendersproject.com/report/ceylon-development-log-september-15-2026-locking-the-baseline&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Workshop</category><category>Microkernel</category><category>Validation</category><category>Systems Engineering</category><author>Mike</author></item><item><title>Ceylon Development Log — September 14, 2026: Strengthening the Foundation</title><link>https://ceylonprojectng.com/journal/ceylon-development-log-september-14-2026/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/ceylon-development-log-september-14-2026/</guid><description>A long day of audit closure and microkernel migration work froze a reproducible Ceylon baseline and advanced the new foundation to the B0 validation gate.</description><pubDate>Tue, 15 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A long day of audit closure and microkernel migration work froze a reproducible Ceylon baseline and advanced the new foundation to the B0 validation gate.&lt;/p&gt;
&lt;p&gt;Today turned into a much longer development tranche than I expected. What started as preparation for an underlying system update ended up consuming most of the afternoon and evening, but we finished the day in a very good place.&lt;/p&gt;
&lt;p&gt;The first major milestone was freezing a new known-good Ceylon baseline. That means we now have a version of the system that is not simply working, but documented, reproducible, independently reviewed, tested under multiple execution environments, and backed by a performance baseline we can use for future comparisons.&lt;/p&gt;
&lt;p&gt;That distinction is important. When you are building an operating system, especially one intended to grow into a serious multimedia and workstation platform, eventually &amp;quot;it boots&amp;quot; is no longer a useful definition of success. You need to know exactly what code produced the system, whether another clean build produces the same functional result, whether failure paths behave correctly, and whether future changes make the system better or worse.&lt;/p&gt;
&lt;h2 id=&quot;why-we-are-updating-the-microkernel&quot;&gt;Why We Are Updating the Microkernel&lt;/h2&gt;
&lt;p&gt;With that baseline safely preserved, we moved on to the next major step: updating the microkernel foundation underneath Ceylon. This is not an update for the sake of having a newer version number.&lt;/p&gt;
&lt;p&gt;Recent architectural research into memory management, shared memory, device access, DMA, process isolation, execution contexts, and high-performance data paths exposed opportunities that make more sense if we modernize the underlying kernel environment first.&lt;/p&gt;
&lt;p&gt;As the project grows, memory cannot just be thought of as RAM an application gets. We need increasingly sophisticated control over which subsystem owns a region, which processes may map it, which devices may access it directly, when memory is pinned or reclaimed, how stale mappings are rejected, how shared data moves without unnecessary copying, and how those rules remain enforceable when something crashes or restarts.&lt;/p&gt;
&lt;p&gt;Those are foundational operating-system problems, and they directly affect performance. If we get the architecture right, Ceylon can eventually move large amounts of graphics, audio, storage, and media data through the system without constantly copying it from one private buffer to another.&lt;/p&gt;
&lt;h2 id=&quot;research-before-implementation&quot;&gt;Research Before Implementation&lt;/h2&gt;
&lt;p&gt;A lot of the recent work has actually been research rather than coding. I have been looking closely at how mature operating systems and multimedia platforms solve problems such as shared buffers, registered memory, DMA ownership, resource lifetime, high-performance queues, and hardware isolation.&lt;/p&gt;
&lt;p&gt;The goal is not to copy another operating system. It is to understand which ideas have proven durable, why they work, where they fail, and which lessons make sense for Ceylon. That research has already generated several promising architectural directions for later development.&lt;/p&gt;
&lt;p&gt;But before implementing those ideas, it became clear that updating the microkernel now would give us a much better foundation to build them on. So that became today&apos;s job.&lt;/p&gt;
&lt;h2 id=&quot;a-longer-tranche-than-expected&quot;&gt;A Longer Tranche Than Expected&lt;/h2&gt;
&lt;p&gt;Updating something this far down in the system affects considerably more than changing a dependency number. Low-level memory configuration changed. Device isolation changed. Interrupt handling needed to be reviewed. Runtime and linker assumptions had to be checked. Hardware-access paths needed to be validated.&lt;/p&gt;
&lt;p&gt;Because we had just established a clean baseline, I was not willing to make enough changes to get the machine to boot and call it finished. The updated system had to pass the same tests as the previous baseline. By the end of the night, it did.&lt;/p&gt;
&lt;p&gt;The new candidate builds successfully, boots under both of our primary virtualized execution modes, reaches the authentication system, display subsystem, and NuGUI normally, and passes the existing workspace, documentation, clock, synchronization, and performance-test infrastructure. Preliminary performance results show no obvious regression from the update. That is encouraging, but it is not enough for promotion.&lt;/p&gt;
&lt;h2 id=&quot;next-try-to-break-it&quot;&gt;Next: Try to Break It&lt;/h2&gt;
&lt;p&gt;The updated microkernel candidate is now frozen for the next phase. The old baseline remains the official governing version of Ceylon.&lt;/p&gt;
&lt;p&gt;Next comes deeper validation. Instead of simply asking whether the system runs, we will deliberately test the new isolation and hardware-access behavior: devices must not reach memory they were not authorized to access, interrupts must remain correctly isolated, floating-point state must not leak between execution contexts, and the underlying runtime must continue behaving correctly under failure and stress.&lt;/p&gt;
&lt;p&gt;Only after those checks pass will we move into a more formal performance and assurance comparison. Only after that will the new foundation replace the old one.&lt;/p&gt;
&lt;p&gt;That may sound conservative, but this is exactly the point in the project where conservative engineering pays off. Ceylon is becoming complicated enough that future progress depends on having foundations we can trust. Today was a long afternoon and evening spent strengthening one of those foundations. Not flashy. But very important.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Originally published on The Weekend Report: https://theweekendersproject.com/report/ceylon-development-log-september-14-2026&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Workshop</category><category>Microkernel</category><category>Systems Engineering</category><category>Roadmap</category><author>Mike</author></item><item><title>Ceylon Development Log — September 12, 2026</title><link>https://ceylonprojectng.com/journal/ceylon-development-log-september-12-2026/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/ceylon-development-log-september-12-2026/</guid><description>September 12 was a day of architecture review, development governance, and a closer look at what modern Amiga users actually want from a workstation.</description><pubDate>Sun, 13 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;September 12 was a day of architecture review, development governance, and a closer look at what modern Amiga users actually want from a workstation.&lt;/p&gt;
&lt;h2 id=&quot;from-prototype-to-engineering-discipline&quot;&gt;From Prototype to Engineering Discipline&lt;/h2&gt;
&lt;p&gt;September 12 was not primarily a &amp;quot;new feature&amp;quot; day for Ceylon. It was a day spent making sure that what we are building can survive the transition from an interesting operating-system experiment into a system that can actually be maintained, verified, extended, and eventually trusted.&lt;/p&gt;
&lt;p&gt;That meant doing two things in parallel: taking a hard look at the current Ceylon source tree and formalizing the rules that will govern development from this point forward, while also stepping outside the code to ask what current Amiga users are actually asking for when they talk about a modern system. Those exercises reinforced each other surprisingly well.&lt;/p&gt;
&lt;h2 id=&quot;a-full-architecture-review&quot;&gt;A Full Architecture Review&lt;/h2&gt;
&lt;p&gt;The source review captured 119 maintained Rust, C, Python, shell, and Microkit composition files. The documentation checker and its tests are passing after correcting the XML block-comment handling discovered during the review.&lt;/p&gt;
&lt;p&gt;The review gave us a clearer picture of where Ceylon is strong and where parts remain proof-grade. The architecture remains centered on seL4 and Microkit for protection, capabilities, mappings, interrupts, notifications, and controlled lifecycle management, while higher-level Ceylon services own storage, networking, input, graphics, application execution, authentication, management, and the user environment.&lt;/p&gt;
&lt;p&gt;One principle was reinforced throughout: the microkernel is there to enforce isolation and authority, not to become the high-frequency data bus of the operating system. Ceylon&apos;s preferred model remains small typed control messages, shared or registered buffers for bulk data, descriptor and SPSC rings for streaming, batched publication and completion, and notifications for meaningful state changes rather than per-byte or per-pixel kernel traffic.&lt;/p&gt;
&lt;h2 id=&quot;restarting-a-process-is-not-the-same-as-recovering-a-service&quot;&gt;Restarting a Process Is Not the Same as Recovering a Service&lt;/h2&gt;
&lt;p&gt;A protection domain being restartable does not automatically mean the service it contains is restart-safe. A restarted driver or service may still have stale shared-memory cursors, outstanding requests, device queue state, DMA ownership, external consumers holding old references, replay state, or hardware that was never properly quiesced.&lt;/p&gt;
&lt;p&gt;Ceylon therefore needs explicit reincarnation contracts for restartable services: how state is torn down, what becomes invalid, how generations advance, what happens to work already in flight, and how clients reconnect. That is the difference between saying &amp;quot;we can restart a component&amp;quot; and actually being able to recover a workstation after something fails.&lt;/p&gt;
&lt;h2 id=&quot;shared-memory-is-becoming-a-platform-contract&quot;&gt;Shared Memory Is Becoming a Platform Contract&lt;/h2&gt;
&lt;p&gt;The source review found several synchronization approaches already present in the tree. That is normal during bring-up, but it cannot remain that way in a multiprocessing production system.&lt;/p&gt;
&lt;p&gt;We identified the need for standardized Ceylon shared-memory publication patterns covering SPSC rings, request/result pages, immutable snapshots and seqlocks, and descriptor/data-window rings. Each needs defined ownership, memory ordering, overflow behavior, restart behavior, generations, cache assumptions, and notification rules. Storage, graphics, audio, networking, input, media processing, and application services all depend on moving data between isolated components quickly without sacrificing correctness.&lt;/p&gt;
&lt;h2 id=&quot;proof-paths-cannot-quietly-become-production-paths&quot;&gt;Proof Paths Cannot Quietly Become Production Paths&lt;/h2&gt;
&lt;p&gt;An implementation good enough to prove a concept is not automatically good enough to become permanent architecture. Several Ceylon paths intentionally use simplified copies, single outstanding operations, or other bounded bring-up mechanisms. Those are useful for proving behavior, but they are not necessarily how the production system should move data.&lt;/p&gt;
&lt;p&gt;The production direction is registered/shared buffers, descriptor queues, bounded concurrency, batching, and explicit completion semantics. Real-time paths such as audio also need fixed-capacity behavior with no surprise allocation or unbounded processing in the steady-state path.&lt;/p&gt;
&lt;h2 id=&quot;authentication-moved-forward-but-it-is-not-finished&quot;&gt;Authentication Moved Forward, but It Is Not Finished&lt;/h2&gt;
&lt;p&gt;The normal authentication request/result path and its publication-race proof are closed. What is not yet closed is the harder lifecycle case: protection-domain restart and service reincarnation. The authentication foundation therefore remains correctly classified as PARTIAL, rather than being promoted prematurely to complete.&lt;/p&gt;
&lt;p&gt;Throughout Ceylon we are deliberately separating DESIGNED, HOST_PROVEN, TARGET_PROVEN, PARTIAL, and REFERENCE_ONLY. A feature existing in source code is not enough to call it finished.&lt;/p&gt;
&lt;h2 id=&quot;development-governance-became-part-of-the-architecture&quot;&gt;Development Governance Became Part of the Architecture&lt;/h2&gt;
&lt;p&gt;September 12 also marked adoption of the new Ceylon software-development governance model. The basic rule is intentionally demanding:&lt;/p&gt;
&lt;p&gt;DONE = implemented + documented + tested + target-verified where required + reconciled against the approved specification + independently reviewed + traceable + reproducible + auditable + recorded.&lt;/p&gt;
&lt;p&gt;As Ceylon grows, the larger risk is architectural drift: different parts of the operating system quietly acquiring incompatible assumptions about ownership, authority, synchronization, lifecycle, memory ordering, resource limits, or failure behavior. The governance model is intended to stop that while preserving Ceylon&apos;s identity as an independently developed modern workstation operating system informed by the strongest ideas of the classic Commodore/Amiga workstation lineage.&lt;/p&gt;
&lt;h2 id=&quot;we-also-asked-what-the-amiga-community-actually-wants&quot;&gt;We Also Asked What the Amiga Community Actually Wants&lt;/h2&gt;
&lt;p&gt;We reviewed recurring discussions in established Amiga communities to get a qualitative picture of what active users mean by modernization. This was not a survey and does not produce statistically representative percentages. The useful question was simply: what requests keep appearing?&lt;/p&gt;
&lt;p&gt;The expected requests were there: 64-bit support, multiprocessing/SMP, real memory protection, stronger security boundaries, modern filesystems and storage, accelerated graphics, better audio and multimedia, modern networking and IPv6, USB and current peripherals, Wi-Fi and Bluetooth, Unicode, current browser capability, printing and scanning, and affordable hardware.&lt;/p&gt;
&lt;p&gt;But the discussion was not only about specifications. People also want a machine that feels direct: fast input, fast launch, predictable behavior, no enormous unexplained background stack, and no feeling that the computer is fighting the person using it. That maps closely to Ceylon&apos;s goal of making responsiveness an architectural property through bounded queues, explicit resource budgets, minimal hot-path kernel crossings, and deterministic data paths where they matter.&lt;/p&gt;
&lt;h2 id=&quot;people-remember-workbench-for-more-than-its-appearance&quot;&gt;People Remember Workbench for More Than Its Appearance&lt;/h2&gt;
&lt;p&gt;When people talk about Workbench fondly, they are often remembering clarity, not just colors and gadgets: understandable files and volumes, obvious application launching, visible system state, simple file associations, useful small utilities, and consistent interaction patterns.&lt;/p&gt;
&lt;p&gt;That gives NuGUI a clearer design target. Ceylon should not reproduce Workbench&apos;s historical limitations; it should try to reproduce the feeling that the machine is understandable.&lt;/p&gt;
&lt;h2 id=&quot;local-ownership-is-still-valuable&quot;&gt;Local Ownership Is Still Valuable&lt;/h2&gt;
&lt;p&gt;There is continued resistance to turning the workstation into a terminal for somebody else&apos;s cloud service. Local files, offline usefulness, user-controlled systems, transparent behavior, and reduced dependency on mandatory remote accounts remain attractive characteristics. Network services and cloud integration may be useful, but neither should be required for the workstation to remain the user&apos;s computer.&lt;/p&gt;
&lt;h2 id=&quot;arexx-datatypes-and-logical-volumes&quot;&gt;ARexx, Datatypes, and Logical Volumes&lt;/h2&gt;
&lt;p&gt;The important lesson of ARexx is application cooperation: applications could be composed and automated by the user. A modern Ceylon interpretation would be a capability-safe command and action model with discoverable operations, structured arguments and results, explicit authorization, asynchronous completion, scripting support, stable identities, and bounded execution.&lt;/p&gt;
&lt;p&gt;Amiga Datatypes offers another useful idea: applications should not each have to understand every media format. Isolated typed providers for image, audio, video, and document decoding or conversion could give Ceylon smaller applications, shared format support, centralized updates, and safer isolation around complex parsers.&lt;/p&gt;
&lt;p&gt;Amiga-style assigns and named volumes also retain real usability value. Stable logical names need not be welded directly to physical storage locations; a future Ceylon version could combine that convenience with capabilities and explicit ownership.&lt;/p&gt;
&lt;h2 id=&quot;multimedia-remains-central&quot;&gt;Multimedia Remains Central&lt;/h2&gt;
&lt;p&gt;Graphics, animation, audio, video, and creative software remain strongly associated with what made the Amiga interesting. For Ceylon, that is not merely nostalgia. Those workloads are exactly where bounded architecture, shared-memory data paths, isolation, predictable scheduling behavior, and purpose-built resource providers can justify a new workstation operating system.&lt;/p&gt;
&lt;h2 id=&quot;where-that-leaves-ceylon&quot;&gt;Where That Leaves Ceylon&lt;/h2&gt;
&lt;p&gt;The lesson is not simply that people want a new Amiga. Preservationists, users of Amiga-derived systems, and modernizers do not all want the same thing. Ceylon does not need to pretend they are one audience.&lt;/p&gt;
&lt;p&gt;What we did see is substantial overlap between recurring community requests and the qualities Ceylon is already trying to build: modern multiprocessing, isolation and recovery, current hardware, strong multimedia, direct interaction, an understandable desktop, scripting and application cooperation, local ownership, extensible media services, and a system that remains comprehensible to the person sitting in front of it.&lt;/p&gt;
&lt;p&gt;The useful lesson is not to chase a historical feature checklist. It is to build the general Ceylon capability that satisfies the underlying need. Candidate A1 capabilities now include application profiles, transactional updates, logical storage roots, command/action automation, typed media providers, stable presentation contracts, file interchange, recovery support, and controlled clipboard/application exchange.&lt;/p&gt;
&lt;p&gt;These are Ceylon features first. If they also make future compatibility work easier, that is a benefit rather than the reason they exist.&lt;/p&gt;
&lt;p&gt;September 12 made the project less ambiguous. We have a better definition of what Ceylon is, a clearer picture of what is proven and transitional, stronger rules for graduating experimental paths into production architecture, and a better understanding of which historical workstation ideas remain genuinely useful.&lt;/p&gt;
&lt;p&gt;The immediate release remains a proof-of-life system: boot, authenticate, enter NuGUI, run applications, persist data, and demonstrate that the architecture is real. The larger ideas now have somewhere to go.&lt;/p&gt;
&lt;p&gt;Ceylon is starting to move from &amp;quot;a collection of things that work&amp;quot; toward &amp;quot;a system with rules about why they work together.&amp;quot; And apparently good operating-system architecture benefits from tacos, tamales, and homemade chocolate chip cookies.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Originally published on The Weekend Report: https://theweekendersproject.com/report/ceylon-development-log-september-12-2026&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Workshop</category><category>Governance</category><category>Architecture</category><category>Shared Memory</category><category>Community Research</category><author>Mike</author></item><item><title>A Night Off, a Looney Tunes Movie, and a Hard Look at Ceylon</title><link>https://ceylonprojectng.com/journal/a-night-off-a-looney-tunes-movie-and-a-hard-look-at-ceylon/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/a-night-off-a-looney-tunes-movie-and-a-hard-look-at-ceylon/</guid><description>A night away from Ceylon turned into dinner, a movie, a serious software audit, and a complete rewrite of the rules for building the operating system.</description><pubDate>Fri, 11 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A night away from Ceylon turned into dinner, a movie, a serious software audit, and a complete rewrite of the rules for building the operating system.&lt;/p&gt;
&lt;p&gt;September 10 was a genuine night off.&lt;/p&gt;
&lt;p&gt;No Ceylon work. No documentation. No architecture review. No testing. Nothing.&lt;/p&gt;
&lt;p&gt;That was intentional.&lt;/p&gt;
&lt;p&gt;I have been spending enough time buried in Ceylon lately that taking an entire evening and simply not touching it was probably overdue, so that is exactly what I did.&lt;/p&gt;
&lt;p&gt;September 11 started out considerably less serious.&lt;/p&gt;
&lt;p&gt;I grabbed McDonald&apos;s for dinner and went to see Coyote vs. Acme.&lt;/p&gt;
&lt;p&gt;The easiest way I can describe it is as something in the general neighborhood of Who Framed Roger Rabbit and Space Jam, but without all of the bells and whistles.&lt;/p&gt;
&lt;p&gt;It is a simpler movie than either of those, and that is not necessarily a bad thing.&lt;/p&gt;
&lt;p&gt;There is plenty there for kids, while the parents get the nostalgia of seeing Wile E. Coyote, Acme, and the familiar Looney Tunes world given the live-action treatment again.&lt;/p&gt;
&lt;p&gt;It is not trying to be some enormous effects-driven spectacle. It is just a fun family movie with enough familiarity to keep the adults entertained too.&lt;/p&gt;
&lt;p&gt;My verdict: 3 out of 5 stars.&lt;/p&gt;
&lt;p&gt;Good for the kids. Nostalgic for the parents. Worth seeing for what it is.&lt;/p&gt;
&lt;p&gt;Then I came home and somehow the evening became considerably more serious.&lt;/p&gt;
&lt;p&gt;We conducted a fairly extensive software audit of the current Ceylon codebase.&lt;/p&gt;
&lt;p&gt;The point was not simply to ask whether Ceylon builds, boots, or passes tests. We went back through the actual engineering assumptions behind several parts of the system: shared-memory behavior, synchronization, ownership, unsafe code, restart behavior, performance concerns, and the places where proof-of-concept implementations eventually need to become production-quality implementations.&lt;/p&gt;
&lt;p&gt;We found some issues.&lt;/p&gt;
&lt;p&gt;That is not a bad result.&lt;/p&gt;
&lt;p&gt;In fact, that is exactly what I wanted an audit to do.&lt;/p&gt;
&lt;p&gt;The important thing is that we are finding these weaknesses now, while the system is still under active development and they can be corrected deliberately, rather than allowing questionable assumptions to become deeply embedded in the operating system.&lt;/p&gt;
&lt;p&gt;The audit also forced us to take a harder look at the rules governing Ceylon development itself.&lt;/p&gt;
&lt;p&gt;The result was a complete rewrite of the Ceylon software-development contract.&lt;/p&gt;
&lt;p&gt;The new contract is much more rigorous about what &amp;quot;finished&amp;quot; actually means.&lt;/p&gt;
&lt;p&gt;Code existing is not enough.&lt;/p&gt;
&lt;p&gt;A test passing is not enough.&lt;/p&gt;
&lt;p&gt;Even getting something working on the target is not, by itself, enough.&lt;/p&gt;
&lt;p&gt;The new development rules put much more emphasis on complete specifications, architectural ownership, requirements traceability, testing, target evidence, documentation, gap analysis, independent review, and keeping a durable record of why engineering decisions were made.&lt;/p&gt;
&lt;p&gt;The idea is straightforward:&lt;/p&gt;
&lt;p&gt;As Ceylon gets larger, I do not want it slowly turning into a collection of local fixes, undocumented assumptions, and architectural compromises that nobody can explain six months later.&lt;/p&gt;
&lt;p&gt;The architecture needs to remain intentional.&lt;/p&gt;
&lt;p&gt;So September 10 was a night completely away from Ceylon.&lt;/p&gt;
&lt;p&gt;September 11 was McDonald&apos;s, a Looney Tunes movie, and then several hours of finding problems in an operating system and rewriting the rules for how we build it.&lt;/p&gt;
&lt;p&gt;Apparently that counts as balance around here.&lt;/p&gt;
&lt;p&gt;I am also about halfway through another fairly substantial piece of Ceylon documentation.&lt;/p&gt;
&lt;p&gt;That one is not ready to discuss yet.&lt;/p&gt;
&lt;p&gt;There will be plenty to say about it when it is.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Originally published on The Weekend Report: https://theweekendersproject.com/report/a-night-off-a-looney-tunes-movie-and-a-hard-look-at-ceylon&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Workshop</category><category>Code Audit</category><category>Governance</category><category>Status Update</category><author>Mike</author></item><item><title>Ceylon Dev Log: When &quot;Restart&quot; Doesn&apos;t Mean Restart</title><link>https://ceylonprojectng.com/journal/ceylon-dev-log-when-restart-doesnt-mean-restart/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/ceylon-dev-log-when-restart-doesnt-mean-restart/</guid><description>Tonight Ceylon closed the authentication publication race and uncovered the deeper distinction between execution restart and full service reincarnation.</description><pubDate>Wed, 09 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Tonight Ceylon closed the authentication publication race and uncovered the deeper distinction between execution restart and full service reincarnation.&lt;/p&gt;
&lt;p&gt;Tonight&apos;s work on Ceylon ended in one of those places that operating-system development seems especially good at producing: we proved the thing we set out to prove, and in doing so uncovered the next problem hiding underneath it.&lt;/p&gt;
&lt;p&gt;That counts as progress.&lt;/p&gt;
&lt;p&gt;Ceylon is an independently developed modern operating system based around a security-certified microkernel foundation. The design exercise behind the project is simple to describe, although considerably harder to implement:&lt;/p&gt;
&lt;p&gt;What might a machine in the Commodore/Amiga workstation lineage have become by 2026 if development had never stopped?&lt;/p&gt;
&lt;p&gt;The goal is not to reproduce a 1980s computer or wrap a modern Unix-like system in retro graphics. Ceylon is being developed as a modern operating system in its own right, using current hardware, isolation, multiprocessing, digital graphics and modern application architecture.&lt;/p&gt;
&lt;p&gt;Tonight we stayed deep in one of the less glamorous but extremely important parts of that work: the boundary between the graphical login environment and the authentication service.&lt;/p&gt;
&lt;h2 id=&quot;closing-the-authentication-publication-race&quot;&gt;Closing the Authentication Publication Race&lt;/h2&gt;
&lt;p&gt;Ceylon&apos;s login UI and Authentication Service communicate asynchronously through bounded shared-memory structures.&lt;/p&gt;
&lt;p&gt;That is deliberate.&lt;/p&gt;
&lt;p&gt;The login interface should not freeze simply because an authentication component is busy, restarting or unavailable. Likewise, a notification by itself must never be enough to convince the login environment that authentication succeeded.&lt;/p&gt;
&lt;p&gt;The shared result has a simple state progression:&lt;/p&gt;
&lt;h2 id=&quot;empty-writing-published&quot;&gt;EMPTY → WRITING → PUBLISHED&lt;/h2&gt;
&lt;p&gt;The critical rule is that the UI may only consume a result after it has reached PUBLISHED.&lt;/p&gt;
&lt;p&gt;That sounds straightforward until you remember that two isolated components are executing independently.&lt;/p&gt;
&lt;p&gt;What happens if the Authentication Service begins writing a result, sends or triggers a notification at an awkward moment, and the graphical shell sees the shared page while it is still incomplete?&lt;/p&gt;
&lt;p&gt;Tonight that case was deliberately forced.&lt;/p&gt;
&lt;p&gt;A test-only build paused the Authentication Service while the result page was explicitly in the WRITING state. The login environment was notified and allowed to inspect the page.&lt;/p&gt;
&lt;p&gt;It correctly refused to consume the result.&lt;/p&gt;
&lt;p&gt;The Authentication Service was then allowed to complete the publication, after which the login environment consumed it exactly once.&lt;/p&gt;
&lt;p&gt;The target evidence came back clean:&lt;/p&gt;
&lt;p&gt;AUTH_TEST_PAUSE_WRITING=PASS
NUGUI_OBSERVED_WRITING=PASS
WRITING_BLOCKS_CONSUMPTION=PASS
AUTH_TEST_RESUME_PUBLISHED=PASS
RESULT_CONSUMED_AFTER_PUBLISHED=PASS
RESULT_DUPLICATES=0&lt;/p&gt;
&lt;p&gt;The remainder of the login path survived the same test as well.&lt;/p&gt;
&lt;p&gt;Ceylon still obtained a fresh authentication epoch, accepted a credential submission, securely cleared the credential buffer and remained locked because no real credential verifier exists yet.&lt;/p&gt;
&lt;p&gt;That last part is important.&lt;/p&gt;
&lt;p&gt;At this stage, a submitted password cannot authenticate anybody.&lt;/p&gt;
&lt;p&gt;The correct current result is essentially:&lt;/p&gt;
&lt;p&gt;Verifier unavailable. Remain locked.&lt;/p&gt;
&lt;p&gt;And that is exactly what happened.&lt;/p&gt;
&lt;h2 id=&quot;then-we-asked-the-harder-question&quot;&gt;Then We Asked the Harder Question&lt;/h2&gt;
&lt;p&gt;The next requirement was to test what happens if either side actually restarts during one of these transactions.&lt;/p&gt;
&lt;p&gt;That is where tonight became more interesting.&lt;/p&gt;
&lt;p&gt;At first glance, restarting a service sounds simple enough: service crashes → restart service → continue.&lt;/p&gt;
&lt;p&gt;But a low-level operating system has to define exactly what the word restart means.&lt;/p&gt;
&lt;p&gt;In Ceylon&apos;s current environment, the available low-level restart mechanism does not reconstruct an entire protection domain from scratch.&lt;/p&gt;
&lt;p&gt;It does not automatically rebuild its address space, mappings, capabilities, IPC relationships or private memory.&lt;/p&gt;
&lt;p&gt;Instead, it can redirect the existing execution context to another entry point.&lt;/p&gt;
&lt;p&gt;Those are very different things.&lt;/p&gt;
&lt;p&gt;And an older piece of Ceylon work turned out to have already encountered an even subtler problem.&lt;/p&gt;
&lt;h2 id=&quot;the-rust-event-loop-problem&quot;&gt;The Rust Event Loop Problem&lt;/h2&gt;
&lt;p&gt;Both the Authentication Service and NuGUI currently use the normal Rust Microkit protection-domain runtime.&lt;/p&gt;
&lt;p&gt;That runtime enters an event loop and retains internal state associated with its IPC buffer.&lt;/p&gt;
&lt;p&gt;If we simply redirect execution back to the beginning of that normal Rust event loop after a fault, the previous stack has never actually been unwound.&lt;/p&gt;
&lt;p&gt;The result could be two logical users of runtime state that was never designed to be re-entered that way.&lt;/p&gt;
&lt;p&gt;Fortunately, this is not completely new territory for Ceylon.&lt;/p&gt;
&lt;p&gt;An earlier application-slot experiment already established a safer pattern: restart through a dedicated low-level trampoline rather than attempting to re-enter the original Rust startup path.&lt;/p&gt;
&lt;p&gt;But tonight&apos;s analysis revealed an important difference.&lt;/p&gt;
&lt;p&gt;The earlier application slot only needed to recover, report its status and stop.&lt;/p&gt;
&lt;p&gt;Authentication and the graphical shell have to keep running afterward.&lt;/p&gt;
&lt;p&gt;So the next test harness will require restart-safe entry points that explicitly recover their software state and then enter a safe receive/dispatch loop without re-entering the abandoned Rust event-loop stack.&lt;/p&gt;
&lt;p&gt;That work is now designed and ready for implementation, but we deliberately stopped there tonight.&lt;/p&gt;
&lt;h2 id=&quot;restart-does-not-clear-memory&quot;&gt;Restart Does Not Clear Memory&lt;/h2&gt;
&lt;p&gt;Another useful finding came from forcing ourselves to be precise about the restart model.&lt;/p&gt;
&lt;p&gt;A restarted protection domain does not magically receive clean private memory.&lt;/p&gt;
&lt;p&gt;If the login screen crashed while someone was halfway through typing &amp;quot;correct horse batt...&amp;quot;, those characters could still physically exist in its memory unless Ceylon explicitly erases them during recovery.&lt;/p&gt;
&lt;p&gt;The same applies to authentication-service scratch buffers and transaction bookkeeping.&lt;/p&gt;
&lt;p&gt;So the restart design now explicitly requires cleanup of things including: login identity buffer, login credential buffer, authentication scratch buffers, current transaction state, authentication epoch bookkeeping, correlation bookkeeping, timers, test state, in-flight request state.&lt;/p&gt;
&lt;p&gt;This produced a security case we had not previously needed to prove: what happens to a credential that was typed but never submitted when the login component crashes?&lt;/p&gt;
&lt;p&gt;The answer will now be part of the lifecycle test: the restart path explicitly zeroes it.&lt;/p&gt;
&lt;p&gt;Finding that case before declaring the authentication foundation complete is exactly why these failure tests exist.&lt;/p&gt;
&lt;h2 id=&quot;shared-state-must-survive-deliberately&quot;&gt;Shared State Must Survive Deliberately&lt;/h2&gt;
&lt;p&gt;Private state should be cleaned.&lt;/p&gt;
&lt;p&gt;Some shared state, however, must survive.&lt;/p&gt;
&lt;p&gt;Ceylon&apos;s authentication protocol uses a monotonically advancing publication sequence to distinguish a genuinely new result from something left behind by an earlier transaction.&lt;/p&gt;
&lt;p&gt;That means restart behavior cannot simply zero everything.&lt;/p&gt;
&lt;p&gt;The intended split is: PRIVATE SOFTWARE STATE → explicitly reset/zeroed; SHARED PROTOCOL STATE → deliberately inspected and recovered.&lt;/p&gt;
&lt;p&gt;For example, if the Authentication Service dies while a result is in WRITING, that partial result must become non-consumable.&lt;/p&gt;
&lt;p&gt;But the publication sequence remains a high-water mark.&lt;/p&gt;
&lt;p&gt;The next real result must advance beyond it rather than allowing stale state to masquerade as something new.&lt;/p&gt;
&lt;p&gt;Likewise, when NuGUI restarts it cannot forget everything and then treat an old PUBLISHED result as new.&lt;/p&gt;
&lt;p&gt;It must first establish a baseline from the surviving shared state, obtain a fresh authentication epoch and only accept results belonging to the new transaction.&lt;/p&gt;
&lt;p&gt;This is where the seemingly mundane concepts—generation numbers, sequence counters, ownership and explicit publication—start paying for themselves.&lt;/p&gt;
&lt;h2 id=&quot;one-more-edge-were-going-to-attack-tomorrow&quot;&gt;One More Edge We&apos;re Going to Attack Tomorrow&lt;/h2&gt;
&lt;p&gt;There is still another boundary worth testing.&lt;/p&gt;
&lt;p&gt;The NuGUI-to-Authentication-Service path is asynchronous.&lt;/p&gt;
&lt;p&gt;The Authentication Service&apos;s request to Ceylon&apos;s secure random service currently contains a synchronous call.&lt;/p&gt;
&lt;p&gt;What happens if the Authentication Service itself is restarted while that synchronous operation is outstanding?&lt;/p&gt;
&lt;p&gt;We don&apos;t know yet.&lt;/p&gt;
&lt;p&gt;And rather than declaring the lifecycle problem solved because the easier restart cases work, tomorrow&apos;s test plan explicitly includes that condition.&lt;/p&gt;
&lt;p&gt;If it works cleanly, good.&lt;/p&gt;
&lt;p&gt;If it doesn&apos;t, the authentication foundation stays open until we understand why.&lt;/p&gt;
&lt;p&gt;That is the rule we&apos;re trying to follow throughout Ceylon: a feature is not complete merely because the happy path works. Its failure and recovery behavior have to be understood too.&lt;/p&gt;
&lt;h2 id=&quot;where-authentication-stands-tonight&quot;&gt;Where Authentication Stands Tonight&lt;/h2&gt;
&lt;p&gt;Authentication ABI — PASS
BeginEpoch — PASS
Secure random epoch — PASS
Credential submission — PASS
Credential zeroization — PASS
Fail-closed behavior — PASS
WRITING → PUBLISHED race — PASS
Exactly-once result consumption — PASS
Execution-restart lifecycle proof — NEXT
Full service reincarnation — FUTURE PLATFORM WORK
Real credential verifier — NOT STARTED
Authenticated desktop — NOT STARTED&lt;/p&gt;
&lt;h2 id=&quot;most-importantly-auth-requestresult-foundation-not-yet-closed&quot;&gt;Most importantly: AUTH REQUEST/RESULT FOUNDATION = NOT YET CLOSED&lt;/h2&gt;
&lt;p&gt;The publication race is closed.&lt;/p&gt;
&lt;p&gt;The lifecycle proof is designed.&lt;/p&gt;
&lt;p&gt;Tomorrow we build the harness and see whether reality agrees with the design.&lt;/p&gt;
&lt;h2 id=&quot;a-little-ecosystem-thinking&quot;&gt;A Little Ecosystem Thinking&lt;/h2&gt;
&lt;p&gt;We also spent some time tonight thinking farther down the road.&lt;/p&gt;
&lt;p&gt;A brand-new operating system has the same uncomfortable software problem that early home computers had: want a program? Somebody has to write one.&lt;/p&gt;
&lt;p&gt;Ceylon will continue developing native software and native APIs, but an optional POSIX-compatible environment is looking increasingly attractive as a porting bridge, rather than as part of Ceylon&apos;s identity.&lt;/p&gt;
&lt;p&gt;The idea would be to let existing open-source applications and libraries reach Ceylon through a compatibility boundary, instrument what they actually depend upon and then progressively replace important compatibility paths with native Ceylon interfaces.&lt;/p&gt;
&lt;p&gt;Projects such as Chromium and Blender make useful long-range targets because getting either of them running well would exercise enormous portions of the platform.&lt;/p&gt;
&lt;p&gt;The rule remains: compatibility follows applications. Ceylon&apos;s architecture does not follow compatibility.&lt;/p&gt;
&lt;p&gt;That&apos;s work for considerably later.&lt;/p&gt;
&lt;p&gt;Tonight we were still worrying about whether a login service can crash at exactly the wrong instruction and safely come back.&lt;/p&gt;
&lt;p&gt;Operating systems are fun that way.&lt;/p&gt;
&lt;p&gt;Development fuel tonight: Taco Bell. Probably not part of the formal architecture. Probably.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Originally published on The Weekend Report: https://theweekendersproject.com/report/ceylon-dev-log-when-restart-doesnt-mean-restart&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Workshop</category></item><item><title>From First Light to First Key: Ceylon&apos;s Keyboard Path Comes Alive</title><link>https://ceylonprojectng.com/journal/from-first-light-to-first-key-ceylons-keyboard-path-comes-alive/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/from-first-light-to-first-key-ceylons-keyboard-path-comes-alive/</guid><description>Ceylon reached first light this morning. Tonight it went further: a real USB keyboard, discovered, configured, and decoded into semantic key events flowing through Ceylon&apos;s bounded input architecture.</description><pubDate>Tue, 08 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ceylon reached first light this morning. Tonight it went further: a real USB keyboard, discovered, configured, and decoded into semantic key events flowing through Ceylon&apos;s bounded input architecture.&lt;/p&gt;
&lt;p&gt;Earlier today, Ceylon reached first light.&lt;/p&gt;
&lt;p&gt;For the first time, the operating system booted in QEMU, brought up its display stack, passed a frame through Iris and Loom, presented it through the virtual graphics hardware, and put an actual Ceylon startup screen on a 1024×768 display.&lt;/p&gt;
&lt;p&gt;Tonight, we pushed considerably farther.&lt;/p&gt;
&lt;p&gt;Ceylon can now discover a USB keyboard, configure it, receive real hardware-style keyboard reports from it, decode those reports into semantic key events, and publish those events into the operating system&apos;s bounded input architecture.&lt;/p&gt;
&lt;p&gt;That sounds like a lot of words for &amp;quot;the keyboard works.&amp;quot;&lt;/p&gt;
&lt;p&gt;It is.&lt;/p&gt;
&lt;p&gt;Because we&apos;re not trying to make a keyboard work by taking shortcuts.&lt;/p&gt;
&lt;p&gt;We&apos;re trying to build the machinery that a real operating system can depend on.&lt;/p&gt;
&lt;h2 id=&quot;the-long-way-around-to-the-letter-a&quot;&gt;The long way around to the letter A&lt;/h2&gt;
&lt;p&gt;The keyboard in the current development machine isn&apos;t a physical USB keyboard yet. Ceylon is still being built inside QEMU, where we can inspect, reproduce, break, and validate the architecture before taking it to bare metal.&lt;/p&gt;
&lt;p&gt;The path currently looks something like this:&lt;/p&gt;
&lt;p&gt;VNC key event → QEMU input subsystem → emulated USB keyboard → xHCI USB controller → Ceylon USB/xHCI driver → HID interrupt endpoint → 8-byte keyboard report → Ceylon input decoder → semantic key event&lt;/p&gt;
&lt;p&gt;Every one of those arrows represents something we had to make real.&lt;/p&gt;
&lt;p&gt;There is no BIOS keyboard call hiding underneath it. No PS/2 fallback. No fake input queue injected directly into the GUI.&lt;/p&gt;
&lt;p&gt;Ceylon is talking to a modern xHCI USB controller.&lt;/p&gt;
&lt;p&gt;That matters because the same plumbing we&apos;re building for the keyboard is the beginning of the USB infrastructure that will eventually support mice, MIDI devices, storage, and other modern peripherals.&lt;/p&gt;
&lt;h2 id=&quot;first-we-had-to-make-the-controller-real&quot;&gt;First, we had to make the controller real&lt;/h2&gt;
&lt;p&gt;The first challenge wasn&apos;t actually the keyboard.&lt;/p&gt;
&lt;p&gt;It was convincing the USB controller to do anything at all.&lt;/p&gt;
&lt;p&gt;Ceylon had to acquire authority over the controller&apos;s memory-mapped registers, a bounded DMA area, and its interrupt.&lt;/p&gt;
&lt;p&gt;Then came the usual xHCI machinery: controller reset, capability discovery, Device Context Base Address Array, command ring, event ring, Event Ring Segment Table, interrupt configuration, controller RUN state.&lt;/p&gt;
&lt;p&gt;The first meaningful test was intentionally boring: submit an xHCI No-Op Command and wait for the controller to complete it.&lt;/p&gt;
&lt;p&gt;Boring is good.&lt;/p&gt;
&lt;p&gt;A No-Op gave us a way to prove the entire controller command path without involving USB device enumeration yet.&lt;/p&gt;
&lt;p&gt;Eventually QEMU fetched the command from Ceylon&apos;s DMA memory and returned a successful Command Completion Event.&lt;/p&gt;
&lt;p&gt;Then we hit an interrupt problem.&lt;/p&gt;
&lt;h2 id=&quot;eleven-was-not-twenty-two&quot;&gt;Eleven was not twenty-two&lt;/h2&gt;
&lt;p&gt;This one is worth writing down because it is exactly the sort of thing that can consume an afternoon in systems programming.&lt;/p&gt;
&lt;p&gt;The xHCI PCI device reported: Interrupt Line: 11, Interrupt Pin: A.&lt;/p&gt;
&lt;p&gt;Naturally, we initially treated that as interrupt 11.&lt;/p&gt;
&lt;p&gt;That was wrong.&lt;/p&gt;
&lt;p&gt;On the Q35 machine model, the PCI Interrupt Line value is a legacy PIC-era representation. The actual routed IOAPIC interrupt for this particular xHCI INTx-A path is GSI 22.&lt;/p&gt;
&lt;p&gt;Once we followed QEMU&apos;s lower-level IOAPIC trace, the real path became obvious: xHCI INTx-A → Q35 PCI routing → IOAPIC GSI 22 → Ceylon interrupt vector → USB driver.&lt;/p&gt;
&lt;p&gt;After correcting that, the interrupt storm we&apos;d been seeing disappeared.&lt;/p&gt;
&lt;p&gt;The controller began doing exactly what it was supposed to do: raise one meaningful interrupt for the completion, let Ceylon service it, and return to an idle state.&lt;/p&gt;
&lt;p&gt;That also reinforced something we&apos;re trying to be disciplined about throughout Ceylon: measure the hardware behavior; don&apos;t infer it from a convenient number.&lt;/p&gt;
&lt;h2 id=&quot;then-the-keyboard-appeared&quot;&gt;Then the keyboard appeared&lt;/h2&gt;
&lt;p&gt;Once the controller itself was trustworthy, USB enumeration could begin.&lt;/p&gt;
&lt;p&gt;Ceylon scanned the xHCI root ports and found the keyboard attached to port 5.&lt;/p&gt;
&lt;p&gt;From there it performed the normal USB sequence: Port detection → Port reset → Enable Slot → Address Device → Endpoint 0 control transfers → Device Descriptor → Configuration Descriptor.&lt;/p&gt;
&lt;p&gt;The device identified itself as: Vendor ID: 0627, Product ID: 0001, USB version: 2.00, Configuration: 1.&lt;/p&gt;
&lt;p&gt;More importantly, Ceylon found exactly the interface we were looking for: Class: HID, Subclass: Boot, Protocol: Keyboard, Interface: 0, Endpoint: 0x81, Packet size: 8 bytes.&lt;/p&gt;
&lt;p&gt;At that point we had independently proven, from inside Ceylon, that the device was a USB HID Boot Keyboard.&lt;/p&gt;
&lt;p&gt;We weren&apos;t relying on the fact that the QEMU command line happened to say usb-kbd.&lt;/p&gt;
&lt;h2 id=&quot;one-tiny-packet&quot;&gt;One tiny packet&lt;/h2&gt;
&lt;p&gt;A USB Boot Keyboard report is wonderfully small.&lt;/p&gt;
&lt;p&gt;Eight bytes.&lt;/p&gt;
&lt;p&gt;Once Ceylon configured the interrupt-IN endpoint, we armed a transfer and injected an actual key event through QEMU&apos;s VNC input path.&lt;/p&gt;
&lt;p&gt;The first key was deliberately unexciting: A.&lt;/p&gt;
&lt;p&gt;The report that arrived in Ceylon was: 00:00:04:00:00:00:00:00.&lt;/p&gt;
&lt;p&gt;Then we released the key: 00:00:00:00:00:00:00:00.&lt;/p&gt;
&lt;p&gt;That little 04 is the USB HID usage for the A key.&lt;/p&gt;
&lt;p&gt;It came through the real path: VNC → QEMU input → USB keyboard → xHCI → DMA → Transfer Event → Ceylon.&lt;/p&gt;
&lt;p&gt;Not simulated guest memory.&lt;/p&gt;
&lt;p&gt;Not a fabricated report.&lt;/p&gt;
&lt;p&gt;Not a test hook bypassing USB.&lt;/p&gt;
&lt;p&gt;A real emulated keyboard transaction through the same architecture we expect to carry onto physical hardware.&lt;/p&gt;
&lt;p&gt;That felt like a pretty good moment.&lt;/p&gt;
&lt;h2 id=&quot;turning-usb-into-ceylon-input&quot;&gt;Turning USB into Ceylon input&lt;/h2&gt;
&lt;p&gt;Raw USB reports should not be the interface applications see.&lt;/p&gt;
&lt;p&gt;An application shouldn&apos;t care whether a key arrived from USB, Bluetooth, a future accessibility device, or something else entirely.&lt;/p&gt;
&lt;p&gt;So the next layer feeds those reports into Ceylon&apos;s existing input core.&lt;/p&gt;
&lt;p&gt;The A-key report now becomes a semantic event: key = 0x1e, state = pressed, modifiers = 0, and then: key = 0x1e, state = released, modifiers = 0.&lt;/p&gt;
&lt;p&gt;The input transport is deliberately small and bounded.&lt;/p&gt;
&lt;p&gt;It currently uses a 32-event shared ring with: one producer, one consumer, fixed-size entries, sequence numbers, generation tracking, overflow accounting, stale-generation rejection, explicit publication ordering.&lt;/p&gt;
&lt;p&gt;There is no dynamically growing queue and no USB memory exposed to the GUI.&lt;/p&gt;
&lt;p&gt;The USB driver owns USB. The GUI gets semantic input.&lt;/p&gt;
&lt;p&gt;That separation is important.&lt;/p&gt;
&lt;h2 id=&quot;where-we-stopped-tonight&quot;&gt;Where we stopped tonight&lt;/h2&gt;
&lt;p&gt;We&apos;re not quite ready to draw the login box yet.&lt;/p&gt;
&lt;p&gt;The provider side is now doing its job: real HID report → semantic decoder → semantic input event → bounded shared transport → notification.&lt;/p&gt;
&lt;p&gt;The remaining issue is at the final delivery boundary.&lt;/p&gt;
&lt;p&gt;The input provider is publishing events and issuing its notification, but NuGUI has not yet demonstrated that it is receiving that notification and consuming the shared event ring.&lt;/p&gt;
&lt;p&gt;So tonight&apos;s result is not: &amp;quot;Keyboard input is finished.&amp;quot;&lt;/p&gt;
&lt;p&gt;It&apos;s more precise than that: the hardware-facing keyboard stack works. Real HID reports are being converted into Ceylon semantic input. The remaining work is connecting that semantic transport cleanly into NuGUI&apos;s locked pre-login input consumer.&lt;/p&gt;
&lt;p&gt;That is a much smaller problem than where we started this morning.&lt;/p&gt;
&lt;h2 id=&quot;and-first-light-is-still-there&quot;&gt;And first light is still there&lt;/h2&gt;
&lt;p&gt;Through all of this, the display path remains intact.&lt;/p&gt;
&lt;p&gt;Ceylon still boots into its 1024×768 startup display through the graphics architecture we established earlier today.&lt;/p&gt;
&lt;p&gt;The known first-light frame checksum remains: 0xa98302d3.&lt;/p&gt;
&lt;p&gt;That matters too.&lt;/p&gt;
&lt;p&gt;Adding USB shouldn&apos;t mysteriously damage graphics.&lt;/p&gt;
&lt;p&gt;Adding input shouldn&apos;t require the GUI to own the USB controller.&lt;/p&gt;
&lt;p&gt;One subsystem coming alive should not mean destabilizing everything around it.&lt;/p&gt;
&lt;p&gt;That&apos;s part of what we&apos;re trying to preserve from the Amiga philosophy while building something meant for modern hardware: specialized components, clear responsibilities, asynchronous work, and a machine that stays responsive because the architecture isn&apos;t constantly tripping over itself.&lt;/p&gt;
&lt;h2 id=&quot;whats-next&quot;&gt;What&apos;s next&lt;/h2&gt;
&lt;p&gt;The next milestone is wonderfully ordinary.&lt;/p&gt;
&lt;p&gt;Get this: A key → USB → Ceylon input → NuGUI.&lt;/p&gt;
&lt;p&gt;Then put a real locked login surface on the screen.&lt;/p&gt;
&lt;p&gt;After that comes focus, editable fields, credential handling, authentication, and finally the transition from the pre-login environment into an authenticated Ceylon desktop.&lt;/p&gt;
&lt;p&gt;There is still a lot of operating system between a boot logo and something you can sit down and use.&lt;/p&gt;
&lt;p&gt;But tonight, for the first time, Ceylon saw someone press a key.&lt;/p&gt;
&lt;p&gt;And it knew which key it was.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Originally published on The Weekend Report: https://theweekendersproject.com/report/from-first-light-to-first-key-ceylons-keyboard-path-comes-alive&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Workshop</category><category>USB</category><category>xHCI</category><category>Input Architecture</category><author>Mike</author></item><item><title>Project Ceylon: Keeping the Architecture, Rebuilding the Assumptions</title><link>https://ceylonprojectng.com/journal/project-ceylon-keeping-the-architecture-rebuilding-the-assumptions/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/project-ceylon-keeping-the-architecture-rebuilding-the-assumptions/</guid><description>Project Ceylon keeps the architectural ideas that made the Amiga compelling while rebuilding the assumptions underneath them for modern hardware.</description><pubDate>Mon, 07 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Project Ceylon keeps the architectural ideas that made the Amiga compelling while rebuilding the assumptions underneath them for modern hardware.&lt;/p&gt;
&lt;p&gt;One of the questions hanging over Project Ceylon from the beginning has been pretty simple: if the Amiga architecture had been allowed to evolve continuously for another forty years, how much of the original design would still make sense in 2026?&lt;/p&gt;
&lt;p&gt;This week I finally took a fairly hard look at that question.&lt;/p&gt;
&lt;p&gt;Not from the standpoint of nostalgia, and not from the standpoint of trying to recreate a machine from 1987 with faster parts. The question was whether the ideas behind the original architecture still held up against modern CPUs, modern memory systems, GPUs, DMA, multicore processing, isolation, modern storage, and the sort of workloads people actually expect from a computer today.&lt;/p&gt;
&lt;p&gt;The answer was encouraging.&lt;/p&gt;
&lt;p&gt;We did not find a reason to throw the overall architecture away.&lt;/p&gt;
&lt;p&gt;What we found instead were several places where the original thinking was still good, but the mechanism underneath it needed to grow up.&lt;/p&gt;
&lt;p&gt;That is exactly what I had hoped would happen.&lt;/p&gt;
&lt;h2 id=&quot;the-original-idea-was-better-than-some-of-the-original-limitations&quot;&gt;The original idea was better than some of the original limitations&lt;/h2&gt;
&lt;p&gt;The Amiga&apos;s custom chips divided work into specialized areas instead of asking the CPU to do absolutely everything.&lt;/p&gt;
&lt;p&gt;That basic idea still makes sense.&lt;/p&gt;
&lt;p&gt;What doesn&apos;t make sense is reproducing the limitations that existed because of the technology available at the time.&lt;/p&gt;
&lt;p&gt;A modern machine does not need to recreate Chip RAM, fixed DMA slots, raster-timed bus arbitration, or a display system built around analog CRT assumptions just because those things existed on the original hardware.&lt;/p&gt;
&lt;p&gt;Those were solutions to specific hardware constraints.&lt;/p&gt;
&lt;p&gt;So the approach we&apos;re taking with Ceylon is to preserve the responsibility and design intent, while replacing the historical mechanism where modern hardware gives us a better answer.&lt;/p&gt;
&lt;p&gt;That distinction turned out to be pretty important.&lt;/p&gt;
&lt;h2 id=&quot;iris-doesnt-need-to-pretend-it-is-agnus&quot;&gt;Iris doesn&apos;t need to pretend it is Agnus&lt;/h2&gt;
&lt;p&gt;Iris is our descendant of the Agnus/Alice side of the architecture.&lt;/p&gt;
&lt;p&gt;Historically, Agnus had a huge amount of responsibility because it had to coordinate access to shared memory and arbitrate DMA among the custom chips.&lt;/p&gt;
&lt;p&gt;That was necessary then.&lt;/p&gt;
&lt;p&gt;It would be a bad design choice now.&lt;/p&gt;
&lt;p&gt;Modern x86-64 hardware already gives us PCIe, device DMA, memory protection, multiple CPU cores, IOMMU support, and much more sophisticated resource management.&lt;/p&gt;
&lt;p&gt;So Iris does not need to become a fake 1980s bus arbiter.&lt;/p&gt;
&lt;p&gt;Its role evolves toward coordinating graphics and media resources, ownership, scheduling, and work relationships without trying to own every byte moving through the machine.&lt;/p&gt;
&lt;p&gt;That is a good example of what I mean by preserving the architecture without preserving obsolete machinery.&lt;/p&gt;
&lt;h2 id=&quot;baton-survives-surprisingly-well&quot;&gt;Baton survives surprisingly well&lt;/h2&gt;
&lt;p&gt;Baton is the descendant of the Copper concept.&lt;/p&gt;
&lt;p&gt;The original Copper was built around precise display timing and raster position.&lt;/p&gt;
&lt;p&gt;The underlying idea, though, is much broader than &amp;quot;wait for scan line 143 and change a register.&amp;quot;&lt;/p&gt;
&lt;p&gt;The useful part is deterministic sequencing of operations relative to presentation timing.&lt;/p&gt;
&lt;p&gt;That still matters today.&lt;/p&gt;
&lt;p&gt;Frames have deadlines. Presentation has ordering requirements. Effects may depend on previous work completing. Buffers have to be ready before display. Video and animation still depend on timing.&lt;/p&gt;
&lt;p&gt;So Baton evolves from raster-position programming into a general sequencing and presentation-timing facility.&lt;/p&gt;
&lt;p&gt;Same idea. Much better clock.&lt;/p&gt;
&lt;h2 id=&quot;loom-may-be-one-of-the-more-interesting-evolutions&quot;&gt;Loom may be one of the more interesting evolutions&lt;/h2&gt;
&lt;p&gt;We decided to keep the name Loom for the Blitter descendant.&lt;/p&gt;
&lt;p&gt;The original Blitter was an extremely effective solution for moving and manipulating blocks of graphics data without tying up the CPU.&lt;/p&gt;
&lt;p&gt;That idea aged very well.&lt;/p&gt;
&lt;p&gt;What changes is the implementation.&lt;/p&gt;
&lt;p&gt;Loom is becoming a provider-neutral graphics and image execution layer.&lt;/p&gt;
&lt;p&gt;An application can ask Loom to perform operations such as copy, fill, scale, composite, transform, clip, blend, or color conversion without caring whether the actual work is done by plain CPU code, SIMD instructions, integrated graphics, or a discrete GPU.&lt;/p&gt;
&lt;p&gt;That gives us a very useful property: the operation stays the same even as the hardware gets faster.&lt;/p&gt;
&lt;p&gt;On a base machine, the CPU implementation should still be genuinely useful.&lt;/p&gt;
&lt;p&gt;Add GPU acceleration and the same workload can move from merely fast to ridiculous.&lt;/p&gt;
&lt;p&gt;That fits the performance rule we&apos;ve been using throughout Ceylon: acceleration raises the ceiling. It does not establish the floor.&lt;/p&gt;
&lt;p&gt;I don&apos;t want a machine that requires a discrete GPU just to behave like a normal computer.&lt;/p&gt;
&lt;h2 id=&quot;the-microkernel-shouldnt-become-the-new-bottleneck&quot;&gt;The microkernel shouldn&apos;t become the new bottleneck&lt;/h2&gt;
&lt;p&gt;Another area we reviewed carefully was communication between all of these pieces.&lt;/p&gt;
&lt;p&gt;Ceylon is built on a security-certified microkernel foundation, and that provides some extremely useful isolation and authority boundaries.&lt;/p&gt;
&lt;p&gt;But having a microkernel does not mean every pixel, audio sample, disk block, network packet, or video frame should bounce through the kernel as an individual message.&lt;/p&gt;
&lt;p&gt;That would be secure and architecturally pure right up until the machine became miserable to use.&lt;/p&gt;
&lt;p&gt;Instead, we have increasingly converged on a common pattern: small control messages establish authority and ownership, while high-frequency data moves through bounded shared resources such as buffers, rings, and descriptor queues.&lt;/p&gt;
&lt;p&gt;The kernel remains responsible for authority, isolation, scheduling, and containment.&lt;/p&gt;
&lt;p&gt;It does not need to sit in the middle of every byte.&lt;/p&gt;
&lt;p&gt;Interestingly, we found variations of this same design appearing independently in the graphics, filesystem, random-number, and audio work.&lt;/p&gt;
&lt;p&gt;That is usually a good sign.&lt;/p&gt;
&lt;p&gt;When several subsystems independently converge on the same pattern, it is probably worth formalizing.&lt;/p&gt;
&lt;h2 id=&quot;multicore-means-we-should-actually-use-the-computer-we-have&quot;&gt;Multicore means we should actually use the computer we have&lt;/h2&gt;
&lt;p&gt;There is also no reason to act as if we still have one CPU competing with a handful of custom chips for every cycle.&lt;/p&gt;
&lt;p&gt;If six cores are sitting there, we should use them.&lt;/p&gt;
&lt;p&gt;If work can safely happen in parallel, let it happen in parallel.&lt;/p&gt;
&lt;p&gt;If a background encoder can consume five cores while leaving the desktop, input, audio, and foreground work responsive, that is exactly what it should do.&lt;/p&gt;
&lt;p&gt;The rule is not &amp;quot;conserve CPU at all costs.&amp;quot;&lt;/p&gt;
&lt;p&gt;The rule is use resources without making the user pay for it in responsiveness.&lt;/p&gt;
&lt;p&gt;That led us to a performance vocabulary I&apos;ve started calling the Mike Scale.&lt;/p&gt;
&lt;p&gt;The normal machine should RUN.&lt;/p&gt;
&lt;p&gt;Heavy production work should be allowed to FLY or reach OMG territory when hardware allows it.&lt;/p&gt;
&lt;p&gt;But the desktop should not suddenly fall back to WALK because somebody started an encode.&lt;/p&gt;
&lt;p&gt;Responsiveness is part of correctness.&lt;/p&gt;
&lt;h2 id=&quot;audio-is-being-treated-the-same-way&quot;&gt;Audio is being treated the same way&lt;/h2&gt;
&lt;p&gt;Aria and Lyra are being developed as shared Ceylon audio infrastructure rather than something every application reinvents privately.&lt;/p&gt;
&lt;p&gt;They need to work for ordinary audio playback, but also for the music-production environment we&apos;re planning and eventually as part of the Ceylon replacement for the Video Toaster.&lt;/p&gt;
&lt;p&gt;That means we are having to think carefully about routing, buses, PCM streams, MIDI, clocks, synchronization, and the relationship between audio time and video time.&lt;/p&gt;
&lt;p&gt;Again, the goal is not to make one giant media subsystem that knows everything.&lt;/p&gt;
&lt;p&gt;The goal is to give applications stable system facilities so they don&apos;t each have to bring along their own miniature operating system.&lt;/p&gt;
&lt;h2 id=&quot;the-toaster-work-uncovered-another-architectural-opportunity&quot;&gt;The Toaster work uncovered another architectural opportunity&lt;/h2&gt;
&lt;p&gt;While reviewing how the original Video Toaster software fit together, we found something worth preserving conceptually.&lt;/p&gt;
&lt;p&gt;The old system did not use one universal mechanism for everything.&lt;/p&gt;
&lt;p&gt;Timing-critical work used the mechanism appropriate to timing-critical work.&lt;/p&gt;
&lt;p&gt;Applications could use ARexx for loose control and automation.&lt;/p&gt;
&lt;p&gt;Media assets could be exchanged through projects and files.&lt;/p&gt;
&lt;p&gt;That led us toward a more general Ceylon application-federation model.&lt;/p&gt;
&lt;p&gt;Some applications will be able to cooperate more deeply when explicitly authorized.&lt;/p&gt;
&lt;p&gt;NuBrush could operate as a standalone graphics program but also participate in the Toaster environment.&lt;/p&gt;
&lt;p&gt;The music-production software could operate by itself or become the audio-production side of the same project.&lt;/p&gt;
&lt;p&gt;Future applications could embed or link live objects in ways similar to putting a spreadsheet inside a word-processing document.&lt;/p&gt;
&lt;p&gt;We&apos;re calling the federation coordinator Kirk for now.&lt;/p&gt;
&lt;p&gt;Kirk&apos;s job is not to carry the video frames or render the graphics.&lt;/p&gt;
&lt;p&gt;It maintains the relationships: who owns this object, what application can edit it, is it embedded or linked, what revision is current, what provider can handle this type, and if the provider restarts, is the old relationship now stale.&lt;/p&gt;
&lt;p&gt;The actual graphics still go through Loom. Audio still belongs to Aria and Lyra. Files still belong to the filesystem.&lt;/p&gt;
&lt;p&gt;Kirk just keeps the crew coordinated.&lt;/p&gt;
&lt;p&gt;And importantly, not every application has to participate.&lt;/p&gt;
&lt;p&gt;A non-federated application remains isolated and does not get cross-application shared-resource privileges.&lt;/p&gt;
&lt;p&gt;It can still copy data or save a file like any normal program.&lt;/p&gt;
&lt;p&gt;But live shared objects and shared resources require explicit federation.&lt;/p&gt;
&lt;p&gt;That seems like a much cleaner security model than quietly letting every application reach into every other application because somebody wants fancy drag-and-drop.&lt;/p&gt;
&lt;h2 id=&quot;the-architecture-survived-the-review&quot;&gt;The architecture survived the review&lt;/h2&gt;
&lt;p&gt;That is probably the biggest conclusion from all of this.&lt;/p&gt;
&lt;p&gt;We went into the review fully prepared to discover that some of the original architectural ideas simply did not survive contact with modern hardware.&lt;/p&gt;
&lt;p&gt;Instead, most of the important ideas did survive.&lt;/p&gt;
&lt;p&gt;What changed were the assumptions underneath them.&lt;/p&gt;
&lt;p&gt;Agnus does not need to arbitrate 1980s memory buses.&lt;/p&gt;
&lt;p&gt;The Copper does not need to think in CRT scan lines.&lt;/p&gt;
&lt;p&gt;The Blitter does not have to be one fixed piece of silicon.&lt;/p&gt;
&lt;p&gt;Audio does not have to live inside an application.&lt;/p&gt;
&lt;p&gt;Applications do not have to sacrifice isolation just to cooperate.&lt;/p&gt;
&lt;p&gt;And the operating system does not need to route every high-frequency data transfer through its smallest control mechanism.&lt;/p&gt;
&lt;p&gt;That feels like the right outcome for Ceylon.&lt;/p&gt;
&lt;p&gt;We&apos;re not building an old Amiga with modern parts.&lt;/p&gt;
&lt;p&gt;We&apos;re trying to figure out what the architecture might have become if engineers had been allowed to keep improving it for forty years.&lt;/p&gt;
&lt;p&gt;Some of that means keeping ideas that were already very good.&lt;/p&gt;
&lt;p&gt;Some of it means admitting that technology moved on.&lt;/p&gt;
&lt;p&gt;And some of it means finding opportunities the original designers simply did not have the hardware to exploit.&lt;/p&gt;
&lt;p&gt;The next major milestone is still the same: get the complete reference workstation running under QEMU, prove the architecture end to end, and only then start getting serious about the physical machine.&lt;/p&gt;
&lt;p&gt;But the architectural foundation feels considerably better defined now than it did a week ago.&lt;/p&gt;
&lt;p&gt;And after spending a large portion of the week thinking about DMA, generation counters, application federation, audio clocks, shared buffers, and what exactly a Blitter ought to be in 2026, I went over to my sister&apos;s house and had brisket with the family.&lt;/p&gt;
&lt;p&gt;It was very good brisket.&lt;/p&gt;
&lt;p&gt;Some systems are already adequately optimized.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Originally published on The Weekend Report: https://theweekendersproject.com/report/project-ceylon-keeping-the-architecture-rebuilding-the-assumptions&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Workshop</category><category>Architecture</category><category>Iris</category><category>Baton</category><category>Loom</category><category>Microkernel</category><category>Multicore</category><category>Performance</category><category>QEMU</category><category>Video Toaster</category><category>Amiga</category><author>Mike</author></item><item><title>The Backstory Is Live. Tomorrow, Y&apos;all Get the Mess as It Happens.</title><link>https://ceylonprojectng.com/journal/the-backstory-is-live-tomorrow-yall-get-the-mess-as-it-happens/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/the-backstory-is-live-tomorrow-yall-get-the-mess-as-it-happens/</guid><description>The retrospective is caught up. From here forward, Project Ceylon becomes a real-time record of the work, wrong turns, breakthroughs, and whatever happens next.</description><pubDate>Mon, 07 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The retrospective is caught up. From here forward, Project Ceylon becomes a real-time record of the work, wrong turns, breakthroughs, and whatever happens next.&lt;/p&gt;
&lt;h2 id=&quot;project-ceylon-development-journal-september-6-2026&quot;&gt;Project Ceylon Development Journal — September 6, 2026&lt;/h2&gt;
&lt;p&gt;Well, this has been a day.&lt;/p&gt;
&lt;p&gt;When I started this morning, most of Project Ceylon&apos;s history existed in exactly the places you would expect a long-running personal engineering project to keep its history: old notes, specifications, source trees, test results, conversations, half-remembered design decisions, and a collection of moments where I was absolutely certain I knew what I was doing right up until the math informed me otherwise.&lt;/p&gt;
&lt;p&gt;Tonight, most of that story is finally public.&lt;/p&gt;
&lt;p&gt;We went back to the beginning and built out the Project Ceylon Development Journal on The Weekender Report.&lt;/p&gt;
&lt;p&gt;Not the sanitized beginning.&lt;/p&gt;
&lt;p&gt;The actual beginning.&lt;/p&gt;
&lt;p&gt;The question was: what if Amiga development had never stopped?&lt;/p&gt;
&lt;p&gt;From there, the journal works its way through the research into what actually made the Amiga interesting, the Video Toaster, the old NewTek source and development documentation, Project Nu-Day, QEMU, graphics experiments, the Intel Arc A770, the move to a security-certified microkernel architecture, and eventually the realization that Nu-Day had become too small for the operating system growing inside it.&lt;/p&gt;
&lt;p&gt;That last part is important.&lt;/p&gt;
&lt;h2 id=&quot;i-didnt-want-to-rewrite-the-past&quot;&gt;I Didn&apos;t Want to Rewrite the Past&lt;/h2&gt;
&lt;p&gt;One of the things I specifically did not want to do was write this like we knew where everything was going from the beginning.&lt;/p&gt;
&lt;p&gt;We didn&apos;t.&lt;/p&gt;
&lt;p&gt;I didn&apos;t sit down one morning with a complete architecture diagram for Ceylon and spend the next several months dutifully implementing boxes.&lt;/p&gt;
&lt;p&gt;There were wrong turns.&lt;/p&gt;
&lt;p&gt;There were ideas that looked good until they were tested.&lt;/p&gt;
&lt;p&gt;There were things that worked technically but turned out to be the wrong product direction.&lt;/p&gt;
&lt;p&gt;And there were moments where I ran the numbers, stared at the screen for a while, and thought something along the lines of: well, hell.&lt;/p&gt;
&lt;p&gt;The early Nu-Iris display work was one of those.&lt;/p&gt;
&lt;p&gt;The display path could do useful things.&lt;/p&gt;
&lt;p&gt;That wasn&apos;t the problem.&lt;/p&gt;
&lt;p&gt;The problem was what happened when I started asking it to scale into the high-resolution video workstation I actually wanted to build.&lt;/p&gt;
&lt;p&gt;The math didn&apos;t care how much I liked the architecture.&lt;/p&gt;
&lt;p&gt;It wasn&apos;t going to work the way I needed it to.&lt;/p&gt;
&lt;p&gt;I was irritated.&lt;/p&gt;
&lt;p&gt;I remain perfectly comfortable admitting that.&lt;/p&gt;
&lt;p&gt;Engineering blogs have a bad habit of turning every failure into some sort of inspirational corporate lesson: &amp;quot;We discovered an exciting opportunity to rethink our architecture.&amp;quot;&lt;/p&gt;
&lt;p&gt;No.&lt;/p&gt;
&lt;p&gt;Sometimes you discover that something you spent a bunch of time on isn&apos;t going to work and you&apos;re pissed off about it.&lt;/p&gt;
&lt;p&gt;Then you go eat enchiladas and look at it again tomorrow.&lt;/p&gt;
&lt;p&gt;That&apos;s part of the story too.&lt;/p&gt;
&lt;h2 id=&quot;the-a770-story-is-finally-in-there&quot;&gt;The A770 Story Is Finally in There&lt;/h2&gt;
&lt;p&gt;We also got the Intel Arc A770 story written down properly.&lt;/p&gt;
&lt;p&gt;I&apos;d been concerned that people would look at the card and assume the decision was basically: 16 GB GPU. Fast. Cheap enough. Good.&lt;/p&gt;
&lt;p&gt;That wasn&apos;t it.&lt;/p&gt;
&lt;p&gt;The development information Intel makes publicly available was one of the reasons I was willing to take the card seriously in the first place.&lt;/p&gt;
&lt;p&gt;If you&apos;re building your own operating system, documentation starts becoming a hardware feature.&lt;/p&gt;
&lt;p&gt;Y&apos;all can sell me the fastest device on Earth, but if the only programming documentation consists of a marketing brochure and some guy on a forum saying, &amp;quot;I think this register does something,&amp;quot; we&apos;ve got a problem.&lt;/p&gt;
&lt;p&gt;Intel gave me something I could actually research: architecture documentation, programming material, open-source compute runtime, media-driver source, Linux driver documentation. Enough material to begin understanding what the device expects from an operating system.&lt;/p&gt;
&lt;p&gt;That doesn&apos;t make writing an A770 driver easy.&lt;/p&gt;
&lt;p&gt;It merely changes the problem from witchcraft to a really large engineering project.&lt;/p&gt;
&lt;p&gt;I&apos;ll take the latter.&lt;/p&gt;
&lt;h2 id=&quot;nu-day-gets-its-proper-ending&quot;&gt;Nu-Day Gets Its Proper Ending&lt;/h2&gt;
&lt;p&gt;The other story I wanted to get right was why Nu-Day failed.&lt;/p&gt;
&lt;p&gt;It didn&apos;t fail because nothing worked.&lt;/p&gt;
&lt;p&gt;That&apos;s almost the opposite of what happened.&lt;/p&gt;
&lt;p&gt;Enough pieces started working that it became increasingly obvious I was no longer building a media workstation.&lt;/p&gt;
&lt;p&gt;To build the media workstation, I needed an application environment. And a filesystem. And networking. And identity. And authentication. And service lifecycle management. And hardware isolation. And management interfaces. And cryptographic services.&lt;/p&gt;
&lt;p&gt;And eventually you have to look at that list and admit something.&lt;/p&gt;
&lt;p&gt;You&apos;re building an operating system.&lt;/p&gt;
&lt;p&gt;Worse yet, you&apos;re building a general operating platform while still trying to describe it as one specialized workstation.&lt;/p&gt;
&lt;p&gt;Nu-Day worked well enough to prove I was building the wrong-sized project.&lt;/p&gt;
&lt;p&gt;That&apos;s where Ceylon really started.&lt;/p&gt;
&lt;h2 id=&quot;and-now-were-caught-up&quot;&gt;And Now We&apos;re Caught Up&lt;/h2&gt;
&lt;p&gt;That is probably the biggest thing we accomplished today.&lt;/p&gt;
&lt;p&gt;The journal now has a beginning.&lt;/p&gt;
&lt;p&gt;Someone discovering Ceylon for the first time doesn&apos;t have to land in the middle of some discussion about IPC contracts, SecureRandom, application slots, or GPU command submission and wonder what sort of lunatic decided this was a sensible weekend project.&lt;/p&gt;
&lt;p&gt;They can start with the innocent question.&lt;/p&gt;
&lt;p&gt;Then watch it gradually get out of hand.&lt;/p&gt;
&lt;p&gt;Which is much more accurate.&lt;/p&gt;
&lt;p&gt;We also put together a shorter review piece that pulls the major parts of the story into one article.&lt;/p&gt;
&lt;p&gt;That&apos;s intentional.&lt;/p&gt;
&lt;p&gt;The full journal is for somebody who wants to follow the project.&lt;/p&gt;
&lt;p&gt;The review piece is for somebody who needs to decide whether the project is interesting enough to follow in the first place.&lt;/p&gt;
&lt;p&gt;Those are different jobs.&lt;/p&gt;
&lt;h2 id=&quot;tomorrow-is-different&quot;&gt;Tomorrow Is Different&lt;/h2&gt;
&lt;p&gt;Up until tonight, the journal has mostly been reconstruction.&lt;/p&gt;
&lt;p&gt;Tomorrow that changes.&lt;/p&gt;
&lt;p&gt;The backstory is caught up.&lt;/p&gt;
&lt;p&gt;From here forward, the journal becomes what I actually wanted it to be: a running record of the project while I&apos;m building it.&lt;/p&gt;
&lt;p&gt;That means some entries will probably be long.&lt;/p&gt;
&lt;p&gt;Some will be technical.&lt;/p&gt;
&lt;p&gt;Some days we&apos;ll close a major architecture gate.&lt;/p&gt;
&lt;p&gt;Some days we&apos;ll spend six hours chasing something that turns out to be a hard-coded number.&lt;/p&gt;
&lt;p&gt;Some days I&apos;ll get something running that I&apos;ve been trying to make work for a week.&lt;/p&gt;
&lt;p&gt;And I&apos;m sure there will be days where the entire update amounts to: nothing worked today.&lt;/p&gt;
&lt;p&gt;That&apos;s fine.&lt;/p&gt;
&lt;p&gt;I don&apos;t want to write the polished version of this three years from now and accidentally convince myself that I knew what I was doing the whole time.&lt;/p&gt;
&lt;p&gt;I&apos;d rather leave the fingerprints on it.&lt;/p&gt;
&lt;p&gt;So, as of tonight, the retrospective is done.&lt;/p&gt;
&lt;p&gt;Tomorrow, y&apos;all get the project in real time.&lt;/p&gt;
&lt;p&gt;The things that work. The things that don&apos;t. The things I change my mind about. The occasionally questionable engineering decision. And whatever dinner happens to be when I finally shut the computer down.&lt;/p&gt;
&lt;p&gt;Right now I&apos;m thinking brisket sounds pretty good.&lt;/p&gt;
&lt;p&gt;But that&apos;s tomorrow&apos;s problem.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Originally published on The Weekend Report: https://theweekendersproject.com/report/the-backstory-is-live-tomorrow-yall-get-the-mess-as-it-happens&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Workshop</category><category>Status Update</category><category>Roadmap</category><category>Alternate History</category><category>Amiga</category><category>Intel Arc A770</category><category>NewTek</category><category>Project Nu-Day</category><category>Video Toaster</category><category>Microkernel</category><category>QEMU</category><category>Postmortem</category><author>Mike</author></item><item><title>Where Project Ceylon Stands Today — September 6, 2026</title><link>https://ceylonprojectng.com/journal/where-project-ceylon-stands-today-september-6-2026/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/where-project-ceylon-stands-today-september-6-2026/</guid><description>This closes out the retrospective backfill with an honest accounting: what&apos;s proven, what&apos;s partial, what&apos;s planned, and what flatly isn&apos;t built yet. Starting tomorrow, this becomes a real daily journal.</description><pubDate>Sun, 06 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This closes out the retrospective backfill with an honest accounting: what&apos;s proven, what&apos;s partial, what&apos;s planned, and what flatly isn&apos;t built yet. Starting tomorrow, this becomes a real daily journal.&lt;/p&gt;
&lt;p&gt;This is the entry that closes out the backfill. Everything before this one documented work that already happened, written up after the fact. Starting after this entry, the journal catches up to real time — dated posts, written as the work happens, not reconstructed afterward. So I want this one to be a genuinely honest accounting, not a highlight reel, because everything after this gets measured against what I claim right here.&lt;/p&gt;
&lt;h2 id=&quot;whats-actually-proven&quot;&gt;What&apos;s actually proven&lt;/h2&gt;
&lt;p&gt;Real, working evidence exists for: the application runtime and its container/identity/lifecycle model; typed management semantics as a real design, with wire and adapter work underway; console and access architecture; the Horos directory, identity, authentication, and session architecture; the SecureRandom architecture, including a working virtual-entropy backend and cross-component client proof that it actually works end to end; the restart-starvation fix and the channel-configuration fix from the last two entries, both verified; and the supporting QEMU reference-machine work that everything above was built and proven against.&lt;/p&gt;
&lt;p&gt;That&apos;s real. I stand behind every item on that list as demonstrated, not aspirational.&lt;/p&gt;
&lt;h2 id=&quot;whats-partial&quot;&gt;What&apos;s partial&lt;/h2&gt;
&lt;p&gt;The Arc A770 driver work is at the early staged steps described a few entries back — discovery and ownership, moving toward controlled operations — not a finished driver, not close to one yet. The management API has real semantics designed and partially wired, not a fully connected GUI-and-CLI experience yet. The application runtime has a real narrow contract working, with the deliberately deferred POSIX-adjacent capabilities still, correctly, deferred.&lt;/p&gt;
&lt;h2 id=&quot;whats-planned-but-not-real-yet&quot;&gt;What&apos;s planned but not real yet&lt;/h2&gt;
&lt;p&gt;Bare-metal deployment is planned, not built. The eventual target hardware is a Z390-class x86-64 machine, using Intel&apos;s integrated graphics for display duties, with the Arc A770 available for acceleration once that driver work is far enough along to matter. Remote management consuming the shared semantic layer is a planned future addition, not a current capability.&lt;/p&gt;
&lt;h2 id=&quot;what-flatly-isnt-built&quot;&gt;What flatly isn&apos;t built&lt;/h2&gt;
&lt;p&gt;Let me be completely direct about this, because overclaiming here would undercut every honest entry that came before it: this is not a complete desktop operating system. Not a complete server. Not a finished bare-metal system of any kind. Not a complete UHD 630 driver, and not a complete Arc A770 driver. Not a finished painting application in the DigiPaint tradition. Not a browser, and not a productivity suite. None of that exists yet. Some of it is designed. None of it is done.&lt;/p&gt;
&lt;h2 id=&quot;what-comes-next&quot;&gt;What comes next&lt;/h2&gt;
&lt;p&gt;Tomorrow the backstory is over. From here on out, y&apos;all get the mess as it happens — the real decisions, in something much closer to real time, including the ones that don&apos;t work out. I&apos;d rather you see this project the way it actually gets built than the tidied-up version I could write if I waited until things were finished to talk about them. That second version doesn&apos;t teach anybody anything, including me.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Originally published on The Weekend Report: https://theweekendersproject.com/report/where-project-ceylon-stands-today-september-6-2026&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Workshop</category><category>Status Update</category><category>Roadmap</category><author>Mike</author></item><item><title>52, 53, and Other Numbers That Ruin Your Evening</title><link>https://ceylonprojectng.com/journal/52-53-and-other-numbers-that-ruin-your-evening/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/52-53-and-other-numbers-that-ruin-your-evening/</guid><description>With the scheduler starvation bug fixed, the next client finally ran — and immediately failed for a much dumber reason. Shared logic assumed channel 52. It was actually assigned channel 53.</description><pubDate>Sun, 06 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;With the scheduler starvation bug fixed, the next client finally ran — and immediately failed for a much dumber reason. Shared logic assumed channel 52. It was actually assigned channel 53.&lt;/p&gt;
&lt;p&gt;With yesterday&apos;s starvation bug actually fixed, Client B finally got to run for the first time in a while. Good news. It then immediately failed, which — after the RNG-bug-that-wasn&apos;t — I was almost prepared to find funny.&lt;/p&gt;
&lt;h2 id=&quot;the-dumbest-possible-reason&quot;&gt;The dumbest possible reason&lt;/h2&gt;
&lt;p&gt;Shared logic across the SecureRandom clients assumed a hardcoded startup channel: 52. Client B&apos;s actual assigned channel, in this particular configuration, was 53. One number. Off by exactly one, in a config-dependent way that the previous starvation bug had been successfully hiding, because Client B hadn&apos;t gotten far enough to hit this problem until the scheduler was actually letting it run.&lt;/p&gt;
&lt;p&gt;Why I&apos;m including something this small in the same journal as microkernel decisions&lt;/p&gt;
&lt;p&gt;Because this is real, and pretending a project this size is only made of grand architectural decisions would be dishonest about what actually eats an evening. Extremely complicated systems — capability-based security, custom entropy subsystems, a whole staged GPU driver plan — can still faceplant on a boring hardcoded number that nobody double-checked against the actual runtime configuration. That&apos;s not a contradiction. That&apos;s just what real systems work is like most of the time, in between the entries that make for good story arcs.&lt;/p&gt;
&lt;h2 id=&quot;the-fix-and-keeping-it-that-size&quot;&gt;The fix, and keeping it that size&lt;/h2&gt;
&lt;p&gt;The correction was narrow and configuration-aware: stop assuming 52, read the actual assigned channel for the configuration in question. I&apos;m not going to dress this entry up as more architecturally significant than it was. It&apos;s a one-line-shaped bug with a two-day setup because a bigger bug was standing in front of it the whole time.&lt;/p&gt;
&lt;p&gt;Two real bugs, back to back, both hiding behind symptoms that pointed somewhere else entirely. That&apos;s most of what debugging actually is on a project like this — and now that both were behind me, it felt like a reasonable point to step back and take an honest look at where the whole project actually stands, which is exactly where this retrospective run closes out.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Originally published on The Weekend Report: https://theweekendersproject.com/report/52-53-and-other-numbers-that-ruin-your-evening&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Workshop</category><category>Debugging</category><category>Configuration</category><category>Postmortem</category><author>Mike</author></item><item><title>The RNG Bug That Wasn&apos;t an RNG Bug</title><link>https://ceylonprojectng.com/journal/the-rng-bug-that-wasnt-an-rng-bug/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/the-rng-bug-that-wasnt-an-rng-bug/</guid><description>Two SecureRandom client tests were failing. Every instinct said the bug was in the random-number code. It wasn&apos;t. It was a busy-spinning restart starving lower-priority services out of CPU time entirely.</description><pubDate>Sun, 06 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Two SecureRandom client tests were failing. Every instinct said the bug was in the random-number code. It wasn&apos;t. It was a busy-spinning restart starving lower-priority services out of CPU time entirely.&lt;/p&gt;
&lt;p&gt;Two lower-priority SecureRandom client tests weren&apos;t running correctly, right on the heels of the entropy subsystem work from the last entry. Every instinct I had said: the bug&apos;s in the new random-number code, obviously, what else would it be. Every instinct I had was wrong, which is exactly the kind of thing worth writing down honestly instead of quietly editing out of the story.&lt;/p&gt;
&lt;h2 id=&quot;what-was-actually-happening&quot;&gt;What was actually happening&lt;/h2&gt;
&lt;p&gt;The real cause was nowhere near the RNG code. A higher-priority application slot that had been restarted was sitting in an unconditional busy spin — actively burning CPU in a loop, at high priority, with no yielding, no waiting, nothing that would let a scheduler consider it &amp;quot;idle&amp;quot; even for a moment. From the scheduler&apos;s point of view, that slot always had work to do, right now, more urgently than anything else. So it never gave up the CPU voluntarily, and the lower-priority SecureRandom client services underneath it functionally starved. They weren&apos;t failing because anything was wrong with them. They were failing because they were never getting scheduled at all.&lt;/p&gt;
&lt;h2 id=&quot;why-this-looked-exactly-like-an-rng-bug&quot;&gt;Why this looked exactly like an RNG bug&lt;/h2&gt;
&lt;p&gt;From where I was sitting, the SecureRandom client tests were failing, so the SecureRandom client code was the obvious first suspect. That&apos;s a completely reasonable first assumption, and it&apos;s also a great example of why scheduler and service-composition behavior can hide behind a completely unrelated subsystem&apos;s symptoms. The bug wore the RNG subsystem&apos;s clothes. It had nothing to do with the RNG subsystem.&lt;/p&gt;
&lt;h2 id=&quot;the-fix-and-a-rule-i-want-to-be-honest-about&quot;&gt;The fix, and a rule I want to be honest about&lt;/h2&gt;
&lt;p&gt;The actual fix was replacing that inappropriate busy-spin quiescent state with a proper blocking wait suited to how that composition of services was actually supposed to behave — let the restarted slot wait properly instead of spinning at full priority forever.&lt;/p&gt;
&lt;p&gt;Here&apos;s the rule I want to be explicit about, because it&apos;s tempting after a satisfying fix like this one to retroactively explain every other weird thing that&apos;s ever happened as &amp;quot;oh, that was probably this same bug.&amp;quot; I&apos;m not going to do that. Other historical faults in this project that I never fully diagnosed stay unknown. I&apos;m not rewriting old mysteries to make this one bug the tidy explanation for everything, just because it would make for a more satisfying narrative. It fixed exactly what it fixed.&lt;/p&gt;
&lt;p&gt;The actual lesson here, the one worth keeping: a subsystem can look completely broken while being completely innocent, if something upstream of it is quietly eating all the CPU time it needed to prove otherwise. Worth remembering literally every time something &amp;quot;doesn&apos;t work&amp;quot; going forward. Which, as it turns out, came up again almost immediately — for a much, much dumber reason.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Originally published on The Weekend Report: https://theweekendersproject.com/report/the-rng-bug-that-wasnt-an-rng-bug&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Workshop</category><category>Debugging</category><category>Scheduler</category><category>Postmortem</category><author>Mike</author></item><item><title>Random Numbers Turn Out to Be a Whole Damn Subsystem</title><link>https://ceylonprojectng.com/journal/random-numbers-turn-out-to-be-a-whole-damn-subsystem/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/random-numbers-turn-out-to-be-a-whole-damn-subsystem/</guid><description>I expected to spend an afternoon on random numbers. I spent a lot longer than an afternoon on random numbers, because it turns out trustworthy entropy is genuinely its own subsystem, not a library call.</description><pubDate>Sun, 06 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I expected to spend an afternoon on random numbers. I spent a lot longer than an afternoon on random numbers, because it turns out trustworthy entropy is genuinely its own subsystem, not a library call.&lt;/p&gt;
&lt;p&gt;I went into this expecting a fairly boring afternoon: get a random-number source working, wire it up, move on to something more interesting. That is not how it went, and in hindsight I should have seen it coming, because &amp;quot;random numbers you can actually trust&amp;quot; is a much bigger commitment than &amp;quot;random numbers that look random.&amp;quot;&lt;/p&gt;
&lt;h2 id=&quot;why-this-needed-its-own-subsystem-instead-of-a-library-call&quot;&gt;Why this needed its own subsystem instead of a library call&lt;/h2&gt;
&lt;p&gt;A single, central SecureRandom authority sits behind a proper DRBG — a deterministic random bit generator seeded from real entropy, not a quick call to whatever the standard library happens to expose. Consumers throughout Ceylon don&apos;t read raw entropy themselves; they go through SecureRandom, get output for a specific typed purpose, and never touch the underlying entropy pool directly.&lt;/p&gt;
&lt;p&gt;Readiness is an explicit, checked state, not an assumption. If the entropy source isn&apos;t ready, or isn&apos;t trustworthy yet, the system fails closed — consumers that need randomness they can actually stand behind do not get handed something that merely looks plausible instead. That&apos;s a deliberately harder requirement than most systems bother enforcing, and it&apos;s exactly why this turned into its own subsystem instead of a two-line wrapper.&lt;/p&gt;
&lt;h2 id=&quot;purpose-typing-and-why-reboot-behavior-needed-its-own-rule&quot;&gt;Purpose typing, and why reboot behavior needed its own rule&lt;/h2&gt;
&lt;p&gt;Different consumers get typed purposes rather than one undifferentiated &amp;quot;give me a random number&amp;quot; call, so the system has an honest, checkable record of what a given piece of randomness was actually used for. And reboot and state-loss behavior needed explicit rules of their own — what&apos;s allowed to persist across a restart, what must not persist, and what has to be freshly reseeded before anything is allowed to trust it again.&lt;/p&gt;
&lt;h2 id=&quot;built-hardware-neutral-tested-against-a-virtual-source&quot;&gt;Built hardware-neutral, tested against a virtual source&lt;/h2&gt;
&lt;p&gt;The whole authority is architected to be hardware-neutral rather than tied to one specific entropy source, and for actual development and testing it currently runs against a virtual entropy source rather than a specific physical hardware RNG — consistent with the whole &amp;quot;reference machine first&amp;quot; discipline that&apos;s shown up throughout this journal since the QEMU entry. This isn&apos;t the part of the system I&apos;m going to publish specifics of key material, internal state, or anything genuinely security-sensitive about — that&apos;s a hard line for obvious reasons, same as not naming the microkernel.&lt;/p&gt;
&lt;p&gt;What I will say is: I did not expect &amp;quot;random numbers&amp;quot; to turn into one of the more architecturally serious subsystems on the whole platform. It did. And it&apos;s not even the last surprise entropy-adjacent work had for me this summer — the actual debugging story is next, and it&apos;s a genuinely good one.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Originally published on The Weekend Report: https://theweekendersproject.com/report/random-numbers-turn-out-to-be-a-whole-damn-subsystem&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Workshop</category><category>SecureRandom</category><category>Entropy</category><category>Security Architecture</category><author>Mike</author></item><item><title>One Management API, Whether You Click It or Type It</title><link>https://ceylonprojectng.com/journal/one-management-api-whether-you-click-it-or-type-it/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/one-management-api-whether-you-click-it-or-type-it/</guid><description>Whether you&apos;re driving Ceylon through a GUI or a terminal, it should be the same semantic backend underneath, not two tools that happen to overlap most of the time.</description><pubDate>Sun, 06 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Whether you&apos;re driving Ceylon through a GUI or a terminal, it should be the same semantic backend underneath, not two tools that happen to overlap most of the time.&lt;/p&gt;
&lt;p&gt;A pattern I see a lot in existing systems, and specifically didn&apos;t want to repeat: a GUI settings panel and a terminal command that do almost the same thing, maintained by almost the same logic, duplicated in two places, that quietly drift apart from each other over time until one of them supports something the other doesn&apos;t and nobody remembers why. Ceylon&apos;s management layer is built to avoid that by construction, not by discipline alone.&lt;/p&gt;
&lt;h2 id=&quot;the-actual-design&quot;&gt;The actual design&lt;/h2&gt;
&lt;p&gt;There&apos;s one typed management API underneath everything, organized around domains — System, Services, Storage, Network, Logs, Apps. Both NuGUI and the terminal-facing management CLI are meant to eventually consume that exact same semantic backend, rather than each having its own parallel logic that happens to produce similar results most of the time.&lt;/p&gt;
&lt;p&gt;The API draws a clear line between queries and mutations, and mutations are generation-aware — a change carries with it an understanding of what state it expects to be modifying, so a stale or conflicting change gets rejected rather than silently applied on top of something that&apos;s already moved on. That idea isn&apos;t unique to management operations either — it&apos;s the same generation-and-staleness discipline that shows up in the application-runtime entry&apos;s container reuse, applied here to configuration and system state instead of process containers.&lt;/p&gt;
&lt;h2 id=&quot;authority-comes-from-the-caller-not-the-wire&quot;&gt;Authority comes from the caller, not the wire&lt;/h2&gt;
&lt;p&gt;A management operation&apos;s authority comes from who&apos;s actually calling it, resolved through Horos, not from untrusted text sitting on the wire claiming to be privileged. That sounds like an obvious requirement once you say it out loud, but it&apos;s exactly the kind of thing that&apos;s easy to get subtly wrong if the management layer and the security layer are designed by two different trains of thought instead of one deliberately unified one.&lt;/p&gt;
&lt;p&gt;Why this matters beyond just &amp;quot;less duplicated code&amp;quot;&lt;/p&gt;
&lt;p&gt;The practical payoff, beyond just not maintaining two versions of the same logic, is that a future remote-management capability — something I haven&apos;t built yet, and I&apos;m not going to pretend otherwise — gets to consume that same semantic layer instead of requiring a third parallel implementation. Building the shared semantic core first, before either surface, is what makes that a realistic future addition instead of a redesign waiting to happen.&lt;/p&gt;
&lt;p&gt;Next entry is a genuine surprise from earlier this summer: it turns out random numbers are a lot more of a subsystem than &amp;quot;call a library function&amp;quot; would suggest, once you actually take them seriously.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Originally published on The Weekend Report: https://theweekendersproject.com/report/one-management-api-whether-you-click-it-or-type-it&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Workshop</category><category>Management API</category><category>NuGUI</category><category>CLI</category><author>Mike</author></item><item><title>Applications Without Pretending We&apos;re Unix</title><link>https://ceylonprojectng.com/journal/applications-without-pretending-were-unix/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/applications-without-pretending-were-unix/</guid><description>An application on Ceylon isn&apos;t automatically a Unix process wearing a different hat. Building the runtime meant deciding, on purpose, what to borrow from that model and what to leave behind.</description><pubDate>Sun, 06 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;An application on Ceylon isn&apos;t automatically a Unix process wearing a different hat. Building the runtime meant deciding, on purpose, what to borrow from that model and what to leave behind.&lt;/p&gt;
&lt;p&gt;A genuinely tempting shortcut, when you&apos;re building a new platform, is to just make &amp;quot;application&amp;quot; mean &amp;quot;Unix process&amp;quot; and move on with your life — inherit forty years of tooling, forty years of assumptions, forty years of things people already know how to do. I didn&apos;t take that shortcut, and this entry is about why, and what the alternative actually looks like conceptually.&lt;/p&gt;
&lt;h2 id=&quot;why-not-just-be-unix-shaped&quot;&gt;Why not just be Unix-shaped&lt;/h2&gt;
&lt;p&gt;A lot of Unix&apos;s process model comes bundled with assumptions that don&apos;t automatically make sense given everything two entries back about Horos&apos;s authority boundaries, or four entries back about wanting real fault isolation from the microkernel foundation up. If an application&apos;s identity, its execution container, and its underlying isolation domain are all just &amp;quot;whatever a process is,&amp;quot; a lot of the boundary discipline I&apos;ve been building elsewhere in this journal gets quietly undermined by the one layer that&apos;s supposed to run the software people actually touch.&lt;/p&gt;
&lt;h2 id=&quot;what-the-runtime-is-built-around-instead&quot;&gt;What the runtime is built around instead&lt;/h2&gt;
&lt;p&gt;Application identity is kept separate from container identity, which is kept separate from the underlying isolation-domain identity — three distinct things, on purpose, instead of one concept doing triple duty. Execution happens in bounded, reusable containers with real lifecycle management: they can be created, they can be reused, and — this part mattered more than I expected going in — a stale or leftover ownership claim from a previous run gets explicitly rejected rather than silently trusted. Containers get scrubbed and reused rather than assumed clean by default, with a quarantine path for anything that doesn&apos;t check out.&lt;/p&gt;
&lt;p&gt;The initial contract for what an application can actually do is a deliberately narrow ELF-loading contract — not a broad POSIX-compatible surface. A lot of POSIX-shaped conveniences are intentionally deferred rather than designed in from day one, because every one of those conveniences is also a piece of surface area that needs its own honest relationship with Horos&apos;s authority model, and I&apos;d rather add capability deliberately than inherit it by accident because it&apos;s how everyone else&apos;s application model happens to work.&lt;/p&gt;
&lt;h2 id=&quot;what-im-not-getting-into-here&quot;&gt;What I&apos;m not getting into here&lt;/h2&gt;
&lt;p&gt;Some of the specific implementation details underneath this runtime stay out of this public journal on purpose — not because they&apos;re embarrassing, but because &amp;quot;private technical material&amp;quot; is a real category I&apos;ve committed to respecting throughout this whole series, same as not naming the microkernel. What I want this entry to convey is the shape of the decision: applications are a first-class Ceylon concept, deliberately not just Unix processes borrowing the name, with identity, containment, and lifecycle treated as three separate, explicit things instead of one convenient blur.&lt;/p&gt;
&lt;p&gt;Next up: how you actually manage a machine built this way — one API, whether a person&apos;s clicking through a GUI or typing into a terminal.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Originally published on The Weekend Report: https://theweekendersproject.com/report/applications-without-pretending-were-unix&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Workshop</category><category>Application Runtime</category><category>Process Isolation</category><author>Mike</author></item><item><title>Ceylon Horos: The Lion at the Boundary</title><link>https://ceylonprojectng.com/journal/ceylon-horos-the-lion-at-the-boundary/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/ceylon-horos-the-lion-at-the-boundary/</guid><description>Horos is Ceylon&apos;s security umbrella — the conceptual boundary between identity, credentials, authentication, sessions, and authority. The name comes from an old Greek word for a limit or boundary marker.</description><pubDate>Sun, 06 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Horos is Ceylon&apos;s security umbrella — the conceptual boundary between identity, credentials, authentication, sessions, and authority. The name comes from an old Greek word for a limit or boundary marker.&lt;/p&gt;
&lt;p&gt;Every profile on Ceylon eventually needs to answer the same handful of questions: who is this, what are they allowed to prove, what does proving it actually grant them, and where exactly does that authority stop. I gave the umbrella concept covering all of that a name: Horos — the Ceylon security architecture.&lt;/p&gt;
&lt;h2 id=&quot;what-horos-actually-covers&quot;&gt;What Horos actually covers&lt;/h2&gt;
&lt;p&gt;Conceptually, Horos spans directory services, a credential authority, authentication, authorization, session authority, a secure-random and cryptographic substrate, recovery, and provisioning. That&apos;s a wide net on purpose, because the whole point of naming it as one umbrella instead of a pile of unrelated features is to force the boundaries between those pieces to be explicit instead of assumed.&lt;/p&gt;
&lt;h2 id=&quot;the-boundaries-which-are-the-actual-point&quot;&gt;The boundaries, which are the actual point&lt;/h2&gt;
&lt;p&gt;The thing Horos is really about is drawing clean lines: between identity and credentials, between credentials and authentication, between authentication and a session, between a session and authorization, between raw authority and how it&apos;s presented to a user, between raw entropy and the random output something actually consumes, and between a pre-authentication screen and an authenticated desktop. Every one of those is a place where a lot of systems quietly blur two things that should be separate, and blurring them is usually where the security bugs live later.&lt;/p&gt;
&lt;p&gt;I&apos;ll get into one of those boundaries in real, specific detail a couple of entries from now — the entropy one, and a bug that came out of a place I genuinely didn&apos;t expect. For this entry, I want to stay at the conceptual level, because the shape of the boundaries matters more than any one implementation detail sitting inside them.&lt;/p&gt;
&lt;h2 id=&quot;where-the-name-comes-from&quot;&gt;Where the name comes from&lt;/h2&gt;
&lt;p&gt;Horos is an old Greek term, used in Gnostic writing, roughly meaning a boundary or a limit — a marker of where one thing ends and another begins. I picked it because that&apos;s exactly what this umbrella is: not a single feature, but the discipline of knowing precisely where one kind of authority ends and the next one&apos;s responsibility begins. The lion-at-the-boundary framing is symbolism, not a literal mascot and not a statement about anything beyond the naming itself — I want to be clear about that so nobody reads more into it than a name chosen because it fit.&lt;/p&gt;
&lt;p&gt;With the security umbrella named and the boundaries drawn, the next real question is what actually runs inside those boundaries — and that turns out to require rethinking what an &amp;quot;application&amp;quot; even means on a platform that was never going to pretend to be Unix. That&apos;s next.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Originally published on The Weekend Report: https://theweekendersproject.com/report/ceylon-horos-the-lion-at-the-boundary&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Workshop</category><category>Horos</category><category>Security Architecture</category><category>Identity</category><author>Mike</author></item><item><title>From Nu-Day to Ceylon: Stop Building the Workstation and Build the Computer</title><link>https://ceylonprojectng.com/journal/from-nu-day-to-ceylon-stop-building-the-workstation-and-build-the-computer/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/from-nu-day-to-ceylon-stop-building-the-workstation-and-build-the-computer/</guid><description>The pivot: one shared platform, validated across multiple profiles — workstation, server, security appliance, media workstation, development — instead of one narrowly-scoped media application pretending to be small.</description><pubDate>Sun, 06 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The pivot: one shared platform, validated across multiple profiles — workstation, server, security appliance, media workstation, development — instead of one narrowly-scoped media application pretending to be small.&lt;/p&gt;
&lt;p&gt;If Nu-Day&apos;s problem was that a media workstation quietly needed to be a whole platform underneath it, the fix isn&apos;t to shrink the ambition back down to fit the old boundary. The fix is to stop pretending the boundary was ever the right shape, and build the platform on purpose instead of by accident. That&apos;s Project Ceylon.&lt;/p&gt;
&lt;h2 id=&quot;one-platform-multiple-profiles&quot;&gt;One platform, multiple profiles&lt;/h2&gt;
&lt;p&gt;The core idea is simple to say and a lot of work to actually mean: one shared underlying platform, with multiple validated profiles built on top of it. A Workstation profile. A Server profile. A security-appliance profile I&apos;ve been calling SBS internally. A Media Workstation profile — Nu-Day&apos;s original ambition, now honestly positioned as one profile among several instead of the whole project. A Development profile. And, further out, appliance and micro-device profiles once the shared foundation is solid enough to support them.&lt;/p&gt;
&lt;p&gt;The difference between this and what Nu-Day was trying to do isn&apos;t really technical — a lot of the actual pieces are the same pieces. The difference is honesty about what&apos;s shared infrastructure and what&apos;s profile-specific behavior on top of it. Nu-Day tried to be one profile&apos;s worth of ambition wearing a full platform&apos;s worth of requirements. Ceylon is explicit that the platform comes first, and profiles are validated configurations of it, not separate projects that happen to share a name.&lt;/p&gt;
&lt;h2 id=&quot;what-the-shared-platform-is-meant-to-include-eventually&quot;&gt;What the shared platform is meant to include, eventually&lt;/h2&gt;
&lt;p&gt;The long-term list of shared components includes a GUI layer (NuGUI), a terminal and management CLI, a system manager and file manager, authentication, networking, storage, service management, logging, a help system, and application launching. I want to be very direct about something: that is a list of intended shared components, not a list of finished ones. Some of them exist in early form. Some of them exist mostly as a clear design intent and not much implementation yet. I&apos;ll be specific about which is which as this journal goes on, and especially in the status-update entries — the whole point of writing this in public, as it happens, is that I don&apos;t get to quietly blur that line.&lt;/p&gt;
&lt;h2 id=&quot;why-this-is-the-right-container-this-time&quot;&gt;Why this is the right container this time&lt;/h2&gt;
&lt;p&gt;A profile-based platform means a media workstation can genuinely be a first-class citizen of Ceylon without every other use case having to be a media workstation too, and without the shared authentication, networking, and storage layers having to pretend they only exist to serve one profile&apos;s needs. That&apos;s the structural fix for Nu-Day&apos;s actual problem — not more discipline about scope, a container shaped correctly for what I was actually always trying to build.&lt;/p&gt;
&lt;p&gt;The next few entries get into the shared foundation itself, starting with the part that turned out to need the most careful thinking of anything so far: security and identity, under a name I&apos;ve been calling Horos.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Originally published on The Weekend Report: https://theweekendersproject.com/report/from-nu-day-to-ceylon-stop-building-the-workstation-and-build-the-computer&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Workshop</category><category>Platform Architecture</category><category>Profiles</category><author>Mike</author></item><item><title>Why Project Nu-Day Failed</title><link>https://ceylonprojectng.com/journal/why-project-nu-day-failed/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/why-project-nu-day-failed/</guid><description>&quot;Failed&quot; doesn&apos;t mean nothing worked. It means the project&apos;s boundaries stopped making sense. Building a real media workstation meant building an entire operating platform underneath it, whether I&apos;d scoped for that or not.</description><pubDate>Sun, 06 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&amp;quot;Failed&amp;quot; doesn&apos;t mean nothing worked. It means the project&apos;s boundaries stopped making sense. Building a real media workstation meant building an entire operating platform underneath it, whether I&apos;d scoped for that or not.&lt;/p&gt;
&lt;p&gt;I&apos;m not going to soften the title. Project Nu-Day failed. I want to say clearly what I mean by that, though, because &amp;quot;failed&amp;quot; is doing something more specific here than &amp;quot;nothing worked&amp;quot; — the last entry just spent its whole length showing you real, working evidence. This isn&apos;t that kind of failure.&lt;/p&gt;
&lt;h2 id=&quot;what-actually-went-wrong&quot;&gt;What actually went wrong&lt;/h2&gt;
&lt;p&gt;Nu-Day started as a media-first workstation concept — a Video Toaster and DigiPaint-inspired system, aimed at real desktop video and graphics work on modern hardware. That was the boundary. That was the product definition I&apos;d set for myself.&lt;/p&gt;
&lt;p&gt;The problem is that actually building the infrastructure a real media workstation needs — a real application runtime, a real service model, a filesystem that behaves correctly, a network stack, a graphics system, identity and security handling, management tooling, hardware abstraction, recovery behavior, drivers — is, without any exaggeration, building an entire operating platform. Not &amp;quot;a media app with some OS-flavored plumbing underneath it.&amp;quot; An actual platform, full stop.&lt;/p&gt;
&lt;p&gt;Once I was honestly looking at that list, the media-only product boundary stopped making sense as a boundary at all. It wasn&apos;t protecting scope anymore. It was just an arbitrary line I&apos;d drawn early, before I understood what I was actually committing to underneath it.&lt;/p&gt;
&lt;h2 id=&quot;the-temptation-and-why-i-didnt-just-keep-going&quot;&gt;The temptation, and why I didn&apos;t just keep going&lt;/h2&gt;
&lt;p&gt;The tempting move, and I felt the pull of it more than once, was to just keep piling features into Nu-Day as I hit each gap — add the piece I was missing, call the product boundary flexible, keep the name, keep the momentum. I don&apos;t think that would have been dishonest exactly, but it would have been building a platform while still calling it a media app, and eventually the mismatch between what the thing actually was and what I was telling myself it was would have caught up with me in a much more expensive way than it did here.&lt;/p&gt;
&lt;h2 id=&quot;the-actual-verdict&quot;&gt;The actual verdict&lt;/h2&gt;
&lt;p&gt;Nu-Day worked well enough to prove I was building the wrong-sized project.&lt;/p&gt;
&lt;p&gt;That&apos;s the honest summary. Not &amp;quot;Nu-Day was broken.&amp;quot; Not &amp;quot;the technical work was bad.&amp;quot; The technical work — the last entry&apos;s worth of it — was real. What was wrong was the shape of the container I was trying to pour a platform-sized project into. A media-first workstation and a general-purpose operating platform are not the same thing wearing different names, no matter how much I wanted them to be, and pretending otherwise wasn&apos;t going to get easier the longer I put off admitting it.&lt;/p&gt;
&lt;p&gt;So I stopped, and rethought the whole thing at the platform level instead of the application level. What came out of that rethink is Project Ceylon, and that&apos;s where this journal actually turns a corner — starting with the next entry.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Originally published on The Weekend Report: https://theweekendersproject.com/report/why-project-nu-day-failed&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Workshop</category><category>Project Nu-Day</category><category>Scope</category><category>Postmortem</category><author>Mike</author></item><item><title>Project Nu-Day: What Actually Worked</title><link>https://ceylonprojectng.com/journal/project-nu-day-what-actually-worked/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/project-nu-day-what-actually-worked/</guid><description>Before I get into why Nu-Day didn&apos;t survive, it deserves an honest accounting of what it actually proved. A working path is not the same thing as a finished subsystem, but it&apos;s not nothing either.</description><pubDate>Sun, 06 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Before I get into why Nu-Day didn&apos;t survive, it deserves an honest accounting of what it actually proved. A working path is not the same thing as a finished subsystem, but it&apos;s not nothing either.&lt;/p&gt;
&lt;p&gt;Before the next entry, where I get into why Project Nu-Day ultimately didn&apos;t survive in its original form, I want to give it a fair accounting of what it actually did prove. It would be easy to skip straight to the postmortem and let the failure overshadow real work that got done. That&apos;s not honest, and it&apos;s not the kind of history I want this journal to be.&lt;/p&gt;
&lt;h2 id=&quot;what-had-real-working-evidence-behind-it&quot;&gt;What had real, working evidence behind it&lt;/h2&gt;
&lt;p&gt;Inside the QEMU virtual reference machine, there was real, demonstrated evidence for boot, for storage, for logging, for clock handling, for basic display output, and for service lifecycle behavior — services starting, checking in, and in the cases where I&apos;d actually built it correctly, shutting down cleanly instead of just vanishing. That&apos;s not a small list. That&apos;s most of what a computer needs to be recognizably a computer, working, reproducibly, in the reference environment I&apos;d built specifically so I could trust what I was seeing.&lt;/p&gt;
&lt;h2 id=&quot;what-had-real-but-partial-work-behind-it&quot;&gt;What had real but partial work behind it&lt;/h2&gt;
&lt;p&gt;Framebuffer and presentation primitives had real work behind them, even after the Iris architecture reset — the reset changed the approach, it didn&apos;t erase everything that had been learned getting there. Early semantic work on what eventually became Nu-Iris. Input handling. Real boundaries around filesystem responsibilities. Early concepts for bulk data descriptors. Genuine IPv4, ARP, ICMP, and UDP networking work. NuBasic work on both a host development target and an early static target.&lt;/p&gt;
&lt;p&gt;None of that was finished. All of it was real — not mockups, not aspirational diagrams, actual working code exercised against the reference machine.&lt;/p&gt;
&lt;h2 id=&quot;the-distinction-that-matters&quot;&gt;The distinction that matters&lt;/h2&gt;
&lt;p&gt;A working path is not the same as a finished subsystem.&lt;/p&gt;
&lt;p&gt;I want to sit on that sentence for a second because it&apos;s going to matter a lot in the next entry. Having a working path through a problem — this boots, this responds, this proves the concept — is real and valuable. It is not the same claim as &amp;quot;this subsystem is done and production-ready.&amp;quot; Conflating those two things is exactly how projects quietly grow scope nobody signed up for, which, as it turns out, is precisely what happened here.&lt;/p&gt;
&lt;p&gt;So: credit where it&apos;s due. Nu-Day proved a lot. The reference-machine strategy from a few entries back paid off exactly the way I&apos;d hoped — I could trust what I was seeing, because the virtual hardware underneath wasn&apos;t lying to me. What it also did, gradually and without me noticing for longer than I&apos;d like to admit, was reveal the actual size of the thing I&apos;d agreed to build. That&apos;s next.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Originally published on The Weekend Report: https://theweekendersproject.com/report/project-nu-day-what-actually-worked&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Workshop</category><category>Project Nu-Day</category><category>QEMU</category><category>Status Update</category><author>Mike</author></item><item><title>What It Actually Takes to Drive an Intel Arc A770</title><link>https://ceylonprojectng.com/journal/what-it-actually-takes-to-drive-an-intel-arc-a770/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/what-it-actually-takes-to-drive-an-intel-arc-a770/</guid><description>Good documentation gets you past the product page. What&apos;s underneath is PCIe, MMIO, firmware, command submission, and a long staged plan instead of one heroic attempt at everything at once.</description><pubDate>Sun, 06 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Good documentation gets you past the product page. What&apos;s underneath is PCIe, MMIO, firmware, command submission, and a long staged plan instead of one heroic attempt at everything at once.&lt;/p&gt;
&lt;p&gt;Good documentation gets you past the product page. What&apos;s actually underneath — the part nobody puts in the marketing material — is PCIe enumeration, memory-mapped I/O, firmware handshakes, VRAM and GPU address space management, command submission and execution queues, synchronization, execution contexts, fault handling, reset behavior, CPU/GPU memory coherency, the media engines, and command validation so a bad or hostile submission can&apos;t take the whole GPU down with it. That&apos;s the actual job description, and none of it is optional if you want something more serious than &amp;quot;a triangle appeared once.&amp;quot;&lt;/p&gt;
&lt;h2 id=&quot;why-im-not-trying-to-do-all-of-that-at-once&quot;&gt;Why I&apos;m not trying to do all of that at once&lt;/h2&gt;
&lt;p&gt;I&apos;ve already got one very fresh scar from trying to skip ahead — that&apos;s the whole point of the Iris entry a few weeks back. So the plan for the Arc A770 work is explicitly staged, on purpose, in an order I chose specifically to avoid repeating that mistake.&lt;/p&gt;
&lt;h2 id=&quot;the-staged-plan&quot;&gt;The staged plan&lt;/h2&gt;
&lt;p&gt;First: discover and identify the device — get the platform to actually see and recognize the card as a real, present piece of hardware. Second: establish ownership — make sure exactly one part of the system has authority over it, no ambiguity, no two components racing to think they&apos;re in charge. Third: basic transfer and copy operations — move data to and from the card reliably before asking it to do anything clever. Fourth: controlled compute or render work — small, bounded, verifiable operations, not open-ended workloads. Fifth: measure and reassess before going further, honestly, based on what actually happened rather than what I hoped would happen. Sixth: media capabilities, later, once the foundation underneath them is solid. Seventh: display ownership, later still, and only if it turns out to actually be warranted rather than assumed.&lt;/p&gt;
&lt;p&gt;That ordering is deliberate. Every step depends on the one before it actually being solid, not just apparently working. That&apos;s the lesson from Iris, applied on purpose this time instead of learned the hard way a second time.&lt;/p&gt;
&lt;h2 id=&quot;a-practical-detail-headless-for-now&quot;&gt;A practical detail: headless, for now&lt;/h2&gt;
&lt;p&gt;The development machine&apos;s Intel UHD 630 integrated graphics can handle the actual display output while the Arc A770 operates headless — doing compute and, eventually, media work without also being asked to drive a monitor. That separation keeps the two concerns from tangling with each other while the A770 side is still young, and it means a mistake on the Arc side doesn&apos;t cost me my actual screen.&lt;/p&gt;
&lt;h2 id=&quot;what-this-entry-is-not-claiming&quot;&gt;What this entry is not claiming&lt;/h2&gt;
&lt;p&gt;I want to be really clear, because it would be easy for this entry to read as further along than it is: this is not a finished driver. This is not even a mostly-finished driver. This is the plan, the constraints, and the ordering I&apos;m committing to in public so that later entries can be measured honestly against it instead of me quietly redefining &amp;quot;done&amp;quot; after the fact. Progress on where this staged plan actually stands shows up in the status-update entries later in this journal, and I&apos;m going to keep those honest about exactly which of these seven steps are real and which are still aspirational.&lt;/p&gt;
&lt;p&gt;Next entry steps back from the GPU work entirely and takes stock of what Project Nu-Day, as a whole, actually managed to prove — because there&apos;s real evidence there, and it deserves an honest accounting before I get into why the project ultimately didn&apos;t survive in its original form.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Originally published on The Weekend Report: https://theweekendersproject.com/report/what-it-actually-takes-to-drive-an-intel-arc-a770&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Workshop</category><category>GPU Driver</category><category>PCIe</category><category>Intel Arc A770</category><author>Mike</author></item><item><title>Could an Intel Arc A770 Be the Modern Amiga Custom Chipset?</title><link>https://ceylonprojectng.com/journal/could-an-intel-arc-a770-be-the-modern-amiga-custom-chipset/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/could-an-intel-arc-a770-be-the-modern-amiga-custom-chipset/</guid><description>The Arc A770 isn&apos;t a literal replacement for Agnus, Denise, and Paula. But one of the actual deciding factors in choosing it had nothing to do with raw performance: documentation is a hardware feature.</description><pubDate>Sun, 06 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The Arc A770 isn&apos;t a literal replacement for Agnus, Denise, and Paula. But one of the actual deciding factors in choosing it had nothing to do with raw performance: documentation is a hardware feature.&lt;/p&gt;
&lt;p&gt;Let me say the thesis plainly, because it&apos;s easy to misread this entry as &amp;quot;look how powerful this GPU is&amp;quot; and that is genuinely not the point. The Intel Arc A770 is not a literal replacement for Agnus, Denise, and Paula. Nobody sane is claiming a discrete GPU from 2022 is a spiritual reincarnation of an Amiga custom chip. What I&apos;m actually interested in is the philosophy those chips represented — specialized hardware doing specialized work, off the main CPU, as a first-class part of the machine&apos;s identity — and whether a modern GPU could fill that same architectural role.&lt;/p&gt;
&lt;p&gt;The specs, briefly, because they matter but they&apos;re not the whole story&lt;/p&gt;
&lt;p&gt;16 GB of memory. Xe-HPG architecture. Real render and compute resources, dedicated media engines for video encode and decode, XMX support for matrix-heavy workloads. On paper, plenty of horsepower to be a serious specialized-hardware partner to a general-purpose CPU, in the same structural role Agnus and Denise played decades ago even though the actual silicon has nothing else in common with them.&lt;/p&gt;
&lt;h2 id=&quot;the-deciding-factor-that-isnt-performance&quot;&gt;The deciding factor that isn&apos;t performance&lt;/h2&gt;
&lt;p&gt;For this project, documentation is a hardware feature.&lt;/p&gt;
&lt;p&gt;Here&apos;s the thing that actually tipped the decision, and it surprised me a little how much it mattered once I sat with it: Intel publishes real, usable, developer-facing documentation about how this hardware actually works. Xe-HPG architecture documentation. Programming and optimization guides. Level Zero, as a genuinely open low-level API. Compute Runtime and the Media Driver, both open source, both on GitHub, both things I could go read right now if I wanted to (and I did want to, so I checked — they&apos;re real, they&apos;re maintained, and I&apos;ve linked them below).&lt;/p&gt;
&lt;p&gt;A GPU I can&apos;t get real information about is a GPU I&apos;m reverse-engineering from scratch, no matter how good its silicon is. For a project already built on the discipline of &amp;quot;study the historical material to understand the architecture, don&apos;t just cargo-cult it,&amp;quot; a vendor that hands you the architecture documentation instead of making you guess is worth an enormous amount. It&apos;s the difference between researching and reverse-engineering, and I already knew from the Video Toaster work which one of those I wanted to be doing.&lt;/p&gt;
&lt;h2 id=&quot;what-this-is-and-isnt&quot;&gt;What this is and isn&apos;t&lt;/h2&gt;
&lt;p&gt;This is not me claiming I&apos;m about to have a finished, production-quality driver for this card. That&apos;s a much later entry, and even that later entry is going to have some very honest limits on what&apos;s actually done. This entry is just the decision: why this card, and why the documentation mattered as much as the silicon did.&lt;/p&gt;
&lt;p&gt;Intel did not publish a manual called &amp;quot;How Mike Can Write an A770 Driver for His Weird Operating System.&amp;quot; Unfortunately.&lt;/p&gt;
&lt;p&gt;So no, having good documentation doesn&apos;t mean the work is easy. It means the work is possible, and honestly, on a project like this, that&apos;s most of what I need from a hardware vendor. The existing open Linux driver work and the open compute/media runtimes aren&apos;t things I&apos;m going to blindly import — they&apos;re research and reference material, same rule as the Video Toaster source, same rule as everything else in this journal. Understand why it works, then build my own version for my own foundation.&lt;/p&gt;
&lt;p&gt;Sources &amp;amp; Research: Intel Xe-HPG Architecture (introduction), Intel Compute Runtime (Level Zero / OpenCL), Intel Media Driver (VAAPI).&lt;/p&gt;
&lt;p&gt;Next entry gets into what actually driving this thing looks like once you get past the product page and into PCIe, MMIO, command submission, and all the unglamorous plumbing a GPU driver actually is.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Originally published on The Weekend Report: https://theweekendersproject.com/report/could-an-intel-arc-a770-be-the-modern-amiga-custom-chipset&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Workshop</category><category>Intel Arc A770</category><category>GPU</category><category>Xe-HPG</category><author>Mike</author></item><item><title>Why a Modern Amiga Needed a Secure Multicore Microkernel</title><link>https://ceylonprojectng.com/journal/why-a-modern-amiga-needed-a-secure-multicore-microkernel/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/why-a-modern-amiga-needed-a-secure-multicore-microkernel/</guid><description>The display failure was a symptom. The actual disease was an architecture with no real boundaries between components. The fix was moving to a security-certified microkernel foundation.</description><pubDate>Sun, 06 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The display failure was a symptom. The actual disease was an architecture with no real boundaries between components. The fix was moving to a security-certified microkernel foundation.&lt;/p&gt;
&lt;p&gt;The display math failing wasn&apos;t really a display problem. It was a symptom of something bigger: the early architecture didn&apos;t have real boundaries between its pieces. When one part misbehaved, or scaled wrong, or made a bad assumption, there was nothing structurally stopping that from becoming everyone else&apos;s problem too. That&apos;s fine for a demo. It is not fine for anything I&apos;d want to call a real platform.&lt;/p&gt;
&lt;h2 id=&quot;what-1985-could-get-away-with-that-2026-cant&quot;&gt;What 1985 could get away with that 2026 can&apos;t&lt;/h2&gt;
&lt;p&gt;The Amiga&apos;s security model — to the extent &amp;quot;model&amp;quot; is even the right word for it — assumed one person at the keyboard, running software that person chose to run, on a machine that was never going to sit exposed on a network being poked at by things nobody invited. That was a completely reasonable assumption in 1985. It is not a reasonable assumption for a long-lived, networked, modern machine in 2026, one that&apos;s going to run software I didn&apos;t personally audit line by line, handle data I don&apos;t fully trust, and stay running for a long time without a reboot fixing whatever&apos;s wrong with it.&lt;/p&gt;
&lt;p&gt;A modern continuation of this machine&apos;s philosophy needed real fault isolation. Real authority boundaries — not &amp;quot;this program probably won&apos;t do anything bad,&amp;quot; but structural guarantees about what a given piece of code is and isn&apos;t allowed to touch. The ability for one service to crash, misbehave, or get compromised without taking the rest of the machine down with it. And underneath all of that, multicore support done properly, because &amp;quot;properly&amp;quot; was never going to mean &amp;quot;one core doing everything while the others watch.&amp;quot;&lt;/p&gt;
&lt;h2 id=&quot;the-foundation-and-what-i-will-and-wont-say-about-it&quot;&gt;The foundation, and what I will and won&apos;t say about it&lt;/h2&gt;
&lt;p&gt;This is the point where I need to be direct about something I&apos;m keeping deliberately vague, on purpose, permanently: I&apos;m not going to name the specific microkernel underneath this project. Publicly, this runs on a security-certified microkernel foundation, and that&apos;s the extent of what I&apos;ll say about the specific technology choice in this journal, now or later. That&apos;s not me being coy for dramatic effect — it&apos;s a boundary I&apos;ve set for how I talk about this project publicly, and I&apos;m going to hold it consistently across every entry in this series, not just this one.&lt;/p&gt;
&lt;p&gt;What I will talk about is the reasoning, because the reasoning is the actually interesting part anyway. A security-certified microkernel foundation gives you capability-style authority instead of ambient trust — a piece of code can only do what it&apos;s been explicitly handed the authority to do, not whatever the OS happens to allow by default. It gives you services that can restart independently instead of taking the whole machine down with them when they fail. It gives you a foundation that was actually built and verified with the assumption that hostile or buggy code is going to show up eventually, instead of a foundation that assumes good faith from everything running on it.&lt;/p&gt;
&lt;h2 id=&quot;what-this-actually-changes&quot;&gt;What this actually changes&lt;/h2&gt;
&lt;p&gt;This is the point where &amp;quot;a modern Amiga&amp;quot; stopped being a slogan and started being an actual architectural commitment. The custom-hardware-as-division-of-labor idea from the original machine doesn&apos;t go away — it gets stronger, because now each piece of specialized work can live in its own properly isolated service instead of all sharing one undifferentiated address space and hoping for the best. Fault isolation and the Amiga&apos;s original &amp;quot;let the right hardware do the right job&amp;quot; philosophy turned out to reinforce each other instead of fighting each other, which I honestly wasn&apos;t sure would be true until I was well into building it.&lt;/p&gt;
&lt;p&gt;This decision is still standing today. It&apos;s the actual foundation everything downstream of this entry gets built on. Next up: the hardware side of the equation, and a decision that turned out to hinge less on raw horsepower than I expected, and a lot more on something Intel does that a lot of vendors don&apos;t — they actually tell you how their hardware works.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Originally published on The Weekend Report: https://theweekendersproject.com/report/why-a-modern-amiga-needed-a-secure-multicore-microkernel&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Workshop</category><category>Microkernel</category><category>Security Architecture</category><category>Multicore</category><author>Mike</author></item><item><title>Well, Hell: The Iris Math Doesn&apos;t Work</title><link>https://ceylonprojectng.com/journal/well-hell-the-iris-math-doesnt-work/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/well-hell-the-iris-math-doesnt-work/</guid><description>Pixels appearing on screen is not the same thing as an architecture that scales to real high-resolution video editing. I found that out the hard way, and I was irritated about it for the rest of the night.</description><pubDate>Sun, 06 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Pixels appearing on screen is not the same thing as an architecture that scales to real high-resolution video editing. I found that out the hard way, and I was irritated about it for the rest of the night.&lt;/p&gt;
&lt;p&gt;I want to get something out of the way before I write the rest of this entry: I was irritated. Not &amp;quot;disappointed, but it&apos;s all part of the process&amp;quot; irritated. Actually irritated. The kind where you stare at a terminal for longer than is useful because some part of you is hoping the numbers will change if you just keep looking at them.&lt;/p&gt;
&lt;p&gt;Here&apos;s what happened. Early display work — the stuff that eventually got the working name Nu-Iris — got to the point where pixels were showing up on screen. Real pixels, from real framebuffer writes, through the pipeline I&apos;d built. And for about a day, that felt like a genuine win.&lt;/p&gt;
&lt;p&gt;Pixels appearing is not the same thing as &amp;quot;this works&amp;quot;&lt;/p&gt;
&lt;p&gt;Then I actually sat down and did the math on what the intended display path would need to sustain for the kind of high-resolution video editing this whole project was supposed to be aimed at — remember, this traces back to the Video Toaster, to DigiPaint, to real media work, not just &amp;quot;can we draw a window.&amp;quot;&lt;/p&gt;
&lt;p&gt;I was irritated. The math showed the intended display path would not scale to the kind of high-resolution video editing being targeted.&lt;/p&gt;
&lt;p&gt;I want to be careful here about a promise I made to myself for this journal: I&apos;m not going to invent specific numbers I can&apos;t actually stand behind just to make this section feel more dramatic or more technical. The honest version is this: the bandwidth and resource-scaling pressure of real high-resolution video work, run through the assumptions the early display architecture had baked in, did not close. Not &amp;quot;tight, but workable.&amp;quot; Did not close. The gap wasn&apos;t a rounding error I could optimize away with a better inner loop — it was structural, baked into decisions I&apos;d made early about how the pipeline moved data around.&lt;/p&gt;
&lt;h2 id=&quot;what-assumptions-were-actually-being-tested&quot;&gt;What assumptions were actually being tested&lt;/h2&gt;
&lt;p&gt;The core assumption under the microscope was something like: if the basic framebuffer path works for getting pixels on screen at all, then scaling it up to real editing workloads is a matter of degree, not a matter of kind. That assumption is exactly the kind of thing that feels true right up until you actually run the numbers, and then it very much does not feel true anymore.&lt;/p&gt;
&lt;p&gt;&amp;quot;Pixels appeared&amp;quot; answers the question &amp;quot;does this pipeline function at all.&amp;quot; It does not answer the question &amp;quot;does this work for a real high-resolution media workstation,&amp;quot; and those are genuinely different questions wearing the same demo. I&apos;d let the first one quietly stand in for the second one for longer than I should have, mostly because the first one felt so good to finally see working.&lt;/p&gt;
&lt;h2 id=&quot;why-the-architecture-had-to-be-reconsidered&quot;&gt;Why the architecture had to be reconsidered&lt;/h2&gt;
&lt;p&gt;Once the math didn&apos;t close, there wasn&apos;t a patch available — I couldn&apos;t just tune the existing pipeline harder. The scaling problem was upstream of any individual optimization I could make downstream. That meant going back to the display and media architecture itself, which is a genuinely bad feeling a few months into a project, when you&apos;ve already convinced yourself the hard part was behind you.&lt;/p&gt;
&lt;p&gt;This is also, in hindsight, the same lesson DigiPaint&apos;s painting engine had already handed me a few entries back, and I hadn&apos;t fully absorbed it yet: the hard constraint in real-time media work is almost never the math you&apos;re doing to a single pixel, it&apos;s how much data you&apos;re moving and how often. I&apos;d read that lesson. I hadn&apos;t yet felt it in my own broken numbers. Now I had.&lt;/p&gt;
&lt;p&gt;I&apos;d stared at it long enough for one night. I think we had enchiladas. The enchiladas worked, which at that particular moment felt like it should count for something.&lt;/p&gt;
&lt;p&gt;What came out of this, eventually, was a much more serious conversation about isolation, resource ownership, and — the thing that actually ties directly to the next entry — why a modern version of this machine needed real service boundaries and real fault isolation from the ground up, not bolted on after the fact once something like this went wrong in production instead of on my own desk.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Originally published on The Weekend Report: https://theweekendersproject.com/report/well-hell-the-iris-math-doesnt-work&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Workshop</category><category>Display Architecture</category><category>Debugging</category><category>Nu-Iris</category><author>Mike</author></item><item><title>Why I Built the Computer in QEMU Before I Built the Computer</title><link>https://ceylonprojectng.com/journal/why-i-built-the-computer-in-qemu-before-i-built-the-computer/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/why-i-built-the-computer-in-qemu-before-i-built-the-computer/</guid><description>QEMU was never the destination. It was the laboratory — a reference machine where I could isolate architecture mistakes from hardware-driver mistakes before either one had a chance to hide behind the other.</description><pubDate>Sun, 06 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;QEMU was never the destination. It was the laboratory — a reference machine where I could isolate architecture mistakes from hardware-driver mistakes before either one had a chance to hide behind the other.&lt;/p&gt;
&lt;p&gt;QEMU was never the destination. I want to say that as plainly as I can, because it&apos;s easy to read &amp;quot;I built it in a VM first&amp;quot; and assume that&apos;s a placeholder step on the way to the real thing, like scaffolding you tear down once the building&apos;s up. That&apos;s not what it was. QEMU was the laboratory, and a laboratory is a permanent, useful thing, not a placeholder.&lt;/p&gt;
&lt;h2 id=&quot;the-actual-problem-it-solves&quot;&gt;The actual problem it solves&lt;/h2&gt;
&lt;p&gt;Here&apos;s the failure mode I was trying to avoid: you&apos;re building a new system, and something doesn&apos;t work. Is it because your architecture is wrong, or because you&apos;re fighting a driver for a specific piece of real hardware that has its own quirks, its own undocumented behavior, its own timing weirdness? On bare metal, those two categories of bug look identical from the outside. They both just look like &amp;quot;it doesn&apos;t work.&amp;quot; And when they look identical, you end up debugging the wrong layer half the time, because you genuinely can&apos;t tell which one you&apos;re looking at.&lt;/p&gt;
&lt;p&gt;A virtual reference machine breaks that tie. QEMU&apos;s virtual hardware is well-documented, consistent, and — critically — the same every single time you boot it. If something&apos;s broken in QEMU, it is overwhelmingly likely to be my architecture, my IPC design, my service boundaries, because the virtual hardware underneath isn&apos;t the kind of thing that has mystery quirks nobody&apos;s written down.&lt;/p&gt;
&lt;h2 id=&quot;what-actually-got-built-and-tested-this-way&quot;&gt;What actually got built and tested this way&lt;/h2&gt;
&lt;p&gt;Storage. Networking. Display. Interrupt handling. The lifecycle of services starting up, checking in, and (when I did it right) getting torn down cleanly. DMA-like data paths between components. All of that got built and exercised against QEMU&apos;s virtual hardware first, where I could trust that any weirdness I saw was a weirdness I&apos;d introduced, not a weirdness the silicon introduced.&lt;/p&gt;
&lt;p&gt;Reproducibility was a big part of the appeal too, and I don&apos;t think I appreciated how much until I had it. Every boot starts from the same state. Every bug is, in principle, reproducible by just booting again with the same inputs. That&apos;s a genuinely rare property to have handed to you for free, and bare metal does not hand it to you for free — bare metal hands you thermal variance, firmware quirks, and hardware that ages differently than the hardware on someone else&apos;s desk.&lt;/p&gt;
&lt;h2 id=&quot;the-plan-for-what-comes-after&quot;&gt;The plan for what comes after&lt;/h2&gt;
&lt;p&gt;The eventual plan — and I want to flag this as a plan, not a thing that&apos;s done, because overclaiming that part would be exactly the kind of thing I&apos;m trying not to do in this journal — is to use everything proven in the virtual reference machine as a template and a comparison point once real hardware enters the picture. If bare metal behaves differently than the virtual reference did, that&apos;s a signal, not a surprise to just shrug at. It tells you where the real hardware&apos;s assumptions diverge from the clean ones, and that&apos;s exactly the information you want before you start blaming your own architecture for a problem the silicon caused.&lt;/p&gt;
&lt;p&gt;This decision held up well. It&apos;s still how I work today. What didn&apos;t hold up nearly as well was the early display and media architecture I built on top of it — and that one&apos;s next, because it&apos;s the first real gut-punch of this whole project, and I&apos;m not going to sand the edges off it.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Originally published on The Weekend Report: https://theweekendersproject.com/report/why-i-built-the-computer-in-qemu-before-i-built-the-computer&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Workshop</category><category>QEMU</category><category>Virtual Machines</category><category>Systems Design</category><author>Mike</author></item><item><title>Project Nu-Day: Okay, Y&apos;all, Let&apos;s Actually Build Something</title><link>https://ceylonprojectng.com/journal/project-nu-day-lets-actually-build-something/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/project-nu-day-lets-actually-build-something/</guid><description>All that research had to turn into something eventually. Project Nu-Day was the first real attempt: a modern media workstation, built for x86-64, inspired by the Toaster and DigiPaint but not trying to be either.</description><pubDate>Sun, 06 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;All that research had to turn into something eventually. Project Nu-Day was the first real attempt: a modern media workstation, built for x86-64, inspired by the Toaster and DigiPaint but not trying to be either.&lt;/p&gt;
&lt;p&gt;At some point, research has to turn into a project, or it&apos;s just a very well-organized way of reading old documentation forever. So: Project Nu-Day. That was the name for the first real attempt to build something out of everything I&apos;d been chewing on — the Amiga&apos;s good ideas, the Video Toaster&apos;s approach to real-time media, DigiPaint&apos;s painting engine — aimed at modern, ordinary, commodity x86-64 hardware.&lt;/p&gt;
&lt;h2 id=&quot;what-nu-day-was-actually-trying-to-be&quot;&gt;What Nu-Day was actually trying to be&lt;/h2&gt;
&lt;p&gt;The goal was a media workstation. Not an operating system for its own sake — a machine built around the idea that graphics, video, and painting-style tools deserved to be first-class citizens of the platform, the same way they were on the Amiga, but running on hardware you could actually buy in 2026 instead of hardware you&apos;d have to find on an auction site.&lt;/p&gt;
&lt;p&gt;I was explicit with myself from the start that this was not an emulator project. I wasn&apos;t trying to run Amiga binaries. I was trying to build a new thing that took the same philosophy — specialized hardware doing specialized work, multimedia as identity, responsiveness that a person can feel — and applied it fresh, on hardware nobody in 1985 had any reason to design for.&lt;/p&gt;
&lt;h2 id=&quot;virtual-first-on-purpose&quot;&gt;Virtual first, on purpose&lt;/h2&gt;
&lt;p&gt;From day one I decided this was going to be developed virtual-first — inside QEMU, not on bare metal. I&apos;ll spend the entire next entry on why that decision mattered as much as it did, because it&apos;s not just &amp;quot;easier for development,&amp;quot; it&apos;s a real architectural strategy. For now: I wanted a laboratory before I wanted a machine.&lt;/p&gt;
&lt;h2 id=&quot;early-hardware-abstraction-thinking&quot;&gt;Early hardware abstraction thinking&lt;/h2&gt;
&lt;p&gt;Even at this early stage, I knew I didn&apos;t want the media/graphics ambitions hard-wired to one specific piece of hardware. The whole point of &amp;quot;specialized hardware doing specialized work&amp;quot; only holds up if the software layer knows how to talk to specialized hardware in general, not just one card I happened to own. That idea was still pretty vague at this point — more of a discipline I was trying to hold myself to than an actual abstraction layer with real boundaries — but it&apos;s the seed that eventually turns into a much more serious conversation once GPU work enters the picture.&lt;/p&gt;
&lt;p&gt;Nu-Day was ambitious for what it was, and I want to be honest that at this point I did not yet see the shape of the problem I was actually walking into. That comes later, and it comes from a direction I did not expect: not from the media ambitions failing, but from the media ambitions succeeding just enough to reveal how much operating system I was quietly agreeing to build underneath them.&lt;/p&gt;
&lt;p&gt;Next up: why the very first real infrastructure decision was to build the computer inside QEMU before building anything resembling the computer itself.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Originally published on The Weekend Report: https://theweekendersproject.com/report/project-nu-day-lets-actually-build-something&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Workshop</category><category>Project Nu-Day</category><category>x86-64</category><category>Media Workstation</category><author>Mike</author></item><item><title>Old Source Code Is Useful. Copying It Isn&apos;t the Point.</title><link>https://ceylonprojectng.com/journal/old-source-code-is-useful-copying-it-isnt-the-point/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/old-source-code-is-useful-copying-it-isnt-the-point/</guid><description>Having thirty-year-old source code available doesn&apos;t mean the job is to transcribe it. Here&apos;s how I actually use historical material as research instead of a shortcut.</description><pubDate>Sun, 06 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Having thirty-year-old source code available doesn&apos;t mean the job is to transcribe it. Here&apos;s how I actually use historical material as research instead of a shortcut.&lt;/p&gt;
&lt;p&gt;I said in the last entry I&apos;d come back to this, because it&apos;s the kind of thing that&apos;s easy to say correctly in one sentence and then get wrong in practice if you&apos;re not paying attention. So: having the Video Toaster&apos;s source available doesn&apos;t mean the job is &amp;quot;go copy the good parts into a modern language.&amp;quot; That&apos;s not research, that&apos;s just slow transcription with extra steps, and it would also potentially be a licensing mess I have no interest in stepping into.&lt;/p&gt;
&lt;h2 id=&quot;what-im-actually-doing-with-it&quot;&gt;What I&apos;m actually doing with it&lt;/h2&gt;
&lt;p&gt;When I read old source — Toaster code, DigiPaint&apos;s painting engine, whatever else turns up as this project goes on — I&apos;m reading it for behavior and architecture, not for lines to lift. What data structure did they reach for when they needed to composite video in real time on hardware with no headroom to spare? What order did they do operations in, and why that order and not another one? Where did they put the boundary between &amp;quot;the hardware does this&amp;quot; and &amp;quot;software does this,&amp;quot; and does that boundary still make sense on completely different hardware forty years later?&lt;/p&gt;
&lt;p&gt;Those are architectural questions. The answers to those questions are useful to me. The literal C (or 68k assembly, in some of the older stuff) that implements those answers on a machine that hasn&apos;t been manufactured in decades is a lot less useful, because it&apos;s solving problems — memory pressure, clock speed, a specific bus architecture — that mostly don&apos;t exist on the hardware I&apos;m targeting anymore. Studying WHY something worked survives the trip to modern hardware. WHAT LINE OF CODE did it survives a lot less well.&lt;/p&gt;
&lt;h2 id=&quot;provenance-matters-and-clean-room-separation-isnt-paranoia&quot;&gt;Provenance matters, and clean-room separation isn&apos;t paranoia&lt;/h2&gt;
&lt;p&gt;I try to keep a clean separation between &amp;quot;I read this and now I understand the problem better&amp;quot; and &amp;quot;I am now writing code.&amp;quot; That&apos;s not me being precious about it — it&apos;s just good practice any time you&apos;re working with someone else&apos;s historical material, licensed release or not. If I understand a design decision well enough to reimplement it from a description of the problem, without the original code open in another window while I type, that&apos;s a real, defensible clean-room boundary. If I&apos;m translating line by line, that&apos;s not research anymore, that&apos;s a port, and it comes with a completely different set of obligations I&apos;m not trying to take on here.&lt;/p&gt;
&lt;p&gt;This matters doubly because NewTek&apos;s release explicitly comes with usage terms, and even generous ones deserve to be respected on their own terms rather than stretched to cover something the release wasn&apos;t meant for.&lt;/p&gt;
&lt;h2 id=&quot;a-concrete-example-digipaint&quot;&gt;A concrete example: DigiPaint&lt;/h2&gt;
&lt;p&gt;DigiPaint&apos;s painting engine had to do real-time brush rendering and color manipulation on hardware that measured its memory in kilobytes it could actually spare for the framebuffer. Reading how they approached that taught me something about where the actual hard constraints in a painting tool live — it&apos;s rarely the brush math itself, it&apos;s how aggressively you can avoid touching memory you don&apos;t have to touch. That&apos;s a genuinely portable lesson. It shows up again in completely different form when I get to display architecture a few entries from now, and — spoiler for an entry I haven&apos;t written yet — getting that lesson wrong is a real part of why an early display approach didn&apos;t survive contact with actual requirements.&lt;/p&gt;
&lt;p&gt;So: old source code, useful. Old source code as a find-and-replace target for a modern rewrite, not useful, and honestly a little bit of a trap. Next up, the project this research actually turned into: Project Nu-Day.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Originally published on The Weekend Report: https://theweekendersproject.com/report/old-source-code-is-useful-copying-it-isnt-the-point&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Workshop</category><category>Video Toaster</category><category>Reverse Engineering</category><category>Clean Room</category><author>Mike</author></item><item><title>Then I Found the Video Toaster Source Code</title><link>https://ceylonprojectng.com/journal/then-i-found-the-video-toaster-source-code/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/then-i-found-the-video-toaster-source-code/</guid><description>NewTek released the Video Toaster&apos;s source publicly years ago. That&apos;s where the real research thread started — not the Amiga&apos;s OS, but the thing that made the Amiga famous in the first place.</description><pubDate>Sun, 06 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;NewTek released the Video Toaster&apos;s source publicly years ago. That&apos;s where the real research thread started — not the Amiga&apos;s OS, but the thing that made the Amiga famous in the first place.&lt;/p&gt;
&lt;p&gt;If you want to know what the Amiga was actually good at — not what it was capable of in theory, what it was famous for, what put it on television sets — the answer is the Video Toaster. NewTek built a desktop video production system on top of the Amiga that could do real broadcast switching, graphics, and character generation on consumer hardware, at a fraction of what dedicated video hardware cost at the time. That&apos;s not a footnote in the Amiga&apos;s history. For a lot of the outside world, that WAS the Amiga&apos;s history.&lt;/p&gt;
&lt;p&gt;So when I started asking what a modern continuation of this machine should be able to do, the Toaster was the obvious first research thread. Not the OS internals — the actual flagship application people bought the machine to run.&lt;/p&gt;
&lt;p&gt;[A demonstration video of the original Video Toaster running live was embedded here in the original post.]&lt;/p&gt;
&lt;h2 id=&quot;finding-it-was-still-there&quot;&gt;Finding it was still there&lt;/h2&gt;
&lt;p&gt;Here&apos;s the thing that got me excited enough to stay up later than I should have: NewTek actually released the Video Toaster source publicly a while back, and it&apos;s still sitting out there, maintained by a small community, at discreetfx.com. Full source. Developer documentation. The Flyer. ToasterCG. DigiPaint. All of it, or at least a meaningful chunk of it, available for anyone willing to go dig.&lt;/p&gt;
&lt;p&gt;I want to be careful here, because it would be really easy to overstate what this means. This isn&apos;t a green light to lift code. I&apos;ll get into exactly how I think about that boundary in the next entry, because it deserves its own space and it&apos;s more subtle than &amp;quot;copy good, don&apos;t copy bad.&amp;quot; For this entry, I just want to talk about what&apos;s actually there and why it mattered to me.&lt;/p&gt;
&lt;h2 id=&quot;what-became-researchable&quot;&gt;What became researchable&lt;/h2&gt;
&lt;p&gt;Desktop video switching, in source form, from a company that was actually shipping it commercially. Graphics and character-generation code from ToasterCG, which — for the era — was doing professional-quality titling and scrolls on hardware that cost a fraction of the broadcast equipment it was replacing. DigiPaint&apos;s painting engine. Developer documentation that explains not just what the code does but why it was built that way, which is honestly the more valuable half.&lt;/p&gt;
&lt;p&gt;That&apos;s a real body of research material about how a small team in the late &apos;80s and early &apos;90s solved genuinely hard real-time media problems on genuinely limited hardware. Reading it doesn&apos;t hand you a modern architecture. It hands you a set of real, tested decisions about where the hard parts of a media system actually are, made by people who had to ship something that worked on live television.&lt;/p&gt;
&lt;h2 id=&quot;a-note-on-link-rot&quot;&gt;A note on link rot&lt;/h2&gt;
&lt;p&gt;I checked every one of these links before publishing this, because half the pain of pointing people at 30-year-old software history is that the links are usually dead by the time anyone follows them. Most of what&apos;s below is still live. One document I originally wanted to cite — a PDF that was supposed to be the NewTek Video Toaster Developer&apos;s Handbook — turned out, when I actually opened it, to be a scanned document from a printer with nothing to do with the Toaster. So it&apos;s not in the list below. I&apos;d rather tell you a source didn&apos;t pan out than link you to something that looks official and isn&apos;t.&lt;/p&gt;
&lt;p&gt;Sources &amp;amp; Research: Open Video Toaster — project history and downloads (DiscreetFX); Amiga Video Toaster Complete archive; DigiPaint — source and binary download; Flyer — download; ToasterCG — download.&lt;/p&gt;
&lt;p&gt;I&apos;m not going to reproduce any of that source code here — that&apos;s not what this journal is for, and it&apos;s not how I want to treat someone else&apos;s work. What it&apos;s for is the next entry: how I actually think about using historical source as research without just becoming a very slow, very legally questionable copy-paste operation.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Originally published on The Weekend Report: https://theweekendersproject.com/report/then-i-found-the-video-toaster-source-code&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Workshop</category><category>Video Toaster</category><category>NewTek</category><category>Retrocomputing</category><author>Mike</author></item><item><title>What Was Actually Worth Saving From the Amiga?</title><link>https://ceylonprojectng.com/journal/what-was-actually-worth-saving-from-the-amiga/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/what-was-actually-worth-saving-from-the-amiga/</guid><description>Before building anything, I had to separate what I actually loved about the Amiga from what I just remembered fondly. Those turned out to be two different lists.</description><pubDate>Sun, 06 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Before building anything, I had to separate what I actually loved about the Amiga from what I just remembered fondly. Those turned out to be two different lists.&lt;/p&gt;
&lt;p&gt;Before I could design anything, I had to do something a little uncomfortable: go through everything I remembered loving about the Amiga and sort it into two piles. Pile one: things that were genuinely good architecture. Pile two: things I just remembered fondly because I was younger and everything was more exciting back then.&lt;/p&gt;
&lt;p&gt;Nostalgia is a hell of a filter, and it lies to you in a very specific way — it tells you the whole package was great, when usually what was great was three or four ideas wearing a costume made of 1985 hardware limitations.&lt;/p&gt;
&lt;h2 id=&quot;what-earned-its-place&quot;&gt;What earned its place&lt;/h2&gt;
&lt;p&gt;Multitasking that actually felt responsive was the big one. Not multitasking as a checkbox feature — multitasking that a person sitting at the keyboard could feel. Things kept moving while other things were happening. That&apos;s a real, durable design goal, and it&apos;s one a lot of &amp;quot;modern&amp;quot; systems still get wrong in their own ways.&lt;/p&gt;
&lt;p&gt;Custom hardware as a division of labor was the second one. Agnus, Denise, Paula — I&apos;m not defending the specific chips, I&apos;m defending the idea that they represented: don&apos;t make one general-purpose processor do everything. Let dedicated hardware do the parts it&apos;s actually good at, and let it do that work without babysitting from the CPU. DMA wasn&apos;t just a technical trick, it was a philosophy about where work belongs.&lt;/p&gt;
&lt;p&gt;Multimedia as a first-class capability, not a bolt-on. Coherent system integration — the sense that the OS and the hardware were designed by people talking to each other, not two teams that never met. Those all survive the trip to 2026 fine. They&apos;re not nostalgia, they&apos;re just good engineering that happened to ship in 1985.&lt;/p&gt;
&lt;h2 id=&quot;what-doesnt-automatically-survive&quot;&gt;What doesn&apos;t automatically survive&lt;/h2&gt;
&lt;p&gt;Here&apos;s the harder pile. The old address spaces don&apos;t survive — there&apos;s no principled reason to drag 24-bit addressing into 2026 out of loyalty. The exact chipset register layout doesn&apos;t survive; that&apos;s an implementation detail of hardware that hasn&apos;t been manufactured in decades. CPU-specific assumptions baked into the OS don&apos;t survive. Old memory constraints don&apos;t survive — those were constraints, not choices, and constraints from forty years ago don&apos;t deserve a vote in 2026&apos;s design.&lt;/p&gt;
&lt;p&gt;And the big one, the one I keep coming back to: the trusted-single-user-at-the-keyboard assumption does not survive. The Amiga&apos;s security model, to the extent it had one, assumed the person touching the machine was the only person who&apos;d ever touch it, and that whatever ran on it could be trusted about as far as the OS could throw it. That was fine in 1985. It&apos;s not fine for a machine that&apos;s going to sit on a network in 2026. I&apos;ll get into exactly what that means for the architecture a few entries from now, but I want to flag it early: this isn&apos;t a small asterisk, it&apos;s one of the load-bearing decisions of the whole project.&lt;/p&gt;
&lt;p&gt;Exact binary APIs don&apos;t survive either, for what I&apos;d hope is an obvious reason — there&apos;s no binary compatibility target here. Nobody is running original Amiga executables on this thing today. That&apos;s explicitly a job for a future emulator, not something baked into the core design.&lt;/p&gt;
&lt;h2 id=&quot;the-actual-question&quot;&gt;The actual question&lt;/h2&gt;
&lt;p&gt;Which parts were principles, and which parts were just 1985?&lt;/p&gt;
&lt;p&gt;That&apos;s the sorting test I used on everything, and it&apos;s the same test I&apos;m going to keep applying as this journal goes on. Every time something from the old machine shows up in a design conversation, that&apos;s the question: is this a principle worth carrying forward, or is this just what 1985 looked like wearing a costume made of nostalgia? Next up: the machine that actually got me started down this road in the first place, and the reason it wasn&apos;t the Amiga&apos;s OS — it was the Video Toaster.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Originally published on The Weekend Report: https://theweekendersproject.com/report/what-was-actually-worth-saving-from-the-amiga&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Workshop</category><category>Amiga</category><category>Systems Design</category><category>Architecture Principles</category><author>Mike</author></item><item><title>What If Amiga Development Never Stopped?</title><link>https://ceylonprojectng.com/journal/what-if-amiga-development-never-stopped/</link><guid isPermaLink="true">https://ceylonprojectng.com/journal/what-if-amiga-development-never-stopped/</guid><description>Commodore went bankrupt in 1994 and took continuous Amiga development down with it. This is the question that started everything: what would still be true if it hadn&apos;t.</description><pubDate>Sun, 06 Sep 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Commodore went bankrupt in 1994 and took continuous Amiga development down with it. This is the question that started everything: what would still be true if it hadn&apos;t.&lt;/p&gt;
&lt;p&gt;I want to be upfront about something before I write another word of this: I am not rebuilding an Amiga 500. I am not rebuilding an Amiga 1200. Nobody is getting a cycle-accurate Motorola 68000 out of me, and if that&apos;s what you came here for, this whole series is going to disappoint you early and often.&lt;/p&gt;
&lt;p&gt;What I&apos;m actually chasing is a different, weirder question, and it&apos;s the one that started this whole thing: Commodore went bankrupt in 1994. Amiga development, as a continuous line, stopped. Not the ideas — people kept the ideas alive in emulators and hobbyist projects and a couple of increasingly sad corporate ownership changes — but the actual forward motion of &amp;quot;what does this architecture become next&amp;quot; stopped cold.&lt;/p&gt;
&lt;p&gt;So: what if it hadn&apos;t? What would be sitting on somebody&apos;s desk in 2026 if that story had never been interrupted?&lt;/p&gt;
&lt;p&gt;We&apos;re not rebuilding the Amiga of 1987. I&apos;m trying to figure out what might have been sitting on somebody&apos;s desk in 2026 if the story had never stopped.&lt;/p&gt;
&lt;p&gt;That&apos;s an alternate-history engineering question, not a preservation project, and the distinction matters more than it sounds like it should. A preservation project asks &amp;quot;how do we keep the old thing running.&amp;quot; I&apos;m asking &amp;quot;what would the old thing have grown into.&amp;quot; Those point in almost opposite directions once you actually start working.&lt;/p&gt;
&lt;h2 id=&quot;principles-versus-hardware-constraints&quot;&gt;Principles versus hardware constraints&lt;/h2&gt;
&lt;p&gt;The Amiga in 1985 got a handful of things right that most of the industry took another decade or more to catch up on. Real preemptive-ish multitasking on consumer hardware. Custom chips doing real work off the main CPU instead of the CPU doing everything itself. Multimedia — audio, video, graphics — treated as first-class citizens of the machine&apos;s identity instead of an afterthought bolted on by a sound card manufacturer. A sense that the hardware and the OS were one coherent idea, not a CPU with a pile of drivers stapled to it.&lt;/p&gt;
&lt;p&gt;None of that is 1985-specific. Responsiveness, asynchronous operation, modularity, specialized hardware doing specialized work, multimedia as identity, efficient use of what you&apos;ve got, a coherent machine/OS relationship — those are principles. They&apos;d be just as correct in 2026 as they were then.&lt;/p&gt;
&lt;p&gt;What IS 1985-specific: the exact chipset, the exact address space, the exact CPU family, the assumption that whoever&apos;s sitting at the keyboard is the only person who will ever touch this machine and can be trusted completely. Those aren&apos;t principles. Those are just what 1985 hardware and 1985 threat models looked like.&lt;/p&gt;
&lt;p&gt;Modern hardware and modern security requirements are going to change the implementation of every single one of those good principles. That&apos;s not a compromise on the vision — that&apos;s the actual work. Anybody who tells you they&apos;re bringing back the Amiga unchanged is either rebuilding a museum piece or lying to you about the scope.&lt;/p&gt;
&lt;h2 id=&quot;where-this-is-going&quot;&gt;Where this is going&lt;/h2&gt;
&lt;p&gt;I&apos;ve already gone and looked at NewTek&apos;s Video Toaster, because if you&apos;re asking &amp;quot;what was the Amiga good at that nobody else was doing,&amp;quot; desktop video is most of the answer. That&apos;s next.&lt;/p&gt;
&lt;p&gt;Y&apos;all are going to see this thing change shape more than once over the course of this journal. I&apos;m not going to clean that up after the fact and pretend I knew where I was going the whole time. I didn&apos;t. I still don&apos;t, entirely. That&apos;s kind of the point of writing it down as it happens instead of after.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Originally published on The Weekend Report: https://theweekendersproject.com/report/what-if-amiga-development-never-stopped&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>Project Ceylon</category><category>Workshop</category><category>Amiga</category><category>Alternate History</category><category>Systems Design</category><author>Mike</author></item></channel></rss>