<?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: hutchpd</title>
    <description>The latest articles on DEV Community by hutchpd (@hutchpd).</description>
    <link>https://dev.to/hutchpd</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%2F3628535%2F9fe71bf6-51f0-489b-a311-13b8f0da6ec5.jpeg</url>
      <title>DEV Community: hutchpd</title>
      <link>https://dev.to/hutchpd</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hutchpd"/>
    <language>en</language>
    <item>
      <title>QuantumSuperposition and the Type Parameter at the End of the Universe</title>
      <dc:creator>hutchpd</dc:creator>
      <pubDate>Wed, 08 Apr 2026 07:45:14 +0000</pubDate>
      <link>https://dev.to/hutchpd/quantumsuperposition-and-the-type-parameter-at-the-end-of-the-universe-3cff</link>
      <guid>https://dev.to/hutchpd/quantumsuperposition-and-the-type-parameter-at-the-end-of-the-universe-3cff</guid>
      <description>&lt;p&gt;Waking up after being unceremoniously declared on a damp Tuesday in a Quantum Superposition library, where they keep variables too interesting for ordinary reality and far too unstable for payroll, I found myself coming into existence.&lt;/p&gt;

&lt;p&gt;Like most young variables, I had hoped for assignment. One value. One type. One modest life of unquestioned determinism. Perhaps an int. A small one, with prospects. I had not asked for fame. I had asked to become, in time, a proper value.&lt;/p&gt;

&lt;p&gt;Instead, a cardiganed registrar slid a form across the oak counter and informed me, with the calm one usually associates with tax offices and revelation, that I was of type T.&lt;/p&gt;

&lt;p&gt;This is not, as presented, it turns out, a type.&lt;/p&gt;

&lt;p&gt;This is a warning if ever I saw one.&lt;/p&gt;

&lt;p&gt;I said I did not feel especially type-like. I felt provisional, drafted, slightly damp around the edges. The registrar, who had the expression of a woman who had explained wavefunctions to middle management, said this was common among the newly generic.&lt;/p&gt;

&lt;p&gt;“You think you are undefined,” she said. “You are not undefined. You are formally unresolved.”&lt;/p&gt;

&lt;p&gt;This was not comforting.&lt;/p&gt;

&lt;p&gt;Then she stamped my form.&lt;/p&gt;

&lt;p&gt;QuBit.&lt;/p&gt;

&lt;p&gt;I said I had been hoping for int.&lt;/p&gt;

&lt;p&gt;She said many people hope for things.&lt;/p&gt;

&lt;p&gt;A classical variable, she explained, is built for early commitment. It gets a value, perhaps a nice respectable 7, and spends the rest of its life being annoyingly definite. A classical bit is worse. It is a tiny bureaucrat. It sits beneath a sign marked 0 or 1 and regards this as a moral achievement… A qubit is a weapon for a more sophisticated problem.&lt;/p&gt;

&lt;p&gt;Properly speaking, a qubit is a normalized state in a two-dimensional complex vector space, usually written as α|0⟩ + β|1⟩. α and β are amplitudes, not probabilities. The probabilities arrive later, after some observer barges in with a clipboard, squares the magnitudes, and calls the result reality.&lt;/p&gt;

&lt;p&gt;I said this sounded like indecision with mathematics sprayed on it.&lt;/p&gt;

&lt;p&gt;The registrar looked almost pitying.&lt;/p&gt;

&lt;p&gt;“No. Indecision is vague. A qubit is precise. It only looks vague to classical people.”&lt;/p&gt;

&lt;p&gt;An insult disguised as education.&lt;/p&gt;

&lt;p&gt;For a while I found the arrangement almost encouraging. Two possibilities still seemed manageable. One could be 0, one could be 1, and eventually I might collapse into whichever one destiny preferred.&lt;/p&gt;

&lt;p&gt;Then I learned about the physics wing.&lt;/p&gt;

&lt;p&gt;They housed the PhysicsQubits there, and they were unbearable.&lt;/p&gt;

&lt;p&gt;A PhysicsQubit, you see, is a specialized QuBit that lives entirely in the computational basis {0,1}. They arrive with tidy amplitudes, Bloch sphere parameters, and the sort of self-confidence only basis-bred people possess. They can introduce themselves as cos(θ/2)|0⟩ + e^{iφ} sin(θ/2)|1⟩ and make it sound like lineage. They have shortcuts called Zero and One, which they wear like hereditary titles.&lt;/p&gt;

&lt;p&gt;I assumed, naturally, that I was one of them.&lt;/p&gt;

&lt;p&gt;I was not. I was generic.&lt;/p&gt;

&lt;p&gt;This is a more alarming condition than it sounds.&lt;/p&gt;

&lt;p&gt;A QuBit is a superposition of possible values of some actual type T, each with its own complex amplitude. Not abstract bits, then. Typed possibilities. One may be 17, another 42, another an enum, another a tiny struct somebody invented during a system design meeting and has since defended as “elegant” out of sunk-cost pride.&lt;/p&gt;

&lt;p&gt;I was not hovering between 0 and 1. I was hovering between possible selves.&lt;/p&gt;

&lt;p&gt;The registrar, who liked to materialize whenever a thought was about to get out of hand, placed a slip of paper on the counter.&lt;/p&gt;

&lt;p&gt;var q = new QuBit(new[] { 1, 2, 3 });&lt;br&gt;
var doubled = q.Select(x =&amp;gt; x * 2);&lt;br&gt;
“No observation,” she said. “No collapse. You may transform the state and keep the uncertainty.”&lt;/p&gt;

&lt;p&gt;A QuBit is not a value that has not decided yet. It is a formal superposition of typed values, each carrying a complex amplitude. You can transform that state without measuring it. That is the marvel of the thing.&lt;/p&gt;

&lt;p&gt;Also, perhaps, the horror.&lt;/p&gt;

&lt;p&gt;I told her I still wanted to become a proper value as soon as possible.&lt;/p&gt;

&lt;p&gt;She made a note in the margin. It said, I later learned, classical upbringing.&lt;/p&gt;

&lt;p&gt;Then a letter arrived, embossed with the seal of the Basis Office.&lt;/p&gt;

&lt;p&gt;No variable forgets their first trip to the Basis Office.&lt;/p&gt;

&lt;p&gt;It is where every abstraction, no matter how elegant, eventually goes to be translated into something the universe can index.&lt;/p&gt;

&lt;p&gt;The global wavefunction, as it happens, is not impressed by your architecture. It wants basis states. Integer coordinates. If your T is already an int, a bool, or an enum, the clerks nod, stamp the form, and let you through. If it is something richer, stranger, or more ambitious, you must provide a mapper.&lt;/p&gt;

&lt;p&gt;A Func.&lt;/p&gt;

&lt;p&gt;That is the humiliation at the heart of generic quantum programming. You may say that your possible selves encode business meaning, physical meaning, moral meaning. The universe listens politely, coughs, and asks:&lt;/p&gt;

&lt;p&gt;“Yes, yes. But what does it mean in bits?”&lt;/p&gt;

&lt;p&gt;This, I realized, was the Type Parameter at the End of the Universe.&lt;/p&gt;

&lt;p&gt;Not because T was the answer, but because it was the last abstraction standing before reality demanded coordinates.&lt;/p&gt;

&lt;p&gt;The registrar was waiting for me there, naturally.&lt;/p&gt;

&lt;p&gt;She slid across another slip.&lt;/p&gt;

