Cannabis Freedom Index

Changelog b4e772d

Restore Kuwait's Decree-Law No. 159 of 2025 and Hong Kong's separate cultivation offence

Two history-scope tests had failed since the research batches of 24 October, each guarding a correction from an earlier issue that a rewrite had dropped: - Kuwait: the possession text and the kuwait-drug-law-2025 entry lost the decree-law's number (corrected from "no. 59" in 9eccf8a). It is back, in the source titles too; the research note and the source URL both name 159/2025. - Hong Kong: cultivation again says it is a separate offence from manufacturing (#44). The test now accepts "fifteen years" and "KD5,000": it checked wording, not the fact. history:test now runs before every deploy, and the documented workflow says to run it and answers:test before committing research. Note in docs/research/regressions-hk-kw-2026-10-25.md. Claude-Session: https://claude.ai/code/session_015PFhJhHBpXsnUocs8vvYAd

1 history entry edited2 country profiles edited4 files of code, design or docs +58 −13 lines

History changes.yaml

Edited 1

Kuwait combines its drug laws and keeps death for trafficking

description

ADecree-Law No. 159 of 2025, a combined drug law, replaced the 1983 narcotics law and 1987 psychotropic-substances law, with commencement re … .[@1] It was published in the gazette on 30 November after signature on 24 November.[@1,3]

Countries and states 2 files

Hong Kong countries/hk.yaml

segments › cultivation › text

Growing any cannabis plant carries up to fifteen years and HK$100,000.[@hkpf] It is a separate offence from manufacturing a dangerous drug, which carries up to life.[@hkpf] The 2023 court guidelines use estimated annual yield, with the grower’s role, scale of ope … ; under 5 kg falls below two years, while above 150 kg falls above ten years.[@guidelines]

Kuwait countries/kw.yaml

segments › possession › text

UnlawfulUnder Decree-Law No. 159 of 2025, unlawful personal consumption, possession, purchase and specified other personal-use conduct carry up to five years in prison and a fine up to KD5,000 (5,000 dinars). The maximum rises to ten years and KD10,000 in specified places including prisons, schools and treatment centres. Separate lower-schedule rules provide different penalties.[@law25]

Code, design and documents 4 files

.github/workflows/deploy.yml +2 −0
@@ -36,4 +36,6 @@ jobs:
       # stops the deploy instead of going live.
       - run: npm run answers:test
+      # the facts earlier issues corrected, which a later rewrite must not lose
+      - run: npm run history:test
       # The social preview images (one per page) take minutes to draw and rarely change. Each is
       # kept under a hash of its own content, so restoring the folder redraws only what is new.

docs/DATA-MAINTENANCE.md +6 −1
@@ -666,5 +666,10 @@ node scripts/data-status.cjs chain de     # one country's full timeline
    consistent with the new scores.
 5. **Check the score timeline** of every country you touched: `node scripts/data-status.cjs chain <id>`.
-6. **Build, restart the preview, spot-check** one country page (its chart and History) and `/history/`.
+6. **Run the tests, build, restart the preview, spot-check** one country page (its chart and
+   History) and `/history/`. `npm run history:test` and `npm run answers:test` hold the facts that
+   earlier issues corrected (Hong Kong's 15-year cultivation ceiling, Kuwait's Decree-Law No. 159
+   of 2025, …). A rewrite that drops one fails them, and so does the deploy. When a test fails
+   after new research, either the research lost a corrected fact, which goes back in, or the
+   test is checking wording rather than the fact, so loosen the test, never the fact.
 
 ## Rules learned the hard way

docs/research/regressions-hk-kw-2026-10-25.md +34 −0
@@ -0,0 +1,34 @@
+# Hong Kong and Kuwait: facts lost in later research, 25 October 2026
+
+Two tests in `scripts/history-scope.test.cjs` had failed since the research batches of 24 October.
+Each guards a correction made for an earlier issue, and each batch rewrote the text it checks.
+
+## Kuwait
+
+`9eccf8a` (24 October) corrected the decree-law's number from "no. 59" to 159 of 2025. The history
+batch the same day (`5d74c2d`, `history-kuwait-gap-2026-10-24.md`) rewrote the possession segment
+and the `kuwait-drug-law-2025` entry and dropped the number. That note itself says Decree-Law
+159/2025 was read, and the cited source's address decodes to «مرسوم بقانون رقم 159 لسنة 2025»
+(Decree-Law No. 159 of 2025). The number is back in the possession text, the entry's description and the source
+titles. Penalties (article 49: five years and KD5,000, ten years and KD10,000 in named places)
+were already right.
+
+## Hong Kong
+
+`b2a7578` (#44) stated that cultivation carries 15 years and HK$100,000, and that manufacturing a
+dangerous drug is a separate offence with up to life. The history batch `b22d7fd` rewrote
+cultivation as "fifteen years" with the 2023 sentencing bands and moved the separate-offence
+sentence to production only. No fact was wrong; the test matched the old wording. Cultivation now
+says again that it is a separate offence from manufacturing, and the test accepts either spelling.
+
+The new cultivation bands (under 5 kg below two years, 5–50 kg two to seven, 50–150 kg seven to
+ten, above 150 kg more than ten) agree across the profile, the history entry and the article,
+all citing HKSAR v Nguyen Thang Loi [2023] HKCA 103. The judgment and the Department of
+Justice summary could not be opened from this environment, so they were not re-read here.
+
+## So it does not happen again
+
+`npm run history:test` now runs before every deploy, next to `answers:test`, and the workflow in
+`docs/DATA-MAINTENANCE.md` says to run both before committing research. When one fails after
+research, the corrected fact goes back in, or the test is loosened if it checked wording
+rather than the fact.

scripts/history-scope.test.cjs +4 −3
@@ -436,9 +436,10 @@ test("Estonia's quantity line and Hong Kong's cultivation penalty follow the tex
   assert.equal(misdemeanour.before.possession, 1);
   assert.match(misdemeanour.description, /does not fix that quantity at 7\.5 grams/);
-  assert.match(hk.segments.cultivation.text, /15 years/);
+  // the 15-year cultivation ceiling, kept apart from manufacturing's life maximum (#44)
+  assert.match(hk.segments.cultivation.text, /(15|fifteen) years/);
   assert.match(hk.segments.cultivation.text, /HK\$100,000/);
   assert.match(hk.segments.cultivation.text, /separate offence/);
   assert.doesNotMatch(hk.segments.cultivation.text, /manufacturing a dangerous drug\n\s*carries up to life/);
-  assert.match(hk.context.production.text, /not that/);
+  assert.match(hk.context.production.text, /separate offence/);
   assert.equal(hk.scores.cultivation, 0);
 });
@@ -886,5 +887,5 @@ test("Maldives quantity presumptions, Kuwait decree-law 159, and Japan cultivati
   assert.match(kw.segments.possession.text, /159 of 2025/);
   assert.match(kw.segments.possession.text, /five years/);
-  assert.match(kw.segments.possession.text, /5,000 dinars/);
+  assert.match(kw.segments.possession.text, /KD ?5,000|5,000 dinars/);
   assert.doesNotMatch(kw.segments.possession.text, /no\. 59/);
   assert.doesNotMatch(kw.summary, /were not found/);

    ↑↓ to move, ↵ to open.