Commit Graph

2 Commits

Author SHA1 Message Date
Svrnty
9ce6bfc08f fix(adwright + plugin): font 404s + status humanization + compound refresh + poll deadline
Bundles four Tranche-A polish fixes that ship together:

1. **Font 404s** — CSS @font-face URLs were /extensions/fonts/* but the
   plugin loader serves static under /plugins/svrnty/*. Updated paths
   to match register_static prefix.

2. **Humanized status enum** — _humanStatus() maps proto canonical strings
   (CYCLE_STATUS_PREVIEW_READY, VARIANT_STATUS_ACTIVE, etc.) to
   user-facing labels ("Preview ready", "Active"). Applied to Cycles
   row, Overview timeline, and variant detail.

3. **Compound Overview refresh** — refresh-overview now dispatches both
   refresh-cycles AND list-recipes via _COMPOUND_ACTIONS map. Without
   this, KPI Recipes stayed at 0 until user visited Targeting tab.
   Added per-action user-facing toast labels (_ACTION_LABELS) so the
   user sees "Loading recipes…" instead of just hermes-webui's raw
   "Queued: /adwright list-recipes" banner.

4. **Poll deadline race** — compound actions fired two sub-actions
   back-to-back; sub1's poll response was nulling pendingTool before
   sub2 could be ingested. _pollOnce now (a) resets deadline on each
   successful update (sign of progress) and (b) only stops polling
   when the response matches the CURRENT pendingTool (not the captured
   local var from earlier in the recursive fire).

Verified live: Overview now shows Cycles=1, Recipes=10, Spend=$0/$200,
timeline=Cycle #1 — Preview ready. Console clean (0 errors, was 3
font 404s).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 17:47:56 -04:00
Svrnty
c1e3fa1af0 feat(plugin): Phase 2 partial — vault_status migrated + brand skin moved + eval suite (P2.B/C, P3.A/B)
All checks were successful
plugin-tests / test (push) Successful in 25s
Lands the easy migrations + the automation skeleton. STT migration deferred
to Phase 2.1 (it touches the streaming engine + bootstrap JS — needs a new
streaming_hook public-API method OR forced-internal CONNECTION-MAP entries).

Migrated to plugin:
  routes/vault_status.py    GET /api/vault/status (from fork commit 3e2c74f3)
  static/{app.js,app.css,fonts/}  brand skin (from hermes-ext/)

Plugin auto-loaded by hermes-webui when HERMES_WEBUI_PYTHON_PLUGIN is set;
register_static + inject_stylesheet + inject_script wire the URL contract at
/plugins/svrnty/{app.css,app.js} per protocol §14 (Q5).

Automation skeleton:
  Makefile                          one-liner targets: test · map · sync-upstream · smoke
  scripts/boot-smoke.py             start upstream+plugin, curl every endpoint
  scripts/upstream-sync.py          fetch tags + run matrix + JSON report
  tests/evals/test_features.py      4 evals (loader contract · vault payload · brand URL contract · forced-internal=0)
  tests/unit/test_brand_skin.py     4 asset-presence + wiring tests
  tests/unit/test_vault_status.py   3 handler tests (register, success, error)

CONNECTION-MAP.md: 0 forced-internal dependencies; plugin uses only public API.
AST script timestamp removed so map-check is deterministic.

Tests: 11/11 PASS (4 evals + 7 unit). Integration tests deferred until
boot-smoke runs against a live hermes-webui (Phase 2.D + 2.E gate).

Deferred to next session:
  P2.A  STT migration (needs streaming_hook design — see routes/transcribe.py)
  P2.D  Revert 4 fork feature commits — needs STT migration first
  P2.E  Archive hermes-ext repo — gated on P2.D
  P2.F  Live boot smoke against real webui

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 10:02:47 -04:00