# StockPopover Help

Status: Beta.11 is Public Stable; exact beta.15 is preserved failed-tester evidence; beta.16 is unsealed QA

Public Stable / Private Dev delivery keeps beta.11 unchanged. The
public page continues to expose one Public Stable download. Carl may privately test one
Private Dev build, and a Retiring Stable build may remain online briefly while testers
upgrade. The pending support update adds the server-derived StockPopover
version to new report receipts and Carl's private review view. Its 90-day
last-seen record contains only UID, verified email, versions, role, contract,
and time—never browsing history, URLs, page content, logs, install IDs, or
tokens.

StockPopover is a private-beta browser extension. It detects public-company symbols and company names as you read the web, highlights only the matched text, and gives you official-source finance context without copy-paste.

## Install and update the manual Chrome beta

Open `https://stockpopover.com/#install` and choose **Download Chrome package manually**. Extract `stockpopover-for-chrome.zip`, move its top-level `StockPopover for Chrome` folder to a permanent location, use the page's `chrome://extensions` link-style copy control, paste the address into Chrome's address bar, enable Developer mode, choose **Load unpacked**, and select that folder. Chrome does not let a normal public website navigate directly to a privileged `chrome://` page, so the control copies the address instead. On macOS, if the folder is in Documents, choose **Allow** when macOS asks Chrome for access so Chrome can keep reading the unpacked extension; StockPopover itself does not receive permission to browse personal files. In Chrome's Extensions menu at the top right, find and pin StockPopover, then sign in with your invited Google account. The package uses StockPopover's public Chrome Web Store identity but has no automatic updater. Beta.11 is the current distributed manual release. Beta.2 through beta.10 remain immutable historical release evidence, and exact sealed beta.12 remains unpublished historical candidate evidence. The combined unpublished beta.14 candidate rolls forward the localized Yahoo Finance, clearer Chrome installation-copy, and Retina Google-button fixes with the Welcome refinements below; none of those changes are part of immutable live beta.11. The repaired Welcome-page OAuth redirect still needs one fresh end-user validation.

Exact beta.15 is separately available through an unauthenticated, unlisted Doug rehearsal page. Anyone with that possession link can download the ZIP. It is absent from the homepage, navigation, sitemap, and Public Stable pointer, and it does not replace beta.11 or Carl's authenticated beta.14 Private Dev page. Beta.15 can test local recognition, highlighting, company identity, public TradingView, and the public IR Atlas catalogue. Protected StockPopover cloud features remain fail-closed until a separate active-registry/backend transition is approved.

The unsealed beta.16 QA candidate repairs beta.15 forward without replacing or
overwriting beta.11 or beta.15. It shows **StockPopover 1.0.0-beta.16** in the
panel footer and toolbar menu, retains packaged company data if hosted data
stalls, consumes stale-tab browser races, and keeps generated extension HTML
free of preload warnings. It is not yet a public download or deployed backend
identity.

Only the current distributed beta version can use the live online services. StockPopover checks the public release pointer at startup, every 12 hours, and on a stale panel open. It shows the persistent panel notice and orange **Update** action beside **Flag an issue** only when the available Public Stable version is strictly newer than the installed version; a newer Private Dev build is never told to downgrade. The action opens `https://stockpopover.com/#install`, where a compact yellow card compares **Your version** with **Available Public Stable**. If the exact public extension cannot answer the page's privacy-minimal version request, the card reports that the installed version was not detected instead of guessing. Local scanning, highlights, selected-text and packaged lookup, company identity, current-page inventory, settings, workflow links, and compatible public TradingView widgets continue working; official-source enrichment, cloud AI, Exa, Ask official docs, issue reporting, and other incompatible online operations stop without retrying. Offline or malformed update metadata does not produce a warning.

To update, download and extract the newest ZIP from the Install section, replace the installed `StockPopover for Chrome` folder with the newly extracted folder at the same path, use the page's `chrome://extensions` copy control, paste it into Chrome's address bar, and click **Reload** on the existing StockPopover card. Keep the same folder path and do not load a second copy. After installation, **Sign in the extension with your Google Account.** This distinguishes StockPopover account setup from signing into Chrome; Google's official branded button keeps its required label.

## Popover and Panel

