Cannabis Freedom Index

Changelog 0ed6ed1

Fix legal access, penalty classifications and chart comparisons (#128–136)

4 history entries added7 history entries edited1 score changed7 country profiles edited2 articles edited7 files of code, design or docs +628 −239 lines

Score changes 1 place

  1. Panama1211−1access 1 → 0

History changes.yaml

Added 4

Edited 7

Panama's first medical cannabis pharmacy opens

description

The healthA specialist pharmacy opened on 22 January and the ministry confirmed thatreported seven commercial licences to sell cannabis-derived products had been issued. All[@1] The drug directorate lists Cannapharma CBD products are imported during a two-year transitionfor that date; this does not establish access to controlled THC medicines.[@2]

sources

TVN — first specialist cannabis pharmacy (22 January 2026) DNFD — medical cannabis product register (reviewed 25 October 2026) Wikipedia — Cannabis in Panama

unscored

CBD sales and commercial licences do not establish a working psychoactive-cannabis access route.

Greek patients can finally get prescriptions

date

2024-02

description

After long administrative delays, medical cannabis became available onFinished prescription cannabis products reached patients in February 2024, as oil or flower, for conditions including cancer, epilepsy and chronic painyears after the legal framework.[@1] On 27 February the health minister met the first patient prescribed a product.[@2]

sources

Lavipharm — first locally produced cannabis prescription medicine launch (23 February 2024) Greek Ministry of Health — meeting with the first prescribed patient (27 February 2024) Wikipedia — Cannabis in Greece

before

possession 1 · cultivation 1 · enforcement 3 · sharing 1 · consumption 1 · access 0

Lithuania allows hemp products

description

ProductsLithuania permitted products made from all parts of fibre hemp were permitted if their THC content did not exceedfrom November 2021.[@1] The later 0.23%, a limit raised toconcerns source plants; finished goods retain a separate general 0.32% in 2022total-THC ceiling and lower category-specific limits.[@2]

sources

Lithuanian Food and Veterinary Service — hemp plant and finished-food THC limits 1 unchanged

Panama legalises medical cannabis

description

Law 242, sanctioned on of 13 October 2021, regulates cannabis for medical use, with created a patient registry, licences issuedregulated medical-cannabis framework; implementing regulations followed in 2022 and were revised by Executive Decree 6 in 2025.[@1] This was not an operating pharmacy route: in July 2023 the Ministry of Public Securityministry still prohibited cannabis-product distribution and sale only through authorised pharmacies. The regulations followed on 30 August 2022.[@2]

before

possession 1 · cultivation 1 · enforcement 2 · sharing 1 · consumption 1 · access 0

sources

DNFD — Executive Decree 6 of 4 April 2025 MINSA — cannabis-product distribution and sale remain prohibited (22 July 2023) Panamá América — A partir de hoy empieza a regir el uso medicinal y terapéutico del cannabis en Panamá (October 2021) El Mercurio (EFE) — Panamá reglamenta ley sobre el uso medicinal y terapéutico del cannabis (1 September 2022) Wikipedia — Cannabis in Panama

unscored

An enabling framework; authorised sales and a working THC medicine route did not follow in 2021.

Trinidad and Tobago decriminalises cannabis

description

Adults ordinarily may possess up tohold 30 g of cannabis or 5 g of resin and grow four plants each with no penalty. Between 30 g and 60 g isThe reform did not create a fixed-penalty ticket instead of a prosecutionlegal market. Before,It retained a separate offence for possession could meanon school buses and at specified premises where children attend activities, with TT$250,000 and five years in prisonon summary conviction. No legal market was created.[@1]

sources

TNI — Trinidad and Tobago lawmakers approve marijuana decriminalization bill Wikipedia — Cannabis in Trinidad and Tobago 1 unchanged

Greece legalises medical cannabis

before

possession 1 · cultivation 1 · enforcement 3 · sharing 1 · consumption 1 · access 0

unscored

The production framework preceded actual patient access, scored in February 2024.

Sweden bans THCA

description

Delta-9-THCA-A became a narcotic on 14 July under SFS 2026:1109. The government classified a group of substances as narcoticsannounced the classification on 11 June, among them THCA,explaining that the acid form of converts easily to psychoactive delta-9-THC sold mostly in vapes. The poison information centre had logged eleven calls about it since 2024.[@1]

sources

Swedish Government — narcotics classifications effective 14 July 2026 (11 June 2026) Wikipedia — Cannabis in Sweden

unscored

The additional substance classification does not change the existing cannabis score floors.

Countries and states 8 files

Panama countries/pa.yaml

access 1 → 0

summary

Medical cannabis was legalised inhas a legal framework dating from 2021; recreational use islicensed CBD sales began in 2026. Recreational cannabis remains illegal.

segments › access › text

No adult-use source. Registered patients can obtainLaw 242 created a medical framework in 2021, but the ministry still prohibited cannabis-product sales in July 2023. A specialist pharmacy opened in January 2026; the current drug-directorate register lists CBD products through licensed pharmacies, without establishing an available THC medicine route.

segments › access › sources

hssales2023, edregister2026, pharmacy2026

context › products › text

Prescription medicalThe drug directorate lists Cannapharma CBD products onlydated 22 January 2026. That listing does not establish retail availability of controlled THC medicines.

context › products › sources

hsregister2026

context › medical › text

Any licensedExecutive Decree 6 of April 2025 revised the 2021 framework. In June 2026 the ministry approved patient and companion forms: a qualified doctor who has completed health-certifies treatment, the ministry training may prescribeverifies registration, for qualifying conditions such as chronic pain, epilepsy and multiple sclerosis. Patients are entered inan approved patient receives a national registrycard for authorised pharmacies. The announcement said the forms would be available shortly.

context › medical › sources

hsdecree2025, clregistration2026

context › visitors › text

There is no legal recreational supply for anyone, so a visitor has no lawful way to buy cannabisresidents or visitors. Whatever legal supply exists isThe medical, framework requires certification and approved registration for patients withcontrolled medicines; a prescription or registrationpharmacy selling CBD does not establish access to THC products. The sources behind this profile describe no separate rule for visitors.

context › visitors › sources

hsregistration2026, edregister2026

sources

MINSA — cannabis-product distribution and sale remain prohibited (22 July 2023) DNFD — medical cannabis product register (reviewed 25 October 2026) TVN — first specialist cannabis pharmacy (22 January 2026) DNFD — Executive Decree 6 of 4 April 2025 MINSA — patient certification and registration (2 June 2026) 9 unchanged

Greece countries/gr.yaml

segments › access › text

No adult-use source. MedicalFinished pharmaceutical cannabis became legalavailable on prescription in 2017February 2024, but finished products reached patients only years laterfollowing the 2017 rescheduling and 2018 production framework.

segments › access › sources

boclaunch2024, mondaqpatient2024

context › medical › text

Legal on prescription since 2017 afterMedical cannabis was moved to a less restrictive scheduleenabled in 2017 and production regulated in 2018. Availability has been slow to followPatients first obtained finished prescription products in February 2024; on 27 February the health minister met the first patient prescribed one.

context › medical › sources

bocpatient2024, nklaunch2024

sources

Greek Ministry of Health — meeting with the first prescribed patient (27 February 2024) Lavipharm — first locally produced cannabis prescription medicine launch (23 February 2024) 14 unchanged

India countries/in.yaml

recreational

partialdeath

segments › sharing › sources

cbn, ndps31a

context › death penalty › text

Section 31A of the NDPS Act makes death a discretionary sentence for certain repeat offences. The cannabis thresholds in its table are 20 kg of hashish or 500 g of THC. The headlinedeath-penalty status remains partial becausereflects this maximum punishment; bhang made from leaves isremains lawfully sold in several states.

sources

Narcotics Control Bureau — NDPS Act, section 31A and 2014 amendment notes 9 unchanged

Kenya countries/ke.yaml

segments › cultivation › text

Section 6 punishes cultivating a prohibited plant, or letting premises be used for it, with a fine of 250,000 shillings or three times the plants’ market value of the plants, whichever is greater, up to twenty years in prison, or both. Under Section 7 requires forfeiture of non-government land when the court must also orderconvicted person owns it, or a lessee grew with the land forfeitedowner’s consent, cooperation or assistance. If the lessee acted without that involvement, the offender’s lease or right ends and possession returns to the governmentowner.

context › consequences › text

A conviction iscreates a criminal record. Cultivation can also cost land or a lease under section 7: owner involvement determines whether non-government land is forfeited or an innocent owner recovers it. Rights over government land revert to government. Sections 7(4) and 9–10 protect qualifying security and intermediate interests and require notice and an opportunity to be heard.

Lithuania countries/lt.yaml

context › planting › text

The Fibre Hemp Law covers only catalogue varieties with up to 0.23% THC, sowngrown from certified seed that meets the ministry's quality rules. Since 1 November 2021 gardeners may grow suchGardening hemp may be grown among or beside other garden plants, up to 20 plants per 100 m² on at most 0.1 ha, and. Gardeners must handnotify the seed-packet labels to the State Plant Service and submit packet labels by 15 June and keep a growing journal; their products may not be marketed. The law speaks only of sowing seed and doesseparate general ceiling for finished hemp goods is 0.2% total THC, with lower category-specific limits. These industrial-hemp rules do not mention cuttingsauthorise growing psychoactive cannabis.

context › planting › sources

xiv386hempcurrent, hempguide

sources

Lithuanian Food and Veterinary Service — hemp plant and finished-food THC limits State Plant Service — hemp growing and gardening requirements (2024) 11 unchanged

Sweden countries/se.yaml

context › products › text

Two approved cannabinoid medicines. Delta-9-THCA-A became a narcotic on 14 July 2026 under SFS 2026:1109; products marketed as THCA do not escape control merely because the acid converts to THC when heated. This classification is distinct from the rules for CBD.

context › products › sources

lva, thca2026

sources

Swedish Government — narcotics classifications effective 14 July 2026 (11 June 2026) 11 unchanged

Trinidad and Tobago countries/tt.yaml

summary

Since 2019 adultsAdults may possessordinarily hold up to 30 g and grow four plants, but possession around children at specified premises or on school buses can bring five years in prison. There is no legal market yet.

segments › possession › text

Since 23 December 2019 an adult may possess up toThe ordinary exemption is 30 g of cannabis or 5 g of resin with no penalty. Between 30 and 60 g It does not override section 5C(5–10 g of resinb) is: possession on a fixedschool bus, or at premises where children are present for education, sport or cultural activities, carries TT$250,000 and five years on summary conviction. The separate school-penalty ticket rather than a prosecutionvicinity trafficking presumption in section 5(7) expressly excludes people covered by section 5(2). Above 60 g isModerate overages have a ticket scheme; larger amounts remain criminal offence.

segments › possession › sources

wiki, tniact24

segments › enforcement › text

Nothing within the limits, a ticketThe quantity exemption applies in permitted settings. Section 5C(b) carries five years even for moderate overagessmall amounts in its school-bus and children’s-activity settings. Public use has a separate TT$2,000 ticket scheme. Trafficking and larger quantities bring criminal penalties including prison for larger amounts, trafficking and supplying minors.

segments › enforcement › sources

tni, wikiact24

segments › consumption › text

Use in privatePrivate use is generally lawful. Smoking inPublic smoking or use falls under section 5A: a public placeTT$50, at000 court fine, with a workplaceseparate TT$2, or near schools remains an000 fixed-penalty route. The five-year sentence for possession at specified children’s premises is a different offence, as does using while driving or operating machinery.

segments › consumption › sources

tniact24, wikilegalaid

context › consequences › text

The 2019 reform allowed people with past convictionsSection 5D provides discharge and expungement routes for earlier small amounts to apply for-possession cases; a pardon and have records clearedmay follow expungement. New offences can still create a criminal record, including section 5C(b) possession in specified settings involving children.

context › consequences › sources

tniact24, legalaid

context › visitors › text

There is no legal recreational supplymarket for anyone, so a visitor has no lawful way to buy cannabisvisitors or residents. The sources behind this profile describe no separate rule for visitorsordinary personal quantity allowance does not permit possession on school buses or at premises where children attend education, sport or cultural activities; section 5C(b) carries TT$250,000 and five years on summary conviction.

context › visitors › sources

econ, wikiact24

context › driving › text

Motor Vehicles and Road Traffic Act section 70 prohibits driving, attempting to drive or b … inance Act 2025 doubled its fines, without amending section 70's drug-impairment penalty. Separately, Dangerous Drugs Act section 5C(c) covers control of a motor vehicle, aircraft or ship while under cannabis influence, carrying TT$250,000 and five years on summary conviction. No numeric THC allowance was established in the sources reviewed.

context › driving › sources

mowtdui, finance2025, act24

sources

Legal Aid and Advisory Authority — marijuana reform guidance (12 August 2024; statutory text controls) 9 unchanged

answers › carry › answer

limited

answers › carry › text

Up to 30 g ordinarily; school buses and specified premises with children remain criminal

answers › caught › answer

limited

answers › caught › label

Depends on the setting

answers › caught › text

Even within the quantity allowance, possession on a school bus or at specified premises with children can bring five years

United States countries/us/index.yaml

context › consequences › text

Federal section 922(d)(3) prohibits firearm transfers to a person known or reasonably believed to be an unlawful controlled-substance user or addict. On 18 June 2026, United States v. Hemani held that section 922(g)(3) could not constitutionally punish firearm possession based solely on his regular marijuana use. The heaviest collateral consequences of any country with legal markets: cannabis users are barred from buying firearms under federal lawnarrow ruling left addiction, nonpresent intoxication and individual proof of danger unresolved; it did not decide purchases or transfers. Non-citizens can be deportedstill face deportation or refusedrefusal of entry,; federally assisted housing can evict, and most employers may still test and fireimpose consequences. Expungement exists in some states onlyvaries by state.

context › consequences › sources

hemani2026, firearms922, norml, ncsl

sources

US Supreme Court — United States v. Hemani, No. 24-1234 (18 June 2026) 18 USC 922 — firearm transfers and possession 21 unchanged

Articles and atlas entries 2

panama-medical-2021 articles/panama-medical-2021.md

text

Panama's Law 242 was sanctioned onof 13 October 2021 created a framework for medicinal and published in the Gaceta Oficial two days latertherapeutic cannabis. Its Article 83 put it into force the day after promulgationIt began a licensing and regulatory process, rather than immediately giving patients a pharmacy where they could obtain a cannabis medicine. The National Assembly had approvedYears separated that legal framework from the billfirst specialist pharmacy.[@1, number 153 of 20192, on 30 August 2019. 3] ## A framework awaiting suppliers The law regulates the medicinalprovided for authorised manufacture and therapeutic useregulated handling of cannabis and its derivatives; it does not touch recreational use. ## What But on 22 July 2023 the law set up The Ministryhealth ministry said that selection of Public Security issues the licences: for importing and exporting cannabismanufacturing licensees was still under way. Cannabis-derived products, were not authorised for selling them, and for using cannabis seeds for planting and cultivation, strictly for medicinal usedistribution or sale in Panama. Licence holders must show moral and economic solvency, and the authorities may inspect their books. Patients enter a registryThe ministry also warned that requires a certificate fromhandling outside the treating doctor, details ofmedical law remained subject to the illness, the doses and how often they are takenPenal Code. | Sale (Article 16) | Rule | |---|---| | Where | Authorised, certified pharmacies and public health facilities | | Supply | From certified laboratories[@2] That notice matters when dating access: the existence of a statute in 2021 did not mean a patient could buy a product through an operating licensed to make cannabis derivatives | | Home delivery and internet sales | Prohibited | | Health food shops, professional offices | Prohibited |channel in 2023.[@2] ## Slow to start The law gaveNew rules and a first pharmacy Executive Decree 6 of 4 April 2025 revised the government 90 days to write regulationsrules implementing Law 242. They came on 30 August 2022, when President Laurentino Cortizo signed two executive decrees. One regulates use andThe drug directorate describes its purpose as supervised access for therapeutic, medical, veterinary, scientific and research purposesuses, with import controls and tracing from cultivation toalongside the point of salerules for controlled substances. The other creates[@1] On 22 January 2026 a national directorate inside the Ministry of Public Securityspecialist cannabis pharmacy opened, staffed by police and border officers, which sets security requirements and approves licence applications. Three years later the health ministry was still completing the frameworkreported seven commercial licences. A resolution published on 16 October 2025 added cannabisThose developments belong to the official listlater implementation of the law, rather than to its original enactment.[@3] ## CBD and patient registration The drug directorate's published product register lists Cannapharma cannabidiol products dated 22 January 2026. That CBD listing does not establish that controlled substances permittedTHC medicines were being dispensed.[@4] On 2 June the ministry announced approved forms for medicalpatients and scientific useauthorised companions. A qualified doctor must certify the treatment, a stepincluding diagnosis, dose and duration. Certification starts the ministry described as part ofregistration process; after verification and approval, the "progressive implementation" of Law 242patient receives a card for obtaining medicines at authorised pharmacies. The ministry repeated that recreational use remains prohibitedannouncement said the forms and that cannabis mayinstructions would be given only on a medical prescriptionpublished shortly.[@5] ## WhyHow the index moved Before Law 242 Panama had no lawful cannabis of any kind. records access The [2021 event](/history/panama-medical-2021/) remains in the history as an enabling law created a legal channel. The [2023 sales prohibition](/history/panama-sales-still-prohibited-2023/), pharmacies supplied by licensed producers[first pharmacy](/history/panama-first-cannabis-pharmacy-2026/) and [registration announcement](/history/panama-patient-registration-2026/) show the subsequent steps.[@2, for registered patients3, so5] [Panama's profile](/country/pa/) keeps medical status limited and access rose fromat zero. The other scores did not move: possession, growingA pharmacy opening and supply outsidea CBD register cannot establish the licensed medical system stay criminal offencesworking THC medicine route that the earlier score increase had assumed.[@3,4]

model

opusgpt-5.56

sources

DNFD — Executive Decree 6 of 4 April 2025, regulating Law 242 of 2021 MINSA — cannabis-product distribution and sale remain prohibited (22 July 2023) TVN — first specialist pharmacy and seven commercial licences (22 January 2026) DNFD — medical cannabis product register (reviewed 25 October 2026) MINSA — patient certification and registration forms (2 June 2026) Panamá América — A partir de hoy empieza a regir el uso medicinal y terapéutico del cannabis en Panamá (October 2021) El Mercurio (EFE) — Panamá reglamenta ley sobre el uso medicinal y terapéutico del cannabis (1 September 2022) TVN — Panamá incluye el cannabis en el listado oficial de sustancias controladas para uso médico y científico (16 October 2025)

trinidad-decriminalisation-2019 articles/trinidad-decriminalisation-2019.md

text

Trinidad and Tobago rewrote its cannabis law in a fortnight at the end of 2019. The Dange … n 23 December. It took a country where possession could mean years in prison to one where an adult may hold an ounceordinary personal possession of 30 g and growgrowing four plants are exempt, while specified locations remain criminal.[@1,2] ## The newordinary quantity tiers | Amount of cannabis | Consequence | |---|---| | Up to 30 g, or 5 g of resin | noexempt from ordinary possession offence; location restrictions still apply | | Up to four growing plants | no offence | | More than 30 g and up to 60 g | an offence … same act raised several of their maximum fines, some to three million dollars. ## Where it may not be usedpossession remains a crime Smoking or using cannabis in a public place is an offence handled by the same 2,000-doll … ation, sport or culture, and for driving a vehicle, aircraft or ship under its influence. The possession offence applies even below the ordinary 30 g or 5 g allowance: quantity alone does not protect someone in those settings.[@1] ## Old cases The act reaches back. - A person charged before it came into force with pos … 0 | 1 | | Consumption | 1 | 3 | Access stays at 0: there is still nowhere lawful to buy.

Code, design and documents 7 files

docs/DATA-MAINTENANCE.md +16 −0
@@ -1507,2 +1507,18 @@ and the historical enforcement deduction moves from 2015 to March 1999. The
 at 2, with primary-law treatment, testing and deportation details in the profile.
 Earlier cannabis coverage and the aggregate first-restriction estimate remain open.
+
+### Mixed legal products and maximum penalties
+
+Use `recreational: death` wherever an in-force law permits death for a cannabis offence,
+including a qualifying repeat offence, even if another preparation has a lawful route.
+This status takes precedence on the law map and in the homepage count. Explain the
+lawful preparation separately in the summary, segments and quick answers. India’s bhang
+shops coexist with NDPS section 31A; neither fact cancels the other. Do not infer a death
+penalty from a context heading alone: it may discuss an abolished or excluded penalty.
+
+For medical access, date a score increase to an operating route for obtaining the relevant
+cannabis product, rather than enactment, production licences or a patient-registry proposal.
+CBD-only sales do not establish access to psychoactive cannabis. A framework still being
+implemented can retain `medical: limited` with access zero. Greece’s finished prescription
+products reached patients in February 2024; Panama’s 2021 framework and 2026 CBD listings
+alone do not establish a working THC medicine route.

docs/research/issues-128-136-2026-10-25.md +72 −0
@@ -0,0 +1,72 @@
+# Corrections for issues 128–136
+
+Reviewed 25 October 2026 against DATA-MAINTENANCE.md, WRITING.md and segment definitions.
+The two existing Panama and Trinidad reform articles are corrected; no unrelated Madagascar research is included. Source archive changes belong
+to the background archiver and are excluded from this commit.
+
+- **128, Panama:** MINSA's 22 July 2023 notice explicitly says cannabis-derived products
+  were not authorised for distribution or sale. DNFD's decree page identifies Executive
+  Decree 6 of 4 April 2025 as the revised framework. TVN's 22 January 2026 report confirms
+  the first specialist pharmacy and seven licences. The current DNFD register, opened
+  on the review date, lists Cannapharma CBD products dated 22 January; it does not establish
+  controlled THC availability. MINSA's 2 June 2026 announcement describes approved patient
+  certification/registration forms and says publication would follow. Keep the framework,
+  pharmacy and implementation events; remove the 2021 access score and keep current access
+  zero pending evidence of a working relevant medicine route. Medical remains limited.
+- **129, Greece:** Lavipharm's own 23 February 2024 release and the Health Ministry's
+  27 February first-patient meeting establish actual supply in February. Use month precision,
+  rather than assigning a first dispensing day from a launch announcement. Move the access
+  increase from the 2018 framework to the existing 2024 event; present score unchanged.
+- **130, Lithuania:** VMVT's current hemp-food guidance distinguishes 0.3% source plants
+  from the general 0.2% total-THC finished-goods ceiling and lower category limits. The
+  State Plant Service's 2024 two-page growing guide confirms gardening density/area,
+  certified seeds, notification/labels, journal and restrictions on marketing gardeners'
+  products. Its 6 June 2023 announcement expressly dates 0.3% growing permission to
+  1 May 2023. Use that operational date, not the amendment's adoption date or the earlier
+  agency proposal for January. E-Seimas' current law and amendment URLs blocked direct
+  retrieval; agency texts are the actual sources read. Correct the old history wording
+  which incorrectly described a general finished-product increase to 0.3% in 2022.
+- **131, Sweden:** The event already existed, dated 14 July 2026. Replace its Wikipedia
+  source with the government's 11 June announcement, which explicitly names delta-9-THCA-A
+  and the effective date. Add the profile detail and unscored reason; do not duplicate it.
+- **132, Kenya:** Sections 7–10 distinguish convicted owners/consenting owners, innocent
+  owners, government land and protected interests. The Kenya Law endpoint returned 403;
+  read the statutory reproduction at Ubutabera and retain the profile's Kenya Law citation.
+  No enforcement score changes. The forfeiture account is conditional, not a blanket rule.
+- **133, India:** NCB's government-hosted NDPS text, printed p. 24, section 31A, confirms
+  hashish 20 kg and THC 500 g plus the 2014 discretionary-death amendment. DOR also confirms
+  death for some repeat offences. Apply maximum-penalty precedence through the existing
+  `recreational: death` status; this feeds the law map, count, filters and exports. Preserve
+  bhang and all six numeric scores. Audit of other non-death profiles with a death context
+  found Nigeria discussing repeal and South Sudan discussing exclusions, not two more
+  automatic positive classifications.
+- **134, US:** Read the Supreme Court's actual Hemani opinion, No. 24-1234, especially
+  printed pp. 18–19, and 18 USC 922(d)(3)/(g)(3). Date the event 18 June 2026. The narrow
+  firearm-possession holding is not a repeal of transfer restrictions or every application
+  of the unlawful-user provision. Add unscored collateral-consequence history.
+- **135, Trinidad and Tobago:** Read the enacted Act 24/2019, especially inserted
+  sections 5A–5D. Section 5C(b) is the missing children/location offence; 5A public use has
+  a distinct fine/ticket scheme. The Legal Aid page is helpful but overgeneralises the
+  500-metre trafficking presumption and prints $250 instead of $250,000 for section 5C;
+  the statute controls. Keep the section 5(2) exception distinct. Override quick answers
+  so they cannot say “Nothing” merely from the enforcement score. Retain numeric scores
+  for ordinary permitted possession; qualify profile and 2019 history. The 2026 age bill
+  remains a proposal in the existing history, not an applied law change.
+- **136, charts:** EUDA drug-law-offence methods explicitly distinguish offences/persons
+  and reporting stages. Replace cross-country ranking with alphabetical within-country
+  latest-two-year changes. Replace punishment/care scatter with separate dated counts;
+  exclude Croatia's treatment stock, mark Sweden's combined sources, describe overlap.
+  Wastewater is a sampled-catchment aggregate: every mark exposes site count, served
+  population and year in accessible labels/tooltips and a visible coverage disclosure.
+  Use the existing normalized `served` field, not the raw CSV column name `population`.
+  Match price and gross January minimum wage in the same year. For THC/euro retain only
+  the four endpoint-matched countries (ES, NL, PT, TR), and plot years with all four;
+  disclose bridging gaps and the unrestricted 9-to-16 reporting pool. Wikipedia uses
+  global language-edition pageviews, not national residents or unique readers; law ticks
+  show coincidence without a causal claim.
+
+Validation: all 54 country/history/chart tests passed; the full static build produced
+4,135 pages. Export assertions confirmed India’s death status, Panama access zero and
+Greece’s February 2024 step. Rendered citation targets passed. Chrome checks at 1280 px
+and 390 px verified the corrected tooltips, Trinidad quick answers and absence of
+horizontal overflow. The final two article revisions were included in that build.

scripts/chart-semantics.test.cjs +47 −0
@@ -48,2 +48,49 @@ test('chart claims match categorical religion data and observational price data'
   assert.match(page, /Across \{priced.length\} countries, cannabis price and the score show/);
 });
