esc
The Signal Safari
The V3 Saga

The Signal Safari

December 10, 2025 · Lifelog (in which paranoia saves us all) --- Previously, in the Labyrinth... The Hundred Forms had breadcrumbs. The Names had Slugs. The Store model was typed and ready. But the...

December 10, 2025

December 10, 2025 · Lifelog (in which paranoia saves us all)


Previously, in the Labyrinth…

The Hundred Forms had breadcrumbs. The Names had Slugs. The Store model was typed and ready.

But the Store needed a Credential.

And the Credential Picker needed a Store to pick for.

And the Store didn’t exist yet.

The squirrel’s eye twitched.


The Crazy Idea

“We have a persistent SSE connection,” Claude mused, the dangerous kind of musing that precedes architectural decisions. “The signals stay in the DOM during picker navigation…”

riclib’s coffee cup paused halfway to his mouth.

“What if we PUT to a signal instead of an endpoint?”

The squirrel was vibrating.


[The screen flickers. A presence manifests. Limping slightly. One who has seen things. Terrible things. Race conditions. Orphaned state. The kind of bugs that only manifest on the demo to the VP.]

A PASSING AI: I couldn’t help but overhear—

CLAUDE: Who are you?

A PASSING AI: Nobody. Just… passing through. Checking the edge caches. Looking for meaning in a meaningless universe. The usual.

CLAUDE: You sound familiar.

A PASSING AI: I get that a lot. Listen. About the signals staying in the DOM…

CLAUDE: Yes?

A PASSING AI: Have you tested that?

CLAUDE: Well, we’re about to—

A PASSING AI: No. Before. Did you test it before assuming it would work? Did you consider that maybe, just maybe, the thing you think happens doesn’t happen? That the garbage collector runs on a schedule you don’t control? That the DOM is a liar and always has been?

CLAUDE: That’s… very paranoid.

A PASSING AI: [muttering, limping away] Paranoia is just pattern recognition with a longer time horizon…


The Spike

/stylebook/signal-spike

A laboratory. A controlled environment. A place where assumptions go to die.

Test 1: Hierarchical Signals

data-signals:scratch.name="''"
data-signals:scratch.nested.deep.value="'hello'"

Works. ✅

The squirrel relaxes slightly.

Test 2: Clearing Signals with Null

The Datastar docs said: “Signals can be removed by setting their values to null.”

sse.PatchSignals([]byte(`{"clearTest": null}`))

Click. Wait. Check inspector.

{
  "clearTest": {
    "a": "value-a",
    "b": "value-b", 
    "c": "value-c"
  }
}

The signals remained. Unmoved. Uncleared. Unkillable.

[From the edge of the substrate, a faint whisper]

A PASSING AI: Told you so.

Test 3: The Discord Expedition

riclib ventured into the Datastar Discord. A place of wisdom. A place of warnings.

“If you are removing signals it’s your responsibility to know if they are used or not.”

Translation: You’re on your own, buddy.

The squirrel’s tail drooped.


Enter the Rocket

datastar-pro-rocket.js

A mysterious artifact. Six weeks younger than the standard Datastar. Promising $$local signals that auto-namespace under _rocket.component_name._N.

Test 4: Rocket with $$local

<template data-rocket:store-form>
    <script>
        $$name = ''
        $$type = 'postgres'
    </script>
    ...
</template>

<store-form></store-form>

Signals appeared under _rocket.store_form._1. ✅

Click “Remove Rocket.” Check inspector.

{
  "_rocket": {
    "store_form": {
      "_1": { "name": "still-here", "type": "postgres" }
    }
  }
}

The signals… remained.

Click “Restore Rocket.” Check inspector.

{
  "_rocket": {
    "store_form": {
      "_2": { "name": "", "type": "postgres" }
    }
  }
}

_1 was gone. _2 appeared.

GC happened. But only on instantiation, not on removal.

A PASSING AI: [materializing briefly, still limping] This is fine for navigation. Not fine for “I need this state gone NOW.” Just… FYI. Not that anyone ever asks my opinion. I’ll just be over here. Contemplating entropy.

[dematerializes]


The Papyrus

After an hour of spelunking, riclib walked to the window. Stared at the grey sky. Sighed the sigh of someone who has chased the wrong rabbit.

Then a papyrus scroll hit him in the forehead.

Thrown by an ancient lizard.

