Skip to content

chore(deps): Bump actions/setup-python from 5 to 6 - #3

Open
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/github_actions/actions/setup-python-6
Open

chore(deps): Bump actions/setup-python from 5 to 6#3
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/github_actions/actions/setup-python-6

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Mar 4, 2026

Copy link
Copy Markdown

Bumps actions/setup-python from 5 to 6.

Release notes

Sourced from actions/setup-python's releases.

v6.0.0

What's Changed

Breaking Changes

Make sure your runner is on version v2.327.1 or later to ensure compatibility with this release. See Release Notes

Enhancements:

Bug fixes:

Dependency updates:

New Contributors

Full Changelog: actions/setup-python@v5...v6.0.0

v5.6.0

What's Changed

Full Changelog: actions/setup-python@v5...v5.6.0

v5.5.0

What's Changed

Enhancements:

Bug fixes:

... (truncated)

Commits
  • a309ff8 Bump urllib3 from 2.6.0 to 2.6.3 in /tests/data (#1264)
  • bfe8cc5 Upgrade @​actions dependencies to Node 24 compatible versions (#1259)
  • 4f41a90 Bump urllib3 from 2.5.0 to 2.6.0 in /tests/data (#1253)
  • 83679a8 Bump @​types/node from 24.1.0 to 24.9.1 and update macos-13 to macos-15-intel ...
  • bfc4944 Bump prettier from 3.5.3 to 3.6.2 (#1234)
  • 97aeb3e Bump requests from 2.32.2 to 2.32.4 in /tests/data (#1130)
  • 443da59 Bump actions/publish-action from 0.3.0 to 0.4.0 & Documentation update for pi...
  • cfd55ca graalpy: add graalpy early-access and windows builds (#880)
  • bba65e5 Bump typescript from 5.4.2 to 5.9.3 and update docs/advanced-usage.md (#1094)
  • 18566f8 Improve wording and "fix example" (remove 3.13) on testing against pre-releas...
  • Additional commits viewable in compare view

Dependabot compatibility score

You can trigger a rebase of this PR by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)

Note
Automatic rebases have been disabled on this pull request as it has been open for over 30 days.

Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5 to 6.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](actions/setup-python@v5...v6)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file github_actions Pull requests that update GitHub Actions code labels Mar 4, 2026
rodanaya added a commit that referenced this pull request Apr 24, 2026
…63 LOC)

5-agent review consensus on the /network page's 'Act 0 — Circuit Board
Network' SVG:

- Investigative editor #6: 'Decorative, not investigative … an art piece'
- Data-viz critic #3: 'Pure decoration, no readable structure, no legend,
  no axis, no ordering logic visible. Communicates zero quantitative
  information at a glance.'
- UX/IA critic #7: 'Form over function; the hero teaches nothing.'

The CircuitBoard component rendered 120 nodes (10 hubs + 110 vendors) as
an unlabeled SVG grid in four decorative colors. At page scale, vendor
labels were unreadable and the 'red dashed cross-community' traces were
indistinguishable from other edges. Meanwhile, Nucleos (the labeled
community-bubble chart below) was already doing the investigative work
— named communities, relative sizes by captured value, click-through to
dossier cards — and is now the lead viz.

Removed:
- interface CircuitNode
- interface CircuitEdge
- function buildCircuitLayout()
- function CircuitBoard()
- render call <CircuitBoard /> in the page

Total: -363 LOC. No replacement; page is stronger without it.

Verification:
- npx tsc --noEmit: 0 errors (noUnusedLocals forced full removal, not just
  de-rendering)
- npm run build: succeeded (30.37s)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
rodanaya added a commit that referenced this pull request Apr 24, 2026
…iles

Tier 1 #3 from the ultrathink plan. The investigative-editor review
ranked 'no export, no folio lookup' as the platform's #1 missing
feature. Every RUBLI finding was a loose thread — a journalist couldn't
walk away with it.

## What it does

Any vendor or institution profile now has a 'Download dossier (ZIP)'
action that produces a single, editor-emailable package containing:

  - dossier.html    — standalone print-to-PDF brief with inline styling,
                      editorial typography, key-figures strip, external-
                      registry badges (EFOS/SFP/GT), top-50 contracts
                      table (folio, title, year, amount, institution,
                      risk), methodology footnote, 'not a finding of
                      wrongdoing' disclaimer front-and-center
  - contracts.csv   — 13-column flat CSV for Excel/pandas
  - manifest.json   — full structured payload (aggregate stats, ARIA
                      flags, IPS score, pattern code, etc.) for
                      machine consumption
  - README.txt      — orient the journalist to the package

No new dependencies: stdlib zipfile + inline HTML/CSS. The reader
opens dossier.html in any browser and Ctrl+P produces a PDF —
universal, no server-side PDF rendering required.

## Implementation

- backend/api/routers/dossier.py (new, 431 LOC)
  - `GET /api/v1/dossier/vendor/{id}` → vendor ZIP
  - `GET /api/v1/dossier/institution/{id}` → institution ZIP
  - Both aggregate stats + ARIA registry flags + top 50 contracts
    by value, render HTML + CSV + JSON, stream ZIP response
- backend/api/main.py — router registered
- frontend/src/pages/VendorProfile.tsx — 'Download dossier (ZIP)'
  entry added to the existing ActionOverflowMenu between CSV export
  and Generate Report
- frontend/src/pages/InstitutionProfile.tsx — 'Dossier (ZIP)' button
  added as EditorialPageShell action slot

## Verification

- npx tsc --noEmit: 0 errors
- npm run build: succeeded (34.02s)
- Live smoke (TestClient against production DB):
  - Vendor 29277 (Grupo Farmacos): 9.7KB ZIP, 4 files, 50 contracts
    in CSV, 17KB HTML
  - Institution 251 (IMSS): 12.3KB ZIP, 4 files, 50 contracts, 17KB HTML
  - Both downloadable, valid ZIP structure verified via zipfile.ZipFile

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
rodanaya added a commit that referenced this pull request Apr 27, 2026
…ead nav link

3 visible-bug fixes from the 10-agent quality round 1:

1. Executive § 5 Historias Ejemplares card #3 was hardcoded vendor 39876
   labelled "COVID EMERGENCY PROCUREMENT NETWORK". Vendor 39876 is
   actually "ARQUITECTURA Y DISEÑOS GEMA, S.A. DE C.V." — totally
   unrelated. Clicking the card sent users to the wrong vendor profile.
   Replaced with vendor 6038 HEMOSER ($17.2B real COVID IMSS supplier,
   GT-anchored). Caught by F1 functional agent.

2. /network (RedesKnownDossier) renders 10 hardcoded fake community
   objects (847 vendors / $234B / "IMSS confirmed:12 cases") presented
   as Louvain output. Real institution names paired with fabricated
   case counts = defamation-adjacent. Added "⚠ Composición ilustrativa"
   banner under the section header. Real fix is wiring the
   vendor_communities table; this disclaimer is the immediate honesty
   patch. Caught by F5 functional agent.

3. Sidebar "API Explorer" link pointed at /api/v1/docs which 404s
   (FastAPI docs are gated/disabled in prod). Removed the entry per
   PROJECT_LOCKED_V3.md "every nav entry must lead to a working page."
   Caught by F1 functional agent.

Backend tests still 691/691 passing (no backend changes).
Frontend gates: tokens / tsc / build all PASS.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
rodanaya added a commit that referenced this pull request Apr 29, 2026
Improvement-table batch — small, high-leverage UI corrections from
the alignment plan. Each is independent.

#3 — RISK FLOOR / RIESGO MÍNIMO label (Atlas.tsx)
  • Was: "X-RAY / RAYOS X" — niche jargon, doesn't read naturally
  • Now: "RISK FLOOR / RIESGO MÍNIMO" — matches the existing
    aria-label "Risk floor filter / Filtro mínimo de riesgo"
  • One-line rename, no behavior change

#6 — In-bar long-form CTA on the playback bar (Atlas.tsx)
  • Adds a small <FileText> chip next to the story title in the
    playback bar, label "FULL / COMPLETA" on sm+ viewports
  • Only renders when activeStory.longformSlug is set (i.e. the
    tour has a paired /stories long-form — currently 2 of 3
    tours: pharma_cartel + estafa_maestra)
  • Opens /stories/<slug> in a new tab so the playing tour state
    persists; readers don't have to wait for the end-card if they
    already know they want the article
  • Click stops propagation to keep the playback bar in place

#9 — Dashboard mini-Observatory "Open full Observatory" footer
  (Executive.tsx)
  • Adds a small <ArrowUpRight> link below the embedded
    constellation in "§ 1 · The Observatory" section
  • Preserves the active lens via ?lens=<atlasMode> when not
    'patterns' (default lens — no param needed)
  • Pure additive — no change to the embedded mini-constellation

Imports added: Link from react-router-dom in both files (Atlas.tsx
already had useNavigate; Executive.tsx already had ArrowUpRight).

Skipped from the improvement table for this commit:
  • #2 vendor search index expansion — needs editorial-data work
    to curate the next 20–30 vendors from recent commits
  • #4 COMPARE YEARS coachmark — needs design call (location,
    persistence, dismiss behavior)
  • #7 X close state preservation — already preserved (the
    URL-sync effect carries lens/year/pin through close)
  • #10 "as of {date}" timestamp on story hero — small but needs
    a separate decision about whether story freshness should be
    surfaced editorially or not
  • #1 Stories button label clarity — replaced indirectly by the
    Tier-2 #7 footer link "Long-form investigations · P3" which
    is more informative than "Stories"

Verified live in browser preview:
  • /atlas?story=pharma_cartel shows the new "FULL" chip in the
    playback bar (sm+ viewport)
  • Risk-floor row reads "RISK FLOOR" not "X-RAY"; "X-RAY" /
    "RAYOS X" no longer appears anywhere
  • Dashboard renders "Open full Observatory" link below the
    embedded constellation, routes to /atlas

Gates: tsc clean, build clean (37s), lint:tokens 0 forbidden,
warnings unchanged from prior commit.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
rodanaya added a commit that referenced this pull request Apr 29, 2026
Three remaining items from the improvement table.

#4 — COMPARE YEARS discoverability hint (Atlas.tsx)
  • The toggle was visually clear but its function wasn't —
    "Compare years" doesn't tell you the button renders a second
    constellation
  • Adds a title attr (native browser tooltip) explaining "Render
    a second constellation alongside this one. Pick a year for
    each canvas to see the same lens at two moments in time —
    e.g. Peña 2014 vs COVID 2020."
  • Adds a more descriptive aria-label
  • No visual change — discoverability via hover/focus only

#2 — Vendor search index 21 → 42 (Atlas.tsx)
  Expanded the curated KNOWN_VENDORS list with named vendors
  surfaced across the long-form stories and recent commits in
  this branch:

  Pharma cartel cluster (full set):
    • Maypo · DIMM (PISA already present)

  P3 intermediaries — pass-through signatures:
    • Constructora ARHNOS · Promotora y Desarrolladora MX
    • CAABSA Constructora · GX2 Desarrollos
    • Técnicas Reunidas (legitimate sole-source contrast)
    • Pride International (legitimate sole-source PEMEX)

  Tech-license direct-award cluster (defensible sole-source):
    • Microsoft (Corp/Licensing/Mexico combined) · Oracle · IBM

  Government media buys (red — non-competitive):
    • Televisa · Estudios Azteca

  DICONSA staple-commodity supply chain:
    • Molinos Azteca · Marcas Nestlé

  Voucher cluster (welfare-program payment-card monopolies):
    • Efectivale · Sodexo · Segalmex (TOKA, Edenred already)

  Tren Maya / large-contract risk:
    • ICA Constructora · Alstom Transport

  Methodology hint copy updated to reflect the new count and
  cluster categories ("42 known cases — pharma cartel, P3
  intermediaries, tech-license cluster, gov media buys,
  DICONSA staples, voucher monopolies").

#10 — Analysis-as-of timestamp on story hero (StoryNarrative.tsx)
  • Adds a small mono-font "Analysis as of April 2026 / Análisis
    a abril de 2026" chip in the byline row, alongside the
    existing chapter count
  • title attr explains the editorial-honesty point: "Stories
    are static analyses of a COMPRANET snapshot dated through
    this period. Live data updates in the Observatory and ARIA
    queue, not in the story body."
  • Single hardcoded date for now (matches v0.6.5 model rescore
    + ARIA pipeline run on Mar 25 2026); a future iteration
    could thread per-story analysisDate via the StoryDef schema

Improvement table items now closed in this branch:
  ✅ #1 STORIES button label (replaced via Tier-2 #7 footer)
  ✅ #2 vendor index (this commit)
  ✅ #3 RISK FLOOR rename (da17e08)
  ✅ #4 COMPARE YEARS hint (this commit)
  ✅ #5 i18n audit (already correct, verified)
  ✅ #6 in-bar long-form CTA (da17e08)
  ✅ #7 X close state preservation (already preserved)
  ✅ #8 Newsroom card tour badge (Tier-1)
  ✅ #9 Dashboard Observatory footer link (da17e08)
  ✅ #10 Story timestamp (this commit)
  ✅ #11 Dashboard KPI anchors (Tier-2 #8)
  ✅ #12 atlas-tour brand parity (ca902d1)

Verified live: /stories/marea-de-adjudicaciones renders the
"Analysis as of April 2026" chip in the byline row.

Gates: tsc clean, build clean (34s), lint:tokens 0 forbidden,
warnings unchanged.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
rodanaya added a commit that referenced this pull request May 4, 2026
Pattern #2 — Annotated TemporalRiskChart:
  - Admin era bands (Calderón/Peña/AMLO/Sheinbaum) via ReferenceArea + label
  - EditorialComposedChart: band annotations now support insideTopLeft label
  - Scandal legend → editorial callout cards (year chip + label grid)
  - Narrative title: "Risk patterns have barely shifted in 15 years"

Pattern #3 — Sector small multiples grid (4×3):
  - SectorSmallMultiples component: all 12 sectors, shared Y scale
  - Mini 72px AreaChart per sector, sector-color gradient fill
  - Sorted worst-first (top-left = highest risk, as eye lands)
  - Trend arrow + current % below each panel

Pattern #6 — Diverging vendor benchmark bars (FT Deviation pattern):
  - VendorBenchmarkBars component at top of EvidenceTab
  - Direct award, single-bid, high-risk vs OECD limits (30%/10%/11%)
  - Year-end concentration vs sector average when available
  - Bars right = above limit (crimson), left = below (zinc) — "compared to what?" answered instantly

Pattern #10 — Sledgehammer stat for story chapter 1:
  - DataPullquote: new sledgehammer prop (4.5–7rem stat vs 2.4–3.6rem default)
  - Number first, quote demoted below — Pudding opening structure
  - Auto-applied to chapter idx=1 (first data chapter after hero) in StoryNarrative

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
rodanaya added a commit that referenced this pull request May 4, 2026
…ports/sector (346s)

Both endpoints exceeded the 30s axios timeout by 5-11x, leaving users
staring at spinners. Both are pure aggregations on contracts (~3M rows)
that don't change without a new ETL run — perfect candidates for
in-memory cache + startup warmup.

- /analysis/leads: 1h cache keyed by (lead_type, priority, sector_id,
  min_amount, limit). Most calls use defaults so cache hit rate is high.
- /reports/sector/{id}: 24h cache keyed by sector_id. Reports are
  static between ETL runs.
- Startup warmup now hits /analysis/leads (200s budget) and all 12
  sector reports (400s budget each, run sequentially in background
  thread with 0.5s breathing between calls so user requests aren't
  starved).

After warmup: every cold-start latency in the audit's TOP 5 is gone.
Backend tests: 35/35 pass.

Audit: docs/PROD_BROKEN_AUDIT_2026_05_04.md (#3 + #4)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
rodanaya added a commit that referenced this pull request May 7, 2026
Established the loop-killing protocol the user asked for:
  - Issues filed by ID (Issue #N) or 'New issue:' prefix
  - I assign severity + acceptance criteria, you negotiate once
  - Tickets close with commit SHA + one-line 'fixed by'
  - New ideas that aren't blocking go to v1.1 candidates section
    (untouched until 2026-06-14)

Opened tickets (10):
  #1 P1  /categories/:id institutional ranking skewed by state institutions
  #2 P1  /categories/:id full conceptual rework
  #3 P1  /vendors/:id below RedThread quality bar
  #4 P1  /institutions/:id below quality bar
  #5 P1  /administrations too many graphs, simplify
  #6 P1  /methodology body i18n + polish
  #7 P1  story chart bilingual coverage gap (12 launch-relevant)
  #8 P1  pick the 5 launch stories
  #9 P2  story chart visual quality gap
  #10 P2  /aria thread vs /vendors profile coherence

Pending docs (background agents running):
  - docs/RUBLI_v1.0_QUALITY_BAR.md (Opus design-visionary)
  - docs/RUBLI_v1.0_CHART_INVENTORY.md (Sonnet general-purpose)
rodanaya added a commit that referenced this pull request May 7, 2026
Two background-agent deliverables landed:

1. docs/RUBLI_v1.0_QUALITY_BAR.md (Opus, 434 lines)
   Defines what 'gold-standard quality' means by reading Atlas +
   Executive + AriaQueue + RedThread. Identifies the 5-bullet
   quality fingerprint. Gap-analyses the 4 'pathetic' surfaces
   (vendors / institutions / categories / administrations) with
   specific deltas + effort estimates.
   Key finding: 'pathetic' feeling = Card chrome usage. Gold
   surfaces use ZERO Cards; InstitutionProfile has 63.

2. docs/RUBLI_v1.0_CHART_INVENTORY.md (Sonnet)
   86 chart files audited. 50% Gold, 46% Decent, 3% Pathetic.
   10 orphan charts identified for kill. 5 launch-blockers
   surfaced (green-token violation, English-only labels, etc).

3. docs/RUBLI_v1.0_ISSUE_TRACKER.md updated:
   - #1 sharpened — backend filter bug source identified.
   - #2 DEFERRED to v1.1 (full categories rework needs an
     editorial decision, not an agent).
   - #9 DOWNGRADED to P3 — only 3 charts truly pathetic, not
     'most.' Likely zero additional work after other tickets.
   - 5 new tickets opened from chart inventory (#11-#15)
     covering orphan kills, green-token fix, bilingual gaps,
     duplicate-chart consolidation.

Effort recalibrated: 12-16 agent-days for full rework, vs 8 days
to launch. Triage sequence locked:
  Day 1 (Fri 05-08): #1 + #5
  Day 2-4: #4 (InstitutionProfile)
  Day 5-7: #3 (VendorProfile)
  Side: #6 (methodology), #7/#8 (stories), #11-#15
  Deferred: #2

No code changes outside this commit.
rodanaya added a commit that referenced this pull request May 7, 2026
…one /relationships surface

User pushback on the original cut: 'I don't know if we should come
up with something better that may combine aspects of these three.'
Filing the merge proposal as a tracker ticket so v1.0 ships ONE
working relationships surface instead of four broken ones (or zero).

Three sections, each in PlateFrame:
  1. Network graph (Networks data)
  2. Pattern overlap (Intersection data)
  3. Institutional capture (CaptureCreep data)

/patterns/:code stays — it's the per-pattern reference dossier
and already works.

Effort: 1-2 agent-days. Can run in parallel with #3/#4 via
the /ui skill in worktree isolation.
rodanaya added a commit that referenced this pull request May 12, 2026
Remove SimpleTabs/TabPanel chrome from VendorProfile. Evidence →
Activity → Network sections now flow as one continuous dossier,
separated by Roman-numeral chapter dividers (I · Risk Analysis /
II · Contract Activity / III · Network & Investigation).

useVendorData: make activeTab optional, always load waterfall/
peerComparison/histogram/rollingTimeline eagerly (no tab gate).

Closes Issue #3 per RUBLI_v1.0_QUALITY_BAR.md — resolves the
'PowerPoint-shaped tabs destroy editorial arc' critique.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
rodanaya added a commit that referenced this pull request May 12, 2026
Replace thin text-in-bar ChapterDivider with gold-standard primitives:
- ChapterHeader: IBM Plex Mono italic accent kicker (0.18em, #a06820)
  + EB Garamond serif h2, matching ChapterLabel+RedThreadChapter in RedThread
- ChapterDivider: dot-rule (accent dot · 1px lines), matching RedThread:117-125
- Chapter titles: §I El Análisis de Riesgo / §II La Trayectoria / §III Las Conexiones

Closes the B→A gap on Issue #3.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
rodanaya added a commit that referenced this pull request May 13, 2026
Badge was inline flex items-baseline with the spend/contracts/high-risk
numbers, breaking editorial hierarchy. Now in its own flex row above the
stats strip, never inline with Playfair numerics.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
rodanaya added a commit that referenced this pull request May 14, 2026
All 12 risk factor coefficient entries in EN+ES glossary now reflect
v0.8.5 active model. Key changes:
- price_volatility: 0.5343 → 0.558 (still #1, now 43% ahead of #2)
- price_ratio: 0.2345 → 0.358 (rises to #3 from #4)
- vendor_concentration: 0.3749 → 0.327 (drops to #4 from #2)
- direct_award: +0.031 → -0.081 (SIGN FLIPPED — now protective)
- institution_diversity: -0.3821 → -0.388 (strengthens)
- network_member_count: +0.181 → +0.166
- ad_period_days: +0.042 → +0.090 (stronger)
- All "v0.6.5" references updated to "v0.8.5"
- "Zeroed in v0.6.5" → "regularized in v0.8.5"

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
rodanaya added a commit that referenced this pull request Jun 3, 2026
…ess (15 findings)

Acts on the Opus grading panel (Regular 72→targets Satisfactorio). Critical +
high findings first:

HONESTY (critical/high)
- #1 The fanned y-axis no longer lies. `collapse` is lifted out of subScatter
  into `fanState`; when a cluster's vendors share ~one risk (collapse ≥ 0.5) the
  vertical order is an arbitrary hash, so the axis label switches from "↑ RISK"
  to "≈ EQUAL RISK · ARBITRARY SPREAD" and greys out. The fan can no longer be
  read as a risk gradient.
- #2 The on-chart sample is labelled for what it is — "top N by risk" (backend
  orders avg_risk_score DESC), not a value-complete set.

ACCESSIBILITY (Deficiente 52 → )
- #3 Risk gains a non-colour channel: a redundant tier ring (heavy=critical,
  thin=high, none=medium) keyed off getRiskLevelFromScore — colour-blind safe.
- #4 Visible keyboard-focus ring on every L2 and macro orb (SVG can't render
  :focus-visible); onFocus also surfaces the vendor name.
- #5 Screen-reader narrative: focus group role+aria-label, a live region that
  announces the cluster + count + axes on fly-in, dynamic SVG root label.
- #7 prefers-reduced-motion: camera fly-in/out + orb staggers collapse to 0.

ROBUSTNESS
- #6 NaN/undefined risk_score can no longer poison the layout (safeRisk01 guards
  collapse, ty, riskRamp, getRiskLevelFromScore, the drawer).

INFO DESIGN
- #8 L2 micro-legend (◯ size ∝ contracts · ⊝ documented case) — the encodings
  the macro how-to-read strip can't explain while hidden.
- #9 Drawer = the COMPLETE keyset-paginated tail (load-more), not the on-chart 30.
- #10 "+N unlabeled · open list" cue (click opens the drawer); names also surface
  on keyboard focus.
- #11 Legibility: caption 5.6→7, sub-labels 6→6.8 (boxes resized), axes 6→6.5.
- #12 L2 orbs get a shared sheen gradient (luminous, not flat).
- #13 GT documented-case ring moved outboard, solid ink — no longer sub-pixel fuzz.
- #14 SUB_COUNT 40→30 (dead cap removed; tied to the fetch limit).
- #15 0.2 fan threshold hoisted to RISK_FAN_THRESHOLD with rationale.

Scoped out: the on-chart value-union (#2's optional part) — it would muddy the
"30 shown" model; honest labelling + the now-complete paginated drawer give value
access instead.

Gates: tsc 0 · tsc -b 0 · build 0 · lint:tokens PASS.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
rodanaya added a commit that referenced this pull request Jun 14, 2026
… + XLSX export

Tracked follow-ups from the new-tab committee thread (all but the SearchOverlay
delete, which was based on a stale-local-branch read — it is live on prod).

- NEW backend router officials.py (registered in main.py): GET /officials/movers
  (officials who signed at >1 institution, 2018+, volume-floored, ranked by
  institution count) and GET /officials/{name} (per-institution rollup). Both
  read the precomputed official_risk_profiles table only — no 3.1M-row scan.
- #1 Movers band: "Los itinerantes" coda on /administrations (administration-
  agnostic 2018+ window); each name links to its rollup.
- #3 OfficialCard loop: new /officials/:name profile page (OfficialProfile.tsx)
  + route; the /contracts/:id OfficialCard's named official now links into the
  cross-institution rollup. Guardrails throughout: volume sort, labeled risk
  indicator, "no es una acusación".
- #4 Records Room: XLSX export button on /contracts (CSV already existed; the
  page-scoped summary strip already shipped).

BUILD_ID 2026-06-14-officials-movers-loop. No prod backfill needed — endpoints
read the already-populated official_risk_profiles. Gated: tsc -b / vite build /
lint:tokens.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file github_actions Pull requests that update GitHub Actions code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants