THE INTRO CARD is free — what an AI skill card is and how to use one Download →Lost Lauren, contact us

THE INSTRUMENTS · Nº 966 · EDITION 1 · LAUNCHING SOON

LUND CARDS · THE INSTRUMENTSNº 966
THE OUTPUT CONTRACT CARD — the LSC-1 face
THE CARD AS TEXT · FOR EYES AND FOR MACHINES

THE OUTPUT CONTRACT CARD · the output contract · every reply against the shape the system needs

WAKES WHEN JSON from Claude breaks a parser or an integration, a pipeline needs a guaranteed format, someone asks how often the output is valid, or a schema moves to structured outputs

THE METHOD

  1. check contract.json outputs.jsonl — the rate and range, every failure, the causes and their fixes.
  2. platform contract.json — what the platform enforces for this contract, what stays yours, the request shape and the models as read.
  3. tighten contract.json sent-schema.json — where the schema sent is looser.
  4. one contract.json value.json — one document, when someone pastes one.
  5. The team constrains the reply, tightens the schema, keeps the checks the platform does not enforce, and checks a new sample.

REFUSES

  • A rate estimated from a glance
  • A rate without its range
  • Platform rules from memory
  • Calling a refusal a format fault
  • Changing the downstream contract on its own

IT MAKES check — a sample of outputs against the contract: rate, every failure, causes, fixes; one — one JSON document against the contract; platform — what structured outputs would enforce for this contract, and what stays yours; tighten — where the schema sent to the model is looser than the contract; rules — the platform facts used, with sources and dates.

THE LAW The rate comes from the sample on file through the machine, and always carries its range. It holds for that sample only. The platform's facts are dated data from the docs, never memory. A refusal is routed, not retried blindly; a cut-off reply is a max_tokens problem first. Shape, not truth: a valid output can still be wrong. The contract is the team's; the card proposes, the team changes it.

IN THE BOX scripts/contract.py · assets/api-rules.json · the causes and fixes · the formats · the method by hand · the sources · ten tests.

PROOF selftest 24/24; an invoice-extraction sample of 48 checked, fitted to the platform and tightened, and the trigger test, on the record (WITNESS.md) · witnessed 2026-10-13 · EDITION 1.

THE SEAL 96 of 100 · LEGENDARY · WITNESSED · Trigger 5 · Machinery 5 · Law 5 · Portability 5 · Proof 4

IT CAN BE WRONG an AI reading a text file: it can be wrong and can invent a number, a rule, a name or a date; check what matters against your own records and the source; the risk is yours. LICENSE-NOTE.md rides in the packet and is the licence.

THE PUNCH · SHA-256 OF SKILL.MD · 7B03DB39B03E7E1AC3673C05

THE FACE, FULL SIZE → · THE MACHINE FACE → · card.json →

THE OUTPUT CONTRACT CARD

the output contract · every reply against the shape the system needs

CHECK · ONE · PLATFORM · TIGHTEN · RULES

96LEGENDARYWITNESSEDIN CLAUDEIN LUNDRIN CHATGPT

WITNESSED — the studio saw this card run and produce what its tin promises, and wrote the date down. What the marks mean →

THE SPEC SHEET · READ BEFORE YOU BUY · THE STANDARD EVERY CARD MEETS →

SEAL
96 of 100 · LEGENDARY · WITNESSED
EDITION
E1 · witnessed 2026-10-13
MACHINE
scripts/contract.py · 5 commands · selftest 24/24
RUNS
On your own computer. Standard library only, offline; no account, no key, no telemetry.
HOSTS
Claude · Claude Code · ChatGPT · Gemini · any AI that reads a file (HOSTS.md names each door)
LICENCE
One person, any number of their own AIs and computers · editions replace files · nothing renews · freeze, not loss
PUNCH
7B03DB39B03E7E1AC3673C05 · sha-256 of SKILL.md · check any file against it →

CITE THIS CARDTHE OUTPUT CONTRACT CARD, Edition 1. Lund Studio LLC, Westminster, Colorado. https://lundr.tech/?view=output-contract-card. Punch 7B03DB39B03E7E1AC3673C05. Retrieved 2026-10-13.

What it is.

A check, before and after launch, that a model's outputs match the exact shape a downstream system accepts: an import, a parser, an integration. From a sample of real outputs and the contract (a JSON Schema) it gives:

Use it whenever jSON from Claude breaks a parser or an integration, a pipeline needs a guaranteed format, someone asks how often the output is valid, or a schema moves to structured outputs. Not for tool input schemas (THE TOOL SCHEMA CARD), agent-to-agent hand-offs (THE ENVELOPE CARD), arithmetic (THE NUMBERS CARD), version comparisons (THE REGRESSION CARD).

