{
  "schemaVersion": 1,
  "slug": "angel-number-calculator",
  "category": "party",
  "kind": "implementation",
  "independentValidation": false,
  "implementationHash": "765cc190b20a4a31f65aeb52b6da61cc022580b62d2499dc9346d6d4b02f6beb",
  "provenance": "Generated from the calculation contract used by the published page. Publication is not external validation.",
  "sourceFiles": [
    "data/calculators/angel-number-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": "n_{k+1} = Σ_{i=1}^{m} d_i(n_k), m = ⌊log₁₀ n_k⌋ + 1; k ∈ {0, 1, …, k*}, k* = min { k : n_k ≤ 9 ∨ n_k ∈ {11, 22, 33} }",
    "vars": [
      [
        "n_k",
        "reduced number at step k"
      ],
      [
        "d_i",
        "i-th decimal digit of the argument, counted from the right (i = 1: units)"
      ],
      [
        "m",
        "number of decimal digits of n_k"
      ],
      [
        "k*",
        "stopping step: smallest k with n_k ≤ 9 or n_k ∈ {11, 22, 33}"
      ]
    ],
    "note": "n₀ is the digit sum of the birth date; the recurrence replaces each number by its digit sum and stops at step k*, where n_k ≤ 9 or n_k ∈ {11, 22, 33}; 11/22/33 are kept as master numbers; the angel number repeats the digit 3× (4× for masters)."
  },
  "externalEvidence": {
    "reviewedAt": "2026-10-12",
    "sources": [
      {
        "name": "OEIS — Digital root and digit sums",
        "url": "https://oeis.org/A010888"
      }
    ],
    "referenceRole": "definition",
    "implementationHash": "765cc190b20a4a31f65aeb52b6da61cc022580b62d2499dc9346d6d4b02f6beb",
    "basis": "n_{k+1} = Σ_{i=1}^{m} d_i(n_k), m = ⌊log₁₀ n_k⌋ + 1; k ∈ {0, 1, …, k*}, k* = min { k : n_k ≤ 9 ∨ n_k ∈ {11, 22, 33} }",
    "limitations": "The references explain definitions and methods; any extra preset must be checked against the assumptions on this page."
  },
  "contract": {
    "compute": "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 validDate = (s) => { const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(String(s)); if (!m) return false; const d = new Date(String(s) + 'T00:00:00Z'); return Number.isFinite(d.getTime()) && d.getUTCFullYear() === +m[1] && d.getUTCMonth()+1 === +m[2] && d.getUTCDate() === +m[3]; }; if (!validDate(birthDate)) return { lifePath: null, angelNumber: null, digitSum: null, message: null, __error: 'inputError' }; const digits = birthDate.replace(/[^0-9]/g, '').split('').reduce((s2, d2) => s2 + Number(d2), 0); const lp = red(digits); const msgs = { 1: 'New beginnings and independence', 2: 'Balance and partnership', 3: 'Creativity and growth', 4: 'Stability and hard work', 5: 'Change and freedom', 6: 'Home and responsibility', 7: 'Inner wisdom', 8: 'Abundance and power', 9: 'Completion and service', 11: 'Intuition and awakening', 22: 'Building something lasting', 33: 'Compassion and teaching' }; const pattern = String(lp).length > 1 ? String(lp).repeat(4) : String(lp).repeat(3); return { lifePath: lp, angelNumber: pattern, digitSum: digits, message: msgs[lp] || 'Unknown' };",
    "inputs": [
      {
        "name": "birthDate",
        "type": "date",
        "default": "1990-01-01",
        "step": 1
      }
    ],
    "outputs": [
      {
        "name": "lifePath",
        "precision": 0,
        "unit": ""
      },
      {
        "name": "angelNumber",
        "precision": 0,
        "unit": "",
        "type": "text"
      },
      {
        "name": "digitSum",
        "precision": 0,
        "unit": ""
      },
      {
        "name": "message",
        "precision": 0,
        "unit": "",
        "type": "text"
      }
    ],
    "interpret": null
  }
}
