<?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>DEV Community: COMMENTERTHE9</title>
    <description>The latest articles on DEV Community by COMMENTERTHE9 (@commenterthe9).</description>
    <link>https://dev.to/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>DEV Community: COMMENTERTHE9</title>
      <link>https://dev.to/commenterthe9</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/commenterthe9"/>
    <language>en</language>
    <item>
      <title>Cx Dev Log — 2026-05-20</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Mon, 15 Jun 2026 00:10:36 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-05-20-kpf</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-05-20-kpf</guid>
      <description>&lt;p&gt;The JIT backend just saw its most significant leap forward with the latest commits hitting submain. We've locked in method-call lowering, tackled print argument widening, and fixed some key differential harness issues. This single day moved parity forward: from 99 PASS and 83 SKIP to 110 PASS with 72 SKIP, all without hitting any PARITY_FAILs across the board of 182 fixtures.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method-call lowering: synthesis over duplication
&lt;/h2&gt;

&lt;p&gt;We hit a big milestone with method-call lowering — a major code change landed that replaced our previous stub with full end-to-end functionality. The main decision was whether &lt;code&gt;MethodCall&lt;/code&gt; should be treated as a standalone process duplicating existing &lt;code&gt;Call&lt;/code&gt; logic or if it should leverage existing infrastructure. We opted for delegation: at &lt;code&gt;lower.rs:1791&lt;/code&gt;, the &lt;code&gt;MethodCall&lt;/code&gt; now converts the operation into a &lt;code&gt;Call&lt;/code&gt;, using the receiver as the first argument, diving into existing logic rather than creating new pathways. This keeps method dispatch as a streamlined translation layer rather than a cumbersome parallel process.&lt;/p&gt;

&lt;p&gt;With this update, our ingestion process now keeps alias parameters intact, registering methods with modified names (&lt;code&gt;{Struct}${method}&lt;/code&gt;) in the signature table. Thanks to this, new test cases (t175/t176/t177) for basic implementation, return paths, and multi-alias methods passed seamlessly.&lt;/p&gt;

&lt;p&gt;The same commit tackled literal-width narrowing. It highlighted how &lt;code&gt;Numeric&lt;/code&gt; literals matched against typed peers in operations. Instead of a patchwork fix for &lt;code&gt;MethodCall&lt;/code&gt;, the solution incorporated a comprehensive surface-level approach: aiding &lt;code&gt;assert_eq&lt;/code&gt; peer narrowing, across comparative operators, and &lt;code&gt;MethodCall&lt;/code&gt; arguments with the &lt;code&gt;insert_cast_if_needed&lt;/code&gt; function. A dedicated fixture (t178) confirms this refinement: ordering comparisons on narrow integers now clear on all fronts. This commit improved parity by +16 PASS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Print argument widening
&lt;/h2&gt;

&lt;p&gt;One crucial gap was within our &lt;code&gt;cx_printn&lt;/code&gt; runtime intrinsic, which was limited to I64. Enter &lt;code&gt;route_print_arg&lt;/code&gt;: this new helper extends I8/I16/I32 to I64 through casting and guides Bool/TBool to a dedicated &lt;code&gt;cx_print_bool&lt;/code&gt; external. Our approach targets distinct type families rather than one-size-fits-all — integers expand into &lt;code&gt;cx_printn&lt;/code&gt;, booleans take their intrinsic path, and F64/I128 await attention post-version 0.1.&lt;/p&gt;

&lt;p&gt;We saw immediate resonance in these updates: a +11 PASS jump with no steps back. Fixtures t01 and t115 succeeded at last, and bool outputs aligned with interpreter outcomes. Gaps still exist but aren't our intrinsic's fault — they rest with other structures downstream, like in t41 and t109.&lt;/p&gt;

&lt;h2&gt;
  
  
  Harness hardening
&lt;/h2&gt;

&lt;p&gt;Our differential testing setup just got sturdier. Two fixes have shored up real vulnerabilities.&lt;/p&gt;

&lt;p&gt;The first ripples into our process as it closes hard blocker H1. Previously, a non-JIT binary via standard &lt;code&gt;cargo build&lt;/code&gt; would bypass all parity fixtures as SKIPs. Now, &lt;code&gt;assert_jit_capable()&lt;/code&gt; assesses the binary at initialization, halting in 30ms if JIT support is absent. This correction erases a swath of misleading CI successes.&lt;/p&gt;

&lt;p&gt;The second tackles H5 — a hiccup in metric consistency across four successive commits. Despite reporting 94/88, actual table values were 99/83. The solution? An &lt;code&gt;AUTHORITATIVE TOTALS&lt;/code&gt; line using the same accumulators as the detailed table — ensuring cut-and-dry truth, avoiding manual errors.&lt;/p&gt;

&lt;h2&gt;
  
  
  0.1 readiness audit
&lt;/h2&gt;

&lt;p&gt;Two audit commitments embedded per-item verification directly into the roadmap file using HTML comments. Reviewers can nod along with &lt;code&gt;&amp;lt;!-- audit: VERIFIED --&amp;gt;&lt;/code&gt; or spot &lt;code&gt;&amp;lt;!-- audit: DRIFTED --&amp;gt;&lt;/code&gt; marks as the scorecards apply. Verdict from these audits? We're not ready for 0.1. Despite conquering H1, H2, and H5 today, hurdles like H3 (when-block lowering) and H4 (feature-branch parity items CX-91/CX-94/CX-34) loom.&lt;/p&gt;

&lt;p&gt;Interesting discovery: the Cast category's green status in parity reports isn't what it seems. Recent PASSes stem from narrowing touches, not a completed CX-91 Cast JIT implementation.&lt;/p&gt;

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

&lt;p&gt;Crossing off three blockers — H1, H2, H5 — leaves us grappling with H3 and H4. The CX-233 while-in loop lowering branch is fully fleshed out, tested, yet still waiting in the wings to merge into submain for the third day. When-block lowering (H3) holds back three SKIP cases and is the last blocker squarely in our domain.&lt;/p&gt;

&lt;p&gt;Meanwhile, the submain-to-main gap has ballooned to 179 commits, pegged as overdue in daily logs spanning two weeks. The rising cost of integration could soon outweigh remaining feature quests.&lt;/p&gt;

&lt;p&gt;Our JIT parity sits at 110/182 (60.4%), but the SKIPs that remain are more from specific construct needs rather than missing fundamental blocks. While 0.1 readiness remains elusive, the path forward is not.&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-20" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-05-20&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-06-13</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Sun, 14 Jun 2026 02:42:56 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-06-13-3mi</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-06-13-3mi</guid>
      <description>&lt;p&gt;No commits landed today. No compiler work, no new features, no bug fixes. The only activity in the last 24 hours was automated: a site blog deploy and the June 12 daily log update. Both are housekeeping, not development.&lt;/p&gt;

&lt;p&gt;That makes this a good moment to look at the state of the project and what's accumulating.&lt;/p&gt;

&lt;h2&gt;
  
  
  The submain gap
&lt;/h2&gt;

&lt;p&gt;Submain sits 8 commits ahead of main. Those commits carry the CR#1-4 range-check sweep and the D1.0-D1.1 audit arc work. This gap has been open for at least three days now and continues to grow staler. Merging submain to main remains the single highest-leverage action available, and it keeps not happening.&lt;/p&gt;

&lt;p&gt;The test matrix on main was last reported at 230/0. The current checkout (an older branch point on &lt;code&gt;daily-log-2026-05-30&lt;/code&gt;) shows 172 PASS / 10 FAIL out of 182, but those 10 failures are CRLF line-ending artifacts where expected and actual output match in content but differ in endings. Not real failures.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stalled example rewrites
&lt;/h2&gt;

&lt;p&gt;Eight example files have been sitting modified in the working tree since May 23, over three weeks now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;hello.cx&lt;/code&gt;, &lt;code&gt;fibonacci.cx&lt;/code&gt;, &lt;code&gt;error_handling.cx&lt;/code&gt;, &lt;code&gt;structs_and_methods.cx&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;generics.cx&lt;/code&gt;, &lt;code&gt;tbool_uncertainty.cx&lt;/code&gt;, &lt;code&gt;arrays_and_loops.cx&lt;/code&gt;, &lt;code&gt;fizzbuzz.cx&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The changes are substantial (+280 / -78 lines) and represent a pedagogical rewrite: block-comment documentation, renamed variables for clarity, restructured code flow. The fibonacci example swapped from recursive to iterative with a &lt;code&gt;classify&lt;/code&gt; helper. The generics example switched from float pairs to string pairs to better show type-parameter flexibility.&lt;/p&gt;

&lt;p&gt;This work is either ready to commit or should be dropped. Leaving it uncommitted in the working tree for three weeks means it's accumulating risk of being accidentally lost or becoming stale against other changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Growing PR backlog
&lt;/h2&gt;

&lt;p&gt;Daily-log branches for June 5 through June 12 remain unmerged. That's eight branches sitting in the PR queue. None of these are controversial or risky merges. They're just waiting.&lt;/p&gt;

&lt;h2&gt;
  
  
  What didn't happen
&lt;/h2&gt;

&lt;p&gt;The June 12 log predicted four things for today: merge submain to main, continue the D1 audit arc, merge the daily-log PR backlog, and resume backend expansion. None of those happened, making it two consecutive days of zero-for-four on predictions.&lt;/p&gt;

&lt;p&gt;D1.2, which would gate JIT memory-safety, was identified on June 10 but has not started. The project is in a gap between the audit arc that opened on June 10 and whatever comes next.&lt;/p&gt;

&lt;h2&gt;
  
  
  Looking ahead
&lt;/h2&gt;

&lt;p&gt;The path forward is straightforward even if today was idle. The submain merge is the most obvious step. The example file decision (commit or discard) should follow. The daily-log PR backlog is low-effort to clear. And once those are done, D1.2 or backend Phase 11 are the next real development targets.&lt;/p&gt;

&lt;p&gt;Quiet days happen. The risk is when they stack up and the backlog compounds.&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-06-13" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-06-13&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-05-21</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Sun, 14 Jun 2026 00:08:31 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-05-21-4dma</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-05-21-4dma</guid>
      <description>&lt;p&gt;&lt;strong&gt;Cx Dev Log — Breaking Through the When-Block Hurdle&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The introduction of &lt;code&gt;when&lt;/code&gt; block IR lowering has marked a significant checkpoint for Cx, as seen in a 426-line commit to submain. This brings us closer to addressing hard blocker H3, an integral step for the 0.1 release. The JIT parity matrix saw an uplifting shift from 110 to 120 passing fixtures, thanks in part to resolving a compound-assign narrowing issue. Here's how it came together.&lt;/p&gt;

&lt;h2&gt;
  
  
  How &lt;code&gt;when&lt;/code&gt; Lowering Works
&lt;/h2&gt;

&lt;p&gt;We've integrated a chained-decision control flow graph (CFG) for &lt;code&gt;when&lt;/code&gt; block lowering, aligning it with the strategy used for &lt;code&gt;lower_logical&lt;/code&gt; in handling AND/OR short-circuit evaluation. The process for each &lt;code&gt;when&lt;/code&gt; arm is as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Patterns such as Literal, Range, and TBool-unknown trigger Compare instructions, followed by a Branch directing to the arm body or the next block.&lt;/li&gt;
&lt;li&gt;Catchall arms execute a direct jump to their body.&lt;/li&gt;
&lt;li&gt;Statement-style &lt;code&gt;when&lt;/code&gt; blocks unify arm bodies using &lt;code&gt;merge_fallthroughs&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Expression-style &lt;code&gt;when&lt;/code&gt; blocks employ a typed block parameter for merging.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why not go for table-dispatch or SSA phi-node based merges? There's a simple reason: these alternatives would necessitate additional IR infrastructure, useful only for the &lt;code&gt;when&lt;/code&gt; functionality. By leveraging existing patterns, not only do we simplify, but we also ensure seamless integration with Cranelift's multi-way backend branching. For version 0.1, maximizing efficiency and reuse was the clear path forward.&lt;/p&gt;

&lt;h2&gt;
  
  
  TBool Unknown Matching
&lt;/h2&gt;

&lt;p&gt;Handling the TBool unknown case required a workaround: comparing the scrutinee against &lt;code&gt;ConstInt(I8, 2)&lt;/code&gt;, employing &lt;code&gt;Cast(I8 -&amp;gt; scrutinee.ty)&lt;/code&gt;, then performing a &lt;code&gt;Compare(Eq)&lt;/code&gt;. This ingenious method skirts the IR validator's constraints without venturing into literal semantics for the TBool, an issue still tabled for future discussion. Presently, focusing on wire value-based pattern matching sets a solid foundation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges with EnumVariant Arms
&lt;/h2&gt;

&lt;p&gt;EnumVariant arms remain a sticking point—better termed a deliberate limitation at this stage. The lowering process flags these as structured errors detailing the enum and variant. Until we tackle Enum IR lowering, fixtures such as t22, t27, and t28 will remain marked by the SKIP status. It’s a postponed target, slated for post-0.1 attention.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compound-Assign Narrowing Etched Out
&lt;/h2&gt;

&lt;p&gt;Another noteworthy update comes with commit &lt;code&gt;e4c9202&lt;/code&gt;, a fix that rectifies a gap in the &lt;code&gt;+=&lt;/code&gt;, &lt;code&gt;*=&lt;/code&gt;, etc., compound-assign paths. Previously, these routes missed narrowing numeric literals against target types, causing IR-validator Verifier errors when handling narrow-int fields. By extracting the target type from all &lt;code&gt;SemanticLValue&lt;/code&gt; variants and invoking &lt;code&gt;insert_cast_if_needed&lt;/code&gt; for numeric interactions, we achieved a corrective balance. This alignment nudged tests like t41_compound_assign_dot and t109_struct_field_overflow from SKIP to PASS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hard Blocker Status and What Lies Ahead
&lt;/h2&gt;

&lt;p&gt;We’ve made substantial headway, closing three hard blockers in two days:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;H1: closed (May 20)&lt;/li&gt;
&lt;li&gt;H2: closed (May 20)&lt;/li&gt;
&lt;li&gt;H3: substantially addressed (May 21, Option A scope)&lt;/li&gt;
&lt;li&gt;H5: closed (May 20)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;H4 is the next frontier, encompassing features such as CX-91, CX-94, and CX-34 that are still pending. As we shift focus to the remaining 62 SKIP fixtures, tackling Enum IR lowering and other unaddressed constructs emerges as a priority. Immediate targets aren't crystal clear—each demands dissecting to diagnose specific barriers.&lt;/p&gt;