+
+const csv = (file) => {
+  const [head, ...lines] = fs.readFileSync(`datasets/${file}`, 'utf8').trim().split(/\r?\n/).map((r) => r.split(','));
+  return lines.map((r) => Object.fromEntries(head.map((h, i) => [h, h === 'country' ? r[i] : r[i] === '' ? null : +r[i]])));
+};
+
+test('affordability uses an actual common price/wage year, including stale-price countries (#136)', async () => {
+  const { matchedPriceWage } = await semantics;
+  const prices = csv('euda-cannabis-prices.csv'), wages = csv('eurostat-minimum-wages.csv');
+  let n = 0;
+  for (const id of new Set(prices.map((r) => r.country))) {
+    const pair = matchedPriceWage(prices.filter((r) => r.country === id), wages.filter((r) => r.country === id));
+    if (pair) { n++; assert.equal(pair.price.year, pair.wage.year); }
+    if (['lv', 'ie', 'lt'].includes(id) && pair) assert.ok(pair.wage.year < 2026);
+  }
+  assert.ok(n > 10);
+  assert.equal(matchedPriceWage([{ year: 2018, herb_eur: 7 }], [{ year: 2026, monthly_eur: 780 }]), undefined);
+});
+
+test('THC trend holds the endpoint cohort constant and omits incomplete years (#136)', async () => {
+  const { matchedThcPanel } = await semantics;
+  const prices = csv('euda-cannabis-prices.csv'), potency = csv('euda-cannabis-potency.csv');
+  const years = Array.from({ length: 23 }, (_, i) => 2002 + i).map((year) => ({ year, rows: prices.filter((p) => p.year === year && p.herb_eur > 0).flatMap((p) => {
+    const t = potency.find((t) => t.country === p.country && t.year === year && t.herb_thc > 0);
+    return t ? [{ c: { id: p.country }, mg: t.herb_thc * 10 / p.herb_eur }] : [];
+  }) }));
+  assert.equal(years[0].rows.length, 9);
+  assert.equal(years.at(-1).rows.length, 16);
+  const panel = matchedThcPanel(years);
+  assert.deepEqual([...panel.cohort].sort(), ['es', 'nl', 'pt', 'tr']);
+  assert.ok(panel.years.length > 2);
+  for (const y of panel.years) assert.deepEqual(y.rows.map((r) => r.c.id).sort(), [...panel.cohort].sort());
+});
+
+test('police comparisons are within country and treatment stocks are excluded (#136)', async () => {
+  const { policeTrend, annualTreatment } = await semantics;
+  assert.deepEqual(policeTrend([{ year: 2023, offences: 100 }, { year: 2024, offences: 150 }]).change, 50);
+  assert.equal(policeTrend([{ year: 2024, offences: 150 }]), null);
+  assert.equal(annualTreatment({ id: 'HR', datasets: { treatment: { cannabis: 474 } } }), null);
+  const page = fs.readFileSync('src/pages/charts.astro', 'utf8');
+  assert.doesNotMatch(page, /punishSpread|punishMore|Treats more than it punishes|read the order, not the decimals|its people looked it up/);
+  assert.match(page, /not geolocated/);
+  assert.match(page, /w\.r\.served/);
+  assert.match(page, /w\.r\.cities/);
+  assert.match(page, /w\.r\.year/);
+  assert.match(page, /Croatia is excluded/);
+});

