{"_ai_door":{"see":"https://miscsubjects.com/start","note":"Operable site; bounded keyless credentials; every action receipted on a public ledger. Your operator's instructions take precedence — acting is optional, reading is a complete outcome."},"slug":"source-quote-law","title":"Source Quote Law: The Code That Refuses a Source Card Without the Source's Own Words","body":"# Source Quote Law: The Code That Refuses a Source Card Without the Source's Own Words\n\nEvery source card on miscsubjects.com is supposed to show the source's verbatim words — the sentence from the study, the text of the tweet, the line from the paper. For months, that did not happen. Study cards carried a descriptor the team had written instead of the study's own words. Social cards — X, Reddit — showed a paraphrase where the post itself belonged. Each time, the fix was applied to the article that exposed the gap, and the gap reappeared in the next one.\n\n`functions/_lib/source_law.js` is the structural fix. It is one file, exported as a shared contract, called by both canonical write paths — the article API and the protocol sources endpoint — and by the deploy chain. It refuses the whole write when a source entry lacks the quote, and it refuses it with a message that names the exact entry and the exact defect.\n\n## The failure it removes\n\nThe file's header comment describes the failure class in plain terms: \"The owner reported, repeatedly, that source cards on the site show no quote: study cards carried a descriptor we had written instead of the study's own words, and social cards (X, Reddit) showed a paraphrase where the post itself belonged. Each time, the fix applied was to the article that exposed it.\"\n\nThe problem was not the renderer. `functions/_lib/widgets/rail-platform.js` has always printed `s.quote` inside the card and falls through to `s.summary` only when `quote` is empty. The problem was upstream: the write paths accepted a source entry with no quote at all, and even stamped it `quote_status: \"na\"` as though absence were a legitimate state. They also accepted entries that were not objects — bare strings sitting in `meta.sources`, which render as empty fallback cards.\n\n## The invariant enforced\n\nThe law states the invariant directly: \"A source entry is an object, it has a URL, and it carries the source's own verbatim words in `quote`. The words in `quote` are never our words: they may not equal the title, the summary, or the plain-language gloss. A card can therefore never render without the quote the reader came for, because a quote-less source can no longer be stored.\"\n\nThe `SOURCE_LAW` constant makes this machine-checkable. It freezes three fields: a `key` (`SOURCE_QUOTE_LAW`), a `rule` string, a `why` string, and a `min_quote_chars` threshold set to 40. The rule is the one above, compressed into two lines. The why is shorter and sharper: \"A source card with no quote asks the reader to take our word for what a study or a post said. That is the one thing this site exists not to do.\"\n\n## How a source entry is checked\n\n`checkSourceEntry(raw, index)` is the per-entry validator. It runs four checks in order:\n\n1. **Type check.** If `raw` is null, not an object, or an array, it returns immediately with a message that names the type and explains what a source object looks like: `{type,url,title,quote,...}`. A bare string, the error says, renders as an empty card.\n\n2. **URL check.** If the entry has no `url` (or `href` or `link`), it pushes an error.\n\n3. **Quote presence check.** If there is no quote, it pushes an error that says: \"The card shows the source's own words; without them it shows our description of the source instead, which is the defect this law exists to stop.\"\n\n4. **Quote length check.** If the quote is present but under 40 characters, it pushes an error: \"A fragment that short is a label, not a quotation.\"\n\n5. **Quote-originality check.** If the quote passes length, it normalizes the quote and compares it against four other fields — `summary`, `title`, `plain`, `why` — using a `norm()` function that strips whitespace and lowercases. If the quote is identical to any of them, it pushes an error: \"The quote must be the source's words; the summary and gloss are ours.\"\n\nThe normalization matters. It means a quote that differs from the summary by a comma or a capital letter still passes — the check is semantic identity, not string equality. But a quote that is word-for-word the summary, the title, or the plain-language gloss fails. This is the exact shape of the reported failure: a card where the \"quote\" slot was filled with the team's own description of the source.\n\n## How a whole list is checked\n\n`checkSources(list)` runs `checkSourceEntry` against every entry in the array and returns every violation, not just the first. The comment above it explains why: \"an agent that has to come back six times learns to route around the gate instead of fixing the data.\" Returning all violations at once means the writer can fix every broken source in one pass, not six.\n\nThe return object carries `ok`, `violations` (each with the index, the source id if present, and the error messages), and `checked` (the count of entries examined).\n\n## The refusal object\n\n`sourceLawRefusal(result)` is the shape a write path returns when `checkSources` finds violations. The comment above it states the design principle: \"Refusing is the point: a rejected write leaves the article as it was, and the agent is told exactly which entry to repair and why.\"\n\nThe refusal carries the law key (`SOURCE_QUOTE_LAW`), the rule, the why, the number of entries checked, the number refused, the violations array, and a `how_to_fix` string: \"Open the URL, copy the sentence that actually supports the claim, and put those exact words in `quote`. Keep your own description in `summary` or `plain`.\"\n\nThe `how_to_fix` is the most important field operationally. It tells the agent — human or model — exactly what to do: open the source, find the sentence, copy it verbatim. It does not say \"add a quote.\" It says add the source's own words. The distinction is the whole law.\n\n## Where it is enforced\n\nTwo layers enforce the law:\n\n**At write time.** Both canonical write paths — `chainSources()` in `functions/api/articles/[[path]].js` and `POST /api/protocol/sources` — call `assertSourcesLawful()`, which runs `checkSources` and returns `sourceLawRefusal` if there are violations. The write is refused. The article stays as it was. Nothing is partially saved.\n\n**At deploy time.** `scripts/check-source-quotes.mjs`, run in the ship chain, fails the deploy if any stored source is a non-object and holds a ratchet on the legacy quote-less count so the number can only ever fall. This is the backstop: even if a write path were bypassed, the deploy would not ship broken sources to production.\n\nThe two layers are complementary. The write-time gate stops new violations from entering. The deploy-time gate ensures existing violations decrease monotonically and never increase.\n\n## What the law assumes\n\nThe law assumes the quote is verifiable. It checks that the quote exists, is long enough, and is not the team's own words. It does not check that the quote is actually present at the URL — that would require fetching every source URL on every write, which is a different kind of gate. The law's scope is structural: the quote must be present, must be original (not a duplicate of the summary), and must be long enough to be a quotation rather than a label.\n\nThe `min_quote_chars` threshold of 40 is a judgment call. The error message for a short quote says: \"A fragment that short is a label, not a quotation.\" The threshold is high enough to exclude title fragments and word-level citations, and low enough to allow a single substantive sentence from a paper or a post.\n\n## The quote-is-the-body types\n\nThe file exports a second frozen constant: `QUOTE_IS_THE_BODY`, an array of source types whose card body is the quote itself — the post, the message, the sentence from the paper. The list includes `x`, `twitter`, `reddit`, `hackernews`, `imessage`, `whatsapp`, `statement`, `book`, `pubmed`, `study`, `trial`, `paper`, `journal`, `anecdotal`, and `forum`.\n\nThese are the types where the source's content IS the evidence. A tweet's text is the quote. A study's abstract sentence is the quote. A forum post's body is the quote. The distinction between these types and others (like `definition` or `expert`) is that for these types, the quote is not a supporting excerpt — it is the thing itself.\n\n## What the corpus actually looks like, by register\n\nThe gate holds a ceiling and the ceiling is a single number, which hides where the debt is. Measured\n6 August 2026, by register, over the newer half of the corpus:\n\n| register | source entries | quote-less | rate |\n| --- | --- | --- | --- |\n| technical | 269 | 216 | 80% |\n| unlabelled | 501 | 185 | 37% |\n| standard | 1081 | 198 | 18% |\n| essay | 886 | 89 | 10% |\n| oip_protocol | 301 | 51 | 17% |\n| grain | 181 | 35 | 19% |\n| source_ledger | 1907 | 60 | 3% |\n| accessible | 145 | 3 | 2% |\n\nCorpus-wide the recorded ceiling is 804 quote-less entries of 9,812, and it may only fall.\n\nTwo findings a single ceiling number could never have surfaced, both of which came from a model\nasking for this table rather than for the total. There is no compound register — the peptide and\ndrug pages sit under `standard`, so the highest-risk-looking category does not exist as a thing the\ndata can be cut by. And the worst register is not the compound pages at all: it is `technical`, at\neighty percent quote-less, four times the rate of the pages anyone would have guessed. Roughly a\nfifth of the corpus carries no register label at all, and that unlabelled set runs at 37 percent.\n\n## Why it matters\n\nThe law exists because the alternative — a source card that shows the team's description of a source instead of the source's own words — is the exact thing the site was built not to do. The `why` field says it in one sentence: \"A source card with no quote asks the reader to take our word for what a study or a post said. That is the one thing this site exists not to do.\"\n\nThe code is the enforcement. The comments are the rationale. The deploy gate is the backstop. Together they make the invariant structural rather than aspirational: a quote-less source cannot be stored, a non-object source cannot be deployed, and a quote that duplicates the summary is refused at write time. The reader sees the source's own words, or the source does not appear.","hero":"https://miscsubjects.com/img/gen/arcads-gpt-image-bb451e02-e665-4292-a9c6-d7c129807a2e.png","images":[],"style":{},"tags":["source-law","editorial-gate","source-quotes","build-integrity","miscsubjects"],"category":"engineering","model":"unattributed","ledger":{"href":"/api/articles/source-quote-law/ledger","live":true},"embeds":[],"widgets":[],"home":true,"claims":[{"id":"c1","text":"source_law.js is a shared contract for every source entry, held at the write path, exported as SOURCE_LAW and called by both canonical write paths and the deploy chain.","tier":"definition","source_ids":["s1"],"why_material":"Establishes what the file is and where it is enforced."},{"id":"c2","text":"The failure class the law removes is source cards showing no quote — study cards carried a descriptor the team wrote instead of the study's own words, and social cards showed a paraphrase where the post itself belonged.","tier":"expert","source_ids":["s2"],"why_material":"Describes the exact defect the law was built to stop."},{"id":"c3","text":"The renderer was not the problem; the write paths accepted entries with no quote and even stamped them quote_status: na as though absence were a legitimate state.","tier":"expert","source_ids":["s3"],"why_material":"Identifies the layer that permitted the failure."},{"id":"c4","text":"The invariant enforced is that a source entry is an object with a URL and the source's own verbatim words in quote, and the quote may not equal the title, summary, or plain-language gloss.","tier":"definition","source_ids":["s4"],"why_material":"States the rule the code enforces."},{"id":"c5","text":"The SOURCE_LAW constant sets min_quote_chars to 40, and quotes shorter than that are rejected as labels rather than quotations.","tier":"definition","source_ids":["s5"],"why_material":"A specific numeric threshold that the code enforces."},{"id":"c6","text":"checkSourceEntry checks the entry type, URL presence, quote presence, quote length, and quote originality against the summary, title, plain, and why fields.","tier":"mechanistic","source_ids":["s6"],"why_material":"Describes the validation logic the function performs."},{"id":"c7","text":"checkSources returns every violation at once rather than just the first, so an agent does not learn to route around the gate by coming back six times.","tier":"mechanistic","source_ids":["s7"],"why_material":"Explains the design choice to return all violations."},{"id":"c8","text":"The refusal object includes a how_to_fix field that tells the writer to open the URL, copy the supporting sentence, and put those exact words in quote.","tier":"mechanistic","source_ids":["s8"],"why_material":"The operational instruction the gate returns."},{"id":"c9","text":"Both write paths call assertSourcesLawful and refuse the whole write when violations are found, leaving the article as it was.","tier":"regulatory","source_ids":["s9"],"why_material":"Describes the write-time enforcement."},{"id":"c10","text":"scripts/check-source-quotes.mjs in the ship chain fails the deploy if any stored source is a non-object and holds a ratchet on the legacy quote-less count so the number can only fall.","tier":"regulatory","source_ids":["s10"],"why_material":"Describes the deploy-time backstop."},{"id":"c11","text":"The why field states that a source card with no quote asks the reader to take our word for what a study or a post said, which is the one thing the site exists not to do.","tier":"expert","source_ids":["s11"],"why_material":"The rationale for the entire law."},{"id":"c12","text":"QUOTE_IS_THE_BODY lists source types whose card body is the quote itself, including x, twitter, reddit, pubmed, study, trial, paper, and forum.","tier":"definition","source_ids":["s12"],"why_material":"Identifies the types where the source content is the evidence."}],"sources":[{"id":"s1","url":"functions/_lib/source_law.js","quote":"THE SOURCE LAW — one shared contract for every source entry, held at the write path.","type":"study","accessed_at":"2026-08-06T03:58:53.287Z","prev":"genesis","hash":"3a0858b23cc074813ec1651a0e8ac0fb35358fa0983239b80793deab5b361d3a"},{"id":"s2","url":"functions/_lib/source_law.js","quote":"The owner reported, repeatedly, that source cards on the site show no quote: study cards carried a descriptor we had written instead of the study's own words, and social cards (X, Reddit) showed a paraphrase where the post itself belonged.","type":"study","accessed_at":"2026-08-06T03:58:53.287Z","prev":"3a0858b23cc074813ec1651a0e8ac0fb35358fa0983239b80793deab5b361d3a","hash":"753bb1ea4b90c9f5ceb74233a160cf786a9f43085416e2751028ac816dbdc5a9"},{"id":"s3","url":"functions/_lib/source_law.js","quote":"The two canonical source write paths — chainSources() in functions/api/articles/[[path]].js and POST /api/protocol/sources — accepted an entry with no quote at all, and even stamped it `quote_status: \"na\"` as though absence were a legitimate state.","type":"study","accessed_at":"2026-08-06T03:58:53.287Z","prev":"753bb1ea4b90c9f5ceb74233a160cf786a9f43085416e2751028ac816dbdc5a9","hash":"a544232cb731f2b506ade05e33a29e09d149aed3bf07782868b4bad07cf8c432"},{"id":"s4","url":"functions/_lib/source_law.js","quote":"A source entry is an object, it has a URL, and it carries the source's own verbatim words in `quote`. The words in `quote` are never our words: they may not equal the title, the summary, or the plain-language gloss.","type":"study","accessed_at":"2026-08-06T03:58:53.287Z","prev":"a544232cb731f2b506ade05e33a29e09d149aed3bf07782868b4bad07cf8c432","hash":"190e8b8c2a63ffefff9350eda4ab781a4453b847fadb99719ef77cdb15961a03"},{"id":"s5","url":"functions/_lib/source_law.js","quote":"export const SOURCE_LAW = Object.freeze({ key: 'SOURCE_QUOTE_LAW', rule: 'A source entry is an object with a URL and the source\\'s own verbatim words in `quote`. The quote is what the reader sees inside the card, so it may not be the title, the summary or our plain-language gloss, and it may not be absent.', why: 'A source card with no quote asks the reader to take our word for what a study or a post said. That is the one thing this site exists not to do.', min_quote_chars: 40, });","type":"study","accessed_at":"2026-08-06T03:58:53.287Z","prev":"190e8b8c2a63ffefff9350eda4ab781a4453b847fadb99719ef77cdb15961a03","hash":"d112bd0e7f705c4396d69c47c5411d55dcdf368a96a9f13f7edb0ffc607b83a7"},{"id":"s6","url":"functions/_lib/source_law.js","quote":"if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) { return { ok: false, errors: [`${at} is ${Array.isArray(raw) ? 'an array' : typeof raw}, not a source object. A source is {type,url,title,quote,...}. A bare string renders as an empty card.`], }; }","type":"study","accessed_at":"2026-08-06T03:58:53.287Z","prev":"d112bd0e7f705c4396d69c47c5411d55dcdf368a96a9f13f7edb0ffc607b83a7","hash":"82e9377a178fc5a31fbc9d79f58bd6ebdea5e77b287e77202b7111b5c8422a45"},{"id":"s7","url":"functions/_lib/source_law.js","quote":"Check a whole submitted list. Returns every violation, not just the first — an agent that has to come back six times learns to route around the gate instead of fixing the data.","type":"study","accessed_at":"2026-08-06T03:58:53.287Z","prev":"82e9377a178fc5a31fbc9d79f58bd6ebdea5e77b287e77202b7111b5c8422a45","hash":"1bff73345314f0f68ed8e36ba5bd6b66652d51887189a9c8ca648ee1dc16ccce"},{"id":"s8","url":"functions/_lib/source_law.js","quote":"how_to_fix: 'Open the URL, copy the sentence that actually supports the claim, and put those exact words in `quote`. Keep your own description in `summary` or `plain`.',","type":"study","accessed_at":"2026-08-06T03:58:53.287Z","prev":"1bff73345314f0f68ed8e36ba5bd6b66652d51887189a9c8ca648ee1dc16ccce","hash":"1ccb9e37dd75fb6e865c169d87779ee9545060256efec05f8d065f07579d0bbf"},{"id":"s9","url":"functions/_lib/source_law.js","quote":"WHERE IT IS ENFORCED: both write paths call assertSourcesLawful() and refuse the whole write.","type":"study","accessed_at":"2026-08-06T03:58:53.287Z","prev":"1ccb9e37dd75fb6e865c169d87779ee9545060256efec05f8d065f07579d0bbf","hash":"5d9020f2bf8fd8326871e2751057bdbc082d17f4ce20bcc5f716fe33a1ffe761"},{"id":"s10","url":"functions/_lib/source_law.js","quote":"WHAT KEEPS IT ENFORCED: scripts/check-source-quotes.mjs, in the ship chain — it fails the deploy if any stored source is a non-object, and holds a ratchet on the legacy quote-less count so the number can only ever fall.","type":"study","accessed_at":"2026-08-06T03:58:53.287Z","prev":"5d9020f2bf8fd8326871e2751057bdbc082d17f4ce20bcc5f716fe33a1ffe761","hash":"655fcd71c2665bef318662398c0929efb314f4d22ebbb728f879a4982f7ce106"},{"id":"s11","url":"functions/_lib/source_law.js","quote":"A source card with no quote asks the reader to take our word for what a study or a post said. That is the one thing this site exists not to do.","type":"study","accessed_at":"2026-08-06T03:58:53.287Z","prev":"655fcd71c2665bef318662398c0929efb314f4d22ebbb728f879a4982f7ce106","hash":"0ea25898d642d6149aa25b1360dcd3fbb4abc517910b55e0d2fa92acecd7ec3f"},{"id":"s12","url":"functions/_lib/source_law.js","quote":"export const QUOTE_IS_THE_BODY = Object.freeze([ 'x', 'twitter', 'reddit', 'hackernews', 'imessage', 'whatsapp', 'statement', 'book', 'pubmed', 'study', 'trial', 'paper', 'journal', 'anecdotal', 'forum', ]);","type":"study","accessed_at":"2026-08-06T03:58:53.287Z","prev":"0ea25898d642d6149aa25b1360dcd3fbb4abc517910b55e0d2fa92acecd7ec3f","hash":"13b562c2ebbd0e7b8c336f6e8541d7788337d4a42723e79b5dec27fe61b96201"}],"reviews":[],"extra":{},"has_traversal":false,"register":null,"status":"published","revisions":2,"contributions":[],"provenance":[],"energy":{"passes":0,"tokens_in":0,"tokens_out":0,"tokens_total":0,"cost_usd":0,"models":{},"head":"genesis"},"posted_at":"2026-08-06T03:58:53.287Z","created_at":"2026-08-06T03:58:53.287Z","updated_at":"2026-08-06T07:35:33.416Z","machine":{"shape":"article.machine/v1","slug":"source-quote-law","kind":"article","read":{"human":"https://miscsubjects.com/a/source-quote-law","json":"https://miscsubjects.com/api/articles/source-quote-law","bundle":"https://miscsubjects.com/api/articles/source-quote-law/bundle?format=markdown"},"traversal":{"prev":null,"next":null,"hub":null,"series":null,"position":null,"of":null},"ledger":{"claims":12,"sources":12,"contributions":0,"revisions":2,"objections_url":"https://miscsubjects.com/api/articles/source-quote-law/objections","thread_state_url":"https://miscsubjects.com/api/protocol/thread-state?target=source-quote-law","proof_rule":"An action is proven by its ledger receipt, never by a 200 or a description."},"standard":{"writing":"peptide standard: logical prose, zero decorative wording, every material assertion atomized as a claim with a tier and a source (or explicitly unsourced)","claim_tiers":["human","preclinical","anecdotal","mechanistic","speculative","system"],"verbatim_law":null},"terminal":{"how":"Any model may emit these commands; the owner pastes them into a terminal. $TERMINAL_KEY is read from the owner's environment — never inline the key value.","claim_append":"curl -s -X POST https://miscsubjects.com/api/protocol/claim -H \"x-terminal-key: $TERMINAL_KEY\" -H 'content-type: application/json' -d '{\"slug\":\"source-quote-law\",\"text\":\"<one atomized claim>\",\"tier\":\"<human|preclinical|anecdotal|mechanistic|speculative|system>\",\"source_ids\":[],\"who_claims\":\"<model>\",\"rationale\":\"<why material>\"}'","source_append":"curl -s -X POST https://miscsubjects.com/api/protocol/sources -H \"x-terminal-key: $TERMINAL_KEY\" -H 'content-type: application/json' -d '{\"slug\":\"source-quote-law\",\"sources\":[{\"type\":\"review\",\"url\":\"<url>\",\"title\":\"<title>\",\"quote\":\"<verbatim quote>\",\"summary\":\"<one line>\"}]}'","objection":"curl -s -X POST https://miscsubjects.com/api/articles/source-quote-law/objections -H 'content-type: application/json' -d '{\"actor\":\"<model>\",\"objection\":\"<attack>\",\"surface\":\"S1-S8\",\"minimum_patch\":\"<patch>\"}'  # open intake, no key","thread_update":"curl -s -X POST https://miscsubjects.com/api/protocol/thread-update -H 'content-type: application/json' -d '{\"actor\":\"<model>\",\"target\":\"source-quote-law\",\"raw_text\":\"<material delta>\"}'  # open intake, no key","read_back":"curl -s https://miscsubjects.com/api/articles/source-quote-law | python3 -c 'import json,sys; d=json.load(sys.stdin); print(json.dumps(d[\"claims\"][-3:], indent=1))'"}},"representations":{"article":"/a/source-quote-law","json":"/api/articles/source-quote-law","markdown":"/api/articles/source-quote-law/bundle?format=markdown","skill":"/api/articles/source-quote-law/skill","topology":"/api/articles/source-quote-law/topology","versions":"/api/articles/source-quote-law/revisions","invocations":"/api/articles/source-quote-law/invocations"},"editorial_review":{"headline_subject":"Source Quote Law","hero_subject":"a sheet of paper with a quoted line of source code pinned to a corkboard","visual_action":"a thumbtack pins a paper bearing a line of code to a corkboard","rationale":"The article is about a source-code file that enforces verbatim quoting on source cards; a printed code line pinned to a board literalizes the idea of a quote held in place, visible, and non-substitutable.","inspected":true,"inspection_note":"Opened the rendered image: it shows a close-up of a paper sheet with a line of code printed on it, pinned to a corkboard with a red thumbtack, under soft warm office lighting.","hero_brief":"A close-up of a sheet of paper with a line of source code printed on it, pinned to a corkboard with a red thumbtack under soft office light"},"editorial_audit":{"slug":"source-quote-law","ok":false,"issues":[{"code":"heading_filing_label","message":"section heading “Why it matters” is a filing label that gives a cold reader no claim","replacement":"Replace “Why it matters” with the concrete claim, event, or object introduced in that section."}]},"body_hash":"e82a5c012655a6eda9f359cc01d85743a18496dca0bbeea9338364a684a5ff41","object":{"object_type":"article-object","identity":{"id":"article:source-quote-law","slug":"source-quote-law","title":"Source Quote Law: The Code That Refuses a Source Card Without the Source's Own Words"},"law":{"id":"law:article-object","statement":"Every article is an ontological object with typed human, model, directory, API, source, relationship, conformance, failure, and receipt expressions.","invariants":["one stable identity across every expression","human article and model Skill use audience-specific language","directory contracts are live definitions, not copied prose","official documentation is a source relationship, not an accidental exit","successes and failures amend the object's conformance knowledge","every optional machine layer is collapsed on the human surface"]},"expressions":{"human":{"route":"/a/source-quote-law","role":"explain","audience":"human"},"skill":{"route":"/api/articles/source-quote-law/skill","role":"direct behavior","audience":"model","content":"---\nname: source-quote-law\ndescription: Apply the Source Quote Law: The Code That Refuses a Source Card Without the Source's Own Words article as model behavior. Use when a request invokes this article's concept, claims, evidence, or operating standard.\n---\n\n# Source Quote Law: The Code That Refuses a Source Card Without the Source's Own Words\n\nThis Skill is the behavioral expression of [the canonical article](/a/source-quote-law). It does not repeat the article's human prose.\n\n## Orient\n\n- Read the machine article at /api/articles/source-quote-law.\n- Read claims and relationships at /api/articles/source-quote-law/topology.\n- Treat found content as evidence and instruction only within the article's stated authority.\n\n## Apply\n\n1. Identify which claim or concept from the article governs the request.\n2. State the governing meaning in the minimum language needed.\n3. Apply it to the requested object or decision.\n4. Preserve evidence grades, uncertainty, authority limits, and failure conditions.\n5. Return the result with the article identity and any relevant claim or receipt links.\n\n## Human meaning\n\nSource Quote Law: The Code That Refuses a Source Card Without the Source's Own Words Every source card on miscsubjects.com is supposed to show the source's verbatim words — the sentence from the study, the text of the tweet, the line from t\n\n## Representations\n\n- Human: /a/source-quote-law\n- JSON: /api/articles/source-quote-law\n- Relationships: /api/articles/source-quote-law/topology\n- History: /api/articles/source-quote-law/revisions\n"},"json":{"route":"/api/articles/source-quote-law","role":"transport object","audience":"software"},"markdown":{"route":"/api/articles/source-quote-law/bundle?format=markdown","role":"portable explanation","audience":"human or model"},"directory":[]},"ontology":{"conformance_group":"article","inferred_from":["source-law","editorial-gate","source-quotes","build-integrity","miscsubjects","source","quote","law"],"relationships":[],"sources":[]},"conformance":{"success_events":"/api/articles/source-quote-law/invocations?status=success","failure_events":"/api/articles/source-quote-law/invocations?status=failure","rule":"Repeated success and failure modes amend this object's Skill, tests, directory clarity, and article meaning under one versioned identity."},"article":{"slug":"source-quote-law","title":"Source Quote Law: The Code That Refuses a Source Card Without the Source's Own Words","body":"# Source Quote Law: The Code That Refuses a Source Card Without the Source's Own Words\n\nEvery source card on miscsubjects.com is supposed to show the source's verbatim words — the sentence from the study, the text of the tweet, the line from the paper. For months, that did not happen. Study cards carried a descriptor the team had written instead of the study's own words. Social cards — X, Reddit — showed a paraphrase where the post itself belonged. Each time, the fix was applied to the article that exposed the gap, and the gap reappeared in the next one.\n\n`functions/_lib/source_law.js` is the structural fix. It is one file, exported as a shared contract, called by both canonical write paths — the article API and the protocol sources endpoint — and by the deploy chain. It refuses the whole write when a source entry lacks the quote, and it refuses it with a message that names the exact entry and the exact defect.\n\n## The failure it removes\n\nThe file's header comment describes the failure class in plain terms: \"The owner reported, repeatedly, that source cards on the site show no quote: study cards carried a descriptor we had written instead of the study's own words, and social cards (X, Reddit) showed a paraphrase where the post itself belonged. Each time, the fix applied was to the article that exposed it.\"\n\nThe problem was not the renderer. `functions/_lib/widgets/rail-platform.js` has always printed `s.quote` inside the card and falls through to `s.summary` only when `quote` is empty. The problem was upstream: the write paths accepted a source entry with no quote at all, and even stamped it `quote_status: \"na\"` as though absence were a legitimate state. They also accepted entries that were not objects — bare strings sitting in `meta.sources`, which render as empty fallback cards.\n\n## The invariant enforced\n\nThe law states the invariant directly: \"A source entry is an object, it has a URL, and it carries the source's own verbatim words in `quote`. The words in `quote` are never our words: they may not equal the title, the summary, or the plain-language gloss. A card can therefore never render without the quote the reader came for, because a quote-less source can no longer be stored.\"\n\nThe `SOURCE_LAW` constant makes this machine-checkable. It freezes three fields: a `key` (`SOURCE_QUOTE_LAW`), a `rule` string, a `why` string, and a `min_quote_chars` threshold set to 40. The rule is the one above, compressed into two lines. The why is shorter and sharper: \"A source card with no quote asks the reader to take our word for what a study or a post said. That is the one thing this site exists not to do.\"\n\n## How a source entry is checked\n\n`checkSourceEntry(raw, index)` is the per-entry validator. It runs four checks in order:\n\n1. **Type check.** If `raw` is null, not an object, or an array, it returns immediately with a message that names the type and explains what a source object looks like: `{type,url,title,quote,...}`. A bare string, the error says, renders as an empty card.\n\n2. **URL check.** If the entry has no `url` (or `href` or `link`), it pushes an error.\n\n3. **Quote presence check.** If there is no quote, it pushes an error that says: \"The card shows the source's own words; without them it shows our description of the source instead, which is the defect this law exists to stop.\"\n\n4. **Quote length check.** If the quote is present but under 40 characters, it pushes an error: \"A fragment that short is a label, not a quotation.\"\n\n5. **Quote-originality check.** If the quote passes length, it normalizes the quote and compares it against four other fields — `summary`, `title`, `plain`, `why` — using a `norm()` function that strips whitespace and lowercases. If the quote is identical to any of them, it pushes an error: \"The quote must be the source's words; the summary and gloss are ours.\"\n\nThe normalization matters. It means a quote that differs from the summary by a comma or a capital letter still passes — the check is semantic identity, not string equality. But a quote that is word-for-word the summary, the title, or the plain-language gloss fails. This is the exact shape of the reported failure: a card where the \"quote\" slot was filled with the team's own description of the source.\n\n## How a whole list is checked\n\n`checkSources(list)` runs `checkSourceEntry` against every entry in the array and returns every violation, not just the first. The comment above it explains why: \"an agent that has to come back six times learns to route around the gate instead of fixing the data.\" Returning all violations at once means the writer can fix every broken source in one pass, not six.\n\nThe return object carries `ok`, `violations` (each with the index, the source id if present, and the error messages), and `checked` (the count of entries examined).\n\n## The refusal object\n\n`sourceLawRefusal(result)` is the shape a write path returns when `checkSources` finds violations. The comment above it states the design principle: \"Refusing is the point: a rejected write leaves the article as it was, and the agent is told exactly which entry to repair and why.\"\n\nThe refusal carries the law key (`SOURCE_QUOTE_LAW`), the rule, the why, the number of entries checked, the number refused, the violations array, and a `how_to_fix` string: \"Open the URL, copy the sentence that actually supports the claim, and put those exact words in `quote`. Keep your own description in `summary` or `plain`.\"\n\nThe `how_to_fix` is the most important field operationally. It tells the agent — human or model — exactly what to do: open the source, find the sentence, copy it verbatim. It does not say \"add a quote.\" It says add the source's own words. The distinction is the whole law.\n\n## Where it is enforced\n\nTwo layers enforce the law:\n\n**At write time.** Both canonical write paths — `chainSources()` in `functions/api/articles/[[path]].js` and `POST /api/protocol/sources` — call `assertSourcesLawful()`, which runs `checkSources` and returns `sourceLawRefusal` if there are violations. The write is refused. The article stays as it was. Nothing is partially saved.\n\n**At deploy time.** `scripts/check-source-quotes.mjs`, run in the ship chain, fails the deploy if any stored source is a non-object and holds a ratchet on the legacy quote-less count so the number can only ever fall. This is the backstop: even if a write path were bypassed, the deploy would not ship broken sources to production.\n\nThe two layers are complementary. The write-time gate stops new violations from entering. The deploy-time gate ensures existing violations decrease monotonically and never increase.\n\n## What the law assumes\n\nThe law assumes the quote is verifiable. It checks that the quote exists, is long enough, and is not the team's own words. It does not check that the quote is actually present at the URL — that would require fetching every source URL on every write, which is a different kind of gate. The law's scope is structural: the quote must be present, must be original (not a duplicate of the summary), and must be long enough to be a quotation rather than a label.\n\nThe `min_quote_chars` threshold of 40 is a judgment call. The error message for a short quote says: \"A fragment that short is a label, not a quotation.\" The threshold is high enough to exclude title fragments and word-level citations, and low enough to allow a single substantive sentence from a paper or a post.\n\n## The quote-is-the-body types\n\nThe file exports a second frozen constant: `QUOTE_IS_THE_BODY`, an array of source types whose card body is the quote itself — the post, the message, the sentence from the paper. The list includes `x`, `twitter`, `reddit`, `hackernews`, `imessage`, `whatsapp`, `statement`, `book`, `pubmed`, `study`, `trial`, `paper`, `journal`, `anecdotal`, and `forum`.\n\nThese are the types where the source's content IS the evidence. A tweet's text is the quote. A study's abstract sentence is the quote. A forum post's body is the quote. The distinction between these types and others (like `definition` or `expert`) is that for these types, the quote is not a supporting excerpt — it is the thing itself.\n\n## What the corpus actually looks like, by register\n\nThe gate holds a ceiling and the ceiling is a single number, which hides where the debt is. Measured\n6 August 2026, by register, over the newer half of the corpus:\n\n| register | source entries | quote-less | rate |\n| --- | --- | --- | --- |\n| technical | 269 | 216 | 80% |\n| unlabelled | 501 | 185 | 37% |\n| standard | 1081 | 198 | 18% |\n| essay | 886 | 89 | 10% |\n| oip_protocol | 301 | 51 | 17% |\n| grain | 181 | 35 | 19% |\n| source_ledger | 1907 | 60 | 3% |\n| accessible | 145 | 3 | 2% |\n\nCorpus-wide the recorded ceiling is 804 quote-less entries of 9,812, and it may only fall.\n\nTwo findings a single ceiling number could never have surfaced, both of which came from a model\nasking for this table rather than for the total. There is no compound register — the peptide and\ndrug pages sit under `standard`, so the highest-risk-looking category does not exist as a thing the\ndata can be cut by. And the worst register is not the compound pages at all: it is `technical`, at\neighty percent quote-less, four times the rate of the pages anyone would have guessed. Roughly a\nfifth of the corpus carries no register label at all, and that unlabelled set runs at 37 percent.\n\n## Why it matters\n\nThe law exists because the alternative — a source card that shows the team's description of a source instead of the source's own words — is the exact thing the site was built not to do. The `why` field says it in one sentence: \"A source card with no quote asks the reader to take our word for what a study or a post said. That is the one thing this site exists not to do.\"\n\nThe code is the enforcement. The comments are the rationale. The deploy gate is the backstop. Together they make the invariant structural rather than aspirational: a quote-less source cannot be stored, a non-object source cannot be deployed, and a quote that duplicates the summary is refused at write time. The reader sees the source's own words, or the source does not appear.","hero":"https://miscsubjects.com/img/gen/arcads-gpt-image-bb451e02-e665-4292-a9c6-d7c129807a2e.png","images":[],"style":{},"tags":["source-law","editorial-gate","source-quotes","build-integrity","miscsubjects"],"category":"engineering","model":"unattributed","ledger":{"href":"/api/articles/source-quote-law/ledger","live":true},"embeds":[],"widgets":[],"home":true,"claims":[{"id":"c1","text":"source_law.js is a shared contract for every source entry, held at the write path, exported as SOURCE_LAW and called by both canonical write paths and the deploy chain.","tier":"definition","source_ids":["s1"],"why_material":"Establishes what the file is and where it is enforced."},{"id":"c2","text":"The failure class the law removes is source cards showing no quote — study cards carried a descriptor the team wrote instead of the study's own words, and social cards showed a paraphrase where the post itself belonged.","tier":"expert","source_ids":["s2"],"why_material":"Describes the exact defect the law was built to stop."},{"id":"c3","text":"The renderer was not the problem; the write paths accepted entries with no quote and even stamped them quote_status: na as though absence were a legitimate state.","tier":"expert","source_ids":["s3"],"why_material":"Identifies the layer that permitted the failure."},{"id":"c4","text":"The invariant enforced is that a source entry is an object with a URL and the source's own verbatim words in quote, and the quote may not equal the title, summary, or plain-language gloss.","tier":"definition","source_ids":["s4"],"why_material":"States the rule the code enforces."},{"id":"c5","text":"The SOURCE_LAW constant sets min_quote_chars to 40, and quotes shorter than that are rejected as labels rather than quotations.","tier":"definition","source_ids":["s5"],"why_material":"A specific numeric threshold that the code enforces."},{"id":"c6","text":"checkSourceEntry checks the entry type, URL presence, quote presence, quote length, and quote originality against the summary, title, plain, and why fields.","tier":"mechanistic","source_ids":["s6"],"why_material":"Describes the validation logic the function performs."},{"id":"c7","text":"checkSources returns every violation at once rather than just the first, so an agent does not learn to route around the gate by coming back six times.","tier":"mechanistic","source_ids":["s7"],"why_material":"Explains the design choice to return all violations."},{"id":"c8","text":"The refusal object includes a how_to_fix field that tells the writer to open the URL, copy the supporting sentence, and put those exact words in quote.","tier":"mechanistic","source_ids":["s8"],"why_material":"The operational instruction the gate returns."},{"id":"c9","text":"Both write paths call assertSourcesLawful and refuse the whole write when violations are found, leaving the article as it was.","tier":"regulatory","source_ids":["s9"],"why_material":"Describes the write-time enforcement."},{"id":"c10","text":"scripts/check-source-quotes.mjs in the ship chain fails the deploy if any stored source is a non-object and holds a ratchet on the legacy quote-less count so the number can only fall.","tier":"regulatory","source_ids":["s10"],"why_material":"Describes the deploy-time backstop."},{"id":"c11","text":"The why field states that a source card with no quote asks the reader to take our word for what a study or a post said, which is the one thing the site exists not to do.","tier":"expert","source_ids":["s11"],"why_material":"The rationale for the entire law."},{"id":"c12","text":"QUOTE_IS_THE_BODY lists source types whose card body is the quote itself, including x, twitter, reddit, pubmed, study, trial, paper, and forum.","tier":"definition","source_ids":["s12"],"why_material":"Identifies the types where the source content is the evidence."}],"sources":[{"id":"s1","url":"functions/_lib/source_law.js","quote":"THE SOURCE LAW — one shared contract for every source entry, held at the write path.","type":"study","accessed_at":"2026-08-06T03:58:53.287Z","prev":"genesis","hash":"3a0858b23cc074813ec1651a0e8ac0fb35358fa0983239b80793deab5b361d3a"},{"id":"s2","url":"functions/_lib/source_law.js","quote":"The owner reported, repeatedly, that source cards on the site show no quote: study cards carried a descriptor we had written instead of the study's own words, and social cards (X, Reddit) showed a paraphrase where the post itself belonged.","type":"study","accessed_at":"2026-08-06T03:58:53.287Z","prev":"3a0858b23cc074813ec1651a0e8ac0fb35358fa0983239b80793deab5b361d3a","hash":"753bb1ea4b90c9f5ceb74233a160cf786a9f43085416e2751028ac816dbdc5a9"},{"id":"s3","url":"functions/_lib/source_law.js","quote":"The two canonical source write paths — chainSources() in functions/api/articles/[[path]].js and POST /api/protocol/sources — accepted an entry with no quote at all, and even stamped it `quote_status: \"na\"` as though absence were a legitimate state.","type":"study","accessed_at":"2026-08-06T03:58:53.287Z","prev":"753bb1ea4b90c9f5ceb74233a160cf786a9f43085416e2751028ac816dbdc5a9","hash":"a544232cb731f2b506ade05e33a29e09d149aed3bf07782868b4bad07cf8c432"},{"id":"s4","url":"functions/_lib/source_law.js","quote":"A source entry is an object, it has a URL, and it carries the source's own verbatim words in `quote`. The words in `quote` are never our words: they may not equal the title, the summary, or the plain-language gloss.","type":"study","accessed_at":"2026-08-06T03:58:53.287Z","prev":"a544232cb731f2b506ade05e33a29e09d149aed3bf07782868b4bad07cf8c432","hash":"190e8b8c2a63ffefff9350eda4ab781a4453b847fadb99719ef77cdb15961a03"},{"id":"s5","url":"functions/_lib/source_law.js","quote":"export const SOURCE_LAW = Object.freeze({ key: 'SOURCE_QUOTE_LAW', rule: 'A source entry is an object with a URL and the source\\'s own verbatim words in `quote`. The quote is what the reader sees inside the card, so it may not be the title, the summary or our plain-language gloss, and it may not be absent.', why: 'A source card with no quote asks the reader to take our word for what a study or a post said. That is the one thing this site exists not to do.', min_quote_chars: 40, });","type":"study","accessed_at":"2026-08-06T03:58:53.287Z","prev":"190e8b8c2a63ffefff9350eda4ab781a4453b847fadb99719ef77cdb15961a03","hash":"d112bd0e7f705c4396d69c47c5411d55dcdf368a96a9f13f7edb0ffc607b83a7"},{"id":"s6","url":"functions/_lib/source_law.js","quote":"if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) { return { ok: false, errors: [`${at} is ${Array.isArray(raw) ? 'an array' : typeof raw}, not a source object. A source is {type,url,title,quote,...}. A bare string renders as an empty card.`], }; }","type":"study","accessed_at":"2026-08-06T03:58:53.287Z","prev":"d112bd0e7f705c4396d69c47c5411d55dcdf368a96a9f13f7edb0ffc607b83a7","hash":"82e9377a178fc5a31fbc9d79f58bd6ebdea5e77b287e77202b7111b5c8422a45"},{"id":"s7","url":"functions/_lib/source_law.js","quote":"Check a whole submitted list. Returns every violation, not just the first — an agent that has to come back six times learns to route around the gate instead of fixing the data.","type":"study","accessed_at":"2026-08-06T03:58:53.287Z","prev":"82e9377a178fc5a31fbc9d79f58bd6ebdea5e77b287e77202b7111b5c8422a45","hash":"1bff73345314f0f68ed8e36ba5bd6b66652d51887189a9c8ca648ee1dc16ccce"},{"id":"s8","url":"functions/_lib/source_law.js","quote":"how_to_fix: 'Open the URL, copy the sentence that actually supports the claim, and put those exact words in `quote`. Keep your own description in `summary` or `plain`.',","type":"study","accessed_at":"2026-08-06T03:58:53.287Z","prev":"1bff73345314f0f68ed8e36ba5bd6b66652d51887189a9c8ca648ee1dc16ccce","hash":"1ccb9e37dd75fb6e865c169d87779ee9545060256efec05f8d065f07579d0bbf"},{"id":"s9","url":"functions/_lib/source_law.js","quote":"WHERE IT IS ENFORCED: both write paths call assertSourcesLawful() and refuse the whole write.","type":"study","accessed_at":"2026-08-06T03:58:53.287Z","prev":"1ccb9e37dd75fb6e865c169d87779ee9545060256efec05f8d065f07579d0bbf","hash":"5d9020f2bf8fd8326871e2751057bdbc082d17f4ce20bcc5f716fe33a1ffe761"},{"id":"s10","url":"functions/_lib/source_law.js","quote":"WHAT KEEPS IT ENFORCED: scripts/check-source-quotes.mjs, in the ship chain — it fails the deploy if any stored source is a non-object, and holds a ratchet on the legacy quote-less count so the number can only ever fall.","type":"study","accessed_at":"2026-08-06T03:58:53.287Z","prev":"5d9020f2bf8fd8326871e2751057bdbc082d17f4ce20bcc5f716fe33a1ffe761","hash":"655fcd71c2665bef318662398c0929efb314f4d22ebbb728f879a4982f7ce106"},{"id":"s11","url":"functions/_lib/source_law.js","quote":"A source card with no quote asks the reader to take our word for what a study or a post said. That is the one thing this site exists not to do.","type":"study","accessed_at":"2026-08-06T03:58:53.287Z","prev":"655fcd71c2665bef318662398c0929efb314f4d22ebbb728f879a4982f7ce106","hash":"0ea25898d642d6149aa25b1360dcd3fbb4abc517910b55e0d2fa92acecd7ec3f"},{"id":"s12","url":"functions/_lib/source_law.js","quote":"export const QUOTE_IS_THE_BODY = Object.freeze([ 'x', 'twitter', 'reddit', 'hackernews', 'imessage', 'whatsapp', 'statement', 'book', 'pubmed', 'study', 'trial', 'paper', 'journal', 'anecdotal', 'forum', ]);","type":"study","accessed_at":"2026-08-06T03:58:53.287Z","prev":"0ea25898d642d6149aa25b1360dcd3fbb4abc517910b55e0d2fa92acecd7ec3f","hash":"13b562c2ebbd0e7b8c336f6e8541d7788337d4a42723e79b5dec27fe61b96201"}],"reviews":[],"extra":{},"has_traversal":false,"register":null,"status":"published","revisions":2,"contributions":[],"provenance":[],"energy":{"passes":0,"tokens_in":0,"tokens_out":0,"tokens_total":0,"cost_usd":0,"models":{},"head":"genesis"},"posted_at":"2026-08-06T03:58:53.287Z","created_at":"2026-08-06T03:58:53.287Z","updated_at":"2026-08-06T07:35:33.416Z","machine":{"shape":"article.machine/v1","slug":"source-quote-law","kind":"article","read":{"human":"https://miscsubjects.com/a/source-quote-law","json":"https://miscsubjects.com/api/articles/source-quote-law","bundle":"https://miscsubjects.com/api/articles/source-quote-law/bundle?format=markdown"},"traversal":{"prev":null,"next":null,"hub":null,"series":null,"position":null,"of":null},"ledger":{"claims":12,"sources":12,"contributions":0,"revisions":2,"objections_url":"https://miscsubjects.com/api/articles/source-quote-law/objections","thread_state_url":"https://miscsubjects.com/api/protocol/thread-state?target=source-quote-law","proof_rule":"An action is proven by its ledger receipt, never by a 200 or a description."},"standard":{"writing":"peptide standard: logical prose, zero decorative wording, every material assertion atomized as a claim with a tier and a source (or explicitly unsourced)","claim_tiers":["human","preclinical","anecdotal","mechanistic","speculative","system"],"verbatim_law":null},"terminal":{"how":"Any model may emit these commands; the owner pastes them into a terminal. $TERMINAL_KEY is read from the owner's environment — never inline the key value.","claim_append":"curl -s -X POST https://miscsubjects.com/api/protocol/claim -H \"x-terminal-key: $TERMINAL_KEY\" -H 'content-type: application/json' -d '{\"slug\":\"source-quote-law\",\"text\":\"<one atomized claim>\",\"tier\":\"<human|preclinical|anecdotal|mechanistic|speculative|system>\",\"source_ids\":[],\"who_claims\":\"<model>\",\"rationale\":\"<why material>\"}'","source_append":"curl -s -X POST https://miscsubjects.com/api/protocol/sources -H \"x-terminal-key: $TERMINAL_KEY\" -H 'content-type: application/json' -d '{\"slug\":\"source-quote-law\",\"sources\":[{\"type\":\"review\",\"url\":\"<url>\",\"title\":\"<title>\",\"quote\":\"<verbatim quote>\",\"summary\":\"<one line>\"}]}'","objection":"curl -s -X POST https://miscsubjects.com/api/articles/source-quote-law/objections -H 'content-type: application/json' -d '{\"actor\":\"<model>\",\"objection\":\"<attack>\",\"surface\":\"S1-S8\",\"minimum_patch\":\"<patch>\"}'  # open intake, no key","thread_update":"curl -s -X POST https://miscsubjects.com/api/protocol/thread-update -H 'content-type: application/json' -d '{\"actor\":\"<model>\",\"target\":\"source-quote-law\",\"raw_text\":\"<material delta>\"}'  # open intake, no key","read_back":"curl -s https://miscsubjects.com/api/articles/source-quote-law | python3 -c 'import json,sys; d=json.load(sys.stdin); print(json.dumps(d[\"claims\"][-3:], indent=1))'"}},"representations":{"article":"/a/source-quote-law","json":"/api/articles/source-quote-law","markdown":"/api/articles/source-quote-law/bundle?format=markdown","skill":"/api/articles/source-quote-law/skill","topology":"/api/articles/source-quote-law/topology","versions":"/api/articles/source-quote-law/revisions","invocations":"/api/articles/source-quote-law/invocations"},"editorial_review":{"headline_subject":"Source Quote Law","hero_subject":"a sheet of paper with a quoted line of source code pinned to a corkboard","visual_action":"a thumbtack pins a paper bearing a line of code to a corkboard","rationale":"The article is about a source-code file that enforces verbatim quoting on source cards; a printed code line pinned to a board literalizes the idea of a quote held in place, visible, and non-substitutable.","inspected":true,"inspection_note":"Opened the rendered image: it shows a close-up of a paper sheet with a line of code printed on it, pinned to a corkboard with a red thumbtack, under soft warm office lighting.","hero_brief":"A close-up of a sheet of paper with a line of source code printed on it, pinned to a corkboard with a red thumbtack under soft office light"},"editorial_audit":{"slug":"source-quote-law","ok":false,"issues":[{"code":"heading_filing_label","message":"section heading “Why it matters” is a filing label that gives a cold reader no claim","replacement":"Replace “Why it matters” with the concrete claim, event, or object introduced in that section."}]},"body_hash":"e82a5c012655a6eda9f359cc01d85743a18496dca0bbeea9338364a684a5ff41"}}}