Generated 2026-09-02T04:26:40.872676+00:00. Window: 2026-09-01 00:00 to now.
Order: LLM-applied order
AI3D-382 adds the per-point LAS number_of_returns field to the run3 segment NPZ contract and threads it through the LIDAR highway pipeline: producer (Step 3 segmentationtrajectory and the orchestrator's range-split writer), the shared schema in iolabs-common, and the two consumers that read run3 records (Step 5 maskclustering, Step 6 3dsegmentation). 25 commits across 6 repos, all authored 2026-09-01, all on remote refs. No fetch warnings.
Contract: number_of_returns is uint8, always written on save, optional on load (legacy NPZs are zero-filled; 0 means unknown and is never defaulted to 1, since 0 is not a legal LAS return count). Boolean arrays are rejected, out-of-range values raise, and no 1–7 domain check is applied because LAS point formats 6–10 carry 4-bit counts up to 15.
Structure: the work landed in three rounds the same day. Round 1 added the field end to end (3c981c5, 74a972e, e0c28bc). Round 2 replaced hand-rolled per-key code with a schema registry (POINT_RECORD_SCHEMA in common, 639d755) so producer and consumers iterate one field tuple; adding a future optional field is now one registry entry plus one extraction line. Round 3 was an adversarial Sol + Fable review pass; its one real defect fix is 2a79902, where Step 5's cluster NPZ writer was silently dropping the new channel at its output boundary.
Release gating (nothing is live yet): published iolabs-common 0.7.0 predates all of this. The producer venv resolves common 0.3.2, so it mirrors the schema locally rather than importing it, and its parity test skips until the floor is raised. Consumers on 0.7.0 drop the unknown key on load without crashing, so new 7-key NPZs cannot break old consumers. Pending: publish common 0.7.1, raise floors, repin the orchestrator conda env. The Step 5 filteringintensity change (31a4ceb) was reverted (ab5a38b) because it broke that repo against its pinned common; it nets to zero in this report and can be re-applied after the release.
The final orchestrator entry (3dd6817) is an unrelated AI3D-226 merge that fell inside the time window; it is ranked last and can be ignored.
Miroslav Simko <ms@iolabs.ch> 2026-09-01T10:43:42+02:00
2 files · 9 snippets · score 75
Miroslav Simko <ms@iolabs.ch> 2026-09-01T10:48:35+02:00
1 files · 13 snippets · score 75
Producer side: divide_las_file_by_planes now extracts number_of_returns per chunk and writes it into each per-segment NPZ. LAS files without the field degrade to zeros via the fallback helper rather than raising, unlike RGB/intensity which stay mandatory.
Miroslav Simko <ms@iolabs.ch> 2026-09-01T14:54:43+02:00
2 files · 12 snippets · score 75
Largest structural change. Replaces per-key special-casing in common with a POINT_RECORD_SCHEMA registry (key, dtype, required/optional, fill) and adds generic mask_record/concat_records helpers driven by it. Later producer/consumer commits iterate this registry instead of hardcoding names. Big diff but mostly mechanical; the registry table and the load/save loops are the parts worth reading.
Miroslav Simko <ms@iolabs.ch> 2026-09-01T10:58:14+02:00
1 files · 8 snippets · score 75
Orchestrator's own range-split run3 writer (the non-chunked path in s3_segment_mapper.py) mirrored the producer change so both write paths emit the same 7-key record. Note the orchestrator conda env still pins the producer at 0.7.2, so this path emits legacy records until repinned. No pytest infrastructure there; untested, flagged as follow-up.
Miroslav Simko <ms@iolabs.ch> 2026-09-01T14:53:04+02:00
1 files · 6 snippets · score 75
Step 5 stops parsing run3 NPZs by hand and loads them through common's segment_points_io, carrying ancillary channels by key. This is what makes the consumer schema-agnostic; REQUIRED_ARRAYS becomes a deprecated alias of POINT_RECORD_KEYS (member order changed, gains optional keys under new common).
Miroslav Simko <ms@iolabs.ch> 2026-09-01T23:36:12+02:00
2 files · 9 snippets · score 85
Round-3 review find. write_cluster_npz only wrote a fixed member list, so the new channel was silently dropped at Step 5's output boundary. Fix is generic: any extra ColorIntensityData field discovered via dataclasses.fields() is forwarded, with a warn-and-skip guard on collision with fixed member names. Downstream tablecloth reader verified key-generic, so the extra member is safe.
Miroslav Simko <ms@iolabs.ch> 2026-09-01T14:51:34+02:00
2 files · 7 snippets · score 75
Step 6 consumer: SegmentCloud gains an extra mapping so unknown run3 record keys survive load → fuse → save instead of being discarded. Known gap left as follow-up: writer.py's ReCap export still hardcodes number_of_returns=1.
Miroslav Simko <ms@iolabs.ch> 2026-09-01T14:54:28+02:00
2 files · 13 snippets · score 75
Producer refactor: the per-point ancillary arrays travel as one dict[str, ndarray] keyed by ANCILLARY_FIELD_NAMES through extraction, angle mask, dtype registration, writer and memmap. Large line churn but proven byte-identical NPZ output old-vs-new. Cuts the cost of adding a field to one tuple entry plus one extraction line.
Miroslav Simko <ms@iolabs.ch> 2026-09-01T10:43:42+02:00
2 files · 11 snippets · score 75
ColorIntensityData (the in-memory record shared by consumers) gains an optional number_of_returns member; select_by_mask/append carry it.
Miroslav Simko <ms@iolabs.ch> 2026-09-01T23:39:27+02:00
4 files · 15 snippets · score 75
Hardening from round 3: the member becomes keyword-only (fleet grep showed all 10 construction sites already use keywords) and is coerced to uint8 with bool rejection via a new shared _dtype_coercion module that segment_points_io now delegates to. Error strings kept byte-identical.
Miroslav Simko <ms@iolabs.ch> 2026-09-01T11:09:17+02:00
2 files · 6 snippets · score 75
Load-side strictness: stored counts are coerced to uint8, boolean arrays rejected (a mask is not a count), non-integral and out-of-range values raise. Deliberately no 1–7 domain check (4-bit LAS formats go to 15).
Miroslav Simko <ms@iolabs.ch> 2026-09-01T14:55:33+02:00
2 files · 6 snippets · score 75
select_by_mask and append are derived from dataclasses.fields() instead of listing members, so a future field needs no edits there.
Miroslav Simko <ms@iolabs.ch> 2026-09-01T15:08:19+02:00
4 files · 12 snippets · score 75
Follow-up hardening of the generic helpers (shape/dtype checks in mask_record/concat_records, _map_fields edge cases) plus tests.
Miroslav Simko <ms@iolabs.ch> 2026-09-01T15:11:22+02:00
2 files · 10 snippets · score 85
Cross-version compatibility: the producer's load_color_intensity_data builds kwargs filtered by the installed dataclass's declared fields, so it works against pinned common 0.3.2 (no such field) and against 0.7.1+ (field carried). Zero production callers today; latent.
Miroslav Simko <ms@iolabs.ch> 2026-09-01T15:11:02+02:00
1 files · 4 snippets · score 75
Makes the LAS fallback helper generic over key/dtype (_record_field_or_zeros) and freezes DEFAULT_FIELD_DTYPES as a MappingProxyType so the schema can't be mutated process-wide.
Miroslav Simko <ms@iolabs.ch> 2026-09-01T14:53:04+02:00
1 files · 2 snippets · score 75
Small: separation-channel dtypes in the maskclustering pipeline come from the record schema instead of a local table. Removes 6 lines of duplication.
Miroslav Simko <ms@iolabs.ch> 2026-09-01T11:07:39+02:00
1 files · 8 snippets · score 75
Revert of 31a4ceb. Step 5 bright-points I/O is outside the run3 contract and the change broke filteringintensity master against its pinned common 0.3.2. Net effect of this pair in the report is zero. Re-apply after the common release and floor bump if wanted.
Miroslav Simko <ms@iolabs.ch> 2026-09-01T10:49:18+02:00
1 files · 8 snippets · score 75
Original attempt to carry the field through the bright-points NPZ I/O; reverted the same day (see ab5a38b). Kept in history only.
Miroslav Simko <ms@iolabs.ch> 2026-09-01T23:35:31+02:00
2 files · 5 snippets · score 75
Test/doc only. Parity test now pins zero-fill semantics and a round-trip; fallback helper docstring warns that its plain astype would wrap a wider future field silently, so range checks belong at the call site.
Miroslav Simko <ms@iolabs.ch> 2026-09-01T15:11:49+02:00
2 files · 5 snippets · score 85
Adds the schema-parity test against common's segment_points_io. It importorskips, so it is inert on the pinned 0.3.2 and activates by itself once the floor is raised. CLAUDE.md documents the schema duplication.
Miroslav Simko <ms@iolabs.ch> 2026-09-01T10:48:35+02:00
2 files · 11 snippets · score 55
Tests for the producer write path and the zero fallback, plus fixture updates for the extra key.
Miroslav Simko <ms@iolabs.ch> 2026-09-01T23:39:27+02:00
1 files · 4 snippets · score 75
Docstrings only: states the extra-key policy (unknown NPZ members are ignored on load, never propagated) on the four record helpers. No behavior change.
Miroslav Simko <ms@iolabs.ch> 2026-09-01T10:50:28+02:00
3 files · 5 snippets · score 85
Docs only (AGENTS.md / CLAUDE.md / knowledge.md) describing the new field.
Miroslav Simko <ms@iolabs.ch> 2026-09-01T14:54:28+02:00
1 files · 1 snippets · score 85
Docs only: CLAUDE.md describes the schema-driven field tuple.
Miroslav Simko <ms@iolabs.ch> 2026-09-01T06:32:53Z
0 files · 0 snippets · score 10
Unrelated to AI3D-382: merge of an AI3D-226 helper-pipeline YAML that happened to fall inside the window. Ignore.
No matching commits.
Origin of the contract.
segment_points_iogainsNUMBER_OF_RETURNS_KEY/NUMBER_OF_RETURNS_DTYPE(uint8);save_points_npzalways writes it,load_points_npzzero-fills it when absent (0 = unknown). Every other commit in this report exists to feed or honour this.