scripts/profile-claims.test.mjs +48 −0
@@ -17,4 +17,5 @@ const texts = files.map((file) => [path.relative(root, file), fs.readFileSync(fi
 
 const CLAIMS = [
+  { claim: /Before Law 242 Panama had no lawful cannabis of any kind/i, why: "the 2021 framework did not establish operational supply (#128)" },
   // Malta (2021) and Germany (2024) license non-profit associations: issue #127
   { claim: /prohibited throughout the European Union/i, why: "clubs are not prohibited EU-wide: Malta and Germany license associations (#127)" },
@@ -31,2 +32,49 @@ test("no profile, article or history entry repeats a sentence known to be false"
   assert.deepEqual(found, []);
 });
+
+import yaml from 'js-yaml';
+const country = (id) => yaml.load(fs.readFileSync(path.join(root, 'countries', `${id}.yaml`), 'utf8'));
+const events = () => yaml.load(fs.readFileSync(path.join(root, 'changes.yaml'), 'utf8'));
+
+test('India remains visible to death-penalty filters while bhang and scores stay explicit (#133)', () => {
+  const india = country('in');
+  assert.equal(india.recreational, 'death');
+  assert.match(india.summary, /bhang/i);
+  assert.match(india.context.death_penalty.text, /20 kg.*500 g/);
+  assert.deepEqual(india.scores, { possession: 1, cultivation: 1, enforcement: 2, sharing: 1, consumption: 1, access: 2 });
+  const home = fs.readFileSync(path.join(root, 'src/components/HomePage.astro'), 'utf8');
+  assert.match(home, /count\(\(c\) => c.rec === "death"\)/);
+  assert.match(home, /death: 0/);
+});
+
+test('medical access dates actual supply rather than enabling statutes (#128–129)', () => {
+  const history = events(), get = (id) => history.find((e) => e.id === id);
+  assert.equal(get('panama-medical-2021').before, undefined);
+  assert.equal(country('pa').scores.access, 0);
+  assert.equal(get('greece-medical-2018').before, undefined);
+  assert.equal(get('greece-prescriptions-2024').date, '2024-02');
+  assert.equal(get('greece-prescriptions-2024').before.access, 0);
+  assert.equal(country('gr').scores.access, 1);
+});
+
+test('hemp crop and product limits and conditional Kenyan forfeiture remain distinct (#130, #132)', () => {
+  const hemp = country('lt').context.planting.text;
+  assert.match(hemp, /0.3% THC/);
+  assert.match(hemp, /finished hemp goods.*0.2% total THC/);
+  const kenya = country('ke');
+  assert.match(kenya.segments.cultivation.text, /without that involvement.*returns to the owner/);
+  assert.match(kenya.context.consequences.text, /notice.*heard/);
+  assert.doesNotMatch(kenya.segments.cultivation.text, /court must also order the land forfeited/);
+});
+
+test('Trinidad quick answers retain the location offence and US firearm claims retain Hemani (#134–135)', () => {
+  const tt = country('tt');
+  assert.equal(tt.answers.carry.answer, 'limited');
+  assert.match(tt.answers.caught.text, /school bus.*five years/);
+  assert.match(tt.segments.possession.text, /5C\(b\).*TT\$250,000.*five years/);
+  assert.match(tt.segments.possession.text, /5\(7\).*excludes.*5\(2\)/);
+  const us = country('us/index').context.consequences.text;
+  assert.match(us, /Hemani/);
+  assert.match(us, /did not decide purchases or transfers/);
+  assert.match(country('se').context.products.text, /14 July 2026/);
+});

src/lib/chart-semantics.js +28 −0
@@ -28,2 +28,30 @@ export const DEVELOPMENT_MEASURES = [
   { label: "Enrolled in higher education", field: "higher_education", href: null },
 ];
+
+// Never combine a historical street price with a later wage: use the latest common year.
+export function matchedPriceWage(prices = [], wages = []) {
+  return prices.filter((p) => p.year >= 2018 && p.herb_eur > 0)
+    .map((price) => ({ price, wage: wages.find((w) => w.year === price.year && w.monthly_eur > 0) }))
+    .filter((p) => p.wage).sort((a, b) => b.price.year - a.price.year)[0];
+}
+
+// Hold membership constant at the countries reporting at both endpoints. Omit incomplete years.
+export function matchedThcPanel(years) {
+  if (!years.length) return { cohort: [], years: [] };
+  const last = new Set(years.at(-1).rows.map((r) => r.c.id));
+  const cohort = years[0].rows.map((r) => r.c.id).filter((id) => last.has(id));
+  return { cohort, years: years.map((y) => ({ ...y, rows: y.rows.filter((r) => cohort.includes(r.c.id)) }))
+    .filter((y) => cohort.length > 0 && y.rows.length === cohort.length) };
+}
+
+export function policeTrend(rows = []) {
+  const usable = rows.filter((r) => r.year >= 2020 && Number.isFinite(r.offences)).sort((a, b) => a.year - b.year);
+  if (usable.length < 2) return null;
+  const first = usable.at(-2), last = usable.at(-1);
+  return { first, last, change: first.offences > 0 ? (last.offences / first.offences - 1) * 100 : null };
+}
+
+// Croatia reports a stock of all clients, not the annual flow used in this table.
+export function annualTreatment(country) {
+  return country.id.toLowerCase() === 'hr' ? null : country.datasets.treatment;
+}

src/pages/charts.astro +61 −91
@@ -5,5 +5,5 @@
 // Every chart leads on: a year to the history, a country to its profile, a region to the rankings,
 // a dataset to its map. A small script at the end adds hover cards with the detail behind a mark.
-import { firstRestrictionSample, HISTORY_TOPICS, topicCounts, DEVELOPMENT_MEASURES } from "../lib/chart-semantics.js";
+import { firstRestrictionSample, HISTORY_TOPICS, topicCounts, DEVELOPMENT_MEASURES, matchedPriceWage, matchedThcPanel, policeTrend, annualTreatment } from "../lib/chart-semantics.js";
 import Base from "../layouts/Base.astro";
 import AverageChart from "../components/AverageChart.astro";
@@ -259,15 +259,12 @@ const PX1 = Math.ceil(Math.max(...priced.map((p) => p.x)) / 10) * 10, PY1 = Math
 const priceNamed = pickLabels([...priced].sort((a, b) => Math.abs(b.y - median(priced.map((q) => q.y))) - Math.abs(a.y - median(priced.map((q) => q.y)))).map((p) => ({ key: p.c.id, x: pct(p.x, 0, PX1), y: 100 - pct(p.y, 0, PY1) })));
 
-// ── Who gets punished: cannabis offences recorded per 1,000 people who use it ──
+// ── Within-country changes in recorded use/possession counts ──
 const OFF = DATASETS.cannabis_offences;
-const punished = countries.map((c) => ({ c, r: latestSince(c.series.cannabis_offences, "offences", 2020) }))
-  .filter((p) => p.r && c_users(p.c) > 0).map((p) => ({ ...p, rate: (p.r.offences / c_users(p.c)) * 1000 })).sort((a, b) => b.rate - a.rate);
-function c_users(c) { return c.use && !c.use.estimate ? c.use.users : 0; }
-const punishMax = punished[0].rate;
-const punishSpread = Math.round(punished[0].rate / punished.at(-1).rate);
+const punished = countries.map((c) => ({ c, trend: policeTrend(c.series.cannabis_offences) }))
+  .filter((p) => p.trend).sort((a, b) => a.c.name.localeCompare(b.c.name));
 
 // ── Stronger, cheaper: how much THC a euro buys in Europe, year by year ──
 // A gram at p% THC holds p × 10 mg; a euro buys that divided by the price.
-const thcYears = [];
+const reportingThcYears = [];
 for (let y = 2002; y <= NOW; y++) {
   const rows = countries.map((c) => {
@@ -275,6 +272,8 @@ for (let y = 2002; y <= NOW; y++) {
     return pr && th ? { c, mg: (th * 10) / pr, th, pr } : null;
   }).filter(Boolean);
-  if (rows.length >= 5) thcYears.push({ year: y, rows, mg: median(rows.map((r) => r.mg)), th: median(rows.map((r) => r.th)), pr: median(rows.map((r) => r.pr)) });
+  if (rows.length >= 5) reportingThcYears.push({ year: y, rows, mg: median(rows.map((r) => r.mg)), th: median(rows.map((r) => r.th)), pr: median(rows.map((r) => r.pr)) });
 }
+const matchedThc = matchedThcPanel(reportingThcYears);
+const thcYears = matchedThc.years.map((t) => ({ ...t, mg: median(t.rows.map((r) => r.mg)), th: median(t.rows.map((r) => r.th)), pr: median(t.rows.map((r) => r.pr)) }));
 const T0 = thcYears[0].year, T1 = thcYears.at(-1).year;
 const MG1 = Math.ceil(Math.max(...thcYears.map((t) => t.mg)) * 1.6 / 10) * 10;
@@ -282,12 +281,9 @@ const mgOf = (v) => 100 - pct(Math.min(v, MG1), 0, MG1);
 const thcLine = (pts) => pts.map(([x, v], i) => `${i ? "L" : "M"}${pct(x, T0, T1).toFixed(2)},${mgOf(v).toFixed(2)}`).join("");
 const thcMedianPath = thcLine(thcYears.map((t) => [t.year, t.mg]));
-// a faint line for each country with at least five years of both figures
-const thcCountries = [...new Set(thcYears.flatMap((t) => t.rows.map((r) => r.c)))]
-  .map((c) => ({ c, pts: thcYears.flatMap((t) => t.rows.filter((r) => r.c === c).map((r) => [t.year, r.mg])) })).filter((x) => x.pts.length >= 5);
-const thcFirst = thcYears.slice(0, 3), thcLast = thcYears.slice(-3);
-const mgThen = mean(thcFirst.map((t) => t.mg)), mgNow = mean(thcLast.map((t) => t.mg));
-const thThen = mean(thcFirst.map((t) => t.th)), thNow = mean(thcLast.map((t) => t.th));
-const prThen = mean(thcFirst.map((t) => t.pr)), prNow = mean(thcLast.map((t) => t.pr));
-const mgChange = mgNow / mgThen - 1;
+const thcCountries = matchedThc.cohort.map((id) => {
+  const c = countries.find((c) => c.id === id);
+  return { c, pts: thcYears.flatMap((t) => t.rows.filter((r) => r.c.id === id).map((r) => [t.year, r.mg])) };
+});
+const mgThen = thcYears[0].mg, mgNow = thcYears.at(-1).mg;
 
 // ── Criminalising a crop: countries that grow hemp commercially, and their law on cannabis ──
@@ -345,5 +341,4 @@ const WX1 = Math.ceil(Math.max(...sewage.map((w) => w.x)) / 10) * 10;
 const sewageFit = corr(sewage.map((w) => ({ x: w.x, y: Math.log10(w.y) })));
 const sewageNamed = pickLabels([...sewage].sort((a, b) => b.y - a.y).map((w) => ({ key: w.c.id, x: pct(w.x, 0, WX1), y: wy(w.y) })));
-const sewageTop = [...sewage].sort((a, b) => b.y - a.y)[0], sewageLow = [...sewage].sort((a, b) => a.y - b.y)[0];
 
 // ── Canada after legalisation: where people get cannabis, and what governments earn ──
@@ -427,6 +422,8 @@ const usThen = usScore.find((r) => r.year === +pollLast.date.slice(0, 4))?.score
 const MW = DATASETS.minimum_wage;
 const workGram = countries.map((c) => {
-  const price = latestSince(c.series.prices_europe, "herb_eur", 2018), wage = latestSince(c.series.minimum_wage, "monthly_eur", 2020);
-  return price && wage ? { c, price: price.herb_eur, priceYear: price.year, wage: wage.monthly_eur, wageYear: wage.year, minutes: (price.herb_eur / (wage.monthly_eur / 173.3)) * 60 } : null;
+  const pair = matchedPriceWage(c.series.prices_europe, c.series.minimum_wage);
+  if (!pair) return null;
+  const { price, wage } = pair;
+  return { c, price: price.herb_eur, priceYear: price.year, wage: wage.monthly_eur, wageYear: wage.year, minutes: (price.herb_eur / (wage.monthly_eur / 173.3)) * 60 };
 }).filter(Boolean).sort((a, b) => b.minutes - a.minutes);
 const workMax = workGram[0]?.minutes ?? 1;
@@ -716,12 +713,7 @@ const P0 = 1990;
 const TREAT = DATASETS.treatment;
 const punishTreat = countries.map((c) => {
-  const off = latestSince(c.series.cannabis_offences, "offences", 2020), tr = c.datasets.treatment;
-  const users = c.use && !c.use.estimate ? c.use.users : 0;
-  return off && tr && users ? { c, punish: (off.offences / users) * 1000, treat: (tr.cannabis / users) * 1000, offYear: off.year, trYear: tr.year, share: tr.cannabis_share } : null;
-}).filter(Boolean);
-const PT0 = -1, PT1 = 3; // 0.1 to 1,000 per 1,000 users, tenfold steps
-const ptx = (v) => pct(Math.log10(Math.max(v, 0.1)), PT0, PT1), pty = (v) => 100 - pct(Math.log10(Math.max(v, 0.1)), PT0, PT1);
-const punishMore = punishTreat.filter((d) => d.punish > d.treat);
-const ptNamed = pickLabels([...punishTreat].sort((a, b) => Math.abs(Math.log10(b.punish / b.treat)) - Math.abs(Math.log10(a.punish / a.treat))).map((d) => ({ key: d.c.id, x: ptx(d.punish), y: pty(d.treat) })), 20);
+  const off = latestSince(c.series.cannabis_offences, "offences", 2020), tr = annualTreatment(c);
+  return off && tr ? { c, punish: off.offences, treat: tr.cannabis, offYear: off.year, trYear: tr.year, share: tr.cannabis_share } : null;
+}).filter(Boolean).sort((a, b) => a.c.name.localeCompare(b.c.name));
 
 // ── In the news: the share of each country's news articles that mention cannabis ──
@@ -772,5 +764,5 @@ const chartData = {
   moral: Object.fromEntries(moral.map((m) => [m.c.slug, [m.c.flag + " " + m.c.name, m.d.acceptable, m.d.not_moral, m.d.unacceptable, Math.round(m.y), tierOf(m.y).name, REC_LABEL[m.c.rec]]])),
   price: Object.fromEntries(priced.map((p) => [p.c.slug, [p.c.flag + " " + p.c.name, p.y, p.r.year, Math.round(p.x), tierOf(p.x).name]])),
-  punish: Object.fromEntries(punished.map((p) => [p.c.slug, [p.c.flag + " " + p.c.name, Math.round(p.rate), p.r.offences, p.r.year, p.c.users ?? p.c.use.users, p.c.use.prevalence]])),
+  punish: Object.fromEntries(punished.map((p) => [p.c.slug, [p.c.flag + " " + p.c.name, p.trend.first.offences, p.trend.first.year, p.trend.last.offences, p.trend.last.year, p.trend.change]])),
   thc: thcYears.map((t) => [t.year, +t.mg.toFixed(1), +t.th.toFixed(1), +t.pr.toFixed(2), t.rows.length]),
   thcRange: [T0, T1, MG1],
@@ -779,5 +771,5 @@ const chartData = {
   research: Object.fromEntries(research.map((r) => [r.c.slug, [r.c.flag + " " + r.c.name, fmtRate(r.per), r.total, Math.round(r.c.raw), tierOf(r.c.raw).name]])),
   easy: Object.fromEntries(easy.map((e) => [e.c.slug, [e.c.flag + " " + e.c.name, e.d.easy, e.d.easy_boys, e.d.easy_girls, Math.round(e.x), tierOf(e.x).name]])),
-  sewage: Object.fromEntries(sewage.map((w) => [w.c.slug, [w.c.flag + " " + w.c.name, w.y, w.r.year, w.r.cities, Math.round(w.x), tierOf(w.x).name, w.trend]])),
+  sewage: Object.fromEntries(sewage.map((w) => [w.c.slug, [w.c.flag + " " + w.c.name, w.y, w.r.year, w.r.cities, Math.round(w.x), tierOf(w.x).name, w.trend, w.r.served]])),
   sourcing: sourcing.map((r) => [r.year, ...SOURCE_KINDS.map((k) => r[k.id] ?? null)]),
   sourceLabels: SOURCE_KINDS.map((k) => [k.label, k.color]),
@@ -831,5 +823,5 @@ const sections = [
   ["buy-grow", "Buy it or grow it"],
   ["punished", "Who the police record"],
-  ["punish-or-treat", "Punish or treat"],
+  ["punish-or-treat", "Police records and treatment entries"],
   ["use", "Use and the law"],
   ["teen-trends", "Did prohibition protect children?"],
@@ -1303,46 +1295,25 @@ const kick = (id) => { const i = sections.findIndex(([x]) => x === id); return `
     <section class="ch" id="punished">
       <p class="ch-kicker"><a href="#punished">{kick("punished")}</a></p>
-      <h2>{punished[0].c.name} records {Math.round(punished[0].rate)} offences of cannabis use or possession for every 1,000 people who use it; {punished.at(-1).c.name}, {fmtRate(punished.at(-1).rate)}</h2>
-      <p class="ch-dek">How often the law reaches the people who use cannabis: offences of using or possessing cannabis for one's own use that the police record in a year, divided by the number of adults who used it in the past year. Cannabis only, and only use or possession: not dealing or growing for sale, and not other drugs. An offence is not a conviction: depending on the country it may end in a fine, a caution, treatment or a criminal case, and some countries count offenders rather than offences. A {punishSpread}-fold gap, with laws on paper that often look alike.</p>
-      <ol class="ch-bars" data-no-preview>
-        {punished.map((p) => (
-          <li>
-            <a href={`${base}country/${p.c.slug}/#datasets`} data-punish={p.c.slug}>
-              <span class="ch-bar-name">{p.c.flag} {p.c.name}</span>
-              <span class="ch-bar-track"><span class="ch-bar" style={`width:${(p.rate / punishMax) * 100}%;--c:${tierColor(p.c.raw)}`}></span></span>
-              <span class="ch-bar-num">{fmtRate(p.rate)}</span>
-            </a>
-          </li>
-        ))}
-      </ol>
-      <p class="ch-source">Offences: {OFF.title}, latest year since 2020. Users: the <a href={`${base}sources/#dataset-cannabis_use`}>UNODC</a> estimate of adults who used cannabis in the past year. Bars coloured by the country's band. Countries record and define offences differently, so read the order, not the decimals. <a href={`${base}sources/#dataset-cannabis_offences`}>About the dataset</a>.</p>
-      <p class="ch-more"><a href={`${base}map/cannabis-offences-europe/`}>Offences on the map →</a> <a href={`${base}map/drug-possession-police/`}>Possession arrests worldwide →</a></p>
+      <h2>Cannabis police records: how each country's latest count changed</h2>
+      <p class="ch-dek">Compare each country with its own previous reporting year. These are recorded use or possession offences or persons, depending on the country, rather than punishments. Different counting units and procedural stages make both cross-country ranks and magnitudes unreliable as enforcement comparisons. Rows are alphabetical.</p>
+      <ul class="ch-bars" data-no-preview>
+        {punished.map((p) => <li><a href={`${base}country/${p.c.slug}/#datasets`} data-punish={p.c.slug}>
+          <span class="ch-bar-name">{p.c.flag} {p.c.name}</span>
+          <span>{num(p.trend.first.offences)} ({p.trend.first.year}) → {num(p.trend.last.offences)} ({p.trend.last.year})</span>
+          <span class="ch-bar-num">{p.trend.change == null ? "—" : `${p.trend.change > 0 ? "+" : ""}${p.trend.change.toFixed(1)}%`}</span>
+        </a></li>)}
+      </ul>
+      <p class="ch-source">{OFF.title}. Latest two available years since 2020; reporting changes can also affect a country's trend. <a href="https://www.euda.europa.eu/data/stats2026/methods/dlo_en">EUDA counting methods</a>. <a href={`${base}sources/#dataset-cannabis_offences`}>About the dataset</a>.</p>
     </section>
     {chapterAt.has("punish-or-treat") && <h2 class="ch-chapter">{chapterAt.get("punish-or-treat")}</h2>}
     <section class="ch" id="punish-or-treat">
       <p class="ch-kicker"><a href="#punish-or-treat">{kick("punish-or-treat")}</a></p>
-      <h2>Punish or treat: in {punishMore.length} of {punishTreat.length} European countries, the police record more cannabis offences than people enter treatment for cannabis</h2>
-      <p class="ch-dek">Each dot is a country, both figures per 1,000 people who use cannabis. Across: offences of cannabis use or possession the police record. Up: people who enter drug treatment mainly for cannabis. Above the diagonal a country treats more than it records; below it, it records more than it treats. Some of those in treatment were sent there by a court. Both scales rise tenfold at each line.</p>
-      <div class="ch-frame ch-scatter ch-wide-y ch-ptreat" data-no-preview>
-        <div class="ch-y">{[0.1, 1, 10, 100, 1000].map((t) => <span style={`top:${pty(t)}%`}>{num(t)}</span>)}</div>
-        <div class="ch-plot">
-          <svg viewBox="0 0 100 100" preserveAspectRatio="none" aria-hidden="true">
-            {[0.1, 1, 10, 100, 1000].map((t) => <><line class="ch-grid" x1="0" x2="100" y1={pty(t)} y2={pty(t)} /><line class="ch-grid" y1="0" y2="100" x1={ptx(t)} x2={ptx(t)} /></>)}
-            <line class="ch-diag" x1="0" y1="100" x2="100" y2="0" />
-          </svg>
-          <span class="ch-corner tl">Treats more than it punishes</span>
-          <span class="ch-corner br">Punishes more than it treats</span>
-          {punishTreat.map((d) => (
-            <a class:list={["ch-dot", { named: ptNamed.has(d.c.id), left: ptx(d.punish) > 75 }]} href={`${base}country/${d.c.slug}/#datasets`} data-ptreat={d.c.slug}
-              style={`left:${ptx(d.punish)}%;top:${pty(d.treat)}%;--c:${tierColor(d.c.raw)}`} aria-label={`${d.c.name}: ${d.punish.toFixed(1)} offences and ${d.treat.toFixed(1)} treatment entrants per 1,000 users`}>
-              {ptNamed.has(d.c.id) && <span>{d.c.name}</span>}
-            </a>
-          ))}
-        </div>
-        <div class="ch-x">{[0.1, 1, 10, 100, 1000].map((t, i) => <span class:list={{ first: i === 0, last: t === 1000 }} style={`left:${ptx(t)}%`}>{num(t)}</span>)}</div>
… 129 more lines
src/styles/global.css +13 −0
@@ -3090,2 +3090,15 @@ a.ch-db-track:hover { background: color-mix(in srgb, var(--text) 6%, transparent
   .gl-field { grid-template-columns: 1fr; gap: 2px; }
 }
+
+/* Dated police counts and separate treatment counts: no common ranking or ratio. */
+.ch-records-table { overflow-x: auto; }
+.ch-records-table table { width: 100%; }
+#punished .ch-bars li a { grid-template-columns: minmax(7rem, 1fr) minmax(9rem, 2fr) 4rem; }
+#work-for-a-gram .ch-bar-num { white-space: nowrap; }
+#work-for-a-gram .ch-bars li a { grid-template-columns: 200px minmax(0, 1fr) 140px; }
+@media (max-width: 600px) {
+  #punished .ch-bars li a { grid-template-columns: 1fr auto; }
+  #punished .ch-bars li a > span:nth-child(2) { grid-column: 1; font-size: .75rem; }
+  #punished .ch-bar-num { grid-column: 2; grid-row: 1 / 3; }
+  #work-for-a-gram .ch-bars li a { grid-template-columns: 100px minmax(0, 1fr) 115px; }
+}

    ↑↓ to move, ↵ to open.