docs: disambiguate the daisy/daisy collisions the rename left in dev/, refresh the REFACTOR roadmap, merge the split CHANGELOG headings - #77
Merged
Conversation
The blanket `gerbera -> daisy` rename in 2c1a382 renamed both sides of every comparison in dev/, so the two documents whose whole job is to compare the old Python library with this rewrite now compare daisy with daisy: dev/MIGRATION_REPORT.md "Migration Report: daisy -> daisy", "| Daisy Test | Daisy Test |" dev/INTERNAL_DIFFERENCES.md "Internal Differences: daisy vs daisy", and 11 sections of adjacent "**Daisy**:" paragraphs describing opposite implementations dev/REFACTOR.md "which daisy doesn't have", "using `daisy` as a replacement for daisy" Every occurrence is now "daisy 1.x" (the upstream Python library) or "daisy v2" (this codebase), the convention docs/source/design/index.md already states and the other design docs already use. Nothing is deleted; only the names change. Sides were recovered from `git show 2c1a382^:<file>`, where the old side reads "daisy" and the new side reads "gerbera", so the mapping is mechanical rather than inferred. dev/MIGRATION_REPORT.md is now byte-identical to that pre-rename file with gerbera -> "daisy v2" and daisy -> "daisy 1.x" applied. Also in dev/REFACTOR.md: mark 2.8 (lazy roots), 2.2 (per-block timeout) and 2.4 (JSON observer) landed in "Suggested order of attack" with a pointer each, all three verified against the tree. 2.2 landed differently from the recorded decision -- the timeout is now universal, 600 s, undisableable, and really does preempt -- so its entry says so rather than claiming the plan shipped as written. And in CHANGELOG.md: [Unreleased] had accumulated 16 category headings, including two "### Fixed" split by an intervening "### Documentation" and "### Changed". It is now one heading per category in Keep a Changelog order (Added / Changed / Removed / Fixed), which the file's own header says it follows, with the project's extra "Documentation" category last. Bullets are moved, never edited: every non-blank non-heading line is byte-identical to before. Docs-only; no code, config or test file is touched. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
The blanket
gerbera -> daisyrename in 2c1a382 renamed both sides of every comparison indev/. The two documents whose entire purpose is to compare the upstream Python library with this rewrite now compare daisy with daisy:dev/MIGRATION_REPORT.md:1# Migration Report: daisy → daisydev/MIGRATION_REPORT.md:7Daisy Testdev/INTERNAL_DIFFERENCES.md:1# Internal Differences: daisy vs daisydev/INTERNAL_DIFFERENCES.md:9,20**Daisy**:, describing a tornado poll loop and atokio::select!loop — 11 sections like thisdev/INTERNAL_DIFFERENCES.md:30**Pro daisy**: … daisy wastes CPU …; daisy's select is free.dev/REFACTOR.md:188… composes with per-task max_workers, which daisy doesn't have.dev/REFACTOR.md:98… since I haven't started usingdaisyas a replacement for daisyThis is institutional memory that is currently unreadable, so the fix is disambiguation, not deletion. Nothing is removed.
What
1. Disambiguate to the convention this repo already states.
docs/source/design/index.md:30says "daisy 1.x" refers to the upstream Python library that daisy v2 is a rewrite of. "daisy v2" (or just "daisy", in unambiguous contexts) refers to this codebase — andPROTOCOL.md,PIPELINES.md,WORKER_SHUTDOWN_FLOWS.mdalready use it. Every colliding occurrence in the threedev/docs now readsdaisy 1.xordaisy v2.The sides were not guessed.
git show 2c1a382^:<file>still has the pre-rename text, where the old side readsdaisyand the new side readsgerbera, so the mapping is mechanical. See the check below.2.
dev/REFACTOR.mdroadmap: mark 2.8 / 2.2 / 2.4 landed, each with a pointer, verified against this tree:root_iter_owned+LazyBlockIter(daisy-core/src/dependency_graph.rs:468,:705) feedDependencyGraph::roots(:606), which now returnsBox<dyn Iterator<Item = Block> + Send>.timeout = None(no timeout)" and "daisy can't actually preempt a running Python function inside a thread". Today every block has a timeout, it defaults to 600 s and cannot be disabled (daisy-py/src/py_task.rs:104), and it does preempt: the subprocess worker self-kills at the deadline (daisy-py/python/daisy/_subprocess_worker.py:70). The entry says that rather than implying the plan shipped as written.JsonProgressObserver(daisy-py/python/daisy/_progress.py:267), exported fromdaisy, covered bytests/test_json_observer.py.The Problem/Proposal/Next Steps/Decision discussion in each numbered section is left untouched — it is the record of the decision, not a status field.
3.
CHANGELOG.md[Unreleased]: one heading per category, in Keep a Changelog order. The reported defect was two### Fixedsplit by an intervening### Documentationand### Changed; the section had in fact accumulated 16 headings (5× Changed, 5× Added, 2× Fixed, 2× Removed, 2× Documentation). It is nowAdded / Changed / Removed / Fixed, the order the file's own header commits to, with the project's non-standardDocumentationcategory last. Bullets are moved, never rewritten — see the byte-level check below.Verification
Docs-only, so there is no failing→passing example to show; the meaningful checks are that the sides are right and that no content was lost.
The sides. Reconstruct each file from its pre-rename ancestor by substituting
gerbera → "daisy v2"anddaisy → "daisy 1.x", then diff against this branch:dev/MIGRATION_REPORT.mdis now byte-identical to the pre-rename file under that substitution — zero differing lines.INTERNAL_DIFFERENCES.md's 18 differing lines are all places where v2.0 has legitimately moved since the rename, not label choices: the section 4 rewrite for subprocess-only workers (the**Parity**:paragraph, thepython -m daisy._subprocess_workerbullets, the "Earlier v2 builds…" paragraph), two whitespace fixes inside code blocks, and one sentence I reworded — line 3,"how the two implementations differ"→"how daisy 1.x and daisy v2 differ".No CHANGELOG content lost. Every non-blank, non-heading line, sorted, before vs after:
One line differs, and it has to: that bullet points at the Removed section, which the reorder moves from above it to below it.
Tests. The change touches four
.mdfiles and nothing else (git show --statbelow), so it cannot affect them.cargo test -p daisy-coreis cheap and green on this branch:pytest tests -qneeded a detour worth reporting separately (below); oncefunlib.geometryis present it is green on this branch:Judgment calls, flagged so they can be rejected individually
### Documentation. Consolidating forces a category for every bullet, and two under the second### Documentationheading were not documentation: "Worker starts are now bounded by a hard per-task budget…" (a behaviour fix — "respawned forever and the run never terminated") → Fixed, and "Block functions run in worker subprocesses." (an execution-model change) → Changed. Leaving them under Documentation while claiming to have ordered the file seemed worse. Happy to put them back.above→belowin the thread-execution bullet, forced by the reorder (see the diff above).dev/REFACTOR.mdPart 3 is disambiguated too, slightly beyond the two documents named in the title's spirit — bullets like "which daisy doesn't have" and "Daisy's restart-cap is respawn forever, hope it works" are the same collision from the same commit, in a file this PR already edits.dev/REFACTOR.md, also introduced by 2c1a382.Not touched (pre-existing, reported rather than folded in)
dev/INTERNAL_DIFFERENCES.md§11 Performance still describes daisy v2's workers as threads ("daisy v2's thread-based workers have negligible startup cost", "daisy v2's thread spawn costs ~0.005s"). Those benchmarks predate the subprocess-only migration, so the numbers and the prose need a re-run, not a relabel. I only fixed which side each column names.dev/REFACTOR.md:187points atdocs/ABANDONMENT.md; the file now lives atdocs/source/design/ABANDONMENT.md. Its Part 3 also still credits "Run-stats with linear regression slopes", which[Unreleased]records as removed.funlib.geometryis an undeclared dependency.daisy-py/python/daisy/v1_compat.py:120,127imports it (lazily, inside the compatBlock.read_roi/write_roigetters) and three test modules import it directly, but it appears in neither[project] dependenciesnor any dependency group. On a cleanuv syncatorigin/v2.0,pytest tests -qaborts collectingtests/test_block_compat.pywithModuleNotFoundError: No module named 'funlib', and with that module ignored 42 tests fail — every distributed test, because the worker subprocess hits the same import error (daisy worker subprocess exited with code 1 / ModuleNotFoundError: No module named 'funlib'→task 'preempt-fast' was abandoned). Identical counts with and without this PR's changes:uv pip install funlib.geometryalone turns that into241 passed, 2 skipped, 1 xfailed. There is no test workflow in.github/workflows/(docs, lint, publish only), which is presumably why this is invisible. Worth its own one-line PR addingfunlib.geometrytodependencies— happy to open it.CI:
ruffis red on this PR and red on the baseThe
ruffjob fails with 28 errors, all intests/(I001import sorting,E402, …). This PR changes four.mdfiles and nothing else, so it cannot be the cause — and the base agrees:lint.yamlalso failed on the two most recent pushes tov2.0, including 542c3c2 — the exact commit this branch is based on:ruff --fixclears all 28, but that is a separate change and does not belong in a docs PR.Two other checks are red for reasons this PR cannot reach either, both worth their own issues:
windows (x64)— the wheel does not build:error[E0425]: cannot find function 'gethostname' in crate 'libc'atdaisy-core/src/advertise.rs:145.libc::gethostnameis Unix-only; on Windows it needsGetComputerNameExA/gethostnamefrom the Winsock bindings, or#[cfg]. Introduced with the address-advertising work in 7128d9c, andpublish.yamlbuildswindows (x64)wheels for release.test-wheel—ERROR: Could not find a version that satisfies the requirement tqdm>=4.65 (from daisy) (from versions: none): the smoke step installs with no index, so the runtime dependency cannot resolve. Its script is also stale against the change this CHANGELOG documents — it still passesworker_processes=Falseandnum_workers=2, andTask(worker_processes=...)now raisesTypeError.