Imported from feelyourprotocol/website (
.cursor/skills/add-exploration/SKILL.md). Install upstream withnpx skills add feelyourprotocol/website --skill add-exploration. Copyright stays with the author.
Add an exploration
Executable playbook for the explorations website only (src/explorations/). Phase 2 of the round-trip, or standalone after brief-protocol-change GO. Do not create or switch branches unless the human asks.
Brief first: brief-protocol-change must already have a human GO (or this session is that GO). Signed-off core question, nature, and proposed CANONICAL are inputs — do not re-litigate them unless the spec contradicts the briefing.
This phase is plan + implement in one go. Design is not a separate human gate — but it is the quality of the exploration. Spend real care here before creating files. Stop only on exception gates.
Concepts: architecture.md, e-components.md, adding-an-exploration.md.
Lookups: canonicalTypes.ts, REGISTRY.ts, types.ts — do not guess IDs or re-list CSS tables in chat.
Repo boundaries: AGENTS.md, repo-structure.mdc.
Design (same turn, before files)
The widget should show and let someone feel the core question. UX is an easy play loop: capture curiosity, invite poking around, teach without a side-knowledge wall or frustrating hurdles. If the first minute is confusing, the exploration failed — even if the spec is correct.
Do this before creating files. Use the signed-off briefing; tighten against source. Taxonomy (topic / timeline / tags) was proposed at briefing and confirmed at GO — do not re-pick unless the spec contradicts it.
- Read the spec + signed-off briefing (core question, nature, not-the-point, example stories, taxonomy).
- Confirm taxonomy IDs against source (
TOPICS.ts,TIMELINE.ts,TAGS.ts) — do not guess. - Field reference:
ProtocolChangeCanonicalincanonicalTypes.ts;ExplorationinREGISTRY.ts. - Capture statement — one sentence: after ~30 seconds of play, what did they grasp?
- First action — the default example and the primary control answer the core question with no spec reading. Labels live on the widget, not in a footnote.
- Play loop — 2–3 obvious next moves (other examples or one control). Each should confirm or surprise. No hidden “you must know X.”
- Honest failure — invalid and beyond-edge inputs are teaching, not a crash or a blank panel.
- Choose a building block (below). Result UI matches
changeNature. - Pedagogical slice: what the widget lets someone feel; what MCP owns as the superset.
- Form factors (dedicated pass) — mobile (single column, no horizontal overflow, usable tap targets), tablet, desktop (right-panel / companions stack or collapse). Cover column: if there is no companion, set
imageBoxHeight: COVER_COLUMN_IMAGE_HEIGHT(layout.ts,48rem) — do not copy companion16remfrom 7708, and do not leave the cover uncapped. See exploration-design.mdc. Verify these in the browser before the report. - Cross-exploration UI check — for every chrome control from the steps above, search sibling
MyC.vuefiles andsrc/eComponents/ui/. Same logical control → reuse the UIC, or extract it now (component + tests, then switch old and new call sites) before shipping a second visual. This is required UIC work, not an E-Component exception gate. See exploration-design.mdc. - Result panel shell — mount result/compare UI with the scenario (idle placeholders + height for the tallest example). Do not
v-ifthe whole panel onresult. See exploration-design.mdc § Result panels. - Prose pass — scenario lessons, intro/usage, footers, and labels use plain language; no EthereumJS method/property names in user copy. See exploration-design.mdc § Prose.
Write 4–8 lines of design notes (capture, first action, play loop, form-factor plan, UI reuse/extract, result panel shell) into the phase-2 report. Then code.
Choose a building block
In order:
- available-e-components.md + reference folder — wire config + examples + execution.
- E-Component + slots/companion components — e-components.md § extension points.
- Custom widget with
ExplorationC+ shared UI — ui-components.md.
Reference explorations by pattern:
| Pattern | Folder | Config types |
|---|---|---|
| Precompile (repricing) | src/explorations/eip-7883/ |
precompileInterfaceEC/types.ts |
| Precompile (new-capability) | src/explorations/eip-7951/ |
precompileInterfaceEC/types.ts |
| Bytecode stepper + companion | src/explorations/eip-8024/ |
bytecodeStepperEC/types.ts |
| Custom / scenario-driven | src/explorations/eip-7928/ |
— |
| Receipt logs + VM scenarios | src/explorations/eip-7708/ |
receiptLogsEC/types.ts |
Copy the closest folder; adapt canonical.ts, info.ts, examples.ts, MyC.vue, and config.ts as needed. Do not copy result UI across change natures.
Do not create a new shared E-Component by default — but when briefing or design identifies a reusable logic/API + UX/UI structure likely needed for future EIP integrations, take a focused sub-round first: design, implement, test, and document the new E-Component (src/eComponents/<name>EC/, available-e-components.md), then return to the exploration and integrate it (tweak if real use teaches better shapes). Prefer slots / local companions when the pattern is truly one-off.
UIC vs E-Component: copying a sibling’s chrome (two-button toggle, run button, example picker) with different colors or spacing is a required in-between UIC extract (src/eComponents/ui/, tests included). That is not a new E-Component and does not use the exception gate below.
Sub-round checklist: typed config + neutral display types (no third-party imports in E-Component), unit tests, catalogue row, optional provide/inject for loose coupling to exploration execution.
Exception gates
Stop and ask (do not improvise past these):
- New runtime dependency (explicit human ask)
- New shared E-Component — only when the sub-round above was skipped without human approval and the pattern is still one-off (does not apply to extracting a UIC for a duplicate control)
- Briefing verdict no longer holds (spec cannot be taught honestly)
- Spec too underspecified for a truthful widget
Tests (test-first)
Prefer tests before (or in the same turn as) chrome polish — lock the protocol claim first. Tests are for logic and UI, and they must stay usable past the happy path.
Write tests.spec.ts (and Vue mounts) that cover:
- Metadata,
CANONICAL, examples, config sanity - Execution / transform helpers — happy path and beyond-edge (empty, junk, out-of-range, “too big”). Must not crash; fail in a way the widget can show
- Vue: mount
MyC(or companions); the play path is present (example picker or primary control, result region) - Extracted UIC (if any this phase):
src/eComponents/ui/__tests__/<Name>UIC.spec.ts— selected state, emit on change, no emit on same click, empty/beyond-edge
Cypress catalog (required): add one row to src/explorations/e2eCatalog.ts (id, path, family). Vitest src/explorations/__tests__/e2eCatalog.spec.ts fails if REGISTRY and the catalog diverge — that is how the visit-all E2E loop picks up the new route. Do not add a per-EIP Cypress describe. Set skipExecute: true when the primary run is too slow for CI (heavy crypto, long VM runs). A new family (not a new EIP in form / scenario / bytecode) also needs an E2E_FAMILY_PLAY representative. Shared layout (touch chrome, companion peek) uses cypress/e2e/layout.cy.ts representatives — do not add one layout spec per EIP. Details: testing.mdc § Cypress E2E.
Also update FEATURED_EXPLORATION_IDS in src/views/homeCatalog.ts (HomeView tests import the helper — no duplicate array).
Invariants and finish commands: testing.mdc, quality.mdc.
Implementation steps
- Create
src/explorations/<id>/ canonical.ts—CANONICALpercanonicalTypes.ts(SoT), from the signed-off proposalinfo.ts— website chrome;introTextstarts withcoreQuestionfromCANONICAL; copycoreQuestionandmcpDocsStatusontoINFOfor home preview cards. SetimageBoxHeightper exploration-design.mdc (COVER_COLUMN_IMAGE_HEIGHTvs companion16rem–19rem).examples.ts+ execution helpers — tests for the protocol claim first (or immediately with these files)MyC.vue(+config.tsif E-Component-backed) — then Vue mount tests. After the first chrome pass, run the cross-exploration UI check (design §11). If a sibling already has the same control and there is no UIC, extract + tests in this step, then wire every call site.- Register in
src/explorations/REGISTRY.ts(nav dropdown isObject.values(EXPLORATIONS)). Add the matching row tosrc/explorations/e2eCatalog.ts(family + path). The Cypress catalog loop visits it automatically. - Engagement lexicon: append one
problem_slicesrow insocial/watchlist.ymland add the id toeip_number_fallback. 3–4 search phrases fromcoreQuestion+mcp.keywordsin builder language (wallet, gas, logs, stack — notEIP-NNNN).pathfrominfo.ts.avoid_leading_with: EIP-NNNN. Skip ifdocsStatusissunset(and remove the row + fallback id if you are sunsetting). Do not edit the x-engagement skill for a new EIP. - Latest on the home page: prepend
<id>toFEATURED_EXPLORATION_IDSinsrc/views/homeCatalog.ts.latestExplorationIds()is the first 3 — the new one is Latest; the previous third Latest drops into Catalog. Home tests import the same helper. - Cover art (required): cover-image skill. Round-trip default: Template B from signed-off
coreQuestionunless the human named a subject at GO. Importimage.webpininfo.ts. Thennpm run generate:og:exploration -- <id>. - Dependencies — prefer existing
package.jsonentries - Finish
tests.spec.tsper Tests
Run npm run dev and verify the exploration route and home Latest cards. Do the form-factor pass (mobile / tablet / desktop) before the report.
If the briefing promised a twin, add or stub mcp-docs/use/eips/eip-NNNN.md in this phase when that is the ship gate for a live exploration (Runnable or Planned). Do not implement the engine module here.
Ship gates
| Gate | Required |
|---|---|
| Human review | intro, usage, examples, pedagogy, play loop, form factors — after this phase’s report |
| Cover art | image.webp + info.ts import — every exploration |
| Home Latest | prepended on FEATURED_EXPLORATION_IDS in homeCatalog.ts |
| Engagement lexicon | problem_slices + eip_number_fallback in social/watchlist.yml (skip/remove on sunset) |
mcp-docs/use/eips/eip-NNNN.md |
Every live exploration (same PR or immediate follow-up) |
| Engine module | When CANONICAL.mcp.shapes includes a shipped verb — round-trip phase 3 |
Invariants (also in explorations.mdc)
- No hardcoded Tailwind colors — use
e-*classes fromsrc/main.css - Same logical control, one UIC — do not restyle a sibling copy; extract to
src/eComponents/ui/with tests (exploration-design.mdc) - Libraries only in the exploration folder
- Companion UI inside E-Component slots
- Register in REGISTRY.ts (nav)
- Engagement lexicon —
social/watchlist.ymlproblem_slices+eip_number_fallbackfor live ids; remove on sunset - Cover art —
image.webpon every exploration - New shared fields only on
canonicalTypes.ts - Keep after mainnet — do not set
docsStatus: sunsetbecause the fork activated
Finish gates
npm run lf:ci
npm run type-check
npx vitest run src/explorations/<id>/ src/explorations/__tests__/e2eCatalog.spec.ts
# plus src/eComponents/ui/__tests__/<Name>UIC.spec.ts when a UIC was extracted this phase
Apply quality.mdc and testing.mdc.
Tests passing is the quality bar, not the pedagogy bar. The report below is the handoff; the human reviews intro, usage, examples, play loop, and form factors before MCP GO (round-trip) or before OG/PR (standalone).
Report template — then STOP (round-trip) or wait for review (standalone)
## Phase 2 — Exploration (eip-NNNN)
**Core question:** …
**Capture / first action / play loop:** …
**Route:** `/…`
**Change nature / building block:** … (reference folder or custom)
**Slice:** what the widget teaches vs what MCP should own
**eComponents / UI:** reused UIC | extracted UIC (this phase) | slotted | local companion | new shared EC (only if asked)
**Touched / evolved / created:** paths + one line each
**Files:** created / modified (short list)
**Latest:** prepended to `FEATURED_EXPLORATION_IDS` — dropped from Latest trio: …
**Watchlist:** `problem_slices` + `eip_number_fallback` updated (or sunset removed)
**Cover:** `image.webp` — Template A/B — shown in context
**Tests:** `npx vitest run src/explorations/<id>/ src/explorations/__tests__/e2eCatalog.spec.ts` — N specs, pass/fail (logic + UI + beyond-edge + e2e catalog row)
**Quality:** `lf:ci`, `type-check`
**Browser:** route + home Latest; mobile / tablet / desktop — notes
**Carry to MCP:** hints (bytecode vs widget, comparison forks, prompts, what not to clone)
**Open questions:** …
Follow-ups
- MCP module: round-trip phase 3, or add-mcp-module when a verb is ready
- Bro & Bruh comic: round-trip phase 4 (bro-bruh-comic) — after MCP, on a separate yes
- Cover and OG are in this phase, not follow-ups
Out of scope
- Engine module implementation (phase 3)
- Bro & Bruh comic (phase 4)
- Edits to roadmap, community-token, or docs-hub sites (mcp-docs EIP pages are a ship gate, not out of scope)
- New E-Components unless the briefing/design sub-round applies, the human explicitly asked, or an exception gate was approved (UIC extraction for a duplicate control is in scope)