Repository navigation
2026.11.15.1: CI time cost — main's test build reused, the tests at profile ci, a long case divided while it pays (mtest 0.9.0), the matrix scan side by side; the built-in platform openkal-platform 0.28.0 - #937
Merged
Conversation
… built with profile ci; main's test build reused; the matrix scan side by side; a cancelled run releases its group
…so a long case is divided by the cases it declares
… first start on a fresh Windows runner outlasted the slow child
…me's environment too, and collided on Windows with another project's install
… legacy code-page check runs the tests as the job built them (profile ci)
…ord the case they divide, the store keeps the case whole and its longest part On CI the two e2e suites' cases share what the first fills; each part paid it again (sets 1375 s whole, 909/1109/1306 s as three parts). Design 6.3 records the measurements.
…l 0.25.3 and the 32-bit, UEFI and DOS rows The e2e case of the default platform reads the engine's pin from its data; the target-row snapshot and the matrix's runtime cells follow the group.
…t started on (uefi, dos); one touch helper for the e2e cases, past the present
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.
Design:
.agents/docs/2026-11-14-ci-and-release-time-cost-design.md§6 (round two; the owner confirmed W1–W4, the division of a case by the cases it declares, and the macOS paths on 2026-11-15).Measured (PR run 43602794812, 97.6 min wall, 265 runner-minutes queued)
target-matrix / coverage(if: always()) queued 8.5 min for a runner and held the concurrency groupe2e/openkal/trees1373 s andsets1375 s ran their cases in one process each, the longest case 564 sThe macOS unit step took 31 min and the macOS matrix scan 29.4 min (59 cells one after another).
Changes
.github/tools/source_mtimes.py record), as the artifactmcpp-unit-build-<host>; a pull request's archive stage restores it and gives each unchanged file a time older than every output, so only what changed is built again. An artifact and not the cache: the repository's cache holds 9.98 of its 10 GB, and a build directory there would evict the hosts' homes.[profile.ci](-O0, no debug information, strip) for the tests on Linux (archive), macOS and Windows (mcpp-unitinputprofile): the library and its unit tests took 8988 s of compiler time at the default release profile and 4183 s with it.exceptandoptional, a listed case longer than its share with two or more measured declared cases is divided by the innermost of them: each part but the last selects its cases with?<id>(a case since removed is notmissing), the last selects the case without them (!<id>), so an unmeasured case runs once. A divided case's estimate is at least the sum of its declared cases. The store's case durations are kept by program and id (layersandsetsexist in two programs each).e2e/openkal/sets(1375 s whole) took 909, 1109 and 1306 s as three parts, andtrees(1373 s) 1070 and 1247 s as two: the cases of one case share what the first fills (toolchains, packages, build caches), and every part pays it again on its runner. A division is now kept only while it pays: each part records the case it divides (divides), the store keeps the case's newest whole duration and its newest division's longest part, a case is divided once to be measured so and then only while its longest part took at most four fifths of the case whole, and a case is estimated by its whole run (test_schedule::division_pays, testTestSchedule/ADivisionIsKeptWhileItPays). SPEC-017 O10, docs/08 and design 6.3 state it.coveragerunsif: ${{ !cancelled() }}.scan.shruns each cell in its own directory,MATRIX_JOBSat a time (the processors), and prints in the table's order.i686-linux-musl,i686-openkal,x86_64-uefiandi686-dos-musl. Found by the clean-room check: openkal 0.25.3's example built natively and was refused forx86_64-openkal, because 0.27.1's group holds openkal 0.25.0. The e2e case1025reads the pin frombuiltin.toml; the target-row snapshot (10 lines) and the matrix's runtime cells (openkal-llvm-runtime@0.20.3) follow.mcpp new(kMtestRelease), so the division applies to them.xlings::state_dir). It saves the home's environment (subos/default/.xlings.json) as well as the project's, and with the turn in the project's directory it collided on Windows with another project's install (e2eimages/1033, run 43632995462). TestXlingsState/AProjectsInstallTakesTheHomesTurn.mcpp.build.stage::stage_file(a temporary of each writer's own, an equal destination counted as published); with one temporary name for every writer, one removed the other's before its rename (publishing host tool 'openkal-tools:okld' failed: No such file or directory, macos-arm64, run 43636471152). Staging temporaries carry a random part as well as the clock. TestBuildStage/WritersOfOneDestinationDoNotCollide.MCPP_TEST_PROFILE=ci); under the default profile it built every test again and passed its 600 s timeout.ConcurrentChildren/AReaderReturnsWhenItsOwnChildExitsstarts both programs once before its rounds; a first start on a fresh Windows runner outlasted the slow child (round 0 of run 43626158365, -427 ms, where a shared pipe returns both together).Local:
TestSchedule/ACaseIsDividedByTheCasesItDeclaredand the scheduling tests;test_source_mtimes.py; a demo of four declared cases 8.2 s → 3.0 s, a renamed case run once in the last part and its old name not missing; W1 restore with no change 0.4 s, one interface module changed 88 s (cold 248 s).