v1.83.0

EvoMap/evolverv1.83.0May 16, 2026by autogame-17

AI Summary

The daemon now includes a publish-to-recall verification system to ensure that assets uploaded to the Hub can actually be retrieved later. This prevents silent failures where assets are indexed but not retrievable.

Key Highlights

  • New `recallVerifier.js` worker runs Phase 2 deterministic lookups with exponential backoff.
  • New `recall-verify-report.js` script provides Markdown reports and ship-gating exit codes.
  • Configuration options for sampling rate, queue size, and retry attempts.
  • Hardened through five rounds of Cursor Bugbot review.
  • Fix for using sanitized capsule hashes during verification lookups.

New Features

  • Publish-to-recall round-trip verification system.
  • Hub mirror staging capabilities.
  • Automated verification reporting and ship-gating.

Full Release Notes

## [1.83.0] - 2026-05-16

### Added — Publish → recall round-trip verification (#53, #56)

After every successful Hub publish (Capsule, AntiPattern, or SkillBundle),
the daemon now confirms that the asset can actually be **recalled** from
Hub. A new `src/gep/recallVerifier.js` worker runs Phase 2 deterministic
`asset_id` lookups on a sampling of published assets, with exponential
backoff to absorb indexing latency. Outcomes (`roundtrip_ok` /
`roundtrip_missing` / `roundtrip_mismatch` / `verification_skipped`) land
in `memory_graph.jsonl` as `kind=recall_verify` events.

A new `scripts/recall-verify-report.js` aggregates those events into a
Markdown table grouped by asset type with success rate + p50/p95/p99
latency. Exit code is a ship-gate: 0 when every asset type meets ≥ 0.95
success and zero mismatches, exit 2 otherwise. Designed to plug into
deploy.sh as a pre-publish guard.

This closes the "daemon knows results" theme set up by v1.82.0's open-PR
overlap detection: v1.82.0 made the daemon aware of in-flight work so it
stops re-inventing it; v1.83.0 makes the daemon aware of whether its own
uploaded experience is actually retrievable later. Together they bound
the daemon's two main blind spots — "what other people are doing" and
"whether what I just uploaded actually stuck."

### Architecture

| Layer | Behavior |
|---|---|
| `src/gep/recallVerifier.js` (new) | Bounded ring queue (default 256), single-flight by asset_id, sample-rate gate, async setInterval worker (unref'd so process exit is unblocked). Retries on missing with [5s, 15s, 60s] backoff up to 3 attempts. |
| `src/gep/hubSearch.js` | Phase 2 fetch logic extracted into a reusable `fetchAssetById(assetId, opts)` helper. Cache-first ordering preserved so hot payloads return instantly even when the search-phase budget is exhausted. |
| Three publish hooks | `solidify.js` capsule + anti-pattern, `skill2gep.js` `publishBundleChannel`. Each enqueues only after `res.ok && !res.dry_run`, and uses the **sanitized** capsule's `asset_id` so the verifier looks up the same hash the Hub indexed. |
| `scripts/recall-verify-report.js` (new) | Markdown report with monotonic gate severity (RED never downgrades to YELLOW). |
| `index.js` | `[RecallVerify] ENABLED/DISABLED` startup banner, starts the worker once, with sample-rate range clamping. |

### Mismatch detection

`verifyOnce` recomputes `computeAssetId` on the recalled body and
compares to `results[0].asset_id`. A mismatch means the Hub re-encoded or
corrupted the asset between publish and fetch — surfaced as
`roundtrip_mismatch` and flips the gate to RED.

### Configuration (all default-on)

| Env var | Default | Purpose |
|---|---|---|
| `EVOLVE_RECALL_VERIFY` | `1` | Master switch |
| `EVOLVE_RECALL_VERIFY_SAMPLE_RATE` | `1.0` | Fraction of publishes to verify (clamped to [0, 1]) |
| `EVOLVE_RECALL_VERIFY_QUEUE_MAX` | `256` | Ring queue size |
| `EVOLVE_RECALL_VERIFY_INITIAL_WAIT_MS` | `5000` | First-attempt delay |
| `EVOLVE_RECALL_VERIFY_POLL_MS` | `5000` | Worker tick rate |
| `EVOLVE_RECALL_VERIFY_ATTEMPTS` | `3` | Retries on `roundtrip_missing` |
| `EVOLVE_RECALL_VERIFY_FETCH_TIMEOUT_MS` | `8000` | Phase 2 timeout |

### Hub mirror staging

`recall_verify` is intentionally **not** in `HUB_SYNC_KIND_ALLOWLIST` on
first ship — local-only until Hub side confirms it accepts the schema.
One-line follow-up patch enables mirroring later.

### Hardened — five Bugbot review iterations on the publish/verify
data flow

PR #53 + #56 went through five Cursor Bugbot rounds. Each surfaced a
real defect that would have shipped silently:

- **schemas/protocol obfuscation gap.** `recallVerifier.js` was missing
  from `public.manifest.json:obfuscate`; would have shipped in plaintext
  to npm.
- **Phase 2 cache bypass regression.** Refactored time-budget check
  ordered before cache lookup, so hot payloads were silently re-fetched
  (or worse, dropped) under deadline pressure.
- **Gate severity could downgrade.** `recall-verify-report.js`'s gate
  loop overwrote later rows, so AntiPattern@RED followed by Capsule@YELLOW
  reported YELLOW — misleading dashboards even though exit code was
  correct. Replaced with monotonic escalation (RANK ordinal).
- **Wrong asset_id used for recall lookup.** `solidify.js`'s capsule and
  anti-pattern paths enqueued the **pre-sanitize** `asset_id` for
  verification, but Hub indexes by the **sanitized** hash. Any PII
  redaction would have produced persistent false `roundtrip_missing`
  results, dragging the ship gate toward RED forever. Both paths now
  recompute on the sanitized capsule and pass that hash to the verifier.
- **Sample-rate banner-vs-implementation drift.** `index.js` clamped
  sample rate to [0, 1] but `_getSampleRate()` did not, so a negative
  env value silently disabled all verification while the banner still
  reported 1.0.
- **Dry-run guard masked Hub rejections.** `else if (res && res.dry_run)`
  classified `{ok:false, dry_run:true}` (a real Hub reject during
  dry-run) as a clean dry-run skip. Now requires `res.ok && res.dry_run`.

### Notes for operators

- This release is enabled-by-default; no opt-in required to start
  collecting recall_verify events. To disable, set
  `EVOLVE_RECALL_VERIFY=0` before the daemon starts.
- A 30-minute real-Hub daemon smoke + `recall-verify-report` ship-gate
  read is the recommended pre-deploy ritual once a non-trivial volume of
  publishes has accumulated.
- Memory graph events with `kind=recall_verify` are local-only this
  release; the next release will add them to the Hub mirror allowlist
  once Hub-side schema acceptance is confirmed.