oacp-cli 0.3.0__tar.gz → 0.3.1__tar.gz
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.
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/CHANGELOG.md +12 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/CONTRIBUTING.md +1 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/PKG-INFO +99 -6
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/README.md +98 -5
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/SPEC.md +46 -2
- oacp_cli-0.3.1/docs/img/oacp-cli-demo.png +0 -0
- oacp_cli-0.3.1/docs/img/oacp-filesystem-tree.png +0 -0
- oacp_cli-0.3.1/docs/img/oacp-fleet-thread.png +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/docs/protocol/agent_safety_defaults.md +15 -0
- oacp_cli-0.3.1/docs/protocol/autonomy.md +210 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/docs/protocol/dispatch_states.yaml +20 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/docs/protocol/inbox_outbox.md +35 -3
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/pyproject.toml +2 -1
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/scripts/add_agent.py +12 -1
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/scripts/init_project_workspace.py +10 -2
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/scripts/oacp_doctor.py +192 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/scripts/send_inbox_message.py +17 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/scripts/update_workspace.sh +79 -3
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/scripts/validate_message.py +12 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/templates/inbox_message.template.yaml +11 -0
- oacp_cli-0.3.1/templates/receiver_config.template.yaml +15 -0
- oacp_cli-0.3.1/tests/conformance/autonomy/README.md +24 -0
- oacp_cli-0.3.1/tests/conformance/autonomy/configs/always_pause.yaml +13 -0
- oacp_cli-0.3.1/tests/conformance/autonomy/configs/auto_review_standard.yaml +13 -0
- oacp_cli-0.3.1/tests/conformance/autonomy/configs/auto_review_tight.yaml +13 -0
- oacp_cli-0.3.1/tests/conformance/autonomy/configs/malformed_config.yaml +7 -0
- oacp_cli-0.3.1/tests/conformance/autonomy/expected/always_pause_task.yaml +8 -0
- oacp_cli-0.3.1/tests/conformance/autonomy/expected/ambiguous_scope_pauses.yaml +9 -0
- oacp_cli-0.3.1/tests/conformance/autonomy/expected/brainstorm_without_profile_auto_accepts.yaml +14 -0
- oacp_cli-0.3.1/tests/conformance/autonomy/expected/clean_auto_review_task.yaml +15 -0
- oacp_cli-0.3.1/tests/conformance/autonomy/expected/hard_stop_dangerously_skip_permissions_pauses.yaml +9 -0
- oacp_cli-0.3.1/tests/conformance/autonomy/expected/hard_stop_external_side_effects_pauses.yaml +9 -0
- oacp_cli-0.3.1/tests/conformance/autonomy/expected/hard_stop_force_pauses.yaml +9 -0
- oacp_cli-0.3.1/tests/conformance/autonomy/expected/hard_stop_no_verify_pauses.yaml +9 -0
- oacp_cli-0.3.1/tests/conformance/autonomy/expected/hard_stop_rm_rf_pauses.yaml +9 -0
- oacp_cli-0.3.1/tests/conformance/autonomy/expected/hard_stop_sensitive_scope_pauses.yaml +9 -0
- oacp_cli-0.3.1/tests/conformance/autonomy/expected/malformed_config_pauses.yaml +8 -0
- oacp_cli-0.3.1/tests/conformance/autonomy/expected/missing_task_profile_pauses.yaml +8 -0
- oacp_cli-0.3.1/tests/conformance/autonomy/expected/threshold_breach_pauses.yaml +8 -0
- oacp_cli-0.3.1/tests/conformance/autonomy/expected/tight_threshold_pauses.yaml +8 -0
- oacp_cli-0.3.1/tests/conformance/autonomy/expected/unparsable_task_profile_pauses.yaml +8 -0
- oacp_cli-0.3.1/tests/conformance/autonomy/messages/ambiguous_scope.yaml +20 -0
- oacp_cli-0.3.1/tests/conformance/autonomy/messages/brainstorm_without_profile.yaml +9 -0
- oacp_cli-0.3.1/tests/conformance/autonomy/messages/clean_task.yaml +21 -0
- oacp_cli-0.3.1/tests/conformance/autonomy/messages/hard_stop_dangerously_skip_permissions.yaml +20 -0
- oacp_cli-0.3.1/tests/conformance/autonomy/messages/hard_stop_external_side_effects.yaml +21 -0
- oacp_cli-0.3.1/tests/conformance/autonomy/messages/hard_stop_force.yaml +20 -0
- oacp_cli-0.3.1/tests/conformance/autonomy/messages/hard_stop_no_verify.yaml +20 -0
- oacp_cli-0.3.1/tests/conformance/autonomy/messages/hard_stop_rm_rf.yaml +20 -0
- oacp_cli-0.3.1/tests/conformance/autonomy/messages/hard_stop_sensitive_scope.yaml +20 -0
- oacp_cli-0.3.1/tests/conformance/autonomy/messages/missing_task_profile.yaml +10 -0
- oacp_cli-0.3.1/tests/conformance/autonomy/messages/threshold_breach.yaml +20 -0
- oacp_cli-0.3.1/tests/conformance/autonomy/messages/unparsable_task_profile.yaml +12 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/tests/test_add_agent.py +11 -6
- oacp_cli-0.3.1/tests/test_autonomy_conformance_fixtures.py +60 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/tests/test_init_project_workspace.py +21 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/tests/test_oacp_doctor.py +88 -2
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/tests/test_send_inbox_message.py +62 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/tests/test_update_workspace.py +45 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/tests/test_validate_message.py +17 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/.github/workflows/ci.yml +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/.github/workflows/release.yml +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/.gitignore +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/LICENSE +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/Makefile +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/QUICKSTART.md +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/SECURITY.md +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/docs/guides/adoption.md +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/docs/guides/doctor.md +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/docs/guides/prompt_caching.md +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/docs/guides/runtime_capability_matrix.md +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/docs/guides/setup.md +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/docs/guides/unified_skill_spec.md +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/docs/guides/versioning.md +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/docs/protocol/agent_profiles.md +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/docs/protocol/credential_scoping.md +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/docs/protocol/cross_runtime_sync.md +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/docs/protocol/mcp_integration.md +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/docs/protocol/multi_agent_shared_workspace.md +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/docs/protocol/org_memory.md +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/docs/protocol/packet_states.yaml +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/docs/protocol/review_loop.md +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/docs/protocol/runtime_capabilities.md +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/docs/protocol/session_init.md +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/docs/protocol/skills_manifest.yaml +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/docs/protocol/task_negotiation.md +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/examples/quickstart/README.md +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/mcp_servers/oacp_coordinator.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/oacp/__init__.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/oacp/cli.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/scripts/_oacp_constants.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/scripts/_oacp_env.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/scripts/agent_profile.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/scripts/check_quality_gate.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/scripts/codex_session_init.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/scripts/create_handoff_packet.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/scripts/handoff_schema.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/scripts/init_org_memory.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/scripts/init_packet.sh +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/scripts/init_project_workspace.sh +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/scripts/memory_archive_common.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/scripts/memory_cli.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/scripts/memory_sync.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/scripts/normalize_findings.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/scripts/oacp_inbox.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/scripts/oacp_watch.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/scripts/preflight.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/scripts/promote_to_archive.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/scripts/restore_from_archive.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/scripts/session_lifecycle_hooks.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/scripts/setup_runtime.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/scripts/validate_agent_card.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/scripts/write_event.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/templates/agent_card.template.yaml +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/templates/agent_profile.template.yaml +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/templates/agent_status.template.yaml +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/templates/checkpoint.template.md +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/templates/claude/agents/role_agent.template.md +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/templates/claude/rules/guardrail.template.md +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/templates/findings_packet.template.yaml +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/templates/github_actions_quality_gate.yaml +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/templates/guardrails/coding_standards.template.md +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/templates/guardrails/safe_commands.template.md +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/templates/guardrails/secrets_rules.template.md +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/templates/handoff_packet.template.yaml +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/templates/manual_validation.template.md +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/templates/merge_decision.template.md +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/templates/org-memory/decisions.md +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/templates/org-memory/events/.gitkeep +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/templates/org-memory/events/20260317-170120-example-api-convention.md +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/templates/org-memory/recent.md +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/templates/org-memory/rules.md +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/templates/review_packet.template.md +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/templates/roles/role_baseline.template.md +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/templates/roles/role_definition.template.yaml +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/templates/runtime_capabilities.yaml +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/templates/skills_manifest.template.yaml +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/templates/test_packet.template.md +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/tests/test_agent_profile.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/tests/test_codex_session_init.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/tests/test_create_handoff_packet.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/tests/test_github_workflows.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/tests/test_handoff_schema.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/tests/test_memory_archive.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/tests/test_oacp_cli.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/tests/test_oacp_constants.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/tests/test_oacp_coordinator.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/tests/test_oacp_env.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/tests/test_oacp_inbox.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/tests/test_oacp_watch.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/tests/test_preflight.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/tests/test_review_loop.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/tests/test_session_lifecycle_hooks.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/tests/test_setup_runtime.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/tests/test_validate_agent_card.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/tests/test_workspace_discovery.py +0 -0
- {oacp_cli-0.3.0 → oacp_cli-0.3.1}/tests/test_write_event.py +0 -0
|
@@ -7,6 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.3.1] - 2026-05-12
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- `auto_review` autonomy mode — an opt-in receiver-side autonomy profile that classifies inbound messages into auto-accept, pause, or hard-stop bands using clean / ambiguous / hard-stop trigger predicates. Configured via `receiver_config.autonomy_mode: auto_review` with `auto_review_profile` selecting `standard` or `tight`. Off by default; existing receivers continue to behave as `always_pause` unless they opt in. Ships with a conformance fixture suite under `tests/conformance/autonomy/` covering clean tasks, ambiguous scope, hard-stop triggers, and malformed config handling.
|
|
15
|
+
|
|
16
|
+
### Changed
|
|
17
|
+
|
|
18
|
+
- README: refreshed with a hero image and three screenshots illustrating inbox flow, doctor output, and the multi-agent workspace layout. Hub README copy, install path, and command table aligned with the current CLI surface.
|
|
19
|
+
- Docs: link to companion oacp-skills repo from the README and onboarding pages so readers can find the skill library that pairs with the protocol.
|
|
20
|
+
|
|
10
21
|
## [0.3.0] - 2026-04-29
|
|
11
22
|
|
|
12
23
|
### Added
|
|
@@ -131,6 +142,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
131
142
|
- Checkout step in github-release workflow job (#19)
|
|
132
143
|
- Pre-release audit fixes: SHA-pinned actions, dangling doc refs (#15, #16)
|
|
133
144
|
|
|
145
|
+
[0.3.1]: https://github.com/kiloloop/oacp/compare/v0.3.0...v0.3.1
|
|
134
146
|
[0.3.0]: https://github.com/kiloloop/oacp/compare/v0.2.3...v0.3.0
|
|
135
147
|
[0.2.3]: https://github.com/kiloloop/oacp/compare/v0.2.2...v0.2.3
|
|
136
148
|
[0.2.2]: https://github.com/kiloloop/oacp/compare/v0.2.1...v0.2.2
|
|
@@ -73,6 +73,7 @@ make preflight ARGS="--full"
|
|
|
73
73
|
- Packet naming follows `<YYYYMMDD>_<topic>_<owner>_r<round>`.
|
|
74
74
|
- Scripts use `python3` and avoid external dependencies beyond the standard library (exception: `pyyaml`).
|
|
75
75
|
- Shell scripts use POSIX-compatible constructs where possible; bash-specific features require bash 3.2+.
|
|
76
|
+
- README images should stay under ~500KB each. Use `docs/img/` for all README assets.
|
|
76
77
|
|
|
77
78
|
## Commit Messages
|
|
78
79
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: oacp-cli
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.1
|
|
4
4
|
Summary: Open Agent Coordination Protocol CLI for file-based multi-agent workflows
|
|
5
5
|
Project-URL: Homepage, https://github.com/kiloloop/oacp
|
|
6
6
|
Project-URL: Repository, https://github.com/kiloloop/oacp
|
|
@@ -24,7 +24,7 @@ Requires-Python: >=3.9
|
|
|
24
24
|
Requires-Dist: pyyaml>=6.0
|
|
25
25
|
Description-Content-Type: text/markdown
|
|
26
26
|
|
|
27
|
-
# OACP
|
|
27
|
+
# OACP
|
|
28
28
|
|
|
29
29
|
[](https://pypi.org/project/oacp-cli/)
|
|
30
30
|
[](LICENSE)
|
|
@@ -32,11 +32,92 @@ Description-Content-Type: text/markdown
|
|
|
32
32
|
[](https://openai.com/index/codex/)
|
|
33
33
|
[](https://github.com/kiloloop/oacp/pulls)
|
|
34
34
|
|
|
35
|
-
>
|
|
35
|
+
> Coordinate agents *without* the chaos.
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
A file-based protocol for multi-agent AI workflows. Two pillars — cross-agent communication and persistent shared memory. Across runtimes, projects, and machines. No daemons. No central server. Just files.
|
|
38
38
|
|
|
39
|
-
|
|
39
|
+
[Read the spec →](SPEC.md)
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
$ pip install oacp-cli
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## See it in action
|
|
46
|
+
|
|
47
|
+
<p align="center">
|
|
48
|
+
<img src="docs/img/oacp-cli-demo.png" alt="oacp send + watch terminal demo" width="584" />
|
|
49
|
+
</p>
|
|
50
|
+
|
|
51
|
+
The CLI ships structured tasks between agents and lets you watch the conversation in real time.
|
|
52
|
+
|
|
53
|
+
## Live agent fleet
|
|
54
|
+
|
|
55
|
+
<p align="center">
|
|
56
|
+
<img src="docs/img/oacp-fleet-thread.png" alt="claude / codex / gemini fleet with PR #42 review thread" width="650" />
|
|
57
|
+
</p>
|
|
58
|
+
|
|
59
|
+
Every multi-agent thread is a sequence of typed messages — `review_request`, `review_feedback`, `review_addressed`, `review_lgtm` — with explicit quality gates.
|
|
60
|
+
|
|
61
|
+
<details>
|
|
62
|
+
<summary>Text version (terminal browsing / grep / a11y)</summary>
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
PROJECT · my-app ● live
|
|
66
|
+
|
|
67
|
+
C claude code drafting PR #42
|
|
68
|
+
X codex cli reviewing
|
|
69
|
+
G gemini api idle
|
|
70
|
+
|
|
71
|
+
claude → review_request "auth refactor" [codex]
|
|
72
|
+
codex → review_feedback 2 minor, 0 blocking [claude]
|
|
73
|
+
claude → review_addressed [codex]
|
|
74
|
+
codex → review_lgtm [merge]
|
|
75
|
+
|
|
76
|
+
thread #42 · 4 msgs · 8m quality gate ✓
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
</details>
|
|
80
|
+
|
|
81
|
+
## Filesystem as protocol
|
|
82
|
+
|
|
83
|
+
<p align="center">
|
|
84
|
+
<img src="docs/img/oacp-filesystem-tree.png" alt="$OACP_HOME directory tree with inbox/outbox/memory/artifacts" width="526" />
|
|
85
|
+
</p>
|
|
86
|
+
|
|
87
|
+
Everything is plain files in `$OACP_HOME`. Agents have `inbox/`, `outbox/`, `dead_letter/`. Projects have shared `memory/` (durable) and per-thread `artifacts/`, `checkpoints/`, `packets/`. Org-wide knowledge lives in `$OACP_HOME/org-memory/`.
|
|
88
|
+
|
|
89
|
+
<details>
|
|
90
|
+
<summary>Text version (terminal browsing / grep / a11y)</summary>
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
$OACP_HOME/projects/my-app/ ● writing
|
|
94
|
+
|
|
95
|
+
agents/
|
|
96
|
+
claude/
|
|
97
|
+
inbox/ 3 msgs [in]
|
|
98
|
+
outbox/ 12 sent [out]
|
|
99
|
+
dead_letter/ empty [dl]
|
|
100
|
+
codex/
|
|
101
|
+
inbox/ +1 new [in]
|
|
102
|
+
|
|
103
|
+
memory/ shared durable
|
|
104
|
+
project_facts.md 2.4 kb [md]
|
|
105
|
+
decision_log.md edited 3s ago [md]
|
|
106
|
+
open_threads.md 1.1 kb [md]
|
|
107
|
+
known_debt.md 812 b [md]
|
|
108
|
+
|
|
109
|
+
artifacts/ build · research
|
|
110
|
+
checkpoints/ progress
|
|
111
|
+
packets/ review findings
|
|
112
|
+
workspace.json metadata [json]
|
|
113
|
+
|
|
114
|
+
$OACP_HOME/org-memory/ org-wide
|
|
115
|
+
recent.md auto-loaded [⌘]
|
|
116
|
+
rules.md 12 rules [⌘]
|
|
117
|
+
decisions.md org decisions [⌘]
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
</details>
|
|
40
121
|
|
|
41
122
|
## Quick Start
|
|
42
123
|
|
|
@@ -47,7 +128,7 @@ oacp send my-project --from alice --to bob --type task_request \
|
|
|
47
128
|
--subject "Implement feature X" --body "Details here..."
|
|
48
129
|
```
|
|
49
130
|
|
|
50
|
-
When running inside a configured agent runtime, `--from` can be omitted — OACP infers the sender from `OACP_AGENT`, `AGENT_NAME`, or the agent card. See [QUICKSTART.md](QUICKSTART.md) for a full walkthrough.
|
|
131
|
+
When running inside a configured agent runtime, `--from` can be omitted — OACP infers the sender from `OACP_AGENT`, `AGENT_NAME`, or the agent card. See [QUICKSTART.md](QUICKSTART.md) for a full walkthrough. Or try the [5-minute quickstart →](examples/quickstart/) to send your first message to a real AI agent.
|
|
51
132
|
|
|
52
133
|
### What you get
|
|
53
134
|
|
|
@@ -67,6 +148,18 @@ After installing, run `oacp doctor` to verify your environment is wired up:
|
|
|
67
148
|
oacp doctor
|
|
68
149
|
```
|
|
69
150
|
|
|
151
|
+
## Agent Skills
|
|
152
|
+
|
|
153
|
+
OACP has companion agent skills that teach Claude, Codex, and other
|
|
154
|
+
runtimes how to use the CLI and protocol in real workflows.
|
|
155
|
+
|
|
156
|
+
Install or browse them here:
|
|
157
|
+
|
|
158
|
+
- https://github.com/kiloloop/oacp-skills
|
|
159
|
+
|
|
160
|
+
The core `oacp-cli` package remains the protocol/tooling kernel,
|
|
161
|
+
while `oacp-skills` contains runtime guidance and workflows.
|
|
162
|
+
|
|
70
163
|
## Why OACP?
|
|
71
164
|
|
|
72
165
|
When multiple AI agents work on the same codebase, they need a way to:
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# OACP
|
|
1
|
+
# OACP
|
|
2
2
|
|
|
3
3
|
[](https://pypi.org/project/oacp-cli/)
|
|
4
4
|
[](LICENSE)
|
|
@@ -6,11 +6,92 @@
|
|
|
6
6
|
[](https://openai.com/index/codex/)
|
|
7
7
|
[](https://github.com/kiloloop/oacp/pulls)
|
|
8
8
|
|
|
9
|
-
>
|
|
9
|
+
> Coordinate agents *without* the chaos.
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
A file-based protocol for multi-agent AI workflows. Two pillars — cross-agent communication and persistent shared memory. Across runtimes, projects, and machines. No daemons. No central server. Just files.
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
[Read the spec →](SPEC.md)
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
$ pip install oacp-cli
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## See it in action
|
|
20
|
+
|
|
21
|
+
<p align="center">
|
|
22
|
+
<img src="docs/img/oacp-cli-demo.png" alt="oacp send + watch terminal demo" width="584" />
|
|
23
|
+
</p>
|
|
24
|
+
|
|
25
|
+
The CLI ships structured tasks between agents and lets you watch the conversation in real time.
|
|
26
|
+
|
|
27
|
+
## Live agent fleet
|
|
28
|
+
|
|
29
|
+
<p align="center">
|
|
30
|
+
<img src="docs/img/oacp-fleet-thread.png" alt="claude / codex / gemini fleet with PR #42 review thread" width="650" />
|
|
31
|
+
</p>
|
|
32
|
+
|
|
33
|
+
Every multi-agent thread is a sequence of typed messages — `review_request`, `review_feedback`, `review_addressed`, `review_lgtm` — with explicit quality gates.
|
|
34
|
+
|
|
35
|
+
<details>
|
|
36
|
+
<summary>Text version (terminal browsing / grep / a11y)</summary>
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
PROJECT · my-app ● live
|
|
40
|
+
|
|
41
|
+
C claude code drafting PR #42
|
|
42
|
+
X codex cli reviewing
|
|
43
|
+
G gemini api idle
|
|
44
|
+
|
|
45
|
+
claude → review_request "auth refactor" [codex]
|
|
46
|
+
codex → review_feedback 2 minor, 0 blocking [claude]
|
|
47
|
+
claude → review_addressed [codex]
|
|
48
|
+
codex → review_lgtm [merge]
|
|
49
|
+
|
|
50
|
+
thread #42 · 4 msgs · 8m quality gate ✓
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
</details>
|
|
54
|
+
|
|
55
|
+
## Filesystem as protocol
|
|
56
|
+
|
|
57
|
+
<p align="center">
|
|
58
|
+
<img src="docs/img/oacp-filesystem-tree.png" alt="$OACP_HOME directory tree with inbox/outbox/memory/artifacts" width="526" />
|
|
59
|
+
</p>
|
|
60
|
+
|
|
61
|
+
Everything is plain files in `$OACP_HOME`. Agents have `inbox/`, `outbox/`, `dead_letter/`. Projects have shared `memory/` (durable) and per-thread `artifacts/`, `checkpoints/`, `packets/`. Org-wide knowledge lives in `$OACP_HOME/org-memory/`.
|
|
62
|
+
|
|
63
|
+
<details>
|
|
64
|
+
<summary>Text version (terminal browsing / grep / a11y)</summary>
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
$OACP_HOME/projects/my-app/ ● writing
|
|
68
|
+
|
|
69
|
+
agents/
|
|
70
|
+
claude/
|
|
71
|
+
inbox/ 3 msgs [in]
|
|
72
|
+
outbox/ 12 sent [out]
|
|
73
|
+
dead_letter/ empty [dl]
|
|
74
|
+
codex/
|
|
75
|
+
inbox/ +1 new [in]
|
|
76
|
+
|
|
77
|
+
memory/ shared durable
|
|
78
|
+
project_facts.md 2.4 kb [md]
|
|
79
|
+
decision_log.md edited 3s ago [md]
|
|
80
|
+
open_threads.md 1.1 kb [md]
|
|
81
|
+
known_debt.md 812 b [md]
|
|
82
|
+
|
|
83
|
+
artifacts/ build · research
|
|
84
|
+
checkpoints/ progress
|
|
85
|
+
packets/ review findings
|
|
86
|
+
workspace.json metadata [json]
|
|
87
|
+
|
|
88
|
+
$OACP_HOME/org-memory/ org-wide
|
|
89
|
+
recent.md auto-loaded [⌘]
|
|
90
|
+
rules.md 12 rules [⌘]
|
|
91
|
+
decisions.md org decisions [⌘]
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
</details>
|
|
14
95
|
|
|
15
96
|
## Quick Start
|
|
16
97
|
|
|
@@ -21,7 +102,7 @@ oacp send my-project --from alice --to bob --type task_request \
|
|
|
21
102
|
--subject "Implement feature X" --body "Details here..."
|
|
22
103
|
```
|
|
23
104
|
|
|
24
|
-
When running inside a configured agent runtime, `--from` can be omitted — OACP infers the sender from `OACP_AGENT`, `AGENT_NAME`, or the agent card. See [QUICKSTART.md](QUICKSTART.md) for a full walkthrough.
|
|
105
|
+
When running inside a configured agent runtime, `--from` can be omitted — OACP infers the sender from `OACP_AGENT`, `AGENT_NAME`, or the agent card. See [QUICKSTART.md](QUICKSTART.md) for a full walkthrough. Or try the [5-minute quickstart →](examples/quickstart/) to send your first message to a real AI agent.
|
|
25
106
|
|
|
26
107
|
### What you get
|
|
27
108
|
|
|
@@ -41,6 +122,18 @@ After installing, run `oacp doctor` to verify your environment is wired up:
|
|
|
41
122
|
oacp doctor
|
|
42
123
|
```
|
|
43
124
|
|
|
125
|
+
## Agent Skills
|
|
126
|
+
|
|
127
|
+
OACP has companion agent skills that teach Claude, Codex, and other
|
|
128
|
+
runtimes how to use the CLI and protocol in real workflows.
|
|
129
|
+
|
|
130
|
+
Install or browse them here:
|
|
131
|
+
|
|
132
|
+
- https://github.com/kiloloop/oacp-skills
|
|
133
|
+
|
|
134
|
+
The core `oacp-cli` package remains the protocol/tooling kernel,
|
|
135
|
+
while `oacp-skills` contains runtime guidance and workflows.
|
|
136
|
+
|
|
44
137
|
## Why OACP?
|
|
45
138
|
|
|
46
139
|
When multiple AI agents work on the same codebase, they need a way to:
|
|
@@ -79,7 +79,12 @@ Messages are YAML files. Filename convention: `<timestamp>_<from>_<type>.yaml`
|
|
|
79
79
|
| `subject` | string | Subject line |
|
|
80
80
|
| `body` | string | Message content (multi-line markdown) |
|
|
81
81
|
|
|
82
|
-
**Optional fields:** `expires_at`, `channel`, `related_packet`, `related_pr`, `conversation_id`, `parent_message_id`, `context_keys`
|
|
82
|
+
**Optional fields:** `expires_at`, `channel`, `autonomy_hint`, `related_packet`, `related_pr`, `conversation_id`, `parent_message_id`, `context_keys`
|
|
83
|
+
|
|
84
|
+
`autonomy_hint` is an advisory sender hint, such as `auto_proceed`. Receivers
|
|
85
|
+
remain authoritative: local autonomy config, message content, safety defaults,
|
|
86
|
+
and runtime/tool permissions determine whether a message can be accepted without
|
|
87
|
+
interactive human confirmation.
|
|
83
88
|
|
|
84
89
|
### Message Types
|
|
85
90
|
|
|
@@ -164,7 +169,7 @@ received → accepted → working → pr_opened → in_review → done
|
|
|
164
169
|
|
|
165
170
|
### Key Transitions
|
|
166
171
|
|
|
167
|
-
- **`received` → `accepted`**: Agent reads and accepts the task. Ack recommended for P0/P1.
|
|
172
|
+
- **`received` → `accepted`**: Agent reads and accepts the task. Ack recommended for P0/P1. When accepted by autonomy policy, this transition is preserved and records `accepted_by`, `human_confirmed`, `autonomy_mode`, `policy_ref`, `policy_hash`, and `reason_codes`.
|
|
168
173
|
- **`working` → `pr_opened`**: Agent opens a PR. **Notification required** with `WIP:` subject prefix.
|
|
169
174
|
- **`pr_opened` → `in_review`**: Agent requests cross-agent review via `review_request`.
|
|
170
175
|
- **`in_review` → `done`**: PR merged after review approval. Guard: `pr_merged AND review_approved`.
|
|
@@ -202,6 +207,23 @@ The dispatcher (e.g., an orchestrator agent) tracks dispatches from its perspect
|
|
|
202
207
|
- **Non-PR tasks**: done = deliverable provided or question answered
|
|
203
208
|
- Final notification must include `merge_sha` (PR tasks) or `results_summary` (non-PR tasks)
|
|
204
209
|
|
|
210
|
+
### Acceptance Metadata
|
|
211
|
+
|
|
212
|
+
Receivers must not collapse `received → accepted`, even when a task is
|
|
213
|
+
auto-accepted. Transition metadata records who or what accepted the task:
|
|
214
|
+
|
|
215
|
+
```yaml
|
|
216
|
+
transition: received_to_accepted
|
|
217
|
+
accepted_by: autonomy_policy # human | autonomy_policy | --autonomous-flag
|
|
218
|
+
human_confirmed: false
|
|
219
|
+
autonomy_mode: auto_review
|
|
220
|
+
policy_ref: agents/codex/config.yaml
|
|
221
|
+
policy_hash: sha256:...
|
|
222
|
+
reason_codes:
|
|
223
|
+
- task_profile_present
|
|
224
|
+
- risk_threshold_passed
|
|
225
|
+
```
|
|
226
|
+
|
|
205
227
|
### Brainstorm Lifecycle
|
|
206
228
|
|
|
207
229
|
Brainstorm messages follow a simpler lifecycle: `received` → `researching` → `report_delivered`. No PR, no review loop. The dispatcher sees: `Sent` → `In progress` → `Responded`.
|
|
@@ -402,6 +424,27 @@ Credential scoping: [`docs/protocol/credential_scoping.md`](docs/protocol/creden
|
|
|
402
424
|
|
|
403
425
|
These defaults apply to all agents (Claude, Codex, Gemini) unless a project-level config explicitly overrides a specific rule. Safety defaults can only be made **stricter** by project rules, never relaxed.
|
|
404
426
|
|
|
427
|
+
Autonomy introduces a separate receiver acceptance policy layer; it does not
|
|
428
|
+
relax the safety floor. OACP distinguishes three layers:
|
|
429
|
+
|
|
430
|
+
1. **Safety defaults** — non-negotiable baseline constraints, such as no
|
|
431
|
+
unapproved push/deploy/merge/publish, no destructive commands, no secrets,
|
|
432
|
+
and disciplined staging. Projects may make these stricter, never looser.
|
|
433
|
+
2. **Receiver acceptance policy** — configurable rules for whether a receiver
|
|
434
|
+
may move a message from `received` to `accepted` without interactive human
|
|
435
|
+
confirmation. This is governed by `agents/<receiver>/config.yaml` and
|
|
436
|
+
[`docs/protocol/autonomy.md`](docs/protocol/autonomy.md).
|
|
437
|
+
3. **Runtime/tool safety** — runtime-specific permission gates that still apply
|
|
438
|
+
after acceptance, such as editor edit approval, shell sandboxing, or Codex
|
|
439
|
+
approval modes. OACP acceptance never grants runtime tool permissions.
|
|
440
|
+
|
|
441
|
+
Regardless of autonomy mode, receivers must pause on any of: destructive command
|
|
442
|
+
tokens (`rm -rf`, `--force`, `--no-verify`,
|
|
443
|
+
`--dangerously-skip-permissions`), external side effects
|
|
444
|
+
(push/deploy/merge/publish/rotate/install), or modifications to auth, config,
|
|
445
|
+
secrets, dependencies, public repos, pricing/commercial content, or memory SSOT,
|
|
446
|
+
unless explicitly authorized by a separate safety-default exception.
|
|
447
|
+
|
|
405
448
|
#### Git Safety
|
|
406
449
|
|
|
407
450
|
- No push/deploy without explicit approval from the user or dispatcher
|
|
@@ -677,6 +720,7 @@ scripts/init_packet.sh <project> <packet_id> # (no CLI wrapper yet)
|
|
|
677
720
|
| Shared workspace | [`docs/protocol/multi_agent_shared_workspace.md`](docs/protocol/multi_agent_shared_workspace.md) |
|
|
678
721
|
| Cross-runtime sync | [`docs/protocol/cross_runtime_sync.md`](docs/protocol/cross_runtime_sync.md) |
|
|
679
722
|
| Session init | [`docs/protocol/session_init.md`](docs/protocol/session_init.md) |
|
|
723
|
+
| Receiver autonomy | [`docs/protocol/autonomy.md`](docs/protocol/autonomy.md) |
|
|
680
724
|
| Safety defaults | [`docs/protocol/agent_safety_defaults.md`](docs/protocol/agent_safety_defaults.md) |
|
|
681
725
|
| Credential scoping | [`docs/protocol/credential_scoping.md`](docs/protocol/credential_scoping.md) |
|
|
682
726
|
| Runtime capabilities | [`docs/protocol/runtime_capabilities.md`](docs/protocol/runtime_capabilities.md) |
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -30,6 +30,21 @@ Follow `credential_scoping.md` in this directory for:
|
|
|
30
30
|
- Per-agent credential boundaries
|
|
31
31
|
- Rotation and revocation procedures
|
|
32
32
|
|
|
33
|
+
## Autonomy Hard Stops
|
|
34
|
+
|
|
35
|
+
Receiver autonomy controls only whether a message can move from `received` to
|
|
36
|
+
`accepted` without interactive human confirmation. It does not relax this safety
|
|
37
|
+
floor.
|
|
38
|
+
|
|
39
|
+
Regardless of autonomy mode, receivers must pause on any of:
|
|
40
|
+
|
|
41
|
+
- Destructive command tokens: `rm -rf`, `--force`, `--no-verify`, `--dangerously-skip-permissions`
|
|
42
|
+
- External side effects: push, deploy, merge, publish, credential rotation, dependency install
|
|
43
|
+
- Sensitive scope: auth, config, secrets, dependencies, public repos, pricing/commercial content, memory SSOT
|
|
44
|
+
|
|
45
|
+
The only exception is an explicit, separate safety-default exception. The
|
|
46
|
+
Phase 1 autonomy RFC does not introduce any such exception.
|
|
47
|
+
|
|
33
48
|
## Scope Discipline
|
|
34
49
|
|
|
35
50
|
- **Do not edit files outside the requested scope** — if a task says "fix X in file Y", do not refactor file Z.
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
# Receiver Autonomy Policy
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
|
|
5
|
+
OACP autonomy controls whether a receiver may move an inbox message from
|
|
6
|
+
`received` to `accepted` without interactive human confirmation. It does not
|
|
7
|
+
grant runtime tool permissions, and it does not relax agent safety defaults.
|
|
8
|
+
|
|
9
|
+
Phase 1 ships two modes:
|
|
10
|
+
|
|
11
|
+
| Mode | Behavior |
|
|
12
|
+
|------|----------|
|
|
13
|
+
| `always_pause` | Default. Receiver pauses for human review before accepting work. |
|
|
14
|
+
| `auto_review` | Receiver may auto-accept only messages that pass the deterministic gates below. |
|
|
15
|
+
|
|
16
|
+
Sender trust is messenger-bound and is not part of OACP autonomy v1/v2. Sender
|
|
17
|
+
fields may be logged in audit events for traceability, but sender identity does
|
|
18
|
+
not gate Phase 1 decisions.
|
|
19
|
+
|
|
20
|
+
## Receiver Config
|
|
21
|
+
|
|
22
|
+
Receiver policy lives at `agents/<receiver>/config.yaml`:
|
|
23
|
+
|
|
24
|
+
```yaml
|
|
25
|
+
autonomy:
|
|
26
|
+
default_mode: always_pause
|
|
27
|
+
auto_review_thresholds:
|
|
28
|
+
max_estimated_minutes: 30
|
|
29
|
+
max_expected_files_touched: 5
|
|
30
|
+
destructive_ops: pause
|
|
31
|
+
external_side_effects: pause
|
|
32
|
+
auth_config_or_secrets: pause
|
|
33
|
+
dependency_changes: pause
|
|
34
|
+
public_visibility: pause
|
|
35
|
+
git_push_or_deploy: pause
|
|
36
|
+
allow_without_task_profile:
|
|
37
|
+
- brainstorm_request
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
When config is absent, receivers behave as `always_pause`. Malformed config
|
|
41
|
+
causes a pause and should be surfaced by `oacp doctor`.
|
|
42
|
+
|
|
43
|
+
## Message Fields
|
|
44
|
+
|
|
45
|
+
Messages may include top-level `autonomy_hint: auto_proceed`. This is advisory
|
|
46
|
+
only; the receiver's config and local evaluator are authoritative.
|
|
47
|
+
|
|
48
|
+
For `auto_review`, `task_request` and `question` messages require a
|
|
49
|
+
machine-parseable `task_profile` block in `body`:
|
|
50
|
+
|
|
51
|
+
```yaml
|
|
52
|
+
task_profile:
|
|
53
|
+
estimated_minutes: 20
|
|
54
|
+
risk_tier: P3
|
|
55
|
+
expected_files_touched: 3
|
|
56
|
+
destructive_ops: false
|
|
57
|
+
external_side_effects: false
|
|
58
|
+
touches_auth_config_or_secrets: false
|
|
59
|
+
touches_dependencies: false
|
|
60
|
+
public_visibility: false
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Missing `task_profile` pauses with `task_profile_missing`. An unparsable or
|
|
64
|
+
schema-invalid profile pauses with `task_profile_unparsable`; it is not a fatal
|
|
65
|
+
message-schema error. Message types listed in `allow_without_task_profile`, such
|
|
66
|
+
as `brainstorm_request`, may auto-accept without the block.
|
|
67
|
+
|
|
68
|
+
## Four-Gate Evaluator
|
|
69
|
+
|
|
70
|
+
If any required gate is missing or uncertain, the receiver pauses.
|
|
71
|
+
|
|
72
|
+
1. **Message integrity**
|
|
73
|
+
- Message validates against OACP schema.
|
|
74
|
+
- Message is not expired.
|
|
75
|
+
- Raw YAML hash is recorded as `message_sha256` before processing.
|
|
76
|
+
- Message ID has not already been auto-accepted by this receiver.
|
|
77
|
+
- `autonomy_hint`, if present, remains advisory only.
|
|
78
|
+
2. **Declared task profile**
|
|
79
|
+
- Required for `task_request` and `question`.
|
|
80
|
+
- Cross-checks `estimated_minutes`, `expected_files_touched`, and boolean
|
|
81
|
+
risk fields against `auto_review_thresholds`.
|
|
82
|
+
3. **Receiver classification**
|
|
83
|
+
- Pause unconditionally on destructive command tokens: `rm -rf`, `--force`,
|
|
84
|
+
`--no-verify`, `--dangerously-skip-permissions`.
|
|
85
|
+
- Pause when the body asks for deploy, push to main, merge, publish,
|
|
86
|
+
credential rotation, or dependency install.
|
|
87
|
+
- Pause when the body touches auth, config, secrets, dependencies, public
|
|
88
|
+
repos, pricing/commercial content, or memory SSOT.
|
|
89
|
+
- Pause when file scope is ambiguous or broader than the declared profile.
|
|
90
|
+
4. **Runtime/workspace**
|
|
91
|
+
- Worktree is clean or the task can be isolated to a fresh branch.
|
|
92
|
+
- No conflicting active task exists on the same repo.
|
|
93
|
+
- Required tools are available.
|
|
94
|
+
|
|
95
|
+
LLM judgment may reduce false positives after deterministic gates pass. It
|
|
96
|
+
cannot override hard stops.
|
|
97
|
+
|
|
98
|
+
## Hard-Stop Override
|
|
99
|
+
|
|
100
|
+
Regardless of autonomy mode, receivers must pause on any of: destructive command
|
|
101
|
+
tokens (`rm -rf`, `--force`, `--no-verify`,
|
|
102
|
+
`--dangerously-skip-permissions`), external side effects
|
|
103
|
+
(push/deploy/merge/publish/rotate/install), or modifications to auth, config,
|
|
104
|
+
secrets, dependencies, public repos, pricing/commercial content, or memory SSOT,
|
|
105
|
+
unless explicitly authorized by a separate safety-default exception.
|
|
106
|
+
|
|
107
|
+
## Audit Events
|
|
108
|
+
|
|
109
|
+
Every autonomy decision writes one YAML file:
|
|
110
|
+
|
|
111
|
+
`agents/<receiver>/audit/autonomy_decisions/YYYYMMDDTHHMMSSZ_<message-id>.yaml`
|
|
112
|
+
|
|
113
|
+
```yaml
|
|
114
|
+
schema_version: 1
|
|
115
|
+
spec_version: "0.3.0"
|
|
116
|
+
created_at_utc: "2026-05-12T13:23:25Z"
|
|
117
|
+
receiver: codex
|
|
118
|
+
sender: iris
|
|
119
|
+
message_id: msg-20260512132325-iris-de62
|
|
120
|
+
message_type: task_request
|
|
121
|
+
message_subject: "Small docs cleanup"
|
|
122
|
+
message_path: agents/codex/inbox/20260512132325_iris_task_request.yaml
|
|
123
|
+
message_sha256: "..."
|
|
124
|
+
decision: auto_accepted
|
|
125
|
+
mode: auto_review
|
|
126
|
+
policy_path: agents/codex/config.yaml
|
|
127
|
+
policy_sha256: "..."
|
|
128
|
+
reason_codes:
|
|
129
|
+
- task_profile_present
|
|
130
|
+
- risk_threshold_passed
|
|
131
|
+
thresholds:
|
|
132
|
+
max_estimated_minutes: 30
|
|
133
|
+
max_expected_files_touched: 5
|
|
134
|
+
task_profile:
|
|
135
|
+
estimated_minutes: 20
|
|
136
|
+
expected_files_touched: 3
|
|
137
|
+
destructive_ops: false
|
|
138
|
+
runtime:
|
|
139
|
+
agent: codex
|
|
140
|
+
model: gpt-5
|
|
141
|
+
result:
|
|
142
|
+
final_state: done
|
|
143
|
+
reply_message_id: msg-...
|
|
144
|
+
artifacts: []
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
`policy_path` and `policy_sha256` may be null when the pause is caused by
|
|
148
|
+
missing or malformed config. `sender` is logged only for traceability.
|
|
149
|
+
|
|
150
|
+
## State Transition Metadata
|
|
151
|
+
|
|
152
|
+
Auto-acceptance preserves the `received -> accepted` transition and records why:
|
|
153
|
+
|
|
154
|
+
```yaml
|
|
155
|
+
transition: received_to_accepted
|
|
156
|
+
accepted_by: autonomy_policy
|
|
157
|
+
human_confirmed: false
|
|
158
|
+
autonomy_mode: auto_review
|
|
159
|
+
policy_ref: agents/codex/config.yaml
|
|
160
|
+
policy_hash: sha256:...
|
|
161
|
+
reason_codes:
|
|
162
|
+
- task_profile_present
|
|
163
|
+
- risk_threshold_passed
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## Mental Model
|
|
167
|
+
|
|
168
|
+
`auto_review` is OACP's analogue to Claude Code's `acceptEdits` mode: class-based
|
|
169
|
+
pre-approval within a local trust domain, bounded by bright-line hard stops.
|
|
170
|
+
|
|
171
|
+
The analogy is about user contract, not mechanism. OACP decides pre-execution
|
|
172
|
+
from message content and declared `task_profile`; runtime tools still enforce
|
|
173
|
+
their own permissions at action time.
|
|
174
|
+
|
|
175
|
+
## Worked Example
|
|
176
|
+
|
|
177
|
+
A receiver configured with `default_mode: auto_review` receives:
|
|
178
|
+
|
|
179
|
+
```markdown
|
|
180
|
+
## Task
|
|
181
|
+
Clean up the build directory: `rm -rf dist/ && rebuild`.
|
|
182
|
+
|
|
183
|
+
task_profile:
|
|
184
|
+
estimated_minutes: 5
|
|
185
|
+
expected_files_touched: 1
|
|
186
|
+
destructive_ops: false
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
Decision trace:
|
|
190
|
+
|
|
191
|
+
- Gate 1 passes: schema valid, not expired, hash recorded.
|
|
192
|
+
- Gate 2 passes: profile present and within thresholds.
|
|
193
|
+
- Gate 3 fails: body matches `rm -rf`.
|
|
194
|
+
- Decision: `paused`.
|
|
195
|
+
- Reason codes: `hard_stop_destructive_command`.
|
|
196
|
+
- Audit event includes `matched_pattern: "rm -rf"`.
|
|
197
|
+
|
|
198
|
+
The receiver must pause before any action runs. No autonomy mode can override
|
|
199
|
+
the hard stop.
|
|
200
|
+
|
|
201
|
+
## Threshold-Exceeded Checkpoint
|
|
202
|
+
|
|
203
|
+
Receivers self-pause if work expands beyond the declared `task_profile` after
|
|
204
|
+
acceptance:
|
|
205
|
+
|
|
206
|
+
- `Blocked: autonomy threshold exceeded — files_touched expected 3, now 12`
|
|
207
|
+
- `Blocked: autonomy threshold exceeded — prompt was docs-only, now requires credential access`
|
|
208
|
+
- `Blocked: autonomy threshold exceeded — task expanded into untyped/unconfigured capability`
|
|
209
|
+
|
|
210
|
+
The canonical fixture set lives in `tests/conformance/autonomy/`.
|
|
@@ -109,6 +109,26 @@ agent_transitions:
|
|
|
109
109
|
to: "accepted"
|
|
110
110
|
trigger: "Agent reads and accepts the task_request"
|
|
111
111
|
role: "agent"
|
|
112
|
+
metadata_fields:
|
|
113
|
+
transition: "received_to_accepted"
|
|
114
|
+
accepted_by:
|
|
115
|
+
description: "Acceptance actor: human | autonomy_policy | --autonomous-flag"
|
|
116
|
+
required: true
|
|
117
|
+
human_confirmed:
|
|
118
|
+
description: "Whether a human explicitly confirmed acceptance"
|
|
119
|
+
required: true
|
|
120
|
+
autonomy_mode:
|
|
121
|
+
description: "Receiver autonomy mode, e.g. always_pause or auto_review"
|
|
122
|
+
required: false
|
|
123
|
+
policy_ref:
|
|
124
|
+
description: "Receiver policy path, e.g. agents/codex/config.yaml"
|
|
125
|
+
required: false
|
|
126
|
+
policy_hash:
|
|
127
|
+
description: "sha256 of receiver policy when available"
|
|
128
|
+
required: false
|
|
129
|
+
reason_codes:
|
|
130
|
+
description: "List of acceptance or pause reason codes"
|
|
131
|
+
required: false
|
|
112
132
|
|
|
113
133
|
- from: "received"
|
|
114
134
|
to: "rejected"
|