fix(claws): point per-mission workspace at /mission/repo + tool-inventory preamble
ci / gates (push) Successful in 18s
ci / frontend (push) Successful in 53s
ci / rust (push) Successful in 3m30s
ci / e2e (push) Skipped
ci / publish (push) Successful in 4m6s

Two stacked issues after risk_profile was fixed:

1. Claws had file_edit + 46 other tools available, but the templates
   trained the agents to expect file_read/file_write (older ZeroClaw
   tool names). Result: agent output kept saying "I only have file_read"
   and dumped implementations into the context window as text.

2. Even with file_edit, the sandbox pointed at
   /zeroclaw-data/.zeroclaw/agents/<alias>/workspace/ — NOT
   /mission/repo where the checked-out mission repo actually lives.
   unrestricted_filesystem=false blocked agents from reaching it.

Fixes:
- provision_claw now takes workspace_path. mission_orchestrator passes
  /mission/repo — pins the per-claw workspace via
  agents.<alias>.workspace.path to the bind-mount path so file_edit /
  content_search / glob_search operate on the mission's git checkout.
- phase_task_text prepends an explicit tool inventory (file_edit,
  content_search, glob_search, git_operations, git_forge, ...) plus a
  WORKSPACE line pinned at /mission/repo. Each phase directive is
  rewritten to reference file_edit / git_operations explicitly and to
  call out "do NOT paste code in your reply expecting the platform to
  save it."
This commit is contained in:
Omar Sobh
2026-07-24 13:14:30 -07:00
parent 84572186e9
commit 6d5e7c87d7
4 changed files with 73 additions and 15 deletions
+4 -1
View File
@@ -130,8 +130,11 @@ pub(crate) async fn build_team_with_lifecycle(
.await?;
let claw_id = agent.id.as_uuid();
let risk = RuntimeProvisioner::default_risk_profile_for_role(&m.role);
// No workspace override on the ad-hoc team-wizard path — those
// teams aren't mission-bound so they use the default per-agent
// workspace under <install>/agents/<alias>/workspace/.
provisioner
.provision_claw(claw_id, &m.model, risk)
.provision_claw(claw_id, &m.model, risk, None)
.await
.map_err(|e| {
eprintln!("teams: provision claw {claw_id} failed: {e}");