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.
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.
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…
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.
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.
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.
Skip Unchanged Pages
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.
Rotation
The monitor checks one page at a time, in a circle: whoever was checked longest ago goes next. One pass of every eligible page is a lap.
monitor/wrangler.toml and needs a deploy, so
this number and that line have to be changed together — set one without the other and every screen
below quotes a cadence the monitor is not running at.
It is the number four things are derived from: how long a lap should take (which decides when a lap is reported as stalled), the heartbeat's green and amber thresholds, the wording on the Monitor card, and the cost. 32 pages at 2 minutes is a lap an hour and about 720 checks a day; at 1 minute it is half an hour and 1,440 — the same coverage the hourly sweep gave, for twice the browser time.
Blank uses the deployed default.
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.
The agents
Four accounts with mailboxes, Slack licences and seats, outside the staff headcount. What they cost, what they do, and who answers for them. The bio page is generated from this, and the costing export carries it to Spend Analytics.
| Agent | Job title | Works on | Answers to | Replaced | Has | Per hour | Per month | Saves a year | Actions |
|---|---|---|---|---|---|---|---|---|---|
| Loading data... | |||||||||
Agent prices (per agent, per month)
Products and sections (the Works for and Section boxes)
One row per product. Sections are comma separated. 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.
Analytics Control
Manage how telemetry is logged and stored project-wide. These settings are stored in the database and take effect without redeploying.
Marketing Channels
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.
Adding a channel here does not create its subdomain. Each one also needs a proxied DNS record in Cloudflare — without it the address does not resolve and nothing reaches the router.
| Channel / Subdomain | Medium | Status | Actions |
|---|---|---|---|
| Loading channels... | |||
Add External App Token
Generate secure tokens for external apps to send Slack notifications via Aegis Nudger.
Active App Tokens
| ID | App Name | Token | Created At | Actions |
|---|---|---|---|---|
| Loading data... | ||||
Manage Database Sync Token
The Sync Token authorizes backup node services (like `sync-cron.sh`) to download the latest D1 database configuration snapshot. Keep it secret.
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.
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.
What each page type asks for
Build Bot core files
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 | Live check | By | Default | Actions | |
|---|---|---|---|---|---|---|---|---|---|
| Loading templates... | |||||||||
The live theme carries 179 product templates that are close to identical, so this starts from a page that is already live and shows you what it is made of. It reads the theme and writes nothing back to Shopify.
Labs unfinished
Range Plan
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.
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
Where each value comes from
👤 Add New User
| ID | Tab 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. If the page has a Preview URL set, that is scanned instead.
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.