Repository navigation
Fix Mako search scraping - #9
Conversation
|
pr-agent-context report: This is a refreshed snapshot of the current PR state.
Below are the details of possibly unresolved review comments and/or (possibly) failing checks on PR
#9.
For each unresolved comment (if any), recommend one of: resolve as irrelevant, accept and implement
the recommended solution, open a separate issue and resolve as out-of-scope for this PR, accept and
implement a different solution, or resolve as already treated by the code.
After I reply with my decision per item, implement the accepted actions, resolve the corresponding
PR comments, fix each failing check below (if any), and push all of these changes in a single
commit.
# Codecov/patch
Codecov shows patch test coverage is 0%; please raise it to 100%. These are the uncovered code
lines:
- src/denbust/sources/mako.py: 24, 102, 108, 109, 110, 159, 295, 296, 298, 300
- tests/integration/test_scrapers.py: 32Run metadata: |
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #9 +/- ##
==========================================
+ Coverage 67.91% 71.80% +3.89%
==========================================
Files 14 13 -1
Lines 938 1096 +158
==========================================
+ Hits 637 787 +150
- Misses 301 309 +8
🚀 New features to boost your workflow:
|
|
pr-agent-context report: This is a refreshed snapshot of the current PR state.
Below are the details of possibly unresolved review comments and/or (possibly) failing checks on PR
#9.
For each unresolved comment (if any), recommend one of: resolve as irrelevant, accept and implement
the recommended solution, open a separate issue and resolve as out-of-scope for this PR, accept and
implement a different solution, or resolve as already treated by the code.
After I reply with my decision per item, implement the accepted actions, resolve the corresponding
PR comments, fix each failing check below (if any), and push all of these changes in a single
commit.
# Other Review Comments
## REVIEW-1
Location: tests/integration/test_scrapers.py:46
URL: https://github.com/DataHackIL/tfht_enforce_idx/pull/9#discussion_r2931488289
Root author: copilot-pull-request-reviewer
Comment:
The new assertion `any(article.date.year == 2026 ...)` can pass even if date parsing fails, because `_parse_article_item` falls back to `datetime.now(UTC)` when it can’t parse a date (and the current year is 2026). To actually validate the new 2-digit date parsing, assert a specific parsed date/day from the fixture (e.g., one article has 2026-03-06 UTC) rather than only the year.
## REVIEW-2
Location: src/denbust/sources/mako.py:24
URL: https://github.com/DataHackIL/tfht_enforce_idx/pull/9#discussion_r2931488327
Root author: copilot-pull-request-reviewer
Comment:
`MAKO_SEARCH_CHANNEL_ID` is a hard-coded opaque identifier that’s likely to change when Mako reconfigures their search. Please add an in-code note explaining where this value comes from and consider a more resilient strategy (e.g., making it configurable or retrying the request without these channelId/vgnextoid params if the search page stops returning results).
# Codecov/patch
Codecov shows patch test coverage is 0%; please raise it to 100%. These are the uncovered code
lines:
- src/denbust/sources/mako.py: 24, 102, 108, 109, 110, 159, 295, 296, 298, 300
- tests/integration/test_scrapers.py: 32, 78, 81, 82, 83Run metadata: |
There was a problem hiding this comment.
Pull request overview
Updates the Mako scraper to work with Mako’s current search experience by switching to the live /Search endpoint, adapting parsing to the new result-card markup, and refreshing integration fixtures/tests accordingly.
Changes:
- Switch Mako keyword search from the old AJAX endpoint to
https://www.mako.co.il/Searchwith updated query parameters. - Update HTML parsing to handle
li.articleinscards and support 2-digit date formats in search metadata. - Refresh Mako search HTML fixture and adjust integration tests; extend
.gitignorefor local-only files.
Reviewed changes
Copilot reviewed 3 out of 4 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
src/denbust/sources/mako.py |
Updates search endpoint/params and parsing logic for new Mako search markup + date formats. |
tests/integration/test_scrapers.py |
Updates mocked search URL and adds an assertion intended to validate new date parsing. |
tests/fixtures/html/mako_search.html |
Refreshes fixture to match current Mako search result HTML structure and 2-digit date display. |
.gitignore |
Ignores local config/data/env/tool-version files as described in PR summary. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
You can also share your feedback on Copilot code review. Take the survey.
|
pr-agent-context report: This is a refreshed snapshot of the current PR state.
Below are the details of possibly unresolved review comments and/or (possibly) failing checks on PR
#9.
For each unresolved comment (if any), recommend one of: resolve as irrelevant, accept and implement
the recommended solution, open a separate issue and resolve as out-of-scope for this PR, accept and
implement a different solution, or resolve as already treated by the code.
After I reply with my decision per item, implement the accepted actions, resolve the corresponding
PR comments, fix each failing check below (if any), and push all of these changes in a single
commit.
# Other Review Comments
## REVIEW-1
Location: tests/integration/test_scrapers.py:46
URL: https://github.com/DataHackIL/tfht_enforce_idx/pull/9#discussion_r2931488289
Root author: copilot-pull-request-reviewer
Comment:
The new assertion `any(article.date.year == 2026 ...)` can pass even if date parsing fails, because `_parse_article_item` falls back to `datetime.now(UTC)` when it can’t parse a date (and the current year is 2026). To actually validate the new 2-digit date parsing, assert a specific parsed date/day from the fixture (e.g., one article has 2026-03-06 UTC) rather than only the year.
## REVIEW-2
Location: src/denbust/sources/mako.py:24
URL: https://github.com/DataHackIL/tfht_enforce_idx/pull/9#discussion_r2931488327
Root author: copilot-pull-request-reviewer
Comment:
`MAKO_SEARCH_CHANNEL_ID` is a hard-coded opaque identifier that’s likely to change when Mako reconfigures their search. Please add an in-code note explaining where this value comes from and consider a more resilient strategy (e.g., making it configurable or retrying the request without these channelId/vgnextoid params if the search page stops returning results).
# Codecov/patch
Codecov shows patch test coverage is 0%; please raise it to 100%. These are the uncovered code
lines:
- src/denbust/sources/mako.py: 24, 102, 108, 109, 110, 159, 295, 296, 298, 300
- tests/integration/test_scrapers.py: 32, 78, 81, 82, 83Run metadata: |
|
pr-agent-context report: This is a refreshed snapshot of the current PR state.
Below are the details of possibly unresolved review comments and/or (possibly) failing checks on PR
#9.
For each unresolved comment (if any), recommend one of: resolve as irrelevant, accept and implement
the recommended solution, open a separate issue and resolve as out-of-scope for this PR, accept and
implement a different solution, or resolve as already treated by the code.
After I reply with my decision per item, implement the accepted actions, resolve the corresponding
PR comments, fix each failing check below (if any), and push all of these changes in a single
commit.
# Other Review Comments
## REVIEW-1
Location: tests/integration/test_scrapers.py:46
URL: https://github.com/DataHackIL/tfht_enforce_idx/pull/9#discussion_r2931488289
Root author: copilot-pull-request-reviewer
Comment:
The new assertion `any(article.date.year == 2026 ...)` can pass even if date parsing fails, because `_parse_article_item` falls back to `datetime.now(UTC)` when it can’t parse a date (and the current year is 2026). To actually validate the new 2-digit date parsing, assert a specific parsed date/day from the fixture (e.g., one article has 2026-03-06 UTC) rather than only the year.
## REVIEW-2
Location: src/denbust/sources/mako.py:24
URL: https://github.com/DataHackIL/tfht_enforce_idx/pull/9#discussion_r2931488327
Root author: copilot-pull-request-reviewer
Comment:
`MAKO_SEARCH_CHANNEL_ID` is a hard-coded opaque identifier that’s likely to change when Mako reconfigures their search. Please add an in-code note explaining where this value comes from and consider a more resilient strategy (e.g., making it configurable or retrying the request without these channelId/vgnextoid params if the search page stops returning results).
# Codecov/patch
Codecov shows patch test coverage is 0%; please raise it to 100%. These are the uncovered code
lines:
- src/denbust/sources/mako.py: 24, 102, 108, 109, 110, 159, 295, 296, 298, 300
- tests/integration/test_scrapers.py: 32, 78, 81, 82, 83Run metadata: |
|
pr-agent-context report: This is a refreshed snapshot of the current PR state.
Below are the details of possibly unresolved review comments and/or (possibly) failing checks on PR
#9.
For each unresolved comment (if any), recommend one of: resolve as irrelevant, accept and implement
the recommended solution, open a separate issue and resolve as out-of-scope for this PR, accept and
implement a different solution, or resolve as already treated by the code.
After I reply with my decision per item, implement the accepted actions, resolve the corresponding
PR comments, fix each failing check below (if any), and push all of these changes in a single
commit.
# Other Review Comments
## REVIEW-1
Location: tests/integration/test_scrapers.py:46
URL: https://github.com/DataHackIL/tfht_enforce_idx/pull/9#discussion_r2931488289
Root author: copilot-pull-request-reviewer
Comment:
The new assertion `any(article.date.year == 2026 ...)` can pass even if date parsing fails, because `_parse_article_item` falls back to `datetime.now(UTC)` when it can’t parse a date (and the current year is 2026). To actually validate the new 2-digit date parsing, assert a specific parsed date/day from the fixture (e.g., one article has 2026-03-06 UTC) rather than only the year.
## REVIEW-2
Location: src/denbust/sources/mako.py:24
URL: https://github.com/DataHackIL/tfht_enforce_idx/pull/9#discussion_r2931488327
Root author: copilot-pull-request-reviewer
Comment:
`MAKO_SEARCH_CHANNEL_ID` is a hard-coded opaque identifier that’s likely to change when Mako reconfigures their search. Please add an in-code note explaining where this value comes from and consider a more resilient strategy (e.g., making it configurable or retrying the request without these channelId/vgnextoid params if the search page stops returning results).
# Codecov/patch
Codecov shows patch test coverage is 0%; please raise it to 100%. These are the uncovered code
lines:
- src/denbust/sources/mako.py: 24, 102, 108, 109, 110, 159, 295, 296, 298, 300
- tests/integration/test_scrapers.py: 32, 78, 81, 82, 83Run metadata: |
|
pr-agent-context report: This is a refreshed snapshot of the current PR state.
Below are the details of possibly unresolved review comments and/or (possibly) failing checks on PR
#9.
For each unresolved comment (if any), recommend one of: resolve as irrelevant, accept and implement
the recommended solution, open a separate issue and resolve as out-of-scope for this PR, accept and
implement a different solution, or resolve as already treated by the code.
After I reply with my decision per item, implement the accepted actions, resolve the corresponding
PR comments, fix each failing check below (if any), and push all of these changes in a single
commit.
# Other Review Comments
## REVIEW-1
Location: tests/integration/test_scrapers.py:46
URL: https://github.com/DataHackIL/tfht_enforce_idx/pull/9#discussion_r2931488289
Root author: copilot-pull-request-reviewer
Comment:
The new assertion `any(article.date.year == 2026 ...)` can pass even if date parsing fails, because `_parse_article_item` falls back to `datetime.now(UTC)` when it can’t parse a date (and the current year is 2026). To actually validate the new 2-digit date parsing, assert a specific parsed date/day from the fixture (e.g., one article has 2026-03-06 UTC) rather than only the year.
## REVIEW-2
Location: src/denbust/sources/mako.py:24
URL: https://github.com/DataHackIL/tfht_enforce_idx/pull/9#discussion_r2931488327
Root author: copilot-pull-request-reviewer
Comment:
`MAKO_SEARCH_CHANNEL_ID` is a hard-coded opaque identifier that’s likely to change when Mako reconfigures their search. Please add an in-code note explaining where this value comes from and consider a more resilient strategy (e.g., making it configurable or retrying the request without these channelId/vgnextoid params if the search page stops returning results).
# Failing Workflows
## FAIL-1
Type: GitHub Actions job
Workflow: codecov-yaml-validate
Job: Validate Codecov YAML
Run number: 1
Run attempt: 1
Conclusion: failure
URL: https://github.com/DataHackIL/tfht_enforce_idx/actions/runs/23056183216/job/66970155350
Failed steps: Validate Codecov YAML
Summary:
Fix Mako search scraping
# Codecov/patch
Codecov shows patch test coverage is 0%; please raise it to 100%. These are the uncovered code
lines:
- src/denbust/sources/mako.py: 24, 102, 108, 109, 110, 159, 295, 296, 298, 300
- tests/integration/test_scrapers.py: 32, 78, 81, 82, 83Run metadata: |
|
pr-agent-context report: 🚨 `pr-agent-context` failed while preparing PR context.
PR: #9
Error: GitHubApiError: GitHub API error 401: Server failed to authenticate the request. Please refer to the information in the www-authenticate header.
Run: https://github.com/DataHackIL/tfht_enforce_idx/actions/runs/23056318810
The workflow continued gracefully so this failure does not block CI.
Check the job logs for the full traceback.Run metadata: |
|
pr-agent-context report: This is a refreshed snapshot of the current PR state.
Below are the details of possibly unresolved review comments and/or (possibly) failing checks on PR
#9.
For each unresolved comment (if any), recommend one of: resolve as irrelevant, accept and implement
the recommended solution, open a separate issue and resolve as out-of-scope for this PR, accept and
implement a different solution, or resolve as already treated by the code.
After I reply with my decision per item, implement the accepted actions, resolve the corresponding
PR comments, fix each failing check below (if any), and push all of these changes in a single
commit.
# Other Review Comments
## REVIEW-1
Location: tests/integration/test_scrapers.py:46
URL: https://github.com/DataHackIL/tfht_enforce_idx/pull/9#discussion_r2931488289
Root author: copilot-pull-request-reviewer
Comment:
The new assertion `any(article.date.year == 2026 ...)` can pass even if date parsing fails, because `_parse_article_item` falls back to `datetime.now(UTC)` when it can’t parse a date (and the current year is 2026). To actually validate the new 2-digit date parsing, assert a specific parsed date/day from the fixture (e.g., one article has 2026-03-06 UTC) rather than only the year.
## REVIEW-2
Location: src/denbust/sources/mako.py:24
URL: https://github.com/DataHackIL/tfht_enforce_idx/pull/9#discussion_r2931488327
Root author: copilot-pull-request-reviewer
Comment:
`MAKO_SEARCH_CHANNEL_ID` is a hard-coded opaque identifier that’s likely to change when Mako reconfigures their search. Please add an in-code note explaining where this value comes from and consider a more resilient strategy (e.g., making it configurable or retrying the request without these channelId/vgnextoid params if the search page stops returning results).
# Codecov/patch
Codecov shows patch test coverage is 0%; please raise it to 100%. These are the uncovered code
lines:
- src/denbust/sources/mako.py: 24, 102, 108, 109, 110, 159, 295, 296, 298, 300
- tests/integration/test_scrapers.py: 32, 78, 81, 82, 83Run metadata: |
|
pr-agent-context report: This is a refreshed snapshot of the current PR state.
Below are the details of possibly unresolved review comments and/or (possibly) failing checks on PR
#9.
For each unresolved comment (if any), recommend one of: resolve as irrelevant, accept and implement
the recommended solution, open a separate issue and resolve as out-of-scope for this PR, accept and
implement a different solution, or resolve as already treated by the code.
After I reply with my decision per item, implement the accepted actions, resolve the corresponding
PR comments, fix each failing check below (if any), and push all of these changes in a single
commit.
# Codecov/patch
Codecov shows patch test coverage is 0%; please raise it to 100%. These are the uncovered code
lines:
- src/denbust/sources/mako.py: 24, 108, 109, 110, 111, 112, 129, 130, 132, 133, 134, 178, 314, 316, 319, 321
- tests/integration/test_scrapers.py: 3, 81, 82, 83, 86, 89, 93, 94, 97, 99, 100, 101, 103, 104Run metadata: |
|
pr-agent-context report: This is a refreshed snapshot of the current PR state.
Below are the details of possibly unresolved review comments and/or (possibly) failing checks on PR
#9.
For each unresolved comment (if any), recommend one of: resolve as irrelevant, accept and implement
the recommended solution, open a separate issue and resolve as out-of-scope for this PR, accept and
implement a different solution, or resolve as already treated by the code.
After I reply with my decision per item, implement the accepted actions, resolve the corresponding
PR comments, fix each failing check below (if any), and push all of these changes in a single
commit.
# Codecov/patch
Codecov shows patch test coverage is 0%; please raise it to 100%. These are the uncovered code
lines:
- src/denbust/sources/mako.py: 6, 9, 24, 27, 30, 32, 33, 35, 36, 38, 40, 50, 52, 53, 55, 81, 85, 87, 97, 98, 101, 102, 129, 132, 133, 134, 135, 136, 137, 138, 140, 150, 151, 154, 156, 157, 159, 161, 174, 175, 178, 179, 185, 196, 197, 198, 199, 202, 203, 204, 205, 208, 212, 213, 215, 216, 219, 220, 223, 224, 225, 226, 229, 237, 247, 248, 250, 251, 252, 253, 254, 255, 258, 259, 260, 261, 264, 265, 266, 267, 269, 271, 290, 291
- tests/integration/test_scrapers.py: 3, 32, 45, 48, 50, 51, 53, 57, 60, 67, 69, 74, 75, 78, 81, 82, 83, 97, 99, 100, 101, 103, 104, 106, 107, 110, 113, 116, 117, 118, 120, 122, 124, 126, 127, 132, 135, 136, 137, 139, 140, 141, 143, 145, 147, 149, 152Run metadata: |
|
pr-agent-context report: This is a refreshed snapshot of the current PR state.
Below are the details of possibly unresolved review comments and/or (possibly) failing checks on PR
#9.
For each unresolved comment (if any), recommend one of: resolve as irrelevant, accept and implement
the recommended solution, open a separate issue and resolve as out-of-scope for this PR, accept and
implement a different solution, or resolve as already treated by the code.
After I reply with my decision per item, implement the accepted actions, resolve the corresponding
PR comments, fix each failing check below (if any), and push all of these changes in a single
commit.
# Codecov/patch
Codecov shows patch test coverage is 0%; please raise it to 100%. These are the uncovered code
lines:
- src/denbust/sources/mako.py: 6, 9, 24, 27, 30, 32, 33, 35, 36, 38, 40, 50, 52, 53, 55, 81, 85, 87, 97, 98, 101, 102, 129, 132, 133, 134, 135, 136, 137, 138, 140, 150, 151, 154, 156, 157, 159, 161, 174, 175, 178, 179, 185, 196, 197, 198, 199, 202, 203, 204, 205, 208, 212, 213, 215, 216, 219, 220, 223, 224, 225, 226, 229, 237, 247, 248, 250, 251, 252, 253, 254, 255, 258, 259, 260, 261, 264, 265, 266, 267, 269, 271, 290, 291
- tests/integration/test_scrapers.py: 3, 32, 45, 48, 50, 51, 53, 57, 60, 67, 69, 74, 75, 78, 81, 82, 83, 97, 99, 100, 101, 103, 104, 106, 107, 110, 113, 116, 117, 118, 120, 122, 124, 126, 127, 132, 135, 136, 137, 139, 140, 141, 143, 145, 147, 149, 152Run metadata: |
|
pr-agent-context report: Below are the details of possibly unresolved review comments and/or (possibly) failing checks on PR
#9.
For each unresolved comment (if any), recommend one of: resolve as irrelevant, accept and implement
the recommended solution, open a separate issue and resolve as out-of-scope for this PR, accept and
implement a different solution, or resolve as already treated by the code.
After I reply with my decision per item, implement the accepted actions, resolve the corresponding
PR comments, fix each failing check below (if any), and push all of these changes in a single
commit.
# Codecov/patch
Codecov shows patch test coverage is 0%; please raise it to 100%. These are the uncovered code
lines:
- src/denbust/sources/mako.py: 6, 8, 9, 24, 27, 30, 31, 36, 42, 43, 44, 45, 46, 49, 50, 53, 54, 55, 56, 81, 85, 87, 88, 92, 96, 100, 101, 102, 104, 105, 115, 118, 120, 121, 122, 123, 128, 129, 131, 132, 133, 138, 139, 140, 141, 146, 153, 156, 158, 159, 161, 163, 167, 168, 169, 170, 172, 178, 179, 185, 186, 188, 192, 193, 194, 201, 203, 210, 218, 219, 220, 221, 226, 229, 230, 231, 236, 237, 238, 243, 245, 247, 248, 250, 254, 260, 262, 264, 270, 271, 272, 274, 291, 345, 415, 416, 417, 418, 419, 420, 421Run metadata: |
for more information, see https://pre-commit.ci
|
pr-agent-context report: This is a refreshed snapshot of the current PR state.
Below are the details of possibly unresolved review comments and/or (possibly) failing checks on PR
#9.
For each unresolved comment (if any), recommend one of: resolve as irrelevant, accept and implement
the recommended solution, open a separate issue and resolve as out-of-scope for this PR, accept and
implement a different solution, or resolve as already treated by the code.
After I reply with my decision per item, implement the accepted actions, resolve the corresponding
PR comments, fix each failing check below (if any), and push all of these changes in a single
commit.
# Codecov/patch
Codecov shows patch test coverage is 0%; please raise it to 100%. These are the uncovered code
lines:
- src/denbust/sources/mako.py: 3, 4, 10, 11, 19, 30, 32, 35, 36, 38, 40, 50, 52, 53, 55, 60, 63, 64, 65, 66, 69, 70, 101, 102, 110, 111, 112, 114, 116, 129, 132, 133, 134, 135, 136, 137, 138, 140, 150, 151, 154, 155, 156, 157, 159, 161, 174, 175, 178, 179, 180, 181, 183, 185, 196, 198, 199, 200, 202, 203, 204, 205, 208, 209, 212, 213, 215, 216, 219, 220, 224, 225, 226, 227, 229, 237, 247, 248, 250, 251, 252, 253, 254, 255, 258, 259, 260, 261, 264, 265, 266, 267, 269, 271, 281, 282, 283, 284, 285, 286, 287, 323
- tests/integration/test_scrapers.py: 3, 32, 45, 48, 50, 51, 53, 57, 60, 67, 69, 74, 75, 78, 81, 82, 83, 97, 99, 100, 101, 103, 104, 106, 107, 110, 113, 116, 117, 118, 120, 122, 124, 126, 127, 132, 135, 136, 137, 139, 140, 141, 143, 145, 147, 149, 152Run metadata: |
|
pr-agent-context report: This is a refreshed snapshot of the current PR state.
Below are the details of possibly unresolved review comments and/or (possibly) failing checks on PR
#9.
For each unresolved comment (if any), recommend one of: resolve as irrelevant, accept and implement
the recommended solution, open a separate issue and resolve as out-of-scope for this PR, accept and
implement a different solution, or resolve as already treated by the code.
After I reply with my decision per item, implement the accepted actions, resolve the corresponding
PR comments, fix each failing check below (if any), and push all of these changes in a single
commit.
# Codecov/patch
Codecov shows patch test coverage is 0%; please raise it to 100%. These are the uncovered code
lines:
- src/denbust/sources/mako.py: 3, 4, 10, 11, 19, 30, 32, 35, 36, 38, 40, 50, 52, 53, 55, 60, 63, 64, 65, 66, 69, 70, 101, 102, 110, 111, 112, 114, 116, 129, 132, 133, 134, 135, 136, 137, 138, 140, 150, 151, 154, 155, 156, 157, 159, 161, 174, 175, 178, 179, 180, 181, 183, 185, 196, 198, 199, 200, 202, 203, 204, 205, 208, 209, 212, 213, 215, 216, 219, 220, 224, 225, 226, 227, 229, 237, 247, 248, 250, 251, 252, 253, 254, 255, 258, 259, 260, 261, 264, 265, 266, 267, 269, 271, 281, 282, 283, 284, 285, 286, 287, 323
- tests/integration/test_scrapers.py: 3, 32, 45, 48, 50, 51, 53, 57, 60, 67, 69, 74, 75, 78, 81, 82, 83, 97, 99, 100, 101, 103, 104, 106, 107, 110, 113, 116, 117, 118, 120, 122, 124, 126, 127, 132, 135, 136, 137, 139, 140, 141, 143, 145, 147, 149, 152Run metadata: |
There was a problem hiding this comment.
Pull request overview
Updates the Mako scraper to use the live /Search page (now requiring a browser-rendered fetch) and refreshes parsing/tests/CI tooling to match the current Mako markup and reporting needs.
Changes:
- Replace Mako’s old AJAX search with Playwright-driven navigation to
/Search, including challenge/ready-state handling and a channel-id fallback retry. - Update Mako HTML fixture and integration tests to validate the new search-result card structure and 2-digit date parsing.
- Adjust project/CI coverage + add lightweight config-validation workflows; extend
.gitignorefor local-only files.
Reviewed changes
Copilot reviewed 10 out of 11 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
src/denbust/sources/mako.py |
Switches Mako scraping to Playwright, updates search URL building, readiness waits, and parsing selectors/date parsing. |
tests/integration/test_scrapers.py |
Updates/expands Mako integration coverage to validate new parsing and browser-fetch flow via monkeypatching. |
tests/fixtures/html/mako_search.html |
Refreshes fixture to match current /Search result-card markup and 2-digit dates. |
pyproject.toml |
Adds Playwright dependency and introduces coverage configuration in pyproject. |
README.md |
Documents Playwright/Chromium installation requirement for Mako scraping. |
.gitignore |
Ignores local config/data/env/tool-version files (including uv.lock). |
.github/workflows/ci-test.yml |
Tweaks coverage invocation/output and Codecov upload configuration. |
.github/workflows/pyproject-validate.yml |
Adds a PR-scoped pyproject validator workflow. |
.github/workflows/codecov-yaml-validate.yml |
Adds a PR-scoped Codecov YAML validator workflow. |
.codecov.yml |
Updates Codecov configuration and PR comment settings. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
You can also share your feedback on Copilot code review. Take the survey.
|
pr-agent-context report: This is a refreshed snapshot of the current PR state.
Below are the details of possibly unresolved review comments and/or (possibly) failing checks on PR
#9.
For each unresolved comment (if any), recommend one of: resolve as irrelevant, accept and implement
the recommended solution, open a separate issue and resolve as out-of-scope for this PR, accept and
implement a different solution, or resolve as already treated by the code.
After I reply with my decision per item, implement the accepted actions, resolve the corresponding
PR comments, fix each failing check below (if any), and push all of these changes in a single
commit.
# Other Review Comments
## REVIEW-1
Location: src/denbust/sources/mako.py:116
URL: https://github.com/DataHackIL/tfht_enforce_idx/pull/9#discussion_r2935158599
Root author: copilot-pull-request-reviewer
Comment:
`fetch()` wraps the entire scrape (all keywords + section) in a single broad `except Exception` and returns `[]` on any error. That means a transient failure for one keyword/section (timeout, navigation error, etc.) discards articles already collected and prevents scraping remaining keywords. Consider handling errors per keyword/section (log and continue), and only returning `[]` when the browser session cannot be opened at all; also prefer `logger.exception(...)` (or `exc_info=True`) so the stack trace is preserved for debugging.
## REVIEW-2
Location: tests/integration/test_scrapers.py:89
URL: https://github.com/DataHackIL/tfht_enforce_idx/pull/9#discussion_r2935158605
Root author: copilot-pull-request-reviewer
Comment:
These integration tests call `MakoScraper.fetch()`, which currently sleeps 1.5s per keyword (plus an additional sleep before section scraping). With three keywords this adds ~6s of wall time to this test alone even though all I/O is monkeypatched. Consider monkeypatching the sleep used by `denbust.sources.mako` to a no-op for the test, or adding a configurable rate-limit delay (defaulting to 1.5s) that tests can set to 0.
## REVIEW-3
Location: tests/integration/test_scrapers.py:131
URL: https://github.com/DataHackIL/tfht_enforce_idx/pull/9#discussion_r2935158610
Root author: copilot-pull-request-reviewer
Comment:
This test also calls `MakoScraper.fetch()`, which includes built-in `asyncio.sleep(1.5)` delays for rate limiting. Since the browser I/O is monkeypatched here, the sleep adds avoidable runtime to the test suite. Consider monkeypatching the sleep used by the Mako module (or allowing rate-limiting to be disabled in tests).
## REVIEW-4
Location: pyproject.toml:104
URL: https://github.com/DataHackIL/tfht_enforce_idx/pull/9#discussion_r2935158612
Root author: copilot-pull-request-reviewer
Comment:
`[tool.coverage.paths]` includes an absolute local workstation path (`/Users/shaypalachy/...`). This is contributor-specific noise in a shared repo config and can become stale or confusing for others. Consider removing local-user paths and keeping only generic/CI paths (or using a more general mapping approach) so coverage config remains portable.
## REVIEW-5
Location: .github/workflows/codecov-yaml-validate.yml:37
URL: https://github.com/DataHackIL/tfht_enforce_idx/pull/9#discussion_r2935158614
Root author: copilot-pull-request-reviewer
Comment:
The path filter triggers this workflow when `.codecov.yml`/`codecov.yml` changes, including deletions. In the deletion/rename case, the selection loop won’t find either file and the workflow fails even though there’s nothing to validate. Consider treating “no config file found” as a no-op success (exit 0) or adjusting the `paths` filter/logic to avoid running on deletion-only changes.
# Codecov/patch
Codecov shows patch test coverage is 0%; please raise it to 100%. These are the uncovered code
lines:
- src/denbust/sources/mako.py: 3, 8, 10, 11, 29, 32, 35, 36, 41, 49, 52, 53, 56, 57, 58, 59, 60, 63, 64, 67, 68, 69, 70, 95, 99, 101, 102, 106, 110, 114, 115, 116, 118, 119, 129, 132, 134, 135, 136, 137, 142, 143, 145, 146, 147, 152, 153, 154, 155, 160, 167, 170, 172, 173, 175, 177, 181, 182, 183, 184, 186, 192, 193, 199, 200, 202, 206, 207, 208, 215, 217, 224, 232, 233, 234, 235, 240, 243, 244, 245, 250, 251, 252, 257, 259, 261, 262, 264, 268, 274, 276, 278, 284, 285, 286, 288, 305, 359, 429, 430, 431, 432, 433, 434, 435Run metadata: |
|
pr-agent-context report: This is a refreshed snapshot of the current PR state.
Below are the details of possibly unresolved review comments and/or (possibly) failing checks on PR
#9.
For each unresolved comment (if any), recommend one of: resolve as irrelevant, accept and implement
the recommended solution, open a separate issue and resolve as out-of-scope for this PR, accept and
implement a different solution, or resolve as already treated by the code.
After I reply with my decision per item, implement the accepted actions, resolve the corresponding
PR comments, fix each failing check below (if any), and push all of these changes in a single
commit.
# Other Review Comments
## REVIEW-1
Location: tests/integration/test_scrapers.py:95
URL: https://github.com/DataHackIL/tfht_enforce_idx/pull/9#discussion_r2935158605
Root author: copilot-pull-request-reviewer
Comment:
These integration tests call `MakoScraper.fetch()`, which currently sleeps 1.5s per keyword (plus an additional sleep before section scraping). With three keywords this adds ~6s of wall time to this test alone even though all I/O is monkeypatched. Consider monkeypatching the sleep used by `denbust.sources.mako` to a no-op for the test, or adding a configurable rate-limit delay (defaulting to 1.5s) that tests can set to 0.
Replies:
- shaypal5
Addressed in `bea62e4`. The scraper now accepts an internal `rate_limit_delay_seconds` constructor
parameter with a default of `1.5`, and the mocked `fetch()` tests instantiate
`MakoScraper(rate_limit_delay_seconds=0)` so they no longer pay the sleep cost.
## REVIEW-2
Location: tests/integration/test_scrapers.py:137
URL: https://github.com/DataHackIL/tfht_enforce_idx/pull/9#discussion_r2935158610
Root author: copilot-pull-request-reviewer
Comment:
This test also calls `MakoScraper.fetch()`, which includes built-in `asyncio.sleep(1.5)` delays for rate limiting. Since the browser I/O is monkeypatched here, the sleep adds avoidable runtime to the test suite. Consider monkeypatching the sleep used by the Mako module (or allowing rate-limiting to be disabled in tests).
Replies:
- shaypal5
Addressed in `bea62e4` via the same delay-control change as the earlier test comment. The mocked
`fetch()` tests now run with `rate_limit_delay_seconds=0`, so the built-in rate limiting no longer
slows this case down.
# Failing Workflows
## FAIL-1
Type: Commit status
Context: pre-commit.ci - pr
Status: failure
URL: https://results.pre-commit.ci/run/github/1159993403/1773493449.aMLM1Uk_SjuwXDKsdsVcAw
Summary:
checks completed with failures
# Codecov/patch
Codecov shows patch test coverage is 0%; please raise it to 100%. These are the uncovered code
lines:
- src/denbust/sources/mako.py: 3, 8, 10, 11, 29, 32, 35, 36, 41, 49, 52, 53, 56, 57, 58, 59, 60, 61, 64, 65, 68, 69, 70, 71, 77, 80, 97, 102, 103, 104, 105, 106, 108, 110, 111, 112, 113, 114, 115, 117, 119, 120, 121, 124, 125, 127, 129, 130, 131, 132, 142, 145, 147, 148, 150, 152, 154, 155, 156, 157, 162, 163, 166, 167, 172, 173, 174, 175, 180, 187, 189, 190, 192, 193, 195, 197, 201, 202, 203, 204, 206, 212, 213, 219, 220, 222, 226, 227, 228, 235, 237, 244, 252, 253, 254, 255, 260, 263, 264, 265, 270, 271, 272, 277, 279, 281, 282, 284, 288, 294, 296, 298, 304, 305, 306, 308, 325, 379, 449, 450, 451, 452, 453, 454, 455Run metadata: |
for more information, see https://pre-commit.ci
|
pr-agent-context report: This is a refreshed snapshot of the current PR state.
Below are the details of possibly unresolved review comments and/or (possibly) failing checks on PR
#9.
For each unresolved comment (if any), recommend one of: resolve as irrelevant, accept and implement
the recommended solution, open a separate issue and resolve as out-of-scope for this PR, accept and
implement a different solution, or resolve as already treated by the code.
After I reply with my decision per item, implement the accepted actions, resolve the corresponding
PR comments, fix each failing check below (if any), and push all of these changes in a single
commit.
# Codecov/patch
Codecov shows patch test coverage is 0%; please raise it to 100%. These are the uncovered code
lines:
- src/denbust/sources/mako.py: 3, 4, 10, 11, 19, 30, 32, 35, 36, 38, 40, 50, 52, 53, 55, 60, 63, 64, 65, 66, 69, 70, 71, 77, 80, 97, 102, 108, 110, 111, 112, 113, 114, 129, 130, 132, 133, 134, 150, 154, 155, 156, 157, 159, 161, 174, 175, 178, 179, 180, 181, 183, 185, 196, 197, 198, 199, 200, 202, 203, 204, 205, 208, 209, 212, 213, 215, 220, 223, 224, 225, 226, 227, 229, 237, 247, 248, 250, 251, 252, 253, 254, 255, 258, 259, 260, 261, 265, 266, 267, 269, 271, 281, 282, 283, 284, 285, 286, 287, 290, 291, 292, 293, 294, 295, 296, 298, 300, 310, 325, 326
- tests/integration/test_scrapers.py: 3, 5, 27, 29, 51, 54, 57, 63, 67, 69, 74, 75, 78, 81, 82, 83, 86, 89, 93, 94, 97, 101, 103, 104, 106, 107, 110, 113, 116, 117, 118, 120, 122, 124, 126, 127, 132, 135, 136, 137, 139, 140, 141, 143, 145, 147, 149, 152, 155, 157, 158, 159, 161, 163, 165, 166, 169Run metadata: |
|
pr-agent-context report: 🚨 `pr-agent-context` failed while preparing PR context.
PR: #9
Error: GitHubApiError: GitHub API error 401: Server failed to authenticate the request. Please refer to the information in the www-authenticate header.
Run: https://github.com/DataHackIL/tfht_enforce_idx/actions/runs/23088568474
The workflow continued gracefully so this failure does not block CI.
Check the job logs for the full traceback.Run metadata: |
|
pr-agent-context report: This is a refreshed snapshot of the current PR state.
Below are the details of possibly unresolved review comments and/or (possibly) failing checks on PR
#9.
For each unresolved comment (if any), recommend one of: resolve as irrelevant, accept and implement
the recommended solution, open a separate issue and resolve as out-of-scope for this PR, accept and
implement a different solution, or resolve as already treated by the code.
After I reply with my decision per item, implement the accepted actions, resolve the corresponding
PR comments, fix each failing check below (if any), and push all of these changes in a single
commit.
# Codecov/patch
Codecov shows patch test coverage is 0%; please raise it to 100%. These are the uncovered code
lines:
- src/denbust/sources/mako.py: 3, 4, 9, 11, 22, 30, 32, 33, 36, 38, 40, 50, 52, 53, 55, 60, 63, 64, 65, 66, 69, 70, 71, 73, 76, 77, 78, 79, 80, 81, 82, 84, 85, 87, 97, 98, 101, 110, 132, 133, 134, 135, 136, 138, 140, 150, 151, 154, 155, 156, 157, 159, 161, 174, 178, 179, 180, 185, 198, 199, 200, 202, 203, 204, 205, 208, 209, 212, 213, 215, 216, 219, 220, 223, 224, 225, 226, 227, 229, 247, 248, 250, 251, 252, 253, 254, 255, 258, 259, 261, 264, 265, 266, 267, 269, 271, 281, 282, 283, 284, 285, 286, 287, 290, 291, 292, 293, 294, 295, 296, 298, 300, 310, 311, 314, 316, 319, 321, 322, 323, 324, 325, 326, 329, 330
- tests/integration/test_scrapers.py: 3, 5, 27, 29, 51, 54, 57, 63, 67, 69, 74, 75, 78, 81, 82, 83, 86, 89, 99, 100, 101, 103, 104, 106, 107, 110, 113, 116, 117, 118, 120, 122, 124, 126, 127, 132, 135, 136, 137, 139, 140, 141, 143, 145, 147, 149, 152, 155, 157, 158, 159, 161, 163, 165, 166, 169Run metadata: |
|
pr-agent-context report: Below are the details of possibly unresolved review comments and/or (possibly) failing checks on PR
#9.
For each unresolved comment (if any), recommend one of: resolve as irrelevant, accept and implement
the recommended solution, open a separate issue and resolve as out-of-scope for this PR, accept and
implement a different solution, or resolve as already treated by the code.
After I reply with my decision per item, implement the accepted actions, resolve the corresponding
PR comments, fix each failing check below (if any), and push all of these changes in a single
commit.
# Codecov/patch
Codecov shows patch test coverage is 0%; please raise it to 100%. These are the uncovered code
lines:
- src/denbust/sources/mako.py: 3, 8, 9, 11, 12, 30, 33, 36, 37, 45, 48, 49, 52, 53, 54, 55, 56, 57, 58, 59, 64, 65, 66, 71, 72, 83, 84, 87, 88, 89, 90, 93, 94, 97, 98, 99, 100, 101, 107, 110, 127, 132, 133, 134, 135, 136, 138, 140, 141, 142, 143, 144, 145, 147, 149, 150, 151, 154, 155, 159, 161, 162, 163, 164, 174, 177, 179, 180, 182, 184, 186, 187, 188, 189, 194, 195, 198, 199, 204, 205, 206, 207, 208, 213, 220, 222, 223, 225, 226, 228, 230, 234, 235, 238, 244, 245, 247, 249, 250, 252, 254, 261, 269, 270, 271, 272, 277, 280, 281, 282, 287, 288, 289, 294, 296, 303, 304, 305, 306, 311, 312, 314, 315, 316, 317, 318, 322, 323, 330, 332, 333, 334, 335, 343, 344, 345, 347, 348, 349, 351, 352, 356, 358, 360, 364, 366, 367, 368, 369, 370, 378, 380, 381, 383, 384, 385, 387, 388, 390, 392, 394, 395, 397, 399, 405, 413, 420, 422, 423, 425, 429, 435, 436, 438, 440, 441, 444, 445, 447, 449, 451, 460, 477, 531, 601, 602, 603, 604, 605, 606, 607Run metadata: |
for more information, see https://pre-commit.ci
|
pr-agent-context report: This is a refreshed snapshot of the current PR state.
Below are the details of possibly unresolved review comments and/or (possibly) failing checks on PR
#9.
For each unresolved comment (if any), recommend one of: resolve as irrelevant, accept and implement
the recommended solution, open a separate issue and resolve as out-of-scope for this PR, accept and
implement a different solution, or resolve as already treated by the code.
After I reply with my decision per item, implement the accepted actions, resolve the corresponding
PR comments, fix each failing check below (if any), and push all of these changes in a single
commit.
# Codecov/patch
Codecov shows patch test coverage is 0%; please raise it to 100%. These are the uncovered code
lines:
- src/denbust/sources/mako.py: 3, 4, 9, 11, 22, 30, 32, 33, 36, 38, 40, 50, 52, 53, 55, 60, 63, 64, 65, 66, 69, 70, 71, 73, 76, 77, 78, 79, 80, 81, 82, 84, 85, 87, 97, 98, 101, 110, 132, 133, 134, 135, 136, 138, 140, 150, 151, 154, 155, 156, 157, 159, 161, 174, 178, 179, 180, 185, 198, 199, 200, 202, 203, 204, 205, 208, 209, 212, 213, 215, 216, 219, 220, 223, 224, 225, 226, 227, 229, 247, 248, 250, 251, 252, 253, 254, 255, 258, 259, 261, 264, 265, 266, 267, 269, 271, 281, 282, 283, 284, 285, 286, 287, 290, 291, 292, 293, 294, 295, 296, 298, 300, 310, 311, 314, 316, 319, 321, 322, 323, 324, 325, 326, 329, 330
- tests/integration/test_scrapers.py: 3, 5, 27, 29, 51, 54, 57, 63, 67, 69, 74, 75, 78, 81, 82, 83, 86, 89, 93, 94, 97, 99, 101, 106, 110, 113, 116, 117, 118, 120, 122, 124, 126, 127, 132, 135, 136, 137, 139, 140, 141, 143, 145, 147, 149, 152, 155, 157, 158, 159, 161, 163, 165, 166, 169Run metadata: |
|
pr-agent-context report: 🚨 `pr-agent-context` failed while preparing PR context.
PR: #9
Error: CalledProcessError: Command '['git', '-C', '/home/runner/work/tfht_enforce_idx/tfht_enforce_idx/caller-repo', 'diff', '--unified=0', '495c869f688e7760def9041c422ba12cc8936c15...7a59c091d5f9b21ecaffa8f79a33ae92629546cd']' returned non-zero exit status 128.
Run: https://github.com/DataHackIL/tfht_enforce_idx/actions/runs/23089802018
The workflow continued gracefully so this failure does not block CI.
Check the job logs for the full traceback.Run metadata: |
Fixes all 16 issues raised in the post-merge review: Critical: - [#1] Orchestrator now checks config.enabled / config.mode at the top of evaluate_thin/evaluate_thick: mode=OFF or enabled=False returns a _noop_pass immediately without running any stage or writing telemetry; SHADOW mode downgrades drop→pass in _conclude while preserving stopped_at_stage for recall analysis; ENFORCE respects drops. - [#2] Stage objects are only instantiated when config.stages.X.enabled is True; disabled stages are stored as None, preventing model-load cost for stages like C (embedding) and D (SLM) that aren't in use. - [#3] Added @runtime_checkable StageEvaluator Protocol in models.py with uniform evaluate(candidate, pass_kind, body=None) signature; all four stage stubs (A–D) updated to that signature so the orchestrator calls them uniformly. - [#4] Removed duplicate ThinOrThick alias from cascade.py; PassKind from models.py is the single source of truth. Major: - [#5] StoppedAt = StageName | Literal["passed_all"] — no longer a copy-paste of the four stage letters. - [#6] PrefilterDecision.decided_at changed from str to datetime; telemetry writer converts to .isoformat() at the serialisation boundary; _path_for uses .strftime() directly on the datetime. - [#7] StageScore.__post_init__ validates p_negative and threshold are both in [0.0, 1.0], raising ValueError for out-of-range values. - [#8] Stage A re-run in evaluate_thick documented with an explicit Note in the docstring; thin-result passthrough deferred to a later PR. - [#9] Test fixtures now use typed aliases (StageName, Verdict, StoppedAt, PassKind) — all type: ignore[arg-type] comments removed from helpers. Minor: - [#10] flush() removed from PrefilterDecisionWriter. - [#11] _path_for no longer has a try/except — datetime param makes it unnecessary. - [#12] "short" removed from _hash_config docstring. - [#13] test_frozen uses pytest.raises(FrozenInstanceError) instead of try/except/else antipattern. - [#14] PrefilterStatePaths converted from pydantic BaseModel to @dataclasses.dataclass(frozen=True) — consistent with StageScore / PrefilterDecision. - [#15] __init__.py now exports CandidateView, StageEvaluator, PrefilterStatePaths, resolve_prefilter_state_paths, PassKind, Verdict. - [#16] cli.py summary command no longer hardcodes agents/news/local.yaml; prints an actionable error and exits 1 when --config is not supplied. Tests: 54 → 78 (+24), all passing. New coverage: StageScore bounds validation (5 tests), StageEvaluator protocol conformance for all four stages (5 tests), type-alias smoke checks (4 tests), OFF-mode no-telemetry (2 tests), disabled-flag suppression (1), shadow/enforce telemetry (2), shadow downgrade with monkeypatched stage (1), enforce drop with monkeypatched stage (1), disabled-stages-not-instantiated (1), decided_at-is-datetime (2). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(prefilter): LPF-PR-01 — prefilter package foundation, models, config, telemetry, no-op cascade Introduces the `denbust.prefilter` package (10 modules, 54 unit tests, 0 ruff/mypy errors): - `models.py`: `CandidateView` runtime-checkable Protocol, `StageScore` and `PrefilterDecision` frozen dataclasses with Literal-typed `StageName`, `PassKind`, `Verdict`, and `StoppedAt` fields. - `config.py`: `PrefilterMode(StrEnum)` (off/shadow/enforce), per-stage configs (`StageAConfig`–`StageDConfig`), `PrefilterStagesConfig`, `PrefilterRefreshConfig`, and `PrefilterConfig` root with `~`-expansion model_validator. - `state_paths.py`: `PrefilterStatePaths` pydantic model + `resolve_prefilter_state_paths()` anchoring artefacts under `<state_root>/<dataset>/<job>/prefilter/`. - `telemetry.py`: `PrefilterDecisionWriter` appending decisions to date-sharded `<decisions_dir>/YYYY-MM-DD.jsonl` files. - `cascade.py`: `CascadeOrchestrator` with `evaluate_thin()` / `evaluate_thick()` — always returns `verdict="pass"` stub; records every decision via the writer. - `stage_a.py`–`stage_d.py`: stub `evaluate()` methods returning `None` so the cascade always passes through; full implementations land in LPF-PR-03 through LPF-PR-07. - `cli.py`: `denbust prefilter summary` Typer command stub. - `__init__.py`: re-exports `CascadeOrchestrator`, `PrefilterConfig`, `PrefilterMode`, `PrefilterDecision`, `StageScore`. - `src/denbust/config.py`: adds `prefilter: PrefilterConfig` field to the root `Config`. - `src/denbust/cli.py`: registers `prefilter_app` under `denbust prefilter`. - `README.md`: retitles the cascade section to reflect active implementation. Cascade ships disabled (`mode: off`); no pipeline insertion in this PR. 54 unit tests covering protocol conformance, config validation, YAML round-trips, state-path resolution, JSONL telemetry, and cascade no-op behaviour. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs(plan): mark LPF-PR-01 done, update last-merged-PR reference (#158) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(prefilter): address code-review issues from PR #158 self-review Fixes all 16 issues raised in the post-merge review: Critical: - [#1] Orchestrator now checks config.enabled / config.mode at the top of evaluate_thin/evaluate_thick: mode=OFF or enabled=False returns a _noop_pass immediately without running any stage or writing telemetry; SHADOW mode downgrades drop→pass in _conclude while preserving stopped_at_stage for recall analysis; ENFORCE respects drops. - [#2] Stage objects are only instantiated when config.stages.X.enabled is True; disabled stages are stored as None, preventing model-load cost for stages like C (embedding) and D (SLM) that aren't in use. - [#3] Added @runtime_checkable StageEvaluator Protocol in models.py with uniform evaluate(candidate, pass_kind, body=None) signature; all four stage stubs (A–D) updated to that signature so the orchestrator calls them uniformly. - [#4] Removed duplicate ThinOrThick alias from cascade.py; PassKind from models.py is the single source of truth. Major: - [#5] StoppedAt = StageName | Literal["passed_all"] — no longer a copy-paste of the four stage letters. - [#6] PrefilterDecision.decided_at changed from str to datetime; telemetry writer converts to .isoformat() at the serialisation boundary; _path_for uses .strftime() directly on the datetime. - [#7] StageScore.__post_init__ validates p_negative and threshold are both in [0.0, 1.0], raising ValueError for out-of-range values. - [#8] Stage A re-run in evaluate_thick documented with an explicit Note in the docstring; thin-result passthrough deferred to a later PR. - [#9] Test fixtures now use typed aliases (StageName, Verdict, StoppedAt, PassKind) — all type: ignore[arg-type] comments removed from helpers. Minor: - [#10] flush() removed from PrefilterDecisionWriter. - [#11] _path_for no longer has a try/except — datetime param makes it unnecessary. - [#12] "short" removed from _hash_config docstring. - [#13] test_frozen uses pytest.raises(FrozenInstanceError) instead of try/except/else antipattern. - [#14] PrefilterStatePaths converted from pydantic BaseModel to @dataclasses.dataclass(frozen=True) — consistent with StageScore / PrefilterDecision. - [#15] __init__.py now exports CandidateView, StageEvaluator, PrefilterStatePaths, resolve_prefilter_state_paths, PassKind, Verdict. - [#16] cli.py summary command no longer hardcodes agents/news/local.yaml; prints an actionable error and exits 1 when --config is not supplied. Tests: 54 → 78 (+24), all passing. New coverage: StageScore bounds validation (5 tests), StageEvaluator protocol conformance for all four stages (5 tests), type-alias smoke checks (4 tests), OFF-mode no-telemetry (2 tests), disabled-flag suppression (1), shadow/enforce telemetry (2), shadow downgrade with monkeypatched stage (1), enforce drop with monkeypatched stage (1), disabled-stages-not-instantiated (1), decided_at-is-datetime (2). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Summary
/Searchendpoint instead of the dead AJAX search endpoint.gitignoreValidation
uv run pytest -q tests/integration/test_scrapers.py -k MakoNotes
.gitignoreentries