- The popover is an in-page content-script surface anchored close to the matched symbol or company-name text.
- The popover is not anchored to the browser toolbar or extension icon.
- Compact company analysis stays close to the mention in the popover. Explicit security selection opens Security Details in the side panel, while long, persistent, or editable workflows also use the panel.
- The native Google Chrome side panel shows a dense inventory of symbols and companies currently visible in the active page viewport. Scroll or resize the page to replace the visible inventory.
- Very long pages still use viewport-only scanning. StockPopover may log a performance diagnostic for unusually large pages, but it should not disable highlights solely because the full document is large.
- When the native Chrome side panel is unavailable, supported web pages use a virtual in-page panel with the same inventory, Settings, and query-debug routes. On phones it appears as a bottom sheet; on tablets and desktops it appears as a trailing side sheet.
- Click a panel inventory row or search result to open the Panel Security Details View. Use Back to return to the Panel Current Page View.
- In beta.15, Security Details places the validated **Investor Relations** catalogue immediately after the company summary. Existing QA-passed files and classification groups are public and remain readable while signed out. Starting or joining missing/stale enrichment from the extension requires Google sign-in because its App Check token is tied to the verified beta account; public IR Atlas can start the same job without account sign-in through web App Check. The file list updates inside a bounded area so cards below do not jump, and StockPopover never calls IR Indexer directly.
- In beta.16, X/Twitter finance cashtags such as `$UNFI` use the ordinary StockPopover after the normal hover delay while only X's competing finance hovercard is hidden. Cashtag clicks, navigation, profile hovercards, and unrelated X controls remain native; cancellation or close restores X immediately.
- Beta.16 runtime status uses only **Page scanning**, **Cloud sign-in**, **IR Atlas**, **TradingView**, **Background tab state**, or **Background service**, plus a stable code. The Log Console shows the safe category, code, timestamp, and beta version rather than raw provider or page text.
- Hosted IR Atlas identifies its signed-in Firebase email. One unauthenticated protected call may force-refresh the Firebase identity and App Check and retry once. Network-blocked verification keeps the account signed in; stale identity requires sign-in again; denied access offers **Switch Google account**. Raw Firebase and App Check errors are not rendered.
- Investor Relations loads public publications before App Check. Missing publications get one protected start; **Try again** forces fresh verification, each verification/request stage stops after ten seconds, and existing files remain visible during refresh. A failed TradingView card distinguishes renderer handshake from widget readiness and offers **Retry TradingView** for only that frame.
- The panel Settings button opens settings as an internal subpage with Back navigation to the inventory.
- StockPopover does not expose a separate browser-managed Settings page; settings stay inside the best available panel surface.
- The top of the panel shows automatic security detection status for the active page and can turn global scanning on or pause the exact page, subdomain, root domain, or all pages.
- The top of the panel also shows Google account state. `Sign in with Google` uses the signed-in Chrome Google account first and falls back to a visible Firebase-hosted sign-in tab when needed. Google sign-in is required for private Ask Official Docs history. Approved beta users can receive ordinary automated Exa enrichment within their quotas, while the interactive Exa Lab remains hidden unless the server confirms one of the two exact owner accounts; a generic administrator claim or client-visible account text cannot unlock it.
- Public-company websites in the local security database are off by default, so ordinary company/product/API pages do not get broad company-name popovers. Use `Scan site` in the panel when you explicitly want to override that rule for the current website.
- Content, community, blog, news, market-data, and investing-context pages remain eligible for automatic security detection.
- The accepted extension badge uses white `0`–`999` for the current page's match count, white `⏸️` for a global pause, white `🌐⏸️` when the current website is paused, white `🚧📄` for an unsupported page, white `🚫🏷️` when page classification blocks scanning, and red `⚠️` when a runtime error has been recorded. Its hover title mirrors the status as **Active: N matches**, **Paused**, **Paused on this website**, **Unsupported page**, **Blocked by classification**, or **Runtime error**. Runtime errors add a safe subsystem such as **Page scanning** when known; raw messages and page identities stay out of the title. Chrome may add its own permission line below it. A tab that closes during a badge repaint is a normal browser race and is ignored instead of being reported as a global runtime error.
- The StockPopover icon may subtly animate while the extension is scanning a page or while an extension page is working.
- StockPopover runs only on `http://` and `https://` pages. Internal browser, extension, local file, and other non-web schemes show `🚧📄` in the extension badge and do not scan or modify the page.
- When scanning is paused or turned off, StockPopover removes its highlights, popovers, and in-page panel artifacts from the current page immediately. Reload cleanup also removes a retired lookup button left by an older build.
- Selecting text never creates a StockPopover button on the page. To look up selected text, right-click it and choose **Ask StockPopover**. StockPopover never scans, highlights, or opens a recursive popover inside its own popovers, native/virtual panels, extension pages, or hosted widget and authentication surfaces. Ordinary websites and embedded page content remain eligible.
- The main research popover has no Close button. Pale-yellow filled-tonal **Business Model** sits inside native Symbol Info at the bottom-left while purple icon-only **Read more** sits at the bottom-right. The company heading and identifier chips use the full width above them. Click or touch outside the popover, or press Escape, to dismiss it. Clicking a compact card opens and focuses the matching unrestricted card in Security Details. The panel page scrolls normally, individual cards do not gain scrollbars, and selecting the same security again refreshes that route without requiring Back first.
- The beta **Flag an issue** backend is deployed, and controlled live submissions plus Gmail report-copy delivery have occurred. Security Details owns the dialog, sign-in, evidence capture, and submission. The compact popover exposes an italic **Flag an issue** text button in its fitted bottom-right footer, outside every card, with 7 px above and below. It is transparent at rest and becomes filled tonal on hover, focus, and press. It opens Security Details and requests the existing panel dialog once, but the popover cannot render the form or submit a report. Reporting requires an authorized and verified private-beta reporter/tester to sign in with Google. Reporter/tester access does not grant Carl's private review workspace or owner-only Exa benchmark and global-promotion controls. An exact uppercase ticker explicitly submitted through **Ask StockPopover** can resolve even when it is also an English stopword, such as `AS`; automatic prose scanning remains conservative. If a selected-text or panel search has no local match, the panel alone shows **Security was not found** with a separate **Flag missing security** action; the report preserves the lookup and any user-approved selected mention/page context without inventing a detected security. An unresolved lookup offers only **Security was not found**, the only category valid without a detected security. Resolved-security reports also offer **Incorrect security found**, **This is not a security**, **TradingView failed**, **Research data is incorrect**, **Research data is missing**, **Extension bug**, and **Something else**; an incorrect-security report can identify the security you expected. Complete wrong-token/provider rejection, continued disclosure, live deletion timing, screening/triage reliability, and end-to-end acceptance remain open.
- StockPopover prefills the security when one exists, match/resolver evidence, build information, and only diagnostics correlated to that exact tab, window, canonical page path, and page navigation. Switching tabs or windows, or navigating/reloading the article, disables **Flag an issue** for that selection; reopen the security from the current page before reporting. Opening the form prepares a local screenshot and preselects it for the report; the image, bounded page/highlight context, and correlated technical diagnostics are independently removable before upload. Automatic TradingView/resolver failure detection stays local, may show a dismissible **We noticed a problem** prompt, and never submits page context or an image without confirmation.
- Automatic capture covers the visible web-page viewport, not Chrome's browser chrome or native side-panel pixels. When those pixels matter, choose **Capture window** and select the Chrome window containing the article and panel in Chrome's share picker. StockPopover records one frame, stops sharing immediately, and lets you review or remove it. You can also choose a PNG or JPEG file manually. Structured security/panel state is included separately. The client targets 3.5 MiB; the server accepts normalized evidence at most 4 MiB, 20 megapixels, and 8,000 px per side, then decodes/re-encodes it to remove metadata.
- When that backend is active, the verified reporter receives a safe Gmail copy and secure report-status link from `carlmalartre-agent@minibiz.com`, plus another email after an approved fix/no-code conclusion or after Carl closes the case without approving a change. A terminal rejection includes Carl's bounded explanation and the status page no longer promises another review. Accepted reports may include the category, security, and screened/de-identified description or expected-security text. Screened/de-identified evidence may be analyzed by a stateless tool-less AI step; Codex receives only its sanitized projection. Codex web search and process network access are disabled in this beta, so public-source verification is manual and an unsupported diagnosis must remain inconclusive; a report-supplied URL is never opened. Carl is the only application reviewer. Existing Minibiz organization/project administrators and the exact required Firebase, DLP, and Model Armor service agents retain technical platform access to stored reports and evidence under Google Cloud IAM; they are not part of the application review workflow. During this beta, reporting and read-only triage may operate, but automatic code implementation and deployment remain disabled while mutation trust is blocked. If intake screening is unsafe or unavailable, nothing enters AI triage and email withholds the evidence; the bounded structured submission and optional metadata-stripped screenshot are held as opaque server-only quarantine objects. Carl alone performs application-level audited out-of-band manual review, and the objects are never placed in AI. A manual close emails only Carl's reporter-safe summaries and changes the evidence deadline to 30 days after closure; an unresolved quarantine remains capped at 180 days. A later **Needs review** status instead means automation stopped after intake and Carl must investigate; a screened derivative may already have passed through the isolated stateless AI projection. Replies are not monitored. If Gmail's send result is ambiguous, StockPopover does not automatically resend: Carl's private page can use a content-free Message-ID search token, acknowledge an independently confirmed delivery without sending, or knowingly authorize a retry that may create a duplicate. A definitively failed delivery is shown separately and can be retried only after Carl confirms remediation. The app never reads Gmail or reporter replies. Reports and screenshots remain private, never enter Git or generated public data, and accepted evidence is scheduled for managed deletion 30 days after resolution (including release, terminal rejection, or manual/no-code closure) or at 180 days unresolved; bounded audit metadata is scheduled after 24 months. Managed deletion may complete after eligibility. StockPopover verifies deletion of each issue-related local Codex transcript when its deadline is reconciled, but the current Codex SDK cannot verify deletion of a remote transcript; do not submit secrets or unrelated private information.
- Retention is state-dependent: unresolved evidence is capped at 180 days from creation. After resolution, it receives a full 30 days from that resolution even when the resulting deadline is later than creation plus 180 days. If the unresolved deadline is reached first, the evidence is deleted and the report becomes a non-retryable **Needs review** item that Carl can close without recreating an evidence window.
- Security Details shows the complete official-source description, fiscal-year facts, revenue drivers, Latest News answer, and citations. A transport status is never substituted for research content; a missing result shows a specific unavailable state.
- The popover starts with native Symbol Info from the local FinanceDatabase security, then Symbol Info (TradingView) and Advanced Real-Time Chart (TradingView). The two TradingView card titles are hidden by default.
- The Advanced Real-Time Chart passes wheel and two-finger gestures to the surrounding page or panel by default. Desktop hover or keyboard focus reveals **Interact with chart**; the first touch activates it on a touch device. Clicking/touching outside the chart or starting to scroll the surrounding surface returns it to scroll-through mode.
- Mouse hover uses a 75 ms intent gate to ignore quick cursor movement across ticker tables. At that gate, StockPopover creates the final shell offscreen and starts all independent compact-data work in parallel while keeping the UI hidden. Local security hydration and compact rendering do not wait for the unrelated one-use benchmark check; a failed benchmark lookup continues as a normal run. Official-source work still discovers safe domains first, then runs description, fiscal-year, and revenue research concurrently. Leaving before 75 ms cancels everything; leaving after the gate lets deduplicated work finish and cache without showing the popover.
- The reveal occurs at 500 ms on every hover. A click, tap, or held touch on highlighted content is always page-owned and never opens the popover, so links and touch behavior continue working. Keyboard focus remains the accessibility path; touch users can open the browser panel and select or search for the security there.
- When the same canonical security appears more than once in the visible viewport, its topmost visible semantic mention stays at full strength and its other visible mentions use 45% opacity. Pointer hover, or keyboard focus on a duplicate inside a focusable link or control, temporarily restores that duplicate to full strength without changing the primary. Window, resize, and nested-container scrolling recompute the primary with a 90 ms crossfade; reduced-motion users get the same handoff without animation. Wrapped text remains one mention, and de-emphasized matches keep the same links and 75/500 ms popover timing.
- **Fast Independent Popover Cards**, under **Responsive Compact Research Surfaces**, normally uses one 360 px-wide shell with 8 px horizontal gutters, 344 px cards, 8 px gaps, and the complete 756 px maximum card budget. An 8 px page-edge guard lets the shell and cards shrink fluidly on narrower viewports. Hidden preparation fits the height to enabled cards; the full default shell remains at most 814 px high, while a shorter customized layout has no disabled-card whitespace. The exact default card heights remain native Symbol Info (92 px), Symbol Info (TradingView) (168 px), Advanced Real-Time Chart (TradingView) (180 px), Ask official docs (92 px), What is it? (92 px), and Revenue Drivers (92 px). **Compact Popover Action Rail** keeps pale-yellow **Business Model** at the bottom-left and purple icon-only **Read more** at the bottom-right inside native Symbol Info. **Compact Flag Footer** keeps the Flag launcher in a fitted 7/7 px bottom lane. Disabling native Symbol Info also removes its two actions instead of floating them over another card.
- Every fixed-height card is pre-positioned, empty, transparent, and inert during hidden preparation. The shell has no visible global loader, no skeleton, and no scrollbar. At 500 ms, every card that is already ready or failed appears at its reserved location; a later card does not wait for a pending card above it. Each remaining card reveals when its own work finishes, using the 140 ms opacity/position/scale transition or an immediate reduced-motion equivalent. A card still pending after 20 seconds keeps its place and shows a safe two-line reason.
- **Cloud official-source enrichment** and **Cloud AI fallback** are enabled by default for new or incomplete settings. Either can be disabled in Settings, and an explicit opt-out remains saved. Normal fiscal, description, and revenue requests settle independently. When fallback is enabled and one remains empty, one additional combined request against the same verified official domains tries to complete only the missing cards; an incomplete bundle is never accepted as a complete 24-hour cache hit.
- Native Symbol Info uses the local security record for the company name, a Google-style quote chip such as `APP:NASDAQ`, the precise full exchange name, and the FIGI Primary Asset Sub-Type. A fiscal chip such as `FY2025 · Dec 31` appears later with a quick non-blocking animation when enrichment succeeds; there is no placeholder or failure chip. The complete Fiscal Year card, sources, and unavailable reason remain in Security Details instead of consuming a standalone popover slot.
- Window, horizontal, vertical, and nested-container scrolling preserve the opening offset between the popover and highlight without reclamping. If a virtualized page removes the anchor, the popover freezes at its last coordinates instead of jumping.

## Welcome, Sign-in, and Community

On a genuine first Chrome installation, StockPopover opens and focuses one Welcome page. It explains what sign-in unlocks, includes Carl's complete welcome letter, and—after sign-in—offers live local Ferrovial practice plus tips for opening and pinning StockPopover. It does not start Google sign-in automatically. Updates, Chrome updates, unpacked Reload, `runtime.reload()`, browser restart, and ordinary startup do not reopen the page.

**Persistent Welcome Access** adds **Welcome** as the first StockPopover-provided item in the toolbar icon's right-click menu. Choosing it opens or focuses one ordinary Welcome tab and does not start Google sign-in. Welcome never automatically prepares a website destination and never opens, recreates, or keeps `stockpopover.com` alive; closing that website leaves it closed through Welcome focus, visibility, authentication, and timer activity.

**Live Welcome Practice** gives the authored `FER` example the production highlight behavior while keeping Welcome's scanner disabled. The later **Welcome Popover Parity** refinement opens the same popover cards, order, settings, TradingView content, authentication states, and actions that the user sees on an ordinary supported page. FER is supplied directly, so Welcome still does not scan its surrounding text or perform symbol lookup; cards perform their normal public or signed-in work only after the user opens the popover. The former **Demo** label and redundant bottom completion controls are absent. The founder letter begins with **Bonjour!** and uses italic body copy and sign-off while retaining its normal heading and feedback footer.

