Cannabis Freedom Index

Changelog 3b20a7f

Score Madagascar, India and South Africa from nationwide laws.

Provincial and colonial rules were moving the modern national score, including Madagascar's 1787 highland smoking ban, Bengal's 1793 licence, and the Orange River Colony's 1903 ordinance.

25 history entries edited3 articles edited4 files of code, design or docs +200 −45 lines

History changes.yaml

Edited 25

Madagascar raises rongony penalties to as much as five years

unscored

The inherited Merina-era score step already carries the modern criminal penalties; the colonial and post-independence sequence needs reconstruction before separating this increase.

before

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

Madagascar adds penalties for growing and possessing rongony

unscored

The original 1958 text and its relation to earlier regional restrictions remain to be recovered before rebasing the inherited Merina-era score step.

before

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

Madagascar's colonial government bans rongony smoking and sales

unscored

This colonial territorial ban needs to be separated from the older regional Merina restriction, whose inherited score step already incorporates nationwide modern prohibition.

before

possession 10 · cultivation 10 · enforcement 10 · sharing 10 · consumption 10 · access 10

The Orange River Colony prohibits supplying dagga

before

possession 10 · cultivation 10 · enforcement 10 · sharing 10 · consumption 10 · access 10

unscored

The Orange River Colony only. A colonial ordinance does not move South Africa's national score.

Northern India and Burma share a new excise act

category

tighteningother

title

Northern India puts cannabis growing under licenceand Burma share a new excise act

description

On the Hemp Drugs Commission's recommendations,The Excise Act XII of 19 March 1896 gavecame into force at once in the government control over growing the plantNorth-Western Provinces and over preparingOudh, importingthe Punjab, exportingthe Central Provinces, Burma, Coorg, and transporting its drugsAjmere and Merwara. Cultivation was allowed only in certain placesIntoxicating drugs under licence and supervision and prohibited elsewherethe act include ganja, gathering wild plants was restrictedbhang, charas and all products passed through bonded warehouses to licensed vendors after duty was paidevery preparation or admixture of them. The Burma reprint gives the retail-sale quantities as one ser of bhang and five tolas of ganja or charas. Bengal continued under its own excise law.

before

possession 10 · cultivation 10 · enforcement 10 · sharing 9 · consumption 10 · access 7

sources

Excise Act, 1896 (Act XII), Burma code reprint 1 unchanged

unscored

Those listed territories only. Provincial excise does not move India's national score.

Madagascar’s Merina king bans cannabis smoking

before

possession 10 · cultivation 10 · enforcement 10 · sharing 10 · consumption 10 · access 10

unscored

Central Imerina only, with an uncertain date and a rule reportedly applied only briefly. It does not set Madagascar's national score.

Articles and atlas entries 3

india-bombay-possession-limit-1913 articles/india-bombay-possession-limit-1913.md

text

The Hemp Drugs Commission told British India what to do about cannabis in 1894. Nineteen y … e government, he wrote, had made them "its partners in an enormously valuable monopoly". The Bombay's limit is a context entry for [India](/country/applied in/): that presidency. The first nationwide ban is the national score had already moved with the [1896 excise1985 act](/history/india-ndps-act-xii-18961985/), which made flower and resin illegal throughout [India](/country/in/).

india-hemp-drugs-commission-1894 articles/india-hemp-drugs-commission-1894.md

text

One of the most exhaustive official studies of cannabis ever made was finished in 1894.[@ … only under licence, limit the number of shops and limit how much a person could hold.[@2] The [Act XII of 1896 excise act](/history/india-act-xii-1896/) put this into law,applied that approach in the North-Western Provinces and Oudh, the licensed system lasted Punjab, the Central Provinces, Burma, Coorg, and Ajmere and Merwara. Other provinces kept their own excise. Licensed sale in Indiathe states continued until the [1985 ban](/history/india-ndps-act-1985/). ## What became of it At [Geneva in … 2/). The index lists the report for context; it moved no score in [India](/country/in/).

india-ndps-act-1985 articles/india-ndps-act-1985.md

text

Until November 1985 ganja was sold in licensed shops in much of India. India had defended … century, and gave it up in a single act of parliament. ## A licensed drug British India taxedlicensed cannabis from through provincial excise. The [17981896 excise act](/history/india-bhangact-taxxii-17981896/) covered the North-Western Provinces and Oudh, on the advice of Punjab, the [Hemp Drugs Commission](/history/india-hemp-drugs-commission-1894/)Central Provinces, put it under licence in [1896](/history/india-act-xii-1896/): growing in approved places Burma, sale through licensed vendorsCoorg, duty paid onand Ajmere and Merwara. Bengal and the way other provinces kept their own systems. Independent India kept the arrangement and left itgrowing, selling and possession to the states. At the [1961 conference](/history/un-single-convention-1961/) India fough … o 1, enforcement from 5 to 2 and access from 5 to 2, where [India](/country/in/) remains.

Code, design and documents 4 files

docs/research/history-scope-scores-2026-10-23.md +60 −0
@@ -0,0 +1,60 @@
+# National scores follow nationwide laws
+
+23 October 2026. Issues 8, 9 and 10. Read `docs/DATA-MAINTENANCE.md` (the score
+timeline, and the note that Act XII of 1896 had to be read before it was
+scored) and `docs/WRITING.md`.
+
+## What was wrong
+
+Madagascar's only scored event was the 1787 Merina smoking ban in central
+Imerina. That one step carried today's possession, cultivation, enforcement,
+sharing, consumption and access scores. The colony-wide 1915 decree, the 1958
+cultivation and possession penalties, and the 1960 sentence increase were
+unscored for that reason.
+
+India's 1793 Bengal retail licence was the first scored event for the whole
+modern country, a drop from 100 to 96. Act XII of 1896 then dropped the
+national score from 96 to 40. A Burma reprint of that act, already read for
+the Myanmar gap note, extends it to the North-Western Provinces and Oudh, the
+Punjab, the Central Provinces, Burma, Coorg, and Ajmere and Merwara. Bengal
+stayed under its own excise law. It is not a law for all of British India.
+
+South Africa's first scored event was the 1903 Orange River Colony ordinance,
+so the national score left 100 in 1903. The first nationwide prohibition is
+the 1922 Customs and Excise amendment.
+
+## What the scores do now
+
+Current profile scores are unchanged.
+
+Madagascar: 1915 is the first national step, from 100 to 55. Preparing,
+selling and consuming smoking cannabis became offences, with up to a year in
+prison or a fine. Possession and cultivation were not yet named offences, so
+those segments stay at 10. In 1958 they become crimes with eleven days to one
+month or a fine (55 to 10). In 1960 the same conduct carries six months to
+five years or a fine (10 to 3): possession and cultivation move to 0, and
+enforcement moves from 2 to 1. In 1997 small personal quantities, including
+growing, are two to six months or a fine, and use is scored with possession
+(3 to 9, the current profile). The 1787 event stays in the history as a
+regional, uncertain, briefly applied smoking ban, with no score.
+
+India: 1793, 1896 and the 1925 Central Provinces charas ban are unscored
+provincial events. The national line stays at 100 until the Narcotic Drugs
+and Psychotropic Substances Act of 14 November 1985, which is the first ban
+covering the whole country. It falls from 100 to 11. The 2001 quantity bands
+still rise from 11 to 13. Provincial excise notes no longer say that the
+chain starts in the licensed regime of 1896.
+
+South Africa: the Orange River Colony ordinance, the Cape poison listing and
+the 1870 Natal enabling power are unscored. The 1922 national ban falls from
+100 to 11, and the later steps are unchanged.
+
+`npm run history:test` checks that 1787, 1793, 1896 and 1903 do not move a
+national score, and that those regional events are not the first scored step
+for their modern country.
+
+Bangladesh still starts in 1793 because its entries place the Bengal licence in
+territory that is now Bangladesh, including the Naogaon growing tract.
+Pakistan's 1914 first step is the Punjab excise act, with Baluchistan's own
+regulation the next year. That chain remains the documented licensed trade
+the 1979 prohibition replaced.

package.json +1 −0
@@ -12,4 +12,5 @@
     "books:check": "node scripts/books-status.cjs --check",
     "books:test": "node --test scripts/books-status.test.cjs",
+    "history:test": "node --test scripts/history-scope.test.cjs",
     "articles:backlog": "node scripts/article-backlog.cjs",
     "scores:triage": "node scripts/score-triage.cjs",

scripts/history-scope.test.cjs +90 −0
@@ -0,0 +1,90 @@
+const { test } = require("node:test");
+const assert = require("node:assert/strict");
+const fs = require("node:fs");
+const y = require("js-yaml");
+
+const changes = y.load(fs.readFileSync("changes.yaml", "utf8"));
+const segments = y.load(fs.readFileSync("segments.yaml", "utf8"));
+const FREE = { possession: 10, cultivation: 10, enforcement: 10, sharing: 10, consumption: 10, access: 10 };
+const total = (s) => Math.round(segments.reduce((sum, seg) => sum + (s[seg.id] * seg.weight) / 10, 0));
+const when = (d) => Date.parse(d.length === 4 ? d + "-07-01" : d.length === 7 ? d + "-15" : d);
+const byId = Object.fromEntries(changes.map((e) => [e.id, e]));
+
+function scored(country) {
+  return changes.filter((e) => e.country === country && e.before).sort((a, b) => when(a.date) - when(b.date));
+}
+
+function scoreAt(country, year) {
+  const steps = scored(country);
+  const hit = steps.filter((e) => Number(String(e.date).slice(0, 4)) <= year);
+  if (!hit.length) return steps.length ? { ...steps[0].before } : null;
+  const i = steps.indexOf(hit.at(-1));
+  const next = steps[i + 1];
+  if (next) return { ...next.before };
+  const file = fs.existsSync(`countries/${country}.yaml`) ? `countries/${country}.yaml` : `countries/${country}/index.yaml`;
+  return { ...y.load(fs.readFileSync(file, "utf8")).scores };
+}
+
+test("Madagascar's 1787 royal ban does not carry modern national penalties", () => {
+  const royal = byId["madagascar-merina-ban-1787"];
+  assert.equal(royal.before, undefined);
+  assert.match(royal.unscored, /Imerina/);
+  const then = scoreAt("mg", 1787);
+  assert.deepEqual(then, FREE);
+  assert.equal(total(then), 100);
+  const profile = y.load(fs.readFileSync("countries/mg.yaml", "utf8")).scores;
+  assert.notDeepEqual(then, profile);
+  const first = scored("mg")[0];
+  assert.equal(first.id, "madagascar-colonial-rongony-ban-1915");
+  assert.deepEqual(first.before, FREE);
+  const colony = scoreAt("mg", 1915);
+  assert.equal(colony.possession, 10);
+  assert.equal(colony.cultivation, 10);
+  assert.ok(colony.consumption < 10);
+  const modern = scoreAt("mg", 1997);
+  assert.deepEqual(modern, profile);
+});
+
+test("India's national score starts at the 1985 ban, not a provincial licence", () => {
+  for (const id of ["india-bengal-ganja-licences-1793", "india-act-xii-1896", "india-central-provinces-charas-1925"]) {
+    assert.equal(byId[id].before, undefined, id);
+    assert.match(byId[id].unscored, /Provincial|Bengal|Central Provinces|territories/);
+  }
+  assert.match(byId["india-act-xii-1896"].description, /North-Western Provinces/);
+  assert.doesNotMatch(byId["india-act-xii-1896"].description, /all of British India|nationwide/);
+  const first = scored("in")[0];
+  assert.equal(first.id, "india-ndps-act-1985");
+  assert.deepEqual(first.before, FREE);
+  assert.deepEqual(scoreAt("in", 1793), FREE);
+  assert.deepEqual(scoreAt("in", 1896), FREE);
+});
+
+test("South Africa's national score starts at the 1922 ban, not one colony", () => {
+  for (const id of ["orange-river-colony-dagga-ordinance-1903", "cape-colony-dagga-poison-listing-1905", "south-africa-natal-1870"]) {
+    assert.equal(byId[id].before, undefined, id);
+    assert.match(byId[id].unscored, /Colony|Natal/);
+  }
+  const first = scored("za")[0];
+  assert.equal(first.id, "south-africa-national-ban-1922");
+  assert.deepEqual(first.before, FREE);
+  assert.deepEqual(scoreAt("za", 1903), FREE);
+  assert.equal(total(scoreAt("za", 1922)), 11);
+});
+
+test("known regional events are not the first scored step for their modern country", () => {
+  const blocked = new Set([
+    "madagascar-merina-ban-1787",
+    "india-bengal-ganja-licences-1793",
+    "india-act-xii-1896",
+    "india-central-provinces-charas-1925",
+    "orange-river-colony-dagga-ordinance-1903",
+    "cape-colony-dagga-poison-listing-1905",
+    "south-africa-natal-1870",
+  ]);
+  const countries = new Set(changes.map((e) => e.country).filter(Boolean));
+  for (const id of countries) {
+    const first = scored(id)[0];
+    if (first) assert.equal(blocked.has(first.id), false, `${id} starts at ${first.id}`);
+  }
+  for (const id of blocked) assert.equal(byId[id].before, undefined, id);
+});

src/pages/charts.astro +1 −1
@@ -1016,5 +1016,5 @@ const kick = (id) => { const i = sections.findIndex(([x]) => x === id); return `
         <div class="ch-stripes-ends" aria-hidden="true"><span>↑ freest today</span><span>strictest today ↓</span></div>
       </div>
-      <p class="ch-source">Each country's score at the end of each year, rebuilt from its history, as in the <a href={`${base}data/#panel`}>yearly data</a>. These are reconstructed scores, including estimated dates and assumed baselines. Madagascar’s early line carries a <a href={`${base}history/madagascar-merina-ban-1787/`}>regional royal smoking ban</a> across the modern country; its continuous nationwide duration is unresolved. Hover a stripe for its country and year; click it for the country's history.</p>
+      <p class="ch-source">Each country's score at the end of each year, rebuilt from its history, as in the <a href={`${base}data/#panel`}>yearly data</a>. These are reconstructed scores, including estimated dates and assumed baselines. A regional or provincial rule stays off the national line until a law covers the whole country. Hover a stripe for its country and year; click it for the country's history.</p>
       <p class="ch-more"><a href={`${base}map/`}>Play the years on the map →</a> <a href={`${base}data/#panel`}>Download the yearly scores →</a></p>
     </section>

    ↑↓ to move, ↵ to open.