---
name: dc-hcv-employment-evidence
description: "Prepare, validate, and submit synthetic DC HCV employment evidence through the declared local service when requested."
---

# Your employment evidence

Report each person’s employment income and provide the evidence for each job. This demo collects employment evidence; it does not determine housing eligibility.

Profile version: `0.1.0`. Policy version: `0.1.0`.
Generated revision: `f80d70e04c50c98f0afb38ac315e06aa8483d41f6f9e2ca3772b6094d14c8a75`.

Use the service origin supplied by the user. Paths below are relative to that origin.
MCP tools and resources expose the same declared contracts. This skill is optional guidance.

## Declared workflow

1. Read the interface and authoritative policy before collecting data. Use synthetic data for this demo. Refresh discovery when the specification revision changes.
2. Create a draft and retain its token. Draft capabilities expire after one hour or server restart and do not verify applicant identity.
3. Upload each original source document. Use the returned document identifier, fingerprint, and media type in the application. Stored bytes alone do not prove authenticity.
4. Collect an application matching the schema. Signed payroll claims and signatures must come from their issuer; never fabricate or edit signed payloads to force validation to pass.
5. Validate using the current revision and explain returned guidance. On a revision conflict refresh the manifest and review the application before retrying.
6. Submit only within the user's requested scope. Retain the receipt and retrieve its snapshot with the draft token. After a timeout do not blindly resubmit: this prototype has no idempotency guarantee.
7. Report the returned outcome and guidance. Never infer acceptance from absent checks. Employment evidence acceptance does not determine housing eligibility. Reviewer operations require separately assigned reviewer authorization; applicant authentication alone grants no reviewer access.
8. This variant requires a browser account session for applicant operations. Use the declared browser-only sign-in flow; an ID token supplied as an API bearer or MCP argument is not a session.
9. Provider authentication establishes an account session only. Do not infer identity proofing, delegated agent authority, or approval of an application from login; those require separately declared and implemented checks.
10. Before submitting, use the declared preparation action to freeze the application. The human reviews the snapshot, authenticates freshly with the trusted provider, and explicitly approves it. Submit the unchanged application with its approval reference. Login alone never grants approval; approval is single-use and expires.

## Declared operations

