dowel_examples

Results of the suite that checks dowel from the outside. What each check fixes is in the README of its project; why some are left failing is in docs/10-findings.md.

Latest run

PASSED — 1867 checks: 1860 passed, 0 failed, 7 known, 0 fixed
316882ed4e11 2026-09-02T16:25:11Z on main

projectstatecheckspassedfailedknownfixedtime
projects/01-minimalok10100000.8s
projects/02-configok34340006.9s
projects/03-featuresok17170000.3s
projects/04-diagnosticsok94940000.5s
projects/05-incrementalok49490001.4s
projects/06-runnerok40400001.0s
projects/07-robustnessok1451450001.3s
projects/08-lspok11011000012.8s
projects/09-acquisitionok12112001046.2s
projects/10-toolchainok53530002.3s
projects/11-crossok17170001.1s
projects/12-storeok43430001.3s
projects/13-parallelok181800010.9s
projects/14-scaleok17170003.4s
projects/15-cppok70700005.7s
projects/16-migrateok87870002.5s
projects/17-depsok83830001.3s
projects/18-toolsok33330000.6s
projects/19-artifactsok35350000.6s
projects/20-casesok626200032.5s
projects/21-debugok32320001.2s
projects/22-benchok34340003.3s
projects/23-probeok23230000.3s
projects/24-installok55550001.9s
projects/25-asmok53530000.8s
projects/26-prebuiltok28280000.4s
projects/27-generateok61550601.7s
projects/28-progressok191900016.0s
projects/29-tool-identityok21210005.4s
apps/blinkok59590003.1s
apps/dspok60600002.0s
apps/hashxok88880003.1s
apps/httpdok36360004.7s
apps/jsonfmtok39390001.7s
apps/plotok42420004.4s
apps/visionok323200018.3s
apps/winappok38380005.8s
projects/docsok990000.1s

Checks

Every check this run made, by project. Each project links to its directory in the repository; README states what that project fixes.

ok projects/01-minimal — 10 checks (10 passed, 0 failed, 0 known, 0 fixed)
statecheck
passedhello: check passes
passedhello: build passes
passedhello: a second build runs nothing, across backends too
passedthe binary runs and prints hello
passedthe direct executor builds from scratch in 2 actions (1 compile, 1 link)
passedthe direct executor produces a working binary too
passedrelease builds too
passeddebug and release get separate build directories
passednothing unexpected is written next to the manifest
passedtest succeeds when the package declares no test target
ok projects/02-config — 34 checks (34 passed, 0 failed, 0 known, 0 fixed)
statecheck
passedapp: check passes
passedapp: build passes
passedapp: a second build runs nothing, across backends too
passeddebug: the arms chosen by match reach the compiler
passedrelease builds too
passedrelease: the public defines of a dependency switch as well
passedeach configuration gets its own build directory
passedthe default features can be turned off
passeddropping when feature.trace drops the define with it
passedenabled features appear in the build directory identifier
passedthe specialized defines reach the arguments of app
passedthe public defines of a dependency reach app
passedprivate flags of a dependency never reach a dependent
passedprivate defines of a dependency never reach a dependent
passedprivate includes of a dependency never reach a dependent
passedprivate flags still apply to the target's own compilation
passedprivate includes still apply to the target's own compilation
passedcompile_commands.json carries the specialized defines
passedprobe: check passes
passedprobe: test passes
passedprobe: test passes in release too
passedor joins two comparisons on the same key
passednot inverts one, which is how everywhere-except is written
passedand joins a feature with a negated one
passedand parentheses group across two different keys
passeda predicate that cannot hold contributes nothing
passedraising a feature drops the conjunction that excluded it
passedwhile the disjunction still holds, which is not > and > or
passedand with neither term it holds no longer
passeda term naming the configuration drops with it
passedwhile the terms that do not name it stay
passeda misspelled value is refused inside: not target.os == "windwos"
passeda misspelled value is refused inside: target.os == "linux" or target.os == "windwos"
passeda misspelled value is refused inside: target.os == "windwos" and cfg.opt == "debug"
ok projects/03-features — 17 checks (17 passed, 0 failed, 0 known, 0 fixed)
statecheck
passedapp: check passes
passedapp: build passes
passedapp: a second build runs nothing, across backends too
passedthe default features bring the json edge in
passedgraph shows the json edge
passedjson and xml can both be enabled
passedboth edges appear
passedthe default features can be turned off
passedwhen the edge goes, neither the public defines nor the headers arrive
passedwhen the edge goes, the archive is not built either
passeda dependency behind a disabled feature is absent from the graph
passeda disabled optional dependency need not exist on disk
passedan undeclared feature passed to --features is rejected
passedan undeclared feature referenced from dowel.build is rejected
passedan undeclared feature gets a suggestion
passedjson: builds on its own
passedxml: builds on its own
ok projects/04-diagnostics — 94 checks (94 passed, 0 failed, 0 known, 0 fixed)
statecheck
passedcheck reports unknown-property
passedcheck exits non-zero on unknown-property
passedcheck reports unknown-kind
passedcheck exits non-zero on unknown-kind
passedcheck reports unknown-function
passedcheck exits non-zero on unknown-function
passedcheck reports unknown-cfg-key
passedcheck exits non-zero on unknown-cfg-key
passedcheck reports unknown-feature
passedcheck exits non-zero on unknown-feature
passedcheck reports non-exhaustive-match
passedcheck exits non-zero on non-exhaustive-match
passedcheck reports type-mismatch
passedcheck exits non-zero on type-mismatch
passedcheck reports undeclared-dependency
passedcheck exits non-zero on undeclared-dependency
passedcheck reports unknown-target
passedcheck exits non-zero on unknown-target
passedcheck reports duplicate-target
passedcheck exits non-zero on duplicate-target
passedcheck reports dependency-cycle
passedcheck exits non-zero on dependency-cycle
passedcheck reports missing-manifest
passedcheck exits non-zero on missing-manifest
passedcheck reports missing-toolchain
passedcheck exits non-zero on missing-toolchain
passedcheck reports invalid-source
passedcheck exits non-zero on invalid-source
passedcheck reports unresolved-path
passedcheck exits non-zero on unresolved-path
passedcheck reports incomplete-runner
passedcheck exits non-zero on incomplete-runner
passedcheck reports missing-field
passedcheck exits non-zero on missing-field
passedcheck reports merge-conflict
passedcheck exits non-zero on merge-conflict
passedcheck reports abi-mismatch
passedcheck exits non-zero on abi-mismatch
passedcheck reports empty-glob
passedbuild reports invalid-source as well
passedbuild reports unresolved-path as well
passedbuild reports empty-glob as well
passedbuild exits non-zero on invalid-source
passedbuild exits non-zero on unresolved-path
passeda missing toolchain never reaches the shell
passedunknown-property points at the offending source
passedunknown-kind points at the offending source
passedunknown-function points at the offending source
passedunknown-cfg-key points at the offending source
passedunknown-feature points at the offending source
passednon-exhaustive-match points at the offending source
passedtype-mismatch points at the offending source
passedundeclared-dependency points at the offending source
passedunknown-target points at the offending source
passedduplicate-target points at the offending source
passeddependency-cycle points at the offending source
passedmissing-manifest points at the offending source
passedmissing-toolchain points at the offending source
passedinvalid-source points at the offending source
passedunresolved-path points at the offending source
passedincomplete-runner points at the offending source
passedmissing-field points at the offending source
passedmerge-conflict carries the location of both values
passedmerge-conflict renders the dependent side of the conflict too
passedabi-mismatch carries the location of both values
passedabi-mismatch renders the dependent side of the conflict too
passedunknown-property carries a suggestion
passedthe manifest still passes check after applying the suggestion
passedapplying the suggestion keeps the value intact
passedduplicate-target carries the location of both declarations
passednaming which of the two came first, so the later one is the one to rename
passedand why the name has to be unique, naming the object directory that keys on it
passedand the suggestion offers a spelling that differs from both
passedrenaming one of them makes the same tree build
passedwith the library's public include directory reaching the sources that need it
passedcheck refuses a target name
passedand says that it checks everything
passeda key outside the vocabulary is refused
passedsaying the vocabulary is closed, rather than that this name is merely unrecognised
passedlisting what that namespace does accept
passedand where a project's own axis belongs, spelled with the name that was written
passedthe schema says the configuration vocabulary is closed, as the decision did
passeda component outside the vocabulary is refused
passedlisting the components abi does accept
passedand saying that this vocabulary is closed too
passedand offering the component that was probably meant
passeda value outside a component's domain is refused
passedand the domain is listed
passeda label made of known components is accepted
passeda label written as one word is still accepted
passedthe configuration vocabulary carries the runtime axis the triple names
passedwith a domain, as every key in a closed vocabulary has
passedand says how the vocabulary grows, which is what makes it dependable
passedwhile the vocabulary it lists is the one the diagnostic enforces
ok projects/05-incremental — 49 checks (49 passed, 0 failed, 0 known, 0 fixed)
statecheck
passedapp: check passes
passeda first build runs every action (3 compiles, 1 archive, 1 link)
passedthe binary runs
passeda second build runs nothing
passedediting one source rebuilds it and everything downstream
passedthe edited unit is recompiled
passedthe other unit of the same target is not
passeda dependent's own sources are not recompiled
passedthe archive is rebuilt
passedthe dependent is relinked
passedediting a dependent's source touches nothing in the dependency
passedthe dependency's archive is left alone
passedediting a private header rebuilds through the depfile
passedthe unit that includes the private header is recompiled
passeda unit of the same target that does not include it is not
passeda private header never reaches a dependent
passedediting a public header rebuilds every dependent unit
passedthe dependency's own units are recompiled
passedboth of them
passedand the dependent's unit as well
passedwhile the dependency's own test is not built by its consumer at all
passedtouching a source without changing it still rebuilds (mtime judgement)
passedtouching the manifest without changing it rebuilds nothing
passedadding only a comment to the manifest rebuilds nothing
passedadding a flag recompiles the target it applies to
passedthe flag reaches the compile action
passedand no further than the target that declares it
passedadding a source compiles only the new one
passedthe new unit is compiled
passedthe existing units are not
passedremoving a source rebuilds the archive without compiling anything
passedno compile action runs when only a source disappeared
passedthe first release build runs every action
passedswitching back to debug rebuilds nothing
passedswitching to release again rebuilds nothing
passedcore: both tests pass
passedediting the public header reaches the library's own test
passedand its own units, from the package that declares them
passedtest exits non-zero when a test fails
passedthe summary counts both outcomes
passed--failed reruns only what failed last time
passed--failed leaves the passing test alone
passedthe repaired test passes under --failed
passed--failed says so when nothing failed last time
passeda full run passes again
passeda header edit is seen after building with ninja then direct
passeda header edit is seen after building with direct then ninja
passeda header edit is seen after building with ninja then ninja
passeda header edit is seen after building with direct then direct
ok projects/06-runner — 40 checks (40 passed, 0 failed, 0 known, 0 fixed)
statecheck
passedthe host triple needs no runner
passedrunning for another triple without a runner is refused
passedthe refusal carries the missing-runner code
passedthe refusal happens before the artifact is started
passedbuilding for another triple still works
passeda declared runner lets the tests run for another triple
passedthe runner receives its declared args then the artifact
passedthe runner starts in the package root
passedthe build directory is per target triple
passeda failing test still fails when it runs through a runner
passedthe exit status passes through the runner unchanged
passeda runner that transfers the artifact works
passedtransfer gets the local path and the destination appended
passedhost prefixes the destination as ADR-0008 specifies
passedthe launch command gets the remote path, not the local one
passedthe artifact really arrives at the destination
passedthe manifest carries no placeholder for the transferred path
passedthe first test run transfers the artifact
passedwhich really is one transfer
passedan unchanged tree runs the tests again
passedand sends nothing the second time
passedchanging the source and testing again works
passeda changed artifact is sent again
passedwhat was sent is recorded in the build directory
passedtesting after the record is gone works
passedremoving the record makes the next run send again
passeda run whose launcher does not exist fails
passedand is reported as a launch that never happened
passedand the run after it works
passeda run that could not start drops the record, so the next one sends again
passeda run whose artifact vanished from the target fails
passedthe run that noticed does not itself re-send
passedand the run after it passes
passeda machine that lost the artifact recovers on the run after the one that noticed
passedso the artifact is back on the target machine, with nothing touched by hand
passeda test that keeps failing still fails
passedand a failing run pays exactly one transfer, that being the price
passeda passing run writes the record back
passedso the run after it skips again
passedwhich is the skip returning once the tree is healthy
ok projects/07-robustness — 145 checks (145 passed, 0 failed, 0 known, 0 fixed)
statecheck
passedarray-missing-comma does not abort dowel
passedarray-missing-comma is refused
passedarray-missing-comma is refused with a source location
passedarray-missing-comma is answered within the budget
passedcmake-syntax does not abort dowel
passedcmake-syntax is refused
passedcmake-syntax is refused with a source location
passedcmake-syntax is answered within the budget
passedjson-object does not abort dowel
passedjson-object is refused
passedjson-object is refused with a source location
passedjson-object is answered within the budget
passedkey-with-space does not abort dowel
passedkey-with-space is refused
passedkey-with-space is refused with a source location
passedkey-with-space is answered within the budget
passedmatch-missing-comma does not abort dowel
passedmatch-missing-comma is refused
passedmatch-missing-comma is refused with a source location
passedmatch-missing-comma is answered within the budget
passedmissing-equals does not abort dowel
passedmissing-equals is refused
passedmissing-equals is refused with a source location
passedmissing-equals is answered within the budget
passedmissing-value does not abort dowel
passedmissing-value is refused
passedmissing-value is refused with a source location
passedmissing-value is answered within the budget
passedsemicolon does not abort dowel
passedsemicolon is refused
passedsemicolon is refused with a source location
passedsemicolon is answered within the budget
passedsmart-quotes does not abort dowel
passedsmart-quotes is refused
passedsmart-quotes is refused with a source location
passedsmart-quotes is answered within the budget
passedstray-brace does not abort dowel
passedstray-brace is refused
passedstray-brace is refused with a source location
passedstray-brace is answered within the budget
passedtwo-headers-one-line does not abort dowel
passedtwo-headers-one-line is refused
passedtwo-headers-one-line is refused with a source location
passedtwo-headers-one-line is answered within the budget
passedunclosed-block-comment does not abort dowel
passedunclosed-block-comment is refused
passedunclosed-block-comment is refused with a source location
passedunclosed-block-comment is answered within the budget
passedunclosed-bracket does not abort dowel
passedunclosed-bracket is refused
passedunclosed-bracket is refused with a source location
passedunclosed-bracket is answered within the budget
passedunclosed-header does not abort dowel
passedunclosed-header is refused
passedunclosed-header is refused with a source location
passedunclosed-header is answered within the budget
passedunclosed-inline-table does not abort dowel
passedunclosed-inline-table is refused
passedunclosed-inline-table is refused with a source location
passedunclosed-inline-table is answered within the budget
passedunclosed-paren does not abort dowel
passedunclosed-paren is refused
passedunclosed-paren is refused with a source location
passedunclosed-paren is answered within the budget
passedunterminated-string does not abort dowel
passedunterminated-string is refused
passedunterminated-string is refused with a source location
passedunterminated-string is answered within the budget
passedwrong-arrow does not abort dowel
passedwrong-arrow is refused
passedwrong-arrow is refused with a source location
passedwrong-arrow is answered within the budget
passedyaml-colon does not abort dowel
passedyaml-colon is refused
passedyaml-colon is refused with a source location
passedyaml-colon is answered within the budget
passedok-block-comment does not abort dowel
passedok-block-comment is accepted
passedok-line-comment does not abort dowel
passedok-line-comment is accepted
passedok-single-quotes does not abort dowel
passedok-single-quotes is accepted
passedok-tab-indent does not abort dowel
passedok-tab-indent is accepted
passedok-trailing-comma does not abort dowel
passedok-trailing-comma is accepted
passedCRLF line endings does not abort dowel
passedCRLF line endings is accepted
passeda UTF-8 BOM on dowel.build does not abort dowel
passeda UTF-8 BOM on dowel.build is accepted
passeda UTF-8 BOM on dowel.toml does not abort dowel
passeda UTF-8 BOM on dowel.toml is accepted
passeda BOM in the middle of a line does not abort dowel
passeda BOM in the middle of a line is refused
passeda BOM in the middle of a line is refused with a source location
passedinvalid UTF-8 bytes does not abort dowel
passedinvalid UTF-8 bytes is refused
passedinvalid UTF-8 bytes is refused with a source location
passeda NUL byte does not abort dowel
passeda NUL byte is refused
passeda NUL byte is refused with a source location
passeda 200k element list does not abort dowel
passeda 200k element list is refused
passeda 200k element list is refused with a source location
passeda 200k element list is answered within the budget
passeda 10MB string literal does not abort dowel
passeda 10MB string literal is refused
passeda 10MB string literal is refused with a source location
passeda 10MB string literal is answered within the budget
passed200k comment lines does not abort dowel
passed200k comment lines is accepted
passed200k comment lines is answered within the budget
passed100k nested arrays does not abort dowel
passed100k nested arrays is refused
passed100k nested arrays is refused with a source location
passed100k nested arrays is answered within the budget
passed100k nested arrays is refused as nesting-too-deep
passed100k nested inline tables does not abort dowel
passed100k nested inline tables is refused
passed100k nested inline tables is refused with a source location
passed100k nested inline tables is answered within the budget
passed100k nested inline tables is refused as nesting-too-deep
passed50k nested calls does not abort dowel
passed50k nested calls is refused
passed50k nested calls is refused with a source location
passed50k nested calls is answered within the budget
passed50k nested calls is refused as nesting-too-deep
passed2k nested inline tables does not abort dowel
passed2k nested inline tables is answered within the budget
passednesting 63 deep is accepted
passednesting 100 deep is refused
passednesting 100 deep is refused with a source location
passed--max-nesting raises the limit
passed--max-nesting can lower the limit too
passed--max-nesting=0 is refused as a usage error
passed--max-nesting=513 is refused as a usage error
passed--max-nesting=abc is refused as a usage error
passed--max-nesting=-1 is refused as a usage error
passeddowel.build being a directory does not abort dowel
passeddowel.build being a directory is refused
passeddowel.build being a directory is refused with a source location
passeddowel.build being a symlink loop does not abort dowel
passeddowel.build being a symlink loop is refused
passeddowel.build being a symlink loop is refused with a source location
passedthree independent errors are reported in one run
ok projects/08-lsp — 110 checks (110 passed, 0 failed, 0 known, 0 fixed)
statecheck
passedinitialize is answered
passedthe server advertises hover
passedthe server advertises document sync
passeddidOpen publishes diagnostics even when there are none
passeda valid manifest publishes an empty list
passeddidChange republishes for the new text
passeddidSave does not upset the server
passeddidClose clears the diagnostics of that document
passedreopening a closed document publishes again
passedshutdown and exit end the process cleanly
passedthe server survives a body that is not JSON
passeddiagnostics still arrive after a body that is not JSON
passedthe server survives a JSON body that is not a request
passeddiagnostics still arrive after a JSON body that is not a request
passedthe server survives a body shorter than Content-Length says
passedthe server survives a body with no Content-Length
passedthe server survives a Content-Length that is not a number
passedan unknown method is answered with method-not-found
passedthe server survives an unknown method
passeda broken manifest yields at least one diagnostic
passedthe diagnostic carries the stable code
passedthe diagnostic names dowel as its source
passeda parse error is reported as an error
passedthe diagnostic carries a range
passeddiagnostic lines are zero based
passedthe column of a diagnostic is in UTF-16 units after ASCII
passedthe column of a diagnostic is in UTF-16 units after a two byte character
passedthe column of a diagnostic is in UTF-16 units after a three byte character
passedthe column of a diagnostic is in UTF-16 units after an astral plane character
passeda hover position is read in UTF-16 units after ASCII
passeda hover position is read in UTF-16 units after a two byte character
passeda hover position is read in UTF-16 units after a three byte character
passeda hover position is read in UTF-16 units after an astral plane character
passeddowel check still reports unterminated-string
passedthe language server reports unterminated-string as dowel check does
passeddowel check still reports expected-token
passedthe language server reports expected-token as dowel check does
passeddowel check still reports unknown-char
passedthe language server reports unknown-char as dowel check does
passeddowel check still reports expected-value
passedthe language server reports expected-value as dowel check does
passeddowel check still reports missing-newline
passedthe language server reports missing-newline as dowel check does
passeddowel check still reports unterminated-comment
passedthe language server reports unterminated-comment as dowel check does
passeddowel check still reports duplicate-table
passedthe language server reports duplicate-table as dowel check does
passeddowel check still reports unknown-function
passedthe language server reports unknown-function as dowel check does
passeddowel check still reports unknown-cfg-key
passedthe language server reports unknown-cfg-key as dowel check does
passeddowel check still reports non-exhaustive-match
passedthe language server reports non-exhaustive-match as dowel check does
passeddowel check still reports unknown-property
passedthe language server reports unknown-property as dowel check does
passeddowel check still reports unknown-kind
passedthe language server reports unknown-kind as dowel check does
passeddowel check still reports type-mismatch
passedthe language server reports type-mismatch as dowel check does
passeddowel check still reports toplevel-entry
passedthe language server reports toplevel-entry as dowel check does
passeddowel check still reports missing-field
passedthe language server reports missing-field as dowel check does
passeddowel check still reports expression-in-strict-toml in dowel.toml
passedthe language server reports expression-in-strict-toml in dowel.toml
passeddowel check still reports expected-token in dowel.toml
passedthe language server reports expected-token in dowel.toml
passeddowel check still reports unterminated-string in dowel.toml
passedthe language server reports unterminated-string in dowel.toml
passeddowel check still reports duplicate-key in dowel.toml
passedthe language server reports duplicate-key in dowel.toml
passeddowel check still reports missing-table in dowel.toml
passedthe language server reports missing-table in dowel.toml
passeddowel check still reports empty-glob
passedthe language server scans the file system for empty-glob
passeddowel check still reports no-sources
passedthe language server scans the file system for no-sources
passeddowel check still reports invalid-source
passedthe language server scans the file system for invalid-source
passeddowel check still reports unresolved-path
passedthe language server scans the file system for unresolved-path
passeddowel check still reports missing-toolchain
passedthe language server looks for the declared compiler too
passeddowel check refuses an unresolvable system package
passedthe language server does not run pkg-config to resolve it
passedopening a manifest never writes dowel.lock
passedhover on a property gives its type and merge rule
passedhover on includes gives union as its merge rule
passedhover on a builtin gives its signature
passedhover on a configuration key gives its domain
passedhover on a table kind explains the kind
passedhover on a target name names the target
passedhover on a block explains the block
passedhover answers for sources while a later line has a parse error
passedhover answers for glob while a later line has a parse error
passedhover answers for includes while a later line has a parse error
passedhover on a blank line answers with no contents
passedhover past the end of the file answers with no contents
passedhover past the end of a line answers with no contents
passedthe server survives hover positions that are out of range
passedhover on an unknown property answers with no contents
passedthe server survives a didChange nested 64 deep
passedthe server answers a didChange nested 64 deep
passedthe server survives a didChange nested 1000 deep
passedthe server answers a didChange nested 1000 deep
passedthe server survives a didChange nested 100000 deep
passedthe server answers a didChange nested 100000 deep
passeda UTF-8 BOM in the buffer is not reported as an error
passedCRLF in the buffer is not reported as an error
passedthe server survives non-ASCII paths in the buffer
ok projects/09-acquisition — 121 checks (120 passed, 0 failed, 1 known, 0 fixed)
statecheck
passedinstalling a revision from the upstream succeeds
passedthe resolved commit is written to stdout
passedinstalling an already installed revision succeeds and says so
passedan installed revision appears in the list
passedthe installed revision is laid out under versions/<sha>/bin
passedrun starts the requested revision without selecting it
passedthe shim can be created
passedthe shim is a link named dowel
passedwith no pin and no default, nothing is selected
passedthe shim refuses to run when nothing is selected
passedsetting a default succeeds
passedthe default is used where no pin file applies
passeda pin file is used in the directory that holds it
passeda pin file is found by walking up from a subdirectory
passedthe nearest pin file wins over one further up
passedselection works with the upstream unreachable
passedthe shim runs with the upstream unreachable
passedpinning an installed revision needs no network
passedpin writes the resolved commit to the pin file
passedpin records which specifier it resolved from
passeda pin file holding `nightly` is refused
passeda pin file holding `stable` is refused
passeda pin file holding `main` is refused
passeda pin file holding `branch:side` is refused
passeda pin file holding `19a4a40` is refused
passedrefusing a hand written channel name points at dowelup pin
passeda pinned revision that is not installed is refused
passedrefusing an uninstalled revision points at dowelup install
passeda pin file without a trailing newline is read
passeda pin file with CRLF is read
passedsurrounding spaces in a pin file are ignored
passedan uppercase commit hash in a pin file is read
passeda pin file with no commit hash is refused
knowna pin file with a UTF-8 BOM is read [F-011]
passeda branch that exists resolves
passeda tag that exists resolves
passeda release number resolves to its tag
passedstable resolves to the newest tag
passeda dated nightly resolves
passeda branch that does not exist is refused
passeda tag that does not exist is refused
passeda date before the first commit is refused
passeda malformed date is refused
passeda commit hash prefix that is too short is refused
passeda branch specifier with no name is refused
passedan unresolvable commit is refused
passeda malformed specifier and an unresolvable one exit differently
passeda full commit hash selects an installed revision
passeda commit hash prefix selects an installed revision
passedthe specifier it was installed from selects it
passedinstalling the same commit under another specifier succeeds
passeda specifier that installed successfully can select
passedthe first specifier still selects after a second one is added
passedthe list shows every specifier the revision was installed from
passedan unknown specifier is refused by the shim
passedrefusing an unknown specifier points at dowelup list
passeda leading specifier overrides the pin file
passedinstalling a revision that does not build fails
passeda failed install leaves nothing under versions/
passeda failed install does not appear in the list
passeda failed install keeps its checkout for inspection
passeda revision whose install failed is not selectable
passeduninstalling by the specifier it was installed from succeeds
passedan uninstalled revision leaves the list
passeduninstalling removes the directory under versions/
passeduninstalling the same revision twice is refused
passedselecting an uninstalled revision is refused
passedinstalling a release succeeds
passedinstalling a release needs no Rust toolchain
passedinstall says the binary came from a release asset
passedinstall says the asset was verified by its checksum
passedinstall names the asset it fetched
passeda binary taken from a release asset runs
passeda binary taken from a release asset is laid out under versions/<sha>/bin
passed`stable` takes the release asset too
passed`tag:v0.9.0` takes the release asset too
passeda specifier that names no release does not look for an asset
passedinstall says why it is building instead of fetching
passeda specifier that names no release goes to the source build
passed--from-source does not fetch the asset
passed--from-source builds a release from source
passedan asset that does not match its checksum is refused
passedthe checksum mismatch shows both the expected and the actual digest
passeda refused asset falls back to the source build
passedan asset with no checksum beside it is refused
passedan asset with no checksum falls back to the source build
passeda checksum file in sha256sum's own format is accepted
passedan uppercase checksum is accepted
passedan asset that holds no dowel binary is refused
passedan asset that holds no dowel binary falls back to the source build
passeda release with no asset falls back to the source build
passedthe fallback really reaches cargo
passeda failed fetch says why it failed
passeda failed fetch says what each tool it tried reported
passedthe reason the asset path was abandoned survives into the failure
passeda checksum mismatch also survives into the failure
passedthe surviving reason is the mismatch itself, not a generic one
passedthe record of a version taken from an asset says so
passedthe record keeps the digest that was verified
passedthe listing marks a version that arrived as a published binary
passedwhich says which way the binary that would run here arrived
passedwhich states the digest for a version taken from an asset
passedthe record of a version built from source says so
passeda version built from source carries no asset digest
passedthe listing marks a version that was built from source
passedresolving an installed version again records one arrival, not two
passedresolving an installed version again keeps the way it first arrived
passedresolving an installed version again still records the new specifier
passeda second release can be created on the local mirror
passedtwo named releases can be installed side by side
passedand both arrived as published binaries
passedasking for one release gives the payload published under it
passedand asking for the other gives the payload published under that
passedwhat was installed is byte for byte what the asset held
passedand the digest it recorded is the one published beside the asset
passedthe dowel that was fetched can build a package
passedand what it built runs
passeda pin file selects the payload that came with the version it names
passedand changing the pin changes which payload runs
passeda payload that is not dowel at all installs, nothing checking what it is
passedand --from-source is the way to demand a binary whose origin is shown
ok projects/10-toolchain — 53 checks (53 passed, 0 failed, 0 known, 0 fixed)
statecheck
passedgcc: check passes
passedgcc: build passes
passedgcc: the declared toolchain is what gets invoked
passedgcc: the artifact was translated by the declared compiler
passedgcc: the artifact agrees with the declaration, checked in C
passedclang: check passes
passedclang: build passes
passedclang: the declared toolchain is what gets invoked
passedclang: the artifact was translated by the declared compiler
passedclang: the artifact agrees with the declaration, checked in C
passedmatch on tc.c picks the clang arm
passedmatch on tc.c picks the gcc arm
passedthe clang arm actually compiles under clang
passedthe gcc arm actually compiles under gcc
passedswitching the toolchain rebuilds
passedthe rebuilt artifact is the one the new toolchain produced
passedbuilding again with the same toolchain runs nothing
passedswitching back rebuilds as well
passedswitching back gives the earlier compiler's artifact again
passedgcc: a first build runs every action
passedgcc: a second build runs nothing
passedgcc: editing a header rebuilds through the depfile
passedgcc: and settles again
passedclang: a first build runs every action
passedclang: a second build runs nothing
passedclang: editing a header rebuilds through the depfile
passedclang: and settles again
passeda toolchain that does not exist is refused
passedthe refusal carries the missing-toolchain code
passedthe refusal points at the declaration
passedthe missing toolchain never reaches the shell
passeda toolchain declared with a url and a sha256 builds
passedand the program it produced runs
passedthe compiler is resolved inside what was unpacked
passedand it is the one the declaration named
passedwhat was unpacked lives in the user's cache, one directory per archive
passedand not inside the tree
passeda later build never reaches for the archive again
passedsysroot() expands to a path under the fetched toolchain
passedwriting sysroot() with none declared is refused
passedand says where to declare it
passeda url without a sha256 is refused
passedand says why a url alone is not a pin
passedan archive whose digest does not match is refused
passedand shows what was expected and what arrived
passedan archive that cannot be fetched is refused
passeda toolchain that is not fetched is refused under --offline
passedfetch acquires the toolchain
passedand it really is unpacked into the cache
passedafter which the build runs offline
passedfetch counts the toolchain it acquired
passedand lists it among what is now present
passedcounting them apart, the two being different things to go and get
ok projects/11-cross — 17 checks (17 passed, 0 failed, 0 known, 0 fixed)
statecheck
passedthe host build passes
passedthe host build produces a host artifact
passedthe host artifact names its own architecture
passedthe host tests pass
passedthe cross build passes
passedthe cross build produces an artifact for the target
passedthe cross tests run under the emulator and pass
passedthe host and cross build directories both survive
passeda second cross build runs nothing
passedthe host build is not confused by the cross build
passedand the cross build is still up to date afterwards
passedbuilding for a triple with no toolchain declared is refused
passedthe refusal carries the missing-toolchain code
passedthe mismatch is caught before anything is built
passedthe host build still needs no declaration
passeddeclaring the host compiler for another triple is allowed
passedand it produces a host artifact, which readelf shows plainly
ok projects/12-store — 43 checks (43 passed, 0 failed, 0 known, 0 fixed)
statecheck
passedthe first run in a fresh tree stores and restores nothing
passedthe next process restores what the first one stored
passedand stores nothing new when nothing changed
passeda restored run still passes check
passeda restored run still builds
passedan untouched file is judged unchanged by its stat alone
passeda touched file falls back to its content fingerprint
passeda touched but unchanged file is still restored
passedan edited file is judged changed
passedan edited file is evaluated again and stored again
passeda file whose evaluation produced diagnostics is not stored
passedthe diagnostic is reported on the first run
passedand on the next process too, not only the first
passedfixing the manifest clears the diagnostic in the next process
passeda truncated value log does not change the answer
passedan empty value log does not change the answer
passedan index cut at a partial record does not change the answer
passedan index full of noise does not change the answer
passeda value log full of noise does not change the answer
passeda missing index does not change the answer
passeda missing value log does not change the answer
passeda store written by an unknown format version does not change the answer
passedthe store recovers by itself after being corrupted
passedcache info reports what the store holds
passedcache info names the format version
passedcache gc runs
passedcache gc removes stores left by older formats
passedcache gc keeps the store of the current format
passedcheck still passes after gc
passedoverwriting a key leaves bytes behind, and cache info reports them as dead
passeda run that ends over budget says so
passednaming both how to collect it once and how to make it automatic
passedand DOWEL_CACHE=off stops saying it
passedwhile DOWEL_CACHE=gc compacts in place, which is what the note offers
passedand the tree still builds after it
passedcache info counts the build directories, one per configuration
passedwith how long ago each was written, which is what selects one for removal
passedgc without a number leaves them all, since nobody said which are unused
passedgc with a number removes a configuration nobody has built in that long
passedleaving the one that is still in use
passedand what was removed builds again
passedcache info works even when the manifest is broken
passedand so does gc
ok projects/13-parallel — 18 checks (18 passed, 0 failed, 0 known, 0 fixed)
statecheck
passedby default the tests do not overlap
passedall of them pass when run sequentially
passed--test-jobs=1 is the same as the default
passed--test-jobs=4 really runs them at the same time
passedall of them pass when run in parallel
passed--test-jobs=2 overlaps as well
passedevery test still runs when only two go at a time
passedthe report keeps the requested order under parallelism
passeda failing test fails the run when sequential
passedthe sequential summary counts it once
passeda failing test fails the run when parallel
passedthe parallel summary counts it the same
passedthe exit status of the failing test survives parallelism
passed--failed reruns only the failure after a parallel run
passed--failed leaves the passing tests alone after a parallel run
passedthe repaired test passes again in parallel
passed--test-jobs with a negative count is refused
passed--test-jobs with a non-number is refused
ok projects/14-scale — 17 checks (17 passed, 0 failed, 0 known, 0 fixed)
statecheck
passedcheck passes on a package with 120 sources and 8 targets
passedthe first build runs one action per source, archive and link
passeda second build runs nothing and accounts for every action
passedediting one source of 120 rebuilds only it, the archive and the dependents
passedediting one dependent rebuilds only that dependent
passedediting the public header rebuilds everything that includes it
passedadding one source compiles only the new one
passedremoving one source recompiles nothing and relinks the dependents
passedthe tests of the wide package still pass
passedcheck passes through a 6 level dependency chain
passedthe first build of the chain runs every action
passeda second build of the chain runs nothing
passedediting the nearest level does not rebuild the whole chain
passedediting the deepest header rebuilds only what includes it
passedthe chain still builds after the edits
passedcheck on a large package stays far below the budget
passedthe plan phase is reported for a large package
ok projects/15-cpp — 70 checks (70 passed, 0 failed, 0 known, 0 fixed)
statecheck
passeda package of mixed extensions passes check
passeda .cc source is compiled by the C++ driver
passeda .cp source is compiled by the C++ driver
passeda .cpp source is compiled by the C++ driver
passeda .cxx source is compiled by the C++ driver
passeda .c++ source is compiled by the C++ driver
passeda .CPP source is compiled by the C++ driver
passeda .C source is compiled by the C++ driver
passeda .c source is still compiled by the C driver
passeda C++ library passes check
passeda C++ library builds
passedthe C++ source of the library uses the C++ driver
passeda C binary that depends on a C++ library passes check
passedits own source is compiled by the C driver
passedbut the link uses the C++ driver because a dependency is C++
passedthe binary links and runs
passeda C main gets the whole C++ runtime, not just the symbols
passedrunning it exercises the standard library, exceptions and constructors
passeda C test can call into the C++ library and pass
passedthe link never fails the way F-008 did
passeda target holding both C and C++ sources passes check
passedthe C source of a mixed target uses the C driver
passedthe C++ source of a mixed target uses the C++ driver
passeda mixed target links with the C++ driver
passedthe mixed binary agrees about which unit was compiled as what
passedthe mixed binary runs and its C and C++ halves both behave
passedcxx defaults to c++ when nothing is declared
passeda declared cxx is what gets invoked
passedthe library builds with the declared cxx
passedmatch on tc.cxx follows the declaration
passedand follows the default when nothing is declared
passeda C++ package with a missing cxx is refused
passedthe refusal carries the missing-toolchain code
passedthe refusal points at the declaration
passedthe missing C++ compiler never reaches the shell
passeda package with no C++ sources ignores a broken cxx declaration
passedand still builds
passeda chain of C packages over a C++ leaf passes check
passedthe C++ leaf of the chain uses the C++ driver
passedthe C layer between them uses the C driver
passedand so does the root
passedthe root links with the C++ driver although its dependency is C
passedthe chain builds and its test passes
passedthe root binary runs through two C layers into C++
passeda C++ binary that depends on a C library passes check
passedthe C dependency uses the C driver
passedthe C++ binary uses the C++ driver
passedthe link uses the C++ driver in this direction too
passedthe C++ binary builds and runs
passeda test target written in C++ builds and passes
passedthe mixed target builds from scratch
passedand settles
passeda depfile is written for the C++ translation unit too
passedediting a header that only C++ reads rebuilds through the C++ depfile
passedand the artifact reflects the new value
passedediting a header that only C reads rebuilds through the C depfile
passedand the artifact reflects that too
passedg++ is used when it is declared
passedthe library builds with g++
passedclang++ is used when it is declared
passedthe library builds with clang++
passedthe C and C++ compilers can come from different families
passedthe library builds with a mixed pair
passeda cross C++ package passes check
passedthe cross C++ compiler is used for the C++ source
passedthe cross C compiler is used for the C source
passedthe cross link uses the cross C++ driver
passedthe cross C++ build produces an artifact
passedthe cross C++ artifact is built for the target architecture
passedthe cross C++ test runs under the emulator and passes
ok projects/16-migrate — 87 checks (87 passed, 0 failed, 0 known, 0 fixed)
statecheck
passedcmake writes a compile database for the reference build
passedimport drafts a manifest pair from the CMake File API
passedimport writes a package manifest
passedimport writes a build manifest
passedthe package manifest is marked as an unverified draft
passedthe build manifest is marked as an unverified draft
passedimport points at the verify step that checks its own output
passedthe package takes its name from the CMake project
passedan executable becomes a bin target
passeda static library becomes a lib target
passedsources are listed one by one
passedglobbing is not used for the imported sources
passedan in-project link becomes a target() dependency
passedincludes and defines land in a private block
passednothing is drafted as public
passedthe drafted manifests pass check
passedthe drafted manifests build
passedthe binary built from the draft runs and agrees with the CMake build
passedimport refuses to overwrite manifests that are already there
passedthe refusal leaves the existing manifest untouched
passedthe refusal says the manifests are already there
passeda build directory with no File API reply is refused
passedthe refusal says how to produce the reply
passedevery buildable target kind is imported
passedan object library becomes a lib target
passeda shared library becomes a lib target too
passedthe draft says out loud that a shared library became a static one
passedan interface library does not become a target of its own
passedwhat an interface library handed to its users survives
passeda system library becomes a link flag
passedverify compares plans, so it needs no build of its own
passedthe compiler name, -c, -o and the -MD family are not differences
passed-DA, -D A=1 and -DA=1 are the same define
passeda relative include is resolved against the entry's directory
passedthe order of the arguments is not a difference
passeda genuine difference is still reported
passedthe difference names both what the reference had and what dowel has
passeda differing entry makes the comparison fail
passeda file only dowel builds is counted apart, and does not fail
passeda file the reference builds and dowel does not is counted as not ported
passedthe text form reports the same four buckets as the json form
passeda reference that is not there is refused
passeda reference that is not JSON is refused
passedan empty reference is refused
passeda release build directory is imported the same way
passedthe draft carries no optimization flag from the CMake build type
passedthe CMake build type does not become a define in the draft
passedthe draft carries no NDEBUG from a release CMake build type
passedthe drafted debug build of a debug import is unoptimized
passedthe drafted release build is actually optimized
passedthe drafted debug build keeps assertions
passedthe drafted release build of a release import is optimized
passedthe workflow that import prints verifies clean
passedverify ignores the build type on both sides, so any pairing is clean
passedmeson writes its introspection without being asked, unlike CMake's File API
passedimport reads a Meson build directory
passedand the draft says it is unverified, the same as one imported from CMake
passednaming Meson as where it came from
passedthe sources of each target are listed explicitly
passedwith the defines sorted out of the parameters array
passedand the include directories too
passedwhile the configuration-level flags are not, since dowel's own --config supplies them
passedand deps is left empty, because Meson does not say which target links which
passedthe compile flags carry nothing that belongs to the link or the archiver
passedthe linker's own arguments go to link_flags instead
passedand what was dropped is noted rather than removed silently
passednaming both the archive it saw and the archiver's argument string
passedand says what to write instead, which is the edge Meson never reported
passedso what still stops the draft is the missing edge, not the arguments
passedwhile verify still reports what differs, which is what makes the draft checkable
passedthe same tree imports from CMake as well
passedand that draft builds without editing
passedimport marks every target it drafted
passedone mark per target, the unit of migration being the target
passedevery plan reports what is still unverified
passedas a warning, so the draft still builds and runs
passedand the draft does build with the mark in place
passedsaying that everything came in private
passedand that dropped link inputs are not dependencies yet
passedand pointing at the step that checks it
passedthe mark is machine readable, so an editor can underline it
passedverify counts what is still marked, beside the source-level verdict
passedand reporting the compile lines as equivalent is not a contradiction with that
passeda clean verify does not clear the mark, that claim being the user's to make
passedremoving a line by hand is what moves the count
passeda mark written by hand is reported the same way
passedand counted the same way, dowel not distinguishing who wrote it
ok projects/17-deps — 83 checks (83 passed, 0 failed, 0 known, 0 fixed)
statecheck
passeda version dependency resolves through pkg-config
passedthe resolved module enters the graph as a package
passeda package with a resolved system dependency builds
passedthe module's cflags and libs both reach the build
passedthe module's --cflags become compile flags
passedthe module's --libs become link flags
passeda version equal to what the system has is satisfied
passeda version below what the system has is satisfied
passeda version above what the system has is refused
passedthe refusal carries the unsatisfied-dependency code
passedthe refusal names the constraint that was not met
passedthe refusal says the constraint is a minimum
passedthe refusal points at the declaration in dowel.toml
passedthe refusal spans the declaration, not the whole file
passeda module the system does not have is refused
passedan unknown module is refused with the same code as a version mismatch
passedthe refusal names path and git as the way out
passedputting the module name back makes it resolve again
passeda version dependency is refused when pkg-config cannot be run
passedthe refusal says that pkg-config itself could not be run
passedthe resolution is recorded in dowel.lock
passedthe lock records the version that was resolved, not the one declared
passedthe lock names where the resolution came from
passedthe lock says it detects a change rather than restoring one
passeda second check with a matching lock passes
passeda matching lock is left byte for byte alone
passeda matching lock says nothing
passeda lock that disagrees with the system warns
passedthe drift is a warning, not an error
passedthe warning names both the resolved version and the recorded one
passedthe warning says how to accept the new resolution
passeda drifted lock does not fail the build
passeda drifted lock is never rewritten on its own
passedremoving the entry lets the resolution be recorded again
passedthe freshly recorded entry holds what the system has
passedand the drift warning is gone
passedan unrelated entry does not disturb the check
passedan unrelated entry in the lock is kept
passedan inactive optional version dependency is not resolved at all
passedan inactive optional version dependency is not recorded either
passedenabling the feature resolves the optional module
passedand then it is recorded
passeda module with no link flags builds all the same
passedthe archive of a private system dependency reaches the final link
passedkeeping a system dependency private does not leak its includes
passedthe link flags of a private system dependency reach the final link
passeda library that keeps a system dependency private still links its dependent
passedand its includes are still not leaked to the dependent
passeddeclaring the same dependency public does link
passeda public system dependency puts its link flags on the final link
passedbut a public system dependency also hands its defines to the dependent
passeda package declared as a pinned archive builds
passedand what it built runs
passedunpacked into a directory named for the digest of what was fetched
passedwith the single top-level directory stripped, as the usual wrapper is
passedthe fetched package's public defines reach the dependent
passedan archive without a digest is refused
passedsaying why a URL alone is not a pin
passeda digest that is not 64 hex digits is refused too
passednaming the shape it wanted
passeda digest that does not match reports both what was expected and what arrived
passedand nothing is unpacked, because the check happens before the archive is opened
passedan archive that cannot be fetched is refused
passedthe archive is fetched once
passedand a later build never reaches for it again
passedwhich is a build that runs nothing, having everything already
passedremoving what was unpacked makes the next build fetch it again
passeda dependency that is not fetched is refused under --offline
passedand says where it would have come from
passedand how to get it
passedthe environment variable does the same as the flag
passedfetch acquires what the build needs
passedand lists what is now present
passedand says that the build can now run offline
passedfetch compiles nothing
passedthe build then runs with --offline
passedand so does check
passedremoving what was unpacked brings needs-fetch back
passedand fetching once makes it work again
passed--offline says nothing about resolving a system dependency
passeda fetch that was tried and failed has its own code
passedwhile the same tree under --offline reports nothing was tried
passedfetch fails when it cannot acquire what it was asked for
ok projects/18-tools — 33 checks (33 passed, 0 failed, 0 known, 0 fixed)
statecheck
passedthe archiver defaults to ar when nothing is declared
passedthe C compiler defaults to cc, as it always has
passeda declared archiver is the one that runs
passeddeclaring the archiver leaves the compiler alone
passedthe package builds with the declared archiver
passedmatch on tc.ar follows the declaration
passedand falls to the default arm when nothing is declared
passeda tc.* key that is not a declared tool is refused
passedthe refusal names the key that was written
passedan archiver that is not on PATH is refused
passedthe refusal carries the missing-toolchain code
passedthe refusal says it is the archiver, not the compiler
passedthe missing archiver never reaches the shell
passeda target that produces no archive ignores a broken archiver
passeda rebuild with the same archiver runs nothing
passedchanging the declared archiver rebuilds
passedthe archive is what gets rebuilt
passedthe objects are not recompiled for a different archiver
passedswapping what the name resolves to rebuilds, the identity being what is recorded
passedand settles again once the new identity is the recorded one
passeda cross build uses the archiver declared for that triple
passedand the compiler declared for the same triple
passedthe host build still uses the host archiver
passedthe cross build passes check
passedthe cross build produces an archive
passedthe objects inside the cross archive are for the target architecture
passedthe cross binary links against that archive and runs under the emulator
passeda misspelled toolchain key is refused
passedthe refusal suggests the tool that was meant
passedthe misspelled declaration is caught before anything is built
passedspelling the key correctly does select the cross archiver
passeda transform tool can be declared alongside the archiver
passedan inspection tool can be declared alongside the archiver
ok projects/19-artifacts — 35 checks (35 passed, 0 failed, 0 known, 0 fixed)
statecheck
passeda package with an artifacts block passes check
passedand builds
passedan artifacts entry produces its derived file
passeda second entry produces a second file
passedthe artifact it derives from is still there
passedthe raw image is not an ELF, so the transform really ran
passedthe raw image carries what the source put in the artifact
passedthe hex image is in the format the second entry asked for
passedthe command is the tool, then the args, then the input and the output
passeda declared objcopy that is not on PATH is refused
passedthe refusal carries the missing-toolchain code
passedthe refusal names the object copier
passeda package with no artifacts block ignores a broken objcopy
passeda tool outside the toolchain table is refused
passedthe refusal lists the tools that can be named
passedthe refusal says the concrete command comes from the toolchain
passedan entry with no tool is refused
passedan entry that is not a table is refused
passedrestoring the block makes it pass again
passeda second build re-runs no transform
passedediting the source re-makes the derived file
passedchanging the args re-makes the derived file
passedand does not recompile anything
passeda cross build transforms with the objcopy declared for that triple
passedthe artifacts block never names the cross tool itself
passedthe cross build produces its image
passedthe derived file of a cross build is produced too
passedand the same manifest uses the host objcopy for a host build
passeda library with an artifacts block builds on its own
passeda standalone library produces its derived file
passedadding a binary that uses it still builds
passedthe library archive is still produced as a dependency
passeda library keeps producing its derived file when a binary depends on it
passednaming the library explicitly builds it
passedand then the derived file appears
ok projects/20-cases — 62 checks (62 passed, 0 failed, 0 known, 0 fixed)
statecheck
passeda package that registers cases passes check
passedand all of its cases pass
passedeach case is reported under <package>:<target>/<case>
passeda target with no cases block is one test named after the target
passedcases add no translation unit; five of them share one binary
passedthe args of a case reach the binary
passedthe env of a case reaches the binary
passedshould_fail turns a nonzero exit into a pass
passedand a case that was supposed to fail says so rather than reporting a bare status
passeda case past its timeout is killed and reported as timed out
passeda timeout wins over should_fail, so a hang is never an expected failure
passeda case killed by a signal does not satisfy should_fail
passedand the failure names the signal, not a bare status
passedand the report distinguishes a crash from a nonzero exit
passeda timeout of zero or less is refused
passeda label selects the cases that carry it
passednaming a label nobody carries does not pass with zero tests
passedand it does say which label found nothing
passedand points at the listing that shows the labels that do exist
passedthe label a case is reported under selects that case on the command line
passednaming the target runs all of its cases
passed--fail-fast stops at the first failure and says how many did not run
passed--failed reruns the case that failed, not its whole target
passedrerunning failures says so when the remembered case is gone
passedcases of one target run at the same time under --test-jobs
passedand the display stays in request order however many run at once
passedan unknown key in a case is refused
passedand the accepted keys are listed
passeda value of the wrong type in a case is refused
passeda type error inside a case points at the key that is wrong
passeda case name that breaks the label grammar is refused
passedand the diagnostic says why the grammar owns that character
passedtwo cases with the same name are refused
passedwriting a case as a table header says how to write it as an entry
passeda cases block on a bin target is refused
passedwith what to do instead
passeda cases block with no case in it is not silently one bare run
passeda value inside a case can branch on the configuration
passeda case can be registered only for some configurations
passedthe case exists in the configuration its condition names
passedand is absent from the one it does not
passedthe schema dump describes the properties a case accepts
passedand the runner's, which was the other block missing from it
passedand the case keys it lists are exactly the ones the type checker accepts
passedthe cases that would run can be listed without running them
passedwith the properties that change how a case is judged
passedand the listing honours the selection that was asked for
passedthe machine-readable results go to stdout while the progress goes to stderr
passedthe machine-readable result names the target and the case separately
passedand says whether the case was expected to fail
passeda case runs in the root of the package that declares it
passeda case can be given the directory it runs in
passedthe binary lists its own cases and each runs as its own test
passedblank lines and comment lines in the listing are skipped
passeda label declared on the harness reaches every discovered case
passedcases and harness cannot both be declared
passeda listing that fails is a failure of the target, not zero tests
passedand a listing that hangs is killed by the harness timeout
passeda discovered name that breaks the label grammar is not silently accepted
passednaming the offending name and the grammar it would break
passedand pointing at the harness, which is where such a name has to be fixed
passeda discovered case reports under the same label grammar as a declared one
ok projects/21-debug — 32 checks (32 passed, 0 failed, 0 known, 0 fixed)
statecheck
passedthe package passes check
passedthe debugger is a toolchain tool with a default per argument style
passeda library cannot be debugged, because there is nothing to start
passeddowel builds the target and starts the declared debugger
passedand hands it the artifact it just built
passeda debugger that is not on PATH is refused when debugging
passedwhile an ordinary build never asks for it
passeda breakpoint set through dowel stops the program where the source says
passedand the debugger can evaluate expressions in the stopped program
passeda cross debug session attaches to the declared stub address
passedand stops the foreign binary at the same source line
passedthe stub is killed when the debugger exits
passeda cross target whose runner declares no stub is refused
passeda half-declared stub is told which half is missing
passednaming the missing half rather than reporting the pair as absent
passedpointing at the half that is there, and naming the key that completes it
passed--dap writes a launch configuration instead of starting anything
passednaming the artifact the session would have opened
passedwith the package root as the working directory, the same as dowel test
passeda cross launch carries the declared attach address
passedand the debugger the triple declared, not the host's
passedand the stub command that hosts the program behind it
passedthe failing case's arguments become the launch arguments
passedand its environment
passedand the directory the case declared it runs in
passedwhen nothing failed there is nothing to debug, and that is a success
passedtwo recorded failures refuse to guess which one to open
passedand ask to name one, listing the candidates
passednaming a case narrows the choice to it
passeda case that has not failed can be opened under the debugger
passedcarrying that case's own arguments, not a bare run of the binary
passedwhile a case that does not exist is refused rather than opened as the bare target
ok projects/22-bench — 34 checks (34 passed, 0 failed, 0 known, 0 fixed)
statecheck
passedthe package passes check
passedbench is a target kind, and an implemented one
passeddowel bench builds the targets and measures them
passedreporting min and median over the requested number of runs
passedeach declared case is measured in its own right
passedunder the same label grammar a test case has
passedand naming one measures only it
passedthe machine-readable form emits one bench-result per measurement
passedwith min never above median, and median never above max
passedand the times given as whole microseconds, leaving the rendering to the reader
passedthe number of runs is the one asked for
passedand ten when nothing is asked
passedcarrying the arguments the case was measured with
passedthe slow case really is slower, which is a measurement and not a verdict
passedso a benchmark that takes longer still succeeds
passedand dowel offers no threshold of its own, leaving that to whatever reads the JSON
passeda run that could not be completed fails the whole invocation
passednaming what happened to it
passedand no numbers at all for it, because a partial series reads as a finished measurement
passedthe machine-readable form withholds them too
passedwhile the cases that did complete are still reported
passeda case that never returns is killed by its timeout and reported as unmeasurable
passedwith no numbers for it either
passeddowel test runs the tests and not the benchmarks
passedand dowel bench runs the benchmarks and not the tests
passedwhile an ordinary build produces both, since a benchmark is still an executable
passeda bench case may not declare should_fail
passedand the refusal names it, because a measurement has no verdict to invert
passednor may a bench discover its cases through a harness
passedand a library cannot be benchmarked, having nothing to start
passeda benchmark case can be opened under the debugger, carrying its arguments
passeda second build of the benchmark runs nothing
passedediting the measured source recompiles it
passedand leaves the test that shares the package alone
ok projects/23-probe — 23 checks (23 passed, 0 failed, 0 known, 0 fixed)
statecheck
passedthe package builds with the renamed compiler
passeda fact database appears in the user's cache area
passedand not inside the project, because a fact belongs to the tool
passedrecording what the compiler answered when asked what it calls itself
passedthe triple the compiler calls itself is accepted as the host
passedand so is the one dowel was built with, since both name this machine
passedwhile a genuinely foreign triple is still refused
passeda second build in the same tree records nothing new
passeda second package builds with the same compiler
passedand asks the tool nothing again, because the answer is not a property of the tree
passedthe key carries the tool's path, size and mtime
passedthe tree still builds after the tool is replaced
passedreplacing it asks again under a new key, rather than trusting the old answer
passedleaving the old record in place, unreachable rather than wrong
passedcache info names the per-project store
passedand the per-user fact database beside it
passedgiving the path it actually used, which is the one to delete by hand
passedcache info works even when the manifest is broken
passedthe tree builds again after the fact database is deleted by hand
passedand the next run asks again, writing what it learned back
passedarriving at the same answer, because the tool has not changed
passedgc runs without a manifest too
passedand the tree still builds after it
ok projects/24-install — 55 checks (55 passed, 0 failed, 0 known, 0 fixed)
statecheck
passedinstalling a library succeeds
passedinstalling a library writes lib/libshapes.so.2
passedinstalling a library writes lib/libshapes.so
passedinstalling a library writes lib/librender.a
passedinstalling a library writes include/shapes.h
passedinstalling a library writes include/render.h
passedinstalling a library writes lib/pkgconfig/shapes.pc
passedinstalling a library writes lib/pkgconfig/render.pc
passedthe unversioned name of a versioned library is a symlink
passedwhat is installed is the published directory, not the sources beside it
passedwhat is installed is the same bytes that were built
passedinstalling without a destination is refused
passedrefusing it names the option that is missing
passedinstalling a package with a test target succeeds
passeda bin target is installed
passeda test target is not installed
passeda shared library the executable needs is installed with it
passedinstalling a binary does not bring its dependency's headers
passednaming a target installs that one
passedthe named target is installed
passedan installed executable records a search path relative to itself
passedthe build tree path stays alongside it
passedthe installed tree runs after it is moved and the build tree is gone
passedthe direct backend records the relative search path unmangled
passedthe ninja backend records the relative search path unmangled
passedthe make backend records the relative search path unmangled
passedinstalling into a staging directory succeeds
passed--destdir prepends a staging root to every destination
passedthe descriptor names the real prefix, not the staging directory
passeda staged executable carries the same relative search path
passeda staged tree unpacked somewhere else runs
passedinstalling into an empty staging directory yields the file list
passedthe descriptor names the target
passedthe descriptor carries the package version
passedthe descriptor carries the declared description
passedCflags points at the installed include directory
passedCflags carries the defines the library publishes
passedLibs names the library itself
passedLibs carries the link flags the library publishes
passedthe descriptor validates as pkg-config input
passeda bin target gets no pkg-config descriptor
passeda consumer that knows nothing about dowel compiles against the installed library
passedand the program it produced runs
passeda consumer links against an installed library that sits on a sibling
passedand the program it produced runs
passedthe descriptor of a library that sits on a sibling names what it requires
passedand what it names was written by the same run, beside it
passedso a define the sibling publishes reaches the consumer too
passedinstalling still succeeds, the behaviour being what was declared
passedand says the interface directory holds sources
passedpointing at the declaration, which is where the fix goes
passedand saying why it does not filter them out
passedone declaration produces one diagnostic, not one per file
passedthe directory goes whole and unfiltered, as the note says
passeda directory that holds only headers says nothing
ok projects/25-asm — 53 checks (53 passed, 0 failed, 0 known, 0 fixed)
statecheck
passeda target mixing C and assembly builds
passedand the program it produced runs
passedthe progress line for assembly says AS
passedand the one for C still says CC
passedthe action graph describes it as an assembly step
passeda language-independent flag reaches assembly
passeda C standard does not reach assembly
passeda C-only flag does not reach assembly
passedan assembly-only flag reaches assembly
passedan assembly-only flag does not reach C
passedC still gets its own standard and flags
passeda preprocessed assembly source is assembly too
passeddowel adds the flag that marks the stack non-executable
passedthe executable it produced does not ask for an executable stack
passedwhat dowel adds comes before what the target declares, so the target can override it
passeda preprocessed assembly source asks for a depfile
passeda plain assembly source does not, because none would be written
passedediting a header a preprocessed assembly source includes rebuilds it
passedand the change reaches the program
passedthe direct backend leaves nothing to redo on the next build
passedthe ninja backend leaves nothing to redo on the next build
passedthe make backend leaves nothing to redo on the next build
passeda spelling dowel cannot compile is refused
passedand check does not pass a tree that holds one
passedwith the position where it was declared as a source
passednaming the file, not an object inside the build directory
passedand listing the languages it does compile
passedand saying what the C driver would have done with it
passeda source with no extension is refused too
passeda preprocessed C source is accepted, being C the driver takes
passedthe direct backend fails when a tool writes nothing it was asked for
passedand says that the command exited 0 without writing its output
passedshowing the tool's own words, which usually explain it
passedthe ninja backend fails there too, the net being after the build
passedand the ninja failure names the artifact that never appeared
passedthe make backend fails there too, the net being after the build
passedand the make failure names the artifact that never appeared
passeda tool that does write its output still succeeds
passeda package that declares its own assembler builds
passedand the program it produced runs
passedthe declared assembler is what assembles, not the C driver
passedand asm_flags reach it, being where what it needs is written
passedwhile the C driver's own flags do not
passedand neither does what the target declared for every language
passeda path written in asm_flags arrives as a path, there being no concatenation
passedno depfile is asked for, its spelling being that assembler's and not the tool slot's
passedthe link carries the claim about the stack instead
passedand the executable that came out does not ask for an executable stack
passeda .asm source with no assembler declared is refused
passednaming the file that needs one
passedand saying what that spelling is
passedand how to declare one
passedand points at the source, as its sibling diagnostic does
ok projects/26-prebuilt — 28 checks (28 passed, 0 failed, 0 known, 0 fixed)
statecheck
passeda target that names a prebuilt library builds
passedand the program it produced runs
passeda consumer of a prebuilt library compiles against its published headers
passedbuilding a prebuilt library runs no compile and no archive of its own
passedwhile its consumer is compiled as usual
passedwhy traces a value back to the prebuilt target
passedand the link flags it publishes arrive with it
passeda prebuilt library that is not there fails
passedand says so with its own code
passedwith the position of the declaration
passednaming the path it looked for
passedand saying that dowel does not produce it
passedreplacing the prebuilt library relinks its consumer
passeddeclaring both sources and prebuilt is refused
passedand says a target is built here or was built elsewhere
passeda bin that names a prebuilt library is refused
passedand says what a prebuilt is for
passeda prebuilt library requiring another libc than the build is refused
passedwith the code the label system already had
passednaming what the surface requires
passedand the triple the build actually is
passedand says why nothing later would catch it
passedone wrong declaration produces one diagnostic
passedand adding another consumer does not add another copy of it
passeda prebuilt library requiring the libc the build has passes
passeda surface may say more than the other side without blocking it
passedand the merged label is the union of what was said
passedkeeping what the other side said too
ok projects/27-generate — 61 checks (55 passed, 0 failed, 6 known, 0 fixed)
statecheck
passeda package whose sources are generated builds
passedand the program it produced runs
passedthe generated source is compiled into the target that declares it
passedthe action graph names each generation as its own kind of step
passedeach generation gets a directory of its own, named for it
passedand the program runs in it, which is why the outputs are plain names
passedthe inputs are appended after the arguments, as everywhere else
passedand a file() in the arguments opens to an absolute path
passedthe output directory joins the include path without being declared
passedand public = true propagates it to a dependent
passedwhile a generation that does not say public stays with its own target
passeda first build runs the generation
passedand a second runs nothing
passedediting what the generation reads runs it again
passedand recompiles the source it produced
passedthe program that comes out is the new one
passedthe dependent is recompiled too, having seen the generated header
passedevery compile in the reach takes the generated outputs as inputs
passeda clean build under ninja never lets a compile outrun the generation
passedand what ninja built prints the same thing
passeda clean build under make never lets a compile outrun the generation
passedand what make built prints the same thing
passeda clean build under direct never lets a compile outrun the generation
passedand what direct built prints the same thing
passeda generation with two outputs builds under ninja
passedwhile make refuses it
passedsaying it takes one output per step
passedand naming a backend that has no such limit
passeda generator that is not on PATH fails
passedwith its own code
passedat the declaration
passednaming the program it looked for
passedand saying it runs on the build machine
passedso [toolchain] is not where it comes from
passedan output naming a path outside its directory is refused
passednaming the output that leaves
passedand saying what the names are relative to
passeda generation that writes nothing is refused
passedand says why that is a declaration error
passedninja refuses a command it cannot spell
passedsaying what ninja cannot spell
passedand naming the spelling that works everywhere, to ninja's reader
passedand the backend that runs argv without a shell (ninja)
passedmake refuses a command it cannot spell
passedsaying what make cannot spell
passedand naming the spelling that works everywhere, to make's reader
passedand the backend that runs argv without a shell (make)
passedand writes no build file at all, rather than a half-written one
passedthe same declaration builds under direct, which passes argv
passedand the file it wrote holds the newline that was asked for
passedtwo generations may share a name across targets
passedeach writing into a directory named for its own target
passedand neither one overwrites the other
passeddirect fails a generation that does not write what it declared
passednaming the generation, not the compiler's word two stages later
knownninja fails it too, the declared output not being there [F-068]
knownmake fails it too, the declared output not being there [F-068]
knownone rejected output produces one diagnostic [F-069]
knowna refusal a backend makes carries a code, like every other refusal [F-070]
knownediting the program a generation runs re-runs it [F-071]
knownwhy accounts for the include path a generation put on the command line [F-072]
ok projects/28-progress — 19 checks (19 passed, 0 failed, 0 known, 0 fixed)
statecheck
passed--jobs 1 runs the steps one at a time
passedand what it built runs
passed--jobs 4 really runs steps at the same time under direct
passedand the default is the machine's parallelism, not one
passed--jobs 4 runs steps at the same time under ninja too
passed--jobs 4 runs steps at the same time under make too
passeda clean concurrent build produces the same program every time
passedand ninja builds the same program with steps running at once
passedand make builds the same program with steps running at once
passedand direct builds the same program with steps running at once
passedprogress does not go to stdout, which stays for what the command returns
passed--log-level=off silences it, being the only knob for silence
passedninja prints one line per step at the default log level (10 of 10)
passedmake prints one line per step at the default log level (10 of 10)
passeddirect prints one line per step at the default log level (10 of 10)
passeddirect counts the steps it ran out of the steps in the graph
passedand the numbers arrive in order, matching the lines
passedan incremental build stops short of m, m being the size of the build
passedthe progress lines arrive while the build runs, not replayed at the end
ok projects/29-tool-identity — 21 checks (21 passed, 0 failed, 0 known, 0 fixed)
statecheck
passeda package whose compiler is a wrapper builds
passedand what it built runs
passeda stamp is written for the tool, named for it and for its declaration
passedand holds the identity of the program as resolved, not of the name
passedthe graph carries the stamps a reader has to write before running
passedand every action takes the stamp of its own program, link and archive too
passedthe build graph says version 2, a version-1 reader having no stamps to write
passeddirect: the program built by the first wrapper runs
passeddirect: replacing the compiler rebuilds what it produced
passedninja: the program built by the first wrapper runs
passedninja: replacing the compiler rebuilds what it produced
passedmake: the program built by the first wrapper runs
passedmake: replacing the compiler rebuilds what it produced
passedan unchanged tool leaves its stamp alone, mtime being what rebuilds
passedand a build with the same tool runs nothing
passedtwo spellings of the same program get two stamps, the digest being of the spelling
passedand their contents are equal, both resolving to the same program
passedcheck passes without building
passedand writes no stamp, planning only stat-ing what it decides from
passeda compiler that is not there fails
passedwith its own code
ok apps/blink — 59 checks (59 passed, 0 failed, 0 known, 0 fixed)
statecheck
passedthe bare-metal package passes check
passedand builds
passedthe artifact needs no shared library at run time
passedand carries no symbol from the standard library or its start-up
passedthe artifact is for the target architecture
passedand its float ABI agrees with the hf in the triple
passedthe entry point is the reset handler, not a libc start-up routine
passedthe vector table survives into the artifact although nothing calls it
passeda package can say which targets it is for
passedand leaving out --target is refused
passedby the package itself, with a diagnostic of its own
passedthe message is about the package's targets, not about a flag
passedand the host compiler is never reached
passedwithout the declaration the host compiler is what complains
passeda raw image is produced
passedan Intel HEX is produced
passedthe raw image is no longer an ELF
passedthe hex image is in the format the entry asked for
passedthe image is made by the objcopy declared for the triple
passeda linker script inside the package can be named from the manifest
passedand the image lands at the start of flash, where it can be programmed
passedand the firmware runs on emulated hardware and its test passes
passedthe firmware reports through semihosting, so the result comes from the device
passedwithout a memory map the firmware does not link at all
passedthe link names the section bounds the script was to define
passedand a target that does link locks up at reset, having read no vector table
passedthe first word of the image is the initial stack pointer
passedand the second is a reset handler inside flash
passedthe runner ends its args with -kernel, and dowel appends the artifact
passeda runner written into dowel.toml is not silently ignored
passedand the failure is about the misplaced table, not about a missing declaration
passedputting the runner back where it belongs makes the tests run again
passedthe firmware's debug launch attaches at the declared stub address
passedwith the debugger the bare-metal triple declares
passedthe stub arguments do not break a runner that ends with the flag taking the artifact
passedbecause they are inserted before the runner's own arguments, not after them
passeda second build changes nothing
passedediting a peripheral source recompiles it
passedand the image is derived again
passedwhile its neighbour is left alone
passedthe machine flags are declared once, in a template
passedand every target that uses it is compiled with exactly those flags
passedwhile the link-side template reaches only the two targets that link
passedand the template itself produces nothing, being settings and not a target
passeda target's own values are merged with the template's, not replaced by them
passedwith the template's placed first, which is what lets the target win a replace
passeda template may not declare sources, the root block saying what a target is
passedwhile build itself is untroubled by the templates beside it
passedand so is test
passedthe start-up code is built as assembly, not as C that happens to assemble
passedand the C dialect the template declares does not reach it
passedwhile C still gets it, which is what makes the separation a placement and not a loss
passedwhile the machine flags do, being what the assembler needs too
passeda preprocessed start-up file records what it includes
passedediting the header it shares with C rebuilds the start-up code
passedand the value it took from that header is the first word of the image
passedthe vector table is a symbol the assembly file defines
passedand the reset entry it points at is marked as a thumb function
passedthe firmware still runs on emulated hardware with the assembly start-up
ok apps/dsp — 60 checks (60 passed, 0 failed, 0 known, 0 fixed)
statecheck
passedthe algorithm passes check
passedit builds for the host
passedand for ARM
passedand for RISC-V
passedand for a machine with no operating system
passedthe vectors pass on the host
passedand on ARM
passedand on RISC-V
passedand on bare metal, against the same golden header, reported over semihosting
passedthe same executable source prints byte-identical numbers on all three
passedthe word size is the same on both, so it is not what makes the answers agree
passedbut what was built for ARM really is a aarch64 image
passedbut what was built for RISC-V really is a RISC-V image
passedbut what was built for the host really is a x86-64 image
passedand the bare-metal target also yields the raw image a programmer would take
passedwhose ELF form is an ARM image, from the same algorithm source
passedthe compiler for aarch64-unknown-linux-gnu is the one its toolchain table named
passedthe compiler for riscv64gc-unknown-linux-gnu is the one its toolchain table named
passedthe library's own source is compiled freestanding only for the machine that has no libc
passedand is not, for the ones that have it
passedthe machine flags the library and its consumer are built with agree, though nothing binds them
passedthe packages of this tree name one shared file instead of copying the tables
passedand that file holds the three triples they build for
passedwith none of them declaring a toolchain table of its own
passeda consumer naming the file gets the compiler it declares for aarch64-unknown-linux-gnu
passeda consumer naming the file gets the compiler it declares for riscv64gc-unknown-linux-gnu
passeddeclaring one tool locally leaves the others coming from the file
passeda dependency's toolchain declaration does not reach the build that uses it
passedthe error for a missing toolchain mentions the declaration a dependency already carries
passedquoting the value, so the line to write is in front of the reader
passedand why it does not apply, which is what makes the refusal read as a design
passeda consumer builds for a triple its dependency's tests cannot be built for
passeda consumer never builds the dependency's own tests, on a hosted triple either
passeda target outside its triples does not appear in that triple's plan
passedwhile naming it there is refused, because a build that quietly produces nothing reads as success
passedand on a triple it does declare, the same target builds and runs
passeda consumer that pulls a system library builds against the same algorithm
passedand the algorithm's own translation never sees that library
passedthe picture is drawn from the same numbers the other three triples printed
passedand what it wrote has the dimensions it reported
passedwith the corner left exactly the declared background colour
passedeach triple keeps its own build directory
passedand the archive of the same name differs between them, as it must
passeda second build for one triple runs nothing
passedediting the algorithm recompiles it for the triple being built
passedand leaves the other source alone
passedwhile another triple is rebuilt only when it is asked for (3 actions)
passedthe host build installs
passedand what was installed answers as the build tree's copy did
passedinstalling for aarch64-unknown-linux-gnu succeeds
passedand what landed there is for that machine, not this one
passedand the installed artifact runs on that machine, out of the prefix alone
passedinstalling for riscv64gc-unknown-linux-gnu succeeds
passedand what landed there is for that machine, not this one
passedand the installed artifact runs on that machine, out of the prefix alone
passedthe distribution for another machine gives the same answers as the host's
passednothing in this tree needs fetching
passedso the host build runs with the network forbidden
passedand so does the cross build
passeda package that resolves a system library still resolves it offline
ok apps/hashx — 88 checks (88 passed, 0 failed, 0 known, 0 fixed)
statecheck
passedthe library package passes check
passedand builds
passedits own tests pass
passedthe artifact is a static archive
passedthe C consumer builds against it
passedthe C++ consumer builds against it
passedthe archive exports exactly the names the header marks as the API
passedand nothing outside the library's own prefix is exported
passedan internal name that must cross translation units is hidden, not exported
passeda new global added without the API mark does not join the exported face
passeda consumer cannot include the library's internal header
passedand removing it builds again
passedthe C consumer gets the known answer for the standard check value
passedand the C++ consumer gets the same answer from the same archive
passedthe link of the C++ consumer runs through the C++ driver
passedthe library names the C ABI boundary rather than its own language
passedand the C++ consumer declares its own language
passeda C++ consumer can declare its own abi label and still use a C library
passedtwo labels that are not the boundary are still compared
passedand the refusal comes with a diagnostic code and both provenances
passedrestoring the boundary label builds again
passeda dependency entry that names two sources is refused
passedand the build does not fall back to the local path
passedthe same holds when the two sources are a path and a version
passedremoving the second source leaves the package as it was
passeda dependency entry that names no source at all is refused
passedthe library takes its version from the manifest instead of repeating it
passedso the public header holds no copy of it
passedand the artifact reports the version the manifest declares
passedmoving the manifest version moves what the artifact answers
passeda shared library cannot be declared
passedand the kinds it does offer, which the diagnostic lists, hold nothing for one
passeda build tree offers a foreign consumer nothing, the distribution being what install writes
passedthe small-table configuration builds
passedand its tests give the same answers
passedthe answer a consumer sees does not depend on how the library was configured
passeda second build of the consumer runs nothing
passedediting a library source recompiles it for the consumer
passedand the consumer is linked again
passedwhile the library's other translation units are left alone
passedediting the public header recompiles the consumer that includes it
passedthe library builds as a shared object
passedproducing a shared object where the default configuration produces an archive
passedwhile the default configuration still produces the archive it always did
passedthe names the manifest lists are the ones the object exports
passedand the internal ones are not, so the interface is what was declared
passeda shared library with no exports declared is refused
passedsaying why there is no default, which is that the platforms disagree
passedevery translation unit inside the shared library is compiled position-independent
passedand is not, when the same library is built as an archive
passeda consumer of the shared library records it as needed at run time
passedand a run-time search path pointing at the build tree's lib directory
passedso it runs straight out of the build tree, without being told where to look
passedand answers exactly what the archive-linked build answers
passedthe library's own tests still link when it is built shared
passedwhile the same tests pass when it is built as an archive
passedand what they reach is an internal name, not something on the public surface
passedand the consumers build and run against the shared object
passedwhich still sees only what exports lists, because the boundary faces outward
passeda name in exports that the library does not define is refused
passednaming it, and saying which tool was asked
passedand why it matters, which is that the mistake is otherwise invisible until then
passeda shared library may declare its ABI generation
passedwhich enters the file name
passedand the soname, which is what a consumer records
passedwith the plain name left beside it, so linking by -lhashx still works
passeddeclaring nothing keeps the plain name
passedbecause when the ABI generation changes is the author's call, not the tool's
passedthe library installs into a prefix
passedinstalling writes lib/libhashx.so
passedinstalling writes include/hashx/hashx.h
passedinstalling writes lib/pkgconfig/hashx.pc
passedand keeps the directory shape the header is included through
passedwhile what is private stays behind
passedthe same manifest installs a static distribution too
passedand what lands there is the archive, the feature deciding the form
passedthe descriptor carries the one version this package declares
passedand the description, which pkg-config requires of a valid file
passedthe descriptor validates as pkg-config input
passeda consumer that never heard of dowel compiles and links against it
passedand the program it produced gives the answers this suite fixed elsewhere
passeda runtime that is neither C nor C++ can load the installed library
passedand gets the same answers, the boundary being an ABI and not a language
passedwhile a name the library did not export is not reachable from there either
passedand that name does exist in the archive, so the surface was made, not merely absent
passeda consumer builds against the prefix after it is moved and the build tree is gone
passedand what it produced still runs
passedas does loading the moved library from a foreign runtime
ok apps/httpd — 36 checks (36 passed, 0 failed, 0 known, 0 fixed)
statecheck
passedthe package passes check
passedit builds
passedthe default build asks for nothing beyond the standard library
passedthe default configuration compiles the portable waiter
passedand does not compile the one it did not choose
passedchoosing the other feature compiles the other waiter
passeda package can declare that its two waiters are exclusive
passedand a package that would end up with two implementations of one interface says so
passedthe build does not proceed to pick one silently
passednaming default as the source, which is what --no-default-features drops
passedthe epoll configuration builds
passedthe default artifact says it is the portable waiter
passedthe epoll artifact says so too
passedthe threaded configuration asks the linker for threads
passedthe threaded configuration builds
passedand its artifact says it is threaded
passedthe default configuration builds
passeda request for a file that exists is answered with 200
passedthe response carries the media type the path implies
passedand the body is what the file holds
passeda request for a file that does not exist is answered with 404
passeda path that climbs out of the root is refused
passedthe epoll build answers the same request the same way
passedthe unit tests pass
passedand pass under the other waiter too
passeda rebuild of the same configuration is a no-op
passednothing runs when nothing changed
passedediting the chosen waiter recompiles it
passedand leaves the rest of the library alone
passedthe instrumented configuration passes check
passedand builds
passedthe instrumentation the library asks for reaches the link of the server
passedthe unit tests pass with the instrumentation on
passeda malformed request is answered or refused, never crashes the server
passedthe epoll configuration builds instrumented too
passedand the other waiter survives the same requests
ok apps/jsonfmt — 39 checks (39 passed, 0 failed, 0 known, 0 fixed)
statecheck
passedthe library package passes check
passedthe application package passes check
passedthe application builds
passednothing outside the standard library is linked in
passedthe public include directory of the library reaches the application
passedbut its private one does not, so the internals stay internal
passedincluding a private header of the library does not compile
passedand removing it builds again
passedan object is laid out over lines with two spaces
passed-c lays the same object out on one line
passednesting indents by depth
passedsurrounding space is dropped
passedan escaped quote inside a string survives
passedan empty array stays on one line
passed-i sets the width
passeda syntax error is refused with its byte offset
passedthe consumer's own tests run and pass
passedand only its own are collected
passedthe library's tests run and pass from its own package
passedcarrying the label of the package that declares them
passedthe test sources live outside the packages that declare them
passedbuilding with a forwarded feature passes
passedthe default build has the ordinary depth limit
passeda feature forwarded to a dependency reaches it
passeda forwarded feature does not split the build directory in two
passedthe application builds in release
passeda second build of the same configuration runs nothing
passedediting one source recompiles it
passedand does not recompile its neighbours
passedrunning the tests does not make the next build redo work
passedand a full build leaves nothing for the tests to redo
passedbuilding one target does not make the next full build redo work
passedthe instrumented configuration passes check
passedand builds
passedthe instrumentation the library asks for reaches the link of the application
passedthe tests pass with the instrumentation on
passedhostile input is refused rather than crashing the instrumented build
passedthe deep configuration builds with the instrumentation too
passednesting past the raised limit is refused, not met with a stack overflow
ok apps/plot — 42 checks (42 passed, 0 failed, 0 known, 0 fixed)
statecheck
passedthe drawing package passes check
passedand builds
passedits pixel tests pass
passedthe default configuration of the shell builds
passedand so does the one that opens a window
passedthe system library the drawing package uses reaches the link of the shell
passedbut its headers do not, because the dependency was declared private
passedthe resolution is written to a lock file
passedand the lock names the package that was resolved
passedwith the mechanism that resolved it
passedthe configuration that opens no window does not need X11 at run time
passedthough it still needs the drawing library it actually uses
passedand the configuration that does open one needs X11
passedthe optional dependency is absent from the plan, not merely unused
passedonly the chosen shell is compiled
passedand choosing the other feature compiles the other one
passedthe default artifact says which shell it carries
passedand the windowed artifact says the other one
passeda package can declare which of its features are exclusive
passedand asking for both at once is refused
passedthe diagnostic says the other one came from default, which is the usual cause
passeddropping the defaults and asking for one builds
passedand exactly one shell is compiled, whichever way the flag goes
passedrendering to a file succeeds
passedthe file carries the size that was asked for
passedand the first pixel is exactly the background colour the header declares
passedthe body holds one pixel for each pixel of the canvas
passedthe windowed build runs against a real X server
passedand it gets as far as putting the image on the window
passedwithout a display it exits with a status of its own, not a signal
passedand it says what is missing rather than dying inside the library
passedwhile the other configuration renders with no display at all
passedthe instrumented configuration builds
passedand its tests pass
passedawkward sizes and values are refused or drawn, never crash the renderer
passedthe windowed configuration builds instrumented too
passedand opening a real window under instrumentation reports nothing
passedthe image handed to the server is not read past its own buffer
passeda second build of the same configuration runs nothing
passedediting the drawing source recompiles it
passedand the shell is linked again
passedwhile its neighbour is left alone
ok apps/vision — 32 checks (32 passed, 0 failed, 0 known, 0 fixed)
statecheck
passedthe drawing package passes check
passedand builds
passedthe C consumer builds against it
passedevery library a large pkg-config package names reaches the link
passedin the order the package gave them, which is what a static link reads
passedand without repeating any of them
passeda second system dependency lands on the same link line
passedthe consumer's translation never sees the image library's headers
passedonly the one public include directory reaches it
passedthe C++ library declares the C ABI boundary, so a C consumer may differ
passedand the link runs through the C++ driver although the consumer is C
passedthe C consumer is compiled to the C standard it declared
passedwhile the C++ library is compiled to its own
passedthe artifact needs the graphics library at run time
passedand the parts of the image library it actually calls
passedthough far fewer than the flags it was given, because the linker drops the rest
passeda blank render leaves the corner exactly the declared background colour
passedand nothing on it is bright
passeddrawing a triangle marks some of the image but not all of it
passedand the corner stays background, because a triangle does not reach it
passedthe size asked for is the size rendered
passedraising the threshold never counts more pixels, so the count is really measured
passedthe library's own cases all pass
passedthe instrumented configuration builds
passedand the library's cases pass under it
passedthe same binary reports leaks when the suppressions the manifest named are withheld
passedand what it suppresses is one named library, not leak detection itself
passedawkward sizes and thresholds are refused or rendered, never crash
passeda second build of the consumer runs nothing
passedediting the analysis source recompiles it
passedand leaves the drawing source alone, though both use the same big library
passedwhile the consumer is linked again
ok apps/winapp — 38 checks (38 passed, 0 failed, 0 known, 0 fixed)
statecheck
passedthe package passes check
passedit builds for the host
passedand its cases pass there
passedthe host build reports the host's line ending and separator
passedthe same package builds for Windows
passedthe Windows implementation is the one translated, and only it
passedwhile the portable source is shared, not duplicated per target
passedand the compiler is the one the triple's toolchain table named
passedthe Windows build really produces an executable
passedthe artifact dowel names is the file that was written
passedand the suffix follows the target, so the host build keeps none
passedrun under wine by hand, the Windows build reports CRLF
passedand the Windows path separator
passedand a value only the Win32 API could have given it
passeda path mixing both separators is split the way Windows splits it
passedand a bare LF is normalised to the Windows line ending
passedand a Windows target can be tested through its runner
passedwith each declared case launched in its own right
passeda manifest may name cl as the compiler for the MSVC triple
passedan MSVC toolchain can be declared, not just named
passedwithout asking for a dependency record in a spelling that means the dynamic CRT there
passedusing the spelling that does mean it under this style
passedand the link runs through a separate program, as that toolchain has it
passedwith the object and output spellings that toolchain writes
passedwhile the GNU family still gets the spelling that is correct for it
passeda manifest can select sources by the target's operating system
passedand that key has a finite domain, so a match on it is checked for exhaustiveness
passedwhich is how this application actually spells the choice
passedand it selects the Windows implementation when the target is Windows
passedwhile host.os still means the build machine, so the pair is complete
passedthe two targets keep separate build directories
passedand what the Windows directory holds is a Windows executable
passedwhile the host directory holds an ELF one, from the same sources
passeda second Windows build runs nothing
passedwhile a second host build of the same tree runs nothing
passedediting the Windows implementation recompiles it
passedand leaves the portable source alone
passedand the host build is untouched by it, because it never used that source
ok projects/docs — 9 checks (9 passed, 0 failed, 0 known, 0 fixed)
statecheck
passedevery relative link in the documentation resolves
passedthe project table in README.md matches projects/
passedthe application table in README.md matches apps/
passedthe documentation table in README.md matches docs/
passedcheck names quoted in the documentation exist
passedevery known_issue declaration names a finding that exists
passedthe index of docs/10-findings.md matches its sections
passedREADME embeds the history chart the publication branch generates
passedthe dowel revision quoted in the documentation matches dowel-ref

