{
  "schemaVersion": 1,
  "slug": "project-deadline-calculator",
  "category": "productivity",
  "kind": "implementation",
  "independentValidation": false,
  "implementationHash": "fbee96add35bdf302daedf1da9bd2b9fae005a579bd2429e327f48f34c560181",
  "provenance": "Generated from the calculation contract used by the published page. Publication is not external validation.",
  "sourceFiles": [
    "data/calculators/project-deadline-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": "D = (Σ tᵢ) × (1 + b ÷ 100)",
    "vars": [
      [
        "t_i",
        "Stage durations (days)"
      ],
      [
        "f",
        "Parallel factor"
      ],
      [
        "p",
        "Parallel-mode flag (p = 1 when more than one person works in parallel, else 0)"
      ],
      [
        "b",
        "Buffer (%)"
      ],
      [
        "d",
        "Working days per week"
      ],
      [
        "D",
        "Total scheduled days"
      ],
      [
        "W",
        "Calendar weeks"
      ]
    ],
    "note": "Stages are summed sequentially; the longest individual stage is not a dependency-based critical path."
  },
  "externalEvidence": {
    "reviewedAt": "2026-10-12",
    "sources": [
      {
        "name": "GAO — Schedule estimating, contingency and risk",
        "url": "https://www.gao.gov/products/gao-16-89g"
      }
    ],
    "referenceRole": "context",
    "implementationHash": "fbee96add35bdf302daedf1da9bd2b9fae005a579bd2429e327f48f34c560181",
    "basis": "D = (Σ tᵢ) × (1 + b ÷ 100)",
    "limitations": "The references provide context and limitations. They do not validate this page’s illustrative multipliers, lookup values or predictions."
  },
  "contract": {
    "compute": "const stages=[['Stage 1',task1Days],['Stage 2',task2Days],['Stage 3',task3Days],['Stage 4',task4Days]],sequential=stages.reduce((a,s)=>a+s[1],0),bufferedDays=sequential*(1+bufferPercent/100),sorted=[...stages].sort((a,b)=>b[1]-a[1]); return {sequentialDays:sequential,bufferedDays,calendarWeeks:bufferedDays/workingDaysPerWeek,criticalStages:sorted[0][0]+' at '+sorted[0][1]+' days',note:'Stages are summed sequentially because task dependencies are not defined. The longest single stage is shown, not a dependency-based critical path.'};",
    "inputs": [
      {
        "name": "task1Days",
        "type": "number",
        "default": 5,
        "min": 0,
        "max": 500,
        "step": 1,
        "slider": true
      },
      {
        "name": "task2Days",
        "type": "number",
        "default": 10,
        "min": 0,
        "max": 500,
        "step": 1,
        "slider": true
      },
      {
        "name": "task3Days",
        "type": "number",
        "default": 7,
        "min": 0,
        "max": 500,
        "step": 1,
        "slider": true
      },
      {
        "name": "task4Days",
        "type": "number",
        "default": 4,
        "min": 0,
        "max": 500,
        "step": 1,
        "slider": true
      },
      {
        "name": "bufferPercent",
        "type": "number",
        "default": 20,
        "min": 0,
        "max": 100,
        "step": 5,
        "slider": true
      },
      {
        "name": "workingDaysPerWeek",
        "type": "number",
        "default": 5,
        "min": 1,
        "max": 7,
        "step": 1
      }
    ],
    "outputs": [
      {
        "name": "bufferedDays",
        "precision": 1,
        "unit": "days"
      },
      {
        "name": "sequentialDays",
        "precision": 0,
        "unit": "days"
      },
      {
        "name": "calendarWeeks",
        "precision": 1,
        "unit": "weeks"
      },
      {
        "name": "criticalStages",
        "precision": 0,
        "unit": "",
        "type": "text"
      },
      {
        "name": "note",
        "precision": 0,
        "unit": "",
        "type": "text"
      }
    ],
    "interpret": null
  }
}
