Repository navigation
Released 2026-10-08. Specification: https://spec.ojcp.dev/
Minor version. All changes are additive and backward-compatible: the schema $id
namespace stays at /v0.1/, and ojcp_version accepts "0.1", "0.2" and "0.3", so
existing providers and agents keep validating.
Changed
jobLocationaccepts an array ofPlace— a posting open in more than one location can now state every location the employer accepts, as schema.org itself permits. A singlePlaceremains valid, so existing single-location consumers are unaffected. Providers MUST NOT reduce a multi-location posting to one of its locations. Updated inschemas/job-posting.json,schemas/responses/search-jobs.json, the JobPosting section ofspec/ojcp-v0.1.bs, andexamples/responses/search-response.json. Reported with coverage figures in #19.- Agent identity binding no longer uses the Public Suffix List (RFC 0001 erratum E1, #11). A signed
agent_idbinds when the reversedSignature-Agenthost prefixes it on a label boundary (wayfarer.ai→ai.wayfarer.*), which closes the hole that let any subdomain claim everyagent_idunder its registrable domain. A verifiedagent_idmust be lowercase LDH hostname labels. Providers MUST NOT use an unverifiedagent_idfor allowlists, rate limiting or session binding. Updated in the spec's Agent Identity, Error Responses, Security and IANA sections. Migration: an agent that signs from a host outside its own namespace — a sibling subdomain such askeys.eu.wayfarer.aisigning asai.wayfarer.agent, which bound under the PSL rule — must either sign fromwayfarer.ai/agent.wayfarer.aior list that origin inhttps://agent.wayfarer.ai/.well-known/ojcp-agent.json. restricted_feedinauth.agent_signatures.required_foralso covers anysearch_jobsrequest that would return restricted or private jobs, and a provider that gates any part of its feed MUST list it. The manifest example declaresrestricted_feedinoptional_scopesandagent_signatures.user_mandateonAgentDeclarationis now fully specified (see User mandates below); its schema description states the profile instead of deferring it.- Spec structure — "Open Questions" is replaced by a Scope section stating what the specification deliberately does not define (form skill descriptors, the user-mandate credential format, registry operations, verifier internals, conversion reporting). The Versioning section states the current version and the minor-version compatibility rule. Examples now declare
ojcp_version"0.3". - The eligibility-gates design record is renumbered from 0005 (a duplicate number) to 0006.
Added
- Delegated agent signing —
/.well-known/ojcp-agent.json, served at the host anagent_idnames, authorizes third-partySignature-Agentorigins to sign as it. Schema inschemas/agent-identity.json, example inexamples/agent-identity.json. agent_id_malformederror code, in the spec's error table andschemas/responses/error.json.- Provider-derived attribution (RFC 0007). A provider that declares attribution credits each application from evidence it already holds, in order: a valid provider-issued
attribution_ref, then the caller's most recent impression of that job within the attribution window (last touch), then none. Agents that search and apply under the same authenticated or verified identity are credited without relaying anything. Providers MUST NOT treat a missingsource_attributionas unattributed when an impression matches, and MUST NOT fingerprint callers. New optional fields:attribution_refonsearch_jobsresults and theget_job_detailresponse,source_attribution.attribution_refonbegin_applicationandsubmit_application, anattributionoutcome on thebegin_applicationresponse, and anattributionmanifest block (supported,methods,window_days). New Attribution section inspec/ojcp-v0.1.bs; updated schemas,examples/manifest.json,examples/responses/search-response.json,examples/responses/begin-application-verification.json, anddocs/proposal.md. All additions are optional, andreferrerandreference_idkeep their meaning. - User mandates — a normative profile for
AgentDeclaration.user_mandate: a key-bound credential (SD-JWT VC RECOMMENDED) that binds the exact agent signing key (cnf.jkt) and the consuming resource server (aud) to a canonicalojcp_actionstatement; on multi-tenant ATSs the statement also binds the employer, and forsubmit_applicationit binds theapplication_id, a JCS/SHA-256 candidate-data digest, and a provider-issued single-usemandate_nonce(new optional field on thebegin_applicationresponse). Covers mandate-admission policy, independent decisions for platform identity, candidate identity and user authorization, a fixed fail-closed verification order, atomicjti/nonce consumption, exact-key binding across key rotation, and revocation. New error codeuser_mandate_required, returned whether a required mandate is missing or fails verification. Decision record 0003. - Agent-scoped job visibility —
search_jobsaccepts an optionalagent_declaration, and JobPosting gains an optionalvisibilityblock (tier:public|restricted|private;audience: permittedagent_ids), enforced server-side against a verifiedagent_id.privatejobs also require therestricted_feedscope. Anonymous or unverified callers see onlypublicjobs;total_results,open_roles_countand every other count include only visible jobs;get_job_detailandbegin_applicationanswer a non-visible job withjob_not_found;visibility.audienceis never returned. Gating MUST depend on the agent's identity, never on candidate characteristics. New exampleexamples/job-posting-restricted.json. Decision record 0004. - Inline identity verification via MCP Apps — optional
ui_resource(ui://URI) onVerificationStep, and anembedded_appvalue in the verifier manifest'sproof_delivery_methods.verification_urlremains required as the fallback; proof delivery and validation are unchanged. Decision record 0005. - Eligibility gates — an optional
eligibilityblock on JobPosting with three hard gates:visa_sponsorship(offered,not_offered,unspecified),relocation(offered,not_offered,required,unspecified) andsecurity_clearance(required,not_required,unspecified). An absent orunspecifiedgate MUST NOT be read as a negative, and agents MUST ignore enum members they do not recognise. Decision record 0006. user_mandate_requirederror code, in the spec's error table andschemas/responses/error.json.ojcp_versionaccepts"0.3"in the manifest and all tool response schemas ("0.1"and"0.2"remain valid).- Interoperability table entries for MCP Apps, HTTP Message Signatures / Web Bot Auth, and SD-JWT VC.