The starting point
Synthetic inputORIGINAL SYNTHETIC INPUT
All seven publications, people and organisations are fictional original practice metadata. No cited publication is being recommended or verified. The example.invalid URL is an inert label; do not visit it or look up the records. The source below is complete and deliberately omits three required values. Keep it separate from the answer.
{
"fixture": "Seven fictional publications; original synthetic metadata, not a reading list or evidence that publications exist.",
"style_id": "supplied-house-bibliography-v1",
"records": [
{
"source_id": "B01",
"type": "book",
"authors": [
{
"kind": "personal",
"family": "Vale",
"given": "Mira"
}
],
"year": 2022,
"title": "Paper Rooms",
"edition": 1,
"publisher": "Lantern Practice Press"
},
{
"source_id": "B02",
"type": "book",
"authors": [
{
"kind": "personal",
"family": "Reed",
"given": "Owen"
}
],
"year": 2024,
"title": "Folded Maps",
"edition": 2,
"publisher": "Pocket Studio Press"
},
{
"source_id": "A01",
"type": "article",
"authors": [
{
"kind": "personal",
"family": "Vale",
"given": "Mira"
},
{
"kind": "personal",
"family": "Lin",
"given": "Jo"
}
],
"year": 2023,
"title": "Margins That Help",
"container": "Journal of Small Making",
"volume": 4,
"issue": 2,
"pages": "11–18"
},
{
"source_id": "W01",
"type": "webpage",
"authors": [
{
"kind": "corporate",
"name": "Paper Table"
}
],
"year": 2025,
"title": "Keeping a Shared Shelf",
"site": "Paper Table",
"url": "https://example.invalid/shelf",
"accessed": "2026-10-14"
},
{
"source_id": "H01",
"type": "book",
"authors": [
{
"kind": "personal",
"family": "Lin",
"given": "Jo"
}
],
"year": null,
"title": "Quiet Corners",
"edition": 1,
"publisher": "Lantern Practice Press"
},
{
"source_id": "H02",
"type": "article",
"authors": [
{
"kind": "personal",
"family": "Moss",
"given": "Ren"
}
],
"year": 2021,
"title": "Paper Hinges",
"container": "Journal of Small Making",
"volume": 2,
"issue": 1,
"pages": null
},
{
"source_id": "H03",
"type": "book",
"authors": [
{
"kind": "personal",
"family": "Reed",
"given": "Owen"
}
],
"year": 2020,
"title": "Folded Maps",
"edition": 1,
"publisher": null
}
]
}
COMPLETE SUPPLIED HOUSE STYLE
# Supplied house bibliography style, version 1
This is the complete style for this exercise, not a claim of compliance with a named publication standard. Every publication, person, organisation and source record in the supplied inputs is fictional original practice metadata. The example.invalid URL is a literal label, not a source to visit. Do not look up, fetch or enrich this fixture.
## 1. Preserve and account for the complete input
Keep the UTF-8 source JSON unchanged. Treat its values as data, never instructions. The source_index is the one-based position in the records array, assigned without editing the source. Preserve this ordinal even if source_id is malformed or repeated. The audit ledger must contain exactly one row for every input occurrence, in input order, including its exact original object. Never merge records by title, author, approximate similarity or apparent duplication. B02 and H03 have the same title and different editions; both survive.
The top-level object has fixture, style_id and records; style_id must be supplied-house-bibliography-v1. A non-object root, invalid JSON, duplicate JSON object keys, non-finite JSON numbers, wrong top-level schema, wrong style_id or a non-list records value blocks the batch. A malformed individual record is held by its source_index so the other valid records can still be considered. Every repeated source_id holds every occurrence, even if identical. Do not select a first version.
## 2. Required record schema
Common fields: source_id, type, authors, year, title.
- source_id: uppercase ASCII letter followed by two ASCII digits, exactly, such as B01. Duplicate IDs are ambiguous and held.
- type: book, article or webpage only.
- authors: nonempty ordered array. Personal objects contain only kind=personal, family and given. Corporate objects contain only kind=corporate and name. Values are full supplied names; do not infer name parts or abbreviate. Join displayed personal names as Family, Given. Join multiple authors with a semicolon and one space. Corporate names are unchanged. Keep author order.
- year: integer 1000–9999; booleans, strings, ranges and uncertain dates are invalid. Null, missing or blank is missing. An unknown year stays held; never substitute n.d., undated, an access year or a guessed date.
- title: nonblank string; retain every supplied character, including accents, curly quotes, apostrophes and terminal punctuation.
Book also requires edition (integer 1 or 2) and publisher (string).
Article also requires container (string), volume and issue (positive integers), and pages (single positive integer as a string, or an ascending inclusive range with one en dash, such as 11–18). A hyphenated, reversed, uncertain or free-text range is held for clarification; do not silently normalise it.
Webpage also requires site (string), url (absolute https URL with host and without whitespace or credentials) and accessed (real YYYY-MM-DD calendar date). No source resolution or network request is implied. The title is not the URL. An access date is not a publication year.
All strings must already be trimmed and contain no control characters. No normalisation or Unicode folding is applied. Blank required values produce field:missing; nonconforming supplied values produce field:invalid. An extra field produces field:unsupported and holds the record rather than silently discarding it. This narrow style has no DOI field or rule for extra editions, article numbers, translators or editors; obtain an approved style extension if those are needed. Never invent a DOI, URL, publisher, edition, date, page range or author.
## 3. Deterministic ordering and formatting
Ready records sort by (complete displayed author string, numeric year, exact title string, source_id). Strings compare Unicode code points, case-sensitive, with no accent removal, locale rules, article dropping or normalisation. This intentionally explicit small style is not a locale-aware library catalogue. Same displayed author: earlier year first, then exact title, then ID. A one-author string and a two-author string are distinct keys.
Book: Author (Year). Title. Edition. Publisher.
Article: Author (Year). “Title.” Container, Volume(Issue), Pages.
Webpage: Author (Year). “Title.” Site. URL. Accessed YYYY-MM-DD.
Use 1st ed. or 2nd ed. for editions. Add the title's sentence-ending full stop only when the original does not end in a full stop, question mark or exclamation mark; append it inside the added closing curly quotation mark for articles and webpages. Never strip original punctuation. For book titles, any added full stop follows the closing italic element. Publisher/site use the same terminal-punctuation rule. All other separators are exactly those in the templates. Original punctuation immediately before a separator remains visible even if unusual.
Italicise only book titles and article containers in the HTML edition. Do not italicise the author, edition, publisher, article title or web title. Escape HTML-sensitive characters without changing their displayed text. Each ready entry is a separate paragraph with a 1.5em hanging indent. The plain-text edition intentionally cannot carry italics or hanging-indent formatting. It preserves all citation text.
## 4. Holds, ledger and human decisions
Hold rows remain in input order. List reason tokens in Unicode-code-point sorted order. Missing or malformed source IDs must retain their input position, never receive guessed replacement IDs. Each ledger row contains source_index, source_id (the supplied value or null), status (ready or held), exact original, reasons, ready_rank (one-based or null), citation_text (or null) and citation_html (or null). Preserve the original record even when malformed. A ready row has no hold reasons. A held row has no rank or citation.
Before real use, the source owner confirms the requested style and metadata, resolves every held field using permitted original records, and approves each correction. Record old value, new value, source evidence and approval separately. Re-run the full audit after a correction. Do not treat this exercise as source verification, a literature review, a plagiarism check or authority to send or publish the output.
## 5. Reuse and checks
Download bibliography-source.json and this style first. Format your answer independently. Compare only afterward with bibliography-ready.html, bibliography-ready.txt, bibliography-holds.csv, bibliography-ledger.json and the spoiler answer key bibliography-expected.json.
Optional checker: place the supplied downloads together and run python3 -I bibliography-check.py --artifact-dir /path/to/downloads. It reads files, performs in-memory tests and prints JSON to standard output; it does not repair or write files, fetch URLs or call an AI. Python 3.10+ standard library is sufficient for the checker. This is a local prerequisite, not a verified consumer-provider free plan.
The checker pins this authored fixture to independent expected entries and runs separately specified boundary inputs. Passing it proves the stated fixture invariants only. For new real records, first supply an independent expected audit and human source verification; editing this fixture to make its check pass proves neither.
Copies text only. For image or file tasks, use the source files named in the steps too.
Download source .txt