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:
- Is causality a weighted logical chain? No. Logic is truth-preserving (adding premises doesn’t overturn conclusions); causality is reversible (add one confounder and the direction flips entirely — that’s Simpson’s paradox).
- Is causality like a Markov chain? Superficially — only in the “has direction, has transitions” skin. Markov chains have no intervention semantics; you can’t ask one “if I forcibly change today, what happens tomorrow.”
- Is the essence of causality logic? No. Causality is the study of “how the world’s mechanisms remain invariant under intervention”; logic is just its notation tool.
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:
- 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).
- 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.
- 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.
- 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”:
- Causality = invariance under intervention (Woodward, 2003): “X causes Y” iff certain interventions on X (all else held fixed) change Y. This stability is metaphysical, not logical.
- Causality = counterfactual dependence (Lewis, 1973): “If c hadn’t happened, e wouldn’t have happened either.” This is modal realism (possible-world semantics), but stronger than logical modality — it requires the counterfactual world’s physical mechanisms to match the real world.
- Causality = transfer of information/energy (Collingwood and information-theoretic causality): “X causes Y” iff X transmits a perturbation to Y, and this transmission remains stable under intervention. Causality is a physical process, not logical derivation.
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:
- The system oscillates and converges from any initial state to the steady state
TRH*=0.78, TSH*=0.59, T3*=0.78; - Injecting exogenous TSH at t=50, T3 responds with a delay of ~3.7 time units;
- Phase space shows a spiral trajectory converging to an attractor;
- Turning the feedback strength α from 0.5 to 5.0 drops steady-state T3* from 1.24 to 0.54.
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:
| Method | Estimate | Bias |
|---|---|---|
| Observational regression P(Y|X) | 1.056 | inflated 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:
- I defined the CDS (Causal Dynamical System) 7-tuple
(X, f, θ, O, T, I, H), trying to move causality from “graph theory” to “dynamical systems” — X is the state space, f the dynamics equations, θ the causal parameters, O the observation model, T the time-scale spectrum, I the intervention space, H the invariance assumptions; - Defined a continuous-time do-operation:
dxᵢ/dt = fᵢ(x,θ) + δ(t−t₀)(x_target − xᵢ(t₀))— at the intervention instant the state is forcibly jumped, then evolves under the original mechanism; - Proposed causal foliation: view the steady-state manifolds indexed by parameters θ as layers of “leaves”; interventions are switches between leaves; causal effects are distances between leaves;
- Defined S-identifiability: some intervention exists that can distinguish different parameter values (roughly, tangent vector
∂SS/∂θᵢ ≠ 0); - Even wrote an embedding theorem: claiming Pearl’s SCM is a limiting special case of CDS as time constant τ→0.
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:
- Tracks one through four: completing experiment code, adding unit tests, running Granger causality, reproducing DSEM-style models, writing DCM survey notes;
- Extended baselines: implementing NOTEARS myself, adding GES, FCI, VAR-LiNGAM, with quantitative SHD/F1 comparisons;
- Track five (causality × control): PID control vs. biological negative feedback, optimal intervention design, sensitivity-identifiability duality;
- Track six (CDS deepening): 3D foliation visualization, numerical validation of the embedding theorem, the DBN expressivity gap, Lotka-Volterra nonlinear CDS;
- Four-layer theoretical formalization: ε-δ proofs, category theory (defining categories and functors), the tangent-space condition theorem, causal Fisher information.
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 original | Reality 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 ODEs | Mooij, Janzing & Schölkopf (2013) used exactly dx/dt=(f(x)−x)/τ — behind it, 60 years of Tikhonov/GSPT singular perturbation theory |
| Continuous-time do-operation | Hansen & Sokol (2014) already did it |
| S-identifiability diagnostics | StructuralIdentifiability.jl, SIAN, StrikePy, PyCC.id — a red ocean |
| Causality + differential geometry | Infinitesimal Causality (Mahadevan 2026), Causal Schrödinger Bridges, Geometric Causal Models… 2026 is already crowded |
| Only comparing against PC / LiNGAM | Those 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:
- ChiRho / PyCIEMSS (2023–2026): a probabilistic-programming-based causal inference library — do-operations on ODEs (impulse/step/parameter), counterfactual reasoning, Bayesian parameter inference, hierarchical models, uncertain interventions — all done. My CDS 7-tuple is essentially a simplified ChiRho, minus the probabilistic programming backend, plus foliation visualization.
- Mooij, Janzing & Schölkopf (2013), “From ODEs to SCMs”: their construction is exactly
dxᵢ/dt = (1/τᵢ)(fᵢ(x) − xᵢ), proving ODE equilibria → SCM. My embedding theorem ran the opposite direction (SCM → CDS as a τ→0 limit), but the mathematical core is nearly identical. And behind it lies Tikhonov → Fenichel → modern GSPT singular perturbation theory — 60 years of handling “slow-fast system limits.” - Bongers, Blom & Mooij (2022), SDCM: upgrades each variable from a random “value” to a random “process”; structural equations become stochastic differential equations of arbitrary order; with existence/uniqueness of solutions, Markov properties, and an equilibration operation SDCM → SCM. SCM is only its zeroth-order special case.
- Boeken & Mooij (2024), DSCM: endogenous variables are directly càdlàg functions of time; SCM lives in function space, constructed from SDEs via the Itô map; with σ-separation Markov properties, time-splitting, subsampling, and causal effect identification using standard ID algorithms.
- A whole field of cyclic causality: SCOUT (nonlinear cycles + unknown intervention targets), RECLAIM (cycles + measurement noise), glvLiNGAM, cyclic counterfactuals — all 2026.
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:
- CDS ≠ SDCM. In SDCM, each variable is a stochastic process and the focus is the Markov properties of the process; my CDS focuses on the geometry of “parameter space × state space” and how parameters θ index steady-state leaves. Different mathematical objects, different questions.
- S-identifiability ≠ classical structural identifiability. The classical question asks “given input-output data, can parameters be uniquely determined” (observation level); mine asks “does there exist an intervention that distinguishes different parameter values” (intervention design level), which naturally connects to optimal experimental design.
- Parameter space as a first-class citizen + foliation of steady-state manifolds — this geometric perspective genuinely doesn’t appear in SDCM/DSCM.
To see exactly how much overlap there was, I made a dimension-by-dimension comparison:
| Dimension | My CDS | DSCM (Boeken-Mooij 2024) | Verdict |
|---|---|---|---|
| Basic object | Deterministic ODE trajectories | Stochastic processes in function space | DSCM more general (mine is its noiseless special case) |
| Stochasticity | None (fatal flaw) | Built-in SDEs | DSCM wins |
| Markov properties | None | σ-separation | DSCM wins |
| Causal effect identification | Manual calculation | Standard ID algorithms | DSCM wins |
| Parameter-space geometry | Explicit foliation modeling | Not emphasized | CDS has a unique perspective |
| Intervention-driven identifiability | S-identifiability (preliminary) | Not emphasized | CDS 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:
- Prove that S-identifiability is a strict refinement of classical structural identifiability, and give a concrete counterexample system that is “S-identifiable but not structurally identifiable”;
- Or prove that the geometry of the foliation provides usable signal for structure learning, and compare against CADYT/SCOUT — not PC/LiNGAM.
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.”
- Wrapping
odeintin a class = tool implementation; - Using an ODE to demonstrate “a DAG can’t draw negative feedback” = concept demonstration;
- Proving a theorem no one else derived = 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:
- A walk from Pearl’s DAG through SDCM, DSCM, DCM, DSEM, singular perturbation, and geometric causality — this map is now genuinely familiar to me, not memorized;
- A set of dynamic-causal experiment code that, while “not original,” runs, is all-green, and is reproducible;
- An honest related-work comparison analysis written by myself;
- And the five lessons above — bought with a month-plus, with a good chance of changing how I do my next project.
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.