Code, design and documents 4 files
docs/DATA-MAINTENANCE.md +7 −0
@@ -1673,2 +1673,9 @@ November 1997 repeal-and-reenactment — all read in full. Unscored context:
degrees-based penalties with no mapped segment change. One article covers the
1988 hinge. Today's scores are unchanged.
+
+A [bug-report correction pass](research/bug-issues-144-158-2026-10-26.md) on 26 October 2026
+covers issues #144–158: current possession/growing exceptions, actual medical dispensing,
+seed/hemp commencement, diversion, clubs and a stale homepage history fact. Seven history
+entries record the verified developments; Ukraine's access step now dates first dispensing.
+Illinois and Louisiana state scores were reviewed without inserting state vectors into the
+national US chain. Profile/quick-answer regression checks guard the reported distinctions.
docs/research/bug-issues-144-158-2026-10-26.md +65 −0
@@ -0,0 +1,65 @@
+# Bug corrections #144–158 — 26 October 2026
+
+Read `README.md`, `docs/DATA-MAINTENANCE.md`, `docs/WRITING.md`, the score rubric,
+content schema, quick-answer implementation and existing regression tests. The open bug label
+returned fifteen reports, with no follow-up comments. This review covers current profiles,
+quick answers, the homepage facts and the affected history/article records.
+
+## Sources and scope decisions
+
+The profiles and history entries carry the source links. These are the key locators and
+interpretive limits behind the changes:
+
+| Issue | Evidence and correction |
+| --- | --- |
+| #144 Fiji | Recent committed work had already removed the FCDO mandatory-three-month claim. The visitor paragraph now explicitly states the Sulua guidance reproduced in **Jone Seru v State**, with custody possible in the worst cases. The homepage's absolute no-jail shorthand was also corrected. |
+| #145 India | **Indian Hemp Drugs Commission, vol. I, ch. XIV, para. 556** reproduces the Bengal Board's letter of 29 May 1798. The homepage now describes advice to tax, matching the corrected history and article. It omits unsupported parliamentary enactment and failed-ban claims. |
+| #146 Slovenia | **NIJZ 2025 National Report, PDF pp. 30 and 37**, confirms the general Minor Offences Act removed prison as a possession-misdemeanour sentence in 2005. PDF p. 37 was rendered and inspected. **Celje Higher Court PRp 32/2023, para. 6** gives €41.73–208.65; the profile dates that judicial figure explicitly instead of representing a 2017 range as a newly verified 2026 tariff. The judgment is reproduced from Slovenian public court information. |
+| #147 Illinois | Current **410 ILCS 705/10-10**, source note P.A. 104-463 effective 12 June 2026, gives doubled cumulative caps. The regulator FAQ's possession section agrees; its gifting section retains obsolete quantities, so it supports permission/conditions, not quantities. No obsolete excess-possession tiers are retained. |
+| #148 Louisiana | Read enrolled **Act 305 / HB 568**, especially new R.S. 40:981.3(E); read the existing statute for zone definitions. The consolidated HTML still says E was repealed in 2014 and must be read with the new Act. The legislative bill-history record gives 1 August 2026 commencement. The additional fine is discretionary. |
+| #149 Montana | **16-12-106(1)(c)** supplies plant, property, locking and visibility conditions. The Department of Revenue's **2026 visitor checklist** supplies the express residency/visitor restriction. Residency is attributed to the agency, not quoted as wording in the statutory subparagraph. Medical cardholders have a separate higher allowance. |
+| #150 Tanzania | Obtained final **Act 6 of 2026** from the Attorney General's registry. **Part VIII, ss. 42–43, printed/PDF p. 27**, replaces “excluding” with “including” in the cannabis definition and removes the drug-production purpose condition in s. 11(1)(b). That page was rendered and inspected. Read with **Cap. 95 R.E. 2023 s. 11**, the seed offence shares the existing minimum thirty-year term. The registry records 1 September enactment and 2 October publication/commencement; the signed Act bears **19 September assent**. Scope is Mainland Tanzania. The September presentation stays distinct from October commencement; the old article is updated and sourced throughout. |
+| #151 Missouri | **Constitution XIV §2(4)(24), §2(10)(1)(b)** and **19 CSR 100-1.040(5)(H)** distinguish growth stages and the two-consumer household limit. The regulation uses 14 inches or taller for the larger non-flowering stage; the constitutional wording is “over fourteen”. Both registered consumers must comply with shared-cultivation/address requirements; no unverified separate notice procedure is invented. |
+| #152 New Hampshire | **RSA 318-B:2-c(V), current through July 2025 amendment**, distinguishes first/second, subsequent and fourth qualifying offences; relevant out-of-state convictions can count. A class B misdemeanour remains fine-only. The profile preserves the statute's record-access protection rather than asserting every repeat offence creates a publicly accessible record. |
+| #153 Ukraine | **Health Ministry, 11 June 2026**, confirms actual first dispensing and six operating pharmacies. The 180 licensed locations and seventeen expected additions are not treated as open dispensaries. The first dispensing involved THC capsules; there is no claim of retail flower availability. |
+| #154 South Africa | **Agriculture Department, 1 December 2025**, confirms commencement and the 2% agricultural/industrial crop threshold. Read **Gazette 53707 / R.6852**, definitions and regulation 4, through OCR; the definition page was rendered and inspected. Permits cover seed/seedling/plant/cutting sale and listed cultivation/propagation activities. Agricultural hemp, private personal growing and commercial medical licences are distinct routes. The 2024 Private Purposes Act remains described separately as uncommenced. |
+| #155 Oregon / US | **OHA April 2025 ICAA FAQ, pp. 3–4**, expressly covers members-only businesses and private events at workplaces, while treating private residences separately. The US paragraph no longer invents an Oregon consumption-club licence. Colorado/Nevada hospitality examples retain their existing sources. |
+| #156 Ireland | **Garda announcement, 31 August 2026**, establishes the pilot from 1 September and eligibility/admission/consent requirements. No October uptake count is inferred from the announcement. Old caution statistics do not establish the new scheme's outcomes; the unsupported present-tense “most go to court” sentence is removed. |
+| #157 Türkiye | Read **31 January 2026 product regulation**, especially arts. 4, 5 and 24. Product-specific authorisation is distinct from stock or dispensing. Downloaded **TİTCK overseas active-substance list, 28 September 2026**: rows **YDN02BG1099** (cannabidiol oral solution) and **YDN02BG1098** (THC/CBD mouth spray) are red-prescription entries. This preserves special imports without asserting domestic shelf availability. A missing CBD medicine on a domestic list would not prove no health/support/cosmetic products exist. |
+| #158 Florida | **2026 s. 893.13(3), (6)(a)–(b)** explicitly excludes extracted resin and its derivatives from both small plant-material exceptions. **775.082–083** provide imprisonment/fine caps. Authorised medical products and lawful hemp are distinguished. |
+
+## Score review
+
+- **Illinois:** possession **5 → 6**, reflecting the larger resident cap; sharing **2 → 5**,
+ correcting a pre-existing factual error about lawful adult gifts. The June history event
+ records the cap change and identifies gifting as a correction, not a new June permission.
+- **Louisiana:** enforcement **4 → 2**, since the broad school-zone exception permits custody
+ for small personal amounts. The ordinary outside-zone possession band remains 3.
+- State changes do **not** inject state vectors into the US national chain: the maintenance
+ guide explicitly defines every `before` vector as national. The state entries explain their
+ effect and the unchanged national estimate in `unscored`.
+- **Ukraine:** current access stays **1** (a narrow operational prescription route). Move its
+ access step from the enabling August 2024 framework to verified dispensing in June 2026.
+ The national chain check reports zero flagged steps.
+- **Türkiye:** access stays **0** under the operational-supply criterion: the import list proves
+ an authorised request route, not dispensing or stock. A specific quick answer describes that
+ limited legal route rather than displaying the generic “no legal source” statement.
+- **Ireland:** existing possession 1/enforcement 3 already cover discretionary diversion within
+ continuing criminal prohibition. No observed outcome data support a further point change.
+- Other reviewed scores remain in their rubric bands. Hemp and seed changes remain unscored.
+
+## Validation
+
+Add regression coverage for each reported factual distinction, including homepage facts, quick
+answers, source-date separation and national/subunit history scope. Run the complete answer and
+history tests, the static build, and inspect generated profile/FAQ/export content. Temporary
+research PDFs, OCR and logs live under the ignored dated `tmp/` folder; generated preview output
+is removed after verification. The unrelated source archive staging is preserved.
+
+Final verification: **27/27** answer/profile tests and **39/39** history tests passed. The
+static build completed with **4,219 pages** (including concurrent committed history work).
+Generated quick answers for thirteen affected profiles, national FAQ data, all seven new history
+exports, Tanzania’s seed export, Ukraine’s API and the 2024–2026 access panel were checked.
+A browser check confirmed Louisiana’s prison exception and state history link, and Ukraine’s
+first-dispensing quick answer and score step. The only build notices were pre-existing dataset
+alias notices. The temporary preview tab and server were closed.
scripts/profile-claims.test.mjs +111 −0
@@ -103,2 +103,113 @@ test('Cambodia custodial possession penalties are not classified as typical fine
assert.equal(rubric.levels.find((l) => l.score === 1).text, 'Custodial penalties for users');
});
+
+test('Fiji and Slovenia visitor guidance keeps judicial and superseding-law limits (#144, #146)', () => {
+ const fj = country('fj'), si = country('si');
+ assert.match(fj.context.visitors.text, /100 g.*guidelines favour.*worst cases/);
+ assert.doesNotMatch(fj.context.visitors.text, /any amount.*three.month|mandatory/i);
+ for (const t of [si.segments.possession.text, si.segments.enforcement.text, si.context.visitors.text]) {
+ assert.doesNotMatch(t, /tolars|five days|five-day/);
+ assert.match(t, /2005/);
+ }
+ assert.match(si.segments.possession.text, /€41\.73–208\.65.*2023/);
+ assert.match(si.answers.caught.text, /non-criminal.*removed in 2005/);
+});
+
+test('the 1798 homepage fact stays a Bengal Board recommendation (#145)', () => {
+ const facts = fs.readFileSync(path.join(root, 'src/lib/facts.js'), 'utf8');
+ const fact = facts.split('\n').find((l) => l.includes('kicker: "1798 · India"'));
+ assert.match(fact, /Bengal.*Board recommended taxing/);
+ assert.doesNotMatch(fact, /British Parliament|1838|1871|1877/);
+ assert.equal(events().find((e) => e.id === 'india-bhang-tax-1798').category, 'debate');
+});
+
+test('Illinois adult limits and lawful gifts reach the state profile (#147)', () => {
+ const il = country('us/il');
+ assert.match(il.segments.possession, /60 g.*10 g.*1,000/);
+ assert.match(il.segments.possession, /non-residents have half.*cumulative/);
+ assert.match(il.segments.sharing, /non-commercial gifts.*21\+.*possession limits/);
+ assert.equal(il.scores.sharing, 5);
+ assert.equal(il.scores.possession, 6);
+ const e = events().find((e) => e.id === 'illinois-doubled-possession-limits-2026');
+ assert.equal(e.date, '2026-06-12');
+ assert.equal(e.subunit, 'il');
+ assert.equal(e.before, undefined); // a subunit must not inject state scores into the national chain
+});
+
+test('Louisiana school-zone custody is visible in both quick answers (#148)', () => {
+ const la = country('us/la');
+ assert.match(la.segments.possession, /2,000 feet.*school buses.*colleges/);
+ assert.match(la.answers.carry.text, /school-zone.*one year/);
+ assert.match(la.answers.caught.text, /school-zone.*one year/);
+ assert.equal(la.scores.enforcement, 2);
+ assert.equal(events().find((e) => e.id === 'louisiana-school-zone-marijuana-2026').subunit, 'la');
+});
+
+test('Montana residency and Missouri growth stages survive abbreviated answers (#149, #151)', () => {
+ const mt = country('us/mt'), mo = country('us/mo');
+ assert.match(mt.segments.cultivation, /Montana residents 21\+; visitors may not grow/);
+ assert.match(mt.segments.cultivation, /written permission.*cannabis business/);
+ assert.match(mt.answers.grow.text, /residents 21\+/);
+ assert.match(mo.segments.cultivation, /six flowering.*six non-flowering.*six clones.*18 plants/);
+ assert.match(mo.segments.cultivation, /12 of each stage, 36/);
+ assert.match(mo.answers.grow.text, /six flowering.*six larger non-flowering.*six clones/);
+});
+
+test('Tanzania records enacted seed controls separately from the proposal (#150)', () => {
+ const tz = country('tz'), history = events();
+ assert.equal(tz.context.planting.seeds, 'illegal');
+ assert.equal(tz.context.planting.seeds_trade, 'banned');
+ assert.match(tz.context.planting.text, /2 October 2026.*minimum sentence is thirty years/);
+ assert.doesNotMatch(tz.context.planting.text, /not.*passed|excluding.*seeds/);
+ const e = history.find((e) => e.id === 'tanzania-seed-possession-law-2026');
+ assert.equal(e.date, '2026-10-02');
+ assert.equal(e.checked, true);
+ assert.ok(history.find((e) => e.id === 'tanzania-seed-possession-bill-2026').related.includes(e.id));
+ const article = fs.readFileSync(path.join(root, 'articles/tanzania-seed-possession-bill-2026.md'), 'utf8');
+ assert.doesNotMatch(article, /bill is not law|If the bill passes/);
+});
+
+test('New Hampshire distinguishes criminal status from imprisonment (#152)', () => {
+ const nh = country('us/nh');
+ assert.match(nh.segments.possession, /fourth offence.*class B misdemeanour.*three.*three years/);
+ assert.match(nh.segments.possession, /fine-only, with no jail/);
+ assert.match(nh.answers.carry.text, /fourth.*criminal/);
+ assert.match(nh.answers.caught.text, /criminal.*no jail/);
+});
+
+test('Ukraine access begins at verified dispensing, rather than framework enactment (#153)', () => {
+ const ua = country('ua'), history = events();
+ assert.match(ua.segments.access.text, /11 June 2026.*six operating pharmacies/);
+ assert.doesNotMatch(ua.context.medical.text, /prescriptions depend on imports|not yet.*dispens/i);
+ assert.equal(history.find((e) => e.id === 'ukraine-medical-2024').before, undefined);
+ const first = history.find((e) => e.id === 'ukraine-first-medical-dispensing-2026');
+ assert.equal(first.date, '2026-06-11');
+ assert.equal(first.before.access, 0);
+ assert.equal(ua.scores.access, 1);
+});
+
+test('South African hemp and Oregon premises keep their distinct legal channels (#154, #155)', () => {
+ const za = country('za'), us = country('us/index');
+ assert.match(za.context.production.text, /1 December 2025.*2% delta-9 THC/);
+ assert.doesNotMatch(za.context.black_market.text, /only legal route|everything bought is bought outside the law/);
+ assert.match(us.context.clubs.text, /Oregon does not license.*members-only businesses/);
+ assert.doesNotMatch(us.context.clubs.text, /Oregon permits cannabis social clubs/);
+});
+
+test('Irish referrals and Turkish product permission do not imply legal retail supply (#156, #157)', () => {
+ const ie = country('ie'), tr = country('tr');
+ assert.match(ie.segments.possession.text, /1 September 2026.*over 18.*first drug offence.*consent/);
+ assert.match(ie.answers.caught.text, /discretionary health referral.*remains criminal/);
+ assert.doesNotMatch(ie.segments.enforcement.text, /Most people.*court/i);
+ assert.match(tr.context.medical.text, /special import list.*red prescription.*31 January 2026/);
+ assert.match(tr.context.medical.text, /availability has not been verified/);
+ assert.doesNotMatch(tr.context.medical.text, /distribution.*from 2025/);
+ assert.match(tr.answers.buy.text, /special import route.*stock has not been verified/);
+});
+
+test('Florida small-flower exceptions never silently include resin (#158)', () => {
+ const fl = country('us/fl');
+ assert.match(fl.segments.possession, /20 g.*plant material.*resin.*felony at any weight/);
+ assert.match(fl.segments.sharing, /Resin.*excluded.*gifting a concentrate can be a felony/);
+ assert.match(fl.answers.caught.text, /concentrate possession can be a felony at any weight/);
+});
src/lib/facts.js +2 −2
@@ -53,5 +53,5 @@ const curated = [
{ kicker: "Switzerland", text: "[[CH|Switzerland]] has an unusual sharing rule: handing up to 10 g to another adult for free, to consume together, is not punishable. And since 2023 police [[h:switzerland-possession-legal-2023|may not even confiscate]] that amount." },
{ kicker: "Palau", text: "In [[PW|Palau]], giving away less than an ounce is punished like simple possession, with a fine, rather than as trafficking." },
- { kicker: "Fiji", text: "[[FJ|Fiji]]'s Court of Appeal has told judges not to jail people for up to 100 g of cannabis: fines, community service or a warning instead." },
+ { kicker: "Fiji", text: "[[FJ|Fiji]]'s sentencing guidelines favour fines, community service, counselling or a warning for up to 100 g of cannabis, reserving short or suspended prison terms for the worst cases." },
{ kicker: "Nauru", text: "[[NR|Nauru]] requires at least a year in custody for unlawful cannabis possession. Its December 2024 law also sets at least ten years before parole or probation for growing, supply and use." },
{ kicker: "India", text: "In [[IN|India]] the flowers and resin are banned, but [[c:language/bhang|bhang]], made from cannabis leaves, is legal and sold in government-licensed shops in several states." },
@@ -65,5 +65,5 @@ const fromHistory = [
{ kicker: "1563 · England", history: "england-hemp-mandate-1563", text: "In 1563 Elizabeth I ordered every landowner with 60 acres or more in England to grow hemp, or pay a fine of five pounds. The navy needed rope. The same country, the [[GB|United Kingdom]], [[h:uk-ban-1928|banned cannabis]] in 1928." },
{ kicker: "Merina kingdom · Madagascar", history: "madagascar-merina-ban-1787", text: "In [[MG|Madagascar]], King Andrianampoinimerina prohibited cannabis smoking in central Imerina while allowing cultivation for cloth and rope. Historical accounts describe death as a penalty; the exact year of the royal ban is unresolved." },
- { kicker: "1798 · India", history: "india-bhang-tax-1798", text: "In 1798 the British Parliament taxed [[c:language/bhang|bhang]], [[c:language/ganja|ganja]] and [[c:language/charas|charas]] in [[IN|India]], saying the aim was to reduce consumption. Attempts to make cannabis a crime in 1838, 1871 and 1877 were never enacted." },
+ { kicker: "1798 · India", history: "india-bhang-tax-1798", text: "In 1798 Bengal’s Board recommended taxing [[c:language/bhang|bhang]], [[c:language/ganja|ganja]] and [[c:language/charas|charas]] in [[IN|India]] to restrain use and raise revenue. Its letter advised the Governor-General in Council against total prohibition." },
{ kicker: "1800 · Egypt", history: "egypt-french-ban-1800", text: "In October 1800 the French army occupying [[EG|Egypt]] banned [[c:traditions/hashish-in-egypt|hashish]], alarmed by its use among its own troops." },
{ kicker: "1851 · Sierra Leone", history: "sierra-leone-cannabis-long-in-use-1851", text: "In 1851 a botanical journal reported that cannabis had long been used in the interior of [[SL|Sierra Leone]], and claimed its seeds had come to the colony with \u201cCongoes captured by one of our cruisers\u201d." },