fix: keep unmanaged workdirs out of managed lists
This commit is contained in:
parent
8695089fba
commit
239f93b084
|
|
@ -2,7 +2,7 @@
|
|||
title: 'Add Backend Worker/Workdir registry and link model'
|
||||
state: 'inprogress'
|
||||
created_at: '2026-07-10T15:53:02Z'
|
||||
updated_at: '2026-07-10T17:12:46Z'
|
||||
updated_at: '2026-07-10T17:31:13Z'
|
||||
assignee: null
|
||||
queued_by: 'workspace-panel'
|
||||
queued_at: '2026-07-10T16:10:57Z'
|
||||
|
|
|
|||
|
|
@ -195,4 +195,27 @@ Validation run:
|
|||
- nix build .#yoi --no-link
|
||||
|
||||
|
||||
---
|
||||
|
||||
<!-- event: implementation_report author: hare at: 2026-07-10T17:31:13Z -->
|
||||
|
||||
## Implementation report
|
||||
|
||||
Follow-up fix for focused re-review blocker.
|
||||
|
||||
Fix summary:
|
||||
- Workspace-scoped Browser Workdir summaries / launch options now use only Backend-managed registry rows.
|
||||
- Runtime-direct/unmanaged Workdirs remain synchronized into the Backend registry and visible through runtime-scoped projection with explicit `management_kind: runtime_unmanaged`.
|
||||
- Added tests proving unmanaged rows are excluded from managed Browser summaries while remaining typed/diagnosable in runtime projection, and store-level managed listing excludes unmanaged rows.
|
||||
|
||||
Validation run:
|
||||
- git diff --check
|
||||
- cargo test -p yoi-workspace-server --lib
|
||||
- cargo test -p worker-runtime --features ws-server,fs-store
|
||||
- cargo check -p yoi
|
||||
- cd web/workspace && deno task check && deno task test
|
||||
- yoi ticket doctor
|
||||
- nix build .#yoi --no-link
|
||||
|
||||
|
||||
---
|
||||
|
|
|
|||
|
|
@ -3301,7 +3301,7 @@ fn working_directory_summaries(api: &WorkspaceApi) -> ApiResult<Vec<WorkingDirec
|
|||
let _ = sync_all_runtime_workdir_observations(api);
|
||||
let records = api
|
||||
.store
|
||||
.list_workdir_registry(&api.config.workspace_id, 200)?;
|
||||
.list_managed_workdir_registry(&api.config.workspace_id, 200)?;
|
||||
Ok(records
|
||||
.iter()
|
||||
.map(workdir_summary_from_record)
|
||||
|
|
@ -4297,6 +4297,59 @@ mod tests {
|
|||
assert!(!serialized.contains("materialized_path"));
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn workspace_managed_workdir_summaries_exclude_runtime_unmanaged_rows() {
|
||||
let dir = tempfile::tempdir().unwrap();
|
||||
let api = test_api(dir.path()).await;
|
||||
api.store
|
||||
.upsert_workdir_registry(&WorkdirRegistryRecord {
|
||||
workspace_id: TEST_WORKSPACE_ID.to_string(),
|
||||
workdir_id: "managed".to_string(),
|
||||
runtime_id: EMBEDDED_WORKER_RUNTIME_ID.to_string(),
|
||||
repository_id: "repo".to_string(),
|
||||
selector: None,
|
||||
resolved_commit: None,
|
||||
materialization_status: "present".to_string(),
|
||||
cleanliness: "clean".to_string(),
|
||||
management_kind: "backend_managed".to_string(),
|
||||
created_at: "1".to_string(),
|
||||
updated_at: "1".to_string(),
|
||||
})
|
||||
.unwrap();
|
||||
api.store
|
||||
.upsert_workdir_registry(&WorkdirRegistryRecord {
|
||||
workspace_id: TEST_WORKSPACE_ID.to_string(),
|
||||
workdir_id: "runtime-direct".to_string(),
|
||||
runtime_id: EMBEDDED_WORKER_RUNTIME_ID.to_string(),
|
||||
repository_id: "repo".to_string(),
|
||||
selector: None,
|
||||
resolved_commit: None,
|
||||
materialization_status: "present".to_string(),
|
||||
cleanliness: "unknown".to_string(),
|
||||
management_kind: "runtime_unmanaged".to_string(),
|
||||
created_at: "1".to_string(),
|
||||
updated_at: "2".to_string(),
|
||||
})
|
||||
.unwrap();
|
||||
|
||||
let managed = working_directory_summaries(&api)
|
||||
.unwrap_or_else(|err| panic!("working_directory_summaries failed: {}", err.error));
|
||||
assert_eq!(managed.len(), 1);
|
||||
assert_eq!(managed[0].working_directory_id, "managed");
|
||||
assert_eq!(
|
||||
managed[0].management_kind.as_deref(),
|
||||
Some("backend_managed")
|
||||
);
|
||||
|
||||
let (runtime_projection, _) =
|
||||
runtime_working_directory_summaries(&api, EMBEDDED_WORKER_RUNTIME_ID).unwrap_or_else(
|
||||
|err| panic!("runtime_working_directory_summaries failed: {}", err.error),
|
||||
);
|
||||
assert!(runtime_projection.iter().any(|summary| {
|
||||
summary.working_directory_id == "runtime-direct"
|
||||
&& summary.management_kind.as_deref() == Some("runtime_unmanaged")
|
||||
}));
|
||||
}
|
||||
#[test]
|
||||
fn unmanaged_runtime_workdir_projection_is_typed_and_diagnostic_safe() {
|
||||
let workdir = WorkdirRegistryRecord {
|
||||
|
|
|
|||
|
|
@ -1272,6 +1272,20 @@ mod tests {
|
|||
updated_at: "3".to_string(),
|
||||
};
|
||||
store.upsert_workdir_registry(&workdir).unwrap();
|
||||
let unmanaged_workdir = WorkdirRegistryRecord {
|
||||
workspace_id: "local-dev".to_string(),
|
||||
workdir_id: "runtime-direct".to_string(),
|
||||
runtime_id: "embedded".to_string(),
|
||||
repository_id: "repo".to_string(),
|
||||
selector: Some("feature".to_string()),
|
||||
resolved_commit: Some("123456".to_string()),
|
||||
materialization_status: "present".to_string(),
|
||||
cleanliness: "unknown".to_string(),
|
||||
management_kind: "runtime_unmanaged".to_string(),
|
||||
created_at: "3".to_string(),
|
||||
updated_at: "4".to_string(),
|
||||
};
|
||||
store.upsert_workdir_registry(&unmanaged_workdir).unwrap();
|
||||
|
||||
let link = WorkerWorkdirLinkRecord {
|
||||
workspace_id: "local-dev".to_string(),
|
||||
|
|
@ -1295,6 +1309,10 @@ mod tests {
|
|||
.unwrap(),
|
||||
Some(workdir.clone())
|
||||
);
|
||||
assert_eq!(
|
||||
store.list_workdir_registry("local-dev", 10).unwrap(),
|
||||
vec![unmanaged_workdir.clone(), workdir.clone()]
|
||||
);
|
||||
assert_eq!(
|
||||
store
|
||||
.list_managed_workdir_registry("local-dev", 10)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user