Follow-up to the main.ts / v1_action.yml / v3_action.yml / first_interaction_index.js
cleanup (#183) - that removal was found by accident, via a CodeQL alert on dead code, not by a
deliberate check. This is that deliberate pass: every root-level file and everything in
assets/ checked against what .github/workflows/*.yml, profiler.html, index.html, and
the explainer pages actually load or invoke.
All checked files trace back to a real reference. Two worth calling out explicitly, since they don't look referenced at first glance:
explainer.html(singular) - not a leftover. It's a?slug=-based redirect shim (explainer.html?slug=X->explainers/X.html) kept for old inbound links/bookmarks that predate the per-slug page structure.noindexed so it doesn't compete with the real pages in search, but still a live entry point - not dead, do not remove.logo.svg- not linked directly from any page's<head>; it's the source assetscripts/generate_favicons.pyandscripts/generate_og_images.pyregenerate the favicons and OG images from. Referenced by tooling, not by URL.
Everything else (README.md, CHANGELOG.md, CLAUDE.md, CONTRIBUTING.md, CODE_OF_CONDUCT.md,
SECURITY.md, METRICS.md, ROADMAP.md, LICENSE, CITATION.cff, Makefile, pyproject.toml,
requirements.txt, requirements-lock.txt, robots.txt, sitemap.xml, llms.txt,
llms-full.txt, favicon.ico/favicon-16x16.png/favicon-32x32.png/apple-touch-icon.png) is
either a standard project file or directly <link>/<meta>-referenced from index.html,
profiler.html, and every explainer page - confirmed via grep, not assumed.
explainers-data.js,explainers-data.json,explainers.css,profiler-compare.js,profiler-engine.js,profiler-ui.js,profiler.css- all<script>/<link>-referenced fromindex.html,profiler.html, and/or the explainer pages.explainers-ui.js- referenced only byindex.html(powers the explainer-card grid and its client-side detail view). None of the 60 generated explainer pages load it, so itsrenderDetailPage/renderMarkdownpath is not exercised by any real explainer page.assets/fonts/*.ttf(+ theirOFL-*.txtlicenses) - all four font files are loaded byscripts/generate_og_images.py, not by any page's CSS - they're inputs to the OG-image generation pipeline, not a web font stack.assets/og/*.png- one per explainer slug (one perexplainers/*.md) plushome.png(index.html'sog:image) andprofiler.png(profiler.html's). No orphans, no gaps.assets/og-light/*.png- the same set, rendered in the site's light theme instead of dark. Generated by the samescripts/generate_og_images.pypass asassets/og/. Referenced as a secondog:imageon every page (index.html,profiler.html, every explainer, viabuild_explainers.py'sPAGE_TEMPLATE) alongside the dark one - OG's protocol has noprefers-color-schemeequivalent, so this doesn't switch per viewer theme, it just offers a consuming platform (e.g. Facebook's share composer) a second image to pick from.twitter:imagestays dark-only, since Twitter Cards support exactly one image.
Not in this issue's stated scope (repo root + assets/), but checked anyway since it's the same
question: every script is invoked from somewhere - Makefile, a workflow, CONTRIBUTING.md, or
a test harness (scripts/parse-json-js.js and scripts/engine-js.js are only ever invoked via
subprocess.run(...) from tests/test_json_edge_cases.py and tests/test_js_parity.py, which
is why they don't show up in Makefile/workflow grep). freeze_paper_results.py and
render_terminal_png.py are intentionally manual, one-off tools (documented in README.md, not
wired into CI) - not dead, just not automated.
No further dead files found. The four removed in #183's original cleanup were the only orphans; this repo's asset graph is otherwise fully connected.