Interrogate authority before planning a feature, refactor, migration, rewrite, backfill, event-sourcing design, dual-write setup, new authoritative store, or system-of-record change. Fire whenever a proposal might introduce, move, duplicate, or replace authoritative state — or involves event sourcing or "event sourced," a "source of truth," "authoritative" data, dual-writes, replay, projections, replacing persistence, a new data store, or "design the architecture for / rewrite X" — and classi...
Installs into .claude/skills of the current project.
Are you the author of Spike 360?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/hiqs-labs-spike-360)
---
name: spike-360
description: >
Interrogate authority before planning a feature, refactor, migration, rewrite,
backfill, event-sourcing design, dual-write setup, new authoritative store, or
system-of-record change. Fire whenever a proposal might introduce, move,
duplicate, or replace authoritative state — or involves event sourcing or
"event sourced," a "source of truth," "authoritative" data, dual-writes,
replay, projections, replacing persistence, a new data store, or "design the
architecture for / rewrite X" — and classify authority before writing any plan
or reaching for a seam or architecture spike. The five levels: audit-only, read
projection, dual-written peer, source of truth, replacement runtime; for
audit-only or read-projection cases, fire just long enough to classify and
stop, and for dual-written peer and above, require the surface and
failure-scenario checks first. Triggering is deliberately broad — the skill
classifies first and stops fast when the level is light. Skip only for a
localized bugfix with no authority change, or when the authority level is
already classified, agreed, and its required surface and failure-scenario pass
is already complete.
---
# Spike 360
Interrogate the premise before you design the architecture.
The failure this prevents: a plan jumps straight to "event-sourced core" and only discovers, three phases in, that "source of truth" changes the entire problem class — new invariants, new failure modes, a migration nobody scoped. The fix is to change the first move from *design the architecture* to *interrogate the premise*.
## Core idea
Before writing any plan, decide **what authority the new system will hold**. That classification — not the design — sets the problem class. Most proposals that sound like "a new system of record" are actually solved by a smaller, lower-authority mechanism — often just a ledger — that the existing source of truth never has to defer to. Find that out first, on purpose, before a single phase or schema is drawn.
## Hard rule
> Classify the authority level before you write any migration plan — and at dual-written peer or above, audit the current read / write / side-effect surfaces before writing it too.
If you catch yourself sketching phases, schemas, or an "event-sourced core" before Gate 2 is answered, stop and answer Gate 2.
## The five gates (in order)
**Gate 1 — Problem narrowing.** What user or business problem actually triggered this? What is the smallest change that solves *only* that? What would be overbuilding?
**Gate 2 — Authority classification (the pivot).** What authority does the new system hold?
- **Audit-only** — it observes; nothing reads it back as truth.
- **Read projection** — a derived view; the old store stays authoritative.
- **Dual-written peer** — written alongside the old store; both claim truth.
- **Source of truth** — other systems now defer to it.
- **Replacement runtime** — it *becomes* the system; the old one is retired.
This ladder is also a reversibility ladder: audit-only and read projection are Easy to undo; dual-written peer, source of truth, and replacement runtime run Costly to One-way door once two systems claim truth or readers depend on the new one. **Those three trigger the heavy checklist (Gates 3-4)** — and a far larger scope than the proposal usually admits. Dual-written peer is in that tier on purpose: two writers means divergence, ordering, and reconciliation risk from day one — one of the most failure-prone designs this skill exists to catch.
**Gate 3 — Current-state audit** (dual-written peer and up). Enumerate, concretely:
- every **reader** and every **writer** of the state being changed
- every **persisted field** and every **external side effect** (emails, webhooks, payments)
- **transient vs resting** state — what is mid-flight vs settled
- **startup / load / backfill** behavior — how state is reconstituted from cold
**Gate 4 — Failure-scenario pass** (dual-written peer and up). For each, does the design survive it?
- crash *before* the write
- crash *after* the write, before the downstream mutation
- crash *after* an external side effect, before the write
- concurrent handlers interleaving across an `await`, async boundary, transaction gap, or retry boundary
- replay from an empty / brand-new log
- replay from a partial or corrupt tail
- legacy import with missing fields
- (dual-written peer) the two stores disagree — which one wins, and when is the divergence detected and reconciled?
**Gate 5 — Stop / Go.**
- If a smaller, lower-authority mechanism solves the Gate 1 problem, **recommend that first** — name it (a ledger, projection, cache, report table, reconciliation view, or no new store at all).
- For a **dual-written peer**, do not approve the path unless the design names the winner rule, drift detection, reconciliation process, ordering key, idempotency boundary, and rollback plan.
- If **source of truth** or replacement runtime is still genuinely wanted, **require explicit approval** and list the new invariants it must guarantee from this day forward.
## Output format
Lead with the authority level — it is the line that must survive skimming, because it decides everything after it. Then add only the gates that change the call. A light classification is a few lines; the heavy checklist (Surfaces / Failure scenarios) appears *only* at dual-written peer and up. Never pad.
**Authority level:** [Audit-only / Read projection / Dual-written peer / Source of truth / Replacement runtime] — [one line: what that means for scope and reversibility].
**Real problem:** [the triggering problem, one sentence] → **Smallest fix:** [the narrowest change that solves only that].
**Overbuild:** [what the current proposal adds beyond the smallest fix — or "none, the proposal is already minimal."]
*Dual-written peer and up only — otherwise omit both blocks:*
**Surfaces at risk:** [the readers / writers / persisted fields / side effects / transient-vs-resting / startup-load-backfill that actually bite — not all of them.]
**Failure scenarios:** [only the ones the design does not yet survive, each with the gap in a phrase. If it survives every applicable scenario, say so.]
**Stop / Go:** [Smallest safe mechanism first, named — ledger, projection, cache, report table, or no new store — or: authority shift approved, with the new invariants listed.]
## How this differs from its siblings
- **take-a-step-back** is the general pre-commit reset ("am I solving the right problem?"). spike-360 is its architecture-specific form: it forces a concrete authority classification and, above a threshold, a failure-scenario pass.
- **blast-radius** sizes a path you have *already chosen*. spike-360 fires earlier and questions whether the path's authority level is even the right one — its verdict can feed straight into blast-radius.
- **recon** — the read-only trace of the current system. spike-360 classifies authority *first*; once the level is settled, recon maps the readers, writers, and contracts the approved shape has to live with, and the plan is written against that map. A light audit-only or read-projection verdict stops spike-360 early but does not excuse the trace: recon still runs if the remaining implementation plan meets its trigger. Gate 3's surfaces pass is the classification-sized sample of that audit, not a replacement for it.
- **phase-0-spike** (an external workflow in `~/.claude/workflows/`, not a skill in this repo) maps seams, contract owners, and rollout invariants *after* you have committed to the refactor — it already assumes a source of truth exists (it asks each analyzer for the "contract owner"). spike-360 runs upstream and decides whether a new source of truth should exist *at all*. Run spike-360 first; only a "source of truth — approved" verdict makes phase-0-spike's seam-mapping worth doing.
## When not to escalate
If Gate 2 lands on audit-only or a read projection that the smallest-fix gate already satisfies, **stop there** — dual-written peer and above do not qualify, since a second writer or a new system of record already carries the heavy invariants. Classify it, say "a ledger or projection is enough — ship it," and skip Gates 3-4 entirely. Running the full crash-replay failure pass on an append-only log nothing reads back is exactly the manufactured gravity this suite warns against. The heavy checklist is *earned* by the authority level, not applied by default.
## Example 1 — source-of-truth creep, caught early
Input: "Let's make the orders subsystem event-sourced so we have a full history and a single source of truth for order state."
Output:
> *Before any event-sourcing design — one classification decides the whole scope here.*
>
> **Authority level:** Source of truth, edging toward replacement runtime — every reader of order state would now defer to the event log, not the orders table. One-way door once they do.
>
> **Real problem:** "We can't tell why an order's status changed." → **Smallest fix:** an append-only `order_events` ledger written beside the existing table for history and audit; the table stays authoritative.
>
> **Overbuild:** Event-sourcing makes the log the source of truth, which drags in replay, projections, and a migration of every reader — none of which the "why did status change?" problem requires.
>
> **Surfaces at risk (if you proceed to source of truth):** every order reader (API, fulfillment, billing), the `status` / `total` persisted fields, the payment-capture side effect, and order-load on startup.
>
> **Failure scenarios not yet survived:** crash after payment capture before the event writes (double-charge on replay); replay from a partial tail (orders resurrect in a stale status).
>
> **Stop / Go:** Ledger first — it solves the stated problem with no new invariants. If a true source-of-truth event log is still wanted, that is a separate, explicitly approved decision that must guarantee idempotent, deduplicated side effects (don't rely on exactly-once external effects — design for at-least-once delivery plus idempotency), deterministic replay, and a backfill for every legacy order. Get that approval *before* any plan is written.
## Example 2 — correctly not escalated
Input: "I want to log every admin permission change to a new table so we have an audit trail."
Output:
> **Authority level:** Audit-only — nothing reads the table back as truth; permissions still live where they live. Easy to undo.
>
> **Real problem:** "We have no record of who changed permissions." → **Smallest fix:** an append-only `permission_audit` row written in the same transaction as the change. That *is* the whole job.
>
> **Overbuild:** none — keep it append-only and resist adding reads against it later. The moment something defers to it for current permission state, re-run this check.
>
> No current-state audit or failure-scenario pass needed: an audit log no one reads back does not carry source-of-truth invariants.
## What success looks like
The operator learns the authority level — and therefore the true scope — in the first line, before a single phase or schema is drawn. A proposal that was about to become an event-sourced rewrite gets resized to a ledger; or, if the larger change is genuinely wanted, it walks in with its new invariants named and approved instead of discovered in phase three.