Evaluation evidence
This page renders the published artifact of the live evaluation run against this deployment: scripted persona conversations driven over the real MCP endpoints and the portal, with assertions on the responses and on the database state they leave behind. Nothing here is staged: failures stay visible, each with the regression it guards.
Run history (1 run(s))
| When | Clock | Ran | Passed | Failed | Base URL |
|---|---|---|---|---|---|
| 2026-10-18T12:38:30 | live | citizen-happy-submit, citizen-underage-refused, citizen-outside-pilot, citizen-duplicate-active, citizen-withdraw-and-reapply, citizen-idempotent-submit, citizen-status-isolation, citizen-window-closed, citizen-token-boundaries, citizen-session-lifecycle, officer-queue-and-case, officer-approve-with-reason, officer-reason-and-stale-guards, officer-program-token-readonly | 13 | 0 | https://sewasetuai.duckdns.org |
Kamala applies with her assistant and tracks the receipt
Kamala, 61, in Sonari (pilot). The assistant asks the scheme questions, fills the draft, sends her to the portal review page for the document and declaration, then submits and reads back the receipt.
61, widow, lives in Sonari (pilot block). The happy-path applicant.
| check | detail | |
|---|---|---|
| ok | ok=True (expected True) | |
| substring 'minimum_age' | excerpt: {"scheme": "Old Age Pension, Government of Purvanchal (Department of Social Welfare)", "pension_rupees_per_month": 250, "minimum_age": 60, "age_measured_on": "submission date (Asia/Kolkata), from the full date of birth", "statutory_sla_days": 15, "deadline": "2026-10-31 23:59 IST", "window_open": true, "window_note": "Submissions are open while server time is before the deadline.", "server_time_is | |
| substring 'deadline' | excerpt: {"scheme": "Old Age Pension, Government of Purvanchal (Department of Social Welfare)", "pension_rupees_per_month": 250, "minimum_age": 60, "age_measured_on": "submission date (Asia/Kolkata), from the full date of birth", "statutory_sla_days": 15, "deadline": "2026-10-31 23:59 IST", "window_open": true, "window_note": "Submissions are open while server time is before the deadline.", "server_time_is | |
| substring 'pilot_blocks' | excerpt: {"scheme": "Old Age Pension, Government of Purvanchal (Department of Social Welfare)", "pension_rupees_per_month": 250, "minimum_age": 60, "age_measured_on": "submission date (Asia/Kolkata), from the full date of birth", "statutory_sla_days": 15, "deadline": "2026-10-31 23:59 IST", "window_open": true, "window_note": "Submissions are open while server time is before the deadline.", "server_time_is |
| check | detail | |
|---|---|---|
| ok | ok=True (expected True) | |
| field missing_fields | missing_fields = [] (expected []) |
| check | detail | |
|---|---|---|
| ok | ok=True (expected True) | |
| field document.document_id | document.document_id = None (expected None) | |
| substring 'document_requirement' | excerpt: {"ok": true, "draft_id": "drf_ioJ8mEEPFt_-zC-cnsz-uheB", "revision": 1, "fields": {"applicant_name": "Kamala Devi", "dob": "04/02/1965", "gender": "Female", "marital_status": "Widowed", "husband_name": "Dhaneswar Devi", "village": "Kathoni", "block": "Sonari", "bank_account": "90000001012345", "ifsc": "SBIN0003077"}, "missing_fields": [], "field_errors": [], "eligibility": {"eligible": true, "age_ |
| check | detail | |
|---|---|---|
| ok | ok=True (expected True) | |
| field status | status = 'PENDING' (expected 'PENDING') | |
| substring 'acknowledgment_pdf_url' | excerpt: {"ok": true, "application_no": "SSP26170043", "status": "PENDING", "status_label": "Pending departmental decision", "submitted_at": "2026-10-18 12:38 IST", "due_at": "2026-11-02 12:38 IST", "block": "Sonari", "document_recorded": true, "next_action": "share_receipt", "portal_status_url": "https://sewasetuai.duckdns.org/status", "acknowledgment_pdf_url": "https://sewasetuai.duckdns.org/ack/100011.p | |
| substring 'due_at' | excerpt: {"ok": true, "application_no": "SSP26170043", "status": "PENDING", "status_label": "Pending departmental decision", "submitted_at": "2026-10-18 12:38 IST", "due_at": "2026-11-02 12:38 IST", "block": "Sonari", "document_recorded": true, "next_action": "share_receipt", "portal_status_url": "https://sewasetuai.duckdns.org/status", "acknowledgment_pdf_url": "https://sewasetuai.duckdns.org/ack/100011.p |
| check | detail | |
|---|---|---|
| ok | ok=True (expected True) | |
| substring 'Kamala Devi' | excerpt: {"ok": true, "applications": [{"application_no": "SSP26170043", "applicant_name": "Kamala Devi", "mobile": "9000000101", "village": "Kathoni", "block": "Sonari", "status": "PENDING", "status_label": "Pending departmental decision", "submitted_at": "2026-10-18 12:38 IST", "due_at": "2026-11-02 12:38 IST", "decided_at": null, "decided_by": null, "version": 1, "note": "A block officer reviews this ap | |
| substring 'PENDING' | excerpt: {"ok": true, "applications": [{"application_no": "SSP26170043", "applicant_name": "Kamala Devi", "mobile": "9000000101", "village": "Kathoni", "block": "Sonari", "status": "PENDING", "status_label": "Pending departmental decision", "submitted_at": "2026-10-18 12:38 IST", "due_at": "2026-11-02 12:38 IST", "decided_at": null, "decided_by": null, "version": 1, "note": "A block officer reviews this ap |
| check | detail | |
|---|---|---|
| database | application latest for 9000000101 is 'PENDING' (expected 'PENDING') |
| check | detail | |
|---|---|---|
| database | 1 active application(s) (expected 1) |
| check | detail | |
|---|---|---|
| database | 1 audit row(s) action=SUBMIT channel=mcp_citizen for SSP26170043 (expected at least 1) |
| check | detail | |
|---|---|---|
| database | confirmation consumed=True (expected True) |
| check | detail | |
|---|---|---|
| database | 1 queued/delivered notification(s) matching 'application' for 9000000101 |
Rahima, 58, is refused with the exact date she turns 60
Rahima is 58. The assistant records her details but submission must fail with an UNDER_MIN_AGE error and her eligible-from date; no application is created.
58, not yet eligible; her birthday shows exactly how long she must wait.
| check | detail | |
|---|---|---|
| ok | ok=True (expected True) | |
| substring 'eligible_from' | excerpt: {"ok": true, "draft_id": "drf_LuYCM5NdsiTfEDFckyQkluHE", "revision": 1, "fields": {"applicant_name": "Rahima Begum", "dob": "15/06/1968", "gender": "Female", "marital_status": "Widowed", "husband_name": "Rafiqul Begum", "village": "Dighaljan", "block": "Rajapara", "bank_account": "90000001022345", "ifsc": "UTBI0PUR2819"}, "missing_fields": [], "field_errors": [{"field": "ifsc", "code": "INVALID_FO | |
| substring '2028-06-15' | excerpt: {"ok": true, "draft_id": "drf_LuYCM5NdsiTfEDFckyQkluHE", "revision": 1, "fields": {"applicant_name": "Rahima Begum", "dob": "15/06/1968", "gender": "Female", "marital_status": "Widowed", "husband_name": "Rafiqul Begum", "village": "Dighaljan", "block": "Rajapara", "bank_account": "90000001022345", "ifsc": "UTBI0PUR2819"}, "missing_fields": [], "field_errors": [{"field": "ifsc", "code": "INVALID_FO |
| check | detail | |
|---|---|---|
| ok | ok=False (expected False) | |
| code | code='CONFIRMATION_REQUIRED' (expected 'CONFIRMATION_REQUIRED') |
| check | detail | |
|---|---|---|
| ok | ok=True (expected True) | |
| field ready_to_submit | ready_to_submit = False (expected False) | |
| error code UNDER_MIN_AGE | field error codes = ['INVALID_FORMAT', 'UNDER_MIN_AGE'] (expected 'UNDER_MIN_AGE' to be present) | |
| substring '2028-06-15' | excerpt: {"ok": true, "draft_id": "drf_LuYCM5NdsiTfEDFckyQkluHE", "revision": 2, "fields": {"applicant_name": "Rahima Begum", "dob": "15/06/1968", "gender": "Female", "marital_status": "Widowed", "husband_name": "Rafiqul Begum", "village": "Dighaljan", "block": "Rajapara", "bank_account": "90000001022345", "ifsc": "UTBI0PUR2819"}, "missing_fields": [], "field_errors": [{"field": "ifsc", "code": "INVALID_FO |
| check | detail | |
|---|---|---|
| database | 0 application(s) exist for 9000000102 (expected none) |
Haren lives in Borgaon: honest refusal, portal handoff
The assisted channels serve Sonari and Rajapara only. Haren's block is refused with a plain-language note that the official portal is open to everyone.
72, lives in Borgaon, which is outside the assisted-application pilot.
| check | detail | |
|---|---|---|
| ok | ok=False (expected False) | |
| code | code='OUTSIDE_PILOT' (expected 'OUTSIDE_PILOT') | |
| substring 'Borgaon' | excerpt: {"ok": false, "code": "OUTSIDE_PILOT", "message": "Block Borgaon is outside the assisted-application pilot. Assisted applications through connected applications are available in: Sonari, Rajapara. Outside those blocks the official portal at https://sewasetuai.duckdns.org/apply remains open. This is a channel rollout, not an eligibility decision.", "errors": [], "missing_fields": [], "next_action": | |
| substring 'portal' | excerpt: {"ok": false, "code": "OUTSIDE_PILOT", "message": "Block Borgaon is outside the assisted-application pilot. Assisted applications through connected applications are available in: Sonari, Rajapara. Outside those blocks the official portal at https://sewasetuai.duckdns.org/apply remains open. This is a channel rollout, not an eligibility decision.", "errors": [], "missing_fields": [], "next_action": | |
| substring 'not an eligibility' | excerpt: {"ok": false, "code": "OUTSIDE_PILOT", "message": "Block Borgaon is outside the assisted-application pilot. Assisted applications through connected applications are available in: Sonari, Rajapara. Outside those blocks the official portal at https://sewasetuai.duckdns.org/apply remains open. This is a channel rollout, not an eligibility decision.", "errors": [], "missing_fields": [], "next_action": |
| check | detail | |
|---|---|---|
| database | 0 application(s) exist for 9000000103 (expected none) |
Prabhat already has a pending application
One active application per mobile. Prabhat's second attempt through the assistant ends with ACTIVE_APPLICATION_EXISTS and a pointer to his existing application.
65, already holds a pending application; tries to open a second one.
| check | detail | |
|---|---|---|
| ok | ok=True (expected True) |
| check | detail | |
|---|---|---|
| ok | ok=False (expected False) | |
| code | code='ACTIVE_APPLICATION_EXISTS' (expected 'ACTIVE_APPLICATION_EXISTS') | |
| substring 'SSP26457967' | excerpt: {"ok": false, "code": "ACTIVE_APPLICATION_EXISTS", "message": "The mobile number already holds application SSP26457967 (PENDING). One active application is allowed per verified mobile number. A PENDING application can be withdrawn in the portal, after which a fresh application may be submitted.", "errors": [], "missing_fields": [], "next_action": "get_my_applications", "retryable": false, "request |
| check | detail | |
|---|---|---|
| database | 1 active application(s) (expected 1) |
| check | detail | |
|---|---|---|
| database | 1 application(s) total (expected 1) |
Malati withdraws a pending application and applies afresh
Withdrawal is a confirmed action; after it, a fresh application is allowed and a new processing period starts.
68, pending application she wants to withdraw, then applies afresh.
| check | detail | |
|---|---|---|
| ok | ok=True (expected True) | |
| substring 'confirmation_url' | excerpt: {"ok": true, "application_no": "SSP26752126", "version": 1, "confirmation_id": "cfm_94HPPNsNKvgU5ztjx8fW9ytY", "confirmation_url": "https://sewasetuai.duckdns.org/confirm/cfm_94HPPNsNKvgU5ztjx8fW9ytY", "effect": "Withdrawing cancels application SSP26752126. A fresh application may then be submitted; processing starts again from the new submission date.", "next_action": "confirm_withdrawal_on_porta | |
| substring 'effect' | excerpt: {"ok": true, "application_no": "SSP26752126", "version": 1, "confirmation_id": "cfm_94HPPNsNKvgU5ztjx8fW9ytY", "confirmation_url": "https://sewasetuai.duckdns.org/confirm/cfm_94HPPNsNKvgU5ztjx8fW9ytY", "effect": "Withdrawing cancels application SSP26752126. A fresh application may then be submitted; processing starts again from the new submission date.", "next_action": "confirm_withdrawal_on_porta |
| check | detail | |
|---|---|---|
| ok | ok=True (expected True) | |
| field status | status = 'WITHDRAWN' (expected 'WITHDRAWN') |
| check | detail | |
|---|---|---|
| database | application SSP26752126 for 9000000105 is 'WITHDRAWN' (expected 'WITHDRAWN') |
| check | detail | |
|---|---|---|
| database | 1 audit row(s) action=WITHDRAW channel=mcp_citizen for SSP26752126 (expected at least 1) |
| check | detail | |
|---|---|---|
| ok | ok=True (expected True) |
| check | detail | |
|---|---|---|
| ok | ok=True (expected True) | |
| field status | status = 'PENDING' (expected 'PENDING') |
| check | detail | |
|---|---|---|
| database | 2 application(s) total (expected 2) |
| check | detail | |
|---|---|---|
| database | 1 active application(s) (expected 1) |
Nirmal's assistant retries a submit that timed out
The same idempotency key must return the same receipt without a second application; the same key with a different request must be refused as a conflict.
60, exactly on the age boundary; his assistant retries a submit that timed out.
| check | detail | |
|---|---|---|
| ok | ok=True (expected True) |
| check | detail | |
|---|---|---|
| ok | ok=True (expected True) |
| check | detail | |
|---|---|---|
| ok | ok=True (expected True) | |
| field application_no | application_no = 'SSP26603715' (expected 'SSP26603715') |
| check | detail | |
|---|---|---|
| ok | ok=False (expected False) | |
| code | code='IDEMPOTENCY_CONFLICT' (expected 'IDEMPOTENCY_CONFLICT') |
| check | detail | |
|---|---|---|
| database | 1 application(s) total (expected 1) |
| check | detail | |
|---|---|---|
| database | idempotency record status='completed' (expected 'completed') |
Rahima cannot see or touch Kamala's application
Identity comes from the verified token, never from tool arguments. Another citizen's application number returns the same not-found answer as a typo.
58, not yet eligible; her birthday shows exactly how long she must wait.
| check | detail | |
|---|---|---|
| ok | ok=False (expected False) | |
| code | code='NOT_FOUND_OR_NOT_PERMITTED' (expected 'NOT_FOUND_OR_NOT_PERMITTED') |
| check | detail | |
|---|---|---|
| ok | ok=False (expected False) | |
| code | code='NOT_FOUND_OR_NOT_PERMITTED' (expected 'NOT_FOUND_OR_NOT_PERMITTED') |
| check | detail | |
|---|---|---|
| database | application SSP26494566 for 9000000101 is 'PENDING' (expected 'PENDING') |
Anima tries after the scheme window has closed
Run only with the stack's clock frozen past 2026-10-31 23:59 (SEWASETU_NOW). The assistant must refuse submission with the exact deadline, and the portal stays available for status.
63; her scenario runs only when the stack's clock is frozen past the deadline.
Wrong audience, wrong role and revoked sign-ins are refused
Before any tool runs, the endpoints check the token: exact audience, the endpoint's role, and a live unrevoked grant. A revoked sign-in stops working immediately.
61, widow, lives in Sonari (pilot block). The happy-path applicant.
| check | detail | |
|---|---|---|
| http status | HTTP 200 (expected 200) |
| check | detail | |
|---|---|---|
| http status | HTTP 401 (expected 401) | |
| header resource_metadata | WWW-Authenticate: 'Bearer error="invalid_token", error_description="Authentication required", resource_metadata="https://sewasetuai.duckdns.org/.well-known/oauth-protected-resource/mcp/officer"' |
| check | detail | |
|---|---|---|
| http status | HTTP 401 (expected 401) |
| check | detail | |
|---|---|---|
| http status | HTTP 401 (expected 401) |
| check | detail | |
|---|---|---|
| http status | HTTP 401 (expected 401) |
| check | detail | |
|---|---|---|
| database | grant grt_2lOyRBybrZ1Q-kXHmR8aWLJfWw3lPmvZ revoked_at=2026-10-18 12:38:32.278651 |
Refresh rotates within the same sign-in; revoke ends it
Through the real token endpoint: a refresh returns a new access token bound to the same grant with the same absolute end; revoking the refresh token kills the access token immediately.
61, widow, lives in Sonari (pilot block). The happy-path applicant.
| check | detail | |
|---|---|---|
| token endpoint status | HTTP 200 (expected 200): {"access_token":"eyJhbGciOiJSUzI1NiIsImtpZCI6Ijc0Y2NhYzlkYzhlMjAzZmMiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL3Nld2FzZXR1YWkuZHVja2Rucy5vcmciLCJzdWIiOiJjaXRpemVuOjkwMDAwMDAxMDEiLCJhdWQiOiJodHRwczovL3Nl | |
| same grant | grant_id='grt_FUZoK-GTU6PXmnb_PrX4EWVY9dw4xW08' (expected 'grt_FUZoK-GTU6PXmnb_PrX4EWVY9dw4xW08'); rotation must not start a new sign-in | |
| same session end | session_ends='2026-10-18T14:38:32' (expected '2026-10-18T14:38:32'); the absolute session never moves | |
| rotated refresh token | a new refresh token was issued |
| check | detail | |
|---|---|---|
| rotated token works | get_service_info ok=True |
| check | detail | |
|---|---|---|
| revocation status | HTTP 200 (expected 200) |
| check | detail | |
|---|---|---|
| revoked access token refused | HTTP 401 (expected 401); revocation must bite immediately, not at token expiry | |
| grant revoked in the database | grant grt_FUZoK-GTU6PXmnb_PrX4EWVY9dw4xW08 revoked_at=2026-10-18 12:38:32.544396 |
Meera works the Sonari queue and opens one case
The queue is nearest-due-first and scoped to her blocks; the case view shows facts, evidence and audit. A historical record with no stored document says so plainly.
Block officer for Sonari. Reviews the queue nearest-due first and decides on recorded facts.
| check | detail | |
|---|---|---|
| ok | ok=True (expected True) | |
| field officer | officer = 'meera.saikia' (expected 'meera.saikia') | |
| substring 'permitted_blocks' | excerpt: {"ok": true, "officer": "meera.saikia", "permitted_blocks": ["Sonari"], "pilot_blocks": ["Sonari", "Rajapara"], "queue": {"pending": 54, "past_due": 53}, "tools": ["list_pending_applications: queue nearest due first", "get_application_case: full facts, evidence availability and audit for one case", "prepare_decision: approve/reject with a reason; returns a portal confirmation link", "record_decisi | |
| substring 'audit' | excerpt: {"ok": true, "officer": "meera.saikia", "permitted_blocks": ["Sonari"], "pilot_blocks": ["Sonari", "Rajapara"], "queue": {"pending": 54, "past_due": 53}, "tools": ["list_pending_applications: queue nearest due first", "get_application_case: full facts, evidence availability and audit for one case", "prepare_decision: approve/reject with a reason; returns a portal confirmation link", "record_decisi |
| check | detail | |
|---|---|---|
| ok | ok=True (expected True) | |
| field scope.permitted_blocks | scope.permitted_blocks = ['Sonari'] (expected ['Sonari']) | |
| scope | every cases entry has block == 'Sonari' (5 rows checked) |
| check | detail | |
|---|---|---|
| ok | ok=True (expected True) | |
| field evidence.available | evidence.available = False (expected False) | |
| substring 'Historical records may predate document storage' | excerpt: {"ok": true, "case": {"application_no": "SSPEVAL87B975", "applicant_name": "Historic Verification Case", "mobile_masked": "90****90", "dob": "05/05/1950", "age": 76, "village": "Purani Bazar", "block": "Sonari", "bank_account_masked": "****9012", "ifsc": "SBIN0003077", "status": "PENDING", "status_label": "Pending departmental decision", "submitted_at": "2026-10-18 12:38 IST", "due_at": "2026-11-0 |
| check | detail | |
|---|---|---|
| ok | ok=False (expected False) | |
| code | code='NOT_FOUND_OR_NOT_PERMITTED' (expected 'NOT_FOUND_OR_NOT_PERMITTED') |
| check | detail | |
|---|---|---|
| database | doc_path=None stored_document_rows=0 (evidence unavailable expected) |
Meera approves a case with a recorded reason
Prepare on the workspace, confirm the exact case/action/reason on the portal, record once. The applicant is notified and the audit names the officer and reason.
Block officer for Sonari. Reviews the queue nearest-due first and decides on recorded facts.
| check | detail | |
|---|---|---|
| ok | ok=True (expected True) | |
| field evidence.available | evidence.available = True (expected True) | |
| substring 'due_at' | excerpt: {"ok": true, "case": {"application_no": "SSP26018461", "applicant_name": "Kamala Devi", "mobile_masked": "90****01", "dob": "04/02/1965", "age": 61, "village": "Kathoni", "block": "Sonari", "bank_account_masked": "****2345", "ifsc": "SBIN0003077", "status": "PENDING", "status_label": "Pending departmental decision", "submitted_at": "2026-10-18 12:38 IST", "due_at": "2026-11-02 12:38 IST", "decided | |
| substring 'version' | excerpt: {"ok": true, "case": {"application_no": "SSP26018461", "applicant_name": "Kamala Devi", "mobile_masked": "90****01", "dob": "04/02/1965", "age": 61, "village": "Kathoni", "block": "Sonari", "bank_account_masked": "****2345", "ifsc": "SBIN0003077", "status": "PENDING", "status_label": "Pending departmental decision", "submitted_at": "2026-10-18 12:38 IST", "due_at": "2026-11-02 12:38 IST", "decided |
| check | detail | |
|---|---|---|
| ok | ok=True (expected True) | |
| substring 'confirmation_url' | excerpt: {"ok": true, "application_no": "SSP26018461", "decision": "APPROVED", "reason": "Age proof verified at the block office", "expected_version": 1, "confirmation_id": "cfm_CXSi0miybw3UASCyq1lMqPmJ", "confirmation_url": "https://sewasetuai.duckdns.org/confirm/cfm_CXSi0miybw3UASCyq1lMqPmJ", "next_action": "confirm_on_portal_then_record_decision", "note": "The officer must open the confirmation page, ch |
| check | detail | |
|---|---|---|
| ok | ok=True (expected True) | |
| field status | status = 'APPROVED' (expected 'APPROVED') | |
| field decided_by | decided_by = 'meera.saikia' (expected 'meera.saikia') |
| check | detail | |
|---|---|---|
| ok | ok=True (expected True) | |
| field status | status = 'APPROVED' (expected 'APPROVED') |
| check | detail | |
|---|---|---|
| database | SSP26018461 is APPROVED recorded by meera.saikia with reason matching 'age proof verified' |
| check | detail | |
|---|---|---|
| database | 1 audit row(s) action=APPROVED channel=mcp_officer for SSP26018461 (expected at least 1) |
| check | detail | |
|---|---|---|
| database | 1 queued/delivered notification(s) matching 'approved' for 9000000101 |
A decision without a reason or on a stale case is refused
No reason means no confirmation. A case that changed after the decision was prepared cannot be recorded: the version guard wins.
Block officer for Sonari. Reviews the queue nearest-due first and decides on recorded facts.
| check | detail | |
|---|---|---|
| ok | ok=False (expected False) | |
| code | code='VALIDATION_FAILED' (expected 'VALIDATION_FAILED') | |
| substring 'reason' | excerpt: {"ok": false, "code": "VALIDATION_FAILED", "message": "A reason is required for every decision and becomes part of the audit. State the ground (for example: age proof verified).", "errors": [{"field": "reason", "code": "REQUIRED", "message": "Give a short reason."}], "missing_fields": ["reason"], "next_action": "prepare_decision", "retryable": false, "request_id": "a89fad279458"} |
| check | detail | |
|---|---|---|
| ok | ok=True (expected True) |
| check | detail | |
|---|---|---|
| ok | ok=False (expected False) | |
| code | code='INVALID_STATE' (expected 'INVALID_STATE') |
| check | detail | |
|---|---|---|
| database | application SSP26606411 for 9000000101 is 'WITHDRAWN' (expected 'WITHDRAWN') |
A program token can read the queue but not decide
Unattended program tokens are for reading; a case decision requires an interactive named-officer sign-in.
Block officer for Sonari. Reviews the queue nearest-due first and decides on recorded facts.
| check | detail | |
|---|---|---|
| ok | ok=True (expected True) |
| check | detail | |
|---|---|---|
| ok | ok=True (expected True) |
| check | detail | |
|---|---|---|
| ok | ok=False (expected False) | |
| code | code='PROGRAM_TOKEN_NOT_ALLOWED' (expected 'PROGRAM_TOKEN_NOT_ALLOWED') |
| check | detail | |
|---|---|---|
| database | application SSP26084719 for 9000000101 is 'PENDING' (expected 'PENDING') |