Growth

How the suite grew, run by run. The top plot is the total, split by where the checks live; the bottom grid is one plot per layer on a shared scale, so both the arrival of a layer and its size are visible. Every number here is also a row of the table below.

checks 1,867 35 runs · 2026-07-28 → 2026-09-02 · +1,773 since the first run Total checks, stacked by layer group projects/ apps/ docs 0 500 1,000 1,500 2,000 1,867 total projects/ 1,464 apps/ 394 2026-07-28 · 94 checks · projects/ 94, apps/ 0, docs 0 2026-07-28 · 94 checks · projects/ 94, apps/ 0, docs 0 2026-07-28 · 156 checks · projects/ 156, apps/ 0, docs 0 2026-07-28 · 163 checks · projects/ 156, apps/ 0, docs 7 2026-07-29 · 186 checks · projects/ 179, apps/ 0, docs 7 2026-07-29 · 316 checks · projects/ 309, apps/ 0, docs 7 2026-07-29 · 478 checks · projects/ 471, apps/ 0, docs 7 2026-07-29 · 544 checks · projects/ 537, apps/ 0, docs 7 2026-07-29 · 591 checks · projects/ 584, apps/ 0, docs 7 2026-07-29 · 608 checks · projects/ 601, apps/ 0, docs 7 2026-07-30 · 639 checks · projects/ 632, apps/ 0, docs 7 2026-07-30 · 674 checks · projects/ 667, apps/ 0, docs 7 2026-07-30 · 676 checks · projects/ 669, apps/ 0, docs 7 2026-07-30 · 728 checks · projects/ 721, apps/ 0, docs 7 2026-08-03 · 791 checks · projects/ 784, apps/ 0, docs 7 2026-08-03 · 827 checks · projects/ 820, apps/ 0, docs 7 2026-08-05 · 862 checks · projects/ 855, apps/ 0, docs 7 2026-08-05 · 919 checks · projects/ 855, apps/ 56, docs 8 2026-08-06 · 969 checks · projects/ 855, apps/ 106, docs 8 2026-08-07 · 1,053 checks · projects/ 855, apps/ 190, docs 8 2026-08-10 · 1,100 checks · projects/ 901, apps/ 191, docs 8 2026-08-10 · 1,145 checks · projects/ 943, apps/ 194, docs 8 2026-08-11 · 1,146 checks · projects/ 943, apps/ 194, docs 9 2026-08-11 · 1,216 checks · projects/ 951, apps/ 256, docs 9 2026-08-11 · 1,254 checks · projects/ 951, apps/ 294, docs 9 2026-08-11 · 1,277 checks · projects/ 959, apps/ 309, docs 9 2026-08-11 · 1,393 checks · projects/ 1059, apps/ 325, docs 9 2026-08-12 · 1,393 checks · projects/ 1059, apps/ 325, docs 9 2026-08-12 · 1,470 checks · projects/ 1111, apps/ 350, docs 9 2026-08-14 · 1,651 checks · projects/ 1292, apps/ 350, docs 9 2026-08-15 · 1,695 checks · projects/ 1292, apps/ 394, docs 9 2026-08-21 · 1,758 checks · projects/ 1355, apps/ 394, docs 9 2026-08-21 · 1,758 checks · projects/ 1355, apps/ 394, docs 9 2026-09-02 · 1,758 checks · projects/ 1355, apps/ 394, docs 9 2026-09-02 · 1,867 checks · projects/ 1464, apps/ 394, docs 9 Checks failing on purpose, regressions, and fixes 0 30 known 7 failed 0 (none yet) fixed 0 (none yet) 2026-07-28 · known 14, failed 0, fixed 0 2026-07-28 · known 14, failed 0, fixed 0 2026-07-28 · known 0, failed 0, fixed 0 2026-07-28 · known 0, failed 0, fixed 0 2026-07-29 · known 0, failed 0, fixed 0 2026-07-29 · known 12, failed 0, fixed 0 2026-07-29 · known 24, failed 0, fixed 0 2026-07-29 · known 4, failed 0, fixed 0 2026-07-29 · known 4, failed 0, fixed 0 2026-07-29 · known 4, failed 0, fixed 0 2026-07-30 · known 4, failed 0, fixed 0 2026-07-30 · known 4, failed 0, fixed 0 2026-07-30 · known 6, failed 0, fixed 0 2026-07-30 · known 6, failed 0, fixed 0 2026-08-03 · known 8, failed 0, fixed 0 2026-08-03 · known 10, failed 0, fixed 0 2026-08-05 · known 3, failed 0, fixed 0 2026-08-05 · known 6, failed 0, fixed 0 2026-08-06 · known 10, failed 0, fixed 0 2026-08-07 · known 16, failed 0, fixed 0 2026-08-10 · known 18, failed 0, fixed 0 2026-08-10 · known 5, failed 0, fixed 0 2026-08-11 · known 5, failed 0, fixed 0 2026-08-11 · known 14, failed 0, fixed 0 2026-08-11 · known 16, failed 0, fixed 0 2026-08-11 · known 1, failed 0, fixed 0 2026-08-11 · known 4, failed 0, fixed 0 2026-08-12 · known 4, failed 0, fixed 0 2026-08-12 · known 6, failed 0, fixed 0 2026-08-14 · known 11, failed 0, fixed 0 2026-08-15 · known 11, failed 0, fixed 0 2026-08-21 · known 2, failed 0, fixed 0 2026-08-21 · known 2, failed 0, fixed 0 2026-09-02 · known 2, failed 0, fixed 0 2026-09-02 · known 7, failed 0, fixed 0 2026-07-28 2026-07-29 2026-08-05 2026-08-11 2026-09-02 One point per run, oldest first. Both plots above share this axis. Each layer on the same scale — when it appeared, and how it grew 01-minimal: 10 checks now, first seen 2026-07-28 01-minimal 10 02-config: 34 checks now, first seen 2026-07-28 02-config 34 03-features: 17 checks now, first seen 2026-07-28 03-features 17 04-diagnostics: 94 checks now, first seen 2026-07-28 04-diagnostics 94 05-incremental: 49 checks now, first seen 2026-07-28 05-incremental 49 06-runner: 40 checks now, first seen 2026-07-29 06-runner 40 07-robustness: 145 checks now, first seen 2026-07-29 07-robustness 145 08-lsp: 110 checks now, first seen 2026-07-29 08-lsp 110 09-acquisition: 121 checks now, first seen 2026-07-29 09-acquisition 121 10-toolchain: 53 checks now, first seen 2026-07-29 10-toolchain 53 11-cross: 17 checks now, first seen 2026-07-29 11-cross 17 12-store: 43 checks now, first seen 2026-07-29 12-store 43 13-parallel: 18 checks now, first seen 2026-07-29 13-parallel 18 14-scale: 17 checks now, first seen 2026-07-29 14-scale 17 15-cpp: 70 checks now, first seen 2026-07-30 15-cpp 70 16-migrate: 87 checks now, first seen 2026-07-30 16-migrate 87 17-deps: 83 checks now, first seen 2026-08-03 17-deps 83 18-tools: 33 checks now, first seen 2026-08-03 18-tools 33 19-artifacts: 35 checks now, first seen 2026-08-05 19-artifacts 35 20-cases: 62 checks now, first seen 2026-08-10 20-cases 62 21-debug: 32 checks now, first seen 2026-08-10 21-debug 32 22-bench: 34 checks now, first seen 2026-08-11 22-bench 34 23-probe: 23 checks now, first seen 2026-08-11 23-probe 23 24-install: 55 checks now, first seen 2026-08-14 24-install 55 25-asm: 53 checks now, first seen 2026-08-14 25-asm 53 26-prebuilt: 28 checks now, first seen 2026-08-14 26-prebuilt 28 27-generate: 61 checks now, first seen 2026-09-02 27-generate 61 28-progress: 19 checks now, first seen 2026-09-02 28-progress 19 29-tool-identity: 21 checks now, first seen 2026-09-02 29-tool-identity 21 blink: 59 checks now, first seen 2026-08-06 blink 59 dsp: 60 checks now, first seen 2026-08-11 dsp 60 hashx: 88 checks now, first seen 2026-08-07 hashx 88 httpd: 36 checks now, first seen 2026-08-05 httpd 36 jsonfmt: 39 checks now, first seen 2026-08-05 jsonfmt 39 plot: 42 checks now, first seen 2026-08-07 plot 42 vision: 32 checks now, first seen 2026-08-11 vision 32 winapp: 38 checks now, first seen 2026-08-11 winapp 38 docs: 9 checks now, first seen 2026-07-28 docs 9 Same vertical scale everywhere: 0 to 150 checks. Generated by CI from history.json on the publication branch. The same numbers, run by run, are in the History table. checks 1,867 35 runs · 2026-07-28 → 2026-09-02 · +1,773 since the first run Total checks, stacked by layer group projects/ apps/ docs 0 500 1,000 1,500 2,000 1,867 total projects/ 1,464 apps/ 394 2026-07-28 · 94 checks · projects/ 94, apps/ 0, docs 0 2026-07-28 · 94 checks · projects/ 94, apps/ 0, docs 0 2026-07-28 · 156 checks · projects/ 156, apps/ 0, docs 0 2026-07-28 · 163 checks · projects/ 156, apps/ 0, docs 7 2026-07-29 · 186 checks · projects/ 179, apps/ 0, docs 7 2026-07-29 · 316 checks · projects/ 309, apps/ 0, docs 7 2026-07-29 · 478 checks · projects/ 471, apps/ 0, docs 7 2026-07-29 · 544 checks · projects/ 537, apps/ 0, docs 7 2026-07-29 · 591 checks · projects/ 584, apps/ 0, docs 7 2026-07-29 · 608 checks · projects/ 601, apps/ 0, docs 7 2026-07-30 · 639 checks · projects/ 632, apps/ 0, docs 7 2026-07-30 · 674 checks · projects/ 667, apps/ 0, docs 7 2026-07-30 · 676 checks · projects/ 669, apps/ 0, docs 7 2026-07-30 · 728 checks · projects/ 721, apps/ 0, docs 7 2026-08-03 · 791 checks · projects/ 784, apps/ 0, docs 7 2026-08-03 · 827 checks · projects/ 820, apps/ 0, docs 7 2026-08-05 · 862 checks · projects/ 855, apps/ 0, docs 7 2026-08-05 · 919 checks · projects/ 855, apps/ 56, docs 8 2026-08-06 · 969 checks · projects/ 855, apps/ 106, docs 8 2026-08-07 · 1,053 checks · projects/ 855, apps/ 190, docs 8 2026-08-10 · 1,100 checks · projects/ 901, apps/ 191, docs 8 2026-08-10 · 1,145 checks · projects/ 943, apps/ 194, docs 8 2026-08-11 · 1,146 checks · projects/ 943, apps/ 194, docs 9 2026-08-11 · 1,216 checks · projects/ 951, apps/ 256, docs 9 2026-08-11 · 1,254 checks · projects/ 951, apps/ 294, docs 9 2026-08-11 · 1,277 checks · projects/ 959, apps/ 309, docs 9 2026-08-11 · 1,393 checks · projects/ 1059, apps/ 325, docs 9 2026-08-12 · 1,393 checks · projects/ 1059, apps/ 325, docs 9 2026-08-12 · 1,470 checks · projects/ 1111, apps/ 350, docs 9 2026-08-14 · 1,651 checks · projects/ 1292, apps/ 350, docs 9 2026-08-15 · 1,695 checks · projects/ 1292, apps/ 394, docs 9 2026-08-21 · 1,758 checks · projects/ 1355, apps/ 394, docs 9 2026-08-21 · 1,758 checks · projects/ 1355, apps/ 394, docs 9 2026-09-02 · 1,758 checks · projects/ 1355, apps/ 394, docs 9 2026-09-02 · 1,867 checks · projects/ 1464, apps/ 394, docs 9 Checks failing on purpose, regressions, and fixes 0 30 known 7 failed 0 (none yet) fixed 0 (none yet) 2026-07-28 · known 14, failed 0, fixed 0 2026-07-28 · known 14, failed 0, fixed 0 2026-07-28 · known 0, failed 0, fixed 0 2026-07-28 · known 0, failed 0, fixed 0 2026-07-29 · known 0, failed 0, fixed 0 2026-07-29 · known 12, failed 0, fixed 0 2026-07-29 · known 24, failed 0, fixed 0 2026-07-29 · known 4, failed 0, fixed 0 2026-07-29 · known 4, failed 0, fixed 0 2026-07-29 · known 4, failed 0, fixed 0 2026-07-30 · known 4, failed 0, fixed 0 2026-07-30 · known 4, failed 0, fixed 0 2026-07-30 · known 6, failed 0, fixed 0 2026-07-30 · known 6, failed 0, fixed 0 2026-08-03 · known 8, failed 0, fixed 0 2026-08-03 · known 10, failed 0, fixed 0 2026-08-05 · known 3, failed 0, fixed 0 2026-08-05 · known 6, failed 0, fixed 0 2026-08-06 · known 10, failed 0, fixed 0 2026-08-07 · known 16, failed 0, fixed 0 2026-08-10 · known 18, failed 0, fixed 0 2026-08-10 · known 5, failed 0, fixed 0 2026-08-11 · known 5, failed 0, fixed 0 2026-08-11 · known 14, failed 0, fixed 0 2026-08-11 · known 16, failed 0, fixed 0 2026-08-11 · known 1, failed 0, fixed 0 2026-08-11 · known 4, failed 0, fixed 0 2026-08-12 · known 4, failed 0, fixed 0 2026-08-12 · known 6, failed 0, fixed 0 2026-08-14 · known 11, failed 0, fixed 0 2026-08-15 · known 11, failed 0, fixed 0 2026-08-21 · known 2, failed 0, fixed 0 2026-08-21 · known 2, failed 0, fixed 0 2026-09-02 · known 2, failed 0, fixed 0 2026-09-02 · known 7, failed 0, fixed 0 2026-07-28 2026-07-29 2026-08-05 2026-08-11 2026-09-02 One point per run, oldest first. Both plots above share this axis. Each layer on the same scale — when it appeared, and how it grew 01-minimal: 10 checks now, first seen 2026-07-28 01-minimal 10 02-config: 34 checks now, first seen 2026-07-28 02-config 34 03-features: 17 checks now, first seen 2026-07-28 03-features 17 04-diagnostics: 94 checks now, first seen 2026-07-28 04-diagnostics 94 05-incremental: 49 checks now, first seen 2026-07-28 05-incremental 49 06-runner: 40 checks now, first seen 2026-07-29 06-runner 40 07-robustness: 145 checks now, first seen 2026-07-29 07-robustness 145 08-lsp: 110 checks now, first seen 2026-07-29 08-lsp 110 09-acquisition: 121 checks now, first seen 2026-07-29 09-acquisition 121 10-toolchain: 53 checks now, first seen 2026-07-29 10-toolchain 53 11-cross: 17 checks now, first seen 2026-07-29 11-cross 17 12-store: 43 checks now, first seen 2026-07-29 12-store 43 13-parallel: 18 checks now, first seen 2026-07-29 13-parallel 18 14-scale: 17 checks now, first seen 2026-07-29 14-scale 17 15-cpp: 70 checks now, first seen 2026-07-30 15-cpp 70 16-migrate: 87 checks now, first seen 2026-07-30 16-migrate 87 17-deps: 83 checks now, first seen 2026-08-03 17-deps 83 18-tools: 33 checks now, first seen 2026-08-03 18-tools 33 19-artifacts: 35 checks now, first seen 2026-08-05 19-artifacts 35 20-cases: 62 checks now, first seen 2026-08-10 20-cases 62 21-debug: 32 checks now, first seen 2026-08-10 21-debug 32 22-bench: 34 checks now, first seen 2026-08-11 22-bench 34 23-probe: 23 checks now, first seen 2026-08-11 23-probe 23 24-install: 55 checks now, first seen 2026-08-14 24-install 55 25-asm: 53 checks now, first seen 2026-08-14 25-asm 53 26-prebuilt: 28 checks now, first seen 2026-08-14 26-prebuilt 28 27-generate: 61 checks now, first seen 2026-09-02 27-generate 61 28-progress: 19 checks now, first seen 2026-09-02 28-progress 19 29-tool-identity: 21 checks now, first seen 2026-09-02 29-tool-identity 21 blink: 59 checks now, first seen 2026-08-06 blink 59 dsp: 60 checks now, first seen 2026-08-11 dsp 60 hashx: 88 checks now, first seen 2026-08-07 hashx 88 httpd: 36 checks now, first seen 2026-08-05 httpd 36 jsonfmt: 39 checks now, first seen 2026-08-05 jsonfmt 39 plot: 42 checks now, first seen 2026-08-07 plot 42 vision: 32 checks now, first seen 2026-08-11 vision 32 winapp: 38 checks now, first seen 2026-08-11 winapp 38 docs: 9 checks now, first seen 2026-07-28 docs 9 Same vertical scale everywhere: 0 to 150 checks. Generated by CI from history.json on the publication branch. The same numbers, run by run, are in the History table.

