Spaces:
Sleeping
Sleeping
Commit History
-
docs: three guidance-extraction defects, found by reading the data back
All three surfaced the same way: comparing a stored figure against the quotation stored beside it. That is what the "every guidance figure carries its passage" rule was for, and this is the first time it has been used. Three of 47 margin bands overstate the upper bound by exactly 5.00 points because "50 basis points" was read as five percentage points. The signature is mechanical -- high = low + 5.00 -- and the quote makes it unambiguous, so a validator can refuse a band whose width contradicts the tolerance its own quote states. Revenue extraction is clean. Guidance issued in a 10-K carries the period label Q1FY2025 where the metrics table uses Q12025, so it never joins and drops silently out of any guidance-versus-actual scoring: on NVDA, 8 of 14 rows scored, 2 lost to the label, 4 targeting a Q4 that has no 10-Q at all. Segment rows stop one quarter short of the metrics table, so the newest quarter -- the one a reader opens first -- cannot be decomposed. Also recorded as NOT a d…e4b1b7a
-
docs: correct Workstream C — the two fallback causes, diagnosed
The spec asserted both fallback_non_sec families were missing candidate concepts. Half wrong, and the wrong half mattered. All 8 gross-margin failures are GOOGL, and Alphabet does not tag GrossProfit at all -- the concept is absent from its companyfacts payload. It publishes Revenues and CostOfRevenue and leaves the subtraction to the reader. So this one needs a derivation, revenue - cogs, gated on both facts sharing an accession and a period, recorded as derived_difference exactly as free_cash_flow already is. Not a tuple extension. All 7 free-cash-flow failures are NVDA, and there the original reading holds: capex moved from PaymentsToAcquirePropertyPlantAndEquipment (through FY2020) to PaymentsToAcquireProductiveAssets (FY2021+), and only the first is tried. Every failing row is FY2024 or later. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014WiLV6MBBYAD5sWnv5Xqc56cb4a3a -
docs: analysis-depth roadmap and the data-foundation spec behind it
The dashboard review turned into a data review. Measured, not assumed: structured guidance is 0/89 rows, 33 of 89 metric rows carry no SEC provenance and are masked whole-ticker, statement lines sit at 56/89, and segments exist for one ticker of six. Root cause found for the guidance blank and validated by re-running the parser: guidance_parser truncates the transcript to 4,000 characters, and its paragraph filter is inert on transcripts (34 newlines in 50,000 chars yields one paragraph), so it reads the operator's introduction. NVDA's outlook section begins 33.9% into the call. Widened, the same stored transcript yields Q42026 revenue 63.7-66.3B and gross margin 74.4-75.4%. Also verified live: companyfacts already carries every re-declaration of a period, so restatement detection is available with no new data source -- 42 divergent period-concept pairs on NVDA and TSLA, 0 on AAPL revenue -- provided a materiality threshold separates real revisions from rounding changes. The roadmap…090e385 -
docs: design spec for falsification conditions (sub-project D)
The storage layer already exists and has no producer: forecast_store is built and tested, data/forecast_log.jsonl does not exist, and nothing in the repository calls append_forecast. What is missing is a thing that registers conditions and a thing that resolves them. The design turns on a closed metric vocabulary in three tiers -- filed columns, derived signals, segment lines -- so resolution is arithmetic over the store rather than a judgement. The model proposes; validation refuses anything it cannot evaluate for that ticker today. A probe against the live store confirmed all three tiers resolve and that an unknown segment member fails closed. No probabilities: those need calibration to mean anything, and calibration is the sub-project this one exists to feed. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>e5e550f -
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
-
Merge branch 'sdd/prospection': buy-side prospection sub-system
Turns the AMF open-data registry of authorised asset managers into sourced, GDPR-compliant email drafts, each carrying a real research brief on a position the firm actually holds. Runs end to end with every paid provider disabled. 14 tasks, each reviewed and fixed; a whole-branch review then closed three blocking defects the task-scoped reviews could not see. Execution decisions are recorded in docs/superpowers/plans/2026-08-29-prospection-buyside-decisions.md. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016XzekHxqiXutBW4gw3Arsxdf05467
-
docs: fix the real bootstrap block - pass 1 gated on a value it cannot have
Moving holdings discover to Tier 2 addressed the second link and left the first. Pass 1 promoted only accounts with fit >= 25, but fit reaches 25 only with an EDGAR overlap, read from confirmed holdings that do not exist on a fresh database. So pass 1 promoted nobody, contacts enrich filtered on tier 1 and saw none, and the named-contact gate then closed Tier 1 for good. Pass 1 now admits any account with declared equity exposure - which is what choosing who to pay to enrich actually means - while MIN_FIT still gates final Tier 1. The spec was wrong here too, not only the plan. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016XzekHxqiXutBW4gw3Arsx82ea202 -
Merge branch 'sdd/attention-brief' into attention-dashboard
d705e12 -
docs: rule on the Task 1 provenance gap
holdings gains retrieved_at: as_of is the position date printed in the fund's report, not the date we read it, so nothing distinguished a holding scraped this morning from one scraped months ago. signals gain nothing — observed_at and url already are the retrieval timestamp and the source. Spec prose amended to name the actual per-table fields instead of contradicting its own model. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016XzekHxqiXutBW4gw3Arsx1e5f13b -
fix: close four review minors on the attention-ordered brief
- tone_strip._reading split on the Unicode arrow only while _SERIES_RE already accepted "->" as well, so an upstream ASCII normalisation would have kept the rate series working while the plain-language reading silently vanished. Both halves of the parser are now tolerant. - test_kpi_footnote_html_is_byte_identical_without_source_url copied the footnote composition out of _render_quarter_kpis and asserted on the copy, so changing the separator left it green while it claimed to be a regression net. Replaced with a spy on verdict.st.markdown driving the real renderer -- confirmed to fail when the separator is changed, which the old test did not. test_kpi_source_note_is_exact_empty_string... is kept as-is. - attention_view._evasion_deltas duplicated evasion_deltas; it now delegates, with a test pinning that the two agree across every delta shape including a non-string kind. - Roadmap: record explicitly that the consensus-archive work must add a live reader of dis…2248b5b -
docs: spec the buy-side prospection sub-system
Design for prospection/: AMF open-data universe, deterministic ICP scoring in two passes, cost-ordered contact enrichment waterfall with all paid providers off by default, evidence-graded messaging, and a demo builder that refuses to ship a PARTIAL brief. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016XzekHxqiXutBW4gw3Arsx31f1e63
-
fix: correct two false claims in the attention-ordered brief spec
Both were found while writing the implementation plan and both would have caused real breakage if followed as written. The spec instructed adding `accession` to verify_fact's locator comparison. That comparison (evidence.py:384-390) is strict equality returning FAILED, and the model does not reliably copy refs — evidence.py:365-372 already documents that it re-derives evidence_id rather than copying. A ref lacking the new field would have failed every fact in every brief. The field is now derived server-side in make_evidence_record, with a separate tolerant check, and is explicitly kept out of stable_evidence_id's identity dict so persisted evidence_ids stay valid. The spec also claimed tests/test_verdict.py already asserts brief block order. It does not — it holds pure-helper tests plus a NAV_ITEMS assertion. The plan extracts brief_block_order() so ordering becomes testable at all. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>6c906d3 -
docs: add attention-ordered dashboard roadmap and first two sub-project specs
Restructures the product around one rule: what only this system can produce comes before what Bloomberg already shows. Decomposes the four-view target into seven sub-projects with an explicit dependency order. Three structural blockers found by code inspection and recorded in the roadmap: consensus is never archived (analyst.py:258 hardcodes comparison_allowed=False, so the scorecard block is dark by construction), no base rate exists (textdiff.py diffs one prior period against hardcoded thresholds), and the system emits no falsifiable prediction, so a calibration view has nothing to score. Two departures from the source target document, both argued in the roadmap: the radar and sector season are gated on reaching 30 covered names rather than sequenced by time, and calibration v0 scores the language signal instead of the model, because that is backtestable immediately. Sub-project B (consensus archive) starts first: its value accrues only with elapsed calendar time. Co-Authored-By:…d5b1cf3
-
docs: add design spec for The Brief dashboard redesign
Weighted grid layout, KPI sparklines, and AI-prose tightening to fix the flat single-column stack and generic text on the main brief screen.2775caa -
docs: add continuity-threads design spec
First of four planned sub-projects for deeper multi-quarter brief analysis: persist named tensions/themes across quarters and classify each as ongoing/escalated/resolved/stale with evidence. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>aa993f8
-
docs: spec for AI interpretation visual differentiation
Spec for distinguishing AI-interpreted fields (purple border + tint + badge) from sourced facts across the Primer brief dashboard. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>c25cfbb -
deploy: Primer app for HF Spaces — clean orphan history
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>35676b4