{
  "schemaVersion": 1,
  "slug": "name-numerology-calculator",
  "category": "fun",
  "kind": "implementation",
  "independentValidation": false,
  "implementationHash": "dfc862ec2df71874692535d879916ef4cb2f06cd343d5a0096c36826fae61f7f",
  "provenance": "Generated from the calculation contract used by the published page. Publication is not external validation.",
  "sourceFiles": [
    "data/calculators/name-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": "E = dr(Σ_{i=1}^{n} v_i); S = dr(Σ_{i ∈ V} v_i); P = dr(Σ_{i ∈ C} v_i)",
    "vars": [
      [
        "E",
        "expression number"
      ],
      [
        "S",
        "soul urge number"
      ],
      [
        "P",
        "personality number"
      ],
      [
        "v_i",
        "value of the i-th letter"
      ],
      [
        "n",
        "number of letters"
      ],
      [
        "V",
        "vowel position set"
      ],
      [
        "C",
        "consonant position set"
      ],
      [
        "dr",
        "digital reduction to ≤ 9"
      ]
    ],
    "note": "Pythagorean values a–i = 1–9 repeating; the Chaldean table differs (f=8, o=7, p=8, q=1 …) and never uses 9; non-letters are ignored; birth number = count of letters."
  },
  "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 CH = { a:1,b:2,c:3,d:4,e:5,f:8,g:3,h:5,i:1,j:1,k:2,l:3,m:4,n:5,o:7,p:8,q:1,r:2,s:3,t:4,u:6,v:6,w:6,x:5,y:1,z:7 }; const table = system === 'chaldean' ? CH : PV; const red = (n) => { n = Math.abs(Math.round(n)); while (n > 9) n = String(n).split('').reduce((a, b) => a + Number(b), 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 = table[ch] || 0; all += v; if (vowels.indexOf(ch) >= 0) soul += v; else pers += v; } const readings = { 1: 'Independent and pioneering', 2: 'Sensitive and cooperative', 3: 'Expressive and social', 4: 'Methodical and reliable', 5: 'Restless and versatile', 6: 'Caring and domestic', 7: 'Analytical and private', 8: 'Driven and commercial', 9: 'Idealistic and giving' }; const exp = red(all); return { expression: exp, soulUrge: red(soul), personality: red(pers), birthNumber: letters.length, reading: readings[exp] || 'Unknown' };",
    "inputs": [
      {
        "name": "name",
        "type": "text",
        "default": "Alexandra",
        "step": 1
      },
      {
        "name": "system",
        "type": "select",
        "default": "pythagorean",
        "options": [
          {
            "value": "pythagorean"
          },
          {
            "value": "chaldean"
          }
        ]
      }
    ],
    "outputs": [
      {
        "name": "expression",
        "precision": 0,
        "unit": ""
      },
      {
        "name": "soulUrge",
        "precision": 0,
        "unit": ""
      },
      {
        "name": "personality",
        "precision": 0,
        "unit": ""
      },
      {
        "name": "birthNumber",
        "precision": 0,
        "unit": ""
      },
      {
        "name": "reading",
        "precision": 0,
        "unit": "",
        "type": "text"
      }
    ],
    "interpret": null
  }
}
