A technical retrospective on ambition, self-falsification, and research taste. Roughly ten thousand words, with real experimental data, framework comparison tables, and every pit I stepped into.


Before You Read

This is a retrospective on failure.

More precisely, it is a retrospective on something that “almost succeeded but was already done by other people long ago.” Starting from a life intuition about thyroid negative feedback, I pushed all the way through structural causal models, differential-geometric foliations, category theory, and information geometry. I wrote a white paper, 31 Python scripts, and 22 figures, believing I had built a “dynamic causal foundation theory that challenges Judea Pearl.”

Then I did the one thing I should have done on day one: seriously searched the literature online.

Within half a day, every brick I had laid was found in someone else’s papers — in sturdier, earlier, and more rigorous versions.

I’m recording the whole process as it happened. Not for self-flagellation, but because — “how a person discovers they’ve reinvented the wheel” is itself worth more than the wheel.


Act One: An Intuition from the Thyroid

The starting point wasn’t “I want to do causality research” at all — it was a very plain question.

At the time I was thinking about why large language models “fabricate causality”: it can learn that “lightning” and “thunder” always co-occur, but not that the speed of light versus sound creates the sequence. This is the classic problem of Pearl’s “ladder of causation” — Transformers live only on the first rung (association) and can’t climb to the second (intervention) or third (counterfactuals).

Following the thread, an intuition surfaced:

Could a causal chain essentially be a “weighted logical chain”? Like the thyroid hormone negative feedback loop — T3/T4 rising suppresses TSH secretion, and falling TSH reduces T3/T4 synthesis: a loop with signs.

At the time I thought the analogy was beautiful: logic chains are the skeleton, promotion/inhibition are the weights, temporal dynamics are the blood. I even asked further: is causality like a Markov chain, with direction and transitions?

Looking back now, the answers to these questions are:

I didn’t work these conclusions out at once back then — I was forced into them round after round by my own questioning. They deserve a few more paragraphs, because they are the intellectual starting point of the whole edifice and the source of all my later detours.

Where Logic and Causality Actually Differ

What I couldn’t figure out at first was why “causal chains” and “logical chains” aren’t the same thing. They look so similar: both have direction, both link link by link. But digging deeper, there are four fundamental differences:

  1. Logic is truth-preserving; causality is reversible. Logical inference satisfies monotonicity — add conditions to the premises and the original conclusion is not overturned. Causality is the opposite: add one confounder to the model and the causal direction can entirely flip. This can’t happen in logic, but it happens constantly in causality (Simpson’s paradox is its canonical form).
  2. Logic cares only about truth values; causality cares about mechanism invariance. Logic asks “is the proposition self-consistent”; causality asks “does the world’s mechanism support this assertion.” Pearl’s Causal Hierarchy Theorem strictly proves: no statistic of observational data (rung one) can logically entail intervention effects (rung two) or counterfactuals (rung three). If causality were just logic, this theorem shouldn’t exist — with enough premises, conclusions should be derivable. Its existence shows causality needs extra, non-logical assumptions (causal graphs, no-confounding) to cross from observation to intervention.
  3. Logic is timeless; causality is dynamic. My thyroid negative-feedback example is precisely not a logical chain: it’s described by differential equations, has a time dimension, has attractors/steady states, and “inhibition” is a molecular physical mechanism (T3 binding pituitary receptors, downregulating TSH gene transcription), not logical negation. There is no “steady state” concept in logic.
  4. Logic’s weights are confidence; causality’s weights are mechanism parameters. If you treat causality as a “weighted logical chain,” you’d think “fit a weight of 0.8 for A→B with big data and you’ve grasped causality.” But that 0.8 could be pure confounding (“ice cream sales → drowning” has high correlational weight and zero causal weight). Real causal weights are effect sizes under intervention, identifiable only through randomized experiments or causal assumptions.

So What Is Causality, Actually?

Looking it up, philosophy offers at least three serious positions, each of which felt closer to the essence than “logic”:

The more I read, the more these lined up with the thyroid intuition: the core of causality is regulation and dynamics — which leaves Pearl’s static graph theory and enters the territory of control theory and system dynamics. — Looking back now, this “leaving Pearl’s territory” judgment was both my only genuinely valuable intuition and the sentence that walked me into the pit.

These rounds of self-questioning carried me from “LLM hallucination” all the way to the foundations of causal inference. I got more and more excited and decided to seriously build something.

The first pit was already dug: I mistook “thinking an intuition through” for “discovering a new direction.”


Act Two: The Snowball Grows

2.1 Three “Proof” Experiments

I started with three numerical experiments to “rigorously prove” my idea.

Experiment one: thyroid negative-feedback ODE. I modeled TRH → TSH → T3 with three differential equations, letting T3 negatively inhibit upstream. The inhibition term was written as a Hill-function form 1/(1+α·T3), with α the feedback strength. The results were beautiful:

My conclusion: a DAG cannot draw these four things — cycles, time lags, emergent steady states, and parameter interventions. The DAG’s “acyclic” assumption directly forbids that negative-feedback edge; and it is a static snapshot where nodes have only “simultaneous” relations — no syntax for lag to express that 3.7-unit delay, and no dynamic concept of “the system spontaneously tending toward a set-point.”

Experiment two: Simpson’s paradox. Let the confounder “age” influence both “exercise” and “recovery.” The overall data shows the exercise group’s recovery rate lower by 16.5% (an artifact), but stratified by age, exercise is beneficial in every subgroup (young +7.1%, old +1.8%). Conclusion: pure statistical weights can be distorted to sign reversal by confounding.

Experiment three: observation vs. intervention. True causal effect set to 0.3. Results:

MethodEstimateBias
Observational regression P(Y|X)1.056inflated 3.5×
Randomized experiment P(Y|do(X))0.303+0.003
Backdoor adjustment (controlling Z)0.318+0.018

That 3.5× number was striking; at the time I thought it was ironclad proof that “causality transcends statistics.”

My current judgment: these three experiments produced zero new knowledge. They are textbook-level demonstrations — restating “DAGs can’t express dynamics,” “Simpson’s paradox,” and “Pearl’s causal hierarchy theorem” respectively. Demonstrated clearly, but demonstration ≠ research contribution. I completely failed to see that distinction then. And even more self-deceptive: the figures really were pretty, the data really was clean, the tests really were all green — these things gave me the illusion of “doing real research.”

2.2 From Experiments to a “Theoretical Framework”

Tasting success, I started “building a framework.” Reading this section back now, it was a bit manic:

Then I put all of this into the white paper, with a fairly intimidating line: “Pearl’s framework is a coarse-grained approximation of causality, not a general theory.” Rereading that sentence now gives me chills — it cited nothing in support, and never noticed that the whole field had long been seriously working on exactly this.

2.3 The Formalization That Wouldn’t Stop

From there it snowballed out of control. In several “what next → all done” loops, I produced:

In the end, all 31 scripts passed and all 22 figures were generated. The project had src/, src/theory/, tests/, and run_all.py to run every experiment with one command. Those layers of theoretical formalization included the ε-δ proof of the embedding theorem, CDS and SCM written as categories and functors, the tangent-space condition theorem (‖Vᵢ‖>0 ⇔ S-identifiable), and a causal Fisher information matrix. Each layer came with a reproducible numerical experiment.

At that moment I genuinely believed I was doing something big. Beautiful project structure, all-green tests, theory built from intuition all the way up to information geometry. Every time I asked “what next,” the answer was always “add one more layer.”

That was the second and biggest pit: I built thirty floors on a foundation I’d never checked for whether anyone else had built it first.


Act Three: The Reality Check

When I reached the information-geometry floor, I finally stopped and asked the question I should have asked on day one: “Has anyone else already done this stuff?”

So I started systematically searching online. Half a day later, the building collapsed.

3.1 A Comparison Table That Silenced Me