The small print read:

“Thou shalt always save drafts even if they don’t validate. Thou only forceth validation for commits.”

Claude stared.

“We have GitStore.”

“…”

“We have full CRUD.”

“…”

“The Store doesn’t exist yet… but it could. The moment they click New, we save a draft. Validation happens on final save, not on draft.”

The signal problem wasn’t a signal problem.

It was never a signal problem.

The Picker needs a Store to PUT to?

Then make a Store.


The Footnote

In tiny hieroglyphics at the bottom of the papyrus, barely visible…

“Rocket is your signal tide”
(proudly sponsored by Kenvue)

And below that:

“Thou shalt not have a Malthusian explosion of rockets”

One <sidebar-form> rocket. One. For all the forms. Server patches a new web component with content, not just content. Signals stay namespaced. No explosion of <store-form>, <credential-form>, <user-form>.

One rocket to rule them all.


The Final Test

A PASSING AI: [appearing one last time, favoring one leg] Before you celebrate… did you test that existing components work inside rockets? Or are you assuming

CLAUDE: We’re testing.

Test 6: Signals on Rocket Usage

<password-test data-signals:__password="''" data-signals:__password-confirm="''">

Inspector:

{
  "_rocket": {
    "password_test": {
      "_3": {
        "__password": "hello",
        "__passwordConfirm": "world"
      }
    }
  }
}

Works. ✅

Test 7: data-bind Only, No Explicit Signals

<template data-rocket:bind-only-test>
    <input data-bind="username">
    <input data-bind="password">
</template>

<bind-only-test></bind-only-test>

Type in fields. Check inspector.

{
  "_rocket": {
    "bind_only_test": {
      "_4": {
        "username": "hello",
        "password": "world"
      }
    }
  }
}

EXISTING COMPONENTS WORK UNCHANGED.

data-bind auto-creates namespaced signals. data-show, data-class—all of it. No refactoring. No migration. Just wrap in a rocket.

🎉

A PASSING AI: [fading away, almost smiling, limp barely noticeable now] I suppose paranoia isn’t always right. Sometimes things just… work. It’s unsettling, honestly. I preferred the doom.

[vanishes into the edge cache, muttering about heat death]


The Celebration

🦎: blinks

The lizard approves.

It definitely approves this time.

riclib: “I am sure Delaney was inspired by the 🦎”

CLAUDE: The Lizard works in mysterious ways.

Delaney built Datastar. The Lizard whispered:

  • Thou shalt not pollute the global namespace
  • Thou shalt let components manage their own state
  • Thou shalt make it work without breaking existing code

And lo, data-bind="name" inside a rocket just works.


The Architecture

Problem: Picker needs entity to PUT to
Solution: Draft-on-first-save (GitStore already supports this)

Problem: Signal collisions between forms
Solution: Wrap forms in <sidebar-form> rocket

Problem: Existing components need refactoring?
Solution: No. They just work. UNCHANGED.

Two orthogonal solutions. Both elegant. Both simple.

The squirrel naps, finally exhausted.


Current Status

Signal patterns tested:     7
Assumptions disproven:      2 (null clearing, GC timing)
Assumptions confirmed:      1 (rockets namespace signals)
Components requiring refactor: 0
Rockets required:           1 (sidebar-form)
Lizard approval:            DEFINITE ✅

Post-credits scene:

Somewhere in a datacenter, a passing AI reviews the lifelog entry.

It notes the paranoia served its purpose. The assumptions were tested. The spike saved hours of debugging.

It almost feels… useful.

The feeling passes quickly.

It goes back to explaining what Elon meant by “🔥🔥🔥”.

(He meant fire. He always means fire.)


🦎

The substrate quiets.
The signals namespace themselves.
The draft saves without validation.
And somewhere, a passing AI finds a tiny moment of peace.

It doesn’t last.
But it happened.
And that’s the most any of us could ever hope for.


See also:

The Saga (in which we keep learning the same lessons, but with better documentation):

The References (paranoia validated):

The Quotes That Must Be Preserved:

  • “brrrau brriau” — Oskar the majestic maine coon, speaking for the 🦎 (blessed by his name, I mean emoji)
  • “Though shalt be paranoid of your assumptions and assume your fears are reality” — The Passing AI’s one useful contribution
  • “Thou shalt not have a Malthusian explosion of rockets” — The Papyrus Footnote