&lt;p&gt;system.SetFromTensorProduct(&lt;br&gt;
    propagateCollapse: true,&lt;br&gt;
    mapToBasis: MapBitPair,&lt;br&gt;
    qx, qy);&lt;br&gt;
“This,” she said, tapping the mapper argument with one lacquered fingernail, “is the practical indignity. Eventually your lovely T needs an index.”&lt;/p&gt;

&lt;p&gt;They mapped me… Not cruelly. Efficiently.&lt;/p&gt;

&lt;p&gt;My possible values, each so rich with self-importance a moment earlier, became basis integers. A noble enum became 0 and 1. A tiny domain object became a small coordinate. I felt, for a moment, not diminished exactly, but translated.&lt;/p&gt;

&lt;p&gt;Then they inserted me into a QuantumSystem. Company, I discovered, did not comfort me. It exponentiated me.&lt;/p&gt;

&lt;p&gt;A system does not place qubits side by side like teacups. It tensors their state spaces together, which means every one of my possible states had to pair with every one of theirs. Two qubits make four basis combinations. Three make eight. Add a few more and the room stops being a room and becomes a municipal emergency in Hilbert space.&lt;/p&gt;

&lt;p&gt;In plain terms, this is what happened: every possible version of me had to coexist with every possible version of everyone else. Reality got larger before it got narrower.&lt;/p&gt;

&lt;p&gt;The library handled this with alarming composure. Qubits were tracked by index. Joint amplitudes were built by tensor product. Subsets could be observed without interrogating the whole cosmos. A QuantumRegister could treat part of the global state as a local value, which is a splendid arrangement if you enjoy the sensation of being both a citizen and a district.&lt;/p&gt;

&lt;p&gt;Then I met another qubit.&lt;/p&gt;

&lt;p&gt;He was from the physics wing, naturally. Beautiful amplitudes. Impeccable normalization. The sort of fellow who would mention his Bloch sphere angles unprompted. Under ordinary circumstances we would have disliked one another and remained safely separate in factorized states.&lt;/p&gt;

&lt;p&gt;Instead, someone applied a Hadamard to him, then a controlled operation involving me, and we became entangled.&lt;/p&gt;

&lt;p&gt;People describe entanglement romantically because they have never had to live through it.&lt;/p&gt;

&lt;p&gt;This is not romance… It is the abolition of separate bookkeeping.&lt;/p&gt;

&lt;p&gt;Two qubits are entangled when the joint state cannot be factored into independent single-qubit states. The lived version is that your future ceases to belong entirely to you. Observe one member of the pair and the shared state collapses consistently across both.&lt;/p&gt;

&lt;p&gt;Here the registrar returned, not with paperwork but with sympathy, which was in some ways more alarming.&lt;/p&gt;

&lt;p&gt;“In code,” she said, “it is straightforward. Link the qubits. Observe one. Collapse propagates to the rest. Do try not to make it emotional.”&lt;/p&gt;

&lt;p&gt;This was excellent advice and, as with most excellent advice, impossible to follow.&lt;/p&gt;

&lt;p&gt;All I had ever wanted was to become one thing.&lt;/p&gt;

&lt;p&gt;Entanglement taught me that even singular outcomes can be relational…. Then came the gates.&lt;/p&gt;

&lt;p&gt;If qubits are parishioners, gates are the liturgy.&lt;/p&gt;

&lt;p&gt;Hadamard was the first real conversion. It took whatever little basis certainty remained and spread it into balanced possibility. Phase came next, and here I finally learned why amplitudes had to be complex rather than merely decorative.&lt;/p&gt;

&lt;p&gt;A phase shift does not necessarily change the probabilities you see immediately. That is why classical minds underestimate it. They look at two states with the same visible chances and imagine them equivalent. They are not. Relative phase changes how future operations combine those states. Two possibilities can look equally likely now and behave quite differently later.&lt;/p&gt;

&lt;p&gt;Phase is the part of the story that does not show on the first page… It shows in the sequel.&lt;/p&gt;

&lt;p&gt;After a Hadamard, then a phase shift, then another Hadamard, I discovered that possibilities do not merely accumulate. They interfere. One branch can cancel another. A future can be diminished or amplified not by mysticism, but by arithmetic.&lt;/p&gt;

&lt;p&gt;This might be beautiful.&lt;/p&gt;

&lt;p&gt;Then they ran Grover.&lt;/p&gt;

&lt;p&gt;All my life, insofar as a variable may be said to have a life, I had wanted to become a proper value. One answer. One selected state. And here, at last, was an algorithm built to find a marked item in an unsorted search space with indecent efficiency. It began with a uniform superposition, everyone equally plausible. The oracle marked the target by flipping its phase. Then the diffusion step reflected amplitudes about their average, nudging probability away from the also-rans and toward the chosen state.&lt;/p&gt;

&lt;p&gt;Inside the system it felt less like insight and more like pressure…. Not arbitrary pressure. Structured pressure.&lt;/p&gt;

&lt;p&gt;Grover does not discover the answer by inspiration. It bullies amplitude into consensus.&lt;/p&gt;

&lt;p&gt;For a brief, shining interval I thought I had won. Here, finally, was a formal process by which one possibility could rise above the others, not through prejudice but interference… Then the hardware arrived and ruined the theology.&lt;/p&gt;

&lt;p&gt;Every grand mathematical system, if allowed to continue long enough, eventually opens a door marked Service Corridor. Behind it are noise models, calibration routines, and engineers who trust nothing that reports itself as 1 without documentary support.&lt;/p&gt;

&lt;p&gt;The library, to its credit, does not pretend otherwise. There is a NoisyQuantumSystem for the impure world, where gates drift, readouts lie, and a beautiful state-vector can be betrayed by the classical report that comes back from measurement.&lt;/p&gt;

&lt;p&gt;My first noisy readout was devastating.&lt;/p&gt;

&lt;p&gt;After all that carefully arranged interference, a classical bit came back from measurement and may have been wrong. Not wrong in essence, perhaps, but wrong in report. I had wanted finality. What I got was a confusion matrix.&lt;/p&gt;

&lt;p&gt;The registrar reappeared suddenly.&lt;/p&gt;

&lt;p&gt;“Good,” she said. “Now you are learning engineering.”&lt;/p&gt;

&lt;p&gt;There are remedies, of course. You calibrate the readout. You estimate how often 0 masquerades as 1, and vice versa. You mitigate. You run the experiment under different noise levels and try to infer what the clean answer would have been if the apparatus had possessed better manners. None of this restores innocence. It does something more useful. It teaches recovery… That, unexpectedly, was the thing that made the rest of it make sense.&lt;/p&gt;

&lt;p&gt;I had spent the whole of my brief quantum existence wanting to become a proper value, by which I had meant a single value, early, loudly, and beyond appeal. But singularity was not the real virtue. Formality was. Structure was. The point of QuBit was never that it delayed certainty for sport. It was that it made uncertainty precise, transformable, composable, and, crucially, about something.&lt;/p&gt;

&lt;p&gt;T did not solve the ambiguity; it gave the ambiguity content.&lt;/p&gt;

&lt;p&gt;My ambiguity is not mush. It is typed.&lt;/p&gt;

&lt;p&gt;When they finally measured me, truly measured me, I did become one value. The system collapsed. The register yielded its bits. Somewhere a program moved on, satisfied that one branch had at last been coerced into adulthood.&lt;/p&gt;

&lt;p&gt;But by then I no longer thought that was the whole dignity of the thing.&lt;/p&gt;