It carries a machine that shows its working: check — a sample of outputs against the contract: rate, every failure, causes, fixes; one — one JSON document against the contract; platform — what structured outputs would enforce for this contract, and what stays yours; tighten — where the schema sent to the model is looser than the contract; rules — the platform facts used, with sources and dates — 24 checks in its selftest.

It answers requests such as “our parser keeps choking on Claude's JSON: what is going wrong?”, “how often is the extraction output actually valid?”, “will our schema work with structured outputs?”, “we send a schema already, so why do extra keys still get through?”.

Five laws, written into the card.

They are in the card itself, so the AI follows them.

THE RATE COMES FROM THE SAMPLE…The rate comes from the sample on file through the machine, and always carries its range. It holds for that sample only.
THE PLATFORM'S FACTS ARE DATED DATA FROM THE DOCSThe platform's facts are dated data from the docs, never memory.
A REFUSAL IS ROUTEDA refusal is routed, not retried blindly; a cut-off reply is a max_tokens problem first.
SHAPEShape, not truth: a valid output can still be wrong.
THE CONTRACT IS THE TEAM'SThe contract is the team's; the card proposes, the team changes it.

The method.

  1. check contract.json outputs.jsonl — the rate and range, every failure, the causes and their fixes.
  2. platform contract.json — what the platform enforces for this contract, what stays yours, the request shape and the models as read.
  3. tighten contract.json sent-schema.json — where the schema sent is looser.
  4. one contract.json value.json — one document, when someone pastes one.
  5. The team constrains the reply, tightens the schema, keeps the checks the platform does not enforce, and checks a new sample.

What rides in the card.

In the card’s own voice, with a machine that shows its working.

THE REFERENCESreferences/CAUSES.md · FORMATS.md · SOURCES.md · THE-METHOD.md
THE MACHINEscripts/contract.py · five commandscheck — a sample of outputs against the contract: rate, every failure, causes, fixes; one — one JSON document against the contract; platform — what structured outputs would enforce for this contract, and what stays yours; tighten — where the schema sent to the model is looser than the contract; rules — the platform facts used, with sources and dates. 24 checks in its selftest. Needs: Python 3; the contract (JSON Schema) and a sample of real outputs (JSON Lines).

What it does once your AI has it.

  • check A sample of outputs against the contract: rate, every failure, causes, fixes
  • one One JSON document against the contract
  • platform What structured outputs would enforce for this contract, and what stays yours
  • tighten Where the schema sent to the model is looser than the contract
  • rules The platform facts used, with sources and dates
  • On the record Example Co's invoice extraction: 10 of 48 outputs failing (20.8%, range 11.7% to 34.3%) by seven causes, the platform fit, and four places the schema sent was looser; 43 of 48 in the trigger test

What it refuses, and where it hands off.

It refuses a rate estimated from a glance; a rate without its range; platform rules from memory; calling a refusal a format fault; changing the downstream contract on its own.

  • the input schemas of an agent's tools → THE TOOL SCHEMA CARD
  • handing work to another agent with a done that can be checked → THE ENVELOPE CARD
  • proving a run happened → THE RECEIPT CARD
  • arithmetic on the values → THE NUMBERS CARD
  • comparing two versions' test results → THE REGRESSION CARD

The rate holds for the sample given; it checks shape, not truth; the platform's rules are dated (read 2026-10-12) and change. It is an AI reading a text file: it can be wrong, so check what matters against your own records and the source.

What’s in the buy.

  • CARD.md — the whole card: its boot, law, method, machine, seals, refusals and hand-offs, ledger, score and what it carries · SKILL.md — the door your AI reads first · START-HERE.md — the first five minutes, for you
  • CAUSES.md + FORMATS.md + SOURCES.md + THE-METHOD.md — in references/, in the card's own voice
  • scripts/contract.py — the machine: check · one · platform · tighten · rules; see NEEDS below; selftest 24/24
  • WITNESS.md — the run on a realistic case as printed, and the trigger test on Haiku, Sonnet and Opus · SELFTEST.md — the machine's own test, as run at the cut · AUDIT.md, the twelve checks · MANIFEST.md, every file hashed
  • tests/evals.json — the cases it must take, hand off and refuse
  • MY-LEDGER.md — the card's memory, on your own machine · TIN.md, the nine lines on the tin · LICENSE-NOTE.md · HOSTS.md, where it runs
  • system/short-prompt.md and system/system-prompt.md — the doors for any AI without skills

PROOF · SELFTEST 24/24 · WITNESSED ON A RUN · TRIGGER TEST 43 OF 48 ON ITS OWN PROMPTS · HAIKU 11/16 · SONNET 16/16 · OPUS 16/16 · 0 WRONG PICKS · EDITION 1 · PUNCH 7B03DB39B03E7E1AC3673C05

ON EVERY DOOR · A CARD FOR YOUR AI, A FILE FOR YOUR COMPUTER