Persistent Welcome Access and the original one-card Live Welcome Practice await Carl's manual validation in exact sealed beta.14. Welcome Popover Parity is included in unsealed beta.15 grouped QA and does not rewrite beta.14. None of these refinements changes immutable live beta.11.

You can use local scanning, highlights, right-click selected-text lookup, local security search, current-page inventory, native Symbol Info, public TradingView cards, base Workflow links, settings, Help, Discord, and update checks without signing in. Cloud research, Latest News and other Exa cards, Ask official docs, Business Model, issue reporting, case status, and account synchronization require Google sign-in. A protected signed-out card keeps its title and layout and says **This card requires you to be signed-in** with a **Sign in with Google** action. This ordinary state is not reported as a provider problem.

Use **Discord - Help and Community** from the welcome letter, the panel footer, or StockPopover's toolbar-icon right-click menu. All three open the fixed community invite at `https://discord.gg/j6jJ94EDne`.

The bottom of the panel and the final disabled item in StockPopover's toolbar-icon right-click menu show the exact running display version, such as **StockPopover 1.0.0-beta.16**. Include that value when asking for support. Exact published beta.15 cannot gain this UI after publication; the behavior is part of unsealed beta.16.

Investor Relations reads an existing validated IR Atlas publication through the public catalogue first. It starts the protected enrichment workflow only when no publication exists, so useful published files remain visible if sign-in or release compatibility is temporarily unavailable.

