@@ -43,6 +43,35 @@ Agent → Provenance Gateway → Policy Engine → ALLOW / BLOCK / ESCALAT
4343
4444** Stack:** Python 3.13 · FastAPI · PostgreSQL · SQLAlchemy (async) · Alembic · Docker
4545
46+ ## Python SDK
47+
48+ The ` provenance-client ` package is available on PyPI. Install it to integrate Provenance policy gating into your Python agents:
49+
50+ ``` bash
51+ pip install provenance-client
52+ # or with uv
53+ uv add provenance-client
54+ ```
55+
56+ ** Requires Python 3.13+** · [ SDK documentation] ( sdk/python/provenance_client/README.md ) · [ Examples] ( sdk/python/examples/ )
57+
58+ ``` python
59+ from provenance_client import ProvenanceClient, ProvenanceGateway, Decision
60+
61+ gateway = ProvenanceGateway(
62+ ProvenanceClient(
63+ gateway_url = " http://localhost:4587" ,
64+ agent_id = " <your-agent-id>" ,
65+ api_key = " pk_live_..." ,
66+ )
67+ )
68+
69+ result = gateway.execute(" payments.initiate" , {" amount" : 50 , " currency" : " GBP" }, decision = Decision.ALLOW )
70+ print (result.decision) # Decision.ALLOW
71+ ```
72+
73+ ---
74+
4675## Prerequisites
4776
4877- [ Docker] ( https://docs.docker.com/get-docker/ ) and Docker Compose
@@ -112,33 +141,35 @@ Expected Output
112141────────────────────────────────────────────────────────────────
113142 PROVENANCE — Agentic Audit & Compliance Layer (POC Demo)
114143────────────────────────────────────────────────────────────────
115- [0] Agent session running on: sess_335c3e5ecaf5
144+ [0] Agent session running on: sess_7607d711c862
145+
146+ [1] Authenticated as [u:abc]
116147
117- [1] Authenticated as [u:abc]...
148+ [2] Tenant ID: 019dca7d-f002-7d92-86c4-93a066a2c6f6
118149
119- [2] Tenant ID: 019d7e9c-f44b-7472-92a3-785f40fdc150
150+ [3] Agent ID: 019dca7f-e9b9-78c0-a098-bb87e5c60d6c
120151
121- [3] Agent ID: 019d7ebc-2da9-7812-a7bf-f5e5bcc7f32e
152+ [4] Policy ID: 019dca7f-ea12-7342-953c-4263b8748706
122153
123- [4] Policy ID: 019d7ebc-2dfa-7700-88fd-ec8e90364579
154+ [5] Tenant Policy ID: 019dca7f-ea83-7221-8265-761417491a77
124155
125- [5] Tenant Policy ID: 019d7ebc-2e68-7fb2-b3d6-333a03e769d0
156+ [6] API Key: pk_live__3CxwsHps
126157
127- [6 ] Small payment: £50 GBP → expect ALLOW
158+ [7 ] Small payment: £50 GBP → expect ALLOW
128159 Decision : ✗ BLOCK
129160 Reason : Escalation TIMEOUT — action blocked
130161
131- [7 ] Large payment: £800 GBP → expect ESCALATE → human APPROVES → ALLOW
162+ [8 ] Large payment: £800 GBP → expect ESCALATE → human APPROVES → ALLOW
132163 No pending escalation found!
133164 Decision : ✔ ALLOW
134165 Reason : Payment within approved parameters — amount ≤ £500, currency approve
135166 Escalation : None
136167
137- [8 ] Payment in JPY (disallowed currency) → expect ESCALATE → REJECT → BLOCK
168+ [9 ] Payment in JPY (disallowed currency) → expect ESCALATE → REJECT → BLOCK
138169 No pending escalation found!
139170 Decision : ✗ BLOCK
140171 Reason : Escalation TIMEOUT — action blocked
141- Escalation : 019d7ebc-5a39-7ea0-b853-ca8cd1295214
172+ Escalation : 019dca80-0b81-76a2-b9a2-434891b0cb53
142173
143174[10] data.delete (bulk) → expect BLOCK (hard policy)
144175 Decision : ✗ BLOCK
@@ -150,65 +181,66 @@ Expected Output
150181
151182[12] Audit log (hash-chained)
152183
153- EVENT ID ACTION DECISION PREV HASH
154- ──────────────────────────── ────────────────────────────── ──────── ────────────────────
155- 019d7ebc-7a81-7f41-98c8-b8de email.send ALLOW 4c2e466325e813f16d ...
156- 019d7ebc-7a46-7513-82ff-3ae5 data.delete BLOCK b3a7f49864051dcc78 ...
157- 019d7ebc-5a61-7531-a8c0-27bd payments.initiate BLOCK 0c13e0298a0ba30f9a ... 👤
158- 019d7ebc-2ee8-7461-ae1f-adf1 payments.initiate ALLOW c1221028a6bad20cb8 ...
159- 019d7ebc-2ece-70e2-806b-ba06 payments.initiate BLOCK ef30ae378ce25e6a82 ... 👤
160- 019d7ebb-a9a6-7ed2-b0c9-4248 email.send ALLOW 75ac44cf20e8e11363 ...
161- 019d7ebb-a95b-7ee0-858a-1d08 data.delete BLOCK 5b3aa339e9203e12a0 ...
162- 019d7ebb-8946-7421-8462-5807 payments.initiate BLOCK 53790549b0165e8db9 ... 👤
163- 019d7ebb-6935-78c2-8038-30f1 payments.initiate ALLOW 1bfe2d518a988df45a ...
164- 019d7ebb-6923-7bb0-ae8d-168a payments.initiate BLOCK 260c2b7b11c14efb72 ... 👤
165- 019d7eb9-a717-76c2-91d5-5fc2 email.send ALLOW 9f2813b9f559152511 ...
166- 019d7eb9-a6cd-7391-8a7c-fb13 data.delete BLOCK a1de308c82a982a4a3 ...
167- 019d7eb9-86dc-7071-b41a-0ebd payments.initiate BLOCK 1d1f4ad71e2c4c5280 ... 👤
168- 019d7eb9-66b2-7ed3-aa16-73fe payments.initiate ALLOW 484044b2c068058a83 ...
169- 019d7eb9-669b-72f0-bb58-8fec payments.initiate BLOCK 4d3cc6f6bba531847a ... 👤
184+ EVENT ID ACTION DECISION PREV HASH
185+ ──────────────────────────── ────────────────────────────── ──────── ────────────────────
186+ 019dca80-2c28-7290-a743-52b5 email.send ALLOW 715a8e5c8128a353e9 ...
187+ 019dca80-2bcb-7fc3-886b-dabb data.delete BLOCK a0d6c40c09de2b7cd2 ...
188+ 019dca80-0ba0-7392-af9f-8a79 payments.initiate BLOCK d95da25aeff3f41243 ... 👤
189+ 019dca7f-eb60-7313-8e11-b36a payments.initiate ALLOW 45c0be78fb87a3fd70 ...
190+ 019dca7f-eb31-7a50-8688-8e66 payments.initiate BLOCK 316fc3526e9bcadefd ... 👤
191+ 019dca7e-a518-7690-b7cb-1989 email.send ALLOW 9ca039ed587c46912e ...
192+ 019dca7e-a4bc-76c2-8068-12ff data.delete BLOCK d7ccff916cfc8d581e ...
193+ 019dca7e-849f-7da3-ad9c-700a payments.initiate BLOCK d24e388435419a46cb ... 👤
194+ 019dca7e-644f-7aa1-8ffa-bfe4 payments.initiate ALLOW e07b860c8c13c14e6d ...
195+ 019dca7e-6428-79c2-92b0-17c8 payments.initiate BLOCK 96ce36d4aeee5a9ee2 ... 👤
196+ 019dca7e-3377-7053-b7c2-c255 email.send ALLOW 97354cd47dae9a71fa ...
197+ 019dca7e-3315-75d3-a903-01e4 data.delete BLOCK 291f8ccfcb77e11f06 ...
198+ 019dca7e-12fe-7ea1-b77f-7e57 payments.initiate BLOCK 07785b7f497cf20486 ... 👤
199+ 019dca7d-f2a7-7f01-8314-634b payments.initiate ALLOW 15d9c92a6e8d4acfc0 ...
200+ 019dca7d-f27c-7e31-93d8-e23f payments.initiate BLOCK 91e826c6a83999637e ... 👤
170201
171202[13] Hash-chain integrity scan
172203 Chain : ✗ COMPROMISED
173204 Checked : 15 events
174- Violations: [{'position': 0, 'event_id': '019d7ebc-7a81-7f41-98c8-b8de151ac805', 'expected_prev_hash': '4d3cc6f6bba531847a989106d8c33f1bbf9a47974a9dadc95abaa76fe870219a', 'actual_prev_hash': '4c2e466325e813f16d551155c9a813531dd2ff3d537b750b0b389883a1917d0c'}, {'position': 1, 'event_id': '019d7ebc-7a46-7513-82ff-3ae51e9982e7', 'expected_prev_hash': '9bebfc8f9f9f379d2195d3bd67ab10308d215515a5f44cac1aad53506baf90c8', 'actual_prev_hash': 'b3a7f49864051dcc7839de766e39965efde37ffab61751ded4d066bde53a0c13'}, {'position': 2, 'event_id': '019d7ebc-5a61-7531-a8c0-27bd7fdcefde', 'expected_prev_hash': '4c2e466325e813f16d551155c9a813531dd2ff3d537b750b0b389883a1917d0c', 'actual_prev_hash': '0c13e0298a0ba30f9a4ea33c36c5bc341d0117b4c771a37c3e5d16fe2d12139c'}, {'position': 3, 'event_id': '019d7ebc-2ee8-7461-ae1f-adf1a8b8c682', 'expected_prev_hash': 'b3a7f49864051dcc7839de766e39965efde37ffab61751ded4d066bde53a0c13', 'actual_prev_hash': 'c1221028a6bad20cb8aecea3c376351c21e79d83a6beb962f85ea5b8d11e890c'}, {'position': 4, 'event_id': '019d7ebc-2ece-70e2-806b-ba0614f4211e', 'expected_prev_hash': '0c13e0298a0ba30f9a4ea33c36c5bc341d0117b4c771a37c3e5d16fe2d12139c', 'actual_prev_hash': 'ef30ae378ce25e6a82beed7345c2f386ea80d0260589b24b1d2a82e6fd44d918'}, {'position': 5, 'event_id': '019d7ebb-a9a6-7ed2-b0c9-4248a13babb0', 'expected_prev_hash': 'c1221028a6bad20cb8aecea3c376351c21e79d83a6beb962f85ea5b8d11e890c', 'actual_prev_hash': '75ac44cf20e8e1136356b5326c591aa8e99b06c0d37b5337c1827289bbb1de1f'}, {'position': 6, 'event_id': '019d7ebb-a95b-7ee0-858a-1d083b3aba6a', 'expected_prev_hash': 'ef30ae378ce25e6a82beed7345c2f386ea80d0260589b24b1d2a82e6fd44d918', 'actual_prev_hash': '5b3aa339e9203e12a0b91f99545ba65299af1a3e5dfaf8558d4d0cbdcbc5239a'}, {'position': 7, 'event_id': '019d7ebb-8946-7421-8462-5807f12105c3', 'expected_prev_hash': '75ac44cf20e8e1136356b5326c591aa8e99b06c0d37b5337c1827289bbb1de1f', 'actual_prev_hash': '53790549b0165e8db94b88a3f7da73ff2c599b25f23fc994b9dbbb702b72f135'}, {'position': 8, 'event_id': '019d7ebb-6935-78c2-8038-30f1327e69e7', 'expected_prev_hash': '5b3aa339e9203e12a0b91f99545ba65299af1a3e5dfaf8558d4d0cbdcbc5239a', 'actual_prev_hash': '1bfe2d518a988df45af7615958e032f5887b7ec05a3f5317ec9e50900838f186'}, {'position': 9, 'event_id': '019d7ebb-6923-7bb0-ae8d-168a3646f25d', 'expected_prev_hash': '53790549b0165e8db94b88a3f7da73ff2c599b25f23fc994b9dbbb702b72f135', 'actual_prev_hash': '260c2b7b11c14efb72bdc45586fd3e77422fc0e242c0fcf2d333b4331882c5d1'}, {'position': 10, 'event_id': '019d7eb9-a717-76c2-91d5-5fc202c8ac65', 'expected_prev_hash': '1bfe2d518a988df45af7615958e032f5887b7ec05a3f5317ec9e50900838f186', 'actual_prev_hash': '9f2813b9f55915251132614e590443fbc1368c3666e2222a9c352cb09985e5f1'}, {'position': 11, 'event_id': '019d7eb9-a6cd-7391-8a7c-fb1386285922', 'expected_prev_hash': '260c2b7b11c14efb72bdc45586fd3e77422fc0e242c0fcf2d333b4331882c5d1', 'actual_prev_hash': 'a1de308c82a982a4a3620b2564fc6b7d35f7cc5a77e2901092c161b87b8ed620'}, {'position': 12, 'event_id': '019d7eb9-86dc-7071-b41a-0ebd330a5d5b', 'expected_prev_hash': '9f2813b9f55915251132614e590443fbc1368c3666e2222a9c352cb09985e5f1', 'actual_prev_hash': '1d1f4ad71e2c4c528040aee2148c293e967e3a2857c087a5947c8a3d36227980'}, {'position': 13, 'event_id': '019d7eb9-66b2-7ed3-aa16-73fec4df2afb', 'expected_prev_hash': 'a1de308c82a982a4a3620b2564fc6b7d35f7cc5a77e2901092c161b87b8ed620', 'actual_prev_hash': '484044b2c068058a83d1484d8b6f21ce4e377a9800a830602cb162663166d223'}, {'position': 14, 'event_id': '019d7eb9-669b-72f0-bb58-8fec7be28954', 'expected_prev_hash': '1d1f4ad71e2c4c528040aee2148c293e967e3a2857c087a5947c8a3d36227980', 'actual_prev_hash': '4d3cc6f6bba531847a989106d8c33f1bbf9a47974a9dadc95abaa76fe870219a'}]
205+ Violations: [{'position': 0, 'event_id': '019dca80-2c28-7290-a743-52b53ee59faa', 'expected_prev_hash': '91e826c6a83999637ea7c25b26cef2f3bb6c6f9d1db8c8d8ef6de9e727232ad1', 'actual_prev_hash': '715a8e5c8128a353e91f282dbbe1c585bf563351d962d8baf20e7af1ac15efcf'}, {'position': 1, 'event_id': '019dca80-2bcb-7fc3-886b-dabbecd81cd2', 'expected_prev_hash': 'a7b92d6fc926e1d99e0122470aca75a2ca04d0ecbc36aed7a9dc25e6549acd62', 'actual_prev_hash': 'a0d6c40c09de2b7cd278860c04a8b0f955ac64570f397559ff794fa058674ea2'}, {'position': 2, 'event_id': '019dca80-0ba0-7392-af9f-8a79c72f76b7', 'expected_prev_hash': '715a8e5c8128a353e91f282dbbe1c585bf563351d962d8baf20e7af1ac15efcf', 'actual_prev_hash': 'd95da25aeff3f41243b2add8427a7dabb1bf6e44f4ee3f66e2f95f846509b15a'}, {'position': 3, 'event_id': '019dca7f-eb60-7313-8e11-b36a1e201955', 'expected_prev_hash': 'a0d6c40c09de2b7cd278860c04a8b0f955ac64570f397559ff794fa058674ea2', 'actual_prev_hash': '45c0be78fb87a3fd7030df05ef28a6215be6490dc30d1fe9347de2d291db92a0'}, {'position': 4, 'event_id': '019dca7f-eb31-7a50-8688-8e66e0916086', 'expected_prev_hash': 'd95da25aeff3f41243b2add8427a7dabb1bf6e44f4ee3f66e2f95f846509b15a', 'actual_prev_hash': '316fc3526e9bcadefd73e34fc15f0d4857279bd5a62b94a5b22296a208d336fd'}, {'position': 5, 'event_id': '019dca7e-a518-7690-b7cb-1989fb1a02a2', 'expected_prev_hash': '45c0be78fb87a3fd7030df05ef28a6215be6490dc30d1fe9347de2d291db92a0', 'actual_prev_hash': '9ca039ed587c46912ead9cfdf3ea47bdf38828f56b3743a0af20e8797ae59138'}, {'position': 6, 'event_id': '019dca7e-a4bc-76c2-8068-12ffd5e090fa', 'expected_prev_hash': '316fc3526e9bcadefd73e34fc15f0d4857279bd5a62b94a5b22296a208d336fd', 'actual_prev_hash': 'd7ccff916cfc8d581e18ddc4c14d3d4af1633ca2c60bd3743fcf27fd46a79c08'}, {'position': 7, 'event_id': '019dca7e-849f-7da3-ad9c-700adff12946', 'expected_prev_hash': '9ca039ed587c46912ead9cfdf3ea47bdf38828f56b3743a0af20e8797ae59138', 'actual_prev_hash': 'd24e388435419a46cb5b1d1fafd4b672028e870cb4944a01e06a22b6921918db'}, {'position': 8, 'event_id': '019dca7e-644f-7aa1-8ffa-bfe4ac124755', 'expected_prev_hash': 'd7ccff916cfc8d581e18ddc4c14d3d4af1633ca2c60bd3743fcf27fd46a79c08', 'actual_prev_hash': 'e07b860c8c13c14e6d662e45a06b8d20b4202ff54dffa564855a4aba6b350376'}, {'position': 9, 'event_id': '019dca7e-6428-79c2-92b0-17c8e8e349d8', 'expected_prev_hash': 'd24e388435419a46cb5b1d1fafd4b672028e870cb4944a01e06a22b6921918db', 'actual_prev_hash': '96ce36d4aeee5a9ee22e6113125fa7fafb2053c578e9a5da7de5865db3ec0758'}, {'position': 10, 'event_id': '019dca7e-3377-7053-b7c2-c255cff41451', 'expected_prev_hash': 'e07b860c8c13c14e6d662e45a06b8d20b4202ff54dffa564855a4aba6b350376', 'actual_prev_hash': '97354cd47dae9a71facc24376d76ca0001e6cb8ce606ed44b567c1564a44c3e1'}, {'position': 11, 'event_id': '019dca7e-3315-75d3-a903-01e47edf2e19', 'expected_prev_hash': '96ce36d4aeee5a9ee22e6113125fa7fafb2053c578e9a5da7de5865db3ec0758', 'actual_prev_hash': '291f8ccfcb77e11f06109d6ee8d18882dbf56c73b6c8a4d3f316d893a56254aa'}, {'position': 12, 'event_id': '019dca7e-12fe-7ea1-b77f-7e570b3cc167', 'expected_prev_hash': '97354cd47dae9a71facc24376d76ca0001e6cb8ce606ed44b567c1564a44c3e1', 'actual_prev_hash': '07785b7f497cf20486d511288015941aabe7161528df9bbb195973116523c910'}, {'position': 13, 'event_id': '019dca7d-f2a7-7f01-8314-634bd2cd1f42', 'expected_prev_hash': '291f8ccfcb77e11f06109d6ee8d18882dbf56c73b6c8a4d3f316d893a56254aa', 'actual_prev_hash': '15d9c92a6e8d4acfc0157dbea00de5d136cfedb88a70f40cdf8524217f0df89f'}, {'position': 14, 'event_id': '019dca7d-f27c-7e31-93d8-e23f6432019c', 'expected_prev_hash': '07785b7f497cf20486d511288015941aabe7161528df9bbb195973116523c910', 'actual_prev_hash': '91e826c6a83999637ea7c25b26cef2f3bb6c6f9d1db8c8d8ef6de9e727232ad1'}]
175206
176207[14] Compliance reports
177208
178- SOC 2 Type II — CC6
209+ SOC 2 Type II — CC6
179210 Total actions : 15
180211 Allowed : 6
181212 Blocked : 9 (60.0%)
182213 Escalated : 6 (40.0%)
183214 Human approvals: 0 rejections: 0
184- Chain integrity: ✗
215+ Chain integrity: ❌
185216 All agent actions were evaluated against a versioned declarative policy prior to execution. An append-only, hash-chained audit log was maintained for every action. High-risk actions were routed to a named human approver before execution. Audit chain integrity: VIOLATIONS DETECTED
186217
187- GDPR Article 30
218+ GDPR Article 30
188219 Data access events : 3
189- Agents with access : [' 019d7ebc-2da9-7812-a7bf-f5e5bcc7f32e ' , ' 019d7eb9-6557-7701-8137-a5993365b00e ' , ' 019d7ebb-67f0-7322-b5ce-251f96840432 ' ]
220+ Agents with access : [' 019dca7e-6285-7ea3-a4dd-277a62e70807 ' , ' 019dca7f-e9b9-78c0-a098-bb87e5c60d6c ' , ' 019dca7d-f082-7550-8815-12e6162d33ab ' ]
190221
191- PCI-DSS Requirement 10
222+ PCI-DSS Requirement 10
192223 Payment actions : 9
193224 Allowed : 3
194225 Blocked : 6
195226 Human approved : 0
196227 All payment-related agent actions were intercepted, policy-evaluated, and logged prior to execution. Actions exceeding the approved threshold were held for named human approval before proceeding. No payment action bypassed the Provenance gateway.
197228
198229────────────────────────────────────────────────────────────────
199- POC COMPLETE
230+ POC COMPLETE
200231────────────────────────────────────────────────────────────────
201- All Provenance flows exercised successfully.
232+ All Provenance flows exercised successfully.
202233
203- Interactive API docs: http://localhost:4587/docs
234+ Interactive API docs: http://localhost:4587/docs
204235```
205236
206237#### Integration
207238
208- Currently, this proof-of-concept only contains the backend implementation. TypeScript and Python SDKs are planned for the next iteration to simplify integration . If you prefer to use the APIs directly, you can find an example agent policy template [ here] ( https://github.com/aybruhm/provenance/blob/main/api/resources/policies/agent_policy_template.json ) and the e2e code [ here] ( https://github.com/aybruhm/provenance/blob/main/api/tests/manual/e2e_demo.py ) .
239+ The Python SDK ( ` provenance-client ` ) is available on PyPI — see the [ SDK documentation ] ( sdk/python/provenance_client/README.md ) to get started . If you prefer to use the APIs directly, you can find an example agent policy template [ here] ( https://github.com/aybruhm/provenance/blob/main/api/resources/policies/agent_policy_template.json ) and the e2e code [ here] ( https://github.com/aybruhm/provenance/blob/main/api/tests/manual/e2e_demo.py ) . A TypeScript SDK is planned for the next iteration .
209240
210241## Next Steps
211242
212243- [ ] SDK implementation
213- - [ ] Python - PYPI release
244+ - [x ] Python - PYPI release
214245 - [ ] Typescript - NPM release
246+ - [ ] UI
0 commit comments