# StockPopover Help

Status: Beta.4 is the current distributed manual release; Carl acceptance remains pending

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, select the page's `chrome://extensions` 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.4 is the current distributed manual release. Earlier beta.2 and beta.3 packages remain immutable historical release evidence. Beta.4 predates the latest onboarding, authentication, and installation-page fixes, so new external tester distribution and sign-in acceptance are paused until Google OAuth review and a successor exact-version release pass.

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. If an update is required, use the persistent panel notice or orange **Update** action beside **Flag an issue**. 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, replace the installed `StockPopover for Chrome` folder with the newly extracted folder at the same path, use the update 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.

## 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.
- 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 extension badge shows `ON` when automatic detection is enabled, a match count when securities are found, and `OFF` when the page is unsupported or scanning is paused.
- 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 `OFF` in the extension badge and do not scan or modify the page.
- When scanning is paused or turned off, StockPopover removes its highlights, popovers, lookup buttons, and in-page panel artifacts from the current page immediately.
- StockPopover never scans, highlights, or shows the selected-text lookup button or another 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 selected through the StockPopover lookup button 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 page affordance closes and 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 first Chrome installation, StockPopover opens one welcome page. It explains what sign-in unlocks, includes Carl's complete welcome letter, and—after sign-in—shows a local Ferrovial demo plus tips for opening and pinning StockPopover. It does not start Google sign-in automatically. Updates and unpacked Reload do not reopen the page.

You can use local scanning, highlights, 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`.

## 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. Development builds use the Tower-managed loopback service. The current distributed beta.4 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 live StockPopover contract targets the exact private-beta extension ID, `beta` channel, and `1.0.0-beta.4` display version registered in the release metadata. Beta.4 is the current distributed manual release; beta.2 and beta.3 remain immutable historical release evidence. 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 and use the floating StockPopover lookup button.
- If a protected card says sign-in is required, use **Sign in with Google**. What is it?, Fiscal year, Revenue drivers, Investor Relations, 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. 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.
