## ADDED Requirements ### Requirement: Ticker search entry point The web app SHALL present a search input where a user enters an NYSE/Nasdaq ticker to request an evaluation. Invalid or unresolvable symbols SHALL produce an inline error without navigating away. #### Scenario: User searches a valid ticker - **WHEN** a user enters a resolvable ticker and submits - **THEN** the app initiates an evaluation for that ticker #### Scenario: User searches an invalid ticker - **WHEN** a user submits a symbol that does not resolve - **THEN** the app shows an inline not-found message and stays on the search view ### Requirement: Evaluation request orchestration The app SHALL orchestrate the pipeline for a request: fetch market data, run the equity-evaluation engine, then invoke the analysis agent, returning both the structured evaluation and the written analysis to the client. #### Scenario: Full pipeline succeeds - **WHEN** a valid ticker is evaluated with data and an agent key available - **THEN** the app returns the structured evaluation and the written analysis #### Scenario: Partial pipeline (agent unavailable) - **WHEN** market data succeeds but the agent is unavailable - **THEN** the app returns the structured evaluation and indicates the narrative is pending ### Requirement: Evaluation report view The app SHALL render the evaluation as a report with clearly delineated sections: current standing, earnings recap and quality-of-earnings caveats, financials and segments, valuation and over/undervalued reasoning, macro factors, timing, entry levels, exit/targets, stop-loss, bull-versus-bear, the actionable plan, and the disclaimer. Tabular data SHALL render as tables and unavailable values SHALL be shown as such rather than as zero. #### Scenario: Report sections rendered - **WHEN** an evaluation result is available - **THEN** the report view displays each populated section in order #### Scenario: Unavailable values shown honestly - **WHEN** a section contains an unavailable value - **THEN** the view displays it as unavailable rather than as a zero or blank number ### Requirement: Price chart with marked levels The app SHALL render a price chart with the computed moving averages and overlay markers for the recommended entry bands, exit/target levels, and stop-loss levels so the user can see them against price history. #### Scenario: Levels overlaid on chart - **WHEN** the report renders with computed levels - **THEN** the chart shows price history with entry, exit, and stop-loss markers ### Requirement: Loading and error states The app SHALL show progress while an evaluation runs and SHALL present typed errors (data unavailable, rate-limited, agent failed) as user-readable messages without blank screens. #### Scenario: Loading indicator during evaluation - **WHEN** an evaluation is in progress - **THEN** the app shows a loading state until results or an error return #### Scenario: Error surfaced to user - **WHEN** the pipeline returns a typed error - **THEN** the app displays a readable message describing what failed ### Requirement: API key configuration in the app The app SHALL provide a way to configure the market-data and Anthropic API keys via environment/config, SHALL NOT expose secret keys to the browser, and SHALL indicate when a required key is missing. #### Scenario: Keys read server-side only - **WHEN** the app calls external providers - **THEN** secret keys are used only in server-side code and never sent to the client #### Scenario: Missing key indicated - **WHEN** a required key is absent - **THEN** the app indicates which capability is unavailable until the key is set