What I thought was originalReality after searching online
CDS 7-tuple (ODE + do-operation + counterfactuals + Bayesian)ChiRho / PyCIEMSS (2023–2026) already industrialized it — with a probabilistic programming backend to boot
”DAGs can’t express cycles/feedback”Cyclic causality is a mature subfield: SDCM, DSCM, cyclic SCM, SCOUT, RECLAIM… all 2022–2026 work
Embedding theorem: SCM is the τ→0 limit of ODEsMooij, Janzing & Schölkopf (2013) used exactly dx/dt=(f(x)−x)/τ — behind it, 60 years of Tikhonov/GSPT singular perturbation theory
Continuous-time do-operationHansen & Sokol (2014) already did it
S-identifiability diagnosticsStructuralIdentifiability.jl, SIAN, StrikePy, PyCC.id — a red ocean
Causality + differential geometryInfinitesimal Causality (Mahadevan 2026), Causal Schrödinger Bridges, Geometric Causal Models… 2026 is already crowded
Only comparing against PC / LiNGAMThose are 20-year-old methods. SOTA is CADYT (AAAI 2026 best paper), SCOUT, RECLAIM

The most painful one was CADYT: it does continuous-time causal discovery, achieving AUPRC 0.79 on a double-spring system versus 0.39 for the runner-up, won the AAAI 2026 best paper — and its theoretical foundation is DSCM, which I never cited at all.

To avoid just listing names, I found the “already existing and deeper” version of every brick I had moved:

My white paper’s references ended at Pearl (2009) and Friston (2003). Bongers, Mooij, Boeken, CADYT — not one of them. Any reviewer would kill it with a single glance at that list.

3.2 I Wasn’t Pioneering; I Was Jogging to Catch a Field That’s Sprinting

The feeling was very concrete — not “the direction was wrong,” but:

What you want to build, the group next door has already finished — with reproducible code and a top-conference paper.

When a field’s progress outpaces the speed at which you write your white paper, the window has basically closed. That’s what it means to have missed it.


Act Four: An Honest Dissection — What Was Genuinely Scooped vs. What I Inflated

After the emotions settled, I forced myself to do something harder: not blanket self-rejection, but item-by-item separation of “real duplication” from “my own exaggeration.” Because dismissing everything wholesale and being blindly optimistic are the same kind of sloppiness.

4.1 Three Things I Did Exaggerate

“DAGs can’t express cycles” — exaggerated. The correct statement is only: acyclic DAGs can’t; but the causality field moved past “cycles are the exception” long ago into “cycles are the norm; the question is how to handle them.” Feedback isn’t a frontier; it’s a solved special case.

“DBNs can’t express feedback” — inaccurate. DBNs have 15+ years of history with feedback systems. The true, weaker conclusion is: when Euler-discretizing stiff systems with a fixed step size, the error grows with the stiffness ratio — that’s numerical analysis common sense (Euler stability conditions), not a new impossibility theorem. My “DBN expressivity gap proposition” must be weakened to exactly this extent to hold.

“CDS is an original framework” — 80%+ overlap. cds_framework.py is essentially a wrapper around scipy.integrate.odeint, about 200 lines — a tool implementation, not a research contribution. I can’t fool myself on this one.

4.2 But a Few Points Where My Initial Blanket Dismissal Was Wrong

An honest retrospective has to concede both directions. Digging deeper, a few points turned out to be not so easily replaced:

To see exactly how much overlap there was, I made a dimension-by-dimension comparison:

DimensionMy CDSDSCM (Boeken-Mooij 2024)Verdict
Basic objectDeterministic ODE trajectoriesStochastic processes in function spaceDSCM more general (mine is its noiseless special case)
StochasticityNone (fatal flaw)Built-in SDEsDSCM wins
Markov propertiesNoneσ-separationDSCM wins
Causal effect identificationManual calculationStandard ID algorithmsDSCM wins
Parameter-space geometryExplicit foliation modelingNot emphasizedCDS has a unique perspective
Intervention-driven identifiabilityS-identifiability (preliminary)Not emphasizedCDS has a unique perspective

This table speaks plainly: of six dimensions, I lose four outright and have something in two. And about those two “something” cells — don’t celebrate yet. Read on.

