Skip to content

fix(portal): delete redirects to parent (no reload/error); chat status bar single-row#288

Merged
rbuergi merged 1 commit into
mainfrom
fix/delete-redirect-and-status-bar
Jul 6, 2026
Merged

fix(portal): delete redirects to parent (no reload/error); chat status bar single-row#288
rbuergi merged 1 commit into
mainfrom
fix/delete-redirect-and-status-bar

Conversation

@rbuergi

@rbuergi rbuergi commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

Delete → redirect to parent

On a distributed portal, the post-delete redirect ran an ancestor-existence Query per ancestor (ResolveNearestExistingAncestor). Those cross-partition queries can hang, so the redirect stalled behind the 10s timeout while the just-deleted node's area kept re-rendering against a gone node → reload then error, then it fell back to the immediate parent which for a thread is the virtual _Thread satellite → "No node found".

Fix: when the immediate parent is a satellite grouping (_Thread, _Activity, …) — the common case (deleting a thread) — resolve the redirect target by pure path (walk up past satellite segments), immediately, no query. A non-satellite virtual parent (…/Script) still uses the bounded existence walk, but its fallback is now the pure-path ancestor, never the maybe-virtual immediate parent. Fast, can't hang, lands on a real page.

Chat status bar → single row

.thread-chat-status-row was flex-wrap: wrap → now nowrap + overflow: hidden; chips get min-width: 0 so long values ellipsis inline; the model chip's title carries the full path for hover.

Tests

DeleteRedirectToExistingParentTest — added NearestNonSatelliteAncestor_skips_satellite_grouping (thread → user home, comment → thread, real parent kept, top-level → home). 4/4 green, Portal builds -warnaserror.

🤖 Generated with Claude Code

…gle-row

Delete: on a distributed portal the ancestor-existence walk (a Query per ancestor)
can hang cross-partition, stalling the redirect behind the 10s timeout while the
just-deleted node's area re-renders and errors (the 'reload then error'). When the
immediate parent is a SATELLITE grouping (_Thread, _Activity, …) — the common case,
e.g. deleting a thread — resolve the target by PURE PATH (skip satellite segments),
immediately, no query. Only a non-satellite virtual parent (…/Script) still needs the
existence walk; its fallback is the pure-path ancestor, never the maybe-virtual parent.

Status bar: .thread-chat-status-row was flex-wrap:wrap → stays one row (nowrap +
overflow:hidden); chips shrink (min-width:0) so long values ellipsis inline; model
chip title carries the full path for hover.

Tests: DeleteRedirectToExistingParentTest +NearestNonSatelliteAncestor (4/4).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown

Test Results (shard 5)

803 tests  +70   623 ✅ +69   3m 27s ⏱️ +50s
  9 suites ± 0   180 💤 + 1 
  9 files   ± 0     0 ❌ ± 0 

Results for commit dde6d2c. ± Comparison against base commit f057e77.

This pull request removes 34 and adds 104 tests. Note that renamed tests count towards both.
MeshWeaver.Hosting.Monolith.Test.CreatableTypesFileSystemTest ‑ FileSystem_GetChildrenOfACMEProject_ShouldIncludeTodo
MeshWeaver.Hosting.Monolith.Test.CreatableTypesFileSystemTest ‑ FileSystem_ProductLaunch_CreatableTypes_ShouldIncludeTodo
MeshWeaver.Hosting.Monolith.Test.CreatableTypesFileSystemTest ‑ FileSystem_QueryChildNodeTypes_ShouldFindTodo
MeshWeaver.Hosting.Monolith.Test.CreatableTypesFileSystemTest ‑ FileSystem_VerifyDataStructure
MeshWeaver.Hosting.Monolith.Test.CreatableTypesIntegrationTest ‑ CreateForm_DefaultType_ShouldBeParentNodeType
MeshWeaver.Hosting.Monolith.Test.CreatableTypesIntegrationTest ‑ CreateForm_RootNamespace_ProducesCorrectPath
MeshWeaver.Hosting.Monolith.Test.CreatableTypesIntegrationTest ‑ CreateNode_ViaCatalog_ThenRequestEditView_Succeeds
MeshWeaver.Hosting.Monolith.Test.CreateLayoutAreaIntegrationTest ‑ CreatableTypesProvider_IsRegistered
MeshWeaver.Hosting.Monolith.Test.CreateLayoutAreaIntegrationTest ‑ CreateArea_WithTypeParam_ShowsCreateForm
MeshWeaver.Hosting.Monolith.Test.CreateLayoutAreaIntegrationTest ‑ CreateArea_WithoutTypeParam_ShowsTypeSelection
…
MeshWeaver.Hosting.Monolith.Test.AgentChatClientNoSuitableAgentTest ‑ AgentChatClient_OnHostedSubHub_DoesNotReturn_NoSuitableAgent
MeshWeaver.Hosting.Monolith.Test.AgentPickerProjectionPartitionedTest ‑ PartitionedPath_ObserveAgents_FromHostedSubHub_PopulatesCombobox
MeshWeaver.Hosting.Monolith.Test.AgentPickerProjectionPartitionedTest ‑ PartitionedPath_ObserveAgents_PopulatesCombobox
MeshWeaver.Hosting.Monolith.Test.AgentPickerProjectionPartitionedTest ‑ PartitionedPath_ObserveModels_PopulatesCombobox
MeshWeaver.Hosting.Monolith.Test.AgentSyncedQueryFromHostedHubTest ‑ HostedSubHub_GetQuery_AgentDropdownNamesAreNonEmpty
MeshWeaver.Hosting.Monolith.Test.AgentSyncedQueryFromHostedHubTest ‑ HostedSubHub_GetQuery_ReturnsAgentsAndModels
MeshWeaver.Hosting.Monolith.Test.BrokenNodeTypeAccessTest ‑ AccessingInstance_OfNonCompilingNodeType_AnswersTerminalError_NotSilence
MeshWeaver.Hosting.Monolith.Test.CessionLayoutAreaTest ‑ BusinessRulesDoc_RelativeReference_ResolvesToMotorXL
MeshWeaver.Hosting.Monolith.Test.CessionLayoutAreaTest ‑ Cession_Trace_HubConfiguration
MeshWeaver.Hosting.Monolith.Test.CessionLayoutAreaTest ‑ MotorXL_LayoutArea_ReturnsContent
…

@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown

Test Results (shard 2)

696 tests  ±0   694 ✅ ±0   1m 51s ⏱️ -9s
  9 suites ±0     2 💤 ±0 
  9 files   ±0     0 ❌ ±0 

Results for commit dde6d2c. ± Comparison against base commit f057e77.

@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown

Test Results (shard 4)

   10 files  ± 0     10 suites  ±0   4m 7s ⏱️ +41s
1 166 tests  - 52  1 166 ✅  - 52  0 💤 ±0  0 ❌ ±0 
1 175 runs   - 53  1 175 ✅  - 53  0 💤 ±0  0 ❌ ±0 

Results for commit dde6d2c. ± Comparison against base commit f057e77.

This pull request removes 52 tests.
MeshWeaver.Persistence.Test.ApplicationPageResolutionTest ‑ ResolvePathAsync_FutuReSubPaths_ShouldResolve(path: "FutuRe/Analysis", expectedPrefix: "FutuRe/Analysis", expectedRemainder: null)
MeshWeaver.Persistence.Test.ApplicationPageResolutionTest ‑ ResolvePathAsync_FutuReSubPaths_ShouldResolve(path: "FutuRe/EuropeRe", expectedPrefix: "FutuRe/EuropeRe", expectedRemainder: null)
MeshWeaver.Persistence.Test.ApplicationPageResolutionTest ‑ ResolvePathAsync_FutuReSubPaths_ShouldResolve(path: "FutuRe/EuropeRe/LineOfBusiness", expectedPrefix: "FutuRe/EuropeRe/LineOfBusiness", expectedRemainder: null)
MeshWeaver.Persistence.Test.ApplicationPageResolutionTest ‑ ResolvePathAsync_FutuReSubPaths_ShouldResolve(path: "FutuRe/EuropeRe/Overview", expectedPrefix: "FutuRe/EuropeRe", expectedRemainder: "Overview")
MeshWeaver.Persistence.Test.ApplicationPageResolutionTest ‑ ResolvePathAsync_FutuRe_ShouldNotReturnNull
MeshWeaver.Persistence.Test.ApplicationPageResolutionTest ‑ ResolvePathAsync_UnknownDeepPath_ShouldReturnNull
MeshWeaver.Persistence.Test.ConcurrentRequestsTest ‑ ConcurrentRequests_MultipleNodeTypes_AllLoadWithoutHanging
MeshWeaver.Persistence.Test.DocumentationCodeBlockCompilationTest ‑ ExecutedCsharpBlocks_MustCompile(embeddedResourceName: "MeshWeaver.Documentation.Data.AI.TeamsBot.md")
MeshWeaver.Persistence.Test.DocumentationCodeBlockCompilationTest ‑ ExecutedCsharpBlocks_MustCompile(embeddedResourceName: "MeshWeaver.Documentation.Data.Architecture.AccessC"···)
MeshWeaver.Persistence.Test.DocumentationCodeBlockCompilationTest ‑ ExecutedCsharpBlocks_MustCompile(embeddedResourceName: "MeshWeaver.Documentation.Data.Architecture.DataSyn"···)
…

@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown

Test Results (shard 1)

