AC TOOLS — SHARED ASSETS PILOT v5 (TURF UPLOAD FIX + HELPER PILOT)

Purpose
- Local-only pilot package for Gabor-Granger, TURF, and Sensory Engine.
- The locked Master Layout classes remain authoritative.

Locked standard
Main: max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-2 space-y-6
Hero inner: relative px-7 py-4 sm:px-10 sm:py-5 lg:px-12 lg:py-6
Font: Inter loaded centrally by ac-tools-master.css for all pages.
Sensory retains its additional main utilities: flex-1 w-full.

Changes in v5
1. Fixed a TURF startup error: startAnalysisBtn and expertJumpBtn are absent from current hero markup, but were used without null checks. That exception prevented subsequent upload event handlers from being registered. Calls are now optional and harmless when those optional jump buttons are absent.
2. Wired ac-tools-ui.js into TURF only as the first helper pilot. The existing showStatus(msg, type) call signature is retained but delegates to ACToolsUI.setStatus.
3. Shared setStatus preserves the existing TURF Tailwind tone classes and base layout classes, and adds accessible role/aria-live attributes. The statistics, parsing, and TURF combination engine were not modified.
4. Included qa-turf-sample.csv so the upload flow can be checked quickly. It contains 6 sample respondents and 3 [P] product columns.
5. CSS cleanup from v4 is retained.

Testing status
- Static JavaScript syntax check passed for all three tools and shared helper.
- Static check confirms the two missing optional button references are guarded.
- Simulated browser smoke test of TURF CSV upload passed using a lightweight XLSX parser shim: status changes to ready, wizard appears, 3 product candidates and 6 respondents are detected; no page or console errors. This smoke test validates startup/upload event wiring and wizard flow, not the third-party XLSX library itself or real XLSX parsing.
- Full browser interaction with production CDNs and visual regression remain to be checked in the user's browser.
- Do not upload to production yet.

Shared helper policy
- Only the status-message behavior has been adopted in TURF as the first pilot.
- byId, setText, and setVisible remain available but are not forced into the pages until a concrete repeated UI use is reviewed.
- Do not move analytics, data parsing, TURF combinations, or statistical logic into the shared helper.


V6 update (TURF result color consistency): The Optimal Portfolio banner now follows Light Graphite surfaces and graphite typography. Bright emerald-400 was changed to the shared darker semantic green for the headline reach metric. No analysis logic changed.


PILOT v7 — GABOR-GRANGER HELPER INTEGRATION
- New: Gabor-Granger loads ac-tools-ui.js and uses ACToolsUI.setText for the file information label.
- This is a UI-only integration; if the helper does not load, a direct textContent-compatible fallback (innerText) is retained.
- The only named function body changed from v6 is handleIncomingFile, and the change is limited to displaying the selected file name/size.
- TURF's existing ACToolsUI.setStatus pilot is retained. Sensory remains unchanged.
- Static code checks only; run the browser regression checklist before considering the pilot closed.
- Do not deploy to production yet.


PILOT v8 — SENSORY ENGINE HELPER INTEGRATION
- Integrated ac-tools-ui.js into Sensory Engine v2.
- Two file-name label updates (reset label and selected file name) now use ACToolsUI.setText with the original direct innerText behavior retained as a fallback.
- This change is limited to generic UI text output. It does not alter parsing, data cleaning, attribute detection, statistics, chart rendering, or analysis decisions.
- The shared helper is loaded before the Sensory app inline script.
- Existing statusBadge uses inline HTML with colored status dots and remains unchanged; it was intentionally not migrated to setStatus because the current helper replaces badge markup with plain text.
- Keep this local until the Sensory file-upload and analysis regression checklist passes in the user's browser.
