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
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]
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]
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
@@ -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/);