Code, design and documents 44 files
.github/workflows/deploy.yml +6 −1
@@ -21,5 +21,8 @@ jobs:
runs-on: ubuntu-latest
steps:
+ # the whole history: the changelog is built from it (src/lib/gitlog.js)
- uses: actions/checkout@v7
+ with:
+ fetch-depth: 0
- uses: actions/setup-node@v7
with:
@@ -33,5 +36,7 @@ jobs:
- uses: actions/cache@v4
with:
- path: .cache/og
+ path: |
+ .cache/og
+ .cache/changelog
key: og-${{ hashFiles('src/og/**', 'package-lock.json') }}-${{ github.run_id }}
restore-keys: |
astro.config.mjs +51 −1
@@ -52,4 +52,54 @@ function markdownFigures() {
}
+// Inline citations in Markdown (articles, culture entries), Wikipedia style: [@2] or [@1,3] marks the
+// sources, by their place in the front matter's `sources` list, that support what comes before it.
+// Each becomes a superscript number linked to the page's list of references; sources are numbered by
+// their first citation. A text with no marks yet cites all its sources after its last paragraph. The
+// order is left in the front matter as `citeOrder` for the page that lists the references
+// (src/lib/cite.js does the same for texts kept in YAML).
+function markdownCitations() {
+ const MARK = /\s?\[@([^\]]+)\]/g;
+ const sup = (n) => `<sup class="cite"><a href="#ref-${n}" aria-label="Source ${n}">[${n}]</a></sup>`;
+ return (tree, file) => {
+ const fm = file.data.astro?.frontmatter;
+ const count = fm?.sources?.length ?? 0;
+ if (!count) return;
+ const where = file.history?.[0]?.split("/").slice(-2).join("/") ?? "a Markdown file";
+ const order = [];
+ const numberOf = (i) => {
+ if (!Number.isInteger(i) || i < 1 || i > count) throw new Error(`${where}: the citation [@${i}] names no source (it has ${count})`);
+ if (!order.includes(i)) order.push(i);
+ return order.indexOf(i) + 1;
+ };
+ const walk = (node) => {
+ if (!node.children) return;
+ node.children = node.children.flatMap((child) => {
+ if (child.type !== "text" || !child.value.includes("[@")) { walk(child); return [child]; }
+ const out = [];
+ let last = 0;
+ for (const m of child.value.matchAll(MARK)) {
+ if (m.index > last) out.push({ type: "text", value: child.value.slice(last, m.index) });
+ out.push({ type: "html", value: m[1].split(",").map((x) => sup(numberOf(Number(x.trim())))).join("") });
+ last = m.index + m[0].length;
+ }
+ if (last < child.value.length) out.push({ type: "text", value: child.value.slice(last) });
+ return out;
+ });
+ };
+ walk(tree);
+ if (order.length) {
+ const missing = Array.from({ length: count }, (_, i) => i + 1).filter((i) => !order.includes(i));
+ if (missing.length) throw new Error(`${where}: cites inline but never cites ${missing.map((i) => `[@${i}]`).join(", ")}`);
+ } else {
+ // not yet cited inline: all the sources after the last paragraph
+ const paragraphs = tree.children.filter((n) => n.type === "paragraph" && !(n.children.length === 1 && n.children[0].type === "image"));
+ const target = paragraphs.at(-1);
+ for (let i = 1; i <= count; i++) order.push(i);
+ if (target) target.children.push({ type: "html", value: order.map((i) => sup(i)).join("") });
+ }
+ fm.citeOrder = order;
+ };
+}
+
export default defineConfig({
// also the address used in canonical links, the sitemap and structured data
@@ -62,5 +112,5 @@ export default defineConfig({
integrations: [icon()],
markdown: {
- processor: unified({ remarkPlugins: [markdownFigures], rehypePlugins: [markdownLinks] }),
+ processor: unified({ remarkPlugins: [markdownFigures, markdownCitations], rehypePlugins: [markdownLinks] }),
},
// pictures in Markdown get a set of widths, so a phone does not download the 1280-pixel file
datasets/datasets.yaml +1 −1
@@ -1641,5 +1641,5 @@
label: Cannabis in the news
missing: Too little news monitored by GDELT
- steps: [[0, "Under 0.05%"], [0.05, "0.05–0.1%"], [0.1, "0.1–0.2%"], [0.2, "0.2–0.4%"], [0.4, "0.4% or more"]]
+ steps: [[0, "Under 0.001%"], [0.001, "0.001–0.003%"], [0.003, "0.003–0.01%"], [0.01, "0.01–0.03%"], [0.03, "0.03% or more"]]
title: How much each country's news talks about cannabis
lede: >-
docs/CULTURE.md +1 −1
@@ -216,5 +216,5 @@ The site turns that into a figure with the caption and credit underneath. Rules:
to one another wherever one explains a word the other uses.
- Links to countries, history entries and culture entries get a hover preview on the site (data in `/previews/*.json`), so a reader can check what is behind a link without leaving the page. Link the precise history entry, not the history index.
-- A link is not a source. What the text states must still rest on the `sources` list.
+- A link is not a source. What the text states must still rest on the `sources` list. Cite it inline with `[@n]` after the sentence it supports (docs/WRITING.md, Citations).
- Only link a page that was opened and exists.
docs/WRITING.md +20 −0
@@ -120,4 +120,24 @@ Do not end on a disclaimer ("These statements supply neither a modern assessment
what came next, or on what the event meant.
+## Citations
+
+Texts cite their sources inline, Wikipedia style: a mark right after the sentence or clause a
+source supports, shown on the page as a superscript number linked to a numbered list of
+references. The same source keeps its number wherever it is cited again.
+
+- **History entries, articles, culture entries:** `[@2]` is the second source in the item's own
+ `sources` list; `[@1,3]` cites two. Put the mark after the full stop, with no space:
+ `…in 1972.[@1]`
+- **Country files:** cite by source key: `[@bmg]`, `[@bmg, kcang]`, using only the keys listed in
+ that segment's or context section's `sources`.
+- Cite each claim with the source that actually states it. When a text uses marks, every source in
+ its list must be cited at least once, and every mark must name a real source; the build fails
+ otherwise.
+- Texts without marks still work: all their sources are cited together after the last sentence.
+ Convert them to per-sentence citations whenever a text is written or revised; there is no need
+ to convert everything at once.
+- On a country page the score breakdown and the Context tab each end with their own numbered
+ references; history, article and culture pages end with one list for the whole page.
+
## Words to avoid
docs/research/history-algeria-gap-2026-10-23.md +201 −0
@@ -0,0 +1,201 @@
+# Algeria: colonial controls, capital clauses, treatment and personal growing
+
+Research date: 23 October 2026. Previous goal turn: verified progress, adding four Romanian
+articles and repairing its medical/legalisation and Senate-vote accounts. This continuation
+addresses Algeria's much-compressed history. At the start it had eleven events, two articles
+and only two scored steps. The batch leaves fourteen events, nine articles and five scored
+steps. The wider history goal remains active.
+
+## Source-led changes
+
+### Colonial date and a missing 1932 control
+
+The entry `algeria-french-decrees-1916` retains its ID for existing links, but its date is
+corrected to **9 February 1917** and the title now describes extending French controls to
+colonial Algeria. September 1916 is the French metropolitan decree, not the extension date.
+A new `algeria-cannabis-controls-1932` entry records the 12 January decree applying the updated
+French rules and clarifying the names of controlled cannabis products.
+
+Source: [League of Nations, O.C.1542, 23 May 1934](https://archive.org/details/LoN1934-O.C.1542),
+printed pp. 54–55, French government reply of 5 May 1934. Downloaded the Archive-hosted searchable
+scan, extracted its text, rendered PDF page 28 and visually read the two-page spread. The
+report describes earlier council discussions, small growers' income, local preparations,
+seizures and colonial enforcement claims. Its Secretariat footnote questions whether the
+metropolitan text expressly covered cultivation. The new article attributes official claims;
+it does not repeat near-elimination of cannabis as an independently established result.
+
+The first event's unregulated `before` and immediate post-restriction calibration are retained
+from the existing dataset. This is not a fresh reconstruction of every 1917 penal provision.
+Original colonial implementing texts and any earlier enacted local controls remain a priority;
+1881/1915 discussions in the report do not alone prove an enacted earlier prohibition. The
+1932 nomenclature/control entry is **other**, without a new score: the report does not establish
+a measurable new personal right or prove a new explicit cultivation prohibition.
+
+### New 1975 entry and article
+
+[Official Gazette 15, 21 February 1975](https://www.joradp.dz/FTP/jo-francais/1975/F1975015.pdf),
+printed p. 198, Ordinance 75-9 of **17 February 1975**. Downloaded the original scan and visually
+read PDF page 2. It has no searchable text layer. The official scan resolves a secondary
+reference's conflicting 27 February date in favour of 17 February.
+
+- Article 5: illicit use, two months to one year, 500–5,000 dinars, or either penalty alone;
+ courts could order detoxification.
+- Article 3: trafficking-related acts, ten to twenty years.
+- Article 8: a broad capital clause for offences under the ordinance where their character
+ threatened the Algerian people's moral health. Unlike the 1985 replacement, it does not
+ restrict its cross-reference to trafficking/facilitation articles; Article 5 use is within
+ the referenced ordinance. The description gives the statutory condition and does not claim
+ every user automatically received a death sentence.
+- Article 9: applies to acts after 1 October 1974 without a final judgment by publication.
+ The history date is the ordinance's promulgation, not a claim it was publicly enacted in 1974.
+
+Added `algeria-drug-ordinance-1975`, category **death**, tags **sentencing, treatment**, with an
+article and a scored capital-risk step. There is no claim of verified executions under it.
+
+### 1985 narrowing and non-prosecution
+
+[Official Gazette 8, 17 February 1985](https://www.joradp.dz/FTP/jo-francais/1985/F1985008.pdf),
+Law 85-05 of 16 February. Downloaded and visually read PDF pages 18–20 (printed 138–140).
+The scan has no searchable text layer. Article 268 expressly repeals the 1975 ordinance.
+Article 245 keeps the same basic use range; Article 248 refers only to Articles 243–244
+(trafficking/facilitation), excluding ordinary use Article 245 from its capital clause.
+Articles 249–253 provide treatment-linked non-prosecution or possible withholding of the
+use penalty, specialist/inpatient or outpatient care, and reports to the judicial authority.
+
+Revised `algeria-health-law-drug-framework-1985` to **death**, because the category includes
+limiting capital punishment. It now has an article and a scored step away from the broad
+1975 capital exposure. The text describes eligibility and legal alternatives, not observed
+programme participation or the frequency with which judges used them.
+
+### 2004 replacement and repeal of the earlier capital clause
+
+[Official Gazette 83, 26 December 2004](https://www.joradp.dz/FTP/jo-francais/2004/F2004083.pdf),
+Law 04-18 of 25 December, downloaded and read in extracted text, printed pp. 3–7.
+Article 38 repeals the 1985 drug provisions, including Article 248. The new law provides
+life for the cultivation offence (Article 20), organised trafficking and certain other supply
+acts; Article 12 provides two months to two years, 5,000–50,000 dinars, or either alone for
+use/personal possession. Articles 6–11 retain treatment-linked routes.
+
+The existing entry is now **death** because it removes the drug-law capital clause, with an
+article. It remains unscored with an explicit reason: the repealed capital clause concerned
+supply/facilitation, while sharing remains at the index's minimum and personal-use penalties
+and treatment alternatives remain in the existing bands. This is not a conclusion that all
+other Algerian capital offences involving drugs or other crimes disappeared.
+
+### Two 2007 implementing procedures
+
+[Official Gazette 49, 5 August 2007](https://www.joradp.dz/FTP/jo-francais/2007/F2007049.pdf),
+both decrees signed 30 July. Downloaded and read printed pp. 3–5 in extracted text; rendered
+page 3 for the authorisation text.
+
+- Decree 07-229, Articles 1–8: specialist assessment, detoxification or supervision, doctors'
+ reports, interruption notifications, certificates and a prosecutor's non-prosecution
+ decision. Confiscation remains required. Revised the existing treatment entry to publication
+ date 5 August and added an article. Kept **other**, since it implements the existing route;
+ it does not establish fresh empirical evidence of how often users avoided prison.
+- Decree 07-228: health-ministry authorisation for the listed operations, including cannabis
+ cultivation, limited to medical/scientific purposes. The application identifies work,
+ product, quantity and use, includes a criminal-record extract, and undergoes official checks.
+ Import/export permits last three months per operation; records, declarations and secure
+ storage are required. Added `algeria-medical-authorisation-rules-2007`, **medical**, tags
+ **patients, trade**, explicitly unscored: implements the 2004 exception and does not prove an
+ operational cannabis patient-access programme. No dedicated article was added for this
+ narrower administrative entry.
+
+### The omitted 2023 personal-growing exception
+
+[Official Gazette 32, 9 May 2023](https://www.joradp.dz/FTP/jo-francais/2023/F2023032.pdf),
+Law 23-05 of 7 May. Downloaded and read the drug-law amendment, printed pp. 12–16, separately
+from the human-trafficking law earlier in the same Gazette. Rendered and visually inspected
+pp. 15–16, including amended Articles 12 and 20.
+
+Article 20 adds **two to five years and DZD200,000–500,000 for personal-consumption cultivation**.
+The original 2004 Article 20 imposed life for cultivation without this exception. The old
+entry's reason for leaving this unscored was therefore wrong. Personal growing meets level 1
+("a crime, lesser penalties for a few plants") rather than level 0 (treated as production).
+The provision's actual test is personal consumption, not a specified number of plants.
+
+Article 12 keeps two months to two years and raises the fine floor from 5,000 to 20,000;
+**either penalty alone remains possible**. The previous profile repeatedly made prison and
+fine sound mandatory together. The amendment also adds treatment protection for minors who
+complete detoxification and higher penalties for specified suppliers.
+
+The entry is now **other** for this mixed reform, tagged **home-growing, sentencing, treatment**,
+with an article and a cultivation score step. The profile's cultivation score changes from
+0 to 1; other current segment values and recreational/medical classifications remain unchanged.
+
+### 2025 primary text replaces the secondary-only account
+
+[Official Gazette 43, 13 July 2025](https://www.joradp.dz/FTP/jo-francais/2025/F2025043.pdf),
+Law 25-03 of 1 July. Downloaded and read printed pp. 3–6; rendered pp. 4–5 and visually read
+page 5. The revised entry and new article use the original law.
+
+Article 21 bis 2 lists offences and aggravating circumstances for capital punishment; Article
+16 bis 2 separately concerns recruiting/using minors or specified vulnerable people at listed
+locations. Article 27 escalates repeat offences, including life to death. Article 26 bis sets
+a maximum-penalty rule when examinations establish drug influence during an offence and
+addresses examinations/refusal. Article 5 bis 10 concerns periodic pupil medical examinations: early screening requires consent
+from legal representatives or, where appropriate, the juvenile judge. Positive results direct
+the pupil to care and are protected from prosecution and other uses. Article 5 bis 9 requires
+negative results in recruitment files for listed public/private bodies, with implementing
+details left to regulation where needed. The article distinguishes these tests from the
+school screening and criminal-investigation examinations.
+
+The existing 2025 enforcement step (2 to 1) is retained, now accompanied by the explicit
+maximum-penalty rule rather than relying solely on capital penalties for trafficking. Its
+`before.cultivation` changes to 1 to carry forward the 2023 exception. The act dates remain
+promulgation dates where previously used, with publication dates stated separately; the batch
+does not invent a single nationwide commencement day from the signature alone.
+
+## Score audit and limits
+
+Exact unrounded sequence after the batch:
+
+| Event | Before | After | Reason |
+|---|---:|---:|---|
+| 1917 extension | 100 | 5 | Original first-restriction calibration retained; date corrected |
+| 1975 ordinance | 5 | 1 | Broad capital exposure including the use offence: enforcement 2 → 0 |
+| 1985 health law | 1 | 5 | Use excluded from the capital clause, treatment/non-prosecution routes; enforcement 0 → 2 |
+| 2023 amendment | 5 | 7.5 | Separate personal-growing prison range: cultivation 0 → 1 |
… 43 more linesdocs/research/history-romania-gap-2026-10-23.md +150 −0
@@ -0,0 +1,150 @@
+# Romania: medicine controls, personal-use penalties and the three-gram proposal
+
+Research date: 23 October 2026. The preceding goal turn made verified progress by correcting
+three country profiles and converting their citations. This continuation returns to the active
+history/article goal. Romania had ten events and one article; this batch leaves twelve events
+and five articles. Larger unresolved gaps remain in its early prohibition history.
+
+## Changes made
+
+- New entry and article `romania-cannabis-medicine-controls-2006`: Law 339/2005 took effect
+ seven months after its 5 December 2005 publication, on 5 July 2006. The article explains
+ cannabis's medical schedule, pharmaceutical preparations, prescriptions, patient possession
+ and the cultivation/handling authorisations. Category **other**, tagged **patients**: this is
+ a replacement control system, not evidence that medical cannabis was first permitted then.
+- New entry `romania-three-gram-proposal-2023`, 8 May: records the bill's introduction, proposed
+ administrative fine, prescription exemption and use of fine revenue. Category **debate**;
+ tags **thresholds, campaign, patients, treatment**.
+- Revised `romania-personal-use-penalty-reduction-2005` and added an article. The original Gazette
+ supports six months to two years or a fine for risk drugs, two to five years for high-risk
+ drugs, a three-month commencement, and a separate deferral for treatment-linked provisions.
+ Added tags and an explicit reason for leaving the whole-point scores unchanged.
+- Revised `romania-penal-code-2014` and rewrote its article. Added the assessment, consent and
+ programme-compliance route to waiving/postponing punishment alongside the reduction in the
+ prison minimum. Removed the old article's repetition of the 2013 medical-legalisation claim
+ and the overstatement about final parliamentary rejection in 2023.
+- Corrected `romania-medical-2013`, retaining its ID to preserve links, and added an article.
+ Source and dating checks are documented below. Category now **debate**, tag **patients**.
+
+- Corrected `romania-3-grams-rejected-2023` to the Senate vote on 18 September and added an
+ article. The deciding lower-house stage must be distinguished from Senate rejection and
+ committee reports. Tags **thresholds, campaign, patients**.
+- Corrected only the Romanian profile's production and medical context blocks: removed the
+ invented 2013 origin, blanket 0.2% medicine threshold and unverified absolute claims about
+ licences/products. Current CMS guidance supports authorised medical handling and
+ pharmaceutical-only prescribing; the statutory reproduction supports prescription/quantity
+ rules. Both revised blocks cite inline. Scores, statuses and other profile blocks unchanged.
+
+## Sources actually read
+
+### Original 2004 Gazette and 2014 implementing law
+
+[Law 522/2004 in Official Gazette 1155, 7 December 2004](https://upload.wikimedia.org/wikipedia/commons/2/2d/Monitorul_Oficial_al_Rom%C3%A2niei._Partea_I_2004-12-07%2C_nr._1155.pdf)
+was downloaded and extracted; printed pages 2 and 4 were rendered and visually read. Page 2,
+Article I point 6 contains the revised personal-use penalties. Page 4, Article II sets three
+months for general commencement and defers Articles 19¹–19² until the new Penal Code. Thus
+7 March 2005 remains the penalty-change date, while the Gazette does not prove treatment
+waivers were already operating on that date.
+
+[Law 187/2012, reproduced by the Romanian Financial Supervisory Authority](https://asfromania.ro/uploads/articole/attachments/60801bd912f77503976495.pdf)
+was downloaded and read in extracted text: Article 81 points 3 and 11–12, printed pp. 29–31,
+and Article 247, p. 93. It supplies the new three-month minimum, high-risk range, assessment
+and consent, programme-compliance court outcomes and 1 February 2014 commencement. It is a
+legal text, not evidence of how often courts used these routes. No claim about their frequency
+or programme participation was added.
+
+The existing 2000-law entry is retained as sourced background. Its original-text and old
+historical-consolidation URLs returned 502 to the web reader and HTTP/2/empty-response errors
+to local curl during this pass. They were not relabelled as newly read. The current official
+portal's bibliographic/publication material was accessible, but it defaults to later versions;
+those were not substituted for the original offence text. A new article about the 2000 law
+was therefore left for a later pass.
+
+### Medicine controls and the 2013 correction
+
+[Law 339/2005, full statutory reproduction](https://www.medfamsv.ro/index_htm_files/lege_339_2005.pdf)
+was downloaded and read, especially Articles 5, 11–12, 36–41 and 56, and Table II narcotics
+item 18. PDF pages 8 and 12 were rendered and visually inspected. The text includes cannabis,
+resin, extracts and tinctures in the medical-interest schedule; it restricts prescriptions to
+industrial/pharmacy preparations and permits the prescribed quantity on prescription. Article
+56 expressly says seven months after publication. The reproduction bears a medical-practice
+footer and is identified as a reproduction, not as an official Gazette scan.
+
+[Official Ministry of Justice record for Law 339/2005](https://legislatie.just.ro/Public/DetaliiDocument/66456)
+was opened and its publication metadata read: Gazette 1095, 5 December 2005. Subsequent attempts
+to retrieve focused parts were intermittent/502; the full downloaded reproduction supplies the
+substantive articles. A secondary index's contradictory generic commencement metadata was not
+used over the statutory seven-month rule. The new event's category makes no claim about how
+this permission compared with the repealed 1969 law, or about an operational patient market.
+
+[Romania Insider, 10 October 2013](https://www.romania-insider.com/news/castle-craig-clinic-romania-denies-allowing-use-of-medical-marijuana)
+was read in the web reader, including its attributed statements by Sorin Oprea and Anca
+Crupariu. The local site returned 429, so there was no repeated scripted retrieval. This is a
+contemporary report quoting agencies via Castle Craig, not a separately recovered agency
+press release. The revised entry and article attribute the claims accordingly. No purported
+new 2013 statute or statutory 0.2% medicine limit was found or retained.
+
+[CMS Romania legal guide, 18 June 2024](https://cms.law/en/int/expert-guides/cms-expert-guide-to-a-legal-roadmap-to-cannabis/romania)
+was read at its medical-use section: authorised cultivation/import/sale under Law 339/2005,
+pharmaceutical products only. Its discussion distinguishes the hemp cultivation threshold
+from final THC-containing products. The profile corrections avoid inferring a medicine limit
+from a hemp threshold. No current product-authorisation inventory was independently audited.
+
+### Three-gram bill and Senate vote
+
+[Senate original bill PDF, L384/2023](https://www.senat.ro/legis/PDF/2023/23L384FG.PDF?nocache=true)
+was downloaded; both pages were rendered and visually read because the scan has no searchable
+body text. Proposed Article 4¹: up to three grams for personal use, administrative fine
+1,000–3,000 lei; medically prescribed cannabis possession exempted from Articles 4 and 4¹.
+Fine revenue: prevention and medical, psychological and social assistance. Article III calls
+for a special medical-cannabis law. This is the sponsors' bill, not an enacted statute, despite
+its formal law layout. The explanatory memorandum was downloaded but mostly scanned and was
+not treated as read evidence for empirical claims.
+
+[Senate legislative record](https://www.senat.ro/legis/lista.aspx?an_cls=2023&nr_cls=L384)
+was downloaded and its chronology read: introduction 8 May; favourable Economic and Social
+Council and Legislative Council opinions 7 June; Senate rejection 18 September; transmission
+and registration in the Chamber 20 September; joint committee rejection report 12 December.
+The file labels the stage as sent to the Chamber for debate. The batch does not invent a
+later final plenary rejection or claim that every advisory body opposed it.
+
+[Electronic roll call](https://www.senat.ro/VoturiPlenDetaliu.aspx?AppID=BF471C89-21B1-46A4-BD96-638B8E0255E0&Cod=25408&Data=2023-09-18)
+was read: 108 present; 103 for the rejection report, one against, four abstentions. This is the
+source used for the count. The contemporary AGERPRES story reports 107 for; that conflicting
+number was not copied into the database.
+
+[AGERPRES introduction report, 8 May 2023](https://agerpres.ro/viata-parlamentara/2023/05/08/camera-deputatilor-propunere-legislativa-pentru-dezincriminarea-posesiei-de-canabis-pentru-consum-pr--1103965)
+and [rejection report, 18 September](https://agerpres.ro/politic/2023/09/18/dezincriminarea-posesiei-de-canabis-in-limita-a-trei-grame-respinsa-de-senat--1171281)
+were downloaded and their article bodies read. Used for sponsors' stated reasoning and the
+reported opposition speeches respectively. Sponsors' empirical predictions and youth survey
+claims were not presented as independently established results.
+
+## Verification and remaining gaps
+
+`tmp/history-romania-gap-2026-10-23/verify.mjs` checks the two additions/four revisions against
+pre-edit snapshots, ensures unrelated events are unchanged, validates categories, tags, links,
+all block-local citations and all five article source lists, checks 350–500 words and 3–5
+sections, and confirms current/historical scores and unrelated profile blocks are unchanged.
+Final article word and citation counts are recorded after the final copy check. Romania's scored
+chain still reads 100 → 9 in 1928 and 9 → 11 in 2014, with no diagnostic flags.
+
+The 1926 resin-growing ban preceding the scored 1928 restriction remains a research priority;
+the current chain diagnostic alone does not settle its historical allocation. Original
+interwar instruments, the 2000-law article and the 2024 airport case also remain open. This
+batch does not claim Romania's history or the wider goal is complete.
+
+Full-build and generated-page checks are recorded below after completion. Research downloads,
+text extracts and source-page renders are retained; generated site builds are deleted.
+
+Final verification passed: 2,857 events and 734 articles overall; Romania has twelve events
+and five articles. The five articles contain 1,905 words and 116 inline citation marks. All
+155 rendered numbered links on those five history pages resolve to unique reference targets
+(including history-description citations). New event pages, the Romanian profile/API,
+history/article indexes, six tag pages and history exports passed. No raw citation marks leak
+into the visible checked pages or exports. The snapshot verifier confirms unrelated history
+entries, current scores and historical score changes are preserved. Whitespace checks passed.
+
+The final full build completed successfully: 3,612 pages in 28.42 seconds. An earlier complete
+build preceded final copy edits. Both used the dedicated temporary site directory, which was
+deleted after inspection. Research PDFs, text extracts, page renders and verification logs
+remain. The overall history-coverage goal remains active.
docs/research/profiles-inline-cz-sk-at-2026-10-23.md +148 −0
@@ -0,0 +1,148 @@
+# Czechia, Slovakia and Austria: inline profile citations
+
+Reviewed 23 October 2026. Scope: the six score explanations and ten context blocks in each
+profile. All 48 blocks now use the country-key citation syntax in `docs/WRITING.md`, immediately
+after each supported sentence. Germany supplied the format example and was left unchanged.
+
+Scores, recreational/medical classifications, planting and trade classifications, driving,
+visitor and club statuses, and the history dataset were preserved. This is a profile correction
+and citation pass; it adds no history events or articles.
+
+## Sources read and material corrections
+
+### Czechia
+
+- [Addictive Substances Act 167/1998](https://www.zakonyprolidi.cz/cs/1998-167), especially
+ §§ 2, 5(12)–(13), 24c and 39. The permission covers adults aged 21+, 100 g in their own
+ dwelling and 25 g elsewhere, and growing/harvesting/processing three plants for personal use.
+ The growing location is property owned or otherwise legally used, not only a primary
+ residence. The next possession/growing bands are administrative offences, with a maximum
+ CZK50,000 fine. The statutory cannabis definition concerns flowering/fruiting tops and
+ above-ground material containing a top; seed and young-plant wording is limited to that
+ definition and does not invent a retail rule for cuttings.
+- [Criminal Code 40/2009](https://www.zakonyprolidi.cz/cs/2009-40), §§ 283a and 285. Restored the
+ omitted criminal threshold of more than 50 g outside one's own dwelling, alongside more than
+ 200 g at home. More than five plants is criminal. Supply, including gifts, and import remain
+ offences. Basic personal-possession/growing maximum: six months; basic supply maximum: one year.
+- [Smoking restrictions, Act 65/2017](https://www.zakonyprolidi.cz/cs/2017-65), § 8, read for
+ examples of places where smoking is prohibited. Removed the unsupported blanket historical
+ claim that use had never been an offence.
+- [SÚKL medical cannabis guidance](https://sukl.gov.cz/zdravotnicti-pracovnici/leciva/konopi-pro-lecebne-pouziti-druhy-indikace-a-specializace-lekare/),
+ prescriber table and prescribing/dispensing/reimbursement sections. Read via the web cache
+ after direct requests timed out. Supports medical flower/extracts, electronic prescriptions,
+ inclusion of general practitioners, and 90% reimbursement up to 30 g per month, with insurer
+ approval needed for higher reimbursement quantities. Does not support a claim that every
+ doctor can prescribe; that claim was not used.
+- [Advokátní deník, 4 April 2026](https://advokatnidenik.cz/2026/04/04/drogove-trestne-ciny-ve-svetle-aktualni-novely-trestniho-zakoniku/),
+ read the discussion of processing/manufacture and joint cultivation. Attributes its
+ interpretation of chemical extraction and shared growing explicitly. Removed the blanket
+ claim that all personal concentrates/edibles are forbidden, because the statute expressly
+ permits personal processing and the commentary distinguishes manufacture from processing.
+- [Czech Police, Kanabidiol](https://archiv.policie.gov.cz/clanek/kanabidiol.aspx), read the
+ road-law paragraph giving 2 ng/ml delta-9-THC in blood under Regulation 41/2014.
+- [Supreme Court, Tpjn 300/2020](https://sbirka.nsoud.cz/sbirka/5718/), read the headnote: 10 ng/ml
+ delta-9-THC in blood serum supports criminal unfitness to drive. Replaced the old secondary
+ 2016 account with the Court's 2020 statement.
+- [BESIP penalty table](https://besip.gov.cz/Ucastnici-silnicniho-provozu/Ridici-automobilu/Zasady-bezpecne-jizdy-v-aute/Novy-bodovy-system/Tabulka-prestupku),
+ read the current columns for driving under the influence and refusal: CZK7,000–25,000,
+ six points, 6–18 months; refusal CZK25,000–75,000, six points, 18–36 months.
+- [National monitoring centre, summary of the 2025 illegal-drugs report](https://vlada.gov.cz/assets/ppov/zavislosti/media/Priloha-01-k-TZ-2026-01-23_Souhrn-Zpravy-o-nelegalnich-drogach_fin.pdf),
+ pp. 9–10 read in extracted text. All retained arrest, conviction, seizure and potency numbers
+ match these passages. The government's mirror replaces the original drogy-info URL, which
+ returned 403 to the local fetch. The report describes small grow rooms as up to 50 plants;
+ wording now reflects that. Online distribution is attributed to the drug market generally.
+
+Broad claims that sub-1%-THC products can be sold freely to anyone were removed: a narcotics-law
+threshold does not by itself establish all product, sales-channel or age rules. Medical and
+personal-growing routes now have their own sources.
+
+### Slovakia
+
+- [Current Criminal Code, effective 18 August 2026](https://static.slov-lex.sk/static/SK/ZZ/2005/300/20260818.html),
+ §§ 40a, 135b–135e, 171–173 and 289, annexes 1–2. Downloaded and read the relevant text.
+ The lowest cannabis possession band carries up to one year. Section 135c first uses material
+ weight (2 g); above it, active-ingredient weight can still place cannabis in the lowest band
+ (200 mg THC). These are not simply interchangeable dose allowances. Two plants is the lowest
+ personal-growing band; three to five plants is the next. Replaced the old usual-single-dose
+ visitor advice with the current quantity system and old newspaper anecdotes with the current
+ conditional waiver/treatment rule. Section 135b includes acquisition for another person's
+ personal consumption under its quantity, no-distribution and no-profit conditions; the profile
+ does not label every such acquisition trafficking. Section 40a(5) supplies the consequence
+ after successful completion of treatment/probation.
+- [Act 139/1998, text from 1 January 2026](https://www.zakonypreludi.sk/print/zz/1998-139/znenie-20260101.htm),
+ § 15. Industrial growing means fibre and seed. Research requires permission, but § 15(4)
+ exempts EU-common-catalogue varieties, including those listed at sowing, from the cultivation
+ permit. The earlier profile omitted that exemption.
+- [Road Traffic Act, effective 1 October 2026](https://static.slov-lex.sk/static/SK/ZZ/2009/8/20261001.html),
+ § 4(2)(c)–(d), read the prohibition on driving while the drug can still be in the body.
+ Section 289 of the Criminal Code supports up to one year for the basic unfitness/refusal
+ offences; it is not limited to repeat offenders. Removed unverified present-day roadside
+ testing procedure and administrative fine details.
+- [CMS legal guide](https://cms.law/en/int/expert-guides/cms-expert-guide-to-a-legal-roadmap-to-cannabis/slovakia),
+ dated 11 July 2024, read the medical, industrial-hemp and CBD sections. Retained the account
+ that medical cultivation/import/sale is prohibited. The CBD internal-use claim is explicitly
+ dated to the guide, rather than treating removal from the drug list as permission for every
+ CBD product. This pass did not independently re-audit every medicines or food authorisation.
+
+### Austria
+
+- [Current Suchtmittelgesetz](https://www.ris.bka.gv.at/GeltendeFassung.wxe?Abfrage=Bundesnormen&Gesetzesnummer=10011040),
+ §§ 6a, 13(2b), 27, 35 and 38, downloaded and read the relevant passages. Possession and
+ cultivation to obtain the drug remain offences. The basic exclusively personal-use form has
+ a maximum six months or 360 day-fines. Conditional discontinuance is not confined to first
+ offenders and is subject to the statute's requirements. Police notify the health authority
+ and report to the prosecutor; removed the inaccurate statement that referral always replaces
+ a prosecutor's involvement. Probation and needed health measures are explained without
+ assuming everyone must undergo treatment. Section 38 supports resumption/final discontinuance.
+ Section 6a supports the new production section: AGES or its at-least-75%-owned subsidiary,
+ with restricted recipients of the harvest.
+- [Current Suchtgiftverordnung](https://www.ris.bka.gv.at/GeltendeFassung.wxe?Abfrage=Bundesnormen&Gesetzesnummer=10011053),
+ § 14 and annex I.1.a, downloaded and read. Supports the new product section, the exceptions
+ for approved cannabis-extract medicines and isolated THC above 95% purity for pharmacy
+ preparations, and exclusion of seeds unmixed with flowering/fruiting tops. Cultivation intent,
+ rather than flowering alone, is the relevant offence test under the SMG.
+- [Parliamentary report, 22 January 2019](https://www.parlament.gv.at/aktuelles/pk/jahr_2019/pk0039),
+ read the account naming Sativex, Canemes, dronabinol drops/capsules and reimbursement with
+ medical justification/insurer approval. Attributed those details to the report; current
+ prescription restrictions are separately supported by the regulation above.
+- [Government driving-penalty table](https://www.oesterreich.gv.at/.syndication?pageId=00f693f1-1729-43a3-a76f-647560445b09),
+ read the drug-impaired first-offence row: €800–3,700, one-month licence withdrawal and traffic
+ coaching. Replaced the old four-week wording and removed the absolute assertion that no
+ imprisonment could arise. The existing EUDA driving source is retained for impairment/no
+ numerical threshold; roadside-testing procedural claims were removed.
+
+### Clubs and statistical material
+
+[Pardal and colleagues' European club survey](https://cdn.sanity.io/files/6u5teakk/production/f4c3728d3dc15f3ae1e89790c1f62033dcaa4140.pdf?dl=)
+was downloaded and the 2018–19 survey table and Slovakia discussion read. It supports two Czech
+and four Austrian responding clubs, and no active Slovak club found by the study's methods.
+These are dated findings, not present-day club counts. Removed the false blanket statement that
+the model is prohibited throughout the EU and unsupported inferences about current national
+closures. The current supply rules have separate statutory citations.
+
+The existing Slovakia/Austria EUDA 2026 statistical-bulletin arrest and seizure values are
+preserved, including the distinction between Austria's 2024 total and 2023 use-related count.
+This pass migrated their citations; it did not constitute a fresh download/audit of the bulletin.
+The previous generic cross-country-comparison disclaimers were removed from profile prose.
+
+## Verification
+
+The scoped verifier in `tmp/profiles-inline-cz-sk-at-2026-10-23/verify.mjs` uses the real
+`citeParts`, `references` and `sourceTuple` functions. It checks all block-local keys, adjacent
+sentence citations, repeat numbering, clean plain-text output, and unchanged scores/statuses,
+statistical numbers, German example and history against pre-edit snapshots.
+
+Build and rendered-output results are recorded below after verification. Source downloads,
+extracts and logs are retained in the same temporary research directory; generated build output
+is deleted after inspection.
+
+Final checks passed: 48 blocks and 129 inline profile source links; all 132 rendered numbered
+links (including the three shared travel references) resolve to unique targets. Both reference
+lists per country have consecutive numbers. Country APIs, home/comparison pages and score
+exports contain no raw citation marks. Scores, classifications, statuses, statistical values,
+Germany and `changes.yaml` match the pre-edit snapshots. Whitespace checks passed.
+
+Full final build: 3610 page(s) built in 9m 16s. The earlier complete build preceded the final
+plain-language edits; the final build includes those edits. The initial interrupted build was
+stopped to finish sentence-level citation placement. All three used the same dedicated output
+directory. That output directory was deleted after verification; research inputs and logs remain.
scripts/archive-sources.cjs +2 −1
@@ -65,5 +65,6 @@ for (const f of ["articles", "culture"].filter((d) => fs.existsSync(d)).flatMap(
for (const s of (head && y.load(head[1])?.sources) || []) if (s.url) urls.add(s.url);
}
-const all = [...urls].filter((u) => /^https?:\/\//.test(u) && !u.includes("web.archive.org"));
+// pages of the Internet Archive itself (the Wayback Machine, archive.org items) are archives already
+const all = [...urls].filter((u) => /^https?:\/\//.test(u) && !/^https?:\/\/([a-z0-9-]+\.)?archive\.org\//i.test(u));
const DEAD_DAYS = 90;
// marked dead and seen within the last 90 days: skipped by every run
scripts/data-status.cjs +2 −1
@@ -61,5 +61,6 @@ if (what === "chain") {
const T = (d) => Date.parse(d.length === 4 ? d + "-07-01" : d.length === 7 ? d + "-15" : d);
const UP = new Set(["easing", "legalisation", "medical"]);
- const DOWN = new Set(["ban", "tightening", "death"]);
+ // Death-penalty entries also cover limits and abolition, which can raise the score.
… 4 more linesscripts/fetch-open-data.py +2 −0
Not shown: a picture, a generated file, or past the length shown per change.
source-archive.json +135 −39
Not shown: a picture, a generated file, or past the length shown per change.
src/components/Cited.astro +8 −0
Not shown: a picture, a generated file, or past the length shown per change.
src/components/CountryArticle.astro +16 −15
Not shown: a picture, a generated file, or past the length shown per change.
src/components/ExhibitionBanner.astro +19 −0
Not shown: a picture, a generated file, or past the length shown per change.
src/components/ExhibitionPosters.astro +15 −0
Not shown: a picture, a generated file, or past the length shown per change.
src/components/References.astro +16 −0
Not shown: a picture, a generated file, or past the length shown per change.
src/components/SourceCitation.astro +3 −2
Not shown: a picture, a generated file, or past the length shown per change.
src/layouts/Base.astro +1 −1
Not shown: a picture, a generated file, or past the length shown per change.
src/lib/cite.js +69 −0
Not shown: a picture, a generated file, or past the length shown per change.
src/lib/countries.js +5 −2
Not shown: a picture, a generated file, or past the length shown per change.
src/lib/exhibitions.js +14 −0
Not shown: a picture, a generated file, or past the length shown per change.
src/lib/exports.js +1 −1
Not shown: a picture, a generated file, or past the length shown per change.
src/lib/gitlog.js +227 −0
Not shown: a picture, a generated file, or past the length shown per change.
src/lib/llms.js +2 −1
Not shown: a picture, a generated file, or past the length shown per change.
src/lib/search-icons.js +1 −1
Not shown: a picture, a generated file, or past the length shown per change.
src/og/exhibition.astro +23 −0
Not shown: a picture, a generated file, or past the length shown per change.
src/og/render.js +19 −1
Not shown: a picture, a generated file, or past the length shown per change.
src/pages/changelog.astro +0 −39
Not shown: a picture, a generated file, or past the length shown per change.
src/pages/changelog/[hash].astro +147 −0
Not shown: a picture, a generated file, or past the length shown per change.
src/pages/changelog/index.astro +43 −0
Not shown: a picture, a generated file, or past the length shown per change.
src/pages/charts.astro +7 −4
Not shown: a picture, a generated file, or past the length shown per change.
src/pages/culture/[section]/[slug].astro +11 −5
Not shown: a picture, a generated file, or past the length shown per change.
src/pages/culture/index.astro +2 −0
Not shown: a picture, a generated file, or past the length shown per change.
src/pages/data/index.astro +1 −1
Not shown: a picture, a generated file, or past the length shown per change.
src/pages/history/[id].astro +19 −20
Not shown: a picture, a generated file, or past the length shown per change.
src/pages/og/[...path].png.js +15 −3
Not shown: a picture, a generated file, or past the length shown per change.
src/pages/reefer-madness.astro +3 −3
Not shown: a picture, a generated file, or past the length shown per change.
src/pages/rss.xml.js +1 −1
Not shown: a picture, a generated file, or past the length shown per change.
src/pages/score-changes.astro +40 −0
Not shown: a picture, a generated file, or past the length shown per change.
src/pages/search.json.js +1 −1
Not shown: a picture, a generated file, or past the length shown per change.
src/pages/sitemap.xml.js +2 −1
Not shown: a picture, a generated file, or past the length shown per change.
src/pages/sources/index.astro +2 −1
Not shown: a picture, a generated file, or past the length shown per change.
src/styles/global.css +90 −1
Not shown: a picture, a generated file, or past the length shown per change.