Skip to content

[WIP] Live Collab M3 - Follow ups for agglomerate skeletons and meshes #9102

Open
MichaelBuessemeyer wants to merge 266 commits intomasterfrom
live-m3-follow-up
Open

[WIP] Live Collab M3 - Follow ups for agglomerate skeletons and meshes #9102
MichaelBuessemeyer wants to merge 266 commits intomasterfrom
live-m3-follow-up

Conversation

@MichaelBuessemeyer
Copy link
Copy Markdown
Contributor

@MichaelBuessemeyer MichaelBuessemeyer commented Nov 26, 2025

This PRs goal is to keep agglomerate meshes and skeleton in sync with the currently loaded mapping state of a user. Primarily this is needed for consistency in a live collab annotation.
See design doc for this steps changes and its related hand-over notes: https://www.notion.so/scalableminds/Design-Doc-Meeting-Notes-Live-Collaboration-1adb51644c6380dfafd4c8f5999830f9#1c1b51644c6380b989e5e1bb68a3c7d1

For major conceptional changes, see the doc link above

URL of deployed dev instance (used for testing):

  • https://___.webknossos.xyz

Steps to test:

  • To a live session testing with multiple users active at the same time
  • The shouldn't be more than one mesh visible for a single segment
  • Interrupt the annotating at some point: Check the meshes and skeletons: Are they up to date & correct?

TODOs:

  • Segment Stat Routes need versioning!
    • The backend at least has the parameters and uses them. But Frontend support is still missing
    • Get this checked by @fm3
  • AdHoc meshing route still needs to be correctly versioned in the tracingstore.
    • get this checked by @fm3
  • The update actions caused by post-processing steps of proofreading sagas need to be stored in the same “mutex acquisition cycle” as in which the editable mapping changes are sent to the server to ensure consistency!
    • Idea: Use a subscription based approach: Sagas can subscribe to the mutex and the mutex saga keeps the mutex as long as at least one saga still wants to have the mutex.
      • e.g. the proofreading subscribes to the mutex before triggering the sending of its editable mapping updates to the backend. Then after this is done, it does the post processing like segment list updating & agglomerate skeleton reloading. Sends these updates to the server again. Then unsubscribes from the mutex.
      • During saving the save queue draining saga subscribes to the mutex and unsubscribes as soon as the saving is done.
      • → in case of proofreading the proofreading saga still has a subscription ⇒ thus the mutex will be kept until the proofreading post processing is done.
      • !!! ⇒ This approach's consistency can be broken via version restore!
    • Even better, make the applying of the editable mapping updates & the post processing updates an own transaction ⇒ Would need quite some help from backend. Talk with @fm3 about this. Might be pretty complicated.
  • Agglomerate Trees are identified by their name. This can be edited ⇒ PROBLEM
  • Rethink the new mesh property isProofreadingAuxiliaryMesh . Is it needed? Shouldn’t all meshes be refreshed automatically if the underlying mapping changes? Or shouldn’t they?
    • Discuss this
    • I removed this.
  • Some backend routes related to meshes and skeletons are now versioned; But the version parameters name is inconsistent => TODO: rethink what would be a good name here
    • Went for annotationVersion
  • Write a test to ensure diffEdgeCollections with useDeepEqualityCheck = true works as intended
  • Potentially add time tracking to deep edge diffing and report operations which take very long hinting at potential runtime improvements
  • Add Docstrings to Utils -> diffNumberArrays
  • log diffEdgeCollections taking a lot of time to airbrake to see if this becomes a bottle neck in production
  • remove logging in save_saga -> removeOutdatedMeshes & reloadMeshes
  • write tests for remapNodeIdsWithPositionMap -> currently only tested indirectly via agglomerate skeleton syncing tests
  • fix comment in update_actions createTree
  • for the snapshots generated by tests use getNestedUpdateActions to remove boilerplate metadata
  • in tests with agglomerate skeletons the injected updates also need the required skeleton update actions
  • check comment in: Proofreading saga -> clearProofreadingByproducts
    • cannot find the comment any longer. Not sure what this was about. Maybe the now removed isProofreadingAuxiliaryMesh property?
  • Write test injecting an agglomerate skeleton which then the local test user needs to update in its merge / split action
    • implemented one for a simple merge and one for a simple split operation. Works 👍
  • Existing proofreading tests should also check the segment list at the end of the test
  • Bug: If the initial proofreading actions is a split operation, the operation fails
  • Remove timeouts in all tests
  • use getPositionForSegmentId
  • Live testing
    • Bugs:
      • mesh color does not update
      • agglomerate skeletons can be loaded multiple times
      • Skeleton tool node / tree creation does not work
        • Cannot reproduce
      • 2 simulatanous split do not update the agglomerate trees properly.
        • Cannot reproduce anymore
  • Code cleanup
  • Undo wk_dev.ts changes
  • merge