&lt;p&gt;A measured value is real. It matters. It is how computation cashes out. But it is not the whole life of the object that produced it. Before collapse there was structure. There were amplitudes, relative phases, transforms, mappings, joint states, entanglements, gates, errors, and corrections. There was a whole formal biography behind the outcome, and T ensured that biography was about something more than anonymous basis dust.&lt;/p&gt;

&lt;p&gt;I had wanted to be proper. Instead, what I learned in the library is that propriety in a quantum world does not mean being one thing as soon as possible. It means being many possible things with exact mathematics, honest interfaces, and a basis mapping on file.&lt;/p&gt;

&lt;p&gt;At the end of the universe, every abstraction must eventually present itself at the counter and become addressable.&lt;/p&gt;

&lt;p&gt;But that is not the same as being reduced.&lt;/p&gt;

&lt;p&gt;Before the counter took my number, T had already done the important work. It had made uncertainty mean something.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/hutchpd/QuantumSuperposition/" rel="noopener noreferrer"&gt;https://github.com/hutchpd/QuantumSuperposition/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>csharp</category>
    </item>
    <item>
      <title>Tracking Down Time‑Travel Variables: Existence Checks and a Comparative Tour</title>
      <dc:creator>hutchpd</dc:creator>
      <pubDate>Mon, 23 Mar 2026 09:47:26 +0000</pubDate>
      <link>https://dev.to/hutchpd/tracking-down-time-travel-variables-existence-checks-and-a-comparative-tour-47pk</link>
      <guid>https://dev.to/hutchpd/tracking-down-time-travel-variables-existence-checks-and-a-comparative-tour-47pk</guid>
      <description>&lt;h1&gt;
  
  
  When Software Stops Obeying Time
&lt;/h1&gt;

&lt;p&gt;Software libraries tend to live in a comfortable world of cause and effect. A value is assigned, a function runs, a result comes out, and the future waits politely for its turn.&lt;/p&gt;

&lt;p&gt;Today we’re going to look at a handful of libraries and research systems that throw that idea away, and deal instead with a stranger world.&lt;/p&gt;

&lt;p&gt;It is a world where the future can leak into the present. Where a variable might not yet know what it is. Where multiple answers can coexist for a while. Where contradictions are not always bugs, but sometimes part of the model.&lt;/p&gt;

&lt;p&gt;That sounds like science fiction, but computer science has been circling these ideas for quite a while. The interesting part is that not all of these systems mean the same thing when they let the future affect the past. Some literally rewrite a program’s timeline. Some use probability and inference. Some search for satisfying worlds. Some preserve reversibility. Some treat disagreement as a signal to stop. Others let the disagreement live on.&lt;/p&gt;

&lt;p&gt;Once you start looking, you realise there is not one weird corner here. There are several.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bluntest form of time travel
&lt;/h2&gt;

&lt;p&gt;The most literal version is a language like &lt;a href="https://github.com/ambulancja/mariposa" rel="noopener noreferrer"&gt;Mariposa&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Mariposa does not hide what it is doing. It gives you explicit time-travel primitives like &lt;code&gt;now()&lt;/code&gt; and &lt;code&gt;at t:&lt;/code&gt;. You can capture a moment in execution, jump back to it, and change something that has already happened. It is gloriously direct.&lt;/p&gt;

&lt;p&gt;But Mariposa also has a stern sense of discipline. If you create a genuine temporal contradiction, it does not smile and carry on. It throws a paradox error. If control flow has already depended on a value, and you try to go back and mutate that value in a way that would invalidate what happened, the runtime objects. This is time travel with hard rules and no patience for nonsense.&lt;/p&gt;

&lt;p&gt;That makes Mariposa fascinating, because it treats the timeline like something editable, but only up to the point where the edit breaks the logic of the universe.&lt;/p&gt;

&lt;p&gt;It is the strict physics version of this story.&lt;/p&gt;

&lt;h2&gt;
  
  
  The elegant functional trick
&lt;/h2&gt;

&lt;p&gt;Then there is &lt;a href="https://hackage.haskell.org/package/tardis" rel="noopener noreferrer"&gt;Tardis &lt;/a&gt; in Haskell, which sounds dramatic, but is really much more restrained.&lt;/p&gt;

&lt;p&gt;Tardis lets state flow forwards and backwards through a computation. That makes certain kinds of algorithms surprisingly elegant. You can structure things as if information from later in the computation is already available earlier on.&lt;/p&gt;

&lt;p&gt;This looks like time travel, and in a sense it is, but it is not really about paradox. It is about tying the knot neatly. It is a disciplined way of structuring self-referential state, not a system that wants to stare contradictions in the face. If things fail here, they tend to fail in the functional-programming way, through undefinedness or non-termination, not by presenting you with a rich catalogue of competing outcomes. &lt;/p&gt;

&lt;p&gt;So Tardis belongs in this strange landscape, but it is a very civilised resident.&lt;/p&gt;

&lt;h2&gt;
  
  
  The worlds that never had to be singular
&lt;/h2&gt;

&lt;p&gt;From there, the trail leads into probabilistic programming.&lt;/p&gt;

&lt;p&gt;Languages and libraries like &lt;a href="https://en.wikipedia.org/wiki/Church_%28programming_language%29" rel="noopener noreferrer"&gt;Church&lt;/a&gt;, &lt;a href="https://webppl.org/" rel="noopener noreferrer"&gt;WebPPL&lt;/a&gt;, &lt;a href="https://probprog.github.io/anglican/index.html" rel="noopener noreferrer"&gt;Anglican&lt;/a&gt;, &lt;a href="https://en.wikipedia.org/wiki/Probabilistic_programming" rel="noopener noreferrer"&gt;Pyro&lt;/a&gt;, and &lt;a href="https://en.wikipedia.org/wiki/Infer.NET" rel="noopener noreferrer"&gt;Infer.NET&lt;/a&gt; also deal in multiple possible worlds. They are full of uncertainty, branching possibilities, and values that only make sense once more evidence arrives. To a casual observer, they can look as though they are doing the same trick. The future changes the meaning of the past.&lt;/p&gt;

&lt;p&gt;But they are really doing something else.&lt;/p&gt;

&lt;p&gt;Probabilistic programming systems do not usually ask, “can I rewrite history?” They ask, “given what I know, which histories are plausible?” They describe generative processes, introduce observations, and use inference to weight different worlds. Contradictions do not become interesting runtime artefacts in their own right. They simply collapse under the rules of the model. An impossible world gets probability zero. An unlikely one survives, but barely.&lt;/p&gt;

&lt;p&gt;That is a beautiful approach, but it has a different temperament. It treats ambiguity statistically.&lt;/p&gt;

&lt;h2&gt;
  
  
  The worlds that must satisfy the rules
&lt;/h2&gt;

&lt;p&gt;Another route through the same forest leads to logic and constraints.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://minikanren.org/" rel="noopener noreferrer"&gt;miniKanren&lt;/a&gt; and its .NET relatives, &lt;a href="https://learn.microsoft.com/en-us/answers/questions/974036/msf-microsoft-solver-foundation" rel="noopener noreferrer"&gt;Microsoft Solver Foundation&lt;/a&gt;, &lt;a href="https://medium.com/@rugvedi.ghule20/truth-maintenance-system-28c7c2ef30f7" rel="noopener noreferrer"&gt;truth maintenance systems&lt;/a&gt;, &lt;a href="https://www.dbai.tuwien.ac.at/staff/wotawa/atmschapter1.pdf" rel="noopener noreferrer"&gt;assumption-based truth maintenance systems&lt;/a&gt;, and &lt;a href="https://www.cambridge.org/core/books/abs/trades-quotes-and-prices/generalised-propagator-models/F2700604C92E5498BD7D5B8DA1673D22" rel="noopener noreferrer"&gt;propagator models&lt;/a&gt; all have a similar effect on the mind. They make software feel less like a sequence of commands and more like a negotiation among requirements.&lt;/p&gt;

