fix: scope Codecov report to product code, excluding test files - #6034

Merged
jam-jee merged 1 commit into
aws:masterfrom
jam-jee:fix/codecov-scope-product-code
Jul 17, 2026
Merged

fix: scope Codecov report to product code, excluding test files#6034
jam-jee merged 1 commit into
aws:masterfrom
jam-jee:fix/codecov-scope-product-code

Conversation

@jam-jee

@jam-jeejam-jee commented Jul 16, 2026

Copy link
Copy Markdown
Collaborator

Issue

CI uploads unit-test coverage to Codecov, but the coverage is not scoped to src/ product code, so test code and test-support scripts dominate the report.

Root cause (confirmed): the CI unit-test build runs, from inside each sub-package directory:

cd $CODEBUILD_SRC_DIR/$SUBMODULE
tox -e py310,py311,py312 -- tests/unit -v --cov=. --cov-append --cov-report=xml

--cov=. measures the entire submodule directory, which contains both src/ and tests/. So executed test files and test-data scripts (e.g. tests/data/*.py training entry-scripts and model definitions) are recorded and uploaded alongside product code. (The buildspec lives in the internal CDK infra package, not this repo.)

Inspecting the Codecov API for recent commits confirms the effect:

CommitReportedFiles in reportTest filesProduct files
3f810c67 (Release 3.16.0, master)88.06%2902855
PR #5969 head (d4493939)90.26%4794736

~98% of the measured files/lines in the uploaded report are test files, not shippable product code. Consequences:

  • Reported project coverage (~88–90%) is far above true product-code coverage and largely reflects test files executing themselves.
  • The number is unstable across commits (88% / 90% / 93%) depending on which sub-package uploads land, with no gate to wait for all of them.

Note: integration tests contribute no coverage (the integ build runs plain pytest with IGNORE_COVERAGE=- and no --cov), so this is purely the unit-coverage upload.

Verified real product coverage

A verification run in CI (all four unit suites unioned with a corrected --cov=sagemaker, test files excluded) shows the true product-code coverage:

PackageCoverage
sagemaker-mlops80.9%
sagemaker-serve76.0%
sagemaker-train72.2%
sagemaker-core67.4%
Overall70.7% (561 product files, 0 test files)

Fix

Add a repo-root codecov.yml that:

  • Scopes the Codecov report to product code via an ignore: list (tests, conftest.py, tests/data scripts, test_script.py, codegen and workflow_helper utilities, docs, examples). This corrects the report server-side, independent of the CI --cov flag.
  • Sets status checks calibrated to the verified baseline: projecttarget 65% (an explicit floor rather than auto, so the one-time recalibration from the inflated ~90% down to the true ~71% is not read as a regression, while still guarding against real drops) and patchtarget 70% on changed lines.
  • Sets codecov.notify.after_n_builds: 4 so the project % is computed once all four sub-package uploads are in.

Validated with the Codecov config validator (curl --data-binary @codecov.yml https://codecov.io/validateValid!).

Recommended companion change (separate, in the CI infra package)

The cleanest upstream fix is to change the CI unit command from --cov=. to --cov=sagemaker (match by import package name, which follows the installed package and excludes tests) so the generated coverage.xml never contains test files. That change lives in the internal CodeBuild infra package (SageMakerMLFPySDKInfraCDK/lib/buildspecs.ts), not this repo, so it is intentionally not part of this PR. The codecov.yml here fixes the reported number regardless, and both changes are complementary.

Note on the tox --fail-under gate

Each tox.ini defines coverage report --fail-under=86 under the runcoverage env, but CI does not invoke that env (it runs tox -e py310,py311,py312), so this change does not affect any CI gate. If a future coverage gate is wired up, the threshold should reflect the real ~71% baseline rather than the old inflated number.

Testing

  • python -c "import yaml; yaml.safe_load(open('codecov.yml'))" → parses.
  • Codecov validator returns Valid! and compiles the expected ignore regexes.
  • No product code, tox config, or CI workflow is modified; only a new codecov.yml is added.

@jam-jee
jam-jeeforce-pushed the fix/codecov-scope-product-code branch from d261c4a to 7211044CompareJuly 16, 2026 04:29
zhaoqizqwang
zhaoqizqwang previously approved these changes Jul 16, 2026
CI runs `pytest --cov=sagemaker` per sub-package and uploads to Codecov,
but coverage is not scoped to `src/` product code. Executed test-support
scripts (notably `*/tests/data/*.py` training entry-scripts and model
definitions) get recorded and uploaded.
With no `codecov.yml` ignore list, these dominate the report: recent
commits on master show ~98% of the measured files/lines are test files
rather than product code (e.g. commit 3f810c6: 285 of 290 reported
files are under tests/). This inflates the reported project coverage
(~88-90%) far above the true product-code coverage and makes the number
unreliable and unstable across commits.
Add a repo-root `codecov.yml` that scopes the report to product code via
an `ignore:` list (tests, conftest, test-data scripts, codegen and
workflow_helper utilities), and defines project/patch status targets and
`after_n_builds: 4` so the percentage is computed over all four
sub-package uploads. Validated with the Codecov config validator.
This follows how peer projects configure Codecov (scikit-learn ignores
conftest/externals; aws-cdk ignores non-product paths).
@jam-jee
jam-jeetemporarily deployed to manual-approval July 16, 2026 22:38 — with GitHub Actions Inactive
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@jam-jee@mujtaba1747@zhaoqizqwang@aviruthen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix: scope Codecov report to product code, excluding test files - #6034

Merged
jam-jee merged 1 commit into
aws:masterfrom
jam-jee:fix/codecov-scope-product-code
Jul 17, 2026
Merged

fix: scope Codecov report to product code, excluding test files#6034
jam-jee merged 1 commit into
aws:masterfrom
jam-jee:fix/codecov-scope-product-code

Conversation

@jam-jee

@jam-jeejam-jee commented Jul 16, 2026

Copy link
Copy Markdown
Collaborator

Issue

CI uploads unit-test coverage to Codecov, but the coverage is not scoped to src/ product code, so test code and test-support scripts dominate the report.

Root cause (confirmed): the CI unit-test build runs, from inside each sub-package directory:

cd $CODEBUILD_SRC_DIR/$SUBMODULE
tox -e py310,py311,py312 -- tests/unit -v --cov=. --cov-append --cov-report=xml

--cov=. measures the entire submodule directory, which contains both src/ and tests/. So executed test files and test-data scripts (e.g. tests/data/*.py training entry-scripts and model definitions) are recorded and uploaded alongside product code. (The buildspec lives in the internal CDK infra package, not this repo.)

Inspecting the Codecov API for recent commits confirms the effect:

CommitReportedFiles in reportTest filesProduct files
3f810c67 (Release 3.16.0, master)88.06%2902855
PR #5969 head (d4493939)90.26%4794736

~98% of the measured files/lines in the uploaded report are test files, not shippable product code. Consequences:

  • Reported project coverage (~88–90%) is far above true product-code coverage and largely reflects test files executing themselves.
  • The number is unstable across commits (88% / 90% / 93%) depending on which sub-package uploads land, with no gate to wait for all of them.

Note: integration tests contribute no coverage (the integ build runs plain pytest with IGNORE_COVERAGE=- and no --cov), so this is purely the unit-coverage upload.

Verified real product coverage

A verification run in CI (all four unit suites unioned with a corrected --cov=sagemaker, test files excluded) shows the true product-code coverage:

PackageCoverage
sagemaker-mlops80.9%
sagemaker-serve76.0%
sagemaker-train72.2%
sagemaker-core67.4%
Overall70.7% (561 product files, 0 test files)

Fix

Add a repo-root codecov.yml that:

  • Scopes the Codecov report to product code via an ignore: list (tests, conftest.py, tests/data scripts, test_script.py, codegen and workflow_helper utilities, docs, examples). This corrects the report server-side, independent of the CI --cov flag.
  • Sets status checks calibrated to the verified baseline: projecttarget 65% (an explicit floor rather than auto, so the one-time recalibration from the inflated ~90% down to the true ~71% is not read as a regression, while still guarding against real drops) and patchtarget 70% on changed lines.
  • Sets codecov.notify.after_n_builds: 4 so the project % is computed once all four sub-package uploads are in.

Validated with the Codecov config validator (curl --data-binary @codecov.yml https://codecov.io/validateValid!).

Recommended companion change (separate, in the CI infra package)

The cleanest upstream fix is to change the CI unit command from --cov=. to --cov=sagemaker (match by import package name, which follows the installed package and excludes tests) so the generated coverage.xml never contains test files. That change lives in the internal CodeBuild infra package (SageMakerMLFPySDKInfraCDK/lib/buildspecs.ts), not this repo, so it is intentionally not part of this PR. The codecov.yml here fixes the reported number regardless, and both changes are complementary.

Note on the tox --fail-under gate

Each tox.ini defines coverage report --fail-under=86 under the runcoverage env, but CI does not invoke that env (it runs tox -e py310,py311,py312), so this change does not affect any CI gate. If a future coverage gate is wired up, the threshold should reflect the real ~71% baseline rather than the old inflated number.

Testing

  • python -c "import yaml; yaml.safe_load(open('codecov.yml'))" → parses.
  • Codecov validator returns Valid! and compiles the expected ignore regexes.
  • No product code, tox config, or CI workflow is modified; only a new codecov.yml is added.

@jam-jee
jam-jeeforce-pushed the fix/codecov-scope-product-code branch from d261c4a to 7211044CompareJuly 16, 2026 04:29
zhaoqizqwang
zhaoqizqwang previously approved these changes Jul 16, 2026
CI runs `pytest --cov=sagemaker` per sub-package and uploads to Codecov,
but coverage is not scoped to `src/` product code. Executed test-support
scripts (notably `*/tests/data/*.py` training entry-scripts and model
definitions) get recorded and uploaded.
With no `codecov.yml` ignore list, these dominate the report: recent
commits on master show ~98% of the measured files/lines are test files
rather than product code (e.g. commit 3f810c6: 285 of 290 reported
files are under tests/). This inflates the reported project coverage
(~88-90%) far above the true product-code coverage and makes the number
unreliable and unstable across commits.
Add a repo-root `codecov.yml` that scopes the report to product code via
an `ignore:` list (tests, conftest, test-data scripts, codegen and
workflow_helper utilities), and defines project/patch status targets and
`after_n_builds: 4` so the percentage is computed over all four
sub-package uploads. Validated with the Codecov config validator.
This follows how peer projects configure Codecov (scikit-learn ignores
conftest/externals; aws-cdk ignores non-product paths).
@jam-jee
jam-jeetemporarily deployed to manual-approval July 16, 2026 22:38 — with GitHub Actions Inactive
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@jam-jee@mujtaba1747@zhaoqizqwang@aviruthen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: scope Codecov report to product code, excluding test files - #6034

Merged
jam-jee merged 1 commit into
aws:masterfrom
jam-jee:fix/codecov-scope-product-code
Jul 17, 2026
Merged

fix: scope Codecov report to product code, excluding test files#6034
jam-jee merged 1 commit into
aws:masterfrom
jam-jee:fix/codecov-scope-product-code

Conversation

@jam-jee

@jam-jeejam-jee commented Jul 16, 2026

Copy link
Copy Markdown
Collaborator

Issue

CI uploads unit-test coverage to Codecov, but the coverage is not scoped to src/ product code, so test code and test-support scripts dominate the report.

Root cause (confirmed): the CI unit-test build runs, from inside each sub-package directory:

cd $CODEBUILD_SRC_DIR/$SUBMODULE
tox -e py310,py311,py312 -- tests/unit -v --cov=. --cov-append --cov-report=xml

--cov=. measures the entire submodule directory, which contains both src/ and tests/. So executed test files and test-data scripts (e.g. tests/data/*.py training entry-scripts and model definitions) are recorded and uploaded alongside product code. (The buildspec lives in the internal CDK infra package, not this repo.)

Inspecting the Codecov API for recent commits confirms the effect:

CommitReportedFiles in reportTest filesProduct files
3f810c67 (Release 3.16.0, master)88.06%2902855
PR #5969 head (d4493939)90.26%4794736

~98% of the measured files/lines in the uploaded report are test files, not shippable product code. Consequences:

  • Reported project coverage (~88–90%) is far above true product-code coverage and largely reflects test files executing themselves.
  • The number is unstable across commits (88% / 90% / 93%) depending on which sub-package uploads land, with no gate to wait for all of them.

Note: integration tests contribute no coverage (the integ build runs plain pytest with IGNORE_COVERAGE=- and no --cov), so this is purely the unit-coverage upload.

Verified real product coverage

A verification run in CI (all four unit suites unioned with a corrected --cov=sagemaker, test files excluded) shows the true product-code coverage:

PackageCoverage
sagemaker-mlops80.9%
sagemaker-serve76.0%
sagemaker-train72.2%
sagemaker-core67.4%
Overall70.7% (561 product files, 0 test files)

Fix

Add a repo-root codecov.yml that:

  • Scopes the Codecov report to product code via an ignore: list (tests, conftest.py, tests/data scripts, test_script.py, codegen and workflow_helper utilities, docs, examples). This corrects the report server-side, independent of the CI --cov flag.
  • Sets status checks calibrated to the verified baseline: projecttarget 65% (an explicit floor rather than auto, so the one-time recalibration from the inflated ~90% down to the true ~71% is not read as a regression, while still guarding against real drops) and patchtarget 70% on changed lines.
  • Sets codecov.notify.after_n_builds: 4 so the project % is computed once all four sub-package uploads are in.

Validated with the Codecov config validator (curl --data-binary @codecov.yml https://codecov.io/validateValid!).

Recommended companion change (separate, in the CI infra package)

The cleanest upstream fix is to change the CI unit command from --cov=. to --cov=sagemaker (match by import package name, which follows the installed package and excludes tests) so the generated coverage.xml never contains test files. That change lives in the internal CodeBuild infra package (SageMakerMLFPySDKInfraCDK/lib/buildspecs.ts), not this repo, so it is intentionally not part of this PR. The codecov.yml here fixes the reported number regardless, and both changes are complementary.

Note on the tox --fail-under gate

Each tox.ini defines coverage report --fail-under=86 under the runcoverage env, but CI does not invoke that env (it runs tox -e py310,py311,py312), so this change does not affect any CI gate. If a future coverage gate is wired up, the threshold should reflect the real ~71% baseline rather than the old inflated number.

Testing

  • python -c "import yaml; yaml.safe_load(open('codecov.yml'))" → parses.
  • Codecov validator returns Valid! and compiles the expected ignore regexes.
  • No product code, tox config, or CI workflow is modified; only a new codecov.yml is added.

@jam-jee
jam-jeeforce-pushed the fix/codecov-scope-product-code branch from d261c4a to 7211044CompareJuly 16, 2026 04:29
zhaoqizqwang
zhaoqizqwang previously approved these changes Jul 16, 2026
CI runs `pytest --cov=sagemaker` per sub-package and uploads to Codecov,
but coverage is not scoped to `src/` product code. Executed test-support
scripts (notably `*/tests/data/*.py` training entry-scripts and model
definitions) get recorded and uploaded.
With no `codecov.yml` ignore list, these dominate the report: recent
commits on master show ~98% of the measured files/lines are test files
rather than product code (e.g. commit 3f810c6: 285 of 290 reported
files are under tests/). This inflates the reported project coverage
(~88-90%) far above the true product-code coverage and makes the number
unreliable and unstable across commits.
Add a repo-root `codecov.yml` that scopes the report to product code via
an `ignore:` list (tests, conftest, test-data scripts, codegen and
workflow_helper utilities), and defines project/patch status targets and
`after_n_builds: 4` so the percentage is computed over all four
sub-package uploads. Validated with the Codecov config validator.
This follows how peer projects configure Codecov (scikit-learn ignores
conftest/externals; aws-cdk ignores non-product paths).
@jam-jee
jam-jeetemporarily deployed to manual-approval July 16, 2026 22:38 — with GitHub Actions Inactive
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@jam-jee@mujtaba1747@zhaoqizqwang@aviruthen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: scope Codecov report to product code, excluding test files - #6034

Merged
jam-jee merged 1 commit into
aws:masterfrom
jam-jee:fix/codecov-scope-product-code
Jul 17, 2026
Merged

fix: scope Codecov report to product code, excluding test files#6034
jam-jee merged 1 commit into
aws:masterfrom
jam-jee:fix/codecov-scope-product-code

Conversation

@jam-jee

@jam-jeejam-jee commented Jul 16, 2026

Copy link
Copy Markdown
Collaborator

Issue

CI uploads unit-test coverage to Codecov, but the coverage is not scoped to src/ product code, so test code and test-support scripts dominate the report.

Root cause (confirmed): the CI unit-test build runs, from inside each sub-package directory:

cd $CODEBUILD_SRC_DIR/$SUBMODULE
tox -e py310,py311,py312 -- tests/unit -v --cov=. --cov-append --cov-report=xml

--cov=. measures the entire submodule directory, which contains both src/ and tests/. So executed test files and test-data scripts (e.g. tests/data/*.py training entry-scripts and model definitions) are recorded and uploaded alongside product code. (The buildspec lives in the internal CDK infra package, not this repo.)

Inspecting the Codecov API for recent commits confirms the effect:

CommitReportedFiles in reportTest filesProduct files
3f810c67 (Release 3.16.0, master)88.06%2902855
PR #5969 head (d4493939)90.26%4794736

~98% of the measured files/lines in the uploaded report are test files, not shippable product code. Consequences:

  • Reported project coverage (~88–90%) is far above true product-code coverage and largely reflects test files executing themselves.
  • The number is unstable across commits (88% / 90% / 93%) depending on which sub-package uploads land, with no gate to wait for all of them.

Note: integration tests contribute no coverage (the integ build runs plain pytest with IGNORE_COVERAGE=- and no --cov), so this is purely the unit-coverage upload.

Verified real product coverage

A verification run in CI (all four unit suites unioned with a corrected --cov=sagemaker, test files excluded) shows the true product-code coverage:

PackageCoverage
sagemaker-mlops80.9%
sagemaker-serve76.0%
sagemaker-train72.2%
sagemaker-core67.4%
Overall70.7% (561 product files, 0 test files)

Fix

Add a repo-root codecov.yml that:

  • Scopes the Codecov report to product code via an ignore: list (tests, conftest.py, tests/data scripts, test_script.py, codegen and workflow_helper utilities, docs, examples). This corrects the report server-side, independent of the CI --cov flag.
  • Sets status checks calibrated to the verified baseline: projecttarget 65% (an explicit floor rather than auto, so the one-time recalibration from the inflated ~90% down to the true ~71% is not read as a regression, while still guarding against real drops) and patchtarget 70% on changed lines.
  • Sets codecov.notify.after_n_builds: 4 so the project % is computed once all four sub-package uploads are in.

Validated with the Codecov config validator (curl --data-binary @codecov.yml https://codecov.io/validateValid!).

Recommended companion change (separate, in the CI infra package)

The cleanest upstream fix is to change the CI unit command from --cov=. to --cov=sagemaker (match by import package name, which follows the installed package and excludes tests) so the generated coverage.xml never contains test files. That change lives in the internal CodeBuild infra package (SageMakerMLFPySDKInfraCDK/lib/buildspecs.ts), not this repo, so it is intentionally not part of this PR. The codecov.yml here fixes the reported number regardless, and both changes are complementary.

Note on the tox --fail-under gate

Each tox.ini defines coverage report --fail-under=86 under the runcoverage env, but CI does not invoke that env (it runs tox -e py310,py311,py312), so this change does not affect any CI gate. If a future coverage gate is wired up, the threshold should reflect the real ~71% baseline rather than the old inflated number.

Testing

  • python -c "import yaml; yaml.safe_load(open('codecov.yml'))" → parses.
  • Codecov validator returns Valid! and compiles the expected ignore regexes.
  • No product code, tox config, or CI workflow is modified; only a new codecov.yml is added.

@jam-jee
jam-jeeforce-pushed the fix/codecov-scope-product-code branch from d261c4a to 7211044CompareJuly 16, 2026 04:29
zhaoqizqwang
zhaoqizqwang previously approved these changes Jul 16, 2026
CI runs `pytest --cov=sagemaker` per sub-package and uploads to Codecov,
but coverage is not scoped to `src/` product code. Executed test-support
scripts (notably `*/tests/data/*.py` training entry-scripts and model
definitions) get recorded and uploaded.
With no `codecov.yml` ignore list, these dominate the report: recent
commits on master show ~98% of the measured files/lines are test files
rather than product code (e.g. commit 3f810c6: 285 of 290 reported
files are under tests/). This inflates the reported project coverage
(~88-90%) far above the true product-code coverage and makes the number
unreliable and unstable across commits.
Add a repo-root `codecov.yml` that scopes the report to product code via
an `ignore:` list (tests, conftest, test-data scripts, codegen and
workflow_helper utilities), and defines project/patch status targets and
`after_n_builds: 4` so the percentage is computed over all four
sub-package uploads. Validated with the Codecov config validator.
This follows how peer projects configure Codecov (scikit-learn ignores
conftest/externals; aws-cdk ignores non-product paths).
@jam-jee
jam-jeetemporarily deployed to manual-approval July 16, 2026 22:38 — with GitHub Actions Inactive
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@jam-jee@mujtaba1747@zhaoqizqwang@aviruthen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix: scope Codecov report to product code, excluding test files - #6034

Merged
jam-jee merged 1 commit into
aws:masterfrom
jam-jee:fix/codecov-scope-product-code
Jul 17, 2026
Merged

fix: scope Codecov report to product code, excluding test files#6034
jam-jee merged 1 commit into
aws:masterfrom
jam-jee:fix/codecov-scope-product-code

Conversation

@jam-jee

@jam-jeejam-jee commented Jul 16, 2026

Copy link
Copy Markdown
Collaborator

Issue

CI uploads unit-test coverage to Codecov, but the coverage is not scoped to src/ product code, so test code and test-support scripts dominate the report.

Root cause (confirmed): the CI unit-test build runs, from inside each sub-package directory:

cd $CODEBUILD_SRC_DIR/$SUBMODULE
tox -e py310,py311,py312 -- tests/unit -v --cov=. --cov-append --cov-report=xml

--cov=. measures the entire submodule directory, which contains both src/ and tests/. So executed test files and test-data scripts (e.g. tests/data/*.py training entry-scripts and model definitions) are recorded and uploaded alongside product code. (The buildspec lives in the internal CDK infra package, not this repo.)

Inspecting the Codecov API for recent commits confirms the effect:

CommitReportedFiles in reportTest filesProduct files
3f810c67 (Release 3.16.0, master)88.06%2902855
PR #5969 head (d4493939)90.26%4794736

~98% of the measured files/lines in the uploaded report are test files, not shippable product code. Consequences:

  • Reported project coverage (~88–90%) is far above true product-code coverage and largely reflects test files executing themselves.
  • The number is unstable across commits (88% / 90% / 93%) depending on which sub-package uploads land, with no gate to wait for all of them.

Note: integration tests contribute no coverage (the integ build runs plain pytest with IGNORE_COVERAGE=- and no --cov), so this is purely the unit-coverage upload.

Verified real product coverage

A verification run in CI (all four unit suites unioned with a corrected --cov=sagemaker, test files excluded) shows the true product-code coverage:

PackageCoverage
sagemaker-mlops80.9%
sagemaker-serve76.0%
sagemaker-train72.2%
sagemaker-core67.4%
Overall70.7% (561 product files, 0 test files)

Fix

Add a repo-root codecov.yml that:

  • Scopes the Codecov report to product code via an ignore: list (tests, conftest.py, tests/data scripts, test_script.py, codegen and workflow_helper utilities, docs, examples). This corrects the report server-side, independent of the CI --cov flag.
  • Sets status checks calibrated to the verified baseline: projecttarget 65% (an explicit floor rather than auto, so the one-time recalibration from the inflated ~90% down to the true ~71% is not read as a regression, while still guarding against real drops) and patchtarget 70% on changed lines.
  • Sets codecov.notify.after_n_builds: 4 so the project % is computed once all four sub-package uploads are in.

Validated with the Codecov config validator (curl --data-binary @codecov.yml https://codecov.io/validateValid!).

Recommended companion change (separate, in the CI infra package)

The cleanest upstream fix is to change the CI unit command from --cov=. to --cov=sagemaker (match by import package name, which follows the installed package and excludes tests) so the generated coverage.xml never contains test files. That change lives in the internal CodeBuild infra package (SageMakerMLFPySDKInfraCDK/lib/buildspecs.ts), not this repo, so it is intentionally not part of this PR. The codecov.yml here fixes the reported number regardless, and both changes are complementary.

Note on the tox --fail-under gate

Each tox.ini defines coverage report --fail-under=86 under the runcoverage env, but CI does not invoke that env (it runs tox -e py310,py311,py312), so this change does not affect any CI gate. If a future coverage gate is wired up, the threshold should reflect the real ~71% baseline rather than the old inflated number.

Testing

  • python -c "import yaml; yaml.safe_load(open('codecov.yml'))" → parses.
  • Codecov validator returns Valid! and compiles the expected ignore regexes.
  • No product code, tox config, or CI workflow is modified; only a new codecov.yml is added.

@jam-jee
jam-jeeforce-pushed the fix/codecov-scope-product-code branch from d261c4a to 7211044CompareJuly 16, 2026 04:29
zhaoqizqwang
zhaoqizqwang previously approved these changes Jul 16, 2026
CI runs `pytest --cov=sagemaker` per sub-package and uploads to Codecov,
but coverage is not scoped to `src/` product code. Executed test-support
scripts (notably `*/tests/data/*.py` training entry-scripts and model
definitions) get recorded and uploaded.
With no `codecov.yml` ignore list, these dominate the report: recent
commits on master show ~98% of the measured files/lines are test files
rather than product code (e.g. commit 3f810c6: 285 of 290 reported
files are under tests/). This inflates the reported project coverage
(~88-90%) far above the true product-code coverage and makes the number
unreliable and unstable across commits.
Add a repo-root `codecov.yml` that scopes the report to product code via
an `ignore:` list (tests, conftest, test-data scripts, codegen and
workflow_helper utilities), and defines project/patch status targets and
`after_n_builds: 4` so the percentage is computed over all four
sub-package uploads. Validated with the Codecov config validator.
This follows how peer projects configure Codecov (scikit-learn ignores
conftest/externals; aws-cdk ignores non-product paths).
@jam-jee
jam-jeetemporarily deployed to manual-approval July 16, 2026 22:38 — with GitHub Actions Inactive
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@jam-jee@mujtaba1747@zhaoqizqwang@aviruthen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: scope Codecov report to product code, excluding test files - #6034

Merged
jam-jee merged 1 commit into
aws:masterfrom
jam-jee:fix/codecov-scope-product-code
Jul 17, 2026
Merged

fix: scope Codecov report to product code, excluding test files#6034
jam-jee merged 1 commit into
aws:masterfrom
jam-jee:fix/codecov-scope-product-code

Conversation

@jam-jee

@jam-jeejam-jee commented Jul 16, 2026

Copy link
Copy Markdown
Collaborator

Issue

CI uploads unit-test coverage to Codecov, but the coverage is not scoped to src/ product code, so test code and test-support scripts dominate the report.

Root cause (confirmed): the CI unit-test build runs, from inside each sub-package directory:

cd $CODEBUILD_SRC_DIR/$SUBMODULE
tox -e py310,py311,py312 -- tests/unit -v --cov=. --cov-append --cov-report=xml

--cov=. measures the entire submodule directory, which contains both src/ and tests/. So executed test files and test-data scripts (e.g. tests/data/*.py training entry-scripts and model definitions) are recorded and uploaded alongside product code. (The buildspec lives in the internal CDK infra package, not this repo.)

Inspecting the Codecov API for recent commits confirms the effect:

CommitReportedFiles in reportTest filesProduct files
3f810c67 (Release 3.16.0, master)88.06%2902855
PR #5969 head (d4493939)90.26%4794736

~98% of the measured files/lines in the uploaded report are test files, not shippable product code. Consequences:

  • Reported project coverage (~88–90%) is far above true product-code coverage and largely reflects test files executing themselves.
  • The number is unstable across commits (88% / 90% / 93%) depending on which sub-package uploads land, with no gate to wait for all of them.

Note: integration tests contribute no coverage (the integ build runs plain pytest with IGNORE_COVERAGE=- and no --cov), so this is purely the unit-coverage upload.

Verified real product coverage

A verification run in CI (all four unit suites unioned with a corrected --cov=sagemaker, test files excluded) shows the true product-code coverage:

PackageCoverage
sagemaker-mlops80.9%
sagemaker-serve76.0%
sagemaker-train72.2%
sagemaker-core67.4%
Overall70.7% (561 product files, 0 test files)

Fix

Add a repo-root codecov.yml that:

  • Scopes the Codecov report to product code via an ignore: list (tests, conftest.py, tests/data scripts, test_script.py, codegen and workflow_helper utilities, docs, examples). This corrects the report server-side, independent of the CI --cov flag.
  • Sets status checks calibrated to the verified baseline: projecttarget 65% (an explicit floor rather than auto, so the one-time recalibration from the inflated ~90% down to the true ~71% is not read as a regression, while still guarding against real drops) and patchtarget 70% on changed lines.
  • Sets codecov.notify.after_n_builds: 4 so the project % is computed once all four sub-package uploads are in.

Validated with the Codecov config validator (curl --data-binary @codecov.yml https://codecov.io/validateValid!).

Recommended companion change (separate, in the CI infra package)

The cleanest upstream fix is to change the CI unit command from --cov=. to --cov=sagemaker (match by import package name, which follows the installed package and excludes tests) so the generated coverage.xml never contains test files. That change lives in the internal CodeBuild infra package (SageMakerMLFPySDKInfraCDK/lib/buildspecs.ts), not this repo, so it is intentionally not part of this PR. The codecov.yml here fixes the reported number regardless, and both changes are complementary.

Note on the tox --fail-under gate

Each tox.ini defines coverage report --fail-under=86 under the runcoverage env, but CI does not invoke that env (it runs tox -e py310,py311,py312), so this change does not affect any CI gate. If a future coverage gate is wired up, the threshold should reflect the real ~71% baseline rather than the old inflated number.

Testing

  • python -c "import yaml; yaml.safe_load(open('codecov.yml'))" → parses.
  • Codecov validator returns Valid! and compiles the expected ignore regexes.
  • No product code, tox config, or CI workflow is modified; only a new codecov.yml is added.

@jam-jee
jam-jeeforce-pushed the fix/codecov-scope-product-code branch from d261c4a to 7211044CompareJuly 16, 2026 04:29
zhaoqizqwang
zhaoqizqwang previously approved these changes Jul 16, 2026
CI runs `pytest --cov=sagemaker` per sub-package and uploads to Codecov,
but coverage is not scoped to `src/` product code. Executed test-support
scripts (notably `*/tests/data/*.py` training entry-scripts and model
definitions) get recorded and uploaded.
With no `codecov.yml` ignore list, these dominate the report: recent
commits on master show ~98% of the measured files/lines are test files
rather than product code (e.g. commit 3f810c6: 285 of 290 reported
files are under tests/). This inflates the reported project coverage
(~88-90%) far above the true product-code coverage and makes the number
unreliable and unstable across commits.
Add a repo-root `codecov.yml` that scopes the report to product code via
an `ignore:` list (tests, conftest, test-data scripts, codegen and
workflow_helper utilities), and defines project/patch status targets and
`after_n_builds: 4` so the percentage is computed over all four
sub-package uploads. Validated with the Codecov config validator.
This follows how peer projects configure Codecov (scikit-learn ignores
conftest/externals; aws-cdk ignores non-product paths).
@jam-jee
jam-jeetemporarily deployed to manual-approval July 16, 2026 22:38 — with GitHub Actions Inactive
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@jam-jee@mujtaba1747@zhaoqizqwang@aviruthen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: scope Codecov report to product code, excluding test files - #6034

Merged
jam-jee merged 1 commit into
aws:masterfrom
jam-jee:fix/codecov-scope-product-code
Jul 17, 2026
Merged

fix: scope Codecov report to product code, excluding test files#6034
jam-jee merged 1 commit into
aws:masterfrom
jam-jee:fix/codecov-scope-product-code

Conversation

@jam-jee

@jam-jeejam-jee commented Jul 16, 2026

Copy link
Copy Markdown
Collaborator

Issue

CI uploads unit-test coverage to Codecov, but the coverage is not scoped to src/ product code, so test code and test-support scripts dominate the report.

Root cause (confirmed): the CI unit-test build runs, from inside each sub-package directory:

cd $CODEBUILD_SRC_DIR/$SUBMODULE
tox -e py310,py311,py312 -- tests/unit -v --cov=. --cov-append --cov-report=xml

--cov=. measures the entire submodule directory, which contains both src/ and tests/. So executed test files and test-data scripts (e.g. tests/data/*.py training entry-scripts and model definitions) are recorded and uploaded alongside product code. (The buildspec lives in the internal CDK infra package, not this repo.)

Inspecting the Codecov API for recent commits confirms the effect:

CommitReportedFiles in reportTest filesProduct files
3f810c67 (Release 3.16.0, master)88.06%2902855
PR #5969 head (d4493939)90.26%4794736

~98% of the measured files/lines in the uploaded report are test files, not shippable product code. Consequences:

  • Reported project coverage (~88–90%) is far above true product-code coverage and largely reflects test files executing themselves.
  • The number is unstable across commits (88% / 90% / 93%) depending on which sub-package uploads land, with no gate to wait for all of them.

Note: integration tests contribute no coverage (the integ build runs plain pytest with IGNORE_COVERAGE=- and no --cov), so this is purely the unit-coverage upload.

Verified real product coverage

A verification run in CI (all four unit suites unioned with a corrected --cov=sagemaker, test files excluded) shows the true product-code coverage:

PackageCoverage
sagemaker-mlops80.9%
sagemaker-serve76.0%
sagemaker-train72.2%
sagemaker-core67.4%
Overall70.7% (561 product files, 0 test files)

Fix

Add a repo-root codecov.yml that:

  • Scopes the Codecov report to product code via an ignore: list (tests, conftest.py, tests/data scripts, test_script.py, codegen and workflow_helper utilities, docs, examples). This corrects the report server-side, independent of the CI --cov flag.
  • Sets status checks calibrated to the verified baseline: projecttarget 65% (an explicit floor rather than auto, so the one-time recalibration from the inflated ~90% down to the true ~71% is not read as a regression, while still guarding against real drops) and patchtarget 70% on changed lines.
  • Sets codecov.notify.after_n_builds: 4 so the project % is computed once all four sub-package uploads are in.

Validated with the Codecov config validator (curl --data-binary @codecov.yml https://codecov.io/validateValid!).

Recommended companion change (separate, in the CI infra package)

The cleanest upstream fix is to change the CI unit command from --cov=. to --cov=sagemaker (match by import package name, which follows the installed package and excludes tests) so the generated coverage.xml never contains test files. That change lives in the internal CodeBuild infra package (SageMakerMLFPySDKInfraCDK/lib/buildspecs.ts), not this repo, so it is intentionally not part of this PR. The codecov.yml here fixes the reported number regardless, and both changes are complementary.

Note on the tox --fail-under gate

Each tox.ini defines coverage report --fail-under=86 under the runcoverage env, but CI does not invoke that env (it runs tox -e py310,py311,py312), so this change does not affect any CI gate. If a future coverage gate is wired up, the threshold should reflect the real ~71% baseline rather than the old inflated number.

Testing

  • python -c "import yaml; yaml.safe_load(open('codecov.yml'))" → parses.
  • Codecov validator returns Valid! and compiles the expected ignore regexes.
  • No product code, tox config, or CI workflow is modified; only a new codecov.yml is added.

@jam-jee
jam-jeeforce-pushed the fix/codecov-scope-product-code branch from d261c4a to 7211044CompareJuly 16, 2026 04:29
zhaoqizqwang
zhaoqizqwang previously approved these changes Jul 16, 2026
CI runs `pytest --cov=sagemaker` per sub-package and uploads to Codecov,
but coverage is not scoped to `src/` product code. Executed test-support
scripts (notably `*/tests/data/*.py` training entry-scripts and model
definitions) get recorded and uploaded.
With no `codecov.yml` ignore list, these dominate the report: recent
commits on master show ~98% of the measured files/lines are test files
rather than product code (e.g. commit 3f810c6: 285 of 290 reported
files are under tests/). This inflates the reported project coverage
(~88-90%) far above the true product-code coverage and makes the number
unreliable and unstable across commits.
Add a repo-root `codecov.yml` that scopes the report to product code via
an `ignore:` list (tests, conftest, test-data scripts, codegen and
workflow_helper utilities), and defines project/patch status targets and
`after_n_builds: 4` so the percentage is computed over all four
sub-package uploads. Validated with the Codecov config validator.
This follows how peer projects configure Codecov (scikit-learn ignores
conftest/externals; aws-cdk ignores non-product paths).
@jam-jee
jam-jeetemporarily deployed to manual-approval July 16, 2026 22:38 — with GitHub Actions Inactive
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@jam-jee@mujtaba1747@zhaoqizqwang@aviruthen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix: scope Codecov report to product code, excluding test files - #6034

Merged
jam-jee merged 1 commit into
aws:masterfrom
jam-jee:fix/codecov-scope-product-code
Jul 17, 2026
Merged

fix: scope Codecov report to product code, excluding test files#6034
jam-jee merged 1 commit into
aws:masterfrom
jam-jee:fix/codecov-scope-product-code

Conversation

@jam-jee

@jam-jeejam-jee commented Jul 16, 2026

Copy link
Copy Markdown
Collaborator

Issue

CI uploads unit-test coverage to Codecov, but the coverage is not scoped to src/ product code, so test code and test-support scripts dominate the report.

Root cause (confirmed): the CI unit-test build runs, from inside each sub-package directory:

cd $CODEBUILD_SRC_DIR/$SUBMODULE
tox -e py310,py311,py312 -- tests/unit -v --cov=. --cov-append --cov-report=xml

--cov=. measures the entire submodule directory, which contains both src/ and tests/. So executed test files and test-data scripts (e.g. tests/data/*.py training entry-scripts and model definitions) are recorded and uploaded alongside product code. (The buildspec lives in the internal CDK infra package, not this repo.)

Inspecting the Codecov API for recent commits confirms the effect:

CommitReportedFiles in reportTest filesProduct files
3f810c67 (Release 3.16.0, master)88.06%2902855
PR #5969 head (d4493939)90.26%4794736

~98% of the measured files/lines in the uploaded report are test files, not shippable product code. Consequences:

  • Reported project coverage (~88–90%) is far above true product-code coverage and largely reflects test files executing themselves.
  • The number is unstable across commits (88% / 90% / 93%) depending on which sub-package uploads land, with no gate to wait for all of them.

Note: integration tests contribute no coverage (the integ build runs plain pytest with IGNORE_COVERAGE=- and no --cov), so this is purely the unit-coverage upload.

Verified real product coverage

A verification run in CI (all four unit suites unioned with a corrected --cov=sagemaker, test files excluded) shows the true product-code coverage:

PackageCoverage
sagemaker-mlops80.9%
sagemaker-serve76.0%
sagemaker-train72.2%
sagemaker-core67.4%
Overall70.7% (561 product files, 0 test files)

Fix

Add a repo-root codecov.yml that:

  • Scopes the Codecov report to product code via an ignore: list (tests, conftest.py, tests/data scripts, test_script.py, codegen and workflow_helper utilities, docs, examples). This corrects the report server-side, independent of the CI --cov flag.
  • Sets status checks calibrated to the verified baseline: projecttarget 65% (an explicit floor rather than auto, so the one-time recalibration from the inflated ~90% down to the true ~71% is not read as a regression, while still guarding against real drops) and patchtarget 70% on changed lines.
  • Sets codecov.notify.after_n_builds: 4 so the project % is computed once all four sub-package uploads are in.

Validated with the Codecov config validator (curl --data-binary @codecov.yml https://codecov.io/validateValid!).

Recommended companion change (separate, in the CI infra package)

The cleanest upstream fix is to change the CI unit command from --cov=. to --cov=sagemaker (match by import package name, which follows the installed package and excludes tests) so the generated coverage.xml never contains test files. That change lives in the internal CodeBuild infra package (SageMakerMLFPySDKInfraCDK/lib/buildspecs.ts), not this repo, so it is intentionally not part of this PR. The codecov.yml here fixes the reported number regardless, and both changes are complementary.

Note on the tox --fail-under gate

Each tox.ini defines coverage report --fail-under=86 under the runcoverage env, but CI does not invoke that env (it runs tox -e py310,py311,py312), so this change does not affect any CI gate. If a future coverage gate is wired up, the threshold should reflect the real ~71% baseline rather than the old inflated number.

Testing

  • python -c "import yaml; yaml.safe_load(open('codecov.yml'))" → parses.
  • Codecov validator returns Valid! and compiles the expected ignore regexes.
  • No product code, tox config, or CI workflow is modified; only a new codecov.yml is added.

@jam-jee
jam-jeeforce-pushed the fix/codecov-scope-product-code branch from d261c4a to 7211044CompareJuly 16, 2026 04:29
zhaoqizqwang
zhaoqizqwang previously approved these changes Jul 16, 2026
CI runs `pytest --cov=sagemaker` per sub-package and uploads to Codecov,
but coverage is not scoped to `src/` product code. Executed test-support
scripts (notably `*/tests/data/*.py` training entry-scripts and model
definitions) get recorded and uploaded.
With no `codecov.yml` ignore list, these dominate the report: recent
commits on master show ~98% of the measured files/lines are test files
rather than product code (e.g. commit 3f810c6: 285 of 290 reported
files are under tests/). This inflates the reported project coverage
(~88-90%) far above the true product-code coverage and makes the number
unreliable and unstable across commits.
Add a repo-root `codecov.yml` that scopes the report to product code via
an `ignore:` list (tests, conftest, test-data scripts, codegen and
workflow_helper utilities), and defines project/patch status targets and
`after_n_builds: 4` so the percentage is computed over all four
sub-package uploads. Validated with the Codecov config validator.
This follows how peer projects configure Codecov (scikit-learn ignores
conftest/externals; aws-cdk ignores non-product paths).
@jam-jee
jam-jeetemporarily deployed to manual-approval July 16, 2026 22:38 — with GitHub Actions Inactive
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@jam-jee@mujtaba1747@zhaoqizqwang@aviruthen