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'
|
title: 'Add Backend Worker/Workdir registry and link model'
|
||||||
state: 'inprogress'
|
state: 'inprogress'
|
||||||
created_at: '2026-07-10T15:53:02Z'
|
created_at: '2026-07-10T15:53:02Z'
|
||||||
updated_at: '2026-07-10T17:12:46Z'
|
updated_at: '2026-07-10T17:31:13Z'
|
||||||
assignee: null
|
assignee: null
|
||||||
queued_by: 'workspace-panel'
|
queued_by: 'workspace-panel'
|
||||||
queued_at: '2026-07-10T16:10:57Z'
|
queued_at: '2026-07-10T16:10:57Z'
|
||||||
|
|
|
||||||
|
|
@ -195,4 +195,27 @@ Validation run:
|
||||||
- nix build .#yoi --no-link
|
- 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 _ = sync_all_runtime_workdir_observations(api);
|
||||||
let records = api
|
let records = api
|
||||||
.store
|
.store
|
||||||
.list_workdir_registry(&api.config.workspace_id, 200)?;
|
.list_managed_workdir_registry(&api.config.workspace_id, 200)?;
|
||||||
Ok(records
|
Ok(records
|
||||||
.iter()
|
.iter()
|
||||||
.map(workdir_summary_from_record)
|
.map(workdir_summary_from_record)
|
||||||
|
|
@ -4297,6 +4297,59 @@ mod tests {
|
||||||
assert!(!serialized.contains("materialized_path"));
|
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]
|
#[test]
|
||||||
fn unmanaged_runtime_workdir_projection_is_typed_and_diagnostic_safe() {
|
fn unmanaged_runtime_workdir_projection_is_typed_and_diagnostic_safe() {
|
||||||
let workdir = WorkdirRegistryRecord {
|
let workdir = WorkdirRegistryRecord {
|
||||||
|
|
|
||||||
|
|
@ -1272,6 +1272,20 @@ mod tests {
|
||||||
updated_at: "3".to_string(),
|
updated_at: "3".to_string(),
|
||||||
};
|
};
|
||||||
store.upsert_workdir_registry(&workdir).unwrap();
|
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 {
|
let link = WorkerWorkdirLinkRecord {
|
||||||
workspace_id: "local-dev".to_string(),
|
workspace_id: "local-dev".to_string(),
|
||||||
|
|
@ -1295,6 +1309,10 @@ mod tests {
|
||||||
.unwrap(),
|
.unwrap(),
|
||||||
Some(workdir.clone())
|
Some(workdir.clone())
|
||||||
);
|
);
|
||||||
|
assert_eq!(
|
||||||
|
store.list_workdir_registry("local-dev", 10).unwrap(),
|
||||||
|
vec![unmanaged_workdir.clone(), workdir.clone()]
|
||||||
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
store
|
store
|
||||||
.list_managed_workdir_registry("local-dev", 10)
|
.list_managed_workdir_registry("local-dev", 10)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user