Vibe to learn, spec to keep
The other examples start where you already know what you're building. This one starts where you don't — and the honest move is to build something throwaway to find out. spectastic.explore is the verb for that moment: it quarantines a loose build, keeps the lifecycle from shipping it by accident, and offers exactly two exits — graduate or delete.
The intent was one line: find the shortest path between two nodes in a small weighted graph. But “shortest” is ambiguous the moment edges carry weight — does it mean the fewest hops or the least total weight? They're the same on an unweighted graph and can diverge sharply on a weighted one, and which one it is decides the algorithm. Rather than argue, this exploration builds both — BFS and Dijkstra — and runs them head-to-head to find out. The answer, grounded in a run, is what graduates into a spec.
The exploration
explore sits upstream of the eight core verbs — the on-ramp before spec. The ceremony is deliberately off (no requirement IDs, no INVEST), and a thin principles floor (P-1, P-2) stays on. You build to learn.
Scaffold the quarantine
spectastic explore "…" resolves a NNN-kebab id and writes two files under explorations/<id>/: a rich explore.html ledger (git-ignored — it's throwaway) and a small tracked quarantine.json marker. That marker is the anti-ship flag teammates and CI can see.
Build loosely — two approaches
Inside the quarantine, two single-file swings: bfs.ts (my gut — “shortest = fewest steps”, weight-blind) and dijkstra.ts (least weight). A probe.ts runs both on one graph — bare Node, no toolchain, no tests yet. This is the part the lifecycle usually forbids, done on purpose in a walled garden.
Discover the answer
The probe settles it. On the sample graph, shortest A→E: BFS returns A→C→E (2 hops, cost 25) while Dijkstra returns A→B→C→D→E (cost 6). They disagree by 19 — so “shortest” means least weight. Verdict: keep Dijkstra. See it below.
Graduate or delete — never ship as-is
An exploration has no path to a shippable state. You either graduate it (extract a spec + design from the build, restore the gates) or delete the directory. There is no “abandoned-but-lingering” state, and — until you pick — the guard holds the line.
The anti-ship guard
This is the mechanism that makes explore safe to hand a team. A quarantined exploration turns spectastic validate red — no matter what you point it at — and every core verb refuses to advance the id. You cannot ship a vibe by accident; CI goes red by design.
Two legs, both real: validate scans every quarantine.json on every run; the verb state-gate refuses each of the core verbs. The rich ledger stays local; the tiny marker is what teammates and CI actually see.
Graduate or delete
When you know the answer, you classify what the spike was — and that choice decides how it leaves the quarantine. This is the single most under-explained idea in the whole system, and a shortest-path toy is small enough to show both branches.
The prototype taught you something, but the code isn't worth keeping. Graduation extracts a Draft spec; restore then emits a clean-rebuild task list — test-first, from zero — plus an explicit task to delete the archived prototype (never auto-run).
Here, the discarded bfs.ts was the spike-shaped arm — wrong for the job.
The prototype was sound. Graduation extracts a Draft spec + design from the build, seeding the design's evidence ledger with the run's verified facts. Restore emits a refactor-to-comply list: move the kept code into place, back-fill tests, restore the gates.
This example took the tracer-bullet path — Dijkstra was kept.
Play · read · trust
The payoff, three ways. Play the discovery in your browser — watch BFS and Dijkstra disagree; read the kept build; trust the tests that graduation demanded.
The same weighted graph the spike used. Pick an algorithm, then click any node to set the destination (start is A). Watch where fewest-hops and least-weight take different routes — and cost you differently.
A browser re-creation of the spike's probe.ts, for illustration. The real thing is dijkstraPath — proven by the tests below, not by this widget.
A spike has one throwaway assertion. The tracer-bullet's restore made it earn a real suite — the probe's fact, pinned to the spec's criteria.
The discarded BFS survives only as a test witness — the NFR-001 case computes the hop path and asserts it costs strictly more than Dijkstra's, so the criterion can't quietly pass on a graph where the two happen to agree.
The artifacts
The graduated Draft bundle — a spec · design · tasks triple — plus the frozen exploration record it came from. Every artifact passes spectastic validate at the standard profile, and the archived spike still runs.
These are the real, rendered artifacts — the same files spectastic validate checks; the excerpts above are drawn from them verbatim.