# Interactive Phenomena Research Protocol — v1.0

Purpose: let one researcher run hundreds of experiments against the taxonomy without the taxonomy quietly becoming whatever the researcher already believed.

---

## 0. The loop (follow top to bottom, every experiment)

1. Write the prediction (§4). Save to `predictions/pending/`. Do not reopen until step 6.
2. Build the experiment inside the blind harness (§1). No titles, no family names, no symbols, no hypothesis text visible anywhere in the build.
3. Assign a random code (`EXP047`). Log code → real file mapping in a sealed file. Do not read that mapping until step 6.
4. Queue it in a batch of ≥3, containing at least one decoy. Never run a single experiment alone.
5. Run the session. Instrumentation logs behavior automatically (§3). Immediately after — within 60 seconds — run the observation capture sequence (§2) in order, no skipping, no rereading old notes first.
6. Only now: unseal the prediction. Compare the free-text response and behavior log against the stated falsification condition. Classify: **confirmed / partial / falsified / inconclusive**.
7. Append the result to the experiment log (§7) — never edit past entries. Apply revision rules if a trigger condition is met (§6). Bump the taxonomy version only at a scheduled batch review, never mid-session (§7).

---

## 1. Blindness

Full blinding is not achievable — the taxonomy lives in your head and that can't be undone. The protocol targets what *can* be controlled: proximate priming, i.e. knowing **this specific prediction** right before playing **this specific build**.

- Every test-facing build ships through a stripped harness: no title, no family/element names, no prediction text. Replace with neutral filler only — `EXP047 — explore for up to 90 seconds.`
- Predictions are written and saved *before any code exists* (pre-registration), then sealed.
- Never test a build the same day it was built. Minimum one sleep cycle between build and test.
- Always batch ≥3 builds per session, at least one a decoy (either pure noise with no attached hypothesis, or a near-miss mutation of a real prediction). A session of exactly one labeled-in-your-head "the thing I'm testing today" is not a blind session.
- Randomize the order you run the batch in. Don't run them in build order.

---

## 2. Observation

Fixed sequence, every time, administered within 60 seconds of stopping. Never let yourself see this list before playing — it primes.

1. **Unprompted free text.** "What just happened, in your own words?" One sentence. No supplied vocabulary.
2. **Revealed preference.** "Given the choice, would you do that again right now?" Yes/no.
3. **Generic affect check**, 0–3 each, using only these words (deliberately *not* taxonomy vocabulary): *interested, uneasy, calm, tense, drawn-in, repelled, alert, bored.*
4. **Persistence check.** "Right now, is any of that still with you, or is it already gone?"
5. *Only now:* unseal the prediction and classify the free text against the falsification condition.

Banned outright: any question of the form "did you feel [predicted label]." If the predicted word never leaves your mouth until step 5, it can't have leaked into steps 1–4.

---

## 3. Behavior

Self-report is the only access to qualia there is — behavior doesn't replace it. Behavior's job is to catch self-report *contradicting itself*. Every build logs, automatically, no exceptions:

- time to first input (hesitation)
- total session duration, active-input time vs. idle time
- replay/retry count (repeated the action unprompted)
- cursor path length and average speed (jitter as an arousal proxy)
- abandonment point (navigated away — and exactly when)
- approach vs. avoidance, for anything with a moving target or threat

Standard stub, paste into every new build:

```js
const log = { events: [], start: performance.now() };
['mousedown','mouseup','mousemove','click'].forEach(ev =>
  document.addEventListener(ev, e => log.events.push({ t: performance.now() - log.start, ev, x: e.clientX, y: e.clientY }))
);
window.addEventListener('beforeunload', () =>
  localStorage.setItem('EXPLOG_' + CODE, JSON.stringify(log)));
```

Rule of use: if self-report says "boring" and the log shows 40 unforced replays, don't average them — log the contradiction explicitly and treat the self-report as suspect for that session. Behavior can't tell you what something felt like. It can tell you when your own account of it is lying.

---

## 4. Predictions

Fixed template. No confidence number, no experiment — the number is what lets you check your own calibration later, across many predictions, not just this one.

```
ID:
Date written:
Elements combined:            (symbols + taxonomy version they're drawn from)
Mechanism:                    (one sentence: why the combination produces something neither element produces alone)
Predicted experience:         (generic words — not a taxonomy label)
Predicted behavior:           (≥1 measurable signature, e.g. "replay count > 3" or "abandonment before 20s")
Falsification condition:      (the specific alternative observation — self-report AND behavior — that would prove this wrong; not just "doesn't feel like X")
Confidence: __%
```

---

## 5. Evidence

Tiered. Nothing skips a tier.

| Tier | Bar | Where it lives |
|---|---|---|
| 0 — Candidate | Prediction written, not yet run | Candidates appendix |
| 1 — Observed | One blind session; report matches; behavior doesn't contradict | Candidates appendix, flagged n=1 |
| 2 — Replicated | Confirmed a second time, different day, re-blinded, surface details changed (color/shape) to rule out pixel pattern-matching | **Minimum bar for the active table** |
| 3 — Corroborated | Independently confirmed by at least one other unprimed person | Highest tier available to a one-person lab |

Falsified predictions are logged with the same rigor as confirmed ones. The evidence bar is symmetric — it is exactly as hard to add an element as it is to note that one failed.

---

## 6. Revision

- **Merge** — two elements produce indistinguishable free text and behavior across ≥2 blind sessions. Keep both symbols as aliases on the merged entry.
- **Split** — one element produces reliably bimodal results that resolve cleanly once conditioned on a nameable variable. Re-test each half independently before finalizing.
- **Rename** — the dynamic keeps replicating but the experience label keeps mismatching the actual free text (e.g., "panic" repeatedly coded as "frustration"). Dynamic stays, label changes, change is logged.
- **Delete** — a prediction fails ≥2 blind attempts with no coupling-condition explanation, or an element accumulates zero separable examples after 3 dedicated attempts. Moves to the retired appendix with a reason. Never silently vanishes.

---

## 7. Versioning

The taxonomy document is a *view*. The experiment log is the source of truth — append-only, timestamped, never edited after the fact (corrections are new entries, not rewrites).

- Version number bumps only at a scheduled batch review (minimum every 10 logged experiments), never mid-session.
- Every bump ships a one-line changelog per change, linking the log entries that triggered it.
- Three permanent sections, always present: **Active table** (Tier 2+ only), **Candidates appendix** (Tier 0/1), **Retired appendix** (dead ideas + reason + date, kept forever so a failed idea can't get quietly re-proposed by a future-us who forgot).
- Every scheduled review must clear the candidates backlog to zero: promote, keep pending with a stated reason, or retire. No permanent limbo.
