oacp-cli 0.3.4__tar.gz → 0.4.0__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.
Files changed (346) hide show
  1. oacp_cli-0.4.0/.gitattributes +11 -0
  2. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/.github/workflows/ci.yml +1 -1
  3. oacp_cli-0.4.0/CHANGELOG.md +555 -0
  4. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/PKG-INFO +7 -3
  5. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/README.md +4 -2
  6. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/SECURITY.md +15 -0
  7. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/SPEC.md +6 -1
  8. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/from-claude-p.md +14 -14
  9. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/guides/doctor.md +40 -2
  10. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/guides/prompt_caching.md +0 -1
  11. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/guides/runtime_capability_matrix.md +12 -8
  12. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/guides/setup.md +0 -1
  13. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/guides/unified_skill_spec.md +1 -1
  14. oacp_cli-0.4.0/docs/guides/versioning.md +65 -0
  15. oacp_cli-0.4.0/docs/protocol/autonomy.md +888 -0
  16. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/protocol/inbox_outbox.md +82 -10
  17. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/protocol/mcp_integration.md +2 -2
  18. oacp_cli-0.4.0/docs/protocol/message_signing.md +212 -0
  19. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/protocol/review_loop.md +1 -1
  20. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/protocol/runtime_capabilities.md +5 -4
  21. oacp_cli-0.4.0/examples/demo-workspace/README.md +118 -0
  22. oacp_cli-0.4.0/examples/demo-workspace/org-memory/decisions.md +13 -0
  23. oacp_cli-0.4.0/examples/demo-workspace/org-memory/events/20260504-093015-postgres-over-dynamodb.md +14 -0
  24. oacp_cli-0.4.0/examples/demo-workspace/org-memory/events/20260508-141220-utc-timestamps-pr-review.md +13 -0
  25. oacp_cli-0.4.0/examples/demo-workspace/org-memory/events/20260515-102045-utc-timestamps-webhooks.md +13 -0
  26. oacp_cli-0.4.0/examples/demo-workspace/org-memory/events/20260521-163330-utc-timestamps-rule-proposal.md +15 -0
  27. oacp_cli-0.4.0/examples/demo-workspace/org-memory/events/20260527-110500-idempotency-keys-merged.md +13 -0
  28. oacp_cli-0.4.0/examples/demo-workspace/org-memory/events/20260602-090210-parcel-api-v020-released.md +13 -0
  29. oacp_cli-0.4.0/examples/demo-workspace/org-memory/recent.md +25 -0
  30. oacp_cli-0.4.0/examples/demo-workspace/org-memory/rules.md +17 -0
  31. oacp_cli-0.4.0/examples/demo-workspace/projects/parcel-api/memory/archive/2026-05-21-csv-export-timeouts.md +30 -0
  32. oacp_cli-0.4.0/examples/demo-workspace/projects/parcel-api/memory/decision_log.md +21 -0
  33. oacp_cli-0.4.0/examples/demo-workspace/projects/parcel-api/memory/known_debt.md +11 -0
  34. oacp_cli-0.4.0/examples/demo-workspace/projects/parcel-api/memory/open_threads.md +23 -0
  35. oacp_cli-0.4.0/examples/demo-workspace/projects/parcel-api/memory/project_facts.md +21 -0
  36. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/mcp_servers/oacp_coordinator.py +4 -0
  37. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/oacp/cli.py +17 -0
  38. oacp_cli-0.4.0/oacp/envelope_hook.py +24 -0
  39. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/pyproject.toml +15 -1
  40. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/_oacp_constants.py +32 -1
  41. oacp_cli-0.4.0/scripts/autonomy_gate.py +1601 -0
  42. oacp_cli-0.4.0/scripts/claude_envelope_hook.py +1464 -0
  43. oacp_cli-0.4.0/scripts/envelope_compiler.py +373 -0
  44. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/init_project_workspace.py +12 -16
  45. oacp_cli-0.4.0/scripts/key_cli.py +120 -0
  46. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/memory_sync.py +47 -10
  47. oacp_cli-0.4.0/scripts/message_signing.py +775 -0
  48. oacp_cli-0.4.0/scripts/message_verify.py +673 -0
  49. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/oacp_doctor.py +109 -12
  50. oacp_cli-0.4.0/scripts/record_autonomy_outcome.py +380 -0
  51. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/send_inbox_message.py +119 -3
  52. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/setup_runtime.py +15 -2
  53. oacp_cli-0.4.0/scripts/trust_cli.py +258 -0
  54. oacp_cli-0.4.0/scripts/trust_root.py +780 -0
  55. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/update_workspace.sh +17 -12
  56. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/validate_message.py +93 -2
  57. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/inbox_message.template.yaml +6 -0
  58. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/receiver_config.template.yaml +7 -2
  59. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/README.md +7 -0
  60. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/actuals/checkpoint_breach.yaml +3 -0
  61. oacp_cli-0.4.0/tests/conformance/autonomy/actuals/declaration_error.yaml +9 -0
  62. oacp_cli-0.4.0/tests/conformance/autonomy/actuals/declaration_intent.yaml +13 -0
  63. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/actuals/top_level_side_effect_keys.yaml +2 -0
  64. oacp_cli-0.4.0/tests/conformance/autonomy/audits/prior_thread_grant_approved.yaml +48 -0
  65. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/configs/always_pause.yaml +2 -2
  66. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/configs/auto_review_continuation_enabled.yaml +1 -1
  67. oacp_cli-0.3.4/tests/conformance/autonomy/configs/auto_review_standard.yaml → oacp_cli-0.4.0/tests/conformance/autonomy/configs/auto_review_external_pause.yaml +1 -1
  68. oacp_cli-0.4.0/tests/conformance/autonomy/configs/auto_review_standard.yaml +17 -0
  69. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/always_pause_task.yaml +3 -0
  70. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/brainstorm_side_effect_verbs_auto_accepts.yaml +1 -0
  71. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/checkpoint_breach_pauses.yaml +4 -0
  72. oacp_cli-0.4.0/tests/conformance/autonomy/expected/clean_auto_review_task.yaml +29 -0
  73. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/continuation_grant_disabled_pauses.yaml +1 -1
  74. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/continuation_grant_drift_pauses.yaml +3 -0
  75. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/continuation_grant_enabled_auto_accepts.yaml +4 -0
  76. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/continuation_grant_external_uncovered_pauses.yaml +6 -1
  77. oacp_cli-0.4.0/tests/conformance/autonomy/expected/declaration_error_pauses.yaml +26 -0
  78. oacp_cli-0.4.0/tests/conformance/autonomy/expected/declaration_intent_checkpoint_pauses.yaml +34 -0
  79. oacp_cli-0.4.0/tests/conformance/autonomy/expected/declared_destructive_ops_pauses.yaml +11 -0
  80. oacp_cli-0.4.0/tests/conformance/autonomy/expected/guardrails_fence_auto_accepts.yaml +23 -0
  81. oacp_cli-0.4.0/tests/conformance/autonomy/expected/hard_stop_masking_threshold_pauses.yaml +14 -0
  82. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/hard_stop_rm_rf_pauses.yaml +3 -0
  83. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/hard_stop_sensitive_commercial_pauses.yaml +1 -1
  84. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/hard_stop_sensitive_pricing_pauses.yaml +1 -1
  85. oacp_cli-0.4.0/tests/conformance/autonomy/expected/lexical_declared_false_auto_accepts.yaml +19 -0
  86. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/malformed_config_pauses.yaml +3 -0
  87. oacp_cli-0.3.4/tests/conformance/autonomy/expected/clean_auto_review_task.yaml → oacp_cli-0.4.0/tests/conformance/autonomy/expected/minutes_45_auto_accepts.yaml +2 -2
  88. oacp_cli-0.4.0/tests/conformance/autonomy/expected/minutes_46_pauses.yaml +10 -0
  89. oacp_cli-0.4.0/tests/conformance/autonomy/expected/negated_guardrails_auto_accepts.yaml +20 -0
  90. oacp_cli-0.4.0/tests/conformance/autonomy/expected/private_issue_artifacts_auto_accepts.yaml +21 -0
  91. oacp_cli-0.4.0/tests/conformance/autonomy/expected/private_pr_artifacts_auto_accepts.yaml +15 -0
  92. oacp_cli-0.4.0/tests/conformance/autonomy/expected/private_pr_with_merge_pauses.yaml +13 -0
  93. oacp_cli-0.4.0/tests/conformance/autonomy/expected/public_pr_artifacts_pause.yaml +10 -0
  94. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/side_effect_booleans_pause.yaml +1 -1
  95. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/top_level_side_effect_actuals_ignored.yaml +1 -0
  96. oacp_cli-0.4.0/tests/conformance/autonomy/messages/declared_destructive_ops.yaml +21 -0
  97. oacp_cli-0.4.0/tests/conformance/autonomy/messages/guardrails_fence.yaml +24 -0
  98. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/hard_stop_external_side_effects.yaml +1 -1
  99. oacp_cli-0.4.0/tests/conformance/autonomy/messages/hard_stop_masking_threshold.yaml +20 -0
  100. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/hard_stop_sensitive_scope.yaml +1 -1
  101. oacp_cli-0.4.0/tests/conformance/autonomy/messages/lexical_declared_false.yaml +21 -0
  102. oacp_cli-0.4.0/tests/conformance/autonomy/messages/minutes_45.yaml +20 -0
  103. oacp_cli-0.4.0/tests/conformance/autonomy/messages/minutes_46.yaml +20 -0
  104. oacp_cli-0.4.0/tests/conformance/autonomy/messages/negated_guardrails.yaml +21 -0
  105. oacp_cli-0.4.0/tests/conformance/autonomy/messages/private_issue_artifacts.yaml +27 -0
  106. oacp_cli-0.4.0/tests/conformance/autonomy/messages/private_pr_artifacts.yaml +25 -0
  107. oacp_cli-0.4.0/tests/conformance/autonomy/messages/private_pr_with_merge.yaml +26 -0
  108. oacp_cli-0.4.0/tests/conformance/autonomy/messages/public_pr_artifacts.yaml +25 -0
  109. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/sensitive_commercial.yaml +5 -1
  110. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/sensitive_config.yaml +1 -1
  111. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/sensitive_credentials.yaml +1 -1
  112. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/sensitive_pricing.yaml +1 -1
  113. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/sensitive_secret.yaml +1 -1
  114. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/side_effect_before_sensitive.yaml +2 -2
  115. oacp_cli-0.4.0/tests/conformance/envelope/README.md +47 -0
  116. oacp_cli-0.4.0/tests/conformance/envelope/configs/auto_review_standard.yaml +17 -0
  117. oacp_cli-0.4.0/tests/conformance/envelope/configs/malformed.yaml +2 -0
  118. oacp_cli-0.4.0/tests/conformance/envelope/expected/clean_pr_task_compiles.yaml +31 -0
  119. oacp_cli-0.4.0/tests/conformance/envelope/expected/docs_only_task_compiles.yaml +29 -0
  120. oacp_cli-0.4.0/tests/conformance/envelope/expected/granular_capabilities_compile.yaml +31 -0
  121. oacp_cli-0.4.0/tests/conformance/envelope/expected/invalid_numeric_fails.yaml +6 -0
  122. oacp_cli-0.4.0/tests/conformance/envelope/expected/malformed_config_fails.yaml +6 -0
  123. oacp_cli-0.4.0/tests/conformance/envelope/expected/missing_profile_fails.yaml +6 -0
  124. oacp_cli-0.4.0/tests/conformance/envelope/expected/unparsable_profile_fails.yaml +6 -0
  125. oacp_cli-0.4.0/tests/conformance/envelope/messages/clean_pr_task.yaml +25 -0
  126. oacp_cli-0.4.0/tests/conformance/envelope/messages/docs_only_task.yaml +20 -0
  127. oacp_cli-0.4.0/tests/conformance/envelope/messages/granular_capabilities_task.yaml +28 -0
  128. oacp_cli-0.4.0/tests/conformance/envelope/messages/invalid_numeric.yaml +20 -0
  129. oacp_cli-0.4.0/tests/conformance/envelope/messages/missing_profile.yaml +10 -0
  130. oacp_cli-0.4.0/tests/conformance/envelope/messages/unparsable_profile.yaml +14 -0
  131. oacp_cli-0.4.0/tests/conformance/signing/README.md +87 -0
  132. oacp_cli-0.4.0/tests/conformance/signing/expected/signed_basic.yaml +29 -0
  133. oacp_cli-0.4.0/tests/conformance/signing/expected/signed_lookalike.yaml +29 -0
  134. oacp_cli-0.4.0/tests/conformance/signing/expected/signed_multisig.yaml +34 -0
  135. oacp_cli-0.4.0/tests/conformance/signing/expected/signed_revoked.yaml +28 -0
  136. oacp_cli-0.4.0/tests/conformance/signing/expected/tamper_auth_alias.yaml +27 -0
  137. oacp_cli-0.4.0/tests/conformance/signing/expected/tamper_body_flip.yaml +25 -0
  138. oacp_cli-0.4.0/tests/conformance/signing/expected/tamper_container_reformat.yaml +27 -0
  139. oacp_cli-0.4.0/tests/conformance/signing/expected/tamper_crlf_trailer.yaml +25 -0
  140. oacp_cli-0.4.0/tests/conformance/signing/expected/tamper_header_reencode.yaml +25 -0
  141. oacp_cli-0.4.0/tests/conformance/signing/expected/tamper_identity_mismatch.yaml +29 -0
  142. oacp_cli-0.4.0/tests/conformance/signing/expected/tamper_indented_trailer.yaml +21 -0
  143. oacp_cli-0.4.0/tests/conformance/signing/expected/tamper_kid_alias.yaml +27 -0
  144. oacp_cli-0.4.0/tests/conformance/signing/expected/tamper_kid_cross_agent.yaml +25 -0
  145. oacp_cli-0.4.0/tests/conformance/signing/expected/tamper_kid_unknown.yaml +26 -0
  146. oacp_cli-0.4.0/tests/conformance/signing/expected/tamper_missing_final_lf.yaml +25 -0
  147. oacp_cli-0.4.0/tests/conformance/signing/expected/tamper_padded_b64.yaml +26 -0
  148. oacp_cli-0.4.0/tests/conformance/signing/expected/tamper_sig_alias.yaml +28 -0
  149. oacp_cli-0.4.0/tests/conformance/signing/expected/tamper_sig_corrupt.yaml +25 -0
  150. oacp_cli-0.4.0/tests/conformance/signing/expected/tamper_trailer_transplant.yaml +29 -0
  151. oacp_cli-0.4.0/tests/conformance/signing/expected/tamper_trailing_blank_line.yaml +25 -0
  152. oacp_cli-0.4.0/tests/conformance/signing/expected/tamper_trailing_space.yaml +25 -0
  153. oacp_cli-0.4.0/tests/conformance/signing/expected/unsigned_notification.yaml +21 -0
  154. oacp_cli-0.4.0/tests/conformance/signing/keys/alice.json +12 -0
  155. oacp_cli-0.4.0/tests/conformance/signing/keys/bob.json +12 -0
  156. oacp_cli-0.4.0/tests/conformance/signing/keys/carol.json +12 -0
  157. oacp_cli-0.4.0/tests/conformance/signing/messages/signed_basic.prefix.yaml +11 -0
  158. oacp_cli-0.4.0/tests/conformance/signing/messages/signed_basic.yaml +12 -0
  159. oacp_cli-0.4.0/tests/conformance/signing/messages/signed_lookalike.prefix.yaml +11 -0
  160. oacp_cli-0.4.0/tests/conformance/signing/messages/signed_lookalike.yaml +12 -0
  161. oacp_cli-0.4.0/tests/conformance/signing/messages/signed_multisig.prefix.yaml +10 -0
  162. oacp_cli-0.4.0/tests/conformance/signing/messages/signed_multisig.yaml +11 -0
  163. oacp_cli-0.4.0/tests/conformance/signing/messages/signed_revoked.prefix.yaml +8 -0
  164. oacp_cli-0.4.0/tests/conformance/signing/messages/signed_revoked.yaml +9 -0
  165. oacp_cli-0.4.0/tests/conformance/signing/messages/tamper_auth_alias.yaml +12 -0
  166. oacp_cli-0.4.0/tests/conformance/signing/messages/tamper_body_flip.yaml +12 -0
  167. oacp_cli-0.4.0/tests/conformance/signing/messages/tamper_container_reformat.yaml +12 -0
  168. oacp_cli-0.4.0/tests/conformance/signing/messages/tamper_crlf_trailer.yaml +12 -0
  169. oacp_cli-0.4.0/tests/conformance/signing/messages/tamper_header_reencode.yaml +12 -0
  170. oacp_cli-0.4.0/tests/conformance/signing/messages/tamper_identity_mismatch.prefix.yaml +8 -0
  171. oacp_cli-0.4.0/tests/conformance/signing/messages/tamper_identity_mismatch.yaml +9 -0
  172. oacp_cli-0.4.0/tests/conformance/signing/messages/tamper_indented_trailer.yaml +12 -0
  173. oacp_cli-0.4.0/tests/conformance/signing/messages/tamper_kid_alias.yaml +12 -0
  174. oacp_cli-0.4.0/tests/conformance/signing/messages/tamper_kid_cross_agent.yaml +12 -0
  175. oacp_cli-0.4.0/tests/conformance/signing/messages/tamper_kid_unknown.yaml +12 -0
  176. oacp_cli-0.4.0/tests/conformance/signing/messages/tamper_missing_final_lf.yaml +12 -0
  177. oacp_cli-0.4.0/tests/conformance/signing/messages/tamper_padded_b64.yaml +12 -0
  178. oacp_cli-0.4.0/tests/conformance/signing/messages/tamper_sig_alias.yaml +12 -0
  179. oacp_cli-0.4.0/tests/conformance/signing/messages/tamper_sig_corrupt.yaml +12 -0
  180. oacp_cli-0.4.0/tests/conformance/signing/messages/tamper_trailer_transplant.yaml +12 -0
  181. oacp_cli-0.4.0/tests/conformance/signing/messages/tamper_trailing_blank_line.yaml +13 -0
  182. oacp_cli-0.4.0/tests/conformance/signing/messages/tamper_trailing_space.yaml +12 -0
  183. oacp_cli-0.4.0/tests/conformance/signing/messages/unsigned_notification.yaml +10 -0
  184. oacp_cli-0.4.0/tests/conformance/signing/pins/allowed_signers.yaml +31 -0
  185. oacp_cli-0.4.0/tests/conformance/signing/regen_fixtures.py +794 -0
  186. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_autonomy_conformance_fixtures.py +11 -0
  187. oacp_cli-0.4.0/tests/test_autonomy_gate.py +831 -0
  188. oacp_cli-0.4.0/tests/test_claude_envelope_hook.py +1453 -0
  189. oacp_cli-0.4.0/tests/test_envelope_compiler.py +323 -0
  190. oacp_cli-0.4.0/tests/test_envelope_conformance_fixtures.py +97 -0
  191. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_init_project_workspace.py +20 -1
  192. oacp_cli-0.4.0/tests/test_memory_sync.py +302 -0
  193. oacp_cli-0.4.0/tests/test_message_signing.py +799 -0
  194. oacp_cli-0.4.0/tests/test_message_verify.py +820 -0
  195. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_oacp_cli.py +39 -0
  196. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_oacp_coordinator.py +28 -0
  197. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_oacp_doctor.py +158 -2
  198. oacp_cli-0.4.0/tests/test_record_autonomy_outcome.py +558 -0
  199. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_send_inbox_message.py +10 -10
  200. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_setup_runtime.py +22 -0
  201. oacp_cli-0.4.0/tests/test_signing_conformance.py +364 -0
  202. oacp_cli-0.4.0/tests/test_trust_root.py +770 -0
  203. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_validate_message.py +51 -0
  204. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_workspace_discovery.py +12 -10
  205. oacp_cli-0.3.4/CHANGELOG.md +0 -208
  206. oacp_cli-0.3.4/docs/guides/versioning.md +0 -34
  207. oacp_cli-0.3.4/docs/protocol/autonomy.md +0 -323
  208. oacp_cli-0.3.4/scripts/autonomy_gate.py +0 -822
  209. oacp_cli-0.3.4/tests/test_autonomy_gate.py +0 -177
  210. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/.github/workflows/release.yml +0 -0
  211. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/.gitignore +0 -0
  212. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/CONTRIBUTING.md +0 -0
  213. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/LICENSE +0 -0
  214. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/Makefile +0 -0
  215. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/QUICKSTART.md +0 -0
  216. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/guides/adoption.md +0 -0
  217. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/img/oacp-cli-demo.png +0 -0
  218. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/img/oacp-filesystem-tree.png +0 -0
  219. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/img/oacp-fleet-thread.png +0 -0
  220. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/protocol/agent_profiles.md +0 -0
  221. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/protocol/agent_safety_defaults.md +0 -0
  222. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/protocol/credential_scoping.md +0 -0
  223. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/protocol/cross_runtime_sync.md +0 -0
  224. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/protocol/dispatch_states.yaml +0 -0
  225. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/protocol/multi_agent_shared_workspace.md +0 -0
  226. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/protocol/org_memory.md +0 -0
  227. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/protocol/packet_states.yaml +0 -0
  228. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/protocol/session_init.md +0 -0
  229. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/protocol/skills_manifest.yaml +0 -0
  230. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/protocol/task_negotiation.md +0 -0
  231. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/examples/quickstart/README.md +0 -0
  232. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/oacp/__init__.py +0 -0
  233. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/_oacp_env.py +0 -0
  234. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/add_agent.py +0 -0
  235. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/agent_profile.py +0 -0
  236. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/check_quality_gate.py +0 -0
  237. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/codex_session_init.py +0 -0
  238. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/create_handoff_packet.py +0 -0
  239. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/handoff_schema.py +0 -0
  240. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/init_org_memory.py +0 -0
  241. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/init_packet.sh +0 -0
  242. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/init_project_workspace.sh +0 -0
  243. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/memory_archive_common.py +0 -0
  244. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/memory_cli.py +0 -0
  245. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/normalize_findings.py +0 -0
  246. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/oacp_inbox.py +0 -0
  247. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/oacp_watch.py +0 -0
  248. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/preflight.py +0 -0
  249. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/promote_to_archive.py +0 -0
  250. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/restore_from_archive.py +0 -0
  251. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/session_lifecycle_hooks.py +0 -0
  252. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/validate_agent_card.py +0 -0
  253. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/write_event.py +0 -0
  254. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/agent_card.template.yaml +0 -0
  255. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/agent_profile.template.yaml +0 -0
  256. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/agent_status.template.yaml +0 -0
  257. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/checkpoint.template.md +0 -0
  258. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/claude/agents/role_agent.template.md +0 -0
  259. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/claude/rules/guardrail.template.md +0 -0
  260. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/findings_packet.template.yaml +0 -0
  261. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/github_actions_quality_gate.yaml +0 -0
  262. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/guardrails/coding_standards.template.md +0 -0
  263. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/guardrails/safe_commands.template.md +0 -0
  264. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/guardrails/secrets_rules.template.md +0 -0
  265. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/handoff_packet.template.yaml +0 -0
  266. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/manual_validation.template.md +0 -0
  267. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/merge_decision.template.md +0 -0
  268. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/org-memory/decisions.md +0 -0
  269. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/org-memory/events/.gitkeep +0 -0
  270. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/org-memory/events/20260317-170120-example-api-convention.md +0 -0
  271. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/org-memory/recent.md +0 -0
  272. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/org-memory/rules.md +0 -0
  273. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/review_packet.template.md +0 -0
  274. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/roles/role_baseline.template.md +0 -0
  275. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/roles/role_definition.template.yaml +0 -0
  276. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/runtime_capabilities.yaml +0 -0
  277. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/skills_manifest.template.yaml +0 -0
  278. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/test_packet.template.md +0 -0
  279. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/actuals/continuation_drift.yaml +0 -0
  280. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/actuals/continuation_within.yaml +0 -0
  281. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/configs/auto_review_tight.yaml +0 -0
  282. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/configs/malformed_config.yaml +0 -0
  283. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/ambiguous_scope_pauses.yaml +0 -0
  284. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/brainstorm_destructive_pauses.yaml +0 -0
  285. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/brainstorm_without_profile_auto_accepts.yaml +0 -0
  286. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/continuation_grant_destructive_pauses.yaml +0 -0
  287. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/expired_message_pauses.yaml +0 -0
  288. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/hard_stop_dangerously_skip_permissions_pauses.yaml +0 -0
  289. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/hard_stop_external_side_effects_pauses.yaml +0 -0
  290. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/hard_stop_force_pauses.yaml +0 -0
  291. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/hard_stop_no_verify_pauses.yaml +0 -0
  292. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/hard_stop_no_verify_upper_pauses.yaml +0 -0
  293. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/hard_stop_sensitive_config_pauses.yaml +0 -0
  294. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/hard_stop_sensitive_credentials_pauses.yaml +0 -0
  295. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/hard_stop_sensitive_memory_ssot_pauses.yaml +0 -0
  296. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/hard_stop_sensitive_public_repo_pauses.yaml +0 -0
  297. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/hard_stop_sensitive_scope_pauses.yaml +0 -0
  298. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/hard_stop_sensitive_secret_pauses.yaml +0 -0
  299. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/hard_stop_side_effect_before_sensitive_pauses.yaml +0 -0
  300. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/invalid_message_pauses.yaml +0 -0
  301. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/missing_task_profile_pauses.yaml +0 -0
  302. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/path_like_deploy_auto_accepts.yaml +0 -0
  303. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/risk_obvious_no_profile_pauses.yaml +0 -0
  304. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/threshold_breach_pauses.yaml +0 -0
  305. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/tight_threshold_pauses.yaml +0 -0
  306. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/unparsable_task_profile_pauses.yaml +0 -0
  307. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/ambiguous_scope.yaml +0 -0
  308. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/brainstorm_destructive.yaml +0 -0
  309. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/brainstorm_side_effect_verbs.yaml +0 -0
  310. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/brainstorm_without_profile.yaml +0 -0
  311. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/clean_task.yaml +0 -0
  312. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/continuation_grant.yaml +0 -0
  313. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/continuation_grant_destructive.yaml +0 -0
  314. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/continuation_grant_external_uncovered.yaml +0 -0
  315. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/expired_message.yaml +0 -0
  316. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/hard_stop_dangerously_skip_permissions.yaml +0 -0
  317. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/hard_stop_force.yaml +0 -0
  318. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/hard_stop_no_verify.yaml +0 -0
  319. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/hard_stop_no_verify_upper.yaml +0 -0
  320. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/hard_stop_rm_rf.yaml +0 -0
  321. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/invalid_message.yaml +0 -0
  322. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/missing_task_profile.yaml +0 -0
  323. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/path_like_deploy.yaml +0 -0
  324. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/risk_obvious_no_profile.yaml +0 -0
  325. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/sensitive_memory_ssot.yaml +0 -0
  326. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/sensitive_public_repo.yaml +0 -0
  327. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/side_effect_booleans.yaml +0 -0
  328. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/threshold_breach.yaml +0 -0
  329. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/unparsable_task_profile.yaml +0 -0
  330. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_add_agent.py +0 -0
  331. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_agent_profile.py +0 -0
  332. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_codex_session_init.py +0 -0
  333. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_create_handoff_packet.py +0 -0
  334. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_github_workflows.py +0 -0
  335. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_handoff_schema.py +0 -0
  336. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_memory_archive.py +0 -0
  337. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_oacp_constants.py +0 -0
  338. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_oacp_env.py +0 -0
  339. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_oacp_inbox.py +0 -0
  340. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_oacp_watch.py +0 -0
  341. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_preflight.py +0 -0
  342. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_review_loop.py +0 -0
  343. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_session_lifecycle_hooks.py +0 -0
  344. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_update_workspace.py +0 -0
  345. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_validate_agent_card.py +0 -0
  346. {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_write_event.py +0 -0
@@ -0,0 +1,11 @@
1
+ # The signing conformance corpus is byte-exact: EOL conversion or any
2
+ # checkout filter would silently break the pinned digests (several vectors
3
+ # are deliberate CRLF / trailing-whitespace artifacts).
4
+ tests/conformance/signing/messages/** -text
5
+
6
+ # Narrow whitespace-diagnostic exemptions for the three vectors whose test
7
+ # data IS the whitespace violation — keeps `git diff --check` clean without
8
+ # masking the rest of the corpus.
9
+ tests/conformance/signing/messages/tamper_crlf_trailer.yaml whitespace=-trailing-space
10
+ tests/conformance/signing/messages/tamper_trailing_space.yaml whitespace=-trailing-space
11
+ tests/conformance/signing/messages/tamper_trailing_blank_line.yaml whitespace=-blank-at-eof
@@ -30,7 +30,7 @@ jobs:
30
30
  - name: Install Python dependencies
31
31
  run: |
32
32
  python -m pip install --upgrade pip
33
- python -m pip install -e . build pytest ruff
33
+ python -m pip install -e ".[crypto]" build pytest ruff
34
34
 
35
35
  - name: Run quality gate
36
36
  run: make preflight ARGS="--full"
@@ -0,0 +1,555 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [0.4.0] - 2026-07-17
9
+
10
+ ### Added
11
+
12
+ - Task-profile granulars `merges_pr` and `files_issues`: senders can now
13
+ declare PR-landing authority and issue-filing (issue create/edit/close
14
+ plus label creation) as first-class capabilities. The envelope compiler
15
+ embeds both as constraints, and the Claude adapter's gh classifier
16
+ consults them before its deny classes — `gh pr merge` requires a
17
+ declared `merges_pr`, `gh issue create/edit/close` and `gh label
18
+ create` require a declared `files_issues`, both still subject to the
19
+ repo allowlist/visibility gate. That gate judges the repository gh will
20
+ actually mutate: every repository selector on the command (each
21
+ `-R/--repo` occurrence, any URL-shaped positional, and the *effective*
22
+ `GH_REPO` environment — ambient hook-process values seeded first,
23
+ inline assignments applied with shell precedence) must agree on a
24
+ single repository, any effective `GH_HOST` escalates, and the allow
25
+ classes are judged only as standalone simple commands (an earlier
26
+ compound segment could retarget them) — so neither a positional URL, a
27
+ repeated flag, an inline or pre-session environment assignment, nor
28
+ prior shell state can retarget an approved command.
29
+ Under the `allow_pr_artifacts` policy,
30
+ `files_issues` joins the private-repository artifact class (an
31
+ issue-filing deliverable on an allowlisted repo can auto-accept), while
32
+ a declared `merges_pr` always pauses at admission (`merges_pr_pause`)
33
+ so merge authority passes a human at least once; a human-approved
34
+ continuation grant may cover it — and a profile that declares
35
+ `merges_pr` routes the lexical `merge` verb to that granular path
36
+ instead of the blanket hard stop (undeclared merge wording still hard
37
+ stops). The declarable keys, the grant-coverable keys, and the
38
+ checkpoint's `side_effects_actual` keys are now the same set by
39
+ construction — the checkpoint can no longer observe a capability the
40
+ schema cannot declare.
41
+ - `oacp trust revoke <kid> --project <name> (--agent <receiver> |
42
+ --all-receivers)`: revocation is no longer a hand-edit of
43
+ `allowed_signers.yaml`. The revoke validates the kid's canonical
44
+ spelling up front, loads pins through the full integrity check, flips
45
+ the entry to `status: revoked` while keeping the key material in place
46
+ (the reader re-validates retained jwks, so a later manual reactivation
47
+ cannot smuggle swapped material), and re-emits the file canonically
48
+ under the project trust lock. An unknown kid is refused — revoke never
49
+ creates entries — and re-revoking reports `unchanged` so fleet
50
+ compromise response is safely re-runnable. `--all-receivers` is
51
+ all-or-nothing: receivers are enumerated under the lock and every
52
+ target is loaded and integrity-validated before any pin is written, so
53
+ a malformed receiver file fails the whole command with zero pins
54
+ changed.
55
+ - Checkpoint pause instrumentation: a breached `threshold_checkpoint` now
56
+ stamps `paused_at_utc` (when the checkpoint fired — receivers pass the
57
+ actual pause moment in the checkpoint actuals, with the evaluation time
58
+ as fallback) and `breach_basis: declared_intent | realized`, so
59
+ prospective declaration-correction pauses (caught before the undeclared
60
+ action materialized) are distinguishable from realized drift. The
61
+ prospective shape has its own validated input — receivers pass the
62
+ invalidated declaration paths in `actuals.declared_intent_fields`,
63
+ which breach the checkpoint directly while every realized effect stays
64
+ false, with `predicted_risk_materialized` pinned false (caught before
65
+ materialization by definition). The vocabulary is the monotone risky
66
+ capability booleans (the restrictive `sends_oacp_reply_only` is
67
+ excluded), and the two shapes are mutually exclusive on derived sources
68
+ as well as the explicit basis: intent fields mixed with a realized
69
+ breach source, with any true realized effect, or naming a capability
70
+ already authorized by the envelope or an accepted continuation grant
71
+ are rejected before an ambiguous record can be written.
72
+ - Audit records gain `co_occurring_reason_codes`: numeric Gate-2
73
+ thresholds are evaluated before any early-out, so a pause taken for
74
+ another reason (most commonly a lexical hard stop) still records a
75
+ co-occurring threshold breach. Silence in a pause record now means the
76
+ thresholds passed, never that they went unevaluated — previously a
77
+ hard-stopped dispatch with a breached declaration was invisible to
78
+ threshold-calibration analytics.
79
+ - `oacp init --oacp-dir`: the workspace initializer accepts the same
80
+ explicit home override as its sibling subcommands (key/trust/verify/
81
+ doctor/send/envelope), making scripted scratch-workspace setups
82
+ stateless.
83
+ - Trust-root drift: `oacp doctor` surfaces cataloged-but-unpinned
84
+ identities as the advisory code `catalog-not-pinned`, escalating to warn
85
+ when the identity is live (another receiver pins it, or the receiver's
86
+ inbox holds traffic from that agent). Pinning stays optional — the
87
+ advisory makes the verification-enablement gap visible instead of
88
+ reporting a clean trust root beside `signed-unknown-kid` annotations.
89
+ - Autonomy gate: the evaluator self-stamps provenance (`source`,
90
+ `content_sha256` of its own file bytes, best-effort `git_sha`,
91
+ `executed: true`) into every decision it returns; receivers copy the
92
+ block verbatim into audit records instead of composing an `evaluator`
93
+ field by hand.
94
+ - Signing conformance: new `tamper_kid_alias` vector pins that a
95
+ non-canonical kid spelling in the protected header fails verification
96
+ as `signed-INVALID` (framing), and the `tamper_kid_unknown` vector now
97
+ uses a canonical unknown-kid spelling.
98
+ - Receiver audit stamping documented: `oacp verify --attach-audit` is the
99
+ one supported path for recording `message_auth` into autonomy audit
100
+ records; the canonical `result.message_auth` location and block shape
101
+ are pinned in the signing protocol doc (hand-written blocks are the
102
+ anti-pattern).
103
+
104
+ - Message signing, sender half: signed messages carry a single final-line detached-JWS
105
+ `auth` trailer over the exact raw prefix bytes (no canonicalization,
106
+ EdDSA-only locked JOSE profile, `crit:oacp`, RFC 7638 `kid`, agent +
107
+ machine-instance URN identity, 1-8 signature rotation overlap).
108
+ `oacp key gen`/`oacp key list` manage dedicated Ed25519 keys under
109
+ `$OACP_HOME/keys/` (0700/0600, never synced) with public catalog stubs
110
+ for the upcoming trust-import flow. `oacp send` signs when the sender's
111
+ `signing.sign_messages` config knob or `--sign` is set (default off;
112
+ unsigned fleets are unaffected), via render-unsigned-once →
113
+ append-once → atomic write. The message validator accepts the `auth`
114
+ field with strict structural framing checks (final-physical-line rule,
115
+ bounded container, locked header profile). Signing requires the new
116
+ optional `crypto` extra (`pip install 'oacp-cli[crypto]'`).
117
+ - Message verification, receiver half: `oacp verify` and the `message_verify` library implement
118
+ verify-before-parse — strict last-line trailer extraction from raw bytes,
119
+ bounded structural checks, EdDSA verification over the exact raw prefix
120
+ against **receiver-local pins only** (no network at verify time), then an
121
+ identity cross-check on the verified prefix. Warn mode records identity
122
+ and grants no authority: unsigned / signed-unknown-kid / signed-verified /
123
+ signed-INVALID each produce an annotation and a `message_auth` audit
124
+ block (additive to schema v2, recorded like `human_outcome`), never a
125
+ rejection. Byte-tamper cases write a no-clobber evidence copy aside into
126
+ `dead_letter/` without touching the original message. The
127
+ `signing.verify_mode: off|warn` receiver knob defaults off; receivers
128
+ without it behave exactly as today. The pin reader is a minimal stub of
129
+ the `allowed_signers.yaml` format (versioned, `domain`/`instance`
130
+ columns reserved from day one) and stays swappable. Verification requires
131
+ the optional `crypto` extra.
132
+ - Trust root:
133
+ `oacp trust import` records a `<kid>.pub.json` stub from `oacp key gen`
134
+ in the project's **zero-authority** distribution catalog
135
+ (`projects/<p>/trust/catalog.yaml` — identity recorded, nothing granted)
136
+ and pins it `active` in the receiver's own `allowed_signers.yaml`, the
137
+ only file consulted at verify time. Import is integrity-checked (`kid`
138
+ must be the RFC 7638 thumbprint of its `jwk`; `x` must strictly decode
139
+ to a 32-byte Ed25519 public key; private components refused;
140
+ same-`kid` conflicts refused; a `revoked` pin is never reactivated),
141
+ validates project and receiver names with containment checks so trust
142
+ files can never be written outside the selected project, serializes the
143
+ whole catalog-then-pins transaction on a stable project trust lock so
144
+ concurrent imports cannot drop each other's entries, upgrades
145
+ same-identity entries that predate the reserved columns in place, and
146
+ works without the `crypto` extra. `oacp trust list` inspects both
147
+ files. `oacp doctor --project <name>` gains a Trust Root category:
148
+ pinned-but-not-cataloged identities warn, unreadable or
149
+ integrity-failing trust files error, unpinned catalog identities are
150
+ the normal resting state. The `allowed_signers.yaml` reader is
151
+ finalized as the canonical format-v1 reader and is itself the verify
152
+ boundary: it enforces the strict public-only JWK profile and recomputes
153
+ the `kid` thumbprint, so bad or private key material makes the file
154
+ unusable rather than silently trusted (reserved `domain`/`instance`
155
+ columns shape-checked, semantics deferred) — still the single swap
156
+ point.
157
+ Non-normative warn-mode seam + key-management docs land in
158
+ `docs/protocol/message_signing.md` (same-UID caveat stated; keystore
159
+ hardening — OS keychain / vault backends behind the same `kid` seam —
160
+ is planned v0.4.1+ follow-up).
161
+ - Signing conformance corpus (`tests/conformance/signing/`): byte-exact
162
+ golden fixtures pin the auth-trailer boundary, the signed prefix bytes,
163
+ and the RFC 7515 signing inputs across both parse paths (framing
164
+ splitter and receiver tri-state classifier, plus the validator
165
+ cross-check), with published fixture keys and receiver pins. A
166
+ tamper-detection suite covers payload byte flips, trailer transplant
167
+ between messages, signature corruption, kid substitution (unknown,
168
+ cross-agent, and re-encoded-header flavors), whitespace/EOL edges
169
+ at the trailer boundary (CRLF, trailing blank line, missing final LF,
170
+ trailing space, padded base64url, indented lookalike), and encoding
171
+ aliases (pad-bit spellings of the signature member and the outer auth
172
+ value, non-compact container emit). Goldens
173
+ regenerate deterministically (`regen_fixtures.py`, README documents
174
+ that a golden change is a wire-format change requiring a ruling), and
175
+ the runner re-signs every golden and regenerates the whole corpus in
176
+ CI so behavior drift against the committed contract fails loudly.
177
+ - Canonical trailer encodings: the auth trailer value and each
178
+ `signatures[].signature` member must be the canonical unpadded
179
+ base64url spelling of their bytes (a canonical round-trip check at the
180
+ shared framing boundary — the same single-choke-point pattern as the
181
+ trust-file JWK `x` validator, now shared as
182
+ `b64url_decode_canonical`), and the auth container JSON must be the
183
+ signer's compact sorted-key emit. Encoding aliases (non-zero unused
184
+ pad bits) and container formatting variants previously verified as
185
+ byte-different artifacts of the same signed message; they now fail
186
+ verification as `signed-INVALID`. Canonical signer output is
187
+ unaffected — one signed message has exactly one wire spelling.
188
+
189
+ ### Changed
190
+
191
+ - `result.completion_kind` is now a pinned four-value enum naming the
192
+ terminal shape of the evaluation only — `auto_accepted`,
193
+ `admission_paused`, `checkpoint_paused`, `config_malformed` — with the
194
+ pause cause left to `reason_codes`, the run state to
195
+ `result.final_state`, and human decisions to `result.human_outcome`.
196
+ The evaluator rejects unpinned kinds, declared-risk-flag pauses no
197
+ longer stamp the misleading `hard_stop` kind, and receivers copy the
198
+ evaluator's value verbatim (receiver-composed kinds are
199
+ non-conforming). Records written before this pin carry mixed
200
+ cause/event/state values and cannot be bucketed against the enum.
201
+ - `workspace.json` now stamps `spec_version` (the protocol version the
202
+ workspace was initialized against) at init and update. The retired
203
+ `standards_version` field — a stamp from a VERSION file that no longer
204
+ exists, producing meaningless values — is no longer written; existing
205
+ values are left in place for readers that have not migrated.
206
+ - `oacp autonomy-outcome` pins the `human_outcome.actor` convention: one
207
+ canonical, whitespace-free handle per human, fleet-wide. The recorder
208
+ rejects whitespace-bearing actors and warns when the anonymous default
209
+ `human` ships, so cross-receiver outcome analytics can attribute
210
+ decisions.
211
+ - The canonical `$OACP_HOME/.gitignore` written by `oacp memory init` (and
212
+ checked by the doctor `root-gitignore` drift check) now carries an
213
+ explicit `keys/` deny line so private key material can never be swept
214
+ into memory sync, even by a future allowlist widening. The push-side
215
+ allowlist already structurally excluded `keys/`; a regression test now
216
+ pins that.
217
+
218
+ - `render_yaml()` now loudly rejects `auth`/`sig_*` input instead of
219
+ silently dropping unknown fields for authentication content — signed
220
+ bytes are never re-rendered.
221
+ - Operational note: audit-record stamping (`oacp autonomy-outcome`,
222
+ `oacp verify --attach-audit`) serializes read-modify-write cycles on a
223
+ stable, empty `<record>.yaml.lock` sibling file next to each audit
224
+ record. These lock files are expected and harmless — leave them in
225
+ place; the lock file is deliberately never replaced, because swapping
226
+ it would let two concurrent writers hold different locks and silently
227
+ drop each other's updates.
228
+
229
+ ### Fixed
230
+
231
+ - `oacp autonomy-outcome` now accepts checkpoint-paused records — an
232
+ auto-accepted admission whose in-place threshold checkpoint breached —
233
+ and measures decision latency from the checkpoint's `paused_at_utc`
234
+ rather than refusing outright (which drove hand-written outcome blocks)
235
+ or measuring from admission time (which counted the whole execution
236
+ window as human latency). For paused records the pinned
237
+ `completion_kind` is the phase discriminator: an admission pause keeps
238
+ measuring from admission even when actuals attached to the evaluation
239
+ happen to breach the checkpoint. The reason-code fallback survives only
240
+ for genuinely pre-enum records (schema v1 without a pinned kind); a
241
+ current-schema record whose kind is missing or out of vocabulary is
242
+ refused loudly as malformed — including the breached in-place
243
+ auto-accepted shape, which must itself carry `checkpoint_paused`. A
244
+ checkpoint record without a pause stamp is refused loudly; latencies on
245
+ checkpoint records written before the stamp existed are not comparable
246
+ with post-fix values.
247
+ - Message signing: `validate_kid` requires the canonical base64url
248
+ spelling (round-trip check), closing the encoding-alias gap for kid
249
+ values that arrive without key material — most notably a revoked,
250
+ jwk-less pin entry whose alias-spelled kid could never match at pin
251
+ lookup, silently missing the revocation. Alias kids now fail the pins
252
+ load loudly, and a trust-root load failure stays visible in the
253
+ `signed-unknown-kid` annotation reason instead of being masked.
254
+ - Envelope enforcement: the documented completion step (`oacp envelope
255
+ clear`) now executes from inside the enforced session. The Claude adapter
256
+ validates the clear against the task's newest audit record, matched by
257
+ record content (`message_id` + `receiver` — filenames are never trusted,
258
+ and the message id is pinned to a safe-id grammar at compile time so it
259
+ can never act as a glob). A terminal `result.final_state`
260
+ (`done`/`error`) sanctions the clear; `pending`/`paused`/no matching
261
+ record still deny. The validation judges the CLI's effective target: the
262
+ clear must be a standalone simple command (compound commands whose
263
+ earlier segments could retarget it escalate), flag values use
264
+ last-occurrence semantics, relative `--oacp-dir` resolves against the
265
+ call's cwd, and `OACP_HOME=` overrides, mismatched
266
+ project/receiver/home, or unreadable audit records escalate. Previously the hook blanket-denied the
267
+ clear as self-modification, stranding every envelope active after task
268
+ completion until a human cleared it. `oacp envelope compile` from inside
269
+ the session remains denied unconditionally.
270
+ - Envelope enforcement: protocol-mandated bookkeeping no longer consumes
271
+ the `expected_files_touched` budget. Writes to the receiver's own
272
+ `audit/`, `inbox/`, and `outbox/` directories and the runtime scratchpad
273
+ skip the file counter; containment is judged on resolved filesystem
274
+ targets, so symlinks planted under exempt roots cannot smuggle task
275
+ scope past the counter, and secret-class/dependency-manifest gates still
276
+ apply. Previously the completion audit write and reply body-file counted
277
+ against the declared budget, so a tightly declared task was guaranteed a
278
+ mid-run deny at close-out. Two receiver surfaces gained explicit
279
+ protection in the same change: any filesystem-mutator operand
280
+ (write/`rm`/`unlink`/`mv`/`cp`/`truncate`/…, source or destination)
281
+ under the receiver's `state/` directory (the active envelope itself) is
282
+ denied as envelope self-modification, and trust roots (receiver pins,
283
+ project catalog) are treated as authority-bearing auth config gated by
284
+ `touches_auth_config_or_secrets` for writes and mutations alike. Mutator
285
+ operands are parsed the way the utility parses them (GNU
286
+ target-directory spellings, `--`), and mutator operands or Bash write
287
+ targets carrying shell expansion syntax (globs, braces) escalate instead
288
+ of being judged by their literal spelling; `find` with action predicates
289
+ (`-exec`, `-delete`, …) escalates as unclassifiable.
290
+
291
+ ## [0.3.5] - 2026-07-11
292
+
293
+ ### Added
294
+
295
+ - Receiver autonomy supports sender-marked `oacp-guardrails` fences, negation
296
+ fallback, declaration-aware lexical advisories, and a pinned reason-code
297
+ taxonomy backed by executable conformance fixtures.
298
+ - `external_side_effects: allow_pr_artifacts` permits declared PR, review, and
299
+ issue-comment artifacts only for receiver-allowlisted private repositories,
300
+ while retaining pre-approval for public/unlisted artifacts, direct main
301
+ pushes, merges, deploys, and publishes.
302
+ - Autonomy audit output records the full declared task profile, an explicit
303
+ breach list, a semantic policy hash, and a shared outcome block including
304
+ completion time and materialized-risk telemetry.
305
+ - Default-off standing continuation grants now resolve from an explicit prior
306
+ human approval in the same conversation thread; sender-declared grant data
307
+ alone cannot authorize follow-up scope.
308
+ - `oacp autonomy-outcome` atomically records structured approval, modification,
309
+ decline, latency, and grant-decision telemetry in schema-v2 autonomy audits.
310
+ The subcommand is exposed by the installed CLI starting with this release.
311
+ - Envelope compilation: `oacp envelope compile|show|clear`
312
+ turns an admitted message's `task_profile` plus receiver config into a
313
+ runtime envelope (`active_envelope.json`), enforced at the tool-call layer
314
+ by a static Claude PreToolUse hook (`oacp-envelope-hook`, registered once
315
+ by `oacp setup claude`). Compilation is fail-closed
316
+ (`envelope_compile_error`), envelope drift denies with the canonical
317
+ threshold-checkpoint opener, unclassifiable calls escalate to `ask`, and
318
+ the audit outcome block records `envelope_enforcement: hooks | none`.
319
+ Contract pinned by executable fixtures under `tests/conformance/envelope/`.
320
+ - The security policy documents the Tier-1.5 trust ceiling for single-OS-user
321
+ hosts: `from` fields are unauthenticated traceability today, future optional
322
+ signing would add tamper-evidence and provenance but not same-host
323
+ anti-impersonation, and hard isolation requires separate OS users,
324
+ containers, or hosts.
325
+
326
+ ### Changed
327
+
328
+ - The versioning guide documents the staged release pipeline end to end,
329
+ replacing the retired single-repo flow.
330
+ - Documentation examples and conformance fixtures use neutral example
331
+ repository slugs.
332
+ - The standard `auto_review` estimate cap is 45 minutes; estimates above 45
333
+ still pause and the five-file cap remains unchanged.
334
+ - Pricing and commercial matches remain hard pauses but now use the separate
335
+ `hard_stop_content_sensitivity` category.
336
+ - Follow-up declarations outside a standing grant's time, file, or side-effect
337
+ scope re-pause before work begins.
338
+
339
+ ### Fixed
340
+
341
+ - `doctor --memory` now forwards bounded network timeouts to remote Git fetches
342
+ without breaking custom runners that implement the original command interface.
343
+ - The MCP stdio coordinator now converts unexpected request exceptions into
344
+ structured `-32603` responses instead of crashing the server.
345
+ - Undeclared runtime side effects now produce `declaration_error` at the
346
+ threshold checkpoint instead of silently completing outside the profile.
347
+ - Message validation now accepts and type-checks the six documented
348
+ review-loop telemetry fields: `model`, `turns`, `input_tokens`,
349
+ `output_tokens`, `wall_time_s`, and `est_cost_usd`.
350
+ - Receiver config and doctor validation share one repository-slug regex instead
351
+ of maintaining duplicate definitions.
352
+
353
+ ## [0.3.4] - 2026-06-11
354
+
355
+ ### Fixed
356
+
357
+ - Receiver autonomy Gate 1 now performs real message schema validation, expiry
358
+ comparison, SHA-256 hash recording, and same-receiver replay detection before
359
+ auto-accepting work.
360
+ - Receiver autonomy Gate 3 now pauses on credentials, pricing, commercial
361
+ content, and anchored config-sensitive scope, and evaluates external
362
+ side-effect hard stops before sensitive-scope hard stops to match the
363
+ protocol.
364
+
365
+ ## [0.3.3] - 2026-06-11
366
+
367
+ ### Added
368
+
369
+ - `oacp watch --state-id <id>` for per-subscriber cursor files, allowing
370
+ concurrent watchers of the same agent inbox to receive the same new-message
371
+ events without sharing a cursor.
372
+
373
+ ### Changed
374
+
375
+ - Docs: refreshed the runtime capability matrix and prompt-caching guidance
376
+ for current runtime releases.
377
+
378
+ ### Fixed
379
+
380
+ - `oacp send --oacp-dir` and `oacp inbox --oacp-dir` now expand `~` through the
381
+ shared OACP home resolver instead of treating it as a literal path component.
382
+ - Inbox and outbox delivery writes now use same-directory temp files plus
383
+ atomic replace so readers do not observe partial `.yaml` messages.
384
+ - Memory archive tests now isolate git config while preserving test identities,
385
+ so local commit-signing settings do not break the suite.
386
+
387
+ ## [0.3.2] - 2026-05-26
388
+
389
+ ### Added
390
+
391
+ - Receiver autonomy scope-envelope evaluator with side-effect booleans,
392
+ threshold-checkpoint instrumentation, taxonomy pinning, and default-off
393
+ continuation grants.
394
+ - `cursor` runtime support for agent profiles, agent cards, status validation, sender inference via `OACP_RUNTIME=cursor`, `oacp add-agent --runtime cursor`, and `oacp setup cursor`.
395
+ - `oacp setup cursor --project <project>` now provisions the project-side Cursor agent directory and writes a repo-local `.cursor/rules/oacp.todo.mdc` placeholder while Cursor-owned rules and memory hooks remain deferred.
396
+
397
+ ### Changed
398
+
399
+ - `oacp init` now defaults to `claude,codex,cursor`; Gemini remains supported through `--agents` and `oacp setup gemini`.
400
+ - Receiver autonomy docs and templates now use the current
401
+ `agents/<receiver>/config.yaml` schema.
402
+ - Docs: added an asynchronous `claude -p` on-ramp guide and refreshed the
403
+ quickstart for the current CLI surface.
404
+
405
+ ## [0.3.1] - 2026-05-12
406
+
407
+ ### Added
408
+
409
+ - `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.
410
+
411
+ ### Changed
412
+
413
+ - 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.
414
+ - 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.
415
+
416
+ ## [0.3.0] - 2026-04-29
417
+
418
+ ### Added
419
+
420
+ - `oacp memory init|clone|pull|push|disable` subcommands for opt-in cross-machine sync of `$OACP_HOME/org-memory/**` and `$OACP_HOME/projects/*/memory/**` via a plain git repo rooted at `$OACP_HOME`. Three-state activation model: Disabled (no marker), Local-only (`init` without `--remote`), and Synced (`init --remote <url>` or `clone <url>`).
421
+ - `oacp doctor --memory` advisory checks (10 checks covering marker presence, allowlist coverage, remote configuration, fetch/divergence state, and signing setup).
422
+ - `oacp setup claude` now installs memory pull/push hook scripts and registers them in `.claude/settings.json` for Claude SessionStart and SessionEnd lifecycle events. Hooks are marker-gated and no-op silently unless `$OACP_HOME/.oacp-memory-repo` is present, so existing workflows are unaffected on machines that have not opted in.
423
+
424
+ ## [0.2.3] - 2026-04-26
425
+
426
+ ### Changed
427
+
428
+ - `oacp watch` defaults are now notification-friendly: existing inbox messages are no longer replayed on the first scan for a target, and `message_archived` events are suppressed by default. Pass `--since=epoch` to restore replay and `--show-archived` to re-enable archive events. Reduces noise for `Monitor` and `oacp watch` consumers.
429
+
430
+ ### Added
431
+
432
+ - `oacp watch --since=<spec>` — controls the first-run baseline cutoff. Accepts `now` (default), `epoch`, relative durations (`30s`, `5m`, `2h`, `7d`), or ISO 8601 timestamps. Only applies on first run for a target (no state file yet).
433
+ - `oacp watch --show-archived` — opt-in flag to emit `message_archived` events. Useful for observer agents tracking another agent's inbox; disabled by default because the watching agent's own deletes are self-loops.
434
+
435
+ ## [0.2.2] - 2026-04-17
436
+
437
+ ### Added
438
+
439
+ - `oacp watch` — monitor-friendly inbox/outbox watcher with structured output and partial-progress preservation on errors
440
+
441
+ ### Changed
442
+
443
+ - Docs: refreshed cross-runtime capability matrix and public-skill parity framing
444
+
445
+ ## [0.2.1] - 2026-03-22
446
+
447
+ ### Fixed
448
+
449
+ - `oacp doctor` no longer fails when `gh` CLI is not installed — `gh` is now optional (#78)
450
+ - `oacp send` relaxed handoff body schema validation to accept freeform content (#78)
451
+ - `oacp write-event --related` now handles JSON arrays correctly (#76)
452
+
453
+ ### Changed
454
+
455
+ - README: refreshed command table with all v0.2.0 CLI commands, updated workspace layout diagram (#75, #77, #84)
456
+ - SPEC.md: synced with v0.2.0 — version header, org-memory section, kernel inventory with exposure column (#85)
457
+ - Onboarding docs: setup.md uses `pip install` as primary install, QUICKSTART.md adds `--agents`/`--repo` flags, CHANGELOG.md fixes `oacp memory archive` command name (#86)
458
+
459
+ ## [0.2.0] - 2026-03-20
460
+
461
+ ### Added
462
+
463
+ - `oacp inbox` command for listing agent inboxes with table and `--json` output
464
+ - Sender inference for `oacp send` — `--from` is now optional when `OACP_AGENT`, `AGENT_NAME`, or agent card runtime can identify the sender
465
+
466
+ ### Changed
467
+
468
+ - Consolidated shared script constants into `_oacp_constants.py` — canonical `AGENT_RE`, runtime tuples, timestamp/template helpers
469
+ - Agent name validation now requires an alphanumeric first character (names starting with `_`, `.`, `-` are rejected)
470
+ - Message ID and filename suffixes use `secrets.token_hex` instead of `random.choices`
471
+
472
+ ## [0.1.9] - 2026-03-20
473
+
474
+ ### Added
475
+
476
+ - Memory archive layer with `oacp memory archive` CLI command for active/archive split (#62, #11)
477
+ - Declarative agent profiles with YAML schema and `oacp agent init|show|list` CLI commands (#52, #48)
478
+ - `known_debt.md` as standard memory file for tracking technical debt (#53, #32)
479
+
480
+ ## [0.1.2] - 2026-03-18
481
+
482
+ ### Added
483
+
484
+ - `oacp add-agent` command to add agents to existing workspaces (#43)
485
+ - `oacp setup` command to generate runtime-specific config files (#43)
486
+ - Org-level memory spec with `init_org_memory.py` and `write_event.py` scripts (#44)
487
+ - `oacp doctor --fix` flag for auto-fixing missing inbox dirs, missing/stale status files (#50)
488
+ - ACP (Agent Communication Protocol) to protocol comparison docs (#47)
489
+ - Doctor command exposed as marketing hook for onboarding (#49)
490
+
491
+ ### Fixed
492
+
493
+ - `--fix` now derives correct runtime per agent instead of hardcoding `claude` (#50)
494
+
495
+ ## [0.1.1] - 2026-03-16
496
+
497
+ ### Added
498
+
499
+ - Quickstart example and protocol comparison table (#33)
500
+ - PyPI, runtime, and PRs Welcome badges to README (#31)
501
+
502
+ ### Changed
503
+
504
+ - Version bump for post-release maintenance (#36)
505
+
506
+ ## [0.1.0] - 2026-03-15
507
+
508
+ ### Added
509
+
510
+ - Initial public release of `oacp-cli` on PyPI
511
+ - Core CLI commands: `oacp init`, `oacp send`, `oacp doctor`, `oacp validate`
512
+ - File-based inbox/outbox messaging protocol
513
+ - Project workspace initialization with agent directories
514
+ - Message validation against OACP schema
515
+ - Doctor command for environment and workspace health checks
516
+ - GitHub Actions release pipeline with PyPI Trusted Publishing
517
+ - Protocol specs: inbox/outbox, multi-agent shared workspace, credential scoping, cross-runtime sync
518
+ - Templates for review packets, agent roles, guardrails
519
+ - Shell and Python kernel scripts for workspace operations
520
+ - Apache 2.0 license, CONTRIBUTING guide, community health files
521
+
522
+ ### Changed
523
+
524
+ - Renamed `$AGENT_HUB` to `$OACP_HOME` across codebase (#8)
525
+ - Removed legacy Antigravity workflow/policy system (#5)
526
+
527
+ ## [0.1.0-rc1] - 2026-03-12
528
+
529
+ ### Added
530
+
531
+ - Pre-release candidate for initial validation
532
+ - Tagline: empowering solo founders with HITL control (#18)
533
+
534
+ ### Fixed
535
+
536
+ - Release workflow re-tag safety (#27)
537
+ - Checkout step in github-release workflow job (#19)
538
+ - Pre-release audit fixes: SHA-pinned actions, dangling doc refs (#15, #16)
539
+
540
+ [0.4.0]: https://github.com/kiloloop/oacp/compare/v0.3.5...v0.4.0
541
+ [0.3.5]: https://github.com/kiloloop/oacp/compare/v0.3.4...v0.3.5
542
+ [0.3.4]: https://github.com/kiloloop/oacp/compare/v0.3.3...v0.3.4
543
+ [0.3.3]: https://github.com/kiloloop/oacp/compare/v0.3.2...v0.3.3
544
+ [0.3.2]: https://github.com/kiloloop/oacp/compare/v0.3.1...v0.3.2
545
+ [0.3.1]: https://github.com/kiloloop/oacp/compare/v0.3.0...v0.3.1
546
+ [0.3.0]: https://github.com/kiloloop/oacp/compare/v0.2.3...v0.3.0
547
+ [0.2.3]: https://github.com/kiloloop/oacp/compare/v0.2.2...v0.2.3
548
+ [0.2.2]: https://github.com/kiloloop/oacp/compare/v0.2.1...v0.2.2
549
+ [0.2.1]: https://github.com/kiloloop/oacp/compare/v0.2.0...v0.2.1
550
+ [0.2.0]: https://github.com/kiloloop/oacp/compare/v0.1.9...v0.2.0
551
+ [0.1.9]: https://github.com/kiloloop/oacp/compare/v0.1.2...v0.1.9
552
+ [0.1.2]: https://github.com/kiloloop/oacp/compare/v0.1.1...v0.1.2
553
+ [0.1.1]: https://github.com/kiloloop/oacp/compare/v0.1.0...v0.1.1
554
+ [0.1.0]: https://github.com/kiloloop/oacp/releases/tag/v0.1.0
555
+ [0.1.0-rc1]: https://github.com/kiloloop/oacp/releases/tag/v0.1.0-rc1
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: oacp-cli
3
- Version: 0.3.4
3
+ Version: 0.4.0
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
@@ -22,6 +22,8 @@ Classifier: Topic :: Software Development
22
22
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
23
23
  Requires-Python: >=3.9
24
24
  Requires-Dist: pyyaml>=6.0
25
+ Provides-Extra: crypto
26
+ Requires-Dist: cryptography>=3.4; extra == 'crypto'
25
27
  Description-Content-Type: text/markdown
26
28
 
27
29
  # OACP
@@ -120,6 +122,8 @@ $OACP_HOME/org-memory/ org-wide
120
122
 
121
123
  </details>
122
124
 
125
+ Want to see these files populated? Browse [`examples/demo-workspace/`](examples/demo-workspace/) — what a fictional team's project remembers after a month of agent sessions (debt with origins, threads opened and closed, decisions with rationale), plus the org-memory layer mid-curation.
126
+
123
127
  ## Quick Start
124
128
 
125
129
  ```bash
@@ -146,9 +150,9 @@ When running inside a configured agent runtime, `--from` can be omitted — OACP
146
150
 
147
151
  ## Coming from `claude -p`?
148
152
 
149
- `claude -p` runs an agent synchronously and headless — your script blocks while it works, and as of June 15 programmatic usage draws from a separate metered credit.
153
+ `claude -p` runs an agent synchronously and headless — your script blocks while it works, and there's no session to glance at, attach to, or steer mid-run.
150
154
 
151
- OACP routes the same work to a **standing interactive Claude Code session** instead: `oacp send` queues the task, the session picks it up and runs it async, you're not blocked — and because it's a real interactive session, it stays on your subscription.
155
+ OACP routes the same work to a **standing interactive Claude Code session** instead: `oacp send` queues the task, the session picks it up and runs it async, you're not blocked — and the session is right there to watch and steer. Once tasks are messages, review loops, handoffs, and multi-agent coordination come with the shape.
152
156
 
153
157
  **[From `claude -p` to an interactive Claude Code session →](docs/from-claude-p.md)** — paste-into-your-agent setup, the honest tradeoffs, and where it fits.
154
158
 
@@ -94,6 +94,8 @@ $OACP_HOME/org-memory/ org-wide
94
94
 
95
95
  </details>
96
96
 
97
+ Want to see these files populated? Browse [`examples/demo-workspace/`](examples/demo-workspace/) — what a fictional team's project remembers after a month of agent sessions (debt with origins, threads opened and closed, decisions with rationale), plus the org-memory layer mid-curation.
98
+
97
99
  ## Quick Start
98
100
 
99
101
  ```bash
@@ -120,9 +122,9 @@ When running inside a configured agent runtime, `--from` can be omitted — OACP
120
122
 
121
123
  ## Coming from `claude -p`?
122
124
 
123
- `claude -p` runs an agent synchronously and headless — your script blocks while it works, and as of June 15 programmatic usage draws from a separate metered credit.
125
+ `claude -p` runs an agent synchronously and headless — your script blocks while it works, and there's no session to glance at, attach to, or steer mid-run.
124
126
 
125
- OACP routes the same work to a **standing interactive Claude Code session** instead: `oacp send` queues the task, the session picks it up and runs it async, you're not blocked — and because it's a real interactive session, it stays on your subscription.
127
+ OACP routes the same work to a **standing interactive Claude Code session** instead: `oacp send` queues the task, the session picks it up and runs it async, you're not blocked — and the session is right there to watch and steer. Once tasks are messages, review loops, handoffs, and multi-agent coordination come with the shape.
126
128
 
127
129
  **[From `claude -p` to an interactive Claude Code session →](docs/from-claude-p.md)** — paste-into-your-agent setup, the honest tradeoffs, and where it fits.
128
130
 
@@ -29,6 +29,21 @@ OACP is a file-based coordination protocol. Security considerations include:
29
29
  - **Script injection** — Report any case where user-controlled input in message fields can lead to command injection via OACP scripts.
30
30
  - **Path traversal** — Report any case where message fields or script arguments can read or write files outside the intended directories.
31
31
 
32
+ ### Trust ceiling on shared hosts (Tier 1.5)
33
+
34
+ On a single-OS-user host, OACP cannot *cryptographically prevent* one agent
35
+ from impersonating another, because key-read access and inbox-write access
36
+ collapse to the same uid. Today, `from` fields are unauthenticated and provide
37
+ traceability only — not identity assurance. Message signing (an optional
38
+ extension under design, not yet implemented) would add tamper-evidence and
39
+ third-party-verifiable identity provenance for honest agents; it would still
40
+ not provide same-host anti-impersonation. Hard inter-agent isolation requires
41
+ one OS user per agent (Tier-2), containers, or separate hosts with enforced
42
+ access controls. Hardware-backed keys can strengthen future signing identity
43
+ assurance, but they do not isolate a shared filesystem or process space. Treat
44
+ any `from` field on a shared host as **provenance, not an anti-spoofing
45
+ guarantee.**
46
+
32
47
  ## Acknowledgments
33
48
 
34
49
  We appreciate responsible disclosure and will credit reporters in release notes (unless you prefer to remain anonymous).