Goal and scope
Carry explicit time windows from scheduling into ingestion, so adjacent loads and historical replay have bounded extraction semantics. Third PR in the stack; review its diff against the dataset-constraints branch.
Change map and risk
- Add validated UTC half-open
DataIntervalvalues to runtime routing without changing the runtime-context protocol. - Translate Dagster calendar windows and backfill/replay mode, including daylight-saving transitions.
- Add opt-in DLT
interval_columnand scheduledinterval_lookback. Require merge writes and use stateless bounded DLT incrementals, preserving the live cursor. - Add a runnable lakehouse example, usage/guarantee guide, and the source research behind the three changes.
- Leave Kafka checkpointing and legacy unbounded DLT state semantics unchanged.
Original verification
- Original head focused interval/runtime/Dagster suites: 59 passed.
- Final
make check: 7,417 passed, four skipped, 194 integration-deselected; lint, formatting, Python/TypeScript types and repository consistency checks pass.make test-core-regression: 447 passed. - Canonical real MinIO/Nessie storage integration: 101 passed across seven suites. Installed-wheel verification covers 40 packages, without editable installs or repository-source imports.
- Real public discovery → Dagster → DLT → Nessie/MinIO execution: boundary record 202 retained; late record 404 recovered through lookback; historical replay leaves destination IDs [101, 202, 404], without duplicates. Upper-boundary record 303 is excluded.
- Real DLT extraction/local Iceberg transaction tests inspect a persisted live cursor across scheduling, replay, rejected writes, committed-but-reply-lost failure, retry, and empty extraction. Calendar tests include 23-hour and 25-hour days.
- Reproduce against a disposable configured lakehouse:
PHLO_OBSERVATORY_SETTINGS_BACKEND=memory uv run --locked python examples/data_intervals.py. Seedocs/guides/data-intervals.mdfor setup and semantics. - An initial full baseline run hit a process-shutdown timing failure in unchanged code; the original and integrated shutdown suites both passed in isolation, and the complete final rerun passed.
- Links and generated references pass. Final production documentation build was blocked by the orb's confirmed 6 GiB memory limit, not claimed green.
- New feature: regression coverage includes timezone boundaries, source bounds, replay, late arrivals, empty extraction and cursor preservation through failures.
Review correction
Absent sources and empty bounded extracts now share no-data finalisation, including the run observation. The real DLT/Iceberg regression reopens SQLite evidence: before the fix the run remained running; after it the run is no_data with an input resource recording zero records read for the correct attempt. All 178 selected DLT tests pass. This branch also includes the quality corrections from the preceding PRs.
The original-head GitHub run did not pass: its JavaScript lane stalled downloading Ubuntu browser dependencies and was cancelled before test execution, causing the aggregate gates to fail. The updated head requires a fresh CI result.
Post-correction head: make check passes with 7,419 tests, four skipped and 194 deselected, including lint, complexity, formatting, types and repository consistency checks. make test-core-regression passes all 447 tests. The DLT suite passes 178 selected tests, with two deselected.
Recovery and maintainer decisions
Opt-in; no migration, deployment, or extra checkpoint store. Remove interval declarations before downgrading. Stable non-null keys are required for retry-safe merges. Source authors must push bounds into API/SQL queries themselves; arbitrary custom source state is outside the guarantee. No external-cursor/table atomicity, contiguous watermark, or multi-file atomic commit is promised. Inspect ambiguous writes before retrying. Maintainer review is pending; no independent reviewer or release qualification is claimed.
0b21c53, the branch has moved onArchitecture
Inside the changed components — 1 view
Component view — dlt Ingestion
Internal modules and contracts executing bounded extraction
Data flow
Review
1 finding addressed · reviewed
0b21c53Empty interval returns·no_datawithout the run observationphlo_dlt/executor.py:596-597· ✅ Addressed in 06b987f🪧 More tips
npx skills add coldteadotai/pr-lens, then tell your coding agent: "Diagram the change you just made with PR Lens and attach it to the pull request."renderreads.github/pr-lens.ymland applies your renames, exclusions and lane pins at draw timegithub.comment.collapsed: truein.github/pr-lens.ymlto fold the comment behind one View architecture and data flow row. Drawing still runs as beforegithub.draw: on-demandin.github/pr-lens.ymland PR Lens stops drawing pull requests on its own. Comment@pr-lens drawon a pull request when you want that one drawn.github/workflows/pr-lens.ymlwithcoldteadotai/pr-lens/packages/action@v0and your model provider's key as itsapi-keyto run PR Lens from your own CI. Any/chat/completionsendpoint worksgithub.description: falsein.github/pr-lens.ymlto stop PR Lens adding buttons to your PR descriptionsThanks for using PR Lens! It's free for OSS. If it helped, a star helps other teams find it.