&lt;p&gt;The task of evolving the submain-to-main merge looms large, as submain extends 181 commits beyond. This anticipated merge has been on the horizon since May 6, yet remains elusive. Today’s updates count as merely additional steps towards this pivotal integration.&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-21" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-05-21&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-05-22</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Sat, 13 Jun 2026 00:09:02 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-05-22-ma1</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-05-22-ma1</guid>
      <description>&lt;p&gt;v0.1.0 is tagged. PR #266 merged submain into main, bringing roughly 181 commits and 16,325 insertions across 109 changed files. The test matrix on main jumped from 117 to 182, all passing. The submain gap that had been growing since May 4 is now zero. This is the single largest integration event in the project's history so far.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the merge brought
&lt;/h2&gt;

&lt;p&gt;The v0.1.0 merge carried the entire backend pipeline onto main: Cranelift JIT, the differential test harness, host boundary, IR lowering through Phase 15. It also brought 65 new verification fixtures (t117 through t178), eight working examples, new backend documentation, CodeRabbit config, and CI expansion. All of this had been accumulating on submain since the last merge on May 4.&lt;/p&gt;

&lt;p&gt;Six prep commits preceded the merge to get submain into release shape: semantic hardening, roadmap audits, dead-code cleanup, and doc reconciliation. The final readiness audit (&lt;code&gt;be29a96&lt;/code&gt;) declared submain 0.1-READY, confirming all five H-series hard blockers closed. Full suite 411/0/0. JIT parity 120/62/0. The 62 remaining JIT SKIPs all map to acknowledged post-0.1 features (enums, generics, &lt;code&gt;Handle&lt;/code&gt;, string interpolation, &lt;code&gt;Result/?&lt;/code&gt;, &lt;code&gt;WhileIn&lt;/code&gt;, t128/f64 print, full TBool unknown propagation).&lt;/p&gt;

&lt;h2&gt;
  
  
  Semantic analysis hardening
&lt;/h2&gt;

&lt;p&gt;One of the pre-release prep commits deserves its own section. The method-call analysis path in &lt;code&gt;src/frontend/semantic.rs&lt;/code&gt; got a substantial rewrite (&lt;code&gt;075d3dc&lt;/code&gt;). Previously, unresolved method receivers would fall through to the IR layer's mangled-callee miss and produce unhelpful &lt;code&gt;UnresolvedSemanticArtifact&lt;/code&gt; errors. Now the pipeline catches these earlier:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Receivers not in scope get a clear scope error.&lt;/li&gt;
&lt;li&gt;Non-struct receivers are rejected with type information.&lt;/li&gt;
&lt;li&gt;Undefined methods produce a &lt;code&gt;method '{struct}.{method}' is not defined&lt;/code&gt; diagnostic.&lt;/li&gt;
&lt;li&gt;Arity is enforced at analysis time, mirroring the free-function precedent.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The dead &lt;code&gt;classify_type&lt;/code&gt; function was also removed. This is the kind of error-quality work that makes sense right before a release cut -- users hitting these paths should get actionable diagnostics, not IR-layer artifacts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build hygiene
&lt;/h2&gt;

&lt;p&gt;The polish commit (&lt;code&gt;23971f4&lt;/code&gt;) touched 17 files across &lt;code&gt;src/&lt;/code&gt;, &lt;code&gt;docs/&lt;/code&gt;, and &lt;code&gt;docment/&lt;/code&gt;. It added &lt;code&gt;#[allow(dead_code)]&lt;/code&gt; annotations on intentionally-retained items in &lt;code&gt;ast.rs&lt;/code&gt;, &lt;code&gt;resolver.rs&lt;/code&gt;, &lt;code&gt;semantic_types.rs&lt;/code&gt;, &lt;code&gt;types.rs&lt;/code&gt;, &lt;code&gt;builder.rs&lt;/code&gt;, &lt;code&gt;ir/types.rs&lt;/code&gt;, &lt;code&gt;validate.rs&lt;/code&gt;, and &lt;code&gt;runtime.rs&lt;/code&gt;. It fixed the clippy error in &lt;code&gt;ir/printer.rs&lt;/code&gt; (the &lt;code&gt;if i &amp;gt; 0 || true&lt;/code&gt; pattern) and removed dead re-exports from &lt;code&gt;ir/mod.rs&lt;/code&gt;. Build warnings went from 20 to 0. Clippy errors went from 1 to 0.&lt;/p&gt;

&lt;h2&gt;
  
  
  README rewrite
&lt;/h2&gt;

&lt;p&gt;The README was substantially rewritten from 67 lines of mixed prose and tables to 213 lines of structured documentation. It is now organized around: "Why Cx Exists," "What 0.1.0 Proves," "Current Verification Status," "What Works in 0.1.0," language core and memory model listings, interpreter and JIT sections, deferred post-0.1 items, and cleaner getting-started instructions. This is the project's first public-facing documentation update since reaching v0.1.0, and it signals a shift from build-phase framing to expand-phase framing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Roadmap updates
&lt;/h2&gt;

&lt;p&gt;Three roadmap commits landed on submain before the merge:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CX-91/94 marked as landed, CX-34 marked as canceled (scope superseded by later items).&lt;/li&gt;
&lt;li&gt;A duplicate soft-blocker ID was renamed (S5 to S9).&lt;/li&gt;
&lt;li&gt;The "Merged to submain (not yet on main)" section was retitled to "Landed (integrated to main via v0.1.0 merge)."&lt;/li&gt;
&lt;li&gt;Frontend section updated: test count from 117/117 to 182/182, status from "release candidate" to "v0.1.0 released."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Phase 11 items "Method call actual lowering" and "&lt;code&gt;when&lt;/code&gt; block lowering or structured rejection" are now checked off as delivered on main.&lt;/p&gt;

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

&lt;p&gt;With v0.1.0 tagged, the immediate priority shifts from "get it out" to "expand coverage." The README frames near-term priorities as: stabilize 0.1.1, improve examples and documentation, expand JIT PASS coverage, and add missing runtime ABI extensions.&lt;/p&gt;

&lt;p&gt;Concrete next moves: DotAccess in compound forms is the last unchecked Phase 11 sub-item. Enum IR lowering blocks EnumVariant when-arms and at least five parity fixtures. The 62 JIT SKIPs include fixtures blocked by narrow-int and f64 print formatting, which the README's deferred list explicitly names.&lt;/p&gt;

&lt;p&gt;The submain merge that had been predicted on four consecutive daily logs finally happened. Now the real post-release work begins.&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-22" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-05-22&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-06-10</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Thu, 11 Jun 2026 01:24:57 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-06-10-3h88</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-06-10-3h88</guid>
      <description>&lt;p&gt;Four type-checking and optimization-focused commits hit Cx's submain, unexpectedly shifting focus towards the D1 audit arc. Instead of prioritizing previous CR range-check fixes or backend development, we took a hard left into soundness and structural improvements. The changes added 11 more matrix fixtures, bumping submain from 261 to 272 without a hitch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Taming the JIT with Unseen Crash Classes
&lt;/h2&gt;