History

Each cell is passed / failed / known / fixed for that project. A dash means the project did not exist at that point.

runstatebranchcommitdowel01-minimal02-config03-features04-diagnostics05-incremental06-runner07-robustness08-lsp09-acquisition10-toolchain11-cross12-store13-parallel14-scale15-cpp16-migrate17-deps18-tools19-artifacts20-cases21-debug22-bench23-probe24-install25-asm26-prebuilt27-generate28-progress29-tool-identityblinkdocsdsphashxhttpdjsonfmtplotvisionwinapptotal
2026-09-02T16:25:11Zokmain316882ed4e117512e7639fc710/0/0/034/0/0/017/0/0/094/0/0/049/0/0/040/0/0/0145/0/0/0110/0/0/0120/0/1/053/0/0/017/0/0/043/0/0/018/0/0/017/0/0/070/0/0/087/0/0/083/0/0/033/0/0/035/0/0/062/0/0/032/0/0/034/0/0/023/0/0/055/0/0/053/0/0/028/0/0/055/0/6/019/0/0/021/0/0/059/0/0/09/0/0/060/0/0/088/0/0/036/0/0/039/0/0/042/0/0/032/0/0/038/0/0/01867
2026-09-02T13:11:50Zokmain71f7513b7f8ff65fe20a974f10/0/0/034/0/0/017/0/0/094/0/0/049/0/0/040/0/0/0145/0/0/0110/0/0/0120/0/1/053/0/0/017/0/0/043/0/0/018/0/0/017/0/0/070/0/0/087/0/0/083/0/0/032/0/0/035/0/0/062/0/0/032/0/0/034/0/0/023/0/0/048/0/0/052/0/1/028/0/0/0———59/0/0/09/0/0/060/0/0/088/0/0/036/0/0/039/0/0/042/0/0/032/0/0/038/0/0/01758
2026-08-21T08:04:45Zokmain0bcb1ba979f2f65fe20a974f10/0/0/034/0/0/017/0/0/094/0/0/049/0/0/040/0/0/0145/0/0/0110/0/0/0120/0/1/053/0/0/017/0/0/043/0/0/018/0/0/017/0/0/070/0/0/087/0/0/083/0/0/032/0/0/035/0/0/062/0/0/032/0/0/034/0/0/023/0/0/048/0/0/052/0/1/028/0/0/0———59/0/0/09/0/0/060/0/0/088/0/0/036/0/0/039/0/0/042/0/0/032/0/0/038/0/0/01758
2026-08-21T04:17:16Zokmaincf71c393760ef65fe20a974f10/0/0/034/0/0/017/0/0/094/0/0/049/0/0/040/0/0/0145/0/0/0110/0/0/0120/0/1/053/0/0/017/0/0/043/0/0/018/0/0/017/0/0/070/0/0/087/0/0/083/0/0/032/0/0/035/0/0/062/0/0/032/0/0/034/0/0/023/0/0/048/0/0/052/0/1/028/0/0/0———59/0/0/09/0/0/060/0/0/088/0/0/036/0/0/039/0/0/042/0/0/032/0/0/038/0/0/01758
2026-08-15T05:08:39Zokmaincc126d0cde3d0511d5e048bc10/0/0/034/0/0/017/0/0/094/0/0/049/0/0/034/0/2/0145/0/0/0110/0/0/0107/0/1/050/0/2/017/0/0/043/0/0/018/0/0/017/0/0/070/0/0/072/0/0/083/0/0/032/0/0/035/0/0/062/0/0/032/0/0/034/0/0/023/0/0/044/0/2/023/0/3/026/0/1/0———59/0/0/09/0/0/060/0/0/088/0/0/036/0/0/039/0/0/042/0/0/032/0/0/038/0/0/01695
2026-08-14T02:10:27Zokmain44b9e82bb3720511d5e048bc10/0/0/034/0/0/017/0/0/094/0/0/049/0/0/034/0/2/0145/0/0/0110/0/0/0107/0/1/050/0/2/017/0/0/043/0/0/018/0/0/017/0/0/070/0/0/072/0/0/083/0/0/032/0/0/035/0/0/062/0/0/032/0/0/034/0/0/023/0/0/044/0/2/023/0/3/026/0/1/0———48/0/0/09/0/0/047/0/0/068/0/0/036/0/0/039/0/0/042/0/0/032/0/0/038/0/0/01651
2026-08-12T07:20:11Zokmain6bdf4c361082c1540974ad0210/0/0/034/0/0/017/0/0/080/0/1/049/0/0/017/0/0/0145/0/0/0110/0/0/091/0/4/031/0/0/017/0/0/043/0/0/018/0/0/017/0/0/070/0/0/072/0/0/067/0/0/032/0/0/035/0/0/062/0/0/032/0/0/034/0/0/023/0/0/0——————47/0/1/09/0/0/047/0/0/068/0/0/036/0/0/039/0/0/042/0/0/032/0/0/038/0/0/01470
2026-08-12T00:12:39Zokmaine30f8961283498589323fbb610/0/0/034/0/0/017/0/0/075/0/0/049/0/0/017/0/0/0145/0/0/0110/0/0/066/0/1/031/0/0/017/0/0/029/0/0/018/0/0/017/0/0/070/0/0/066/0/2/067/0/0/032/0/0/035/0/0/062/0/0/032/0/0/034/0/0/023/0/0/0——————39/0/0/09/0/0/042/0/0/056/0/1/036/0/0/039/0/0/042/0/0/032/0/0/038/0/0/01393
2026-08-11T23:51:50Zokmain11d5f9f074a698589323fbb610/0/0/034/0/0/017/0/0/075/0/0/049/0/0/017/0/0/0145/0/0/0110/0/0/066/0/1/031/0/0/017/0/0/029/0/0/018/0/0/017/0/0/070/0/0/066/0/2/067/0/0/032/0/0/035/0/0/062/0/0/032/0/0/034/0/0/023/0/0/0——————39/0/0/09/0/0/042/0/0/056/0/1/036/0/0/039/0/0/042/0/0/032/0/0/038/0/0/01393
2026-08-11T14:53:32Zokmaina2af59ce850498589323fbb610/0/0/021/0/0/017/0/0/075/0/0/049/0/0/017/0/0/0145/0/0/0110/0/0/066/0/1/031/0/0/017/0/0/029/0/0/018/0/0/017/0/0/070/0/0/054/0/0/051/0/0/032/0/0/035/0/0/062/0/0/032/0/0/0————————39/0/0/09/0/0/042/0/0/041/0/0/036/0/0/039/0/0/042/0/0/032/0/0/038/0/0/01277
2026-08-11T10:00:09Zokmain78c5d1a0fd71e12bac762dfd10/0/0/021/0/0/017/0/0/070/0/4/048/0/0/017/0/0/0145/0/0/0110/0/0/066/0/1/031/0/0/017/0/0/029/0/0/018/0/0/017/0/0/070/0/0/054/0/0/051/0/0/032/0/0/035/0/0/059/0/1/026/0/2/0————————37/0/1/09/0/0/036/0/2/041/0/0/036/0/0/037/0/0/042/0/0/032/0/0/025/0/5/01254
2026-08-11T02:45:33Zokmaine0afaf9fb4a3e12bac762dfd10/0/0/021/0/0/017/0/0/070/0/4/048/0/0/017/0/0/0145/0/0/0110/0/0/066/0/1/031/0/0/017/0/0/029/0/0/018/0/0/017/0/0/070/0/0/054/0/0/051/0/0/032/0/0/035/0/0/059/0/1/026/0/2/0————————37/0/1/09/0/0/0—41/0/0/036/0/0/037/0/0/042/0/0/032/0/0/025/0/5/01216
2026-08-11T01:29:09Zokmainbc08c280c290e12bac762dfd10/0/0/021/0/0/017/0/0/066/0/0/048/0/0/017/0/0/0145/0/0/0110/0/0/066/0/1/031/0/0/017/0/0/029/0/0/018/0/0/017/0/0/070/0/0/054/0/0/051/0/0/032/0/0/035/0/0/059/0/1/026/0/2/0————————37/0/1/09/0/0/0—41/0/0/036/0/0/037/0/0/042/0/0/0——1146
2026-08-10T23:18:19Zokmain85f8b798a8d3e12bac762dfd10/0/0/021/0/0/017/0/0/066/0/0/048/0/0/017/0/0/0145/0/0/0110/0/0/066/0/1/031/0/0/017/0/0/029/0/0/018/0/0/017/0/0/070/0/0/054/0/0/051/0/0/032/0/0/035/0/0/059/0/1/026/0/2/0————————37/0/1/08/0/0/0—41/0/0/036/0/0/037/0/0/042/0/0/0——1145
2026-08-10T14:15:51Zokmain3751aa5f667217bd54e090b110/0/0/021/0/0/017/0/0/066/0/0/048/0/0/017/0/0/0145/0/0/0110/0/0/066/0/1/031/0/0/017/0/0/029/0/0/018/0/0/017/0/0/070/0/0/054/0/0/051/0/0/032/0/0/035/0/0/029/0/17/0—————————35/0/0/08/0/0/0—41/0/0/036/0/0/037/0/0/042/0/0/0——1100
2026-08-07T03:48:35Zokmain7660d8f3dc1aaf7d391f1e2210/0/0/021/0/0/017/0/0/066/0/0/048/0/0/017/0/0/0145/0/0/0110/0/0/066/0/1/031/0/0/017/0/0/029/0/0/018/0/0/017/0/0/070/0/0/054/0/0/051/0/0/031/0/1/034/0/1/0——————————32/0/4/08/0/0/0—34/0/4/036/0/1/034/0/3/041/0/1/0——1053
2026-08-06T12:30:58Zokmainfb4d394e090caf7d391f1e2210/0/0/021/0/0/017/0/0/066/0/0/048/0/0/017/0/0/0145/0/0/0110/0/0/066/0/1/031/0/0/017/0/0/029/0/0/018/0/0/017/0/0/070/0/0/054/0/0/051/0/0/031/0/1/034/0/1/0——————————32/0/4/08/0/0/0——33/0/0/034/0/3/0———969
2026-08-05T10:30:54Zokmaincf2888d5f0d9af7d391f1e2210/0/0/021/0/0/017/0/0/066/0/0/048/0/0/017/0/0/0145/0/0/0110/0/0/066/0/1/031/0/0/017/0/0/029/0/0/018/0/0/017/0/0/070/0/0/054/0/0/051/0/0/031/0/1/034/0/1/0———————————8/0/0/0——26/0/0/027/0/3/0———919
2026-08-05T03:57:00Zokmain878cdb8a2075af7d391f1e2210/0/0/021/0/0/017/0/0/066/0/0/048/0/0/017/0/0/0145/0/0/0110/0/0/066/0/1/031/0/0/017/0/0/029/0/0/018/0/0/017/0/0/070/0/0/054/0/0/051/0/0/031/0/1/034/0/1/0———————————7/0/0/0———————862
2026-08-03T03:54:38Zokmain8fb90df15f92a9c16191bb0f10/0/0/021/0/0/017/0/0/066/0/0/048/0/0/017/0/0/0145/0/0/0110/0/0/066/0/1/031/0/0/017/0/0/029/0/0/018/0/0/017/0/0/070/0/0/053/0/1/048/0/2/027/0/6/0————————————7/0/0/0———————827
2026-08-03T00:12:52Zokmain9bb5ceb209d12e99fc718f4510/0/0/021/0/0/017/0/0/066/0/0/048/0/0/017/0/0/0145/0/0/0110/0/0/066/0/1/031/0/0/017/0/0/029/0/0/018/0/0/017/0/0/070/0/2/046/0/3/048/0/2/0—————————————7/0/0/0———————791
2026-07-30T16:25:58Zokmain49808ac5de0a3e84cbdddb7210/0/0/021/0/0/017/0/0/066/0/0/048/0/0/017/0/0/0145/0/0/097/0/0/066/0/1/031/0/0/017/0/0/029/0/0/018/0/0/017/0/0/070/0/2/046/0/3/0——————————————7/0/0/0———————728
2026-07-30T03:58:37Zokmain314500155dc99ed13f48470310/0/0/021/0/0/017/0/0/066/0/0/047/0/1/017/0/0/0145/0/0/097/0/0/066/0/1/031/0/0/012/0/2/029/0/0/018/0/0/017/0/0/070/0/2/0———————————————7/0/0/0———————676
2026-07-30T03:44:54Zokmain4546a243874a9ed13f48470310/0/0/021/0/0/017/0/0/066/0/0/047/0/1/017/0/0/0145/0/0/097/0/0/066/0/1/031/0/0/012/0/2/029/0/0/018/0/0/017/0/0/070/0/0/0———————————————7/0/0/0———————674
2026-07-30T00:26:10Zokmain658861eadf3a9ed13f48470310/0/0/021/0/0/017/0/0/066/0/0/047/0/1/017/0/0/0145/0/0/097/0/0/066/0/1/031/0/0/012/0/2/029/0/0/018/0/0/017/0/0/035/0/0/0———————————————7/0/0/0———————639
2026-07-29T16:10:49Zokmainc77f4253144a95daf9ff8dac10/0/0/021/0/0/017/0/0/070/0/0/047/0/1/017/0/0/0145/0/0/097/0/0/066/0/1/031/0/0/012/0/2/029/0/0/018/0/0/017/0/0/0————————————————7/0/0/0———————608
2026-07-29T15:59:52Zokmaina8de02c1ad5195daf9ff8dac10/0/0/021/0/0/017/0/0/070/0/0/047/0/1/017/0/0/0145/0/0/097/0/0/066/0/1/031/0/0/012/0/2/029/0/0/018/0/0/0—————————————————7/0/0/0———————591
2026-07-29T15:41:23Zokmain986b5f773b5b95daf9ff8dac10/0/0/021/0/0/017/0/0/070/0/0/047/0/1/017/0/0/0145/0/0/097/0/0/066/0/1/031/0/0/012/0/2/0———————————————————7/0/0/0———————544
2026-07-29T14:46:56Zokmainb1380dd21bfe19a4a409f6e810/0/0/021/0/0/017/0/0/070/0/0/044/0/0/017/0/0/0118/0/12/088/0/9/062/0/3/0—————————————————————7/0/0/0———————478
2026-07-29T12:49:06Zokmainf572f6c393f407f16ec59e4810/0/0/021/0/0/017/0/0/070/0/0/044/0/0/017/0/0/0118/0/12/0———————————————————————7/0/0/0———————316
2026-07-29T00:28:01Zokmain83dc45bb1fbd07f16ec59e4810/0/0/021/0/0/017/0/0/070/0/0/044/0/0/017/0/0/0————————————————————————7/0/0/0———————186
2026-07-28T14:57:38Zokmain0c03829f195107f16ec59e4810/0/0/021/0/0/017/0/0/064/0/0/044/0/0/0—————————————————————————7/0/0/0———————163
2026-07-28T14:45:50Zokmain23244295550f07f16ec59e4810/0/0/021/0/0/017/0/0/064/0/0/044/0/0/0—————————————————————————————————156
2026-07-28T13:32:14Zokmainb69cc8fe3796a8a59e7c70aa10/0/0/021/0/0/012/0/4/037/0/10/0——————————————————————————————————94
2026-07-28T13:10:49Zokmain8523cf675458a8a59e7c70aa10/0/0/021/0/0/012/0/4/037/0/10/0——————————————————————————————————94