You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
When the coverage tooling was copied from score_communication, it was completed.
This is IMO the worst situation we could end up in. We now have the "same" code in two places, with different states/bugs/maintainership.
This ticket is about finishing the migration that was started. To keep things aligned, the people that started the migration shall also finish it. Only they know why specific pieces were done different/not migrated.
Acceptance Criteria (DoD)
This repository covers all use cases of the original solution in score_communication.
score_communication is migrated to rely on this tooling for coverage.
0.3.0 (2026-09-28): gcov backend for QNX on-target coverage (score_coverage_reporter(backend = "gcov"), counters brought back by score_qnx_unit_tests, same report archive as on Linux; Rust listed as not instrumentable on that backend). Release notes.
0.3.1 (2026-09-29): --instrumentation_filter=^//<root>[/:] is now required in every coverage config, and both reporters warn when a report shows the pattern of a library tested from a test/ subpackage without data. Root cause found on baselibs' first QNX report (score/os at 13 % against 80 % on Linux): Bazel guesses the filter from the packages of the test targets and strips only a trailing /tests; libraries tested from a test subpackage were outside the guess, and on the gcov backend Bazel's own collector dropped their counters. With the line, the QNX report went from 82 % to 92 % lines. Tool PR: Require the instrumentation filter; warn when it was left to Bazel #12.
Target version for the rollout is now 0.3.1. Every migration PR sets the instrumentation filter.
merged (bump 0.2.0 → 0.3.1, was already on the tool)
48/55 identical, rest IPC timing variance
Every PR carries the before/after table in its description. "Headers recovered" means headers reached through include directories that the old pipeline dropped (coverage_tool#5, fixed in 0.2.0); nothing lost coverage anywhere.
Still to do
orchestrator: full migration, same recipe.
reference_integration: one bazelrc line (--run_under=@score_tooling//coverage:llvm_profile_wrapper → @score_coverage//:llvm_profile_wrapper).
tooling: deprecate and remove coverage/ once the PRs above are merged.
Side findings worth knowing
Every migrated repo now gets unmapped_files.txt in the archive. Each PR lists the files without any coverage data for the module owners; none of them had data before either, they were simply invisible.
QNX branch coverage is structurally lower than LLVM's: gcov counts every conditional jump including exception-handling edges (22 % of all branches in baselibs' objects). Gate per platform, do not compare the two figures.
The QNX toolchain download from qnx.com times out or serves wrong content now and then; several QNX jobs needed a rerun.
Design discussion, scope per platform. Roots that exist on one platform only (score/os/qnx:*, score/os/linux, the Rust roots whose crates are not generated for the x86_64 QNX triple) make the scope incompatible on the other platform, and Bazel then skips every test of the coverage run without an error. baselibs therefore keeps a Linux and a QNX root list behind a select(). Proposal under discussion for 0.5.0: compute the scope by applying the aspect from the command line on a pattern (bazel coverage --aspects=... -- //score/...), where Bazel drops incompatible targets itself, and read the scope in the report step. No per-platform lists and no platform attribute; the denominator becomes "pattern minus exclusions" instead of a declared target list. Open points: testonly mocks that are in today's lists on purpose, a per-platform file list in the archive plus a completeness check, migration of the consumers. Decision pending with the baselibs and process stakeholders; 0.4.0 ships first.
open, all checks green at c168d744f3 (merged with main, zip_iterator_test back in the QNX run). Pins #24 by git_override until 0.4.0 is released; the QNX report job is a separate pull_request_target workflow with the workflow-approval gate for forks.
open, draft (replaces #1171, closed): 0.3.1, Linux LLVM + QNX gcov, instrumentation filter. Needs the platform scope from 0.4.0 before the QNX report is complete.
Seven of nine repos are on 0.3.1 from main. baselibs QNX and communication wait for the 0.4.0 release.
Still to do
Release 0.4.0; replace the git_override in baselibs#626; add the QNX scope to communication#1240.
orchestrator: still on score_tooling 2.2.1, full migration, same recipe.
reference_integration: one bazelrc line (--run_under=@score_tooling//coverage:llvm_profile_wrapper → @score_coverage//:llvm_profile_wrapper); no coverage measured there by agreement, module reports are referenced.
tooling: deprecate and remove coverage/ once the two remaining PRs are merged.
Side note: the QNX SDP download from qnx.com was unreliable on 2026-10-09 (truncated archives, connect timeouts); the baselibs x86_64 QNX job needed five reruns before it got a complete archive. Jobs that restore the archive from the Actions cache are not affected.
Activity
dcalavrezo-qorix commentedon Sep 30, 2026
Progress update, 2026-09-30
Releases of
score_coveragesince the last updatescore_coverage_reporter(backend = "gcov"), counters brought back byscore_qnx_unit_tests, same report archive as on Linux; Rust listed as not instrumentable on that backend). Release notes.--instrumentation_filter=^//<root>[/:]is now required in every coverage config, and both reporters warn when a report shows the pattern of a library tested from atest/subpackage without data. Root cause found on baselibs' first QNX report (score/osat 13 % against 80 % on Linux): Bazel guesses the filter from the packages of the test targets and strips only a trailing/tests; libraries tested from atestsubpackage were outside the guess, and on the gcov backend Bazel's own collector dropped their counters. With the line, the QNX report went from 82 % to 92 % lines. Tool PR: Require the instrumentation filter; warn when it was left to Bazel #12.Target version for the rollout is now 0.3.1. Every migration PR sets the instrumentation filter.
Every PR carries the before/after table in its description. "Headers recovered" means headers reached through include directories that the old pipeline dropped (coverage_tool#5, fixed in 0.2.0); nothing lost coverage anywhere.
Still to do
--run_under=@score_tooling//coverage:llvm_profile_wrapper→@score_coverage//:llvm_profile_wrapper).coverage/once the PRs above are merged.Side findings worth knowing
unmapped_files.txtin the archive. Each PR lists the files without any coverage data for the module owners; none of them had data before either, they were simply invisible.dcalavrezo-qorix commentedon Oct 12, 2026
Progress update, 2026-10-12
Tool
score_coverage_scopegets aplatformattribute (Evaluate the coverage scope for the run's platform #24, closes Scope is evaluated in the exec configuration: platform select()s resolve for the host, not the target #23). Bazel analyses the scope in the exec configuration, so on a QNX run every platformselect()was resolved for the Linux host: the first QNX report of baselibs listed the Linux variants ofscore/osat 0 % and no QNX file at all. Withplatform = "@score_bazel_platforms//:x86_64-qnx-sdp_8.0.0-posix"the scope follows the run's platform. Validated on baselibs: 56score/os/qnxfiles in the QNX report, noscore/os/linuxfile. Also on main since 0.3.1: downstream workflow tests (Add downstream coverage workflow tests #22), end-to-end pytest with requirement traceability (Set up end-to-end pytest with CI and requirement traceability #33), tests consolidated under one directory (Consolidate tests under a common directory #31), shared copyright and formatting hooks (ci: run formatting checks through pre-commit using devcontainer tools #32, ci: use the shared tools copyright hook #34), architecture docs (docs: clarify coverage architecture artifacts #13, docs: clarify coverage architecture for readers #18).score/os/qnx:*,score/os/linux, the Rust roots whose crates are not generated for the x86_64 QNX triple) make the scope incompatible on the other platform, and Bazel then skips every test of the coverage run without an error. baselibs therefore keeps a Linux and a QNX root list behind aselect(). Proposal under discussion for 0.5.0: compute the scope by applying the aspect from the command line on a pattern (bazel coverage --aspects=... -- //score/...), where Bazel drops incompatible targets itself, and read the scope in the report step. No per-platform lists and noplatformattribute; the denominator becomes "pattern minus exclusions" instead of a declared target list. Open points: testonly mocks that are in today's lists on purpose, a per-platform file list in the archive plus a completeness check, migration of the consumers. Decision pending with the baselibs and process stakeholders; 0.4.0 ships first.Rollout status
zip_iterator_testback in the QNX run). Pins #24 bygit_overrideuntil 0.4.0 is released; the QNX report job is a separatepull_request_targetworkflow with theworkflow-approvalgate for forks.platformscope from 0.4.0 before the QNX report is complete.Seven of nine repos are on 0.3.1 from main. baselibs QNX and communication wait for the 0.4.0 release.
Still to do
git_overridein baselibs#626; add the QNX scope to communication#1240.score_tooling2.2.1, full migration, same recipe.--run_under=@score_tooling//coverage:llvm_profile_wrapper→@score_coverage//:llvm_profile_wrapper); no coverage measured there by agreement, module reports are referenced.coverage/once the two remaining PRs are merged.Side note: the QNX SDP download from qnx.com was unreliable on 2026-10-09 (truncated archives, connect timeouts); the baselibs x86_64 QNX job needed five reruns before it got a complete archive. Jobs that restore the archive from the Actions cache are not affected.