| — | Archetype-native topology— | Each of the 10 archetypes ships its own nav skeleton derived from its data spine, not a shared N-slot rail. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| — | Spine-derived nav— | Nav items generated mechanically from the archetype's spine nouns (case_workflow -> Cases, Deadlines, Documents). | inferredhypothesis-open | Backstage derives nav from PageBlueprint registration - mechanical derivation from declared structure is a shipped pattern |
| — | Stage-derived nav (workflow rail)— | For case_workflow, top-level nav is the state machine's stages, not entities. Nav IS the pipeline. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| — | Deadline-primary rail— | case_workflow shell leads with the deadline clock; nav sorted by time-to-breach, not entity type. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| — | Entity-derived nav— | Nav mirrors the top-level entities of the data model, one row each. | inferredhypothesis-open | Attio ships object-driven nav |
| — | Role-derived nav— | The rail is computed from the viewer's role; two roles in one product see two different rails. | inferredhypothesis-open | ISSO already ships agency vs model rails; SISOCRM defines a brokerage role matrix |
| — | Icon rail + contextual panel— | A narrow always-visible icon rail plus a wide contextual panel that changes per section. | inferredhypothesis-open | Zendesk, Intercom, Datadog, VS Code activity bar 48px |
| — | Dual rail— | Two rails: outer for app/section switching, inner for within-section nav. | inferredhypothesis-open | Front; VS Code activity bar + sidebar |
| — | Command-palette-primary— | Minimal visible nav; the palette is the primary navigation surface. | inferredhypothesis-open | Linear, VS Code |
| — | Zero-nav single surface— | One surface, no rail; all movement is via in-content links and search. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| — | Top-bar topology— | Horizontal top nav instead of a rail, freeing full width for the app pane. | inferredhypothesis-open | Salesforce Lightning, ServiceNow, Xero, Metabase |
| — | Hybrid top + rail— | Top bar for global/product switching, rail for within-product nav. | inferredhypothesis-open | Jira, Shopify, HubSpot |
| — | Tile/launchpad home— | Home is a tile grid of entry points rather than a dashboard. | inferredhypothesis-open | SAP Fiori launchpad |
| — | Fixed N with N per archetype— | Keep the fixed-tuple discipline but let N be set per archetype rather than globally 5. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| — | Nav budget cap, not schema— | Replace the fixed 5-tuple with a soft cap (5-7) enforced at generation time and warned, not typed. | inferredhypothesis-open | IBM Carbon publishes 'more than five secondary items' as its left-panel rule |
| — | Depth limit of two— | No third tier of navigation anywhere; forced flattening or in-page nav below tier 2. | inferredhypothesis-open | Carbon: 'The left panel does not support three tiers of navigation' |
| — | Search-primary with thin rail— | Search box is the largest element; rail exists only for orientation. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| — | Object-switcher rail— | Rail rows are data objects the user has pinned, not fixed product areas. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| — | Two shells per product— | Ship a separate internal shell and external shell rather than one shell with role gating. | inferredhypothesis-open | ISSO already ships agency vs model vs client vs portal route groups |
| — | Rail as status surface— | Rail items carry live counts/stats so the rail doubles as an at-a-glance status board. | inferredhypothesis-open | ISSO summaryItems already carry stat strings |
| — | Fixed 320px host rail— | Host rail specified as 320px at >=1056px viewport, not as a percentage. | inferredhypothesis-open | Zendesk 320, Grafana 320, Metabase 324 - three independent corroborations |
| 3 | Collapse-rate as the verdict— | Ship the rail collapsible with per-user memory; permanent-collapse rate decides whether it earned its pixels. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| — | Proportional rail with cap— | Rail width = min(320px, viewport/4) rather than a flat constant. | inferredhypothesis-open | VS Code layout.ts:3026 - the only proportional rule found in the corpus |
| — | Host rail carries only host-owned surfaces— | The rail holds identity, tenant, settings, search, notifications - nothing else; all app nav is in the pane. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| — | Host puck instead of rail— | Collapse host-owned controls into a small persistent puck; give the rail's pixels to the app. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| — | Top host bar, no rail— | Host identity/settings/search live in a thin top bar; the entire width below is the app pane. | inferredhypothesis-open | Metabase app bar 52px; Stripe, Vercel |
| — | Adaptive rail width per archetype— | scheduling and inventory get a narrow rail (calendar/grid want width); case_workflow gets a wide one. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| — | Rail collapses by viewport class, not px— | Switch rail/icon-rail/bottom-bar by window size class rather than raw pixel breakpoints. | inferredhypothesis-open | Material 3 switches by window size class; Polaris and Primer both switch at 768px |
| — | Donor pane must never be less than 1024px effective— | Guarantee the app pane a minimum usable width; the rail yields first. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| — | Rail hover-flyout when collapsed— | Collapsed rail expands on hover rather than requiring a click. | inferredhypothesis-open | Atlassian collapses to a 20px stub with a 240px hover flyout |
| — | Host owns identity absolutely— | No donor may present a login, signup, or account UI; host injects session at the donor's auth seam. | observedadopt-as-contract | TEABLE-ABSORPTION-BRIEF success criteria 1 and 4; Luigi host-holds-token pattern |
| — | Settings as host route, donor settings as sections— | Host owns /settings; each donor's settings become a section inside it, never a peer nav item. | inferredhypothesis-open | FROZEN-PAGE-SKELETON gives Settings one host page with a module registry |
| — | Settings in a separate console— | Follow Salesforce/Zendesk: admin is a separate console, not competing for a nav slot. | inferredhypothesis-open | Salesforce Setup, Zendesk Admin Center, Metabase /admin |
| — | Host-owned global search across donors— | One search surface federating donor indexes. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| — | Host-owned notification spine— | All donor events normalize into one host notification model with host-coordinate deep links. | inferredhypothesis-open | SISOCRM consumes donor events into SISO-owned tables via Svix + event envelope |
| — | Host-owned tenant switch— | Tenant/workspace switching is host-only; donors receive tenant context and cannot change it. | inferredhypothesis-open | OWNERSHIP-AND-DATA-LAYER-DECISIONS: one server, separate schemas |
| — | Theming tokens flow host->donor only— | Host publishes tokens; donors consume them. No donor ships its own theme. | observedhypothesis-open | qiankun documents style isolation as one-way: host CSS enters the donor regardless |
| — | Host-owned empty and error states— | Donor empty/error states are replaced with host ones so failures look like one product. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| — | Host-owned onboarding— | No donor onboarding, tour, or welcome modal ever renders. | inferredhypothesis-open | MASTER-SYNTHESIS names replacing donor onboarding as typical adaptation |
| — | Host-owned keyboard map— | Host reserves a keyboard namespace; donors may not bind conflicting global shortcuts. | inferredhypothesis-open | ISSO already reserves Cmd1-Cmd5 for rail sections |
| — | Route re-mount with basename— | Mount the donor under a host path prefix using its documented basename option. | observedcandidate | react-admin <Admin basename>; Grafana serve_from_sub_path; Next.js inlines basePath at build time |
| — | Nav registry injection— | Donor declares nav intent; host renders it in host chrome and owns ordering. | observedcandidate | Backstage PageBlueprint auto-discovery; Piral registerMenu; Grafana addToNav boolean |
| — | Host-declared nav config (donor declares nothing)— | Host config enumerates every nav node including donor view URLs. | observedcandidate | Luigi navigation.nodes with viewUrl and virtualTree |
| — | iframe isolation with host rail— | Donor runs in an iframe; host provides the rail around it. | observedfallback-only | wujie documents modal confinement; MDN Storage Access API requires transient activation; Firefox partitions since 103 |
| — | Reverse-proxy chrome stripping— | Strip donor chrome at the proxy by rewriting HTML in flight. | observedreject | Apache: will not rewrite URL references inside HTML pages by default; mod_proxy_html has no knowledge of URLs within embedded script |
| — | Web Component / shadow DOM isolation— | Mount the donor inside a custom element, optionally shadowed. | observedconditional | jd-opensource/micro-app docs; WHATWG same-root requirement for ARIA references |
| — | Headless donor, host renders UI— | Take the donor's engine and API only; rebuild every surface in host components. | inferredcandidate-for-some | Refine, Tremor, Cube have no chrome to strip |
| 6 | Donor as embedded surface inside a host page— | Donor renders as a component within a host-owned workflow page and is never a nav destination. | observedprimary-candidate | TEABLE-ABSORPTION-BRIEF: 'Teable is NOT a page'; FROZEN-PAGE-SKELETON folds donors under 11 host pages |
| — | Donor as whole-slice page under host rail— | One host nav row hands the entire page to the donor, which keeps its internal nav below the rail. | observedcandidate | FROZEN-PAGE-SKELETON: Tasks = Plane (whole-slice); Grafana /a/<id>/* nesting |
| 8 | RouteRef indirection for donor links— | Donors declare routing targets, never URLs; host binds targets to concrete paths in config. | observedadopt-as-contract | Backstage RouteRef and ExternalRouteRef bound in app-config.yaml |
| 1 | Donor admission test as a gate— | Four binary questions per donor answered by real attempts, not doc reads, before any absorption work. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| — | MountProfile per donor— | Record sub-path support, path-substitution timing, auth seam, chrome-disable mechanism, and licence constraint per donor. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| — | Never let a donor pick a numeric position— | Donors declare intent (label, icon, routeRef); the host assigns order. | observedadopt-as-contract | WordPress $position collisions patched by MD5 hash offset; Grafana addToNav boolean; Shopify s-app-nav |
| — | Server-driven donor surfaces— | Donor returns JSON describing its UI; host renders every pixel. | inferredhypothesis-open | Intercom Canvas Kit, Slack Block Kit |
| — | Host component library for donors— | Donors write declarative UI against host tokens and components. | inferredhypothesis-open | Atlassian Forge UI Kit, HubSpot UI extensions, Retool |
| — | Closed surface catalogue— | Host enumerates every legal donor surface; anything not listed is impossible. | inferredhypothesis-open | Atlassian Forge module types; Zendesk ticket_sidebar/nav_bar/top_bar/modal |
| — | Admit no donor UI at all— | Donors contribute data and actions; the host renders 100% of the interface. | observedlive-option | AWS Console admits no third-party embedded UI |
| 7 | Licence gate before chrome work— | Read the LICENSE body before planning any chrome removal. | observedadopt-as-contract | NocoBase 5.2 forbids removing branding; Directus MSCL forbids circumventing the licence key |
| — | Earned nav— | Rail items appear only once the user has the data or permission to use them. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| — | Usage-ranked nav— | Rail order adapts to per-user click frequency. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| — | Stage-gated nav— | For case_workflow, nav reveals stages as the case advances. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| — | Empty-state-aware nav— | Sections with zero records show a setup affordance rather than an empty list. | inferredhypothesis-open | Common SaaS pattern; not verified in this run |
| — | Onboarding rail vs steady-state rail— | A different, smaller rail for the first N sessions. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| — | Pinned + overflow— | A short pinned set plus a 'more' surface holding everything else. | inferredhypothesis-open | Azure Portal favourites; common pattern |
| — | Role-progressive disclosure— | Nav grows with the user's permissions rather than their tenure. | inferredhypothesis-open | SISOCRM defines a brokerage role matrix with confidentiality overrides |
| — | Vocabulary skinning layer— | One shell, one spine, per-industry entity names supplied as a config. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| 5 | Vocabulary-isomorphism test— | Compare state machines, deadline rules and document sets across the six case_workflow industries after renaming. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| — | Vocabulary as the only differentiator (null hypothesis)— | The six case_workflow industries differ ONLY in vocabulary. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| — | Configurable stage machine— | Stages, transitions and authority are data, not code. | inferredhypothesis-open | b2b shelf: the state machine and who may advance it is what differentiates case_workflow |
| — | Deadline-rule engine as the product— | The defensible asset for case_workflow is the deadline computation, not the shell. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| — | Per-industry document set templates— | Ship the required document set per industry as a template. | inferredhypothesis-open | b2b shelf names document set as part of the case_workflow spine |
| — | Mobile-first shell for field_operations— | field_operations gets a distinct mobile shell: bottom bar, camera-first, one-handed reach. | inferredhypothesis-open | b2b shelf: offline capture and evidence as first-class data |
| — | Offline-capable shell— | Shell and nav function with no network; queued writes surface in the rail. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| — | Bottom bar below 768px— | Rail becomes a bottom bar or full-width overlay under 768px. | inferredhypothesis-open | Polaris nav becomes full-width overlay below 768; Primer panes 100% width below 768 |
| — | Donor mobile behaviour is unowned risk— | Donor responsive behaviour cannot be assumed and must be tested per donor per breakpoint. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| — | Portal shell is minimal by requirement— | The portal shell carries almost no chrome - no internal nav, no global search, no tenant switch. | inferredhypothesis-open | b2b shelf: a portal is an authorization product before it is a UI |
| — | Touch target floor in the rail— | Rail items meet a minimum touch target on all devices. | inferredhypothesis-open | Material 3 rail tokens; standard accessibility guidance |
| — | Machine-readable nav manifest— | The shell emits a manifest of every nav node, route and required capability that an agent can traverse. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| 9 | Nav derived from route registration— | Nav cannot drift from routes because it is derived from them. | observedadopt-as-contract | Backstage removed NavItemBlueprint in favour of deriving nav from PageBlueprint title/icon |
| — | Deep-link addressability contract— | Every meaningful state has a URL an agent can navigate to directly. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| — | data-verify attributes on nav— | Every nav node carries a stable machine-readable identifier for verification. | inferredhypothesis-open | Local verifiable-frontend work uses a data-verify-* contract with window.__verify, DEV-only |
| — | Nav as a testable artifact— | Nav topology is asserted in tests: budget cap, depth limit, no orphan routes, no dead links. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| — | Agent-operable settings— | Settings are addressable and settable through the same contract as nav. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| — | Shell as a compiled artifact— | The builder emits shell source that is then owned and editable. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| — | Shell as runtime config— | The shell is data interpreted at runtime; regeneration is a config swap. | inferredhypothesis-open | Luigi is fully config-driven navigation |
| 4 | Determinism check— | Run the generator twice on identical inputs and diff byte-for-byte. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| — | Shell diffing across regenerations— | Show the client what changed in the shell between generations. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| — | Visual side-nav variant chooser— | The client picks a rail variant visually from a small set. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| — | Route stability across regeneration— | URLs survive shell regeneration so links and bookmarks do not rot. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| — | Golden shell corpus— | A fixed set of input specs with expected shell outputs as regression tests. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| — | Generation-time nav budget enforcement— | The generator refuses to emit a shell exceeding the budget cap or depth limit. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| — | Nav budget cap as policy— | A hard maximum on top-level rail items, enforced and reported. | inferredhypothesis-open | IBM Carbon left-panel rule |
| — | Depth limit as policy— | Maximum two tiers of navigation anywhere in a generated shell. | inferredhypothesis-open | Carbon: left panel does not support three tiers |
| — | Donor nav admission rule— | A donor gets a nav row only if it is a destination, not a capability. | inferredadopt-as-contract | TEABLE-ABSORPTION-BRIEF; FROZEN-PAGE-SKELETON gives exactly one whole-slice donor |
| — | At most two whole-slice donors per product— | Cap the number of donors that get their own page and internal nav. | hypothesishypothesis-open | P08 innovation lane, 2026-08-27 |
| 2 | Retire the fixed five-tuple type— | Replace the compile-time 5-tuple with a validated variable-length list. | observedrecommended | sidebar-factory.tsx:19-25 types sections as a fixed five-element tuple |
| — | Slot ids must be semantic— | Nav slot identifiers must name the work, not a positional product id. | observedrecommended | ISSO 'recon' means Team in one rail and Tasks in another; 'content-gen' means Tools and Insights |
| — | One owner per nav row— | Every rail row has exactly one owning system; no shared rows. | inferredhypothesis-open | OWNERSHIP-AND-DATA-LAYER-DECISIONS: one owner per table, never two |
| 10 | Do not build marketplace— | The marketplace archetype has zero demand anchor and should not be built speculatively. | observedrecommended | b2b shelf: marketplace is primary for none and secondary for none across 17 industries |
| — | Two rail width classes, not a continuum— | Rail widths cluster into two functional classes rather than a continuum: ~160px forces donors to flatten their nav and use flyouts, while ~320px is wide enough to host a donor's nested nav inline. Choosing a width is therefore choosing whether donors may keep hierarchy. | inferredhypothesis-open | WordPress #adminmenu 160px vs Zendesk 320 / Grafana 320 / Metabase 324 |