BLOB DESK

CONTROL ROOM

Report · MD — —

CLICKABLE MARKDOWN · COPY READY

Phase 1L — Live E2E Progression Audit

PHASE1L-LIVE-END-TO-END-PROGRESSION-AUDIT-FINAL-REPORT.md

Opens as plain Markdown. Use Copy report or select all in the box below.

# PHASE 1L — Live End-to-End Pipeline Progression Audit Final Report

| Field | Value |
|-------|-------|
| Date | 2026-09-26 |
| Project | `/opt/blob-desk-review/code/` |
| Phase | `phase1l-live-e2e-progression-audit` |
| Control Room | `http://76.13.253.14:8097` |
| Clickable report (copy) | `http://76.13.253.14:8097/report` |
| Raw Markdown | `http://76.13.253.14:8097/report/phase1l.md` |
| On-disk Markdown | `/opt/blob-desk-review/code/PHASE1L-LIVE-END-TO-END-PROGRESSION-AUDIT-FINAL-REPORT.md` |
| Observed commit | none (Blob Desk filesystem-local; not a Git repository) |
| Mode | `EVIDENCE_ONLY` |
| Classification | **DISCOVERY_PLUS_EVIDENCE** |

---

## 1. Executive summary

The operator assessment (“just finding coins”) was **partially true before this phase** and is **no longer accurate after the safe fixes**.

**Before Phase 1L fixes**

| Stage | Reality |
|-------|---------|
| E1 detect / verify / admit | WORKING |
| Market observation (T0/T1H/…) | BROKEN — DexScreener called without User-Agent → HTTP 403; successes = 0 |
| Loop backoff | BROKEN — `SOURCE_FAIL` aborted the entire cycle (including E1) |
| Status semantics | BROKEN — `mark_missed` overwrote `SOURCE_FAIL` → `MISSED` |
| Evidence campaign | WORKING (PASS_A/B, MARKET/WEB evidence) |
| Social linkage to primary | PROVIDER_LIMITED / legitimately empty for these mints |
| Outcome complete | Not yet due (population < 24h) + T0 failures |
| Skeptic / JEV / Policy / Paper / Live | INTENTIONALLY_GATED |

**After Phase 1L fixes (live proof)**

- DexScreener market provider now sends a User-Agent (same pattern as the working search-engine client).
- Live autonomous loop wrote **SUCCESS** observations for a real PRIMARY event at T+1H:
  - event `21XYgyQjiGKj3qpRFr8iYjREkXigmut7dYdZABnVZd1nYnCNtJAU7zVBfEBkJny5nG51kgNBttmM3R5BMA9Pncsf:2`
  - mint `2Tf6YpjmopJ8XP5kpwosgTR661oaEz96PFpVxyfqpump`
  - T1H price = `1.645e-09`, liquidity = `1.78`, source=`dexscreener`, meta `{"dex":"pumpswap"}`
  - log: `OBSERVE: … due_horizons=1 … success_writes=2` at `2026-09-26T19:36:47Z`
- Historical 403 attempts were **relabeled SOURCE_FAIL** (not converted to zeros, not fabricated SUCCESS).
- Gates unchanged. Science unchanged. No JEV/Skeptic/Policy/Paper/Live activation.

**Verdict:** Blob Desk is **not** discovery-only. After the fix it is **DISCOVERY_PLUS_EVIDENCE** with **working market observation** resuming for open horizon windows. Full pre-decision pipeline is still blocked by age (no T+24H yet), outcome completeness, and social-linkage gate thresholds — not by a dead observe worker.

---

## 2. Current live population

Observed at validation (~2026-09-26T19:38Z):

| Metric | Value |
|--------|-------|
| PRIMARY_PROSPECTIVE (excluded=0) | **44** |
| VERIFIED among primary | 44 |
| Age min / med / max (hours) | ~0.4 / ~3 / ~11 |
| Events ≥24h old | **0** |
| Observation SUCCESS rows | **2** (T1H price+liquidity on one event) |
| Observation SOURCE_FAIL rows | 152 |
| Observation MISSED rows | 16 |
| Campaign members | 44 |
| search_evidence | 102 (MARKET 93 + WEB 9 at earlier count; grows) |
| campaign_evidence_snapshots | 84 |
| evidence_states frozen | 1 |
| OUTCOME_COMPLETE | **0** |
| INFORMATION_VALUE | `INSUFFICIENT_DATA` |
| EXP-SKEPTIC-V1 | `NOT_READY` |
| Accumulation loop | ACTIVE (`blob-desk-accum`) |
| Control Room | `blob-desk-control-room-v3` healthy |

