Skip to content

[codex] Gate scheduled runs on data quality#25

Merged
ethanolivertroy merged 1 commit into
mainfrom
codex/quality-gate-scheduled-runs
May 14, 2026
Merged

[codex] Gate scheduled runs on data quality#25
ethanolivertroy merged 1 commit into
mainfrom
codex/quality-gate-scheduled-runs

Conversation

@ethanolivertroy
Copy link
Copy Markdown
Member

What changed

  • Add algorithm_misses to the generated data-quality monitor checks.
  • Add --require-data-quality-pass to validate_api.py, failing validation when the data-quality monitor or any check is not pass.
  • Run the strict validator in both the checked-in artifact workflow and scheduled update workflow.
  • Update tests and README validation docs for the stricter gate.
  • Refresh generated API artifacts from the scraper run that produced the new quality check.

Why

The previous data-quality endpoint reported run health, but the scheduled workflow would still pass if the monitor warned. This makes the weekly Sunday update actively fail on cache/parser health regressions, including algorithm extraction misses.

Validation

  • .venv-codex/bin/python -m py_compile scraper.py validate_api.py test_scraper.py
  • .venv-codex/bin/python test_scraper.py
  • .venv-codex/bin/python validate_api.py --require-current-schema --forbid-firecrawl-run-source --require-data-quality-pass
  • git diff --check

@ethanolivertroy ethanolivertroy marked this pull request as ready for review May 14, 2026 13:45
@ethanolivertroy ethanolivertroy merged commit e2e700f into main May 14, 2026
1 check passed
@ethanolivertroy ethanolivertroy deleted the codex/quality-gate-scheduled-runs branch May 14, 2026 13:45
@qodo-code-review
Copy link
Copy Markdown

Review Summary by Qodo

Gate scheduled runs on data quality validation

✨ Enhancement

Grey Divider

Walkthroughs

Description
• Gate scheduled runs on data quality validation by adding --require-data-quality-pass flag to
  both the checked-in artifact workflow and scheduled update workflow
• Add algorithm_misses to the generated data-quality monitor checks to detect cache/parser health
  regressions
• Enforce strict validation requirements including current schema compliance and data-quality pass
  status
• Update validation documentation in README to reflect the stricter data-quality gate
• Refresh all generated API certificate artifacts with updated generation timestamps from the latest
  scraper run
Diagram
flowchart LR
  A["Data Quality Monitor"] -->|includes algorithm_misses| B["Enhanced Quality Checks"]
  B -->|validates| C["validate_api.py"]
  C -->|--require-data-quality-pass| D["Scheduled Workflow"]
  C -->|--require-data-quality-pass| E["Checked-in Artifacts Workflow"]
  D -->|pass required| F["Weekly Update Succeeds"]
  E -->|pass required| G["Artifacts Published"]
Loading

Grey Divider

File Changes

1. api/certificates/1017.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1017.json


2. api/certificates/1018.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1018.json


3. api/certificates/1024.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1024.json


View more (284)
4. api/certificates/1011.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1011.json


5. api/certificates/1023.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1023.json


6. api/certificates/1015.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1015.json


7. api/certificates/1019.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1019.json


8. api/certificates/1020.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1020.json


9. api/certificates/1013.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1013.json


10. api/certificates/1014.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1014.json


11. api/certificates/1016.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1016.json


12. api/certificates/1026.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1026.json


13. api/certificates/1028.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1028.json


14. api/certificates/1029.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1029.json


15. api/certificates/1030.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1030.json


16. api/certificates/1031.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1031.json


17. api/certificates/1032.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1032.json


18. api/certificates/1033.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1033.json


19. api/certificates/1034.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1034.json


20. api/certificates/1035.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1035.json


21. api/certificates/1036.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1036.json


22. api/certificates/1037.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1037.json


23. api/certificates/1038.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1038.json


24. api/certificates/1021.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1021.json


25. api/certificates/1022.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1022.json


26. api/certificates/1025.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1025.json


27. api/certificates/1027.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1027.json


28. api/certificates/1000.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1000.json


29. api/certificates/1001.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1001.json


30. api/certificates/1002.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1002.json


31. api/certificates/1003.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1003.json


32. api/certificates/1004.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1004.json


33. api/certificates/1005.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1005.json


34. api/certificates/1006.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1006.json


35. api/certificates/1007.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1007.json


36. api/certificates/1008.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1008.json


37. api/certificates/1009.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1009.json


38. api/certificates/1010.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1010.json


39. api/certificates/1012.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1012.json


40. api/certificates/100.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/100.json


41. api/certificates/102.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/102.json


42. api/certificates/1.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1.json


43. api/certificates/10.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/10.json


44. api/certificates/101.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/101.json


45. api/certificates/103.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/103.json


46. api/certificates/1039.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1039.json


47. api/certificates/1040.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1040.json


48. api/certificates/1041.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1041.json


49. api/certificates/1042.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1042.json


