Skip to content

rerender_examples.py is dead code, and fixing only its path silently destroys 15 shipped reports #133

Description

@lucapinello

scripts/rerender_examples.py exists to refresh every shipped example HTML from its saved JSON with no GPU and no model downloads. It has not worked since 2026-04-21, and the obvious one-line fix makes things worse rather than better.

Half one: it crashes before doing any work

scripts/rerender_examples.py:47:

EXAMPLES = REPO_ROOT / "examples" / "applications"

examples/applications/ was renamed to examples/walkthroughs/ in 340f30e ("Reorganize examples/: walkthroughs/ (MCP-driven) + notebooks/ (library tutorials)") and this script was not updated. It is the only file in the repo still referencing the old path. Every invocation since:

FileNotFoundError: [Errno 2] No such file or directory:
  '/home/nvidia/chorus/examples/applications'

So the script is dead code. Anything added to it in the meantime is inert — including the TSV-writing added in #130, which means the multi-oracle TSV gap that change was partly meant to address is still open.

Half two: fixing the path is worse than leaving it broken

I fixed the path and ran it. It rewrote 15 shipped HTML reports, shrinking them from MB-scale to 0.01–0.02 MB:

before   1.29 MB   rs12740374_SORT1_legnet_report.html
after    0.01 MB
before   9.47 MB   rs12740374_SORT1_multioracle_report.html
after    0.01 MB
before   2.99 MB   rs12740374_SORT1_alphagenome_report.html
after    0.02 MB

Because VariantReport.from_dict does not carry the per-bin prediction arrays the IGV panel is drawn from. The rehydrated report is structurally valid and renders — it just has no signal tracks. So the failure is silent: no exception, no warning, 15 degraded artefacts, and a diff that looks like a successful refresh.

I reverted all of it. A crash is strictly safer than silent data loss, which is why I left the wrong path in place rather than shipping the one-line fix.

What the fix actually requires

One of:

  1. Make the round-trip lossless for what the script rewrites — persist the per-bin arrays (or the downsampled IGV features) in example_output.json so from_dict can reconstruct the panel. Note this interacts with LegNet report HTML is 100x oversized and cannot be committed at all (blocks regenerating the multi-oracle example) #129: the arrays are exactly what the feature budget bounds, so store the downsampled features, not the raw profile.
  2. Make the script refuse rather than degrade — after rehydrating, compare the IGV feature count (or output size) against the artefact it is about to overwrite, and abort with a clear message when the reconstruction is materially poorer. Cheap, honest, and it makes the script safe to run even where the round-trip is lossy.
  3. Narrow its documented scope to the report parts that do round-trip (tables, glossary, summaries) and leave the IGV panel untouched in the existing file.

(2) is the smallest change that makes the tool trustworthy, and (2) is worth having regardless of whether (1) is done, as a backstop.

Whichever route, the guard is the same shape as the one #129 needed: compare what you are about to write against what is already there. Both defects are a generator quietly producing something much smaller or much larger than the artefact it replaces, with nothing checking.

Also worth correcting while in this file: the module docstring claims coverage of variant_analysis/**, validation/**, sequence_engineering/* and discovery/** and carefully documents what is "Not covered (require re-running the oracle)" — but that list omits the real limitation, which is that the IGV panel is lost everywhere.

Related: #129, #130.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions