Human Coder Submission Contract
One submission represents one primary coder’s completed work for one approved cohort and one deterministic blind packet. The canonical exchange form is submission-schema.json. The spreadsheet transport is defined by submission-csv-contract.json and normalizes to the same JSON shape before ingestion.
Identity and preparation
A valid submission binds all of the following to the approved cohort:
- cohort, case, sample, packet, source language, task layer, and codebook identities and versions;
- the packet manifest’s
packet_hash; - a pseudonymous primary
coder_id; - qualification and source-language attestations;
- training and calibration identities and completion timestamps;
- conflict status and required details for a disclosed conflict;
- independent-completion and AI-assistance declarations; and
- a completion timestamp.
The blank templates generated with a packet intentionally contain a null or blank packet_hash. The coordinator supplies the final packet manifest to the coder, and the completed submission copies the manifest’s packet_hash. The blank template remains a hashed packet payload, while the completed submission is a new artifact with its own raw hash assigned during ingestion. This avoids a circular hash between the packet manifest and its blank response template.
An ai_assistance_used: true declaration is preserved rather than silently rewritten. Such a submission belongs to a separately declared assisted-coding design and cannot be treated as an independent unassisted primary submission.
Response shape
Every response repeats the stable packet item, document, sentence, source-span, and lexical-unit IDs. Identification uses lexical_unit_responses, with exactly one response for every lexical unit in the sampled sentence. CMT and interpretation retain all focal lexical-unit IDs while recording one layered response for the packet item.
Each response records a controlled disposition, confidence, uncertainty and its note, optional notes, and an out-of-scope reason. A coded response requires the task-layer payload. An out-of-scope response forbids a substantive payload and confidence value so a provisional answer cannot be mistaken for completed coding.
Case-specific additions live only in case_fields. Keys use <case_id>__<field_name> and values are scalars or scalar arrays. The core schema and code contain no Lincoln-only fields.
CSV normalization
The CSV transport is one UTF-8, comma-delimited file with LF endings. Cohort and coder metadata repeats identically on every row. Identification has one row per lexical unit; CMT and interpretation have one row per packet item. Array and extension columns contain compact JSON rather than delimiter-joined text.
Ingestion must reject inconsistent repeated metadata and normalize all rows to submission-schema.json before registration. Blank cells represent JSON null or an absent optional value according to the CSV contract; they are never a third controlled-vocabulary value.
Contextual validation
JSON Schema validates structure and closed vocabularies carried by the contract. scripts/human_reliability/submission_contract.py additionally checks the submission against the approved cohort and packet:
- identity and packet-hash equality;
- exact packet-item coverage with no duplicate or unknown item IDs;
- document, sentence, source-span, and lexical-unit binding;
- exact lexical-unit coverage for identification;
- source and target domains against the repository controlled vocabularies; and
- the case namespace for extension fields.
The human submission ingestion workflow uses this contract to parse JSON and CSV, preserve original bytes, register every attempt, and write a separate normalized view. Invalid submissions remain auditable and never enter agreement metrics.