Written tests:

  • In general regarding existing test files: Moving functions helping with the tests to

  • proofreading_skeleton_interaction.spec.ts:

    • Test the agglomerate skeleton generating mock for answering correctly
    • The existing tests with injected versions: The injected updates now also include the agglomerate skeleton updates to more accurate testing!
  • proofreading_auxiliary_mesh_loading.spec.ts: The following cases should load and auto-reload the correct agglomerate meshes upon editable mapping changes:

    • with live collab enabled and disabled:
      • agglomerate meshes are loaded properly
      • a merge
      • a split
    • auto apply foreign merge
    • auto apply foreign split
    • apply injected merge & own merge action
    • apply injected split & own merge action
    • apply injected merge & own split action
    • apply injected split & own split action
    • splitting from all neighbors
    • apply injected split & own split from all neighbors action
    • apply injected merge & own merge via agglomerate skeletons
    • apply injected split & own split via an agglomerate skeleton
    • apply injected merge & own split via an agglomerate skeleton
    • apply two injected merges & own partitioned split / min cut; but the min-cut was done done on an outdated mapping version. Thus, the split is incomplete.
  • proofreading_agglomerate_skeleton_syncing.spec.ts

    • When live collab is active: Loading agglomerate skeletons should be done in a mutex guarded context and the updates of the skeleton loading should be sent to the backend before the mutex is released.
    • It should auto reload the agglomerate skeletons correctly in the following test cases:
    • with live collab enabled and disabled:
      • apply merge
      • apply merge but do not auto update agglomerate skeletons as the merge does not affect any of the loaded skeletons
      • apply split
      • apply split but do not auto update agglomerate skeletons as the split does not affect any of the loaded skeletons
      • apply merge via mesh interaction
      • apply split via mesh interaction
      • apply split from all neighbors
    • apply injected merge & own merge action
    • apply injected split & own merge action
    • apply injected merge & own split action
    • apply injected split & own split action
    • apply injected merge & own split from all neighbors action
    • apply injected merge & own split via partititioned min-cut action

Deferred TODOs:

  • Try support more update actions when incorporating them
  • Keep mesh opacity during reload
  • Keep agglomerate skeleton visibility during reload

Issues:


(Please delete unneeded items, merge only when none are left open)

  • Added changelog entry (create a $PR_NUMBER.md file in unreleased_changes or use ./tools/create-changelog-entry.py)
  • Added migration guide entry if applicable (edit the same file as for the changelog)
  • Updated documentation if applicable
  • Adapted wk-libs python client if relevant API parts change
  • Removed dev-only changes like prints and application.conf edits
  • Considered common edge cases
  • Needs datastore update after deployment

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Nov 26, 2025

Important

Review skipped

Too many files!

This PR contains 166 files, which is 16 over the limit of 150.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 43638aca-7c50-44a7-8964-8c86ea533e80

📥 Commits

Reviewing files that changed from the base of the PR and between fe99e73 and fddfc60.