---

## 3. Three real events selected for trace

| Label | event_id (prefix) | mint (prefix) | T0 (block_time) | Age at audit |
|-------|-------------------|---------------|-----------------|--------------|
| NEWEST | `24dPzu4j…:2` | `AnoqEL6BD2vQ…` | 2026-09-26T19:16:23Z | ~0.36h |
| SUCCESS_EVENT | `21XYgyQj…:2` | `2Tf6YpjmopJ8…` | 2026-09-26T18:36:02Z | ~1.03h |
| OLDEST | `4hxQmfKU…:2` | `9mDfKuCJqhs3…` | 2026-09-26T08:36:32Z | ~11.03h |

All are live `PRIMARY_PROSPECTIVE`, `VERIFIED`, `admission_path=E1_AUTONOMOUS`. No fixtures.

---

## 4. Complete lifecycle traces

### 4.1 NEWEST — `24dPzu4j…:2` / `AnoqEL6BD2vQ…`

| Step | Status | Evidence |
|------|--------|----------|
| E1 detection | WORKING | chain_parse migrate/pumpswap; slot 450766032 |
| Admission | WORKING | created_at 19:17:07Z (lag 44s) |
| T0 schedule | WORKING | slots created |
| T0 execute | PROVIDER_LIMITED→fixed going forward | Attempt at 19:18:26Z (lateness 75s, **in 120s window**); meta `{"http":403}` → now labeled **SOURCE_FAIL** |
| T1H | PENDING | due 20:16:23Z |
| T24H / T48H | PENDING | not due |
| Campaign | WORKING | PASS_A COMPLETED; PASS_B/C/D pending by schedule |
| Evidence | WORKING | 2 MARKET search_evidence; 1 campaign snapshot |
| EvidenceState freeze | INTENTIONALLY_GATED (until Skeptic path) | none for this event |
| Outcome | incomplete | no T0 SUCCESS + no T24H yet |
| Readiness contribution | blocks completeness | counted in incomplete |

### 4.2 SUCCESS_EVENT — `21XYgyQj…:2` / `2Tf6YpjmopJ8…`

| Step | Status | Evidence |
|------|--------|----------|
| E1 / Admission | WORKING | admitted 18:36:16Z (lag 14s) |
| T0 | SOURCE_FAIL (pre-fix 403) | attempted in-window; honest failure retained |
| **T1H** | **SUCCESS** | price `1.645e-09`, liq `1.78`, pumpswap, obs 19:36:47Z, lateness 45s |
| T24H / T48H | PENDING | due +24h / +48h |
| Campaign | WORKING | PASS_A COMPLETED; PASS_B due at T1H (campaign poll 300s — may complete on next tick) |
| Evidence | WORKING | MARKET evidence + snapshot |
| Progression proof | **YES** | First live SUCCESS after UA fix |

### 4.3 OLDEST — `4hxQmfKU…:2` / `9mDfKuCJqhs3…`

| Step | Status | Evidence |
|------|--------|----------|
| E1 / Admission | WORKING | created_at 09:59:28Z vs block 08:36:32Z → **lag ~83 min** |
| T0 | MISSED (pure) | Window closed before admission; source=`pending`; empty meta — **correct MISSED** |
| T1H | MISSED (pure) | Also closed before observe ran (adm mid-morning) |
| T24H | PENDING | due 2026-09-27T08:36:32Z |
| Campaign | WORKING | PASS_A+B COMPLETED; PASS_C pending T+24H; PASS_D GROK COMPLETED |
| Evidence | WORKING | MARKET+WEB evidence; 2 snapshots; **1 EvidenceState frozen** |
| Social linked | NONE OBSERVED | Legitimate empty for linked primary social |

---

## 5. E1 detection status — WORKING

Autonomous collector running in `blob-desk-accum`. Logs show continuous `E1: fetched=… new=…`. Detections land in `e1_detections` / `verified_events`.

## 6. Admission status — WORKING

`admission_path=E1_AUTONOMOUS`, cohort `PRIMARY_PROSPECTIVE`. Median admission lag ~60s (3/44 >120s; 1/44 >1h). Late admission **correctly** produces pure MISSED for closed T0 windows.

## 7. T0 scheduling status — WORKING

`ensure_schedule` creates UNRESOLVED slots for T0/T1H/T24H/T48H × {price,liquidity}. Invoked every observe phase.

## 8. T0 execution status — WAS BROKEN → FIXED (forward)

