4.6 KiB
Hermes Achievements Performance Implementation Plan
Status: Ready for execution after hackathon review window
Constraint: Plugin remains frozen until judging is complete
Decision: /overview and top-banner slots are out of scope and will be removed.
Phase 0 — Baseline & Safety (no behavior change)
Task 0.1: Add perf benchmark script (local)
Objective: Repro baseline before/after.
Acceptance:
- Can print endpoint timings for
/achievements(3 runs each, cold + warm).
Task 0.2: Define acceptance thresholds
Objective: Lock success criteria now.
Acceptance:
- Documented SLOs:
/achievementsp95 < 1s (cached)- max active scan jobs = 1
Phase 1 — Remove unused overview/slot surface (highest certainty)
Task 1.1: Remove /overview backend route
Objective: Eliminate duplicate heavy endpoint path.
Acceptance:
plugin_api.pyno longer exposes/overview.
Task 1.2: Remove slot registration and SummarySlot frontend code
Objective: Remove cross-tab banner fetch behavior.
Acceptance:
- No
registerSlot(..."sessions:top"...)orregisterSlot(..."analytics:top"...). - No frontend call to
api("/overview").
Task 1.3: Update plugin manifest
Objective: Reflect final UI scope.
Acceptance:
manifest.jsonremovesslotsdeclarations.- Tab registration remains intact.
Phase 2 — Shared snapshot persistence + single-flight for /achievements
Task 2.1: Introduce snapshot store abstraction + on-disk persistence
Objective: Single source of truth for Achievements data that survives process restarts.
Acceptance:
- One structure contains dataset consumed by
/achievements. - Repeated requests do not recompute when cache is fresh.
- Snapshot persisted at
~/.hermes/plugins/hermes-achievements/scan_snapshot.json.
Task 2.2: Single-flight scan coordinator
Objective: Prevent concurrent recomputes.
Acceptance:
- Simultaneous requests result in one compute run.
Task 2.3: Refactor /achievements to read snapshot
Objective: Remove direct repeated compute from request path.
Acceptance:
/achievementsdoes not run independent full recompute per request when cache is valid.
Phase 3 — Stale-While-Revalidate
Task 3.1: TTL state (FRESH/STALE)
Objective: Serve immediately when stale, refresh in background.
Acceptance:
- Cached response returned quickly even when expired.
- Refresh is asynchronous.
Task 3.2: Add scan-status endpoint (optional)
Objective: Let UI/ops inspect scan state.
Acceptance:
- Returns state, last success time, last duration, last error.
Task 3.3: Add metadata fields to /achievements
Objective: Improve transparency.
Acceptance:
- Response includes
generated_at,is_stale, maybescan_id.
Phase 4 — Incremental Scanning (optional but recommended)
Task 4.1: Add per-session checkpoint file
Objective: Track session-level changes, not just global scan time.
Acceptance:
- Checkpoint persisted at
~/.hermes/plugins/hermes-achievements/scan_checkpoint.json. - For each session:
session_id, fingerprint (updated_at/message_count/hash), and cached contribution.
Task 4.2: Incremental aggregation
Objective: Recompute only changed/new sessions and reuse unchanged contributions.
Acceptance:
- Typical refresh time drops materially below full scan.
- Aggregate rebuild uses: subtract old contribution + add new contribution for changed sessions.
Task 4.3: Full rebuild fallback
Objective: Preserve correctness.
Acceptance:
- Manual full rescan always possible.
- Schema/version changes invalidate checkpoint and force full rebuild.
Test Plan
- Unit tests
- Snapshot lifecycle transitions
- Dedupe logic under parallel requests
/achievementsresponse compatibility
- Integration tests
- Opening Achievements repeatedly causes <=1 heavy scan while in-flight
/achievementswarm-cache load is fast- manual rescan updates snapshot and timestamps
- Manual benchmarks
- Compare pre/post
/achievementstimings with same history dataset
Rollout Plan
- Release internal branch with Phase 1 (remove overview/slots).
- Validate no UI regression in Achievements tab.
- Add Phase 2 snapshot/dedupe.
- Add Phase 3 stale-while-revalidate + status metadata.
- Optional: incremental scanner.
Rollback: keep old compute path behind temporary feature flag for one release window.
Definition of Done
- Achievements tab remains fully functional (counts, latest, tiers, cards, filters).
- No
/overviewendpoint or slot calls remain. - Repeated Achievements loads feel immediate after warm cache.
- Metrics/unlocks remain unchanged versus baseline.