github koala73/worldmonitor v2.10.0
World Monitor v2.10.0

3 hours ago

What's Changed

  • chore(release): automate desktop release train (#6586)
  • docs(sources): reconcile provider and host counts (#6582)
  • docs: publish panel implementation count (#6584)
  • fix(license): put AGPL title first for detection (#6576) (#6583)
  • fix(docs): point Mintlify OpenAPI download at real bundle (#6578)
  • fix(license): expose AGPL text to scanners (#6576) (#6579)
  • docs(about): update GitHub star count (#6580)
  • fix(panels): deliver boot data to panels that mount after the pass (#6567)
  • fix(resilience): fail closed on malformed blend inputs (#6570)
  • fix(resilience): make whole-index pair gaps CI-visible (#6572)
  • fix(resilience): activate financial system exposure safely (#6568)
  • fix(resilience): compare acceptance outcomes, not gate config (#6566)
  • fix(seeders): seed-bundle-resilience defers every section forever — #6531's budget is below every section's timeout+grace (#6564)
  • fix(sentry): admit every app-serving host to the allowUrls ingest gate (#6565)
  • fix(csp-filter): suppress the Google Fonts /l/font subsetting endpoint (TR round 7) (#6560)
  • fix(sentry): the anonymous trampoline hop is '?' at runtime, not '' (#6554)
  • fix(railway): stop recovery approval emails and retry failures (#6551)
  • feat(i18n): add Traditional Chinese (zh-TW) locale (#6546)
  • feat(i18n): Add Swahili language support (#5406)
  • feat(webmcp): expose safe live dashboard controls (#6516)
  • fix(sentry-triage): convex OCC conflict herds + Y4 trampoline gate hole (#6547)
  • ci: let the acceptance-artifact validator run on the PR that commits one (#6544)
  • refactor(markets): one stablecoin classifier instead of three copies (#6541)
  • docs(resilience): commit the education post-flip acceptance artifact (#6460) (#6542)
  • feat(resilience): ingest USDA food stocks and expose stocks-to-use (#6531)
  • fix(resilience): condition the fin-sys integration premium on parent diversity (#6529)
  • feat(company-monitoring): seal offline prediction custody (#6534)
  • feat(data): mineral production & processing shares (USGS MCS / BGS) (#6527)
  • feat: preflight system dependencies instead of failing mid-build (#6387)
  • fix(railway): bound reconcile fanout and evidence reads (#6539)
  • fix(compose): wire relay shared secret (#6540)
  • feat(military): add defense industrial intelligence (#6536)
  • feat(markets): correlate news volume with market returns (#6530)
  • fix(ops): publish Railway drift as an independent check (#6533)
  • fix(resilience): unblock education acceptance capture (#6532)
  • fix(auth): restore readable input text in Clerk modal (#6535)
  • fix(ops): make the Railway deploy-drift alarm carry signal (#6141) (#6522)
  • fix(resilience): activate non-DRS debt imputation (#6526)
  • fix(ci): invalidate stale deploy gate statuses (#6525)
  • fix(railway): keep protected recovery reachable (#6524)
  • fix(docs): repair the Mintlify deploy break and the lint that missed it (#6521)
  • fix(sources): require explicit provider retirement (#6514)
  • docs(platform): add customer evaluation guide (#6518)
  • fix(resilience): stop absence from scoring as strength (#6515)
  • fix(ingestion): publish Military-Bases seed metadata (#6471)
  • fix(resilience): rebuild healthy education cohort (#6517)
  • fix(sources): show readable provider names (#6512)
  • fix(ci): recover deploy gate from API failures (#6513)
  • fix(sources): publish complete provider catalog (#6509)
  • fix(resilience): stop a transient seed-meta read failure from faking a dead producer (#6503)
  • ci(e2e): upload Playwright traces when variant-smoke-full fails (#6496) (#6497)
  • fix(welcome): stop internal CTAs minting affiliate codes, and guard every path to checkout (#6493) (#6504)
  • chore(gitignore): ignore public/sources/ and tie the rule to the build (#6498) (#6506)
  • docs(solutions): capture the self-comparing gate failure shape (#6487) (#6502)
  • fix(sources): let the attribution drift gate see reference drift (#6487) (#6499)
  • docs(openapi): document billing-verification 503 + ForbiddenError.code on gated ops (#5496)
  • fix(sentry): filter the round-6 TR package-CDN webfonts (unpkg, jsDelivr) (#6495)
  • docs(company-monitoring): remove provider approval claims (#6494)
  • test(company-monitoring): add sealed evidence curation gate (#6488)
  • docs(usage-errors): make Retry-After authoritative over the backoff schedule (#6485)
  • feat(resilience): activate the education dimension (#6460) (#6473)
  • docs(sources): domain-segmented data-sources catalog + /sources marketing page (#6491) (#6492)
  • fix(energy): let the IEA country keys re-export seededAt, and give the guard test a fixture that can fail (#6489) (#6490)
  • fix(feeds): point Tuoi Tre at its canonical host so Feed Validation stops blocking the news-health publish (#6484) (#6486)
  • fix(premium): honor the retryable billing-verification 503 on premium RPCs (#6482)
  • ops(webmcp): enroll dashboard origins and enforce security gates (#6465)
  • fix(ci): let the post-merge monitor survive a blip and name the real cause (#6479) (#6481)
  • fix(railway): let the watchdog go red, retry the read path, and stop the gate walk early (#6474) (#6478)
  • fix(markets): order the gap-fetch timers so our own cutoff is never the provider's fault (#6468) (#6476)
  • fix(convex): rename admission-snapshot so the production push is legal (#6480)
  • feat(company-monitoring): classify and admit material impacts (#6470)
  • docs(railway): correct three claims that shipped with the pagination fix (#6477)
  • docs(resilience): record education probe acceptance and its two read traps (#6472)
  • fix(railway): watchdog never paginates — GitHub rewrites next links to the repository-ID path (#6378) (#6469)
  • fix(health): register the educationAttainment probe + education pre-flip gates (#6452, #6460) (#6467)
  • ops(resilience): register the educationAttainment health probe (#6452) (#6464)
  • fix(resilience): financialSystemExposure inverts the ranking — executable calibration gates, then the retune (#6459) (#6463)
  • feat(company-monitoring): normalize scoped evidence candidates (#6457)
  • fix(sentry): group limiter degradation by failure mode, not by route (#6454) (#6458)
  • fix(sidecar): pin IPv6-only RSS fetches (#6456)
  • fix(rate-limit): confirm CF edge-proof covers /api/* and warn when it stops (#6435)
  • fix(rate-limit): meter the gateway reverse-geocode RPC at 60/min (#6451)
  • fix(feeds): drop the dead YC Blog publisher-family label (#6455)
  • feat(resilience): add flag-dark education dimension to the Country Resilience Index (#6450)
  • fix(feeds): restore server-only sources to dashboard (#6444)
  • fix(brief): corroboration gates count publisher families, not feed labels (#6443)
  • fix(ui): harden panel font scaling (#6453)
  • feat(company-monitoring): ingest verified X posts (#6424)
  • fix: require expiring health probe cutovers (#6392)
  • feat(ui): add global and per-panel font scaling (#6445)
  • fix(ingestion): rebuild GB consumer-price roster around scrapeable retailers (#6358) (#6442)
  • feat(mcp): expose story corroboration to agents (#4925 item 3) (#6421)
  • feat(company-monitoring): add bounded Exa cohort discovery (#6404)
  • fix(alerts): give keyword-spike alerts the sources, headlines and links they already held (#6414) (#6433)
  • chore(ci): ignore generated sidecar bundles in edge checks (#5926)
  • ops(ci): alarm on failed post-merge production deploys (#6376) (#6406)
  • fix(api): rate-limit the three unguarded public proxies (#6234) (#6412)
  • fix(session): stop one dropped mint request blacking out anonymous browsing (#6413)
  • fix(settings): keep plan verification pending through auth retries (#6423)
  • fix(sentry): split Cloudflare edge 5xx from origin 5xx by fingerprint (#6370) (#6409)
  • fix(analytics): make the Umami retention tick commit, and size it for the volume (#6375) (#6407)
  • fix(sentry): repair the alicdn font rule and filter the round-5 TR injectors (#6408)
  • fix(markets): harden Hyperliquid and FRED live data (#6339)
  • fix(rate-limit): stop the test-context abort racing the decision (#6236) (#6405)
  • fix(gdelt-intel): share one timestamp validator between the fetch-ordering and health paths (#5858) (#6044)
  • ops(railway): mark company-monitoring-worker planned so the post-#6397 apply can run (#6402) (#6403)
  • fix(ingestion): harden theater posture publication (#6401)
  • fix(energy): stop one absent country from withholding the JODI dataset (#6395) (#6400)
  • fix(ingestion): reject empty theater posture publishes (#6393)
  • fix(settings): apply source toggles to the live dashboard on close (#6380) (#6399)
  • fix(analytics): judge collector health against its own baseline instead of a fixed 0.5 (#6026) (#6041)
  • fix(railway): align deploy closures with build inputs (#6397)
  • fix(ingestion): tolerate bounded consumer-price retailer loss (#6394)
  • feat(company-monitoring): add durable scan orchestration (#6386)
  • fix(ci): paginate the deploy gate's check-runs read (root cause of #6389) (#6391)
  • fix(intel): stop feed newlines forging rows in the three sibling prompt blocks (#5881) (#5897)
  • test(e2e): wait for degraded digest retry (#5899)
  • fix(ci): keep the deploy gate posting a status when the required list is long (#6389) (#6390)
  • fix: silence floating promise in playback snapshot-exit path (#5968)
  • fix(correlation): harden seeder input reads (#6385)
  • ops(monitor): acknowledge the eight consumer-price coverage partials against owner issues (#6363)
  • fix(analytics): keep Umami storage warnings non-fatal (#6384)
  • fix(monitor): monitor the newest gated main revision instead of failing on an undecided head (#6374)
  • fix(dashboard): apply panel settings without a reload (#6379) (#6382)
  • feat(markets): authorize Finnhub+AV quote provider chain (#6304) (#6350)
  • fix(convex): stop a one-dot test helper from failing every convex deploy (#6232 follow-up) (#6373)
  • fix(railway): fence reconciliation cutover with leases (#6326) (#6326)
  • feat(company-monitoring): add bounded portfolio onboarding (#6232)
  • test(company-monitoring): add progressive blind evaluation scorer (#6219)
  • fix(railway): add reconciliation recovery control plane (#6325)
  • feat(mcp): expose WTO trade flows to agents, name coverage-collapse causes (#6323) (#6353)
  • fix(sentry): filter the two extension webfonts still dominating TR (follow-up to #6371) (#6372)
  • fix(analytics): unblock Umami storage monitor (#6354)
  • feat(markets): add the RUB quote table as a third FX panel tab (#6231) (#6352)
  • fix(trade): serve every supported tariff-trend window and name what is uncovered (#6316) (#6349)
  • fix(sentry): narrow the CSP rules to observed signatures and repair a vacuous guard (follow-up to #6369) (#6371)
  • test: replace implementation checks with behavior coverage (#6368)
  • fix(sentry): filter the CSP injectors that dominate TR/J0, and close two format gaps (#6369)
  • fix(payments): send the welcome email to the account's current login address (#6335) (#6364)
  • fix: unblock checkout on the API host and revive two dead iOS filters (#6365)
  • fix(observability): stop two non-errors paging at Sentry error level (#6351)
  • fix(entitlements): repair the free-tier ownership model shipped in #6345 (#6346)
  • fix(insights): name which editorial gate rejected the world brief (#5947) (#6342)
  • fix(entitlements): restore all free-tier-owned preferences (#6345)
  • fix(china): recover Japan MOD releases from unterminated anchors (#6344)
  • fix(consumer-prices): evidence-gated extraction recovery for the eight partial markets (#6182) (#6343)
  • fix(api): classify truncated Convex response bodies as transient (#6340)
  • feat: add visual stock/market watchlist customization (#1881)
  • test(ci): eliminate observed timing and fixture flakes (#6327)
  • fix(panels): transfer gate ownership on every user toggle (review P1) (#6338)
  • fix(panels): stop the free-tier count cap being a one-way door (#6337)
  • chore(trade): remove the v1 trade-flow cutover bridge (#6315) (#6329)
  • fix(payments): send lifecycle emails to the account login email, not the checkout alias (#6330) (#6336)
  • fix(sentry): name world-brief rejection gates, drop mutated-CSP noise (#6333)
  • fix(china): stop scroll re-priming from flickering the corridor and nowcast panels (#6328)
  • fix(markets): restore parameterized crypto quote requests (#6320)
  • fix(markets): deliver quotes for custom watchlist symbols (#6318)
  • fix(trade): serve every supported trade-flow window and name what is uncovered (#6309) (#6322)
  • fix(rss): preserve stale feeds through upstream failures (#6312)
  • fix(markets): honor stablecoin coin filters and restore custom IDs (#6317)
  • perf(tests): cut idle waits and redundant parsing in unit + smoke CI (#6324)
  • fix(markets): restore parameterized commodity quote requests (#6307) (#6314)
  • fix(maritime): stop the AIS relay sustaining its own upstream IP block (#6313)
  • fix(news): prioritize China feeds before digest deadline (#6311)
  • fix(consumer-prices): attribute coverage loss to a bounded failure reason (#6301)
  • docs(health): pin the published /api/health key count to the registry (#6300) (#6303)
  • fix(china): retry Japan MOD empty index through proxy (#6302)
  • fix(railway): classify unprovisioned seeders as planned (#6278)
  • test(build-guards): make dist-gated skip explicit via WM_EXPECT_BUILT_OUTPUT (#6284)
  • fix(health): stop a producer fault from masking a vanished data key (#6263) (#6299)
  • chore(deps): bump postgres from 17-alpine to 18-alpine (#6293)
  • feat(i18n): give the translator prompt the product's domain glossary (#6295)
  • fix(webmcp): migrate tools to document.modelContext (#6292)
  • fix(analytics): preserve collector timeout fallback (#6088)
  • i18n(de): fix mistranslated domain terms and complete the German locale (#6294)
  • fix(markets): bound market-implications LLM misses instead of alarming on each (#6259) (#6266)
  • fix(security): patch js-yaml and stop upstream advisories blocking PRs (#6298)
  • fix(consumer-prices): repair dead extraction fallback and prompt-fabricated prices (#6270)
  • fix(markets): recover sector ETF valuations by rotating the proxy exit (#6290)
  • refactor(china): retire the Vercel edge egress hop from the SZSE disclosure seeder (#6274)
  • fix(weather): harden the US-only disclosure guards from the #6269 review (#6276)
  • fix(weather): rank NWS alerts by severity before the 50-cap (#6277)
  • fix(military): seed stale-snapshot flight fixtures through the normalizing field (#6291)
  • fix(mcp): attach both source failure reasons to get_airspace error (#6085) (#6283)
  • fix(military): bound stale flight recovery cache (#6287)
  • feat(aviation): keyless ADS-B redundancy — adsb.lol primary, blind-spot gap-fill, ODbL attribution (#6273)
  • fix(seeders): recover rejected Redis publications (#6286)
  • fix(aviation): skip degenerate bbox block for icao24-only requests (#6275)
  • fix(military): reject Upstash command errors (#6258)
  • fix(military): deliver global flight coverage to dashboard (#6261)
  • fix(china): retry transient NBS fetches so one socket blip can't stale the release calendar (#6264)
  • fix(maritime): bound AIS reconnects and report degraded health (#6268)
  • fix(worktree): self-heal hooks path at push time (#6285)
  • fix(rate-limit): fail closed paid-provider market routes (#6260)
  • fix(procurement): keep SAM seeding on reachable IPv4 (#6265)
  • chore(worktree): verify dependency installation (#6131)
  • ci: add generated-file drift gate for bootstrap-tier-keys (#6282)
  • ops(railway): prune the recovered umami drift suppression and stop an empty baseline expiring (#6064) (#6281)
  • fix: disclose US-only weather alert coverage (#6269)
  • test(military): close three assertion gaps in the OpenSky cooldown suite (#6241) (#6255)
  • fix(military): persist the OpenSky 429 cooldown so the seeder stops re-firing (#6241) (#6252)
  • feat(markets): opt-in FX panel over the orphaned fx:yoy seed (#6199) (#6226)
  • fix(docs): use MDX comments for the generated attribution markers (#6251)
  • fix(architecture): close the four gold-standard deviations (#6235) (#6239)
  • fix(military): one global OpenSky query per run — 86% → 43% of the daily credit quota (#6222) (#6244)
  • feat(markets): show the CBR key rate in the Central Banks tab (#6202)
  • docs(sources): audit upstream attribution inventory (#6250)
  • perf(inp): cut /dashboard interaction-time work and fix the readout (#6221)
  • fix(seed): preserve shared FX fallback provenance (#6233)
  • feat(railway): give all 41 registry services an exact watch-path closure (#6204) (#6218)
  • fix(railway): reconcile on Deploy Gate completion and alarm on a silent fleet (#6203) (#6216)
  • fix(seo): make category explainer answer-first (#6217)
  • fix(seed-utils): stop retrying a Retry-After the run cannot wait out (#6110) (#6215)
  • fix(brief-gates): stop flagging a sentence-initial common noun the source already contains (#6109) (#6201)
  • fix(seo): complete Dataset structured data (#6207)
  • fix(railway): fail closed on partial fleet history (#6206)
  • feat(china): seed Stock Connect northbound turnover + margin balance from SSE/SZSE (#6190)
  • feat(company-monitoring): define dark service contract (#6188)
  • test(company-monitoring): freeze viability and evaluation contract (#6186)
  • fix(markets): keep replayed sector valuations safe, honest, and refreshable (#6197)
  • fix(mcp): publish activationUnknown on the cache envelope (#6198)
  • docs(correlation): record #5991 RRF decision (#6079)
  • fix(consumer-prices): recover partial retailer extraction (#6185)
  • feat(markets): add Bank of Russia RUB rates + CBR key rate seeder (#6154) (#6187)
  • fix(aviation): preserve OpenSky credit budget (#6196)
  • ops(railway): trigger seeder deploys from CI and judge drift against the service closure (#6142) (#6151)
  • fix(health): bound content freshness activation grace (#6152)
  • fix(markets): stabilize sector valuation coverage (#6183)
  • fix(portwatch): retry transient ArcGIS rate limits (#6184)
  • fix(client): keep map overlays on a faked WebGL context + name push 400s (#6194)
  • fix(payments): capture unattributable Dodo events instead of retry-storming (#6191)
  • test(prediction-markets): pin fixture expiry clock (#6195)
  • ops(analytics): activate the Umami 90-day retention runner (#6148) (#6189)
  • ci(proto): enforce breaking changes in workflow (#6147)
  • feat(desktop): acknowledge checkout in returning browser (#6136)
  • fix(review): restore the desktop handoff outcome guards dropped in the rebase (#5911, #6120) (#6145)
  • fix(seeders): make every Railway entry point announce that it finished (#6144)
  • feat(ops): detect when a Railway service is not running the merged commit (#6143)
  • fix(desktop): migrate remaining links to shared opener (#6137)
  • fix(desktop): commit the release train to one switching binary (#5908) (#6124)
  • fix(mcp): ground world brief in seeded insights (#6134)
  • fix(insights): don't split the brief lead at an acronym that carries its citation (#5947) (#6119)
  • chore(supply-chain): promote FlowEstimate.source to a closed enum (#6101) (#6122)
  • fix(health): widen PortWatch content freshness budget (#6135)
  • fix(selfhost): allow Docker LLM origins through sidecar SSRF guard (#6130)
  • fix(health): surface mid-publish military starvation (#6132)
  • harden(health): treat an unreadable activation marker as unknown, not confirmed-absent (#6095) (#6117)
  • fix(sentry-triage): five live issues across payments, analytics, session copy and crash filters (#6129)
  • fix(security): clear production dependency audit failures (#6140)
  • fix(military): stop seed-military-flights crashing on every run (#6128)
  • fix(security): bump brace-expansion past GHSA-rgw5-rvv9-x895 (#6118) (#6123)
  • fix(military): cap Wingbits aircraft detail batches (#6099)
  • fix(quota): separate dashboard AI limits from MCP (#6105)
  • fix(panels): hydrate late-mounted hub activity panels (#6100)
  • fix(mcp): age the #6080 fixture guard on the content clock, not the legacy fallback (#6080) (#6096)
  • fix(navigation): keep variant links on dashboard (#6098)
  • fix(china-nowcast): publish an observed China energy-demand change (#6067) (#6081)
  • ops(relay): attribute theater-posture publications to their actual source (#5945) (#6092)
  • fix(mcp): align the freshness envelope with health's PortWatch content-freshness dimension (#6080) (#6094)
  • fix(ops): reconcile Railway config drift (#6091)
  • fix(markets): restore ETF valuation identity for Yahoo summaries (#6090)
  • fix(china-nowcast): persist comparable corridor history (#6083)
  • fix(china-nowcast): name each CCFI exclusion honestly and fail closed on undated observations (#6066) (#6077)
  • fix(china): separate PortWatch content freshness and healthy-quiet groups in decision coverage (#6060) (#6073)
  • chore(supply-chain): declare the CCFI period-change fields on ShippingIndex (#6078) (#6084)
  • fix(china): accept same-publisher corridor corroboration (#6076)
  • feat(search): build intelligence command deck (#5971)
  • fix(china-nowcast): publish a directional CCFI period change (#6066) (#6074)
  • fix(health): bound the consumer-price coverage rollout window (#6059) (#6075)
  • fix(feeds): enforce complete geographic classifications (#6072)
  • fix(health): retire expired on-demand softenings (#6071)
  • fix(hydration): handle dashboard container scrolls (#5894)
  • fix(news): refresh expired persistent RSS responses (#6069)
  • fix(webcams): fit 2x2 wall to short viewports (#6065)
  • fix(economic): accept full macro-stress FRED batch (#6062)
  • fix(ui): normalize China dashboard panel styling (#6063)
  • fix(insights): make world brief readable (#6061)
  • fix(analytics): bound the umami pool's acquisition wait so overload fails fast (#6057)
  • feat(feeds): P3 — Canada + Arctic/Nordic security source pack (#5960) (#6054)
  • fix(map): gate CMD+K locked premium layers for free users (#6045) (#6049)
  • fix(map): use hasPremiumAccess for GlobeMap premium gating (#6050)
  • fix(seo): rotate Bing-rejected www IndexNow key (#6055) (#6056)
  • feat(i18n): add Ukrainian (uk) locale + lang boost for UA feeds (#6052)
  • fix(review): address code review findings for theater presets (#6023)
  • fix(analytics): restore umami session_data writes and gate the image on a runtime write probe (#6051)
  • fix(ingestion): bound provider retries and expose coverage (#6022)
  • fix(digest): tie the replay read-snapshot's lifecycle down and prove it (#6039)
  • fix(map): hide sunset iranAttacks toggle from SVG/mobile picker (#6048)
  • fix(feeds): reconcile regional rollout contracts (#6031)
  • docs: align public copy with code-derived counts — CII 31 Tier-1, 55 free layers, 41 MCP tools (#5488)
  • feat(bootstrap): cut the slow public tier over to KV serving (stage 1, #5338) (#6035)
  • fix(digest): page replay-log reads and re-anchor the caps to Upstash's real limit (#6033)
  • fix(analytics): eliminate Umami session-data write race (#6034)
  • fix(payments): absorb Dodo checkout 429s with a bounded jittered retry, pin SDK retries off (#6027) (#6032)
  • fix(insights): let a lead cite every story a merged claim draws from (#6030)
  • fix(review): harden geo coverage gate against silent-pass failures (#6029)
  • fix(china): restore Japan MOD via the Japanese Joint Staff homepage (#5904) (#6013)
  • fix(news): deduplicate before limiting summary headlines (#5969)
  • fix(bootstrap): survive sandboxed iframes, match aliased fetch wrappers (#6028)
  • test(feeds): geographic coverage health audit vs geography keyCountries (#5957) (#5999)
  • feat(feeds): add strategic default weights separate from locale boost (#5958) (#6000)
  • feat(correlation): add staged runtime correlation modes (#6020)
  • fix(insights): restore world brief synthesis by reserving a corroborated lead slot (#5947) (#6019)
  • fix(markets): restore complete sector valuation coverage (#5997)
  • fix(analytics): aggregate collector health across users (#5998)
  • feat(feeds): P1 — Africa depth beyond Nigeria (Horn, DRC, West Africa) (#5980)
  • fix(analytics): harden Umami collector write-path acceptance (#5996)
  • fix(analytics): gate receiptless-200 collector alerts on aggregate floors (#5978) (#5979)
  • feat(feeds): P1 — Eastern flank neighbors pack (Romania, Baltics, Turkey Black Sea) (#5952) (#5975)
  • feat(feeds): P1 — Indo-Pacific gaps (Taiwan mainstream, Pakistan, SE Asia security) (#5954) (#5977)
  • feat(feeds): P1 — Caucasus, Central Asia, Belarus/Moldova theater packs (#5953) (#5976)
  • fix(widgets): preserve custom panels across auth and cloud refresh (#5924)
  • feat(feeds): P1 — Ukraine depth pack (local institutions + daily frontline assessment) (#5951) (#5972)
  • fix(analytics): alert only on actionable collector write failures (#5974)
  • ops(ingestion): bound aviation/RSS throttling and expose consumer-price partial coverage (#5970)
  • feat(feeds): document and enforce UA/RU EN default balance (#5950) (#5966)
  • feat(feeds): default-enable Ukraine/Poland frontline sources for EN (#5949) (#5963)
  • fix(analytics): validate concurrent collector writes (#5964)
  • fix(markets): restore sector valuation enrichment after Yahoo 401s (#5962)
  • fix(insights): preserve freshness on synthesis rejection (#5947) (#5965)
  • feat(growth): measure content-to-product handoffs (#5944)
  • fix(ops): sync seed-conflict-intel Railway watch paths with GDELT bulk contract registry (#5961)
  • Merge commit from fork
  • feat(growth): operationalize AI visibility evidence loop (#5940)
  • Merge commit from fork
  • fix(seo): enforce complete meta descriptions (#5943)
  • feat(mobile): add feed-first primary navigation (#5244)
  • fix(auth): compensate Clerk token cache for client clock skew (#5938)
  • test(auth): harden Clerk expiry regression (#5937) (#5942)
  • fix(seo): add and validate Dataset descriptions (#5941)
  • fix(auth): reject stale Clerk fallback after session switch (#5937)
  • fix(ci): replace invalid Actions pin with the commit SHA it resolves to (#5925)
  • fix(desktop-build): pass the client VITE_ env to Tauri builds and gate its completeness (#5905) (#5919)
  • fix(pro): expose H1 in static page HTML (#5939)
  • fix(mcp): expose commodities news to agents (#5914)
  • test(china): pin Japan MOD Cloudflare fallback contract (#5917)
  • fix(markets): restore sector valuation enrichment (#5918)
  • fix(security): bump tauri to 2.11.5 and gate the advisory floor (#5518) (#5934)
  • fix(seo): close sitemap and IndexNow coverage gaps (#5936)
  • fix(seed): recover OFAC sanctions freshness (#5927)
  • fix(markets): alarm on empty prediction pools (#5916)
  • fix(auth): keep the Clerk token when its forced refresh fails (#5933)
  • docs: document recent intelligence and billing features (#5913)
  • epic(desktop): establish parity baseline and drift gates (#5902) (#5915)
  • docs(mcp): document prediction market categories (#5898)
  • Surface account and billing in one user menu (#5901)
  • i18n: translate 88 new strings across all 23 remaining locales (#5882)
  • fix(sentry): suppress SnapTube WebView bridge JSON.parse noise (#5900)
  • fix(cross-source-signals): unwrap seed envelopes and align extractors with their writers (#5870) (#5896)
  • fix(premium): observe entitlement desyncs (#5879)
  • refactor(gating): split panel-gating.ts by gate (#5813) (#5893)
  • fix(news): rotate a custom category's capped feed window and surface its source coverage (#5873) (#5887)
  • fix(china): distinguish decision group unavailability (#5891)
  • fix(intel): stop feed newlines forging rows in every analyst prompt block (#5857) (#5884)
  • fix(entitlements): enforce declared export formats (#5880)
  • fix(news): stop a degraded 200 digest from poisoning the last-good cache (#5877) (#5883)
  • fix(news): validate cached classification values (#5553)
  • fix(finance): derive the news/data panel-key collision so commodities-news is created (#5871) (#5888)
  • fix(ops): prune the recovered gdeltIntel freshness suppression (#5770) (#5867)
  • fix(markets): classify each prediction market into exactly one pool (#5733) (#5872)
  • fix(wildfire): cap the canonical fires payload under the 5MB publish limit (#5866) (#5869)
  • fix(news): stop 19 uncapped rss-proxy fetches and the doubled news load (#5376) (#5878)
  • ci: attach provenance and SBOM attestations to the published image (#5788)
  • fix(widgets): block beforeunload in custom widget sandbox (#5760)
  • fix(gdelt): move consumers to one bulk materializer (#5863)
  • fix(ml): stop caching a rejected model-load promise for the whole session (#5678)
  • test(mcp-grant): add Playwright E2E spec for /mcp-grant consent page (#5658)
  • refactor(tech-events): remove the dead narrowing from the cache-fill path (#5834)
  • fix(self-hosting): support optional AIS and Windows seeders (#5799)
  • fix(gdelt): rotate seed-gdelt-intel topics on last-attempt so one scarce DOC success stops monopolizing (#5848) (#5859)
  • fix(checkout): preserve provider 429 responses end to end (#5862)
  • docs(china): document complete data coverage (#5860)
  • fix(intel): read materialized GDELT topics from Redis in chat-analyst (#5850) (#5856)
  • fix(llm-health): quarantine models the provider rejects instead of retrying them on every call (#4949) (#5458)
  • fix(security): bump sharp >=0.35.0 in blog-site (GHSA-f88m-g3jw-g9cj, HIGH) (#5477)
  • fix(conflict): make the GDELT bulk export primary and demote the DOC country sweep to fallback (#5849) (#5855)
  • fix(pro): fail closed on entitlement reload guard (#5853)
  • docs(agents): clarify pull request authority (#5854)
  • fix(china): close the SZSE proxy retry and edge diagnostic gaps (#5839)
  • fix(auth): tolerate small Clerk JWT clock skew (#5832)
  • fix(consumer-prices): gate implausible movers as parse artifacts (#5445) (#5461)
  • fix(pro): prevent post-checkout entitlement reload loops (#5846)
  • feat(pricing): 3 months free on every annual plan + API Business Annual SKU (#5845)
  • fix(proxy): match the Decodo curl-endpoint rewrite case-insensitively (#5847)
  • ci(gate): give each changes job a distinct check-run name (#5822) (#5842)
  • fix(ci): restore deterministic main test runs (#5840)
  • feat(market): blend fundamentals into the analyze-stock rating (#5598)
  • fix(review): normalize Decodo host before sticky-port detection (#5837)
  • fix(pro): stop upgrade banner flickering for Pro users (#5836)
  • fix(correlation): suppress isolated slow-run warnings (#5835)
  • fix(china): diversify SZSE proxy exits (#5833)
  • fix(tech-events): cache the widest payload on cold-start fallback (#5427) (#5603)
  • fix(gdelt): reduce rate-limited ingestion fanout (#5830)
  • ci(gate): require every gated-workflow job, not just test.yml's (#5402) (#5825)
  • test(mcp): reject extra intel-history requests (#5831)
  • fix(hooks): repair the shared absolute core.hooksPath instead of warning (#5810) (#5824)
  • docs(api): publish versioning and deprecation policy (#5827)
  • test(mcp): pin intel history POST body privacy (#5821)
  • fix(ci): preserve gate status API order (#5828)
  • fix(ci): paginate gate status lookup (#5826)
  • i18n(hi): translate 90 recently added strings across dashboard features (#5778)
  • fix(ci): validate Railway project token context (#5816)
  • fix(health): retire shipping rates recovery exception (#5784)
  • fix: merge GED Candidate release onto annual UCDP base instead of probing annual-only (#5796)
  • fix(ops): fail closed on ingestion acceptance drift (#5802)
  • fix(sentry): attribute events to deployed builds (#5815)
  • fix(premium): stop rendering a failed lookup and a signed-out caller as "free plan" (#5619) (#5779)
  • fix(hooks): stop the green-tree cache attesting a tree the gates never ran (#5800) (#5809)
  • fix(dashboard): gate playback on entitlements, not a dead Clerk field (#5812)
  • fix(mcp): preserve conflict events within output budget (#5807)
  • fix(conflict): fall back to official HAPI snapshots (#5806)
  • test(docs): gate the /api/bootstrap Cache-Control values the docs publish (#5794) (#5808)
  • fix(portwatch): make port-activity recovery converge (#5804)
  • fix(china): require sustained SZSE recovery (#5803)
  • fix(gdelt): bound ingestion recovery (#5805)
  • feat(market): surface an LLM news-sentiment sub-score on stock analysis (#5656)
  • feat(market): add per-stock risk analytics to stock analysis (#5649)
  • fix(notifications): guide denied push users to browser settings (#5764)
  • fix(hooks): route tests/dom/ to vitest instead of the node:test runner (#5795) (#5801)
  • fix(china): add bounded SZSE edge fallback (#5786)
  • test(checkout): close #5380 coverage gaps — false-passing idempotency test, webhook rollback, boundaries (#5606)
  • fix(bootstrap): stop the edge answering an invalid key from a warm weather cache (#5386) (#5791)
  • fix(security): harden contact and local-secret validation (#5787)
  • fix(intel): give history ingestion a durable health signal (#5736) (#5792)
  • fix(session): recover when cookies cannot persist (#5798)
  • fix(ops): retire recovered China coverage exception (#5785)
  • sec(intel): decide the untrusted-text posture and add a retraction path (#5743) (#5781)
  • fix(seed): reject ACLED events without stable ids (#5783)
  • fix(china): classify the Japan MOD proxy target block (#5776)
  • fix(api-keys): tolerate transient auth races (#5780)
  • fix(scripts): recognise keyword-preceded regex in stripJsComments (#5763)
  • fix: decode HTML entities exactly once, repo-wide (#5436) (#5754)
  • fix(auth): bound Clerk token cache by the token's own expiry (#5753)
  • fix(checkout): handle a create-checkout 200 whose body will not parse (#5761)
  • sec(seed): stop seeder imports from loading production credentials (#5767) (#5775)
  • fix(ops): enforce ingestion operational acceptance (#5756)
  • feat(mcp): expose client-side analysis composites as MCP tools (#5696) (#5739)
  • fix(test): stop the China macro fixture rotting on a calendar date (#5762) (#5765)
  • feat(intel): corporate intelligence — SEC EDGAR filings, 8-K material events, earnings surprises, real company enrichment (#5695) (#5738)
  • fix(boot): handle the variant stylesheet preload rejection (#5758)
  • feat(intel): historical intelligence memory — semantic search, timelines, and precedent matching (#5737)
  • fix(prefs): serialize cloud preference writes (#5755)
  • feat(mcp): on-demand NLP intelligence utilities — classify, extract entities, news clusters, keyword spikes (#5734)
  • feat(forecast): geopolitical bet family — long-horizon market slice (#5735)
  • fix(pro): stop Upgrade banner flashing for entitled users (#5728) (#5751)
  • fix(research): reject incomplete daily coverage (#5746)
  • fix(docs): align API meta descriptions with runtime (#5750)
  • fix(analytics): verify collector writes and retry identity (#5748)
  • fix(seo): submit apex MCP URL via IndexNow (#5749)
  • fix(seo): expand crawlable meta descriptions (#5747)
  • fix: gitignore docker-compose.override.yml and secrets/ (#5725)
  • fix(auth): avoid negative-caching transient user-key failures (#5599)
  • fix(seed): restore GDELT timeline recovery (#5719)
  • feat(research): Strait of Hormuz transit report — source-backed research pilot (#5668) (#5721)
  • fix(china): retry transient SZSE proxy failures (#5722)
  • fix(health): bound degraded source markers (#5717)
  • fix(test): isolate shallow Git fixture (#5732)
  • fix(china): classify Japan MOD proxy failures (#5718)
  • fix(conflict): recover HAPI from egress bot blocks (#5720)
  • docs(legal): clarify optional World Monitor attribution (#5716)
  • fix(seo): generate truthful sitemap freshness (#5711)
  • feat(growth): establish SEO and AI-citation scorecard (#5709)
  • fix(rate-limit): isolate paid callers from shared IP buckets (#5708)
  • test(china): lock quiet disclosure health semantics (#5710)
  • docs(legal): clarify subscription license tiers (#5702)
  • chore(mcp): fold MCP-edge and gateway Pro-MCP gates into server/_shared/pro-mcp-gate.ts (#5659)
  • feat(pricing): reduce Pro Business to $49.99/mo and $499/yr (#5688)
  • fix(session): tell a dropped cookie apart from a rejected one (#5687)
  • perf(globe): bound HTML marker count and instrument the field (#5368) (#5371)
  • fix(e2e): retry once in CI so a Playwright protocol glitch stops reddening gates (#5686)
  • fix(bootstrap): stop non-on-demand keys taking the credential-less public path (#5683)
  • fix(session): scope wm-session blackouts to the failing route (#5674) (#5677)
  • fix(session): tag dead-session route and stop premium 401s killing it (#5674) (#5680)
  • fix(entitlements): honor Clerk Pro role in JSON gates (#5650)
  • fix(entitlements): finish the billing-verification sweep (#5661)
  • feat(welcome): add blog navigation and Palantir FAQ (#5681)
  • test(gates): DOM-behavioral coverage for ExportGateControl, the PDF click cycle, resolveGateAction and PanelTabBar's locked notice (#5660)
  • chore(i18n): refresh all 24 /pro locales for the pricing restructure + stop English copy silently rotting translations (#5655)
  • feat(onboarding): surface command search in Pro setup
  • test(seo): align pricing assertions with visible surfaces
  • fix(csp): re-sync script-src hashes with the regenerated inline JSON-LD
  • fix(ci): drop stale crawler-copy stats claim
  • Address PR review feedback (#5676)
  • fix(seo): replace crawler-only prerender content
  • fix(comtrade): enforce CI and quota contracts
  • fix(china): recover Japan MOD through proxy fallback (#5657)
  • fix(i18n): stop advertising query locale alternates
  • fix(china): proxy SZSE disclosures after direct failure (#5651)
  • chore(china): give the decision-parity audit teeth (#5643) (#5648)
  • fix(seo): generate canonical public product facts (#5672)
  • chore(china): dedupe provenance OpenAPI schemas (#5647)
  • docs(comtrade): record the verified Railway cron instead of assuming it
  • fix(a11y): add focus-visible indicators for settings controls (#5059) (#5522)
  • fix(comtrade): compose the period strategies, bound quota and coverage
  • fix(hooks): use PR base ref for pre-push commits-ahead guard (#5670)
  • fix(blog): track canonical-host conversions (#5662)
  • fix(blog): attribute product conversion clicks
  • fix(comtrade): fall back to prior period per-reporter, cap request quota
  • fix(review): correct JSDoc target and give the Comtrade budget test teeth
  • fix(docs): recompute stats on second main merge (178 components, 209 services)
  • feat(pricing): seed real Dodo product IDs for Pro Business
  • feat(china): compose decision-parity signals (#5639)
  • fix(data): recover humanitarian, China, and PortWatch coverage (#5640)
  • fix(comtrade): restore bilateral HS4 ingestion continuity
  • fix(activation): harden day-0 outcome ownership (#5638)
  • fix(entitlements): stop fresh Pro purchases getting 15 min of broken Pro (#5600) (#5623)
  • feat(activation): record day-0 activation outcomes server-side (#5621) (#5626)
  • feat(market): join upcoming earnings into stock analysis (#5636)
  • feat(china): add opacity-resistant activity nowcast (#5631)
  • docs(solutions): capture the npm registry outage that silently redded the security gate (#5637)
  • docs(concepts): correct Plan Family entry — tier gates are thresholds
  • docs(solutions): compound the credential-class vs plan-family quota lesson
  • fix(docs): recompute stats on the merged tree (176 components, 207 services)
  • fix(review): close API-tier OAuth quota leak + probe retry + popover staleness
  • refactor(gates): consolidate cross-unit duplication from the simplify pass
  • fix(export): widen print-host contentWindow slice with the document fallback member
  • test(docs): update license-key guidance pin for the Pro Business wording
  • docs(pricing): reconcile every surface with the new tier ladder and export gating
  • feat(pro): pricing page restructure — Personal/Commercial axis header, Enterprise band, five-column grid; rebuild public/pro
  • feat(pricing): Pro Business goes public — catalog copy, both mirrors, v3 cache key (7 sites), license-chip parity guard, pricing docs
  • feat(dashboard): per-plan tab cap with visible locked add-control — Free 3 / Pro 10 / Pro Business 25, creation-only, billing-aware
  • feat(export): entitlement-gated export with visible locked state, billing-aware CTAs, and PDF data report
  • feat(activation): make the denial cohort readable, not just recorded (#5617) (#5630)
  • feat(billing): Pro Business lifecycle — shared pro checkout family with upgrade carve-out, guided 409 copy, welcome email, day-0 activation
  • fix(mcp): Settings quota widget reports plan-resolved limit — 250 for Pro Business, unlimited for Enterprise, client normalizer no longer coerces null/0 to 50
  • feat(activation): record a browser-blocked step in its own durable bucket (#5617) (#5629)
  • fix(summarization): stop logging 'All providers failed' for declined-by-design chains (#5377) (#5605)
  • fix(military): harden cross-Strait activity publication (#5627)
  • fix(ci): stop an npm registry outage from silently redding the security gate (#5628)
  • feat(mcp): plan-driven daily quota for pro-family callers — 250/day Pro Business, null=unlimited, user_key stays 50
  • feat(billing): Pro Business catalog foundation — dataExport entitlement field, dual PLAN_PRECEDENCE entries, resolvePlanKey catalog fallback
  • feat(china): compose regional logistics corridor control towers (#5593)
  • docs(activation): capture the denied-permission dead-end learning (#5609) (#5624)
  • fix(settings): clamp unavailable MCP tab (#5625)
  • fix(premium): stop rendering a 403 as "Pro required — upgrade" when the client says Pro (#5608) (#5618)
  • fix(activation): route a denied push permission to the blocked state (#5609) (#5615)
  • fix(pro): point activation step 3 at MCP Clients, not the API upsell (#5607) (#5613)
  • fix(military): stop cross-Strait seeder crashing on every publish (#5616)
  • feat(china): add official exchange disclosure signals (#5594)
  • fix(china): harden policy ingestion (#5610)
  • feat(china): add official macro-financial pulse (#5597)
  • feat(china): ingest official policy enforcement events (#5595)
  • feat(military): add cross-strait activity baseline (#5596)
  • docs: add Japanese README (#5410)
  • feat(markets): expandable terminal price chart + fix(dev): OpenSky proxy path (#5459)
  • fix(sidecar): release upstream fetch semaphore on stalled/truncated responses (#5489)
  • feat(provenance): add decision-signal contract (#5592)
  • fix(activation): land outcome tracking on main (#5590)
  • fix(observability): detect silent catch blocks in Sentry coverage audit (#5586)
  • fix: register missing Breaking Defense intel source (#5405)
  • feat(business-seats): add domain-gated Pro seat invites for API Business (#5563)
  • feat(activation): onboard unactivated first-cycle Pro users (#5564)
  • fix(seo): preflight crawlable live sessions (#5589)
  • feat(market): add structured fundamentals + panel to stock analysis (#5467)
  • perf(market): serve the live price tape from the 'live' cache tier (#5465)
  • fix(rss-proxy): preserve original error/response when relay fallback throws (#5464)
  • fix(provenance): require explicit feed classifications (#5571)
  • test: guard Pro JSON-LD pricing against catalog drift (#5451)
  • fix(security): baseline unreachable brace expansion advisory (#5572)
  • fix(conflict): fix humanitarian pipeline — HAPI per-identifier throttle, not IP (#5554) (#5568)
  • feat(monitoring): probe the Umami analytics collector every 15 minutes (#5565) (#5567)
  • docs: correct CII country coverage (#5511)
  • refactor(forecast): extract market settlement loader (#5566)
  • docs(architecture): align alert docs with wired producers (#5513)
  • fix(header): keep Sign In visible on medium-width desktops (#5557)
  • feat(forecast): Phase 2 — LLM ensemble + prediction-market/FRED calibration slices (#5525) (#5526)
  • fix(news): fail-closed source provenance defaults (#5390) (#5556)
  • fix(deps): bump postcss to 8.5.18+ to clear GHSA-r28c-9q8g-f849 (#5562)
  • perf(gates): fix stale-hook delivery + batch esbuild check + incremental tsc (push timeouts) (#5558)
  • feat(seo): close crawlable-corpus audit gaps — social meta, name aliases, trust links, partial risk rendering (#5555)
  • feat(pricing): API Starter rename + commercial-license split + 5 Pro seats on Business ($299.99) (#5552)
  • feat(seo): add crawlable live intelligence tools (#5546)
  • fix(_crypto): fail closed on malformed auth inputs (#5550)
  • fix(renewable): replace hardcoded fallback with last-known-good data (#5551)
  • feat(activation): day-0 pro activation onboarding interstitial (#5534)
  • fix(seo): prevent raw-text crawlers from extracting "WWorld Monitor" Move the decorative "W" brand mark from inline text to a CSS ::after pseudo-element. Raw textContent extraction now yields "World Monitor" instead of "WWorld Monitor". The visual appearance, accessible name, and first-paint footprint are unchanged — the ::after inherits the same font-size and color from .skeleton-brand-mark. Adds focused regression tests in deploy-config.test.mjs asserting: - Raw text does not contain "WWorld" - The brand mark span has no text content - The "W" is rendered via CSS content Fixes #5541 (#5549)
  • fix(docker): preserve caller auth for local MCP requests (#5537)
  • fix(docker): preserve caller auth for local MCP requests (#5492)
  • feat(i18n): Hoàn thiện bản dịch tiếng Việt (vi.json) (#5539)
  • fix(routing): redirect pricing to canonical section (#5548)
  • fix(payments): dead-letter authenticated malformed webhooks instead of 401 (#5547)
  • fix(giving): disclose published benchmark provenance (#5540)
  • fix(payments): persist failed Dodo webhook incidents (#5533)
  • Merge commit from fork
  • test(bootstrap): cover DebugBear sampling boundaries (#5545)
  • fix(seo): remove unsupported schemamap robots directive (#5544)
  • chore(bootstrap): wind down the R2-origin experiment (DebugBear sampling + KTD7 no-go) (#5536)
  • fix(payments): restore lapsed subscriber reactivation path (#5532)
  • fix(security): bump find-my-way to 9.7.0 — GHSA-c96f-x56v-gq3h (HTTP/2 DDoS) (#5527)
  • feat(api): enforce the sold daily cap + informative at-cap 429 (#4635) (#4684)
  • fix(forecast): extend EIA settlement grace (#5524)
  • fix(global-tenders): spread SAM.gov request budget, stop retrying 429s (#5444) (#5457)
  • fix(auth): close the #5379 adversarial sweep — resource exhaustion, state corruption, MCP entitlement gaps, and the inert live suite (#5385)
  • fix(auth): keep Pro brief denials out of session recovery (#5516)
  • fix(python-sdk): avoid secret-scan literals (#5486)
  • fix(mcp): route sibling fetches through canonical API (#5517)
  • fix(notification-channels): bound convexRelay() with a 15s timeout (#5485)
  • docs(solutions): compound #4771 learnings — coverage-semantics bug + i18n shell convention (#5495)
  • ux(payments): billing-aware renewal/lapsed states instead of generic Upgrade CTA (#4771) (#5494)
  • feat(homepage): link Palantir positioning article (#5491)
  • fix(auth): honor current API access during renewal checks (#5490)
  • fix(seed-gdelt-intel): degrade bookkeeping failures instead of crashing; brownout-scale timeline TTL; content-age opt-in (#5478) (#5481)
  • ci(deploy-gate): retry the check-runs poll before posting a terminal 'pending' (#5479) (#5482)
  • fix(payments): distinguish transient entitlement-lookup failure from confirmed denial (#5483)
  • feat(blog): strengthen SEO and AI discoverability (#5475)
  • fix(payments): re-check Dodo before stale-subscription denial (#5447)
  • docs(blog): clarify WorldMonitor and Palantir positioning (#5480)
  • feat(agent-readiness): advertise SDKs in the agent view + homepage rel=alternate pointer (orank round 2) (#5476)
  • feat(agent-readiness): sandbox, docs-MCP JSON-RPC errors, schemamap, modular llms.txt (orank round) (#5469)
  • fix(content): replace blog title cards with product imagery (#5452)
  • feat(blog): pinned-post support; pin the Palantir post to the top of the index (#5446)
  • docs(solutions): three-layer cache eviction runbook for the live product catalog (#5422)
  • feat(content): receipts round — rewrite Palantir post, print the real scorecard, live radiation + tender records (#5443)
  • Update blog post to 6 dashboards, fix variants count, and add Energy … (#5408)
  • fix(seed-utils): retry transient Redis blips on the read path + skip-path meta ops (#5437) (#5438)
  • fix(feed-digest): decode & last so RSS entities aren't decoded twice (#5432)
  • fix(deps): clear sharp + fast-xml-parser high advisories redding audit-lockfile on all PRs (#5423) (#5424)
  • fix(rss-proxy): remove dead rsshub.app from allowlists (#5414)
  • fix(pricing): call out 'License / API key included' on the API Starter tier (#5419)
  • feat(content): 13 blog posts — undocumented features (tenders, sanctions, aviation, radiation, energy dashboard…) + 'not Palantir' positioning (#5403)
  • fix(deps): clear fresh high advisories redding audit-lockfile on all PRs (#5417) (#5418)
  • fix(seed-research): isolate arXiv categories + retry + TTL so a single blip can't empty prod (#5409) (#5413)
  • test(pro): critical-path budget guard for the committed /pro build (#5396) (#5397)
  • test(rss-proxy): wire test file into CI, lock the SSRF/auth/rate-limit guards, fix relay www-tolerance (#5378) (#5399)
  • chore(lint): appease biome 2.4.9's promoted rules across scripts/ (unblocks all PRs) (#5400)
  • fix(analytics): swallow Umami beacon rejection leaking to Sentry (#5393)
  • fix(deps): clear high-severity DoS advisories failing the security-audit gate (#5395)
  • fix(mcp): make GET /mcp crawler-readable and fix the discovery cache key (#5382)
  • docs(solutions): capture two reusable learnings from the KV cutover (#5338) (#5383)
  • fix(auth): follow-up to #5369 — fix Infinity-exp test and reset leaked timeout (#5370)
  • fix(checkout): retry transient create-checkout failures once with an Idempotency-Key (WORLDMONITOR-Q4) (#5374)
  • fix(auth): adversarial sweep — resource exhaustion, boundary validation, test double contract (#5369)
  • fix(sentry): suppress zero-frame 'Unexpected token' SyntaxErrors from injected scripts (#5367)
  • fix(notifications): enforce Country Scope uniformly across all alert categories (#5359) (#5366)
  • docs(solutions): seeder auxiliary Redis writes crash on Upstash timeout (#5365)
  • fix(seed-utils): retry transient Redis failures in writeExtraKey / extendExistingTtl (#5364)
  • docs(bootstrap): finalize U-K3 evidence with clean-24h confirmation (#5338) (#5363)
  • docs(solutions): Sentry noise filtering with stack gating and signature matching (#5361)
  • fix(sentry): suppress Clerk UI load failure and extension fetch-wrapper noise (#5360)
  • feat(bootstrap): serve public tier from KV via the Worker (U-K4, #5338) (#5357)
  • docs(solutions): desktop-CLS victim-vs-mover learning + panel-mount vocabulary (#5332) (#5356)
  • i18n(it): complete Italian translation — translate remaining untransl… (#5349)
  • test(dom): cover sanitizer and construction contracts (#5348)
  • fix(seo): scope the Mintlify docs proxy to www + redirect prefix-less /api-reference/* (#5345) (#5347)
  • feat(bootstrap): turn on the KV shadow measurement (U-K3 gate, #5338) (#5342)
  • perf(cls): reserve grid slots for immediate-tier panels — shell the top-8 mounts (#5332) (#5344)
  • feat(bootstrap): Workers KV serving path — publisher write + shadow measurement (U-K1, U-K2, #5338) (#5341)
  • fix(brief): catch duration-led historical explainers (#5340)
  • perf(bootstrap): record incumbent Redis latency (#5339)
  • feat(cls): shift-time mover attribution — name what grew, not what moved (#5332) (#5336)
  • fix(comtrade): restore HS preview classifier (#5337)
  • fix(brief): exclude historical explainers (#5335)
  • perf(cls): pin always-full panels to deterministic row heights (#5332) (#5333)
  • fix(forecast): retire legacy infrastructure cascade forecasts (#5334)
  • fix(bootstrap): preserve R2 RUM CORS headers at edge (#5331)
  • docs(solutions): compound the #5300 lever-test learning + seed CONCEPTS.md (#5329)
  • fix(bootstrap): preserve R2 origin RUM on Vercel (#5328)
  • fix(forecast): present() observes 0 (not NaN) on absence — VOID-rate regression (#5327)
  • fix(bootstrap): schedule R2 shadow work on Vercel (#5326)
  • perf(bootstrap): prepare measured R2 origin rollout (#5325)
  • fix(china): seed country index from ais relay (#5324)
  • fix(news): audit China source coverage by locale (#5323)
  • fix(health): detect vanished compact projections (#5322)
  • perf(seeders): stop seeding float64 conversion noise into the market sparklines (#5300) (#5319)
  • test(seeders): audit extraKey TTLs — and fix the wildfire projection it found (#5320)
  • fix(china): keep country-index audit cache Railway-backed (#5318)
  • test(seeders): ratchet the TTL-outlives-staleness invariant across the fleet (#5317)
  • fix(forecasts): dashboard key shipped the 11.5MB seeder trace, not a projection (#5311) (#5315)
  • fix(china): harden coverage audit contracts (#5314)
  • feat(mcp): add procurement opportunities tool (#5312)
  • perf(forecasts): serve the dashboard the forecast LIST, not the dossiers (#5300) (#5311)
  • fix(china): complete coverage audit contract (#5313)
  • perf(bootstrap): serve UCDP as a dashboard projection, not 2,000 raw events (#5300) (#5305)
  • perf(bootstrap): stop shipping 17 tier keys no client reads (#5300) (#5308)
  • fix(seeders): absorb a transient tender-source blip instead of raising a health warn (#5310)
  • perf(bootstrap): serve thermal escalation as a dashboard-sized view, not the full watch (#5300) (#5303)
  • perf(bootstrap): make cyberThreats an on-demand key instead of slow-tier freight (#5300) (#5302)
  • fix(seeders): give the ACLED conflict key a TTL that outlives its staleness gate (#5309)
  • perf(health): serve ?compact=1 from a compact verdict snapshot (#5300) (#5307)
  • fix(forecast): give DeepSeek-Flash the routing its timeout always assumed (#5304)
  • feat(china): add dedicated country summary (#5297)
  • fix(natural): correct HKO health and cyclone wind fallback (#5298)
  • docs(solutions): capture three verified learnings from the 2026-07-14 seeder/health session (#5306)
  • feat(procurement): technology-relevance filtering and documented AusTender blocker (#5286) (#5299)
  • fix(health): stop grading an unconfigured optional source as SEED_ERROR (#5295)
  • feat(natural): add Pacific cyclone attribution (#5296)
  • feat(china): add current macro and release calendar coverage (#5294)
  • fix(sentry): close two beforeSend gaps re-surfacing known third-party noise (#5293)
  • fix(railway): prevent skipped seeder deployments (#5292)
  • fix(seeders): restore defense patents via USPTO ODP (#5284)
  • fix(feeds): bypass Nature redirect loop (#5291)
  • fix(seeders): stop seed-conflict-intel crash-looping when it has no usable source (#5256) (#5290)
  • feat(china): add coverage health foundation (#5283)
  • feat(china): deepen strategic trade and energy coverage (#5282)
  • feat(china): deepen markets and server news coverage (#5281)
  • feat(china): expand aviation and safe PLA identification (#5280)
  • fix(seeders): declare papaparse + fast-xml-parser in scripts/package.json (#5266 regression) (#5289)
  • fix(api): strip router-injected ?rpc= so public RPC URLs are CDN-shielded (#5285) (#5287)
  • feat(procurement): add global tender intelligence (#5266)
  • fix(e2e): tolerate detached smoke responses (#5267)
  • fix(wildfire): package compactor with Railway seeder (#5270)
  • fix(conflict): restore keyless GDELT fallback (#5269)
  • fix(security): consolidate runtime hardening residuals (#5260)
  • fix(seeders): fail retry when last-good keys are gone (#5258)
  • perf(llm): cut DeepSeek Flash stall tail (#5257)
  • perf(redis): shield residual dashboard read egress (#5263)
  • perf(health): memoize Redis verdict sweep (#5262)
  • docs: add Chinese README (#5265)
  • fix(globe): guard OrbitControls against mixed mouse+touch pointer crashes (#5252)
  • fix(health): measure list-typed data keys with LLEN, not STRLEN (#5254)
  • fix(session): distinguish dead recovery reasons (#5253)
  • perf(bootstrap): restore CDN cache shield for tier reads (#5249) (#5250)
  • docs: fix inconsistent em dashes and real-time hyphenation (#5248)
  • fix(sentry): skip client-synthesized session-degraded 503s (#5245) (#5247)
  • feat(forecast): fast-resolving commodity price bets — Gate-1 accelerator (#5233) (#5243)
  • fix(security): harden Turnstile client IP identity (#5241)
  • fix(security): harden client-ip proof comparison (#5242)
  • fix(seeders): extract dependency-free client-ip.ts so usage.ts stops pulling @upstash into seeder containers (#5231) (#5236)
  • feat(forecast): bet-template engine + energy pilot (Phase 1, #5233) (#5238)
  • feat(forecast): honesty bridges — real-skill Brier + funnel guardrail (Phase 0, #5233) (#5237)
  • fix(telemetry): attribute usage to verified clients (#5229)
  • fix(seo): advertise localized docs sitemap (#5226)
  • fix(intelligence): cap deduct-situation LLM budget under edge ceiling (#5225)
  • docs(i18n): expand Chinese SEO descriptions (#5223)
  • fix(auth): suppress dead anonymous session retry storms (#5219)
  • fix(security): harden webhook registration boundaries (#5218)
  • docs(i18n): re-sync 87 zh-Hans pages to current English (#5215) (#5222)
  • perf(mobile): split post-hydration long-task wave (#5220)
  • fix(sentry): suppress h5player userscript frame-src CSP noise (#5221)
  • docs: improve SEO titles and descriptions for zh translation (#5217)
  • fix: repair broken links in zh translation (#5216)
  • fix(rate-limit): isolate paid summarize callers (#5212)
  • fix(boot): tolerate blocked browser storage (#5211)
  • feat(docs): add Chinese (zh-Hans) translation at full parity (#5214)
  • fix(convex): enforce Pro gate on notification channels (#5210)
  • fix(cls): create #mapSection already collapsed for the collapsed-map cohort (#5159) (#5205)
  • fix(build): co-locate ResilienceWidget into panels-intel chunk (#5203) (#5204)
  • perf(map): gate overlay counter-scale var writes on real zoom change (#5080 slice 2) (#5202)
  • docs: improve SEO titles for MCP apps and overview pages (#5200)
  • feat(mcp-apps): expand interactive widget fleet 5 → 10 (#4956) (#5199)
  • fix(risk): make canonical CII the only product source (#5197)
  • fix(forecast): resolve judged entries from deadline evidence (#5196)
  • fix(brief): reject truncated why-matters prose (#5184)
  • docs: improve SEO title for license page (#5182)
  • fix(brief): vary analyst why-matters prose (#5175)
  • fix(docs): explain how to find and replace API keys (#5181)
  • docs(legal): set UAE governing law, clarify refunds, ground operator in Dubai (#5180)
  • docs: tighten SEO metadata on About, Privacy, and Terms pages (#5179)
  • fix(homepage): point WIRED citation to the global wired.com edition (#5178)
  • feat(docs): add About, Privacy, and Terms trust pages (#5177)
  • fix: clarify IMF real GDP local-currency units (#4072)
  • docs: fix typo and escape pipe in pipelines table (#5176)
  • fix(welcome): drop dead Wikidata QID from homepage sameAs (#5174)
  • perf(search): defer mobile sheet population past first paint (#5167)
  • fix(a11y): restore Intel Feed tag contrast (#5172)
  • perf(mobile): profile panel work and trim font precache (#5173)
  • fix(cls): preserve collapsed map boot footprint (#5161)
  • fix(welcome): support legacy root clearing (#5164)
  • Fix Windows / CRLF compatibility and test suite bugs (#4358)
  • feat(airlines): Add automated ICAO-IATA code generator script (#4309)
  • ci(consumer-prices): run vitest suite (#5154)
  • fix(convex): guard JSON object request bodies (#5156)
  • fix(edge): allow longer enterprise wm_ keys through bot gate (#5155)
  • docs: unescape HTML entities inside inline code spans (#5152)
  • docs: tighten indicators & signals description under 160 chars (#5151)
  • fix(docs): prevent internal plan publication drift (#5149)
  • fix(matcher): don't treat missing category as an exact category match (#5139)
  • fix(observability): filter Floot automation + DebugBear-wrapped fetch Sentry noise (#5143)
  • fix(forecast): reclassify unrest count specs to judged (#5091) (#5142)
  • fix: correct verb form "time out" in desktop-app doc (#5146)
  • fix: repair broken links flagged by mint broken-links (#5144)
  • docs: tighten SEO descriptions across 71 pages to 130-160 chars (#5145)
  • chore(deps): bump actions/github-script from 7.0.1 to 9.0.0 (#5122)
  • chore(deps): bump actions/setup-go from 5.6.0 to 6.5.0 (#5118)
  • fix(seed): time-box seed-conflict-intel GDELT fallback sweep to fit the fetch deadline (#5140) (#5141)
  • chore(deps): bump actions/checkout from 4.3.1 to 6.0.3 (#5121)
  • chore(deps): bump docker/build-push-action from 7.0.0 to 7.2.0 (#5120)
  • chore(deps): bump node in /consumer-prices-core (#5117)
  • perf(cls): take cached-mode banner out of flow to stop column shove (#4580) (#5137)
  • fix(forecast): reclassify conflict/ucdp_zone count specs to judged (#5136) (#5138)
  • fix(forecast): fall back to GDELT for conflict events when ACLED creds absent (#5099) (#5134)
  • perf(cls): pin mobile boot skeleton to the real map footprint (#4580) (#5133)
  • perf(observability): sample field web-vital telemetry to cut Sentry volume ~80% (#5132)
  • perf(lcp): paint cached World Brief at panel construction (#4890) (#5130)
  • fix(dashboard): stabilize CLS-prone deep-dive motion (#5124)
  • fix(lcp): tag field LCP element selector (#5123)
  • fix(forecast): harden simulation keyword matching (#5128)
  • test(forecast): lock ACLED health visibility (#5127)
  • chore(perf-tooling): harden render-axis interaction traces (#5125)
  • fix(seed): don't crash seed-conflict-intel when ACLED creds are absent (#5126)
  • fix(pro): collect DebugBear RUM on marketing pages (#5116)
  • fix(forecast): calibrate detector probabilities (#5107)
  • test(forecast): tighten simulation selection assertions (#5112)
  • fix(forecast): surface silent forecast input feed gaps (#5109)
  • fix(dashboard): reduce mobile map tap presentation work (#5111)
  • fix(forecast): guard market calibration anchors (#5105)
  • fix(forecast): fail ACLED seed when primary feed is unavailable (#5106)
  • fix(forecast): harden theater simulation gating (#5108)
  • fix(sentry): suppress Firefox host-suffixed NetworkError for DebugBear RUM beacon (#5110)
  • fix(forecast): enforce hard resolution publish coverage (#5096)
  • fix(forecast): restore FRED macro signals (#5104)
  • fix(frontend): harden dashboard lazy loading and metadata (#5089)
  • feat(api): IETF RateLimit headers + verifiable signed webhook sample (orank Usability) (#5095)
  • perf(dashboard): add mobile tap render-axis tracing (#5088)
  • fix(rum): wire lcp web-vitals reporting (#5090)
  • fix(forecast): resolve judged forecast outcomes (#5087)
  • fix(forecast): use ACLED resolution feeds for hard counts (#5085)
  • perf(edge): cache apex→www 301 + point published human links at www (#5081) (#5086)
  • fix(api): cool down Finnhub symbol-search 429s (#5082)
  • perf(wildfire): cap dashboard fire payload (#5083)
  • fix(relay): stop double-TLS wrapping OpenSky proxy fetches (#5074) (#5084)
  • Fix forecast hard resolution coverage (#5072)
  • fix(seeders): don't crash a bundle when a member fails gracefully (#5077) (#5078)
  • perf(forecast): prune archived terminal entries from the resolution ledger (#5067) (#5073)
  • Fix SPA lifecycle recovery (#5064)
  • Fix seeder health metadata drift (#5071)
  • fix(aviation): avoid caching unavailable flight data (#5070)
  • Fix RPC no-store cache contract (#5068)
  • Harden Convex entitlement lifecycle races (#5065)
  • test(news): stabilize completeness selection attribution fixture (#5069)
  • Fix container healthchecks: IPv6/localhost + auth-gated probe path (#5051)
  • fix(forecast): avoid stale UCDP count resolutions (#5063)
  • fix(docker): keyless healthcheck + wire UCDP_ACCESS_TOKEN into ais-relay env (#5052)
  • perf(map): cut INP input-delay — guard rebuild loops, throttle hover query, yield-schedule heavy commit (#5042) (#5045)
  • perf(dashboard/INP): route flashLocation through the base-map geometry cache (#5049) (#5050)
  • fix(checkout): quiet active subscription blocks (#5048)
  • feat(corpus): make chokepoint/country pages useful + deep-link into the live map (#5044)
  • feat(billing): self-serve Starter→Business API upgrade (#4634) (#4672)
  • feat(api): add plan limit notification lifecycle (#4648)
  • fix(news): keep digest cold builds under edge timeout (#5047)
  • perf(onboarding): defer mission-preset auto-open to idle after paint (#5046)
  • feat(content): add crawlable static corpus (#5041)
  • fix(digest): prefix story-track reads in previews (#5040)
  • docs(mcp): document endpoint exposure workflow (#5039)
  • feat(agent-skills): expand catalog with tranche 4 recipes (#5033)
  • feat(mcp-apps): interactive dashboard fleet — 4 new ui:// widgets (#4959) (#5035)
  • perf(map): skip zoom-hidden SVG marker DOM (#5036)
  • fix(seed-economy): bound FRED fetch concurrency under the 240s deadline (#5037) (#5038)
  • Harden watchlist notification follow-ups (#5034)
  • fix(payments): pace dunning Resend sends under the 10 req/s limit (#5032)
  • feat(markets): ticker tagging at ingest, market-hours awareness, watchlist story alerts (#4922) (#5031)
  • perf(pro): keep signal bars animation off layout (#5028)
  • fix(pipeline): harden AIS relay Upstash detection, mask Redis creds, add EVALSHA-free rate-limit fallback (#5025)
  • feat(forecast): add resolution ledger and scorecard (#5024)
  • fix(notifications): fail open on dedup SETNX errors (#5026)
  • fix(forecast): harden simulation outcome writes (#5027)
  • perf(pro): split @sentry into its own cacheable chunk (#5019) (#5020)
  • perf(map): route boot-path container geometry through the resize cache (#5017) (#5022)
  • chore(aeo): brand-named developer-resource discoverability pages (#5023)
  • chore(perf): remove stale protomaps.github.io dns-prefetch (#5016) (#5021)
  • perf(pages): immutable /pro asset caching, lazy preview + on-demand Turnstile, WebP blog covers (#5013) (#5015)
  • feat(agents): Web Bot Auth key directory + /agent/auth WWW-Authenticate challenge (orank) (#5009)
  • fix(forecast): resolution-spec emission amendment — horizon-commensurable count + resolvable supply/gps windows (#5010) (#5012)
  • fix(health): no-store on the compact status response so uptime monitors never read a stale verdict (#5008)
  • feat(forecast): resolvability contract — machine-checkable resolution spec per forecast (#4976) (#5004)
  • fix(forecast): reserve run-budget for the full provider chain so market_implications' groq fallback isn't stranded (#4978 follow-up) (#5003)
  • feat(content): free-vs-paid comparison post + fix never-firing FAQPage JSON-LD (#4998, #5001) (#5002)
  • fix(seo): self-canonicalize variant subdomain dashboards + canonical Link headers for sitemap .md pages (#4996, #4999) (#5000)
  • fix(seo): restore WIRED/2M+ meta description — sync VARIANT_META.full with hand-tuned index.html + drift guard (#5005) (#5006)
  • fix(seed-bigmac): parallelize 50-country EXA loop to stop 240s-deadline crashes (#4994) (#4995)
  • feat(llm): never serve OpenRouter inference from China-hosted providers (#4993)
  • fix(payments): reconcile missed Dodo renewals (#4794)
  • fix(portwatch): prioritize never-cached countries in the cold-fetch cap so coverage reaches 174 (health COVERAGE_PARTIAL) (#4992)
  • perf(brief): route whyMatters to deepseek-v4-flash, decouple from the reasoning tier (#4983 follow-up) (#4991)
  • feat(payments): reconcile stuck pending payments (#4795)
  • fix(fred): pipeline batch seed reads (#4989)
  • fix(notifications): coalesce repeated alert events (#4985)
  • fix(gpsjam): restore the free gpsjam.org source, retire the Wingbits quota dependency (#4987)
  • feat(iran-events): flag-gate the whole Iran-events domain, default OFF (war-ended sunset) (#4982)
  • fix(middleware): stop bot-gating /favico/* — public brand assets must be world-readable (#4988)
  • fix(llm): reasoning-off for short brief stages — v4-pro empty-content 80% (#4983) (#4984)
  • fix(forecast): stop false SEED_ERROR when market_implications is starved of the shared LLM run budget (#4978) (#4980)
  • fix(widget): persist Pro widget HTML across reloads (#4981)
  • docs(mcp): mcp-remote bridge setup + Cloudflare apex-redirect exemption contract (#4951)
  • fix(llm): pin regions on the two unpinned LLM edge routes + log provider error bodies (#4944 U7) (#4966)
  • feat(llm): core chain to OpenRouter DeepSeek V4 Flash + output-shape hardening (#4944 U1+U2) (#4950)
  • feat(llm): seeder narrative tiers to DeepSeek V4 Flash; pin probability-coupled critical_signals (#4944 U6) (#4977)
  • feat(telemetry): llm_call events for the telemetry-dark seeder transports (#4944 U5) (#4954)
  • fix(pricing): remove the phantom "XLSX exports" claim from API Business (#4974) (#4975)
  • fix(forecast): stable semantic-slot ids for military and state-derived forecasts (#4933) (#4973)
  • feat(pricing): publish the API Business tier — visible, priced, self-serve (#4945) (#4946)
  • feat(analytics): restore Umami on canonical www host + end-to-end checkout funnel events (#4931) (#4934)
  • feat(billing): dunning + winback email lifecycle for failed payments and cancellations (#4932) (#4935)
  • fix(forecast): non-finite probability guards — NaN can no longer enter or anchor the probability spine (#4933) (#4969)
  • fix(feeds): allowlist war.gov + thenationalnews.com + trumpstruth.org — unblock feed-health activation (#4970) (#4971)
  • feat(ux): persistent read-state — NEW tags survive reload (#4923, slice a) (#4926)
  • feat(markets): macro-print actuals, earnings in the daily brief, finance-demotion seam (#4922) (#4929)
  • feat(brief): the brief contract — top-8 synthesis, verified citations, enforce-mode gate, shared grounding spine (#4921) (#4928)
  • feat(news): completeness measurement — feed health w/ silent zeros, coverage ledger + provenance, GDELT recall benchmark (#4920) (#4927)
  • feat(news): unified story-identity service — one similarity definition for clustering, dedup, corroboration (#4919) (#4924)
  • fix(forecast): word-boundary term matching — stop substring country false positives corrupting probabilities (#4933) (#4939)
  • feat(content): global-intelligence glossary — 20 crawlable DefinedTerm pages (#4960) (#4968)
  • feat(agent-readiness): advertise the live docs MCP server + real /agent.txt (#4958) (#4964)
  • feat(agent-readiness): three-tier AI-crawler policy in robots.txt + real /agents.md (#4952) (#4955)
  • fix(sentry): CSP noise filters — Doubao KaTeX fonts, injected Google Fonts CSS, content-filter frame vendors (#4942) (#4943)
  • feat(ci): live MCP smoke — 6-hourly anonymous strict-client walk of prod (apex+www) — #4937/#4938 regression net (#4941)
  • fix(mcp): serve ping + prompts/* + logging/setLevel anonymously — gated 401 hangs Claude Desktop via mcp-remote (#4937) (#4940)
  • chore(digest): reuse prior envelope prose on non-due compose ticks (#4917) (#4918)
  • chore(llm): cache-identity churn batch 2 — summary pair-dedup v7, market-brief context quantization, forecast prompt-hash cache, whyMatters v8 cross-read (#4914) (#4916)
  • fix(summarization): entitlement-gate the summarize provider chain — stop the anon 401 flood + 3x fan-out (#4913) (#4915)
  • chore(llm): regional hygiene — narrative prompt-hash cache + brief retry-budget cap (#4911)
  • fix(health-freshness): revalidate every poll — CF browser-TTL rewrite would oscillate synthesized-OK sources to stale (#4910) (#4912)
  • chore(digest): flip BRIEF_WHY_MATTERS_SHADOW to opt-in — default-on doubled gemini spend (#4909)
  • perf(health): collapse health polling cost — CDN-cache compact health, 5-min cadence, idle-deferred first hydration (#4907) (#4908)
  • feat(observability): emit llm_call events from callForecastLLM — the seeder path #4901 missed (#4906)
  • fix(health-freshness): read the keyless compact health endpoint — stop the anon 401-per-minute flood (#4902) (#4905)
  • fix(intelligence): stop ISO stopword-codes (IN/US/AT/NO) over-matching shared brief grounding (#4904)
  • perf(CLS): attribute field shift classes — hiddenAtLoad/scrollY/viewport env on CLS reports (#4580) (#4903)
  • feat(observability): emit llm_call usage events from every server-side LLM path (#4901)
  • perf(forecasts): input-hash cache guard for the market_implications LLM stage (#4900)
  • perf(pwa): keep blog OG covers out of the dashboard SW precache (#4891) (#4899)
  • fix(intelligence): share the anon country-brief cache per country+lang — stop hashing caller context into the key (#4898)
  • perf(map): time-box marker pulse animations — settle to static after 6s (#4669) (#4897)

Full Changelog: sdk/go/v0.1.1...v2.10.0

Don't miss a new worldmonitor release

NewReleases is sending notifications on new releases.