Reproduction and expected behavior
The forced-refresh path deletes the published output before HEAD or GET succeeds. A connection, HTTP, stream, or rename failure therefore leaves no working model. Retain the old output until the existing os.replace publication point.
Base: 252e5193902d466726da9af75047dfffff2ae662. The attached PR adds regressions against the actual package/service modules, then applies the correction. Running those final regression files against unchanged production produces:
6 failed, 4 passed in 0.16s
Focused command after placing the regressions in the checkout:
python -m pytest -q tests/test_fetch_publication.py
Scope
This is publication ordering, not content authentication or concurrent-writer isolation. While a published output remains, each new --force invocation starts its replacement from zero; retries within one invocation resume. That tradeoff and two-copy disk cost are documented and tested. A forced attempt without a published output still resumes its existing partial. Existing HEAD/filesystem exceptions may still propagate.
Synthetic test input only; no reported live outage, security incident, hardware-performance measurement, or P0/P1 label.
Reproduction and expected behavior
The forced-refresh path deletes the published output before HEAD or GET succeeds. A connection, HTTP, stream, or rename failure therefore leaves no working model. Retain the old output until the existing os.replace publication point.
Base:
252e5193902d466726da9af75047dfffff2ae662. The attached PR adds regressions against the actual package/service modules, then applies the correction. Running those final regression files against unchanged production produces:Focused command after placing the regressions in the checkout:
Scope
This is publication ordering, not content authentication or concurrent-writer isolation. While a published output remains, each new --force invocation starts its replacement from zero; retries within one invocation resume. That tradeoff and two-copy disk cost are documented and tested. A forced attempt without a published output still resumes its existing partial. Existing HEAD/filesystem exceptions may still propagate.
Synthetic test input only; no reported live outage, security incident, hardware-performance measurement, or P0/P1 label.