Publish a daily cross-repository Babel milestones page to GitHub Pages - #112
Open
gaurav wants to merge 7 commits into
Open
Publish a daily cross-repository Babel milestones page to GitHub Pages#112gaurav wants to merge 7 commits into
gaurav wants to merge 7 commits into
Conversation
Milestones cannot span repositories, so tracking commitments across the five Babel repos in two organizations means checking five separate milestone pages. This generates a single chronological page from all of them, ordered by due date with undated milestones last, and flags past-due ones. The legacy priority-bucket milestones (Immediate, Needed soon, ...) are undated and never close, so they are split into their own section rather than sorted among the real deadlines. Reads only milestones and issues: every repository involved is public, so this runs on a workflow's built-in GITHUB_TOKEN with no secrets to configure. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Deploys to the milestones/ subfolder rather than the root of gh-pages, so it does not disturb the Astro site that deploy-website-to-gh-pages.yaml publishes there on release. The two have unrelated cadences, hence a separate workflow. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…oard Records the constraint that keeps this cheap — all five repositories are public, so no PAT is needed — and what breaks it, namely reading fields off a GitHub Project. Also lists what the first version deliberately leaves out. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
deploy-website-to-gh-pages.yaml publishes website/dist to the root of gh-pages, and github-pages-deploy-action cleans the target by default, so every release would delete the milestones/ directory published by milestones-page.yaml. The page would then be missing until the next daily run. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Anything published to gh-pages outside website/dist is deleted by the next release deploy unless it is listed in that job's clean-exclude. That is not visible from either workflow alone, so note it where someone adding a second published artifact will look. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Issue titles are arbitrary user text, so the escaping test guards a real correctness path: an unescaped angle bracket in a title would break the page. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The site deployed only on release, so it could lag main indefinitely; it now also deploys on push to main and on demand. That makes an overlap with the daily milestones deploy far more likely, and both jobs push to gh-pages, so they now share one concurrency group instead of two independent ones. Also links the milestones page from the site index, since nothing pointed at it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This was referenced Aug 20, 2026
Open
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Milestones are the commitment mechanism across the Babel repositories, but they cannot span
repositories — so "what have I actually committed to?" currently means visiting five separate
milestone pages across two organizations. This adds a tool and a daily workflow that merge them
into one chronological page.
A first pass, meant to be iterated on. It is already useful for the milestone cleanup it makes
visible: 18 open milestones, 7 of them past due, and two empty
Translator June Hackathon 2026milestones that can just be closed.
What's here
src/babel_validation/tools/milestones_page.py— reads open milestones and their open issuesfrom the five repos, sorts by due date (undated last), writes a self-contained HTML file.
Legacy priority-bucket milestones (
Immediate,Needed soon, …) are undated and never close,so they get their own section instead of sorting among real deadlines.
.github/workflows/milestones-page.yaml— runs it daily and on demand, deploying togh-pages:milestones/. It publishes to a subfolder so it does not clobber the Astro site thatdeploy-website-to-gh-pages.yamlputs at the root on release.docs/milestones-page.md— the design rationale and the list of known gaps.tests/tools/test_milestones_page.py— covers the undated-sorts-last ordering and bucket detection.deploy-website-to-gh-pages.yaml— gainsclean-exclude: milestones/. It deploys to the root ofgh-pagesand cleans by default, so without this every release would delete the milestones page,leaving it missing until the next daily run.
Why generated rather than a GitHub Project
A cross-repo project board was the obvious alternative. A board is a second record of commitment
that has to be kept in step with the milestones by hand, and drifts as soon as that stops
happening; this page is derived, so the milestone is the only input and there is nothing to sync.
A board also can't answer the question that matters most from outside — roughly when someone's
issue will be looked at — whereas a public URL can.
Automating a board is also expensive: the built-in auto-add filter supports only
is/label/reason/assignee/no(notmilestone:) and never removes items, so keeping one instep would need an Action in all five repos listening for
milestoned/demilestoned, plus a PATwith
projectscope as an org secret in both organizations.The constraint worth preserving: all five repositories are public, so the built-in
GITHUB_TOKENreads them across both orgs with no secrets to configure or rotate. Reading fieldsoff a GitHub Project would break that. Priority and component should therefore live in labels.
What's given up is drag-to-rank ordering within a milestone; a
priority:label is the intendedsubstitute.
TODO — decide whether to fix here or file
priority:/component labels distinctly and sort on them. Labels are the agreedsubstitute for drag-to-rank ordering on a board, but no label scheme exists yet, so this
needs that decision first.
BUCKET_TITLESonce the legacy priority-bucket milestones (Immediate,Needed soon,Needed later,Not urgent) are cleaned up — it only exists to recognise them.Tests:test.ymlonsplit/2-top-level-packageand
tests.yamlon six branches includingsplit/3-github-issues. Neither is onmainyet, so they will collide when those branches merge.
Deliberately not done
(
Needed soon87,Needs tests54,Needs investigation46, …). Filed asOpen issues parked in closed milestones are invisible to every milestone view NCATSTranslator/Babel#1048.
Verified by running against the live API: 18 milestones, 180 open issues.
🤖 Generated with Claude Code