Memory Status — one page, one truth (BL-428)
What this page is
OrbitPilot already tracked, in several different places, what it remembers about
you: a build card on the dashboard, small icons next to each Blink, and a line it
adds to its own answers when memory is out of date. The owner's own words on the
day this shipped: an update time that is silent about SCOPE — "updated today but
cannot access" — is a truthful sentence that still leaves you confused. The
Memory Status page (/orbitpilot/memory-status/) puts all of it on one
page: when memory last changed and how, every source currently in it with counts,
and — for anything missing — the honest reason why, in plain language.
What it shows
- Last update. The time memory last changed and the method — a full rebuild, a quick update, or an automatic/manual update from a single saved change — plus, if memory is stale, degraded, or has never been built, the exact sentence OrbitPilot would attach to an answer right now.
- In your memory. Every source with real content in memory — Blinks, Goals, Projects, Businesses, files, and more — with an item count and when it was last built.
- Not in your memory. Every other available source, each with an actionable reason: off site-wide, not on your plan (upgrading would add it), files waiting to be moved into the protected OrbitPilot Files folder, or simply not picked up by a build yet.
Where to find it
A "🧠 Memory status" link sits in the OrbitPilot chat window's bottom toolbar — the same row as New / History / Copy / This chat — so it is one click away from every conversation, docked or full-page. Guests see the same link, but it leads to account creation instead, since there is no personal memory to report on yet.
How this works — for admins
Nothing to configure today. The page is open to every signed-in user; a later
plan-gate (e.g. restricting it to higher tiers) is one Feature Registry row away —
register a Feature with key orbitpilot_memory_status_page
and assign or disable it, no code change needed.
Staff and superuser accounts see an extra notice on the page: their account
bypasses plan gates entirely (plans.services.get_effective_limits
hands staff every flag unconditionally), so what a staff account sees is not what a
same-plan non-staff user would see. This exists so an admin never mistakes their
own bypassed view for what a real user's page looks like.
How this works — for developers
orbitpilot/services.py::get_memory_status_page(user) is the entire
computation, and it AGGREGATES ONLY — it calls the exact same functions every other
surface already uses, so this page can never disagree with them:
get_last_build/get_last_completed_build,
memory_is_stale, build_notice.ask_honesty_note (BL-405,
returned verbatim), and resolve_build_sources + _plan_gate_reason
(#597 / BL-410-P1, the same reasons build_user_snapshot hands the model
mid-conversation). Per-source counts come from one GROUP BY over
OrbitPilotMemoryChunk, excluding get_rag_disabled_keys() the
same way pipeline/retrieve.py excludes them — a source an admin
switched off after it was built still has rows in the table, and this page must
not call those rows "in memory" when retrieval will never search them.
View: orbitpilot.views.orbitpilot_memory_status, URL name
orbitpilot_memory_status. Template:
orbitpilot/templates/orbitpilot/memory_status.html. Parity is pinned
by orbitpilot/test_memory_status_page.py — a test creates a real chunk
row and asserts the page's count equals a plain query over the same table, so the
page cannot silently start recomputing its own numbers.
Related pages
Docshub: "Per-Blink memory status icons" (BL-417, the same vocabulary and
wording family), "Your memory stays honest" (BL-405). docs/orbitpilot/TASKS.md.