Files
wanderbooks/.github/workflows/scheduled.yml
T
swaitsandClaude Opus 5.5 67648473ba
check / check (push) Canceled after 0s
ci: shard the weekly mutation runs; no viewer job; six import mutants caught
The first scheduled run (2026-10-19) failed four ways: the viewer's
mutation job called the recipe retired in P2 slice 1 (owner, 2026-10-18:
no mutation runs on the GUI); the core and MCP runs were stopped at
GitHub's six hours; the import run missed six mutants.

- Every mutation recipe takes a shard (k/n, default all of it); the
  workflow runs the core in 8 shards, the store in 4, the importers in 2,
  the MCP server in 16, each its own job with a 350-minute limit.
- Test timeouts are three times each run's own baseline, never under the
  recipe's old fixed value, so slower runners don't report false
  timeouts.
- The mutants-gui job is gone.
- ledger-import: rule_marks_match_their_notes,
  asset_register_xlsx_headings_and_totals_rule and
  xlsx_missing_amounts_are_cells_only_on_ruled_rows catch the six
  (the tax-basis rule marks, a heading's alignment, the totals row's
  blank cells, and a blank amount cell only on ruled rows), each checked
  against its mutant by hand.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01T3gXMVt7XJPi6ens1or9Dj
2026-10-19 10:00:38 -06:00

110 lines
3.1 KiB
YAML

# Weekly, and on demand: the slow layers (docs/testing.md).
#
# Mutation testing is split into shards (`just mutants-* k/n`), each its
# own job, so every job ends well inside GitHub's six hours. The viewer has
# no mutation job (owner, 2026-10-18).
name: scheduled
on:
schedule:
- cron: "17 6 * * 1"
workflow_dispatch:
jobs:
prove:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- uses: jdx/mise-action@v2
- run: just prove
oracle:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- uses: jdx/mise-action@v2
- run: just oracle
fuzz:
runs-on: ubuntu-24.04
strategy:
fail-fast: false
matrix:
target: [fuzz_journal_line, fuzz_entry_validate, fuzz_op_sequence, fuzz_core_serde, fuzz_store_open, fuzz_store_replay, fuzz_settings_replay, fuzz_import_csv, fuzz_config_parse]
steps:
- uses: actions/checkout@v4
- uses: jdx/mise-action@v2
- run: just fuzz ${{ matrix.target }} 600
mutants:
runs-on: ubuntu-24.04
timeout-minutes: 350
strategy:
fail-fast: false
matrix:
shard: [0, 1, 2, 3, 4, 5, 6, 7]
steps:
- uses: actions/checkout@v4
- uses: jdx/mise-action@v2
- run: just mutants ${{ matrix.shard }}/8
- if: always()
uses: actions/upload-artifact@v4
with:
name: mutants-core-${{ matrix.shard }}
path: mutants.out
mutants-store:
runs-on: ubuntu-24.04
timeout-minutes: 350
strategy:
fail-fast: false
matrix:
shard: [0, 1, 2, 3]
steps:
- uses: actions/checkout@v4
- uses: jdx/mise-action@v2
- run: just mutants-store ${{ matrix.shard }}/4
- if: always()
uses: actions/upload-artifact@v4
with:
name: mutants-store-${{ matrix.shard }}
path: mutants-store/mutants.out
mutants-import:
runs-on: ubuntu-24.04
timeout-minutes: 350
strategy:
fail-fast: false
matrix:
shard: [0, 1]
steps:
- uses: actions/checkout@v4
- uses: jdx/mise-action@v2
- run: just mutants-import ${{ matrix.shard }}/2
- if: always()
uses: actions/upload-artifact@v4
with:
name: mutants-import-${{ matrix.shard }}
path: mutants-import/mutants.out
mutants-config:
runs-on: ubuntu-24.04
timeout-minutes: 350
steps:
- uses: actions/checkout@v4
- uses: jdx/mise-action@v2
- run: just mutants-config
- if: always()
uses: actions/upload-artifact@v4
with:
name: mutants-config
path: mutants-config/mutants.out
mutants-mcp:
runs-on: ubuntu-24.04
timeout-minutes: 350
strategy:
fail-fast: false
matrix:
shard: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
steps:
- uses: actions/checkout@v4
- uses: jdx/mise-action@v2
- run: just mutants-mcp ${{ matrix.shard }}/16
- if: always()
uses: actions/upload-artifact@v4
with:
name: mutants-mcp-${{ matrix.shard }}
path: mutants-mcp/mutants.out