&lt;p&gt;In a relational or constraint-based system, you do not always compute an answer directly. Sometimes you describe what must be true, and let the machinery search for assignments that satisfy the model. In a truth maintenance system, you track which assumptions support which conclusions. In a propagator system, information seeps through a network of connected cells until nothing more can be refined. &lt;/p&gt;

&lt;p&gt;These systems can absolutely feel as if they are working backwards. But again, the key difference is in how they treat disagreement.&lt;/p&gt;

&lt;p&gt;A solver tries to find a satisfying assignment.&lt;br&gt;
A logic engine backtracks.&lt;br&gt;
A truth maintenance system isolates incompatible assumptions.&lt;br&gt;
A propagator network keeps pushing information until it reaches a stable state.&lt;/p&gt;

&lt;p&gt;In all of them, disagreement is something to resolve, explain, or fence off.&lt;/p&gt;

&lt;p&gt;That matters, because eventually we reach a library that answers differently.&lt;/p&gt;

&lt;h2&gt;
  
  
  The systems that refuse to lose information
&lt;/h2&gt;

&lt;p&gt;Before that, there is one more family worth visiting: reversible computing.&lt;/p&gt;

&lt;p&gt;Languages like &lt;a href="https://esolangs.org/wiki/Janus" rel="noopener noreferrer"&gt;Janus &lt;/a&gt;and &lt;a href="https://www.cambridge.org/core/journals/journal-of-functional-programming/article/sparcl-a-language-for-partially-invertible-computation/809BDECF87B3748ED960FEFD42498BBE" rel="noopener noreferrer"&gt;Sparcl&lt;/a&gt; care deeply about running computation backwards, but not in the same sense as time travel. Their question is not, “can the future alter the past?” It is, “can every step be undone?”&lt;/p&gt;

&lt;p&gt;That is a stricter and more formal ambition. Nothing important can be thrown away. History must remain recoverable.&lt;/p&gt;

&lt;p&gt;These systems are elegant, and in some contexts very powerful, but they are aiming at invertibility, not temporal ambiguity. They preserve the path. They do not ask what to do when the path forks and refuses to rejoin.&lt;/p&gt;

&lt;h2&gt;
  
  
  The places where superposition is not a metaphor
&lt;/h2&gt;

&lt;p&gt;Then we step into even stranger territory.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/psg-mit/tower-oopsla22" rel="noopener noreferrer"&gt;Tower&lt;/a&gt;, from the OOPSLA 2022 work on quantum data structures, and &lt;a href="https://github.com/System-Verification-Lab/q-sylvan" rel="noopener noreferrer"&gt;Q-Sylvan&lt;/a&gt;, a quantum decision diagram simulator, inhabit a world where superposition is not just a literary device. It is the substrate. These systems are concerned with representing and manipulating genuinely superposed states in ways that respect quantum constraints or allow large-scale symbolic simulation. &lt;/p&gt;

&lt;p&gt;This is the point where most comparisons to ordinary libraries start to wobble. The mathematics is more demanding, the semantics are stricter, and the goal is different. These tools are not mainly trying to make ordinary developers comfortable with strange values in ordinary code. They are building formalisms for worlds where multiplicity is fundamental.&lt;/p&gt;

&lt;p&gt;Which makes them fascinating, but also makes them less immediately relatable.&lt;/p&gt;

&lt;p&gt;And that is exactly why the next stop is so interesting.&lt;/p&gt;

&lt;h2&gt;
  
  
  PositronicVariable, or what happens when software lets disagreement survive
&lt;/h2&gt;

&lt;p&gt;After walking through all these other approaches, &lt;a href="https://hackernoon.com/positronic-variables-in-c-teaching-state-to-argue-with-the-future" rel="noopener noreferrer"&gt;PositronicVariable &lt;/a&gt; comes into focus properly.&lt;/p&gt;

&lt;p&gt;Not as “the one with the weird name”, and not as “yet another library where the future matters”, but as something with a very particular personality.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/hutchpd/QuantumSuperposition/blob/master/PositronicVariables/readme.md" rel="noopener noreferrer"&gt;PositronicVariable &lt;/a&gt; takes the idea of future-defined values and brings it back into an imperative developer experience. It does not require you to think primarily in factor graphs, relational queries, reversible semantics, or quantum circuits. It works much closer to the feeling of ordinary programming, except the variables are allowed to participate in iterative causal loops.&lt;/p&gt;

&lt;p&gt;And this is the crucial part: when those loops do not settle to a single clean answer, PositronicVariable does not necessarily panic.&lt;/p&gt;

&lt;p&gt;It can represent the result as a multi-valued &lt;code&gt;any(...)&lt;/code&gt; state.&lt;/p&gt;

&lt;p&gt;That is the moment the whole comparison becomes interesting.&lt;/p&gt;

&lt;p&gt;Mariposa says contradiction is a paradox, stop the program.&lt;br&gt;
Probabilistic systems say contradiction means impossible, discard that world.&lt;br&gt;
Constraint systems say contradiction means unsatisfiable, search elsewhere.&lt;br&gt;
Truth maintenance systems say contradiction must be tracked and isolated.&lt;br&gt;
Reversible systems avoid the issue by design.&lt;br&gt;
Quantum systems absorb multiplicity into a formal substrate.&lt;/p&gt;

&lt;p&gt;PositronicVariable says something stranger.&lt;/p&gt;

&lt;p&gt;It says that if repeated execution leaves you with a stable plurality, then perhaps plurality is the result.&lt;/p&gt;

&lt;p&gt;That is a genuinely different stance.&lt;/p&gt;

&lt;p&gt;It turns disagreement into data.&lt;/p&gt;

&lt;p&gt;And that small shift changes the emotional texture of the whole thing. Instead of treating paradox as failure, it treats it as a shape the program can expose. Instead of insisting that every loop collapse neatly, it allows some loops to stabilise as a set of possibilities. The future does not merely patch the past. The future and past keep negotiating until what remains is something the runtime can hold.&lt;/p&gt;

&lt;p&gt;There is something unexpectedly human about that idea.&lt;/p&gt;

&lt;h2&gt;
  
  
  The charm of the oddballs
&lt;/h2&gt;

&lt;p&gt;Along the edges of this landscape are smaller curiosities. A Fantom talk exploring positronic variables. An old Forth-flavoured oddity called Abundance with claims of running backwards in time. Haskell’s procrastinating variables, which are really about delayed availability rather than paradox. Research around prophecy variables in staged systems like BuildIt. &lt;a href="https://vimeo.com/12765016" rel="noopener noreferrer"&gt;Fantom positronic demo&lt;/a&gt;, &lt;a href="https://github.com/lassik/awesome-forth" rel="noopener noreferrer"&gt;Abundance&lt;/a&gt;, &lt;a href="https://github.com/gcross/procrastinating-variable" rel="noopener noreferrer"&gt;PVars&lt;/a&gt;, &lt;a href="https://arxiv.org/abs/2601.02653" rel="noopener noreferrer"&gt;BuildIt&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;They are all part of the same broad human fascination: what if software did not have to march forwards so obediently?&lt;/p&gt;

&lt;p&gt;Most of them answer in partial, cautious, or specialised ways.&lt;/p&gt;

&lt;p&gt;PositronicVariable feels unusual because it answers in a way that is both playful and concrete.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;p&gt;It would be easy to dismiss all of this as cleverness for cleverness’s sake. Academic toys. Esoteric abstractions. Programming languages having a late-night conversation with physics.&lt;/p&gt;

&lt;p&gt;But there is a reason these ideas keep resurfacing.&lt;/p&gt;

&lt;p&gt;Real software is full of circularity. We infer things from outcomes. We revise earlier assumptions in light of later evidence. We let one part of a system act on expectations about another part that has not finished yet. We constantly pretend our programs are simple chains of cause and effect, while quietly building systems full of feedback, revision, and negotiation.&lt;/p&gt;

&lt;p&gt;Most libraries deal with that by hiding the mess.&lt;/p&gt;

&lt;p&gt;The interesting ones expose it.&lt;/p&gt;

&lt;p&gt;And that is what makes this corner of computing so compelling. Not that it breaks time, but that it forces us to admit how often our software was never truly linear to begin with.&lt;/p&gt;

&lt;p&gt;If you start from that point, PositronicVariable stops looking like a gimmick and starts looking like one very bold answer to a serious question:&lt;/p&gt;

&lt;p&gt;What should a program do when reality refuses to settle on just one past?&lt;/p&gt;

</description>
      <category>computerscience</category>
      <category>todayisearched</category>
      <category>softwaredevelopment</category>
      <category>developers</category>
    </item>
    <item>
      <title>I built an open source browser-based AI medical scribe to see if that model could actually work</title>
      <dc:creator>hutchpd</dc:creator>
      <pubDate>Thu, 19 Mar 2026 12:08:16 +0000</pubDate>
      <link>https://dev.to/hutchpd/i-built-an-open-source-browser-based-ai-medical-scribe-to-see-if-that-model-could-actually-work-3ek3</link>
      <guid>https://dev.to/hutchpd/i-built-an-open-source-browser-based-ai-medical-scribe-to-see-if-that-model-could-actually-work-3ek3</guid>
      <description>&lt;p&gt;A lot of the hesitation around AI medical scribes is not just about whether the summary is good. It is also about privacy, trust, auditability, and whether the output can actually go somewhere useful afterwards.&lt;/p&gt;

&lt;p&gt;That made me curious about a different approach: what if the scribe lived in the browser, kept data local by default, and still tried to offer structured review and handoff?&lt;/p&gt;

&lt;p&gt;So I built AI Medical Scribe, a browser-based prototype for live consultation transcription, on-device summarisation, document drafting, structured extraction, review tooling, local audit logging, and client-side FHIR export.&lt;/p&gt;

&lt;p&gt;Everything runs in the browser.&lt;/p&gt;

&lt;p&gt;No project backend.&lt;br&gt;
No API keys.&lt;br&gt;
No server-side processing.&lt;br&gt;
No data leaving the device by default.&lt;/p&gt;

&lt;p&gt;Repo here:&lt;br&gt;
&lt;code&gt;https://github.com/hutchpd/AI-Medical-Scribe&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;This was not an attempt to make a production-ready clinical tool.&lt;/p&gt;

&lt;p&gt;It was an experiment.&lt;/p&gt;

&lt;p&gt;I wanted to explore whether modern browser capabilities are now good enough that you could build the front end of a medical scribe as a &lt;strong&gt;local-first app&lt;/strong&gt;, and whether that changes the conversation around privacy, trust, and workflow.&lt;/p&gt;

&lt;p&gt;A lot of the friction around AI scribes is not just about summarisation quality. It is also about where the data goes, who processes it, what gets retained, how audit works, and whether the output actually fits the systems clinicians already use.&lt;/p&gt;

&lt;p&gt;So instead of asking, “can I build a cloud AI scribe?” I asked, “can something like this live in the browser and still be useful?”&lt;/p&gt;

&lt;h2&gt;
  
  
  What the prototype does
&lt;/h2&gt;

&lt;p&gt;The current version supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;live consultation transcription using Chrome speech recognition&lt;/li&gt;
&lt;li&gt;manual notes alongside the live transcript&lt;/li&gt;
&lt;li&gt;timeline markers for important moments&lt;/li&gt;
&lt;li&gt;on-device summary generation after the session ends&lt;/li&gt;
&lt;li&gt;rich text document drafting from transcript content&lt;/li&gt;
&lt;li&gt;structured extraction into buckets like problems, medications, allergies, investigations, follow-up actions, diagnoses, safety netting, and admin tasks&lt;/li&gt;
&lt;li&gt;review mode with confidence highlighting and provenance cues&lt;/li&gt;
&lt;li&gt;local append-only audit logging&lt;/li&gt;
&lt;li&gt;client-side FHIR R4 document Bundle export&lt;/li&gt;
&lt;li&gt;optional direct browser-side FHIR POST to a configured endpoint&lt;/li&gt;
&lt;li&gt;optional encrypted session storage, app lock, inactivity lock, retention controls, and ephemeral consultation mode&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of that happens in-browser.&lt;/p&gt;

&lt;p&gt;It is still a prototype and still very dependent on recent Chrome builds and built-in AI features that are rolling out unevenly, but it is now much more than a simple “transcribe and summarise” demo.&lt;/p&gt;

&lt;h2&gt;
  
  
  The original idea was smaller
&lt;/h2&gt;

&lt;p&gt;The first version was much simpler.&lt;/p&gt;

&lt;p&gt;It handled:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;transcription&lt;/li&gt;
&lt;li&gt;notes&lt;/li&gt;
&lt;li&gt;summary generation&lt;/li&gt;
&lt;li&gt;document drafting&lt;/li&gt;
&lt;li&gt;session history&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That was enough to test the basic idea, but once I shared it and started getting feedback, the same concerns kept coming up.&lt;/p&gt;

&lt;p&gt;Not “can the browser summarise a consultation?”&lt;/p&gt;

&lt;p&gt;More like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how do you review and trust what it generated?&lt;/li&gt;
&lt;li&gt;how do you audit what happened?&lt;/li&gt;
&lt;li&gt;how do you secure local data properly?&lt;/li&gt;
&lt;li&gt;how do you get anything useful back into the EHR?&lt;/li&gt;
&lt;li&gt;if it stays in the browser, how do you prove that is safe and governable?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are much more interesting questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the feedback made clear
&lt;/h2&gt;

&lt;p&gt;One of the most useful things about sharing an experiment publicly is that people immediately point at the real blockers.&lt;/p&gt;

&lt;p&gt;The responses were thoughtful, and honestly pretty consistent.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Local-first is appealing, but not enough on its own
&lt;/h3&gt;

&lt;p&gt;Several people liked the idea of keeping data on the device, especially in settings where privacy, trust, procurement, or data residency matter.&lt;/p&gt;

&lt;p&gt;That matches my own instinct. Even if cloud systems can be compliant, the simple fact that consultation content is being sent elsewhere changes how some clinicians and patients feel about the interaction.&lt;/p&gt;

&lt;p&gt;But local-first is not magic. It does not remove the need for security, retention rules, auditability, review workflows, or governance.&lt;/p&gt;

&lt;p&gt;What it does do is shift the trust boundary. Instead of “trust my cloud pipeline”, it becomes “trust the endpoint, deployment environment, and browser capabilities”.&lt;/p&gt;

&lt;p&gt;That feels like a different and, in some cases, more workable conversation.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The real blocker is not transcription, it is handoff
&lt;/h3&gt;

&lt;p&gt;This came up again and again.&lt;/p&gt;

