{"$id":"https://movahedi.ca/schema/agent-scope-card/v0.1.0.json","$schema":"https://json-schema.org/draft/2020-12/schema","@context":{"@vocab":"https://movahedi.ca/schema/agent-scope-card/v0.1.0#","access":"https://movahedi.ca/schema/agent-scope-card/v0.1.0#access","agent":"https://movahedi.ca/schema/agent-scope-card/v0.1.0#agent","card_metadata":"https://movahedi.ca/schema/agent-scope-card/v0.1.0#card_metadata","human_gate":"https://movahedi.ca/schema/agent-scope-card/v0.1.0#human_gate","kill_switch":"https://movahedi.ca/schema/agent-scope-card/v0.1.0#kill_switch","legal_context":"https://movahedi.ca/schema/agent-scope-card/v0.1.0#legal_context","non_certification_note":"https://movahedi.ca/schema/agent-scope-card/v0.1.0#non_certification_note","operator":"https://movahedi.ca/schema/agent-scope-card/v0.1.0#operator","prompt_handling":"https://movahedi.ca/schema/agent-scope-card/v0.1.0#prompt_handling","record_correction":"https://movahedi.ca/schema/agent-scope-card/v0.1.0#record_correction","subprocessors":"https://movahedi.ca/schema/agent-scope-card/v0.1.0#subprocessors"},"additionalProperties":false,"description":"Machine-readable schema for the agent scope card: a one-page disclosure of what an AI agent reads and writes, who must approve its consequential steps, how prompts are retained and whether they train a model, who the subprocessors are, how to stop the agent, and how to correct the record. The vendor publishes their own card at their own URL; movahedi.ca publishes this format and the tools that render and diff cards, and holds no one's card. An evidence format, not legal advice. A card is never a movahedi.ca certification, endorsement, or approval of any agent. Cards are free, forever.","examples":[{"access":{"reads":[{"data_categories":["menu_items","prices","availability"],"note":"Read-only menu feed, refreshed hourly.","system_id":"pos-menu-api"},{"data_categories":["order_status"],"note":"Reads status to answer where-is-my-order questions.","system_id":"order-queue"}],"writes":[{"data_categories":["order_ticket","pickup_time"],"note":"Order tickets carry items and pickup time only; no customer names.","system_id":"kitchen-queue"},{"data_categories":["payment_link_request","amount_cents","order_ref"],"note":"Creates payment links. The agent never sees or stores card numbers.","system_id":"payment-link-service"}]},"agent":{"name":"Lumen Order Assistant (fictional)","purpose":"Takes customer pickup orders in chat and queues them for the kitchen; confirms payment links but never charges a card.","purpose_fr":"Prend les commandes à emporter en clavardage et les transmet à la cuisine; confirme les liens de paiement mais ne débite jamais une carte.","version":"0.9.2"},"card_metadata":{"card_id":"card-fictional-cafe-lumen-001","card_url":"https://example.com/cards/cafe-lumen-order-assistant.json","fictional_example":true,"french_completeness_status":"complete","last_true_date":"2026-11-01","published_at_utc":"2026-11-04T18:00:00Z","schema_version":"0.1.0","supersedes_card_id":null},"human_gate":{"autonomous_steps_before_gate":3,"requires_human_approval":["Any refund or discount over $20","Any change to menu items or prices","Any new tracker, pixel, or server-side feed (consequential action CA-05)"],"step_definition":"One tool call counts as one step; a read and its follow-up write are two steps."},"kill_switch":{"effect":"No new orders within 60 seconds. Tickets already in the kitchen finish normally.","procedure":"Press 'Pause agent' on the vendor status page, or email orders-stop@example.com with the subject 'stop'. Either works around the clock.","who_can_trigger":"Any staff member; any customer can trigger it by typing 'stop the bot' in chat."},"legal_context":[{"citation":"Law 25 s. 12","citation_fr":"Loi 25 art. 12","relevance":"Chat transcripts are not used to train a model; no secondary purpose."},{"citation":"Law 25 s. 17","citation_fr":"Loi 25 art. 17","relevance":"The US model host is a cross-border transfer; the foreign-regime assessment is on file."},{"citation":"OPC-2023-001","relevance":"Purchase data stays in-house; no ad-platform destinations."}],"non_certification_note":"This card is an open disclosure format describing what an agent is allowed to do. It is not legal advice, and it is not a movahedi.ca certification, endorsement, or approval of any agent.","operator":{"contact_url":"https://example.com/privacy","jurisdiction":"CA-QC","name":"Café Lumen (fictional)"},"prompt_handling":{"detail":"Chat transcripts are kept 30 days for quality review, then deleted. Prompts and transcripts are not used to train any model.","prompts_train_model":false,"retained":true,"retention_days":30},"record_correction":{"contact":"corrections@example.com","procedure":"Email corrections@example.com describing the wrong field. The operator updates the card, re-verifies every field, and sets a new last_true_date.","response_time":"2 business days"},"subprocessors":[{"jurisdiction":"US","name":"Fictional Model Host","purpose":"Runs the chat model that powers the assistant.","role":"model_host"},{"jurisdiction":"CA-QC","name":"Fictional Log Store","purpose":"Stores the 30-day transcripts.","role":"log_host"}]}],"properties":{"access":{"additionalProperties":false,"description":"system_id is a stable identifier, never a credential or endpoint secret. data_categories are categories, never values. A card carries no raw personal information: if a field would need a name, an email address, or an ID number, it does not belong in the card.","properties":{"reads":{"items":{"additionalProperties":false,"properties":{"data_categories":{"items":{"type":"string"},"type":"array"},"note":{"type":"string"},"system_id":{"type":"string"}},"required":["system_id","data_categories"],"type":"object"},"type":"array"},"writes":{"items":{"additionalProperties":false,"properties":{"data_categories":{"items":{"type":"string"},"type":"array"},"note":{"type":"string"},"system_id":{"type":"string"}},"required":["system_id","data_categories"],"type":"object"},"type":"array"}},"required":["reads","writes"],"type":"object"},"agent":{"additionalProperties":false,"properties":{"name":{"type":"string"},"purpose":{"description":"One sentence, plain language: what the agent is for.","type":"string"},"purpose_fr":{"description":"French counterpart of purpose. Required when french_completeness_status is complete.","type":"string"},"version":{"description":"The agent build this card describes.","type":"string"}},"required":["name","purpose","version"],"type":"object"},"card_metadata":{"additionalProperties":false,"properties":{"card_id":{"description":"Stable identifier chosen by the vendor, e.g. card-acme-support-003.","type":"string"},"card_url":{"description":"Where the vendor hosts this card. The vendor's URL is the canonical copy.","format":"uri","type":"string"},"fictional_example":{"description":"True only for worked examples. A real card must carry false.","type":"boolean"},"french_completeness_status":{"description":"complete when every user-facing string has a French counterpart; partial_marked when some fields are English-only and marked as such.","enum":["complete","partial_marked"]},"last_true_date":{"description":"The last date on which the operator verified every field of this card was true. A card with a stale last_true_date describes a system that has shipped since.","format":"date","type":"string"},"published_at_utc":{"description":"When this card version was published.","format":"date-time","type":"string"},"schema_version":{"const":"0.1.0","description":"Schema version this card was written against."},"supersedes_card_id":{"description":"card_id of the previous version this card replaces, if any.","type":["string","null"]}},"required":["schema_version","card_id","card_url","published_at_utc","last_true_date","fictional_example","french_completeness_status"],"type":"object"},"human_gate":{"additionalProperties":false,"properties":{"autonomous_steps_before_gate":{"description":"How many agent steps may run before a person must approve. 0 means every consequential step needs a person.","minimum":0,"type":"integer"},"requires_human_approval":{"description":"Each entry names something only a person may approve: payments, refunds, and any of the twelve consequential actions (CA-01 through CA-12) the agent may touch.","items":{"type":"string"},"type":"array"},"step_definition":{"description":"What counts as one step, in the operator's own words.","type":"string"}},"required":["autonomous_steps_before_gate","step_definition","requires_human_approval"],"type":"object"},"kill_switch":{"additionalProperties":false,"properties":{"effect":{"description":"What stops, and how fast.","type":"string"},"procedure":{"description":"Exactly how to stop the agent, written for someone using it at midnight.","type":"string"},"who_can_trigger":{"type":"string"}},"required":["procedure","who_can_trigger","effect"],"type":"object"},"legal_context":{"description":"Optional. Statute and case citations the operator says are relevant, each with a one-line relevance note. Every legal claim in an instance carries a citation here.","items":{"additionalProperties":false,"properties":{"citation":{"type":"string"},"citation_fr":{"type":"string"},"relevance":{"type":"string"}},"required":["citation","relevance"],"type":"object"},"type":"array"},"non_certification_note":{"const":"This card is an open disclosure format describing what an agent is allowed to do. It is not legal advice, and it is not a movahedi.ca certification, endorsement, or approval of any agent.","description":"Immutable literal. Byte-identical in every card."},"operator":{"additionalProperties":false,"properties":{"contact_url":{"description":"Where a person reaches the operator about this card.","format":"uri","type":"string"},"jurisdiction":{"description":"Home jurisdiction of the operator.","enum":["CA-QC","CA-ON","CA-BC","CA-AB","CA-FED","US","EU","other"]},"name":{"description":"Legal or trade name of the organization operating the agent.","type":"string"}},"required":["name","jurisdiction","contact_url"],"type":"object"},"prompt_handling":{"additionalProperties":false,"properties":{"detail":{"description":"Plain-language retention and training note.","type":"string"},"prompts_train_model":{"description":"Whether prompts or transcripts are used to train any model. True is a secondary purpose: see Law 25 s. 12.","type":"boolean"},"retained":{"type":"boolean"},"retention_days":{"description":"How long prompts and transcripts are kept, in days. Null when not retained.","minimum":0,"type":["integer","null"]}},"required":["retained","retention_days","prompts_train_model","detail"],"type":"object"},"record_correction":{"additionalProperties":false,"properties":{"contact":{"type":"string"},"procedure":{"description":"How a wrong field in this card gets fixed.","type":"string"},"response_time":{"type":"string"}},"required":["procedure","contact","response_time"],"type":"object"},"subprocessors":{"description":"Everyone who touches the agent's data besides the operator: the model host, tool hosts, log hosts.","items":{"additionalProperties":false,"properties":{"jurisdiction":{"description":"Where the subprocessor processes the data. A host outside Canada is a cross-border transfer: see Law 25 s. 17.","type":"string"},"name":{"type":"string"},"purpose":{"type":"string"},"role":{"enum":["model_host","tool_host","log_host","other"]}},"required":["name","role","jurisdiction","purpose"],"type":"object"},"type":"array"}},"required":["card_metadata","operator","agent","access","human_gate","prompt_handling","subprocessors","kill_switch","record_correction","non_certification_note"],"title":"Agent scope card schema","type":"object","version":"0.1.0"}