@ours.network/fleet 1.2.0-nightly.9 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +280 -68
- package/dist/account-origin.d.ts +5 -0
- package/dist/account-origin.js +31 -0
- package/dist/agent-ours/bridge.js +26 -9
- package/dist/agent-ours/correspondence.d.ts +10 -0
- package/dist/agent-ours/correspondence.js +1 -0
- package/dist/agent-ours/file-rpc.d.ts +12 -0
- package/dist/agent-ours/file-rpc.js +18 -4
- package/dist/agent-ours/harness.js +9 -1
- package/dist/agent-ours/mcp-endpoint.d.ts +22 -0
- package/dist/agent-ours/mcp-endpoint.js +101 -25
- package/dist/agent-ours/runtime.d.ts +9 -1
- package/dist/agent-ours/runtime.js +50 -2
- package/dist/agent-ours/service.d.ts +27 -1
- package/dist/agent-ours/service.js +107 -13
- package/dist/application/codex-models.d.ts +15 -0
- package/dist/application/codex-models.js +56 -0
- package/dist/application/conversation-history.d.ts +31 -0
- package/dist/application/conversation-history.js +339 -0
- package/dist/application/conversation-role-observer.d.ts +62 -0
- package/dist/application/conversation-role-observer.js +206 -0
- package/dist/application/fleet-query-service.d.ts +1 -1
- package/dist/application/fleet-query-service.js +3 -3
- package/dist/application/log-service.js +8 -8
- package/dist/application/model-catalog.d.ts +1 -1
- package/dist/application/model-catalog.js +5 -2
- package/dist/application/preset-provenance.d.ts +19 -0
- package/dist/application/preset-provenance.js +59 -0
- package/dist/application/resource-observer.d.ts +43 -0
- package/dist/application/resource-observer.js +323 -0
- package/dist/application/role-creation-service.js +3 -2
- package/dist/application/role-removal-service.js +17 -3
- package/dist/application/role-repository.d.ts +3 -1
- package/dist/application/role-repository.js +89 -54
- package/dist/application/room-layout-definitions.d.ts +45 -0
- package/dist/application/room-layout-definitions.js +130 -0
- package/dist/application/session-control.d.ts +63 -17
- package/dist/application/session-control.js +221 -23
- package/dist/application/supervisor-ours-tools.js +5 -11
- package/dist/application/task-layouts.d.ts +91 -0
- package/dist/application/task-layouts.js +261 -0
- package/dist/application/task-room-service.d.ts +101 -3
- package/dist/application/task-room-service.js +286 -33
- package/dist/application/types.d.ts +2 -0
- package/dist/atomic-file.d.ts +34 -1
- package/dist/atomic-file.js +161 -18
- package/dist/briefing.d.ts +5 -1
- package/dist/briefing.js +138 -31
- package/dist/build-info.json +10 -5
- package/dist/capabilities.d.ts +9 -1
- package/dist/capabilities.js +13 -0
- package/dist/cli.js +391 -38
- package/dist/client-profile.d.ts +5 -17
- package/dist/client-profile.js +4 -127
- package/dist/config.d.ts +45 -0
- package/dist/config.js +57 -6
- package/dist/creation.d.ts +1 -1
- package/dist/creation.js +4 -4
- package/dist/daemon-recovery.d.ts +14 -9
- package/dist/daemon-recovery.js +124 -115
- package/dist/docs.d.ts +1 -1
- package/dist/docs.js +402 -20
- package/dist/doctor.d.ts +4 -1
- package/dist/doctor.js +75 -60
- package/dist/erased-resources.d.ts +9 -0
- package/dist/erased-resources.js +87 -0
- package/dist/file-delivery/reader.d.ts +15 -0
- package/dist/file-delivery/reader.js +63 -0
- package/dist/file-delivery/store.d.ts +15 -0
- package/dist/file-delivery/store.js +124 -0
- package/dist/file-delivery/types.d.ts +19 -0
- package/dist/file-delivery/types.js +1 -0
- package/dist/fleet-command-audit.d.ts +13 -0
- package/dist/fleet-command-audit.js +31 -9
- package/dist/harness/agent-session.d.ts +4 -0
- package/dist/harness/claude-code-session.js +1 -1
- package/dist/harness/claude-code.js +21 -11
- package/dist/harness/claude-runtime.d.ts +12 -0
- package/dist/harness/claude-runtime.js +43 -0
- package/dist/harness/codex-app-server-proxy.d.ts +4 -1
- package/dist/harness/codex-app-server-proxy.js +41 -5
- package/dist/harness/codex-reasoning.d.ts +5 -0
- package/dist/harness/codex-reasoning.js +12 -0
- package/dist/harness/codex-runtime.d.ts +11 -1
- package/dist/harness/codex-runtime.js +31 -4
- package/dist/harness/codex-session.js +2 -2
- package/dist/harness/codex.js +24 -12
- package/dist/init-wizard.d.ts +2 -0
- package/dist/init-wizard.js +38 -19
- package/dist/isolation/policy.js +6 -1
- package/dist/isolation/types.d.ts +5 -0
- package/dist/managed-cli.d.ts +253 -0
- package/dist/managed-cli.js +923 -0
- package/dist/managed-recovery.d.ts +13 -0
- package/dist/managed-recovery.js +31 -0
- package/dist/minimal-setup.d.ts +2 -0
- package/dist/minimal-setup.js +44 -0
- package/dist/monitor.d.ts +9 -34
- package/dist/monitor.js +90 -153
- package/dist/notifications/fleet-producer.d.ts +31 -0
- package/dist/notifications/fleet-producer.js +351 -0
- package/dist/notifications/outbox.d.ts +59 -0
- package/dist/notifications/outbox.js +199 -0
- package/dist/notifications/target-cleanup.d.ts +16 -0
- package/dist/notifications/target-cleanup.js +75 -0
- package/dist/notifications/task-producer.d.ts +20 -0
- package/dist/notifications/task-producer.js +100 -0
- package/dist/ops.d.ts +2 -0
- package/dist/ops.js +20 -3
- package/dist/owner-channel/channel.js +17 -6
- package/dist/owner-channel/commands.d.ts +4 -0
- package/dist/owner-channel/commands.js +8 -0
- package/dist/owner-channel/lifecycle-outbox.js +4 -3
- package/dist/owner-channel/ours-client.js +2 -17
- package/dist/paths.d.ts +5 -0
- package/dist/paths.js +5 -0
- package/dist/preset-migration.js +55 -0
- package/dist/process-incarnation.d.ts +23 -0
- package/dist/process-incarnation.js +42 -0
- package/dist/reminders/manager.d.ts +75 -0
- package/dist/reminders/manager.js +278 -0
- package/dist/reminders/runtime.d.ts +27 -0
- package/dist/reminders/runtime.js +32 -0
- package/dist/reminders/schedule.d.ts +37 -0
- package/dist/reminders/schedule.js +104 -0
- package/dist/reminders/store.d.ts +341 -0
- package/dist/reminders/store.js +762 -0
- package/dist/reminders/tools.d.ts +20 -0
- package/dist/reminders/tools.js +114 -0
- package/dist/resolved-plan.js +1 -0
- package/dist/rooms-tasks/add-member.d.ts +48 -0
- package/dist/rooms-tasks/add-member.js +84 -0
- package/dist/rooms-tasks/archived-absence.d.ts +4 -0
- package/dist/rooms-tasks/archived-absence.js +11 -0
- package/dist/rooms-tasks/cli.js +182 -5
- package/dist/rooms-tasks/close.d.ts +5 -2
- package/dist/rooms-tasks/close.js +224 -36
- package/dist/rooms-tasks/config.d.ts +1 -1
- package/dist/rooms-tasks/config.js +11 -4
- package/dist/rooms-tasks/cowork-adapter.d.ts +12 -5
- package/dist/rooms-tasks/cowork-adapter.js +15 -121
- package/dist/rooms-tasks/cowork-http.js +56 -6
- package/dist/rooms-tasks/deletion.d.ts +1 -1
- package/dist/rooms-tasks/deletion.js +66 -10
- package/dist/rooms-tasks/erasure.d.ts +6 -0
- package/dist/rooms-tasks/erasure.js +173 -0
- package/dist/rooms-tasks/external-worker.d.ts +1 -1
- package/dist/rooms-tasks/external-worker.js +3 -4
- package/dist/rooms-tasks/layout-binding-client.d.ts +11 -0
- package/dist/rooms-tasks/layout-binding-client.js +56 -0
- package/dist/rooms-tasks/layout-binding-grants.d.ts +21 -0
- package/dist/rooms-tasks/layout-binding-grants.js +128 -0
- package/dist/rooms-tasks/layout-cli.d.ts +4 -0
- package/dist/rooms-tasks/layout-cli.js +107 -0
- package/dist/rooms-tasks/layout-config.d.ts +11 -0
- package/dist/rooms-tasks/layout-config.js +89 -0
- package/dist/rooms-tasks/layout-control.d.ts +21 -0
- package/dist/rooms-tasks/layout-control.js +52 -0
- package/dist/rooms-tasks/layout-member-retirement.d.ts +10 -0
- package/dist/rooms-tasks/layout-member-retirement.js +90 -0
- package/dist/rooms-tasks/layout-service.d.ts +43 -0
- package/dist/rooms-tasks/layout-service.js +203 -0
- package/dist/rooms-tasks/layout.d.ts +121 -0
- package/dist/rooms-tasks/layout.js +286 -0
- package/dist/rooms-tasks/legacy-task-member.d.ts +19 -0
- package/dist/rooms-tasks/legacy-task-member.js +116 -0
- package/dist/rooms-tasks/live-readiness.d.ts +18 -0
- package/dist/rooms-tasks/live-readiness.js +85 -0
- package/dist/rooms-tasks/member-ownership.d.ts +5 -0
- package/dist/rooms-tasks/member-ownership.js +40 -0
- package/dist/rooms-tasks/member-startup.d.ts +1 -0
- package/dist/rooms-tasks/member-startup.js +2 -0
- package/dist/rooms-tasks/provision.d.ts +3 -0
- package/dist/rooms-tasks/provision.js +101 -49
- package/dist/rooms-tasks/recovery.d.ts +19 -0
- package/dist/rooms-tasks/recovery.js +110 -0
- package/dist/rooms-tasks/room-state.d.ts +4 -2
- package/dist/rooms-tasks/room-state.js +47 -8
- package/dist/rooms-tasks/task-review.d.ts +113 -0
- package/dist/rooms-tasks/task-review.js +561 -0
- package/dist/rooms-tasks/task-service-retirement.d.ts +11 -0
- package/dist/rooms-tasks/task-service-retirement.js +21 -0
- package/dist/rooms-tasks/task-state.d.ts +51 -5
- package/dist/rooms-tasks/task-state.js +358 -50
- package/dist/rooms-tasks/task-tools.d.ts +35 -0
- package/dist/rooms-tasks/task-tools.js +134 -0
- package/dist/rooms-tasks/types.d.ts +78 -0
- package/dist/rooms-tasks/workspace-artifacts.d.ts +6 -0
- package/dist/rooms-tasks/workspace-artifacts.js +93 -0
- package/dist/rooms-tasks/workspace.d.ts +35 -0
- package/dist/rooms-tasks/workspace.js +325 -0
- package/dist/runner.d.ts +23 -4
- package/dist/runner.js +409 -61
- package/dist/session/acp.d.ts +75 -2
- package/dist/session/acp.js +345 -82
- package/dist/session/arbiter.d.ts +98 -0
- package/dist/session/arbiter.js +272 -3
- package/dist/session/codex-app-server.d.ts +45 -1
- package/dist/session/codex-app-server.js +225 -32
- package/dist/session/control.d.ts +17 -3
- package/dist/session/control.js +219 -23
- package/dist/session/conversation-normalizer.d.ts +2 -1
- package/dist/session/conversation-normalizer.js +1 -1
- package/dist/session/conversation-observation.d.ts +25 -0
- package/dist/session/conversation-observation.js +100 -0
- package/dist/session/conversation-replay.d.ts +50 -0
- package/dist/session/conversation-replay.js +203 -0
- package/dist/session/conversation-store.d.ts +15 -1
- package/dist/session/conversation-store.js +213 -26
- package/dist/session/conversation-types.d.ts +57 -4
- package/dist/session/prompt-batch.d.ts +79 -0
- package/dist/session/prompt-batch.js +120 -0
- package/dist/session/task-notice.d.ts +14 -0
- package/dist/session/task-notice.js +13 -0
- package/dist/session/types.d.ts +42 -1
- package/dist/setup-tunnel-preflight.d.ts +34 -0
- package/dist/setup-tunnel-preflight.js +62 -0
- package/dist/socket-path.d.ts +2 -0
- package/dist/socket-path.js +22 -0
- package/dist/spawn.d.ts +5 -1
- package/dist/spawn.js +40 -4
- package/dist/startup-prompt.d.ts +15 -0
- package/dist/startup-prompt.js +71 -0
- package/dist/startup-readiness.d.ts +20 -1
- package/dist/startup-readiness.js +66 -3
- package/dist/startup-telemetry.d.ts +16 -0
- package/dist/startup-telemetry.js +46 -0
- package/dist/subscriptions/cli.d.ts +91 -0
- package/dist/subscriptions/cli.js +223 -0
- package/dist/subscriptions/launch.d.ts +37 -0
- package/dist/subscriptions/launch.js +93 -0
- package/dist/subscriptions/login.d.ts +77 -0
- package/dist/subscriptions/login.js +215 -0
- package/dist/subscriptions/observed.d.ts +7 -0
- package/dist/subscriptions/observed.js +44 -0
- package/dist/subscriptions/probe.d.ts +10 -0
- package/dist/subscriptions/probe.js +73 -0
- package/dist/subscriptions/service.d.ts +102 -0
- package/dist/subscriptions/service.js +364 -0
- package/dist/subscriptions/store.d.ts +71 -0
- package/dist/subscriptions/store.js +143 -0
- package/dist/supervisor/adoption.d.ts +8 -0
- package/dist/supervisor/adoption.js +78 -0
- package/dist/supervisor/catalog.d.ts +62 -0
- package/dist/supervisor/catalog.js +254 -0
- package/dist/supervisor/fleet.d.ts +8 -0
- package/dist/supervisor/fleet.js +89 -0
- package/dist/supervisor/index.js +3 -6
- package/dist/supervisor/launchd.d.ts +1 -1
- package/dist/supervisor/launchd.js +26 -13
- package/dist/supervisor/legacy.d.ts +35 -0
- package/dist/supervisor/legacy.js +524 -0
- package/dist/supervisor/manager.d.ts +15 -0
- package/dist/supervisor/manager.js +270 -0
- package/dist/supervisor/registration-refresh.d.ts +45 -0
- package/dist/supervisor/registration-refresh.js +266 -0
- package/dist/supervisor/scope.d.ts +4 -0
- package/dist/supervisor/scope.js +10 -0
- package/dist/supervisor/systemd.d.ts +2 -2
- package/dist/supervisor/systemd.js +18 -37
- package/dist/task-supervision.d.ts +9 -0
- package/dist/task-supervision.js +145 -0
- package/dist/temp-idle.d.ts +17 -0
- package/dist/temp-idle.js +42 -0
- package/dist/temp-lifecycle.d.ts +23 -8
- package/dist/temp-lifecycle.js +123 -66
- package/dist/temp-supervisor-recovery.d.ts +1 -1
- package/dist/temp-supervisor-recovery.js +2 -2
- package/dist/tunnel-setup-completion.d.ts +7 -0
- package/dist/tunnel-setup-completion.js +13 -0
- package/dist/tunnel-setup-input.d.ts +19 -0
- package/dist/tunnel-setup-input.js +130 -0
- package/dist/watchdog/query.d.ts +3 -1
- package/dist/watchdog/query.js +2 -1
- package/dist/web/agent-attachments.d.ts +29 -0
- package/dist/web/agent-attachments.js +162 -0
- package/dist/web/auth.d.ts +65 -2
- package/dist/web/auth.js +201 -11
- package/dist/web/available-port.d.ts +2 -0
- package/dist/web/available-port.js +23 -0
- package/dist/web/control.d.ts +3 -3
- package/dist/web/control.js +10 -8
- package/dist/web/conversation-stream-codec.d.ts +23 -0
- package/dist/web/conversation-stream-codec.js +110 -0
- package/dist/web/conversation-stream.d.ts +26 -0
- package/dist/web/conversation-stream.js +239 -0
- package/dist/web/events.d.ts +2 -0
- package/dist/web/events.js +9 -0
- package/dist/web/fleet-config-service.d.ts +7 -1
- package/dist/web/fleet-config-service.js +61 -16
- package/dist/web/prefix-gateway.d.ts +32 -0
- package/dist/web/prefix-gateway.js +248 -0
- package/dist/web/resource-views.d.ts +138 -0
- package/dist/web/resource-views.js +519 -0
- package/dist/web/runtime.d.ts +3 -1
- package/dist/web/runtime.js +132 -34
- package/dist/web/server.d.ts +19 -0
- package/dist/web/server.js +893 -71
- package/dist/web/service.d.ts +11 -2
- package/dist/web/service.js +30 -4
- package/dist/web/workspace-devices.d.ts +107 -0
- package/dist/web/workspace-devices.js +277 -0
- package/dist/web/workspace-tunnel.d.ts +1 -0
- package/dist/web/workspace-tunnel.js +34 -0
- package/dist/workspace-enrollment.d.ts +83 -0
- package/dist/workspace-enrollment.js +605 -0
- package/dist/workspace-replacement.d.ts +66 -0
- package/dist/workspace-replacement.js +238 -0
- package/docs/acp-files.md +146 -0
- package/docs/conversation-stream.md +216 -0
- package/docs/fleet-migration.md +54 -0
- package/docs/live-voice.md +13 -0
- package/docs/room-layouts.md +227 -0
- package/docs/self-reminders.md +374 -0
- package/docs/task-progress-review.md +143 -0
- package/docs/task-workspaces.md +225 -0
- package/docs/validation/managed-cli-permissions.md +421 -0
- package/examples/room-layouts/fresh.yaml +27 -0
- package/examples/room-layouts/scoped.yaml +21 -0
- package/examples/room-layouts/shared.yaml +19 -0
- package/package.json +25 -20
- package/presets/README.md +78 -0
- package/presets/brain-catalog.json +8 -2
- package/presets/fleet/agent_templates/Critic.yaml +1 -1
- package/presets/fleet/agent_templates/Developer.yaml +1 -1
- package/presets/fleet/agent_templates/Engineer.yaml +5 -0
- package/presets/fleet/agent_templates/LocalCoordinator.yaml +6 -3
- package/presets/fleet/agents/FleetCoordinator.yaml +1 -1
- package/presets/fleet/brains/claude-fable-5-1-high.yaml +5 -0
- package/presets/fleet/brains/claude-fable-5-1-low.yaml +5 -0
- package/presets/fleet/brains/claude-fable-5-1-max.yaml +5 -0
- package/presets/fleet/brains/claude-fable-5-1-medium.yaml +5 -0
- package/presets/fleet/brains/claude-fable-5-1-xhigh.yaml +5 -0
- package/presets/fleet/brains/claude-fable-5-high.yaml +1 -1
- package/presets/fleet/brains/claude-fable-5-low.yaml +1 -1
- package/presets/fleet/brains/claude-fable-5-max.yaml +1 -1
- package/presets/fleet/brains/claude-fable-5-medium.yaml +1 -1
- package/presets/fleet/brains/claude-fable-5-xhigh.yaml +1 -1
- package/presets/fleet/brains/claude-haiku-4-5-20251001-default.yaml +4 -0
- package/presets/fleet/brains/claude-opus-5-5-high.yaml +5 -0
- package/presets/fleet/brains/claude-opus-5-5-low.yaml +5 -0
- package/presets/fleet/brains/claude-opus-5-5-max.yaml +5 -0
- package/presets/fleet/brains/claude-opus-5-5-medium.yaml +5 -0
- package/presets/fleet/brains/claude-opus-5-5-xhigh.yaml +5 -0
- package/presets/fleet/brains/claude-opus-5-high.yaml +1 -1
- package/presets/fleet/brains/claude-opus-5-low.yaml +1 -1
- package/presets/fleet/brains/claude-opus-5-max.yaml +1 -1
- package/presets/fleet/brains/claude-opus-5-medium.yaml +1 -1
- package/presets/fleet/brains/claude-opus-5-xhigh.yaml +1 -1
- package/presets/fleet/brains/claude-sonnet-5-high.yaml +1 -1
- package/presets/fleet/brains/claude-sonnet-5-low.yaml +1 -1
- package/presets/fleet/brains/claude-sonnet-5-max.yaml +1 -1
- package/presets/fleet/brains/claude-sonnet-5-medium.yaml +1 -1
- package/presets/fleet/brains/claude-sonnet-5-xhigh.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-3-codex-spark-high.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-3-codex-spark-low.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-3-codex-spark-medium.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-3-codex-spark-xhigh.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-4-high.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-4-low.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-4-medium.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-4-mini-high.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-4-mini-low.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-4-mini-medium.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-4-mini-xhigh.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-4-xhigh.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-5-high.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-5-low.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-5-medium.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-5-xhigh.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-6-luna-high.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-6-luna-low.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-6-luna-max.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-6-luna-medium.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-6-luna-xhigh.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-6-sol-high.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-6-sol-low.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-6-sol-max.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-6-sol-medium.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-6-sol-ultra.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-6-sol-xhigh.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-6-terra-high.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-6-terra-low.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-6-terra-max.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-6-terra-medium.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-6-terra-ultra.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-5-6-terra-xhigh.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-6-1-sol-high.yaml +5 -0
- package/presets/fleet/brains/codex-gpt-6-1-sol-low.yaml +5 -0
- package/presets/fleet/brains/codex-gpt-6-1-sol-max.yaml +5 -0
- package/presets/fleet/brains/codex-gpt-6-1-sol-medium.yaml +5 -0
- package/presets/fleet/brains/codex-gpt-6-1-sol-ultra.yaml +5 -0
- package/presets/fleet/brains/codex-gpt-6-1-sol-xhigh.yaml +5 -0
- package/presets/fleet/brains/codex-gpt-6-astra-high.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-6-astra-low.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-6-astra-max.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-6-astra-medium.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-6-astra-ultra.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-6-astra-xhigh.yaml +1 -1
- package/presets/fleet/brains/codex-gpt-6-luna-high.yaml +5 -0
- package/presets/fleet/brains/codex-gpt-6-luna-low.yaml +5 -0
- package/presets/fleet/brains/codex-gpt-6-luna-max.yaml +5 -0
- package/presets/fleet/brains/codex-gpt-6-luna-medium.yaml +5 -0
- package/presets/fleet/brains/codex-gpt-6-luna-xhigh.yaml +5 -0
- package/presets/fleet/brains/codex-gpt-6-sol-high.yaml +5 -0
- package/presets/fleet/brains/codex-gpt-6-sol-low.yaml +5 -0
- package/presets/fleet/brains/codex-gpt-6-sol-max.yaml +5 -0
- package/presets/fleet/brains/codex-gpt-6-sol-medium.yaml +5 -0
- package/presets/fleet/brains/codex-gpt-6-sol-ultra.yaml +5 -0
- package/presets/fleet/brains/codex-gpt-6-sol-xhigh.yaml +5 -0
- package/presets/fleet/roles/Coordinator.yaml +21 -13
- package/presets/fleet/roles/Critic.yaml +24 -0
- package/presets/fleet/roles/Developer.yaml +32 -0
- package/presets/fleet/roles/Engineer.yaml +72 -0
- package/presets/fleet/roles/LocalCoordinator.yaml +17 -0
- package/presets/fleet/room_layouts/engineering.yaml +25 -0
- package/presets/fleet/room_layouts/pair.yaml +24 -0
- package/presets/fleet/room_layouts/single.yaml +17 -0
- package/presets/fleet/room_layouts/team.yaml +30 -0
- package/presets/fleet/room_templates/engineering.yaml +19 -0
- package/presets/manifest.json +2 -2
- package/dist/web-app/assets/index-59GF-gsZ.css +0 -1
- package/dist/web-app/assets/index-C0h3ALvs.js +0 -10
- package/dist/web-app/icons/ours-fleet-maskable.svg +0 -4
- package/dist/web-app/icons/ours-fleet.svg +0 -4
- package/dist/web-app/index.html +0 -17
- package/dist/web-app/manifest.webmanifest +0 -15
- package/dist/web-app/offline.html +0 -18
- package/dist/web-app/sw.js +0 -51
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
# Task workspaces and artifact retention
|
|
2
|
+
|
|
3
|
+
New Tasks allocate a private workspace at
|
|
4
|
+
`$OURS_FLEET_HOME/.ours-fleet/workspaces/tasks/<task-id>` (the user's home is the
|
|
5
|
+
default for `OURS_FLEET_HOME`). New standalone Rooms use
|
|
6
|
+
`.ours-fleet/workspaces/rooms/<room-id>`. A linked Room shares its Task's workspace.
|
|
7
|
+
The absolute path, owner kind/ID and random ownership token are stored in the
|
|
8
|
+
record before directory allocation; `.fleet-workspace.json` proves ownership.
|
|
9
|
+
The path is visible in Task/Room JSON from both CLI and API. A folder of the same
|
|
10
|
+
name without the matching marker is never adopted.
|
|
11
|
+
|
|
12
|
+
Every newly managed member starts at that exact workspace, including retries.
|
|
13
|
+
An explicit template/member `cwd` remains in the sealed input execution plan as
|
|
14
|
+
source context, but the owned workspace overrides the effective launch cwd.
|
|
15
|
+
Copy or clone required source into the workspace; Fleet does not move or delete
|
|
16
|
+
the configured source directory. Briefings explain this rule. Use separate
|
|
17
|
+
per-agent branches/directories inside the workspace for concurrent edits.
|
|
18
|
+
|
|
19
|
+
All execution artifacts, dependency checkouts and worktrees belong inside the
|
|
20
|
+
workspace. Clone each repository there first, then use `git worktree add` with
|
|
21
|
+
destinations inside the same workspace. Git's native worktree registry is the
|
|
22
|
+
registry of record. Fleet audits `.git`, `commondir` and reverse `gitdir` links
|
|
23
|
+
before deletion; both the common repository and all registered worktrees must
|
|
24
|
+
be inside the workspace. An external repository's worktree inside the workspace,
|
|
25
|
+
or an internal repository's worktree outside it, blocks deletion. No broad
|
|
26
|
+
`git worktree prune`, branch deletion, reset or modification of unrelated Git
|
|
27
|
+
metadata is performed. Removing the owned repositories also removes their
|
|
28
|
+
complete internal worktree registries, including dirty and stale owned entries.
|
|
29
|
+
|
|
30
|
+
| Operation | Workspace and execution artifacts | Member runtime evidence |
|
|
31
|
+
| --- | --- | --- |
|
|
32
|
+
| Complete, fail, cancel | Retained while Task is recorded | Retained in Fleet recovery archives |
|
|
33
|
+
| Linked Room retirement or deletion | Task workspace retained | Retained |
|
|
34
|
+
| Internal standalone Room retirement | Room workspace retained | Retained |
|
|
35
|
+
| Explicit Task deletion | Removed after member retirement, with the task's retained To review files | All proven owned retired launches removed |
|
|
36
|
+
| Explicit standalone Room deletion | Removed after member retirement | All proven owned retired launches removed |
|
|
37
|
+
|
|
38
|
+
Internal room close means retirement, not destructive Task deletion.
|
|
39
|
+
The existing CLI `room close ID ID` remains a deprecated alias for explicit
|
|
40
|
+
`room delete ID ID`: it deletes standalone room-owned artifacts, but always
|
|
41
|
+
retains a linked Task workspace. Its repeated-ID confirmation is unchanged. To remove a Task's
|
|
42
|
+
artifacts, explicitly delete the Task. Cancellation is not deletion. Automatic
|
|
43
|
+
compatibility cleanup of legacy closed Rooms skips records with owned workspaces.
|
|
44
|
+
These choices reconcile close/remove wording with the requirement that completed,
|
|
45
|
+
recorded Tasks retain all artifacts.
|
|
46
|
+
|
|
47
|
+
Fleet's active member state (briefings, logs, session state and WORKLOG) remains
|
|
48
|
+
under `.ours-fleet/tmp` while supervisors run, then in
|
|
49
|
+
`.ours-fleet/recovery/temporary`. The launch stores the workspace descriptor.
|
|
50
|
+
Explicit deletion first proves managed agents retired, then identifies all
|
|
51
|
+
matching archived launches, including failed and replaced attempts, using the
|
|
52
|
+
workspace descriptor plus role and termination/launch evidence. It preflights
|
|
53
|
+
these archives and atomically transfers them to `.fleet-retired-agents` in the
|
|
54
|
+
workspace before removal. Unrelated archives are not adopted by a name prefix.
|
|
55
|
+
Explicit deletion also erases legacy archives with exact launch/action or room
|
|
56
|
+
provenance, matching private supervisor journals and admission/launch descriptors,
|
|
57
|
+
and the exact retired-launch rows in the global termination journal. It never
|
|
58
|
+
infers ownership from an Agent's shared `cwd`. Artifact removal uses a durable
|
|
59
|
+
manifest, ownership fingerprints and per-entry rename/removal checkpoints, so
|
|
60
|
+
an interrupted deletion can resume without deleting a replacement at the old path.
|
|
61
|
+
Task deletion acceptance receipts exist only during cleanup and are erased after
|
|
62
|
+
settlement (including retry after a crash between Task unlink and receipt cleanup).
|
|
63
|
+
Shared Fleet command audit and lifecycle delivery ledgers have exactly attributed
|
|
64
|
+
target labels, configuration and command arguments removed; unrelated entries are
|
|
65
|
+
preserved. Delivery/deduplication metadata and a content-free erased-resource ID
|
|
66
|
+
registry remain so a running writer cannot resurrect erased content. Infrastructure
|
|
67
|
+
logs without structured ownership, backups, and copies already delivered to other
|
|
68
|
+
identities are external retention boundaries; this is not a claim to erase every
|
|
69
|
+
external copy.
|
|
70
|
+
|
|
71
|
+
Provisioning serializes Task operation then Room close locks, including bounded
|
|
72
|
+
seat waits, so concurrent retries cannot publish competing members and deletion
|
|
73
|
+
cannot race a member launch. Local published Rooms are reused if the Task link
|
|
74
|
+
write was interrupted. Workspace allocation publishes a marked staging directory;
|
|
75
|
+
restart reuses the durable token. Deletion renames the validated workspace to a
|
|
76
|
+
token-specific sibling tombstone before removal. A crash during removal resumes
|
|
77
|
+
that exact tombstone; the Task record is unlinked last. Before collecting archives,
|
|
78
|
+
Task deletion durably checkpoints verified retirement evidence. Retries verify
|
|
79
|
+
any remaining original archive and still refuse replacement live member state
|
|
80
|
+
or a recreated identity even after the archive has been consumed. Failed deletion
|
|
81
|
+
remains retryable with its recorded error.
|
|
82
|
+
|
|
83
|
+
Explicit deletion restores missing owner read/write/traversal bits on real
|
|
84
|
+
directories inside a proven owned workspace or retired archive before the Git
|
|
85
|
+
audit and removal. This handles restrictive artifacts left by tests even when
|
|
86
|
+
they belong to the same Unix user. It adds no group/other access, follows no
|
|
87
|
+
artifact symlinks, crosses no mounted device boundary, and never changes the
|
|
88
|
+
owner. Only Git pointer files that the audit must read may gain owner-read;
|
|
89
|
+
hardlinked unreadable pointers are refused to avoid changing an outside alias.
|
|
90
|
+
Permission changes target a verified open inode. Readable foreign-UID directories
|
|
91
|
+
may be traversed unchanged; missing owner access is never repaired for another
|
|
92
|
+
UID. On Linux, traversal and Git pointer reads use pinned directory/file
|
|
93
|
+
descriptors, and a detected pathname replacement stops cleanup before descending.
|
|
94
|
+
Unreadable entries
|
|
95
|
+
use an `O_PATH` descriptor through `/proc/self/fd`; other platforms retain the
|
|
96
|
+
error if they cannot open the entry safely. A restricted workspace root is
|
|
97
|
+
temporarily accessible to verify its exact ownership marker; failed marker
|
|
98
|
+
verification restores its original mode. Partial token-derived deletion
|
|
99
|
+
tombstones resume directory cleanup without re-reading already-removed Git
|
|
100
|
+
metadata. List, show, and ordinary Git audit do not repair permissions.
|
|
101
|
+
|
|
102
|
+
An accepted deletion is hidden from ordinary task lists while cleanup settles.
|
|
103
|
+
Use `ours-fleet task list --include-deleting --json` (or the API's
|
|
104
|
+
`includeDeleting=true`) to include retained cleanup intents, and `task show ID`
|
|
105
|
+
to see pending/error/retry information. Disappearance from the ordinary list is
|
|
106
|
+
not proof of completed deletion; successful deletion removes the task record
|
|
107
|
+
after workspace and member cleanup.
|
|
108
|
+
Cowork HTTP transport failures record the RPC method, failing stage and a
|
|
109
|
+
bounded error category in the cleanup intent. Credential rejection remains an
|
|
110
|
+
explicit `unauthorized` protocol error. Transport diagnostics do not include
|
|
111
|
+
request bodies, credentials, URLs or raw exception text, and failed mutations
|
|
112
|
+
are never automatically replayed.
|
|
113
|
+
|
|
114
|
+
Deletion rejects traversal, foreign recorded paths, changed markers and symlinked
|
|
115
|
+
workspace ancestors. Ordinary artifact symlinks are unlinked without following
|
|
116
|
+
their targets. Git control symlinks and foreign pointers are refused. As with
|
|
117
|
+
Fleet's other filesystem lifecycle operations, a hostile same-UID process that
|
|
118
|
+
mutates paths during validation requires OS isolation; application checks are
|
|
119
|
+
not a security boundary against that process. Fleet enforces launch cwd and
|
|
120
|
+
safe deletion; unrestricted agents can still write outside cwd, so the artifact
|
|
121
|
+
placement rule also requires agent compliance and/or filesystem isolation.
|
|
122
|
+
|
|
123
|
+
## Compatibility and limits
|
|
124
|
+
|
|
125
|
+
Records from before this feature without `workspace` remain unmanaged. Existing
|
|
126
|
+
agents retain their cwd and exact briefing/fingerprint so restart matching works.
|
|
127
|
+
Fleet never claims an old cwd, an outcome artifact path, or a legacy recovery
|
|
128
|
+
archive as owned merely because it was mentioned by a Task. Create a new managed
|
|
129
|
+
Task and explicitly copy desired artifacts to migrate; deleting a legacy Task
|
|
130
|
+
continues its previous lifecycle and does not delete arbitrary old files.
|
|
131
|
+
|
|
132
|
+
Changing `OURS_FLEET_HOME` does not silently rebase recorded absolute ownership
|
|
133
|
+
paths. Restore the original state root or explicitly migrate records and files
|
|
134
|
+
with the supervisors stopped; mismatched paths fail closed. Archive transfer
|
|
135
|
+
uses same-filesystem rename and reports a recoverable failure across mounts.
|
|
136
|
+
|
|
137
|
+
Cowork's remote create operation has no idempotency key in this interface. A crash
|
|
138
|
+
after remote creation but before local Room publication is an existing uncertain
|
|
139
|
+
remote result; this change deduplicates locally recorded rooms and does not claim
|
|
140
|
+
to solve that remote transaction window. Inspect remote room ownership before
|
|
141
|
+
retrying ambiguous remote creation. No services or installed Fleet code are
|
|
142
|
+
changed by building or testing this feature.
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
## Broken provisioning and deletion recovery
|
|
146
|
+
|
|
147
|
+
Deletion accepts every lifecycle state. Missing temporary directories, identities,
|
|
148
|
+
remote rooms and already-erased artifacts are settled outcomes. Retry the same
|
|
149
|
+
explicit delete after an interruption. A missing local member CID is recovered
|
|
150
|
+
only from a matching authenticated seat in the pinned room (exact invite and
|
|
151
|
+
role, uniquely matched), or a supervisor journal tied to the selected daemon,
|
|
152
|
+
temporary instance and recorded creation action. These sources must agree.
|
|
153
|
+
The recovered CID is persisted before retirement consumes the evidence.
|
|
154
|
+
|
|
155
|
+
A contradictory CID, replacement launch, ambiguous seat, unreadable/corrupt
|
|
156
|
+
record, or unreachable authority is not evidence of absence. Cleanup retains its
|
|
157
|
+
cursor and reports the conflict instead of deleting an unrelated resource or
|
|
158
|
+
claiming complete erasure. An identity with no recoverable authenticated binding
|
|
159
|
+
requires restoring its actual ownership evidence; a name-only force removal is
|
|
160
|
+
not supported. Room deletion removes the linked Task's dead room/member links and preserves its workspace; use explicit
|
|
161
|
+
Task deletion when the request includes the associated Task and its artifacts.
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
## Retained task agents
|
|
165
|
+
|
|
166
|
+
Task agents use the common Fleet service and existing runners while remaining
|
|
167
|
+
outside the standalone agent roster. Recovery retains their original identity,
|
|
168
|
+
private runtime owner, launch, working directory, admitted room and supported
|
|
169
|
+
backend conversation. `ours-fleet task recover-members TASK_ID` resumes proven
|
|
170
|
+
stopped members or resets their held restart circuit; it never creates identities
|
|
171
|
+
or invitations. See [upgrade and rollback](fleet-migration.md) for legacy tasks.
|
|
172
|
+
|
|
173
|
+
Recovery delivers an undispatched assignment once, continues interrupted work,
|
|
174
|
+
and sends no readiness/work prompt to a completed idle conversation. An uncertain
|
|
175
|
+
dispatch gets a continuation instead of replaying the assignment. First-session
|
|
176
|
+
retry requires proof that no readiness/work was submitted; established session
|
|
177
|
+
loss requires restoration of the original context. Task agents require a resumable
|
|
178
|
+
harness. Missing ownership, workspace or room evidence keeps recovery held.
|
|
179
|
+
|
|
180
|
+
Parent shutdown suspends task agents. Explicit member stop terminally releases
|
|
181
|
+
the exact saved owner and archives its launch; it does not complete the task.
|
|
182
|
+
Finish/cancel/review retain their existing semantics. Task deletion stops and
|
|
183
|
+
unregisters only owned members, verifies identity absence and retries cleanup
|
|
184
|
+
before erasing task/room/workspace resources. Permanent siblings remain intact.
|
|
185
|
+
Standalone CLI/web removal refuses `TASK_MEMBER_IS_TASK_OWNED`; use the owning
|
|
186
|
+
task lifecycle. Lost/corrupt task or launch records require restoring original
|
|
187
|
+
backup evidence or explicit ownership reconciliation before deletion can finish.
|
|
188
|
+
|
|
189
|
+
## Owner lifecycle notifications
|
|
190
|
+
|
|
191
|
+
A task mutation commits its notification event in the same atomic task record as
|
|
192
|
+
its effective status. Creation, backlog, provisioning, active, review, done,
|
|
193
|
+
cancelled and failed are covered; block/unblock and deletion are effective changes
|
|
194
|
+
as well. Editing a description, list, block reason or saga checkpoint is not a
|
|
195
|
+
status transition. Each event freezes the task identity, title, old/new status and
|
|
196
|
+
navigation route at commit time, so several transitions between delivery polls
|
|
197
|
+
remain separate. Legacy records begin emitting on their next actual change and
|
|
198
|
+
are not retroactively announced as newly created.
|
|
199
|
+
|
|
200
|
+
The Fleet manager drains committed task events without requiring the web console
|
|
201
|
+
or restarting agents. Its notification producer uses the installation's existing
|
|
202
|
+
owner-scoped credential; it grants no agent arbitrary-send capability. Missing
|
|
203
|
+
configuration or service failure retains the events. Delivery acknowledgement
|
|
204
|
+
runs under the task lock and removes only the accepted event, preserving newer
|
|
205
|
+
changes. A corrupt/unreadable task record is isolated with a safe warning, so
|
|
206
|
+
other tasks continue. Bounded rotating batches prevent one rejected task from
|
|
207
|
+
blocking the entire sender. The built-in `default` task list is unchanged.
|
|
208
|
+
|
|
209
|
+
Deleting is announced only after its intent commits. Before unlink, settlement
|
|
210
|
+
prepares retained pending events plus a stable deleted event outside the task-owned
|
|
211
|
+
workspace. The sender admits that retained copy only when the original task record
|
|
212
|
+
is absent; an interrupted or failed unlink cannot announce deletion. The final
|
|
213
|
+
event opens the task list and includes the removed task's identity. Earlier events
|
|
214
|
+
keep their immutable detail routes, which may be absent after explicit deletion.
|
|
215
|
+
|
|
216
|
+
A service restart or producer crash after acceptance may replay an event; the
|
|
217
|
+
Notifications service must retain its acceptance receipts across read/delete to
|
|
218
|
+
make that replay harmless. Upgrade Notifications alongside Fleet to obtain this
|
|
219
|
+
stronger guarantee. The service's authenticated delivery diagnostics distinguish
|
|
220
|
+
provider acceptance, retry, expired subscription and foreground suppression.
|
|
221
|
+
Provider acceptance is not evidence of actual phone receipt. iPhone Web Push
|
|
222
|
+
requires a supported Home Screen installation and granted device/browser permission;
|
|
223
|
+
reopen the workspace to reconcile an expired subscription and explicitly re-enable
|
|
224
|
+
permission if it was revoked. Every received push must display a notification to
|
|
225
|
+
honor Safari's user-visible push requirement.
|
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
# Managed Fleet CLI from Codex and Claude Code workspace sandboxes
|
|
2
|
+
|
|
3
|
+
> **Use the generated setup.** Since `managed-cli.setup-v1`, Fleet prepares the
|
|
4
|
+
> native policy for the packaged task workflow itself. The hand-written rules
|
|
5
|
+
> further down remain as background and for operations outside that workflow
|
|
6
|
+
> (for example `room delete`).
|
|
7
|
+
|
|
8
|
+
## Fleet-generated setup (issue #233)
|
|
9
|
+
|
|
10
|
+
Declare the workflow on the Agent, or let Fleet add the one key for you:
|
|
11
|
+
|
|
12
|
+
```sh
|
|
13
|
+
ours-fleet managed-cli setup --enable FleetCoordinator # adds managed_cli: [task-workflow]
|
|
14
|
+
ours-fleet managed-cli setup # generate / reconcile, starts nothing
|
|
15
|
+
ours-fleet managed-cli status # compare only, exit 1 when not current
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
The declaration is explicit configuration. It is never inferred from a role or
|
|
19
|
+
display name, and `--enable` changes no permission. The same preparation runs at
|
|
20
|
+
every agent start (`up`, `restart`, `spawn`, task-room agents), so newly created
|
|
21
|
+
agents need no separate step. `ours-install` runs `managed-cli setup` from the
|
|
22
|
+
exact Fleet it installed after `init` and on update.
|
|
23
|
+
|
|
24
|
+
An agent invokes a prepared command through the pinned entry form printed in its
|
|
25
|
+
briefing:
|
|
26
|
+
|
|
27
|
+
```sh
|
|
28
|
+
/abs/node /abs/fleet/dist/cli.js --managed-configuration /abs/fleet.yaml task create --title "..." --backlog --no-room
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### What is prepared
|
|
32
|
+
|
|
33
|
+
| Prepared (runs outside the command sandbox) | Not prepared (stays sandboxed) |
|
|
34
|
+
| --- | --- |
|
|
35
|
+
| `task create`, `task start`, `task finish`, `task block`, `task unblock`, `task review`, `task list`, `task show` | `task cancel`, `task delete` |
|
|
36
|
+
| `room show`, `room members` | `room create`, `room delete`, `room close` |
|
|
37
|
+
| `template list`, `template show`, `template validate`, `config`, `docs` | `spawn`, `ours tools`, `ours call`, `status`, `peek`, `send` |
|
|
38
|
+
| `--help`, `task --help`, `room --help`, `template --help` | service administration, identity and contact commands, oversight |
|
|
39
|
+
|
|
40
|
+
`task start` and `task finish` provision and retire rooms and agents. That is
|
|
41
|
+
real authority, and it is disclosed by `setup`, `status` and the installer.
|
|
42
|
+
|
|
43
|
+
### Actual invocation boundary
|
|
44
|
+
|
|
45
|
+
- The native rule fixes four things: the Node executable, this Fleet CLI, the
|
|
46
|
+
pinned configuration and the command words. It is an argv **prefix** and admits
|
|
47
|
+
every trailing option and argument. It is not argument validation, target
|
|
48
|
+
authorization or per-agent isolation.
|
|
49
|
+
- A later `-c`/`--configuration` naming another file is refused by the Fleet CLI
|
|
50
|
+
after the process has already started outside the sandbox and been audited.
|
|
51
|
+
That is Fleet runtime validation, not a native policy denial.
|
|
52
|
+
- The pinned form requires a managed session. Outside one, where no supervisor
|
|
53
|
+
would audit it, the CLI refuses it. Commands outside the inventory are refused
|
|
54
|
+
by the CLI even if a hand-written rule would admit them.
|
|
55
|
+
- The supervisor audit, CLI validation, confirmations, SDK credential checks and
|
|
56
|
+
any outer container or host sandbox are unchanged. There is no blanket
|
|
57
|
+
Node/Bash/Fleet grant, no sandbox is disabled, and no new transport exists.
|
|
58
|
+
- Compound (`&&`, `;`), piped, redirected, `$(...)`, backslash-escaped and
|
|
59
|
+
`VAR=value`-prefixed command lines do not match and stay sandboxed.
|
|
60
|
+
|
|
61
|
+
### Quoting, measured natively
|
|
62
|
+
|
|
63
|
+
Measured with real Codex 0.160.0 and Claude Code 2.1.289 on Linux:
|
|
64
|
+
|
|
65
|
+
| Spelling | Codex | Claude |
|
|
66
|
+
| --- | --- | --- |
|
|
67
|
+
| Single-quoted CLI / configuration path or option value containing spaces | matches | matches |
|
|
68
|
+
| Double-quoted later token | matches | does not match |
|
|
69
|
+
| Quoted **executable** token | never matches | never matches |
|
|
70
|
+
| Unquoted symlinked executable | matches | matches |
|
|
71
|
+
|
|
72
|
+
Fleet therefore spells a CLI or configuration path containing spaces in single
|
|
73
|
+
quotes (Codex >= 0.160.0 required; older or unreadable versions are reported as
|
|
74
|
+
unsupported for such paths), and requires the Node executable at a path needing
|
|
75
|
+
no quoting. A path containing anything but letters, digits, spaces and
|
|
76
|
+
`_@%+=:,./-` (so no quotes, backslashes, `*` or other pattern characters, which
|
|
77
|
+
Claude's entries would not treat literally), or one that is or resolves
|
|
78
|
+
inside the agent's workspace, is reported as unsupported rather than widened.
|
|
79
|
+
|
|
80
|
+
### What is written, and ownership
|
|
81
|
+
|
|
82
|
+
- **Codex**: `<workspace>/.codex/rules/ours-fleet-<id>.rules`, one file per Fleet
|
|
83
|
+
configuration, carrying a Fleet marker header. It applies to every trusted
|
|
84
|
+
Codex session in that workspace, not to one identity, and Codex must already
|
|
85
|
+
trust the workspace: Fleet reports missing trust and never changes it. A file
|
|
86
|
+
shared by several agents is held in `~/.ours-fleet/managed-cli/registry.json`
|
|
87
|
+
and removed only when its last holder is gone. Files without the Fleet marker,
|
|
88
|
+
including a hand-written `ours-fleet.rules`, are never modified; one occupying
|
|
89
|
+
the generated name is reported as a conflict.
|
|
90
|
+
- **Claude**: `permissions.allow` and `sandbox.excludedCommands` entries in the
|
|
91
|
+
agent's own Fleet settings overlay, delivered to the bundled ACP adapter. The
|
|
92
|
+
operator's Claude settings are not modified. Fleet never sets
|
|
93
|
+
`sandbox.enabled`; if no readable settings file enables the OS sandbox, or a
|
|
94
|
+
`deny` rule would override the entries, `status` and `doctor` say so.
|
|
95
|
+
- Setup is idempotent. Changed Node/CLI/configuration paths rewrite the Fleet
|
|
96
|
+
entries; entries for agents or configurations that no longer exist are removed
|
|
97
|
+
and listed.
|
|
98
|
+
|
|
99
|
+
### Diagnostics
|
|
100
|
+
|
|
101
|
+
`ours-fleet doctor` and `managed-cli status` report three separate facts:
|
|
102
|
+
|
|
103
|
+
| Row | Source | Meaning |
|
|
104
|
+
| --- | --- | --- |
|
|
105
|
+
| setup | generated files compared with this installation | static configuration only |
|
|
106
|
+
| session | the role's launch record | whether the last start loaded the current policy, or a restart is required |
|
|
107
|
+
| observed | the supervisor audit ledger | which pinned forms actually completed since that start |
|
|
108
|
+
|
|
109
|
+
A prepared setup is not evidence of supervisor access. An observed `--help`
|
|
110
|
+
proves only its own audited path; lifecycle forms that were never observed are
|
|
111
|
+
listed as such. `task create --help` is reported as `task create --help`, a help
|
|
112
|
+
call, not as `task create`. Rows from before the current launch are reported as
|
|
113
|
+
historical. The ledger stores the pinned configuration as a fingerprint, never
|
|
114
|
+
as its path; a row pinned to another configuration, or to none that can be told,
|
|
115
|
+
is counted separately and is not evidence for this policy. Rows whose content
|
|
116
|
+
was erased with their task or room keep what they prove.
|
|
117
|
+
|
|
118
|
+
A launch also gives up what the role held before: opting out, losing support or
|
|
119
|
+
moving to another workspace or configuration removes that role's Codex rules at
|
|
120
|
+
the next start, without touching a file another agent still holds.
|
|
121
|
+
|
|
122
|
+
### Unsupported combinations
|
|
123
|
+
|
|
124
|
+
Reported, with the reason, and left exactly as sandboxed as before: Windows and
|
|
125
|
+
other platforms; Hermes and other harnesses; custom ACP or app-server session
|
|
126
|
+
commands; roles declaring `isolation:`; unspellable paths; a Node path needing
|
|
127
|
+
quotes; Codex older than 0.160.0 with quoted paths; and any pinned file the
|
|
128
|
+
agent could replace — inside its workspace or a `harness_options.add_dirs`
|
|
129
|
+
directory, lexically or through a symlink. Codex roles with
|
|
130
|
+
`harness_options.profile` or uninspected `harness_options.config` remain unsupported:
|
|
131
|
+
those can change the native sandbox (for example extra writable roots) in ways
|
|
132
|
+
Fleet does not inspect. The only accepted nonempty config is
|
|
133
|
+
`model_reasoning_effort` with a supported value (`low`, `medium`, `high`, `xhigh`,
|
|
134
|
+
`max`, `ultra`). This includes the config generated by Codex Brain `effort` (#235).
|
|
135
|
+
The chosen effort remains in native launch config and ACP reasoning selection;
|
|
136
|
+
adding any unknown or security-bearing config key still prevents policy setup.
|
|
137
|
+
Native user settings Fleet cannot read are outside this check.
|
|
138
|
+
|
|
139
|
+
### Qualification
|
|
140
|
+
|
|
141
|
+
`test/managed-cli-workflow.integration.mjs` runs real Codex / Claude Code through
|
|
142
|
+
Fleet's own adapters and launch preparation against a real supervisor control
|
|
143
|
+
server and audit ledger. A scripted local provider only requests commands; no
|
|
144
|
+
external model, account, production identity or room is used.
|
|
145
|
+
|
|
146
|
+
```sh
|
|
147
|
+
FLEET_TEST_HARNESS=codex FLEET_CODEX_BIN=/absolute/codex FLEET_TEST_SESSION=codex-app-server \
|
|
148
|
+
FLEET_TEST_TMP_PREFIX=/absolute/private-test-parent/fleet-mc- \
|
|
149
|
+
node test/managed-cli-workflow.integration.mjs
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Use `FLEET_TEST_SESSION=acp` for bundled Codex ACP, and
|
|
153
|
+
`FLEET_TEST_HARNESS=claude FLEET_CLAUDE_BIN=/absolute/claude` for bundled Claude
|
|
154
|
+
ACP. `FLEET_TEST_QUOTED=1` installs the CLI and configuration under paths
|
|
155
|
+
containing spaces. `FLEET_TEST_CLAUDE_SANDBOX=0` checks the diagnostics when the
|
|
156
|
+
operator has not enabled Claude's sandbox. `FLEET_TEST_NESTED_SANDBOX=1` is for
|
|
157
|
+
unprivileged containers only. `FLEET_TEST_EVIDENCE=/file.json` records every
|
|
158
|
+
command, exit code and output.
|
|
159
|
+
|
|
160
|
+
Each run checks: unpinned `--help` denied at the socket; an unrelated write
|
|
161
|
+
outside the workspace still denied by the OS; pinned help; `task create` with
|
|
162
|
+
quoted variable options, `task list|show|block|unblock`, template and plan
|
|
163
|
+
inspection completing with audit rows; `task review|start|finish` and
|
|
164
|
+
`room show|members` reaching the supervisor and Fleet validation (their
|
|
165
|
+
successful run is the lifecycle fixture below); `template show|validate` and
|
|
166
|
+
`docs`; a late
|
|
167
|
+
`--configuration` refused by Fleet; unprepared commands, a missing or different
|
|
168
|
+
pin, preload injection, chaining and redirection staying sandboxed; and `status`
|
|
169
|
+
listing exactly the forms the audit ledger observed.
|
|
170
|
+
|
|
171
|
+
`test/managed-cli-lifecycle.integration.mjs` is the full stack: the real role
|
|
172
|
+
runner (`ours-fleet _run`) launches the Coordinator, with a real local ours
|
|
173
|
+
daemon and Cowork service (`FLEET_COWORK_CLI=/abs/cowork/dist/cli.js`). From
|
|
174
|
+
inside the command sandbox the Coordinator's session creates a task, starts it —
|
|
175
|
+
a Cowork room is provisioned and a room member agent is really spawned through
|
|
176
|
+
the supervisor — runs `task show`, `room show`, `room members`, `task block`,
|
|
177
|
+
`task unblock`, `task review` and `task finish`, which retires the member and
|
|
178
|
+
the room. Every command is typed in the pinned form and must have a successful
|
|
179
|
+
audit row; the task must end `done`. `FLEET_TEST_HARNESS=claude` puts the
|
|
180
|
+
Coordinator on bundled Claude ACP with its OS sandbox enabled (the member stays
|
|
181
|
+
on Codex). Only the model provider is scripted; the daemon runs without a broker.
|
|
182
|
+
|
|
183
|
+
Two outcomes of that run are Fleet's existing lifecycle behaviour, not policy,
|
|
184
|
+
and are recorded rather than hidden: the first `task start` can answer
|
|
185
|
+
"readiness is unknown" while the member's session is still starting, and the
|
|
186
|
+
first `task finish` can report that the member's live state disappeared while it
|
|
187
|
+
is still stopping. In both cases the task is already durably in the right state
|
|
188
|
+
and re-running the same command, as its message says, succeeds.
|
|
189
|
+
|
|
190
|
+
Linux x86_64 host (kernel 7.0, Node 22.23.1, Codex 0.160.0, Claude Code 2.1.289):
|
|
191
|
+
|
|
192
|
+
| Harness / session | Plain paths | Paths with spaces |
|
|
193
|
+
| --- | --- | --- |
|
|
194
|
+
| Codex native app-server | PASS | PASS |
|
|
195
|
+
| Bundled Codex ACP | PASS | PASS |
|
|
196
|
+
| Bundled Claude ACP, OS sandbox enabled | PASS | PASS |
|
|
197
|
+
| Bundled Claude ACP, OS sandbox not enabled (diagnostic) | PASS | not run |
|
|
198
|
+
|
|
199
|
+
| Full-stack lifecycle (real runner, room, spawned member) | Result |
|
|
200
|
+
| --- | --- |
|
|
201
|
+
| Codex native app-server Coordinator, Codex native member | PASS |
|
|
202
|
+
| Bundled Codex ACP Coordinator, Codex ACP member | PASS |
|
|
203
|
+
| Bundled Claude ACP Coordinator (OS sandbox enabled), Codex native member | PASS |
|
|
204
|
+
|
|
205
|
+
Across repeated runs the re-runs described above occurred zero or one time per
|
|
206
|
+
command; each run prints how many. The spawned member's Agent Template declares
|
|
207
|
+
`managed_cli` itself, and the run asserts what that member's own launch
|
|
208
|
+
prepared: a Codex native member gets its own record, rules in its own workspace
|
|
209
|
+
and a temporary holder; a Codex ACP member with `approval: allow` has no command
|
|
210
|
+
sandbox, so its launch records `not-required` and generates nothing. After
|
|
211
|
+
`task finish` the run asserts that the member's live state, Fleet's room record
|
|
212
|
+
and the Cowork room are gone, and that the member's rules were removed.
|
|
213
|
+
|
|
214
|
+
Not qualified, and not claimed:
|
|
215
|
+
|
|
216
|
+
- **macOS.** The generated setup has not been run there. `managed-cli status`
|
|
217
|
+
discloses this on macOS. The mechanisms are the ones the hand-written policy
|
|
218
|
+
below used on macOS, but that is not a run of this matrix.
|
|
219
|
+
- **Service-managed supervisors and a real model.** The lifecycle run starts
|
|
220
|
+
the runner directly (`OURS_FLEET_SUPERVISOR=none`), not through systemd or
|
|
221
|
+
launchd, uses a scripted provider, attaches no owner to the room and has no
|
|
222
|
+
broker. The spawned member only starts and stops; it does no work.
|
|
223
|
+
- Paths with spaces in the full-stack lifecycle run (covered by the matrix
|
|
224
|
+
above), Claude standalone, Hermes, Windows and isolated roles.
|
|
225
|
+
|
|
226
|
+
A managed Fleet CLI invocation sends `fleet_audit_begin` to the supervisor's Unix
|
|
227
|
+
socket before parsing commands, including `--help`. A socket that exists and is
|
|
228
|
+
owned by the current user can still return `connect EPERM` from a restricted
|
|
229
|
+
command sandbox. This is not evidence that the supervisor is down or Fleet needs
|
|
230
|
+
reinstallation. Check filesystem permissions too: `EACCES`/`EPERM` alone does not
|
|
231
|
+
identify which policy denied access.
|
|
232
|
+
|
|
233
|
+
## Background: hand-written native execution rules
|
|
234
|
+
|
|
235
|
+
Keep the role's `approval: auto`, `filesystem: workspace`, and `unattended: deny`.
|
|
236
|
+
For an operator authorized to manage rooms, explicitly approve the necessary CLI
|
|
237
|
+
operations using Codex's standard execution rules. A matching operation executes
|
|
238
|
+
outside Codex's command sandbox, retaining the normal CLI, supervisor audit,
|
|
239
|
+
configuration, credentials, and confirmation checks. Other shell commands remain
|
|
240
|
+
sandboxed. This does not override an outer container or host sandbox.
|
|
241
|
+
|
|
242
|
+
In the **trusted workspace** create `.codex/rules/ours-fleet.rules`, substituting
|
|
243
|
+
absolute paths to the installed Node binary, installed Fleet CLI, and approved
|
|
244
|
+
configuration. Example for an operator allowed to delete rooms in this Fleet:
|
|
245
|
+
|
|
246
|
+
```python
|
|
247
|
+
prefix_rule(
|
|
248
|
+
pattern=["/opt/node/bin/node", "/opt/fleet/dist/cli.js", "room", "delete",
|
|
249
|
+
"--configuration", "/srv/fleet/fleet.yaml", "--json", "--"],
|
|
250
|
+
decision="allow",
|
|
251
|
+
)
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
Invoke exactly that prefix, followed by the room ID and the confirmation ID:
|
|
255
|
+
|
|
256
|
+
```sh
|
|
257
|
+
/opt/node/bin/node /opt/fleet/dist/cli.js room delete --configuration /srv/fleet/fleet.yaml --json -- ROOM_ID ROOM_ID
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
To authorize only one room, append both concrete IDs to the rule's pattern.
|
|
261
|
+
The `--` terminator prevents trailing arguments from changing the fixed options.
|
|
262
|
+
Do not approve the entire Node executable or the entire Fleet CLI. Do not add
|
|
263
|
+
`spawn`, `ours call`, arbitrary scripts, or configuration overrides to this rule.
|
|
264
|
+
A separate fixed `[NODE, CLI, "--help"]` rule can authorize managed help.
|
|
265
|
+
|
|
266
|
+
Restart the Codex session after changing rules. Native Fleet and bundled Codex ACP
|
|
267
|
+
use the same workspace rules. Codex must trust that workspace; configure trust
|
|
268
|
+
through the normal operator workflow rather than enabling it from an agent tool.
|
|
269
|
+
No runtime services or installed packages need restarting for this policy change.
|
|
270
|
+
|
|
271
|
+
## Boundaries
|
|
272
|
+
|
|
273
|
+
- A rule grants the named operation real authority. The repeated room ID is CLI
|
|
274
|
+
confirmation, not a substitute for user authorization.
|
|
275
|
+
- Rules apply to trusted Codex sessions in this workspace, not exclusively to one
|
|
276
|
+
Fleet identity. They depend on the launcher's inherited environment. Keep the
|
|
277
|
+
executable, CLI installation, credentials, and configuration outside the
|
|
278
|
+
agent-writable workspace. Do not treat this as an identity isolation feature.
|
|
279
|
+
- User/organization denied-read rules or an outer sandbox may forbid execution
|
|
280
|
+
outside the command sandbox. These restrictions take precedence; do not remove
|
|
281
|
+
them implicitly to make Fleet work.
|
|
282
|
+
- On tested Codex 0.159.0, quoting the executable/script tokens prevented the rule
|
|
283
|
+
from granting execution outside the sandbox. For hand-written rules use the
|
|
284
|
+
canonical simple-token invocation above. The generated setup qualifies quoted
|
|
285
|
+
script and argument paths on Codex 0.160.0; see "Quoting, measured natively".
|
|
286
|
+
- Merely enabling network inside the Linux command sandbox was insufficient:
|
|
287
|
+
its user namespace maps ancestor directory owners to UID 65534, which the SDK's
|
|
288
|
+
strict credential ancestry checks reject. Approved CLI execution avoids that
|
|
289
|
+
namespace; SDK security checks remain unchanged.
|
|
290
|
+
|
|
291
|
+
## Reproduction and regression checks
|
|
292
|
+
|
|
293
|
+
The [issue author’s validation matrix](https://github.com/adapt-toolkit/ours-fleet/issues/231)
|
|
294
|
+
used Codex 0.159.0 on macOS/Linux, native and ACP. Those results are not new runs
|
|
295
|
+
on every revision of this fixture. Build Fleet and supply the complete installed
|
|
296
|
+
Codex distribution (including its adjacent helper binaries) and a built Cowork CLI.
|
|
297
|
+
Run from the Fleet repo:
|
|
298
|
+
|
|
299
|
+
```sh
|
|
300
|
+
FLEET_CODEX_BIN=/absolute/codex \
|
|
301
|
+
FLEET_COWORK_CLI=/absolute/cowork/dist/cli.js \
|
|
302
|
+
FLEET_TEST_SESSION=codex-app-server \
|
|
303
|
+
FLEET_TEST_TMP_PREFIX=/absolute/private-test-parent/fleet-ipc- \
|
|
304
|
+
node test/fleet-cli-permissions.integration.mjs
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
Repeat with `FLEET_TEST_SESSION=acp`. The test parent must be writable, outside
|
|
308
|
+
`/tmp` and outside the tested workspace: ACP may allow `/tmp` independently.
|
|
309
|
+
Omit `FLEET_TEST_SESSION` to test standalone `codex exec`.
|
|
310
|
+
|
|
311
|
+
The local scripted Responses provider supplies only command requests. Real Codex,
|
|
312
|
+
Fleet adapters, CLI, control socket, audit store, daemon, and Cowork perform the
|
|
313
|
+
operations. No external model or production identities/rooms are used. Child processes are stopped and temporary state is removed afterward. To retain
|
|
314
|
+
fixture evidence, set `FLEET_TEST_KEEP_ARTIFACTS=1`. The fixture allowlists its
|
|
315
|
+
launcher environment and uses a disposable HOME; no provider keys, preloads, or
|
|
316
|
+
user configuration are inherited.
|
|
317
|
+
|
|
318
|
+
Checks: baseline network-denied `--help`; permitted help; wrong confirmation
|
|
319
|
+
leaves the room intact; correct confirmation deletes the actual empty test room
|
|
320
|
+
from Fleet and Cowork; caller audit remains present; unrelated outside-workspace
|
|
321
|
+
write, `NODE_OPTIONS` injection, and a different configuration remain denied.
|
|
322
|
+
The fixture uses `OURS_FLEET_SUPERVISOR=none`: launchctl/systemd workers and deletion
|
|
323
|
+
of a live room containing agents are outside this test's coverage.
|
|
324
|
+
|
|
325
|
+
Reference: [Codex execution rules](https://learn.chatgpt.com/docs/agent-configuration/rules).
|
|
326
|
+
|
|
327
|
+
## Claude Code: the same CLI path, different permission settings
|
|
328
|
+
|
|
329
|
+
The issue author verified Claude Code 2.1.284 on macOS and Linux, both standalone and through
|
|
330
|
+
Fleet's bundled Claude ACP adapter (0.63.0). Fleet `approval: auto` maps to
|
|
331
|
+
`acceptEdits`, which is not blanket permission for Bash. Fleet's `filesystem:
|
|
332
|
+
workspace` also does not by itself enable Claude's OS sandbox. Explicitly enable
|
|
333
|
+
it and configure both the execution exclusion and the command permission:
|
|
334
|
+
|
|
335
|
+
```json
|
|
336
|
+
{
|
|
337
|
+
"sandbox": {
|
|
338
|
+
"enabled": true,
|
|
339
|
+
"failIfUnavailable": true,
|
|
340
|
+
"allowUnsandboxedCommands": false,
|
|
341
|
+
"excludedCommands": [
|
|
342
|
+
"/opt/node/bin/node /opt/fleet/dist/cli.js room delete --configuration /srv/fleet/fleet.yaml --json -- *"
|
|
343
|
+
]
|
|
344
|
+
},
|
|
345
|
+
"permissions": {
|
|
346
|
+
"allow": [
|
|
347
|
+
"Bash(/opt/node/bin/node /opt/fleet/dist/cli.js room delete --configuration /srv/fleet/fleet.yaml --json -- *)"
|
|
348
|
+
]
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
Use operator-controlled Claude settings. The fixture uses an isolated settings
|
|
354
|
+
file delivered with `--settings` (standalone) or Fleet's supported settings overlay
|
|
355
|
+
metadata (bundled ACP). It does not modify the user's settings. As with the Codex
|
|
356
|
+
rule, append exact room IDs instead of `*` to restrict this to one room.
|
|
357
|
+
|
|
358
|
+
`excludedCommands` controls placement outside the command sandbox;
|
|
359
|
+
`permissions.allow` authorizes the action. Neither should be replaced with global
|
|
360
|
+
`bypassPermissions`, blanket `Bash(*)`, or an exception for all Node programs.
|
|
361
|
+
An external sandbox or managed policy can still override this configuration.
|
|
362
|
+
|
|
363
|
+
Linux inside an unprivileged Docker container additionally needed
|
|
364
|
+
`sandbox.enableWeakerNestedSandbox: true`: otherwise bubblewrap failed to mount
|
|
365
|
+
`/proc` before any CLI command ran. This documented setting bind-mounts the
|
|
366
|
+
container's existing `/proc`, weakening that part of the nested isolation. It is
|
|
367
|
+
specific to the nested test environment, not an unconditional Linux requirement.
|
|
368
|
+
The tests still prove Unix-socket denial and filesystem write denial. The outer
|
|
369
|
+
Docker seccomp profile was unconfined to support nesting, as in the Codex tests.
|
|
370
|
+
|
|
371
|
+
Run the same integration scenario with:
|
|
372
|
+
|
|
373
|
+
```sh
|
|
374
|
+
FLEET_CLAUDE_BIN=/absolute/claude \
|
|
375
|
+
FLEET_COWORK_CLI=/absolute/cowork/dist/cli.js \
|
|
376
|
+
FLEET_TEST_TMP_PREFIX=/absolute/private-test-parent/fleet-claude- \
|
|
377
|
+
FLEET_TEST_SESSION=claude-acp \
|
|
378
|
+
node test/fleet-cli-permissions.integration.mjs
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
Omit `FLEET_TEST_SESSION` for standalone Claude. In the nested Linux fixture add
|
|
382
|
+
`FLEET_TEST_NESTED_SANDBOX=1` explicitly. A scripted local Anthropic Messages/SSE
|
|
383
|
+
provider requests the real Bash call and captures the actual tool result. The
|
|
384
|
+
negative baseline grants Bash permission without an exclusion and verifies that
|
|
385
|
+
the supervisor socket is still blocked. The write probe is separately authorized
|
|
386
|
+
inside the sandbox; it must execute and report an OS denial, not merely fail an
|
|
387
|
+
approval prompt. No real model/account credentials are used.
|
|
388
|
+
|
|
389
|
+
All other limits above apply: empty room, isolated audit/control server,
|
|
390
|
+
`supervisor=none` workers, and adapter coverage rather than full production runner.
|
|
391
|
+
|
|
392
|
+
Reference: [Claude sandbox exclusions and permissions](https://code.claude.com/docs/en/sandboxing#run-commands-outside-the-sandbox-with-excludedcommands).
|
|
393
|
+
|
|
394
|
+
|
|
395
|
+
## Port validation for issue #231
|
|
396
|
+
|
|
397
|
+
The separate upstream port was rerun on Linux amd64 in a disposable Node 22.23.1
|
|
398
|
+
container with Codex 0.160.0 and Claude Code 2.1.289:
|
|
399
|
+
|
|
400
|
+
| Harness execution | Result |
|
|
401
|
+
| --- | --- |
|
|
402
|
+
| Codex native app-server | PASS |
|
|
403
|
+
| Bundled Codex ACP | PASS |
|
|
404
|
+
| Claude standalone | PASS |
|
|
405
|
+
| Bundled Claude ACP | PASS |
|
|
406
|
+
|
|
407
|
+
Each complete run checks actual socket denial, permitted help, wrong-confirmation
|
|
408
|
+
refusal, deletion of its own empty Fleet/Cowork room, preserved caller audit, and
|
|
409
|
+
OS denial of an unrelated write, preload injection, and alternate configuration.
|
|
410
|
+
The scripted providers and all state are local; external network access is disabled.
|
|
411
|
+
For these nested tests only, the outer Docker seccomp and AppArmor profiles were
|
|
412
|
+
unconfined and Claude used `enableWeakerNestedSandbox: true`. No host policies or
|
|
413
|
+
production services were changed. The inner command sandbox remains enforced by
|
|
414
|
+
the negative checks. These are container results, not a qualification of normal
|
|
415
|
+
host settings. Initial missing-helper and outer-policy failures were retained
|
|
416
|
+
alongside the passing runs; they are not counted as passing tests.
|
|
417
|
+
|
|
418
|
+
The port also passed 88 diagnostic/conversation/audit unit checks, a build, and an
|
|
419
|
+
npm package dry-run check for this document. The diagnostic preserves the prior
|
|
420
|
+
error kinds and audited CLI failure before parsing. This does not claim a fresh
|
|
421
|
+
macOS run, full production runner coverage, or live-agent room deletion.
|