test(e2e): automated per-page control census (Phase 7, IMP-CODE-07)

QA_PLAN Appendix E was never filled in manually — Cycle 1 signed off on
playbooks alone, which is how the WebAuthn ghost feature hid. This spec
enumerates every visible interactive control (role + accessible name) on
all 15 authed pages and snapshots the normalized, deduped, sorted list;
a new/removed/renamed control is now a reviewable diff every probe run.
Numbers normalize to '#' (dates/amounts/counts), and a self-stabilizing
settle loop samples the control count until steady (fixed waits raced
the data queries). Probe suite: 33 passed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
null 2026-07-10 18:21:46 -05:00
parent db539545e3
commit 92439e74e6
17 changed files with 799 additions and 1 deletions

View File

@ -0,0 +1,99 @@
// Automated per-page control census (QA_PLAN Appendix E / IMP-CODE-07).
// Replaces the never-filled manual census tables: every interactive control on
// each page is enumerated (role + accessible name) and snapshotted, so a new,
// removed, or renamed control shows up as a reviewable diff each cycle instead
// of relying on a hand-maintained ledger. Numbers are normalized to '#' so
// dates/amounts/counts don't churn the snapshots; the list is deduped + sorted
// so ordering and per-row repetition don't either.
const { test, expect } = require('@playwright/test');
const { STORAGE_STATE } = require('./constants');
test.use({ storageState: STORAGE_STATE });
const PAGES = [
['tracker', '/'],
['calendar', '/calendar'],
['summary', '/summary'],
['bills', '/bills'],
['subscriptions', '/subscriptions'],
['categories', '/categories'],
['health', '/health'],
['analytics', '/analytics'],
['spending', '/spending'],
['banking', '/bank-transactions'],
['snowball', '/snowball'],
['payoff', '/payoff'],
['data', '/data'],
['settings', '/settings'],
['profile', '/profile'],
];
const CONTROL_SELECTOR = [
'button',
'a[href]',
'input',
'select',
'textarea',
'[role="button"]',
'[role="link"]',
'[role="tab"]',
'[role="switch"]',
'[role="checkbox"]',
'[role="menuitem"]',
'[role="combobox"]',
].join(', ');
for (const [name, path] of PAGES) {
test(`control census: ${name}`, async ({ page }) => {
await page.goto(path);
await page.waitForLoadState('domcontentloaded');
// Self-stabilizing settle: sample the control count until it is non-trivial
// and unchanged across two consecutive samples (fixed timeouts race the
// data queries; networkidle is flaky with background refetches).
let prev = -1;
for (let i = 0; i < 20; i++) {
const count = await page.locator(CONTROL_SELECTOR).count();
if (count > 3 && count === prev) break;
prev = count;
await page.waitForTimeout(500);
}
const controls = await page.$$eval(CONTROL_SELECTOR, (els) =>
els
.filter((el) => {
const style = window.getComputedStyle(el);
return style.display !== 'none' && style.visibility !== 'hidden';
})
.map((el) => {
const role =
el.getAttribute('role') ||
(el.tagName === 'A'
? 'link'
: el.tagName === 'INPUT'
? `input:${el.getAttribute('type') || 'text'}`
: el.tagName.toLowerCase());
const name =
el.getAttribute('aria-label') ||
el.getAttribute('placeholder') ||
(el.textContent || '').trim().replace(/\s+/g, ' ').slice(0, 60) ||
el.getAttribute('title') ||
'(unnamed)';
return `${role} | ${name}`;
}),
);
const normalized = [
...new Set(
controls.map((c) =>
c
.replace(/\d[\d,.]*/g, '#') // dates, amounts, counts
.replace(/#\s*(am|pm)/gi, '# $1'),
),
),
]
.sort()
.join('\n');
expect(normalized).toMatchSnapshot(`census-${name}.txt`);
});
}

View File

@ -0,0 +1,23 @@
button | Current theme: Dark. Click to change.
button | Open Tanstack query devtools
button | Open user menu
button | Print
button | Print / Save PDF
button | Refresh
button | Reset filters
button | Search billsCtrl K
button | Tracker#
input:checkbox | (unnamed)
input:number | (unnamed)
link | About
link | Analytics
link | Bill Tracker
link | Calendar
link | Release Notes
link | Skip to main content
select | # months# months# months
select | # months# months# months# months
select | All bills<script>alert(#)</script>Adobe Creative CloudAmazon
select | All categoriesBeautyCoffeeCredit CardsDining OutEntertainmen
select | JanuaryFebruaryMarchAprilMayJuneJulyAugustSeptemberOctoberNo
select | LineArea

View File

@ -0,0 +1,12 @@
button | Current theme: Dark. Click to change.
button | Open Tanstack query devtools
button | Open user menu
button | Search billsCtrl K
button | Tracker#
link | About
link | Analytics
link | Bill Tracker
link | Calendar
link | Open Data
link | Release Notes
link | Skip to main content

View File

@ -0,0 +1,107 @@
button | #st bucket
button | #th bucket
button | <script>alert(#)</script>
button | AMC A-List
button | Add Bill
button | Adobe Creative Cloud
button | Amazon Prime
button | Apple iCloud+
button | Autopay
button | Big
button | Cadence
button | Capital One Quicksilver
button | Car Insurance
button | Car Payment
button | Cell Phone
button | Chase Freedom
button | City Water Dept
button | Current theme: Dark. Click to change.
button | Custom
button | Deactivate
button | Debt
button | Delete
button | Dental Insurance
button | Discover It Card
button | Display options
button | Duplicate
button | Edit
button | Electric Company
button | Gas Utility
button | Gym Membership
button | Health Insurance
button | Homeowners Insurance
button | Inactive
button | Internet Provider
button | Mortgage
button | Move <script>alert(#)</script> down
button | Move <script>alert(#)</script> up
button | Move AMC A-List down
button | Move AMC A-List up
button | Move Adobe Creative Cloud down
button | Move Adobe Creative Cloud up
button | Move Amazon Prime down
button | Move Amazon Prime up
button | Move Apple iCloud+ down
button | Move Apple iCloud+ up
button | Move Big down
button | Move Big up
button | Move Capital One Quicksilver down
button | Move Capital One Quicksilver up
button | Move Car Insurance down
button | Move Car Insurance up
button | Move Car Payment down
button | Move Car Payment up
button | Move Cell Phone down
button | Move Cell Phone up
button | Move Chase Freedom down
button | Move Chase Freedom up
button | Move City Water Dept down
button | Move City Water Dept up
button | Move Dental Insurance down
button | Move Dental Insurance up
button | Move Discover It Card down
button | Move Discover It Card up
button | Move Electric Company down
button | Move Electric Company up
button | Move Gas Utility down
button | Move Gas Utility up
button | Move Gym Membership down
button | Move Gym Membership up
button | Move Health Insurance down
button | Move Health Insurance up
button | Move Homeowners Insurance down
button | Move Homeowners Insurance up
button | Move Internet Provider down
button | Move Internet Provider up
button | Move Mortgage down
button | Move Mortgage up
button | Move Netflix down
button | Move Netflix up
button | Move Spotify down
button | Move Spotify up
button | Move Student Loan down
button | Move Student Loan up
button | Move Trash Service down
button | Move Trash Service up
button | Move Zero down
button | Move Zero up
button | Netflix
button | Open Tanstack query devtools
button | Open user menu
button | Search & filters# of # shown · no filters
button | Search billsCtrl K
button | Spotify
button | Student Loan
button | Tracker#
button | Trash Service
button | Zero
combobox | Filter by billing schedule
combobox | Filter by category
combobox | Use a bill template
input:text | Search bills by name, category, notes, or amount
link | About
link | Analytics
link | Bill Tracker
link | Calendar
link | Release Notes
link | Skip to main content

View File

@ -0,0 +1,19 @@
button | Current theme: Dark. Click to change.
button | Next month
button | Open Tanstack query devtools
button | Open user menu
button | Previous month
button | Refresh calendar
button | Search billsCtrl K
button | Subscribe Calendar
button | Today
button | Tracker#
button | View #/#/#
link | About
link | Analytics
link | Bill Tracker
link | Calendar
link | Edit money plan
link | Open Snowball
link | Release Notes
link | Skip to main content

View File

@ -0,0 +1,62 @@
button | Add
button | Current theme: Dark. Click to change.
button | Delete Credit Cards
button | Delete Entertainment
button | Delete Healthcare
button | Delete Housing
button | Delete Insurance
button | Delete Loans
button | Delete Subscriptions
button | Delete Utilities
button | Enable spending for Credit Cards
button | Enable spending for Entertainment
button | Enable spending for Healthcare
button | Enable spending for Housing
button | Enable spending for Insurance
button | Enable spending for Loans
button | Enable spending for Subscriptions
button | Enable spending for Utilities
button | Expand Credit Cards
button | Expand Entertainment
button | Expand Healthcare
button | Expand Housing
button | Expand Insurance
button | Expand Loans
button | Expand Subscriptions
button | Expand Utilities
button | Move Credit Cards down
button | Move Credit Cards up
button | Move Entertainment down
button | Move Entertainment up
button | Move Healthcare down
button | Move Healthcare up
button | Move Housing down
button | Move Housing up
button | Move Insurance down
button | Move Insurance up
button | Move Loans down
button | Move Loans up
button | Move Subscriptions down
button | Move Subscriptions up
button | Move Utilities down
button | Move Utilities up
button | Open Tanstack query devtools
button | Open user menu
button | Rename Credit Cards
button | Rename Entertainment
button | Rename Healthcare
button | Rename Housing
button | Rename Insurance
button | Rename Loans
button | Rename Subscriptions
button | Rename Utilities
button | Search billsCtrl K
button | Show Empty
button | Tracker#
input:text | New category name...
link | About
link | Analytics
link | Bill Tracker
link | Calendar
link | Release Notes
link | Skip to main content

View File

@ -0,0 +1,16 @@
button | Bank syncConnect & sync your bank
button | Current theme: Dark. Click to change.
button | Export & backupsDownload & restore
button | Import data
button | ImportBring in existing data
button | Open Tanstack query devtools
button | Open user menu
button | Search billsCtrl K
button | Tracker#
button | TransactionsReview & match
link | About
link | Analytics
link | Bill Tracker
link | Calendar
link | Release Notes
link | Skip to main content

View File

@ -0,0 +1,14 @@
button | Active Bills Only
button | Current theme: Dark. Click to change.
button | Open Bill
button | Open Tanstack query devtools
button | Open user menu
button | Refresh
button | Search billsCtrl K
button | Tracker#
link | About
link | Analytics
link | Bill Tracker
link | Calendar
link | Release Notes
link | Skip to main content

View File

@ -0,0 +1,20 @@
button | Current theme: Dark. Click to change.
button | Interest Rate: help
button | Interest Savings: help
button | Open Tanstack query devtools
button | Open user menu
button | Print
button | Required Minimum: help
button | Search billsCtrl K
button | Time Savings: help
button | Tracker#
button | ▲
button | ▼
combobox | Capital One Quicksilver$#
input:number | #
link | About
link | Analytics
link | Bill Tracker
link | Calendar
link | Release Notes
link | Skip to main content

View File

@ -0,0 +1,23 @@
button | Add key
button | Change Password
button | Current theme: Dark. Click to change.
button | Last LoginJul # # #:# PMDesktop · Chrome on Linux#
button | Open Tanstack query devtools
button | Open user menu
button | Save Privacy Settings
button | Save Profile
button | Search billsCtrl K
button | Set up
button | Tracker#
input:password | (unnamed)
input:text | Display name
link | About
link | Account
link | Analytics
link | Bill Tracker
link | Calendar
link | Privacy
link | Release Notes
link | Security
link | Skip to main content
switch | (unnamed)

View File

@ -0,0 +1,41 @@
button | Copy URL
button | Currency: help
button | Current theme: Dark. Click to change.
button | Dark
button | Due soon window: help
button | Grace period: help
button | Light
button | Open Tanstack query devtools
button | Open user menu
button | Price change sensitivity: help
button | Reduce motion: help
button | Regenerate URL
button | Revoke Feed
button | Search billsCtrl K
button | Send test
button | System
button | Theme: help
button | Tracker#
combobox | MM/DD/YYYY
combobox | Sunday
combobox | Tracker
combobox | USD — US Dollar
input:email | you@example.com
input:number | (unnamed)
input:text | Calendar feed URL
link | About
link | Analytics
link | Bill Tracker
link | Calendar
link | Preview ICS
link | Release Notes
link | Skip to main content
switch | (unnamed)
switch | Ask to import past payments when linking
switch | Reduce motion
switch | Show Bank Projection Banner
switch | Show Drift insights
switch | Show Overdue Command Center
switch | Show Safe to Spend
switch | Show Search and sort
switch | Show Summary cards

View File

@ -0,0 +1,37 @@
button | $#
button | $# emergency fund
button | Complete
button | Current on bills
button | Current theme: Dark. Click to change.
button | Edit bill
button | Hide from Snowball
button | Move Capital One Quicksilver down
button | Move Capital One Quicksilver up
button | Move Car Payment down
button | Move Car Payment up
button | Move Cell Phone down
button | Move Cell Phone up
button | Move Chase Freedom down
button | Move Chase Freedom up
button | Move Discover It Card down
button | Move Discover It Card up
button | Move Student Loan down
button | Move Student Loan up
button | My Debt SnowballActiveStarted Jul # · just started in#%
button | New Plan
button | Open Tanstack query devtools
button | Open user menu
button | Pause
button | Restore Ramsey Order
button | Save Order
button | Search billsCtrl K
button | Toggle plan details
button | Tracker#
input:number | #
link | About
link | Analytics
link | Bill Tracker
link | Calendar
link | Release Notes
link | Skip to main content
switch | (unnamed)

View File

@ -0,0 +1,29 @@
button | Budget: $#
button | Coffee
button | Coffee$# transactionavg $#/mo$# left
button | Copy last month
button | Current theme: Dark. Click to change.
button | Dining Out
button | Dining Out$# transactionsavg $#/mo$# left
button | Gas & Fuel
button | Gas & Fuel$# transactionavg $#/mo$# left
button | Groceries
button | Groceries$# transactionsavg $#/mo$# left
button | Merchant Rules
button | Next month
button | Open Tanstack query devtools
button | Open user menu
button | Previous month
button | Search billsCtrl K
button | Shopping
button | Shopping$# transactionavg $#/mo$# left
button | Tracker#
button | Uncategorized
button | Uncategorized$# transaction
button | View
link | About
link | Analytics
link | Bill Tracker
link | Calendar
link | Release Notes
link | Skip to main content

View File

@ -0,0 +1,54 @@
button | AMC A-List
button | Add Subscription
button | Adobe Creative Cloud
button | Amazon Prime
button | Apple iCloud+
button | Cadence
button | Current theme: Dark. Click to change.
button | Custom
button | Edit
button | Gym Membership
button | More actions for AMC A-List
button | More actions for Adobe Creative Cloud
button | More actions for Amazon Prime
button | More actions for Apple iCloud+
button | More actions for Gym Membership
button | More actions for Netflix
button | More actions for Spotify
button | More recommendation actions
button | Move AMC A-List down
button | Move AMC A-List up
button | Move Adobe Creative Cloud down
button | Move Adobe Creative Cloud up
button | Move Amazon Prime down
button | Move Amazon Prime up
button | Move Apple iCloud+ down
button | Move Apple iCloud+ up
button | Move Gym Membership down
button | Move Gym Membership up
button | Move Netflix down
button | Move Netflix up
button | Move Spotify down
button | Move Spotify up
button | Netflix
button | Open Tanstack query devtools
button | Open user menu
button | Refresh
button | Search billsCtrl K
button | Search recommendations# of # shown · no filters
button | Search subscriptions# of # shown · no filters
button | Search transactionsall bank transactions · no filters
button | Spotify
button | Track Subscription
button | Tracker#
button | View recommendation details
input:search | Search by merchant, description, or payee…
input:search | Search recommendations…
input:text | Search subscriptions…
link | About
link | Analytics
link | Bill Tracker
link | Calendar
link | Release Notes
link | Service Catalog
link | Skip to main content

View File

@ -0,0 +1,64 @@
button | Current theme: Dark. Click to change.
button | Edit
button | Move <script>alert(#)</script> down
button | Move <script>alert(#)</script> up
button | Move AMC A-List down
button | Move AMC A-List up
button | Move Adobe Creative Cloud down
button | Move Adobe Creative Cloud up
button | Move Apple iCloud+ down
button | Move Apple iCloud+ up
button | Move Big down
button | Move Big up
button | Move Capital One Quicksilver down
button | Move Capital One Quicksilver up
button | Move Car Insurance down
button | Move Car Insurance up
button | Move Car Payment down
button | Move Car Payment up
button | Move Cell Phone down
button | Move Cell Phone up
button | Move Chase Freedom down
button | Move Chase Freedom up
button | Move City Water Dept down
button | Move City Water Dept up
button | Move Dental Insurance down
button | Move Dental Insurance up
button | Move Discover It Card down
button | Move Discover It Card up
button | Move Electric Company down
button | Move Electric Company up
button | Move Gas Utility down
button | Move Gas Utility up
button | Move Gym Membership down
button | Move Gym Membership up
button | Move Health Insurance down
button | Move Health Insurance up
button | Move Internet Provider down
button | Move Internet Provider up
button | Move Mortgage down
button | Move Mortgage up
button | Move Netflix down
button | Move Netflix up
button | Move Spotify down
button | Move Spotify up
button | Move Student Loan down
button | Move Student Loan up
button | Move Trash Service down
button | Move Trash Service up
button | Move Zero down
button | Move Zero up
button | Next month
button | Open Tanstack query devtools
button | Open user menu
button | Previous month
button | Print / PDF
button | Search billsCtrl K
button | Today
button | Tracker#
link | About
link | Analytics
link | Bill Tracker
link | Calendar
link | Release Notes
link | Skip to main content

View File

@ -0,0 +1,178 @@
button | #/#/#
button | #st bucket
button | #th bucket
button | $#
button | Add
button | Add bill
button | Asc
button | Autopay
button | Bill
button | Columns
button | Current theme: Dark. Click to change.
button | Debt
button | Due
button | Due Soon, click to mark paid
button | Edit <script>alert(#)</script>
button | Edit AMC A-List
button | Edit Adobe Creative Cloud
button | Edit Apple iCloud+
button | Edit Big
button | Edit Capital One Quicksilver
button | Edit Car Insurance
button | Edit Car Payment
button | Edit Cell Phone
button | Edit Chase Freedom
button | Edit City Water Dept
button | Edit Dental Insurance
button | Edit Discover It Card
button | Edit Electric Company
button | Edit Gas Utility
button | Edit Gym Membership
button | Edit Health Insurance
button | Edit Internet Provider
button | Edit Mortgage
button | Edit Netflix
button | Edit Spotify
button | Edit Student Loan
button | Edit Trash Service
button | Edit Zero
button | Edit monthly starting amounts
button | Expected
button | Export or print this month
button | Hide
button | Hide overdue panel
button | Keyboard shortcuts
button | Last Month
button | Late, click to mark paid
button | Move <script>alert(#)</script> down
button | Move <script>alert(#)</script> up
button | Move AMC A-List down
button | Move AMC A-List up
button | Move Adobe Creative Cloud down
button | Move Adobe Creative Cloud up
button | Move Apple iCloud+ down
button | Move Apple iCloud+ up
button | Move Big down
button | Move Big up
button | Move Capital One Quicksilver down
button | Move Capital One Quicksilver up
button | Move Car Insurance down
button | Move Car Insurance up
button | Move Car Payment down
button | Move Car Payment up
button | Move Cell Phone down
button | Move Cell Phone up
button | Move Chase Freedom down
button | Move Chase Freedom up
button | Move City Water Dept down
button | Move City Water Dept up
button | Move Dental Insurance down
button | Move Dental Insurance up
button | Move Discover It Card down
button | Move Discover It Card up
button | Move Electric Company down
button | Move Electric Company up
button | Move Gas Utility down
button | Move Gas Utility up
button | Move Gym Membership down
button | Move Gym Membership up
button | Move Health Insurance down
button | Move Health Insurance up
button | Move Internet Provider down
button | Move Internet Provider up
button | Move Mortgage down
button | Move Mortgage up
button | Move Netflix down
button | Move Netflix up
button | Move Spotify down
button | Move Spotify up
button | Move Student Loan down
button | Move Student Loan up
button | Move Trash Service down
button | Move Trash Service up
button | Move Zero down
button | Move Zero up
button | Next month
button | Open Tanstack query devtools
button | Open calendar for this month
button | Open user menu
button | Overdue
button | Paid
button | Paid Date
button | Paid, click to mark unpaid
button | Pay all due (#)
button | Pay now
button | Pin Due
button | Previous month
button | Review overdue bills# items ready for pay, skip, or snooze$#
button | Search & sort# of # shown · no filters
button | Search billsCtrl K
button | Skip
button | Snooze
button | Status
button | Today
button | Tracker#
button | Unpaid
button | Upcoming, click to mark paid
button | —
checkbox | Select <script>alert(#)</script>
checkbox | Select AMC A-List
checkbox | Select Adobe Creative Cloud
checkbox | Select Apple iCloud+
checkbox | Select Big
checkbox | Select Capital One Quicksilver
checkbox | Select Car Insurance
checkbox | Select Car Payment
checkbox | Select Cell Phone
checkbox | Select Chase Freedom
checkbox | Select City Water Dept
checkbox | Select Dental Insurance
checkbox | Select Discover It Card
checkbox | Select Electric Company
checkbox | Select Gas Utility
checkbox | Select Gym Membership
checkbox | Select Health Insurance
checkbox | Select Internet Provider
checkbox | Select Mortgage
checkbox | Select Netflix
checkbox | Select Spotify
checkbox | Select Student Loan
checkbox | Select Trash Service
checkbox | Select Zero
combobox | Filter by billing schedule
combobox | Filter by category
combobox | Sort by
input:number | <script>alert(#)</script> payment amount
input:number | Apple iCloud+ payment amount
input:number | Big payment amount
input:number | Capital One Quicksilver payment amount
input:number | Car Payment payment amount
input:number | Cell Phone payment amount
input:number | Chase Freedom payment amount
input:number | City Water Dept payment amount
input:number | Dental Insurance payment amount
input:number | Discover It Card payment amount
input:number | Electric Company payment amount
input:number | Gas Utility payment amount
input:number | Internet Provider payment amount
input:number | Netflix payment amount
input:number | Payment amount
input:number | Spotify payment amount
input:number | Student Loan payment amount
input:number | Trash Service payment amount
input:text | Add monthly notes…
input:text | Search this month by bill, category, notes, or amount
link | AMC A-List
link | About
link | Adobe Creative Cloud
link | Analytics
link | Apple iCloud+
link | Bill Tracker
link | Calendar
link | Capital One Quicksilver
link | Chase Freedom
link | Discover It Card
link | Netflix
link | Release Notes
link | Skip to main content
link | Spotify

View File

@ -73,7 +73,7 @@ module.exports = defineConfig({
// findings are fixed (it becomes a passing regression guard).
{
name: 'probe',
testMatch: /(api\.probe|a11y\.authed|webauthn\.probe)\.spec\.js/,
testMatch: /(api\.probe|a11y\.authed|webauthn\.probe|control-census)\.spec\.js/,
use: { ...devices['Desktop Chrome'] },
dependencies: ['setup'],
},