**Root cause (engineering defect A):**
`phase1/market.py` `DexScreenerProvider` used bare `urllib.request.urlopen(url)` **without User-Agent**. DexScreener returns **HTTP 403**. The search-engine client already sent `User-Agent: blob-desk-search-engine/1.0` and succeeded — same API, different client.

**Runtime proof:**
- Bare urllib → 403
- With UA → 200 + pairs
- Pre-fix live provider call → SUCCESS

**Historical T0 rows:** mostly SOURCE_FAIL with `{"http":403}` (after label restore), plus pure MISSED for late admissions. **Not** rewritten to SUCCESS (would be future/fake data).

## 9. T+1H status — WORKING (post-fix)

Live SUCCESS written for open T1H window (see §4.2). Remaining UNRESOLVED T1H rows will be attempted when due.

## 10. T+24H status — PENDING (population age)

No primary event is ≥24h old. All T24H rows UNRESOLVED with future `target_time`. Not a defect.

## 11. T+48H status — PENDING

Same as T24H — not yet due.

## 12. Market-data provider behaviour

| Item | Value |
|------|-------|
| Provider | DexScreener (`DexScreenerProvider`) |
| Endpoint | `https://api.dexscreener.com/latest/dex/tokens/{mint}` |
| Fields | `priceUsd`, `liquidity.usd`, `pairAddress`, `dexId` |
| Pool pinning | Prefer event pool; CONTRADICTORY on pool switch after T0 SUCCESS |
| Timeouts | 20s |
| Rate limit | HTTP 429 → `RATE_LIMITED` |
| Other HTTP | `SOURCE_FAIL` + `{"http": code}` |
| No pairs | `UNTRADEABLE` |
| Network default | off in tests; on via `--allow-network` |
| Fix | User-Agent `blob-desk-market/1.0 (+evidence-only; research)` |

## 13. Provider failure analysis

| Failure | Classification | Handling |
|---------|----------------|----------|
| HTTP 403 without UA | ENGINEERING DEFECT (fixed) | Was SOURCE_FAIL; was wrongly MISSED by mark_missed |
| Late admission > T0 window | OPERATIONAL / data timing | Honest MISSED |
| No social posts for mint | PROVIDER_LIMITED / empty result | Mastodon SUCCESS runs; 0 linked to primary |
| Population <24h | TIME | Blocks outcome completeness |

**Invariant preserved:** NULL ≠ 0; SOURCE_FAIL ≠ MISSED ≠ SUCCESS; no price imputation.

## 14. Evidence campaign execution — WORKING

- All 44 primaries enrolled in `camp_primary_prospective_v1`
- PASS_A_IMMEDIATE: 44 COMPLETED
- PASS_B_VICINITY: mostly COMPLETED; newest pending until due
- PASS_C_POST_T0: all PENDING until T+24H (by design)
- PASS_D_GROK: eligibility-driven; ≥1 COMPLETED
- Snapshots written to `campaign_evidence_snapshots`

`due_passes=0` in logs when nothing is currently due — not dormancy.

## 15. Social / web execution

| Path | Classification | Notes |
|------|----------------|-------|
| Deterministic DexScreener → search_evidence MARKET | WORKING | 90+ rows |
| Web/Grok scout refs | WORKING | WEB class present |
| Mastodon public search | WORKING | 260 SUCCESS provider runs; 14 social_events |
| Link to PRIMARY mints | NONE OBSERVED | links UNLINKED to non-primary candidates; 0 SOCIAL class on primary targets |
| “Did the system search?” | **YES** | Empty social for these coins is legitimate, not a silent skip |

## 16. Grok escalation execution — WORKING (gated path)

Grok remains a research scout. Jobs exist (`GROK_RESEARCH` PENDING/COMPLETED). Artifacts import into search_evidence with discovery_source `GROK_SCOUT`. Not forced on every event. Not used as trading oracle. JEV not activated.

## 17. EvidenceState progression — INTENTIONALLY_GATED (+ partial)

- `freeze_evidence_state` is wired for Skeptic/CLI/paper paths, **not** every loop tick
- Campaign uses separate `campaign_evidence_snapshots` (actively written)
- 1 full EvidenceState row exists (oldest event) — freeze path works when invoked
- Not a disconnected bug requiring activation; Skeptic remains GATED

## 18. Maturity progression — BLOCKED by upstream age/outcomes

`mature_events=0`. Expected until T24H outcomes exist and evidence completeness rises. Thresholds not lowered.

## 19. Outcome progression — BLOCKED by age + T0 quality

`outcome_complete=0`, `incomplete=44`. Requires SUCCESS T0 **and** SUCCESS/evaluable T24H. Population max age ~11h → T24H not due. Historical T0 SOURCE_FAIL/MISSED cannot be fabricated into SUCCESS.

