worker: verify internal sub-worker scope reclaim

This commit is contained in:
2026-08-07 01:48:25 +09:00
parent c79db24016
commit e0ac732769
+10 -7
View File
@@ -349,9 +349,8 @@ impl Tool for SubWorkerSpawnTool {
) )
.await .await
.map_err(|error| ToolError::ExecutionFailed(format!("build Internal Worker: {error}")))?; .map_err(|error| ToolError::ExecutionFailed(format!("build Internal Worker: {error}")))?;
let child_scope = child.scope_handle(); let child_scope = child.scope().clone();
let child_registry = let child_registry = SpawnedWorkerRegistry::new_internal(input.name.clone(), child_scope);
SpawnedWorkerRegistry::new_internal(input.name.clone(), child_scope);
register_worker_tools( register_worker_tools(
&mut child, &mut child,
self.runtime_base self.runtime_base
@@ -837,7 +836,7 @@ mod tests {
let runtime = TempDir::new().unwrap(); let runtime = TempDir::new().unwrap();
let mut manifest = parent_manifest(&workspace_root, None); let mut manifest = parent_manifest(&workspace_root, None);
manifest.delegation_scope = ScopeConfig { manifest.delegation_scope = ScopeConfig {
allow: vec![abs_rule(&workspace_root, Permission::Read)], allow: vec![abs_rule(&workspace_root, Permission::Write)],
deny: Vec::new(), deny: Vec::new(),
}; };
let spawner_scope = SharedScope::new(Scope::from_config(&manifest.scope).unwrap()); let spawner_scope = SharedScope::new(Scope::from_config(&manifest.scope).unwrap());
@@ -858,7 +857,7 @@ mod tests {
registry.clone(), registry.clone(),
manifest.clone(), manifest.clone(),
AvailableProfiles::discover(&workspace_root), AvailableProfiles::discover(&workspace_root),
spawner_scope, spawner_scope.clone(),
DelegationScope::from_config(&manifest.delegation_scope).unwrap(), DelegationScope::from_config(&manifest.delegation_scope).unwrap(),
) )
.with_internal_client(Box::new(ScriptedInternalClient { .with_internal_client(Box::new(ScriptedInternalClient {
@@ -869,12 +868,14 @@ mod tests {
"profile": "builtin:reviewer", "profile": "builtin:reviewer",
"task": "review immutable commit", "task": "review immutable commit",
"scope": [{ "scope": [{
"target": workspace_root, "target": workspace_root.clone(),
"permission": "read", "permission": "write",
"recursive": true "recursive": true
}] }]
}); });
assert!(spawner_scope.snapshot().is_writable(&workspace_root));
let output = tool let output = tool
.execute( .execute(
&serde_json::to_string(&input).unwrap(), &serde_json::to_string(&input).unwrap(),
@@ -883,6 +884,7 @@ mod tests {
.await .await
.expect("spawn project reviewer as Internal Worker"); .expect("spawn project reviewer as Internal Worker");
assert!(output.summary.contains("internal worker `reviewer-child`")); assert!(output.summary.contains("internal worker `reviewer-child`"));
assert!(!spawner_scope.snapshot().is_writable(&workspace_root));
let record = registry let record = registry
.get_internal("reviewer-child") .get_internal("reviewer-child")
.expect("Internal reviewer registry record"); .expect("Internal reviewer registry record");
@@ -939,6 +941,7 @@ mod tests {
.await .await
.unwrap(); .unwrap();
assert!(registry.get_internal("reviewer-child").is_none()); assert!(registry.get_internal("reviewer-child").is_none());
assert!(spawner_scope.snapshot().is_writable(&workspace_root));
} }
#[test] #[test]