Handoff: produce Abschnitt 1 Step 3 NPZ data with return counts on Azure

2026-09-03 · next agent session · repos 3dai.iolabs.orchestrator (master), Azure ML workspace ai3d-lf-mlw-pc-01

Summary

Continuation target: run LaneFinder Step 3 (segment mapper) for Abschnitt 1 on Azure ML with the newly released packages so every per-segment *_run3_points.npz carries the number_of_returns array, then hand back the new step3_output datastore path. This is the upstream data that "option 1" needs (Miro's wording; assumed to be the multiple-return-fraction channel proposed in AI3D-337, which was impossible before because Step 3 stripped the LAS return fields; see the AI3D-337 handoff linked below). Confirm the scope of "option 1" with Miro if anything downstream of Step 3 is expected from this session.

Package versions moved after the AI3D-382 work. Do not use the version numbers from the AI3D-382 commits; use what origin/master of the orchestrator pins today (table below). The AML environments for those pins are not registered yet, so the first real action is az ml environment create.

Current state

Published packages (Nexus, verified 2026-09-03)

PackageLatest on NexusRelevance
iolabs-common0.9.0run3 NPZ schema owner (segment_points_io); 0.8.0 added number_of_returns, 0.9.0 added the Pydantic config layer (AI3D-379)
iolabs-point-cloud-segmentation-trajectory0.7.4Step 3 producer. Writes number_of_returns (uint8) since 0.7.3; 0.7.4 relocks to common 0.9.0
iolabs-point-cloud-mask-clustering0.3.2Step 6 consumer, forwards the key into cluster NPZs
iolabs-point-cloud-segmentation-3d0.3.2consumer, tolerates the extra key
iolabs-point-cloud-filtering-intensity0.6.4legacy bright-points step, not in the master pipeline
iolabs-image-analyzer-rasterizer0.6.0 pinned in s4c (unchanged)the AI3D-337 z-channel work lives on an unmerged branch, see Risks

Orchestrator (/home/ai/dev/3dai.iolabs.orchestrator)

Abschnitt 1 runs on Azure

Next steps

  1. Clean worktree.
    cd /home/ai/dev/3dai.iolabs.orchestrator && git fetch origin
    git worktree add --detach /tmp/orch-returns origin/master
    cd /tmp/orch-returns
    grep -n "segmentation-trajectory" environments/s3_segment_mapper/conda.yml   # expect ==0.7.4
    grep -n "^version" environments/s3_segment_mapper/environment.yml          # expect 19
    grep -n "environment:" components/s3_segment_mapper.yml components/s3_build_geometry.yml   # both :19
    If a newer master moved the pin again, use whatever it says. Do not downgrade.
  2. Register the Step 3 environment (this builds a new image on AML, expect 10 to 20 minutes):
    az account set --subscription ba81b555-ffe9-4625-b90a-d0011d0b57c9
    az configure --defaults group=AI3D-rg workspace=ai3d-lf-mlw-pc-01
    az ml environment create --file environments/s3_segment_mapper/environment.yml
    az ml environment show --name s3_segment_mapper --version 19 --query "[name,version]" -o tsv
    The README section "Environments" explains the difference between a portal Rebuild and a new version. Only register s6 (v7) and s5 (v2) as well if Miro also wants Steps 5 and 6 rerun on the new data.
  3. Pick the Step 3 pipeline. Step 3 alone is enough for the NPZ data. Reuse pipelines/helpers/abschnitt_1_step3_no_angle_filter.yaml: it binds the baseline run's las_tasks, prepared inputs and geometry, and runs only s3_segment_mapping via components/s3_segment_mapper.yml. Decide the scan-angle filter with Miro: that helper sets s3_angle_limit: -1 (filter off, which is what the 2026-09-01 rerun used). To keep the default filter instead, override --set inputs.s3_angle_limit=<default from components/s3_segment_mapper.yml> or copy the helper to a new file such as pipelines/helpers/abschnitt_1_step3_returns.yaml and commit it. Consider also copying the display name / description so the run is identifiable.
  4. Submit.
    az ml job create --file pipelines/helpers/abschnitt_1_step3_no_angle_filter.yaml \
      --set name="lanefinder_abschnitt_1_s3_returns_$(date -u +%Y%m%d%H%M%S)" \
      --set inputs.s3_instance_count=16
    Azure rejects duplicate names, hence the timestamp. 16 instances was the last successful setting; the file default is 8.
  5. Monitor with the azure-cli skill: find the child job of the pipeline, tail its user_logs, and confirm the wrapper banner reports trajectory 0.7.4 and common 0.9.0. Expect the run to take roughly as long as the 2026-09-01 run (check its duration with az ml job show).
  6. Verify the NPZ contract on the output (see Verification) and record the new datastore path azureml://datastores/workspaceblobstore/paths/azureml/<child-guid>/step3_output/.
  7. Wire and commit. If Miro wants downstream steps or the z-range QA to consume the new data, update existing_step3_output in pipelines/helpers/abschnitt_1_from_step3.yaml and abschnitt_1_render_zrange.yaml (datastore form, never a raw https URL). Commit on master from the worktree with a one-line message prefixed by the ticket (AI3D-382 unless Miro names another), no co-author trailer, push, then git worktree remove.
  8. Report back: pipeline name, child job id, output path, one verified NPZ key list with dtypes, count of segments, and the fraction of points with number_of_returns > 1 for one or two segments so Miro can see the channel is real.

Verification

Done in the previous session: package tests (producer 47, mask-clustering 93, segmentation-3d 552, filtering-intensity 13) against published common; orchestrator env-pin test green at 34e12a4. Not done: no Azure run has produced return-count NPZs yet, and no AML image has been built for the new pins.

Check one segment after the run (download via az ml job download on the child job or az storage blob download with the datastore container from the azure-cli skill):

python - <<'EOF'
import numpy as np, glob
for p in sorted(glob.glob("lane_points/segment_0*/**/*_run3_points.npz", recursive=True))[:3]:
    z = np.load(p)
    n = z["number_of_returns"]
    print(p, z.files, n.dtype, "unknown(0)=%.3f" % (n == 0).mean(), "multi(>1)=%.3f" % (n > 1).mean())
EOF

Key artifacts

HandleWhat
/home/ai/dev/3dai.iolabs.orchestratororchestrator repo, Bitbucket remote, main branch master; README sections "Environments" and "Pipelines And Reruns"
pipelines/helpers/abschnitt_1_step3_no_angle_filter.yamlStep 3 only helper for Abschnitt 1 (commit edb9497, AI3D-226)
pipelines/helpers/abschnitt_1_from_step3.yaml, abschnitt_1_render_zrange.yamldownstream helpers currently bound to the 2026-07-02 Step 3 output
~/.claude/skills/azure-cli/SKILL.mdsubscription, workspace, storage account and container constants plus job/log/blob recipes
AI3D-337 multi-return gap handoffwhy return counts were needed; rasterizer branch feature/zrange-extra-channels in /home/ai/dev/3dai.iolabs.imageanalyzer.rasterizer
AI3D-382 diff reportevery commit that introduced number_of_returns across the fleet
~/.claude/projects/-home-ai-dev-3dai-iolabs-orchestrator/memory/resume-helper datastore-path rule, local pytest gap
~/.claude/projects/-home-ai-dev-3dai-lanefinder/memory/Step 3 rerun cleanup rules, Slack progress-update conventions, step log references

Risks and open questions

Suggested skills

azure-cli for everything on AML; codex-rescue or cursor-delegate for log digging; slack-post only if Miro asks for progress updates.