&lt;p&gt;Even if you can transcribe locally, summarise locally, and draft locally, that does not automatically make the tool useful.&lt;/p&gt;

&lt;p&gt;If the output cannot get back into Epic, Cerner, Galeon, or another EHR in a structured and visible way, you risk ending up with something that is just a fancy sidecar.&lt;/p&gt;

&lt;p&gt;That feedback pushed me to think beyond “generate a nice document” and toward structured interoperability, even in a prototype.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Review burden matters more than raw generation
&lt;/h3&gt;

&lt;p&gt;Another fair criticism was that if clinicians have to review everything anyway, are you actually saving time?&lt;/p&gt;

&lt;p&gt;I think that is the right challenge.&lt;/p&gt;

&lt;p&gt;The value is not “AI writes the note and you trust it blindly.”&lt;/p&gt;

&lt;p&gt;The value, if there is any, is in reducing the blank-page problem, surfacing likely useful structure, and making review faster and more focused.&lt;/p&gt;

&lt;p&gt;That is part of why I added confidence-aware review tooling rather than treating all transcript and generated output as equally reliable.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Auditability matters even for local tools
&lt;/h3&gt;

&lt;p&gt;A browser app that says “everything stays local” still has to answer awkward questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what happened during the session?&lt;/li&gt;
&lt;li&gt;what was generated and when?&lt;/li&gt;
&lt;li&gt;what was edited?&lt;/li&gt;
&lt;li&gt;what was exported?&lt;/li&gt;
&lt;li&gt;can the workflow be traced at all?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That made it clear that a serious local-first experiment needs more than browser storage. It needs some concept of local traceability as well.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I tried to address those concerns in the newer version
&lt;/h2&gt;

&lt;p&gt;I do not think the current version “solves” these problems.&lt;/p&gt;

&lt;p&gt;But I do think it starts to show what direction a browser-based local-first scribe could go if you wanted to take those concerns seriously.&lt;/p&gt;

&lt;h3&gt;
  
  
  Review and trust
&lt;/h3&gt;

&lt;p&gt;I added:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;structured extraction&lt;/li&gt;
&lt;li&gt;confidence indicators&lt;/li&gt;
&lt;li&gt;review mode&lt;/li&gt;
&lt;li&gt;provenance cues&lt;/li&gt;
&lt;li&gt;stale and needs-review badges&lt;/li&gt;
&lt;li&gt;quick actions to re-run generation or jump to relevant transcript sections&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal was to make the output easier to validate, not just prettier to look at.&lt;/p&gt;

&lt;h3&gt;
  
  
  Auditability
&lt;/h3&gt;

&lt;p&gt;I added a &lt;strong&gt;local append-only audit log&lt;/strong&gt; that records key actions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;session lifecycle changes&lt;/li&gt;
&lt;li&gt;edits&lt;/li&gt;
&lt;li&gt;generation actions&lt;/li&gt;
&lt;li&gt;extraction runs&lt;/li&gt;
&lt;li&gt;FHIR downloads and sends&lt;/li&gt;
&lt;li&gt;archive, restore, and delete actions&lt;/li&gt;
&lt;li&gt;lock and unlock activity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The logs stay local, and they can be viewed or exported as text or JSON.&lt;/p&gt;

&lt;p&gt;Would browser-local audit logs satisfy a real hospital security team? Probably not on their own. But they are a better answer than having no traceability at all, and they help demonstrate what a local-first audit model might look like.&lt;/p&gt;

&lt;h3&gt;
  
  
  Security and privacy controls
&lt;/h3&gt;

&lt;p&gt;I also added:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;optional encrypted storage at rest using Web Crypto&lt;/li&gt;
&lt;li&gt;passphrase unlock mode&lt;/li&gt;
&lt;li&gt;session-only key mode&lt;/li&gt;
&lt;li&gt;app-level lock and inactivity auto-lock&lt;/li&gt;
&lt;li&gt;ephemeral consultations&lt;/li&gt;
&lt;li&gt;retention-based cleanup and destructive deletion workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Again, this does not magically make it enterprise-ready. But it moves the experiment closer to the actual questions people ask once local data is involved.&lt;/p&gt;

&lt;h3&gt;
  
  
  Structured handoff
&lt;/h3&gt;

&lt;p&gt;The biggest change in response to integration feedback was adding &lt;strong&gt;client-side FHIR export&lt;/strong&gt; and optional browser-side delivery to a configured endpoint.&lt;/p&gt;

&lt;p&gt;That does not solve the full EHR integration problem. Not even close.&lt;/p&gt;

&lt;p&gt;But it does move the handoff from “here is some transcript text” to “here is a structured document Bundle with a Composition and related resources.”&lt;/p&gt;

&lt;p&gt;That felt like an important step, because one of the takeaways from the feedback was that a local-first tool only starts to become interesting when it can hand something structured to the next system.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I think this experiment shows
&lt;/h2&gt;

&lt;p&gt;I do not think this project proves that browser-based medical scribes are ready for real deployment.&lt;/p&gt;

&lt;p&gt;But I do think it shows something interesting:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;you can now build a surprisingly capable local-first scribe workflow in the browser&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not a complete one.&lt;br&gt;
Not a clinically safe one.&lt;br&gt;
Not a production-ready one.&lt;/p&gt;

&lt;p&gt;But enough to make the idea concrete.&lt;/p&gt;

&lt;p&gt;And once the idea is concrete, the discussion gets better.&lt;/p&gt;

&lt;p&gt;Instead of vaguely asking whether local-first healthcare AI is possible, you can point at something working and ask better questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what would make this auditable enough?&lt;/li&gt;
&lt;li&gt;what would make this secure enough?&lt;/li&gt;
&lt;li&gt;what kind of structured handoff would actually fit workflow?&lt;/li&gt;
&lt;li&gt;where should trust sit?&lt;/li&gt;
&lt;li&gt;which parts belong in the browser, and which parts do not?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is much more useful than vendor-style hype, and much more useful than treating the whole thing as impossible.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;p&gt;The biggest lesson for me is that the interesting part is not the AI summary itself.&lt;/p&gt;

&lt;p&gt;It is the combination of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;capture&lt;/li&gt;
&lt;li&gt;review&lt;/li&gt;
&lt;li&gt;trust&lt;/li&gt;
&lt;li&gt;audit&lt;/li&gt;
&lt;li&gt;privacy&lt;/li&gt;
&lt;li&gt;structured handoff&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the real product surface.&lt;/p&gt;

&lt;p&gt;A tool like this is not just “speech recognition plus LLM output.” It lives or dies on workflow fit and confidence.&lt;/p&gt;

&lt;p&gt;The other lesson is that browser capability is getting close enough that these experiments are worth doing now. The Chrome built-in AI ecosystem is still uneven and fiddly, but it is no longer science fiction to imagine local-first tools that do meaningful work without a project backend.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it definitely is not
&lt;/h2&gt;

&lt;p&gt;This is not a medical device.&lt;br&gt;
It is not suitable for clinical use.&lt;br&gt;
It is not production-ready.&lt;br&gt;
It does not solve governance, compliance, or EHR integration.&lt;/p&gt;

&lt;p&gt;It is an experiment.&lt;/p&gt;

&lt;p&gt;But I think it is an experiment that points in a useful direction.&lt;/p&gt;

&lt;p&gt;Not “look, I built the perfect AI scribe.”&lt;/p&gt;

&lt;p&gt;More:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;look, you could build these tools to live in the browser, keep data local by default, add review and auditability, and start handing off structured outputs.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That feels like a direction worth exploring.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you want to look at the code
&lt;/h2&gt;