## Highlight Rendering

Open Settings > **Highlight rendering** to compare two attached painting methods. The saved choice applies immediately without reloading, restarting scanning, loading search data, or matching the page again. It preserves recognized highlight identities, cached popover preparation, page-owned links, duplicate emphasis, and the 75/500 ms hover behavior.

- **Paint 1A — Native text paint (recommended)** is the default. The browser paints the translucent fill and underline directly with the source text, so it stays attached during scrolling. Its appearance is intentionally flatter because native text highlights cannot reproduce every rounded overlay effect.
- **Paint 1B — Scroll-root overlays (experimental)** keeps the richer rounded fill and inset accent inside a safe scrolling container. An unsafe individual highlight falls back to native paint, and uses the compatibility overlay only when neither attached method is available.

With remembered highlights enabled, StockPopover retains at most 2,000 valid logical highlights in memory per document frame. Stable connected text can leave and re-enter the viewport with the same record instead of being recognized again. This does not save page text, offsets, or ranges to Chrome storage, and navigation, reload, pause, or an invalid page state clears it. A virtualized site such as Discord may destroy or recycle an offscreen row; the old identity is then discarded and replacement DOM must be scanned as new content.

## Highlight Scanning

Open Settings > **Highlight scanning** to compare two independent controls on Discord and other changing or virtualized pages. The saved choice applies immediately to supported open pages, without reloading the page or extension. Defaults are **1A — Adaptive virtual feeds (recommended)** and **2A — Balanced (recommended)**.

- **1A — Adaptive virtual feeds (recommended)** prioritizes newly inserted or recycled visible areas during scrolling and checks the full visible viewport after scrolling stops. It balances symbol coverage with CPU and battery use.
- **1C — Aggressive visible viewport** checks the entire visible viewport on every eligible pulse. It can find fast-changing symbols sooner at a higher CPU and battery cost.
- **2A — Balanced (recommended)** scans immediately, then about every 200 ms while scrolling, followed by a visible-viewport reconciliation once scrolling and its row recycling have been quiet for 150 ms.
- **2B — Maximum coverage** scans immediately, then about every 100 ms, followed by reconciliation after a 75 ms quiet window. This is the most responsive and most resource-intensive cadence.
- **2C — After scrolling stops** performs no scan during active scrolling and runs one reconciliation after the page and its recycled rows have been still for 300 ms. It uses the least scrolling-time activity, so highlights appear later.

