{
  "schemaVersion": 1,
  "slug": "numerology-calculator",
  "category": "party",
  "kind": "implementation",
  "independentValidation": false,
  "implementationHash": "9d74bfb09fdb798128288f96fcdb71013f1358d66d35f1b7b13710763ed0e3c7",
  "provenance": "Generated from the calculation contract used by the published page. Publication is not external validation.",
  "sourceFiles": [
    "data/calculators/numerology-calculator.json",
    "src/engine.js"
  ],
  "runtimeSource": "/sources/engine.txt",
  "runtimeHash": "5c888d8898afbdee36267bb9977829e1e2ac568f6677c8ee87469c139864645c",
  "scope": "The compute function records implemented equations, constants, lookup tables and custom rules. Inputs record defaults and allowed values; outputs record precision and units. Defaults are examples, not recommendations. General background references are not evidence for this specific algorithm.",
  "publishedFormula": {
    "formula": "L = DR(Σ_{i=1}^{n} d_i); E = dr(Σ_{j=1}^{m} v_j)",
    "vars": [
      [
        "L",
        "life path number"
      ],
      [
        "E",
        "expression number"
      ],
      [
        "S",
        "soul urge (vowels)"
      ],
      [
        "P",
        "personality (consonants)"
      ],
      [
        "DR",
        "digit reduction"
      ],
      [
        "d_i",
        "i-th digit of birth date"
      ],
      [
        "n",
        "number of birth-date digits"
      ],
      [
        "v_j",
        "value of the j-th letter"
      ],
      [
        "m",
        "number of letters"
      ]
    ],
    "note": "Pythagorean letter values a–i = 1–9 repeating; DR keeps master numbers 11, 22 and 33 unreduced; vowels are a, e, i, o, u; birthday number = calendar day."
  },
  "externalEvidence": null,
  "contract": {
    "compute": "const PV = { a:1,b:2,c:3,d:4,e:5,f:6,g:7,h:8,i:9,j:1,k:2,l:3,m:4,n:5,o:6,p:7,q:8,r:9,s:1,t:2,u:3,v:4,w:5,x:6,y:7,z:8 }; const red = (n) => { n = Math.abs(Math.round(n)); while (n > 9 && n !== 11 && n !== 22 && n !== 33) { n = String(n).split('').reduce((s2, d2) => s2 + Number(d2), 0); } return n; }; const letters = String(name).toLowerCase().replace(/[^a-z]/g, ''); const vowels = 'aeiou'; let all = 0, soul = 0, pers = 0; for (const ch of letters) { const v = PV[ch] || 0; all += v; if (vowels.indexOf(ch) >= 0) soul += v; else pers += v; } const bd = new Date(birthDate + 'T00:00:00Z'); const digits = Number.isNaN(bd.getTime()) ? 0 : birthDate.replace(/[^0-9]/g, '').split('').reduce((s2, d2) => s2 + Number(d2), 0); const lp = red(digits); const meanings = { 1: 'Independent and driven', 2: 'Diplomatic and cooperative', 3: 'Creative and expressive', 4: 'Practical and disciplined', 5: 'Adventurous and free', 6: 'Nurturing and responsible', 7: 'Analytical and introspective', 8: 'Ambitious and organised', 9: 'Compassionate and humanitarian', 11: 'Intuitive master number', 22: 'Master builder', 33: 'Master teacher' }; return { lifePath: lp, expression: red(all), soulUrge: red(soul), personality: red(pers), birthDayNumber: Number.isNaN(bd.getTime()) ? 0 : bd.getUTCDate(), meaning: meanings[lp] || 'Unknown' };",
    "inputs": [
      {
        "name": "name",
        "type": "text",
        "default": "Jane Doe",
        "step": 1
      },
      {
        "name": "birthDate",
        "type": "date",
        "default": "1990-01-01",
        "step": 1
      }
    ],
    "outputs": [
      {
        "name": "lifePath",
        "precision": 0,
        "unit": ""
      },
      {
        "name": "expression",
        "precision": 0,
        "unit": ""
      },
      {
        "name": "soulUrge",
        "precision": 0,
        "unit": ""
      },
      {
        "name": "personality",
        "precision": 0,
        "unit": ""
      },
      {
        "name": "birthDayNumber",
        "precision": 0,
        "unit": ""
      },
      {
        "name": "meaning",
        "precision": 0,
        "unit": "",
        "type": "text"
      }
    ],
    "interpret": null
  }
}
