Skip to content

merge: fold dev-next into dev - #228

Merged
enkerewpo merged 163 commits into
devfrom
merge/dev-next-into-dev
Aug 23, 2026
Merged

merge: fold dev-next into dev#228
enkerewpo merged 163 commits into
devfrom
merge/dev-next-into-dev

Conversation

@enkerewpo

@enkerewpo enkerewpo commented Aug 9, 2026

Copy link
Copy Markdown
Member

Folds dev-next into dev. dev-next is not modified — it stays as the release/demo branch for the upcoming on-site work.

Why this was not a fast-forward

The branches had diverged in both directions: 114 commits on dev-next, 94 on dev, common ancestor 26db769a. 62 files conflicted. 23 commit pairs shared a subject across both branches, 14 of them byte-identical patches — the same fix applied twice.

How each conflict was decided

Not "take one branch". Per subsystem, on evidence:

Area Taken from Reason
Lifecycle drivers — rbnx launch/deploy, soma dev-next The target architecture. It adds registration_id to the Atlas provider.
dev's fingerprint takeover detection (469 lines) dropped It existed only because registration_id did not. is_new_provider_registration reads one field instead of opening a metadata-only ConnectCapability probe.
Pilot dev Three weeks newer, and carries the compact planning context from #210. Ten of dev-next's eleven pilot commits already had an equivalent on dev.
camera/extrinsics + Scene transform code dev-next TF tree authoritative, contract as compatibility fallback — matches the vendor-onboarding guide. dev's README still claimed Scene never uses tf2, which the code had already outgrown.
soma/msg/SensorExtrinsic.msg deleted That migration finished on dev-next. Nothing references it.
memory/srv/* dev ScribeMem deprecation notes postdate dev-next's copies.
Vitals bind address dev (127.0.0.1) Follows the provider-loopback direction of #188, not dev-next's 0.0.0.0.
GetUrdf assets contract from dev, implementation ported The contract kept include_assets/assets, so dev's asset reader was ported onto dev-next's service.
Codegen interpreter pinning dev RBNX_CODEGEN_PYTHON is used by 10 scripts on dev versus 5 for dev-next's wrapper, and postdates it.
dev-next's three CI workflows dropped They existed to run checks on dev-next itself.
Webots manifest, sim/start.sh union Each branch added an independent feature.

Validation

  • cargo fmt --all -- --check clean
  • cargo clippy --workspace --all-targets -- -D warnings clean
  • cargo test --workspace --all-targets — 296 passed, 0 failed
  • Every symbol introduced by dev's 70 unique commits still resolves in the merged tree. Two flagged by that sweep were checked by hand: the fingerprint machinery (deliberately dropped, above) and cancel_all_executor_plans (never existed on dev — the cancel-all path is dev's MetaPlanOp::CancelAll, which is present).

Four merge defects were found and fixed rather than shipped: a duplicated config_json clap argument, four duplicated helpers in soma/store.rs, a duplicated executor test, and is_builtin_system being called without a definition after taking dev-next's deploy.rs.

Not included

  • Three dev-next Scene features (semantic map persistence, epoch-aware annotations, map identity discovery) overlap feat(scene): make derived object state correctable and recoverable #199's files and are left for after it lands.
  • dev-next's per-instance simulator teardown: runtime_state.sh is merged and used by start.sh, but splicing it into stop.sh produced invalid shell twice, so stop.sh is dev's. Worth a follow-up.

Update 2026-08-21

  • Caught the branch up with both sides: merged the 10 commits dev gained since (CI pins, README/contributors cleanup, Assisted-by checker) and dev-next's f6cacfc4 (URDF out of Pilot's prompt; one trivial conflict — dev-next's older file predates dev's compact_yaml tests, tests kept).
  • The "Not included" note below is now stale: after feat(scene): make derived object state correctable and recoverable #199 landed, the three dev-next Scene features (semantic map persistence, epoch-aware annotations, map identity discovery) reached dev through their own PRs and are present in this branch.
  • fix(liaison): the runner's newer clippy flags chunks_exact(2); switched to as_chunks::<2>().
  • Full Webots e2e re-dispatched via workflow_dispatch (run 32470673781); the earlier "no scenario summary" result came from a runner-side infrastructure issue, since resolved.

HeartLinked and others added 30 commits July 14, 2026 21:12
Change-Id: I612387073d557cd7da9d6c0eb6e546036b84f508
Change-Id: I6549314863f95d8d011a5a42c86042b1f9e1979b
Change-Id: Idfb094998e2f37b4028268a9c33e996f12b51232
Change-Id: I880482047dc7b0c32ca1f9cd350e0e45187d0719
Change-Id: I5905ef10ed6a85474d13f82c201fb0c17ec87f5b
Set SCENE_ANNOTATIONS_DIR in start_native.sh to a package-local persisted path when deploy configuration does not provide one. This prevents native Scene from inheriting the Docker /data default and failing room annotation initialization with permission denied.

Verification: bash -n; Jetson no-actuator boot initialized the annotation store and room create/update idempotency passed through the user API.
Stage an already-prefetched ViT-B-32 weight from Scene HF cache into the Ultralytics weights path by hard link with copy fallback. Fail the build when the resulting Ultralytics path is still missing, preventing a later long start-time download.

Verification: bash -n on the resulting Scene build script; prior Jetson cache fixture verified the staged weight is byte-identical.
Keep Scene map deletion aligned with mapping deletion. After the standard robonix/service/map/delete_map call succeeds, delete only the matching annotation JSON partition and persisted object rows. Add partition-isolation coverage for room deletion.
Keep robot-local ALSA audio available while registering the Atlas-discovered reverse client bridge. Leave hands-free disabled until robonix-client supplies its persisted input/output route; service paths now use ROBONIX_SOURCE_PATH.
Expose robot-local hands-free turns through the standard Liaison VoiceEvent stream, fix wake-word audio chunk decoding, and improve reverse audio diagnostics. Also give Scene room annotations stable colors, centered labels, and independently scrollable compact lists.
Add --no-update-check to rbnx build and skip the remote freshness pass while retaining normal package resolution and compilation. Cover the new CLI option with a parser regression test.
The graph had no loop closures at all, so the wheel odometry chain was
never corrected and a 120 s explore doubled every revisited wall. Allow
proximity detection and Vis+ICP registration for loop closures while
neighbour links stay on odometry, which is what protects in-place
rotation, and cap the optimizer error so a bad link cannot twist the map.

Assisted-by: Claude Code:claude-fable-5
The range finder was advertised as depth_registered and RTAB-Map
reprojects it with rgb/camera_info, but it carried the depth optical
frame, which the URDF places 25 mm to the side of the colour frame.
Every feature landed 25 mm off, so visual loop closure rejected all 31
candidates with zero inliers and only scan proximity corrected drift.

Assisted-by: Claude Code:claude-fable-5
Pilot resolves api_format to "openai" by default and rejects every
other value, so the manifest line adds nothing and contradicts the
merged manifest-hygiene test.

Assisted-by: Claude Code:claude-opus-5
The dev-next test file asserted dev-next's own tree, so on the merged
tree it failed 6 tests with 1 error while CI only gates cargo. Align
what guards real decisions and delete what merely photocopies files:

- vitals listener now expects 127.0.0.1 (#188 provider-loopback, the
  direction this merge chose over dev-next's 0.0.0.0)
- drop the sim-stop scoping test and its helper script: they test
  dev-next's per-instance stop.sh, which the merge deliberately did
  not take (recorded as a follow-up in the PR)
- drop content mirrors that duplicate pinned versions, rtabmap
  parameter values, sed lines, and README strings into assertions;
  they break on any legitimate edit without guarding behaviour

15 tests remain and pass on this tree.

Assisted-by: Claude Code:claude-opus-5
The stock Astra places the range finder 26 mm beside the colour camera,
yet the driver advertises the stream as depth_registered and RTAB-Map
reprojects it with the colour camera_info. At 1 m that parallax is about
12 px, so every visual loop closure was rejected with zero inliers and
only scan proximity ever corrected drift. Both devices already share a
field of view and resolution, so co-locate them in a deployment-owned
PROTO and zero the matching URDF offset.

Assisted-by: Claude Code:claude-fable-5
Frontier exploration takes a different path every run, and the resulting
spread in the quality metrics was wider than any parameter change I was
trying to measure. A scripted 1.5 m rectangle covers the same ground each
time and returns to its start, so the graph has to close the loop.

Assisted-by: Claude Code:claude-fable-5
The chassis move contract is gRPC and the executor only dispatches MCP,
so an RTDL scenario cannot drive the robot at all. Publish the rectangle
directly instead, as a best-effort CI step that cannot fail the suite.

Assisted-by: Claude Code:claude-fable-5
Walls that stay doubled after a revisit mean the odometry chain was never
corrected. That is visible in the database: only neighbour links means no
loop closure or proximity link ever landed. Group Link rows by type in the
probe that already opens the map, so every run says which kinds of links
the graph actually got.

Assisted-by: Claude Code:claude-fable-5
memgraph asked for grpcio>=1.81.1 while scene pins ==1.80.0, so uv could
not resolve the workspace at all and memgraph, memory, speech and
voiceprint all failed to build. CI already documents why 1.80.0 is the
number: codegen's grpcio-tools has to match the runtime grpcio or
RegisterService fails on a version skew.

Assisted-by: Claude Code:claude-fable-5
Commit 48fe316 in the mapping service hardcoded
RGBD/CreateOccupancyGrid=true to keep saved maps loadable, but with an
RGB-D camera the grid is already built from depth on demand; caching a
local grid on every node stacks hundreds of node grids into the radial
smear that has been plaguing Webots maps since early July. Turn it off
in the deployment override; map save/load stays covered by the CI
persistence check.

Assisted-by: Claude Code:claude-fable-5
tiago_health still advertised robonix/primitive/health/driver while the
rest of the deployment moved to the shared robonix/lifecycle/driver, so
the provider aborted at startup with 'failed to declare required
lifecycle Driver' and took Soma stage 1, and with it the whole Webots
boot, down with it.

Assisted-by: Claude Code:claude-fable-5
Turning the per-node cache off does stop the radial smear, but save_map
then refuses to publish: without those cached grids RTAB-Map produces no
occupancy snapshot, and scene's /api/maps/save returns 502 'map
preview/occupancy snapshot was not produced'. The July 9 hardcode was
load-bearing after all.

Assisted-by: Claude Code:claude-fable-5
tiago_health kept its own copy of resolve_advertise_host and fell back to
ROBONIX_ATLAS=127.0.0.1:50051. Inside a bridge-networked sim container that
address is the container itself, so declaring the lifecycle Driver failed
with UNAVAILABLE and Soma stage 1 aborted the whole deployment. Source the
shared container_network.sh helper instead, which resolves the gateway
address and extends no_proxy so a host proxy does not swallow the dial.

sim/stop.sh had the mirror-image problem: it hardcoded the default
container names while start.sh honours ROBONIX_SIM_CONTAINER and friends,
so an isolated CI run tore down the interactive user's containers and
leaked its own.

Assisted-by: Claude Code:claude-fable-5
That change assumed wheel odometry drifts over a long explore, which is
true on hardware but not in Webots: the simulator's odometry is exact, so
ICP and proximity links have no drift to correct and only mis-register
against repetitive walls, yanking poses and duplicating the walls they
were meant to align. Back to the registration profile that kept walls
single.

Assisted-by: Claude Code:claude-fable-5
CLAUDE.md requires a comment on any body over five lines; four functions
in the health service lost theirs in the merge.

Assisted-by: Claude Code:claude-fable-5
Only one of the two warnings was updated to the supported flow; the other
still told operators to edit mapping's config.map_id, which the UI does not
expose. The merge deleted the test that asserts both messages agree, which
is what let the stale one through, so restore it.

Assisted-by: Claude Code:claude-fable-5
I based tonight's tuning on d383f1b's claim that its profile 'kept walls
single', but that commit is from this same work session and exists only on
this branch - it is not a historical known-good state, so the claim was
never independent evidence. dev's profile is what actually has a track
record. Restore it exactly and leave the parameters alone until a measured
comparison justifies changing them.

Assisted-by: Claude Code:claude-fable-5
@enkerewpo
enkerewpo merged commit 2feaf1a into dev Aug 23, 2026
15 checks passed
@enkerewpo
enkerewpo deleted the merge/dev-next-into-dev branch August 23, 2026 00:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

comp:api pylib/robonix-api comp:atlas system/atlas comp:capabilities capabilities/ contracts comp:ci .github/ workflows comp:codegen tools/codegen comp:docs docs/ and READMEs comp:liaison system/liaison comp:memory services/memsearch comp:pilot system/pilot comp:rbnx tools/rbnx comp:scene system/scene comp:soma system/soma comp:speech services/speech comp:vitals system/vitals comp:voiceprint services/voiceprint

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants