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.
dowel · checked against af7d391f1e22 · dowel_examples · dowel-ref · docs/10-findings.md
Latest run
PASSED — 1053 checks: 1037 passed, 0 failed, 16 known, 0 fixed
7660d8f3dc1a 2026-08-07T03:48:35Z on main
| project | state | checks | passed | failed | known | fixed | time |
|---|---|---|---|---|---|---|---|
| projects/01-minimal | ok | 10 | 10 | 0 | 0 | 0 | 1.2s |
| projects/02-config | ok | 21 | 21 | 0 | 0 | 0 | 5.0s |
| projects/03-features | ok | 17 | 17 | 0 | 0 | 0 | 0.3s |
| projects/04-diagnostics | ok | 66 | 66 | 0 | 0 | 0 | 0.3s |
| projects/05-incremental | ok | 48 | 48 | 0 | 0 | 0 | 1.7s |
| projects/06-runner | ok | 17 | 17 | 0 | 0 | 0 | 0.4s |
| projects/07-robustness | ok | 145 | 145 | 0 | 0 | 0 | 1.3s |
| projects/08-lsp | ok | 110 | 110 | 0 | 0 | 0 | 12.7s |
| projects/09-acquisition | ok | 67 | 66 | 0 | 1 | 0 | 18.4s |
| projects/10-toolchain | ok | 31 | 31 | 0 | 0 | 0 | 4.6s |
| projects/11-cross | ok | 17 | 17 | 0 | 0 | 0 | 2.4s |
| projects/12-store | ok | 29 | 29 | 0 | 0 | 0 | 0.2s |
| projects/13-parallel | ok | 18 | 18 | 0 | 0 | 0 | 10.9s |
| projects/14-scale | ok | 17 | 17 | 0 | 0 | 0 | 6.1s |
| projects/15-cpp | ok | 70 | 70 | 0 | 0 | 0 | 7.4s |
| projects/16-migrate | ok | 54 | 54 | 0 | 0 | 0 | 1.6s |
| projects/17-deps | ok | 51 | 51 | 0 | 0 | 0 | 0.7s |
| projects/18-tools | ok | 32 | 31 | 0 | 1 | 0 | 0.5s |
| projects/19-artifacts | ok | 35 | 34 | 0 | 1 | 0 | 0.6s |
| apps/blink | ok | 36 | 32 | 0 | 4 | 0 | 2.9s |
| apps/hashx | ok | 38 | 34 | 0 | 4 | 0 | 1.5s |
| apps/httpd | ok | 37 | 36 | 0 | 1 | 0 | 5.3s |
| apps/jsonfmt | ok | 37 | 34 | 0 | 3 | 0 | 1.9s |
| apps/plot | ok | 42 | 41 | 0 | 1 | 0 | 2.1s |
| projects/docs | ok | 8 | 8 | 0 | 0 | 0 | 0.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)
| state | check |
|---|---|
| passed | hello: check passes |
| passed | hello: build passes |
| passed | hello: a second build runs nothing, across executors too |
| passed | the binary runs and prints hello |
| passed | the direct executor builds from scratch in 2 actions (1 compile, 1 link) |
| passed | the direct executor produces a working binary too |
| passed | release builds too |
| passed | debug and release get separate build directories |
| passed | nothing unexpected is written next to the manifest |
| passed | test succeeds when the package declares no test target |
ok projects/02-config — 21 checks (21 passed, 0 failed, 0 known, 0 fixed)
| state | check |
|---|---|
| passed | app: check passes |
| passed | app: build passes |
| passed | app: a second build runs nothing, across executors too |
| passed | debug: the arms chosen by match reach the compiler |
| passed | release builds too |
| passed | release: the public defines of a dependency switch as well |
| passed | each configuration gets its own build directory |
| passed | the default features can be turned off |
| passed | dropping when feature.trace drops the define with it |
| passed | enabled features appear in the build directory identifier |
| passed | the specialized defines reach the arguments of app |
| passed | the public defines of a dependency reach app |
| passed | private flags of a dependency never reach a dependent |
| passed | private defines of a dependency never reach a dependent |
| passed | private includes of a dependency never reach a dependent |
| passed | private flags still apply to the target's own compilation |
| passed | private includes still apply to the target's own compilation |
| passed | compile_commands.json carries the specialized defines |
| passed | probe: check passes |
| passed | probe: test passes |
| passed | probe: test passes in release too |
ok projects/03-features — 17 checks (17 passed, 0 failed, 0 known, 0 fixed)
README · app · json · missing-optional · undeclared · xml
| state | check |
|---|---|
| passed | app: check passes |
| passed | app: build passes |
| passed | app: a second build runs nothing, across executors too |
| passed | the default features bring the json edge in |
| passed | graph shows the json edge |
| passed | json and xml can both be enabled |
| passed | both edges appear |
| passed | the default features can be turned off |
| passed | when the edge goes, neither the public defines nor the headers arrive |
| passed | when the edge goes, the archive is not built either |
| passed | a dependency behind a disabled feature is absent from the graph |
| passed | a disabled optional dependency need not exist on disk |
| passed | an undeclared feature passed to --features is rejected |
| passed | an undeclared feature referenced from dowel.build is rejected |
| passed | an undeclared feature gets a suggestion |
| passed | json: builds on its own |
| passed | xml: builds on its own |
ok projects/04-diagnostics — 66 checks (66 passed, 0 failed, 0 known, 0 fixed)
README · cases/abi-mismatch/app · cases/abi-mismatch/lib · cases/dependency-cycle · cases/empty-glob · cases/incomplete-runner · cases/invalid-source · cases/merge-conflict/app · cases/merge-conflict/lib · cases/missing-field · cases/missing-manifest · cases/missing-toolchain · cases/non-exhaustive-match · cases/type-mismatch · cases/undeclared-dependency · cases/unknown-cfg-key · cases/unknown-feature · cases/unknown-function · cases/unknown-kind · cases/unknown-property · cases/unknown-target · cases/unresolved-path
| state | check |
|---|---|
| passed | check reports unknown-property |
| passed | check exits non-zero on unknown-property |
| passed | check reports unknown-kind |
| passed | check exits non-zero on unknown-kind |
| passed | check reports unknown-function |
| passed | check exits non-zero on unknown-function |
| passed | check reports unknown-cfg-key |
| passed | check exits non-zero on unknown-cfg-key |
| passed | check reports unknown-feature |
| passed | check exits non-zero on unknown-feature |
| passed | check reports non-exhaustive-match |
| passed | check exits non-zero on non-exhaustive-match |
| passed | check reports type-mismatch |
| passed | check exits non-zero on type-mismatch |
| passed | check reports undeclared-dependency |
| passed | check exits non-zero on undeclared-dependency |
| passed | check reports unknown-target |
| passed | check exits non-zero on unknown-target |
| passed | check reports dependency-cycle |
| passed | check exits non-zero on dependency-cycle |
| passed | check reports missing-manifest |
| passed | check exits non-zero on missing-manifest |
| passed | check reports missing-toolchain |
| passed | check exits non-zero on missing-toolchain |
| passed | check reports invalid-source |
| passed | check exits non-zero on invalid-source |
| passed | check reports unresolved-path |
| passed | check exits non-zero on unresolved-path |
| passed | check reports incomplete-runner |
| passed | check exits non-zero on incomplete-runner |
| passed | check reports missing-field |
| passed | check exits non-zero on missing-field |
| passed | check reports merge-conflict |
| passed | check exits non-zero on merge-conflict |
| passed | check reports abi-mismatch |
| passed | check exits non-zero on abi-mismatch |
| passed | check reports empty-glob |
| passed | build reports invalid-source as well |
| passed | build reports unresolved-path as well |
| passed | build reports empty-glob as well |
| passed | build exits non-zero on invalid-source |
| passed | build exits non-zero on unresolved-path |
| passed | a missing toolchain never reaches the shell |
| passed | unknown-property points at the offending source |
| passed | unknown-kind points at the offending source |
| passed | unknown-function points at the offending source |
| passed | unknown-cfg-key points at the offending source |
| passed | unknown-feature points at the offending source |
| passed | non-exhaustive-match points at the offending source |
| passed | type-mismatch points at the offending source |
| passed | undeclared-dependency points at the offending source |
| passed | unknown-target points at the offending source |
| passed | dependency-cycle points at the offending source |
| passed | missing-manifest points at the offending source |
| passed | missing-toolchain points at the offending source |
| passed | invalid-source points at the offending source |
| passed | unresolved-path points at the offending source |
| passed | incomplete-runner points at the offending source |
| passed | missing-field points at the offending source |
| passed | merge-conflict carries the location of both values |
| passed | merge-conflict renders the dependent side of the conflict too |
| passed | abi-mismatch carries the location of both values |
| passed | abi-mismatch renders the dependent side of the conflict too |
| passed | unknown-property carries a suggestion |
| passed | the manifest still passes check after applying the suggestion |
| passed | applying the suggestion keeps the value intact |
ok projects/05-incremental — 48 checks (48 passed, 0 failed, 0 known, 0 fixed)
README · app · core · crossing
| state | check |
|---|---|
| passed | app: check passes |
| passed | a first build runs every action (5 compiles, 1 archive, 3 links) |
| passed | the binary runs |
| passed | a second build runs nothing |
| passed | editing one source rebuilds it and everything downstream |
| passed | the edited unit is recompiled |
| passed | the other unit of the same target is not |
| passed | a dependent's own sources are not recompiled |
| passed | the archive is rebuilt |
| passed | the dependent is relinked |
| passed | editing a dependent's source touches nothing in the dependency |
| passed | the dependency's archive is left alone |
| passed | editing a private header rebuilds through the depfile |
| passed | the unit that includes the private header is recompiled |
| passed | a unit of the same target that does not include it is not |
| passed | a private header never reaches a dependent |
| passed | nor a test that only uses the public header |
| passed | editing a public header rebuilds every dependent unit |
| passed | the dependency's own units are recompiled |
| passed | both of them |
| passed | and the dependent's unit as well |
| passed | and the tests |
| passed | touching a source without changing it still rebuilds (mtime judgement) |
| passed | touching the manifest without changing it rebuilds nothing |
| passed | adding only a comment to the manifest rebuilds nothing |
| passed | adding a flag recompiles the target it applies to |
| passed | the flag reaches the compile action |
| passed | and no further than the target that declares it |
| passed | adding a source compiles only the new one |
| passed | the new unit is compiled |
| passed | the existing units are not |
| passed | removing a source rebuilds the archive without compiling anything |
| passed | no compile action runs when only a source disappeared |
| passed | the first release build runs every action |
| passed | switching back to debug rebuilds nothing |
| passed | switching to release again rebuilds nothing |
| passed | core: both tests pass |
| passed | test exits non-zero when a test fails |
| passed | the summary counts both outcomes |
| passed | --failed reruns only what failed last time |
| passed | --failed leaves the passing test alone |
| passed | the repaired test passes under --failed |
| passed | --failed says so when nothing failed last time |
| passed | a full run passes again |
| passed | a header edit is seen after building with ninja then direct |
| passed | a header edit is seen after building with direct then ninja |
| passed | a header edit is seen after building with ninja then ninja |
| passed | a header edit is seen after building with direct then direct |
ok projects/06-runner — 17 checks (17 passed, 0 failed, 0 known, 0 fixed)
README · crossed · plain · transferred
| state | check |
|---|---|
| passed | the host triple needs no runner |
| passed | running for another triple without a runner is refused |
| passed | the refusal carries the missing-runner code |
| passed | the refusal happens before the artifact is started |
| passed | building for another triple still works |
| passed | a declared runner lets the tests run for another triple |
| passed | the runner receives its declared args then the artifact |
| passed | the runner starts in the package root |
| passed | the build directory is per target triple |
| passed | a failing test still fails when it runs through a runner |
| passed | the exit status passes through the runner unchanged |
| passed | a runner that transfers the artifact works |
| passed | transfer gets the local path and the destination appended |
| passed | host prefixes the destination as ADR-0008 specifies |
| passed | the launch command gets the remote path, not the local one |
| passed | the artifact really arrives at the destination |
| passed | the manifest carries no placeholder for the transferred path |
ok projects/07-robustness — 145 checks (145 passed, 0 failed, 0 known, 0 fixed)
| state | check |
|---|---|
| passed | array-missing-comma does not abort dowel |
| passed | array-missing-comma is refused |
| passed | array-missing-comma is refused with a source location |
| passed | array-missing-comma is answered within the budget |
| passed | cmake-syntax does not abort dowel |
| passed | cmake-syntax is refused |
| passed | cmake-syntax is refused with a source location |
| passed | cmake-syntax is answered within the budget |
| passed | json-object does not abort dowel |
| passed | json-object is refused |
| passed | json-object is refused with a source location |
| passed | json-object is answered within the budget |
| passed | key-with-space does not abort dowel |
| passed | key-with-space is refused |
| passed | key-with-space is refused with a source location |
| passed | key-with-space is answered within the budget |
| passed | match-missing-comma does not abort dowel |
| passed | match-missing-comma is refused |
| passed | match-missing-comma is refused with a source location |
| passed | match-missing-comma is answered within the budget |
| passed | missing-equals does not abort dowel |
| passed | missing-equals is refused |
| passed | missing-equals is refused with a source location |
| passed | missing-equals is answered within the budget |
| passed | missing-value does not abort dowel |
| passed | missing-value is refused |
| passed | missing-value is refused with a source location |
| passed | missing-value is answered within the budget |
| passed | semicolon does not abort dowel |
| passed | semicolon is refused |
| passed | semicolon is refused with a source location |
| passed | semicolon is answered within the budget |
| passed | smart-quotes does not abort dowel |
| passed | smart-quotes is refused |
| passed | smart-quotes is refused with a source location |
| passed | smart-quotes is answered within the budget |
| passed | stray-brace does not abort dowel |
| passed | stray-brace is refused |
| passed | stray-brace is refused with a source location |
| passed | stray-brace is answered within the budget |
| passed | two-headers-one-line does not abort dowel |
| passed | two-headers-one-line is refused |
| passed | two-headers-one-line is refused with a source location |
| passed | two-headers-one-line is answered within the budget |
| passed | unclosed-block-comment does not abort dowel |
| passed | unclosed-block-comment is refused |
| passed | unclosed-block-comment is refused with a source location |
| passed | unclosed-block-comment is answered within the budget |
| passed | unclosed-bracket does not abort dowel |
| passed | unclosed-bracket is refused |
| passed | unclosed-bracket is refused with a source location |
| passed | unclosed-bracket is answered within the budget |
| passed | unclosed-header does not abort dowel |
| passed | unclosed-header is refused |
| passed | unclosed-header is refused with a source location |
| passed | unclosed-header is answered within the budget |
| passed | unclosed-inline-table does not abort dowel |
| passed | unclosed-inline-table is refused |
| passed | unclosed-inline-table is refused with a source location |
| passed | unclosed-inline-table is answered within the budget |
| passed | unclosed-paren does not abort dowel |
| passed | unclosed-paren is refused |
| passed | unclosed-paren is refused with a source location |
| passed | unclosed-paren is answered within the budget |
| passed | unterminated-string does not abort dowel |
| passed | unterminated-string is refused |
| passed | unterminated-string is refused with a source location |
| passed | unterminated-string is answered within the budget |
| passed | wrong-arrow does not abort dowel |
| passed | wrong-arrow is refused |
| passed | wrong-arrow is refused with a source location |
| passed | wrong-arrow is answered within the budget |
| passed | yaml-colon does not abort dowel |
| passed | yaml-colon is refused |
| passed | yaml-colon is refused with a source location |
| passed | yaml-colon is answered within the budget |
| passed | ok-block-comment does not abort dowel |
| passed | ok-block-comment is accepted |
| passed | ok-line-comment does not abort dowel |
| passed | ok-line-comment is accepted |
| passed | ok-single-quotes does not abort dowel |
| passed | ok-single-quotes is accepted |
| passed | ok-tab-indent does not abort dowel |
| passed | ok-tab-indent is accepted |
| passed | ok-trailing-comma does not abort dowel |
| passed | ok-trailing-comma is accepted |
| passed | CRLF line endings does not abort dowel |
| passed | CRLF line endings is accepted |
| passed | a UTF-8 BOM on dowel.build does not abort dowel |
| passed | a UTF-8 BOM on dowel.build is accepted |
| passed | a UTF-8 BOM on dowel.toml does not abort dowel |
| passed | a UTF-8 BOM on dowel.toml is accepted |
| passed | a BOM in the middle of a line does not abort dowel |
| passed | a BOM in the middle of a line is refused |
| passed | a BOM in the middle of a line is refused with a source location |
| passed | invalid UTF-8 bytes does not abort dowel |
| passed | invalid UTF-8 bytes is refused |
| passed | invalid UTF-8 bytes is refused with a source location |
| passed | a NUL byte does not abort dowel |
| passed | a NUL byte is refused |
| passed | a NUL byte is refused with a source location |
| passed | a 200k element list does not abort dowel |
| passed | a 200k element list is refused |
| passed | a 200k element list is refused with a source location |
| passed | a 200k element list is answered within the budget |
| passed | a 10MB string literal does not abort dowel |
| passed | a 10MB string literal is refused |
| passed | a 10MB string literal is refused with a source location |
| passed | a 10MB string literal is answered within the budget |
| passed | 200k comment lines does not abort dowel |
| passed | 200k comment lines is accepted |
| passed | 200k comment lines is answered within the budget |
| passed | 100k nested arrays does not abort dowel |
| passed | 100k nested arrays is refused |
| passed | 100k nested arrays is refused with a source location |
| passed | 100k nested arrays is answered within the budget |
| passed | 100k nested arrays is refused as nesting-too-deep |
| passed | 100k nested inline tables does not abort dowel |
| passed | 100k nested inline tables is refused |
| passed | 100k nested inline tables is refused with a source location |
| passed | 100k nested inline tables is answered within the budget |
| passed | 100k nested inline tables is refused as nesting-too-deep |
| passed | 50k nested calls does not abort dowel |
| passed | 50k nested calls is refused |
| passed | 50k nested calls is refused with a source location |
| passed | 50k nested calls is answered within the budget |
| passed | 50k nested calls is refused as nesting-too-deep |
| passed | 2k nested inline tables does not abort dowel |
| passed | 2k nested inline tables is answered within the budget |
| passed | nesting 63 deep is accepted |
| passed | nesting 100 deep is refused |
| passed | nesting 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 |
| passed | dowel.build being a directory does not abort dowel |
| passed | dowel.build being a directory is refused |
| passed | dowel.build being a directory is refused with a source location |
| passed | dowel.build being a symlink loop does not abort dowel |
| passed | dowel.build being a symlink loop is refused |
| passed | dowel.build being a symlink loop is refused with a source location |
| passed | three independent errors are reported in one run |
ok projects/08-lsp — 110 checks (110 passed, 0 failed, 0 known, 0 fixed)
| state | check |
|---|---|
| passed | initialize is answered |
| passed | the server advertises hover |
| passed | the server advertises document sync |
| passed | didOpen publishes diagnostics even when there are none |
| passed | a valid manifest publishes an empty list |
| passed | didChange republishes for the new text |
| passed | didSave does not upset the server |
| passed | didClose clears the diagnostics of that document |
| passed | reopening a closed document publishes again |
| passed | shutdown and exit end the process cleanly |
| passed | the server survives a body that is not JSON |
| passed | diagnostics still arrive after a body that is not JSON |
| passed | the server survives a JSON body that is not a request |
| passed | diagnostics still arrive after a JSON body that is not a request |
| passed | the server survives a body shorter than Content-Length says |
| passed | the server survives a body with no Content-Length |
| passed | the server survives a Content-Length that is not a number |
| passed | an unknown method is answered with method-not-found |
| passed | the server survives an unknown method |
| passed | a broken manifest yields at least one diagnostic |
| passed | the diagnostic carries the stable code |
| passed | the diagnostic names dowel as its source |
| passed | a parse error is reported as an error |
| passed | the diagnostic carries a range |
| passed | diagnostic lines are zero based |
| passed | the column of a diagnostic is in UTF-16 units after ASCII |
| passed | the column of a diagnostic is in UTF-16 units after a two byte character |
| passed | the column of a diagnostic is in UTF-16 units after a three byte character |
| passed | the column of a diagnostic is in UTF-16 units after an astral plane character |
| passed | a hover position is read in UTF-16 units after ASCII |
| passed | a hover position is read in UTF-16 units after a two byte character |
| passed | a hover position is read in UTF-16 units after a three byte character |
| passed | a hover position is read in UTF-16 units after an astral plane character |
| passed | dowel check still reports unterminated-string |
| passed | the language server reports unterminated-string as dowel check does |
| passed | dowel check still reports expected-token |
| passed | the language server reports expected-token as dowel check does |
| passed | dowel check still reports unknown-char |
| passed | the language server reports unknown-char as dowel check does |
| passed | dowel check still reports expected-value |
| passed | the language server reports expected-value as dowel check does |
| passed | dowel check still reports missing-newline |
| passed | the language server reports missing-newline as dowel check does |
| passed | dowel check still reports unterminated-comment |
| passed | the language server reports unterminated-comment as dowel check does |
| passed | dowel check still reports duplicate-table |
| passed | the language server reports duplicate-table as dowel check does |
| passed | dowel check still reports unknown-function |
| passed | the language server reports unknown-function as dowel check does |
| passed | dowel check still reports unknown-cfg-key |
| passed | the language server reports unknown-cfg-key as dowel check does |
| passed | dowel check still reports non-exhaustive-match |
| passed | the language server reports non-exhaustive-match as dowel check does |
| passed | dowel check still reports unknown-property |
| passed | the language server reports unknown-property as dowel check does |
| passed | dowel check still reports unknown-kind |
| passed | the language server reports unknown-kind as dowel check does |
| passed | dowel check still reports type-mismatch |
| passed | the language server reports type-mismatch as dowel check does |
| passed | dowel check still reports toplevel-entry |
| passed | the language server reports toplevel-entry as dowel check does |
| passed | dowel check still reports missing-field |
| passed | the language server reports missing-field as dowel check does |
| passed | dowel check still reports expression-in-strict-toml in dowel.toml |
| passed | the language server reports expression-in-strict-toml in dowel.toml |
| passed | dowel check still reports expected-token in dowel.toml |
| passed | the language server reports expected-token in dowel.toml |
| passed | dowel check still reports unterminated-string in dowel.toml |
| passed | the language server reports unterminated-string in dowel.toml |
| passed | dowel check still reports duplicate-key in dowel.toml |
| passed | the language server reports duplicate-key in dowel.toml |
| passed | dowel check still reports missing-table in dowel.toml |
| passed | the language server reports missing-table in dowel.toml |
| passed | dowel check still reports empty-glob |
| passed | the language server scans the file system for empty-glob |
| passed | dowel check still reports no-sources |
| passed | the language server scans the file system for no-sources |
| passed | dowel check still reports invalid-source |
| passed | the language server scans the file system for invalid-source |
| passed | dowel check still reports unresolved-path |
| passed | the language server scans the file system for unresolved-path |
| passed | dowel check still reports missing-toolchain |
| passed | the language server looks for the declared compiler too |
| passed | dowel check refuses an unresolvable system package |
| passed | the language server does not run pkg-config to resolve it |
| passed | opening a manifest never writes dowel.lock |
| passed | hover on a property gives its type and merge rule |
| passed | hover on includes gives union as its merge rule |
| passed | hover on a builtin gives its signature |
| passed | hover on a configuration key gives its domain |
| passed | hover on a table kind explains the kind |
| passed | hover on a target name names the target |
| passed | hover on a block explains the block |
| passed | hover answers for sources while a later line has a parse error |
| passed | hover answers for glob while a later line has a parse error |
| passed | hover answers for includes while a later line has a parse error |
| passed | hover on a blank line answers with no contents |
| passed | hover past the end of the file answers with no contents |
| passed | hover past the end of a line answers with no contents |
| passed | the server survives hover positions that are out of range |
| passed | hover on an unknown property answers with no contents |
| passed | the server survives a didChange nested 64 deep |
| passed | the server answers a didChange nested 64 deep |
| passed | the server survives a didChange nested 1000 deep |
| passed | the server answers a didChange nested 1000 deep |
| passed | the server survives a didChange nested 100000 deep |
| passed | the server answers a didChange nested 100000 deep |
| passed | a UTF-8 BOM in the buffer is not reported as an error |
| passed | CRLF in the buffer is not reported as an error |
| passed | the server survives non-ASCII paths in the buffer |
ok projects/09-acquisition — 67 checks (66 passed, 0 failed, 1 known, 0 fixed)
| state | check |
|---|---|
| passed | installing a revision from the upstream succeeds |
| passed | the resolved commit is written to stdout |
| passed | installing an already installed revision succeeds and says so |
| passed | an installed revision appears in the list |
| passed | the installed revision is laid out under versions/<sha>/bin |
| passed | run starts the requested revision without selecting it |
| passed | the shim can be created |
| passed | the shim is a link named dowel |
| passed | with no pin and no default, nothing is selected |
| passed | the shim refuses to run when nothing is selected |
| passed | setting a default succeeds |
| passed | the default is used where no pin file applies |
| passed | a pin file is used in the directory that holds it |
| passed | a pin file is found by walking up from a subdirectory |
| passed | the nearest pin file wins over one further up |
| passed | selection works with the upstream unreachable |
| passed | the shim runs with the upstream unreachable |
| passed | pinning an installed revision needs no network |
| passed | pin writes the resolved commit to the pin file |
| passed | pin records which specifier it resolved from |
| passed | a pin file holding `nightly` is refused |
| passed | a pin file holding `stable` is refused |
| passed | a pin file holding `main` is refused |
| passed | a pin file holding `branch:side` is refused |
| passed | a pin file holding `19a4a40` is refused |
| passed | refusing a hand written channel name points at dowelup pin |
| passed | a pinned revision that is not installed is refused |
| passed | refusing an uninstalled revision points at dowelup install |
| passed | a pin file without a trailing newline is read |
| passed | a pin file with CRLF is read |
| passed | surrounding spaces in a pin file are ignored |
| passed | an uppercase commit hash in a pin file is read |
| passed | a pin file with no commit hash is refused |
| known | a pin file with a UTF-8 BOM is read [F-011] |
| passed | a branch that exists resolves |
| passed | a tag that exists resolves |
| passed | a release number resolves to its tag |
| passed | stable resolves to the newest tag |
| passed | a dated nightly resolves |
| passed | a branch that does not exist is refused |
| passed | a tag that does not exist is refused |
| passed | a date before the first commit is refused |
| passed | a malformed date is refused |
| passed | a commit hash prefix that is too short is refused |
| passed | a branch specifier with no name is refused |
| passed | an unresolvable commit is refused |
| passed | a malformed specifier and an unresolvable one exit differently |
| passed | a full commit hash selects an installed revision |
| passed | a commit hash prefix selects an installed revision |
| passed | the specifier it was installed from selects it |
| passed | installing the same commit under another specifier succeeds |
| passed | a specifier that installed successfully can select |
| passed | the first specifier still selects after a second one is added |
| passed | the list shows every specifier the revision was installed from |
| passed | an unknown specifier is refused by the shim |
| passed | refusing an unknown specifier points at dowelup list |
| passed | a leading specifier overrides the pin file |
| passed | installing a revision that does not build fails |
| passed | a failed install leaves nothing under versions/ |
| passed | a failed install does not appear in the list |
| passed | a failed install keeps its checkout for inspection |
| passed | a revision whose install failed is not selectable |
| passed | uninstalling by the specifier it was installed from succeeds |
| passed | an uninstalled revision leaves the list |
| passed | uninstalling removes the directory under versions/ |
| passed | uninstalling the same revision twice is refused |
| passed | selecting an uninstalled revision is refused |
ok projects/10-toolchain — 31 checks (31 passed, 0 failed, 0 known, 0 fixed)
| state | check |
|---|---|
| passed | gcc: check passes |
| passed | gcc: build passes |
| passed | gcc: the declared toolchain is what gets invoked |
| passed | gcc: the artifact was translated by the declared compiler |
| passed | gcc: the artifact agrees with the declaration, checked in C |
| passed | clang: check passes |
| passed | clang: build passes |
| passed | clang: the declared toolchain is what gets invoked |
| passed | clang: the artifact was translated by the declared compiler |
| passed | clang: the artifact agrees with the declaration, checked in C |
| passed | match on tc.c picks the clang arm |
| passed | match on tc.c picks the gcc arm |
| passed | the clang arm actually compiles under clang |
| passed | the gcc arm actually compiles under gcc |
| passed | switching the toolchain rebuilds |
| passed | the rebuilt artifact is the one the new toolchain produced |
| passed | building again with the same toolchain runs nothing |
| passed | switching back rebuilds as well |
| passed | switching back gives the earlier compiler's artifact again |
| passed | gcc: a first build runs every action |
| passed | gcc: a second build runs nothing |
| passed | gcc: editing a header rebuilds through the depfile |
| passed | gcc: and settles again |
| passed | clang: a first build runs every action |
| passed | clang: a second build runs nothing |
| passed | clang: editing a header rebuilds through the depfile |
| passed | clang: and settles again |
| passed | a toolchain that does not exist is refused |
| passed | the refusal carries the missing-toolchain code |
| passed | the refusal points at the declaration |
| passed | the missing toolchain never reaches the shell |
ok projects/11-cross — 17 checks (17 passed, 0 failed, 0 known, 0 fixed)
| state | check |
|---|---|
| passed | the host build passes |
| passed | the host build produces a host artifact |
| passed | the host artifact names its own architecture |
| passed | the host tests pass |
| passed | the cross build passes |
| passed | the cross build produces an artifact for the target |
| passed | the cross tests run under the emulator and pass |
| passed | the host and cross build directories both survive |
| passed | a second cross build runs nothing |
| passed | the host build is not confused by the cross build |
| passed | and the cross build is still up to date afterwards |
| passed | building for a triple with no toolchain declared is refused |
| passed | the refusal carries the missing-toolchain code |
| passed | the mismatch is caught before anything is built |
| passed | the host build still needs no declaration |
| passed | declaring the host compiler for another triple is allowed |
| passed | and it produces a host artifact, which readelf shows plainly |
ok projects/12-store — 29 checks (29 passed, 0 failed, 0 known, 0 fixed)
| state | check |
|---|---|
| passed | the first run in a fresh tree stores and restores nothing |
| passed | the next process restores what the first one stored |
| passed | and stores nothing new when nothing changed |
| passed | a restored run still passes check |
| passed | a restored run still builds |
| passed | an untouched file is judged unchanged by its stat alone |
| passed | a touched file falls back to its content fingerprint |
| passed | a touched but unchanged file is still restored |
| passed | an edited file is judged changed |
| passed | an edited file is evaluated again and stored again |
| passed | a file whose evaluation produced diagnostics is not stored |
| passed | the diagnostic is reported on the first run |
| passed | and on the next process too, not only the first |
| passed | fixing the manifest clears the diagnostic in the next process |
| passed | a truncated value log does not change the answer |
| passed | an empty value log does not change the answer |
| passed | an index cut at a partial record does not change the answer |
| passed | an index full of noise does not change the answer |
| passed | a value log full of noise does not change the answer |
| passed | a missing index does not change the answer |
| passed | a missing value log does not change the answer |
| passed | a store written by an unknown format version does not change the answer |
| passed | the store recovers by itself after being corrupted |
| passed | cache info reports what the store holds |
| passed | cache info names the format version |
| passed | cache gc runs |
| passed | cache gc removes stores left by older formats |
| passed | cache gc keeps the store of the current format |
| passed | check still passes after gc |
ok projects/13-parallel — 18 checks (18 passed, 0 failed, 0 known, 0 fixed)
| state | check |
|---|---|
| passed | by default the tests do not overlap |
| passed | all 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 |
| passed | all of them pass when run in parallel |
| passed | --test-jobs=2 overlaps as well |
| passed | every test still runs when only two go at a time |
| passed | the report keeps the requested order under parallelism |
| passed | a failing test fails the run when sequential |
| passed | the sequential summary counts it once |
| passed | a failing test fails the run when parallel |
| passed | the parallel summary counts it the same |
| passed | the 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 |
| passed | the 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)
| state | check |
|---|---|
| passed | check passes on a package with 120 sources and 8 targets |
| passed | the first build runs one action per source, archive and link |
| passed | a second build runs nothing and accounts for every action |
| passed | editing one source of 120 rebuilds only it, the archive and the dependents |
| passed | editing one dependent rebuilds only that dependent |
| passed | editing the public header rebuilds everything that includes it |
| passed | adding one source compiles only the new one |
| passed | removing one source recompiles nothing and relinks the dependents |
| passed | the tests of the wide package still pass |
| passed | check passes through a 6 level dependency chain |
| passed | the first build of the chain runs every action |
| passed | a second build of the chain runs nothing |
| passed | editing the nearest level does not rebuild the whole chain |
| passed | editing the deepest header rebuilds only what includes it |
| passed | the chain still builds after the edits |
| passed | check on a large package stays far below the budget |
| passed | the plan phase is reported for a large package |
ok projects/15-cpp — 70 checks (70 passed, 0 failed, 0 known, 0 fixed)
README · capp · chain/deep · chain/mid · chain/topc · cpplib · cross/xapp · cross/xlib · exts · mixed · reverse/clib · reverse/cxxapp
| state | check |
|---|---|
| passed | a package of mixed extensions passes check |
| passed | a .cc source is compiled by the C++ driver |
| passed | a .cp source is compiled by the C++ driver |
| passed | a .cpp source is compiled by the C++ driver |
| passed | a .cxx source is compiled by the C++ driver |
| passed | a .c++ source is compiled by the C++ driver |
| passed | a .CPP source is compiled by the C++ driver |
| passed | a .C source is compiled by the C++ driver |
| passed | a .c source is still compiled by the C driver |
| passed | a C++ library passes check |
| passed | a C++ library builds |
| passed | the C++ source of the library uses the C++ driver |
| passed | a C binary that depends on a C++ library passes check |
| passed | its own source is compiled by the C driver |
| passed | but the link uses the C++ driver because a dependency is C++ |
| passed | the binary links and runs |
| passed | a C main gets the whole C++ runtime, not just the symbols |
| passed | running it exercises the standard library, exceptions and constructors |
| passed | a C test can call into the C++ library and pass |
| passed | the link never fails the way F-008 did |
| passed | a target holding both C and C++ sources passes check |
| passed | the C source of a mixed target uses the C driver |
| passed | the C++ source of a mixed target uses the C++ driver |
| passed | a mixed target links with the C++ driver |
| passed | the mixed binary agrees about which unit was compiled as what |
| passed | the mixed binary runs and its C and C++ halves both behave |
| passed | cxx defaults to c++ when nothing is declared |
| passed | a declared cxx is what gets invoked |
| passed | the library builds with the declared cxx |
| passed | match on tc.cxx follows the declaration |
| passed | and follows the default when nothing is declared |
| passed | a C++ package with a missing cxx is refused |
| passed | the refusal carries the missing-toolchain code |
| passed | the refusal points at the declaration |
| passed | the missing C++ compiler never reaches the shell |
| passed | a package with no C++ sources ignores a broken cxx declaration |
| passed | and still builds |
| passed | a chain of C packages over a C++ leaf passes check |
| passed | the C++ leaf of the chain uses the C++ driver |
| passed | the C layer between them uses the C driver |
| passed | and so does the root |
| passed | the root links with the C++ driver although its dependency is C |
| passed | the chain builds and its test passes |
| passed | the root binary runs through two C layers into C++ |
| passed | a C++ binary that depends on a C library passes check |
| passed | the C dependency uses the C driver |
| passed | the C++ binary uses the C++ driver |
| passed | the link uses the C++ driver in this direction too |
| passed | the C++ binary builds and runs |
| passed | a test target written in C++ builds and passes |
| passed | the mixed target builds from scratch |
| passed | and settles |
| passed | a depfile is written for the C++ translation unit too |
| passed | editing a header that only C++ reads rebuilds through the C++ depfile |
| passed | and the artifact reflects the new value |
| passed | editing a header that only C reads rebuilds through the C depfile |
| passed | and the artifact reflects that too |
| passed | g++ is used when it is declared |
| passed | the library builds with g++ |
| passed | clang++ is used when it is declared |
| passed | the library builds with clang++ |
| passed | the C and C++ compilers can come from different families |
| passed | the library builds with a mixed pair |
| passed | a cross C++ package passes check |
| passed | the cross C++ compiler is used for the C++ source |
| passed | the cross C compiler is used for the C source |
| passed | the cross link uses the cross C++ driver |
| passed | the cross C++ build produces an artifact |
| passed | the cross C++ artifact is built for the target architecture |
| passed | the cross C++ test runs under the emulator and passes |
ok projects/16-migrate — 54 checks (54 passed, 0 failed, 0 known, 0 fixed)
| state | check |
|---|---|
| passed | cmake writes a compile database for the reference build |
| passed | import drafts a manifest pair from the CMake File API |
| passed | import writes a package manifest |
| passed | import writes a build manifest |
| passed | the package manifest is marked as an unverified draft |
| passed | the build manifest is marked as an unverified draft |
| passed | import points at the verify step that checks its own output |
| passed | the package takes its name from the CMake project |
| passed | an executable becomes a bin target |
| passed | a static library becomes a lib target |
| passed | sources are listed one by one |
| passed | globbing is not used for the imported sources |
| passed | an in-project link becomes a target() dependency |
| passed | includes and defines land in a private block |
| passed | nothing is drafted as public |
| passed | the drafted manifests pass check |
| passed | the drafted manifests build |
| passed | the binary built from the draft runs and agrees with the CMake build |
| passed | import refuses to overwrite manifests that are already there |
| passed | the refusal leaves the existing manifest untouched |
| passed | the refusal says the manifests are already there |
| passed | a build directory with no File API reply is refused |
| passed | the refusal says how to produce the reply |
| passed | every buildable target kind is imported |
| passed | an object library becomes a lib target |
| passed | a shared library becomes a lib target too |
| passed | the draft says out loud that a shared library became a static one |
| passed | an interface library does not become a target of its own |
| passed | what an interface library handed to its users survives |
| passed | a system library becomes a link flag |
| passed | verify compares plans, so it needs no build of its own |
| passed | the compiler name, -c, -o and the -MD family are not differences |
| passed | -DA, -D A=1 and -DA=1 are the same define |
| passed | a relative include is resolved against the entry's directory |
| passed | the order of the arguments is not a difference |
| passed | a genuine difference is still reported |
| passed | the difference names both what the reference had and what dowel has |
| passed | a differing entry makes the comparison fail |
| passed | a file only dowel builds is counted apart, and does not fail |
| passed | a file the reference builds and dowel does not is counted as not ported |
| passed | the text form reports the same four buckets as the json form |
| passed | a reference that is not there is refused |
| passed | a reference that is not JSON is refused |
| passed | an empty reference is refused |
| passed | a release build directory is imported the same way |
| passed | the draft carries no optimization flag from the CMake build type |
| passed | the CMake build type does not become a define in the draft |
| passed | the draft carries no NDEBUG from a release CMake build type |
| passed | the drafted debug build of a debug import is unoptimized |
| passed | the drafted release build is actually optimized |
| passed | the drafted debug build keeps assertions |
| passed | the drafted release build of a release import is optimized |
| passed | the workflow that import prints verifies clean |
| passed | verify ignores the build type on both sides, so any pairing is clean |
ok projects/17-deps — 51 checks (51 passed, 0 failed, 0 known, 0 fixed)
README · app · chain/mid · chain/top · gated
| state | check |
|---|---|
| passed | a version dependency resolves through pkg-config |
| passed | the resolved module enters the graph as a package |
| passed | a package with a resolved system dependency builds |
| passed | the module's cflags and libs both reach the build |
| passed | the module's --cflags become compile flags |
| passed | the module's --libs become link flags |
| passed | a version equal to what the system has is satisfied |
| passed | a version below what the system has is satisfied |
| passed | a version above what the system has is refused |
| passed | the refusal carries the unsatisfied-dependency code |
| passed | the refusal names the constraint that was not met |
| passed | the refusal says the constraint is a minimum |
| passed | the refusal points at the declaration in dowel.toml |
| passed | the refusal spans the declaration, not the whole file |
| passed | a module the system does not have is refused |
| passed | an unknown module is refused with the same code as a version mismatch |
| passed | the refusal names path and git as the way out |
| passed | putting the module name back makes it resolve again |
| passed | a version dependency is refused when pkg-config cannot be run |
| passed | the refusal says that pkg-config itself could not be run |
| passed | the resolution is recorded in dowel.lock |
| passed | the lock records the version that was resolved, not the one declared |
| passed | the lock names where the resolution came from |
| passed | the lock says it detects a change rather than restoring one |
| passed | a second check with a matching lock passes |
| passed | a matching lock is left byte for byte alone |
| passed | a matching lock says nothing |
| passed | a lock that disagrees with the system warns |
| passed | the drift is a warning, not an error |
| passed | the warning names both the resolved version and the recorded one |
| passed | the warning says how to accept the new resolution |
| passed | a drifted lock does not fail the build |
| passed | a drifted lock is never rewritten on its own |
| passed | removing the entry lets the resolution be recorded again |
| passed | the freshly recorded entry holds what the system has |
| passed | and the drift warning is gone |
| passed | an unrelated entry does not disturb the check |
| passed | an unrelated entry in the lock is kept |
| passed | an inactive optional version dependency is not resolved at all |
| passed | an inactive optional version dependency is not recorded either |
| passed | enabling the feature resolves the optional module |
| passed | and then it is recorded |
| passed | a module with no link flags builds all the same |
| passed | the archive of a private system dependency reaches the final link |
| passed | keeping a system dependency private does not leak its includes |
| passed | the link flags of a private system dependency reach the final link |
| passed | a library that keeps a system dependency private still links its dependent |
| passed | and its includes are still not leaked to the dependent |
| passed | declaring the same dependency public does link |
| passed | a public system dependency puts its link flags on the final link |
| passed | but a public system dependency also hands its defines to the dependent |
ok projects/18-tools — 32 checks (31 passed, 0 failed, 1 known, 0 fixed)
README · cross · host · typo · vocab
| state | check |
|---|---|
| passed | the archiver defaults to ar when nothing is declared |
| passed | the C compiler defaults to cc, as it always has |
| passed | a declared archiver is the one that runs |
| passed | declaring the archiver leaves the compiler alone |
| passed | the package builds with the declared archiver |
| passed | match on tc.ar follows the declaration |
| passed | and falls to the default arm when nothing is declared |
| passed | a tc.* key that is not a declared tool is refused |
| passed | the refusal names the key that was written |
| passed | an archiver that is not on PATH is refused |
| passed | the refusal carries the missing-toolchain code |
| passed | the refusal says it is the archiver, not the compiler |
| passed | the missing archiver never reaches the shell |
| passed | a target that produces no archive ignores a broken archiver |
| passed | a rebuild with the same archiver runs nothing |
| passed | changing the declared archiver rebuilds |
| passed | the archive is what gets rebuilt |
| passed | the objects are not recompiled for a different archiver |
| passed | the record is the tool's name, so swapping what the name resolves to does not rebuild |
| passed | a cross build uses the archiver declared for that triple |
| passed | and the compiler declared for the same triple |
| passed | the host build still uses the host archiver |
| passed | the cross build passes check |
| passed | the cross build produces an archive |
| passed | the objects inside the cross archive are for the target architecture |
| passed | the cross binary links against that archive and runs under the emulator |
| passed | a misspelled toolchain key is refused |
| passed | the refusal suggests the tool that was meant |
| passed | the misspelled declaration is caught before anything is built |
| passed | spelling the key correctly does select the cross archiver |
| passed | a transform tool can be declared alongside the archiver |
| known | an inspection tool can be declared alongside the archiver [F-020] |
ok projects/19-artifacts — 35 checks (34 passed, 0 failed, 1 known, 0 fixed)
README · cross · firmware · library
| state | check |
|---|---|
| passed | a package with an artifacts block passes check |
| passed | and builds |
| passed | an artifacts entry produces its derived file |
| passed | a second entry produces a second file |
| passed | the artifact it derives from is still there |
| passed | the raw image is not an ELF, so the transform really ran |
| passed | the raw image carries what the source put in the artifact |
| passed | the hex image is in the format the second entry asked for |
| passed | the command is the tool, then the args, then the input and the output |
| passed | a declared objcopy that is not on PATH is refused |
| passed | the refusal carries the missing-toolchain code |
| passed | the refusal names the object copier |
| passed | a package with no artifacts block ignores a broken objcopy |
| passed | a tool outside the toolchain table is refused |
| passed | the refusal lists the tools that can be named |
| passed | the refusal says the concrete command comes from the toolchain |
| passed | an entry with no tool is refused |
| passed | an entry that is not a table is refused |
| passed | restoring the block makes it pass again |
| passed | a second build re-runs no transform |
| passed | editing the source re-makes the derived file |
| passed | changing the args re-makes the derived file |
| passed | and does not recompile anything |
| passed | a cross build transforms with the objcopy declared for that triple |
| passed | the artifacts block never names the cross tool itself |
| passed | the cross build produces its image |
| passed | the derived file of a cross build is produced too |
| passed | and the same manifest uses the host objcopy for a host build |
| passed | a library with an artifacts block builds on its own |
| passed | a standalone library produces its derived file |
| passed | adding a binary that uses it still builds |
| passed | the library archive is still produced as a dependency |
| known | a library keeps producing its derived file when a binary depends on it [F-022] |
| passed | naming the library explicitly builds it |
| passed | and then the derived file appears |
ok apps/blink — 36 checks (32 passed, 0 failed, 4 known, 0 fixed)
| state | check |
|---|---|
| passed | the bare-metal package passes check |
| passed | and builds |
| passed | the artifact needs no shared library at run time |
| passed | and carries no symbol from the standard library or its start-up |
| passed | the artifact is for the target architecture |
| passed | and its float ABI agrees with the hf in the triple |
| passed | the entry point is the reset handler, not a libc start-up routine |
| passed | the vector table survives into the artifact although nothing calls it |
| passed | leaving out --target is refused, but by the host compiler |
| passed | the message is about a flag, not about the package's targets |
| passed | and dowel emits no diagnostic of its own about the target |
| known | a package can say which targets it is for [F-026] |
| passed | a raw image is produced |
| passed | an Intel HEX is produced |
| passed | the raw image is no longer an ELF |
| passed | the hex image is in the format the entry asked for |
| passed | the image is made by the objcopy declared for the triple |
| passed | without a script the image is placed where the vector table cannot be |
| known | the firmware runs on emulated hardware [F-025] |
| passed | instead the processor locks up at reset, having read no vector table |
| known | a linker script inside the package can be named from the manifest [F-025] |
| passed | the linker says it cannot open the script, so the path never resolved |
| passed | the same script does work when named by an absolute path |
| passed | and then the image lands at the start of flash, where it can be programmed |
| passed | and the firmware runs on emulated hardware and its test passes |
| passed | the firmware reports through semihosting, so the result comes from the device |
| passed | the first word of the image is the initial stack pointer |
| passed | and the second is a reset handler inside flash |
| passed | the runner ends its args with -kernel, and dowel appends the artifact |
| known | a runner written into dowel.toml is not silently ignored [F-027] |
| passed | and the failure claims no runner is declared, though one is |
| passed | putting the runner back where it belongs makes the tests run again |
| passed | a second build changes nothing |
| passed | editing a peripheral source recompiles it |
| passed | and the image is derived again |
| passed | while its neighbour is left alone |
ok apps/hashx — 38 checks (34 passed, 0 failed, 4 known, 0 fixed)
README · ctool · cxxtool · lib
| state | check |
|---|---|
| passed | the library package passes check |
| passed | and builds |
| passed | its own tests pass |
| passed | the artifact is a static archive |
| passed | the C consumer builds against it |
| passed | the C++ consumer builds against it |
| passed | the archive exports exactly the names the header marks as the API |
| passed | and nothing outside the library's own prefix is exported |
| passed | an internal name that must cross translation units is hidden, not exported |
| passed | a new global added without the API mark does not join the exported face |
| passed | a consumer cannot include the library's internal header |
| passed | and removing it builds again |
| passed | the C consumer gets the known answer for the standard check value |
| passed | and the C++ consumer gets the same answer from the same archive |
| passed | the link of the C++ consumer runs through the C++ driver |
| known | a C++ consumer can declare its own abi label and still use a C library [F-028] |
| passed | instead the two labels are compared and the build is refused |
| passed | the refusal comes with a diagnostic code and both provenances |
| passed | writing the library's label into the consumer builds again |
| known | a dependency entry that names two sources is refused [F-029] |
| passed | instead the local path silently wins and the unreachable git source is never touched |
| known | the same holds when the two sources are a path and a version [F-029] |
| passed | removing the second source leaves the package as it was |
| passed | a dependency entry that names no source at all is refused |
| passed | the version in the manifest and the one in the header agree today |
| known | moving the manifest version alone is noticed [F-030] |
| passed | and the artifact keeps reporting the version written in the header |
| passed | a shared library cannot be declared |
| passed | and the kinds it does offer, which the diagnostic lists, hold nothing for one |
| passed | what a build produces today is one static archive and nothing a foreign consumer could read |
| passed | the small-table configuration builds |
| passed | and its tests give the same answers |
| passed | the answer a consumer sees does not depend on how the library was configured |
| passed | a second build of the consumer runs nothing |
| passed | editing a library source recompiles it for the consumer |
| passed | and the consumer is linked again |
| passed | while the library's other translation units are left alone |
| passed | editing the public header recompiles the consumer that includes it |
ok apps/httpd — 37 checks (36 passed, 0 failed, 1 known, 0 fixed)
| state | check |
|---|---|
| passed | the package passes check |
| passed | it builds |
| passed | the default build asks for nothing beyond the standard library |
| passed | the default configuration compiles the portable waiter |
| passed | and does not compile the one it did not choose |
| passed | choosing the other feature compiles the other waiter |
| passed | forgetting to drop the defaults compiles both waiters |
| known | and a package that ends up with two implementations of one interface says so [F-031] |
| passed | instead the build succeeds, because a static archive keeps only the first definition |
| passed | and the artifact carries whichever the linker reached first |
| passed | and drops the first one |
| passed | the epoll configuration builds |
| passed | the default artifact says it is the portable waiter |
| passed | the epoll artifact says so too |
| passed | the threaded configuration asks the linker for threads |
| passed | the threaded configuration builds |
| passed | and its artifact says it is threaded |
| passed | the default configuration builds |
| passed | a request for a file that exists is answered with 200 |
| passed | the response carries the media type the path implies |
| passed | and the body is what the file holds |
| passed | a request for a file that does not exist is answered with 404 |
| passed | a path that climbs out of the root is refused |
| passed | the epoll build answers the same request the same way |
| passed | the unit tests pass |
| passed | and pass under the other waiter too |
| passed | a rebuild of the same configuration is a no-op |
| passed | nothing runs when nothing changed |
| passed | editing the chosen waiter recompiles it |
| passed | and leaves the rest of the library alone |
| passed | the instrumented configuration passes check |
| passed | and builds |
| passed | the instrumentation the library asks for reaches the link of the server |
| passed | the unit tests pass with the instrumentation on |
| passed | a malformed request is answered or refused, never crashes the server |
| passed | the epoll configuration builds instrumented too |
| passed | and the other waiter survives the same requests |
ok apps/jsonfmt — 37 checks (34 passed, 0 failed, 3 known, 0 fixed)
| state | check |
|---|---|
| passed | the library package passes check |
| passed | the application package passes check |
| passed | the application builds |
| passed | nothing outside the standard library is linked in |
| passed | the public include directory of the library reaches the application |
| passed | but its private one does not, so the internals stay internal |
| passed | including a private header of the library does not compile |
| passed | and removing it builds again |
| passed | an object is laid out over lines with two spaces |
| passed | -c lays the same object out on one line |
| passed | nesting indents by depth |
| passed | surrounding space is dropped |
| passed | an escaped quote inside a string survives |
| passed | an empty array stays on one line |
| passed | -i sets the width |
| passed | a syntax error is refused with its byte offset |
| passed | the tests of both packages run and pass |
| passed | both test targets are collected from one invocation |
| passed | the test sources live outside the packages that declare them |
| passed | building with a forwarded feature passes |
| passed | the default build has the ordinary depth limit |
| passed | a feature forwarded to a dependency reaches it |
| known | a forwarded feature does not split the build directory in two [F-023] |
| passed | the application builds in release |
| passed | a second build of the same configuration runs nothing |
| passed | editing one source recompiles it |
| passed | and does not recompile its neighbours |
| known | running the tests does not make the next build redo work [F-024] |
| passed | and a full build leaves nothing for the tests to redo |
| known | building one target does not make the next full build redo work [F-024] |
| passed | the instrumented configuration passes check |
| passed | and builds |
| passed | the instrumentation the library asks for reaches the link of the application |
| passed | the tests pass with the instrumentation on |
| passed | hostile input is refused rather than crashing the instrumented build |
| passed | the deep configuration builds with the instrumentation too |
| passed | nesting past the raised limit is refused, not met with a stack overflow |
ok apps/plot — 42 checks (41 passed, 0 failed, 1 known, 0 fixed)
| state | check |
|---|---|
| passed | the drawing package passes check |
| passed | and builds |
| passed | its pixel tests pass |
| passed | the default configuration of the shell builds |
| passed | and so does the one that opens a window |
| passed | the system library the drawing package uses reaches the link of the shell |
| passed | but its headers do not, because the dependency was declared private |
| passed | the resolution is written to a lock file |
| passed | and the lock names the package that was resolved |
| passed | with the mechanism that resolved it |
| passed | the configuration that opens no window does not need X11 at run time |
| passed | though it still needs the drawing library it actually uses |
| passed | and the configuration that does open one needs X11 |
| passed | the optional dependency is absent from the plan, not merely unused |
| passed | only the chosen shell is compiled |
| passed | and choosing the other feature compiles the other one |
| passed | the default artifact says which shell it carries |
| passed | and the windowed artifact says the other one |
| passed | with two whens, asking for one backend compiles both |
| known | a manifest that can select two exclusive backends at once is refused [F-031] |
| passed | instead the linker reports multiple definition, with nothing from dowel |
| passed | written as a match, the same flag selects exactly one |
| passed | and the build that follows links |
| passed | rendering to a file succeeds |
| passed | the file carries the size that was asked for |
| passed | and the first pixel is exactly the background colour the header declares |
| passed | the body holds one pixel for each pixel of the canvas |
| passed | the windowed build runs against a real X server |
| passed | and it gets as far as putting the image on the window |
| passed | without a display it exits with a status of its own, not a signal |
| passed | and it says what is missing rather than dying inside the library |
| passed | while the other configuration renders with no display at all |
| passed | the instrumented configuration builds |
| passed | and its tests pass |
| passed | awkward sizes and values are refused or drawn, never crash the renderer |
| passed | the windowed configuration builds instrumented too |
| passed | and opening a real window under instrumentation reports nothing |
| passed | the image handed to the server is not read past its own buffer |
| passed | a second build of the same configuration runs nothing |
| passed | editing the drawing source recompiles it |
| passed | and the shell is linked again |
| passed | while its neighbour is left alone |
ok projects/docs — 8 checks (8 passed, 0 failed, 0 known, 0 fixed)
| state | check |
|---|---|
| passed | every relative link in the documentation resolves |
| passed | the project table in README.md matches projects/ |
| passed | the application table in README.md matches apps/ |
| passed | the documentation table in README.md matches docs/ |
| passed | check names quoted in the documentation exist |
| passed | every known_issue declaration names a finding that exists |
| passed | the index of docs/10-findings.md matches its sections |
| passed | the dowel revision quoted in the documentation matches dowel-ref |
History
Each cell is passed / failed / known / fixed for that project. A dash means the project did not exist at that point.
| run | state | branch | commit | dowel | 01-minimal | 02-config | 03-features | 04-diagnostics | 05-incremental | 06-runner | 07-robustness | 08-lsp | 09-acquisition | 10-toolchain | 11-cross | 12-store | 13-parallel | 14-scale | 15-cpp | 16-migrate | 17-deps | 18-tools | 19-artifacts | blink | docs | hashx | httpd | jsonfmt | plot | total |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2026-08-07T03:48:35Z | ok | main | 7660d8f3dc1a | af7d391f1e22 | 10/0/0/0 | 21/0/0/0 | 17/0/0/0 | 66/0/0/0 | 48/0/0/0 | 17/0/0/0 | 145/0/0/0 | 110/0/0/0 | 66/0/1/0 | 31/0/0/0 | 17/0/0/0 | 29/0/0/0 | 18/0/0/0 | 17/0/0/0 | 70/0/0/0 | 54/0/0/0 | 51/0/0/0 | 31/0/1/0 | 34/0/1/0 | 32/0/4/0 | 8/0/0/0 | 34/0/4/0 | 36/0/1/0 | 34/0/3/0 | 41/0/1/0 | 1053 |
| 2026-08-06T12:30:58Z | ok | main | fb4d394e090c | af7d391f1e22 | 10/0/0/0 | 21/0/0/0 | 17/0/0/0 | 66/0/0/0 | 48/0/0/0 | 17/0/0/0 | 145/0/0/0 | 110/0/0/0 | 66/0/1/0 | 31/0/0/0 | 17/0/0/0 | 29/0/0/0 | 18/0/0/0 | 17/0/0/0 | 70/0/0/0 | 54/0/0/0 | 51/0/0/0 | 31/0/1/0 | 34/0/1/0 | 32/0/4/0 | 8/0/0/0 | — | 33/0/0/0 | 34/0/3/0 | — | 969 |
| 2026-08-05T10:30:54Z | ok | main | cf2888d5f0d9 | af7d391f1e22 | 10/0/0/0 | 21/0/0/0 | 17/0/0/0 | 66/0/0/0 | 48/0/0/0 | 17/0/0/0 | 145/0/0/0 | 110/0/0/0 | 66/0/1/0 | 31/0/0/0 | 17/0/0/0 | 29/0/0/0 | 18/0/0/0 | 17/0/0/0 | 70/0/0/0 | 54/0/0/0 | 51/0/0/0 | 31/0/1/0 | 34/0/1/0 | — | 8/0/0/0 | — | 26/0/0/0 | 27/0/3/0 | — | 919 |
| 2026-08-05T03:57:00Z | ok | main | 878cdb8a2075 | af7d391f1e22 | 10/0/0/0 | 21/0/0/0 | 17/0/0/0 | 66/0/0/0 | 48/0/0/0 | 17/0/0/0 | 145/0/0/0 | 110/0/0/0 | 66/0/1/0 | 31/0/0/0 | 17/0/0/0 | 29/0/0/0 | 18/0/0/0 | 17/0/0/0 | 70/0/0/0 | 54/0/0/0 | 51/0/0/0 | 31/0/1/0 | 34/0/1/0 | — | 7/0/0/0 | — | — | — | — | 862 |
| 2026-08-03T03:54:38Z | ok | main | 8fb90df15f92 | a9c16191bb0f | 10/0/0/0 | 21/0/0/0 | 17/0/0/0 | 66/0/0/0 | 48/0/0/0 | 17/0/0/0 | 145/0/0/0 | 110/0/0/0 | 66/0/1/0 | 31/0/0/0 | 17/0/0/0 | 29/0/0/0 | 18/0/0/0 | 17/0/0/0 | 70/0/0/0 | 53/0/1/0 | 48/0/2/0 | 27/0/6/0 | — | — | 7/0/0/0 | — | — | — | — | 827 |
| 2026-08-03T00:12:52Z | ok | main | 9bb5ceb209d1 | 2e99fc718f45 | 10/0/0/0 | 21/0/0/0 | 17/0/0/0 | 66/0/0/0 | 48/0/0/0 | 17/0/0/0 | 145/0/0/0 | 110/0/0/0 | 66/0/1/0 | 31/0/0/0 | 17/0/0/0 | 29/0/0/0 | 18/0/0/0 | 17/0/0/0 | 70/0/2/0 | 46/0/3/0 | 48/0/2/0 | — | — | — | 7/0/0/0 | — | — | — | — | 791 |
| 2026-07-30T16:25:58Z | ok | main | 49808ac5de0a | 3e84cbdddb72 | 10/0/0/0 | 21/0/0/0 | 17/0/0/0 | 66/0/0/0 | 48/0/0/0 | 17/0/0/0 | 145/0/0/0 | 97/0/0/0 | 66/0/1/0 | 31/0/0/0 | 17/0/0/0 | 29/0/0/0 | 18/0/0/0 | 17/0/0/0 | 70/0/2/0 | 46/0/3/0 | — | — | — | — | 7/0/0/0 | — | — | — | — | 728 |
| 2026-07-30T03:58:37Z | ok | main | 314500155dc9 | 9ed13f484703 | 10/0/0/0 | 21/0/0/0 | 17/0/0/0 | 66/0/0/0 | 47/0/1/0 | 17/0/0/0 | 145/0/0/0 | 97/0/0/0 | 66/0/1/0 | 31/0/0/0 | 12/0/2/0 | 29/0/0/0 | 18/0/0/0 | 17/0/0/0 | 70/0/2/0 | — | — | — | — | — | 7/0/0/0 | — | — | — | — | 676 |
| 2026-07-30T03:44:54Z | ok | main | 4546a243874a | 9ed13f484703 | 10/0/0/0 | 21/0/0/0 | 17/0/0/0 | 66/0/0/0 | 47/0/1/0 | 17/0/0/0 | 145/0/0/0 | 97/0/0/0 | 66/0/1/0 | 31/0/0/0 | 12/0/2/0 | 29/0/0/0 | 18/0/0/0 | 17/0/0/0 | 70/0/0/0 | — | — | — | — | — | 7/0/0/0 | — | — | — | — | 674 |
| 2026-07-30T00:26:10Z | ok | main | 658861eadf3a | 9ed13f484703 | 10/0/0/0 | 21/0/0/0 | 17/0/0/0 | 66/0/0/0 | 47/0/1/0 | 17/0/0/0 | 145/0/0/0 | 97/0/0/0 | 66/0/1/0 | 31/0/0/0 | 12/0/2/0 | 29/0/0/0 | 18/0/0/0 | 17/0/0/0 | 35/0/0/0 | — | — | — | — | — | 7/0/0/0 | — | — | — | — | 639 |
| 2026-07-29T16:10:49Z | ok | main | c77f4253144a | 95daf9ff8dac | 10/0/0/0 | 21/0/0/0 | 17/0/0/0 | 70/0/0/0 | 47/0/1/0 | 17/0/0/0 | 145/0/0/0 | 97/0/0/0 | 66/0/1/0 | 31/0/0/0 | 12/0/2/0 | 29/0/0/0 | 18/0/0/0 | 17/0/0/0 | — | — | — | — | — | — | 7/0/0/0 | — | — | — | — | 608 |
| 2026-07-29T15:59:52Z | ok | main | a8de02c1ad51 | 95daf9ff8dac | 10/0/0/0 | 21/0/0/0 | 17/0/0/0 | 70/0/0/0 | 47/0/1/0 | 17/0/0/0 | 145/0/0/0 | 97/0/0/0 | 66/0/1/0 | 31/0/0/0 | 12/0/2/0 | 29/0/0/0 | 18/0/0/0 | — | — | — | — | — | — | — | 7/0/0/0 | — | — | — | — | 591 |
| 2026-07-29T15:41:23Z | ok | main | 986b5f773b5b | 95daf9ff8dac | 10/0/0/0 | 21/0/0/0 | 17/0/0/0 | 70/0/0/0 | 47/0/1/0 | 17/0/0/0 | 145/0/0/0 | 97/0/0/0 | 66/0/1/0 | 31/0/0/0 | 12/0/2/0 | — | — | — | — | — | — | — | — | — | 7/0/0/0 | — | — | — | — | 544 |
| 2026-07-29T14:46:56Z | ok | main | b1380dd21bfe | 19a4a409f6e8 | 10/0/0/0 | 21/0/0/0 | 17/0/0/0 | 70/0/0/0 | 44/0/0/0 | 17/0/0/0 | 118/0/12/0 | 88/0/9/0 | 62/0/3/0 | — | — | — | — | — | — | — | — | — | — | — | 7/0/0/0 | — | — | — | — | 478 |
| 2026-07-29T12:49:06Z | ok | main | f572f6c393f4 | 07f16ec59e48 | 10/0/0/0 | 21/0/0/0 | 17/0/0/0 | 70/0/0/0 | 44/0/0/0 | 17/0/0/0 | 118/0/12/0 | — | — | — | — | — | — | — | — | — | — | — | — | — | 7/0/0/0 | — | — | — | — | 316 |
| 2026-07-29T00:28:01Z | ok | main | 83dc45bb1fbd | 07f16ec59e48 | 10/0/0/0 | 21/0/0/0 | 17/0/0/0 | 70/0/0/0 | 44/0/0/0 | 17/0/0/0 | — | — | — | — | — | — | — | — | — | — | — | — | — | — | 7/0/0/0 | — | — | — | — | 186 |
| 2026-07-28T14:57:38Z | ok | main | 0c03829f1951 | 07f16ec59e48 | 10/0/0/0 | 21/0/0/0 | 17/0/0/0 | 64/0/0/0 | 44/0/0/0 | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | 7/0/0/0 | — | — | — | — | 163 |
| 2026-07-28T14:45:50Z | ok | main | 23244295550f | 07f16ec59e48 | 10/0/0/0 | 21/0/0/0 | 17/0/0/0 | 64/0/0/0 | 44/0/0/0 | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | 156 |
| 2026-07-28T13:32:14Z | ok | main | b69cc8fe3796 | a8a59e7c70aa | 10/0/0/0 | 21/0/0/0 | 12/0/4/0 | 37/0/10/0 | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | 94 |
| 2026-07-28T13:10:49Z | ok | main | 8523cf675458 | a8a59e7c70aa | 10/0/0/0 | 21/0/0/0 | 12/0/4/0 | 37/0/10/0 | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | — | 94 |