petfishframework 0.3.0__tar.gz → 0.3.2__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 (160) hide show
  1. {petfishframework-0.3.0 → petfishframework-0.3.2}/PKG-INFO +34 -6
  2. {petfishframework-0.3.0 → petfishframework-0.3.2}/README.md +33 -5
  3. {petfishframework-0.3.0 → petfishframework-0.3.2}/docs/api.md +1 -1
  4. petfishframework-0.3.2/docs/feedbacks/petfishframework_v0_3_0_review.md +879 -0
  5. {petfishframework-0.3.0 → petfishframework-0.3.2}/pyproject.toml +1 -1
  6. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/__init__.py +1 -1
  7. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/core/agent.py +2 -0
  8. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/core/environment.py +18 -3
  9. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/core/session.py +19 -0
  10. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/credentials/broker.py +34 -0
  11. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/credentials/token.py +28 -3
  12. petfishframework-0.3.2/src/petfishframework/policies/conditions.py +436 -0
  13. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/policies/engine.py +4 -1
  14. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/policies/rule.py +4 -1
  15. petfishframework-0.3.2/src/petfishframework/policies/validator.py +100 -0
  16. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/tools/base.py +1 -1
  17. petfishframework-0.3.2/tests/test_credential_broker.py +231 -0
  18. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/test_credential_integration.py +1 -1
  19. petfishframework-0.3.2/tests/test_yaml_policy.py +650 -0
  20. {petfishframework-0.3.0 → petfishframework-0.3.2}/uv.lock +1 -1
  21. petfishframework-0.3.0/src/petfishframework/policies/conditions.py +0 -176
  22. petfishframework-0.3.0/tests/test_credential_broker.py +0 -81
  23. petfishframework-0.3.0/tests/test_yaml_policy.py +0 -325
  24. {petfishframework-0.3.0 → petfishframework-0.3.2}/.env.example +0 -0
  25. {petfishframework-0.3.0 → petfishframework-0.3.2}/.github/workflows/ci.yml +0 -0
  26. {petfishframework-0.3.0 → petfishframework-0.3.2}/.github/workflows/publish.yml +0 -0
  27. {petfishframework-0.3.0 → petfishframework-0.3.2}/.gitignore +0 -0
  28. {petfishframework-0.3.0 → petfishframework-0.3.2}/.sisyphus/plans/v0.1.6-plan.md +0 -0
  29. {petfishframework-0.3.0 → petfishframework-0.3.2}/.sisyphus/plans/v0.2.0-plan.md +0 -0
  30. {petfishframework-0.3.0 → petfishframework-0.3.2}/.sisyphus/plans/v0.3.0-plan.md +0 -0
  31. {petfishframework-0.3.0 → petfishframework-0.3.2}/AGENTS.md +0 -0
  32. {petfishframework-0.3.0 → petfishframework-0.3.2}/AGENTS.md.new +0 -0
  33. {petfishframework-0.3.0 → petfishframework-0.3.2}/CHANGELOG.md +0 -0
  34. {petfishframework-0.3.0 → petfishframework-0.3.2}/CONTRIBUTING.md +0 -0
  35. {petfishframework-0.3.0 → petfishframework-0.3.2}/LICENSE +0 -0
  36. {petfishframework-0.3.0 → petfishframework-0.3.2}/SECURITY.md +0 -0
  37. {petfishframework-0.3.0 → petfishframework-0.3.2}/conftest.py +0 -0
  38. {petfishframework-0.3.0 → petfishframework-0.3.2}/docs/architecture.md +0 -0
  39. {petfishframework-0.3.0 → petfishframework-0.3.2}/docs/benchmark-results.md +0 -0
  40. {petfishframework-0.3.0 → petfishframework-0.3.2}/docs/development-plan.md +0 -0
  41. {petfishframework-0.3.0 → petfishframework-0.3.2}/docs/development.md +0 -0
  42. {petfishframework-0.3.0 → petfishframework-0.3.2}/docs/enterprise-expense-demo.md +0 -0
  43. {petfishframework-0.3.0 → petfishframework-0.3.2}/docs/feedbacks/archives/petfishframework_0_1_4_playground_recommendations.md +0 -0
  44. {petfishframework-0.3.0 → petfishframework-0.3.2}/docs/feedbacks/archives/petfishframework_playground_report.md +0 -0
  45. {petfishframework-0.3.0 → petfishframework-0.3.2}/docs/feedbacks/archives/petfishframework_production_readiness_roadmap.md +0 -0
  46. {petfishframework-0.3.0 → petfishframework-0.3.2}/docs/feedbacks/archives/petfishframework_recommendations.md +0 -0
  47. {petfishframework-0.3.0 → petfishframework-0.3.2}/docs/feedbacks/archives/petfishframework_v0_1_6_playground_review.md +0 -0
  48. {petfishframework-0.3.0 → petfishframework-0.3.2}/docs/feedbacks/archives/petfishframework_v0_1_7_review.md +0 -0
  49. {petfishframework-0.3.0 → petfishframework-0.3.2}/docs/feedbacks/archives/petfishframework_v0_1_8_review.md +0 -0
  50. {petfishframework-0.3.0 → petfishframework-0.3.2}/docs/feedbacks/archives/petfishframework_v0_2_1_review.md +0 -0
  51. {petfishframework-0.3.0 → petfishframework-0.3.2}/docs/feedbacks/archives/petfishframework_v0_2_2_review.md +0 -0
  52. {petfishframework-0.3.0 → petfishframework-0.3.2}/docs/release-checklist.md +0 -0
  53. {petfishframework-0.3.0 → petfishframework-0.3.2}/docs/research/competitor-analysis/README.md +0 -0
  54. {petfishframework-0.3.0 → petfishframework-0.3.2}/docs/research/competitor-analysis/competitor-matrix.md +0 -0
  55. {petfishframework-0.3.0 → petfishframework-0.3.2}/docs/research/competitor-analysis/market-brief.md +0 -0
  56. {petfishframework-0.3.0 → petfishframework-0.3.2}/docs/research/competitor-analysis/positioning-map.md +0 -0
  57. {petfishframework-0.3.0 → petfishframework-0.3.2}/docs/research/competitor-analysis/swot-analysis.md +0 -0
  58. {petfishframework-0.3.0 → petfishframework-0.3.2}/docs/research/literature-review/inclusion-exclusion-criteria.md +0 -0
  59. {petfishframework-0.3.0 → petfishframework-0.3.2}/docs/research/literature-review/literature-matrix.md +0 -0
  60. {petfishframework-0.3.0 → petfishframework-0.3.2}/docs/research/literature-review/literature-review.md +0 -0
  61. {petfishframework-0.3.0 → petfishframework-0.3.2}/docs/research/literature-review/search-strategy.md +0 -0
  62. {petfishframework-0.3.0 → petfishframework-0.3.2}/docs/research/reference-repos-absorption.md +0 -0
  63. {petfishframework-0.3.0 → petfishframework-0.3.2}/docs/skeleton-completeness-checklist.md +0 -0
  64. {petfishframework-0.3.0 → petfishframework-0.3.2}/docs/test-results-report.md +0 -0
  65. {petfishframework-0.3.0 → petfishframework-0.3.2}/docs/usage-guide.md +0 -0
  66. {petfishframework-0.3.0 → petfishframework-0.3.2}/docs/validation-roadmap.md +0 -0
  67. {petfishframework-0.3.0 → petfishframework-0.3.2}/initialization-report.md +0 -0
  68. {petfishframework-0.3.0 → petfishframework-0.3.2}/mcp/README.md +0 -0
  69. {petfishframework-0.3.0 → petfishframework-0.3.2}/mcp/connection-checklist.md +0 -0
  70. {petfishframework-0.3.0 → petfishframework-0.3.2}/mcp/mcp-config.example.json +0 -0
  71. {petfishframework-0.3.0 → petfishframework-0.3.2}/opencode.json +0 -0
  72. {petfishframework-0.3.0 → petfishframework-0.3.2}/qa/code-review-checklist.md +0 -0
  73. {petfishframework-0.3.0 → petfishframework-0.3.2}/qa/qa-review.md +0 -0
  74. {petfishframework-0.3.0 → petfishframework-0.3.2}/qa/qc-gate-decision.md +0 -0
  75. {petfishframework-0.3.0 → petfishframework-0.3.2}/qa/test-plan.md +0 -0
  76. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/config.py +0 -0
  77. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/core/__init__.py +0 -0
  78. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/core/compiled.py +0 -0
  79. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/core/contracts.py +0 -0
  80. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/core/conversation.py +0 -0
  81. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/core/events.py +0 -0
  82. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/core/structured.py +0 -0
  83. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/core/types.py +0 -0
  84. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/credentials/__init__.py +0 -0
  85. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/mcp/__init__.py +0 -0
  86. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/mcp/client.py +0 -0
  87. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/mcp/server.py +0 -0
  88. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/mcp/stdio_transport.py +0 -0
  89. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/mcp/wrapper.py +0 -0
  90. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/models/__init__.py +0 -0
  91. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/models/anthropic.py +0 -0
  92. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/models/fake.py +0 -0
  93. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/models/openai.py +0 -0
  94. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/observability/__init__.py +0 -0
  95. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/observability/sinks.py +0 -0
  96. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/permissions/__init__.py +0 -0
  97. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/permissions/model.py +0 -0
  98. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/policies/__init__.py +0 -0
  99. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/policies/test_runner.py +0 -0
  100. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/reasoning/__init__.py +0 -0
  101. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/reasoning/lats.py +0 -0
  102. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/reasoning/llm_plus_p.py +0 -0
  103. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/reasoning/react.py +0 -0
  104. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/reliability/__init__.py +0 -0
  105. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/reliability/audit_report.py +0 -0
  106. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/reliability/cost.py +0 -0
  107. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/reliability/cost_report.py +0 -0
  108. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/reliability/pass_at_k.py +0 -0
  109. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/reliability/replay.py +0 -0
  110. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/reliability/retry.py +0 -0
  111. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/reliability/timeout.py +0 -0
  112. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/retrieval/__init__.py +0 -0
  113. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/retrieval/adaptive.py +0 -0
  114. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/retrieval/crag.py +0 -0
  115. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/retrieval/memory_store.py +0 -0
  116. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/tools/__init__.py +0 -0
  117. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/tools/agent_tool.py +0 -0
  118. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/tools/calculator.py +0 -0
  119. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/tools/path_planner.py +0 -0
  120. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/tools/registry.py +0 -0
  121. {petfishframework-0.3.0 → petfishframework-0.3.2}/src/petfishframework/tools/word_sorter.py +0 -0
  122. {petfishframework-0.3.0 → petfishframework-0.3.2}/tasks/backlog.md +0 -0
  123. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/integration/__init__.py +0 -0
  124. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/integration/test_anthropic_integration.py +0 -0
  125. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/integration/test_openai_integration.py +0 -0
  126. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/policies/enterprise-expense.tests.yaml +0 -0
  127. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/test_agent_tool.py +0 -0
  128. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/test_anthropic_adapter.py +0 -0
  129. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/test_api_agent_lifecycle.py +0 -0
  130. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/test_api_edge_cases.py +0 -0
  131. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/test_api_integration.py +0 -0
  132. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/test_api_public_surface.py +0 -0
  133. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/test_api_type_safety.py +0 -0
  134. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/test_async.py +0 -0
  135. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/test_audit_report_v2.py +0 -0
  136. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/test_conversation.py +0 -0
  137. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/test_degrade.py +0 -0
  138. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/test_degrade_failclosed.py +0 -0
  139. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/test_enterprise_demo.py +0 -0
  140. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/test_m2_m3_m4.py +0 -0
  141. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/test_mcp.py +0 -0
  142. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/test_openai_adapter.py +0 -0
  143. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/test_pass_at_k.py +0 -0
  144. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/test_permission_semantics.py +0 -0
  145. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/test_quickstart_smoke.py +0 -0
  146. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/test_replay.py +0 -0
  147. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/test_retrieval.py +0 -0
  148. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/test_retry.py +0 -0
  149. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/test_skeleton.py +0 -0
  150. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/test_stdio_transport.py +0 -0
  151. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/test_streaming.py +0 -0
  152. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/test_structured.py +0 -0
  153. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/test_tool_registry.py +0 -0
  154. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/test_v016_semantics.py +0 -0
  155. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/test_v018.py +0 -0
  156. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/test_v019.py +0 -0
  157. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/test_v2_interface_compatibility.py +0 -0
  158. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/test_v2_lats.py +0 -0
  159. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/test_v2_llm_plus_p.py +0 -0
  160. {petfishframework-0.3.0 → petfishframework-0.3.2}/tests/test_yaml_policy_suite.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: petfishframework
3
- Version: 0.3.0
3
+ Version: 0.3.2
4
4
  Summary: A lightweight runtime framework for reliable, auditable, budget-aware, and permission-aware AI agents.
5
5
  Project-URL: Homepage, https://github.com/kylecui/petfishFramework
6
6
  Project-URL: Documentation, https://github.com/kylecui/petfishFramework/tree/master/docs
@@ -34,7 +34,7 @@ Description-Content-Type: text/markdown
34
34
 
35
35
  [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
36
36
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/kylecui/petfishFramework/blob/master/LICENSE)
37
- [![Tests: 259](https://img.shields.io/badge/tests-259-brightgreen.svg)](https://github.com/kylecui/petfishFramework/tree/master/tests/)
37
+ [![Tests: 284](https://img.shields.io/badge/tests-259-brightgreen.svg)](https://github.com/kylecui/petfishFramework/tree/master/tests/)
38
38
 
39
39
  **Status: Alpha** — API may change. Core runtime works; see [Roadmap](#roadmap).
40
40
 
@@ -215,11 +215,39 @@ See `examples/05_enterprise_expense.py` and `tests/test_enterprise_demo.py` for
215
215
 
216
216
  Run: `python examples/05_enterprise_expense.py`
217
217
 
218
+ ## YAML Policy Engine
219
+
220
+ Configure permissions via YAML instead of Python:
221
+
222
+ ```python
223
+ from petfishframework.policies import YamlPolicy
224
+
225
+ policy = YamlPolicy.from_file("examples/policies/enterprise-expense.yaml")
226
+ policy.register_tools(tools)
227
+
228
+ agent = Agent(model=model, reasoning=ReAct(), tools=tools, permission_policy=policy)
229
+ ```
230
+
231
+ Supported conditions: `action.tool_name`, `subject.role_in`, `subject.role_not_in`, `action.args.amount_gt/lt`, `tool.side_effect`, `tool.external_egress`.
232
+
233
+ ## CredentialBroker
234
+
235
+ Tools never hold raw API keys — they receive scoped, time-limited tokens:
236
+
237
+ ```python
238
+ from petfishframework.credentials import CredentialBroker
239
+
240
+ broker = CredentialBroker()
241
+ broker.register_credential("github_tool", os.environ["GITHUB_TOKEN"])
242
+
243
+ agent = Agent(model=model, reasoning=ReAct(), tools=tools, credential_broker=broker)
244
+ # Tools with requires_credentials=True receive a ScopedToken (repr-safe, auto-expiring)
245
+ ```
246
+
218
247
  ## Roadmap
219
248
 
220
- - **v0.2.x** (current): Core runtime, permission semantics, enterprise PoC, Trusted Publishing ✅
221
- - **v0.2.x**: Enterprise agent examples, structured audit reports
222
- - **v0.3.x**: Policy engine (YAML), credential broker ✅
249
+ - **v0.2.x**: Core runtime, permission semantics, enterprise PoC, Trusted Publishing ✅
250
+ - **v0.3.x** (current): YAML Policy Engine, CredentialBroker
223
251
  - **v0.4.x**: Production hardening, deployment guides
224
252
 
225
253
  ## Current Limitations
@@ -251,7 +279,7 @@ petfishFramework is **Alpha**. API may change before v1.0.
251
279
  git clone https://github.com/kylecui/petfishFramework.git
252
280
  cd petfishFramework
253
281
  uv sync --all-extras
254
- uv run pytest # 259 tests
282
+ uv run pytest # 284 tests
255
283
  uv run ruff check src/ tests/
256
284
  ```
257
285
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
6
6
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/kylecui/petfishFramework/blob/master/LICENSE)
7
- [![Tests: 259](https://img.shields.io/badge/tests-259-brightgreen.svg)](https://github.com/kylecui/petfishFramework/tree/master/tests/)
7
+ [![Tests: 284](https://img.shields.io/badge/tests-259-brightgreen.svg)](https://github.com/kylecui/petfishFramework/tree/master/tests/)
8
8
 
9
9
  **Status: Alpha** — API may change. Core runtime works; see [Roadmap](#roadmap).
10
10
 
@@ -185,11 +185,39 @@ See `examples/05_enterprise_expense.py` and `tests/test_enterprise_demo.py` for
185
185
 
186
186
  Run: `python examples/05_enterprise_expense.py`
187
187
 
188
+ ## YAML Policy Engine
189
+
190
+ Configure permissions via YAML instead of Python:
191
+
192
+ ```python
193
+ from petfishframework.policies import YamlPolicy
194
+
195
+ policy = YamlPolicy.from_file("examples/policies/enterprise-expense.yaml")
196
+ policy.register_tools(tools)
197
+
198
+ agent = Agent(model=model, reasoning=ReAct(), tools=tools, permission_policy=policy)
199
+ ```
200
+
201
+ Supported conditions: `action.tool_name`, `subject.role_in`, `subject.role_not_in`, `action.args.amount_gt/lt`, `tool.side_effect`, `tool.external_egress`.
202
+
203
+ ## CredentialBroker
204
+
205
+ Tools never hold raw API keys — they receive scoped, time-limited tokens:
206
+
207
+ ```python
208
+ from petfishframework.credentials import CredentialBroker
209
+
210
+ broker = CredentialBroker()
211
+ broker.register_credential("github_tool", os.environ["GITHUB_TOKEN"])
212
+
213
+ agent = Agent(model=model, reasoning=ReAct(), tools=tools, credential_broker=broker)
214
+ # Tools with requires_credentials=True receive a ScopedToken (repr-safe, auto-expiring)
215
+ ```
216
+
188
217
  ## Roadmap
189
218
 
190
- - **v0.2.x** (current): Core runtime, permission semantics, enterprise PoC, Trusted Publishing ✅
191
- - **v0.2.x**: Enterprise agent examples, structured audit reports
192
- - **v0.3.x**: Policy engine (YAML), credential broker ✅
219
+ - **v0.2.x**: Core runtime, permission semantics, enterprise PoC, Trusted Publishing ✅
220
+ - **v0.3.x** (current): YAML Policy Engine, CredentialBroker
193
221
  - **v0.4.x**: Production hardening, deployment guides
194
222
 
195
223
  ## Current Limitations
@@ -221,7 +249,7 @@ petfishFramework is **Alpha**. API may change before v1.0.
221
249
  git clone https://github.com/kylecui/petfishFramework.git
222
250
  cd petfishFramework
223
251
  uv sync --all-extras
224
- uv run pytest # 259 tests
252
+ uv run pytest # 284 tests
225
253
  uv run ruff check src/ tests/
226
254
  ```
227
255
 
@@ -1,6 +1,6 @@
1
1
  # petfishFramework API Reference
2
2
 
3
- This document is the authoritative reference for the public API of `petfishFramework` v0.2.5. Every signature, field, and example below is derived from the source code and from the tests that exercise it.
3
+ This document is the authoritative reference for the public API of `petfishFramework` v0.3.2. Every signature, field, and example below is derived from the source code and from the tests that exercise it.
4
4
 
5
5
  ## 1. Overview
6
6