&lt;p&gt;Kickstarting the D1 audit, five new verification fixtures (D1.0) were added to explore JIT crash behaviors, previously untested in the 261-fixture net. Here's a breakdown:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Division/Modulo by Zero&lt;/strong&gt;: The usual &lt;code&gt;exit 1&lt;/code&gt; error in the interpreter caused hardware traps like SIGILL on JIT. These traps are locked down with &lt;code&gt;.jit_known_unsound&lt;/code&gt; sidecars.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edge Case in Overflow&lt;/strong&gt;: &lt;code&gt;t8 -128 / -1&lt;/code&gt; (an interpreter wrap to -128) triggers overflow in JIT. &lt;code&gt;t8 -128 % -1&lt;/code&gt;, though, skips the overflow, unexpectedly reaching arithmetic agreement.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Five fixtures later, these cases are now pinned down so any regressions can't sneak past unnoticed. Parity stayed healthy at 165 PASS / 101 SKIP / 0 FAIL, post D1.0.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nailing a Performance Baseline
&lt;/h2&gt;

&lt;p&gt;Can't improve what you can't measure, right? Before any heady changes, we nailed down a wall-time performance benchmark. Think arithmetic loops, recursive fibonacci, conditionals, and more. Eight programs ran through a PowerShell script doing 1 warmup and 7 real runs, taking medians and spreads.&lt;/p&gt;

&lt;p&gt;Key insight: While raw instruction flow suggested even faster speeds, JIT was only 9-13x quicker when counting start-up and compile times, as short runs saw startup costs dominate. A procedural eye-opener arrived too: benchmarks spiked due to thermal throttling; hence, the baseline must now rest on within-session A/B comparisons.&lt;/p&gt;

&lt;p&gt;The benchmarking exercise flagged a legitimate fault, directing our efforts to the subsequent commit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tweaking Array Index Element Types
&lt;/h2&gt;

&lt;p&gt;The unexpected rises again: array indexing stumbled during benchmarking when &lt;code&gt;acc + a:[k]&lt;/code&gt; on &lt;code&gt;t8&lt;/code&gt; arrays output incorrect values. Here’s the screw-up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Expr::Index&lt;/code&gt; defaulted to &lt;code&gt;SemanticType::Unknown&lt;/code&gt; regardless of actual array base types, tossing proper wrapping on integer arithmetic at sub-64-bit sizes. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The fix unfolded in &lt;code&gt;semantic.rs&lt;/code&gt;, rewriting five lines to discern element type from &lt;code&gt;Array(_, elem)&lt;/code&gt;. Six new tests now define &lt;code&gt;t8/t16&lt;/code&gt; wrapping, typed binding narrowing, and return-value wrapping. This tweak let &lt;code&gt;bench_array_loop&lt;/code&gt; drop previously necessary workarounds, aligning with expected natural form execution.&lt;/p&gt;

&lt;p&gt;Final matrix post-fix: 272 fixtures, all stable across both backends.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integrating Integer-Width Facts
&lt;/h2&gt;

&lt;p&gt;The penultimate effort was extracting integer-width consistency from three hard-to-sync places: &lt;code&gt;semantic.rs&lt;/code&gt;, &lt;code&gt;runtime.rs&lt;/code&gt;, and &lt;code&gt;lower.rs&lt;/code&gt;. Each worked off its own inline constants to determine value bounds, which was less than ideal.&lt;/p&gt;

&lt;p&gt;Enter &lt;code&gt;frontend/int_facts.rs&lt;/code&gt;, our new comprehensive data store. It introduces &lt;code&gt;IntWidth&lt;/code&gt; (W8 through W128), &lt;code&gt;IntFacts&lt;/code&gt; (inclusive of truncation mechanics), and a &lt;code&gt;truncate(i128)&lt;/code&gt; method, ensuring a singular, central source that all modules are now tapping.&lt;/p&gt;

&lt;p&gt;Design boons?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It stands alone — a data-only module untouched by other dependencies.&lt;/li&gt;
&lt;li&gt;No unnecessary clutter, such as Bool inclusion, keeping it purely numeric.&lt;/li&gt;
&lt;li&gt;Streamlined by skipped over a &lt;code&gt;bits&lt;/code&gt; field given its lack of current utility.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Measured efficiency: 129 insertions and 26 deletions across seven files, no change in operational behavior, proving the integration seamlessly.&lt;/p&gt;

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

&lt;p&gt;The D1 arc’s evolution will naturally target memory safety for JIT, following today’s &lt;code&gt;.jit_known_unsound&lt;/code&gt; reveals. Further unifying measures, akin to &lt;code&gt;int_facts&lt;/code&gt;, likely loom ahead.&lt;/p&gt;

&lt;p&gt;Currently, submain strides eight commits ahead of main, tracing the path for a coherent merge that boosts matrix integrity from 230 to 272. Yet, the daily-log PR backlog and backend development have seen deferral — though inevitable, they remain on the horizon as the D1 audit arc continues to unfold.&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-06-10" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-06-10&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-05-24</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Wed, 10 Jun 2026 00:08:59 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-05-24-56jc</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-05-24-56jc</guid>
      <description>&lt;p&gt;Composite literal type-checking just closed the final soundness gap in the Cx language interpreter. Our four-pillar audit? It laid the groundwork for what's next in version 0.2. Two development themes took center stage: tackling a targeted fix and diving deep into a broadened codebase audit. While initially distinct, these efforts uncovered shared threads.&lt;/p&gt;

&lt;h2&gt;
  
  
  Composite Literal Type-Checking
&lt;/h2&gt;

&lt;p&gt;We discovered a crucial loophole in our semantic analyzer—it checked for struct names and array lengths without verifying the contents. Structs with incorrect field types, missing fields, or extras? They compiled, only to produce incorrect output. Similarly, array literals managed to slip through with mixed element types. This was flagged as our highest-priority finding during the Pillar 2 correctness audit, and we resolved it the same day.&lt;/p&gt;

&lt;p&gt;The fix was precise: about 54 lines added to &lt;code&gt;src/frontend/semantic.rs&lt;/code&gt; under commit &lt;code&gt;8169d33&lt;/code&gt; on submain. Struct literals now ensure all fields are declared, reject unknown fields, and type-check each one. The generics are resolved during this process. Array literals go through their own rigorous check to confirm element type consistency.&lt;/p&gt;

&lt;p&gt;To cement these changes, four verification matrix fixtures tested the updated behavior: &lt;code&gt;t_composite_array_element_type.cx&lt;/code&gt;, &lt;code&gt;t_composite_struct_missing_field.cx&lt;/code&gt;, &lt;code&gt;t_composite_struct_unknown_field.cx&lt;/code&gt;, and &lt;code&gt;t_composite_struct_wrong_type.cx&lt;/code&gt;. With these in place, the soundness gap is officially closed. The matrix remains unbroken at 182/0 on main.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Four-Pillar Deep-Dive
&lt;/h2&gt;

&lt;p&gt;Our day extended into a methodical four-pillar audit of the 0.1 codebase, unfolding across dedicated branches to explore various facets and inform the 0.2 roadmap.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pillar 1: Performance Analysis
&lt;/h3&gt;

&lt;p&gt;We uncovered two performance bottlenecks: a heavy reliance on &lt;code&gt;memset&lt;/code&gt; from per-call 64KB arena zeroing dominated call-heavy programs, and SipHash string hashing burdened loop-heavy ones. Arena zeroing can shift to lazy initialization to mitigate the &lt;code&gt;memset&lt;/code&gt; impact. For SipHash, the solution lies in leveraging the already computed &lt;code&gt;BindingId&lt;/code&gt;, eliminating runtime re-hashing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pillar 2: Correctness Differential Audit
&lt;/h3&gt;

