codex-a2a 1.3.1__tar.gz → 1.3.3__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 (257) hide show
  1. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/.github/workflows/compatibility.yml +1 -34
  2. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/.pre-commit-config.yaml +11 -2
  3. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/CONTRIBUTING.md +3 -1
  4. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/PKG-INFO +17 -16
  5. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/README.md +11 -10
  6. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/docs/architecture.md +1 -1
  7. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/docs/compatibility.md +24 -10
  8. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/docs/conformance-triage.md +8 -6
  9. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/docs/conformance.md +11 -9
  10. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/docs/guide.md +20 -13
  11. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/pyproject.toml +5 -5
  12. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/scripts/README.md +5 -3
  13. codex_a2a-1.3.3/scripts/check_codex_app_server_schema.py +110 -0
  14. codex_a2a-1.3.3/scripts/smoke_live_codex_turn.py +251 -0
  15. codex_a2a-1.3.3/scripts/smoke_test_live_codex.sh +14 -0
  16. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/scripts/validate_baseline.sh +2 -1
  17. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/config.py +6 -2
  18. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/contracts/extension_specs.py +12 -3
  19. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/contracts/extensions.py +66 -28
  20. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/execution/exec_runtime.py +2 -6
  21. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/execution/executor.py +1 -1
  22. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/execution/session_runtime.py +0 -3
  23. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/execution/stream_processor.py +0 -8
  24. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/execution/streaming.py +8 -8
  25. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/input_mapping.py +39 -3
  26. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/jsonrpc/application.py +2 -1
  27. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/jsonrpc/discovery_params.py +0 -23
  28. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/jsonrpc/discovery_payload_mapping.py +10 -1
  29. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/jsonrpc/discovery_query.py +3 -1
  30. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/jsonrpc/dispatch.py +8 -4
  31. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/jsonrpc/turn_control.py +11 -0
  32. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/jsonrpc/turn_control_params.py +8 -5
  33. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/profile/runtime.py +13 -0
  34. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/server/agent_card.py +16 -5
  35. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/server/application.py +5 -1
  36. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/server/request_handler.py +1 -9
  37. codex_a2a-1.3.3/src/codex_a2a/skill_handles.py +113 -0
  38. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/upstream/client.py +62 -14
  39. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/upstream/conversation_facade.py +22 -3
  40. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/upstream/request_mapping.py +0 -10
  41. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/upstream/startup.py +1 -2
  42. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a.egg-info/PKG-INFO +17 -16
  43. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a.egg-info/SOURCES.txt +6 -0
  44. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a.egg-info/requires.txt +5 -5
  45. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/config/test_settings.py +4 -1
  46. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/contracts/test_extension_contract_consistency.py +22 -0
  47. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/execution/test_session_ownership.py +1 -1
  48. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/jsonrpc/test_codex_discovery_extension.py +65 -5
  49. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/jsonrpc/test_codex_turn_review_extension.py +54 -0
  50. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/jsonrpc/test_dispatch.py +3 -3
  51. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/jsonrpc/test_jsonrpc_models.py +20 -12
  52. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/jsonrpc/test_protocol_payload_mapping.py +8 -2
  53. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/package/test_release_distribution_contract.py +30 -9
  54. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/profile/test_profile.py +5 -0
  55. codex_a2a-1.3.3/tests/scripts/test_check_codex_app_server_schema.py +29 -0
  56. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/scripts/test_script_health_contract.py +1 -1
  57. codex_a2a-1.3.3/tests/scripts/test_validate_baseline_script.py +89 -0
  58. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/server/test_agent_card.py +37 -2
  59. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/server/test_request_handler.py +60 -3
  60. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/server/test_transport_contract.py +5 -0
  61. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/test_input_mapping.py +46 -11
  62. codex_a2a-1.3.3/tests/test_skill_handles.py +99 -0
  63. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/upstream/test_codex_client_params.py +164 -21
  64. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/upstream/test_request_mapping.py +0 -5
  65. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/uv.lock +319 -247
  66. codex_a2a-1.3.1/scripts/smoke_test_live_codex.sh +0 -47
  67. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/.github/dependabot.yml +0 -0
  68. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/.github/workflows/ci.yml +0 -0
  69. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/.github/workflows/dependency-health.yml +0 -0
  70. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/.github/workflows/publish.yml +0 -0
  71. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/.gitignore +0 -0
  72. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/.secrets.baseline +0 -0
  73. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/AGENTS.md +0 -0
  74. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/LICENSE +0 -0
  75. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/SECURITY.md +0 -0
  76. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/docs/a2a-extension-baseline.md +0 -0
  77. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/docs/extension-specifications.md +0 -0
  78. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/docs/inspection/README.md +0 -0
  79. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/docs/inspection/error_redaction_policy.md +0 -0
  80. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/docs/inspection/release_integrity_policy.md +0 -0
  81. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/docs/maintainer-architecture.md +0 -0
  82. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/mypy.ini +0 -0
  83. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/scripts/audit_low_call_sites.py +0 -0
  84. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/scripts/check_dead_code.py +0 -0
  85. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/scripts/conformance.sh +0 -0
  86. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/scripts/dependency_health.sh +0 -0
  87. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/scripts/health_common.sh +0 -0
  88. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/scripts/publish_github_release.sh +0 -0
  89. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/scripts/smoke_test_built_cli.sh +0 -0
  90. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/scripts/sync_codex_docs.sh +0 -0
  91. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/scripts/tck_auth_plugin.py +0 -0
  92. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/scripts/validate_runtime_matrix.sh +0 -0
  93. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/setup.cfg +0 -0
  94. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/__init__.py +0 -0
  95. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/a2a_proto.py +0 -0
  96. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/auth.py +0 -0
  97. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/cli.py +0 -0
  98. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/client/__init__.py +0 -0
  99. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/client/agent_card.py +0 -0
  100. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/client/auth.py +0 -0
  101. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/client/client.py +0 -0
  102. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/client/config.py +0 -0
  103. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/client/errors.py +0 -0
  104. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/client/extension_negotiation.py +0 -0
  105. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/client/manager.py +0 -0
  106. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/client/network_policy.py +0 -0
  107. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/client/payload_text.py +0 -0
  108. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/client/request_context.py +0 -0
  109. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/contracts/__init__.py +0 -0
  110. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/contracts/extension_registry.py +0 -0
  111. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/contracts/runtime_output.py +0 -0
  112. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/execution/__init__.py +0 -0
  113. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/execution/discovery_runtime.py +0 -0
  114. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/execution/output_mapping.py +0 -0
  115. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/execution/request_metadata.py +0 -0
  116. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/execution/request_overrides.py +0 -0
  117. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/execution/response_emitter.py +0 -0
  118. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/execution/review_runtime.py +0 -0
  119. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/execution/stream_chunks.py +0 -0
  120. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/execution/stream_interrupts.py +0 -0
  121. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/execution/stream_state.py +0 -0
  122. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/execution/thread_lifecycle_runtime.py +0 -0
  123. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/execution/tool_call_payloads.py +0 -0
  124. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/execution/watch_events.py +0 -0
  125. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/jsonrpc/__init__.py +0 -0
  126. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/jsonrpc/discovery_control.py +0 -0
  127. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/jsonrpc/errors.py +0 -0
  128. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/jsonrpc/exec_control.py +0 -0
  129. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/jsonrpc/exec_control_params.py +0 -0
  130. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/jsonrpc/hooks.py +0 -0
  131. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/jsonrpc/interrupt_lifecycle.py +0 -0
  132. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/jsonrpc/interrupt_params.py +0 -0
  133. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/jsonrpc/interrupt_recovery.py +0 -0
  134. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/jsonrpc/interrupt_recovery_params.py +0 -0
  135. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/jsonrpc/interrupts.py +0 -0
  136. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/jsonrpc/owner_guard.py +0 -0
  137. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/jsonrpc/params.py +0 -0
  138. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/jsonrpc/params_common.py +0 -0
  139. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/jsonrpc/payload_mapping.py +0 -0
  140. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/jsonrpc/query_params.py +0 -0
  141. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/jsonrpc/request_models.py +0 -0
  142. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/jsonrpc/review_control.py +0 -0
  143. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/jsonrpc/review_control_params.py +0 -0
  144. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/jsonrpc/session_query.py +0 -0
  145. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/jsonrpc/thread_lifecycle_control.py +0 -0
  146. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/jsonrpc/thread_lifecycle_params.py +0 -0
  147. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/logging_context.py +0 -0
  148. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/media_modes.py +0 -0
  149. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/metrics.py +0 -0
  150. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/payload_helpers.py +0 -0
  151. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/profile/__init__.py +0 -0
  152. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/protocol_versions.py +0 -0
  153. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/py.typed +0 -0
  154. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/redact.py +0 -0
  155. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/server/__init__.py +0 -0
  156. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/server/call_context.py +0 -0
  157. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/server/database.py +0 -0
  158. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/server/http_middlewares.py +0 -0
  159. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/server/migrations.py +0 -0
  160. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/server/openapi.py +0 -0
  161. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/server/openapi_contract_fragments.py +0 -0
  162. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/server/output_negotiation.py +0 -0
  163. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/server/push_config_store.py +0 -0
  164. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/server/runtime_limits.py +0 -0
  165. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/server/runtime_state.py +0 -0
  166. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/server/runtime_state_schema.py +0 -0
  167. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/server/task_store.py +0 -0
  168. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/upstream/__init__.py +0 -0
  169. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/upstream/discovery_payloads.py +0 -0
  170. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/upstream/interrupt_bridge.py +0 -0
  171. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/upstream/interrupts.py +0 -0
  172. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/upstream/models.py +0 -0
  173. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/upstream/notification_mapping.py +0 -0
  174. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/upstream/stream_bridge.py +0 -0
  175. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a/upstream/transport.py +0 -0
  176. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a.egg-info/dependency_links.txt +0 -0
  177. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a.egg-info/entry_points.txt +0 -0
  178. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/src/codex_a2a.egg-info/top_level.txt +0 -0
  179. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/__init__.py +0 -0
  180. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/client/__init__.py +0 -0
  181. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/client/test_agent_card.py +0 -0
  182. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/client/test_cli.py +0 -0
  183. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/client/test_client_flow.py +0 -0
  184. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/client/test_client_http_headers.py +0 -0
  185. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/client/test_client_manager.py +0 -0
  186. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/client/test_errors.py +0 -0
  187. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/client/test_lifecycle.py +0 -0
  188. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/client/test_network_policy.py +0 -0
  189. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/client/test_payload_text.py +0 -0
  190. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/client/test_request_context.py +0 -0
  191. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/config/__init__.py +0 -0
  192. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/contracts/__init__.py +0 -0
  193. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/contracts/test_extension_registry.py +0 -0
  194. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/execution/__init__.py +0 -0
  195. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/execution/test_agent_errors.py +0 -0
  196. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/execution/test_cancellation.py +0 -0
  197. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/execution/test_codex_agent_session_binding.py +0 -0
  198. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/execution/test_directory_validation.py +0 -0
  199. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/execution/test_discovery_exec_runtime.py +0 -0
  200. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/execution/test_error_redaction.py +0 -0
  201. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/execution/test_metrics.py +0 -0
  202. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/execution/test_request_metadata.py +0 -0
  203. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/execution/test_review_runtime.py +0 -0
  204. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/execution/test_session_persistence.py +0 -0
  205. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/execution/test_session_runtime.py +0 -0
  206. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/execution/test_stream_chunks.py +0 -0
  207. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/execution/test_stream_interrupts.py +0 -0
  208. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/execution/test_streaming_output_contract.py +0 -0
  209. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/execution/test_thread_lifecycle_runtime.py +0 -0
  210. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/execution/test_tool_call_payloads.py +0 -0
  211. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/fixtures/codex_app_server/command_execution_output_delta.json +0 -0
  212. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/fixtures/codex_app_server/file_change_output_delta.json +0 -0
  213. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/jsonrpc/__init__.py +0 -0
  214. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/jsonrpc/test_codex_exec_extension.py +0 -0
  215. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/jsonrpc/test_codex_session_extension.py +0 -0
  216. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/jsonrpc/test_codex_thread_lifecycle_extension.py +0 -0
  217. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/jsonrpc/test_error_redaction.py +0 -0
  218. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/jsonrpc/test_guard_hooks.py +0 -0
  219. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/jsonrpc/test_interrupt_lifecycle.py +0 -0
  220. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/jsonrpc/test_interrupt_params.py +0 -0
  221. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/jsonrpc/test_interrupt_protocol_handlers.py +0 -0
  222. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/package/__init__.py +0 -0
  223. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/package/test_logging.py +0 -0
  224. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/package/test_publish_github_release_script.py +0 -0
  225. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/package/test_typing_contract.py +0 -0
  226. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/package/test_version.py +0 -0
  227. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/profile/__init__.py +0 -0
  228. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/scripts/__init__.py +0 -0
  229. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/scripts/test_audit_low_call_sites.py +0 -0
  230. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/scripts/test_tck_auth_plugin.py +0 -0
  231. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/server/__init__.py +0 -0
  232. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/server/test_auth.py +0 -0
  233. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/server/test_call_context_builder.py +0 -0
  234. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/server/test_cli.py +0 -0
  235. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/server/test_database.py +0 -0
  236. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/server/test_database_app_persistence.py +0 -0
  237. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/server/test_http_boundary.py +0 -0
  238. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/server/test_migrations.py +0 -0
  239. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/server/test_output_negotiation.py +0 -0
  240. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/server/test_push_config_store.py +0 -0
  241. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/server/test_runtime_limits.py +0 -0
  242. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/server/test_runtime_state.py +0 -0
  243. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/server/test_task_store.py +0 -0
  244. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/support/__init__.py +0 -0
  245. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/support/context.py +0 -0
  246. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/support/dummy_clients.py +0 -0
  247. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/support/fixtures.py +0 -0
  248. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/support/http_auth.py +0 -0
  249. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/support/jsonrpc_errors.py +0 -0
  250. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/support/settings.py +0 -0
  251. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/test_a2a_proto.py +0 -0
  252. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/test_protocol_versions.py +0 -0
  253. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/test_redact.py +0 -0
  254. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/upstream/__init__.py +0 -0
  255. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/upstream/test_interrupt_bridge.py +0 -0
  256. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/upstream/test_interrupt_persistence.py +0 -0
  257. {codex_a2a-1.3.1 → codex_a2a-1.3.3}/tests/upstream/test_modular_upstream_components.py +0 -0
@@ -1,4 +1,4 @@
1
- name: Scheduled Compatibility
1
+ name: Scheduled Codex Compatibility
2
2
 
3
3
  on:
4
4
  workflow_dispatch:
@@ -9,39 +9,6 @@ permissions:
9
9
  contents: read
10
10
 
11
11
  jobs:
12
- a2a-tck:
13
- name: A2A Mandatory TCK
14
- runs-on: ubuntu-latest
15
- timeout-minutes: 30
16
-
17
- steps:
18
- - name: Checkout
19
- uses: actions/checkout@v6
20
-
21
- - name: Setup Python
22
- uses: actions/setup-python@v6
23
- with:
24
- python-version: "3.13"
25
-
26
- - name: Setup uv
27
- uses: astral-sh/setup-uv@v7
28
- with:
29
- enable-cache: true
30
-
31
- - name: Run pinned mandatory TCK
32
- env:
33
- CONFORMANCE_TCK_REF: 5996b79f9cefa6fc390980e383e358a66fb9e49e # pragma: allowlist secret
34
- run: bash ./scripts/conformance.sh mandatory
35
-
36
- - name: Upload TCK evidence
37
- if: always()
38
- uses: actions/upload-artifact@v7
39
- with:
40
- name: a2a-tck-evidence
41
- path: run/conformance/
42
- if-no-files-found: error
43
- retention-days: 14
44
-
45
12
  live-codex:
46
13
  name: Latest Codex App Server Smoke
47
14
  runs-on: ubuntu-latest
@@ -6,12 +6,21 @@ repos:
6
6
  - id: trailing-whitespace
7
7
  - id: end-of-file-fixer
8
8
  - id: check-yaml
9
- - repo: https://github.com/astral-sh/ruff-pre-commit
10
- rev: v0.14.14
9
+ - repo: local
11
10
  hooks:
12
11
  - id: ruff
12
+ name: ruff check (uv)
13
+ entry: uv run --locked --extra dev ruff check --force-exclude
14
+ language: system
15
+ types_or: [python, pyi, jupyter]
16
+ require_serial: true
13
17
  args: ["--fix"]
14
18
  - id: ruff-format
19
+ name: ruff format (uv)
20
+ entry: uv run --locked --extra dev ruff format --force-exclude
21
+ language: system
22
+ types_or: [python, pyi, jupyter]
23
+ require_serial: true
15
24
  - repo: https://github.com/Yelp/detect-secrets
16
25
  rev: v1.5.0
17
26
  hooks:
@@ -72,9 +72,11 @@ bash -n scripts/smoke_test_built_cli.sh
72
72
 
73
73
  If `pre-commit` rewrites files, review the rewritten output and re-run the checks until the working tree is clean.
74
74
 
75
+ Ruff's version is declared in the `dev` extra in `pyproject.toml` and resolved in `uv.lock`. The local pre-commit hooks run `uv run --locked --extra dev ruff`, so direct commands, hooks, and CI use the same project dependency. To upgrade Ruff, update that dependency and regenerate `uv.lock`; there is no separate Ruff hook revision to maintain.
76
+
75
77
  ## Compatibility Expectations
76
78
 
77
- - The repository targets Python 3.11, 3.12, and 3.13.
79
+ - The repository targets Python 3.11 through 3.14. CI uses 3.13 for the full quality gate and exercises 3.11, 3.12, and 3.14 in the runtime matrix.
78
80
  - Machine-readable declarations should match actual runtime behavior.
79
81
  - Custom extensions must remain stable within the current major line unless a change is explicitly documented as breaking.
80
82
  - Shared metadata and wire contracts should not drift between Agent Card, OpenAPI, and runtime behavior.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codex-a2a
3
- Version: 1.3.1
3
+ Version: 1.3.3
4
4
  Summary: Codex A2A runtime adapter
5
5
  Author: liujuanjuan1984@Intelligent-Internet
6
6
  License-Expression: Apache-2.0
@@ -23,14 +23,14 @@ Classifier: Topic :: Internet :: WWW/HTTP
23
23
  Requires-Python: >=3.11
24
24
  Description-Content-Type: text/markdown
25
25
  License-File: LICENSE
26
- Requires-Dist: a2a-sdk==1.1.2
26
+ Requires-Dist: a2a-sdk==1.1.5
27
27
  Requires-Dist: aiosqlite<1.0,>=0.20
28
28
  Requires-Dist: fastapi<0.142,>=0.121
29
29
  Requires-Dist: httpx<0.29,>=0.28.1
30
- Requires-Dist: protobuf<7.0,>=6.33.5
30
+ Requires-Dist: protobuf<8.0,>=6.33.5
31
31
  Requires-Dist: pydantic<3.0,>=2.6
32
32
  Requires-Dist: pydantic-settings<3.0,>=2.2
33
- Requires-Dist: sqlalchemy<3.0,>=2.0
33
+ Requires-Dist: sqlalchemy[asyncio]<3.0,>=2.0
34
34
  Requires-Dist: sse-starlette<4.0,>=2.1
35
35
  Requires-Dist: uvicorn<0.53,>=0.29
36
36
  Provides-Extra: dev
@@ -40,8 +40,8 @@ Requires-Dist: pygments<3.0,>=2.20.0; extra == "dev"
40
40
  Requires-Dist: pytest>=8.0; extra == "dev"
41
41
  Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
42
42
  Requires-Dist: pytest-cov<8.0,>=5.0; extra == "dev"
43
- Requires-Dist: diff-cover<10,>=9; extra == "dev"
44
- Requires-Dist: ruff>=0.5; extra == "dev"
43
+ Requires-Dist: diff-cover<11,>=9; extra == "dev"
44
+ Requires-Dist: ruff==0.16.9; extra == "dev"
45
45
  Requires-Dist: mypy<2.4,>=1.11; extra == "dev"
46
46
  Dynamic: license-file
47
47
 
@@ -66,7 +66,7 @@ Protocol: A2A `1.0` only.
66
66
 
67
67
  Start the runtime explicitly with `codex-a2a serve`.
68
68
 
69
- `codex-a2a` adds an A2A runtime layer to the local Codex runtime, with auth, streaming, session continuity, interrupt handling, a built-in outbound A2A client, and a clear deployment boundary.
69
+ `codex-a2a` is an independent community adapter that adds an A2A service and control boundary to the local Codex CLI/App Server, with auth, streaming, session continuity, interrupt handling, and a built-in outbound A2A client. It is not an OpenAI or A2A Project distribution or endorsement.
70
70
 
71
71
  ## What This Is
72
72
 
@@ -172,7 +172,7 @@ Use this project when:
172
172
 
173
173
  - you want to keep Codex as the runtime
174
174
  - you need A2A transports and Agent Card discovery
175
- - you want a thin service boundary instead of building your own adapter
175
+ - you want a maintained adapter/service contract instead of owning A2A transport, persistence, auth, and Codex-specific control mappings yourself
176
176
  - you want inbound serving and outbound peer access in one deployable unit
177
177
 
178
178
  Prefer **[a2a-client-hub](https://github.com/liujuanjuan1984/a2a-client-hub)** when you need a broader application-facing integration layer or higher-level A2A consumption (see [Ecosystem](#ecosystem) for details).
@@ -212,24 +212,25 @@ The normative compatibility split and deployment model live in [Compatibility Gu
212
212
  - [Architecture Guide](docs/architecture.md) System structure, boundaries, and request flow.
213
213
  - [Maintainer Architecture Guide](docs/maintainer-architecture.md) Internal module structure, request call chains, and persistence touchpoints for contributors.
214
214
  - [Compatibility Guide](docs/compatibility.md) Supported Python/runtime surface, extension stability, and ecosystem-facing compatibility expectations.
215
- - [External Conformance Experiments](docs/conformance.md) Manual A2A TCK experiment entrypoint and triage workflow.
215
+ - [Optional External TCK Experiment](docs/conformance.md) Manual, non-normative investigation guidance; it is not part of CI or compatibility claims.
216
216
  - [Security Policy](SECURITY.md) Threat model, deployment caveats, and vulnerability disclosure guidance.
217
217
 
218
218
  ## Ecosystem
219
219
 
220
- `codex-a2a` is part of a growing landscape of A2A-compliant projects. Depending on your architecture, you may find these related projects useful:
220
+ `codex-a2a` is an independent integration built on public upstream projects. The links below distinguish normative upstreams from community projects; inclusion does not imply endorsement or verified interoperability.
221
221
 
222
- ### Foundations (Upstream)
222
+ ### Normative Upstreams
223
223
 
224
- - **[Intelligent-Internet/a2a-python](https://github.com/Intelligent-Internet/a2a-python)**: The core protocol implementation and SDK used by this adapter.
225
- - **Codex**: The underlying local agent runtime (Proprietary).
224
+ - **[A2A Protocol](https://github.com/a2aproject/A2A)**: The Linux Foundation open protocol implemented by this adapter at the declared A2A `1.0` line.
225
+ - **[a2aproject/a2a-python](https://github.com/a2aproject/a2a-python)**: The official Apache-2.0 Python SDK; this repository pins the `a2a-sdk` package to `1.1.2`.
226
+ - **[openai/codex](https://github.com/openai/codex)**: The Apache-2.0 Codex CLI repository containing the local App Server used by this adapter. OpenAI's [open-source component list](https://developers.openai.com/codex/open-source) identifies the IDE extension and Codex cloud as not open source. Desktop and web product behavior is also separate from this local runtime and outside this repository's compatibility claim.
226
227
 
227
- ### Gateways & Hubs (Vertical Integration)
228
+ ### Community Gateways and Hubs
228
229
 
229
- - **[liujuanjuan1984/a2a-client-hub](https://github.com/liujuanjuan1984/a2a-client-hub)**: An application-facing integration layer that consumes A2A-compliant instances (like `codex-a2a`) and provides higher-level normalization.
230
+ - **[liujuanjuan1984/a2a-client-hub](https://github.com/liujuanjuan1984/a2a-client-hub)**: An application-facing integration layer for consuming A2A services such as `codex-a2a` and providing higher-level normalization.
230
231
  - **[jinyitao123/a2a-gateway](https://github.com/jinyitao123/a2a-gateway)**: Operates at the protocol-bridging layer, sitting between agent platforms and the A2A/MCP ecosystem to handle discovery and routing.
231
232
 
232
- ### Alternative Implementations & Runtimes (Horizontal Differences)
233
+ ### Community Implementations and Runtimes
233
234
 
234
235
  - **[Intelligent-Internet/opencode-a2a](https://github.com/Intelligent-Internet/opencode-a2a)**: A complementary Python runtime implementation that shares similar protocol patterns and output negotiation practices.
235
236
  - **[MyPrototypeWhat/codex-a2a](https://github.com/MyPrototypeWhat/codex-a2a)**: A lightweight **TypeScript** Express middleware implementation. Ideal for developers looking for in-process SDK integration within a Node.js environment.
@@ -19,7 +19,7 @@ Protocol: A2A `1.0` only.
19
19
 
20
20
  Start the runtime explicitly with `codex-a2a serve`.
21
21
 
22
- `codex-a2a` adds an A2A runtime layer to the local Codex runtime, with auth, streaming, session continuity, interrupt handling, a built-in outbound A2A client, and a clear deployment boundary.
22
+ `codex-a2a` is an independent community adapter that adds an A2A service and control boundary to the local Codex CLI/App Server, with auth, streaming, session continuity, interrupt handling, and a built-in outbound A2A client. It is not an OpenAI or A2A Project distribution or endorsement.
23
23
 
24
24
  ## What This Is
25
25
 
@@ -125,7 +125,7 @@ Use this project when:
125
125
 
126
126
  - you want to keep Codex as the runtime
127
127
  - you need A2A transports and Agent Card discovery
128
- - you want a thin service boundary instead of building your own adapter
128
+ - you want a maintained adapter/service contract instead of owning A2A transport, persistence, auth, and Codex-specific control mappings yourself
129
129
  - you want inbound serving and outbound peer access in one deployable unit
130
130
 
131
131
  Prefer **[a2a-client-hub](https://github.com/liujuanjuan1984/a2a-client-hub)** when you need a broader application-facing integration layer or higher-level A2A consumption (see [Ecosystem](#ecosystem) for details).
@@ -165,24 +165,25 @@ The normative compatibility split and deployment model live in [Compatibility Gu
165
165
  - [Architecture Guide](docs/architecture.md) System structure, boundaries, and request flow.
166
166
  - [Maintainer Architecture Guide](docs/maintainer-architecture.md) Internal module structure, request call chains, and persistence touchpoints for contributors.
167
167
  - [Compatibility Guide](docs/compatibility.md) Supported Python/runtime surface, extension stability, and ecosystem-facing compatibility expectations.
168
- - [External Conformance Experiments](docs/conformance.md) Manual A2A TCK experiment entrypoint and triage workflow.
168
+ - [Optional External TCK Experiment](docs/conformance.md) Manual, non-normative investigation guidance; it is not part of CI or compatibility claims.
169
169
  - [Security Policy](SECURITY.md) Threat model, deployment caveats, and vulnerability disclosure guidance.
170
170
 
171
171
  ## Ecosystem
172
172
 
173
- `codex-a2a` is part of a growing landscape of A2A-compliant projects. Depending on your architecture, you may find these related projects useful:
173
+ `codex-a2a` is an independent integration built on public upstream projects. The links below distinguish normative upstreams from community projects; inclusion does not imply endorsement or verified interoperability.
174
174
 
175
- ### Foundations (Upstream)
175
+ ### Normative Upstreams
176
176
 
177
- - **[Intelligent-Internet/a2a-python](https://github.com/Intelligent-Internet/a2a-python)**: The core protocol implementation and SDK used by this adapter.
178
- - **Codex**: The underlying local agent runtime (Proprietary).
177
+ - **[A2A Protocol](https://github.com/a2aproject/A2A)**: The Linux Foundation open protocol implemented by this adapter at the declared A2A `1.0` line.
178
+ - **[a2aproject/a2a-python](https://github.com/a2aproject/a2a-python)**: The official Apache-2.0 Python SDK; this repository pins the `a2a-sdk` package to `1.1.2`.
179
+ - **[openai/codex](https://github.com/openai/codex)**: The Apache-2.0 Codex CLI repository containing the local App Server used by this adapter. OpenAI's [open-source component list](https://developers.openai.com/codex/open-source) identifies the IDE extension and Codex cloud as not open source. Desktop and web product behavior is also separate from this local runtime and outside this repository's compatibility claim.
179
180
 
180
- ### Gateways & Hubs (Vertical Integration)
181
+ ### Community Gateways and Hubs
181
182
 
182
- - **[liujuanjuan1984/a2a-client-hub](https://github.com/liujuanjuan1984/a2a-client-hub)**: An application-facing integration layer that consumes A2A-compliant instances (like `codex-a2a`) and provides higher-level normalization.
183
+ - **[liujuanjuan1984/a2a-client-hub](https://github.com/liujuanjuan1984/a2a-client-hub)**: An application-facing integration layer for consuming A2A services such as `codex-a2a` and providing higher-level normalization.
183
184
  - **[jinyitao123/a2a-gateway](https://github.com/jinyitao123/a2a-gateway)**: Operates at the protocol-bridging layer, sitting between agent platforms and the A2A/MCP ecosystem to handle discovery and routing.
184
185
 
185
- ### Alternative Implementations & Runtimes (Horizontal Differences)
186
+ ### Community Implementations and Runtimes
186
187
 
187
188
  - **[Intelligent-Internet/opencode-a2a](https://github.com/Intelligent-Internet/opencode-a2a)**: A complementary Python runtime implementation that shares similar protocol patterns and output negotiation practices.
188
189
  - **[MyPrototypeWhat/codex-a2a](https://github.com/MyPrototypeWhat/codex-a2a)**: A lightweight **TypeScript** Express middleware implementation. Ideal for developers looking for in-process SDK integration within a Node.js environment.
@@ -93,7 +93,7 @@ Use the docs by responsibility:
93
93
  - [Maintainer Architecture Guide](maintainer-architecture.md): internal module boundaries, request call chains, and persistence touchpoints
94
94
  - [Extension Specifications](extension-specifications.md): stable extension URI/spec index and public-vs-extended disclosure rules
95
95
  - [Compatibility Guide](compatibility.md): current compatibility promises and stability expectations
96
- - [External Conformance Experiments](conformance.md): manual A2A TCK experiment entrypoint and triage workflow
96
+ - [Optional External TCK Experiment](conformance.md): manual, non-normative investigation entrypoint and spec-first triage guidance
97
97
  - [Contributing Guide](../CONTRIBUTING.md): contributor workflow and validation
98
98
  - [Security Policy](../SECURITY.md): threat model and disclosure guidance
99
99
 
@@ -4,13 +4,21 @@ This document explains the compatibility promises this repository currently trie
4
4
 
5
5
  ## Runtime Support
6
6
 
7
- - Python versions: 3.11, 3.12, 3.13
8
- - A2A SDK line: `1.0.x`
9
- - A2A protocol version advertised by default: `1.0`
10
- - Normalized protocol compatibility lines declared today: `1.0`
7
+ | Layer | Supported contract | Evidence and boundary |
8
+ | --- | --- | --- |
9
+ | Python | 3.11–3.14 | Package classifiers cover all four versions; CI runs 3.13 as the quality gate and 3.11, 3.12, and 3.14 in the runtime matrix. |
10
+ | A2A Python SDK | Exactly `a2a-sdk==1.1.5` | Pinned in `pyproject.toml`; this is the [official A2A Python SDK](https://github.com/a2aproject/a2a-python), not a fork. |
11
+ | Protocol Buffers | `protobuf>=6.33.5,<8.0` | The lockfile selects 7.36.2. SDK 1.1.5 supports protobuf 7; Google API Core, common protos, and proto-plus must resolve within the same range. Task retrieval delegates validation and history trimming to the SDK. |
12
+ | SQLAlchemy | `sqlalchemy[asyncio]>=2.0,<3.0` | The `asyncio` extra explicitly installs `greenlet` for the async persistence engine, including standalone wheel installations. The lockfile selects the development version. |
13
+ | A2A protocol | `1.0` wire line | The released upstream A2A specification is normative for portable core semantics; the current compatible release is `v1.0.1`. SDK compatibility with other protocol versions does not extend this adapter's claim. |
14
+ | Inbound A2A transports | JSON-RPC and HTTP+JSON | Both are repository-owned runtime surfaces. gRPC is not exposed by this adapter. |
15
+ | Codex local runtime | Codex CLI/App Server | The local [Apache-2.0 Codex CLI](https://github.com/openai/codex) is the upstream process boundary. Scheduled smoke tests install the latest stable CLI and complete a real local App Server turn. |
16
+ | Codex App Server API | Stable methods by default | Stable and opt-in experimental schema dependencies are checked; the real turn smoke stays on the stable API. Experimental plugin methods require `CODEX_ENABLE_EXPERIMENTAL_API=true` and are not part of the default contract. |
11
17
 
12
18
  The repository pins the SDK version in `pyproject.toml` and validates the published CLI build in CI. Upgrade the SDK deliberately rather than relying on floating dependency resolution.
13
19
 
20
+ This repository is an independent community project. The [A2A Protocol project](https://github.com/a2aproject/A2A), its official SDK, and the OpenAI Codex CLI are upstream dependencies or specifications, not organizational ownership or endorsement of `codex-a2a`. OpenAI's [open-source component list](https://developers.openai.com/codex/open-source) identifies the IDE extension and Codex cloud as not open source. Desktop and web products are also separate product surfaces; their availability and behavior are not inherited from the open-source CLI/App Server contract and are outside this compatibility matrix.
21
+
14
22
  The OpenAPI-published compatibility profile and wire contract publish `default_protocol_version`, `supported_protocol_versions`, and `protocol_compatibility`. Request-time `A2A-Version` negotiation now targets the repository's `1.0` baseline only, and the published contracts should describe the implemented `1.0` transport surface rather than any legacy compatibility line.
15
23
 
16
24
  ## Contract Honesty
@@ -37,14 +45,19 @@ Open-source consumption guidance:
37
45
 
38
46
  ## Normative Sources
39
47
 
40
- When documentation or reference material disagrees, treat these as normative in this order:
48
+ For portable A2A core semantics, treat these sources in this order:
41
49
 
42
- - runtime behavior validated by tests
43
- - machine-readable discovery output such as Agent Card, authenticated extended card, and OpenAPI metadata
50
+ - the latest compatible released upstream A2A specification (`v1.0.x` for this repository's `1.0` wire line)
51
+ - machine-readable discovery output such as Agent Card, authenticated extended card, and OpenAPI metadata, which declares the subset implemented here but cannot override the upstream core protocol
52
+ - runtime behavior validated by tests, which is implementation evidence rather than authority when it disagrees with the protocol
44
53
  - repository-owned docs in `README.md`, `docs/`, and `CONTRIBUTING.md`
45
54
 
55
+ The A2A TCK is deliberately excluded from this normative order and from automated repository gates. Its spec snapshot and test assumptions may lag the released protocol; maintainers may run it manually as optional investigation input, but its result does not establish or reject compatibility.
56
+
46
57
  Maintainer-local upstream Codex snapshots generated via `scripts/sync_codex_docs.sh` are optional reference inputs for comparison and protocol context. They do not override this repository's declared service contract.
47
58
 
59
+ Upstream App Server stability labels also do not become repository promises automatically. Stable upstream methods enter this adapter's contract only after mapping, disclosure, and regression coverage; experimental upstream methods remain opt-in and may change with the installed Codex version.
60
+
48
61
  ## Compatibility-Sensitive Surface
49
62
 
50
63
  This repository still ships as an alpha project. Within that alpha line, these declared surfaces should not drift silently:
@@ -99,9 +112,9 @@ Execution-environment boundary fields are also published through the runtime pro
99
112
  - Only shared request/response extensions currently participate in request-level `A2A-Extensions` negotiation. Provider-private extension URIs declared on the authenticated extended card are declaration-only unless explicitly documented otherwise; clients discover them there and then invoke their documented methods directly.
100
113
  - Product-specific extensions should remain stable within the current major line unless explicitly documented otherwise.
101
114
  - Deployment-conditional methods must be declared as conditional rather than silently disappearing.
102
- - Rich input mapping is compatibility-sensitive across the core A2A message surface and `codex.turns.steer`. Changes to supported part types, `Part(url|raw)` image handling, or `Part(data)` mention/skill mapping should be treated as wire-level behavior changes.
115
+ - Rich input mapping is compatibility-sensitive across the core A2A message surface and `codex.turns.steer`. Changes to supported part types, `Part(url|raw)` image handling, `Part(data)` mention mapping, or the opaque `skill:v1` handle resolution/error contract should be treated as wire-level behavior changes. Client-supplied `skill.path` is never part of the accepted contract.
103
116
  - `codex.exec.*` is compatibility-sensitive as the standalone interactive exec contract. Changes to handle shapes, task-stream delivery, or lifecycle method names should be treated as wire-level changes.
104
- - `codex.discovery.*` is compatibility-sensitive as the stable discovery contract for normalized skill/app/plugin summaries and `mention_path` identifiers. Local paths (`skill.path`, marketplace paths) and raw upstream records are intentionally excluded from discovery responses; changes to normalized item fields, plugin marketplace mapping, or discovery watch task payload kinds should be treated as wire-level changes.
117
+ - `codex.discovery.*` is compatibility-sensitive as the stable discovery contract for normalized skill/app/plugin summaries, opaque skill handles, and `mention_path` identifiers. Local paths (`skill.path`, marketplace paths) and raw upstream records are intentionally excluded from discovery responses; changes to normalized item fields, handle format/resolution, plugin marketplace mapping, or discovery watch task payload kinds should be treated as wire-level changes.
105
118
  - `codex.threads.*` is compatibility-sensitive as the provider-private thread lifecycle contract. Changes to lifecycle method names, watch payload kinds, or watch-task bridge event names should be treated as wire-level changes.
106
119
  - `codex.turns.*` is compatibility-sensitive as the active-turn control contract. Changes to `expected_turn_id` semantics, same-turn rich-input handling, or rejected override fields should be treated as wire-level changes.
107
120
  - `codex.review.*` is compatibility-sensitive as the review control and watch contract. Changes to supported target types, `delivery` semantics, review watch payload kinds, or review watch event names should be treated as wire-level changes.
@@ -160,7 +173,8 @@ This repository distinguishes between three layers:
160
173
 
161
174
  Discovery note:
162
175
 
163
- - `codex.discovery.skills.list`, `codex.discovery.apps.list`, `codex.discovery.plugins.list`, and `codex.discovery.plugins.read` are declared read-only discovery methods.
176
+ - `codex.discovery.skills.list` and `codex.discovery.apps.list` are stable read-only discovery methods. Experimental `codex.discovery.plugins.list` and `codex.discovery.plugins.read` are disabled and omitted from discovery by default; enable them explicitly with `CODEX_ENABLE_EXPERIMENTAL_API=true`.
177
+ - Skill discovery returns opaque `skill:v1` handles. Core A2A skill data parts and `codex.turns.steer` accept the handle, resolve it only against the current enabled `skills/list` result, and reject client-supplied local paths.
164
178
  - `codex.discovery.watch` is the declared bridge for upstream `skills/changed` and `app/list/updated` notifications.
165
179
  - `codex.threads.watch` is the declared thread lifecycle watch-task bridge for upstream `thread/started`, `thread/status/changed`, `thread/archived`, `thread/unarchived`, and `thread/closed` notifications.
166
180
  - `codex.threads.watch.release` is the declared ownership-scoped control method for releasing a watch task created by `codex.threads.watch`.
@@ -1,11 +1,13 @@
1
- # External Conformance Triage
1
+ # Optional TCK Observation Triage
2
2
 
3
3
  This document is the standing triage template for local `./scripts/conformance.sh` runs against the official `a2aproject/a2a-tck`.
4
4
 
5
- ## Standards Used For Triage
5
+ ## Authorities Used For Triage
6
6
 
7
- - `a2a-sdk==1.1.2` as installed in this repository.
7
+ - The latest compatible released upstream A2A specification is authoritative; currently this is `v1.0.1` for the repository's advertised `1.0` wire line.
8
+ - `a2a-sdk==1.1.5` as installed in this repository.
8
9
  - The default A2A protocol version advertised by this repository: `1.0`.
10
+ - TCK assertions are non-normative observations and may lag the released specification.
9
11
  - Repository compatibility policy:
10
12
  - machine-readable Agent Card and OpenAPI contracts must reflect implemented runtime behavior;
11
13
  - external TCK results are investigation input rather than default merge gates;
@@ -14,7 +16,7 @@ This document is the standing triage template for local `./scripts/conformance.s
14
16
  ## Classification Labels
15
17
 
16
18
  - `Runtime issue`: the failure reproduces against the repository's declared runtime behavior and should be fixed here.
17
- - `TCK mismatch`: the failure appears to conflict with the installed SDK line or this repository's declared `1.0` baseline.
19
+ - `TCK mismatch`: the failure conflicts with the latest compatible released A2A specification or relies on a TCK-specific assumption.
18
20
  - `Protocol gap`: the failure identifies work needed to complete the repository's declared `1.0` surface.
19
21
  - `Local experiment artifact`: the failure comes from the dummy-backed SUT, local auth, local URLs, timing, or other experiment setup details.
20
22
  - `Needs repro`: the failure needs a focused local probe before assigning ownership.
@@ -25,9 +27,9 @@ For each failed or errored node ID:
25
27
 
26
28
  1. Copy the node ID from `failed-tests.json`.
27
29
  2. Inspect the corresponding raw details in `pytest-report.json` and `tck.log`.
28
- 3. Compare the expectation with `docs/compatibility.md`, authenticated extended card skills/examples, and OpenAPI `x-a2a-extension-contracts`.
30
+ 3. Compare the expectation first with the latest compatible released A2A specification, then with `docs/compatibility.md`, authenticated extended card skills/examples, and OpenAPI `x-a2a-extension-contracts`.
29
31
  4. Assign one classification label.
30
- 5. Record whether the next action belongs in this repository, the TCK, or a future protocol compatibility issue.
32
+ 5. Record whether the next action belongs in this repository, the TCK, or a future protocol compatibility issue. A TCK failure alone is never sufficient evidence for a runtime change.
31
33
 
32
34
  ## Per-Test Triage
33
35
 
@@ -1,13 +1,14 @@
1
- # External Conformance Experiments
1
+ # Optional External TCK Experiment
2
2
 
3
- This repository keeps internal regression and external interoperability experiments separate on purpose.
3
+ The A2A TCK is an optional manual investigation tool. It is not a repository compatibility dependency, protocol authority, CI job, or merge gate.
4
4
 
5
5
  ## Scope
6
6
 
7
7
  - `./scripts/validate_baseline.sh` remains the default internal regression entrypoint.
8
- - `./scripts/conformance.sh` is a local/manual experiment entrypoint for official external tooling.
9
- - External conformance output is investigation input, not an automatic merge gate.
10
- - `.github/workflows/compatibility.yml` runs the mandatory TCK weekly against a pinned TCK commit and preserves its evidence as a workflow artifact.
8
+ - `./scripts/conformance.sh` is a local/manual experiment entrypoint for external tooling.
9
+ - TCK output is untrusted investigation input and cannot establish or reject protocol compatibility.
10
+ - The current TCK embeds an A2A `v1.0.0` specification snapshot while the compatible released protocol has advanced to `v1.0.1`; maintainers must check the released specification directly.
11
+ - No repository workflow runs or gates on the TCK.
11
12
 
12
13
  ## Current Experiment Shape
13
14
 
@@ -33,7 +34,7 @@ bash ./scripts/conformance.sh
33
34
  Run a different TCK category:
34
35
 
35
36
  ```bash
36
- bash ./scripts/conformance.sh capabilities
37
+ bash ./scripts/conformance.sh should
37
38
  ```
38
39
 
39
40
  Target an already running runtime instead of the local dummy-backed SUT:
@@ -72,13 +73,14 @@ Each run keeps the following artifacts in the selected output directory:
72
73
  When a TCK run fails, inspect the raw report before changing the runtime:
73
74
 
74
75
  - Some failures may point to real runtime gaps.
75
- - Some failures may come from TCK assumptions that do not match `a2a-sdk==1.1.2`.
76
+ - Some failures may reflect an outdated embedded specification or a TCK-specific interpretation. Resolve those disagreements against the latest compatible released A2A specification.
77
+ - Some failures may come from TCK assumptions that do not match `a2a-sdk==1.1.5`.
76
78
  - Some failures may come from older A2A naming or schema expectations that no longer match the repository's `1.0` contract.
77
79
  - Some failures may be local experiment artifacts from the dummy-backed runtime.
78
80
 
79
- The experiment is useful only if those categories stay separate during triage.
81
+ The experiment is useful only if those categories stay separate during triage. Never convert a TCK result directly into a compatibility claim or an implementation change.
80
82
  Use the authenticated compatibility profile and wire contract `protocol_compatibility` fields as the repository-owned declaration of which protocol lines are supported today.
81
83
 
82
- The same scheduled workflow installs the latest stable Codex CLI and runs `scripts/smoke_test_live_codex.sh`. The smoke check only verifies the real stdio app-server initialization and shutdown handshake; it does not send a model request or require provider credentials.
84
+ The separate scheduled Codex workflow installs the latest stable Codex CLI and runs `scripts/smoke_test_live_codex.sh`. It does not invoke the A2A TCK.
83
85
 
84
86
  Record first-pass classifications in [conformance-triage.md](./conformance-triage.md).
@@ -271,7 +271,8 @@ These variables are forwarded to the local `codex app-server` subprocess.
271
271
  - `CODEX_WORKSPACE_ROOT`: default Codex workspace root (optional)
272
272
  - `CODEX_CLI_BIN`: Codex CLI binary path, default `codex`
273
273
  - For long-running Linux deployments managed by PM2, systemd, or similar supervisors, set this explicitly to the bundled native Codex binary.
274
- - `CODEX_MODEL`: default Codex model, default `gpt-5.1-codex`
274
+ - `CODEX_ENABLE_EXPERIMENTAL_API`: opt in to Codex App Server experimental APIs, default `false`; currently enables plugin discovery only
275
+ - `CODEX_MODEL`: optional startup model override; when unset, Codex selects its configured/default model
275
276
  - `CODEX_APPROVAL_POLICY`: default approval policy (`never`, `on-request`, etc.)
276
277
  - `CODEX_SANDBOX_MODE`: default sandbox mode (`danger-full-access`, `read-only`, etc.)
277
278
  - `CODEX_TIMEOUT`: request timeout in seconds, default `120`
@@ -371,6 +372,7 @@ These variables are forwarded to the local `codex app-server` subprocess.
371
372
  | `A2A_EXECUTION_WRITE_OUTSIDE_WORKSPACE` | Discovery write outside |
372
373
  | `CODEX_CLI_BIN` | Codex CLI path |
373
374
  | `CODEX_APP_SERVER_LISTEN` | Codex listen target |
375
+ | `CODEX_ENABLE_EXPERIMENTAL_API` | Opt in to experimental App Server APIs |
374
376
  | `CODEX_WORKSPACE_ROOT` | Workspace root |
375
377
  | `CODEX_MODEL` | Default model |
376
378
  | `CODEX_MODEL_ID` | Turn model override |
@@ -434,7 +436,6 @@ A2A_PORT=8000 \
434
436
  A2A_PUBLIC_URL=http://127.0.0.1:8000 \
435
437
  A2A_DATABASE_URL=sqlite+aiosqlite:////abs/path/to/workspace/.codex-a2a/codex-a2a.db \
436
438
  CODEX_WORKSPACE_ROOT=/abs/path/to/workspace \
437
- CODEX_MODEL=gpt-5.1-codex \
438
439
  CODEX_APPROVAL_POLICY=never \
439
440
  CODEX_SANDBOX_MODE=danger-full-access \
440
441
  CODEX_MODEL_REASONING_EFFORT=high \
@@ -529,8 +530,9 @@ On the current npm global install layout for Linux x64, the command above resolv
529
530
  - Those provider-private skills use narrower `output_modes` where practical: query/control/watch handle surfaces declare `application/json` when their primary contract is a structured JSON-RPC result or `Part(data)` watch payload, while `codex.exec.stream` declares `text/plain` because stdout/stderr deltas and terminal summaries are emitted as `Part(text)`.
530
531
  - On the core chat surface, the `application/json` input mode is intentionally narrower than arbitrary JSON: only `Part(data={"type":"mention"|"skill", ...})` is part of the declared stable contract.
531
532
  - Image input maps to upstream `turn/start.input[].type=input_image`.
532
- - `mention.path` and `skill.path` are forwarded verbatim. The service does not guess app or plugin identifiers from display names.
533
- - Discovery responses no longer expose local `skill.path` values; callers that need rich-input skill items must supply the path from their own context.
533
+ - `mention.path` is forwarded verbatim. The service does not guess app or plugin identifiers from display names.
534
+ - Skill input accepts only the opaque `handle` returned by `codex.discovery.skills.list`; client-supplied `skill.path` is rejected. The service refreshes `skills/list`, verifies that the handle still resolves uniquely to an enabled skill, and only then supplies the current local name/path to Codex.
535
+ - Skill handles use `skill:v1:<base64url-sha256>`. They are opaque, contain no reversible local path, and may expire when the discovered skill identity changes. Stable resolution errors distinguish invalid, missing/expired, disabled, ambiguous, and unavailable-discovery cases.
534
536
  - `local_image` is not part of the current declared stable rich-input contract.
535
537
  - Session query projections currently use the upstream Codex `session_id` as the A2A `contextId`. In that projection surface, `contextId` is the canonical session identity and the adapter does not duplicate the same value under `metadata.shared.session.id`.
536
538
  - Completed chat turns are persisted as `completed`; `input-required` is reserved for active interrupt asks that still need a reply.
@@ -707,12 +709,12 @@ This service exposes read-only Codex discovery methods through JSON-RPC:
707
709
 
708
710
  - `codex.discovery.skills.list`
709
711
  - `codex.discovery.apps.list`
710
- - `codex.discovery.plugins.list`
711
- - `codex.discovery.plugins.read`
712
+ - `codex.discovery.plugins.list` (experimental; requires `CODEX_ENABLE_EXPERIMENTAL_API=true`)
713
+ - `codex.discovery.plugins.read` (experimental; requires `CODEX_ENABLE_EXPERIMENTAL_API=true`)
712
714
 
713
715
  Use these methods before constructing rich input:
714
716
 
715
- - `skills.list` returns stable skill `name`/`scope` values; local skill paths are intentionally not exposed
717
+ - `skills.list` returns stable skill metadata plus an opaque `handle`; local skill paths are intentionally not exposed
716
718
  - `apps.list` returns stable `mention_path=app://<id>` values
717
719
  - `plugins.list` and `plugins.read` return stable `mention_path=plugin://<plugin>@<marketplace>` values
718
720
 
@@ -720,7 +722,8 @@ Result-shape guidance:
720
722
 
721
723
  - use the normalized stable fields declared in Agent Card / OpenAPI first
722
724
  - discovery responses are whitelisted summaries; raw upstream records and local paths are intentionally excluded
723
- - `plugin/list` and `plugin/read` remain upstream experimental; this service exposes a stable minimum subset without raw passthrough
725
+ - `plugin/list` and `plugin/read` remain upstream experimental, are disabled by default, and are advertised only after `CODEX_ENABLE_EXPERIMENTAL_API=true`; the opt-in adapter response remains a whitelisted minimum subset without raw passthrough
726
+ - construct skill rich input as `Part(data={"type":"skill","handle":"skill:v1:..."})`; never send a server-local path
724
727
 
725
728
  ### Skills List (`codex.discovery.skills.list`)
726
729
 
@@ -734,7 +737,7 @@ curl -sS http://127.0.0.1:8000/ \
734
737
  "method": "codex.discovery.skills.list",
735
738
  "params": {
736
739
  "cwds": ["/workspace/project"],
737
- "forceReload": true
740
+ "force_reload": true
738
741
  }
739
742
  }'
740
743
  ```
@@ -751,13 +754,15 @@ curl -sS http://127.0.0.1:8000/ \
751
754
  "method": "codex.discovery.apps.list",
752
755
  "params": {
753
756
  "limit": 20,
754
- "forceRefetch": false
757
+ "force_refetch": false
755
758
  }
756
759
  }'
757
760
  ```
758
761
 
759
762
  ### Plugins List (`codex.discovery.plugins.list`)
760
763
 
764
+ This method is available only when the service starts with `CODEX_ENABLE_EXPERIMENTAL_API=true`.
765
+
761
766
  ```bash
762
767
  curl -sS http://127.0.0.1:8000/ \
763
768
  -H 'content-type: application/json' \
@@ -768,13 +773,15 @@ curl -sS http://127.0.0.1:8000/ \
768
773
  "method": "codex.discovery.plugins.list",
769
774
  "params": {
770
775
  "cwds": ["/workspace/project"],
771
- "forceRemoteSync": false
776
+ "force_remote_sync": false
772
777
  }
773
778
  }'
774
779
  ```
775
780
 
776
781
  ### Plugin Read (`codex.discovery.plugins.read`)
777
782
 
783
+ This method is available only when the service starts with `CODEX_ENABLE_EXPERIMENTAL_API=true`.
784
+
778
785
  ```bash
779
786
  curl -sS http://127.0.0.1:8000/ \
780
787
  -H 'content-type: application/json' \
@@ -784,8 +791,8 @@ curl -sS http://127.0.0.1:8000/ \
784
791
  "id": 14,
785
792
  "method": "codex.discovery.plugins.read",
786
793
  "params": {
787
- "marketplacePath": "/workspace/project/.codex/plugins/marketplace.json",
788
- "pluginName": "sample"
794
+ "marketplace_path": "/workspace/project/.codex/plugins/marketplace.json",
795
+ "plugin_name": "sample"
789
796
  }
790
797
  }'
791
798
  ```
@@ -25,14 +25,14 @@ classifiers = [
25
25
  "Topic :: Internet :: WWW/HTTP",
26
26
  ]
27
27
  dependencies = [
28
- "a2a-sdk==1.1.2",
28
+ "a2a-sdk==1.1.5",
29
29
  "aiosqlite>=0.20,<1.0",
30
30
  "fastapi>=0.121,<0.142",
31
31
  "httpx>=0.28.1,<0.29",
32
- "protobuf>=6.33.5,<7.0",
32
+ "protobuf>=6.33.5,<8.0",
33
33
  "pydantic>=2.6,<3.0",
34
34
  "pydantic-settings>=2.2,<3.0",
35
- "sqlalchemy>=2.0,<3.0",
35
+ "sqlalchemy[asyncio]>=2.0,<3.0",
36
36
  "sse-starlette>=2.1,<4.0",
37
37
  "uvicorn>=0.29,<0.53",
38
38
  ]
@@ -45,8 +45,8 @@ dev = [
45
45
  "pytest>=8.0",
46
46
  "pytest-asyncio>=0.23",
47
47
  "pytest-cov>=5.0,<8.0",
48
- "diff-cover>=9,<10",
49
- "ruff>=0.5",
48
+ "diff-cover>=9,<11",
49
+ "ruff==0.16.9",
50
50
  "mypy>=1.11,<2.4",
51
51
  ]
52
52
 
@@ -16,10 +16,11 @@ This document only explains the remaining repository-local maintainer scripts. U
16
16
  - [`scripts/check_dead_code.py`](./check_dead_code.py): run the conservative private dead-code guard used by the default validation baseline.
17
17
  - [`scripts/audit_low_call_sites.py`](./audit_low_call_sites.py): report low-call-count function and method candidates for manual wrapper/abstraction review.
18
18
  - [`scripts/validate_runtime_matrix.sh`](./validate_runtime_matrix.sh): run the reduced runtime-only validation used by the multi-version CI matrix.
19
- - [`scripts/conformance.sh`](./conformance.sh): run the official A2A TCK as a local/manual external compatibility experiment.
19
+ - [`scripts/conformance.sh`](./conformance.sh): optionally run the A2A TCK as a manual investigation tool and preserve raw evidence; it is not an automated compatibility gate.
20
20
  - [`scripts/dependency_health.sh`](./dependency_health.sh): run the standalone dependency review flow (`sync`/`pip check`, outdated package listing, and dev vulnerability audit).
21
21
  - [`scripts/smoke_test_built_cli.sh`](./smoke_test_built_cli.sh): validate that a built wheel can be installed through `uv tool` and becomes healthy.
22
- - [`scripts/smoke_test_live_codex.sh`](./smoke_test_live_codex.sh): initialize and close a real locally installed Codex app-server without making a model request.
22
+ - [`scripts/smoke_test_live_codex.sh`](./smoke_test_live_codex.sh): verify the installed Codex app-server stable and opt-in experimental schema dependencies, discover and resolve an opaque workspace-skill handle, and drive one real stable-API thread/turn against an isolated local Responses provider.
23
+ - [`scripts/check_codex_app_server_schema.py`](./check_codex_app_server_schema.py): compare generated Codex app-server schema tokens with the stable adapter dependencies; pass `--include-experimental` when validating the opt-in plugin API.
23
24
  - [`scripts/sync_codex_docs.sh`](./sync_codex_docs.sh): refresh local upstream Codex reference snapshots when maintainers need them.
24
25
 
25
26
  ## Release Recovery
@@ -32,11 +33,12 @@ The `Publish` workflow now separates build, PyPI publish, and GitHub Release syn
32
33
 
33
34
  ## Notes
34
35
 
35
- - `conformance.sh` intentionally stays outside the default regression gate. Use it to gather external compatibility evidence, then triage results in [`docs/conformance-triage.md`](../docs/conformance-triage.md).
36
+ - `conformance.sh` intentionally stays outside CI and the default regression baseline. Use it only for manual investigation, then adjudicate observations against the latest compatible released A2A specification; triage guidance lives in [`docs/conformance-triage.md`](../docs/conformance-triage.md).
36
37
  - `validate_baseline.sh` and `dependency_health.sh` intentionally remain separate entrypoints and share common prerequisites through [`health_common.sh`](./health_common.sh).
37
38
  - `validate_baseline.sh` now includes a conservative private dead-code check before type-checking and test execution.
38
39
  - `audit_low_call_sites.py` is intentionally advisory only. Use it to surface low-call-count candidates, then inspect the actual consumer chain before removing an abstraction.
39
40
  - `validate_baseline.sh` now blocks on runtime dependency vulnerability audit, while `dependency_health.sh` remains focused on broader dependency review (`outdated` + dev audit).
41
+ - The baseline makes up to three runtime audit attempts (the initial attempt plus at most two retries), with a fresh cache per attempt. If every attempt fails, it returns the last audit exit code and stops before package build and wheel smoke testing. A successful retry allows validation to continue.
40
42
  - [`.github/dependabot.yml`](../.github/dependabot.yml) prefers a single weekly grouped Dependabot PR for `uv`, while the repository scripts remain the explicit audit and validation entrypoints.
41
43
  - End-user runtime startup does not use repository scripts. Prefer the published CLI command documented in [README.md](../README.md) and [docs/guide.md](../docs/guide.md).
42
44
  - Keep long-form documentation changes in `docs/` to avoid divergence.