PowerCAT OverPage
Review the Power Pages site(s) packaged in a Power Platform solution .zip, optionally using a
HAR capture for real performance analysis, and write a single [SolutionName].findings.json.
Then open the PowerCAT OverPage viewer with everything loaded — each finding is overlaid on a
live page preview, on the actual code (Liquid / page copy / custom JS+CSS / web files), and on the
HAR network waterfall.
This is the Power Pages counterpart to PowerCAT OverFlow (which reviews Power Automate flows).
You — the AI agent — produce the findings by reading and reasoning about the solution. There is no
bundled analyzer. Ground every finding in something inspectable (a component, a line of code, a HAR
request). The output must validate against findings.schema.json (next to this file).
Step 0 — Load the authoritative source list
Fetch the canonical Power Pages best-practice sources with web_fetch (raw: true):
https://raw.githubusercontent.com/microsoft/power-cat-skills/refs/heads/main/Common/PowerCAT%20OverPage/sources.md
Use only these URLs for the optional source citation on findings. If the fetch fails, continue but
omit source citations (don't invent URLs).
Step 1 — Locate inputs
- Solution
.zip (required): prefer a .zip in <tagged_files> / attachments (most recent).
If none, ask via m_ask_user: "Please attach the Power Pages solution .zip you'd like me to review."
- HAR
.har (optional, recommended): if a .har is attached, use it. If not, ask once
via m_ask_user: "Optionally attach a browser HAR capture (DevTools → Network → Export HAR while
browsing the live site) — it lets me find real performance bottlenecks and map them to code.
Proceed without it?" Don't block on the answer; review the solution either way.
Remember absolute paths of both files.
Step 2 — Unpack & enumerate the solution
Unpack the ZIP. Two Power Pages layouts are supported:
- Solution format (modern):
powerpagecomponents/<guid>/powerpagecomponent.xml (+ optional
filecontent/). Each component XML has <powerpagecomponenttype>, <name>, a <powerpagesiteid>,
and a JSON <content>. Group components by powerpagesiteid — a solution may contain several
sites; review each. Key component types: 2=web page (content JSON has copy Liquid +
customjavascript + customcss + partialurl + parentpageid + isroot; note the enhanced data
model pairs a root page with content/language pages — merge by rootwebpageid), 8=web template
(content.source = Liquid), 6=page template, 7=content snippet, 9=site setting, 4/5=weblink
set/link, 3=web file (binary in filecontent/), 15=basic form, 17=list, 18=table
permission, 11=web role, 10=page access control rule.
- Site export (
pac powerpages download): web-pages/, web-templates/, etc. (adx_ YAML).
For solution.name/version, read solution.xml (UniqueName, Version). A site's name often
comes from the Browser Title Suffix snippet.
Reject a classic Dataverse solution with no Power Pages site (no powerpagecomponent and no
*.webpage.yml): tell the user and stop.
Step 3 — Review each site (you reason; nothing is automated)
For every site, raise findings across these categories: Security, Performance, Accessibility,
Maintainability, Architecture, Reliability (SEO optional). Each finding has a category, an
impact (high/medium/low), a description (desc), and a suggested fix (fix).
Assign a scope: solution (spans sites), site, page, or component. Guidance:
- Security — table permissions with Global scope + Anonymous read; pages exposing list/form data
without access control; secrets in site settings; inline
<script> (CSP); open registration;
user input interpolated into Liquid fetchxml.
- Performance — heavy/duplicated client scripts in page copy/custom JS; large web files; many
render-blocking resources; large lists. (Use HAR in Step 4 for measured issues.)
- Accessibility —
<img> without alt, unlabeled inputs, heading-order jumps, low contrast.
- Maintainability — hardcoded URLs/emails/GUIDs/magic numbers in Liquid; inline JS/CSS instead of
web files; duplicate/test/blank pages shipped (e.g.
BlankPage, Testing, Copy of …).
- Architecture — page hierarchy/sitemap issues; misuse of page vs web templates; too many sites or
components; tables surfaced without a clear permission model; ALM smells (test artifacts in a
managed solution).
- Reliability — forms writing to tables with no matching permission for the intended role;
references to web templates/snippets/web files that don't exist; broken internal links.
Per site, produce: a categories rollup, an optional site summary, optional site-level findings,
and components (findings keyed by <type>:<name>). 1–8 items per group; don't pad.
Step 3 - Review each site with combined guidance
Raise findings across categories:
- Security
- Performance
- Accessibility
- Maintainability
- Architecture
- Reliability
- SEO (optional)
Each finding needs category, impact (high/medium/low), description, and suggested fix.
3A - Security deep checks (Power CAT)
- Web role defaults:
- Verify only one default anonymous role and one default authenticated role.
- Raise high risk if multiple default roles exist for anonymous or authenticated users.
- Explain runtime implication: authenticated default role applies to every signed-in user.
- Table permission scope:
- Flag Global scope permissions unless explicitly justified (for example super-admin-only design).
- Highlight sensitive tables exposed globally.
- Prefer parent-child permission chains to derive natural row-level access.
- Data trimming anti-patterns in code:
- Flag filters by user id, email, account id, account number as design-risk indicators.
- Escalate if security trimming happens in client-side JavaScript.
- Escalate if trimming is done in Liquid while table permissions are broad.
- Note: allow user to confirm benign lookup tables (for example states/cities) before final severity.
- Identity posture:
- Detect local login usage in site settings.
- Recommend Entra ID for workforce or known guests, Entra External ID for external audience.
- Call out password reset, email verification, mailbox workflow dependency, and MFA operational burden for local login.
- Web API field scope:
- Flag wildcard field scope all (*) as security and performance risk.
- Recommend explicit field projection and Column Permissions per web role and CRUD.
- Explain forward-risk: future sensitive columns may be exposed unintentionally.
- Public forms:
- For anonymous forms, verify CAPTCHA is enabled.
- Recommend WAF (Power Pages WAF or customer-managed WAF) for abuse mitigation.
- Open registration:
- Mention implication clearly: users can sign up and access app without invite if not controlled by other gates.
- Deprecated false-positive handling:
- Do not treat Enable Table Permissions toggle behavior as reliable signal on new sites.
- Use deprecation guidance from Microsoft Learn.
3B - Performance deep checks (Power CAT)
- Header and footer templates:
- Identify effective header and footer templates actually used by active page templates.
- Verify header and footer caching site settings are enabled.
- Inspect substitution tag usage and call out overuse that defeats caching goals.
- Flag expensive data queries in shared header/footer paths.
- Custom API pages and web templates:
- Review custom JSON endpoints built via page/template combinations.
- Flag dynamic FetchXML assembly from user parameters without robust controls.
- Flag loops and transforms that create avoidable server bottlenecks.
- Compare rationale against native Power Pages Web API capability.
- FetchXML and Web API design:
- Flag missing paging in queries and APIs returning large datasets.
- Flag excessive joins/subqueries that can degrade runtime with permission folding.
- Recommend UX-compatible paging patterns (paged list, load-more, infinite scroll with bounded page size).
- JavaScript execution patterns:
- Flag blocking API chains and late-lifecycle data calls.
- Flag large custom JS blocks in page copy or snippets when web files/modules are more suitable.
3C - Configuration and maintainability checks (Power CAT)
- Site settings vs content snippets:
- Flag oversized snippets containing logic-heavy JS or Liquid.
- Recommend web templates for reusable logic and snippets for localized string content.
- Code organization:
- Detect duplicated templates/snippets across languages where localization model appears misunderstood.
- Detect unnecessary one-template-per-page patterns unless justified by multi-language architecture.
- Large JavaScript payloads:
- Flag very large scripts and duplicated script loads.
- Suggest splitting by route/feature and deferring non-critical bundles.
Step 4 — When a HAR is present, investigate performance
Parse the HAR (log.pages for per-page onLoad/onContentLoad; log.entries for requests with
sizes, timings, status, and _initiator stacks). Look for and raise Performance findings for:
- pages with slow
onLoad (> 3 s) — describe which page and the measured time;
- large scripts/images/stylesheets (e.g. multi-MB bundles) — name the URL and size;
- slow requests (high total time / TTFB), failed requests (HTTP ≥ 400);
- render-blocking third-party/parser-inserted scripts;
- duplicated requests.
Attach a har object to each such finding: { requestUrl, pageUrl?, kind, thirdParty }. Per the
agreed behavior, also surface third-party/CDN bottlenecks (set "thirdParty": true) anchored to
the page that loaded them — even though the fix may be "defer/remove", they're often the real cost.
When a request maps to solution code (a web file, or a page's custom JS), also add a code anchor.
Step 5 — Anchor findings
Give findings the most useful anchors so the viewer can locate them:
anchor (visual, on the page preview): { "kind": "selector", "value": "<css>" },
{ "kind": "match", "value": "<visible text>" }, or { "kind": "component" } for non-visual.
code (jump to source in the code viewer): { "assetPath": "...", "line": N, "match": "..." }.
Asset paths the viewer exposes: web-templates/<Name>.liquid, web-pages/<Page>/copy.html,
web-pages/<Page>/custom.js, web-pages/<Page>/custom.css, web-files/<file>.
har (jump to the network request): see Step 4.
A finding can carry several anchors (e.g. a perf finding with both har and code).
Step 6 — Build the solution roll-up
solution.categories (highest impact per category across all sites, with a 1–2 sentence summary),
solution.summary (narrative verdict + top 1–3 priorities + cross-site patterns), and optional
solution.findings for solution-wide issues.
Step 7 — Write & validate the findings file
Shape (authoritative: findings.schema.json):
{
"solution": { "name", "version"?, "summary", "categories":[...], "findings"?:[...] },
"sites": [
{ "id", "name", "summary"?, "categories"?:[...], "findings"?:[...],
"components": { "<type>:<name>": [ { "category","impact","items":[ {
"label","desc","fix"?,"impact","scope"?,"rule"?,"source"?,
"anchor"?:{...}, "code"?:{...}, "har"?:{...} } ] } ] } }
]
}
site.id must match the powerpagesiteid (or "site" for a single pac export).
category ∈ {Security, Performance, Accessibility, Maintainability, Architecture, Reliability, SEO};
impact ∈ {high, medium, low}.
- Validate against
findings.schema.json (required keys, enums, additionalProperties:false,
anchor value required for selector/match) and fix until it passes.
Output filename: <OriginalSolutionZipBaseName>.findings.json, in the same folder as the .zip.
Step 8 — Open the viewer with all artifacts
playwright-browser_navigate → the viewer URL (hosted when published, else http://localhost:4317/).
playwright-browser_snapshot to find the inputs: Open .zip (solution), Findings (the JSON),
HAR (the capture, if any).
playwright-browser_file_upload once per input with absolute paths.
playwright-browser_snapshot to confirm the Overview + findings drawer rendered. The viewer has
four views: Overview, Preview, Code, Network. Findings carry "View code" / "View request" /
"Show on page" actions that deep-link across them.
If the viewer supports it, you may instead deep-link ?site=<zip>&findings=<json>&har=<har>.
If Playwright is unavailable, Start-Process the viewer URL and give the user the file paths to load.
Step 9 — Hand over
Write a short chat message (≤170 words):
- A score table of
solution.categories (Category · impact).
- The top 2–3 findings (one line each, with site/component and — for perf — the measured number).
- Whether a HAR was used (and the slowest page if so).
- The absolute path of the
.findings.json.
- The viewer URL.
End with: "Handing over — explore the findings overlaid on each page, the code, and the network in the open viewer."
Hard rules
- You author the findings by reading the solution (and HAR) — there is no engine. Never fabricate;
ground each finding in a component, code line, or HAR request.
- The output JSON must validate against
findings.schema.json.
- Component keys are
<componentType>:<componentName> exactly; site.id matches powerpagesiteid.
- Cite only URLs from the Step 0
sources.md in source.
- Keep all artifacts local; never upload the solution, HAR, or findings anywhere.
- Never paste secrets or full PII back into chat.
1---2name: powercat-overpage3description: Reviews the Power Pages site(s) inside a Power Platform solution .zip against best practices across Security, Performance, Accessibility, Maintainability, Architecture and Reliability — by reading the pages, web templates, custom JS/CSS, settings and table permissions and reasoning about them. Optionally also ingests a browser HAR capture (recommended) to investigate real performance bottlenecks and map them to code. Produces a [SolutionName].findings.json (validated against findings.schema.json) with solution-level, per-site and per-component findings, each with a description, a suggested fix, and (where relevant) a code or HAR anchor. Then opens the PowerCAT OverPage viewer with the solution, findings and HAR loaded so the user can explore findings overlaid on a live page preview, on the actual code, and on the network waterfall. Triggers: 'powercat overpage', 'overpage my site', 'review my power pages site', 'review this portal solution', 'evaluate this power pages solution', 'audit power pages site', 'ove4---56# PowerCAT OverPage78Review the Power Pages site(s) packaged in a **Power Platform solution `.zip`**, optionally using a9**HAR** capture for real performance analysis, and write a single `[SolutionName].findings.json`.10Then open the **PowerCAT OverPage** viewer with everything loaded — each finding is overlaid on a11live page preview, on the **actual code** (Liquid / page copy / custom JS+CSS / web files), and on the12**HAR network waterfall**.1314This is the Power Pages counterpart to **PowerCAT OverFlow** (which reviews Power Automate flows).1516**You — the AI agent — produce the findings by reading and reasoning about the solution.** There is no17bundled analyzer. Ground every finding in something inspectable (a component, a line of code, a HAR18request). The output must validate against `findings.schema.json` (next to this file).1920## Step 0 — Load the authoritative source list2122Fetch the canonical Power Pages best-practice sources with `web_fetch` (`raw: true`):2324```25https://raw.githubusercontent.com/microsoft/power-cat-skills/refs/heads/main/Common/PowerCAT%20OverPage/sources.md26```2728Use only these URLs for the optional `source` citation on findings. If the fetch fails, continue but29omit `source` citations (don't invent URLs).3031## Step 1 — Locate inputs32331. **Solution `.zip`** (required): prefer a `.zip` in `<tagged_files>` / attachments (most recent).34 If none, ask via `m_ask_user`: "Please attach the Power Pages solution `.zip` you'd like me to review."352. **HAR `.har`** (optional, **recommended**): if a `.har` is attached, use it. If not, **ask once**36 via `m_ask_user`: "Optionally attach a browser HAR capture (DevTools → Network → Export HAR while37 browsing the live site) — it lets me find real performance bottlenecks and map them to code.38 Proceed without it?" Don't block on the answer; review the solution either way.3940Remember absolute paths of both files.4142## Step 2 — Unpack & enumerate the solution4344Unpack the ZIP. Two Power Pages layouts are supported:4546- **Solution format** (modern): `powerpagecomponents/<guid>/powerpagecomponent.xml` (+ optional47 `filecontent/`). Each component XML has `<powerpagecomponenttype>`, `<name>`, a `<powerpagesiteid>`,48 and a JSON `<content>`. Group components by `powerpagesiteid` — **a solution may contain several49 sites; review each.** Key component types: `2`=web page (content JSON has `copy` Liquid +50 `customjavascript` + `customcss` + `partialurl` + `parentpageid` + `isroot`; note the enhanced data51 model pairs a root page with content/language pages — merge by `rootwebpageid`), `8`=web template52 (`content.source` = Liquid), `6`=page template, `7`=content snippet, `9`=site setting, `4/5`=weblink53 set/link, `3`=web file (binary in `filecontent/`), `15`=basic form, `17`=list, `18`=table54 permission, `11`=web role, `10`=page access control rule.55- **Site export** (`pac powerpages download`): `web-pages/`, `web-templates/`, etc. (adx_ YAML).5657For `solution.name`/`version`, read `solution.xml` (`UniqueName`, `Version`). A site's name often58comes from the `Browser Title Suffix` snippet.5960**Reject** a classic Dataverse solution with no Power Pages site (no `powerpagecomponent` and no61`*.webpage.yml`): tell the user and stop.6263## Step 3 — Review each site (you reason; nothing is automated)6465For every site, raise findings across these **categories**: **Security, Performance, Accessibility,66Maintainability, Architecture, Reliability** (SEO optional). Each finding has a `category`, an67`impact` (`high`/`medium`/`low`), a **description** (`desc`), and a **suggested fix** (`fix`).68Assign a `scope`: `solution` (spans sites), `site`, `page`, or `component`. Guidance:6970- **Security** — table permissions with Global scope + Anonymous read; pages exposing list/form data71 without access control; secrets in site settings; inline `<script>` (CSP); open registration;72 user input interpolated into Liquid `fetchxml`.73- **Performance** — heavy/duplicated client scripts in page copy/custom JS; large web files; many74 render-blocking resources; large lists. (Use HAR in Step 4 for measured issues.)75- **Accessibility** — `<img>` without `alt`, unlabeled inputs, heading-order jumps, low contrast.76- **Maintainability** — hardcoded URLs/emails/GUIDs/magic numbers in Liquid; inline JS/CSS instead of77 web files; duplicate/test/blank pages shipped (e.g. `BlankPage`, `Testing`, `Copy of …`).78- **Architecture** — page hierarchy/sitemap issues; misuse of page vs web templates; too many sites or79 components; tables surfaced without a clear permission model; ALM smells (test artifacts in a80 managed solution).81- **Reliability** — forms writing to tables with no matching permission for the intended role;82 references to web templates/snippets/web files that don't exist; broken internal links.8384Per site, produce: a `categories` rollup, an optional site `summary`, optional site-level `findings`,85and `components` (findings keyed by `<type>:<name>`). 1–8 items per group; don't pad.868788## Step 3 - Review each site with combined guidance8990Raise findings across categories:9192- Security93- Performance94- Accessibility95- Maintainability96- Architecture97- Reliability98- SEO (optional)99100Each finding needs category, impact (high/medium/low), description, and suggested fix.101102### 3A - Security deep checks (Power CAT)1031041. Web role defaults:105- Verify only one default anonymous role and one default authenticated role.106- Raise high risk if multiple default roles exist for anonymous or authenticated users.107- Explain runtime implication: authenticated default role applies to every signed-in user.1081092. Table permission scope:110- Flag Global scope permissions unless explicitly justified (for example super-admin-only design).111- Highlight sensitive tables exposed globally.112- Prefer parent-child permission chains to derive natural row-level access.1131143. Data trimming anti-patterns in code:115- Flag filters by user id, email, account id, account number as design-risk indicators.116- Escalate if security trimming happens in client-side JavaScript.117- Escalate if trimming is done in Liquid while table permissions are broad.118- Note: allow user to confirm benign lookup tables (for example states/cities) before final severity.1191204. Identity posture:121- Detect local login usage in site settings.122- Recommend Entra ID for workforce or known guests, Entra External ID for external audience.123- Call out password reset, email verification, mailbox workflow dependency, and MFA operational burden for local login.1241255. Web API field scope:126- Flag wildcard field scope all (*) as security and performance risk.127- Recommend explicit field projection and Column Permissions per web role and CRUD.128- Explain forward-risk: future sensitive columns may be exposed unintentionally.1291306. Public forms:131- For anonymous forms, verify CAPTCHA is enabled.132- Recommend WAF (Power Pages WAF or customer-managed WAF) for abuse mitigation.1331347. Open registration:135- Mention implication clearly: users can sign up and access app without invite if not controlled by other gates.1361378. Deprecated false-positive handling:138- Do not treat Enable Table Permissions toggle behavior as reliable signal on new sites.139- Use deprecation guidance from Microsoft Learn.140141### 3B - Performance deep checks (Power CAT)1421431. Header and footer templates:144- Identify effective header and footer templates actually used by active page templates.145- Verify header and footer caching site settings are enabled.146- Inspect substitution tag usage and call out overuse that defeats caching goals.147- Flag expensive data queries in shared header/footer paths.1481492. Custom API pages and web templates:150- Review custom JSON endpoints built via page/template combinations.151- Flag dynamic FetchXML assembly from user parameters without robust controls.152- Flag loops and transforms that create avoidable server bottlenecks.153- Compare rationale against native Power Pages Web API capability.1541553. FetchXML and Web API design:156- Flag missing paging in queries and APIs returning large datasets.157- Flag excessive joins/subqueries that can degrade runtime with permission folding.158- Recommend UX-compatible paging patterns (paged list, load-more, infinite scroll with bounded page size).1591604. JavaScript execution patterns:161- Flag blocking API chains and late-lifecycle data calls.162- Flag large custom JS blocks in page copy or snippets when web files/modules are more suitable.163164### 3C - Configuration and maintainability checks (Power CAT)1651661. Site settings vs content snippets:167- Flag oversized snippets containing logic-heavy JS or Liquid.168- Recommend web templates for reusable logic and snippets for localized string content.1691702. Code organization:171- Detect duplicated templates/snippets across languages where localization model appears misunderstood.172- Detect unnecessary one-template-per-page patterns unless justified by multi-language architecture.1731743. Large JavaScript payloads:175- Flag very large scripts and duplicated script loads.176- Suggest splitting by route/feature and deferring non-critical bundles.177178179## Step 4 — When a HAR is present, investigate performance180181Parse the HAR (`log.pages` for per-page `onLoad`/`onContentLoad`; `log.entries` for requests with182sizes, timings, status, and `_initiator` stacks). Look for and raise **Performance** findings for:183184- pages with slow `onLoad` (> 3 s) — describe which page and the measured time;185- large scripts/images/stylesheets (e.g. multi-MB bundles) — name the URL and size;186- slow requests (high total time / TTFB), failed requests (HTTP ≥ 400);187- render-blocking third-party/parser-inserted scripts;188- duplicated requests.189190Attach a `har` object to each such finding: `{ requestUrl, pageUrl?, kind, thirdParty }`. Per the191agreed behavior, **also surface third-party/CDN bottlenecks** (set `"thirdParty": true`) anchored to192the page that loaded them — even though the fix may be "defer/remove", they're often the real cost.193When a request maps to solution code (a web file, or a page's custom JS), also add a `code` anchor.194195## Step 5 — Anchor findings196197Give findings the most useful anchors so the viewer can locate them:198199- `anchor` (visual, on the page preview): `{ "kind": "selector", "value": "<css>" }`,200 `{ "kind": "match", "value": "<visible text>" }`, or `{ "kind": "component" }` for non-visual.201- `code` (jump to source in the code viewer): `{ "assetPath": "...", "line": N, "match": "..." }`.202 Asset paths the viewer exposes: `web-templates/<Name>.liquid`, `web-pages/<Page>/copy.html`,203 `web-pages/<Page>/custom.js`, `web-pages/<Page>/custom.css`, `web-files/<file>`.204- `har` (jump to the network request): see Step 4.205206A finding can carry several anchors (e.g. a perf finding with both `har` and `code`).207208## Step 6 — Build the solution roll-up209210`solution.categories` (highest impact per category across all sites, with a 1–2 sentence summary),211`solution.summary` (narrative verdict + top 1–3 priorities + cross-site patterns), and optional212`solution.findings` for solution-wide issues.213214## Step 7 — Write & validate the findings file215216Shape (authoritative: `findings.schema.json`):217218```jsonc219{220 "solution": { "name", "version"?, "summary", "categories":[...], "findings"?:[...] },221 "sites": [222 { "id", "name", "summary"?, "categories"?:[...], "findings"?:[...],223 "components": { "<type>:<name>": [ { "category","impact","items":[ {224 "label","desc","fix"?,"impact","scope"?,"rule"?,"source"?,225 "anchor"?:{...}, "code"?:{...}, "har"?:{...} } ] } ] } }226 ]227}228```229230- `site.id` must match the `powerpagesiteid` (or `"site"` for a single `pac` export).231- `category` ∈ {Security, Performance, Accessibility, Maintainability, Architecture, Reliability, SEO};232 `impact` ∈ {high, medium, low}.233- **Validate against `findings.schema.json`** (required keys, enums, `additionalProperties:false`,234 anchor `value` required for selector/match) and fix until it passes.235236**Output filename:** `<OriginalSolutionZipBaseName>.findings.json`, in the same folder as the `.zip`.237238## Step 8 — Open the viewer with all artifacts2392401. `playwright-browser_navigate` → the viewer URL (hosted when published, else `http://localhost:4317/`).2412. `playwright-browser_snapshot` to find the inputs: **Open .zip** (solution), **Findings** (the JSON),242 **HAR** (the capture, if any).2433. `playwright-browser_file_upload` once per input with absolute paths.2444. `playwright-browser_snapshot` to confirm the Overview + findings drawer rendered. The viewer has245 four views: **Overview, Preview, Code, Network**. Findings carry "View code" / "View request" /246 "Show on page" actions that deep-link across them.247248If the viewer supports it, you may instead deep-link `?site=<zip>&findings=<json>&har=<har>`.249If Playwright is unavailable, `Start-Process` the viewer URL and give the user the file paths to load.250251## Step 9 — Hand over252253Write a short chat message (≤170 words):2542551. A score table of `solution.categories` (Category · impact).2562. The top 2–3 findings (one line each, with site/component and — for perf — the measured number).2573. Whether a HAR was used (and the slowest page if so).2584. The absolute path of the `.findings.json`.2595. The viewer URL.260261End with: **"Handing over — explore the findings overlaid on each page, the code, and the network in the open viewer."**262263## Hard rules264265- **You** author the findings by reading the solution (and HAR) — there is no engine. Never fabricate;266 ground each finding in a component, code line, or HAR request.267- The output JSON **must validate** against `findings.schema.json`.268- Component keys are `<componentType>:<componentName>` exactly; `site.id` matches `powerpagesiteid`.269- Cite only URLs from the Step 0 `sources.md` in `source`.270- Keep all artifacts local; never upload the solution, HAR, or findings anywhere.271- Never paste secrets or full PII back into chat.