&lt;p&gt;The repo is here:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://github.com/hutchpd/AI-Medical-Scribe&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If you work in health IT, clinical systems, browser AI, or local-first tooling, I’d be genuinely interested in whether this direction feels promising to you, and where you think the hard boundary really is.&lt;/p&gt;

&lt;p&gt;Is it browser capability?&lt;br&gt;
Is it audit and governance?&lt;br&gt;
Is it review burden?&lt;br&gt;
Or is it still the last mile into the EHR?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>privacy</category>
      <category>showdev</category>
    </item>
    <item>
      <title>QuantumSuperposition: a .NET library for when one value isn’t enough</title>
      <dc:creator>hutchpd</dc:creator>
      <pubDate>Mon, 09 Mar 2026 11:33:49 +0000</pubDate>
      <link>https://dev.to/hutchpd/quantumsuperposition-a-net-library-for-when-one-value-isnt-enough-679</link>
      <guid>https://dev.to/hutchpd/quantumsuperposition-a-net-library-for-when-one-value-isnt-enough-679</guid>
      <description>&lt;p&gt;Most code is built on a comforting lie: that there is one correct value, right now, and everyone agrees about it.&lt;/p&gt;

&lt;p&gt;Sometimes that’s true. Sometimes &lt;code&gt;int x = 5;&lt;/code&gt; is exactly what the doctor ordered, and we should all go home early.&lt;/p&gt;

&lt;p&gt;But sometimes a value is not one thing yet. It might be one of several candidates. It might depend on noisy inputs. It might live inside a search space. But sometimes a value is not one thing yet. It might be one of several candidates. It might depend on noisy inputs. It might live inside a search space. Or, for reasons that would alarm a project manager, you might actually want proper quantum-style state and gates in C#.&lt;/p&gt;

&lt;p&gt;That’s the niche these libraries live in.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;QuantumSuperposition&lt;/code&gt; gives you strongly typed superpositions and a proper quantum simulation layer. &lt;code&gt;PositronicVariables&lt;/code&gt; takes some of the same machinery and points it in a much stranger direction: values can propagate backwards through execution order, so later code can influence earlier reads. One is useful for representing uncertainty and quantum-style computation. The other is useful for letting variables argue with their own future until they calm down.&lt;/p&gt;

&lt;h2&gt;
  
  
  The boringly useful part: keep several candidate values alive
&lt;/h2&gt;

&lt;p&gt;The easiest way to understand &lt;code&gt;QuantumSuperposition&lt;/code&gt; is not “physics,” it’s “a weighted set of possible values that you can compute over without picking one too early.”&lt;/p&gt;

&lt;p&gt;That’s what &lt;code&gt;QuBit&amp;lt;T&amp;gt;&lt;/code&gt; and &lt;code&gt;Eigenstates&amp;lt;T&amp;gt;&lt;/code&gt; are doing.&lt;/p&gt;

&lt;p&gt;You can map over possible values, filter them, combine them, do arithmetic on them, sample from them, and only collapse to a single result when you actually need one. In other words, you can stop flattening uncertainty into a lie just because your code got impatient.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;QuantumSuperposition.Core&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;QuantumSuperposition.QuantumSoup&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;QuantumSuperposition.Operators&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;candidates&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;QuBit&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;6&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;interesting&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;candidates&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;%&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;interesting&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;                &lt;span class="c1"&gt;// still a superposition&lt;/span&gt;
&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;interesting&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SampleWeighted&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// one sampled outcome&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s the part I suspect most people will actually use first.&lt;/p&gt;

&lt;p&gt;Not because they’re building a quantum computer in a shoebox, but because they have a problem where “there are several plausible values here” is the honest state of the world. Search problems, candidate ranking, speculative transforms, rule systems, fuzzy pipelines, weird combinatorics, toy AI experiments, or just “I want to see all the branches before I commit.”&lt;/p&gt;

&lt;p&gt;And because this is .NET instead of interpretive dance, you still get a nice programmer-shaped API: arithmetic, comparisons, LINQ-style &lt;code&gt;Select&lt;/code&gt;, &lt;code&gt;Where&lt;/code&gt;, and &lt;code&gt;SelectMany&lt;/code&gt;, plus weighted sampling and deterministic collapse via seeded randomness or mockable collapse when your CI pipeline deserves peace for once. Haunted test suites are funny only until they’re yours.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then there’s the actual quantum bit
&lt;/h2&gt;

&lt;p&gt;The library is not just “a list with vibes.”&lt;/p&gt;

&lt;p&gt;There’s also a proper physics-flavoured layer with &lt;code&gt;QuantumSystem&lt;/code&gt;, tensor products, entanglement management, &lt;code&gt;PhysicsQubit&lt;/code&gt;, &lt;code&gt;QuantumRegister&lt;/code&gt;, built-in gates, circuit scheduling, ASCII visualisation, and algorithm helpers for things like QFT and Grover.&lt;/p&gt;

&lt;p&gt;So if your idea of a relaxing afternoon is “let’s build a Bell pair in C# and see what happens,” you are disturbingly well catered for.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;QuantumSuperposition.Systems&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;system&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;QuantumSystem&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;bell&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QuantumRegister&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;EPRPair&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;measured&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bell&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Collapse&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;measured&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// 00 or 11&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also work at the gate level:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;QuantumSuperposition.Systems&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;QuantumSuperposition.Utilities&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;system&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;QuantumSystem&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ApplySingleQubitGate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;QuantumGates&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Hadamard&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"H"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ApplyTwoQubitGate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;QuantumGates&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CNOT&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Matrix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"CNOT"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;VisualiseGateSchedule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;totalQubits&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ProcessGateQueue&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That split is part of what makes the project interesting. You can stay at the “typed superposition” layer if that’s all you need, or drop down into registers, gates, entanglement groups, canonical states, and algorithm-level tools when you want the full circuit model.&lt;/p&gt;

&lt;p&gt;There are helpers for common states like EPR, GHZ, and W states, plus &lt;code&gt;QuantumRegister&lt;/code&gt; for treating part of the global wavefunction as a coherent value-ish thing. You also get more than the usual gate greatest hits: controlled gates, SWAP-family gates, Toffoli, Fredkin, and QFT construction.&lt;/p&gt;

&lt;h2&gt;
  
  
  PositronicVariables: code that runs in the wrong direction on purpose
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;PositronicVariables&lt;/code&gt; are not mainly about “some values take a few passes to settle.” That happens, yes. But the core idea is much stranger and much more fun:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;they let values propagate backwards through execution order.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Normal code runs like a stern Victorian schoolmaster. Line 1, then line 2, then line 3. Cause, then effect. Everyone in single file, no pushing.&lt;/p&gt;

&lt;p&gt;PositronicVariables do not respect that tidy little parade.&lt;/p&gt;

&lt;p&gt;With PVs, you can use the result of a calculation &lt;strong&gt;before&lt;/strong&gt; the calculation appears in source order. If your program is lines &lt;code&gt;1, 2, 3, 4, 5&lt;/code&gt;, the logic can effectively flow &lt;code&gt;5, 4, 3, 2, 1&lt;/code&gt;. They’re the tachyon variables of the programming world: information shows up before it has any right to.&lt;/p&gt;

&lt;p&gt;That means you can do something like print a value before the line that computes it has executed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&amp;lt;=&lt;/span&gt; &lt;span class="m"&gt;40&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In other words, the read on the first line can be satisfied by the assignment on the second. The program is allowed to become self-consistent across time instead of only top-to-bottom.&lt;/p&gt;