4.3 The Only Remaining Gap, and Its Fatal Premise

So the project’s genuinely remaining value is one narrow crack:

“Parameter space θ → steady-state manifold SS(θ) → foliation → tangent-space causal effect metrics + intervention-driven S-identifiability” — this geometric perspective is indeed absent from the literature.

But — it is currently a “translation,” not a “theorem.” It restates “changing parameters changes steady states” in differential-geometry language, without deriving anything that SDCM/DSCM can’t. To promote it from “pedagogical fresh perspective” to “research contribution,” I would need to prove at least one non-trivial result, for example:

Without such a proof, it only deserves one section of a survey; it cannot be published in a main conference. That is the cruel but clear criterion.


Act Five: The Lessons (This Is the Part I Actually Want to Leave Behind)

If this article deserves to be remembered for one thing, I hope it’s the following. Their price was a month-plus and thirty-some scripts.

Lesson One: Do the literature review before building. Even half a day is enough.

I had the order backwards: built for over a month, searched literature only at the end. If I had searched “causal dynamical systems” and “ODE structural causal model” on day one, I’d have hit Mooij 2013 and SDCM within 30 minutes, and the whole project’s positioning would have been completely different. Online search is not the finishing move; it’s the first process before starting work. Concretely: before writing any code, search what you want to do with 3–5 different keyword combinations (in English!), then check Google Scholar for surveys from the last three years, then look at the accepted-papers lists of the latest top conferences. That one hour can save you a month.

Lesson Two: Strictly distinguish “tool implementation,” “concept demonstration,” and “research contribution.”

I produced a lot of the first two categories while believing I was doing the third. The thirty floors were solidly built, but the foundation was demonstration, not discovery. Lines of code, test coverage, and number of figures cannot answer “which line in here is new knowledge.” Here’s a simple self-check: show your work to a domain expert — can they point to a single sentence and say “I didn’t know this before”? If not, you’re still in the first two categories.

Lesson Three: When a field runs faster than you can write your white paper, you’re chasing, not pioneering.

CADYT winning best paper, SCOUT/RECLAIM clustering in 2026 — these signals were themselves telling me: this is a sprinting hot track, not a no-man’s-land. On a hot track, “I independently thought of a framework” almost certainly means “three groups have already gone deeper than me.” To find a genuine gap, either go to a colder intersection, or accept that you’re doing incremental work — incremental isn’t shameful; mistaking incremental for revolutionary is.

Lesson Four: The ability to self-falsify is rarer than the ability to build.

I don’t regret building this. Going from a thyroid intuition all the way to category theory and information geometry means the building ability is fine. But the project’s real turning point was my willingness to stop and ask “is this a reinvention of the wheel” — and to admit it item by item. Being able to build, and being able to calmly tear down what you built — those two together are what research taste is. What most people lack isn’t hands that can generate figures, but the heart to overturn their own proud creation.

Lesson Five: Don’t keep investing just because you’ve already invested a lot.

Sunk cost is the most expensive pit. When you discover the foundation is broken on floor thirty, the hardest decision isn’t “how to fix it” — it’s “when to stop.” Continuing to pile on code has negative returns; honestly converging existing work into one article has positive returns. This retrospective is my stop-loss move. When deciding whether to continue, don’t ask “how much have I already spent” — ask only “if I invest one more week from today, is the return positive or negative.”


Epilogue: This Isn’t Failure — It’s High-Quality Self-Training

Taking inventory of what I actually got:

As for that geometric crack — I’ve organized it into a few open questions and left them there. Maybe someday I’ll think through the strict relation between S-identifiability and structural identifiability and come back to prove it; maybe not. But at least now, I won’t pretend it’s a revolution.

One sentence for my future self (and for whoever reads this):

Reinventing the wheel is not shameful. Not checking whether a wheel exists is. And being able to take your own wheel apart and tell people why it was redundant — that may be the only genuinely original part of the entire project.


Note: all code, the white paper, experiment figures, and literature comparisons involved in this article are in the project repository. All data are real run results, not beautified.