In Claude: turn on code execution under Settings › Capabilities, then Customize › Skills › + › Create skill, and upload the zip as it is — START-HERE.md in the box walks you through it, and tells you how to keep the ledger. In ChatGPT, Gemini and the rest: a Project, a GPT or a Gem with the card’s files attached and the short door in the box pasted as its instructions. The words run anywhere an AI reads Markdown; the machines run wherever the host runs Python. Witnessed in Claude only. The host marks →

Take it.

Nº 966 — LAUNCHING SOON

Sold as is under the term printed. A card instructs an AI you operate; results depend on your model, your files and your judgement. Not medical, legal, tax or financial advice, never the person’s boss, and not a licence to practise. The terms →

ONE PAYMENT · NOTHING RENEWS ITSELF

OFFLINE · ONE LICENCE · PUNCH-CHECKABLE · THE STANDARD

One payment. The file is yours to keep and keeps working at its edition; new editions issued in the year after you buy reach you by email as replacement files. Tax is added at checkout where it applies. Nothing auto-renews.

One email when it is on sale, from the studio; nothing else, ever.

A TERM, NOT A SUBSCRIPTION: NOTHING RENEWS ITSELF AND NOBODY IS CHARGED AGAIN. WHEN A TERM ENDS THE FILES STAY ON YOUR COMPUTER AND STAY READABLE — FREEZE, NOT LOSS.

THE MACHINE · IN THE OPEN · FROM THE CARD’S OWN WITNESS.MD AND SELFTEST.MD

contract.py, every command showing its working.

A small Python program. Your AI runs it; you can too. The blocks below are pasted from the card’s own record, as printed.

checka sample of outputs against the contract: rate, every failure, causes, fixes
oneone JSON document against the contract
platformwhat structured outputs would enforce for this contract, and what stays yours
tightenwhere the schema sent to the model is looser than the contract
rulesthe platform facts used, with sources and dates
selftest24 checks that prove the machine; it must print 24/24
python3 scripts/contract.py check contract.json outputs.jsonl
OUTPUT CONTRACT CHECK · outputs.jsonl against contract.json · 48 outputs
PASS 38 · FAIL 10 · failure rate 20.8% (95% range 11.7% to 34.3%)

BY CAUSE · an output can carry more than one cause
    3 × code fence · lines 4, 18, 32
        fix: constrain the reply instead of asking for JSON in the prompt: structured outputs (output_config.format with type json_schema) on a model that supports them, or strict: true on the tool whose input carries the data. Stopgap: strip the fence before parsing; the reply is still unconstrained.
    2 × enum value differs only in case at /currency · lines 13, 41
        fix: the docs say Claude may return an enum value that differs from the schema only in capitalization: compare case-insensitively, or normalise the case before the downstream check.
    1 × cut off at max_tokens · lines 23
        fix: the reply hit max_tokens: raise max_tokens (the docs: retry with a higher max_tokens to get the complete structured output) and read stop_reason before parsing.
    1 × extra field at /notes · lines 45
        fix: set additionalProperties: false on every object in the schema you send (structured outputs require false for objects), so extra keys cannot appear.
    1 × missing required field at /issue_date · lines 36
        fix: send this contract as the schema (structured outputs, or strict tool use): required fields, types, enums and additionalProperties false are then enforced. If you already do, the schema you send is looser than the contract: run tighten.
    1 × prose around the JSON · lines 10
        fix: constrain the reply instead of asking for JSON in the prompt: structured outputs (output_config.format with type json_schema) on a model that supports them, or strict: true on the tool whose input carries the data. Stopgap: take the first JSON value with a decoder; the reply is still unconstrained.
    1 × wrong type at /total · lines 28
        fix: send this contract as the schema (structured outputs, or strict tool use), so each field can only take its type. If you already do, the schema you send is looser than the contract: run tighten.

EVERY FAILURE
  line 4 · out-03 · stop_reason end_turn
      code fence (the JSON inside passes the contract)
  line 10 · out-09 · stop_reason end_turn
      prose around the JSON (the JSON inside passes the contract)
[… 21 more lines, trimmed here]
python3 scripts/contract.py platform contract.json
PLATFORM FIT · contract.json under structured outputs and strict tool use · rules as read 2026-10-12

ENFORCED BY THE PLATFORM (constrained decoding)
  /                            type object
  /                            required invoice_number, supplier, issue_date, currency, total, lines
  /                            additionalProperties false
  /properties/invoice_number   type string
  /properties/invoice_number   pattern ^INV-[0-9]{5}$ (simple patterns work; complex ones may be refused)
  /properties/supplier         type string
  /properties/issue_date       type string
  /properties/issue_date       format date
  /properties/currency         type string
  /properties/currency         enum ["USD", "EUR", "GBP"]
  /properties/total            type number
  /properties/lines            type array
  /properties/lines            minItems 1
  /properties/lines/items      type object
  /properties/lines/items      required description, quantity, unit_price
  /properties/lines/items      additionalProperties false
  /properties/lines/items/properties/description type string
  /properties/lines/items/properties/quantity type integer
  /properties/lines/items/properties/unit_price type number

