@@ -323,12 +323,12 @@ def _peer_work_requires_isolated_workspace(
323323 agent_todo_summary : dict [str , Any ] | None ,
324324 * ,
325325 selected_todo : dict [str , Any ] | None = None ,
326- local_write_scope_admitted : bool = False ,
326+ local_goal_workspace : bool = False ,
327327) -> bool :
328328 explicit = workspace_guard_policy .get ("peer_independent_worktree_required" )
329329 if explicit is not None :
330330 return explicit is True
331- if local_write_scope_admitted :
331+ if local_goal_workspace :
332332 return False
333333 candidate = (
334334 selected_todo
@@ -347,19 +347,14 @@ def _peer_work_requires_isolated_workspace(
347347 )
348348
349349
350- def observe_goal_local_write_scopes (
350+ def observe_goal_local_workspace (
351351 goal : dict [str , Any ],
352352 selected_todo : dict [str , Any ] | None ,
353353 allowed_write_scopes : list [str ] | None = None ,
354354) -> dict [str , Any ]:
355- """Read physical Goal identity once; typed work requirements own admission."""
356- empty = {"admitted" : False , "allowed_write_scopes" : []}
357- if (
358- not selected_todo
359- or selected_todo .get ("task_repository" )
360- or selected_todo .get ("continuation_policy" ) != "same_agent_non_delivery"
361- or not selected_todo .get ("required_write_scopes" )
362- ):
355+ """Reuse the registered workspace identity and project its existing grants."""
356+ empty : dict [str , Any ] = {}
357+ if not selected_todo or selected_todo .get ("task_repository" ):
363358 return empty
364359 repo = goal .get ("repo" ) or goal .get ("project" ) or goal .get ("root" )
365360 goal_id = goal .get ("goal_id" ) or goal .get ("id" )
@@ -378,11 +373,11 @@ def observe_goal_local_write_scopes(
378373 scopes = allowed_write_scopes if allowed_write_scopes is not None else raw_scopes
379374 if not isinstance (scopes , list ) or any (not isinstance (scope , str ) for scope in scopes ):
380375 return empty
381- from ..quota .settlement_workspace_causality import project_goal_local_write_scopes
376+ from ..quota .settlement_workspace_causality import project_goal_write_scopes
382377
383378 # Physical identity is resolved above. Scope authority stays relative to the
384379 # registered spelling, including an explicit symlink alias of that root.
385- return project_goal_local_write_scopes (str (root ), selected_todo , scopes )
380+ return { "workspace" : snapshot , ** project_goal_write_scopes (str (root ), scopes )}
386381
387382
388383def build_agent_workspace_guard (
@@ -392,7 +387,7 @@ def build_agent_workspace_guard(
392387 agent_todo_summary : dict [str , Any ] | None = None ,
393388 selected_todo : dict [str , Any ] | None = None ,
394389 current_path : Path | None = None ,
395- local_write_scopes : dict [str , Any ] | None = None ,
390+ local_workspace : dict [str , Any ] | None = None ,
396391) -> dict [str , Any ] | None :
397392 if not isinstance (agent_identity , dict ):
398393 return None
@@ -410,41 +405,18 @@ def build_agent_workspace_guard(
410405 else next (iter (_peer_candidate_items (agent_todo_summary )), {})
411406 )
412407 local = (
413- local_write_scopes
414- if local_write_scopes is not None
415- else observe_goal_local_write_scopes (goal , candidate )
408+ local_workspace
409+ if local_workspace is not None
410+ else observe_goal_local_workspace (goal , candidate )
416411 )
417- root = goal .get ("repo" ) or goal .get ("project" ) or goal .get ("root" )
418- local_admitted = local .get ("admitted" ) is True
419- if local_admitted and root :
420- current = capture_delivery_workspace (
421- current_path ,
422- local_goal_id = str (goal .get ("goal_id" ) or goal .get ("id" )),
423- local_project_root = Path (str (root )),
424- )
425- local_admitted = bool (current and current .get ("identity_kind" ) == "local_goal" )
426- if (
427- not local_admitted
428- and workspace_guard_policy .get ("peer_independent_worktree_required" )
429- is not False
430- ):
431- return {
432- "schema_version" : AGENT_WORKSPACE_GUARD_SCHEMA_VERSION ,
433- "source" : "quota.should-run" ,
434- "action" : local ["workspace_repair_action" ],
435- "current_workspace" : "foreign_workspace" ,
436- "required_workspace" : "local_goal_workspace" ,
437- "blocks_delivery" : True ,
438- "agent_id" : agent_identity .get ("agent_id" ),
439- "repository_source" : "goal.repo" ,
440- "reason" : "declared local writes must run from the registered Goal workspace" ,
441- "required_action" : "return to the registered Goal project and rerun quota should-run before local writes" ,
442- }
412+ # Local declarations are relative to the registered Goal target, not the
413+ # caller cwd. Causal accounting still names the actual delivery workspace.
414+ local_admitted = (local .get ("workspace" ) or {}).get ("identity_kind" ) == "local_goal"
443415 if not _peer_work_requires_isolated_workspace (
444416 workspace_guard_policy ,
445417 agent_todo_summary ,
446418 selected_todo = selected_todo ,
447- local_write_scope_admitted = local_admitted ,
419+ local_goal_workspace = local_admitted ,
448420 ):
449421 return None
450422 task_repository = normalize_todo_task_repository (candidate .get ("task_repository" ))
0 commit comments