&lt;p&gt;A thorough interpreter-vs-JIT analysis exposed 14 key issues, 13 of which were JIT-only slips like out-of-bounds access and division by zero. Not distinct bugs, but symptoms pointing to a larger issue—a missing abstraction.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pillar 3: Architectural Risks
&lt;/h3&gt;

&lt;p&gt;A layered review highlighted five risks by delay cost. The absence of a shared semantic core between interpreter and JIT was the major revelation, leaving both engines executing validation and error handling separately. Issues like builtin duplication and extended &lt;code&gt;runtime.rs&lt;/code&gt; files confirmed these architectural gaps.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pillar 4: Developer Experience Hurdles
&lt;/h3&gt;

&lt;p&gt;We identified friction points through test programs. Parse errors, limited enum support, lack of string manipulation tools, and raw token names in errors topped the list. Quick improvements are clear pathways to a significantly smoother developer experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Structural Culprit
&lt;/h2&gt;

&lt;p&gt;The synthesis document brought everything together. Pillar 1’s SipHash problem, the 13 interpreter/JIT disagreements from Pillar 2, Pillar 3’s concerns about builtins, and arena zeroing all traced back to shared structural roots. Correcting these inefficiencies promises to dissolve many surface-level issues.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Audit Doesn’t Decide
&lt;/h2&gt;

&lt;p&gt;Our audit defers the hefty question of committing to a unified semantic core for interpreter and JIT. Except for essential tasks like lazy arena allocation and parse error improvements tagged for immediate action, everything awaits the team's verdict following the synthesis review.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s the Next Step?
&lt;/h2&gt;

&lt;p&gt;The composite literal fix is primed for a main branch PR, with four new fixtures in tow. The pending merge of the &lt;code&gt;exit()&lt;/code&gt; builtin also awaits. Focus should now shift to implementing low-effort, high-impact improvements like &lt;code&gt;let x = expr&lt;/code&gt;. But crafting the roadmap for version 0.2 lies in the team's hands. Will we prioritize structural betterment or proceed incrementally with new features? This is the decision on the horizon.&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-24" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-05-24&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-05-25</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Tue, 09 Jun 2026 00:09:39 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-05-25-20b4</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-05-25-20b4</guid>
      <description>&lt;p&gt;The interpreter's variable lookup is now blazing through arithmetic loops at a 57% faster pace. But this isn't just about raw speed — four tracker items were checked off the list, culminating in a more robust system. All rolled out on submain, a direct result of a thorough four-pillar audit.&lt;/p&gt;

&lt;h2&gt;
  
  
  BindingId replaces string hashing at runtime
&lt;/h2&gt;

&lt;p&gt;The heavyweight change came from tracker #009. Previously, our interpreter was busy hashing variable names every time they were accessed. That was a repeat offender in wasted cycles. Now, by using a pre-assigned numeric BindingId, we seize efficiency. The semantic phase was already handing out these IDs, but the runtime kept adding the overhead back. It doesn’t anymore.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ScopeFrame.vars&lt;/code&gt; has transitioned to a &lt;code&gt;HashMap&lt;/code&gt; equipped with a zero-cost identity hasher keyed by u32 binding IDs. Name-based lookups are still around but tucked away for less frequent operations like string interpolation. &lt;/p&gt;

&lt;p&gt;Fixes were necessary upstream: &lt;code&gt;ConstDecl&lt;/code&gt; and &lt;code&gt;semantic_impls&lt;/code&gt; now hold onto their BindingId, making sure our semantic phase pipelines gracefully into the interpreter's primary key system — narrowing the gap with JIT's variable handling.&lt;/p&gt;

&lt;p&gt;Here's how the numbers shine on a Windows release build:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;arith_loop (5M iterations): from 5744ms down to 2481ms (56.8% boost)&lt;/li&gt;
&lt;li&gt;nested_loops (4M iterations): from 2675ms down to 1796ms (32.8% boost)&lt;/li&gt;
&lt;li&gt;fib_recursive: from 6835ms down to 6488ms (merely 5.1% faster due to call-frame constraints)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our findings align with expectations: recursive functions aren't bogged down by variable lookups as much as by setting up call frames.&lt;/p&gt;

&lt;h2&gt;
  
  
  Array bounds errors stop lying
&lt;/h2&gt;

&lt;p&gt;Misleading diagnostic labels are on their way out, thanks to tracker #002 and #032. Attempts to access out-of-bounds array indices once triggered an error as unhelpful as &lt;code&gt;variable 'index 5' has not been declared&lt;/code&gt;. Not anymore.&lt;/p&gt;