All six combinations remain visible-only and bounded: they do not scan the full document or offscreen virtual-list rows. StockPopover queues and coalesces changed nested content, gives scroll-associated recycling a bounded maximum wait before the final viewport check, and performs one bounded reconciliation instead of unbounded mutation work if that queue is overloaded.

## Data Source

The symbol and company-name universe comes primarily from FinanceDatabase:

`https://github.com/JerBouma/FinanceDatabase`

The packaged data also includes a small Google Finance benchmark overlay so the extension can consistently recognize the public global-exchange benchmark sheet.

Generated local data is packaged into the extension for fast private lookup.

The related **IR Atlas** research product is live at `https://ir.stockpopover.com`. It uses the same generated data plus a derived web catalog so you can browse `0-9` and `A-Z`, search and filter securities, move between companies with the keyboard, and inspect the enrichment content that StockPopover can render.

## Exa Enrichment

Exa is used only from build scripts or Firebase Functions. The extension runtime never contains the Exa API key.

Enrichment has two stages:

1. Discover official company IR websites, including IR domains, subdomains, annual-report/report microsites, investor-presentation pages, vendor-hosted IR pages, and report portals.
2. Add government and exchange domains only from the precompiled trusted-source registry after ToS/robots review. `sec.gov` is included as an allowed default regulatory source.
3. Use only those domains and their approved subdomains for fiscal-year dates, annual reports, investor presentations, income statements, revenue streams, and other grounded research.

If an answer cannot be grounded in official company documents, official websites, or SEC, StockPopover says so.

When enrichment is available, the popover adds the fiscal-year chip to native Symbol Info, shows what the company does, and shows supported revenue streams ordered largest to smallest. Revenue streams must be positive monetary line items from allowed official-source citations. Each fixed compact card handles its own success or safe unavailable state; there is no visible cloud-status loader that changes the shell size. The full fiscal-year result remains in Security Details.

The website uses the same enrichment bundle. When Firebase enrichment is configured, selecting a company can reuse a complete enrichment cache for 24 hours or reload it from Exa with the `Reload enrichment` control.

When the optional Developer tools card is enabled, its `Query` button opens the panel with the official-source Exa configuration, allowlisted domains, published-date filters, statuses, retries, costs, and timings used to build the popover content. These calls use `Instant + structured synthesis`: Instant is the base search mode, while structured summaries and output schemas add processing time.

## Ask Official Docs

In beta builds where **Persistent Ask Official Docs Conversations** is enabled, submit the popover's **Ask official docs** card to open a dedicated panel conversation. StockPopover resumes the latest thread for that company by default. Use **New conversation** and the conversation menu for separate threads.

Google sign-in is required. The server derives the account owner, company identity, and allowed official domains; the browser cannot choose them. Answers cite supported official sources or show a clear unavailable reason. If a request fails, the staged question remains visible and **Retry** reuses the same idempotency key instead of storing a duplicate.

Conversation history is stored privately in Firestore with no automatic expiry in the current beta. **Delete current** permanently removes one thread; **Delete all** permanently removes all Ask Official Docs history for the signed-in account. Direct client Firestore access is denied. The beta feature remains awaiting manual validation and production deployment, so an unconfigured build may show an unavailable state.

The optional Developer tools card also shows a compact render timing link such as `Ready 420ms`. Click it to open the StockPopover Log Console.

Custom Exa blocks are stored as structured JSON, not raw HTML, CSS, or JavaScript. Enabled and budget-admitted compact auto-run queries start once during hidden preload and reuse the same in-flight or cached result on reveal and panel navigation. Latest News is configurable but disabled in the compact popover by default, while its full answer and citations remain in Security Details. During this beta, interactive Exa Lab launchers, manual-query cards, editing, and testing are available only when the server-derived exact-owner capability allows them. Non-owners do not see launchers, background open requests are rejected, and opening `exa.html` directly fails closed. When available, the single extension-hosted Exa Lab tab shows Google sign-in state, transport/App Check/Firebase diagnostics, stage-by-stage test progress, escaped answer/output text, source links, request ID, latency, retry count, and cost metadata.

Paid and privileged are separate policies. Ordinary approved beta users may still receive automatic paid Search, Contents, and Answer enrichment within quota. The whole interactive Exa Lab, including manual queries, batch benchmarks, and global query promotion/rollback, is gated by the server-derived immutable two-owner capability for only `carlmalartre@minibiz.com` and `carlmalartre-agent@minibiz.com`; a generic `admin` claim cannot authorize it.

Monitor configuration, navigation, compact rendering, and query execution are hidden for this beta. Existing stored monitor records are preserved but dormant: they are not listed or editable, stale persisted navigation returns to inventory, and Monitor management, preflight, run, and Exa-tab messages fail closed before authentication or cloud access.

