Developer fix request
If the sponsor adds a rule on translated consent forms, and your agent doesn’t send that status yet, the Developer gets a fix request naming the field.
Clinical Trials · Python SDK
A trial operations agent is ready to send an amendment to a site. The Python SDK checks the sponsor’s release rules first, using the approval and site facts your trial systems already track.
One release covers one amendment and one site. These are the fields the clinical trials simulator sends.
| Fact | What it holds |
|---|---|
protocol_id | The protocol the amendment belongs to. |
protocol_version | The amendment version being released. |
amendment_status | approved or draft. |
ethics_approval_status | approved or pending for this site. |
site_activation_status | active or pending. |
site_training_complete | True when the site team has finished training on this version. |
authorized_reviewer_confirmed | True when an authorized reviewer has signed off. |
Each case is a sample site in the clinical trials simulator. Try the sample trial workflow
When: The site is active, trained, and has ethics approval.
Your code: The amendment is published, and the record keeps the version and the approvals as they stood at that moment.
Who picks it up: The Business Owner sees release progress. Auditors read the record inside an engagement.
When: Site training on the new version isn’t complete.
Your code: The release waits for trial operations to decide.
Who picks it up: The trial operations reviewer, in the VeriProof Inbox, by email, or in Slack or Microsoft Teams, with reminders and escalation.
When: Final ethics approval is still pending.
Your code: The release is blocked before the site receives anything.
Who picks it up: The Governance Engineer sees the rule that held it back.
Pattern matching on GovernedStatus keeps each path explicit. reviews is the runtime from await vp.reviews(...).
Python · veriproof-sdk
from veriproof_sdk import GovernedStatus
result = await vp.govern(
"amendment.release",
{"protocolId": amendment.protocol_id, "siteId": site.id},
lambda context: site_portal.publish(context.input),
facts={
"protocol_id": amendment.protocol_id,
"protocol_version": amendment.version,
"amendment_status": amendment.status,
"ethics_approval_status": approvals.ethics_status(site.id),
"site_activation_status": site.activation_status,
"site_training_complete": training.is_complete(site.id, amendment.version),
"authorized_reviewer_confirmed": amendment.reviewer_confirmed,
},
)
match result.status:
case GovernedStatus.COMPLETED | GovernedStatus.COMPLETED_WITH_WARNING | GovernedStatus.TRANSFORMED:
notify_site(result.value)
case GovernedStatus.REVIEW_REQUIRED:
await reviews.save(result.review)
case _:
log.info("Release held: %s", result.reason_code)site_portal.publish runs only when the rules allow the release. Everything else leaves the site on its current version.
Why Python here: Trial operations tooling and data work are commonly Python, and the SDK’s async client fits the jobs that push site updates.
Developer fix request
If the sponsor adds a rule on translated consent forms, and your agent doesn’t send that status yet, the Developer gets a fix request naming the field.
Changing the rule
A change to who counts as an authorized reviewer can run in Shadow against real releases first. Once its tests pass, the governance engineer sends it to a compliance officer or administrator, who approves it for production.
Include protocol_version on every call. When someone asks which sites received a version and when, each record answers with the version, the approval status at that moment, and the rule that allowed the release.
For your business owner
The clinical trials page explains what the agent can take on and how its decisions are defended.
Read the clinical trials business caseDocs
Install veriproof-sdk, configure the key, and look up industry values for Clinical Trials.
Open the demo portal as the reviewer who clears a held release, then as the Governance Engineer who owns the rule.