|
| 1 | +# calcofi4db 3.11.0 |
| 2 | + |
| 3 | +## `build_targets_list()` refuses a directory `output:` |
| 4 | + |
| 5 | +Every pipeline target is `format = "file"`, so `targets` hashes whatever path the |
| 6 | +command returns. If that path is a **directory**, anything later written |
| 7 | +underneath it — by a downstream target, or by hand — moves the hash and leaves |
| 8 | +the owning target reported outdated forever. |
| 9 | + |
| 10 | +`release_database` shipped in that state: it declared `data/releases`, and |
| 11 | +`test_release` writes `data/releases/{version}/test_results.json`. On |
| 12 | +v2026.08.08 the release's own files landed 16:46-17:06 and `test_results.json` at |
| 13 | +17:08:47, so the target went stale the moment the pipeline finished, and every |
| 14 | +subsequent `tar_make()` on it or anything downstream re-ran a ~40 minute freeze |
| 15 | +and a multi-GB re-upload of an already-promoted release. |
| 16 | + |
| 17 | +`check_nested_outputs()` now fails the build on any directory `output:`, and on |
| 18 | +one declared output nested inside another. Worth knowing why it checks what it |
| 19 | +checks: `test_release` declares `_output/test_release.html` and writes into |
| 20 | +`data/releases` as a **side effect**, so no comparison of the `output:` fields |
| 21 | +could ever have related the two — a first cut that only compared declared paths |
| 22 | +passed the real broken configuration. What *is* statically visible is that a |
| 23 | +target claimed a directory at all, and that is what is enforced. |
| 24 | + |
| 25 | +The fix for such a target is a single small file it alone writes — for the |
| 26 | +release, `data/releases/_release_stamp.json` carrying the version and a digest of |
| 27 | +the frozen catalog, deterministic so a no-op re-run does not cascade. |
| 28 | + |
1 | 29 | # calcofi4db 3.10.0 |
2 | 30 |
|
3 | 31 | ## `declare_measurement_bounds()` — put a bound on a type that already exists |
|
0 commit comments