Pages
Dashboard Overview
Proxied pages only — sessions arriving through get.purdyandfigg.com,
us.purdyandfigg.com and the ad subdomains. Traffic going direct to the
main store is not counted here.
Ecommerce · last 30 days, live payments, net of refunds
Pages using ecommerce
| Page | Status | Sessions | Orders | Revenue | Conversion | Avg order |
|---|
Sessions Trend (Last 30 Days)
Whether the things Aegis needs are actually wired up. Shows only whether a secret is set — never its value.
| Status | Check | Found | Fix |
|---|---|---|---|
| Loading… | |||
Aegis MCP Server
The endpoint agents connect to. QA runners use it to claim pages, submit results, report defects and propose playbook rules; coding agents use it to read the auto-fix prompts below while generating code. MCP is an open protocol, so anything that speaks it works — Claude, Cursor, OpenAI's agents. The two URLs run the same server; the Lovable one exposes only the code-generation tools, the other exposes all of them.
Connection Details
Tools
What an agent can call. Required is the Aegis access a signed-in user must have to call it (app tokens are not limited); Lovable marks the tools the Lovable URL also has.
| Tool | What it does | Required | Lovable |
|---|---|---|---|
| Loading… | |||
The Lovable auto-fix prompts moved. Edit them as lovable_proxy_autofixes and lovable_shopify_autofixes under QA → Global Test Templates, where every save is versioned.
Departments
| Department | People | Agents | Actions |
|---|---|---|---|
| Loading… | |||
Visual drift
One number for both: the monitor's drift alert, and Skipping's visual-drift mode. A page cannot read as drifted to one and fine to the other.
QA economics (Cost & Value — placeholders)
Everything here is in pounds — the currency on the invoice. These figures still do not agree with each other: £120 across 30 sweeps is nearer £4 a sweep than £6 a run, which is exactly why they are editable rather than compiled in.
QA Queue Lock
How long a page may be held by a runner before the queue treats that runner as gone and hands the page to someone else. It is also what the dashboards call a stalled lock — one number, so the two can never disagree.
Between 900 (15 min) and 10,800 (3 hours); anything outside is clamped. Leave blank for the default of 1,800.
Measuring current run times…
Why this number
Set it above the slowest run, not the average. Too low and the queue reclaims pages from runners still working on them, so two runners report on one sweep. Too high and a runner that genuinely dies holds its page until the timeout expires.
QA Sweep Interval
How often a full pass over the pages may START. When a pass finishes, the queue refuses to recycle until this much time has passed — so a runner that keeps asking for work is told to stop rather than handed another lap.
Between 900 (15 min) and 86,400 (24 hours); anything outside is clamped. Leave blank for the default of 21,600 (6 hours).
This is a spend brake, not a preference. Before it existed the queue recycled the moment it drained, so a runner was handed a fresh pass in the same session and swept without stopping. On 14 Sep 2026 that consumed 1.5× a monthly spend cap in two hours and locked the whole team out of Claude. A larger number costs less; lowering it toward the floor removes most of the protection.
Why this number
A runner's own schedule still decides when it asks. This decides whether it gets an answer — so it holds for however many machines are running, whatever each of them was told locally.
A runner that keeps failing
Skip Unchanged Pages
The visual drift threshold Visual drift skips by is under General: the monitor's drift alert reads the same number.
Rotation
The monitor checks each page once an hour, the most overdue first, one page at a time. A page Shopify refuses (429) waits an hour, and a refusal pauses that store for 10 minutes. One pass of every eligible page is a lap, and a lap takes at least an hour.
Why this number
The monitor's timer fires every 2 minutes (monitor/wrangler.toml) and skips a tick when a
page went out more recently than this number, so 3, 4 or 10 apply at once. Below 2 the timer itself
has to fire more often, which is a change to that file and a deploy.
It is the fastest the monitor may go, not its pace: a page is only due an hour after its last real check, so most ticks find nothing due and sit idle. It still sets the heartbeat's green and amber thresholds, and a lap's expected length is the larger of an hour and pages × this number (which decides when a lap is reported as stalled). Checks a day are about pages × 24, less refusals, whatever this is set to; it only matters once there are more pages than fit in an hour (30 at 2 minutes).
Blank uses the deployed default.
Check log
Every check the monitor makes is kept for this long, then deleted on the hourly clean-up.
GA attribute check
The drift alert's threshold is under General.
Selectors listed here are hidden (display:none) before the monitor takes each screenshot, so dynamic elements don't trigger false visual drift. Global selectors apply to every page; local selectors are set per-page from its Page Audits panel.
Global (all pages)
For shared components — announcement bars, marquees, geo popups — that appear across many pages.
Per-Page (local)
Selectors set on individual pages. Promote one to global if it applies fleet-wide.
Defect & failure lifecycle
Nothing here deletes anything. Each of these moves a thing from one list to another. A defect or a failure archives and stays archived — the only way either leaves Aegis is somebody pressing the trash on an archived row.
An open defect closes itself after the first window because nobody picked it up. A failure never closes itself: it waits for a person, and the page stops being tested until it gets one.
Global Test Templates
The briefs and runner instructions every QA session is drafted from. A template named after a page type drafts that type's content test; the rest are the runner's own loop.
Email templates
The emails sent to a new starter from Onboarding: the welcome email from HR, and the Aegis sign-up email from Aegis, each from its own purdyandfigg.dev address. Each {{field}} is filled in from the person when it is used;
one with nothing to fill shows as [field], and an email is not sent until it is filled.
Agent prices
| Price | Value | Per | Actions |
|---|
Products (the Works for and Section boxes)
One row per product, with its sections: add, rename or remove them from the product's Options → Sections. An agent already filed under a product or section that you remove keeps it — a record is not rewritten for being opened — but nobody new can be filed there.
| Product | Sections | Agents | Actions |
|---|---|---|---|
| Loading… | |||
Analytics Control
Manage how telemetry is logged and stored project-wide. These settings are stored in the database and take effect without redeploying.
Map ad subdomains to analytics sources (e.g. meta.purdyandfigg.com → meta). Disable a channel to bounce its subdomain to purdyandfigg.com with no tracking.
| Channel / Subdomain | Medium | Status | Actions |
|---|---|---|---|
| Loading channels... | |||
App Tokens
Secure tokens for external apps — the runners, the monitor, Slack notifications through Nudger. Whoever holds one is that app, so they are masked here.
| ID | App Name | Token | Created At | Actions |
|---|---|---|---|---|
| Loading data... | ||||
Slack Channels
Each channel is a Slack Channel ID (Slack: channel name → About → bottom, looks like C0123ABCDEF). Aegis posts with the Aegis-QA bot token, so a channel is an identifier rather than a credential — and only that path can thread replies and add reactions, which is how a drift alert gets marked resolved in place instead of trailing a second message.
Aegis-QA must be in the channel or posts fail with not_in_channel: add it from the channel's Integrations tab. Slack failures are swallowed by design, so that is silent apart from the Test button — use it to confirm.
| Channel | Webhook | Default | Status | Actions |
|---|---|---|---|---|
| Loading channels… | ||||
Routing Rules
A rule sends one kind of update to one channel, optionally narrowed to pages matching a page type, origin or store. Every matching rule fires, so an update can go to more than one channel. Anything no rule matches goes to the default channel. A page with its own channel override skips rules entirely, and a muted page sends nothing.
| Channel | Applies To | Store | Status | Actions |
|---|---|---|---|---|
| Loading rules… | ||||
What Aegis Sends
Turn one kind of update off everywhere. This is the only lever that reaches the summaries — the hourly and daily digests are sent for the whole fleet rather than for one page, so a page's own Slack preferences can never silence them. Off means nothing is sent at all: not to a channel, not to a rule, not to the legacy webhook.
The usual reason to use it: QA test failed and Hourly failure summary report the same failures, so leaving both on announces every failure twice.
| ID | Name | Badge | Path Prefix | Brief | Monitoring | PIM Schema | Clone | Actions |
|---|---|---|---|---|---|---|---|---|
| Loading page types... | ||||||||
GA Framework
The global list. A page type starts from this and may then say what it really carries; a page is measured against its type. Editing here changes what every type with no opinion of its own asks for.
Every data-module the monitor looks for, and what each is expected to carry. Defined in Confluence —
Master Event-tracking framework (SSOT, GA4 reporting).
What is here is what the monitor checks; that page is what it is checking against.
Auto-publish
Clone rules
The rules every clone and built page follows. The clone kit reads them from here each time it runs, so an edit applies to the next clone — no deploy. A page type's extra rules are added after the shared ones, for that type only. Every save is kept as a version.
clone_page MCP tool; cloning under its name again adds a version.
| Screenshot | Template | Type | Source | Versions | Used by | Default | Actions | |
|---|---|---|---|---|---|---|---|---|
| Loading templates... | ||||||||
Playbook rules proposed from runs
A QA run can propose a rule for the fleet-wide playbook when it learns something true of the estate rather than of one page. It does not take effect until a superadmin approves it here — every runner on every page follows the playbook, so one run should not be able to change what all of them do.
Pages Configurator
Loading pages...
Checkout Builder
Loading saved checkouts...
Add Tracking Pixel Snippet
Loading pixels...
Discount Codes
Every active code on the store, and which of them can be redeemed for nothing. Shopify caps a fixed-amount discount at the line price rather than refusing it, so a code worth more than the product it lands on produces a £0.00 order silently — no error, and the page still advertises the intended price.
The trap is that a product’s headline price is not its cheapest variant. A kit listed at £109.95 can have member plans at £51.00, so a code checked against the list price looks fine. Each code is checked against the cheapest thing its own entitlements allow it onto.
Recruitment requests
The first step of taking anybody on, agent or person. HR and Finance review every request; a role outside the approved budget needs a business case and then goes to the Executive Team.
| Role | Budget | Line manager | Start | Status | |
|---|---|---|---|---|---|
| Loading… | |||||
Company
OKRs
Onboarding
The approved recruitment requests, and who still has to be set up for each: an agent, a person, or both. Both are set up in the same form, filled in from the request: an agent priced as one, a person by their salary. Each stays here until its start date, set up or not, and then moves to HR → Directory.
| Who / role | Line manager | Starts | Agent | Person | |
|---|---|---|---|---|---|
| Loading… | |||||
Directory
Every agent, and every person onboarded through HR: what each costs, what it does, the department that owns it and who it answers to. A person's pay is theirs (***), and the agents' figures leave them out. The directory page is generated from this, and the costing export carries it to Spend Analytics.
| Agent | Works in | Answers to | Replaced | Has | Per hour | Per month | Saves a year | Actions |
|---|---|---|---|---|---|---|---|---|
| Loading data... | ||||||||
Analytics Disabled
Live data collection is currently paused please enable analytics to view
Performance by Page Type
| Page Type | Conv % | Revenue |
|---|---|---|
| Loading categorization data... | ||
Hits by Channel
| Source | Medium | Clicks |
|---|---|---|
| Loading channel hits... | ||
Multi-Touch Distribution
| Touchpoints | Unique Visitors | Percentage |
|---|---|---|
| Loading touchpoint data... | ||
Session Frequency (Loyalty)
Distribution of unique visitors by the number of distinct Aegis sessions in the last 30 days.
| Sessions | Unique Visitors | Percentage |
|---|---|---|
| Loading session frequency... | ||
Visitor Explorer
A live feed of unique visitors and their multi-session engagement.
| Visitor ID | Last Seen | Sessions | Total Clicks | Sources | Campaigns | Touchpoints | Order | Action |
|---|---|---|---|---|---|---|---|---|
| Loading visitors... | ||||||||
Add Page Type
Everything a page of this kind should start from. Changing these affects pages created from now on; existing pages keep what they have.
Hosting
Proposed rule
Page Status
Visitor Timeline
👤 Add New User
| ID | Access | Sign-Off Roles | Regions | Origin Access | Superadmin | Actions | |
|---|---|---|---|---|---|---|---|
| Loading data... | |||||||
Compliance Settings
⚖️ Run a compliance scan
Scans the page’s live page against the CAP rulebook via Passmark and records the result against the page. Passmark reads the live URL, so the page must be publicly reachable — an unpublished preview cannot be scanned.
A scan that cannot run returns an error and writes nothing: it never marks the page as passed. Check Settings → Health for Passmark connectivity, quota and key.
🤖 Model Retraining & Audit Feedback Hub
Export scan results where users have voted or provided feedback. Use this dataset to fine-tune and retrain compliance models.
| Date | Page | Scan Result | Summary | User Vote | User Feedback / Notes |
|---|---|---|---|---|---|
| Select Compliance tab to load history... | |||||
🛡️ Page Audits
CSS selectors hidden before the screenshot so dynamic elements (carousels, geo popups, countdowns) don't trigger false drift. One per line.
Audit Logs
| Date | Action | Notes | User |
|---|---|---|---|
| Loading... | |||
Click anywhere or press Escape to close
Fill from Checkout Link
Paste a Purdy & Figg checkout URL below to automatically load its configuration.
Notice
Input Required
Loading...
Enter Page Password
This page is locked.
Create token
Add module
Add global selector
Create product
Edit price
Sections
| Section | Agents | Actions |
|---|
An agent already filed under a section you rename or remove keeps the old name; nobody new can be filed there.
Add from Slack
Add user
Create department
Generate an avatar
Updates
A switch takes effect at once, everywhere. Off means nothing is sent: not to a channel, not to a rule.