A browser demo fix release: nothing outside web/ changes apart from the version numbers and the documentation. The neighbourhood graph now places its labels instead of drawing each one on its spoke regardless of what is already there. For every node, in the order the graph receives them, web/src/components/ForceGraph.tsx tries the spot along the spoke, then level with the node, above or below it, and on the side facing the centre, and keeps the first whose box, 7.4 units per character in the page's monospace face, stays inside the view and clears every label already placed and every other node. A label with no such spot is left out, the centre's excepted, and the node keeps its full name in its accessible name and its tooltip.
Because a label can now be left out, the lists under the graph name every node it draws: one list for the selected entity and one for each expansion, each in the order neighbors.rq returns, lineage first and then holdings by value. In 5.1.0 there was a single list, built from every drawn edge as if it touched the selected entity, so the nodes an expansion added were mostly missing from it: expanding Price T ROWE Global Select Fund from Apple draws 49 nodes, and the 5.1.0 list left 16 of them unnamed, while five of the first ten single expansions from Apple left nodes unnamed and 5.1.1 names every node in all ten. The 5.1.0 notes called that list a parallel list of buttons for the graph; it was one only until the first expansion.
npm run selfcheck reads the demo block that README.md pastes and compares each figure it shares with web/src/data/demo-summary.json, the file the same run wrote: the store and endpoint, the dataset counts, the stats query time, the number of exposure queries, the three top pairs with their totals and latencies, the pairs with exposure and the latency p50 and max, the cached repeat, the operations store line, and the commit and host the sentence above the block names. Dollar totals are rounded the way scripts/demo_queries.py prints them, whose f-string takes a total ending in exactly .5 to the even dollar where Math.round would round it up. The same figures are also checked where the README's browser demo paragraph, web/README.md, etl/sample/README.md and ARCHITECTURE.md quote them. The self check runs 135 assertions, against 104 in 5.1.0.
The payload measures 844,919 bytes on disk and 241,422 gzipped under npm run weight, against 843,746 and 240,873 at 5.1.0, and web/README.md quotes the new figures; the gzip total is the one CI measured under Node 22.23.2 with zlib 1.3.1, and the same three files gave the same bytes under Node 26.3.0 with that zlib. The ETL package declares 5.1.1 in etl/pyproject.toml and in tradegraph_etl.version, which read 5.0.0 and 1.0.0 in 5.1.0, beside the API's pom.xml and the explorer's package.json. Tests at this commit: 47 ETL pytest, 60 API unit and 34 Testcontainers integration, 9 explorer specs, and 135 browser demo self check assertions, all passing in CI run 36466280184.