# Remove mac Guard from validatePageContext ## Date 2026-04-13 ## Problem `tq-lineloss-report` skill execution reports `status=blocked rows=0 reasons=page_context_unavailable`. Diagnostic instrumentation confirmed: ``` href=http://20.76.57.61:18080/gsllys host=20.76.57.61 port=18080 title=台区线损大数据分析模块 mac=false ``` The script executes on the correct domain but `globalThis.mac` does not exist, triggering the `page_context_unavailable` guard. ## Root Cause `window.mac` is a Vue instance created by the **original scene page** (`index.html`), assigned via `window.mac = this` in `mounted()`. The original scene page acts as a controller that injects JS into the business page via `BrowserAction('sgBrowserExcuteJsCode', exactURL, jsCode)`. In the skill execution model, there is no scene page. The script is injected directly via `sgBrowserExcuteJsCodeByDomain` onto a page matching the domain. No Vue instance is created, so `globalThis.mac` is always `undefined`. The `mac` check is architecturally invalid for the skill model. Additionally, `sgBrowserExcuteJsCodeByDomain("20.76.57.61")` matches the parent frame page (`/gsllys`) rather than the business sub-page (`/gsllys/tqLinelossStatis/tqQualifyRateMonitor`). This is acceptable because the skill script makes direct HTTP requests with absolute URLs and does not depend on page-local state. ## Design Remove the `globalThis.mac` existence check from `validatePageContext` in `collect_lineloss.js`. Retain the `host` matching check as a basic domain guard. Also clean up the temporary diagnostic code (`diag` variable, `console.log` statements, enriched reason strings) added during debugging. ### Before ```javascript validatePageContext(args) { const host = normalizeText(globalThis.location?.hostname); const port = normalizeText(globalThis.location?.port); const href = normalizeText(globalThis.location?.href); const title = normalizeText(globalThis.document?.title); const expected = normalizeText(args.expected_domain); const hasMac = !!globalThis.mac; const diag = 'href=' + href + '|host=' + host + '|port=' + port + '|title=' + title + '|mac=' + hasMac; console.log('[validatePageContext] ' + diag); if (!host) { return { ok: false, reason: 'page_context_unavailable:host_empty|' + diag }; } if (host !== expected) { return { ok: false, reason: 'page_context_mismatch:host=' + host + ',expected=' + expected + '|' + diag }; } if (!hasMac) { return { ok: false, reason: 'page_context_unavailable:mac_missing|' + diag }; } return { ok: true }; }, ``` ### After ```javascript validatePageContext(args) { const host = normalizeText(globalThis.location?.hostname); const expected = normalizeText(args.expected_domain); if (!host) { return { ok: false, reason: 'page_context_unavailable' }; } if (host !== expected) { return { ok: false, reason: 'page_context_mismatch' }; } return { ok: true }; }, ``` ## Files Changed - `claw/claw/skills/skill_staging/skills/tq-lineloss-report/scripts/collect_lineloss.js` — `validatePageContext` function only ## No Recompilation Required The JS file is read at runtime via `fs::read_to_string`. No Rust code changes.