NOT SUPPORTED · strip it from the schema you send, say it in the field's description, keep checking it after the call (this script's check)
  /properties/supplier         minLength 1
  /properties/total            minimum 0
  /properties/lines/items/properties/quantity minimum 1

REFUSED · sent as is, the request is refused (400); change it
  none
[… 16 more lines, trimmed here]
THE SELFTEST, AS PRINTED
PASS a clean output, a tool_use input and text blocks all pass
PASS a fenced reply is caught as a code fence and its inside still checked
PASS prose around the JSON is caught
PASS a reply cut off at max_tokens is named from stop_reason
PASS a refusal is named from stop_reason, not called a format fault
PASS an enum value not listed and one that differs only in case are told apart
PASS a wrong type, a missing field and an extra key are each named with their path
PASS pattern, minimum and format failures are all reported on one output
PASS a raw line that is not JSON is checked as text
PASS the failure rate counts outputs, not causes: 11 of 14
PASS the Wilson range for 8 of 10 is 49.0% to 94.3%
PASS the Wilson range for 0 of 40 starts at 0 and stays above 0 (8.8%)
PASS each cause names its fix: fences to structured outputs, case to normalising, max_tokens to raising it, refusal to stop_reason, bounds to checking after
PASS --field picks the field that holds the output
PASS platform: minimum is not supported (strip and check after); the enum and pattern are enforced; FITS is not claimed
PASS platform: additionalProperties true and a recursive schema are refused; oneOf is flagged as unlisted
PASS platform: 25 optional parameters exceed the limit of 24 and are refused
PASS platform: a contract inside the limits fits as written
PASS tighten: a dropped required field, an enum left open, a widened type and extra keys allowed are all found
PASS the validator: true is not 1, 1.0 is an integer, $defs refs resolve, oneOf counts matches
PASS the same outputs give the same report, byte for byte
PASS the command line: all-pass exits 0, failures exit 1, --max-rate sets the bar, --json writes, --help shows usage
PASS assets/api-rules.json matches the rules built into this machine
PASS nothing in this machine opens a network connection
selftest 24/24

THE TRIGGER TEST. The card's line was tried on Haiku, Sonnet and Opus beside 14 neighbouring skills, in a clean environment: 43/48 on its own prompts (Haiku 11/16 · Sonnet 16/16 · Opus 16/16), 0 wrong picks; no skill (answered directly) 4, claude-api 1.

THE RUNS ARE PASTED FROM THE CARD’S OWN RECORD AS PRINTED. THE CASES ARE THE STUDIO’S OWN EXAMPLES (EXAMPLE CO IS FICTION); NO PRIVATE PERSON IS NAMED.

QUESTIONS AT THE TABLE

Asked before the wire.

What does it need from me?

Python 3; the contract (JSON Schema) and a sample of real outputs (JSON Lines).

Does it send anything anywhere?

Its machine reads what you point it at, and HOSTS.md says what it needs; python 3; the contract (JSON Schema) and a sample of real outputs (JSON Lines). The words run wherever an AI reads Markdown.

What is on the record?

The selftest (24/24), a run on a realistic case with every command and verdict pasted into WITNESS.md as printed (Example Co's invoice extraction: 10 of 48 outputs failing (20.8%, range 11.7% to 34.3%) by seven causes, the platform fit, and four places the schema sent was looser; 43 of 48 in the trigger test); and the trigger test, the card's line tried on Haiku, Sonnet and Opus beside 14 neighbouring skills: 43/48 on its own prompts, 0 wrong picks; the twelve-check audit (AUDIT.md). The punch on the face is the SHA-256 of SKILL.md, so a downloaded copy can be checked against this room.

Can it be wrong?

Yes — it is an AI reading a text file. The rate holds for the sample given; it checks shape, not truth; the platform's rules are dated (read 2026-10-12) and change.

What will it never do?

It refuses a rate estimated from a glance; a rate without its range; platform rules from memory; calling a refusal a format fault; changing the downstream contract on its own.

Who may use it?

One person, any number of their own AIs and computers; a team needs a company licence.

← THE INSTRUMENTS · THE FLOOR →

AT YOUR ELBOW, NEVER THE BOSS · NOT LEGAL, MEDICAL, TAX OR FINANCIAL ADVICE · NOT A PAYMENT CARD · © 2026 LUND STUDIO LLC

PAY BYAmerican Express Apple Pay Diners ClubDiscoverGoogle Pay Mastercard PayPalShop Pay Visa
CART · 0