📒 Files selected for processing (166)
  • biome.jsonc
  • frontend/javascripts/admin/api/mesh.ts
  • frontend/javascripts/admin/rest_api.ts
  • frontend/javascripts/libs/diffable_map.ts
  • frontend/javascripts/libs/mjs.ts
  • frontend/javascripts/libs/number_like_map_wrapper.ts
  • frontend/javascripts/libs/progress_callback.ts
  • frontend/javascripts/libs/utils.ts
  • frontend/javascripts/test/backend_snapshot_tests/annotations.e2e.ts
  • frontend/javascripts/test/fixtures/dataset_server_object.ts
  • frontend/javascripts/test/fixtures/segment_merging_fixtures.ts
  • frontend/javascripts/test/fixtures/skeletontracing_server_objects.ts
  • frontend/javascripts/test/fixtures/volumetracing_server_objects.ts
  • frontend/javascripts/test/helpers/apiHelpers.ts
  • frontend/javascripts/test/helpers/geometry_helpers.ts
  • frontend/javascripts/test/helpers/saga_test_helpers.ts
  • frontend/javascripts/test/libs/diffable_map.spec.ts
  • frontend/javascripts/test/model/edge_collection.spec.ts
  • frontend/javascripts/test/reducers/update_action_application/skeleton.spec.ts
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/auto-sync_agglomerate_skeleton_1339_after_injected_merge_and_split.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/auto-sync_agglomerate_skeleton_1339_after_injected_merge_and_splitting_from_all_neighbors.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/auto-sync_agglomerate_skeleton_1339_after_injected_split_and_merge.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/auto-sync_agglomerate_skeleton_1339_after_injected_split_and_partitioned_min_cut.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/auto-sync_agglomerate_skeleton_1339_after_injected_split_and_split.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/auto-sync_agglomerate_skeleton_1339_after_splitting.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/auto-sync_agglomerate_skeleton_1339_after_splitting_from_all_neighbors.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/auto-sync_agglomerate_skeleton_1340_after_injected_merge_and_splitting_from_all_neighbors.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/auto-sync_agglomerate_skeleton_1340_after_injected_split_and_partitioned_min_cut.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/auto-sync_agglomerate_skeleton_1340_after_injected_split_and_split.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/auto-sync_agglomerate_skeleton_1340_after_splitting_from_all_neighbors.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/auto-sync_agglomerate_skeleton_1_after_injected_merge_and_split.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/auto-sync_agglomerate_skeleton_1_after_injected_merge_and_splitting_from_all_neighbors.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/auto-sync_agglomerate_skeleton_1_after_injected_split_and_partitioned_min_cut.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/auto-sync_agglomerate_skeleton_1_after_injected_split_and_split.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/auto-sync_agglomerate_skeleton_1_after_merging.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/auto-sync_agglomerate_skeleton_1_after_splitting.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/auto-sync_agglomerate_skeleton_1_after_splitting_from_all_neighbors.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/auto-sync_agglomerate_skeleton_4_after_injected_split_and_merge.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/auto-sync_agglomerate_skeleton_4_after_injected_split_and_partitioned_min_cut.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/auto-sync_agglomerate_skeleton_4_after_injected_split_and_split.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/auto-sync_agglomerate_skeleton_6_after_injected_merge_and_split.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/auto-sync_agglomerate_skeleton_6_after_injected_merge_and_splitting_from_all_neighbors.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/auto-sync_agglomerate_skeleton_6_after_injected_split_and_merge.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/auto-sync_agglomerate_skeleton_6_after_injected_split_and_partitioned_min_cut.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/auto-sync_agglomerate_skeleton_6_after_injected_split_and_split.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/auto-sync_agglomerate_skeleton_6_after_splitting.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/auto-sync_agglomerate_skeleton_6_after_splitting_from_all_neighbors.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/merge_should_correctly_update_newly_loaded_agglomerate_skeleton_due_to_rebasing.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/merge_should_refresh_agglomerate_skeletons_with_others_may_edit-false.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/merge_should_refresh_agglomerate_skeletons_with_others_may_edit-true.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/merge_with_injected_merge_should_refresh_agglomerate_skeletons.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/merge_with_injected_split_should_refresh_agglomerate_skeletons.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/mincut_with_injected_split_should_refresh_agglomerate_skeletons.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/multi_split_with_injected_split_should_refresh_agglomerate_skeletons.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/should_auto_push_skeleton_updates_in_live_collab.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/split_from_all_neighbors_with_injected_merge_should_refresh_agglomerate_skeletons.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/split_should_correctly_update_newly_loaded_agglomerate_skeleton_due_to_rebasing.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/split_should_not_refresh_unaffected_agglomerate_skeletons_with_others_may_edit-false.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/split_should_not_refresh_unaffected_agglomerate_skeletons_with_others_may_edit-true.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/split_should_refresh_agglomerate_skeletons_with_others_may_edit-false.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/split_should_refresh_agglomerate_skeletons_with_others_may_edit-true.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/agglomerate_skeleton_syncing/split_with_injected_merge_should_refresh_agglomerate_skeletons.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/proofreading_skeleton_interaction.spec.ts/load_agglomerate_tree_update_actions.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/proofreading_skeleton_interaction.spec.ts/merge_skeleton_interfered.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/proofreading_skeleton_interaction.spec.ts/merge_skeleton_interfered_no_op.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/proofreading_skeleton_interaction.spec.ts/merge_skeleton_simple.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/proofreading_skeleton_interaction.spec.ts/min_cut_nodes_skeleton_incomplete.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/proofreading_skeleton_interaction.spec.ts/min_cut_nodes_skeleton_more_complex.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/proofreading_skeleton_interaction.spec.ts/min_cut_nodes_skeleton_simple.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/proofreading_skeleton_interaction.spec.ts/perform_merge_trees_proofreading_update_actions.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/proofreading_skeleton_interaction.spec.ts/perform_min_cut_with_nodes_proofreading.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/proofreading_skeleton_interaction.spec.ts/split_skeleton_interfered_merge.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/proofreading_skeleton_interaction.spec.ts/split_skeleton_interfered_no_op.json
  • frontend/javascripts/test/sagas/proofreading/__snapshots__/proofreading_skeleton_interaction.spec.ts/split_skeleton_simple.json
  • frontend/javascripts/test/sagas/proofreading/agglomerate_skeleton_syncing_saga_helpers.spec.ts
  • frontend/javascripts/test/sagas/proofreading/proofreading_agglomerate_skeleton_syncing.spec.ts
  • frontend/javascripts/test/sagas/proofreading/proofreading_auxiliary_mesh_loading.spec.ts
  • frontend/javascripts/test/sagas/proofreading/proofreading_generated_update_actions.spec.ts
  • frontend/javascripts/test/sagas/proofreading/proofreading_interaction_update_action_fixtures.ts
  • frontend/javascripts/test/sagas/proofreading/proofreading_mesh_interaction.spec.ts
  • frontend/javascripts/test/sagas/proofreading/proofreading_multi_user.spec.ts
  • frontend/javascripts/test/sagas/proofreading/proofreading_poll_only.spec.ts
  • frontend/javascripts/test/sagas/proofreading/proofreading_single_user.spec.ts
  • frontend/javascripts/test/sagas/proofreading/proofreading_skeleton_interaction.spec.ts
  • frontend/javascripts/test/sagas/proofreading/proofreading_skeleton_test_utils.ts
  • frontend/javascripts/test/sagas/proofreading/proofreading_test_utils.ts
  • frontend/javascripts/test/sagas/save_mutex_saga.spec.ts
  • frontend/javascripts/test/sagas/save_queue_draining_saga.spec.ts
  • frontend/javascripts/test/sagas/volumetracing/volume_diffing.spec.ts
  • frontend/javascripts/test/sagas/volumetracing/volume_segment_items_multi_user.spec.ts
  • frontend/javascripts/types/api_types.ts
  • frontend/javascripts/viewer/api/wk_dev.ts
  • frontend/javascripts/viewer/constants.ts
  • frontend/javascripts/viewer/controller/combinations/segmentation_handlers.ts
  • frontend/javascripts/viewer/default_state.ts
  • frontend/javascripts/viewer/geometries/skeleton.ts
  • frontend/javascripts/viewer/merger_mode.ts
  • frontend/javascripts/viewer/model.ts
  • frontend/javascripts/viewer/model/accessors/skeletontracing_accessor.ts
  • frontend/javascripts/viewer/model/accessors/volumetracing_accessor.ts
  • frontend/javascripts/viewer/model/actions/dataset_actions.ts
  • frontend/javascripts/viewer/model/actions/save_actions.ts
  • frontend/javascripts/viewer/model/actions/skeletontracing_actions.tsx
  • frontend/javascripts/viewer/model/bucket_data_handling/wkstore_adapter.ts
  • frontend/javascripts/viewer/model/bucket_data_handling/wkstore_helper.ts
  • frontend/javascripts/viewer/model/edge_collection.ts
  • frontend/javascripts/viewer/model/helpers/compaction/compact_update_actions.ts
  • frontend/javascripts/viewer/model/reducers/annotation_reducer.ts
  • frontend/javascripts/viewer/model/reducers/save_reducer.ts
  • frontend/javascripts/viewer/model/reducers/skeletontracing_reducer.ts
  • frontend/javascripts/viewer/model/reducers/skeletontracing_reducer_helpers.ts
  • frontend/javascripts/viewer/model/reducers/update_action_application/shared_update_helper.ts
  • frontend/javascripts/viewer/model/reducers/update_action_application/skeleton.ts
  • frontend/javascripts/viewer/model/reducers/volumetracing_reducer_helpers.ts
  • frontend/javascripts/viewer/model/sagas/meshes/ad_hoc_mesh_saga.ts
  • frontend/javascripts/viewer/model/sagas/meshes/common_mesh_saga.ts
  • frontend/javascripts/viewer/model/sagas/meshes/precomputed_mesh_saga.ts
  • frontend/javascripts/viewer/model/sagas/root_saga.ts
  • frontend/javascripts/viewer/model/sagas/saga_helpers.ts
  • frontend/javascripts/viewer/model/sagas/saving/rebasing_helpers_sagas.ts
  • frontend/javascripts/viewer/model/sagas/saving/save_mutex_saga.tsx
  • frontend/javascripts/viewer/model/sagas/saving/save_queue_draining_saga.tsx
  • frontend/javascripts/viewer/model/sagas/saving/save_queue_filling_saga.ts
  • frontend/javascripts/viewer/model/sagas/saving/save_saga.tsx
  • frontend/javascripts/viewer/model/sagas/skeletontracing_saga.ts
  • frontend/javascripts/viewer/model/sagas/volume/proofreading/agglomerate_skeleton_syncing_saga_helpers.ts
  • frontend/javascripts/viewer/model/sagas/volume/proofreading/proofread_saga.ts
  • frontend/javascripts/viewer/model/sagas/volume/update_actions.ts
  • frontend/javascripts/viewer/model/types/tree_types.ts
  • frontend/javascripts/viewer/store.ts
  • frontend/javascripts/viewer/view/context_menu/use_segment_statistics.ts
  • frontend/javascripts/viewer/view/right_border_tabs/comment_tab/comment_tab_view.tsx
  • frontend/javascripts/viewer/view/right_border_tabs/segments_tab/segment_statistics_modal.tsx
  • package.json
  • test/backend/NMLUnitTestSuite.scala
  • test/backend/SkeletonUpdateActionsUnitTestSuite.scala
  • tools/debugging/version-visualizer/public/index.html
  • tools/debugging/version-visualizer/public/main.js
  • unreleased_changes/9102.md
  • vite.config.ts
  • webknossos-datastore/app/com/scalableminds/webknossos/datastore/controllers/BinaryDataController.scala
  • webknossos-datastore/app/com/scalableminds/webknossos/datastore/controllers/DSMeshController.scala
  • webknossos-datastore/app/com/scalableminds/webknossos/datastore/controllers/DataSourceController.scala
  • webknossos-datastore/app/com/scalableminds/webknossos/datastore/helpers/GetSegmentIndexParameters.scala
  • webknossos-datastore/app/com/scalableminds/webknossos/datastore/helpers/SegmentStatistics.scala
  • webknossos-datastore/app/com/scalableminds/webknossos/datastore/helpers/TreeAgglomerateInfo.scala
  • webknossos-datastore/app/com/scalableminds/webknossos/datastore/models/DataRequests.scala
  • webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/DSRemoteTracingstoreClient.scala
  • webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/mapping/Hdf5AgglomerateService.scala
  • webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/mapping/ZarrAgglomerateService.scala
  • webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/mesh/AdHocMeshService.scala
  • webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/mesh/DSFullMeshService.scala
  • webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/mesh/MeshFileService.scala
  • webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/mesh/MeshMappingHelper.scala
  • webknossos-datastore/proto/SkeletonTracing.proto
  • webknossos-tracingstore/app/com/scalableminds/webknossos/tracingstore/TSRemoteDatastoreClient.scala
  • webknossos-tracingstore/app/com/scalableminds/webknossos/tracingstore/controllers/EditableMappingController.scala
  • webknossos-tracingstore/app/com/scalableminds/webknossos/tracingstore/controllers/VolumeTracingController.scala
  • webknossos-tracingstore/app/com/scalableminds/webknossos/tracingstore/tracings/editablemapping/EditableMappingService.scala
  • webknossos-tracingstore/app/com/scalableminds/webknossos/tracingstore/tracings/skeleton/updating/SkeletonUpdateActions.scala
  • webknossos-tracingstore/app/com/scalableminds/webknossos/tracingstore/tracings/volume/TSFullMeshService.scala
  • webknossos-tracingstore/app/com/scalableminds/webknossos/tracingstore/tracings/volume/VolumeSegmentIndexBuffer.scala
  • webknossos-tracingstore/app/com/scalableminds/webknossos/tracingstore/tracings/volume/VolumeSegmentIndexService.scala
  • webknossos-tracingstore/app/com/scalableminds/webknossos/tracingstore/tracings/volume/VolumeSegmentStatisticsService.scala
  • webknossos-tracingstore/app/com/scalableminds/webknossos/tracingstore/tracings/volume/VolumeTracingService.scala
  • webknossos-tracingstore/conf/tracingstore.latest.routes

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch live-m3-follow-up

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

