fix: keep unmanaged workdirs out of managed lists

This commit is contained in:
Keisuke Hirata 2026-07-11 02:31:29 +09:00
parent 8695089fba
commit 239f93b084
No known key found for this signature in database
4 changed files with 96 additions and 2 deletions

View File

@ -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'

View File

@ -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
---

View File

@ -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 {

View File

@ -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)