1 029 tests  ±0   1 028 ✅ ±0   3m 42s ⏱️ +10s
    8 suites ±0       1 💤 ±0 
    8 files   ±0       0 ❌ ±0 

Results for commit dde6d2c. ± Comparison against base commit f057e77.

@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown

Test Results (shard 3)

788 tests  ±0   788 ✅ ±0   3m 54s ⏱️ +5s
 10 suites ±0     0 💤 ±0 
 10 files   ±0     0 ❌ ±0 

Results for commit dde6d2c. ± Comparison against base commit f057e77.

@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown

Test Results (shard 0)

631 tests  ±0   631 ✅ ±0   4m 47s ⏱️ +8s
 10 suites ±0     0 💤 ±0 
 10 files   ±0     0 ❌ ±0 

Results for commit dde6d2c. ± Comparison against base commit f057e77.

@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown

Test Results

   56 files  ± 0     56 suites  ±0   21m 51s ⏱️ + 1m 45s
5 113 tests +18  4 930 ✅ +17  183 💤 +1  0 ❌ ±0 
5 122 runs  +17  4 939 ✅ +16  183 💤 +1  0 ❌ ±0 

Results for commit dde6d2c. ± Comparison against base commit f057e77.

This pull request removes 86 and adds 104 tests. Note that renamed tests count towards both.
MeshWeaver.Hosting.Monolith.Test.CreatableTypesFileSystemTest ‑ FileSystem_GetChildrenOfACMEProject_ShouldIncludeTodo
MeshWeaver.Hosting.Monolith.Test.CreatableTypesFileSystemTest ‑ FileSystem_ProductLaunch_CreatableTypes_ShouldIncludeTodo
MeshWeaver.Hosting.Monolith.Test.CreatableTypesFileSystemTest ‑ FileSystem_QueryChildNodeTypes_ShouldFindTodo
MeshWeaver.Hosting.Monolith.Test.CreatableTypesFileSystemTest ‑ FileSystem_VerifyDataStructure
MeshWeaver.Hosting.Monolith.Test.CreatableTypesIntegrationTest ‑ CreateForm_DefaultType_ShouldBeParentNodeType
MeshWeaver.Hosting.Monolith.Test.CreatableTypesIntegrationTest ‑ CreateForm_RootNamespace_ProducesCorrectPath
MeshWeaver.Hosting.Monolith.Test.CreatableTypesIntegrationTest ‑ CreateNode_ViaCatalog_ThenRequestEditView_Succeeds
MeshWeaver.Hosting.Monolith.Test.CreateLayoutAreaIntegrationTest ‑ CreatableTypesProvider_IsRegistered
MeshWeaver.Hosting.Monolith.Test.CreateLayoutAreaIntegrationTest ‑ CreateArea_WithTypeParam_ShowsCreateForm
MeshWeaver.Hosting.Monolith.Test.CreateLayoutAreaIntegrationTest ‑ CreateArea_WithoutTypeParam_ShowsTypeSelection
…
MeshWeaver.Hosting.Monolith.Test.AgentChatClientNoSuitableAgentTest ‑ AgentChatClient_OnHostedSubHub_DoesNotReturn_NoSuitableAgent
MeshWeaver.Hosting.Monolith.Test.AgentPickerProjectionPartitionedTest ‑ PartitionedPath_ObserveAgents_FromHostedSubHub_PopulatesCombobox
MeshWeaver.Hosting.Monolith.Test.AgentPickerProjectionPartitionedTest ‑ PartitionedPath_ObserveAgents_PopulatesCombobox
MeshWeaver.Hosting.Monolith.Test.AgentPickerProjectionPartitionedTest ‑ PartitionedPath_ObserveModels_PopulatesCombobox
MeshWeaver.Hosting.Monolith.Test.AgentSyncedQueryFromHostedHubTest ‑ HostedSubHub_GetQuery_AgentDropdownNamesAreNonEmpty
MeshWeaver.Hosting.Monolith.Test.AgentSyncedQueryFromHostedHubTest ‑ HostedSubHub_GetQuery_ReturnsAgentsAndModels
MeshWeaver.Hosting.Monolith.Test.BrokenNodeTypeAccessTest ‑ AccessingInstance_OfNonCompilingNodeType_AnswersTerminalError_NotSilence
MeshWeaver.Hosting.Monolith.Test.CessionLayoutAreaTest ‑ BusinessRulesDoc_RelativeReference_ResolvesToMotorXL
MeshWeaver.Hosting.Monolith.Test.CessionLayoutAreaTest ‑ Cession_Trace_HubConfiguration
MeshWeaver.Hosting.Monolith.Test.CessionLayoutAreaTest ‑ MotorXL_LayoutArea_ReturnsContent
…

@rbuergi rbuergi merged commit 31f98ae into main Jul 6, 2026
15 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant