Spaces:
Sleeping
Sleeping
Commit History
-
feat: The Brief renders as the published research noteβ
The Brief was a stack of ~20 cards. It is now one document, reproduced from the note published on 2026-09-02: masthead, ten sections in a fixed order, sticky contents bar, sticky data rail, sourced footer. Same palette, same typography, same placements. The reproduction is asserted, not asserted-to-be. tests/test_note_fidelity.py compares against tests/fixtures/published_note.html and passes only if the stylesheet matches declaration for declaration (117 rules, no additions) and each of the three figures is byte-identical -- coordinates, order, attributes. Two encodings are allowed to differ and both are pinned by that test: the .rt-note selector prefix, and xmlns on every <svg>. The palette is the app's now, not the document's. Every hardcoded colour across 19 modules -- 330 of them -- was remapped onto the note's thirteen tokens, config.toml was repointed, and Inter gave way to the note's three families. A light document inside a dark shell would have been two designs. What the fiβ¦93f9cc0
-
fix: close the numpy import race that took the live Space downβ
The deployed app died at load with "partially initialized module 'numpy' has no attribute 'isscalar' (most likely due to a circular import)", raised from inject_global_css() -> _register_plotly_dark_template(). Two threads reaching numpy at once. The reranker warms up on a background thread -- the optimisation added so a cold start does not show a blank page -- and importing torch pulls numpy in behind it. Assigning pio.templates.default makes plotly deep-copy and re-validate the template, and that validator calls np.isscalar. On a Hugging Face cold container the warmup was still importing when a rerun re-entered the validator, and Python handed it a half-built module. Not a regression from the guidance work: theme.py has not changed since the rename, and the race arrived with the cold-start optimisation itself. It surfaces on the Space and not locally because the Space is slow enough to widen the window. Fixed at the source -- numpy is now imported to completion on the main thread β¦7af34a9
-
chore: rename the project to Readthroughβ
Amplegest is an existing Paris asset manager, founded 2007, EUR 5.2bn under management, with a European equity fund range β the same buyers this tool is built for. Shipping under that name carried a trademark exposure and read, to the intended audience, as either a competitor's product or a mistake. Readthrough is the buy-side's own term for the implication a disclosed fact carries for the numbers, which is exactly what this produces: it reads the filing, reports what changed, and quantifies the effect only where the company quantified it. The codebase already spoke the word β the brief's lead panel is keyed read_through_label. Renames the wordmark, page title, intro copy in four languages, the plotly template, the SEC and prospection user agents, and the docs. Nothing behind the name changes. Also ignores .tmp_* scratch runtimes, which have no business in a commit. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>4d22778 -
feat: rebuild The Brief around a sourced article and scannable panelsβ
The Brief was fourteen stacked cards that repeated each other. It is now a piece of writing with the evidence arranged around it. The article is composed by a second model call that runs AFTER deterministic verification and is shown nothing but what passed it: verified facts, the code-computed quarter deltas, the XBRL segment lines. The fail-closed gate is not relaxed to allow prose, it is reused as the prose's input filter. validate_article then discards any paragraph citing no known entry or containing a number its citations do not state, and voids the whole piece on recommendation or price-target language, in four languages. Around it: - a scorecard of four to six coloured tiles, each carrying the figure that justifies its direction, validated exactly like a paragraph; - the product and region mix, an eight-quarter revenue and margin chart, and figures placed between article sections by role rather than by the model: what moved the group, what the company itself quantified,β¦0f869bb
-
feat: dark mode, market and quarter context on The Brief, faster cold startβ
UI - Migrate the whole app to a dark palette driven by dashboard/theme.py tokens rather than an overlay, including a registered Plotly template so charts theme globally. Streamlit base set to dark in config.toml. - The Brief now opens with what a memo about a listed company must show: a market band (price and move, market cap, 52-week range with position marker, dividend yield) and the quarter's reported figures (revenue, EPS, gross and operating margin, FCF with deltas). Rows come from the same masked view Financials uses, so a hidden figure stays hidden. - Surface what_changed on The Brief itself; it was only reachable from another screen although it is the first thing the brief promises. - Warn when most facts are unverified instead of showing a thin brief with no explanation. - Landing page explaining each destination, with saved briefs as entry points, for visitors arriving with no ticker. - Company Primer: prose sections rendered as cards rather than dataframes,β¦3cd8872
-
feat: merge Company Overview generation into single synthesis callβ
Company Primer (renamed Company Overview) was generated by a separate background LLM call, decoupled from the main brief synthesis. It now shares the same synthesis call via a deterministic profile-evidence node, dropping the standalone thread/job in app.py. Nav reordered for a PM/equity-analyst flow (Overview -> PM Flash -> Evidence & Deltas -> Financials -> Ask AI) and hardcoded nav labels now route through i18n. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>8727e56
-
feat: add company primer research tab
d1e793b
-
feat: multi-provider LLM support, prominent chat, design pass, and new analyticsβ
- Add agent/llm.py provider factory (Anthropic/OpenAI) with a sidebar model picker so visitors can paste their own API key instead of relying solely on the server's; thread the resulting config through generation, chat, and translation. - Promote Chat to primary nav (was buried under a secondary "Evidence tool" heading) with suggested-question chips and a "sources searched" line. - Fix a pre-existing bug where every nav/CTA color accent silently no-oped (Streamlit exposes st.button(key=...) as a `st-key-{key}` wrapper class, not a `key` attribute) and tighten the palette to three families (emerald brand, violet AI, semantic bull/bear). - Add a "Sources analyzed" provenance card, quarter/annual basis split on the financials grid, and cross-category signal dedup. - Add valuation + peer comparison, next-catalysts, brief-vs-brief delta, and one-page PDF export. - Rename the product from Primer to Amplegest across the app, docs, and the Hugging Face Space (old URL redireβ¦7880373
-
feat: app.py β add _get_display_brief hook and translation cost absorptionβ
- Add _absorb_translation_cost(): merges translation token usage into the session cost footer, updating _last_cost totals in-place when the ticker matches. - Add _get_display_brief(): translates briefs to the current UI language on demand, with a two-layer cache (session + DB) and a failed-set to avoid re-attempting broken translations. Falls back silently on error. - Wrap the render chokepoint: brief = _get_display_brief(_get_cached_brief(), ticker_input) - Invalidate _display_brief_cache and _translate_failed when a fresh brief is stored so stale translations are never served. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>861beb0
-
feat: Decision Stack redesign - 9 routes collapse into 4 (Verdict / Signals / Financials / Chat)β
Every datum now has exactly one home; everywhere else references, never re-renders. - Verdict: one-screen decision view - thesis, reconciled Print panel (actual vs consensus EPS/rev, D1/D5, revisions, surprise+streak, sentiment - one source of truth per number with provenance), top-2 bull/bear asymmetry, The Tell, top-3 watch items, reasoning trace. - Signals (new): all qualitative content (tells, tensions, language deltas, changes, risks, quality, points, commentary, notes, news) normalized by signal_feed.py into one ranked stream, filtered with st.pills (type/stance/source/significance), rendered by a single signal_card component; one global semantic search replaces the three per-tab boxes; on-demand news moved here. - Financials (new): KPI snapshot, 5 chart tabs (adds Capital Allocation: capex/dividends/buybacks vs FCF, share count, tax rate), guidance bridge (scorecard + prior guide -> actual -> new guide; removes the detected-by-rule regex implementation leaβ¦bd2c14a -
chore: checkpoint sidebar nav + i18n work-in-progress before Decision Stack redesignβ
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>e6496c0
-
feat: clarify sidebar UX β mono-ticker input, portfolio chips, auto-add after brief generationβ
- Ticker field: placeholder 'e.g. AAPL', caption, graceful multi-ticker recovery (extra tokens merged into Portfolio with info message instead of crashing) - Portfolio block: helper caption, coverage chips (β ready / β to generate) with legend, placeholder 'e.g. AAPL, MSFT, NVDA' - After brief generation: auto-add ticker to Portfolio field via _portfolio_add signal consumed before widget render (correct Streamlit state pattern) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>d36602c -
feat: add Chat tab β bounded Q&A agent over stored filings and transcriptsβ
New dashboard/chat.py renders st.chat_message/chat_input UI per ticker. agent/chat_agent.py drives a 5-round agentic loop using search_filing, search_transcript, get_financial_metrics and get_analyst_expectations (no Tavily); temperature=0, citations enforced, data-availability preamble prevents hallucinated fiscal periods. Sources expander shows raw tool outputs for every assistant response. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>de15094 -
feat: wire Exposure Radar into app β nav, sidebar portfolio input, brief persistence hookβ
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>959dd66 -
refactor: global disclaimer, section_divider to components, numbered_list helper (Lot 5)β
- Remove 6 per-tab footers (verdict, numbers, mda, risks, earnings_call, catalysts) - Add one global data disclaimer in app.py after all routing elif blocks - Move _section_divider to components.py as public section_divider; remove private copies from verdict.py and quality_tone.py - Add numbered_list helper to components.py; replace inline loop in verdict.py and for-loop in catalysts.py Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>2ee5d17 -
feat: add Quality & Tone deep-dive section (Lot 2)β
New dashboard/quality_tone.py renders Tone & Sentiment panel, full Earnings Quality grid (concerning-first sort), Analytical Tensions, Risk & Disclosure Changes (caution/positive/neutral grouping), and Capital Allocation spotlight. Wired into NAV_SECTIONS at index 5 and app.py routing; CSS nth-child selectors updated for FORWARD group label. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>abd0b25 -
feat: redesign Verdict tab for senior equity research / PM audienceβ
- Promote Executive Summary to top position (verdict in 5 s) - Add QoQ Watch-Outs section: consolidates cautionary deltas (risk_added, reworded, kpi_dropped, guidance more cautious, term freq up), concerning earnings quality signals, bearish tension readings, and sentiment panel β all deterministic, no LLM, each alert retaining source + significance - Earnings Quality signals now always-expanded cards (2-col grid) instead of collapsed <details> chips - Promote Market Expectations out of expander into main body - Bull/Bear moved directly under exec summary (explicit request) - Reorder: snapshot strip β exec summary β strengths/concerns β watch-outs β earnings quality β market expectations β tensions β changes/catalysts - Add earnings_quality_card() component to dashboard/components.py - Integrate dashboard/agent_graph.py live SVG into generation trace view Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>947b6dd
-
fix: retry on overloaded_error + friendlier API error messagesβ
Add max_retries=5 to ChatAnthropic (agent + synthesis) so transient 529 overloaded errors are retried with exponential backoff before surfacing to the user. Also map overloaded/rate-limit exceptions to readable strings instead of showing the raw Anthropic error dict. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>e3e2b3c -
fix: replace fragment run_every with server-side sleep+rerun to fix HF Spacesβ
scope='fragment' is only valid during fragment reruns, not initial main-script call. Remove @st.fragment entirely; server-side time.sleep(0.4) + st.rerun() eliminates the browser-timer/proxy race on HF Spaces. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>b5b62a9 -
feat: analytical edge section + fix HF Spaces fragment polling raceβ
- Replace run_every=0.4 fragment with server-side sleep loop to eliminate browser-timer/proxy race causing 'SessionInfo before initialized' on HF Spaces - Add analytical_tensions, earnings_quality_signals, non_obvious_takeaway to BriefOutput schema and synthesis prompt - Render Analytical Edge section on Verdict tab (tension cards, quality signal chips, non-obvious takeaway) - Prune analytical_tensions that duplicate bull/bear point evidence (Jaccard) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>05d403b -
feat: custom progress bar with % and gradient for brief generation
fc18637 -
feat: progress bar during generation + auto-collapse older reasoning steps
5fcc2c6 -
deploy: Primer app for HF Spaces β clean orphan historyβ
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>35676b4