## 20. Readiness progression — NOT_READY (authoritative)

`evaluate_experiment_readiness` reason_codes:

| Code | Label | Meaning |
|------|-------|---------|
| SOCIAL_LINKAGE_TOO_LOW | REQUIRED_FOR_GATE | linked social pct 0.0 < 0.2 |
| OUTCOME_COMPLETENESS_TOO_LOW | REQUIRED_FOR_GATE | complete 0 |
| PRIMARY_N_TOO_SMALL / gate3 | REQUIRED_FOR_GATE | IV=`INSUFFICIENT_DATA`, gate3 CLOSED |
| EVIDENCE_COMPLETENESS_TOO_LOW | DIAGNOSTIC | mature_events 0 |
| MISSINGNESS / SOURCE_COVERAGE | DIAGNOSTIC | market/social unknown/not observed |

`ready_to_execute=false`, `executed=false`. Thresholds unchanged.

## 21. Exact current bottleneck

1. **Was (fixed):** market client 403 + observe backoff killing the loop + MISSED overwriting SOURCE_FAIL.
2. **Now:** time — wait for T+24H windows; accumulate more SUCCESS T0/T1H on newly admitted events; social linkage may remain low without inventing posts.
3. **Intentional:** Skeptic/JEV/Policy/Paper/Live stay GATED until readiness is real.

## 22. Classification

**DISCOVERY_PLUS_EVIDENCE**

Rationale (runtime):

- Discovery/admission: continuous
- Observation: live SUCCESS proven post-fix
- Evidence campaign + search_evidence + snapshots: operating
- Not FULL_PRE_DECISION_PIPELINE: no outcome-complete events; readiness NOT_READY; Skeptic gated

## 23. Defects found

| ID | Defect | Class |
|----|--------|-------|
| D1 | DexScreener market client missing User-Agent → HTTP 403 | A ENGINEERING |
| D2 | `mark_missed_past_windows` overwrote SOURCE_FAIL → MISSED | A ENGINEERING |
| D3 | `SOURCE_FAIL` triggered full-cycle backoff (blocked E1) | A ENGINEERING |
| D4 | Observe not forced on same cycle as new admission (T0 window risk) | A ENGINEERING (mitigated) |
| D5 | Historical T0/T1H failures during 403 era | consequence of D1 |
| D6 | Pure MISSED on late-admitted oldest event | C timing / not a bug |
| D7 | No T24H yet | C population age |
| D8 | Social linkage 0% on primary | C empty result after search |
| D9 | Skeptic/JEV/… dormant | B INTENTIONAL GATE |

## 24. Root causes

1. **Client bug:** market.py omitted UA that search_engine already used.
2. **Semantics bug:** missed-window sweeper treated any non-SUCCESS as MISSED, erasing provider-failure provenance.
3. **Control-flow bug:** observe transient → global `backoff_until` → early `return` skipped collect/campaign/social.

## 25. Fixes implemented

1. **`DexScreenerProvider`:** send `User-Agent` + `Accept` headers.
2. **`mark_missed_past_windows`:** preserve terminal statuses (`SOURCE_FAIL`, `RATE_LIMITED`, `MALFORMED`, `CONTRADICTORY`, `STALE`, `UNTRADEABLE`, `SUCCESS`, `MISSED`).
3. **`restore_provider_failure_labels`:** relabel MISSED→SOURCE_FAIL when `provider_meta` has `http`/`error` (no value invention). Ran once on live DB: **152** labels restored.
4. **Loop backoff:** only `RATE_LIMITED` registers observe backoff; `observe_*` backoff defers observe only — **does not** abort E1/campaign/social; clear observe backoff after non-rate-limited observe.
5. **Force observe** in the same cycle when `admitted_new > 0` to catch T0 window.

## 26. Files changed

| File | Change |
|------|--------|
| `phase1/market.py` | User-Agent on DexScreener live client |
| `phase1/observations.py` | mark_missed preservation + restore_provider_failure_labels |
| `phase1/loop.py` | BACKOFF_OBS, scoped backoff, force-observe on admit, restore on observe |
| `phase1/control_room/reports.py` | Phase 1L primary report catalog entry |
| `tests/test_phase1l_progression.py` | New regression tests |

No ASKU / Football / FootyFrog / OpenClaw edits.

## 27. Tests added

`tests/test_phase1l_progression.py`:

- DexScreener sends User-Agent (mocked urlopen)
- mark_missed preserves SOURCE_FAIL
- restore_provider_failure_labels (http 403)
- restore does not touch pure MISSED
- BACKOFF_OBS is RATE_LIMITED only
- observe SOURCE_FAIL does not count as rate-limited backoff
- failure leaves value NULL

