[
  {
    "id": "davinci",
    "title": "Water-raising machines",
    "file": "davinci-codex-atlanticus-machines.png",
    "code": "rho = 1000 kg/m^3 \"Illustrative water density\"\ng = 9.81 m/s^2\nflow = 0.002 m^3/s in 0.001..0.005 ± 10% \"Modern illustrative flow\"\nhead = 3 m \"Assumed lift height\"\nefficiency = 0.45 \"Assumed overall efficiency\"\npumpPower := rho*g*flow*head/efficiency [W]\ncheck drive: pumpPower <= 200 W\nsweep Flow: flow = 0.001, 0.002, 0.005 m^3/s",
    "output": "pumpPower",
    "vary": "flow",
    "question": "How much shaft power lifts a chosen water flow?",
    "expected": [
      {
        "name": "pumpPower",
        "value": 130.79999999999998,
        "unit": "W"
      }
    ],
    "steps": [
      {
        "title": "Preserve the source and the question",
        "prompt": "Create a Napkin study called “Water-raising machines — illustrative sizing”. Keep the attached historical drawing as a source reference. Pump topology and the water-lift intention; never infer dimensions from the folio. The engineering question is: How much shaft power lifts a chosen water flow? Do not invent historical dimensions or ratings.",
        "encoding": "napkin_capabilities → napkin_create → napkin_snapshot; optional napkin_edit set-drawing for source metadata."
      },
      {
        "title": "Separate facts from assumptions",
        "prompt": "List what the source supports, what is uncertain, and what must be measured. For this first pass use clearly labeled modern illustrative values, never historical measurements. Model this chain: Flow, lift height, efficiency → shaft power → drive check.",
        "encoding": "Input quantities carry units, ranges, tolerances and assumption strings. Derived quantities retain equations."
      },
      {
        "title": "Encode the compact sketch model",
        "prompt": "Use napkin_sketch to apply the following text to the study with the current expectedRevision and prefix \"davinci\". Explain pumpPower and open the study. These numbers are illustrative assumptions.",
        "encoding": "napkin_snapshot → napkin_sketch → napkin_explain → napkin_open; scalar code below."
      },
      {
        "title": "Ask a decision question",
        "prompt": "Does required power exceed 200 W at 5 L/s? Which input dominates? Run the named scalar sweep in analytic mode and use napkin_analyze sensitivity for pumpPower versus flow. Report units, the check outcomes and assumptions; keep baseline inputs unchanged.",
        "encoding": "napkin_run for the sweep; napkin_analyze kind=sensitivity using returned quantity refs."
      },
      {
        "title": "Compare against evidence and revise",
        "prompt": "Measure flow, lift and input torque/speed on a bench pump; compare power and losses. Attach test or external-analysis evidence as source references. Compare like-for-like conditions, explain any discrepancy, and revise only inputs justified by that evidence. Report what the model still cannot answer.",
        "encoding": "napkin_explain → evidence reference via napkin_edit → revision-checked input update → rerun; prior runs become stale."
      }
    ],
    "limitation": "A steady hydraulic power budget; no gear motion, cavitation or pump curve. Efficiency is assumed.",
    "capability": "Unit-aware scalar expressions, expression checks, analytic sweep and numerical sensitivity.",
    "takeaway": "Flow, lift height, efficiency → shaft power → drive check.",
    "assumptionNotice": "Every number is a modern illustrative assumption, not a historical reconstruction.",
    "validation": {
      "created": 8,
      "baselineStatus": "passed",
      "baselineChecks": {
        "davinci:check:drive": {
          "samples": [
            {
              "time": 0,
              "value": {
                "value": 130.79999999999998,
                "unit": "W"
              }
            }
          ],
          "value": {
            "value": 130.79999999999998,
            "unit": "W"
          },
          "passed": true
        }
      },
      "runStatus": "failed",
      "sweep": {
        "id": "1b643f08-6619-471f-80ac-2c547de5055f",
        "revision": "1dfb7c12-c084-454d-8891-eef0e3c7b1b6",
        "scenario": {
          "id": "davinci:scenario:Flow",
          "kind": "scenario"
        },
        "mode": "analytic",
        "backend": "napkin-analytic",
        "backendVersion": "0.1.0",
        "seed": 0,
        "status": "failed",
        "observations": {
          "davinci:check:drive": {
            "samples": [
              {
                "time": 0,
                "value": {
                  "value": 65.39999999999999,
                  "unit": "W"
                }
              },
              {
                "time": 1,
                "value": {
                  "value": 130.79999999999998,
                  "unit": "W"
                }
              },
              {
                "time": 2,
                "value": {
                  "value": 327,
                  "unit": "W"
                }
              }
            ],
            "value": {
              "value": 327,
              "unit": "W"
            },
            "failedSamples": [
              2
            ],
            "passed": false
          }
        },
        "resolvedValues": {
          "davinci:rho": {
            "value": 1000,
            "unit": "kg/m^3"
          },
          "davinci:g": {
            "value": 9.81,
            "unit": "m/s^2"
          },
          "davinci:flow": {
            "value": 0.005,
            "unit": "m^3/s"
          },
          "davinci:head": {
            "value": 3,
            "unit": "m"
          },
          "davinci:efficiency": {
            "value": 0.45,
            "unit": ""
          },
          "davinci:pumpPower": {
            "value": 327,
            "unit": "W"
          }
        },
        "assumptions": [
          {
            "id": "davinci:rho",
            "text": "Illustrative water density"
          },
          {
            "id": "davinci:flow",
            "text": "Modern illustrative flow"
          },
          {
            "id": "davinci:head",
            "text": "Assumed lift height"
          },
          {
            "id": "davinci:efficiency",
            "text": "Assumed overall efficiency"
          }
        ],
        "diagnostics": []
      },
      "sensitivity": {
        "kind": "sensitivity",
        "revision": "1dfb7c12-c084-454d-8891-eef0e3c7b1b6",
        "scenario": null,
        "method": "Central difference at ±1% of each input; elasticity = (dy/dx)·(x/y)",
        "limitations": [],
        "outputs": {
          "davinci:pumpPower": 130.79999999999998
        },
        "units": {
          "davinci:pumpPower": "W"
        },
        "rows": [
          {
            "input": {
              "id": "davinci:flow",
              "kind": "quantity"
            },
            "name": "flow",
            "value": 0.002,
            "unit": "m^3/s",
            "derivative": {
              "davinci:pumpPower": 65400.00000000034
            },
            "elasticity": {
              "davinci:pumpPower": 1.0000000000000053
            }
          }
        ],
        "evaluations": 3,
        "milliseconds": 0.49049999999999727
      },
      "validated": true
    }
  },
  {
    "id": "watt",
    "title": "Separate-condenser engine",
    "file": "watt-steam-engine-condenser.png",
    "code": "pressure = 150 kPa in 100..200 ± 10% \"Assumed mean effective pressure\"\nswept = 0.01 m^3 \"Assumed swept volume per working stroke\"\nstrokes = 2 Hz \"Power strokes per second, not shaft rpm\"\nefficiency = 0.8 \"Assumed mechanical efficiency\"\nwork := pressure*swept [J]\nshaftPower := work*strokes*efficiency [W]\ncheck output: shaftPower >= 2000 W\nsweep Pressure: pressure = 100, 150, 200 kPa",
    "output": "shaftPower",
    "vary": "pressure",
    "question": "What shaft power follows from an assumed mean effective pressure?",
    "expected": [
      {
        "name": "work",
        "value": 1500,
        "unit": "J"
      },
      {
        "name": "shaftPower",
        "value": 2400,
        "unit": "W"
      }
    ],
    "steps": [
      {
        "title": "Preserve the source and the question",
        "prompt": "Create a Napkin study called “Separate-condenser engine — illustrative sizing”. Keep the attached historical drawing as a source reference. Label the source as an 1878 published engraving of a 1784 design, and retain the condenser idea. The engineering question is: What shaft power follows from an assumed mean effective pressure? Do not invent historical dimensions or ratings.",
        "encoding": "napkin_capabilities → napkin_create → napkin_snapshot; optional napkin_edit set-drawing for source metadata."
      },
      {
        "title": "Separate facts from assumptions",
        "prompt": "List what the source supports, what is uncertain, and what must be measured. For this first pass use clearly labeled modern illustrative values, never historical measurements. Model this chain: Mean effective pressure, displaced volume and stroke frequency → indicated work → shaft power.",
        "encoding": "Input quantities carry units, ranges, tolerances and assumption strings. Derived quantities retain equations."
      },
      {
        "title": "Encode the compact sketch model",
        "prompt": "Use napkin_sketch to apply the following text to the study with the current expectedRevision and prefix \"watt\". Explain shaftPower and open the study. These numbers are illustrative assumptions.",
        "encoding": "napkin_snapshot → napkin_sketch → napkin_explain → napkin_open; scalar code below."
      },
      {
        "title": "Ask a decision question",
        "prompt": "What mean effective pressure makes the 2 kW check pass? Run the named scalar sweep in analytic mode and use napkin_analyze sensitivity for shaftPower versus pressure. Report units, the check outcomes and assumptions; keep baseline inputs unchanged.",
        "encoding": "napkin_run for the sweep; napkin_analyze kind=sensitivity using returned quantity refs."
      },
      {
        "title": "Compare against evidence and revise",
        "prompt": "Compare with a measured indicator diagram, actual displacement and brake power. Attach test or external-analysis evidence as source references. Compare like-for-like conditions, explain any discrepancy, and revise only inputs justified by that evidence. Report what the model still cannot answer.",
        "encoding": "napkin_explain → evidence reference via napkin_edit → revision-checked input update → rerun; prior runs become stale."
      }
    ],
    "limitation": "Not a steam cycle or condenser heat-transfer model. Mean effective pressure must come from evidence.",
    "capability": "Unit-aware scalar expressions, expression checks, analytic sweep and numerical sensitivity.",
    "takeaway": "Mean effective pressure, displaced volume and stroke frequency → indicated work → shaft power.",
    "assumptionNotice": "Every number is a modern illustrative assumption, not a historical reconstruction.",
    "validation": {
      "created": 8,
      "baselineStatus": "passed",
      "baselineChecks": {
        "watt:check:output": {
          "samples": [
            {
              "time": 0,
              "value": {
                "value": 2400,
                "unit": "W"
              }
            }
          ],
          "value": {
            "value": 2400,
            "unit": "W"
          },
          "passed": true
        }
      },
      "runStatus": "failed",
      "sweep": {
        "id": "d72c2966-39cd-4e22-a02c-f341bbd28843",
        "revision": "bb9be4a2-4353-470b-96cb-41ed95aac02b",
        "scenario": {
          "id": "watt:scenario:Pressure",
          "kind": "scenario"
        },
        "mode": "analytic",
        "backend": "napkin-analytic",
        "backendVersion": "0.1.0",
        "seed": 0,
        "status": "failed",
        "observations": {
          "watt:check:output": {
            "samples": [
              {
                "time": 0,
                "value": {
                  "value": 1600,
                  "unit": "W"
                }
              },
              {
                "time": 1,
                "value": {
                  "value": 2400,
                  "unit": "W"
                }
              },
              {
                "time": 2,
                "value": {
                  "value": 3200,
                  "unit": "W"
                }
              }
            ],
            "value": {
              "value": 1600,
              "unit": "W"
            },
            "failedSamples": [
              0
            ],
            "passed": false
          }
        },
        "resolvedValues": {
          "watt:pressure": {
            "value": 200,
            "unit": "kPa"
          },
          "watt:swept": {
            "value": 0.01,
            "unit": "m^3"
          },
          "watt:strokes": {
            "value": 2,
            "unit": "Hz"
          },
          "watt:efficiency": {
            "value": 0.8,
            "unit": ""
          },
          "watt:work": {
            "value": 2000,
            "unit": "J"
          },
          "watt:shaftPower": {
            "value": 3200,
            "unit": "W"
          }
        },
        "assumptions": [
          {
            "id": "watt:pressure",
            "text": "Assumed mean effective pressure"
          },
          {
            "id": "watt:swept",
            "text": "Assumed swept volume per working stroke"
          },
          {
            "id": "watt:strokes",
            "text": "Power strokes per second, not shaft rpm"
          },
          {
            "id": "watt:efficiency",
            "text": "Assumed mechanical efficiency"
          }
        ],
        "diagnostics": []
      },
      "sensitivity": {
        "kind": "sensitivity",
        "revision": "bb9be4a2-4353-470b-96cb-41ed95aac02b",
        "scenario": null,
        "method": "Central difference at ±1% of each input; elasticity = (dy/dx)·(x/y)",
        "limitations": [],
        "outputs": {
          "watt:shaftPower": 2400
        },
        "units": {
          "watt:shaftPower": "W"
        },
        "rows": [
          {
            "input": {
              "id": "watt:pressure",
              "kind": "quantity"
            },
            "name": "pressure",
            "value": 150,
            "unit": "kPa",
            "derivative": {
              "watt:shaftPower": 16
            },
            "elasticity": {
              "watt:shaftPower": 1
            }
          }
        ],
        "evaluations": 3,
        "milliseconds": 0.11654100000004064
      },
      "validated": true
    }
  },
  {
    "id": "bell",
    "title": "Liquid transmitter",
    "file": "bell-telephone-notebook.png",
    "code": "voltage = 3 V \"Illustrative bench supply\"\nseriesResistance = 100 ohm\ntransmitterResistance = 200 ohm \"Illustrative nominal liquid-contact resistance\"\ndeltaResistance = 10 ohm in 1..30 \"Small imposed resistance change\"\nbaseline := voltage/(seriesResistance+transmitterResistance) [A]\nperturbed := voltage/(seriesResistance+transmitterResistance+deltaResistance) [A]\nsignalChange := abs(perturbed-baseline) [mA]\ncheck measurable: signalChange >= 0.2 mA\nsweep Contact: deltaResistance = 1, 10, 30 ohm",
    "output": "signalChange",
    "vary": "deltaResistance",
    "question": "How large is a static current change from a resistance perturbation?",
    "expected": [
      {
        "name": "baseline",
        "value": 0.01,
        "unit": "A"
      },
      {
        "name": "perturbed",
        "value": 0.00967741935483871,
        "unit": "A"
      },
      {
        "name": "signalChange",
        "value": 0.3225806451612901,
        "unit": "mA"
      }
    ],
    "steps": [
      {
        "title": "Preserve the source and the question",
        "prompt": "Create a Napkin study called “Liquid transmitter — illustrative sizing”. Keep the attached historical drawing as a source reference. Preserve the notebook entry and liquid-transmitter drawing; mark sound-to-resistance coupling as unresolved. The engineering question is: How large is a static current change from a resistance perturbation? Do not invent historical dimensions or ratings.",
        "encoding": "napkin_capabilities → napkin_create → napkin_snapshot; optional napkin_edit set-drawing for source metadata."
      },
      {
        "title": "Separate facts from assumptions",
        "prompt": "List what the source supports, what is uncertain, and what must be measured. For this first pass use clearly labeled modern illustrative values, never historical measurements. Model this chain: Supply, series resistance, transmitter resistance and a perturbation → two DC operating points.",
        "encoding": "Input quantities carry units, ranges, tolerances and assumption strings. Derived quantities retain equations."
      },
      {
        "title": "Encode the compact sketch model",
        "prompt": "Use napkin_sketch to apply the following text to the study with the current expectedRevision and prefix \"bell\". Explain signalChange and open the study. These numbers are illustrative assumptions.",
        "encoding": "napkin_snapshot → napkin_sketch → napkin_explain → napkin_open; scalar code below."
      },
      {
        "title": "Ask a decision question",
        "prompt": "How large must the resistance change be to produce 0.2 mA? Run the named scalar sweep in analytic mode and use napkin_analyze sensitivity for signalChange versus deltaResistance. Report units, the check outcomes and assumptions; keep baseline inputs unchanged.",
        "encoding": "napkin_run for the sweep; napkin_analyze kind=sensitivity using returned quantity refs."
      },
      {
        "title": "Compare against evidence and revise",
        "prompt": "Measure static resistance versus contact displacement and compare the predicted current difference. Attach test or external-analysis evidence as source references. Compare like-for-like conditions, explain any discrepancy, and revise only inputs justified by that evidence. Report what the model still cannot answer.",
        "encoding": "napkin_explain → evidence reference via napkin_edit → revision-checked input update → rerun; prior runs become stale."
      }
    ],
    "limitation": "A pair of DC points; no acoustics, diaphragm motion, waveform, intelligibility or transient circuit simulation.",
    "capability": "Unit-aware scalar expressions, expression checks, analytic sweep and numerical sensitivity.",
    "takeaway": "Supply, series resistance, transmitter resistance and a perturbation → two DC operating points.",
    "assumptionNotice": "Every number is a modern illustrative assumption, not a historical reconstruction.",
    "validation": {
      "created": 9,
      "baselineStatus": "passed",
      "baselineChecks": {
        "bell:check:measurable": {
          "samples": [
            {
              "time": 0,
              "value": {
                "value": 0.3225806451612901,
                "unit": "mA"
              }
            }
          ],
          "value": {
            "value": 0.3225806451612901,
            "unit": "mA"
          },
          "passed": true
        }
      },
      "runStatus": "failed",
      "sweep": {
        "id": "7e1f6566-d01a-4874-a129-04b59fa70739",
        "revision": "184e723c-5268-4a74-817c-b20fba4be29d",
        "scenario": {
          "id": "bell:scenario:Contact",
          "kind": "scenario"
        },
        "mode": "analytic",
        "backend": "napkin-analytic",
        "backendVersion": "0.1.0",
        "seed": 0,
        "status": "failed",
        "observations": {
          "bell:check:measurable": {
            "samples": [
              {
                "time": 0,
                "value": {
                  "value": 0.03322259136212709,
                  "unit": "mA"
                }
              },
              {
                "time": 1,
                "value": {
                  "value": 0.3225806451612901,
                  "unit": "mA"
                }
              },
              {
                "time": 2,
                "value": {
                  "value": 0.9090909090909097,
                  "unit": "mA"
                }
              }
            ],
            "value": {
              "value": 0.03322259136212709,
              "unit": "mA"
            },
            "failedSamples": [
              0
            ],
            "passed": false
          }
        },
        "resolvedValues": {
          "bell:voltage": {
            "value": 3,
            "unit": "V"
          },
          "bell:seriesResistance": {
            "value": 100,
            "unit": "ohm"
          },
          "bell:transmitterResistance": {
            "value": 200,
            "unit": "ohm"
          },
          "bell:deltaResistance": {
            "value": 30,
            "unit": "ohm"
          },
          "bell:baseline": {
            "value": 0.01,
            "unit": "A"
          },
          "bell:perturbed": {
            "value": 0.00909090909090909,
            "unit": "A"
          },
          "bell:signalChange": {
            "value": 0.9090909090909097,
            "unit": "mA"
          }
        },
        "assumptions": [
          {
            "id": "bell:voltage",
            "text": "Illustrative bench supply"
          },
          {
            "id": "bell:transmitterResistance",
            "text": "Illustrative nominal liquid-contact resistance"
          },
          {
            "id": "bell:deltaResistance",
            "text": "Small imposed resistance change"
          }
        ],
        "diagnostics": []
      },
      "sensitivity": {
        "kind": "sensitivity",
        "revision": "184e723c-5268-4a74-817c-b20fba4be29d",
        "scenario": null,
        "method": "Central difference at ±1% of each input; elasticity = (dy/dx)·(x/y)",
        "limitations": [],
        "outputs": {
          "bell:signalChange": 0.3225806451612901
        },
        "units": {
          "bell:signalChange": "mA"
        },
        "rows": [
          {
            "input": {
              "id": "bell:deltaResistance",
              "kind": "quantity"
            },
            "name": "deltaResistance",
            "value": 10,
            "unit": "ohm",
            "derivative": {
              "bell:signalChange": 0.03121748503824906
            },
            "elasticity": {
              "bell:signalChange": 0.9677420361857215
            }
          }
        ],
        "evaluations": 3,
        "milliseconds": 0.1742079999999646
      },
      "validated": true
    }
  },
  {
    "id": "edison",
    "title": "Carbon-filament lamp",
    "file": "edison-electric-lamp-patent.png",
    "code": "voltage = 100 V \"Illustrative modern supply assumption\"\nresistance = 200 ohm in 100..400 ± 10% \"Assumed operating-temperature resistance\"\ncurrent := voltage/resistance [A]\npower := voltage*current [W]\ncheck powerBudget: power <= 60 W\ncheck currentBudget: current <= 0.6 A\nsweep Filament: resistance = 100, 200, 400 ohm",
    "output": "power",
    "vary": "resistance",
    "question": "What current and power does an assumed hot filament draw?",
    "expected": [
      {
        "name": "current",
        "value": 0.5,
        "unit": "A"
      },
      {
        "name": "power",
        "value": 50,
        "unit": "W"
      }
    ],
    "steps": [
      {
        "title": "Preserve the source and the question",
        "prompt": "Create a Napkin study called “Carbon-filament lamp — illustrative sizing”. Keep the attached historical drawing as a source reference. Preserve the patent structure and filament-support intent; do not estimate temperature from the image. The engineering question is: What current and power does an assumed hot filament draw? Do not invent historical dimensions or ratings.",
        "encoding": "napkin_capabilities → napkin_create → napkin_snapshot; optional napkin_edit set-drawing for source metadata."
      },
      {
        "title": "Separate facts from assumptions",
        "prompt": "List what the source supports, what is uncertain, and what must be measured. For this first pass use clearly labeled modern illustrative values, never historical measurements. Model this chain: Operating voltage and hot resistance → current and electrical power → supply checks.",
        "encoding": "Input quantities carry units, ranges, tolerances and assumption strings. Derived quantities retain equations."
      },
      {
        "title": "Encode the compact sketch model",
        "prompt": "Use napkin_sketch to apply the following text to the study with the current expectedRevision and prefix \"edison\". Explain power and open the study. These numbers are illustrative assumptions.",
        "encoding": "napkin_snapshot → napkin_sketch → napkin_explain → napkin_open; scalar code below."
      },
      {
        "title": "Ask a decision question",
        "prompt": "Which resistance values stay below both 60 W and 0.6 A? Run the named scalar sweep in analytic mode and use napkin_analyze sensitivity for power versus resistance. Report units, the check outcomes and assumptions; keep baseline inputs unchanged.",
        "encoding": "napkin_run for the sweep; napkin_analyze kind=sensitivity using returned quantity refs."
      },
      {
        "title": "Compare against evidence and revise",
        "prompt": "Measure hot resistance and supply power; use optical and thermal measurements for brightness and lifetime. Attach test or external-analysis evidence as source references. Compare like-for-like conditions, explain any discrepancy, and revise only inputs justified by that evidence. Report what the model still cannot answer.",
        "encoding": "napkin_explain → evidence reference via napkin_edit → revision-checked input update → rerun; prior runs become stale."
      }
    ],
    "limitation": "DC electrical sizing only; no radiation, temperature-dependent resistance, vacuum physics, brightness or lifetime prediction.",
    "capability": "Unit-aware scalar expressions, expression checks, analytic sweep and numerical sensitivity.",
    "takeaway": "Operating voltage and hot resistance → current and electrical power → supply checks.",
    "assumptionNotice": "Every number is a modern illustrative assumption, not a historical reconstruction.",
    "validation": {
      "created": 7,
      "baselineStatus": "passed",
      "baselineChecks": {
        "edison:check:powerBudget": {
          "samples": [
            {
              "time": 0,
              "value": {
                "value": 50,
                "unit": "W"
              }
            }
          ],
          "value": {
            "value": 50,
            "unit": "W"
          },
          "passed": true
        },
        "edison:check:currentBudget": {
          "samples": [
            {
              "time": 0,
              "value": {
                "value": 0.5,
                "unit": "A"
              }
            }
          ],
          "value": {
            "value": 0.5,
            "unit": "A"
          },
          "passed": true
        }
      },
      "runStatus": "failed",
      "sweep": {
        "id": "e9896e98-84c5-41ce-a9eb-9515f0b4a57c",
        "revision": "948b7e73-c01b-4422-86ef-cb327df7d50d",
        "scenario": {
          "id": "edison:scenario:Filament",
          "kind": "scenario"
        },
        "mode": "analytic",
        "backend": "napkin-analytic",
        "backendVersion": "0.1.0",
        "seed": 0,
        "status": "failed",
        "observations": {
          "edison:check:powerBudget": {
            "samples": [
              {
                "time": 0,
                "value": {
                  "value": 100,
                  "unit": "W"
                }
              },
              {
                "time": 1,
                "value": {
                  "value": 50,
                  "unit": "W"
                }
              },
              {
                "time": 2,
                "value": {
                  "value": 25,
                  "unit": "W"
                }
              }
            ],
            "value": {
              "value": 100,
              "unit": "W"
            },
            "failedSamples": [
              0
            ],
            "passed": false
          },
          "edison:check:currentBudget": {
            "samples": [
              {
                "time": 0,
                "value": {
                  "value": 1,
                  "unit": "A"
                }
              },
              {
                "time": 1,
                "value": {
                  "value": 0.5,
                  "unit": "A"
                }
              },
              {
                "time": 2,
                "value": {
                  "value": 0.25,
                  "unit": "A"
                }
              }
            ],
            "value": {
              "value": 1,
              "unit": "A"
            },
            "failedSamples": [
              0
            ],
            "passed": false
          }
        },
        "resolvedValues": {
          "edison:voltage": {
            "value": 100,
            "unit": "V"
          },
          "edison:resistance": {
            "value": 400,
            "unit": "ohm"
          },
          "edison:current": {
            "value": 0.25,
            "unit": "A"
          },
          "edison:power": {
            "value": 25,
            "unit": "W"
          }
        },
        "assumptions": [
          {
            "id": "edison:voltage",
            "text": "Illustrative modern supply assumption"
          },
          {
            "id": "edison:resistance",
            "text": "Assumed operating-temperature resistance"
          }
        ],
        "diagnostics": []
      },
      "sensitivity": {
        "kind": "sensitivity",
        "revision": "948b7e73-c01b-4422-86ef-cb327df7d50d",
        "scenario": null,
        "method": "Central difference at ±1% of each input; elasticity = (dy/dx)·(x/y)",
        "limitations": [],
        "outputs": {
          "edison:power": 50
        },
        "units": {
          "edison:power": "W"
        },
        "rows": [
          {
            "input": {
              "id": "edison:resistance",
              "kind": "quantity"
            },
            "name": "resistance",
            "value": 200,
            "unit": "ohm",
            "derivative": {
              "edison:power": -0.2500250025002497
            },
            "elasticity": {
              "edison:power": -1.000100010000999
            }
          }
        ],
        "evaluations": 3,
        "milliseconds": 0.0747079999999869
      },
      "validated": true
    }
  },
  {
    "id": "tesla",
    "title": "Rotating-field motor",
    "file": "tesla-induction-motor-patent.png",
    "code": "frequency = 50 Hz \"Illustrative supply frequency\"\npoles = 4 \"Assumed total magnetic poles\"\nslip = 0.04 in 0.01..0.1 \"Assumed motoring slip\"\npower = 500 W \"Assumed mechanical shaft output\"\nsyncOmega := 4*pi*frequency/poles [rad/s]\nshaftOmega := syncOmega*(1-slip) [rad/s]\ntorque := power/shaftOmega [N*m]\ncheck torqueBudget: torque <= 4 N*m\nsweep Slip: slip = 0.01, 0.04, 0.1",
    "output": "torque",
    "vary": "slip",
    "question": "How do assumed slip and mechanical output set shaft speed and torque?",
    "expected": [
      {
        "name": "syncOmega",
        "value": 157.07963267948966,
        "unit": "rad/s"
      },
      {
        "name": "shaftOmega",
        "value": 150.79644737231007,
        "unit": "rad/s"
      },
      {
        "name": "torque",
        "value": 3.315727981081153,
        "unit": "N*m"
      }
    ],
    "steps": [
      {
        "title": "Preserve the source and the question",
        "prompt": "Create a Napkin study called “Rotating-field motor — illustrative sizing”. Keep the attached historical drawing as a source reference. Preserve the rotating-field winding idea; separate the conceptual motor from any later machine rating. The engineering question is: How do assumed slip and mechanical output set shaft speed and torque? Do not invent historical dimensions or ratings.",
        "encoding": "napkin_capabilities → napkin_create → napkin_snapshot; optional napkin_edit set-drawing for source metadata."
      },
      {
        "title": "Separate facts from assumptions",
        "prompt": "List what the source supports, what is uncertain, and what must be measured. For this first pass use clearly labeled modern illustrative values, never historical measurements. Model this chain: Supply frequency and pole count → synchronous angular speed → slip-adjusted shaft speed → torque.",
        "encoding": "Input quantities carry units, ranges, tolerances and assumption strings. Derived quantities retain equations."
      },
      {
        "title": "Encode the compact sketch model",
        "prompt": "Use napkin_sketch to apply the following text to the study with the current expectedRevision and prefix \"tesla\". Explain torque and open the study. These numbers are illustrative assumptions.",
        "encoding": "napkin_snapshot → napkin_sketch → napkin_explain → napkin_open; scalar code below."
      },
      {
        "title": "Ask a decision question",
        "prompt": "How does increasing assumed slip alter the torque for a fixed 500 W shaft output? Run the named scalar sweep in analytic mode and use napkin_analyze sensitivity for torque versus slip. Report units, the check outcomes and assumptions; keep baseline inputs unchanged.",
        "encoding": "napkin_run for the sweep; napkin_analyze kind=sensitivity using returned quantity refs."
      },
      {
        "title": "Compare against evidence and revise",
        "prompt": "Compare tachometer and dynamometer measurements and the motor datasheet. Attach test or external-analysis evidence as source references. Compare like-for-like conditions, explain any discrepancy, and revise only inputs justified by that evidence. Report what the model still cannot answer.",
        "encoding": "napkin_explain → evidence reference via napkin_edit → revision-checked input update → rerun; prior runs become stale."
      }
    ],
    "limitation": "Slip and output power are independent assumptions; no electromagnetic field solve, starting torque or torque-slip prediction.",
    "capability": "Unit-aware scalar expressions, expression checks, analytic sweep and numerical sensitivity.",
    "takeaway": "Supply frequency and pole count → synchronous angular speed → slip-adjusted shaft speed → torque.",
    "assumptionNotice": "Every number is a modern illustrative assumption, not a historical reconstruction.",
    "validation": {
      "created": 9,
      "baselineStatus": "passed",
      "baselineChecks": {
        "tesla:check:torqueBudget": {
          "samples": [
            {
              "time": 0,
              "value": {
                "value": 3.315727981081153,
                "unit": "N*m"
              }
            }
          ],
          "value": {
            "value": 3.315727981081153,
            "unit": "N*m"
          },
          "passed": true
        }
      },
      "runStatus": "passed",
      "sweep": {
        "id": "19af94fe-4714-463a-b127-7d7f502fdb99",
        "revision": "d148472f-1666-4903-b57b-ca5c751a84dd",
        "scenario": {
          "id": "tesla:scenario:Slip",
          "kind": "scenario"
        },
        "mode": "analytic",
        "backend": "napkin-analytic",
        "backendVersion": "0.1.0",
        "seed": 0,
        "status": "passed",
        "observations": {
          "tesla:check:torqueBudget": {
            "samples": [
              {
                "time": 0,
                "value": {
                  "value": 3.215251375593845,
                  "unit": "N*m"
                }
              },
              {
                "time": 1,
                "value": {
                  "value": 3.315727981081153,
                  "unit": "N*m"
                }
              },
              {
                "time": 2,
                "value": {
                  "value": 3.53677651315323,
                  "unit": "N*m"
                }
              }
            ],
            "value": {
              "value": 3.53677651315323,
              "unit": "N*m"
            },
            "failedSamples": [],
            "passed": true
          }
        },
        "resolvedValues": {
          "tesla:frequency": {
            "value": 50,
            "unit": "Hz"
          },
          "tesla:poles": {
            "value": 4,
            "unit": ""
          },
          "tesla:slip": {
            "value": 0.1,
            "unit": ""
          },
          "tesla:power": {
            "value": 500,
            "unit": "W"
          },
          "tesla:syncOmega": {
            "value": 157.07963267948966,
            "unit": "rad/s"
          },
          "tesla:shaftOmega": {
            "value": 141.3716694115407,
            "unit": "rad/s"
          },
          "tesla:torque": {
            "value": 3.53677651315323,
            "unit": "N*m"
          }
        },
        "assumptions": [
          {
            "id": "tesla:frequency",
            "text": "Illustrative supply frequency"
          },
          {
            "id": "tesla:poles",
            "text": "Assumed total magnetic poles"
          },
          {
            "id": "tesla:slip",
            "text": "Assumed motoring slip"
          },
          {
            "id": "tesla:power",
            "text": "Assumed mechanical shaft output"
          }
        ],
        "diagnostics": []
      },
      "sensitivity": {
        "kind": "sensitivity",
        "revision": "d148472f-1666-4903-b57b-ca5c751a84dd",
        "scenario": null,
        "method": "Central difference at ±1% of each input; elasticity = (dy/dx)·(x/y)",
        "limitations": [],
        "outputs": {
          "tesla:torque": 3.315727981081153
        },
        "units": {
          "tesla:torque": "N*m"
        },
        "rows": [
          {
            "input": {
              "id": "tesla:slip",
              "kind": "quantity"
            },
            "name": "slip",
            "value": 0.04,
            "unit": "",
            "derivative": {
              "tesla:torque": 3.4538839132591814
            },
            "elasticity": {
              "tesla:torque": 0.04166667390046852
            }
          }
        ],
        "evaluations": 3,
        "milliseconds": 0.10358300000001464
      },
      "validated": true
    }
  },
  {
    "id": "wright",
    "title": "Wing-warping aircraft",
    "file": "wright-flyer-patent.png",
    "code": "rho = 1.225 kg/m^3 \"Illustrative air density\"\nspeed = 12 m/s in 8..18 ± 5% \"Illustrative flight speed\"\narea = 30 m^2 \"Assumed lifting area\"\nCL = 0.8 \"Assumed lift coefficient\"\nmass = 300 kg \"Assumed all-up mass\"\nweight := mass*9.81 m/s^2 [N]\nlift := 0.5*rho*speed^2*area*CL [N]\ncheck support: lift >= weight\nsweep Speed: speed = 8, 12, 18 m/s",
    "output": "lift",
    "vary": "speed",
    "question": "What airspeed gives enough idealized lift for an assumed mass?",
    "expected": [
      {
        "name": "weight",
        "value": 2943,
        "unit": "N"
      },
      {
        "name": "lift",
        "value": 2116.8,
        "unit": "N"
      }
    ],
    "steps": [
      {
        "title": "Preserve the source and the question",
        "prompt": "Create a Napkin study called “Wing-warping aircraft — illustrative sizing”. Keep the attached historical drawing as a source reference. Preserve the wing-warping control concept and patent date; keep the drawing distinct from the 1903 flight. The engineering question is: What airspeed gives enough idealized lift for an assumed mass? Do not invent historical dimensions or ratings.",
        "encoding": "napkin_capabilities → napkin_create → napkin_snapshot; optional napkin_edit set-drawing for source metadata."
      },
      {
        "title": "Separate facts from assumptions",
        "prompt": "List what the source supports, what is uncertain, and what must be measured. For this first pass use clearly labeled modern illustrative values, never historical measurements. Model this chain: Air density, speed, lifting area and assumed lift coefficient → lift compared with weight.",
        "encoding": "Input quantities carry units, ranges, tolerances and assumption strings. Derived quantities retain equations."
      },
      {
        "title": "Encode the compact sketch model",
        "prompt": "Use napkin_sketch to apply the following text to the study with the current expectedRevision and prefix \"wright\". Explain lift and open the study. These numbers are illustrative assumptions.",
        "encoding": "napkin_snapshot → napkin_sketch → napkin_explain → napkin_open; scalar code below."
      },
      {
        "title": "Ask a decision question",
        "prompt": "At what speed does this fixed-CL model first carry the assumed mass? Run the named scalar sweep in analytic mode and use napkin_analyze sensitivity for lift versus speed. Report units, the check outcomes and assumptions; keep baseline inputs unchanged.",
        "encoding": "napkin_run for the sweep; napkin_analyze kind=sensitivity using returned quantity refs."
      },
      {
        "title": "Compare against evidence and revise",
        "prompt": "Replace CL with wind-tunnel or flight measurements; compare lift and inspect stall behavior. Attach test or external-analysis evidence as source references. Compare like-for-like conditions, explain any discrepancy, and revise only inputs justified by that evidence. Report what the model still cannot answer.",
        "encoding": "napkin_explain → evidence reference via napkin_edit → revision-checked input update → rerun; prior runs become stale."
      }
    ],
    "limitation": "Steady lift sizing only; no wing-warping control effectiveness, stall, stability, biplane interference or CFD.",
    "capability": "Unit-aware scalar expressions, expression checks, analytic sweep and numerical sensitivity.",
    "takeaway": "Air density, speed, lifting area and assumed lift coefficient → lift compared with weight.",
    "assumptionNotice": "Every number is a modern illustrative assumption, not a historical reconstruction.",
    "validation": {
      "created": 9,
      "baselineStatus": "failed",
      "baselineChecks": {
        "wright:check:support": {
          "samples": [
            {
              "time": 0,
              "value": {
                "value": 2116.8,
                "unit": "N"
              }
            }
          ],
          "value": {
            "value": 2116.8,
            "unit": "N"
          },
          "passed": false
        }
      },
      "runStatus": "failed",
      "sweep": {
        "id": "d86b1885-032a-408e-995f-fc73598ea7bd",
        "revision": "6172485f-3820-406f-8113-cf9190153798",
        "scenario": {
          "id": "wright:scenario:Speed",
          "kind": "scenario"
        },
        "mode": "analytic",
        "backend": "napkin-analytic",
        "backendVersion": "0.1.0",
        "seed": 0,
        "status": "failed",
        "observations": {
          "wright:check:support": {
            "samples": [
              {
                "time": 0,
                "value": {
                  "value": 940.8000000000001,
                  "unit": "N"
                }
              },
              {
                "time": 1,
                "value": {
                  "value": 2116.8,
                  "unit": "N"
                }
              },
              {
                "time": 2,
                "value": {
                  "value": 4762.800000000001,
                  "unit": "N"
                }
              }
            ],
            "value": {
              "value": 940.8000000000001,
              "unit": "N"
            },
            "failedSamples": [
              0,
              1
            ],
            "passed": false
          }
        },
        "resolvedValues": {
          "wright:rho": {
            "value": 1.225,
            "unit": "kg/m^3"
          },
          "wright:speed": {
            "value": 18,
            "unit": "m/s"
          },
          "wright:area": {
            "value": 30,
            "unit": "m^2"
          },
          "wright:CL": {
            "value": 0.8,
            "unit": ""
          },
          "wright:mass": {
            "value": 300,
            "unit": "kg"
          },
          "wright:weight": {
            "value": 2943,
            "unit": "N"
          },
          "wright:lift": {
            "value": 4762.800000000001,
            "unit": "N"
          }
        },
        "assumptions": [
          {
            "id": "wright:rho",
            "text": "Illustrative air density"
          },
          {
            "id": "wright:speed",
            "text": "Illustrative flight speed"
          },
          {
            "id": "wright:area",
            "text": "Assumed lifting area"
          },
          {
            "id": "wright:CL",
            "text": "Assumed lift coefficient"
          },
          {
            "id": "wright:mass",
            "text": "Assumed all-up mass"
          }
        ],
        "diagnostics": []
      },
      "sensitivity": {
        "kind": "sensitivity",
        "revision": "6172485f-3820-406f-8113-cf9190153798",
        "scenario": null,
        "method": "Central difference at ±1% of each input; elasticity = (dy/dx)·(x/y)",
        "limitations": [],
        "outputs": {
          "wright:lift": 2116.8
        },
        "units": {
          "wright:lift": "N"
        },
        "rows": [
          {
            "input": {
              "id": "wright:speed",
              "kind": "quantity"
            },
            "name": "speed",
            "value": 12,
            "unit": "m/s",
            "derivative": {
              "wright:lift": 352.79999999999825
            },
            "elasticity": {
              "wright:lift": 1.9999999999999898
            }
          }
        ],
        "evaluations": 3,
        "milliseconds": 0.115916000000027
      },
      "validated": true
    }
  },
  {
    "id": "goddard",
    "title": "Multistage rocket",
    "file": "goddard-rocket-patent.png",
    "code": "exhaustSpeed = 2000 m/s in 1500..2500 \"Illustrative effective exhaust speed\"\nratio1 = 3 \"Assumed wet-to-final mass ratio for stage one\"\nratio2 = 2 \"Assumed wet-to-final mass ratio for stage two\"\nstage1 := exhaustSpeed*log(ratio1) [m/s]\nstage2 := exhaustSpeed*log(ratio2) [m/s]\ntotalDeltaV := stage1+stage2 [m/s]\ncheck budget: totalDeltaV >= 3500 m/s\nsweep Exhaust: exhaustSpeed = 1500, 2000, 2500 m/s",
    "output": "totalDeltaV",
    "vary": "exhaustSpeed",
    "question": "What ideal velocity budget results from two assumed stage mass ratios?",
    "expected": [
      {
        "name": "stage1",
        "value": 2197.224577336219,
        "unit": "m/s"
      },
      {
        "name": "stage2",
        "value": 1386.2943611198905,
        "unit": "m/s"
      },
      {
        "name": "totalDeltaV",
        "value": 3583.51893845611,
        "unit": "m/s"
      }
    ],
    "steps": [
      {
        "title": "Preserve the source and the question",
        "prompt": "Create a Napkin study called “Multistage rocket — illustrative sizing”. Keep the attached historical drawing as a source reference. Preserve the 1914 staged apparatus; do not relabel it as the 1926 liquid-fuel rocket. The engineering question is: What ideal velocity budget results from two assumed stage mass ratios? Do not invent historical dimensions or ratings.",
        "encoding": "napkin_capabilities → napkin_create → napkin_snapshot; optional napkin_edit set-drawing for source metadata."
      },
      {
        "title": "Separate facts from assumptions",
        "prompt": "List what the source supports, what is uncertain, and what must be measured. For this first pass use clearly labeled modern illustrative values, never historical measurements. Model this chain: Two dimensionless stage mass ratios and effective exhaust speed → summed ideal delta-v.",
        "encoding": "Input quantities carry units, ranges, tolerances and assumption strings. Derived quantities retain equations."
      },
      {
        "title": "Encode the compact sketch model",
        "prompt": "Use napkin_sketch to apply the following text to the study with the current expectedRevision and prefix \"goddard\". Explain totalDeltaV and open the study. These numbers are illustrative assumptions.",
        "encoding": "napkin_snapshot → napkin_sketch → napkin_explain → napkin_open; scalar code below."
      },
      {
        "title": "Ask a decision question",
        "prompt": "Does the ideal 3.5 km/s budget survive a lower assumed effective exhaust speed? Run the named scalar sweep in analytic mode and use napkin_analyze sensitivity for totalDeltaV versus exhaustSpeed. Report units, the check outcomes and assumptions; keep baseline inputs unchanged.",
        "encoding": "napkin_run for the sweep; napkin_analyze kind=sensitivity using returned quantity refs."
      },
      {
        "title": "Compare against evidence and revise",
        "prompt": "Build a consistent stage mass budget, then compare engine-test effective exhaust speed and an external trajectory analysis. Attach test or external-analysis evidence as source references. Compare like-for-like conditions, explain any discrepancy, and revise only inputs justified by that evidence. Report what the model still cannot answer.",
        "encoding": "napkin_explain → evidence reference via napkin_edit → revision-checked input update → rerun; prior runs become stale."
      }
    ],
    "limitation": "Ideal rocket equation only; no gravity or drag losses, burn timing, structural staging feasibility or trajectory integration.",
    "capability": "Unit-aware scalar expressions, expression checks, analytic sweep and numerical sensitivity.",
    "takeaway": "Two dimensionless stage mass ratios and effective exhaust speed → summed ideal delta-v.",
    "assumptionNotice": "Every number is a modern illustrative assumption, not a historical reconstruction.",
    "validation": {
      "created": 8,
      "baselineStatus": "passed",
      "baselineChecks": {
        "goddard:check:budget": {
          "samples": [
            {
              "time": 0,
              "value": {
                "value": 3583.51893845611,
                "unit": "m/s"
              }
            }
          ],
          "value": {
            "value": 3583.51893845611,
            "unit": "m/s"
          },
          "passed": true
        }
      },
      "runStatus": "failed",
      "sweep": {
        "id": "4b0fc982-0071-4c99-978d-0a3d6ecee842",
        "revision": "fd438224-05f9-4e01-8002-7cafcdd0b46d",
        "scenario": {
          "id": "goddard:scenario:Exhaust",
          "kind": "scenario"
        },
        "mode": "analytic",
        "backend": "napkin-analytic",
        "backendVersion": "0.1.0",
        "seed": 0,
        "status": "failed",
        "observations": {
          "goddard:check:budget": {
            "samples": [
              {
                "time": 0,
                "value": {
                  "value": 2687.6392038420827,
                  "unit": "m/s"
                }
              },
              {
                "time": 1,
                "value": {
                  "value": 3583.51893845611,
                  "unit": "m/s"
                }
              },
              {
                "time": 2,
                "value": {
                  "value": 4479.398673070137,
                  "unit": "m/s"
                }
              }
            ],
            "value": {
              "value": 2687.6392038420827,
              "unit": "m/s"
            },
            "failedSamples": [
              0
            ],
            "passed": false
          }
        },
        "resolvedValues": {
          "goddard:exhaustSpeed": {
            "value": 2500,
            "unit": "m/s"
          },
          "goddard:ratio1": {
            "value": 3,
            "unit": ""
          },
          "goddard:ratio2": {
            "value": 2,
            "unit": ""
          },
          "goddard:stage1": {
            "value": 2746.530721670274,
            "unit": "m/s"
          },
          "goddard:stage2": {
            "value": 1732.8679513998632,
            "unit": "m/s"
          },
          "goddard:totalDeltaV": {
            "value": 4479.398673070137,
            "unit": "m/s"
          }
        },
        "assumptions": [
          {
            "id": "goddard:exhaustSpeed",
            "text": "Illustrative effective exhaust speed"
          },
          {
            "id": "goddard:ratio1",
            "text": "Assumed wet-to-final mass ratio for stage one"
          },
          {
            "id": "goddard:ratio2",
            "text": "Assumed wet-to-final mass ratio for stage two"
          }
        ],
        "diagnostics": []
      },
      "sensitivity": {
        "kind": "sensitivity",
        "revision": "fd438224-05f9-4e01-8002-7cafcdd0b46d",
        "scenario": null,
        "method": "Central difference at ±1% of each input; elasticity = (dy/dx)·(x/y)",
        "limitations": [],
        "outputs": {
          "goddard:totalDeltaV": 3583.51893845611
        },
        "units": {
          "goddard:totalDeltaV": "m/s"
        },
        "rows": [
          {
            "input": {
              "id": "goddard:exhaustSpeed",
              "kind": "quantity"
            },
            "name": "exhaustSpeed",
            "value": 2000,
            "unit": "m/s",
            "derivative": {
              "goddard:totalDeltaV": 1.7917594692280432
            },
            "elasticity": {
              "goddard:totalDeltaV": 0.9999999999999934
            }
          }
        ],
        "evaluations": 3,
        "milliseconds": 0.0812090000000012
      },
      "validated": true
    }
  },
  {
    "id": "whittle",
    "title": "Turbojet flow path",
    "file": "whittle-turbojet-patent.png",
    "code": "airflow = 10 kg/s \"Illustrative inlet air mass flow\"\nfuelFlow = 0.2 kg/s \"Illustrative fuel mass flow\"\nflightSpeed = 100 m/s\nexitSpeed = 450 m/s in 350..550 \"Assumed exhaust speed\"\npressureThrust = 0 N \"Assumed pressure-matched exhaust\"\nthrust := (airflow+fuelFlow)*exitSpeed-airflow*flightSpeed+pressureThrust [N]\ncheck thrustBudget: thrust >= 3500 N\nsweep Exhaust: exitSpeed = 350, 450, 550 m/s",
    "output": "thrust",
    "vary": "exitSpeed",
    "question": "What momentum thrust follows from assumed inlet and exit conditions?",
    "expected": [
      {
        "name": "thrust",
        "value": 3590,
        "unit": "N"
      }
    ],
    "steps": [
      {
        "title": "Preserve the source and the question",
        "prompt": "Create a Napkin study called “Turbojet flow path — illustrative sizing”. Keep the attached historical drawing as a source reference. Preserve the flow-path concept and identify the actual 1939 US patent sheet. The engineering question is: What momentum thrust follows from assumed inlet and exit conditions? Do not invent historical dimensions or ratings.",
        "encoding": "napkin_capabilities → napkin_create → napkin_snapshot; optional napkin_edit set-drawing for source metadata."
      },
      {
        "title": "Separate facts from assumptions",
        "prompt": "List what the source supports, what is uncertain, and what must be measured. For this first pass use clearly labeled modern illustrative values, never historical measurements. Model this chain: Air and fuel mass flows, flight speed, exhaust speed and pressure thrust → net momentum thrust.",
        "encoding": "Input quantities carry units, ranges, tolerances and assumption strings. Derived quantities retain equations."
      },
      {
        "title": "Encode the compact sketch model",
        "prompt": "Use napkin_sketch to apply the following text to the study with the current expectedRevision and prefix \"whittle\". Explain thrust and open the study. These numbers are illustrative assumptions.",
        "encoding": "napkin_snapshot → napkin_sketch → napkin_explain → napkin_open; scalar code below."
      },
      {
        "title": "Ask a decision question",
        "prompt": "How much does the 3.5 kN check depend on assumed exit speed? Run the named scalar sweep in analytic mode and use napkin_analyze sensitivity for thrust versus exitSpeed. Report units, the check outcomes and assumptions; keep baseline inputs unchanged.",
        "encoding": "napkin_run for the sweep; napkin_analyze kind=sensitivity using returned quantity refs."
      },
      {
        "title": "Compare against evidence and revise",
        "prompt": "Compare measured mass flow and net thrust; obtain exit conditions from an external cycle calculation or test. Attach test or external-analysis evidence as source references. Compare like-for-like conditions, explain any discrepancy, and revise only inputs justified by that evidence. Report what the model still cannot answer.",
        "encoding": "napkin_explain → evidence reference via napkin_edit → revision-checked input update → rerun; prior runs become stale."
      }
    ],
    "limitation": "An algebraic momentum balance; no compressor/turbine matching, combustion, thermal cycle or CFD.",
    "capability": "Unit-aware scalar expressions, expression checks, analytic sweep and numerical sensitivity.",
    "takeaway": "Air and fuel mass flows, flight speed, exhaust speed and pressure thrust → net momentum thrust.",
    "assumptionNotice": "Every number is a modern illustrative assumption, not a historical reconstruction.",
    "validation": {
      "created": 8,
      "baselineStatus": "passed",
      "baselineChecks": {
        "whittle:check:thrustBudget": {
          "samples": [
            {
              "time": 0,
              "value": {
                "value": 3590,
                "unit": "N"
              }
            }
          ],
          "value": {
            "value": 3590,
            "unit": "N"
          },
          "passed": true
        }
      },
      "runStatus": "failed",
      "sweep": {
        "id": "dc11c457-f1e8-4ab1-895e-cfa80af6a7d6",
        "revision": "b06b70f1-bba1-4b60-9962-be2a756ab4fe",
        "scenario": {
          "id": "whittle:scenario:Exhaust",
          "kind": "scenario"
        },
        "mode": "analytic",
        "backend": "napkin-analytic",
        "backendVersion": "0.1.0",
        "seed": 0,
        "status": "failed",
        "observations": {
          "whittle:check:thrustBudget": {
            "samples": [
              {
                "time": 0,
                "value": {
                  "value": 2569.9999999999995,
                  "unit": "N"
                }
              },
              {
                "time": 1,
                "value": {
                  "value": 3590,
                  "unit": "N"
                }
              },
              {
                "time": 2,
                "value": {
                  "value": 4610,
                  "unit": "N"
                }
              }
            ],
            "value": {
              "value": 2569.9999999999995,
              "unit": "N"
            },
            "failedSamples": [
              0
            ],
            "passed": false
          }
        },
        "resolvedValues": {
          "whittle:airflow": {
            "value": 10,
            "unit": "kg/s"
          },
          "whittle:fuelFlow": {
            "value": 0.2,
            "unit": "kg/s"
          },
          "whittle:flightSpeed": {
            "value": 100,
            "unit": "m/s"
          },
          "whittle:exitSpeed": {
            "value": 550,
            "unit": "m/s"
          },
          "whittle:pressureThrust": {
            "value": 0,
            "unit": "N"
          },
          "whittle:thrust": {
            "value": 4610,
            "unit": "N"
          }
        },
        "assumptions": [
          {
            "id": "whittle:airflow",
            "text": "Illustrative inlet air mass flow"
          },
          {
            "id": "whittle:fuelFlow",
            "text": "Illustrative fuel mass flow"
          },
          {
            "id": "whittle:exitSpeed",
            "text": "Assumed exhaust speed"
          },
          {
            "id": "whittle:pressureThrust",
            "text": "Assumed pressure-matched exhaust"
          }
        ],
        "diagnostics": []
      },
      "sensitivity": {
        "kind": "sensitivity",
        "revision": "b06b70f1-bba1-4b60-9962-be2a756ab4fe",
        "scenario": null,
        "method": "Central difference at ±1% of each input; elasticity = (dy/dx)·(x/y)",
        "limitations": [],
        "outputs": {
          "whittle:thrust": 3590
        },
        "units": {
          "whittle:thrust": "N"
        },
        "rows": [
          {
            "input": {
              "id": "whittle:exitSpeed",
              "kind": "quantity"
            },
            "name": "exitSpeed",
            "value": 450,
            "unit": "m/s",
            "derivative": {
              "whittle:thrust": 10.20000000000002
            },
            "elasticity": {
              "whittle:thrust": 1.2785515320334286
            }
          }
        ],
        "evaluations": 3,
        "milliseconds": 0.09329200000001947
      },
      "validated": true
    }
  },
  {
    "id": "lamarr",
    "title": "Synchronized frequency hopping",
    "file": "lamarr-antheil-frequency-hopping-patent.png",
    "code": "dwell = 20 ms \"Illustrative dwell per channel\"\nsettling = 2 ms in 1..6 \"Assumed radio retuning time\"\nsyncError = 1 ms \"Assumed worst timing misalignment\"\nusableDwell := dwell-settling-2*syncError [ms]\ndutyFraction := usableDwell/dwell\ncheck usefulTime: usableDwell >= 10 ms\ncheck positiveBudget: dutyFraction >= 0\nsweep Retune: settling = 1, 2, 6 ms",
    "output": "usableDwell",
    "vary": "settling",
    "question": "How much time remains after retuning and synchronization allowances?",
    "expected": [
      {
        "name": "usableDwell",
        "value": 16,
        "unit": "ms"
      },
      {
        "name": "dutyFraction",
        "value": 0.8,
        "unit": ""
      }
    ],
    "steps": [
      {
        "title": "Preserve the source and the question",
        "prompt": "Create a Napkin study called “Synchronized frequency hopping — illustrative sizing”. Keep the attached historical drawing as a source reference. Preserve coordinated transmitter/receiver switching; avoid claiming a modern digital protocol reconstruction. The engineering question is: How much time remains after retuning and synchronization allowances? Do not invent historical dimensions or ratings.",
        "encoding": "napkin_capabilities → napkin_create → napkin_snapshot; optional napkin_edit set-drawing for source metadata."
      },
      {
        "title": "Separate facts from assumptions",
        "prompt": "List what the source supports, what is uncertain, and what must be measured. For this first pass use clearly labeled modern illustrative values, never historical measurements. Model this chain: Dwell, settling and synchronization-error allowance → usable time and duty fraction.",
        "encoding": "Input quantities carry units, ranges, tolerances and assumption strings. Derived quantities retain equations."
      },
      {
        "title": "Encode the compact sketch model",
        "prompt": "Use napkin_sketch to apply the following text to the study with the current expectedRevision and prefix \"lamarr\". Explain usableDwell and open the study. These numbers are illustrative assumptions.",
        "encoding": "napkin_snapshot → napkin_sketch → napkin_explain → napkin_open; scalar code below."
      },
      {
        "title": "Ask a decision question",
        "prompt": "What retuning delay leaves at least 10 ms of usable dwell? Run the named scalar sweep in analytic mode and use napkin_analyze sensitivity for usableDwell versus settling. Report units, the check outcomes and assumptions; keep baseline inputs unchanged.",
        "encoding": "napkin_run for the sweep; napkin_analyze kind=sensitivity using returned quantity refs."
      },
      {
        "title": "Compare against evidence and revise",
        "prompt": "Measure tuning settle time and clock misalignment; inspect a radio trace with external tools. Attach test or external-analysis evidence as source references. Compare like-for-like conditions, explain any discrepancy, and revise only inputs justified by that evidence. Report what the model still cannot answer.",
        "encoding": "napkin_explain → evidence reference via napkin_edit → revision-checked input update → rerun; prior runs become stale."
      }
    ],
    "limitation": "Static timing budget only; no generated hop sequence, RF propagation, modulation, interference resilience or security claim.",
    "capability": "Unit-aware scalar expressions, expression checks, analytic sweep and numerical sensitivity.",
    "takeaway": "Dwell, settling and synchronization-error allowance → usable time and duty fraction.",
    "assumptionNotice": "Every number is a modern illustrative assumption, not a historical reconstruction.",
    "validation": {
      "created": 8,
      "baselineStatus": "passed",
      "baselineChecks": {
        "lamarr:check:usefulTime": {
          "samples": [
            {
              "time": 0,
              "value": {
                "value": 16,
                "unit": "ms"
              }
            }
          ],
          "value": {
            "value": 16,
            "unit": "ms"
          },
          "passed": true
        },
        "lamarr:check:positiveBudget": {
          "samples": [
            {
              "time": 0,
              "value": {
                "value": 0.8,
                "unit": ""
              }
            }
          ],
          "value": {
            "value": 0.8,
            "unit": ""
          },
          "passed": true
        }
      },
      "runStatus": "passed",
      "sweep": {
        "id": "c48c2c59-750f-4c4e-8c52-0180dc95f8b7",
        "revision": "9b24b473-ce1b-4ef7-a415-8b99b5122a98",
        "scenario": {
          "id": "lamarr:scenario:Retune",
          "kind": "scenario"
        },
        "mode": "analytic",
        "backend": "napkin-analytic",
        "backendVersion": "0.1.0",
        "seed": 0,
        "status": "passed",
        "observations": {
          "lamarr:check:usefulTime": {
            "samples": [
              {
                "time": 0,
                "value": {
                  "value": 17,
                  "unit": "ms"
                }
              },
              {
                "time": 1,
                "value": {
                  "value": 16,
                  "unit": "ms"
                }
              },
              {
                "time": 2,
                "value": {
                  "value": 12,
                  "unit": "ms"
                }
              }
            ],
            "value": {
              "value": 12,
              "unit": "ms"
            },
            "failedSamples": [],
            "passed": true
          },
          "lamarr:check:positiveBudget": {
            "samples": [
              {
                "time": 0,
                "value": {
                  "value": 0.8500000000000001,
                  "unit": ""
                }
              },
              {
                "time": 1,
                "value": {
                  "value": 0.8,
                  "unit": ""
                }
              },
              {
                "time": 2,
                "value": {
                  "value": 0.6,
                  "unit": ""
                }
              }
            ],
            "value": {
              "value": 0.6,
              "unit": ""
            },
            "failedSamples": [],
            "passed": true
          }
        },
        "resolvedValues": {
          "lamarr:dwell": {
            "value": 20,
            "unit": "ms"
          },
          "lamarr:settling": {
            "value": 6,
            "unit": "ms"
          },
          "lamarr:syncError": {
            "value": 1,
            "unit": "ms"
          },
          "lamarr:usableDwell": {
            "value": 12,
            "unit": "ms"
          },
          "lamarr:dutyFraction": {
            "value": 0.6,
            "unit": ""
          }
        },
        "assumptions": [
          {
            "id": "lamarr:dwell",
            "text": "Illustrative dwell per channel"
          },
          {
            "id": "lamarr:settling",
            "text": "Assumed radio retuning time"
          },
          {
            "id": "lamarr:syncError",
            "text": "Assumed worst timing misalignment"
          }
        ],
        "diagnostics": []
      },
      "sensitivity": {
        "kind": "sensitivity",
        "revision": "9b24b473-ce1b-4ef7-a415-8b99b5122a98",
        "scenario": null,
        "method": "Central difference at ±1% of each input; elasticity = (dy/dx)·(x/y)",
        "limitations": [],
        "outputs": {
          "lamarr:usableDwell": 16
        },
        "units": {
          "lamarr:usableDwell": "ms"
        },
        "rows": [
          {
            "input": {
              "id": "lamarr:settling",
              "kind": "quantity"
            },
            "name": "settling",
            "value": 2,
            "unit": "ms",
            "derivative": {
              "lamarr:usableDwell": -0.9999999999999787
            },
            "elasticity": {
              "lamarr:usableDwell": -0.12499999999999734
            }
          }
        ],
        "evaluations": 3,
        "milliseconds": 0.18587499999995316
      },
      "validated": true
    }
  },
  {
    "id": "fuller",
    "title": "Geodesic structure",
    "file": "fuller-geodesic-dome-patent.png",
    "code": "force = 2000 N in 1000..4000 \"Assumed axial force from external load analysis\"\narea = 100 mm^2 \"Assumed strut cross-sectional area\"\nallowable = 50 MPa \"Illustrative material stress allowance\"\nstress := force/area [MPa]\nmargin := allowable/stress\ncheck material: stress <= allowable\ncheck marginBudget: margin >= 1.5\nsweep Load: force = 1000, 2000, 4000 N",
    "output": "stress",
    "vary": "force",
    "question": "What axial stress follows for one idealized loaded strut?",
    "expected": [
      {
        "name": "stress",
        "value": 20,
        "unit": "MPa"
      },
      {
        "name": "margin",
        "value": 2.5,
        "unit": ""
      }
    ],
    "steps": [
      {
        "title": "Preserve the source and the question",
        "prompt": "Create a Napkin study called “Geodesic structure — illustrative sizing”. Keep the attached historical drawing as a source reference. Preserve the triangulated dome topology; treat load-sharing as an unresolved structural question. The engineering question is: What axial stress follows for one idealized loaded strut? Do not invent historical dimensions or ratings.",
        "encoding": "napkin_capabilities → napkin_create → napkin_snapshot; optional napkin_edit set-drawing for source metadata."
      },
      {
        "title": "Separate facts from assumptions",
        "prompt": "List what the source supports, what is uncertain, and what must be measured. For this first pass use clearly labeled modern illustrative values, never historical measurements. Model this chain: An externally supplied strut force, section area and allowable stress → axial stress and margin.",
        "encoding": "Input quantities carry units, ranges, tolerances and assumption strings. Derived quantities retain equations."
      },
      {
        "title": "Encode the compact sketch model",
        "prompt": "Use napkin_sketch to apply the following text to the study with the current expectedRevision and prefix \"fuller\". Explain stress and open the study. These numbers are illustrative assumptions.",
        "encoding": "napkin_snapshot → napkin_sketch → napkin_explain → napkin_open; scalar code below."
      },
      {
        "title": "Ask a decision question",
        "prompt": "Which supplied axial loads meet both stress and 1.5 margin checks? Run the named scalar sweep in analytic mode and use napkin_analyze sensitivity for stress versus force. Report units, the check outcomes and assumptions; keep baseline inputs unchanged.",
        "encoding": "napkin_run for the sweep; napkin_analyze kind=sensitivity using returned quantity refs."
      },
      {
        "title": "Compare against evidence and revise",
        "prompt": "Use a structural analysis to obtain member forces; compare coupon, joint and buckling tests. Attach test or external-analysis evidence as source references. Compare like-for-like conditions, explain any discrepancy, and revise only inputs justified by that evidence. Report what the model still cannot answer.",
        "encoding": "napkin_explain → evidence reference via napkin_edit → revision-checked input update → rerun; prior runs become stale."
      }
    ],
    "limitation": "Single-member axial stress only; not a dome stiffness solve, FEA, buckling check or code-compliant building design.",
    "capability": "Unit-aware scalar expressions, expression checks, analytic sweep and numerical sensitivity.",
    "takeaway": "An externally supplied strut force, section area and allowable stress → axial stress and margin.",
    "assumptionNotice": "Every number is a modern illustrative assumption, not a historical reconstruction.",
    "validation": {
      "created": 8,
      "baselineStatus": "passed",
      "baselineChecks": {
        "fuller:check:material": {
          "samples": [
            {
              "time": 0,
              "value": {
                "value": 20,
                "unit": "MPa"
              }
            }
          ],
          "value": {
            "value": 20,
            "unit": "MPa"
          },
          "passed": true
        },
        "fuller:check:marginBudget": {
          "samples": [
            {
              "time": 0,
              "value": {
                "value": 2.5,
                "unit": ""
              }
            }
          ],
          "value": {
            "value": 2.5,
            "unit": ""
          },
          "passed": true
        }
      },
      "runStatus": "failed",
      "sweep": {
        "id": "59580292-d83a-4ad5-9270-606ab6cc8c37",
        "revision": "6ffea8b5-49cd-4f5c-889c-b58a0ace5a9b",
        "scenario": {
          "id": "fuller:scenario:Load",
          "kind": "scenario"
        },
        "mode": "analytic",
        "backend": "napkin-analytic",
        "backendVersion": "0.1.0",
        "seed": 0,
        "status": "failed",
        "observations": {
          "fuller:check:material": {
            "samples": [
              {
                "time": 0,
                "value": {
                  "value": 10,
                  "unit": "MPa"
                }
              },
              {
                "time": 1,
                "value": {
                  "value": 20,
                  "unit": "MPa"
                }
              },
              {
                "time": 2,
                "value": {
                  "value": 40,
                  "unit": "MPa"
                }
              }
            ],
            "value": {
              "value": 40,
              "unit": "MPa"
            },
            "failedSamples": [],
            "passed": true
          },
          "fuller:check:marginBudget": {
            "samples": [
              {
                "time": 0,
                "value": {
                  "value": 5,
                  "unit": ""
                }
              },
              {
                "time": 1,
                "value": {
                  "value": 2.5,
                  "unit": ""
                }
              },
              {
                "time": 2,
                "value": {
                  "value": 1.25,
                  "unit": ""
                }
              }
            ],
            "value": {
              "value": 1.25,
              "unit": ""
            },
            "failedSamples": [
              2
            ],
            "passed": false
          }
        },
        "resolvedValues": {
          "fuller:force": {
            "value": 4000,
            "unit": "N"
          },
          "fuller:area": {
            "value": 100,
            "unit": "mm^2"
          },
          "fuller:allowable": {
            "value": 50,
            "unit": "MPa"
          },
          "fuller:stress": {
            "value": 40,
            "unit": "MPa"
          },
          "fuller:margin": {
            "value": 1.25,
            "unit": ""
          }
        },
        "assumptions": [
          {
            "id": "fuller:force",
            "text": "Assumed axial force from external load analysis"
          },
          {
            "id": "fuller:area",
            "text": "Assumed strut cross-sectional area"
          },
          {
            "id": "fuller:allowable",
            "text": "Illustrative material stress allowance"
          }
        ],
        "diagnostics": []
      },
      "sensitivity": {
        "kind": "sensitivity",
        "revision": "6ffea8b5-49cd-4f5c-889c-b58a0ace5a9b",
        "scenario": null,
        "method": "Central difference at ±1% of each input; elasticity = (dy/dx)·(x/y)",
        "limitations": [],
        "outputs": {
          "fuller:stress": 20
        },
        "units": {
          "fuller:stress": "MPa"
        },
        "rows": [
          {
            "input": {
              "id": "fuller:force",
              "kind": "quantity"
            },
            "name": "force",
            "value": 2000,
            "unit": "N",
            "derivative": {
              "fuller:stress": 0.009999999999999964
            },
            "elasticity": {
              "fuller:stress": 0.9999999999999964
            }
          }
        ],
        "evaluations": 3,
        "milliseconds": 0.08875000000000455
      },
      "validated": true
    }
  },
  {
    "id": "demestral",
    "title": "Hook-and-loop fastening",
    "file": "de-mestral-velcro-patent.png",
    "code": "area = 20 cm^2 in 5..40 \"Illustrative engaged area\"\nshearStrength = 5 N/cm^2 ± 20% \"Assumed tested shear capacity per area\"\nload = 50 N \"Illustrative application load\"\nsafety = 2 \"Assumed sizing factor\"\ncapacity := area*shearStrength [N]\nrequired := load*safety [N]\ncheck hold: capacity >= required\nsweep Engagement: area = 5, 20, 40 cm^2",
    "output": "capacity",
    "vary": "area",
    "question": "How large a bonded engagement area carries an assumed shear load?",
    "expected": [
      {
        "name": "capacity",
        "value": 100,
        "unit": "N"
      },
      {
        "name": "required",
        "value": 100,
        "unit": "N"
      }
    ],
    "steps": [
      {
        "title": "Preserve the source and the question",
        "prompt": "Create a Napkin study called “Hook-and-loop fastening — illustrative sizing”. Keep the attached historical drawing as a source reference. Preserve hook/loop engagement intent and the 1955 patent; avoid implying trademark endorsement. The engineering question is: How large a bonded engagement area carries an assumed shear load? Do not invent historical dimensions or ratings.",
        "encoding": "napkin_capabilities → napkin_create → napkin_snapshot; optional napkin_edit set-drawing for source metadata."
      },
      {
        "title": "Separate facts from assumptions",
        "prompt": "List what the source supports, what is uncertain, and what must be measured. For this first pass use clearly labeled modern illustrative values, never historical measurements. Model this chain: Engaged area, empirical shear strength, load and a sizing factor → shear capacity check.",
        "encoding": "Input quantities carry units, ranges, tolerances and assumption strings. Derived quantities retain equations."
      },
      {
        "title": "Encode the compact sketch model",
        "prompt": "Use napkin_sketch to apply the following text to the study with the current expectedRevision and prefix \"demestral\". Explain capacity and open the study. These numbers are illustrative assumptions.",
        "encoding": "napkin_snapshot → napkin_sketch → napkin_explain → napkin_open; scalar code below."
      },
      {
        "title": "Ask a decision question",
        "prompt": "What area passes, and how sensitive is the answer to measured shear strength? Run the named scalar sweep in analytic mode and use napkin_analyze sensitivity for capacity versus area. Report units, the check outcomes and assumptions; keep baseline inputs unchanged.",
        "encoding": "napkin_run for the sweep; napkin_analyze kind=sensitivity using returned quantity refs."
      },
      {
        "title": "Compare against evidence and revise",
        "prompt": "Obtain product-specific shear and peel tests, aging and repeated-engagement data. Attach test or external-analysis evidence as source references. Compare like-for-like conditions, explain any discrepancy, and revise only inputs justified by that evidence. Report what the model still cannot answer.",
        "encoding": "napkin_explain → evidence reference via napkin_edit → revision-checked input update → rerun; prior runs become stale."
      }
    ],
    "limitation": "Uniform static shear with an empirical strength; no peel mechanics, individual hook contact, fatigue or textile modeling.",
    "capability": "Unit-aware scalar expressions, expression checks, analytic sweep and numerical sensitivity.",
    "takeaway": "Engaged area, empirical shear strength, load and a sizing factor → shear capacity check.",
    "assumptionNotice": "Every number is a modern illustrative assumption, not a historical reconstruction.",
    "validation": {
      "created": 8,
      "baselineStatus": "passed",
      "baselineChecks": {
        "demestral:check:hold": {
          "samples": [
            {
              "time": 0,
              "value": {
                "value": 100,
                "unit": "N"
              }
            }
          ],
          "value": {
            "value": 100,
            "unit": "N"
          },
          "passed": true
        }
      },
      "runStatus": "failed",
      "sweep": {
        "id": "4fadd1bc-a3d2-4e83-9ae1-15dc1196b71d",
        "revision": "1897b376-812b-4a44-bf03-61c5bfed9c46",
        "scenario": {
          "id": "demestral:scenario:Engagement",
          "kind": "scenario"
        },
        "mode": "analytic",
        "backend": "napkin-analytic",
        "backendVersion": "0.1.0",
        "seed": 0,
        "status": "failed",
        "observations": {
          "demestral:check:hold": {
            "samples": [
              {
                "time": 0,
                "value": {
                  "value": 25,
                  "unit": "N"
                }
              },
              {
                "time": 1,
                "value": {
                  "value": 100,
                  "unit": "N"
                }
              },
              {
                "time": 2,
                "value": {
                  "value": 200,
                  "unit": "N"
                }
              }
            ],
            "value": {
              "value": 25,
              "unit": "N"
            },
            "failedSamples": [
              0
            ],
            "passed": false
          }
        },
        "resolvedValues": {
          "demestral:area": {
            "value": 40,
            "unit": "cm^2"
          },
          "demestral:shearStrength": {
            "value": 5,
            "unit": "N/cm^2"
          },
          "demestral:load": {
            "value": 50,
            "unit": "N"
          },
          "demestral:safety": {
            "value": 2,
            "unit": ""
          },
          "demestral:capacity": {
            "value": 200,
            "unit": "N"
          },
          "demestral:required": {
            "value": 100,
            "unit": "N"
          }
        },
        "assumptions": [
          {
            "id": "demestral:area",
            "text": "Illustrative engaged area"
          },
          {
            "id": "demestral:shearStrength",
            "text": "Assumed tested shear capacity per area"
          },
          {
            "id": "demestral:load",
            "text": "Illustrative application load"
          },
          {
            "id": "demestral:safety",
            "text": "Assumed sizing factor"
          }
        ],
        "diagnostics": []
      },
      "sensitivity": {
        "kind": "sensitivity",
        "revision": "1897b376-812b-4a44-bf03-61c5bfed9c46",
        "scenario": null,
        "method": "Central difference at ±1% of each input; elasticity = (dy/dx)·(x/y)",
        "limitations": [],
        "outputs": {
          "demestral:capacity": 100
        },
        "units": {
          "demestral:capacity": "N"
        },
        "rows": [
          {
            "input": {
              "id": "demestral:area",
              "kind": "quantity"
            },
            "name": "area",
            "value": 20,
            "unit": "cm^2",
            "derivative": {
              "demestral:capacity": 5
            },
            "elasticity": {
              "demestral:capacity": 1
            }
          }
        ],
        "evaluations": 3,
        "milliseconds": 0.08583300000003646
      },
      "validated": true
    }
  },
  {
    "id": "kilby",
    "title": "Miniaturized circuit",
    "file": "kilby-integrated-circuit-patent.png",
    "code": "resistance = 1000 ohm \"Illustrative circuit resistance\"\ncapacitance = 20 pF in 5..100 \"Assumed lumped capacitance\"\ntimeConstant := resistance*capacitance [ns]\nriseTime := 2.2*timeConstant [ns]\nfrequencyLimit := 1/(2*pi*timeConstant) [MHz]\ncheck edge: riseTime <= 100 ns\ncheck bandwidth: frequencyLimit >= 5 MHz\nsweep Parasitic: capacitance = 5, 20, 100 pF",
    "output": "timeConstant",
    "vary": "capacitance",
    "question": "How does assumed lumped parasitic capacitance limit a simple RC response?",
    "expected": [
      {
        "name": "timeConstant",
        "value": 20,
        "unit": "ns"
      },
      {
        "name": "riseTime",
        "value": 44,
        "unit": "ns"
      },
      {
        "name": "frequencyLimit",
        "value": 7.957747154594767,
        "unit": "MHz"
      }
    ],
    "steps": [
      {
        "title": "Preserve the source and the question",
        "prompt": "Create a Napkin study called “Miniaturized circuit — illustrative sizing”. Keep the attached historical drawing as a source reference. Preserve the actual 1964 patent sheet and flying-wire/equivalent circuit images; distinguish the 1958 demonstration. The engineering question is: How does assumed lumped parasitic capacitance limit a simple RC response? Do not invent historical dimensions or ratings.",
        "encoding": "napkin_capabilities → napkin_create → napkin_snapshot; optional napkin_edit set-drawing for source metadata."
      },
      {
        "title": "Separate facts from assumptions",
        "prompt": "List what the source supports, what is uncertain, and what must be measured. For this first pass use clearly labeled modern illustrative values, never historical measurements. Model this chain: Assumed resistance and lumped capacitance → ideal one-pole time constant, rise-time estimate and cutoff.",
        "encoding": "Input quantities carry units, ranges, tolerances and assumption strings. Derived quantities retain equations."
      },
      {
        "title": "Encode the compact sketch model",
        "prompt": "Use napkin_sketch to apply the following text to the study with the current expectedRevision and prefix \"kilby\". Explain timeConstant and open the study. These numbers are illustrative assumptions.",
        "encoding": "napkin_snapshot → napkin_sketch → napkin_explain → napkin_open; scalar code below."
      },
      {
        "title": "Ask a decision question",
        "prompt": "Which capacitance values meet both a 100 ns rise-time budget and 5 MHz cutoff? Run the named scalar sweep in analytic mode and use napkin_analyze sensitivity for timeConstant versus capacitance. Report units, the check outcomes and assumptions; keep baseline inputs unchanged.",
        "encoding": "napkin_run for the sweep; napkin_analyze kind=sensitivity using returned quantity refs."
      },
      {
        "title": "Compare against evidence and revise",
        "prompt": "Compare measured capacitance and oscilloscope response; validate the full circuit in an external circuit tool. Attach test or external-analysis evidence as source references. Compare like-for-like conditions, explain any discrepancy, and revise only inputs justified by that evidence. Report what the model still cannot answer.",
        "encoding": "napkin_explain → evidence reference via napkin_edit → revision-checked input update → rerun; prior runs become stale."
      }
    ],
    "limitation": "A generic one-pole proxy motivated by miniaturization, not the patent circuit reconstructed or simulated. No SPICE or transistor model.",
    "capability": "Unit-aware scalar expressions, expression checks, analytic sweep and numerical sensitivity.",
    "takeaway": "Assumed resistance and lumped capacitance → ideal one-pole time constant, rise-time estimate and cutoff.",
    "assumptionNotice": "Every number is a modern illustrative assumption, not a historical reconstruction.",
    "validation": {
      "created": 8,
      "baselineStatus": "passed",
      "baselineChecks": {
        "kilby:check:edge": {
          "samples": [
            {
              "time": 0,
              "value": {
                "value": 44,
                "unit": "ns"
              }
            }
          ],
          "value": {
            "value": 44,
            "unit": "ns"
          },
          "passed": true
        },
        "kilby:check:bandwidth": {
          "samples": [
            {
              "time": 0,
              "value": {
                "value": 7.957747154594767,
                "unit": "MHz"
              }
            }
          ],
          "value": {
            "value": 7.957747154594767,
            "unit": "MHz"
          },
          "passed": true
        }
      },
      "runStatus": "failed",
      "sweep": {
        "id": "c781b9be-6529-44fc-bae7-e11d679f7498",
        "revision": "aed824f7-1be6-4a60-be90-423e4b9d8a1c",
        "scenario": {
          "id": "kilby:scenario:Parasitic",
          "kind": "scenario"
        },
        "mode": "analytic",
        "backend": "napkin-analytic",
        "backendVersion": "0.1.0",
        "seed": 0,
        "status": "failed",
        "observations": {
          "kilby:check:edge": {
            "samples": [
              {
                "time": 0,
                "value": {
                  "value": 11,
                  "unit": "ns"
                }
              },
              {
                "time": 1,
                "value": {
                  "value": 44,
                  "unit": "ns"
                }
              },
              {
                "time": 2,
                "value": {
                  "value": 220.00000000000003,
                  "unit": "ns"
                }
              }
            ],
            "value": {
              "value": 220.00000000000003,
              "unit": "ns"
            },
            "failedSamples": [
              2
            ],
            "passed": false
          },
          "kilby:check:bandwidth": {
            "samples": [
              {
                "time": 0,
                "value": {
                  "value": 31.830988618379067,
                  "unit": "MHz"
                }
              },
              {
                "time": 1,
                "value": {
                  "value": 7.957747154594767,
                  "unit": "MHz"
                }
              },
              {
                "time": 2,
                "value": {
                  "value": 1.5915494309189533,
                  "unit": "MHz"
                }
              }
            ],
            "value": {
              "value": 1.5915494309189533,
              "unit": "MHz"
            },
            "failedSamples": [
              2
            ],
            "passed": false
          }
        },
        "resolvedValues": {
          "kilby:resistance": {
            "value": 1000,
            "unit": "ohm"
          },
          "kilby:capacitance": {
            "value": 100,
            "unit": "pF"
          },
          "kilby:timeConstant": {
            "value": 100,
            "unit": "ns"
          },
          "kilby:riseTime": {
            "value": 220.00000000000003,
            "unit": "ns"
          },
          "kilby:frequencyLimit": {
            "value": 1.5915494309189533,
            "unit": "MHz"
          }
        },
        "assumptions": [
          {
            "id": "kilby:resistance",
            "text": "Illustrative circuit resistance"
          },
          {
            "id": "kilby:capacitance",
            "text": "Assumed lumped capacitance"
          }
        ],
        "diagnostics": []
      },
      "sensitivity": {
        "kind": "sensitivity",
        "revision": "aed824f7-1be6-4a60-be90-423e4b9d8a1c",
        "scenario": null,
        "method": "Central difference at ±1% of each input; elasticity = (dy/dx)·(x/y)",
        "limitations": [],
        "outputs": {
          "kilby:timeConstant": 20
        },
        "units": {
          "kilby:timeConstant": "ns"
        },
        "rows": [
          {
            "input": {
              "id": "kilby:capacitance",
              "kind": "quantity"
            },
            "name": "capacitance",
            "value": 20,
            "unit": "pF",
            "derivative": {
              "kilby:timeConstant": 1.0000000000000053
            },
            "elasticity": {
              "kilby:timeConstant": 1.0000000000000053
            }
          }
        ],
        "evaluations": 3,
        "milliseconds": 0.06183299999997871
      },
      "validated": true
    }
  },
  {
    "id": "engelbart",
    "title": "X–Y position indicator",
    "file": "engelbart-mouse-patent.png",
    "code": "wheelDiameter = 20 mm in 10..30 \"Illustrative rolling wheel diameter\"\ncounts = 100 \"Assumed counts per revolution\"\nstepSize := pi*wheelDiameter/counts [mm]\ncircumference := pi*wheelDiameter [mm]\ncheck resolution: stepSize <= 1 mm\nprobe resolutionValue: stepSize [mm]\nsweep Wheel: wheelDiameter = 10, 20, 30 mm",
    "output": "stepSize",
    "vary": "wheelDiameter",
    "question": "What surface displacement corresponds to one wheel-encoder count?",
    "expected": [
      {
        "name": "stepSize",
        "value": 0.6283185307179587,
        "unit": "mm"
      },
      {
        "name": "circumference",
        "value": 62.83185307179587,
        "unit": "mm"
      }
    ],
    "steps": [
      {
        "title": "Preserve the source and the question",
        "prompt": "Create a Napkin study called “X–Y position indicator — illustrative sizing”. Keep the attached historical drawing as a source reference. Preserve the orthogonal-wheel X–Y measurement concept rather than substituting a later optical mouse. The engineering question is: What surface displacement corresponds to one wheel-encoder count? Do not invent historical dimensions or ratings.",
        "encoding": "napkin_capabilities → napkin_create → napkin_snapshot; optional napkin_edit set-drawing for source metadata."
      },
      {
        "title": "Separate facts from assumptions",
        "prompt": "List what the source supports, what is uncertain, and what must be measured. For this first pass use clearly labeled modern illustrative values, never historical measurements. Model this chain: Wheel diameter and encoder counts → wheel circumference and displacement per count.",
        "encoding": "Input quantities carry units, ranges, tolerances and assumption strings. Derived quantities retain equations."
      },
      {
        "title": "Encode the compact sketch model",
        "prompt": "Use napkin_sketch to apply the following text to the study with the current expectedRevision and prefix \"engelbart\". Explain stepSize and open the study. These numbers are illustrative assumptions.",
        "encoding": "napkin_snapshot → napkin_sketch → napkin_explain → napkin_open; scalar code below."
      },
      {
        "title": "Ask a decision question",
        "prompt": "How does wheel diameter change spatial resolution at fixed encoder counts? Run the named scalar sweep in analytic mode and use napkin_analyze sensitivity for stepSize versus wheelDiameter. Report units, the check outcomes and assumptions; keep baseline inputs unchanged.",
        "encoding": "napkin_run for the sweep; napkin_analyze kind=sensitivity using returned quantity refs."
      },
      {
        "title": "Compare against evidence and revise",
        "prompt": "Roll a measured distance; compare counts in both directions and assess slip. Attach test or external-analysis evidence as source references. Compare like-for-like conditions, explain any discrepancy, and revise only inputs justified by that evidence. Report what the model still cannot answer.",
        "encoding": "napkin_explain → evidence reference via napkin_edit → revision-checked input update → rerun; prior runs become stale."
      }
    ],
    "limitation": "Ideal no-slip wheel kinematics; no friction/contact solve, direction-decoding electronics or usability prediction.",
    "capability": "Unit-aware scalar expressions, expression checks, analytic sweep and numerical sensitivity.",
    "takeaway": "Wheel diameter and encoder counts → wheel circumference and displacement per count.",
    "assumptionNotice": "Every number is a modern illustrative assumption, not a historical reconstruction.",
    "validation": {
      "created": 7,
      "baselineStatus": "passed",
      "baselineChecks": {
        "engelbart:check:resolution": {
          "samples": [
            {
              "time": 0,
              "value": {
                "value": 0.6283185307179587,
                "unit": "mm"
              }
            }
          ],
          "value": {
            "value": 0.6283185307179587,
            "unit": "mm"
          },
          "passed": true
        },
        "engelbart:probe:resolutionValue": {
          "samples": [
            {
              "time": 0,
              "value": {
                "value": 0.6283185307179587,
                "unit": "mm"
              }
            }
          ],
          "value": {
            "value": 0.6283185307179587,
            "unit": "mm"
          }
        }
      },
      "runStatus": "passed",
      "sweep": {
        "id": "81cf8ad9-53a9-4484-a559-66bcd991d15e",
        "revision": "95b6f9e8-0df8-4639-a4e3-19d27a988be4",
        "scenario": {
          "id": "engelbart:scenario:Wheel",
          "kind": "scenario"
        },
        "mode": "analytic",
        "backend": "napkin-analytic",
        "backendVersion": "0.1.0",
        "seed": 0,
        "status": "passed",
        "observations": {
          "engelbart:check:resolution": {
            "samples": [
              {
                "time": 0,
                "value": {
                  "value": 0.31415926535897937,
                  "unit": "mm"
                }
              },
              {
                "time": 1,
                "value": {
                  "value": 0.6283185307179587,
                  "unit": "mm"
                }
              },
              {
                "time": 2,
                "value": {
                  "value": 0.9424777960769379,
                  "unit": "mm"
                }
              }
            ],
            "value": {
              "value": 0.9424777960769379,
              "unit": "mm"
            },
            "failedSamples": [],
            "passed": true
          },
          "engelbart:probe:resolutionValue": {
            "samples": [
              {
                "time": 0,
                "value": {
                  "value": 0.31415926535897937,
                  "unit": "mm"
                }
              },
              {
                "time": 1,
                "value": {
                  "value": 0.6283185307179587,
                  "unit": "mm"
                }
              },
              {
                "time": 2,
                "value": {
                  "value": 0.9424777960769379,
                  "unit": "mm"
                }
              }
            ],
            "value": {
              "value": 0.9424777960769379,
              "unit": "mm"
            }
          }
        },
        "resolvedValues": {
          "engelbart:wheelDiameter": {
            "value": 30,
            "unit": "mm"
          },
          "engelbart:counts": {
            "value": 100,
            "unit": ""
          },
          "engelbart:stepSize": {
            "value": 0.9424777960769379,
            "unit": "mm"
          },
          "engelbart:circumference": {
            "value": 94.24777960769379,
            "unit": "mm"
          }
        },
        "assumptions": [
          {
            "id": "engelbart:wheelDiameter",
            "text": "Illustrative rolling wheel diameter"
          },
          {
            "id": "engelbart:counts",
            "text": "Assumed counts per revolution"
          }
        ],
        "diagnostics": []
      },
      "sensitivity": {
        "kind": "sensitivity",
        "revision": "95b6f9e8-0df8-4639-a4e3-19d27a988be4",
        "scenario": null,
        "method": "Central difference at ±1% of each input; elasticity = (dy/dx)·(x/y)",
        "limitations": [],
        "outputs": {
          "engelbart:stepSize": 0.6283185307179587
        },
        "units": {
          "engelbart:stepSize": "mm"
        },
        "rows": [
          {
            "input": {
              "id": "engelbart:wheelDiameter",
              "kind": "quantity"
            },
            "name": "wheelDiameter",
            "value": 20,
            "unit": "mm",
            "derivative": {
              "engelbart:stepSize": 0.031415926535897365
            },
            "elasticity": {
              "engelbart:stepSize": 0.9999999999999818
            }
          }
        ],
        "evaluations": 3,
        "milliseconds": 0.03750000000002274
      },
      "validated": true
    }
  },
  {
    "id": "dyson",
    "title": "Cyclonic vacuum cleaner",
    "file": "dyson-cyclone-vacuum-patent.png",
    "code": "flow = 0.03 m^3/s in 0.01..0.05 \"Illustrative operating airflow\"\npressureDrop = 4000 Pa ± 20% \"Assumed measured total system loss\"\nefficiency = 0.5 \"Assumed fan efficiency at operating point\"\nshaftPower := flow*pressureDrop/efficiency [W]\ncheck motorBudget: shaftPower <= 300 W\nprobe fanPower: shaftPower [W]\nsweep Airflow: flow = 0.01, 0.03, 0.05 m^3/s",
    "output": "shaftPower",
    "vary": "flow",
    "question": "How much fan shaft power supports an assumed flow and pressure drop?",
    "expected": [
      {
        "name": "shaftPower",
        "value": 240,
        "unit": "W"
      }
    ],
    "steps": [
      {
        "title": "Preserve the source and the question",
        "prompt": "Create a Napkin study called “Cyclonic vacuum cleaner — illustrative sizing”. Keep the attached historical drawing as a source reference. Preserve the appliance layout and airflow path from the 1986 patent; avoid trademark endorsement. The engineering question is: How much fan shaft power supports an assumed flow and pressure drop? Do not invent historical dimensions or ratings.",
        "encoding": "napkin_capabilities → napkin_create → napkin_snapshot; optional napkin_edit set-drawing for source metadata."
      },
      {
        "title": "Separate facts from assumptions",
        "prompt": "List what the source supports, what is uncertain, and what must be measured. For this first pass use clearly labeled modern illustrative values, never historical measurements. Model this chain: Flow, assumed measured system pressure drop and efficiency → required shaft power.",
        "encoding": "Input quantities carry units, ranges, tolerances and assumption strings. Derived quantities retain equations."
      },
      {
        "title": "Encode the compact sketch model",
        "prompt": "Use napkin_sketch to apply the following text to the study with the current expectedRevision and prefix \"dyson\". Explain shaftPower and open the study. These numbers are illustrative assumptions.",
        "encoding": "napkin_snapshot → napkin_sketch → napkin_explain → napkin_open; scalar code below."
      },
      {
        "title": "Ask a decision question",
        "prompt": "What airflow stays within 300 W if the assumed pressure drop holds? Run the named scalar sweep in analytic mode and use napkin_analyze sensitivity for shaftPower versus flow. Report units, the check outcomes and assumptions; keep baseline inputs unchanged.",
        "encoding": "napkin_run for the sweep; napkin_analyze kind=sensitivity using returned quantity refs."
      },
      {
        "title": "Compare against evidence and revise",
        "prompt": "Measure pressure drop against flow, fan curve and dust-collection performance; replace constants with evidence. Attach test or external-analysis evidence as source references. Compare like-for-like conditions, explain any discrepancy, and revise only inputs justified by that evidence. Report what the model still cannot answer.",
        "encoding": "napkin_explain → evidence reference via napkin_edit → revision-checked input update → rerun; prior runs become stale."
      }
    ],
    "limitation": "Steady power budget; no cyclone separation efficiency, particle trajectories, fouling evolution or CFD. Pressure drop and efficiency may vary with flow.",
    "capability": "Unit-aware scalar expressions, expression checks, analytic sweep and numerical sensitivity.",
    "takeaway": "Flow, assumed measured system pressure drop and efficiency → required shaft power.",
    "assumptionNotice": "Every number is a modern illustrative assumption, not a historical reconstruction.",
    "validation": {
      "created": 7,
      "baselineStatus": "passed",
      "baselineChecks": {
        "dyson:check:motorBudget": {
          "samples": [
            {
              "time": 0,
              "value": {
                "value": 240,
                "unit": "W"
              }
            }
          ],
          "value": {
            "value": 240,
            "unit": "W"
          },
          "passed": true
        },
        "dyson:probe:fanPower": {
          "samples": [
            {
              "time": 0,
              "value": {
                "value": 240,
                "unit": "W"
              }
            }
          ],
          "value": {
            "value": 240,
            "unit": "W"
          }
        }
      },
      "runStatus": "failed",
      "sweep": {
        "id": "9f667143-13c3-4cf0-be9b-4c0b998e5f72",
        "revision": "ee4edfe5-c621-44f2-a4a8-c6101d76e574",
        "scenario": {
          "id": "dyson:scenario:Airflow",
          "kind": "scenario"
        },
        "mode": "analytic",
        "backend": "napkin-analytic",
        "backendVersion": "0.1.0",
        "seed": 0,
        "status": "failed",
        "observations": {
          "dyson:check:motorBudget": {
            "samples": [
              {
                "time": 0,
                "value": {
                  "value": 80,
                  "unit": "W"
                }
              },
              {
                "time": 1,
                "value": {
                  "value": 240,
                  "unit": "W"
                }
              },
              {
                "time": 2,
                "value": {
                  "value": 400,
                  "unit": "W"
                }
              }
            ],
            "value": {
              "value": 400,
              "unit": "W"
            },
            "failedSamples": [
              2
            ],
            "passed": false
          },
          "dyson:probe:fanPower": {
            "samples": [
              {
                "time": 0,
                "value": {
                  "value": 80,
                  "unit": "W"
                }
              },
              {
                "time": 1,
                "value": {
                  "value": 240,
                  "unit": "W"
                }
              },
              {
                "time": 2,
                "value": {
                  "value": 400,
                  "unit": "W"
                }
              }
            ],
            "value": {
              "value": 400,
              "unit": "W"
            }
          }
        },
        "resolvedValues": {
          "dyson:flow": {
            "value": 0.05,
            "unit": "m^3/s"
          },
          "dyson:pressureDrop": {
            "value": 4000,
            "unit": "Pa"
          },
          "dyson:efficiency": {
            "value": 0.5,
            "unit": ""
          },
          "dyson:shaftPower": {
            "value": 400,
            "unit": "W"
          }
        },
        "assumptions": [
          {
            "id": "dyson:flow",
            "text": "Illustrative operating airflow"
          },
          {
            "id": "dyson:pressureDrop",
            "text": "Assumed measured total system loss"
          },
          {
            "id": "dyson:efficiency",
            "text": "Assumed fan efficiency at operating point"
          }
        ],
        "diagnostics": []
      },
      "sensitivity": {
        "kind": "sensitivity",
        "revision": "ee4edfe5-c621-44f2-a4a8-c6101d76e574",
        "scenario": null,
        "method": "Central difference at ±1% of each input; elasticity = (dy/dx)·(x/y)",
        "limitations": [],
        "outputs": {
          "dyson:shaftPower": 240
        },
        "units": {
          "dyson:shaftPower": "W"
        },
        "rows": [
          {
            "input": {
              "id": "dyson:flow",
              "kind": "quantity"
            },
            "name": "flow",
            "value": 0.03,
            "unit": "m^3/s",
            "derivative": {
              "dyson:shaftPower": 8000.000000000067
            },
            "elasticity": {
              "dyson:shaftPower": 1.0000000000000084
            }
          }
        ],
        "evaluations": 3,
        "milliseconds": 0.04920800000002146
      },
      "validated": true
    }
  }
]
