Cannabis Freedom Index

Changelog 4dd8831

lower survey age to 16

5 files of code, design or docs +44 −30 lines

Code, design and documents 5 files

scripts/survey-mock.cjs +1 −1
@@ -43,5 +43,5 @@ for (let i = 0; i < N; i++) {
   const liberal = gauss(); // the person's own leaning
   const r = { residence: home };
-  r.age = pick({ a18: 22, a25: 34, a35: 22, a45: 12, a55: 7, a65: 3 });
+  r.age = pick({ a16: 3, a18: 21, a25: 33, a35: 21, a45: 12, a55: 7, a65: 3 });
   r.gender = pick({ man: 62, woman: 30, other: 4, skip: 4 });
   r.setting = pick({ city: 52, town: 33, rural: 15 });

src/lib/survey.js +1 −1
@@ -18,3 +18,3 @@ export { results };
 export const counted = survey.sections.flatMap((s) => s.questions.filter((q) => q.type !== "text").map((q) => ({ ...q, section: s.id })));
 // what the form needs to know to send answers: nothing secret
-export const submitConfig = { edition: survey.edition, open: survey.open && Boolean(survey.nostr.pubkey) && survey.nostr.relays.length > 0, ...survey.nostr };
+export const submitConfig = { edition: survey.edition, min_age: survey.min_age, open: survey.open && Boolean(survey.nostr.pubkey) && survey.nostr.relays.length > 0, ...survey.nostr };

src/pages/survey/take.astro +2 −2
@@ -37,5 +37,5 @@ const cond = (x) => (x.if ? JSON.stringify(x.if) : undefined);
         </ul>
         <p class="sv-editing" id="svEditing" hidden></p>
-        <label class="sv-check"><input type="checkbox" id="svAdult" /> <span>I am 18 or older and I am answering for myself.</span></label>
+        <label class="sv-check"><input type="checkbox" id="svAdult" /> <span>I am {survey.min_age} or older and I am answering for myself.</span></label>
       </section>
 
@@ -173,5 +173,5 @@ const cond = (x) => (x.if ? JSON.stringify(x.if) : undefined);
     // a section may be left only when its required questions are answered
     function missing(step) {
-      if (step.dataset.step === "start") return document.getElementById("svAdult").checked ? null : "Please confirm that you are 18 or older.";
+      if (step.dataset.step === "start") return document.getElementById("svAdult").checked ? null : `Please confirm that you are ${cfg.min_age} or older.`;
       const r = repeat(step.dataset.step);
       const blocks = r ? blocksOf(r).filter((b) => Object.keys(read(b)).length) : [step];

survey/2026.yaml +5 −1
@@ -23,4 +23,8 @@
 edition: 2026
 title: State of Cannabis 2026
+# The youngest age the form accepts. 16 is the highest age of digital consent in any EU country,
+# so a respondent of that age can agree for themselves everywhere in the EU. Lowering it means
+# collecting from children who, in most countries, cannot consent without a parent.
+min_age: 16
 
 # Nothing is sent anywhere while `open` is false: answers are then kept in the browser only.
@@ -44,5 +48,5 @@ sections:
         type: single
         required: true
-        options: {a18: 18 to 24, a25: 25 to 34, a35: 35 to 44, a45: 45 to 54, a55: 55 to 64, a65: 65 or older}
+        options: {a16: 16 to 17, a18: 18 to 24, a25: 25 to 34, a35: 35 to 44, a45: 45 to 54, a55: 55 to 64, a65: 65 or older}
       - id: gender
         text: Gender

survey/results-2026.json +35 −25
@@ -81,7 +81,8 @@
    "counts": {
     "all": {
-     "a18": 577,
-     "a25": 893,
-     "a35": 559,
+     "a16": 80,
+     "a18": 549,
+     "a25": 863,
+     "a35": 537,
      "a45": 296,
      "a55": 177,
@@ -89,7 +90,8 @@
     },
     "users": {
-     "a18": 404,
-     "a25": 607,
-     "a35": 385,
+     "a16": 48,
+     "a18": 392,
+     "a25": 587,
+     "a35": 369,
      "a45": 207,
      "a55": 122,
@@ -97,7 +99,8 @@
     },
     "never": {
-     "a18": 97,
-     "a25": 158,
-     "a35": 106,
+     "a16": 21,
+     "a18": 84,
+     "a25": 154,
+     "a35": 102,
      "a45": 49,
      "a55": 31,
@@ -105,7 +108,8 @@
     },
     "growers": {
+     "a16": 6,
      "a18": 87,
      "a25": 132,
-     "a35": 94,
+     "a35": 88,
      "a45": 55,
      "a55": 23,
@@ -113,7 +117,8 @@
     },
     "region:Europe": {
-     "a18": 317,
-     "a25": 499,
-     "a35": 332,
+     "a16": 44,
+     "a18": 308,
+     "a25": 476,
+     "a35": 320,
      "a45": 178,
      "a55": 86,
@@ -121,7 +126,8 @@
     },
     "region:North America": {
-     "a18": 124,
-     "a25": 192,
-     "a35": 113,
+     "a16": 15,
+     "a18": 119,
+     "a25": 184,
+     "a35": 111,
      "a45": 55,
      "a55": 39,
@@ -129,7 +135,8 @@
     },
     "region:South America": {
-     "a18": 49,
-     "a25": 77,
-     "a35": 44,
+     "a16": 4,
+     "a18": 50,
+     "a25": 74,
+     "a35": 42,
      "a45": 17,
      "a55": 19,
@@ -137,7 +144,8 @@
     },
     "region:Asia": {
-     "a18": 37,
-     "a25": 64,
-     "a35": 36,
+     "a16": 8,
+     "a18": 30,
+     "a25": 68,
+     "a35": 31,
      "a45": 23,
      "a55": 22,
@@ -145,5 +153,6 @@
     },
     "region:Oceania": {
-     "a18": 20,
+     "a16": 5,
+     "a18": 15,
      "a25": 30,
      "a35": 18,
@@ -153,7 +162,8 @@
     },
     "region:Africa": {
-     "a18": 30,
+     "a16": 4,
+     "a18": 27,
      "a25": 31,
-     "a35": 16,
+     "a35": 15,
      "a45": 9,
      "a55": 6,

    ↑↓ to move, ↵ to open.