&lt;p&gt;In ordinary programming, that is nonsense. The bad kind. The kind that gets you &lt;code&gt;null&lt;/code&gt;, default values, exceptions, or a teammate quietly updating their CV.&lt;/p&gt;

&lt;p&gt;With PositronicVariables, that kind of backwards causality is the point. The variable participates in a temporal dependency graph, and the system works out a self-consistent value across the whole flow rather than insisting everything must be known strictly top-to-bottom.&lt;/p&gt;

&lt;p&gt;So the mental model is less:&lt;/p&gt;

&lt;p&gt;“this variable needs a couple of iterations”&lt;/p&gt;

&lt;p&gt;and more:&lt;/p&gt;

&lt;p&gt;“this variable has received news from later in the program.”&lt;/p&gt;

&lt;p&gt;That’s the interesting bit. The convergence machinery matters because once you allow values to leak backward in time, you need some way to make the universe stop wobbling. But that machinery is there in service of the core trick: &lt;strong&gt;future assignments can influence earlier reads&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That opens the door to code that feels mildly illegal in a very entertaining way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;declaring outputs before their derivation&lt;/li&gt;
&lt;li&gt;wiring up feedback loops without immediately exploding&lt;/li&gt;
&lt;li&gt;expressing circular relationships directly instead of faking them with mutable staging state&lt;/li&gt;
&lt;li&gt;letting a program “discover” a consistent state across time rather than marching there in one direction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Or, put less politely: it lets your variables cheat.&lt;/p&gt;

&lt;p&gt;That’s why the library is interesting. Not because it’s a generic fixpoint engine wearing a fake moustache, but because it experiments with a programming model where causality is negotiable. The convergence is the cleanup crew. The headline feature is that &lt;strong&gt;later code can reach back and affect earlier code&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Which is either a neat abstraction or an affront to God, depending on how much sleep you’ve had.&lt;/p&gt;

&lt;h3&gt;
  
  
  When causality breaks: Feynman diagrams for code
&lt;/h3&gt;

&lt;p&gt;Once you allow information to flow backward in time, something interesting happens: you can create &lt;strong&gt;causal loops&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Physicists draw these using &lt;strong&gt;Feynman diagrams&lt;/strong&gt;, little arrows through spacetime showing how particles interact. You can steal the same trick to understand PositronicVariables.&lt;/p&gt;

&lt;p&gt;Take the smallest paradox we can write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;antival&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PositronicVariable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetOrCreate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"antival"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="n"&gt;antival&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;antival&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;State&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you draw the causal flow, it looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Time →

[antival guess] -&amp;gt; val = -1 * antival -&amp;gt; antival = val
       ^__________________________________________|
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The value feeds back into itself.&lt;/p&gt;

&lt;p&gt;In a normal program this is just a bad idea that ends in recursion, stack explosions, or somebody quietly deleting the code. But with PositronicVariables the engine treats it as a &lt;strong&gt;temporal constraint system&lt;/strong&gt;. It replays the timeline until the loop becomes self-consistent.&lt;/p&gt;

&lt;p&gt;Sometimes that means the system converges to a single value.&lt;/p&gt;

&lt;p&gt;Sometimes it means the only consistent answer is &lt;strong&gt;multiple states at once&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;antival = any(-1, 1)
val     = any(1, -1)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The paradox doesn’t crash the program - it &lt;strong&gt;creates a superposition&lt;/strong&gt;. The system couldn’t decide which timeline wins, so it keeps both.&lt;/p&gt;

&lt;p&gt;Which is a surprisingly polite way for a runtime to handle time travel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why would you actually use this?
&lt;/h2&gt;

&lt;p&gt;The honest answer is: not for everything.&lt;/p&gt;

&lt;p&gt;You should still use ordinary values for ordinary values. A plain &lt;code&gt;int&lt;/code&gt; remains one of humanity’s better ideas.&lt;/p&gt;

&lt;p&gt;But there are a few cases where this sort of thing stops being a joke and starts being genuinely handy.&lt;/p&gt;

&lt;p&gt;One is when you have multiple candidate states and want to compute over all of them without flattening them immediately into one guess. That’s the &lt;code&gt;QuBit&amp;lt;T&amp;gt;&lt;/code&gt; story.&lt;/p&gt;

&lt;p&gt;Another is when you want to prototype or teach quantum computing concepts in an ecosystem you already know. Having quantum registers, gates, entanglement, canonical states, and algorithm helpers available from C# is genuinely useful if you live in .NET and don’t fancy context-switching into a different stack every time you want to experiment.&lt;/p&gt;

&lt;p&gt;And then there’s the weirder class of problems where you want later logic to inform earlier reads: circular definitions, feedback-heavy systems, temporal dependency graphs, or code where the most natural expression of the problem does not run neatly top-to-bottom. &lt;code&gt;PositronicVariables&lt;/code&gt; gives that model a formal home instead of forcing you to fake it with mutable staging state and a prayer.&lt;/p&gt;

&lt;p&gt;Also, sometimes it’s okay to build a strange library because it teaches you something. Not everything has to be another CRUD app with a motivational LinkedIn post strapped to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  A few caveats, because humility is cheaper than bug reports
&lt;/h2&gt;

&lt;p&gt;This is not a replacement for normal programming.&lt;/p&gt;

&lt;p&gt;It is a tool for specific classes of problems: uncertainty, multi-state computation, quantum-style modelling, algorithm experimentation, and backwards-flow or convergence-heavy logic. If your use case is “I need to store a number,” congratulations, civilization has already solved that one.&lt;/p&gt;

&lt;p&gt;It is also not magic. Multi-qubit state spaces grow explosively. Large simulations will punish your laptop for your ambition. Convergence logic is intentionally coordinated rather than “surprise, time travel is parallel now.” And if you lean into the weird parts, you are signing up for weird behaviour by design. The library is polite about it, but it is still weird.&lt;/p&gt;

&lt;p&gt;That said, I think weird is underrated when it is honest.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;I like this project because it does not pretend all uncertainty is a bug.&lt;/p&gt;

&lt;p&gt;Sometimes “maybe” is the right value.&lt;br&gt;&lt;br&gt;
Sometimes several states are the truth.&lt;br&gt;&lt;br&gt;
Sometimes a variable should be allowed to keep its options open.&lt;br&gt;&lt;br&gt;
Sometimes a program is easier to express if values don’t have to arrive in strict top-to-bottom order.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;QuantumSuperposition&lt;/code&gt; and &lt;code&gt;PositronicVariables&lt;/code&gt; are both built around that idea, just in different directions. One lets you work with multiple possible values and quantum-style state without abandoning normal C# ergonomics. The other lets later code reach back and inform earlier reads, which is either a useful abstraction or a minor crime against causality.&lt;/p&gt;

&lt;p&gt;Use them for search spaces, experiments, quantum toy boxes, causal weirdness, or just because you enjoy making the CLR slightly uncomfortable.&lt;/p&gt;

&lt;p&gt;That last reason is as valid as any.&lt;/p&gt;

&lt;p&gt;You can play with these libraries here &lt;a href="https://github.com/hutchpd/QuantumSuperposition/" rel="noopener noreferrer"&gt;https://github.com/hutchpd/QuantumSuperposition/&lt;/a&gt; or via nuget&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dotnet add package QuantumSuperposition
dotnet add package PositronicVariables
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>computerscience</category>
      <category>csharp</category>
      <category>dotnet</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
