You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Adds the public STARR-OMOP Release Notes page and a release-driven delivery contract: write the user note with the code change, collect it when the dataset is available, and render committed content at site build. The existing collapsible year/month layout, search, deep links, keyboard controls, compact headings, and responsive tables are retained.
Latest update for review:
Versioned starr-user-note blocks replace reconstruction from mutable PR descriptions and separate Docs tags. Source reads use explicit Git commits and recover folded/deleted changelog fragments.
An availability record accounts for included or omitted changes and identifies the dataset suffix, available variants, deployed revision, and entry checksum. Drafts, unresolved decisions, invalid content, and inconsistent imports fail explicitly.
Idempotent bundle imports feed both Release Notes and Released Datasets from the same catalog. Historical corrections require the next revision and an explanation.
Docker-only preview/build commands and a Documentation workflow separate credential-free PR verification from credentialed production rendering and Pages deployment.
The latest review findings are addressed: identifier detection spans Markdown wrapping, inline formatting, and table cells while retaining source locations; entries require an unfenced ### change heading; duplicate IDs are checked across titles, summaries, and bodies. LLM output also preserves lab comparison operators and is generated without trailing whitespace.
Release content: September's existing entry is unchanged. January, June, and September have explicitly marked legacy availability records; unknown provenance is left null, and January/June do not invent historical notes. The October 15 sample is not an available dataset and is deliberately excluded from the production catalog and generated site.
Activation is separate from this PR: the upstream authoring/delivery integration must land after the shared tooling is on this repository's main. GitHub App configuration, Pages/GitHub environment settings, and Google Workload Identity are still required. No upstream workflow, secret, repository setting, or production deployment has been activated by this update. See Automation Activation.
Type of Change
📄 New page or FAQ entry
📰 Release notes entry (docs/release_notes/*.qmd) or dataset record (data/releases/*.json)
✏️ Content update to an existing page or FAQ
🛠️ Generator/script change (scripts/*.py)
🗂️ Data model regeneration (omop_data_model.qmd inputs)
Public content and generated indexes: docs/release_notes/2026-09-10.qmd, docs/release_notes.qmd, docs/released_datasets.qmd, docs/llms.txt, docs/llms-full.txt.
Navigation and presentation: docs/_quarto.yml, docs/about.qmd, docs/assets/release-notes.js, docs/styles.css.
Contributor guidance: README.md, CONTRIBUTING.md, docs/release_notes/README.md, docs/release_notes/_template.qmd, .github/pull_request_template.md, and the build-reproducibility comment in pyproject.toml.
How to Verify
Ran quarto preview locally and the site renders without errors
Affected pages display and navigate correctly
I did not hand-edit generated files (omop_data_model.qmd, faq.qmd, release_notes.qmd, released_datasets.qmd, llms.txt, llms-full.txt)
The quarto preview box is deliberately unchecked: this update was rendered with python scripts/build_site.py --offline and served through Docker/nginx, not by running Quarto on the host. The README's Docker commands reproduce that preview. Open /about/release_notes.html and /about/released_datasets.html; September should appear, October should not, and the dataset link should open September's notes.
The following commands ran inside the starr-docs-omop-site:release-automation Docker image, against the updated working tree:
Command
Result
for test in tests/test_*.py; do python "$test"; done
Passed: 91 tests across six modules, including 35 release-note and 31 release-pipeline tests.
Passed on all PR files after fixing the source generator; whitespace, YAML, conflict, Python debug, Ruff lint, and Ruff format hooks passed. SQL hooks had no applicable files.
Remote CI for 38e5eb2 also passed: Verify documentation and CodeQL. The production publication job was skipped as intended for a pull request.
The Docker-served preview was also exercised in Chromium, Firefox, and WebKit at 1280px and 390px, covering release-only content, expand/collapse, keyboard activation, deep links, compact headings, horizontal overflow, dataset cross-links, and the no-JavaScript fallback. A static check passed for 1,599 internal links/anchors across 11 rendered HTML pages. Generated files match their source generators, and every September table row survives in llms-full.txt.
Not run: credentialed production rendering, live BigQuery FAQ execution, upstream cross-repository delivery, and Pages deployment. Those require the activation settings described above; a passing offline preview is not evidence of production deployment.
Screenshots
No new screenshots attached. This follow-up retains the existing release-page layout; CI uploads a documentation-preview artifact after successful verification.
- Add September 2026 dataset release to released_datasets.qmd and update _latest annotation
- Add detection for labeled nine-digit SSNs to IDENTIFIER_PATTERNS
- Validate and reject indented ATX and Setext headings in entry bodies
- Enforce single-line release titles in front matter validation
- Add regression tests in test_release_notes.py and update authoring documentation
The fence state toggles for any ``` or ~~~ line, even when its delimiter does not match the opening fence. For example, ```\n~~~\n```\n## Escaped validation returns no problems: the ~~~ incorrectly closes the backtick fence, the real closing backticks reopen it, and the page-level heading is treated as code. Track the opening delimiter character and length, and only close on a matching delimiter of at least that length; add this mixed-delimiter case as a regression test.
This issue also appears in the following locations of the same file:
This only rejects an empty body; a nonempty entry with plain prose (or only #### headings) passes even though the generated page requires each change to start at ###. Such an entry produces a release with zero change sections and breaks the documented hierarchy/counting behavior. Track whether an unfenced level-3 heading was seen and reject the entry when none exists.
Check rendered fields for duplicate span IDs
scripts/generate_release_notes.py:328
The uniqueness pass scans only entry.body, although summary and title are also rendered as Markdown. An explicit span ID such as summary: "[Details]{#release-2026-06-08}" can therefore duplicate a generated release anchor and make deep links resolve unpredictably despite the claimed page-wide guarantee. Include all rendered entry fields in this check.
Freeze reviewed notes at dataset availability and build notes and dataset pages from one versioned catalog. Add repeatable bundle imports, explicit historical corrections, Docker previews, and a separately credentialed Pages workflow.
Address the remaining review findings for normalized identifiers, required change headings, and page-wide anchors. Preserve comparison values and clean whitespace in generated LLM indexes.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…files readable
Notes are Markdown that Pandoc reads with more power than prose needs.
Refuse, wherever they appear and code blocks included:
- link, image and reference-definition destinations whose scheme is not
http, https or mailto, however it is padded (spaces, a backslash,
character references, control characters, quote or table markers)
- attributes other than an {#id} anchor, and ::: fenced divs
- a line of --- directly followed by text, which starts a YAML metadata
block, also inside quotes and lists
- grid tables, control characters, and a `<` that opens a tag
Validated against Pandoc with a differential fuzz of ~100k generated
entries and ~1.5k renders with the real Quarto.
Imported files now get the mode a plain write would (an existing file
keeps its own) instead of the 0600 of the temporary file, so a sync run
as root in Docker leaves the checkout readable by the host user.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
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
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.
📝 Pull Request
Summary
Adds the public STARR-OMOP Release Notes page and a release-driven delivery contract: write the user note with the code change, collect it when the dataset is available, and render committed content at site build. The existing collapsible year/month layout, search, deep links, keyboard controls, compact headings, and responsive tables are retained.
Latest update for review:
starr-user-noteblocks replace reconstruction from mutable PR descriptions and separate Docs tags. Source reads use explicit Git commits and recover folded/deleted changelog fragments.###change heading; duplicate IDs are checked across titles, summaries, and bodies. LLM output also preserves lab comparison operators and is generated without trailing whitespace.Release content: September's existing entry is unchanged. January, June, and September have explicitly marked legacy availability records; unknown provenance is left null, and January/June do not invent historical notes. The October 15 sample is not an available dataset and is deliberately excluded from the production catalog and generated site.
Activation is separate from this PR: the upstream authoring/delivery integration must land after the shared tooling is on this repository's
main. GitHub App configuration, Pages/GitHub environment settings, and Google Workload Identity are still required. No upstream workflow, secret, repository setting, or production deployment has been activated by this update. See Automation Activation.Type of Change
docs/release_notes/*.qmd) or dataset record (data/releases/*.json)scripts/*.py)omop_data_model.qmdinputs)Related Issues
Pages / Files Changed
scripts/release_catalog.py,scripts/release_pipeline.py,scripts/build_site.py,scripts/generate_release_notes.py.scripts/generate_docs.py,scripts/generate_llms_txt.py.data/releases/2026-01-18.json,data/releases/2026-06-08.json,data/releases/2026-09-10.json.docs/release_notes/2026-09-10.qmd,docs/release_notes.qmd,docs/released_datasets.qmd,docs/llms.txt,docs/llms-full.txt.docs/_quarto.yml,docs/about.qmd,docs/assets/release-notes.js,docs/styles.css.Dockerfile.site,.dockerignore,docker/nginx-preview.conf,.github/workflows/site.yml.tests/test_release_notes.py,tests/test_release_pipeline.py,tests/test_llms_plaintext.py.README.md,CONTRIBUTING.md,docs/release_notes/README.md,docs/release_notes/_template.qmd,.github/pull_request_template.md, and the build-reproducibility comment inpyproject.toml.How to Verify
quarto previewlocally and the site renders without errorsomop_data_model.qmd,faq.qmd,release_notes.qmd,released_datasets.qmd,llms.txt,llms-full.txt)The
quarto previewbox is deliberately unchecked: this update was rendered withpython scripts/build_site.py --offlineand served through Docker/nginx, not by running Quarto on the host. The README's Docker commands reproduce that preview. Open/about/release_notes.htmland/about/released_datasets.html; September should appear, October should not, and the dataset link should open September's notes.The following commands ran inside the
starr-docs-omop-site:release-automationDocker image, against the updated working tree:for test in tests/test_*.py; do python "$test"; donepython scripts/release_pipeline.py check-history --base 4139258b823dfbe51b98656c7f0876d8f733041apython scripts/generate_release_notes.py --checkpython scripts/build_site.py --offlinegit diff --name-only --diff-filter=ACMR -z origin/main | xargs -0 pre-commit run --filesWorkflow validation:
docker run --rm --network none -v "$PWD:/repo:ro" -w /repo \ rhysd/actionlint:1.7.7 .github/workflows/site.ymlResult: passed.
Remote CI for
38e5eb2also passed: Verify documentation and CodeQL. The production publication job was skipped as intended for a pull request.The Docker-served preview was also exercised in Chromium, Firefox, and WebKit at 1280px and 390px, covering release-only content, expand/collapse, keyboard activation, deep links, compact headings, horizontal overflow, dataset cross-links, and the no-JavaScript fallback. A static check passed for 1,599 internal links/anchors across 11 rendered HTML pages. Generated files match their source generators, and every September table row survives in
llms-full.txt.Not run: credentialed production rendering, live BigQuery FAQ execution, upstream cross-repository delivery, and Pages deployment. Those require the activation settings described above; a passing offline preview is not evidence of production deployment.
Screenshots
No new screenshots attached. This follow-up retains the existing release-page layout; CI uploads a
documentation-previewartifact after successful verification.Checklist
pre-commitwas run locally prior to submission