The platform-wide Modules tab and its pointer card are gone

Before (f56e0081f4b, the merge's parent) and after (460f008224c, the merge), on the stage data source, with no company selected so no customer name is in frame.

20 Oct 2026 · branch origin · captured against propflow-stage · at 460f008224c+local

Data note. Every name and balance below comes from propflow-stage, which is anonymized by construction (ADR-0097/0110 — phones in the impossible +1000 NPA, emails @example.test). The identical capture against prod would carry real tenants' names and balances and is not safe to attach anywhere, which is why the generator refuses to run against one.

1 · Before · Access Inspector with three tabs

Before the merge: three tabs, Roles, Modules and Arms, and a subtitle saying Modules decides whether a feature is on for the account at all. The red 403 banner here and below is the capture persona being refused by the permissions API; it is not part of this change.

Asserted in the captured DOM — Access Inspector · Roles · Modules · Arms · feature turned on for the account at all? · No organization. The old three-tab strip and the old subtitle wording are in the captured DOM.

Before · Access Inspector with three tabs
Provenance. Captured from commit f56e0081f4b, read from the worktree the server was started from (/Users/miniclaw/code/PropFlow/propflowai/.claude/worktrees/gk-evidence-21552-before) — the server could not report its own commit, so this is the weaker of the two sources. That commit is already merged into origin/main.
Sections 2–5 and notes

2 · After · Access Inspector: two tabs, Roles and Arms

The tab strip now carries Roles and Arms only. The Modules tab edited a platform-wide module map that every company already overrides with its own complete row, so its writes changed no company (the PR's census: 7 of 7 companies have their own row, 0 differ). The subtitle is reworded to say modules are set per company, on the company's own page. The Roles tab's notes list makes the same point instead of pointing at a Modules tab.

This capture runs under the dev platform-admin persona, which the permissions API refuses (403), so the matrix shows a load error and dashes instead of toggles. The matrix values are not what this PR changed; the tab strip, subtitle and notes are, and they render regardless.

Asserted in the captured DOM — Access Inspector · Roles · Arms · feature turned on for the user's company (set on the company's own page)? · set per company on its · No organization. The title, both remaining tab labels, the reworded subtitle and the reworded Roles-tab note are in the captured DOM. 'No organization' is the closed company switcher in the corner: no company is selected, so no customer name is in frame.

After · Access Inspector: two tabs, Roles and Arms

3 · After · Access Inspector while its data is still loading

The permissions request is held open, so the page stays in its loading state. The title, the subtitle and the tab strip are static and render straight away; only the matrix cells wait on data. The strip shows the same two tabs as the loaded page, Roles and Arms. The route's separate loading.tsx ghost (shown during a server render) was changed the same way, Modules to Arms, and is pinned by admin/dev/__tests__/page-wrapper.dom.test.tsx; a held network request cannot keep that server-side frame on screen, so this capture shows the in-page loading state instead.

Asserted in the captured DOM — Access Inspector · Roles · Arms · feature turned on for the user's company (set on the company's own page)? · No organization. With the matrix data never answered, the heading, the reworded subtitle and the two tab labels are on screen.

After · Access Inspector while its data is still loading

4 · Before · Admin Settings opened on the Feature Modules card

The same page before the merge. The first card is Feature Modules, a static pointer whose only action was the link to the Access Inspector's Modules tab.

Asserted in the captured DOM — Feature Modules · Manage modules in the Access Inspector · Clara AI · SMS Messaging · No organization. The pointer card and its link text are present above the Clara AI section.

Before · Admin Settings opened on the Feature Modules card
Provenance. Captured from commit f56e0081f4b, read from the worktree the server was started from (/Users/miniclaw/code/PropFlow/propflowai/.claude/worktrees/gk-evidence-21552-before) — the server could not report its own commit, so this is the weaker of the two sources. That commit is already merged into origin/main.

5 · After · Admin Settings without the Feature Modules card

The Feature Modules card used to sit at the top of this page, above the toggle sections, and did nothing but link to the Access Inspector's Modules tab. With the tab gone the card had nothing to point at. The page now opens straight on the Clara AI and vendor notification toggles. Modules are still set per company on Admin → Customers, which the PR did not touch.

Asserted in the captured DOM — Admin Settings · Clara AI · SMS Messaging · Vendor Quote Emails · Vendor Dispatch Emails · No organization. The page heading and the toggle sections that now open the page are present, with the TEST company selected. The absence of the Feature Modules card is held by e2e/feature-flags.spec.ts, which asserts zero matches for 'Feature Modules'; this tool only checks presence.

After · Admin Settings without the Feature Modules card

What these captures do and do not prove

Before and after together show the change: the Modules tab and the Feature Modules card are present at the parent commit and gone at the merge, and the copy that pointed at them is reworded to say modules are set per company. The capture tool checks only that strings are present, so the absence on the after side is shown by the pictures and held in code by the PR's e2e spec (zero matches for 'Feature Modules') and the page-wrapper DOM test.

PropFlow Docs