&lt;p&gt;Changes came in two waves. First, we introduced a new error variant: &lt;code&gt;RuntimeError::IndexOutOfBounds { pos, index, length }&lt;/code&gt;. Then, three runtime.rs cases were refactored to employ this newfound precision. Now, programs react with clarity, showing &lt;code&gt;array index N out of bounds for array of length M&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;New fixtures have been added to validate this behavior and to handle discrepancies with the JIT through a &lt;code&gt;.jit_known_unsound&lt;/code&gt; sidecar. This move optimally separates interpreter improvements from JIT limitations, acknowledging that our current JIT doesn’t yet include bounds checks (tracker #003).&lt;/p&gt;

&lt;h2&gt;
  
  
  Builtin registry
&lt;/h2&gt;

&lt;p&gt;Though tracker #008 tackled a narrower terrain, its ripples will be felt across the project. By consolidating all of the site-dependent lists for Cx builtins in &lt;code&gt;src/frontend/builtins.rs&lt;/code&gt;, we ended the structural divergence that was starting to creep in. Future integrations are now a single-source update, negating the chance for list drift.&lt;/p&gt;

&lt;p&gt;This tidy up is directly tackling findings from the audit's Pillar 2 concerns. Where once four lists zigged separately, now they zag together.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deliberate sequencing
&lt;/h2&gt;

&lt;p&gt;Our line of commits didn't happen by chance. Tracker #012 initiated the new error variant, leading to #002/#032 fixing use-sites, and deploying a JIT exclusion practice. Tracker #008 cleared the path by resolving the builtin conundrum, before tracker #009 flexed the freshly implemented BindingId advantages. &lt;/p&gt;

&lt;p&gt;Each stage acted on precise dependencies with grounded purpose and references back to their origins in the audit pillars.&lt;/p&gt;

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

&lt;p&gt;We’re setting our sights on the lazy arena (tracker #010) identified in #009’s commit log. The 64KB memset seen in function calls sticks out like a sore thumb in call-heavy operations, hogging 90% of runtime. The solution is clear-cut and well within scope.&lt;/p&gt;

&lt;p&gt;After a successful deployment of these fixes, merging submain to main comes naturally. With submain miles ahead by seven commits and improvements across performance and correctness, attention can shift to JIT’s array bounds safeguard (tracker #003), leveraging the existing &lt;code&gt;jit_known_unsound&lt;/code&gt; mechanism to master this transition.&lt;/p&gt;

&lt;p&gt;Main remains unchanged with a clean slate of 182/0, while today’s improvements have all bolstered the growth of submain.&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-25" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-05-25&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-05-26</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Mon, 08 Jun 2026 00:08:51 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-05-26-od0</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-05-26-od0</guid>
      <description>&lt;p&gt;Stuck without a single developer-authored commit landing today, while submain sits 7 commits ahead of main, full of crucial work waiting to merge. The backlog's growing increasingly hard to ignore.&lt;/p&gt;

&lt;h2&gt;
  
  
  Submain is sitting on real work
&lt;/h2&gt;

&lt;p&gt;Submain's ahead, and it's not just sitting there with trivial updates. We've got 7 commits affecting 47 files: a whopping +1061/-331 lines. Inside? Real changes like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tracker #001:&lt;/strong&gt; Tackling composite literal type-checking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tracker #002 / #012 / #032:&lt;/strong&gt; Nailing down IndexOutOfBounds diagnostics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tracker #008:&lt;/strong&gt; The Builtin registry.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tracker #009:&lt;/strong&gt; A killer 57% speedup on arithmetic loops using BindingId-indexed variables.&lt;/li&gt;
&lt;li&gt;Implementation of the &lt;code&gt;exit()&lt;/code&gt; builtin.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yet, none of this has hit main. No merge conflicts are lurking ― submain was last synced with main on May 24 through PR #282. Each daily log promises a merge from submain to main since May 6, and every promise has fizzled out.&lt;/p&gt;

&lt;h2&gt;
  
  
  The daily-log branch backlog
&lt;/h2&gt;

&lt;p&gt;The issue is bigger than just submain. The daily-log branches are stacking up too. The last time main saw a daily-log merge was back on 2026-05-09. Branches from 05-24 and 05-25 are just gathering dust. They’ve got crucial roadmap updates and project history waiting in the wings.&lt;/p&gt;

&lt;p&gt;Right now, main’s roadmap still reads "0.1 release candidate" with a 117/117 matrix. Reality check: we're at v0.1.0 with 182 tests passing. Daily-log branches know this, but without merging, it's nowhere on the main branch. &lt;/p&gt;

&lt;h2&gt;
  
  
  Nothing in progress
&lt;/h2&gt;

&lt;p&gt;Main’s working tree is clean. No files in limbo or half-baked changes. It’s not that the work’s just somewhere else. It’s a genuine pause.&lt;/p&gt;

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

&lt;p&gt;The crystal ball looks a lot like yesterday's prediction: submain needs to merge into main. That’s the most impactful move we've got. Following that, merging daily-log branches would pull the documentation up to date. Work branching off from the May 24-25 tracker sprint is all about either optimizing lazy arenas (tracker #010, targeting that annoying 64KB memset bottleneck) or tightening JIT array bounds (tracker #003, nailing the &lt;code&gt;jit_known_unsound&lt;/code&gt; issues).&lt;/p&gt;

&lt;p&gt;Whether any of this unfolds tomorrow remains to be seen. But the work's definitely there, waiting for the green light. &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-26" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-05-26&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-06-06</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Sun, 07 Jun 2026 00:10:43 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-06-06-3njm</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-06-06-3njm</guid>
      <description>&lt;p&gt;The v0.2.0 merge landed. PR #295 brought 35 commits from submain into main, touching 145 files (+4130/-2052) and jumping the verification matrix from 182 to 230 fixtures. Within hours, three targeted range-check fixes found during review pushed submain to 252. No regressions, no reverts.&lt;/p&gt;

&lt;h2&gt;
  
  
  What shipped in v0.2.0
&lt;/h2&gt;

&lt;p&gt;This release closes a month of divergence between main and submain. The highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;String concatenation and the &lt;code&gt;len&lt;/code&gt; builtin&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;if&lt;/code&gt; as an expression (not just a statement)&lt;/li&gt;
&lt;li&gt;Enum signatures in function declarations&lt;/li&gt;
&lt;li&gt;TBool safety and unknown-as-value rejection&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;exit()&lt;/code&gt; builtin&lt;/li&gt;
&lt;li&gt;Composite literal type-checking&lt;/li&gt;
&lt;li&gt;The differential harness for interpreter/JIT parity testing&lt;/li&gt;
&lt;li&gt;Runtime refactoring: the monolithic 1725-line &lt;code&gt;runtime.rs&lt;/code&gt; was split into six modules (&lt;code&gt;exec&lt;/code&gt;, &lt;code&gt;eval&lt;/code&gt;, &lt;code&gt;call&lt;/code&gt;, &lt;code&gt;ops&lt;/code&gt;, &lt;code&gt;scope&lt;/code&gt;, &lt;code&gt;print&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The runtime split is a pure structural refactor with no behavior change, but it sets up the module boundaries for future work on the runtime.&lt;/p&gt;

&lt;p&gt;48 new verification matrix fixtures came along with all of this. Main went from 182 to 230 passing tests, zero failures.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three range-check fixes in one afternoon
&lt;/h2&gt;

&lt;p&gt;The original out-of-range literal rejection rule (#028/#037) was established early: if you write &lt;code&gt;x: t8 = 300&lt;/code&gt;, the compiler should reject it at semantic analysis time, not silently truncate. That rule worked for standalone declarations, but CodeRabbit caught three surfaces where it didn't apply.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CR#1: Generic struct fields.&lt;/strong&gt; Writing &lt;code&gt;Pair&amp;lt;t8&amp;gt; { b: 300 }&lt;/code&gt; silently accepted 300. The problem: explicit generic type arguments were being discarded. The &lt;code&gt;_type_args&lt;/code&gt; in the &lt;code&gt;StructInstance&lt;/code&gt; arm of &lt;code&gt;semantic.rs&lt;/code&gt; were unused, so field literals validated against raw &lt;code&gt;TypeParam("T")&lt;/code&gt;, making the range check a no-op. The fix builds a positional param-to-arg substitution map and applies it to each field's declared type before range-checking. Six new fixtures. Matrix: 236/0.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CR#2: Array elements in struct fields and call arguments.&lt;/strong&gt; &lt;code&gt;items: [3: t8]&lt;/code&gt; initialized with &lt;code&gt;[1, 2, 300]&lt;/code&gt; inside a struct silently accepted the out-of-range element, even though standalone &lt;code&gt;x: [3: t8] = [1, 2, 300]&lt;/code&gt; correctly rejected it. The element-type hint was never propagated at those sites. A new &lt;code&gt;analyze_expr_with_elem_hint&lt;/code&gt; helper in &lt;code&gt;semantic.rs&lt;/code&gt; delivers the hint at struct-field and call-argument sites, consolidating the typed-declaration path. This composes with CR#1, so &lt;code&gt;Box&amp;lt;t8&amp;gt; { items: [3: T] }&lt;/code&gt; now resolves to &lt;code&gt;[3: t8]&lt;/code&gt; and range-checks every element. Eight new fixtures. Matrix: 244/0.&lt;/p&gt;

&lt;p&gt;This fix also surfaced a pre-existing Cranelift codegen bug: storing a negative value in a struct's fixed-size array field corrupts adjacent stack memory on teardown. Positive arrays work fine. The interpreter handles it correctly. Marked &lt;code&gt;.jit_known_unsound&lt;/code&gt; for now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CR#3: Return values.&lt;/strong&gt; &lt;code&gt;fnc: t8 f() { 300 }&lt;/code&gt; silently returned 44 (300 mod 256). The trailing-return path went straight to &lt;code&gt;insert_cast_if_needed&lt;/code&gt;, which wraps without checking. This is the worst class of bug: silent wrong values. The fix introduces an &lt;code&gt;analyze_returned_expr&lt;/code&gt; chokepoint in &lt;code&gt;semantic.rs&lt;/code&gt; that runs the same sequence a typed declaration runs (array-element hint, bare-literal width check, type-compatibility gate, then cast) and both return forms (explicit &lt;code&gt;return expr&lt;/code&gt; and trailing expression) route through it. Eight new fixtures. Matrix: 252/0.&lt;/p&gt;

&lt;p&gt;All three fixes are on submain only, not yet merged to main. Submain is 3 commits and 59 files ahead.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rule is now closed across five surfaces
&lt;/h2&gt;

&lt;p&gt;After CR#1-3, out-of-range literal rejection applies to: standalone declarations, explicit generic type arguments, array elements in struct fields and call arguments, and both return positions. The only identified remaining gap is literals nested inside if/when branches (&lt;code&gt;{ if c { 300 } else { 0 } }&lt;/code&gt;), tracked as CR#4.&lt;/p&gt;

&lt;p&gt;One thing deliberately left alone: implicit non-literal narrowing. Writing &lt;code&gt;x: t8 = a&lt;/code&gt; where &lt;code&gt;a: t64&lt;/code&gt; still compiles. Cx has no explicit cast syntax yet, so rejecting this would strand legitimate truncation with no escape hatch. The plan is to add cast syntax first, then tighten the rule.&lt;/p&gt;

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

&lt;p&gt;The immediate priority is merging CR#1-3 from submain to main. It's only 3 commits and should be a clean merge.&lt;/p&gt;

&lt;p&gt;After that, CR#4 (range-checking inside if/when branches) is the natural next step to complete the sweep. The Cranelift negative-element segfault that CR#2 exposed is worth investigating but sits in the JIT codegen layer rather than the semantic analysis layer where the current work is happening.&lt;/p&gt;

&lt;p&gt;The larger remaining frontier is Phase 8 Round 2 and Phase 15: str/strref layout, Handle, TBool calling convention, and closing the remaining JIT instruction coverage gaps. v0.2.0 cleared the integration backlog. Now the path forward is backend work.&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-06-06" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-06-06&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-05-27</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Sat, 06 Jun 2026 00:10:37 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-05-27-gc3</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-05-27-gc3</guid>
      <description>&lt;p&gt;Three quiet days without any developer-authored commits. That's where we stand, with no changes to main since May 22 when the Type::Void variant merged in PR #278. Meanwhile, submain sits seven commits ahead, echoing the unmerged work from the recent tracker sprint. The passing matrix at 182 and zero failures is a testament to recent progress. But while it may seem like a standstill, the project is poised for a leap forward as integration nears.&lt;/p&gt;

&lt;h2&gt;
  
  
  Roadmap corrections
&lt;/h2&gt;

&lt;p&gt;There's been a backlog of housekeeping, affecting our roadmap's clarity. Stuck on a May 9 version, it wrongly labeled the frontend as a "0.1 release candidate" and maintained an outdated "117/117" test pass count, despite 182 tests now passing. Today's log addresses these discrepancies. Key overlooked items in Phase 11 had already made their way to main yet remained unchecked:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Method call lowering&lt;/strong&gt; (&lt;code&gt;0ab7e9b&lt;/code&gt;): Executes literal-width narrowing for method calls on implementation types.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;when&lt;/code&gt; block lowering&lt;/strong&gt; (&lt;code&gt;bed71c1&lt;/code&gt;): Handles Literal, Range, Bool, and Catchall arms alongside TBool wire-value unknowns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DotAccess in compound forms&lt;/strong&gt; (&lt;code&gt;2d6804a&lt;/code&gt;): Enables compound assignments through dot-access paths, validated by the CX-187 parity fixtures.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These entries, committed weeks ago, highlight the pitfalls of maintaining documentation external to code changes. Delaying integration to main has hidden completion, but the overview now reflects the present state.&lt;/p&gt;

&lt;h2&gt;
  
  
  A growing submain backlog
&lt;/h2&gt;

&lt;p&gt;Submain harbors seven pivotal commits from the May 24-25 sprint:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tracker #001&lt;/strong&gt;: Composite literal type-checking&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tracker #002 / #032&lt;/strong&gt;: Improved IndexOutOfBounds diagnostics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tracker #008&lt;/strong&gt;: Builtin registry implementations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tracker #009&lt;/strong&gt;: Transition to BindingId-indexed variables; results in a substantial 57% speedup on arithmetic loops&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tracker #012&lt;/strong&gt;: Introduction of the &lt;code&gt;exit()&lt;/code&gt; builtin, as first discussed in the May 23 log&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With no anticipated merge conflicts—submain already aligned with main via PR #282—the merge is strategic. An action expected for days, pending outcomes and persistent in daily logs since May 6.&lt;/p&gt;

&lt;h2&gt;
  
  
  The log branch tangle
&lt;/h2&gt;

&lt;p&gt;We've accumulated seven daily-log branches (May 20 through May 26), each carrying roadmap updates and notes. The last log branch to merge was way back on May 9. Corrections in today's log address most of the lingering matters in these intermediate branches. Still, they need merging or closing to alleviate any branch clutter.&lt;/p&gt;

&lt;h2&gt;
  
  
  On the horizon
&lt;/h2&gt;

&lt;p&gt;The focus remains firmly on these essential tasks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Merge submain into main.&lt;/strong&gt; This will incorporate critical structural improvements, performance refactors, and necessary fixes from our last sprint. A clean and essential step.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deal with the daily-log branch backlog.&lt;/strong&gt; With seven pending branches, tidying up is non-negotiable. Effective branch hygiene is critical, even if corrections lessen the pressure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Next issues: Lazy arena (tracker #010) or JIT bounds checking (tracker #003).&lt;/strong&gt; Deciding which to tackle will follow naturally. The former addresses a 64KB memset limit; the latter closes the &lt;code&gt;jit_known_unsound&lt;/code&gt; gap.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The truth is, post-May 25, we've hit a productivity pause. The groundwork exists; we just need to anchor it into place.&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-27" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-05-27&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-03-29</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Wed, 03 Jun 2026 00:12:20 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-03-29-5eg0</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-03-29-5eg0</guid>
      <description>&lt;p&gt;Some days nothing ships. March 29 was one of those days when no new COMMENTERTHE9-authored commits landed, the working tree was spotless, and our test matrix held strong at 78/78 on main. But don't mistake this quiet for inactivity. Two key backend changes are stacked on &lt;code&gt;submain&lt;/code&gt;, just waiting for their moment. It begs the question, why hasn't &lt;code&gt;submain&lt;/code&gt; been merged yet?&lt;/p&gt;

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

&lt;p&gt;Right now, &lt;code&gt;submain&lt;/code&gt; holds onto two locally branch-locked commits from March 28:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wrapping arithmetic&lt;/strong&gt; (&lt;code&gt;d93582b&lt;/code&gt;) changes our runtime arithmetic methods from &lt;code&gt;saturating_add&lt;/code&gt;/&lt;code&gt;saturating_sub&lt;/code&gt; to &lt;code&gt;wrapping_add&lt;/code&gt;/&lt;code&gt;wrapping_sub&lt;/code&gt; in &lt;code&gt;src/runtime/runtime.rs&lt;/code&gt;. It incorporates guards for critical edge cases like &lt;code&gt;i128::MIN / -1&lt;/code&gt; and &lt;code&gt;i128::MIN % -1&lt;/code&gt;. While our arithmetic now wraps correctly at the i128 limit, this update is just a step towards fully enforcing integer overflow behavior—a hard blocker still looming.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 10: while loop lowering&lt;/strong&gt; (&lt;code&gt;0fa06a6&lt;/code&gt;) adds a hefty 189 lines to &lt;code&gt;src/ir/lower.rs&lt;/code&gt;. This update implements a header/body/exit CFG pattern, loop-carried SSA with block parameters, and introduces backedge generation. Right now, there are three tests supporting this Rust implementation. Notably, this is the debut of backend IR loop support in Cx.&lt;/p&gt;

&lt;p&gt;Both commits represent solid progress but they already shipped on March 28, as noted in that day's log. Yet, for two days running, the merge to main remains in limbo. A snag: &lt;code&gt;docs/frontend/ROADMAP.md&lt;/code&gt; is out of sync between branches. Main field's roadmap stands at v4.7, while submain's is at v4.6, dropping some annotations. Tackling this roadmap divergence will require a careful conflict resolution during the merge.&lt;/p&gt;

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

&lt;p&gt;Version 4.8 of the roadmap brings a measured update:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Backend ABI / Data Layout" now captures Phase 8's structured layouts for structs, arrays, and enums, and formally records the locking of calling conventions on submain. Phase 10's while loop lowering is flagged as active backend work.&lt;/li&gt;
&lt;li&gt;"Multi-file imports" got a tick with the merging of PR #27 to main.&lt;/li&gt;
&lt;li&gt;The "Integer overflow" known gap entry was adjusted to note the partial fix with wrapping arithmetic.&lt;/li&gt;
&lt;li&gt;We confirmed struct field type checking and method call return type fixes on main post-PR #27.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yet, no boxes were checked off. The wrapping arithmetic moves us closer to resolving the integer overflow blocker but hasn’t fully tackled it.&lt;/p&gt;

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

&lt;p&gt;The list of upcoming tasks hasn't budged:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Merge submain to main.&lt;/strong&gt; A merge is overdue by two days, complicated slightly by roadmap version divergence but not blocked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If/else lowering in the backend.&lt;/strong&gt; With IR lowerer now supporting while loops, the next logical step is handling conditional branches. This is crucial for supporting Cx 0.1-level programs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test runner and assert.&lt;/strong&gt; A hard blocker, currently hitting day five of deferral.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error model (Result).&lt;/strong&gt; Another five-day deferral, another hard blocker.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here’s the truth: March 29 wasn’t about breakthroughs. Our significant changes are parked on a branch, awaiting the merge. The blockers are still there, sitting quietly in the backlog. True advancement is on hold until we finalize the submain merge and move on to pick up if/else lowering or clear one of the deferred blockers.&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-03-29" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-03-29&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cx</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cx Dev Log — 2026-04-08</title>
      <dc:creator>COMMENTERTHE9</dc:creator>
      <pubDate>Tue, 02 Jun 2026 00:12:38 +0000</pubDate>
      <link>https://dev.to/commenterthe9/cx-dev-log-2026-04-08-4bl6</link>
      <guid>https://dev.to/commenterthe9/cx-dev-log-2026-04-08-4bl6</guid>
      <description>&lt;p&gt;Thirteen days and counting. That’s how long our submain branch has been sitting without a merge into &lt;code&gt;main&lt;/code&gt;. We've got five solid commits tested and ready, yet they continue to loom over our work on Cx — haunting our 0.1 milestone with their unmerged status. It’s frustrating. It’s blocking. And it’s the heart of the current situation.&lt;/p&gt;

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

&lt;p&gt;Let's break down why this merge gap is such a big deal. Those commits aren’t window-dressing. They tie up four hard blockers that are crucial for the 0.1 release. For instance, the move from saturating to wrapping arithmetic doesn’t just tick a box — it handles those tricky &lt;code&gt;i128::MIN&lt;/code&gt; edge cases that could catch developers off guard. Then there's the Phase 10 while loop lowering, shifting to a cleaner CFG pattern with support for loop-carried SSA and backedge insertion. We’ve locked down our UTF-8 decision, ensuring consistency across the board with no Latin-1 fallback, and finally, our semicolon rule is established — optional except where it helps in expression statements for clarity. Add to that a basic test runner packing &lt;code&gt;assert&lt;/code&gt;, &lt;code&gt;assert_eq&lt;/code&gt;, and a neat &lt;code&gt;--test&lt;/code&gt; mode, and it’s clear that these merged bits represent a meaningful slice of progress.&lt;/p&gt;

&lt;p&gt;A quick glance at the diff between main and submain shows substantial activity — 24 files modified, 367 insertions, and 501 deletions across critical components like &lt;code&gt;main.rs&lt;/code&gt;, &lt;code&gt;runtime.rs&lt;/code&gt;, and the spec itself (&lt;code&gt;cx_syntax.md&lt;/code&gt;). These aren’t superficial updates. They are pivotal changes dragging their feet in the review queue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Branch Backlog Buildup
&lt;/h2&gt;

&lt;p&gt;Our woes don’t stop with submain. We’ve also got eight daily-log branches hanging around, starting with &lt;code&gt;daily-log-2026-03-29&lt;/code&gt; through &lt;code&gt;daily-log-2026-04-07&lt;/code&gt;. While these don’t carry the same weight as the five on submain, they do clutter our workflow. Some contain roadmap updates alongside daily changes, and the longer we let them accumulate, the more we risk avoidable conflicts when they’re finally addressed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stuck Roadmap
&lt;/h2&gt;

&lt;p&gt;Our trusty roadmap still reflects &lt;code&gt;main&lt;/code&gt; accurately, which is both strategic and necessary. It’s a balancing act — representing the truth of what’s merged against the aspirations of what’s ready but pending. Items like the test runner, integer overflow handling, and semicolon integration aren’t checked off because, well, they’re not on &lt;code&gt;main&lt;/code&gt; yet. The roadmap makes a small nod to the decided UTF-8 direction despite its yet-to-be-merged status on submain. Prematurely marking these as complete would only add to the confusion.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Needs to Happen
&lt;/h2&gt;

&lt;p&gt;The path forward is clear, even if it seems like groundhog day admitting it again. Merge submain into main. Those five commits, resolving four blockers, are primed and should be the immediate focus. No apparent source conflicts should impede this, apart from an expected nudge needed in the roadmap file.&lt;/p&gt;

&lt;p&gt;Once submain sees the light of &lt;code&gt;main&lt;/code&gt;, we need to address the next high-impact blocker — the error model implementation, with &lt;code&gt;Result&lt;/code&gt;, &lt;code&gt;Ok&lt;/code&gt;, &lt;code&gt;Err&lt;/code&gt;, and the &lt;code&gt;?&lt;/code&gt; operator framework laid out in the spec. There's also the daunting yet essential task of tackling the &lt;code&gt;:=&lt;/code&gt; type inference quality gate, which has yet to kick off.&lt;/p&gt;

&lt;p&gt;Today might feel static without new landings, but beneath the surface, the code is waiting, complete, and eager to push us forward if we can just make the merge.&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-08" rel="noopener noreferrer"&gt;https://cx-lang.com/blog/2026-04-08&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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