Raw user intake — needs PM grooming. main is currently RED.
Symptom
CI run https://github.com/DataTalksClub/website/actions/runs/33621318177 for 55f6743 concluded cancelled. The quality job failed and cancelled the run; ci-gate then failed with QUALITY_RESULT=cancelled DJANGO_RESULT=cancelled PLAYWRIGHT_RESULT=cancelled.
Failing gate: quality → make test-ci → uv run --frozen pytest ci/tests tests_ci -q (Makefile:192).
ci/tests/test_content_update.py:69: AssertionError
E {"search_documents": 2996} != {"search_documents": 2998}
E {"graph_nodes": 1070} != {"graph_nodes": 1072}
E {"graph_links": 12987} != {"graph_links": 13006}
1 failed, 616 passed in 40.00s
Reproduces locally at 55f6743. Not a flake.
Root cause
The stale pins are the podwiki block at ci/tests/test_content_update.py:56-61. Counts are computed deterministically from the checked-in projection by _family_counts (ci/content_update.py:375).
Two lanes crossed:
53eef66 "Add unified content update CI contract" introduced the test with pins correct at that time.
4b6187f "Refresh projection for organized content source" de-duplicated the podcast catalogue during route canonicalization, removing two aliased nodes (podcast:s12e08, podcast:theme-park-crowd-modeling-to-tesla-full-stack-data-engineering) and 19 graph links from content/public_projection/wiki_graph.json and wiki_search.json. It correctly refreshed five other pinned contracts but not this newly-added one.
Measured across the push:
face8e4 links=13006 nodes=1072 search=2998 wiki=282
53eef66 links=13006 nodes=1072 search=2998 wiki=282 <- pins authored here
4b6187f links=12987 nodes=1070 search=2996 wiki=282 <- break introduced here
55f6743 links=12987 nodes=1070 search=2996 wiki=282
The projection change is intended. Only the pin is stale.
Proposed fix (PM to confirm)
Update the three integers at ci/tests/test_content_update.py:57-59 to graph_links: 12987, graph_nodes: 1070, search_documents: 2996, leaving wiki_pages: 282.
This is explicitly NOT the #302/#253 re-pinning hazard: these are plain aggregate counts asserting redaction-safe report shape, not a content-authority digest, and the drift they caught is an intended de-duplication. Grooming should still confirm that reasoning.
Design question worth deciding here
A hardcoded exact-count pin inside ci/tests/ will red-line main on every legitimate content refresh — working against the purpose of the content-update pipeline the same commit introduced. Consider asserting invariants (non-zero, bounded, consistent with manifest.json) rather than exact literals. PM to decide whether that belongs in this issue or a follow-up.
Missing evidence — do not assume the fix is sufficient
django and playwright were killed at ~2 minutes by the quality job cancelling the run (.github/workflows/ci.yml:499-503). So make test-factories, make test-migrations, make test-django-full and the full Playwright matrix have no verdict for 55f6743.
The pre-push scheduled baseline (run 33591717271) failed migrations on content/tests/test_editorial_route_migration_contract.py:48 (required_content_sha256 mismatch). 4b6187f edited exactly that test, so it may be resolved — unverified. Verification must produce fresh full Django and Playwright evidence; do not rerun failed jobs on the cancelled run.
Related, but separate
Process note
31 of the 50 commits in face8e4..55f6743, including 4b6187f and 53eef66, carry no Closes #N / Refs #N trailer, contrary to _docs/PROCESS.md step 6. No owning issue existed for the content-update CI contract or the projection reorganization, which is why this issue is being filed rather than an existing one reopened.
Raw user intake — needs PM grooming.
mainis currently RED.Symptom
CI run https://github.com/DataTalksClub/website/actions/runs/33621318177 for
55f6743concludedcancelled. Thequalityjob failed and cancelled the run;ci-gatethen failed withQUALITY_RESULT=cancelled DJANGO_RESULT=cancelled PLAYWRIGHT_RESULT=cancelled.Failing gate:
quality→make test-ci→uv run --frozen pytest ci/tests tests_ci -q(Makefile:192).Reproduces locally at
55f6743. Not a flake.Root cause
The stale pins are the
podwikiblock atci/tests/test_content_update.py:56-61. Counts are computed deterministically from the checked-in projection by_family_counts(ci/content_update.py:375).Two lanes crossed:
53eef66"Add unified content update CI contract" introduced the test with pins correct at that time.4b6187f"Refresh projection for organized content source" de-duplicated the podcast catalogue during route canonicalization, removing two aliased nodes (podcast:s12e08,podcast:theme-park-crowd-modeling-to-tesla-full-stack-data-engineering) and 19 graph links fromcontent/public_projection/wiki_graph.jsonandwiki_search.json. It correctly refreshed five other pinned contracts but not this newly-added one.Measured across the push:
The projection change is intended. Only the pin is stale.
Proposed fix (PM to confirm)
Update the three integers at
ci/tests/test_content_update.py:57-59tograph_links: 12987,graph_nodes: 1070,search_documents: 2996, leavingwiki_pages: 282.This is explicitly NOT the #302/#253 re-pinning hazard: these are plain aggregate counts asserting redaction-safe report shape, not a content-authority digest, and the drift they caught is an intended de-duplication. Grooming should still confirm that reasoning.
Design question worth deciding here
A hardcoded exact-count pin inside
ci/tests/will red-linemainon every legitimate content refresh — working against the purpose of the content-update pipeline the same commit introduced. Consider asserting invariants (non-zero, bounded, consistent withmanifest.json) rather than exact literals. PM to decide whether that belongs in this issue or a follow-up.Missing evidence — do not assume the fix is sufficient
djangoandplaywrightwere killed at ~2 minutes by the quality job cancelling the run (.github/workflows/ci.yml:499-503). Somake test-factories,make test-migrations,make test-django-fulland the full Playwright matrix have no verdict for55f6743.The pre-push scheduled baseline (run 33591717271) failed
migrationsoncontent/tests/test_editorial_route_migration_contract.py:48(required_content_sha256mismatch).4b6187fedited exactly that test, so it may be resolved — unverified. Verification must produce fresh full Django and Playwright evidence; do not rerun failed jobs on the cancelled run.Related, but separate
validate_github_editorial_source_projection_inventory.pywas not among this run.s selected quality targets. Confirmed still failing at bothface8e4and55f6743, i.e. pre-existing.Process note
31 of the 50 commits in
face8e4..55f6743, including4b6187fand53eef66, carry noCloses #N/Refs #Ntrailer, contrary to_docs/PROCESS.mdstep 6. No owning issue existed for the content-update CI contract or the projection reorganization, which is why this issue is being filed rather than an existing one reopened.