The Exa Lab query editor can draft an `outputSchema` JSON object from a natural-language description. It calls the Firebase schema assistant when configured and falls back to a local deterministic draft in development or unconfigured builds. Saved schemas are validated before storage and again before server execution.

The popover `Business Model` button opens **Business Model Panel** for the selected company in Chrome's native side panel, or in the virtual panel fallback when the browser has no native panel API. Security Details also has a Business Model action, and Back returns to that same security. The panel uses the existing built-in Exa Answer workflow, requires Google sign-in, validates structured JSON before display, and reuses the global 30-day cache when the same security, prompt version, and schema version have already been generated. Refresh explicitly requests a new analysis. The separate Research workspace remains available only through its explicit research-page route; the popover no longer opens it.

Workflow Tools are editable safe links for Google Finance, Morningstar, TradingView, Bloomberg, Yahoo Finance, BamSEC, TIKR, the company website, Investor Relations, and official reports. Market-specific exchange maps generate direct provider URLs when possible; provider search pages are used only when a direct mapping cannot be generated. Direct company, IR, and report links stay hidden when no official URL is available instead of falling back to Google Search.

## TradingView

FinanceDatabase remains the source of truth for security identity. StockPopover maps that exact record to a TradingView quote key using a versioned exchange registry. A deterministic mapping is used when the FinanceDatabase exchange is verified. TradingView Symbol Search is used only as a bounded identity-matching fallback; StockPopover does not store widget prices, page content, raw search responses, cookies, or TradingView account data.

TradingView runs through a verified StockPopover renderer. The local development-renderer workflow is temporarily paused while Tower Control is not in use. The current distributed beta.11 build pins the exact public QA renderer build recorded in its release contract. The dedicated production renderer has not been promoted; `ir-safari.web.app` remains a legacy compatibility route. The renderer stays hidden until its origin, frame, nonce, service, protocol, and applicable build identity pass. A timeout, wrong local application, or identity mismatch removes the frame and leaves local StockPopover information available instead of displaying unrelated content. This environment separation is implemented but awaits Carl's live acceptance under `RENDERER-ENV-01`.

The Panel Current Page View includes a Ticker Tape for resolved securities visible on the page. Explicit symbol selection opens the Panel Security Details View. That view uses one Material Card per TradingView widget and selects the stock, crypto, Forex, or other-instrument solution automatically.

The compact desktop popover normally gives TradingView a 344 px card and shrinks it with the guarded shell on a narrow page. Native and virtual panels have no forced minimum width or horizontal scrollbar. They use 8 px gutters inside a transparent pane that fills the host up to 608 px and stays centered; content is 344 px wide in a 360 px host, grows to at most 592 px, and leaves symmetric outer whitespace in a wider host. Every TradingView card, host, frame, renderer/container layer, and widget configuration uses `width: 100%`; Advanced Real-Time Chart uses `autosize: true`. Chrome controls its native side-panel width: Chromium currently treats 360 CSS px as its default/minimum acceptable content width, but the public `sidePanel` API does not guarantee or set that width.

Settings opens on **Basic**. **Experimental** contains Highlight rendering and Highlight scanning; **Developer** contains Cloud controls, Exa timings, and diagnostics. Basic > Popover Layout shows a visible accessible `756 px` budget meter. Enabling, adding, or reordering cards cannot increase an over-budget layout, so disable one card before enabling another. The prepared shell never adds a scrollbar.

Sanitized `popover.blocks` is the saved compact identity and order. The Popover Layout editor supports every listed card and custom Exa cards, and provides **Display card title** for every titled section. Native Symbol Info, Symbol Info (TradingView), and Advanced Real-Time Chart (TradingView) are ordinary sortable rows instead of children of a Security Header group; the two TradingView titles default to off. Ask official docs is the compact entry point: submitting a question stages it and opens the supported panel route. Latest News defaults off only in the compact popover and stays complete in Security Details. Legacy Security Header settings expand into the two TradingView rows, and the former Fiscal Year slot becomes native Symbol Info. Customized layouts preserve their existing cards and order; Symbol Info is enabled when it fits the budget and otherwise appears disabled for deliberate placement. The outer popover uses a 16 px corner radius while nested cards use 12 px, preserving a clear container hierarchy.

Matches with confidence from 65 to 89 are shown with an `Unverified TradingView match` warning and a `Choose symbol` action. Lower-confidence results are not guessed. TradingView Settings opens in a full tab where you can show, hide, or reorder Cards, inspect exchange evidence, run symbol matching, and save a security-specific quote-key override.

TradingView symbol links route back to the matching FinanceDatabase security in the Panel Security Details View when the widget supports a custom symbol URL. Every widget keeps its own centered footer with the linked market description before the visible `by TradingView` credit; the description and TradingView legal links open TradingView. This per-widget attribution is an integration/licensing requirement and must not be consolidated onto only the first widget without written TradingView approval.

