PURE knows what it can do — in six places that never meet. UI components, MCP tools, Poppy skills, admin tools, services, and a per-page scan each hold part of the answer, and no surface joins them. This atlas is that join: what capability exists, where it lives, which pages actually use it, and the eleven upgrades the join makes visible. Sibling of the Upgrade Register — that page tracks gaps we declared; this one finds them by counting.
Six registers, each authoritative for its own kind, none aware of the others. The totals are real; the overlap between them is unmeasured — that is finding 1.
| Register | Holds | Rows | Surface that shows it | State |
|---|
Adjacent and deliberately out of scope: pure_products / pure_store_products (98 sellable items, joined by mcp_catalog_unified — that RPC is the marketplace catalog, not the feature catalog, despite the name) · pure_nav_modules (474 nav rows — routes, not capabilities) · pure_module_settings (721 per-module settings).
Each one is a count, not an opinion. Ordered by what it costs to leave alone.
The atlas should not be a page that knows things. It should be a page that asks one question. Two pieces: a join RPC, and a repair to the scanner that feeds it.
-- FEATURE & FUNCTION ATLAS · one read over six registers · Design → Code 9/1/26
-- Gate 0 at birth: revoke first, grant deliberately.
create or replace function mcp_feature_atlas() returns jsonb
language sql stable security definer set search_path=public as $$
select jsonb_build_object('ok',true,
'as_of', to_char(now() at time zone 'America/Chicago','FMDay FMMM/FMDD/YY FMHH12:MI am')||' CT',
'registers', jsonb_build_array(
jsonb_build_object('key','components','label','UI components','n',(select count(*) from pure_components),
'live',(select count(*) from pure_components where status='live'),'surface','/pure-components'),
jsonb_build_object('key','mcp_tools','label','MCP tools','n',(select count(*) from pure_mcp_tools),
'live',(select count(*) from pure_mcp_tools where coalesce(enabled,true)),'surface',null),
jsonb_build_object('key','poppy_tools','label','Poppy skills','n',(select count(*) from pure_poppy_tools),'surface',null),
jsonb_build_object('key','admin_tools','label','Admin tools','n',(select count(*) from pure_admin_tools),'surface',null),
jsonb_build_object('key','services','label','Service catalog','n',(select count(*) from pure_service_catalog),'surface',null),
jsonb_build_object('key','page_scan','label','Scanned pages','n',(select count(*) from pure_page_features),
'live',(select count(*) from pure_page_features where is_live),'surface',null)),
'coverage', (select jsonb_build_object(
'live',count(*) filter (where is_live),
'parked',count(*) filter (where is_parked),
'live_no_rpc',count(*) filter (where is_live and jsonb_array_length(rpcs)=0),
'hardcoded_shell',count(*) filter (where is_live and has_hardcoded_shell),
'no_loader',count(*) filter (where is_live and not has_loader),
'scanned_at',max(scanned_at)) from pure_page_features),
'shared_rpcs', coalesce((select jsonb_agg(jsonb_build_object('rpc',rpc,'pages',pages) order by pages desc)
from (select jsonb_array_elements_text(rpcs) rpc, count(distinct path) pages
from pure_page_features where is_live group by 1 having count(distinct path)>5) s),'[]'::jsonb),
'orphans', (select mcp_orphaned_features()),
'dup_actions', (select mcp_feature_dup_scan())) $$;
revoke all on function mcp_feature_atlas() from public, anon;
grant execute on function mcp_feature_atlas() to authenticated, service_role;
-- SCANNER REPAIR (the number that is wrong today).
-- The scan records rpcs by matching URL literals, so any page using a helper —
-- rpc('mcp_identity_context',{}) — records ZERO rpcs and counts as static.
-- Proof: pure-meet.html scans as 0 rpcs and calls mcp_identity_context every 20 seconds.
-- Fix the detector to also match rpc('' and rpc("" then rescan;
-- until then live_no_rpc is an UPPER BOUND, not a count of static pages. upgrades.html for RPC URL literals, concluding it called none, and nearly rebuilding a page that was already wired. The register is not wrong because someone was careless; it is wrong because the question was asked in a way that could only find one kind of answer.mcp_feature_atlas() with Gate 0 at birth · the scanner detector fix + one rescan · grant the two locked detectors to authenticated · normalize pure_components.cat (nav→Navigation, display→Display) · set real status on the 61 components · retention on pure_standards_sweep (510,018 rows, U-16).
This page, live-wired the moment the RPC exists (fallback labelled until then) · register it in pure_pages + a nav row under Admin · the gap list lives in the Upgrade register (the stack report was retired 9/3; PURE-STACK.md keeps its text) so it points here instead of restating counts.
One ruling: should a capability be allowed to exist without a registered owner hat? Today most can. If the answer is no, that becomes a gate and roughly 700 rows need an owner before the next scan passes.