## 28. Full test result

```
390 passed in 45.81s
```

No regressions.

## 29. Live validation

| Check | Result |
|-------|--------|
| Control Room `/health` | ok, v3 |
| Accumulation ACTIVE | yes (`blob-desk-accum`, running=1) |
| New E1 fetches | yes |
| Observation SUCCESS | **yes** — T1H on real event at 19:36:47Z |
| Evidence campaign | yes (PASS_A/B, snapshots) |
| Readiness recalculating | yes |
| JEV / Skeptic / Policy / Paper / Live | remain GATED |
| SYSTEM_MODE | EVIDENCE_ONLY |

## 30. Scientific-integrity audit

| Rule | Status |
|------|--------|
| No synthetic primary | ✓ |
| No future leakage into PROSPECTIVE SUCCESS | ✓ |
| NULL/SOURCE_FAIL/MISSED not coerced to 0 | ✓ |
| G1/H1/holdout/thresholds unchanged | ✓ |
| No JEV/Skeptic/Policy/Paper/Live activation | ✓ |
| Historical 403 not rewritten as SUCCESS | ✓ |

## 31. Project-isolation audit

| Item | Result |
|------|--------|
| Changed tree | `/opt/blob-desk-review/code/` only |
| Restarted | `blob-desk-accum` tmux; Control Room left on v3 (report catalog only) |
| Database | `phase1_lab.db` — observation status relabel + new SUCCESS writes only |
| Network | DexScreener (existing); no new paid providers |
| Unrelated projects | not modified by this phase |

Workspace git shows unrelated ASKU/agent dirt from prior sessions — **not touched** by Phase 1L.

## 32. Remaining intentional gates

| Component | State |
|-----------|-------|
| SKEPTIC | GATED |
| JEV | GATED |
| POLICY | GATED |
| PAPER | GATED |
| LIVE | GATED |
| EXP-SKEPTIC-V1 execute | NOT_READY / refuse |
| EvidenceState auto-freeze every tick | not required until Skeptic |

## 33. Remaining provider limitations

- Historical T0 windows already closed cannot be prospectively recovered.
- Social platforms X/Telegram unreachable by design; Mastodon/Bsky may yield 0 posts for a given mint.
- DexScreener remains the sole live market truth (no silent multi-provider blend).

## 34. Human authorisation requirements

Stop and ask before:

- Changing G1/H1, holdout, experiment hash, or readiness thresholds
- Enabling Skeptic / JEV / Policy / Paper / Live
- Introducing a paid market provider or changing outcome definitions
- Backfilling retrospective prices into PROSPECTIVE SUCCESS rows

No such changes made.

## 35. Exact next step

1. Keep accumulation running.
2. Confirm newly admitted events get **T0 SUCCESS** within the 120s window (UA fix + force-observe).
3. As T1H windows open, expect additional SUCCESS rows (already proven).
4. After ~24h wall-clock, T24H observations become due → outcome completeness can rise **without** lowering gates.
5. Do **not** build another dashboard or activate JEV until outcome-complete population is real.

---

## Component classification matrix

| Component | Classification |
|-----------|----------------|
| E1 detection | WORKING |
| Admission | WORKING |
| Observation scheduler | WORKING |
| Market provider (DexScreener) | WORKING (after UA fix) |
| T0 historical 403 era | PROVIDER_LIMITED (fixed forward) |
| T1H live observe | WORKING |
| T24H/T48H | PENDING (age) |
| Evidence campaign | WORKING |
| Social search | WORKING (empty primary linkage OK) |
| Grok scout path | WORKING (eligibility-gated) |
| EvidenceState freeze | INTENTIONALLY_GATED |
| Maturity/outcome monitors | WORKING (reporting zeros honestly) |
| Readiness evaluator | WORKING |
| Skeptic | INTENTIONALLY_GATED |
| JEV | INTENTIONALLY_GATED |
| Policy / Paper / Live | INTENTIONALLY_GATED |

---

## Final state checklist

| Requirement | Met |
|-------------|-----|
| Traced ≥3 real PRIMARY events | ✓ |
| Identified A/B/C causes distinctly | ✓ |
| Fixed safe engineering defects | ✓ |
| Regression tests + full suite green | ✓ 390 |
| Live progression beyond detect/admit | ✓ T1H SUCCESS |
| No synthetic/future fabrication | ✓ |
| Gates intact | ✓ |
| Report on disk + clickable `/report` | ✓ |