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.
- oacp_cli-0.4.0/.gitattributes +11 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/.github/workflows/ci.yml +1 -1
- oacp_cli-0.4.0/CHANGELOG.md +555 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/PKG-INFO +7 -3
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/README.md +4 -2
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/SECURITY.md +15 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/SPEC.md +6 -1
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/from-claude-p.md +14 -14
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/guides/doctor.md +40 -2
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/guides/prompt_caching.md +0 -1
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/guides/runtime_capability_matrix.md +12 -8
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/guides/setup.md +0 -1
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/guides/unified_skill_spec.md +1 -1
- oacp_cli-0.4.0/docs/guides/versioning.md +65 -0
- oacp_cli-0.4.0/docs/protocol/autonomy.md +888 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/protocol/inbox_outbox.md +82 -10
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/protocol/mcp_integration.md +2 -2
- oacp_cli-0.4.0/docs/protocol/message_signing.md +212 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/protocol/review_loop.md +1 -1
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/protocol/runtime_capabilities.md +5 -4
- oacp_cli-0.4.0/examples/demo-workspace/README.md +118 -0
- oacp_cli-0.4.0/examples/demo-workspace/org-memory/decisions.md +13 -0
- oacp_cli-0.4.0/examples/demo-workspace/org-memory/events/20260504-093015-postgres-over-dynamodb.md +14 -0
- oacp_cli-0.4.0/examples/demo-workspace/org-memory/events/20260508-141220-utc-timestamps-pr-review.md +13 -0
- oacp_cli-0.4.0/examples/demo-workspace/org-memory/events/20260515-102045-utc-timestamps-webhooks.md +13 -0
- oacp_cli-0.4.0/examples/demo-workspace/org-memory/events/20260521-163330-utc-timestamps-rule-proposal.md +15 -0
- oacp_cli-0.4.0/examples/demo-workspace/org-memory/events/20260527-110500-idempotency-keys-merged.md +13 -0
- oacp_cli-0.4.0/examples/demo-workspace/org-memory/events/20260602-090210-parcel-api-v020-released.md +13 -0
- oacp_cli-0.4.0/examples/demo-workspace/org-memory/recent.md +25 -0
- oacp_cli-0.4.0/examples/demo-workspace/org-memory/rules.md +17 -0
- oacp_cli-0.4.0/examples/demo-workspace/projects/parcel-api/memory/archive/2026-05-21-csv-export-timeouts.md +30 -0
- oacp_cli-0.4.0/examples/demo-workspace/projects/parcel-api/memory/decision_log.md +21 -0
- oacp_cli-0.4.0/examples/demo-workspace/projects/parcel-api/memory/known_debt.md +11 -0
- oacp_cli-0.4.0/examples/demo-workspace/projects/parcel-api/memory/open_threads.md +23 -0
- oacp_cli-0.4.0/examples/demo-workspace/projects/parcel-api/memory/project_facts.md +21 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/mcp_servers/oacp_coordinator.py +4 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/oacp/cli.py +17 -0
- oacp_cli-0.4.0/oacp/envelope_hook.py +24 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/pyproject.toml +15 -1
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/_oacp_constants.py +32 -1
- oacp_cli-0.4.0/scripts/autonomy_gate.py +1601 -0
- oacp_cli-0.4.0/scripts/claude_envelope_hook.py +1464 -0
- oacp_cli-0.4.0/scripts/envelope_compiler.py +373 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/init_project_workspace.py +12 -16
- oacp_cli-0.4.0/scripts/key_cli.py +120 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/memory_sync.py +47 -10
- oacp_cli-0.4.0/scripts/message_signing.py +775 -0
- oacp_cli-0.4.0/scripts/message_verify.py +673 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/oacp_doctor.py +109 -12
- oacp_cli-0.4.0/scripts/record_autonomy_outcome.py +380 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/send_inbox_message.py +119 -3
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/setup_runtime.py +15 -2
- oacp_cli-0.4.0/scripts/trust_cli.py +258 -0
- oacp_cli-0.4.0/scripts/trust_root.py +780 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/update_workspace.sh +17 -12
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/validate_message.py +93 -2
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/inbox_message.template.yaml +6 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/receiver_config.template.yaml +7 -2
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/README.md +7 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/actuals/checkpoint_breach.yaml +3 -0
- oacp_cli-0.4.0/tests/conformance/autonomy/actuals/declaration_error.yaml +9 -0
- oacp_cli-0.4.0/tests/conformance/autonomy/actuals/declaration_intent.yaml +13 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/actuals/top_level_side_effect_keys.yaml +2 -0
- oacp_cli-0.4.0/tests/conformance/autonomy/audits/prior_thread_grant_approved.yaml +48 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/configs/always_pause.yaml +2 -2
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/configs/auto_review_continuation_enabled.yaml +1 -1
- 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
- oacp_cli-0.4.0/tests/conformance/autonomy/configs/auto_review_standard.yaml +17 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/always_pause_task.yaml +3 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/brainstorm_side_effect_verbs_auto_accepts.yaml +1 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/checkpoint_breach_pauses.yaml +4 -0
- oacp_cli-0.4.0/tests/conformance/autonomy/expected/clean_auto_review_task.yaml +29 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/continuation_grant_disabled_pauses.yaml +1 -1
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/continuation_grant_drift_pauses.yaml +3 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/continuation_grant_enabled_auto_accepts.yaml +4 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/continuation_grant_external_uncovered_pauses.yaml +6 -1
- oacp_cli-0.4.0/tests/conformance/autonomy/expected/declaration_error_pauses.yaml +26 -0
- oacp_cli-0.4.0/tests/conformance/autonomy/expected/declaration_intent_checkpoint_pauses.yaml +34 -0
- oacp_cli-0.4.0/tests/conformance/autonomy/expected/declared_destructive_ops_pauses.yaml +11 -0
- oacp_cli-0.4.0/tests/conformance/autonomy/expected/guardrails_fence_auto_accepts.yaml +23 -0
- oacp_cli-0.4.0/tests/conformance/autonomy/expected/hard_stop_masking_threshold_pauses.yaml +14 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/hard_stop_rm_rf_pauses.yaml +3 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/hard_stop_sensitive_commercial_pauses.yaml +1 -1
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/hard_stop_sensitive_pricing_pauses.yaml +1 -1
- oacp_cli-0.4.0/tests/conformance/autonomy/expected/lexical_declared_false_auto_accepts.yaml +19 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/malformed_config_pauses.yaml +3 -0
- 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
- oacp_cli-0.4.0/tests/conformance/autonomy/expected/minutes_46_pauses.yaml +10 -0
- oacp_cli-0.4.0/tests/conformance/autonomy/expected/negated_guardrails_auto_accepts.yaml +20 -0
- oacp_cli-0.4.0/tests/conformance/autonomy/expected/private_issue_artifacts_auto_accepts.yaml +21 -0
- oacp_cli-0.4.0/tests/conformance/autonomy/expected/private_pr_artifacts_auto_accepts.yaml +15 -0
- oacp_cli-0.4.0/tests/conformance/autonomy/expected/private_pr_with_merge_pauses.yaml +13 -0
- oacp_cli-0.4.0/tests/conformance/autonomy/expected/public_pr_artifacts_pause.yaml +10 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/side_effect_booleans_pause.yaml +1 -1
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/top_level_side_effect_actuals_ignored.yaml +1 -0
- oacp_cli-0.4.0/tests/conformance/autonomy/messages/declared_destructive_ops.yaml +21 -0
- oacp_cli-0.4.0/tests/conformance/autonomy/messages/guardrails_fence.yaml +24 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/hard_stop_external_side_effects.yaml +1 -1
- oacp_cli-0.4.0/tests/conformance/autonomy/messages/hard_stop_masking_threshold.yaml +20 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/hard_stop_sensitive_scope.yaml +1 -1
- oacp_cli-0.4.0/tests/conformance/autonomy/messages/lexical_declared_false.yaml +21 -0
- oacp_cli-0.4.0/tests/conformance/autonomy/messages/minutes_45.yaml +20 -0
- oacp_cli-0.4.0/tests/conformance/autonomy/messages/minutes_46.yaml +20 -0
- oacp_cli-0.4.0/tests/conformance/autonomy/messages/negated_guardrails.yaml +21 -0
- oacp_cli-0.4.0/tests/conformance/autonomy/messages/private_issue_artifacts.yaml +27 -0
- oacp_cli-0.4.0/tests/conformance/autonomy/messages/private_pr_artifacts.yaml +25 -0
- oacp_cli-0.4.0/tests/conformance/autonomy/messages/private_pr_with_merge.yaml +26 -0
- oacp_cli-0.4.0/tests/conformance/autonomy/messages/public_pr_artifacts.yaml +25 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/sensitive_commercial.yaml +5 -1
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/sensitive_config.yaml +1 -1
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/sensitive_credentials.yaml +1 -1
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/sensitive_pricing.yaml +1 -1
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/sensitive_secret.yaml +1 -1
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/side_effect_before_sensitive.yaml +2 -2
- oacp_cli-0.4.0/tests/conformance/envelope/README.md +47 -0
- oacp_cli-0.4.0/tests/conformance/envelope/configs/auto_review_standard.yaml +17 -0
- oacp_cli-0.4.0/tests/conformance/envelope/configs/malformed.yaml +2 -0
- oacp_cli-0.4.0/tests/conformance/envelope/expected/clean_pr_task_compiles.yaml +31 -0
- oacp_cli-0.4.0/tests/conformance/envelope/expected/docs_only_task_compiles.yaml +29 -0
- oacp_cli-0.4.0/tests/conformance/envelope/expected/granular_capabilities_compile.yaml +31 -0
- oacp_cli-0.4.0/tests/conformance/envelope/expected/invalid_numeric_fails.yaml +6 -0
- oacp_cli-0.4.0/tests/conformance/envelope/expected/malformed_config_fails.yaml +6 -0
- oacp_cli-0.4.0/tests/conformance/envelope/expected/missing_profile_fails.yaml +6 -0
- oacp_cli-0.4.0/tests/conformance/envelope/expected/unparsable_profile_fails.yaml +6 -0
- oacp_cli-0.4.0/tests/conformance/envelope/messages/clean_pr_task.yaml +25 -0
- oacp_cli-0.4.0/tests/conformance/envelope/messages/docs_only_task.yaml +20 -0
- oacp_cli-0.4.0/tests/conformance/envelope/messages/granular_capabilities_task.yaml +28 -0
- oacp_cli-0.4.0/tests/conformance/envelope/messages/invalid_numeric.yaml +20 -0
- oacp_cli-0.4.0/tests/conformance/envelope/messages/missing_profile.yaml +10 -0
- oacp_cli-0.4.0/tests/conformance/envelope/messages/unparsable_profile.yaml +14 -0
- oacp_cli-0.4.0/tests/conformance/signing/README.md +87 -0
- oacp_cli-0.4.0/tests/conformance/signing/expected/signed_basic.yaml +29 -0
- oacp_cli-0.4.0/tests/conformance/signing/expected/signed_lookalike.yaml +29 -0
- oacp_cli-0.4.0/tests/conformance/signing/expected/signed_multisig.yaml +34 -0
- oacp_cli-0.4.0/tests/conformance/signing/expected/signed_revoked.yaml +28 -0
- oacp_cli-0.4.0/tests/conformance/signing/expected/tamper_auth_alias.yaml +27 -0
- oacp_cli-0.4.0/tests/conformance/signing/expected/tamper_body_flip.yaml +25 -0
- oacp_cli-0.4.0/tests/conformance/signing/expected/tamper_container_reformat.yaml +27 -0
- oacp_cli-0.4.0/tests/conformance/signing/expected/tamper_crlf_trailer.yaml +25 -0
- oacp_cli-0.4.0/tests/conformance/signing/expected/tamper_header_reencode.yaml +25 -0
- oacp_cli-0.4.0/tests/conformance/signing/expected/tamper_identity_mismatch.yaml +29 -0
- oacp_cli-0.4.0/tests/conformance/signing/expected/tamper_indented_trailer.yaml +21 -0
- oacp_cli-0.4.0/tests/conformance/signing/expected/tamper_kid_alias.yaml +27 -0
- oacp_cli-0.4.0/tests/conformance/signing/expected/tamper_kid_cross_agent.yaml +25 -0
- oacp_cli-0.4.0/tests/conformance/signing/expected/tamper_kid_unknown.yaml +26 -0
- oacp_cli-0.4.0/tests/conformance/signing/expected/tamper_missing_final_lf.yaml +25 -0
- oacp_cli-0.4.0/tests/conformance/signing/expected/tamper_padded_b64.yaml +26 -0
- oacp_cli-0.4.0/tests/conformance/signing/expected/tamper_sig_alias.yaml +28 -0
- oacp_cli-0.4.0/tests/conformance/signing/expected/tamper_sig_corrupt.yaml +25 -0
- oacp_cli-0.4.0/tests/conformance/signing/expected/tamper_trailer_transplant.yaml +29 -0
- oacp_cli-0.4.0/tests/conformance/signing/expected/tamper_trailing_blank_line.yaml +25 -0
- oacp_cli-0.4.0/tests/conformance/signing/expected/tamper_trailing_space.yaml +25 -0
- oacp_cli-0.4.0/tests/conformance/signing/expected/unsigned_notification.yaml +21 -0
- oacp_cli-0.4.0/tests/conformance/signing/keys/alice.json +12 -0
- oacp_cli-0.4.0/tests/conformance/signing/keys/bob.json +12 -0
- oacp_cli-0.4.0/tests/conformance/signing/keys/carol.json +12 -0
- oacp_cli-0.4.0/tests/conformance/signing/messages/signed_basic.prefix.yaml +11 -0
- oacp_cli-0.4.0/tests/conformance/signing/messages/signed_basic.yaml +12 -0
- oacp_cli-0.4.0/tests/conformance/signing/messages/signed_lookalike.prefix.yaml +11 -0
- oacp_cli-0.4.0/tests/conformance/signing/messages/signed_lookalike.yaml +12 -0
- oacp_cli-0.4.0/tests/conformance/signing/messages/signed_multisig.prefix.yaml +10 -0
- oacp_cli-0.4.0/tests/conformance/signing/messages/signed_multisig.yaml +11 -0
- oacp_cli-0.4.0/tests/conformance/signing/messages/signed_revoked.prefix.yaml +8 -0
- oacp_cli-0.4.0/tests/conformance/signing/messages/signed_revoked.yaml +9 -0
- oacp_cli-0.4.0/tests/conformance/signing/messages/tamper_auth_alias.yaml +12 -0
- oacp_cli-0.4.0/tests/conformance/signing/messages/tamper_body_flip.yaml +12 -0
- oacp_cli-0.4.0/tests/conformance/signing/messages/tamper_container_reformat.yaml +12 -0
- oacp_cli-0.4.0/tests/conformance/signing/messages/tamper_crlf_trailer.yaml +12 -0
- oacp_cli-0.4.0/tests/conformance/signing/messages/tamper_header_reencode.yaml +12 -0
- oacp_cli-0.4.0/tests/conformance/signing/messages/tamper_identity_mismatch.prefix.yaml +8 -0
- oacp_cli-0.4.0/tests/conformance/signing/messages/tamper_identity_mismatch.yaml +9 -0
- oacp_cli-0.4.0/tests/conformance/signing/messages/tamper_indented_trailer.yaml +12 -0
- oacp_cli-0.4.0/tests/conformance/signing/messages/tamper_kid_alias.yaml +12 -0
- oacp_cli-0.4.0/tests/conformance/signing/messages/tamper_kid_cross_agent.yaml +12 -0
- oacp_cli-0.4.0/tests/conformance/signing/messages/tamper_kid_unknown.yaml +12 -0
- oacp_cli-0.4.0/tests/conformance/signing/messages/tamper_missing_final_lf.yaml +12 -0
- oacp_cli-0.4.0/tests/conformance/signing/messages/tamper_padded_b64.yaml +12 -0
- oacp_cli-0.4.0/tests/conformance/signing/messages/tamper_sig_alias.yaml +12 -0
- oacp_cli-0.4.0/tests/conformance/signing/messages/tamper_sig_corrupt.yaml +12 -0
- oacp_cli-0.4.0/tests/conformance/signing/messages/tamper_trailer_transplant.yaml +12 -0
- oacp_cli-0.4.0/tests/conformance/signing/messages/tamper_trailing_blank_line.yaml +13 -0
- oacp_cli-0.4.0/tests/conformance/signing/messages/tamper_trailing_space.yaml +12 -0
- oacp_cli-0.4.0/tests/conformance/signing/messages/unsigned_notification.yaml +10 -0
- oacp_cli-0.4.0/tests/conformance/signing/pins/allowed_signers.yaml +31 -0
- oacp_cli-0.4.0/tests/conformance/signing/regen_fixtures.py +794 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_autonomy_conformance_fixtures.py +11 -0
- oacp_cli-0.4.0/tests/test_autonomy_gate.py +831 -0
- oacp_cli-0.4.0/tests/test_claude_envelope_hook.py +1453 -0
- oacp_cli-0.4.0/tests/test_envelope_compiler.py +323 -0
- oacp_cli-0.4.0/tests/test_envelope_conformance_fixtures.py +97 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_init_project_workspace.py +20 -1
- oacp_cli-0.4.0/tests/test_memory_sync.py +302 -0
- oacp_cli-0.4.0/tests/test_message_signing.py +799 -0
- oacp_cli-0.4.0/tests/test_message_verify.py +820 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_oacp_cli.py +39 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_oacp_coordinator.py +28 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_oacp_doctor.py +158 -2
- oacp_cli-0.4.0/tests/test_record_autonomy_outcome.py +558 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_send_inbox_message.py +10 -10
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_setup_runtime.py +22 -0
- oacp_cli-0.4.0/tests/test_signing_conformance.py +364 -0
- oacp_cli-0.4.0/tests/test_trust_root.py +770 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_validate_message.py +51 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_workspace_discovery.py +12 -10
- oacp_cli-0.3.4/CHANGELOG.md +0 -208
- oacp_cli-0.3.4/docs/guides/versioning.md +0 -34
- oacp_cli-0.3.4/docs/protocol/autonomy.md +0 -323
- oacp_cli-0.3.4/scripts/autonomy_gate.py +0 -822
- oacp_cli-0.3.4/tests/test_autonomy_gate.py +0 -177
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/.github/workflows/release.yml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/.gitignore +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/CONTRIBUTING.md +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/LICENSE +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/Makefile +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/QUICKSTART.md +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/guides/adoption.md +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/img/oacp-cli-demo.png +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/img/oacp-filesystem-tree.png +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/img/oacp-fleet-thread.png +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/protocol/agent_profiles.md +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/protocol/agent_safety_defaults.md +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/protocol/credential_scoping.md +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/protocol/cross_runtime_sync.md +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/protocol/dispatch_states.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/protocol/multi_agent_shared_workspace.md +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/protocol/org_memory.md +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/protocol/packet_states.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/protocol/session_init.md +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/protocol/skills_manifest.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/docs/protocol/task_negotiation.md +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/examples/quickstart/README.md +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/oacp/__init__.py +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/_oacp_env.py +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/add_agent.py +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/agent_profile.py +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/check_quality_gate.py +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/codex_session_init.py +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/create_handoff_packet.py +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/handoff_schema.py +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/init_org_memory.py +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/init_packet.sh +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/init_project_workspace.sh +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/memory_archive_common.py +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/memory_cli.py +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/normalize_findings.py +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/oacp_inbox.py +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/oacp_watch.py +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/preflight.py +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/promote_to_archive.py +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/restore_from_archive.py +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/session_lifecycle_hooks.py +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/validate_agent_card.py +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/scripts/write_event.py +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/agent_card.template.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/agent_profile.template.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/agent_status.template.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/checkpoint.template.md +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/claude/agents/role_agent.template.md +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/claude/rules/guardrail.template.md +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/findings_packet.template.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/github_actions_quality_gate.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/guardrails/coding_standards.template.md +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/guardrails/safe_commands.template.md +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/guardrails/secrets_rules.template.md +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/handoff_packet.template.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/manual_validation.template.md +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/merge_decision.template.md +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/org-memory/decisions.md +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/org-memory/events/.gitkeep +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/org-memory/events/20260317-170120-example-api-convention.md +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/org-memory/recent.md +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/org-memory/rules.md +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/review_packet.template.md +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/roles/role_baseline.template.md +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/roles/role_definition.template.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/runtime_capabilities.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/skills_manifest.template.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/templates/test_packet.template.md +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/actuals/continuation_drift.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/actuals/continuation_within.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/configs/auto_review_tight.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/configs/malformed_config.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/ambiguous_scope_pauses.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/brainstorm_destructive_pauses.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/brainstorm_without_profile_auto_accepts.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/continuation_grant_destructive_pauses.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/expired_message_pauses.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/hard_stop_dangerously_skip_permissions_pauses.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/hard_stop_external_side_effects_pauses.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/hard_stop_force_pauses.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/hard_stop_no_verify_pauses.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/hard_stop_no_verify_upper_pauses.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/hard_stop_sensitive_config_pauses.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/hard_stop_sensitive_credentials_pauses.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/hard_stop_sensitive_memory_ssot_pauses.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/hard_stop_sensitive_public_repo_pauses.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/hard_stop_sensitive_scope_pauses.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/hard_stop_sensitive_secret_pauses.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/hard_stop_side_effect_before_sensitive_pauses.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/invalid_message_pauses.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/missing_task_profile_pauses.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/path_like_deploy_auto_accepts.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/risk_obvious_no_profile_pauses.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/threshold_breach_pauses.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/tight_threshold_pauses.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/expected/unparsable_task_profile_pauses.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/ambiguous_scope.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/brainstorm_destructive.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/brainstorm_side_effect_verbs.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/brainstorm_without_profile.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/clean_task.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/continuation_grant.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/continuation_grant_destructive.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/continuation_grant_external_uncovered.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/expired_message.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/hard_stop_dangerously_skip_permissions.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/hard_stop_force.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/hard_stop_no_verify.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/hard_stop_no_verify_upper.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/hard_stop_rm_rf.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/invalid_message.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/missing_task_profile.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/path_like_deploy.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/risk_obvious_no_profile.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/sensitive_memory_ssot.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/sensitive_public_repo.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/side_effect_booleans.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/threshold_breach.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/conformance/autonomy/messages/unparsable_task_profile.yaml +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_add_agent.py +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_agent_profile.py +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_codex_session_init.py +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_create_handoff_packet.py +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_github_workflows.py +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_handoff_schema.py +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_memory_archive.py +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_oacp_constants.py +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_oacp_env.py +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_oacp_inbox.py +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_oacp_watch.py +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_preflight.py +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_review_loop.py +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_session_lifecycle_hooks.py +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_update_workspace.py +0 -0
- {oacp_cli-0.3.4 → oacp_cli-0.4.0}/tests/test_validate_agent_card.py +0 -0
- {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
|
+
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
|
|
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
|
|
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
|
|
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
|
|
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).
|