…of own merge action while rebasing, the proofread saga is doing this already
@@ -12,7 +12,7 @@ import type ApiLoader from "./api_loader";
// for debugging or one off scripts.
export const WkDevFlags = {
logActions: false,
liveCollab: false,
liveCollab: true,
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TODO: undo

@MichaelBuessemeyer MichaelBuessemeyer marked this pull request as ready for review March 19, 2026 15:32
Copy link
Copy Markdown
Contributor Author

@MichaelBuessemeyer MichaelBuessemeyer left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pending replys:

So left over TODOs:

  • Live testing
  • Code cleanup
  • merge
  • profit

}

export const initialBucketOverrides: Array<{ position: Vector3; value: number }> = [
{ position: [100, 100, 100], value: 1337 }, // todop: can we change the positions to to 1337³ etc?
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is not possible as the mocked datasets bounds are not high enough. But we could adjust the mock to implement this I guess

context.tearDownPullQueues();
// Saving after each test and checking that the root saga did indeed crash.
expect(hasRootSagaCrashed()).toBe(true);
expect(hasRootSagaCrashed()).toBe(false);
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done in 7c8af0c
The problem why I used spawn was that the subscribe helper saga needed to be able to start the mutex fetching saga in case it was needed. A simple call / fork would have forced the subscribe helper saga to wait until the mutex fetching is done. But as the mutex fetching goes on forever unless stopped, the subscribe saga would never terminate unless spawn was used.

Now the subscribe saga helper dispatches an action to which the "rool level" mutex saga listenes to and then on demand starts fetching / releasing the annotation mutex. This way the subscribe helper saga is no longer blocked and the "rool level" mutex saga successfully crashes as well when the mutex fetching loop errors.

After a thourough implementation time without any tests run all were instantly green 🎉 -> maybe a good sign that this is a good way to implement this :D

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixes

Bug: If the initial proofreading actions is a split operation, the operation fails

in commit 50e354c

MichaelBuessemeyer added a commit that referenced this pull request Mar 23, 2026
Fixes a bug noticed in #9102. Might be good to get this easy fix merged
before #9102 is merged. Should be an easy win to fix this imo.

### URL of deployed dev instance (used for testing):
- https://___.webknossos.xyz

### Steps to test:
- Open an annotation with an agglomerate mapping
- Activate the agglomerate mapping
- Activeate the proofread tool
- Make a split -> should succeed.
- Try the same on master -> should result in an error 


### Issues:
- fixes bug noticed in #9102

------
(Please delete unneeded items, merge only when none are left open)
- [x] Updated
[changelog](../blob/master/CHANGELOG.unreleased.md#unreleased)

---------

Co-authored-by: Daniel <daniel.werner@scalableminds.com>
@MichaelBuessemeyer
Copy link
Copy Markdown
Contributor Author

Bugs / TODOs from latest test session:

  • mesh color does not update
  • agglomerate skeletons can be loaded multiple times
  • Skeleton tool node / tree creation does not work
  • 2 simulatanous splits do not update the agglomerate trees properly.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Live is live milestone 3 follow up Automatically update agglomerate skeletons during proofreading

4 participants