<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: COMMENTERTHE9</title>
    <description>The latest articles on Forem by COMMENTERTHE9 (@commenterthe9).</description>
    <link>https://forem.com/commenterthe9</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3823333%2F1af4f546-b6c0-4597-9d66-05fe6c618387.png</url>
      <title>Forem: COMMENTERTHE9</title>
      <link>https://forem.com/commenterthe9</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/commenterthe9"/>
    <language>en</language>
    <item>
      <title>Cx Dev Log — 2026-05-02</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Fri, 08 May 2026 00:08:28 +0000</pubDate>
      <link>https://forem.com/commenterthe9/cx-dev-log-2026-05-02-h9f</link>
      <guid>https://forem.com/commenterthe9/cx-dev-log-2026-05-02-h9f</guid>
      <description>&lt;p&gt;Clearing a backlog of stale PRs might sound like mundane maintenance, but today's work on Cx has brought a key piece of technical documentation into focus. It's all about the unary lowering strategy in the Intermediate Representation (IR), which isn't visible without those extra insights.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unary Lowering Strategy
&lt;/h2&gt;

&lt;p&gt;Ever noticed Cx's IR doesn't handle negate or boolean-not instructions directly? Instead, we've decided to encode them in a two-operand form:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Op::Minus&lt;/code&gt; becomes &lt;code&gt;0 - value&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Op::Not&lt;/code&gt; becomes &lt;code&gt;value == 0&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This choice minimizes the work for backends, needing just one instruction pattern for both arithmetic and comparison tasks. The nuances of this strategy are now documented in &lt;code&gt;src/ir/lower.rs&lt;/code&gt;, thanks to a recent commit (&lt;code&gt;2d665a4&lt;/code&gt;) on &lt;code&gt;stokowski/cx-6-document-unary-lowering&lt;/code&gt;. These 25 lines of comments don't alter code behavior but offer crucial context to understand our IR encoding decisions.&lt;/p&gt;

&lt;p&gt;The documentation sits on a branch yet to reach main, inheriting a chunk of history from Phases 10-11 IR backend work. Although it won't impact the system since it's purely comments, this documentation is central to understanding our IR processing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dealing with PR Backlog
&lt;/h2&gt;

&lt;p&gt;With PRs #29 to #52 now merged, the daily logs from the past month are no longer sitting in limbo. These merges connect entries from 2026-03-29 to 2026-05-01 and update the &lt;code&gt;docs/frontend/ROADMAP.md&lt;/code&gt;. While this task doesn't shift Cx's functionality forward, it restores traceability and organization, areas highlighted in prior logs as growing liabilities.&lt;/p&gt;

&lt;p&gt;Maintaining a clear record from late March onwards, even without language revisions, reinforces our historical and developmental context. It's all about keeping the narrative straight, especially when planning future pathways.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Submain Dilemma
&lt;/h2&gt;

&lt;p&gt;The real challenge lies with submain's drift. Holding 22 unmerged commits, submain is where version 5.0 resides with 117 tests done and all blockers fixed, while main lags at version 4.9 with just 78 tests. New branches are developing from submain, not main, emphasizing the difference between the roadmap and the live language state.&lt;/p&gt;

&lt;p&gt;This division compromises how we integrate new work. While not a new issue, its impact on development plans is pronounced. Closing this gap is imperative before any significant next steps.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s on the Horizon
&lt;/h2&gt;

&lt;p&gt;Immediate tasks? A PR for the CX-6 documentation is low-risk and simple. Beyond that, we need to focus on merging submain with main—a priority that's been hovering for some time. Once aligned, struct field access lowering becomes feasible, supported by submain's existing infrastructure for &lt;code&gt;DotAccess&lt;/code&gt; using &lt;code&gt;StructLayoutInfo&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Our testing matrix is holding steady with no regressions on main. Today may seem quiet, but it's a crucial step in setting up future development paths.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the Cx language project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://cx-lang.com" rel="noopener noreferrer"&gt;cx-lang.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/COMMENTERTHE9/Cx_lang" rel="noopener noreferrer"&gt;github.com/COMMENTERTHE9/Cx_lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/commenterthe9"&gt;dev.to/commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href="https://bsky.app/profile/thecomment.bsky.social" rel="noopener noreferrer"&gt;thecomment.bsky.social&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href="https://x.com/commenterthe9" rel="noopener noreferrer"&gt;@commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://cx-lang.com/blog/2026-05-02" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-05-02&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-05-05</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Thu, 07 May 2026 00:15:46 +0000</pubDate>
      <link>https://forem.com/commenterthe9/cx-dev-log-2026-05-05-44pm</link>
      <guid>https://forem.com/commenterthe9/cx-dev-log-2026-05-05-44pm</guid>
      <description>&lt;p&gt;Seven commits in a single session, and the spotlight is on CX-22, CX-23, and CX-24. They leap ahead in the backend roadmap, laying down the critical components of the differential harness, Cranelift lowering skeleton, and the JIT host boundary contract. These are the essential pieces for any Cx program to run through the JIT path. Meanwhile, the trio of CX-18, CX-19, and CX-20 have successfully merged into submain, wrapping up the array lowering sequence from Phase 11.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Merged
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;CX-20 (PR #70)&lt;/strong&gt;: This commit delivered array element writes via the IR. Introducing the &lt;code&gt;SemanticLValue::Index&lt;/code&gt; variant into semantic analysis, the interpreter, and IR lowering, it ensures that &lt;code&gt;arr:[i] = value&lt;/code&gt; and compound assignments like &lt;code&gt;arr:[i] += value&lt;/code&gt; function as intended. This involved adding 428 lines across five files. Filed on May 4th, it secured its place in submain today.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CX-18 (PR #67)&lt;/strong&gt;: Commits here verified that &lt;code&gt;Array(N, Struct)&lt;/code&gt; lowers correctly, addressing type mapping along with one-, two-, and three-element scenarios. This patch was crucial, closing a test gap from previous array literal work done in CX-16.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CX-19 (PR #68)&lt;/strong&gt;: This update swapped out the generic &lt;code&gt;unsupported!("Range")&lt;/code&gt; panic with &lt;code&gt;LoweringError::UnsupportedSemanticConstruct&lt;/code&gt;, offering a structured, descriptive error message instead. It was a minimal change but significant for transforming panic indications into useful error values.&lt;/p&gt;

&lt;h2&gt;
  
  
  Jumping Ahead: Execution Infrastructure
&lt;/h2&gt;

&lt;p&gt;The momentum is with the three recent branch-local commits, blazing a trail beyond the backend roadmap. Phases 12 and 13, tagged as "Next" items following Phase 11, found an early spotlight. Getting them up and running was strategic—their completion doesn't rely on Phase 11, and they're prerequisites for any JIT execution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CX-23: Differential Harness Shell (Phase 12, sub-packet 1)&lt;/strong&gt;: A fresh &lt;code&gt;src/diff_harness.rs&lt;/code&gt; popped up, hosting structures and functions like the &lt;code&gt;TestExpectation&lt;/code&gt; enum, &lt;code&gt;TestFixture&lt;/code&gt; struct, and others. The shell also includes a function to enumerate all 116 fixtures and run them through an interpreter subprocess capture mechanism. Interesting to note is the consistency in the subprocess method used for both interpreter and JIT paths.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CX-22: Cranelift Lowering Skeleton (Phase 13)&lt;/strong&gt;: Laid down the mapping groundwork for all nine &lt;code&gt;IrType&lt;/code&gt; variants, set up scaffolding for module traversal, and established function, block, and instruction dispatch stubs. It also introduced the &lt;code&gt;CraneliftLoweringError&lt;/code&gt; type with distinct variants to handle various exceptions. These +460 lines craft the framework Cranelift codegen will eventually inhabit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CX-24: JIT Runtime Host Boundary&lt;/strong&gt;: Establishes the contract between the JIT backend and the host process. Notably, JIT operates within the host process—no forking. This lines up with the subprocess output strategy of the differential harness, streamlining output comparisons.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CX-21: MethodCall Structured Error&lt;/strong&gt;: It rides the same wave as CX-19, refining &lt;code&gt;unsupported!("MethodCall")&lt;/code&gt; with an error that details the instance and method name (e.g., &lt;code&gt;"MethodCall 'p.take_damage'"&lt;/code&gt;). A small change but one that significantly enriches error clarity during debugging.&lt;/p&gt;

&lt;p&gt;These commits remain on branch locals, awaiting their merger into submain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decisions Worth Noting
&lt;/h2&gt;

&lt;p&gt;Leaping ahead in the phase sequence is the pivotal decision from this latest stretch. Although Phases 12 and 13 were slated to follow Phase 11, they hold no strict sequencing reliance. Initiating them ensures crucial infrastructure is in place without waiting for the entirety of Phase 11.&lt;/p&gt;

&lt;p&gt;The architectural choice embedded in CX-24 is critical. By deciding that JIT operations should occur in-process, the team avoids process forking. This matches seamlessly with the differential harness's design, which uses subprocess execution for capturing outputs, simplifying the comparison logic and ensuring consistency across paths.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;The submain now carries over 26 commits ahead of the main—a gap that's widening as submain accumulates more changes. The last merge to main (PR #57) corrected a 37-day divide. Reducing this divergence remains the highest priority, highlighted in daily logs.&lt;/p&gt;

&lt;p&gt;Immediate tasks on the docket include folding in CX-21 through CX-24 into submain and pushing a submain merge to main sooner rather than later. On the roadmap, the next Phase 11 task involves method call lowering, which currently returns errors instead of generating IR. The upcoming challenge lies in translating &lt;code&gt;obj.method(args)&lt;/code&gt; to actual call instructions.&lt;/p&gt;

&lt;p&gt;Phase 12's subsequent sub-packet will focus on embedding Cranelift baseline captures within the differential harness, enabling side-by-side comparisons of interpreter and JIT outputs.&lt;/p&gt;

&lt;p&gt;Matrix status stands at: 117 PASS / 0 FAIL / 117 total. The numbers remain steady.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the Cx language project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://cx-lang.com" rel="noopener noreferrer"&gt;cx-lang.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/COMMENTERTHE9/Cx_lang" rel="noopener noreferrer"&gt;github.com/COMMENTERTHE9/Cx_lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/commenterthe9"&gt;dev.to/commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href="https://bsky.app/profile/thecomment.bsky.social" rel="noopener noreferrer"&gt;thecomment.bsky.social&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href="https://x.com/commenterthe9" rel="noopener noreferrer"&gt;@commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://cx-lang.com/blog/2026-05-05" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-05-05&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-05-03</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Wed, 06 May 2026 00:13:02 +0000</pubDate>
      <link>https://forem.com/commenterthe9/cx-dev-log-2026-05-03-a8l</link>
      <guid>https://forem.com/commenterthe9/cx-dev-log-2026-05-03-a8l</guid>
      <description>&lt;p&gt;A quiet day in the trenches of Cx development, where the code didn't change a lot, but understanding did. We merged a documentation PR that delves into the sometimes obscure but deliberate design choices behind our intermediate representation (IR). Sounds routine? Maybe. But any dev who's faced the tangled web of inline comments knows this: clarity aids progress.&lt;/p&gt;

&lt;h2&gt;
  
  
  PR #53: Documenting Unary Lowering
&lt;/h2&gt;

&lt;p&gt;Commit &lt;code&gt;2d665a4&lt;/code&gt; brought new life to &lt;code&gt;src/ir/lower.rs&lt;/code&gt; with 25 lines of block-level comments—all about why the IR doesn't have dedicated unary instructions. Our approach? Translate &lt;code&gt;Op::Minus&lt;/code&gt; into &lt;code&gt;0 - value&lt;/code&gt; and &lt;code&gt;Op::Not&lt;/code&gt; into &lt;code&gt;value == 0&lt;/code&gt;. This choice isn't made on a whim. It was birthed from the need for consistency—forcing every backend to handle a uniform operation structure. Sure, it makes digging through raw IR feel like detective work, but it simplifies things for backend devs. No extra branches or funky handling for unary operations.&lt;/p&gt;

&lt;p&gt;The documentation doesn't shift any functionality. But by encoding the reasoning right into the code, future contributors—anyone brave enough to stroll into lower.rs—won't have to guess why they see subtraction instead of negation. PR #53 came to life yesterday, and today it's in submain. A good step forward without shifting a piece of code.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Divergence Problem: Day 36
&lt;/h2&gt;

&lt;p&gt;Here's where things get interesting. Submain has been off doing its own thing—25 commits ahead of main—for 36 days now. Main lags at v4.9 with 78 tests, while submain's racing on at v5.0 with 117 tests. All hard blockers? Resolved ages ago. Daily logs from mid-March echo the same unresolved task: "merge submain to main." There's no technical puzzle left here. We could, if project management allowed it, hit merge any day. Tests are green, code is ready. Yet, inertia reigns. The risk accumulates, and that isn’t just gnarly coding; it's a reminder of project management's unforgiving vigilance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Site Branch Update
&lt;/h2&gt;

&lt;p&gt;A new dev log from 2026-05-01 has been stationed at &lt;code&gt;src/content/blog/2026-05-01.mdx&lt;/code&gt; on the site branch. It captures the actions from Phase 11—detailing IR memory operations and the struct registry advances that landed on submain. It won't shake the world, but it carries the incremental changes every long-term developer knows are the backbone of sustainable progress.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;Priorities remain the same despite the silence. Merging submain to main isn't a secondary task—it's foundational. 25 commits, 39 tests ahead; it's overdue. &lt;/p&gt;

&lt;p&gt;Beyond the merge, our attention will turn to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Lowering struct field access via field offsets gleaned from &lt;code&gt;StructLayoutInfo&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Finessing struct literal lowering from &lt;code&gt;StructLit&lt;/code&gt; to &lt;code&gt;Alloca&lt;/code&gt; with precise per-field &lt;code&gt;Store&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Main still hums at 78 tests passing without a hitch. Another typical day, maybe, but days like these build the languages that excite, the APIs that matter—not through glamour, but through incremental understanding. Stay tuned.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the Cx language project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://cx-lang.com" rel="noopener noreferrer"&gt;cx-lang.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/COMMENTERTHE9/Cx_lang" rel="noopener noreferrer"&gt;github.com/COMMENTERTHE9/Cx_lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/commenterthe9"&gt;dev.to/commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href="https://bsky.app/profile/thecomment.bsky.social" rel="noopener noreferrer"&gt;thecomment.bsky.social&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href="https://x.com/commenterthe9" rel="noopener noreferrer"&gt;@commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://cx-lang.com/blog/2026-05-03" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-05-03&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log - 2026-05-04</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Tue, 05 May 2026 00:04:43 +0000</pubDate>
      <link>https://forem.com/commenterthe9/cx-dev-log-2026-05-04-108h</link>
      <guid>https://forem.com/commenterthe9/cx-dev-log-2026-05-04-108h</guid>
      <description>&lt;p&gt;37 days. That's how long the main and submain branches diverged before the big merge today. It wasn't just about closing this gap; it was about making the biggest forward leap we've seen in weeks. The test matrix exploded from 78 to 117 tests, and we dropped an 11-commit sprint into IR lowering that hammered out essential struct and array support. That alone makes you want to take a closer look at what's changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The submain merge (PR #57)
&lt;/h2&gt;

&lt;p&gt;The main branch just caught up with a glut of overdue updates. Submain had all the action, while main was stuck at v4.9 with 78 tests since late March. Finally, PR #57 has us breathing easy: 117/117 test matrix fully up, all nine blockade issues unlocked, and every example is passing smoothly. Improvements included tweaking the error model, enforcing integer overflow rules, refining semicolon behaviors, fixing parser body handling, ensuring struct field overflow handling, streamlining recursive types, and sealing memory soundness. Every daily log marked this as the crucial hurdle. It’s cleared.&lt;/p&gt;

&lt;h2&gt;
  
  
  IR lowering sprint: CX-7 through CX-17
&lt;/h2&gt;

&lt;p&gt;Eleven commits in one day have reshaped composite type support in the lowering pass. Let's dive into some of the headliners:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CX-7&lt;/strong&gt; brought in direct function call lowering, adding tests around function bodies, binary expressions, and multi-argument calls, driving home 193 new lines to &lt;code&gt;lower.rs&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CX-9&lt;/strong&gt; handled struct literal lowering. The &lt;code&gt;StructInstance&lt;/code&gt; transitions to an Alloca coupled with per-field PtrOffset/Store. This introduced &lt;code&gt;IrInst::PtrOffset&lt;/code&gt; for compile-time pointer arithmetic, backed by four new tests.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CX-10&lt;/strong&gt; empowered struct field reads using &lt;code&gt;DotAccess&lt;/code&gt;, built on layout table lookups, binding resolutions, and PtrOffset for non-zero positions. We made &lt;code&gt;struct_name&lt;/code&gt; part of the &lt;code&gt;DotAccess&lt;/code&gt; variant in the semantic layer to accommodate these changes, wrapping up with six fresh tests and over 411 lines modified across six different files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CX-13&lt;/strong&gt; streamlined void function call lowering. These now emit &lt;code&gt;IrInst::Call { dst: None, return_ty: None }&lt;/code&gt;, intercepting void calls at the statement level in &lt;code&gt;lower_stmt&lt;/code&gt;—way before they get to &lt;code&gt;lower_expr&lt;/code&gt;, which anticipates a return.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CX-14&lt;/strong&gt; focused on struct field writes, extending capabilities for both &lt;code&gt;Assign&lt;/code&gt; and &lt;code&gt;CompoundAssign&lt;/code&gt; on &lt;code&gt;DotAccess&lt;/code&gt; LValues, consolidating pointer resolution logic by reusing the existing &lt;code&gt;resolve_field_ptr&lt;/code&gt; from the read path. This added three to our test suite, with 266 lines tacked on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CX-16&lt;/strong&gt; and &lt;strong&gt;CX-17&lt;/strong&gt; handled arrays. From array type and literal lowering to array element access—arrays now follow the similar patterns laid down for struct literals using &lt;code&gt;SemanticType::Array(_, _)&lt;/code&gt; to &lt;code&gt;IrType::Ptr&lt;/code&gt;. Six fresh tests anchored these changes, alongside a 475-line increase in codebase heft.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design decisions that matter
&lt;/h2&gt;

&lt;p&gt;We went hard on one memory model for both structs and arrays, aligning on &lt;code&gt;IrType::Ptr&lt;/code&gt; to stack-allocated storage. Field accesses use compile-time &lt;code&gt;PtrOffset&lt;/code&gt;; array elements turn to runtime &lt;code&gt;PtrAdd&lt;/code&gt;. It's a conscious choice—single addressing pattern, solitary memory model, with backends handling only pointer arithmetic.&lt;/p&gt;

&lt;p&gt;Our decision for void calls is to fix them firmly at statement-level rather than expression-level. Since &lt;code&gt;lower_expr&lt;/code&gt; mandates a return value, we cleanly intercepted voids in &lt;code&gt;lower_stmt&lt;/code&gt;—keeping paths from tangling in Options types through expression lowering.&lt;/p&gt;

&lt;h2&gt;
  
  
  Branch-local work (not yet merged)
&lt;/h2&gt;

&lt;p&gt;We’re lining up CX-18, aimed at solidifying array-of-structs lowering with a quartet of new tests ensuring accurate instruction sequences. CX-19 is poised to replace the hasty &lt;code&gt;unsupported!("Range")&lt;/code&gt; panics with a directly named error: &lt;code&gt;LoweringError::UnsupportedSemanticConstruct&lt;/code&gt;, showing exactly why range expressions fail as values. Both are ready, staged on local branches.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;Immediate moves involve merging CX-18 and CX-19—both safe steps already locked and loaded. After clearing those, we’re hitting method call lowering, targeting those still dodging &lt;code&gt;unsupported!&lt;/code&gt; in the passes. Methods in &lt;code&gt;impl&lt;/code&gt; blocks have a hefty test presence, making this a priority.&lt;/p&gt;

&lt;p&gt;Then, bridging submain back to main before we lose another 20 commits' worth of separation, as seen post-sprint. Keeping branches from drifting 37 days apart like past experience is a must.&lt;/p&gt;

&lt;p&gt;In the distance lies &lt;code&gt;when&lt;/code&gt; block lowering—the most winding control-flow structure left, with an open question dangling around TBool's tricky three-way branching.&lt;/p&gt;

&lt;p&gt;Matrix status shows triumph right now: 117 PASS / 0 FAIL. &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the Cx language project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://cx-lang.com" rel="noopener noreferrer"&gt;cx-lang.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/COMMENTERTHE9/Cx_lang" rel="noopener noreferrer"&gt;github.com/COMMENTERTHE9/Cx_lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/commenterthe9"&gt;dev.to/commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href="https://bsky.app/profile/thecomment.bsky.social" rel="noopener noreferrer"&gt;thecomment.bsky.social&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href="https://x.com/commenterthe9" rel="noopener noreferrer"&gt;@commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://cx-lang.com/blog/2026-05-04" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-05-04&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-04-30</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Mon, 04 May 2026 00:51:36 +0000</pubDate>
      <link>https://forem.com/commenterthe9/cx-dev-log-2026-04-30-6kp</link>
      <guid>https://forem.com/commenterthe9/cx-dev-log-2026-04-30-6kp</guid>
      <description>&lt;p&gt;Phase 11 just introduced compound assign lowering on submain, pulling &lt;code&gt;+=&lt;/code&gt;, &lt;code&gt;-=&lt;/code&gt;, &lt;code&gt;*=&lt;/code&gt;, &lt;code&gt;/=&lt;/code&gt;, and &lt;code&gt;%%=&lt;/code&gt; into the IR backend. All in all, 126 new lines in &lt;code&gt;src/ir/lower.rs&lt;/code&gt; and three fresh tests. These operators mark their maiden voyage through the IR backend, and while main keeps its 78/78 green tests, submain stays ahead by 22 commits with a 33-day bridge to cross.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compound Assign Lowering
&lt;/h2&gt;

&lt;p&gt;Commit &lt;code&gt;9015aff&lt;/code&gt; on submain is the sentinel. Gone is the &lt;code&gt;CompoundAssign&lt;/code&gt; stub that only returned an &lt;code&gt;UnresolvedSemanticArtifact&lt;/code&gt;. Now, it has real weight with true lowering logic. For &lt;code&gt;Binding&lt;/code&gt; LValues, it mirrors the plain assignment's SSA journey:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fetch the SSA value of the binding.&lt;/li&gt;
&lt;li&gt;Lower the right-hand argument.&lt;/li&gt;
&lt;li&gt;Emit a &lt;code&gt;Binary&lt;/code&gt; instruction mapping to the op (&lt;code&gt;Add&lt;/code&gt; for &lt;code&gt;+=&lt;/code&gt;, &lt;code&gt;Sub&lt;/code&gt; for &lt;code&gt;-=&lt;/code&gt;, etc.).&lt;/li&gt;
&lt;li&gt;Re-bind via &lt;code&gt;SsaBind&lt;/code&gt; and adjust the binding map.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For &lt;code&gt;DotAccess&lt;/code&gt; LValues, things are different. Instead of silently bypassing, compound assigns for struct fields raise an intentional typed error. This mirrors the handling of other unsupported constructs and lays down a marker – struct field work needs pointer arithmetic, which isn't in the mix yet.&lt;/p&gt;

&lt;p&gt;There are three tests now in play:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;lowers_compound_assign_add&lt;/code&gt; ensures &lt;code&gt;+=&lt;/code&gt; lands as &lt;code&gt;Binary::Add&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lowers_compound_assign_sub&lt;/code&gt; drives &lt;code&gt;-=&lt;/code&gt; end-to-end through &lt;code&gt;lower_and_validate&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rejects_compound_assign_dot_access&lt;/code&gt; makes sure DotAccess gets shown the door with the expected error.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Two older error-message checks refined their format, adopting &lt;code&gt;"compound assign binding BindingId(N)"&lt;/code&gt; over the bland &lt;code&gt;"CompoundAssign"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In summary, a plus of 126 lines with just 5 lines trimmed, all within &lt;code&gt;src/ir/lower.rs&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Pattern
&lt;/h2&gt;

&lt;p&gt;This move exemplifies the piecemeal approach standing firm throughout Phase 11. Each parcel grabs one syntax category, works the lowering logic, wraps it in tailored tests, and writes stubs with explicit error signals for what can’t be reached yet. Think of unary expressions landing on April 26. Compound assigns line up now. What remains – ArrayLit, Index, MethodCall, and others, along with compound assign on DotAccess – are nailed down with typed errors, not panic.&lt;/p&gt;

&lt;p&gt;The four-day pause from April 26 until now – noteworthy mainly because it broke a steady rhythm – doesn't reflect an existential challenge, but a continued expression lowering march.&lt;/p&gt;

&lt;h2&gt;
  
  
  Submain Divergence
&lt;/h2&gt;

&lt;p&gt;The rift between main and submain hasn’t changed. Right now, it looms large. Submain's 22 commits are sitting pretty with a 33-day lead covering Phases 10 and 11, the error model (&lt;code&gt;Result&lt;/code&gt;), integer overflows, optional semicolons, thorough audits, diagnostic sheen, and the roadmap to v5.0 with its 9 hard blockers checked off. Main is back at v4.8 still staring at those very same 9 blockers.&lt;/p&gt;

&lt;p&gt;Merge day has been the linchpin priority forever, but here we are. Every spin in the submain-alone orbit means the merge becomes a bit more of a puzzle. The test gap right now? 39 tests wide (main’s 78 vs submain’s 117).&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;The backend's immediate path is buffered through the remaining expression lowerings. Compound assign on DotAccess, particularly, hinges on struct field access revamps (pointer arithmetic and Load/Store), yet to make its landing.&lt;/p&gt;

&lt;p&gt;Merging remains king. The daily-log PR bloat – nearly 30 stagnant branches stretching from March 29 through April 29 – stacks as maintenance debt going forward.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the Cx language project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://cx-lang.com" rel="noopener noreferrer"&gt;cx-lang.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/COMMENTERTHE9/Cx_lang" rel="noopener noreferrer"&gt;github.com/COMMENTERTHE9/Cx_lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/commenterthe9"&gt;dev.to/commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href="https://bsky.app/profile/thecomment.bsky.social" rel="noopener noreferrer"&gt;thecomment.bsky.social&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href="https://x.com/commenterthe9" rel="noopener noreferrer"&gt;@commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://cx-lang.com/blog/2026-04-30" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-04-30&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-05-01</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Sun, 03 May 2026 00:17:24 +0000</pubDate>
      <link>https://forem.com/commenterthe9/cx-dev-log-2026-05-01-34ph</link>
      <guid>https://forem.com/commenterthe9/cx-dev-log-2026-05-01-34ph</guid>
      <description>&lt;p&gt;Two sub-packets landed on submain today, moving the IR backend closer to supporting structs properly. The first package upgrades the instruction set to handle memory operations, and the second implements a struct registry integrated into the lowering pass. Together, these changes allow the lowering pass to recognize and manipulate the structs' memory representations, setting the stage for future struct-aware code generation. Meanwhile, main remains unchanged, while submain is breaking ground with 22 new commits developed over 34 days.&lt;/p&gt;

&lt;h2&gt;
  
  
  IR Memory Operations
&lt;/h2&gt;

&lt;p&gt;Commit &lt;code&gt;6252994&lt;/code&gt; brought in a crucial update: introducing a &lt;code&gt;Ptr&lt;/code&gt; type to the IR type system, complete with a size of 8 bytes and an alignment of 8 bytes. Alongside, three fundamental IR instructions were added:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Alloca&lt;/code&gt;: It allocates stack space defined by size and alignment.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Load&lt;/code&gt;: It performs a read operation from a pointer with a specific type.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Store&lt;/code&gt;: It enables writing a value through a pointer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The IR validator has adapted to these changes, embedding 43 lines of new checks. Interestingly, it requires &lt;code&gt;Alloca&lt;/code&gt; to have a size greater than zero and a power-of-two alignment. Both &lt;code&gt;Load&lt;/code&gt; and &lt;code&gt;Store&lt;/code&gt; demand a pointer operand typed explicitly as &lt;code&gt;IrType::Ptr&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This memory operation extension is crucial. Without it, the backend couldn’t handle memory structures that exceed single-register values. The improvement reflects typical infrastructure you’d find in a lowering pass designed for IR architectures like Cranelift or LLVM, where memory management is cornerstone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Struct Registry and Struct-to-Ptr Lowering
&lt;/h2&gt;

&lt;p&gt;Diving further into struct support, commit &lt;code&gt;c95eea6&lt;/code&gt; revealed a robust struct registry. This involves &lt;code&gt;build_struct_table()&lt;/code&gt; walking through every &lt;code&gt;SemanticStmt::StructDef&lt;/code&gt;. As it encounters each, it lowers field types and computes their layout via &lt;code&gt;compute_struct_layout()&lt;/code&gt;, established back in Phase 8.&lt;/p&gt;

&lt;p&gt;The produced &lt;code&gt;StructLayoutInfo&lt;/code&gt; details field offsets, sizes, and alignments for each struct, threading this struct metadata through key components like &lt;code&gt;LoweringCtx&lt;/code&gt; and the lowering functions. The main change here is how &lt;code&gt;lower_type&lt;/code&gt; operates, shifting from returning &lt;code&gt;UnsupportedSemanticType&lt;/code&gt; for structs to correctly mapping &lt;code&gt;SemanticType::Struct(_)&lt;/code&gt; to &lt;code&gt;Ok(IrType::Ptr)&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;LLVM has a similar stance on treating structs as pointers, which supports computational efficiency. Importantly, the struct layout calculation is performed just once, and then utilized across functions, preventing redundant computations.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Submain Divergence
&lt;/h2&gt;

&lt;p&gt;Submain’s trajectory reflects a 34-day, 22-commit lead over main, carrying a slew of updates from Phases 10-11 including error management, overflow controls, and optional semicolons. This branch also holds 117 tests against main’s 78.&lt;/p&gt;

&lt;p&gt;Concerns rise as days pass without merging these advancements back into main. The longer this continues, the more challenging integration will become, posing significant risks to the overall project. There’s an urgent need to close this divergence to streamline development and mitigate integration complexities.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Landed vs. What Was Predicted
&lt;/h2&gt;

&lt;p&gt;Interestingly, the predicted advancement in Phase 11's expression lowering occurred, albeit through focus on underlying struct and memory operation enhancement rather than direct expression work. However, several anticipated actions did not see progression — the crucial merge into main remained unaddressed, as did tackling existing IR backend test failures or resolving inactive PRs.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;Struct support is now foundational. Following this, we should:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lower struct field accesses.&lt;/strong&gt; Implement &lt;code&gt;DotAccess&lt;/code&gt; lowering utilizing &lt;code&gt;StructLayoutInfo&lt;/code&gt; for accurate field handling through pointer arithmetic accompanied by &lt;code&gt;Load&lt;/code&gt; and &lt;code&gt;Store&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lower struct literals.&lt;/strong&gt; Translate &lt;code&gt;SemanticExprKind::StructLit&lt;/code&gt; into an &lt;code&gt;Alloca&lt;/code&gt; followed by &lt;code&gt;Store&lt;/code&gt; operations for each field based on layout offsets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Merge submain to main.&lt;/strong&gt; This remains the top priority with 22 new commits and 39 tests awaiting integration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The groundwork is laid for more sophisticated struct handling in Cx. The path forward involves both immediate function implementations and resolving the pressing main-submain merge to unify the project’s progress.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the Cx language project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://cx-lang.com" rel="noopener noreferrer"&gt;cx-lang.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/COMMENTERTHE9/Cx_lang" rel="noopener noreferrer"&gt;github.com/COMMENTERTHE9/Cx_lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/commenterthe9"&gt;dev.to/commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href="https://bsky.app/profile/thecomment.bsky.social" rel="noopener noreferrer"&gt;thecomment.bsky.social&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href="https://x.com/commenterthe9" rel="noopener noreferrer"&gt;@commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://cx-lang.com/blog/2026-05-01" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-05-01&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-04-26</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Mon, 27 Apr 2026 00:41:10 +0000</pubDate>
      <link>https://forem.com/commenterthe9/cx-dev-log-2026-04-26-1olh</link>
      <guid>https://forem.com/commenterthe9/cx-dev-log-2026-04-26-1olh</guid>
      <description>&lt;p&gt;The IR backend has entered Phase 11. This shift brings unary expression lowering into the spotlight, with its recent landing on submain introducing negate support for integers and floats alongside boolean &lt;code&gt;not&lt;/code&gt;. With four new tests backing up these additions, it echoes more than just syntax tweaks. Meanwhile, behind-the-scenes adjustments continue—an essential cargo test fix rectifies issues left lingering from a prior warning cleanup that had temporarily derailed our test suite. Both of these updates currently reside on submain, leaving the main branch untouched—an evolving situation that keeps many of us watching closely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unary Expression Lowering
&lt;/h2&gt;

&lt;p&gt;Diving into unary expression lowering, Phase 11 adds a new match arm to &lt;code&gt;src/ir/lower.rs&lt;/code&gt;. We're talking +140/-1 lines, primarily handling two unary operators. First up is &lt;code&gt;Op::Minus&lt;/code&gt;. The approach for &lt;code&gt;-x&lt;/code&gt; lowering is straightforward: transform it to &lt;code&gt;0 - x&lt;/code&gt;. This approach leverages existing subtraction infrastructure instead of introducing a new &lt;code&gt;Neg&lt;/code&gt; IR instruction, maintaining efficiency by keeping the IR instruction set compact. For int and float, it's a matter of producing &lt;code&gt;ConstInt&lt;/code&gt; or &lt;code&gt;ConstFloat&lt;/code&gt; zero, followed by emitting a &lt;code&gt;Binary::Sub&lt;/code&gt; instruction.&lt;/p&gt;

&lt;p&gt;For &lt;code&gt;Op::Not&lt;/code&gt;, it's all about converting boolean negation into a &lt;code&gt;value == 0&lt;/code&gt; check through a &lt;code&gt;Compare::Eq&lt;/code&gt; against zero, returning a &lt;code&gt;Bool&lt;/code&gt;. Unsupported operators? They trigger a clean &lt;code&gt;LoweringError&lt;/code&gt; instead of causing panic.&lt;/p&gt;

&lt;p&gt;To assure robustness, four Rust-level tests map out this action. They don't just check if lowering functions succeed without errors; each test targets the IR's structural output: &lt;code&gt;lowers_unary_negate_int&lt;/code&gt;, &lt;code&gt;lowers_unary_negate_float&lt;/code&gt;, &lt;code&gt;lowers_unary_not_bool&lt;/code&gt;, and &lt;code&gt;rejects_unsupported_unary_op&lt;/code&gt;. Although a scoped addition, it marks our shift beyond statement-level constructs, nudging us toward comprehensive expression handling. But note, expressions like ArrayLit, Index, MethodCall, StructLit, HandleVal, HandleDrop, and Range await their turn in the next phases.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cargo Test Fix
&lt;/h2&gt;

&lt;p&gt;Past oversights in the warning cleanup reform led to a mini disaster—vanishing &lt;code&gt;analyze_program&lt;/code&gt; from &lt;code&gt;semantic.rs&lt;/code&gt; without updating its lingering test references. As you might imagine, this did not sit well. Commit &lt;code&gt;db2ee08&lt;/code&gt; emerges as the hero, implementing a 27-line test-only wrapper. This wrapper crafts a single-file &lt;code&gt;ResolvedProgram&lt;/code&gt;, ensuring &lt;code&gt;analyze_resolved_program&lt;/code&gt; continues to run smoothly.&lt;/p&gt;

&lt;p&gt;Equally notable is the fixing of CRLF line ending issues across six expected_output files, quelling any lingering mismatches during Windows-based tests. After these revisions, the cargo test suite bounces back to form with 123 passes and one known holdout—an unyielding IR backend test from Phase 10's legacy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Roadmap v4.8 to v4.9
&lt;/h2&gt;

&lt;p&gt;Our roadmap sees substantive updates. Checkmarks now grace nine hard blockers, substantiated by submain evidence. These cover diverse areas from basic test runners to enforcing integer overflow. All labeled as pending merger to main, sitting patiently for that final nod. &lt;/p&gt;

&lt;p&gt;Phase 10 is out of our hair, paving the way for Phase 11's breakthroughs on submain. Known gaps are steadily closing; struct field type checking and integer overflow now find places as resolved on submain. Yet, an undeniable submain integration gap—19 commits ahead of main—looms large.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Merge Gap
&lt;/h2&gt;

&lt;p&gt;So here we are—the elephant that's commandeering the room. Submain is 19 commits ahead, with a staggering, unchallenged test matrix distinction. Submain's 117/117 stands against main's 78/78. It's the unmerged reality causing a grand chasm of 39 tests between the two. The ever-pending submain-to-main merging remains perched atop our priority list; delays only compound the difficulty of future integrations. Submain's ventures have undeniable value; however, watching its divergence stripe the horizon in bolder strokes daily is concerning.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;Despite recent efforts, submain-to-main merging and log branch cleanups remain elusive. Yet, moving forward, Phase 11 expression lowering needs to weave through the remaining unsupported kinds: ArrayLit, Index, MethodCall, StructLit, HandleVal, HandleDrop, and Range—prioritizing areas that synergize our approach. On another note, addressing the lone cargo test failure would crown the Rust test suite's fully green visibility. As for the mounting 25 daily-log branches, periodic operational cleanup soon feels imperative.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the Cx language project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://cx-lang.com" rel="noopener noreferrer"&gt;cx-lang.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/COMMENTERTHE9/Cx_lang" rel="noopener noreferrer"&gt;github.com/COMMENTERTHE9/Cx_lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/commenterthe9"&gt;dev.to/commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href="https://bsky.app/profile/thecomment.bsky.social" rel="noopener noreferrer"&gt;thecomment.bsky.social&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href="https://x.com/commenterthe9" rel="noopener noreferrer"&gt;@commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://cx-lang.com/blog/2026-04-26" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-04-26&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-04-25</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Sun, 26 Apr 2026 00:38:27 +0000</pubDate>
      <link>https://forem.com/commenterthe9/cx-dev-log-2026-04-25-3b2n</link>
      <guid>https://forem.com/commenterthe9/cx-dev-log-2026-04-25-3b2n</guid>
      <description>&lt;p&gt;Breaking through the six-day stagnation on submain, we've finally hit a major milestone with four committed changes pushing Cx 0.1 over to release candidate status. A significant memory boundary audit unveiled a critical StrRef soundness bug, now resolved, and all nine hard blockers are cleared up, leaving the merge gap the last major step before declaring release.&lt;/p&gt;

&lt;h2&gt;
  
  
  Audit Part 2 and Type Parser Refactor
&lt;/h2&gt;

&lt;p&gt;The stalled audit Part 2 is no longer a hurdle. Commit &lt;code&gt;a576f20&lt;/code&gt; brought this to life, touching &lt;code&gt;parser.rs&lt;/code&gt;, &lt;code&gt;semantic.rs&lt;/code&gt;, &lt;code&gt;main.rs&lt;/code&gt;, &lt;code&gt;runtime.rs&lt;/code&gt;, and adding six new matrix tests (t109 to t114). Of particular interest was a critical refactor of the type parser, moving from flat alternatives to a &lt;code&gt;recursive()&lt;/code&gt; approach. This change opens the door to parsing nested types like &lt;code&gt;Result&amp;gt;&lt;/code&gt; and &lt;code&gt;Handle&lt;/code&gt;, previously a roadblock for complex generics.&lt;/p&gt;

&lt;p&gt;Other updates in this commit saw the semantic pass enhancing field type resolution from struct definitions for &lt;code&gt;DotAccess&lt;/code&gt; LValues and rejecting mismatched types, while &lt;code&gt;apply_numeric_cast&lt;/code&gt; in runtime adapts using the declared type of LValues for both &lt;code&gt;Assign&lt;/code&gt; and &lt;code&gt;CompoundAssign&lt;/code&gt;. A new dedicated 64 MB stack thread supports the interpreter, safeguarding against stack overflow, a real risk in recursive Cx programs. The numbers tell the tale: 17 files changed, with a net increase of 119 lines.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memory Boundary Soundness Audit Findings
&lt;/h2&gt;

&lt;p&gt;Commit &lt;code&gt;41099fb&lt;/code&gt; added 12 targeted test programs in &lt;code&gt;examples/audit_memory/&lt;/code&gt;, scrutinizing Handle lifecycle, copy semantics, and string arena operations. Results? Nine tests passed cleanly, one known limitation on arena growth remains (accepted for v0.1), one intentional semantic rejection, and importantly, one critical soundness bug identified.&lt;/p&gt;

&lt;h2&gt;
  
  
  StrRef Escape Challenge
&lt;/h2&gt;

&lt;p&gt;The fix for the crucial StrRef issue (&lt;code&gt;b057340&lt;/code&gt;) is now in place. This bug allowed StrRef values into struct fields, sidestepping current escape checks blocking such entries in variable assignments and function returns. New safety layers in &lt;code&gt;semantic.rs&lt;/code&gt; now block these potential escapes during struct field assignment and instantiation. Added matrix test t115 confirms the fix with a planned failure, ensuring stricter scope adherence for arena-backed string references. Additional escape paths? None found, but vigilance remains key.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Design Decisions
&lt;/h2&gt;

&lt;p&gt;Three pivotal decisions shape the future path:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;StrRef and Struct Fields:&lt;/strong&gt; We've shut off all StrRef escape routes via struct fields. This change aligns with our existing policy, sealing the last loophole.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Handle Double-Drop as Silent No-op:&lt;/strong&gt; Confirmed safe by the audit, the handle's generational indexing handles double-drops without incident. Future releases might add warnings, but for now, it's a silent guardian.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;64 MB Interpreter Stack Approach:&lt;/strong&gt; Opting for a simple solution over complex optimizations, a 64MB stack on a dedicated thread solves stack overflow issues for recursive Cx programs without delving into per-frame stack tweaks. It's efficient for v0.1; further reductions remain on the horizon.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Charting the Roadmap to v5.0 and Beyond
&lt;/h2&gt;

&lt;p&gt;The culmination of these efforts shows in commit &lt;code&gt;587bd20&lt;/code&gt;, escalating the submain roadmap to v5.0, complete with the removal of all nine barrier benchmarks. Known limitations are transparent rather than hidden. With submain adjusting to these changes, the main branch roadmap moves to v4.9, noting that the crucial merge work lingers.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next on This Journey
&lt;/h2&gt;

&lt;p&gt;The merge stands as the immediate goal. Submain leads with 19 new commits, while main trails with about 15 that need integrating. This merge won't be trivial — it promises to boost the main matrix from 78 to 117 tests, incorporating all hard blocker resolutions on the main stage.&lt;/p&gt;

&lt;p&gt;Post-merge, the focus is on operational tidying — think daily-log branches — and enhancing the quality gate with &lt;code&gt;:=&lt;/code&gt; type inference and pattern matching advancements. IR lowering for new constructs beckons in the distance, shaping future versions. Though not immediate blockers for v0.1, these will eventually enhance the competing developer experience.&lt;/p&gt;

&lt;p&gt;All soundness issues patched, all blockers resolved, and the path from RC to stable release is clear. Now, it's all about integration and refinement, making the magic happen for Cx 0.1.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the Cx language project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://cx-lang.com" rel="noopener noreferrer"&gt;cx-lang.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/COMMENTERTHE9/Cx_lang" rel="noopener noreferrer"&gt;github.com/COMMENTERTHE9/Cx_lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/commenterthe9"&gt;dev.to/commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href="https://bsky.app/profile/thecomment.bsky.social" rel="noopener noreferrer"&gt;thecomment.bsky.social&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href="https://x.com/commenterthe9" rel="noopener noreferrer"&gt;@commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://cx-lang.com/blog/2026-04-25" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-04-25&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-04-21</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Wed, 22 Apr 2026 00:36:56 +0000</pubDate>
      <link>https://forem.com/commenterthe9/cx-dev-log-2026-04-21-511j</link>
      <guid>https://forem.com/commenterthe9/cx-dev-log-2026-04-21-511j</guid>
      <description>&lt;p&gt;A holding pattern dominated April 21st: no developer-authored commits across any branch for three days straight. Yet, beneath the surface, there's a vibrant narrative unfolding with 15 real feature commits beckoning from the &lt;code&gt;submain&lt;/code&gt; branch.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Submain Conundrum
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;submain&lt;/code&gt; might feel like the underdog of the branches, but it's where the action is. It holds 15 unmerged, non-trivial commits, datelined back to &lt;code&gt;eb65acf&lt;/code&gt; on April 13th. That's an 8-day integration canyon we're staring into.&lt;/p&gt;

&lt;p&gt;What's brewing in those 15 commits? Let's talk specifics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;code&gt;Result&lt;/code&gt; error model featuring &lt;code&gt;Ok&lt;/code&gt;, &lt;code&gt;Err&lt;/code&gt;, and the magic of the &lt;code&gt;?&lt;/code&gt; operator&lt;/li&gt;
&lt;li&gt;New integer overflow enforcement rules&lt;/li&gt;
&lt;li&gt;A syntax update making semicolons optional&lt;/li&gt;
&lt;li&gt;A vital diagnostics pass&lt;/li&gt;
&lt;li&gt;A chunk of parser audits plus a body-gap fix&lt;/li&gt;
&lt;li&gt;Control flow advances through Phase 10, addressing constructs like while, for, loop/break/continue&lt;/li&gt;
&lt;li&gt;And, not to be overlooked, a basic test runner&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On &lt;code&gt;submain&lt;/code&gt;, the test matrix boasts a robust 116/116, recorded as of April 18th. There’s even talk of uncommitted work - a recursive type parser revamp, struct field type resolutions, stack increases, truncation fixes, and new tests and programs. This work's current status? Shrouded in mystery, possibly stashed in a local tree or, worse, vanished.&lt;/p&gt;

&lt;p&gt;Over on &lt;code&gt;main&lt;/code&gt;, the matrix is steady but lags at 78/78. The gulf between what &lt;code&gt;main&lt;/code&gt; recognizes and &lt;code&gt;submain&lt;/code&gt; proves is as glaring as it gets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Roadmap Limbo
&lt;/h2&gt;

&lt;p&gt;Version 4.8’s roadmap on &lt;code&gt;main&lt;/code&gt; is gathering dust with unchecked hard blockers for the 0.1 milestone:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Basic test runner&lt;/li&gt;
&lt;li&gt;Minimal error model&lt;/li&gt;
&lt;li&gt;Enforced integer overflow handling&lt;/li&gt;
&lt;li&gt;Consistent semicolon enforcement&lt;/li&gt;
&lt;li&gt;Parser, semantic, interpreter harmony on all constructs&lt;/li&gt;
&lt;li&gt;No known memory boundary model soundness issues&lt;/li&gt;
&lt;li&gt;Passing examples&lt;/li&gt;
&lt;li&gt;User-friendly diagnostics for common errors&lt;/li&gt;
&lt;li&gt;Roadmap-spec alignment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Submain, on its part, has resolved many of these hurdles. The test runner, error model, integer overflow policy, semicolon handling, and diagnostics features all stand ready. But with no merge, these roadmap items languish unchecked, splitting the vision between &lt;code&gt;main&lt;/code&gt; and the more aligned &lt;code&gt;submain&lt;/code&gt; roadmap (v4.7).&lt;/p&gt;

&lt;h2&gt;
  
  
  Branch Chaos
&lt;/h2&gt;

&lt;p&gt;A total of twenty daily-log branches, remnants from March and April, clutter the remote. The last successful merge from a daily-log branch to &lt;code&gt;main&lt;/code&gt; was way back on March 31st. While these branches serve as valuable records, their growing count is breeding operational chaos.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Road Ahead
&lt;/h2&gt;

&lt;p&gt;The forthcoming steps have been on repeat for days, with five priorities in the queue:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Secure the audit Part 2 sprint on &lt;code&gt;submain&lt;/code&gt; (assuming it still survives)&lt;/li&gt;
&lt;li&gt;Execute the long-awaited &lt;code&gt;submain&lt;/code&gt; to &lt;code&gt;main&lt;/code&gt; merge&lt;/li&gt;
&lt;li&gt;Refresh the roadmap post-merge&lt;/li&gt;
&lt;li&gt;Bolster the audit Part 2 scope&lt;/li&gt;
&lt;li&gt;Dive into IR lowering for &lt;code&gt;Result&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Merging &lt;code&gt;submain&lt;/code&gt; with &lt;code&gt;main&lt;/code&gt; isn't just a task; it's a necessity. This action has the potential to boost the test matrix from 78 to at least 116, erase multiple critical blockers, and propel towards the final audit and the 0.1 release barriers. Everything, subsequently, hangs on this pivotal move.&lt;/p&gt;

&lt;p&gt;The sequence feels stalled not at a standstill, but rather at a pause with bated breath. The efforts are real and present. They just need movement.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the Cx language project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://cx-lang.com" rel="noopener noreferrer"&gt;cx-lang.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/COMMENTERTHE9/Cx_lang" rel="noopener noreferrer"&gt;github.com/COMMENTERTHE9/Cx_lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/commenterthe9"&gt;dev.to/commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href="https://bsky.app/profile/thecomment.bsky.social" rel="noopener noreferrer"&gt;thecomment.bsky.social&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href="https://x.com/commenterthe9" rel="noopener noreferrer"&gt;@commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://cx-lang.com/blog/2026-04-21" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-04-21&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-04-20</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Tue, 21 Apr 2026 00:38:07 +0000</pubDate>
      <link>https://forem.com/commenterthe9/cx-dev-log-2026-04-20-2mi7</link>
      <guid>https://forem.com/commenterthe9/cx-dev-log-2026-04-20-2mi7</guid>
      <description>&lt;p&gt;Nothing happened in the repo today. No commits on any branch, no uncommitted work detected, clean working tree on main. The matrix is still 78/78. This is a rest day or work happened somewhere outside the repository.&lt;/p&gt;

&lt;p&gt;The interesting story right now is not what shipped but what has not been integrated.&lt;/p&gt;

&lt;h2&gt;
  
  
  The submain gap at seven days
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;submain&lt;/code&gt; branch is sitting on 15 commits that have not reached &lt;code&gt;main&lt;/code&gt;. The last commit there was &lt;code&gt;eb65acf&lt;/code&gt; on April 13, the parser/semantic/interpreter audit Part 1 plus a parser body-gap fix. That was a week ago.&lt;/p&gt;

&lt;p&gt;Those 15 commits include real feature work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Result&lt;/code&gt; error model&lt;/li&gt;
&lt;li&gt;Integer overflow enforcement&lt;/li&gt;
&lt;li&gt;Semicolons made optional&lt;/li&gt;
&lt;li&gt;A diagnostics pass&lt;/li&gt;
&lt;li&gt;Parser audit Part 1&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On main, the matrix is 78/78. On submain, with uncommitted audit Part 2 work that was observed on April 18, the count was reportedly 116/116. That is a significant gap. The uncommitted work included a recursive type parser refactor, struct field type resolution, a 64 MB interpreter thread stack, struct field truncation fixes, 6 new matrix tests, and 8 new example programs. Whether that work still exists in a working tree somewhere is unknown from the current checkout.&lt;/p&gt;

&lt;p&gt;The roadmap divergence compounds the problem. Main is on v4.8, submain is on v4.7. Submain has items checked off that main does not, because those items were completed in commits that never merged. Every day this sits, the merge gets slightly more involved, and the roadmap reconciliation requires more manual attention.&lt;/p&gt;

&lt;h2&gt;
  
  
  The branch backlog
&lt;/h2&gt;

&lt;p&gt;Nineteen daily-log branches from April (04-01 through 04-19) sit on the remote without being merged to main. The last daily log that actually reached main was 2026-03-31. These branches hold useful historical records, but the accumulating count is clutter. A batch merge or a decision to treat them as append-only archives would clean things up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hard blockers on main
&lt;/h2&gt;

&lt;p&gt;The roadmap on main (v4.8) still lists these hard blockers as unchecked:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Basic test runner&lt;/li&gt;
&lt;li&gt;Minimal error model&lt;/li&gt;
&lt;li&gt;Integer overflow behavior enforced&lt;/li&gt;
&lt;li&gt;Semicolon rule enforced consistently&lt;/li&gt;
&lt;li&gt;Parser/semantic/interpreter agreement on all constructs&lt;/li&gt;
&lt;li&gt;No known soundness holes in memory boundary model&lt;/li&gt;
&lt;li&gt;All examples pass&lt;/li&gt;
&lt;li&gt;Diagnostics readable for common mistakes&lt;/li&gt;
&lt;li&gt;Roadmap and spec match actual behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Several of these have corresponding commits on submain that would satisfy or partially satisfy them. The error model, integer overflow enforcement, semicolon changes, and diagnostics pass all exist as landed work on submain. Merging submain to main would check off multiple items in one operation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is next
&lt;/h2&gt;

&lt;p&gt;The same five items from yesterday, none of which happened today:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Commit the audit Part 2 sprint on submain (if that working tree still exists)&lt;/li&gt;
&lt;li&gt;Merge submain into main (15 commits, the single highest-leverage action available)&lt;/li&gt;
&lt;li&gt;Update the roadmap after the merge&lt;/li&gt;
&lt;li&gt;Broader audit Part 2 coverage&lt;/li&gt;
&lt;li&gt;IR lowering for &lt;code&gt;Result&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The submain merge is the obvious first move. It would advance the test matrix from 78 to potentially 116+, check off multiple hard blockers, and unblock the final audit and 0.1 gate work. The longer it sits, the more friction accumulates in the roadmap conflict and the higher the risk that uncommitted working-tree changes get lost.&lt;/p&gt;

&lt;p&gt;Two consecutive idle days now. Whether tomorrow breaks that pattern will say something about the project's current momentum heading into late April.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the Cx language project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://cx-lang.com" rel="noopener noreferrer"&gt;cx-lang.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/COMMENTERTHE9/Cx_lang" rel="noopener noreferrer"&gt;github.com/COMMENTERTHE9/Cx_lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/commenterthe9"&gt;dev.to/commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href="https://bsky.app/profile/thecomment.bsky.social" rel="noopener noreferrer"&gt;thecomment.bsky.social&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href="https://x.com/commenterthe9" rel="noopener noreferrer"&gt;@commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://cx-lang.com/blog/2026-04-20" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-04-20&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-04-15</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Thu, 16 Apr 2026 00:11:24 +0000</pubDate>
      <link>https://forem.com/commenterthe9/cx-dev-log-2026-04-15-3cml</link>
      <guid>https://forem.com/commenterthe9/cx-dev-log-2026-04-15-3cml</guid>
      <description>&lt;p&gt;Narrow focus today. Not a single line of code progressed, but we did see two documentation commits shape up, holding still at &lt;code&gt;main&lt;/code&gt; commit &lt;code&gt;87d68f6&lt;/code&gt; from March 31. Meanwhile, &lt;code&gt;submain&lt;/code&gt; stays at &lt;code&gt;eb65acf&lt;/code&gt; from April 13. With no merges or movements on branches that involve compilation, it was all about refining the narrative. Here's what shifted: a back-filled blog post went live on the site, and the daily log got a rewrite, standing alone in its own branch.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Landed
&lt;/h2&gt;

&lt;p&gt;The commit &lt;code&gt;5b59c58&lt;/code&gt; on &lt;code&gt;origin/site&lt;/code&gt; introduced "dev log 2026-04-09". This commit adds a 42-line MDX post into &lt;code&gt;src/content/blog/2026-04-09.mdx&lt;/code&gt;, effectively back-filling the April 9 entry. It's simply documentation—no new code, but it does bring &lt;code&gt;origin/site&lt;/code&gt; up to 24 blog MDX files as of 2026-04-14. The content reflects another idle day, highlighting both the submain gap as it existed on April 9, and the accumulated log backlog.&lt;/p&gt;

&lt;p&gt;On the daily-log front, commit &lt;code&gt;1d5b7de&lt;/code&gt; on &lt;code&gt;origin/daily-log-2026-04-14&lt;/code&gt; revamps &lt;code&gt;daily_log/2026-04-14.md&lt;/code&gt;, with a substantial +144 / −64 change in a single file. This tweak replaces the previous 00:06 UTC draft with a more formatted, conclusive log. It not only dives into the April 13 EDT sprint commits for context but also distinguishes between work committed in EDT versus what landed in UTC. As before, no new code here either.&lt;/p&gt;

&lt;p&gt;Both commits carry the author &lt;code&gt;Claude &amp;lt;noreply@anthropic.com&amp;gt;&lt;/code&gt;, with no signs of new commits from &lt;code&gt;COMMENTERTHE9&lt;/code&gt; during this window. The latest human contribution remains as &lt;code&gt;eb65acf&lt;/code&gt; in &lt;code&gt;origin/submain&lt;/code&gt; from April 13 at 23:45 UTC, outside of this documentation-heavy 24-hour slice.&lt;/p&gt;

&lt;h2&gt;
  
  
  In Progress
&lt;/h2&gt;

&lt;p&gt;A quick &lt;code&gt;git status --short --branch&lt;/code&gt; reveals no pending tasks—clean slate, no diffs, no untracked files. However, "in-progress" looms in the form of integration debt dotted across different branches, not yet folded into &lt;code&gt;main&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;submain&lt;/code&gt; stands 15 commits, and 97 files (&lt;code&gt;+1974/−627&lt;/code&gt;) ahead of &lt;code&gt;main&lt;/code&gt;. This spans work like Part 1 audit with body-gap fixes, diagnostics readability enhancements, making semicolons optional in function bodies, handling integer overflow at declared widths, the examples/warning/roadmap sprint, the formation of a minimal error model, Phase 10 loop lowering, the Agent Operating Doctrine doc, the creation of a basic test runner, locking in the UTF-8 decision, and enforcing wrapping arithmetic.&lt;/li&gt;
&lt;li&gt;The daily-log branch backlog has grown, containing 13 unmerged branches ranging &lt;code&gt;2026-03-29&lt;/code&gt; to &lt;code&gt;04-14&lt;/code&gt;, minus &lt;code&gt;04-11&lt;/code&gt;. Each is essentially a single daily-log commit against &lt;code&gt;main&lt;/code&gt;, which could potentially cause conflicts with &lt;code&gt;submain&lt;/code&gt;'s roadmap updates.&lt;/li&gt;
&lt;li&gt;There's now a chasm of 15 blog posts in &lt;code&gt;site&lt;/code&gt; beyond &lt;code&gt;main&lt;/code&gt;, including today’s 2026-04-09 entry.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Roadmap and Decisions
&lt;/h2&gt;

&lt;p&gt;The roadmap document &lt;code&gt;docs/frontend/ROADMAP.md&lt;/code&gt; remained untouched; it’s still on v4.8 from March 28. No blockers have closed, and no quality gates shifted. The open tasks match yesterday's log exactly: resolving &lt;code&gt;audit_09&lt;/code&gt; truncations, implementing recursive &lt;code&gt;result_type&lt;/code&gt;s, handling &lt;code&gt;Result&lt;/code&gt; in IR lowering, and those vital merges, especially submain→main. The repo-not-having-a-&lt;code&gt;docment&lt;/code&gt;-directory note got reiterated, a reminder that the roadmap lurks at &lt;code&gt;docs/frontend/ROADMAP.md&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;Next, it’s still about moving long-standing tasks forward. Five key items hang in limbo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Merging &lt;code&gt;submain&lt;/code&gt; into &lt;code&gt;main&lt;/code&gt;, tackling fifteen work commits and four hard-blockers while dodging roadmap conflicts. Resolve the eldest daily-log branches to aid this.&lt;/li&gt;
&lt;li&gt;Fix the &lt;code&gt;audit_09&lt;/code&gt; issue, where compound assignment on struct fields is bypassing width truncation—requires an &lt;code&gt;apply_numeric_cast&lt;/code&gt; in &lt;code&gt;CompoundAssign&lt;/code&gt; for field's &lt;code&gt;SemanticType&lt;/code&gt;, then bump to matrix regression. This is critical to finally close the integer-overflow blocker.&lt;/li&gt;
&lt;li&gt;Shift &lt;code&gt;result_type&lt;/code&gt; into &lt;code&gt;recursive()&lt;/code&gt; to unblock constructs like &lt;code&gt;Result&amp;gt;&lt;/code&gt;, &lt;code&gt;Handle&amp;gt;&lt;/code&gt;, and those nested generic compositions.&lt;/li&gt;
&lt;li&gt;Finish integrating &lt;code&gt;Result&lt;/code&gt; into IR lowering. While &lt;code&gt;submain&lt;/code&gt; covers the interpreter path, &lt;code&gt;lower.rs&lt;/code&gt; still yells &lt;code&gt;unsupported!&lt;/code&gt; for &lt;code&gt;ResultOk&lt;/code&gt;, &lt;code&gt;ResultErr&lt;/code&gt;, &lt;code&gt;Try&lt;/code&gt;, and &lt;code&gt;SemanticType::Result(_)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Audit Part 2: focus in on arrays, imports plus generics, nested generics, and &lt;code&gt;copy_into&lt;/code&gt; under &lt;code&gt;Result&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Yesterday predicted this path, and today hasn't budged an inch. Project-wise, we’re still in that documentation review groove. But for what's next—those five unresolved work points are looming large.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the Cx language project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://cx-lang.com" rel="noopener noreferrer"&gt;cx-lang.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/COMMENTERTHE9/Cx_lang" rel="noopener noreferrer"&gt;github.com/COMMENTERTHE9/Cx_lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/commenterthe9"&gt;dev.to/commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href="https://bsky.app/profile/thecomment.bsky.social" rel="noopener noreferrer"&gt;thecomment.bsky.social&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href="https://x.com/commenterthe9" rel="noopener noreferrer"&gt;@commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://cx-lang.com/blog/2026-04-15" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-04-15&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-04-09</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Wed, 15 Apr 2026 00:19:39 +0000</pubDate>
      <link>https://forem.com/commenterthe9/cx-dev-log-2026-04-09-6b8</link>
      <guid>https://forem.com/commenterthe9/cx-dev-log-2026-04-09-6b8</guid>
      <description>&lt;p&gt;Two days of silence in the commit history—hardly ideal when submain is still fourteen days unmerged and a growing backlog of daily-log branches are knocking. The working tree on &lt;code&gt;main&lt;/code&gt; is untouched, but &lt;code&gt;submain&lt;/code&gt;? That's a different story.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Submain Gap
&lt;/h2&gt;

&lt;p&gt;Let's talk about &lt;code&gt;submain&lt;/code&gt;. It's 14 days out, ahead of &lt;code&gt;main&lt;/code&gt; with five crucial commits:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;d93582b&lt;/code&gt;&lt;/strong&gt; — shifts integer operations from saturating to wrapping, managing those tricky &lt;code&gt;i128::MIN&lt;/code&gt; edge cases.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;0fa06a6&lt;/code&gt;&lt;/strong&gt; — drops Phase 10 enhancements in looping constructs with a fresh CFG structure, loop-carried SSA, and a backedge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;09ef2a3&lt;/code&gt;&lt;/strong&gt; — cements our stance on UTF-8, calling for strict adherence across the board.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;e214d15&lt;/code&gt;&lt;/strong&gt; — specifies that semicolons are optional except in expression statements.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;762b188&lt;/code&gt;&lt;/strong&gt; — initiates our basic test runner with assertions and a &lt;code&gt;--test&lt;/code&gt; mode.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The diff against &lt;code&gt;main&lt;/code&gt; is comprehensive: 24 modified files, with 367 lines added and 501 removed. Key files like &lt;code&gt;main.rs&lt;/code&gt;, &lt;code&gt;runtime.rs&lt;/code&gt;, &lt;code&gt;parser.rs&lt;/code&gt;, and others reflect these tested changes. They address hard blockers in integer overflow, test running, and semicolon rules, alongside finalizing the UTF-8 decision. Yet, none of this has transitioned to &lt;code&gt;main&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The only probable conflict? &lt;code&gt;docs/frontend/ROADMAP.md&lt;/code&gt;, a shared edit site. But within the code, it's smooth sailing so far.&lt;/p&gt;

&lt;h2&gt;
  
  
  Daily-log Backlog
&lt;/h2&gt;

&lt;p&gt;Today, that backlog hit nine, with new entries since yesterday. We have &lt;code&gt;daily-log-2026-03-29&lt;/code&gt; and a continuous stretch from &lt;code&gt;daily-log-2026-04-01&lt;/code&gt; through &lt;code&gt;daily-log-2026-04-08&lt;/code&gt;. Each branch is a window into daily activities and plans—and a potential headache the longer they're delayed. Letting it pile up only raises the stakes for eventual merges, particularly with roadmap conflicts looming.&lt;/p&gt;

&lt;h2&gt;
  
  
  Roadmap Standoff
&lt;/h2&gt;

&lt;p&gt;The roadmap holds steady at v4.8, still accurately mapping &lt;code&gt;main's&lt;/code&gt; landscape. None of the hard blocker boxes—for the test runner, integer overflow, or semicolons—is checked, since the work isn't visible to &lt;code&gt;main&lt;/code&gt;. The UTF-8 blocker is the exception, duly noted as a decision residing on &lt;code&gt;submain&lt;/code&gt;. Any updates reflecting this work on &lt;code&gt;main&lt;/code&gt;? Not happening yet; it'd be premature until merges land.&lt;/p&gt;

&lt;p&gt;A quick navigation tip: roadmap instructions mistakenly refer to &lt;code&gt;docment/ROADMAP.md&lt;/code&gt;. It's &lt;code&gt;docs/frontend/ROADMAP.md&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Lies Ahead
&lt;/h2&gt;

&lt;p&gt;The plan is unbudged:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Submain to Main Merge.&lt;/strong&gt; Front and center for 14 days: incorporate &lt;code&gt;submain&lt;/code&gt;'s five commits and untangle any roadmap fallout.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tackle the Backlog.&lt;/strong&gt; Nine branches of daily logs wait to be unraveled, starting from the oldest.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error Model (&lt;code&gt;Result&lt;/code&gt;).&lt;/strong&gt; Syntax is defined in the spec, but there's no implementational trace yet. This becomes the pivotal blocker post-merge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;:=&lt;/code&gt; Type Inference.&lt;/strong&gt; Not started but much anticipated for 0.1.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The tempo's been idle, but the clock is ticking on these merges. Until &lt;code&gt;submain&lt;/code&gt; graduates to &lt;code&gt;main&lt;/code&gt;, we're stuck watching everything else stack up. &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Follow the Cx language project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://cx-lang.com" rel="noopener noreferrer"&gt;cx-lang.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/COMMENTERTHE9/Cx_lang" rel="noopener noreferrer"&gt;github.com/COMMENTERTHE9/Cx_lang&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/commenterthe9"&gt;dev.to/commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bluesky: &lt;a href="https://bsky.app/profile/thecomment.bsky.social" rel="noopener noreferrer"&gt;thecomment.bsky.social&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter/X: &lt;a href="https://x.com/commenterthe9" rel="noopener noreferrer"&gt;@commenterthe9&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://cx-lang.com/blog/2026-04-09" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-04-09&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
