Pure·AdminTech Stack · Feature Atlas
Design · Lane A · every figure queried live 9/1/26

Feature & Function Atlas — one view over six registries

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.

Registries joined 6Capability entries 786As of

The countWhat PURE can do, by register

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.

§1Where capability lives today

RegisterHoldsRowsSurface that shows itState

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).

§2Eleven upgrades the join makes visible

Each one is a count, not an opinion. Ordered by what it costs to leave alone.

§3The contract — one read, one scanner fix

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.
Why the scanner repair comes first. Every "how dynamic are we" number on this page rests on that scan. I made the identical mistake an hour earlier — grepping 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.

§4Who does what

Code 6 items

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).

Design 3 items

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.

Mike 1 call

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.