Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
00cfb13
Add design doc for CI test log grouping and failure surfacing
claude Jul 20, 2026
200aa10
docs: cross-reference the julia-engine binary-mode gate from the grou…
claude Jul 20, 2026
f153f87
docs: resolve design-review findings on the CI log grouping plan
claude Jul 20, 2026
5ee86f1
Add GitHub Actions failure-reporting helpers to github.ts
cderv Jul 20, 2026
f785992
Surface CI test failures as annotations and a step summary
cderv Jul 20, 2026
8fd5af9
docs: record the adopted Phase 1 summary-layout deviation in the design
claude Jul 20, 2026
07eda58
Emit per-test-file ::group:: markers on the default CI test path
cderv Jul 20, 2026
189e432
Add a log checker guarding the CI grouping invariants
cderv Jul 20, 2026
ee5b232
docs: mark Phases 1-2 implemented; record Windows log-capture gotcha
claude Jul 20, 2026
611faea
Apply design-review fixes: group closure on early failures, step-wide…
claude Jul 20, 2026
3fc41bf
Fix CI-environment leakage in reporting/grouping unit tests (null sen…
claude Jul 20, 2026
988167f
docs: correct log-grouping design-doc motivation and citations
cderv Jul 21, 2026
97bdde4
Name each step-summary detail block after its failing test
claude Jul 22, 2026
e99449e
Open the per-file CI test group at registration time
cderv Jul 22, 2026
b9b739f
Document the Phase 2.1 registration-time group open
cderv Jul 22, 2026
b9c9f45
Cluster, label, and trim CI test-failure step summaries
cderv Jul 22, 2026
b8c9ddf
Make the version shortcode robust to string-typed quarto.version
cderv Jul 23, 2026
c4b551d
Stamp built test dists with the plain version, not a +test marker
cderv Jul 23, 2026
072493e
Harden CI failure reporting: single report, safe writes, bounded summary
cderv Sep 15, 2026
bae7cda
Discriminate CI failure labels by workflow-supplied job tag
cderv Sep 15, 2026
f6c8094
Correct design doc claims caught during review
cderv Sep 15, 2026
f3e0bdf
Make stepSummary's write outcome honest and carry teardown failure st…
cderv Sep 15, 2026
a6f943b
Reserve annotation room for the teardown banner independent of the pr…
cderv Sep 15, 2026
8f446d0
Byte-cap the annotation excerpt's primary portion before appending th…
cderv Sep 15, 2026
304c616
docs: streamline CI test reporting guidance
cderv Sep 15, 2026
4a66491
Adjust workding
cderv Sep 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .claude/rules/testing/built-version-ci.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,6 @@ Invariants when editing:
- `test-ff-matrix.yml` owns the ff-matrix bucket glob.
- Scheduler jobs in `test-smokes-built.yml` set per-leg OS scope through their `runners:` inputs.
- Keep the per-call suffix in `test-ff-matrix.yml`'s concurrency group so sibling calls cannot cancel one another.
- Every `test-smokes.yml` and `test-ff-matrix.yml` call site passes a
`label-tag` that distinguishes same-OS jobs in the combined run summary.
Per-OS jobs may share a tag because labels also include the OS.
41 changes: 41 additions & 0 deletions .claude/rules/testing/github-actions-reporting.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
---
paths:
- .github/workflows/test-smokes.yml
- .github/workflows/test-smokes-built.yml
- .github/workflows/test-smokes-parallel.yml
- .github/workflows/test-ff-matrix.yml
- .github/workflows/update-test-timing.yml
- src/tools/github.ts
- tests/test.ts
- tests/gha-grouping.ts
- tests/integration/playwright-tests.test.ts
- tests/tools/check-gha-log.ts
- tests/unit/check-gha-log.test.ts
- tests/unit/gha-grouping.test.ts
- tests/unit/github-actions-reporting.test.ts
- tests/unit/harness-failure-reporting.test.ts
- tests/unit/harness-reporting-fixture.ts
---

# GitHub Actions test reporting

`llm-docs/github-actions-test-reporting.md` is the deep dive. Read only the
sections relevant to the edit:

- Workflow ownership or environment wiring: "Ownership" and "Workflow contract".
- Group opening, closing, or log validation: "Log grouping" and "Verification".
- Annotations, labels, excerpts, or step summaries: "Failure reporting" and
"Annotation budget and labels".

For a trivial edit, the invariants below are sufficient.

Keep these invariants:

- A step has one group and annotation owner. Bucket loops set
`QUARTO_TESTS_GHA_ORCHESTRATED=1`; otherwise the harness owns them.
- Step-summary entries are emitted in both paths.
- Failure lines and Deno's final failure sections remain outside groups.
- The annotation count is step-wide; Deno module state is only per test file.
- Every reusable-workflow call passes a `label-tag` that distinguishes same-OS
jobs in the run summary.
- Do not enable parallel test-file execution without redesigning grouping.
6 changes: 6 additions & 0 deletions .github/workflows/test-ff-matrix.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,11 @@ on:
required: false
type: string
default: '["ubuntu-latest", "windows-latest"]'
label-tag:
description: "Short alphanumeric tag for distinguishing same-OS jobs in failure summaries"
required: false
type: string
default: ""
workflow_dispatch:
inputs:
extra-r-packages:
Expand Down Expand Up @@ -100,3 +105,4 @@ jobs:
quarto-artifact-run-id: ${{ inputs.quarto-artifact-run-id }}
ref: ${{ inputs.ref }}
runners: ${{ inputs.runners || '["ubuntu-latest", "windows-latest"]' }}
label-tag: ${{ inputs.label-tag || 'ffdev' }}
18 changes: 15 additions & 3 deletions .github/workflows/test-smokes-built.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,11 +53,10 @@ jobs:
shell: bash
run: echo "sha=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT"

- name: Compute version marker
- name: Compute build version
id: version
shell: bash
# Build metadata keeps quarto-required range checks valid.
run: echo "version=$(cat version.txt)+test.$(date +%Y%m%d)" >> "$GITHUB_OUTPUT"
run: echo "version=$(cat version.txt)" >> "$GITHUB_OUTPUT"

- name: Build dist tarball
uses: ./.github/actions/build-dist-tarball
Expand All @@ -80,6 +79,7 @@ jobs:
quarto-artifact-name: built-quarto-linux-amd64
runners: '["ubuntu-latest"]'
buckets: ${{ github.event.inputs.buckets }} # empty = full run
label-tag: bldsmk

run-playwright-artifact:
name: Playwright tests against built artifact
Expand All @@ -94,6 +94,7 @@ jobs:
quarto-artifact-name: built-quarto-linux-amd64
runners: '["ubuntu-latest"]'
buckets: '["integration/playwright-tests.test.ts"]'
label-tag: bldpw

run-ff-matrix-artifact:
name: Feature-format matrix against built artifact
Expand All @@ -107,6 +108,7 @@ jobs:
quarto-install: artifact
quarto-artifact-name: built-quarto-linux-amd64
runners: '["ubuntu-latest"]'
label-tag: bldff

# Test an existing published release.
resolve-release:
Expand Down Expand Up @@ -169,6 +171,7 @@ jobs:
quarto-version: ${{ needs.resolve-release.outputs.version }}
runners: '["ubuntu-latest", "windows-latest"]'
buckets: ${{ github.event.inputs.buckets }} # empty = full run
label-tag: relsmk

run-playwright-release:
name: Playwright tests against published release
Expand All @@ -181,6 +184,7 @@ jobs:
quarto-version: ${{ needs.resolve-release.outputs.version }}
runners: '["ubuntu-latest"]'
buckets: '["integration/playwright-tests.test.ts"]'
label-tag: relpw

run-ff-matrix-release:
name: Feature-format matrix against published release
Expand All @@ -192,6 +196,7 @@ jobs:
quarto-install: release
quarto-version: ${{ needs.resolve-release.outputs.version }}
runners: '["ubuntu-latest", "windows-latest"]'
label-tag: relff

# Reuse artifacts from a completed create-release run.
resolve-nightly:
Expand Down Expand Up @@ -262,6 +267,7 @@ jobs:
quarto-artifact-run-id: ${{ needs.resolve-nightly.outputs.run-id }}
runners: '["ubuntu-latest"]'
buckets: ${{ github.event.inputs.buckets }} # empty = full run
label-tag: ngtsmk

run-smokes-nightly-windows:
name: Smoke tests against nightly build (windows)
Expand All @@ -278,6 +284,7 @@ jobs:
quarto-artifact-run-id: ${{ needs.resolve-nightly.outputs.run-id }}
runners: '["windows-latest"]'
buckets: ${{ github.event.inputs.buckets }} # empty = full run
label-tag: ngtsmk

run-smokes-nightly-mac:
name: Smoke tests against nightly build (macOS)
Expand All @@ -294,6 +301,7 @@ jobs:
quarto-artifact-run-id: ${{ needs.resolve-nightly.outputs.run-id }}
runners: '["macos-latest"]'
buckets: ${{ github.event.inputs.buckets }} # empty = full run
label-tag: ngtsmk

# Each caller job accepts one OS-specific artifact.
run-playwright-nightly-linux:
Expand All @@ -311,6 +319,7 @@ jobs:
quarto-artifact-run-id: ${{ needs.resolve-nightly.outputs.run-id }}
runners: '["ubuntu-latest"]'
buckets: '["integration/playwright-tests.test.ts"]'
label-tag: ngtpw

run-playwright-nightly-mac:
name: Playwright tests against nightly build (macOS)
Expand All @@ -327,6 +336,7 @@ jobs:
quarto-artifact-run-id: ${{ needs.resolve-nightly.outputs.run-id }}
runners: '["macos-latest"]'
buckets: '["integration/playwright-tests.test.ts"]'
label-tag: ngtpw

run-ff-matrix-nightly-linux:
name: Feature-format matrix against nightly build (linux)
Expand All @@ -342,6 +352,7 @@ jobs:
quarto-artifact-name: Deb Zip
quarto-artifact-run-id: ${{ needs.resolve-nightly.outputs.run-id }}
runners: '["ubuntu-latest"]'
label-tag: ngtff

run-ff-matrix-nightly-windows:
name: Feature-format matrix against nightly build (windows)
Expand All @@ -357,3 +368,4 @@ jobs:
quarto-artifact-name: Windows Zip
quarto-artifact-run-id: ${{ needs.resolve-nightly.outputs.run-id }}
runners: '["windows-latest"]'
label-tag: ngtff
2 changes: 2 additions & 0 deletions .github/workflows/test-smokes-parallel.yml
Original file line number Diff line number Diff line change
Expand Up @@ -104,3 +104,5 @@ jobs:
with:
buckets: ${{ matrix.buckets.files }}
extra-r-packages: ${{ inputs.extra-r-packages }}
# The bucket index distinguishes same-OS matrix jobs.
label-tag: b${{ matrix.buckets.num }}
11 changes: 11 additions & 0 deletions .github/workflows/test-smokes.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,11 @@ on:
required: false
type: string
default: '["ubuntu-latest", "windows-latest"]'
label-tag:
description: "Short alphanumeric tag for distinguishing same-OS jobs in failure summaries"
required: false
type: string
default: ""
workflow_dispatch:
inputs:
buckets:
Expand Down Expand Up @@ -92,6 +97,8 @@ jobs:
runs-on: ${{ matrix.os }}
env:
PLAYWRIGHT_BROWSERS_PATH: ${{ github.workspace }}/ms-playwright-browsers
# Distinguishes this call from other jobs on the same OS.
QUARTO_TESTS_GHA_LABEL_TAG: ${{ inputs.label-tag }}
steps:
- name: Checkout Repo
uses: actions/checkout@v6
Expand Down Expand Up @@ -491,6 +498,8 @@ jobs:
# Useful as TinyTeX latest release is checked in run-test.sh
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BUCKETS_JSON: ${{ inputs.buckets }}
# Prevent the harness from duplicating this loop's workflow commands.
QUARTO_TESTS_GHA_ORCHESTRATED: "1"
run: |
haserror=0
failed_tests=()
Expand Down Expand Up @@ -540,6 +549,8 @@ jobs:
# Useful as TinyTeX latest release is checked in run-test.sh
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BUCKETS_JSON: ${{ inputs.buckets }}
# Prevent the harness from duplicating this loop's workflow commands.
QUARTO_TESTS_GHA_ORCHESTRATED: "1"
run: |
$haserror=$false
$failed_tests=@()
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/update-test-timing.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ jobs:
with:
buckets: ""
time-test: true
label-tag: timing

create-pr:
name: Create PR with updated timing file
Expand Down
17 changes: 12 additions & 5 deletions llm-docs/built-version-testing-architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,8 @@ Key points:

The feature-format bucket glob (`../dev-docs/feature-format-matrix/qmd-files/**/*.qmd`) is defined only in `test-ff-matrix.yml`.
Built-mode callers use its `workflow_call` trigger, while its existing dev triggers remain.
The workflow forwards install, artifact, ref, runner, and R-package inputs to `test-smokes.yml`, with dev defaults for non-call triggers.
The workflow forwards install, artifact, ref, runner, R-package, and `label-tag` inputs to `test-smokes.yml`, with dev defaults for non-call triggers.
The tag defaults to `ffdev` for standalone dev triggers and distinguishes same-OS jobs in the shared failure summary.

Reusable-workflow concurrency is evaluated in the caller's context. The group therefore includes a suffix based on `inputs.runners` and `github.run_id`, preventing sibling feature-format legs from canceling one another.
Dev triggers use a constant `-dev` suffix.
Expand Down Expand Up @@ -216,11 +217,17 @@ The trigger fires after every completed create-release run, including manual and

**Revisit when:** maintainers want a single nightly build-and-test status and are willing to couple the workflows.

### D2. Version marker: semver *build metadata* (`X.Y.Z+test.YYYYMMDD`)
### D2. Version stamp: the plain three-component version (`X.Y.Z`)

Built test distributions use `$(cat version.txt)+test.$(date +%Y%m%d)`.
Do not use a prerelease suffix, which fails plain `>=X.Y` `quarto-required` ranges, or a fourth numeric component, which is invalid semver.
Build metadata preserves range comparisons while distinguishing the build from the `99.9.9` dev version.
Built test distributions use `$(cat version.txt)`, a plain `X.Y.Z`. Pandoc's
`Version` type, used by the `version` shortcode, cannot parse semver build
metadata such as `+test.YYYYMMDD`; a plain version also matches a release
artifact more closely. The `99.9.9` sentinel still distinguishes dev mode.

Do not use a prerelease suffix: prerelease versions fail ordinary `>=X.Y`
`quarto-required` ranges. Do not add a fourth numeric component: it is not
valid semver. Identify trial builds by workflow, ref, and SHA instead of the
version string.

### D3. Dist outside the checkout + `99.9.9` sentinel refusal

Expand Down
Loading
Loading