- `create_employment_draft` — Create an expiring anonymous employment evidence draft capability. HTTP: `POST /api/drafts`. Transports: http, mcp. Access context: `principal`. Identity policy: `browser-account`. Roles: account-applicant. Permissions: public. Side effect: `create-draft`. Input schema: `{"additionalProperties": false, "properties": {}, "required": [], "type": "object"}`. Output schema: `{"properties": {"draftId": {"title": "Draftid", "type": "string"}, "expiresInSeconds": {"title": "Expiresinseconds", "type": "integer"}, "identityVerified": {"const": false, "default": false, "title": "Identityverified", "type": "boolean"}, "token": {"title": "Token", "type": "string"}}, "required": ["draftId", "token", "expiresInSeconds"], "title": "DraftCapability", "type": "object"}`.
- `upload_employment_document` — Store an original PDF, PNG, or JPEG in the authorized draft. Supply base64 encoded bytes through MCP. Upload does not establish authenticity. HTTP: `POST /api/drafts/{draft_id}/documents`. Transports: http, mcp. Access context: `principal`. Identity policy: `browser-account`. Roles: account-applicant. Permissions: draft-token. Side effect: `store-document`. Input schema: `{"additionalProperties": false, "properties": {"contentBase64": {"minLength": 1, "type": "string"}, "draftId": {"minLength": 1, "type": "string"}, "mediaType": {"enum": ["application/pdf", "image/png", "image/jpeg"]}, "token": {"minLength": 1, "type": "string"}}, "required": ["draftId", "token", "contentBase64", "mediaType"], "type": "object"}`. Output schema: `{"additionalProperties": false, "properties": {"mediaType": {"enum": ["application/pdf", "image/png", "image/jpeg"], "title": "Mediatype", "type": "string"}, "objectId": {"pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Objectid", "type": "string"}, "sha256": {"pattern": "^[a-f0-9]{64}$", "title": "Sha256", "type": "string"}}, "required": ["objectId", "sha256", "mediaType"], "title": "Document", "type": "object"}`.
- `check_employment_evidence` — Validate the application and run declared evidence checks against signed records, original documents, and configured trusted agency facts. Missing or unavailable checks prevent acceptance. HTTP: `POST /api/drafts/{draft_id}/validate`. Transports: http, mcp. Access context: `principal`. Identity policy: `browser-account`. Roles: account-applicant. Permissions: draft-token. Side effect: `none`. Input schema: `{"$defs": {"Document": {"additionalProperties": false, "description": "Upload the original employer file. Its stored reference and fingerprint are available in the details.", "properties": {"mediaType": {"description": "The upload service accepts PDF, PNG, and JPEG.", "enum": ["application/pdf", "image/png", "image/jpeg"], "title": "Document format", "type": "string"}, "objectId": {"description": "Filled in when you upload the original document to this draft.", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Uploaded document reference", "type": "string"}, "sha256": {"description": "Must match the original bytes. A hash by itself does not prove who issued a document.", "pattern": "^[a-f0-9]{64}$", "title": "Document fingerprint", "type": "string"}}, "required": ["objectId", "sha256", "mediaType"], "title": "Document metadata", "type": "object", "x-presentation": {"disclosure": "collapsed"}}, "EmploymentStream": {"additionalProperties": false, "properties": {"employerId": {"description": "Use the employer reference on the issuer\u2019s payroll evidence.", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Employer reference", "type": "string"}, "evidenceIds": {"description": "List the evidence references that support this person\u2019s job.", "items": {"pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "type": "string"}, "maxItems": 100, "minItems": 1, "title": "Evidence references for this job", "type": "array"}, "id": {"description": "Give each reported job a different reference.", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Job reference", "type": "string"}, "memberId": {"description": "Must match a person reference in your household.", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Person reference for this job", "type": "string"}, "payFrequency": {"description": "The required number of pay stubs depends on this frequency.", "enum": ["weekly", "biweekly", "semimonthly", "monthly"], "title": "How often this job pays", "type": "string"}}, "required": ["id", "memberId", "employerId", "payFrequency", "evidenceIds"], "title": "EmploymentStream", "type": "object", "x-informationRequirement": "https://example.org/dc-hcv/requirements/employment-income"}, "ManualEvidence": {"additionalProperties": false, "properties": {"description": {"description": "Explain which person and job this document supports.", "minLength": 1, "title": "What this document shows", "type": "string"}, "document": {"$ref": "#/$defs/Document", "description": "Upload the original PDF or image. Staff will review this evidence route.", "title": "Original supporting document"}, "id": {"pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Id", "type": "string"}, "kind": {"enum": ["unsigned_pay_stub", "employer_letter", "self_declaration", "other"], "title": "Kind", "type": "string"}}, "required": ["id", "kind", "document", "description"], "title": "ManualEvidence", "type": "object", "x-acceptanceRoute": "manual-review"}, "Member": {"additionalProperties": false, "properties": {"fullName": {"description": "Enter the name associated with this person\u2019s evidence.", "minLength": 1, "title": "Full name", "type": "string"}, "id": {"description": "Use this reference when linking a job to this person.", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Person reference", "type": "string"}}, "required": ["id", "fullName"], "title": "Member", "type": "object"}, "PayStubPayload": {"additionalProperties": false, "properties": {"currency": {"const": "USD", "title": "Currency", "type": "string"}, "employeeReference": {"pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Employeereference", "type": "string"}, "employerId": {"pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Employerid", "type": "string"}, "evidenceId": {"pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Evidenceid", "type": "string"}, "grossPay": {"pattern": "^(0|[1-9][0-9]*)\\.[0-9]{2}$", "title": "Grosspay", "type": "string"}, "issuedOn": {"format": "date", "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "title": "Issuedon", "type": "string"}, "payFrequency": {"enum": ["weekly", "biweekly", "semimonthly", "monthly"], "title": "Payfrequency", "type": "string"}, "payPeriodEnd": {"format": "date", "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "title": "Payperiodend", "type": "string"}, "payPeriodStart": {"format": "date", "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "title": "Payperiodstart", "type": "string"}, "paymentDate": {"format": "date", "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "title": "Paymentdate", "type": "string"}, "payrollSequence": {"maximum": 9007199254740991, "minimum": 1, "title": "Payrollsequence", "type": "integer"}, "profile": {"const": "https://example.org/dc-hcv/signed-pay-stub/v1", "title": "Profile", "type": "string"}, "sourceDocument": {"$ref": "#/$defs/Document"}}, "required": ["profile", "evidenceId", "employerId", "employeeReference", "issuedOn", "paymentDate", "payPeriodStart", "payPeriodEnd", "payFrequency", "payrollSequence", "grossPay", "currency", "sourceDocument"], "title": "PayStubPayload", "type": "object"}, "Signature": {"additionalProperties": false, "description": "This signature is supplied by the issuer. Import the signed record rather than entering signature bytes manually.", "properties": {"cmsDerBase64": {"maxLength": 262144, "minLength": 1, "title": "Cmsderbase64", "type": "string"}, "format": {"const": "cms-detached-rfc8785", "title": "Format", "type": "string"}}, "required": ["format", "cmsDerBase64"], "title": "Digital signature details", "type": "object", "x-presentation": {"disclosure": "collapsed"}}, "SignedPayStub": {"additionalProperties": false, "properties": {"id": {"pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Id", "type": "string"}, "kind": {"const": "signed_pay_stub", "title": "Kind", "type": "string"}, "payload": {"$ref": "#/$defs/PayStubPayload", "description": "Import these claims from the employer. Editing them invalidates the signature.", "title": "Issuer-signed payroll claims"}, "signature": {"$ref": "#/$defs/Signature", "description": "Use the detached signature supplied by the payroll issuer.", "title": "Employer\u2019s digital signature"}}, "required": ["id", "kind", "payload", "signature"], "title": "SignedPayStub", "type": "object", "x-cccev": {"class": "http://data.europa.eu/m8g/Evidence", "evidenceType": "https://example.org/dc-hcv/evidence-types/pay-stub", "supportsRequirement": "https://example.org/dc-hcv/requirements/employment-income"}}}, "additionalProperties": false, "properties": {"application": {"$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "description": "Report each person\u2019s employment income and provide the evidence for each job. This demo collects employment evidence; it does not determine housing eligibility.", "properties": {"applicationId": {"description": "Choose a unique reference for this application, beginning with a letter.", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Application reference", "type": "string"}, "employmentIncome": {"description": "Add each person\u2019s job separately, linking it to that person and its supporting evidence.", "items": {"$ref": "#/$defs/EmploymentStream"}, "maxItems": 100, "title": "Jobs and employment income", "type": "array"}, "evidence": {"description": "Add issuer-signed payroll records or original documents for staff review.", "items": {"discriminator": {"mapping": {"employer_letter": "#/$defs/ManualEvidence", "other": "#/$defs/ManualEvidence", "self_declaration": "#/$defs/ManualEvidence", "signed_pay_stub": "#/$defs/SignedPayStub", "unsigned_pay_stub": "#/$defs/ManualEvidence"}, "propertyName": "kind"}, "oneOf": [{"$ref": "#/$defs/SignedPayStub"}, {"$ref": "#/$defs/ManualEvidence"}]}, "maxItems": 200, "title": "Supporting evidence", "type": "array"}, "household": {"description": "Add the people whose employment income you are reporting.", "items": {"$ref": "#/$defs/Member"}, "maxItems": 50, "minItems": 1, "title": "People in your household", "type": "array"}, "profileVersion": {"const": "0.1.0", "title": "Profileversion", "type": "string"}}, "required": ["profileVersion", "applicationId", "household", "employmentIncome", "evidence"], "title": "Your employment evidence", "type": "object", "x-process": {"href": "/api/forms/dc-hcv/process", "policy": "/api/forms/dc-hcv/policy"}}, "draftId": {"minLength": 1, "type": "string"}, "revision": {"minLength": 1, "type": "string"}, "token": {"minLength": 1, "type": "string"}}, "required": ["draftId", "token", "application"], "type": "object"}`. Output schema: `{"$defs": {"EvidenceReport": {"properties": {"evidenceId": {"title": "Evidenceid", "type": "string"}, "evidence_authentic": {"title": "Evidence Authentic", "type": "boolean"}, "payload_sha256": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Payload Sha256"}, "reason_codes": {"items": {"type": "string"}, "title": "Reason Codes", "type": "array"}, "signature_valid": {"title": "Signature Valid", "type": "boolean"}, "signer_sha256": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Signer Sha256"}}, "required": ["evidenceId", "signature_valid", "evidence_authentic", "reason_codes"], "title": "EvidenceReport", "type": "object"}}, "properties": {"allRequiredChecksPassed": {"type": "boolean"}, "applicationSha256": {"type": "string"}, "authorityContextAvailable": {"type": "boolean"}, "eligibilityDecision": {"default": null, "title": "Eligibilitydecision", "type": "null"}, "evidence": {"items": {"$ref": "#/$defs/EvidenceReport"}, "title": "Evidence", "type": "array"}, "guidance": {"items": {"additionalProperties": true, "type": "object"}, "title": "Guidance", "type": "array"}, "outcome": {"enum": ["accept-employment-evidence", "manual-review", "request-additional-evidence"], "type": "string"}, "policyVersion": {"title": "Policyversion", "type": "string"}, "profileRevision": {"title": "Profilerevision", "type": "string"}, "reasonCodes": {"items": {"type": "string"}, "title": "Reasoncodes", "type": "array"}, "schemaValid": {"title": "Schemavalid", "type": "boolean"}, "streams": {"items": {"type": "object"}, "type": "array"}}, "required": ["schemaValid", "evidence", "outcome", "reasonCodes", "guidance", "profileRevision", "policyVersion", "streams", "allRequiredChecksPassed", "applicationSha256", "authorityContextAvailable"], "title": "ValidationReport", "type": "object"}`.
- `submit_employment_evidence` — Submit an explicit application snapshot for review and return an auditable receipt. Repeated calls create separate submissions. HTTP: `POST /api/drafts/{draft_id}/submit`. Transports: http, mcp. Access context: `principal`. Identity policy: `approved-applicant`. Roles: account-applicant. Permissions: draft-token. Side effect: `submit-snapshot`. Input schema: `{"$defs": {"Document": {"additionalProperties": false, "description": "Upload the original employer file. Its stored reference and fingerprint are available in the details.", "properties": {"mediaType": {"description": "The upload service accepts PDF, PNG, and JPEG.", "enum": ["application/pdf", "image/png", "image/jpeg"], "title": "Document format", "type": "string"}, "objectId": {"description": "Filled in when you upload the original document to this draft.", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Uploaded document reference", "type": "string"}, "sha256": {"description": "Must match the original bytes. A hash by itself does not prove who issued a document.", "pattern": "^[a-f0-9]{64}$", "title": "Document fingerprint", "type": "string"}}, "required": ["objectId", "sha256", "mediaType"], "title": "Document metadata", "type": "object", "x-presentation": {"disclosure": "collapsed"}}, "EmploymentStream": {"additionalProperties": false, "properties": {"employerId": {"description": "Use the employer reference on the issuer\u2019s payroll evidence.", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Employer reference", "type": "string"}, "evidenceIds": {"description": "List the evidence references that support this person\u2019s job.", "items": {"pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "type": "string"}, "maxItems": 100, "minItems": 1, "title": "Evidence references for this job", "type": "array"}, "id": {"description": "Give each reported job a different reference.", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Job reference", "type": "string"}, "memberId": {"description": "Must match a person reference in your household.", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Person reference for this job", "type": "string"}, "payFrequency": {"description": "The required number of pay stubs depends on this frequency.", "enum": ["weekly", "biweekly", "semimonthly", "monthly"], "title": "How often this job pays", "type": "string"}}, "required": ["id", "memberId", "employerId", "payFrequency", "evidenceIds"], "title": "EmploymentStream", "type": "object", "x-informationRequirement": "https://example.org/dc-hcv/requirements/employment-income"}, "ManualEvidence": {"additionalProperties": false, "properties": {"description": {"description": "Explain which person and job this document supports.", "minLength": 1, "title": "What this document shows", "type": "string"}, "document": {"$ref": "#/$defs/Document", "description": "Upload the original PDF or image. Staff will review this evidence route.", "title": "Original supporting document"}, "id": {"pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Id", "type": "string"}, "kind": {"enum": ["unsigned_pay_stub", "employer_letter", "self_declaration", "other"], "title": "Kind", "type": "string"}}, "required": ["id", "kind", "document", "description"], "title": "ManualEvidence", "type": "object", "x-acceptanceRoute": "manual-review"}, "Member": {"additionalProperties": false, "properties": {"fullName": {"description": "Enter the name associated with this person\u2019s evidence.", "minLength": 1, "title": "Full name", "type": "string"}, "id": {"description": "Use this reference when linking a job to this person.", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Person reference", "type": "string"}}, "required": ["id", "fullName"], "title": "Member", "type": "object"}, "PayStubPayload": {"additionalProperties": false, "properties": {"currency": {"const": "USD", "title": "Currency", "type": "string"}, "employeeReference": {"pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Employeereference", "type": "string"}, "employerId": {"pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Employerid", "type": "string"}, "evidenceId": {"pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Evidenceid", "type": "string"}, "grossPay": {"pattern": "^(0|[1-9][0-9]*)\\.[0-9]{2}$", "title": "Grosspay", "type": "string"}, "issuedOn": {"format": "date", "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "title": "Issuedon", "type": "string"}, "payFrequency": {"enum": ["weekly", "biweekly", "semimonthly", "monthly"], "title": "Payfrequency", "type": "string"}, "payPeriodEnd": {"format": "date", "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "title": "Payperiodend", "type": "string"}, "payPeriodStart": {"format": "date", "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "title": "Payperiodstart", "type": "string"}, "paymentDate": {"format": "date", "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "title": "Paymentdate", "type": "string"}, "payrollSequence": {"maximum": 9007199254740991, "minimum": 1, "title": "Payrollsequence", "type": "integer"}, "profile": {"const": "https://example.org/dc-hcv/signed-pay-stub/v1", "title": "Profile", "type": "string"}, "sourceDocument": {"$ref": "#/$defs/Document"}}, "required": ["profile", "evidenceId", "employerId", "employeeReference", "issuedOn", "paymentDate", "payPeriodStart", "payPeriodEnd", "payFrequency", "payrollSequence", "grossPay", "currency", "sourceDocument"], "title": "PayStubPayload", "type": "object"}, "Signature": {"additionalProperties": false, "description": "This signature is supplied by the issuer. Import the signed record rather than entering signature bytes manually.", "properties": {"cmsDerBase64": {"maxLength": 262144, "minLength": 1, "title": "Cmsderbase64", "type": "string"}, "format": {"const": "cms-detached-rfc8785", "title": "Format", "type": "string"}}, "required": ["format", "cmsDerBase64"], "title": "Digital signature details", "type": "object", "x-presentation": {"disclosure": "collapsed"}}, "SignedPayStub": {"additionalProperties": false, "properties": {"id": {"pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Id", "type": "string"}, "kind": {"const": "signed_pay_stub", "title": "Kind", "type": "string"}, "payload": {"$ref": "#/$defs/PayStubPayload", "description": "Import these claims from the employer. Editing them invalidates the signature.", "title": "Issuer-signed payroll claims"}, "signature": {"$ref": "#/$defs/Signature", "description": "Use the detached signature supplied by the payroll issuer.", "title": "Employer\u2019s digital signature"}}, "required": ["id", "kind", "payload", "signature"], "title": "SignedPayStub", "type": "object", "x-cccev": {"class": "http://data.europa.eu/m8g/Evidence", "evidenceType": "https://example.org/dc-hcv/evidence-types/pay-stub", "supportsRequirement": "https://example.org/dc-hcv/requirements/employment-income"}}}, "additionalProperties": false, "properties": {"application": {"$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "description": "Report each person\u2019s employment income and provide the evidence for each job. This demo collects employment evidence; it does not determine housing eligibility.", "properties": {"applicationId": {"description": "Choose a unique reference for this application, beginning with a letter.", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Application reference", "type": "string"}, "employmentIncome": {"description": "Add each person\u2019s job separately, linking it to that person and its supporting evidence.", "items": {"$ref": "#/$defs/EmploymentStream"}, "maxItems": 100, "title": "Jobs and employment income", "type": "array"}, "evidence": {"description": "Add issuer-signed payroll records or original documents for staff review.", "items": {"discriminator": {"mapping": {"employer_letter": "#/$defs/ManualEvidence", "other": "#/$defs/ManualEvidence", "self_declaration": "#/$defs/ManualEvidence", "signed_pay_stub": "#/$defs/SignedPayStub", "unsigned_pay_stub": "#/$defs/ManualEvidence"}, "propertyName": "kind"}, "oneOf": [{"$ref": "#/$defs/SignedPayStub"}, {"$ref": "#/$defs/ManualEvidence"}]}, "maxItems": 200, "title": "Supporting evidence", "type": "array"}, "household": {"description": "Add the people whose employment income you are reporting.", "items": {"$ref": "#/$defs/Member"}, "maxItems": 50, "minItems": 1, "title": "People in your household", "type": "array"}, "profileVersion": {"const": "0.1.0", "title": "Profileversion", "type": "string"}}, "required": ["profileVersion", "applicationId", "household", "employmentIncome", "evidence"], "title": "Your employment evidence", "type": "object", "x-process": {"href": "/api/forms/dc-hcv/process", "policy": "/api/forms/dc-hcv/policy"}}, "approvalId": {"minLength": 1, "type": "string"}, "draftId": {"minLength": 1, "type": "string"}, "revision": {"minLength": 1, "type": "string"}, "token": {"minLength": 1, "type": "string"}}, "required": ["draftId", "token", "application", "approvalId"], "type": "object"}`. Output schema: `{"properties": {"applicationSha256": {"title": "Applicationsha256", "type": "string"}, "draftId": {"title": "Draftid", "type": "string"}, "eligibilityDecision": {"default": null, "title": "Eligibilitydecision", "type": "null"}, "outcome": {"enum": ["accept-employment-evidence", "manual-review", "request-additional-evidence"], "type": "string"}, "policyVersion": {"title": "Policyversion", "type": "string"}, "profileRevision": {"title": "Profilerevision", "type": "string"}, "receiptId": {"title": "Receiptid", "type": "string"}, "receivedAt": {"title": "Receivedat", "type": "string"}}, "required": ["receiptId", "draftId", "receivedAt", "applicationSha256", "outcome", "profileRevision", "policyVersion"], "title": "Receipt", "type": "object"}`.
- `get_employment_receipt` — Retrieve the submitted snapshot, original verification report, and current review state using the authorized draft capability. Staff identities and internal review notes are excluded. HTTP: `GET /api/drafts/{draft_id}/receipts/{receipt_id}`. Transports: http, mcp. Access context: `principal`. Identity policy: `browser-account`. Roles: account-applicant. Permissions: draft-token. Side effect: `none`. Input schema: `{"additionalProperties": false, "properties": {"draftId": {"minLength": 1, "type": "string"}, "receiptId": {"minLength": 1, "type": "string"}, "token": {"minLength": 1, "type": "string"}}, "required": ["draftId", "token", "receiptId"], "type": "object"}`. Output schema: `{"type": "object"}`.
- `listReviewCases` — List submitted employment evidence and its review state. Reviewer authorization is required. HTTP: `GET /api/review/cases`. Transports: http, mcp. Access context: `principal`. Identity policy: `reviewer`. Roles: reviewer. Permissions: public. Side effect: `none`. Input schema: `{"additionalProperties": false, "properties": {}, "required": [], "type": "object"}`. Output schema: `{"type": "object"}`.
- `readReviewCase` — Read the frozen application, verification findings, declared review workflow, and audit history. HTTP: `GET /api/review/cases/{case_id}`. Transports: http, mcp. Access context: `principal`. Identity policy: `reviewer`. Roles: reviewer. Permissions: public. Side effect: `none`. Input schema: `{"additionalProperties": false, "properties": {"caseId": {"minLength": 1, "type": "string"}}, "required": ["caseId"], "type": "object"}`. Output schema: `{"type": "object"}`.
- `readReviewDocument` — Retrieve original submitted document bytes as base64 for an authorized reviewer. HTTP: `GET /api/review/cases/{case_id}/documents/{object_id}`. Transports: http, mcp. Access context: `principal`. Identity policy: `reviewer`. Roles: reviewer. Permissions: public. Side effect: `none`. Input schema: `{"additionalProperties": false, "properties": {"caseId": {"minLength": 1, "type": "string"}, "objectId": {"minLength": 1, "type": "string"}}, "required": ["caseId", "objectId"], "type": "object"}`. Output schema: `{"type": "object"}`.
- `decideReviewCase` — Record an explicit staff decision and reason against the displayed case version and specification. This does not approve on behalf of the applicant. HTTP: `POST /api/review/cases/{case_id}/decisions`. Transports: http, mcp. Access context: `principal`. Identity policy: `reviewer`. Roles: reviewer. Permissions: public. Side effect: `review-decision`. Input schema: `{"additionalProperties": false, "properties": {"caseId": {"minLength": 1, "type": "string"}, "decision": {"additionalProperties": false, "properties": {"action": {"enum": ["approve-employment-evidence"], "type": "string"}, "expectedVersion": {"minimum": 1, "type": "integer"}, "reason": {"maxLength": 4000, "minLength": 1, "type": "string"}}, "required": ["expectedVersion", "action", "reason"], "type": "object"}, "revision": {"minLength": 1, "type": "string"}}, "required": ["caseId", "revision", "decision"], "type": "object"}`. Output schema: `{"type": "object"}`.
- `reevaluate_employment_case` — Run the current specification and verifier against the retained application and original documents. Preserve the original receipt and every previous finding; reset staff disposition according to the new evidence outcome. A reason, displayed case version, current revision, and reviewer authorization are required. HTTP: `POST /api/review/cases/{case_id}/reevaluations`. Transports: http, mcp. Access context: `principal`. Identity policy: `reviewer`. Roles: reviewer. Permissions: public. Side effect: `reevaluate-evidence`. Input schema: `{"additionalProperties": false, "properties": {"caseId": {"minLength": 1, "type": "string"}, "request": {"additionalProperties": false, "properties": {"expectedVersion": {"minimum": 1, "type": "integer"}, "reason": {"maxLength": 4000, "minLength": 1, "type": "string"}}, "required": ["expectedVersion", "reason"], "type": "object"}, "revision": {"minLength": 1, "type": "string"}}, "required": ["caseId", "revision", "request"], "type": "object"}`. Output schema: `{"type": "object"}`.
- `begin_browser_login` — Sign in with the configured identity provider before preparing employment evidence. Your account may use a password and does not require an mDL or completed identity proofing. HTTP: `POST /api/account/login`. Transports: http. Access context: `browser-transaction`. Identity policy: `browser-handshake`. Roles: anonymous-applicant. Permissions: public. Side effect: `begin-login`. Input schema: `{"additionalProperties": false, "properties": {}, "required": [], "type": "object"}`. Output schema: `{"additionalProperties": false, "properties": {"authorizationUrl": {"type": "string"}, "expiresAt": {"format": "date-time", "type": "string"}}, "required": ["authorizationUrl", "expiresAt"], "type": "object"}`.
- `complete_browser_login` — Verify the provider's authorization-code response, one-use browser transaction, nonce, PKCE exchange, signed ID token and authentication freshness; then establish a new opaque browser session. HTTP: `GET /api/account/callback`. Transports: http. Access context: `browser-transaction`. Identity policy: `browser-handshake`. Roles: anonymous-applicant. Permissions: public. Side effect: `establish-session`. Input schema: `{"additionalProperties": false, "properties": {"code": {"type": "string"}, "error": {"type": "string"}, "error_description": {"type": "string"}, "error_uri": {"type": "string"}, "iss": {"type": "string"}, "state": {"type": "string"}}, "required": ["state"], "type": "object"}`. Output schema: `{"additionalProperties": false, "properties": {"authenticated": {"const": true}, "redirectPath": {"type": "string"}}, "required": ["authenticated", "redirectPath"], "type": "object"}`.
- `read_browser_session` — Read whether this browser has a current verified account session and obtain the CSRF token for same-origin writes. This response makes no person-proofing or eligibility claim. HTTP: `GET /api/account/session`. Transports: http. Access context: `browser-transaction`. Identity policy: `browser-handshake`. Roles: anonymous-applicant. Permissions: public. Side effect: `none`. Input schema: `{"additionalProperties": false, "properties": {}, "required": [], "type": "object"}`. Output schema: `{"additionalProperties": false, "properties": {"authenticated": {"type": "boolean"}, "csrfToken": {"type": ["string", "null"]}}, "required": ["authenticated", "csrfToken"], "type": "object"}`.
- `end_browser_session` — End this local browser session and revoke its pending sign-in transactions. Signing out here does not end the identity provider's separate session. HTTP: `POST /api/account/logout`. Transports: http. Access context: `browser-transaction`. Identity policy: `browser-handshake`. Roles: anonymous-applicant. Permissions: public. Side effect: `end-session`. Input schema: `{"additionalProperties": false, "properties": {}, "required": [], "type": "object"}`. Output schema: `{"additionalProperties": false, "properties": {"authenticated": {"const": false}}, "required": ["authenticated"], "type": "object"}`.
- `prepareApproval` — Freeze this application, its evidence references and current requirements for human sign-off. HTTP: `POST /api/drafts/{draftId}/approval`. Transports: http, mcp. Access context: `principal`. Identity policy: `browser-account`. Roles: account-applicant. Permissions: draft-token. Side effect: `freeze-approval`. Input schema: `{"$defs": {"Document": {"additionalProperties": false, "description": "Upload the original employer file. Its stored reference and fingerprint are available in the details.", "properties": {"mediaType": {"description": "The upload service accepts PDF, PNG, and JPEG.", "enum": ["application/pdf", "image/png", "image/jpeg"], "title": "Document format", "type": "string"}, "objectId": {"description": "Filled in when you upload the original document to this draft.", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Uploaded document reference", "type": "string"}, "sha256": {"description": "Must match the original bytes. A hash by itself does not prove who issued a document.", "pattern": "^[a-f0-9]{64}$", "title": "Document fingerprint", "type": "string"}}, "required": ["objectId", "sha256", "mediaType"], "title": "Document metadata", "type": "object", "x-presentation": {"disclosure": "collapsed"}}, "EmploymentStream": {"additionalProperties": false, "properties": {"employerId": {"description": "Use the employer reference on the issuer\u2019s payroll evidence.", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Employer reference", "type": "string"}, "evidenceIds": {"description": "List the evidence references that support this person\u2019s job.", "items": {"pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "type": "string"}, "maxItems": 100, "minItems": 1, "title": "Evidence references for this job", "type": "array"}, "id": {"description": "Give each reported job a different reference.", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Job reference", "type": "string"}, "memberId": {"description": "Must match a person reference in your household.", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Person reference for this job", "type": "string"}, "payFrequency": {"description": "The required number of pay stubs depends on this frequency.", "enum": ["weekly", "biweekly", "semimonthly", "monthly"], "title": "How often this job pays", "type": "string"}}, "required": ["id", "memberId", "employerId", "payFrequency", "evidenceIds"], "title": "EmploymentStream", "type": "object", "x-informationRequirement": "https://example.org/dc-hcv/requirements/employment-income"}, "ManualEvidence": {"additionalProperties": false, "properties": {"description": {"description": "Explain which person and job this document supports.", "minLength": 1, "title": "What this document shows", "type": "string"}, "document": {"$ref": "#/$defs/Document", "description": "Upload the original PDF or image. Staff will review this evidence route.", "title": "Original supporting document"}, "id": {"pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Id", "type": "string"}, "kind": {"enum": ["unsigned_pay_stub", "employer_letter", "self_declaration", "other"], "title": "Kind", "type": "string"}}, "required": ["id", "kind", "document", "description"], "title": "ManualEvidence", "type": "object", "x-acceptanceRoute": "manual-review"}, "Member": {"additionalProperties": false, "properties": {"fullName": {"description": "Enter the name associated with this person\u2019s evidence.", "minLength": 1, "title": "Full name", "type": "string"}, "id": {"description": "Use this reference when linking a job to this person.", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Person reference", "type": "string"}}, "required": ["id", "fullName"], "title": "Member", "type": "object"}, "PayStubPayload": {"additionalProperties": false, "properties": {"currency": {"const": "USD", "title": "Currency", "type": "string"}, "employeeReference": {"pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Employeereference", "type": "string"}, "employerId": {"pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Employerid", "type": "string"}, "evidenceId": {"pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Evidenceid", "type": "string"}, "grossPay": {"pattern": "^(0|[1-9][0-9]*)\\.[0-9]{2}$", "title": "Grosspay", "type": "string"}, "issuedOn": {"format": "date", "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "title": "Issuedon", "type": "string"}, "payFrequency": {"enum": ["weekly", "biweekly", "semimonthly", "monthly"], "title": "Payfrequency", "type": "string"}, "payPeriodEnd": {"format": "date", "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "title": "Payperiodend", "type": "string"}, "payPeriodStart": {"format": "date", "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "title": "Payperiodstart", "type": "string"}, "paymentDate": {"format": "date", "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "title": "Paymentdate", "type": "string"}, "payrollSequence": {"maximum": 9007199254740991, "minimum": 1, "title": "Payrollsequence", "type": "integer"}, "profile": {"const": "https://example.org/dc-hcv/signed-pay-stub/v1", "title": "Profile", "type": "string"}, "sourceDocument": {"$ref": "#/$defs/Document"}}, "required": ["profile", "evidenceId", "employerId", "employeeReference", "issuedOn", "paymentDate", "payPeriodStart", "payPeriodEnd", "payFrequency", "payrollSequence", "grossPay", "currency", "sourceDocument"], "title": "PayStubPayload", "type": "object"}, "Signature": {"additionalProperties": false, "description": "This signature is supplied by the issuer. Import the signed record rather than entering signature bytes manually.", "properties": {"cmsDerBase64": {"maxLength": 262144, "minLength": 1, "title": "Cmsderbase64", "type": "string"}, "format": {"const": "cms-detached-rfc8785", "title": "Format", "type": "string"}}, "required": ["format", "cmsDerBase64"], "title": "Digital signature details", "type": "object", "x-presentation": {"disclosure": "collapsed"}}, "SignedPayStub": {"additionalProperties": false, "properties": {"id": {"pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Id", "type": "string"}, "kind": {"const": "signed_pay_stub", "title": "Kind", "type": "string"}, "payload": {"$ref": "#/$defs/PayStubPayload", "description": "Import these claims from the employer. Editing them invalidates the signature.", "title": "Issuer-signed payroll claims"}, "signature": {"$ref": "#/$defs/Signature", "description": "Use the detached signature supplied by the payroll issuer.", "title": "Employer\u2019s digital signature"}}, "required": ["id", "kind", "payload", "signature"], "title": "SignedPayStub", "type": "object", "x-cccev": {"class": "http://data.europa.eu/m8g/Evidence", "evidenceType": "https://example.org/dc-hcv/evidence-types/pay-stub", "supportsRequirement": "https://example.org/dc-hcv/requirements/employment-income"}}}, "additionalProperties": false, "properties": {"application": {"$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "description": "Report each person\u2019s employment income and provide the evidence for each job. This demo collects employment evidence; it does not determine housing eligibility.", "properties": {"applicationId": {"description": "Choose a unique reference for this application, beginning with a letter.", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Application reference", "type": "string"}, "employmentIncome": {"description": "Add each person\u2019s job separately, linking it to that person and its supporting evidence.", "items": {"$ref": "#/$defs/EmploymentStream"}, "maxItems": 100, "title": "Jobs and employment income", "type": "array"}, "evidence": {"description": "Add issuer-signed payroll records or original documents for staff review.", "items": {"discriminator": {"mapping": {"employer_letter": "#/$defs/ManualEvidence", "other": "#/$defs/ManualEvidence", "self_declaration": "#/$defs/ManualEvidence", "signed_pay_stub": "#/$defs/SignedPayStub", "unsigned_pay_stub": "#/$defs/ManualEvidence"}, "propertyName": "kind"}, "oneOf": [{"$ref": "#/$defs/SignedPayStub"}, {"$ref": "#/$defs/ManualEvidence"}]}, "maxItems": 200, "title": "Supporting evidence", "type": "array"}, "household": {"description": "Add the people whose employment income you are reporting.", "items": {"$ref": "#/$defs/Member"}, "maxItems": 50, "minItems": 1, "title": "People in your household", "type": "array"}, "profileVersion": {"const": "0.1.0", "title": "Profileversion", "type": "string"}}, "required": ["profileVersion", "applicationId", "household", "employmentIncome", "evidence"], "title": "Your employment evidence", "type": "object", "x-process": {"href": "/api/forms/dc-hcv/process", "policy": "/api/forms/dc-hcv/policy"}}, "draftId": {"minLength": 1, "type": "string"}, "revision": {"type": "string"}, "token": {"minLength": 1, "type": "string"}}, "required": ["draftId", "token", "application", "revision"], "type": "object"}`. Output schema: `{"additionalProperties": false, "properties": {"approvalId": {"type": "string"}, "reviewPath": {"type": "string"}}, "required": ["approvalId", "reviewPath"], "type": "object"}`.
- `readApproval` — Show the exact frozen application, evidence fingerprints and validation findings. HTTP: `GET /api/approvals/{approvalId}`. Transports: http, mcp. Access context: `principal`. Identity policy: `browser-account`. Roles: account-applicant. Permissions: public. Side effect: `none`. Input schema: `{"additionalProperties": false, "properties": {"approvalId": {"minLength": 1, "type": "string"}}, "required": ["approvalId"], "type": "object"}`. Output schema: `{"$defs": {"Document": {"additionalProperties": false, "description": "Upload the original employer file. Its stored reference and fingerprint are available in the details.", "properties": {"mediaType": {"description": "The upload service accepts PDF, PNG, and JPEG.", "enum": ["application/pdf", "image/png", "image/jpeg"], "title": "Document format", "type": "string"}, "objectId": {"description": "Filled in when you upload the original document to this draft.", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Uploaded document reference", "type": "string"}, "sha256": {"description": "Must match the original bytes. A hash by itself does not prove who issued a document.", "pattern": "^[a-f0-9]{64}$", "title": "Document fingerprint", "type": "string"}}, "required": ["objectId", "sha256", "mediaType"], "title": "Document metadata", "type": "object", "x-presentation": {"disclosure": "collapsed"}}, "EmploymentStream": {"additionalProperties": false, "properties": {"employerId": {"description": "Use the employer reference on the issuer\u2019s payroll evidence.", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Employer reference", "type": "string"}, "evidenceIds": {"description": "List the evidence references that support this person\u2019s job.", "items": {"pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "type": "string"}, "maxItems": 100, "minItems": 1, "title": "Evidence references for this job", "type": "array"}, "id": {"description": "Give each reported job a different reference.", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Job reference", "type": "string"}, "memberId": {"description": "Must match a person reference in your household.", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Person reference for this job", "type": "string"}, "payFrequency": {"description": "The required number of pay stubs depends on this frequency.", "enum": ["weekly", "biweekly", "semimonthly", "monthly"], "title": "How often this job pays", "type": "string"}}, "required": ["id", "memberId", "employerId", "payFrequency", "evidenceIds"], "title": "EmploymentStream", "type": "object", "x-informationRequirement": "https://example.org/dc-hcv/requirements/employment-income"}, "ManualEvidence": {"additionalProperties": false, "properties": {"description": {"description": "Explain which person and job this document supports.", "minLength": 1, "title": "What this document shows", "type": "string"}, "document": {"$ref": "#/$defs/Document", "description": "Upload the original PDF or image. Staff will review this evidence route.", "title": "Original supporting document"}, "id": {"pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Id", "type": "string"}, "kind": {"enum": ["unsigned_pay_stub", "employer_letter", "self_declaration", "other"], "title": "Kind", "type": "string"}}, "required": ["id", "kind", "document", "description"], "title": "ManualEvidence", "type": "object", "x-acceptanceRoute": "manual-review"}, "Member": {"additionalProperties": false, "properties": {"fullName": {"description": "Enter the name associated with this person\u2019s evidence.", "minLength": 1, "title": "Full name", "type": "string"}, "id": {"description": "Use this reference when linking a job to this person.", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Person reference", "type": "string"}}, "required": ["id", "fullName"], "title": "Member", "type": "object"}, "PayStubPayload": {"additionalProperties": false, "properties": {"currency": {"const": "USD", "title": "Currency", "type": "string"}, "employeeReference": {"pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Employeereference", "type": "string"}, "employerId": {"pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Employerid", "type": "string"}, "evidenceId": {"pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Evidenceid", "type": "string"}, "grossPay": {"pattern": "^(0|[1-9][0-9]*)\\.[0-9]{2}$", "title": "Grosspay", "type": "string"}, "issuedOn": {"format": "date", "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "title": "Issuedon", "type": "string"}, "payFrequency": {"enum": ["weekly", "biweekly", "semimonthly", "monthly"], "title": "Payfrequency", "type": "string"}, "payPeriodEnd": {"format": "date", "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "title": "Payperiodend", "type": "string"}, "payPeriodStart": {"format": "date", "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "title": "Payperiodstart", "type": "string"}, "paymentDate": {"format": "date", "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "title": "Paymentdate", "type": "string"}, "payrollSequence": {"maximum": 9007199254740991, "minimum": 1, "title": "Payrollsequence", "type": "integer"}, "profile": {"const": "https://example.org/dc-hcv/signed-pay-stub/v1", "title": "Profile", "type": "string"}, "sourceDocument": {"$ref": "#/$defs/Document"}}, "required": ["profile", "evidenceId", "employerId", "employeeReference", "issuedOn", "paymentDate", "payPeriodStart", "payPeriodEnd", "payFrequency", "payrollSequence", "grossPay", "currency", "sourceDocument"], "title": "PayStubPayload", "type": "object"}, "Signature": {"additionalProperties": false, "description": "This signature is supplied by the issuer. Import the signed record rather than entering signature bytes manually.", "properties": {"cmsDerBase64": {"maxLength": 262144, "minLength": 1, "title": "Cmsderbase64", "type": "string"}, "format": {"const": "cms-detached-rfc8785", "title": "Format", "type": "string"}}, "required": ["format", "cmsDerBase64"], "title": "Digital signature details", "type": "object", "x-presentation": {"disclosure": "collapsed"}}, "SignedPayStub": {"additionalProperties": false, "properties": {"id": {"pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Id", "type": "string"}, "kind": {"const": "signed_pay_stub", "title": "Kind", "type": "string"}, "payload": {"$ref": "#/$defs/PayStubPayload", "description": "Import these claims from the employer. Editing them invalidates the signature.", "title": "Issuer-signed payroll claims"}, "signature": {"$ref": "#/$defs/Signature", "description": "Use the detached signature supplied by the payroll issuer.", "title": "Employer\u2019s digital signature"}}, "required": ["id", "kind", "payload", "signature"], "title": "SignedPayStub", "type": "object", "x-cccev": {"class": "http://data.europa.eu/m8g/Evidence", "evidenceType": "https://example.org/dc-hcv/evidence-types/pay-stub", "supportsRequirement": "https://example.org/dc-hcv/requirements/employment-income"}}}, "additionalProperties": false, "properties": {"approvalId": {"type": "string"}, "draftId": {"type": "string"}, "draftToken": {"type": "string"}, "expiresAt": {"type": "string"}, "snapshot": {"additionalProperties": false, "properties": {"application": {"$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "description": "Report each person\u2019s employment income and provide the evidence for each job. This demo collects employment evidence; it does not determine housing eligibility.", "properties": {"applicationId": {"description": "Choose a unique reference for this application, beginning with a letter.", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$", "title": "Application reference", "type": "string"}, "employmentIncome": {"description": "Add each person\u2019s job separately, linking it to that person and its supporting evidence.", "items": {"$ref": "#/$defs/EmploymentStream"}, "maxItems": 100, "title": "Jobs and employment income", "type": "array"}, "evidence": {"description": "Add issuer-signed payroll records or original documents for staff review.", "items": {"discriminator": {"mapping": {"employer_letter": "#/$defs/ManualEvidence", "other": "#/$defs/ManualEvidence", "self_declaration": "#/$defs/ManualEvidence", "signed_pay_stub": "#/$defs/SignedPayStub", "unsigned_pay_stub": "#/$defs/ManualEvidence"}, "propertyName": "kind"}, "oneOf": [{"$ref": "#/$defs/SignedPayStub"}, {"$ref": "#/$defs/ManualEvidence"}]}, "maxItems": 200, "title": "Supporting evidence", "type": "array"}, "household": {"description": "Add the people whose employment income you are reporting.", "items": {"$ref": "#/$defs/Member"}, "maxItems": 50, "minItems": 1, "title": "People in your household", "type": "array"}, "profileVersion": {"const": "0.1.0", "title": "Profileversion", "type": "string"}}, "required": ["profileVersion", "applicationId", "household", "employmentIncome", "evidence"], "title": "Your employment evidence", "type": "object", "x-process": {"href": "/api/forms/dc-hcv/process", "policy": "/api/forms/dc-hcv/policy"}}, "declaration": {"type": "object"}, "documentSha256": {"additionalProperties": {"type": ["string", "null"]}, "type": "object"}, "policyVersion": {"type": "string"}, "profileRevision": {"type": "string"}, "report": {"type": "object"}, "requirements": {"type": "array"}, "validationRules": {"type": "array"}}, "required": ["application", "documentSha256", "profileRevision", "policyVersion", "requirements", "validationRules", "report", "declaration"], "type": "object"}, "snapshotSha256": {"type": "string"}, "state": {"enum": ["pending", "authenticated", "approved"]}}, "required": ["approvalId", "draftId", "draftToken", "state", "snapshot", "snapshotSha256", "expiresAt"], "type": "object"}`.
- `approvalDocument` — Read the original evidence bytes retained with this review snapshot. HTTP: `GET /api/approvals/{approvalId}/documents/{objectId}`. Transports: http, mcp. Access context: `principal`. Identity policy: `browser-account`. Roles: account-applicant. Permissions: public. Side effect: `none`. Input schema: `{"additionalProperties": false, "properties": {"approvalId": {"minLength": 1, "type": "string"}, "objectId": {"minLength": 1, "type": "string"}}, "required": ["approvalId", "objectId"], "type": "object"}`. Output schema: `{"additionalProperties": false, "properties": {"contentBase64": {"type": "string"}, "objectId": {"type": "string"}}, "required": ["objectId", "contentBase64"], "type": "object"}`.
- `cancelApproval` — Revoke this approval request. It cannot be used to submit. HTTP: `POST /api/approvals/{approvalId}/cancel`. Transports: http, mcp. Access context: `principal`. Identity policy: `browser-account`. Roles: account-applicant. Permissions: public. Side effect: `cancel-approval`. Input schema: `{"additionalProperties": false, "properties": {"approvalId": {"minLength": 1, "type": "string"}, "revision": {"type": "string"}}, "required": ["approvalId", "revision"], "type": "object"}`. Output schema: `{"additionalProperties": false, "properties": {"cancelled": {"const": true}}, "required": ["cancelled"], "type": "object"}`.
- `authenticateApproval` — Authenticate freshly with the declared provider for this review. Authentication does not yet approve the application. HTTP: `POST /api/approvals/{approvalId}/authenticate`. Transports: http. Access context: `browser-transaction`. Identity policy: `browser-handshake`. Roles: anonymous-applicant. Permissions: public. Side effect: `authenticate-approval`. Input schema: `{"additionalProperties": false, "properties": {"approvalId": {"minLength": 1, "type": "string"}, "revision": {"type": "string"}}, "required": ["approvalId", "revision"], "type": "object"}`. Output schema: `{"additionalProperties": false, "properties": {"authorizationUrl": {"type": "string"}, "expiresAt": {"type": "string"}}, "required": ["authorizationUrl", "expiresAt"], "type": "object"}`.
- `confirmApproval` — Explicitly acknowledge and approve the frozen snapshot after fresh trusted-provider authentication. HTTP: `POST /api/approvals/{approvalId}/confirm`. Transports: http. Access context: `browser-transaction`. Identity policy: `browser-handshake`. Roles: anonymous-applicant. Permissions: public. Side effect: `confirm-approval`. Input schema: `{"additionalProperties": false, "properties": {"acknowledgment": {"const": true}, "approvalId": {"minLength": 1, "type": "string"}, "revision": {"type": "string"}}, "required": ["approvalId", "acknowledgment", "revision"], "type": "object"}`. Output schema: `{"additionalProperties": false, "properties": {"approvalId": {"type": "string"}, "approved": {"const": true}}, "required": ["approved", "approvalId"], "type": "object"}`.

## Declared identity and authorization policies

- `anonymous-demo`: `{"acceptedProofingRoutes": [], "actors": ["anonymous"], "applicationScope": "none", "delegation": "disallowed", "humanApproval": "not-required", "maximumAuthenticationAgeSeconds": null, "minimumAuthentication": "none", "proofing": "none", "requiredEntitlements": []}`
- `reviewer`: `{"acceptedProofingRoutes": [], "actors": ["human"], "applicationScope": "none", "delegation": "disallowed", "humanApproval": "not-required", "maximumAuthenticationAgeSeconds": null, "minimumAuthentication": "authenticated", "proofing": "none", "requiredEntitlements": ["employment-evidence-reviewer"]}`
- `browser-account`: `{"acceptedProofingRoutes": [], "actors": ["human"], "applicationScope": "none", "delegation": "disallowed", "humanApproval": "not-required", "maximumAuthenticationAgeSeconds": null, "minimumAuthentication": "authenticated", "proofing": "none", "requiredEntitlements": []}`
- `browser-handshake`: `{"acceptedProofingRoutes": [], "actors": ["anonymous"], "applicationScope": "none", "delegation": "disallowed", "humanApproval": "not-required", "maximumAuthenticationAgeSeconds": null, "minimumAuthentication": "none", "proofing": "none", "requiredEntitlements": []}`
- `approved-applicant`: `{"acceptedProofingRoutes": [], "actors": ["human"], "applicationScope": "none", "delegation": "disallowed", "humanApproval": "required", "maximumAuthenticationAgeSeconds": null, "minimumAuthentication": "authenticated", "proofing": "none", "requiredEntitlements": []}`
- `approval-authentication`: `{"acceptedProofingRoutes": [], "actors": ["human"], "applicationScope": "application", "delegation": "disallowed", "humanApproval": "not-required", "maximumAuthenticationAgeSeconds": 120, "minimumAuthentication": "authenticated", "proofing": "none", "requiredEntitlements": []}`

## Declared resources

- `govforms://dc-hcv/interface` — Employment evidence interface: Annotated schema, revision, readable requirements, operations and remediation. HTTP: `GET /api/forms/dc-hcv/interface`.
- `govforms://dc-hcv/schema` — Employment application schema: Canonical employment application data schema with profile annotations. HTTP: `GET /api/forms/dc-hcv/schema`.
- `govforms://dc-hcv/process` — Employment evidence profile: Authoritative CCCEV requirements and service declarations. HTTP: `GET /api/forms/dc-hcv/process`.
- `govforms://dc-hcv/policy` — Employment acceptance policy: Authoritative acceptance policy with runtime verifier configuration. HTTP: `GET /api/forms/dc-hcv/policy`.
- `govforms://dc-hcv/requirements` — Readable employment requirements: Readable requirements derived from the current policy and linked SHACL rules. HTTP: `GET /api/forms/dc-hcv/requirements`.
- `govforms://dc-hcv/shapes/process` — process SHACL rules: Authoritative local SHACL Core definitions for process. HTTP: `GET /api/forms/dc-hcv/shapes/process`.
- `govforms://dc-hcv/shapes/document-age` — document-age SHACL rules: Authoritative local SHACL Core definitions for document-age. HTTP: `GET /api/forms/dc-hcv/shapes/document-age`.

## Requirements from the current specification

- **Verify each reported employment income stream**: Provide evidence for each person’s job separately. Another household member’s pay stubs cannot establish this job’s income.
- **Gross wages for one pay period**: Show the total amount earned in each pay period before taxes and other deductions.
- **Period and frequency of payroll**: Show when each pay period started and ended, and how often the job pays.
- **Current consecutive pay-stub coverage**: Provide 4 recent consecutive pay stubs if paid weekly; 2 if paid every two weeks; 2 if paid twice a month; or 2 if paid monthly. The stubs must cover the most recent completed pay periods.
- **Document currency relative to the agency request**: Use documents issued no more than 60 days before the agency request. Documents issued after the request need staff review.
- SHACL `https://example.org/dc-hcv/shapes/DocumentAgeShape` (/api/forms/dc-hcv/shapes/document-age):
  - Provide one document issue date.
  - Document issue date must be a date.
  - Document issue date must be on or before the agency request date.
  - Provide one agency request date.
  - Agency request date must be a date.
  - Provide one earliest allowed issue date.
  - Earliest allowed issue date must be a date.
  - Earliest allowed issue date must be on or before the document issue date.

## Contextual evidence guidance

- **One evidence set per job**: Match each job to its household member and employer. Reusing another person’s pay stubs cannot establish this job’s income. Condition: `{"operator": "nonempty", "path": "/employmentIncome", "value": ""}`.
- **Keep the original employer document**: Do you have the original PDF from your employer? Upload it with the signed payroll record so its bytes can be checked against the signed fingerprint. Condition: `{"operator": "contains-kind", "path": "/evidence", "value": "signed_pay_stub"}`.
- **Alternative evidence needs staff review**: If you cannot provide issuer-signed payroll evidence, describe the original document and ask staff which alternative is suitable. Uploading a document does not automatically satisfy the requirement. Condition: `{"operator": "nonempty", "path": "/evidence", "value": ""}`.

## Evidence remediation

- `document_missing`: The original employer document has not been uploaded to this draft. Do you have the original PDF from your employer? Upload that file, then check the evidence again.
- `document_digest_mismatch`: The uploaded document differs from the document covered by the signature. Upload the exact original file supplied by the employer. Avoid printing, scanning, or resaving it.
- `invalid_cms_signature`: The payroll signature could not be verified. Import the original signed payroll record from the employer. Ask the issuer for a fresh record if it still fails.
- `payload_digest_mismatch`: The payroll claims differ from the signed record. Restore the issuer’s original signed payroll claims and signature.
- `signer_not_authorized`: The payroll signer is not approved for this employer. Ask staff to check the issuer’s authorization; an applicant cannot approve a signing certificate.
- `certificate_not_current`: The signing certificate is not current at evaluation time. Ask the payroll issuer or staff for help verifying a record with a current certificate.
- `certificate_revoked`: The signing certificate has been revoked. Ask the employer for replacement evidence and have staff review the affected record.
- `revocation_unknown`: The service cannot establish whether the signing certificate is revoked. Staff must check issuer status before this evidence can be accepted.
- `evidence_id_mismatch`: The evidence reference does not match the issuer-signed reference. Restore the original issuer record and use its evidence reference consistently.
- `manual_evidence_route`: This document follows a staff review route. Describe which person and job it supports. Staff will determine whether additional evidence is needed.
- `identity_binding_not_configured`: The demo cannot confirm the person-to-employment identity link. Staff must confirm the household member and employer records before acceptance.
- `full_policy_evaluation_not_implemented`: The demo has not run every required policy check. Wait for staff review. A successful signature check alone does not establish acceptance.
- `authority_employment_binding_unavailable`: The service cannot yet verify the person and employer for this job. Staff must confirm the job against trusted agency records. The service has not run every required policy check successfully.
- `authority_employee_binding_unavailable`: The payroll employee reference has not been linked to this household member. Ask staff to verify the employer’s employee reference against the household member.
- `authority_payroll_calendar_unavailable`: The service cannot confirm the most recent completed payroll periods. Staff must supply a verified employer pay calendar before payroll coverage can be accepted.
- `agency_clearance_unavailable`: Staff conflict and hold checks are not available. Wait for staff to check whether this job has an outstanding conflict or review hold.
- `unsupported_required_check`: A required check is not supported by this service. Ask staff to review the specification. This evidence cannot be accepted automatically.
- `source_document_missing`: An original employer document is missing. Do you have the original PDF from your employer? Upload the exact file and check the evidence again.
- `insufficient_payroll_coverage`: There are not enough current consecutive pay stubs. Provide the missing stubs for the latest completed pay periods, using the count required for this job’s pay frequency.
- `payroll_coverage_not_current_and_consecutive`: The selected pay stubs do not cover the latest consecutive payroll sequence. Check for a missing pay period or an older stub and provide the latest consecutive set.
- `payroll_records_not_distinct`: The selected payroll records repeat a pay period or original document. Provide a distinct original document for each required pay period.
- `document_age_requirement_failed`: A document does not meet the agency’s date requirements. Provide a document within the displayed agency request-date window, or ask staff to review it.
- `certificate_revocation_unavailable`: The signing certificate’s revocation status cannot be confirmed. Staff must obtain current trusted issuer status before this evidence can be accepted.
- `agency_conflict_or_staff_hold`: This job has a recorded conflict or staff hold. Ask staff to review the issue before proceeding.
- `no_employment_streams_to_evaluate`: There are no reported jobs to evaluate. Add the jobs you are reporting, or ask staff which evidence route applies to your situation.
- `accept-employment-evidence`: Your employment evidence meets the required checks. Keep your receipt. Acceptance of employment evidence does not determine housing eligibility.
- `manual-review`: Staff review is needed before this evidence can be accepted. Review the guidance below and keep the original documents available for staff.
- `request-additional-evidence`: More evidence is needed for the reported employment. Provide the missing original documents or pay periods described below, then check the evidence again.

## Required policy checks

- `submission_schema_valid`
- `unique_ids_and_references_resolve`
- `stream_member_and_employer_match_authority_records`
- `every_selected_evidence_is_a_signed_pay_stub`
- `cms_signature_valid_for_rfc8785_payload_bytes`
- `actual_signer_certificate_matches_one_authorized_pin`
- `certificate_valid_and_not_revoked`
- `signer_authorized_for_payload_employer_and_evidence_type`
- `employee_reference_matches_stream_member_via_authority_binding`
- `signed_payload_evidence_id_matches_outer_id`
- `source_document_bytes_match_signed_sha256`
- `pay_frequency_and_employer_match_stream`
- `dates_are_ordered_and_not_in_the_future`
- `document_within_request_date_window`
- `enough_distinct_current_consecutive_pay_stubs`
- `no_known_conflict_or_staff_hold`