When a provider workflow opens, StockPopover automatically checks bounded identity evidence on the destination page. Correct-looking destinations are recorded as auto-confirmed; errors, mismatches, ambiguous searches, and stale provider identifiers are submitted to the reviewer queue. There is no in-page confirmation prompt. Authorized reviewers can inspect pending and auto-confirmed records, correct the direct URL, promote a mapping, or reject it from `Review User Submitted Content` in the panel.

The Investor Relations link uses the official URL returned by Exa domain discovery. StockPopover does not replace a missing Exa result with a generic Google Search link.

Current stock price is intentionally not implemented yet. StockPopover does not store or reprocess Google Finance price data; a later price feature should use a licensed market-data source such as Alpha Vantage for broad delayed/end-of-day coverage.

## Privacy

- Page scanning is local.
- No analytics.
- No ads.
- No selling data.
- No provider API keys, passwords, browser cookies, OAuth access tokens, Firebase ID tokens, or Google/Firebase refresh tokens are persisted in local extension storage or bundled files.
- Google access tokens and Firebase ID tokens are kept only in extension session storage or memory. The extension stores bounded account metadata locally but does not persist Google or Firebase refresh tokens.
- The deployed StockPopover Functions contract accepts exact beta.11 Public Stable and exact sealed beta.14 Private Dev. Beta.11 is the current distributed manual release; beta.2 through beta.10 remain immutable historical release evidence, and exact sealed beta.12 and beta.14 remain unpublished release evidence. Exact beta.15 tester bytes are available through the unlisted Doug rehearsal page but are not an active registry release and did not move the public pointer. Protected StockPopover cloud work remains fail-closed until a separately approved transition replaces beta.14 or promotes beta.15. A stale or differently labelled build must not receive a token.
- StockPopover does not treat forwarded client-IP headers as identity or authorization. Signed-in UID quotas remain the server boundary while an IP-signal policy is still under review.
- On Chrome, StockPopover silently recreates an expired or reload-cleared Firebase session from the signed-in Chrome Google account. Selecting `Sign out` stores an explicit sign-out marker, so reloads remain signed out until `Sign in with Google` is selected again. The visible Firebase-hosted Google sign-in tab remains the fallback.
- Community sync is opt-in and stores structured enrichment records, not raw page text or browsing history.
- A submitted issue is an explicit support transaction, not background analytics. Optional context and screenshots are screened and quarantined when unsafe; report text can never authorize AI tools, code changes, or deployment.

## Keyboard

- Enter activates the focused popover control.
- Esc closes popovers.
- Alt+Shift+I pauses/resumes the current root domain. Use the panel status menu for exact page and subdomain pauses.
- Tab and Shift+Tab move through controls.

## Troubleshooting

- If a company is not detected, select the text, right-click it, and choose **Ask StockPopover**.
- If a protected card says sign-in is required, use **Sign in with Google**. What is it?, Fiscal year, Revenue drivers, Sources, Latest News and other Exa cards, Ask official docs, Business Model, cloud official-source enrichment, cloud AI fallback, issue submission, and case status all require an authorized Google account. The new validated Investor Relations catalogue is a public read; only starting or joining its enrichment from the extension needs the verified account-bound App Check token. Public Symbol Info and TradingView cards remain available without sign-in. If a signed-in cloud request instead reports data unavailable, open `Details` to see its safe diagnostic category, stage, HTTP status, request ID, retry count, and `Retry cloud data` action; use `Diagnostics` for recent runtime/performance records.
- Open the Log Console from the popover timing link, Settings > Advanced > Diagnostics, or by right-clicking the extension icon and choosing `Open StockPopover Log Console`. It joins page, service-worker, Firebase, Firestore, and Exa spans by trace, shows hover-to-visible and hover-to-ready timing, and links authorized developers to the matching Cloud Logs. It can arm a one-use cache-bypass benchmark, pause capture, clear logs, export JSON, and toggle verbose debug mode. Arming first verifies renewable developer Google authentication; a failed preflight leaves the benchmark unarmed and offers sign-in or retry. Cache bypass and cache clearing never clear authentication.
- Debug mode adds noisy scan trace events for diagnosis. It does not need to be on all the time; compact task timings are always recorded in the Log Console.
- If the Google sign-in tab does not show the `Continue with Google` button, the helper page should show a visible setup/status message. Return to the panel and try again after reloading the extension.
- If benchmark arming reports a build setup error, reload a cloud-enabled build that contains the Chrome OAuth client. If it reports developer sign-in required, select `Sign in with Google` once; ordinary reloads and token expiry should then renew silently.
- Use the popover `Query` button to inspect whether packaged Exa enrichment exists, which domains were allowed, and how long each Exa query took.
- If a website layout is affected, pause the extension for the exact page, subdomain, root domain, or everywhere from the panel status menu.