50. api/certificates/1043.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1043.json


51. api/certificates/1044.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1044.json


52. api/certificates/1045.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1045.json


53. api/certificates/1046.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1046.json


54. api/certificates/1047.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1047.json


55. api/certificates/1048.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1048.json


56. api/certificates/1049.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1049.json


57. api/certificates/1050.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1050.json


58. api/certificates/1051.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1051.json


59. api/certificates/1052.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1052.json


60. api/certificates/1053.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1053.json


61. api/certificates/1054.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1054.json


62. api/certificates/1055.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1055.json


63. api/certificates/1056.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1056.json


64. api/certificates/1057.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1057.json


65. api/certificates/1058.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1058.json


66. api/certificates/1059.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1059.json


67. api/certificates/1060.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1060.json


68. api/certificates/1061.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1061.json


69. api/certificates/1062.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1062.json


70. api/certificates/1063.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1063.json


71. api/certificates/1064.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1064.json


72. api/certificates/1065.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1065.json


73. api/certificates/1066.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1066.json


74. api/certificates/1067.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1067.json


75. api/certificates/1068.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1068.json


76. api/certificates/1069.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1069.json


77. api/certificates/1070.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1070.json


78. api/certificates/1071.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1071.json


79. api/certificates/1072.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1072.json


80. api/certificates/1073.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1073.json


81. api/certificates/1074.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1074.json


82. api/certificates/1075.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1075.json


83. api/certificates/1076.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1076.json


84. api/certificates/1077.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1077.json


85. api/certificates/1078.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1078.json


86. api/certificates/1079.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1079.json


87. api/certificates/1080.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1080.json


88. api/certificates/1081.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1081.json


89. api/certificates/1082.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1082.json


90. api/certificates/1083.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1083.json


91. api/certificates/1084.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1084.json


92. api/certificates/1085.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1085.json


93. api/certificates/1086.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1086.json


94. api/certificates/1087.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1087.json


95. api/certificates/1088.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1088.json


96. api/certificates/1089.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

api/certificates/1089.json


97. api/certificates/1090.json Miscellaneous +2/-2

Refresh certificate artifact with updated generation timestamp

• Updated generated_at timestamp in metadata from 2026-05-14T13:31:01.314185Z to
 2026-05-14T13:39:49.547462Z
• Updated generated_at timestamp in certificate object to match the new metadata timestamp

<a href='https://github.com/hackIDLE/nist-cmvp-api/pull/25/files#diff-877f3ca8b...

@qodo-code-review
Copy link
Copy Markdown

qodo-code-review Bot commented May 14, 2026

Code Review by Qodo

🐞 Bugs (1) 📘 Rule violations (0)

Grey Divider


Remediation recommended

1. Timestamp-only artifact churn 🐞 Bug ⚙ Maintainability
Description
Certificate artifacts embed a wall-clock "generated_at" value, so rerunning the scraper rewrites
thousands of files even when the underlying certificate data is unchanged, creating massive noisy
diffs and guaranteeing the scheduled workflow’s change detector will fire. This makes
reviews/history noisy and can cause unnecessary commits/CI activity on every run.
Code

api/certificates/1.json[3]

+    "generated_at": "2026-05-14T13:39:49.547462Z",
Evidence
The PR diff for a representative certificate shows only generated_at changing, indicating
timestamp-only rewrites across many files. In scraper.py, generated_at is set from the current
time and then written into each api/certificates/<n>.json, which guarantees these diffs on every
run; the scheduled workflow’s git diff check treats any change under api/ as a reason to
commit/push.

api/certificates/1.json[1-13]
scraper.py[4682-4813]
.github/workflows/update-data.yml[62-74]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The scraper writes a new wall-clock `generated_at` into every per-certificate artifact on each run. This guarantees diffs and pushes even when certificate contents are unchanged, producing huge PRs and noisy git history.

## Issue Context
- `scraper.py` computes `generated_at` from `datetime.now(timezone.utc)` and then injects it into `api/metadata.json` and into every `api/certificates/<n>.json` wrapper (and likely into the inner certificate payload as well).
- The scheduled workflow considers *any* change under `api/` as a change worth committing.

## Fix Focus Areas
- scraper.py[4682-4813]
- .github/workflows/update-data.yml[62-74]

### Implementation directions
Choose one (or combine):
1) **Only update per-certificate timestamps when that certificate’s payload changed** (read existing JSON, compare content excluding timestamps, preserve prior generated_at when unchanged).
2) **Remove per-certificate `generated_at` fields** and keep a single run timestamp in `api/metadata.json` (or in one top-level artifact), so stable data yields stable diffs.
3) If timestamps must stay everywhere, **adjust the workflow change detection** to ignore changes that are only `generated_at`-field updates (e.g., by post-processing or by generating timestamps into an untracked file).

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

ⓘ You are approaching your monthly quota for Qodo. Upgrade your plan

Qodo Logo

Sign up for free to 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.

1 participant