{
  "schemaVersion": 1,
  "sourceRevision": "4878472c4d6c166c3dbd81aee292a0a56e89ffff",
  "sourceTextNormalization": "UTF-8, CRLF normalized to LF",
  "counts": {
    "continuity": 12,
    "infrastructure": 12,
    "emt": 1,
    "dynamics": 5
  },
  "items": [
    {
      "id": "power-energy",
      "kind": "continuity",
      "sequence": 1,
      "title": "Power becomes energy",
      "question": "How much energy does a constant load request in half an hour?",
      "description": "kW and kWh",
      "tags": [
        "kW and kWh"
      ],
      "modelFamily": "power-continuity",
      "overviewPath": "/learn/power-energy/",
      "runtimePath": "/?lesson=power-energy",
      "sharedOverview": false,
      "evidenceLinks": [
        "/learn/power-energy/",
        "/learn/power-energy/results.json",
        "docs/engineering/electrical-continuity.md",
        "tests/test_course_lessons.py"
      ],
      "sourceFiles": [
        {
          "path": "apps/web/src/course-lessons.ts",
          "sha256": "f11f3115e80aee80d47e4e09c893005b2d76943c9fd3795e7127e227605b7df5"
        },
        {
          "path": "apps/web/src/js-engine/continuity.ts",
          "sha256": "6da773947488279a2aa30ab3f4c7830d52c80dc1b47b489ec3ce9cd5cd5edf7f"
        },
        {
          "path": "datacenter_twin/continuity.py",
          "sha256": "bcffea3c63344fa97650b2b0faa478ff4435bbcceaff57f76cdb0f1598a7205c"
        },
        {
          "path": "docs/engineering/electrical-continuity.md",
          "sha256": "4fc5a86fd066eae2bcfb35d32a667dd9690c0f77fa3330bdf1b7b1753139bd99"
        },
        {
          "path": "tests/test_course_lessons.py",
          "sha256": "e6e97db262f7fabf9543ce6696eecae5bc5f145ccdb057258756a61cb0d0740b"
        }
      ],
      "contentSha256": "4c3b40e30b95ef92cf739946284b4159f19595927fd8143f88aca3f3b9314e0e"
    },
    {
      "id": "distribution-loss",
      "kind": "continuity",
      "sequence": 2,
      "title": "Account for distribution losses",
      "question": "How much source power is needed to deliver 1,000 kW?",
      "description": "Efficiency",
      "tags": [
        "Efficiency"
      ],
      "modelFamily": "power-continuity",
      "overviewPath": "/learn/distribution-loss/",
      "runtimePath": "/?lesson=distribution-loss",
      "sharedOverview": false,
      "evidenceLinks": [
        "/learn/distribution-loss/",
        "/learn/distribution-loss/results.json",
        "docs/engineering/electrical-continuity.md",
        "tests/test_course_lessons.py"
      ],
      "sourceFiles": [
        {
          "path": "apps/web/src/course-lessons.ts",
          "sha256": "f11f3115e80aee80d47e4e09c893005b2d76943c9fd3795e7127e227605b7df5"
        },
        {
          "path": "apps/web/src/js-engine/continuity.ts",
          "sha256": "6da773947488279a2aa30ab3f4c7830d52c80dc1b47b489ec3ce9cd5cd5edf7f"
        },
        {
          "path": "datacenter_twin/continuity.py",
          "sha256": "bcffea3c63344fa97650b2b0faa478ff4435bbcceaff57f76cdb0f1598a7205c"
        },
        {
          "path": "docs/engineering/electrical-continuity.md",
          "sha256": "4fc5a86fd066eae2bcfb35d32a667dd9690c0f77fa3330bdf1b7b1753139bd99"
        },
        {
          "path": "tests/test_course_lessons.py",
          "sha256": "e6e97db262f7fabf9543ce6696eecae5bc5f145ccdb057258756a61cb0d0740b"
        }
      ],
      "contentSha256": "35b5307be663d94726da43ad6031e8680560ee6579bd65e6706bef3728bc213a"
    },
    {
      "id": "ride-through",
      "kind": "continuity",
      "sequence": 3,
      "title": "Calculate battery ride-through",
      "question": "Does half the stored energy give half the ride-through duration?",
      "description": "Finite storage",
      "tags": [
        "Finite storage"
      ],
      "modelFamily": "power-continuity",
      "overviewPath": "/learn/ride-through/",
      "runtimePath": "/?lesson=ride-through",
      "sharedOverview": false,
      "evidenceLinks": [
        "/learn/ride-through/",
        "/learn/ride-through/results.json",
        "docs/engineering/electrical-continuity.md",
        "tests/test_course_lessons.py"
      ],
      "sourceFiles": [
        {
          "path": "apps/web/src/course-lessons.ts",
          "sha256": "f11f3115e80aee80d47e4e09c893005b2d76943c9fd3795e7127e227605b7df5"
        },
        {
          "path": "apps/web/src/js-engine/continuity.ts",
          "sha256": "6da773947488279a2aa30ab3f4c7830d52c80dc1b47b489ec3ce9cd5cd5edf7f"
        },
        {
          "path": "datacenter_twin/continuity.py",
          "sha256": "bcffea3c63344fa97650b2b0faa478ff4435bbcceaff57f76cdb0f1598a7205c"
        },
        {
          "path": "docs/engineering/electrical-continuity.md",
          "sha256": "4fc5a86fd066eae2bcfb35d32a667dd9690c0f77fa3330bdf1b7b1753139bd99"
        },
        {
          "path": "tests/test_course_lessons.py",
          "sha256": "e6e97db262f7fabf9543ce6696eecae5bc5f145ccdb057258756a61cb0d0740b"
        }
      ],
      "contentSha256": "e1e44c52e5786e1a5f4acde46b539a34d7180fe6119f535b25fa2fbe5e25e235"
    },
    {
      "id": "generator-delay",
      "kind": "continuity",
      "sequence": 4,
      "title": "Bridge generator startup",
      "question": "What changes when startup takes 60 seconds instead of 30?",
      "description": "Sequence and delay",
      "tags": [
        "Sequence and delay"
      ],
      "modelFamily": "power-continuity",
      "overviewPath": "/learn/generator-delay/",
      "runtimePath": "/?lesson=generator-delay",
      "sharedOverview": false,
      "evidenceLinks": [
        "/learn/generator-delay/",
        "/learn/generator-delay/results.json",
        "docs/engineering/electrical-continuity.md",
        "tests/test_course_lessons.py"
      ],
      "sourceFiles": [
        {
          "path": "apps/web/src/course-lessons.ts",
          "sha256": "f11f3115e80aee80d47e4e09c893005b2d76943c9fd3795e7127e227605b7df5"
        },
        {
          "path": "apps/web/src/js-engine/continuity.ts",
          "sha256": "6da773947488279a2aa30ab3f4c7830d52c80dc1b47b489ec3ce9cd5cd5edf7f"
        },
        {
          "path": "datacenter_twin/continuity.py",
          "sha256": "bcffea3c63344fa97650b2b0faa478ff4435bbcceaff57f76cdb0f1598a7205c"
        },
        {
          "path": "docs/engineering/electrical-continuity.md",
          "sha256": "4fc5a86fd066eae2bcfb35d32a667dd9690c0f77fa3330bdf1b7b1753139bd99"
        },
        {
          "path": "tests/test_course_lessons.py",
          "sha256": "e6e97db262f7fabf9543ce6696eecae5bc5f145ccdb057258756a61cb0d0740b"
        }
      ],
      "contentSha256": "3b93073a766b89f765f36c2b2836d811e12f1dd10bde38a2cbf3e95fd385811f"
    },
    {
      "id": "generator-failure",
      "kind": "continuity",
      "sequence": 5,
      "title": "Add a failed generator",
      "question": "What changes if the generator cannot start?",
      "description": "Combined failures",
      "tags": [
        "Combined failures"
      ],
      "modelFamily": "power-continuity",
      "overviewPath": "/learn/generator-failure/",
      "runtimePath": "/?lesson=generator-failure",
      "sharedOverview": false,
      "evidenceLinks": [
        "/learn/generator-failure/",
        "/learn/generator-failure/results.json",
        "docs/engineering/electrical-continuity.md",
        "tests/test_course_lessons.py"
      ],
      "sourceFiles": [
        {
          "path": "apps/web/src/course-lessons.ts",
          "sha256": "f11f3115e80aee80d47e4e09c893005b2d76943c9fd3795e7127e227605b7df5"
        },
        {
          "path": "apps/web/src/js-engine/continuity.ts",
          "sha256": "6da773947488279a2aa30ab3f4c7830d52c80dc1b47b489ec3ce9cd5cd5edf7f"
        },
        {
          "path": "datacenter_twin/continuity.py",
          "sha256": "bcffea3c63344fa97650b2b0faa478ff4435bbcceaff57f76cdb0f1598a7205c"
        },
        {
          "path": "docs/engineering/electrical-continuity.md",
          "sha256": "4fc5a86fd066eae2bcfb35d32a667dd9690c0f77fa3330bdf1b7b1753139bd99"
        },
        {
          "path": "tests/test_course_lessons.py",
          "sha256": "e6e97db262f7fabf9543ce6696eecae5bc5f145ccdb057258756a61cb0d0740b"
        }
      ],
      "contentSha256": "275ed3ab1885bd834f846c2f66a883bd81b91a81dc9c439d69eea115a597ba41"
    },
    {
      "id": "n-plus-one",
      "kind": "continuity",
      "sequence": 6,
      "title": "Check a surviving path",
      "question": "Are two paths enough when either one must carry the whole load?",
      "description": "N+1 capacity reasoning",
      "tags": [
        "N+1 capacity reasoning"
      ],
      "modelFamily": "power-continuity",
      "overviewPath": "/learn/n-plus-one/",
      "runtimePath": "/?lesson=n-plus-one",
      "sharedOverview": false,
      "evidenceLinks": [
        "/learn/n-plus-one/",
        "/learn/n-plus-one/results.json",
        "docs/engineering/electrical-continuity.md",
        "tests/test_course_lessons.py"
      ],
      "sourceFiles": [
        {
          "path": "apps/web/src/course-lessons.ts",
          "sha256": "f11f3115e80aee80d47e4e09c893005b2d76943c9fd3795e7127e227605b7df5"
        },
        {
          "path": "apps/web/src/js-engine/continuity.ts",
          "sha256": "6da773947488279a2aa30ab3f4c7830d52c80dc1b47b489ec3ce9cd5cd5edf7f"
        },
        {
          "path": "datacenter_twin/continuity.py",
          "sha256": "bcffea3c63344fa97650b2b0faa478ff4435bbcceaff57f76cdb0f1598a7205c"
        },
        {
          "path": "docs/engineering/electrical-continuity.md",
          "sha256": "4fc5a86fd066eae2bcfb35d32a667dd9690c0f77fa3330bdf1b7b1753139bd99"
        },
        {
          "path": "tests/test_course_lessons.py",
          "sha256": "e6e97db262f7fabf9543ce6696eecae5bc5f145ccdb057258756a61cb0d0740b"
        }
      ],
      "contentSha256": "9f99068981fcd57768b22fe113d1dc35dc4b9a84da1705148fbd1bc30b59851f"
    },
    {
      "id": "shared-controls",
      "kind": "continuity",
      "sequence": 7,
      "title": "Expose shared control failures",
      "question": "Can a shared control fault defeat both power paths?",
      "description": "Failure domains",
      "tags": [
        "Failure domains"
      ],
      "modelFamily": "power-continuity",
      "overviewPath": "/learn/shared-controls/",
      "runtimePath": "/?lesson=shared-controls",
      "sharedOverview": false,
      "evidenceLinks": [
        "/learn/shared-controls/",
        "/learn/shared-controls/results.json",
        "docs/engineering/electrical-continuity.md",
        "tests/test_course_lessons.py"
      ],
      "sourceFiles": [
        {
          "path": "apps/web/src/course-lessons.ts",
          "sha256": "f11f3115e80aee80d47e4e09c893005b2d76943c9fd3795e7127e227605b7df5"
        },
        {
          "path": "apps/web/src/js-engine/continuity.ts",
          "sha256": "6da773947488279a2aa30ab3f4c7830d52c80dc1b47b489ec3ce9cd5cd5edf7f"
        },
        {
          "path": "datacenter_twin/continuity.py",
          "sha256": "bcffea3c63344fa97650b2b0faa478ff4435bbcceaff57f76cdb0f1598a7205c"
        },
        {
          "path": "docs/engineering/electrical-continuity.md",
          "sha256": "4fc5a86fd066eae2bcfb35d32a667dd9690c0f77fa3330bdf1b7b1753139bd99"
        },
        {
          "path": "tests/test_course_lessons.py",
          "sha256": "e6e97db262f7fabf9543ce6696eecae5bc5f145ccdb057258756a61cb0d0740b"
        }
      ],
      "contentSha256": "e6d607d8afe3e3989e4809200b838016c58403a2aa7ae1f83828fd858bcc3082"
    },
    {
      "id": "single-point",
      "kind": "continuity",
      "sequence": 8,
      "title": "Find a single point of failure",
      "question": "What happens to two paths when their common main bus fails?",
      "description": "Common upstream assets",
      "tags": [
        "Common upstream assets"
      ],
      "modelFamily": "power-continuity",
      "overviewPath": "/learn/single-point/",
      "runtimePath": "/?lesson=single-point",
      "sharedOverview": false,
      "evidenceLinks": [
        "/learn/single-point/",
        "/learn/single-point/results.json",
        "docs/engineering/electrical-continuity.md",
        "tests/test_course_lessons.py"
      ],
      "sourceFiles": [
        {
          "path": "apps/web/src/course-lessons.ts",
          "sha256": "f11f3115e80aee80d47e4e09c893005b2d76943c9fd3795e7127e227605b7df5"
        },
        {
          "path": "apps/web/src/js-engine/continuity.ts",
          "sha256": "6da773947488279a2aa30ab3f4c7830d52c80dc1b47b489ec3ce9cd5cd5edf7f"
        },
        {
          "path": "datacenter_twin/continuity.py",
          "sha256": "bcffea3c63344fa97650b2b0faa478ff4435bbcceaff57f76cdb0f1598a7205c"
        },
        {
          "path": "docs/engineering/electrical-continuity.md",
          "sha256": "4fc5a86fd066eae2bcfb35d32a667dd9690c0f77fa3330bdf1b7b1753139bd99"
        },
        {
          "path": "tests/test_course_lessons.py",
          "sha256": "e6e97db262f7fabf9543ce6696eecae5bc5f145ccdb057258756a61cb0d0740b"
        }
      ],
      "contentSha256": "8ac167c9758d9737a4fd10d37ac7b9fa42f1a57c7e5ceb49894ecb83869d7582"
    },
    {
      "id": "precharge",
      "kind": "continuity",
      "sequence": 9,
      "title": "Track energy before the outage",
      "question": "Why does the 50 kWh case last longer when it can charge first?",
      "description": "Opening balances",
      "tags": [
        "Opening balances"
      ],
      "modelFamily": "power-continuity",
      "overviewPath": "/learn/precharge/",
      "runtimePath": "/?lesson=precharge",
      "sharedOverview": false,
      "evidenceLinks": [
        "/learn/precharge/",
        "/learn/precharge/results.json",
        "docs/engineering/electrical-continuity.md",
        "tests/test_course_lessons.py"
      ],
      "sourceFiles": [
        {
          "path": "apps/web/src/course-lessons.ts",
          "sha256": "f11f3115e80aee80d47e4e09c893005b2d76943c9fd3795e7127e227605b7df5"
        },
        {
          "path": "apps/web/src/js-engine/continuity.ts",
          "sha256": "6da773947488279a2aa30ab3f4c7830d52c80dc1b47b489ec3ce9cd5cd5edf7f"
        },
        {
          "path": "datacenter_twin/continuity.py",
          "sha256": "bcffea3c63344fa97650b2b0faa478ff4435bbcceaff57f76cdb0f1598a7205c"
        },
        {
          "path": "docs/engineering/electrical-continuity.md",
          "sha256": "4fc5a86fd066eae2bcfb35d32a667dd9690c0f77fa3330bdf1b7b1753139bd99"
        },
        {
          "path": "tests/test_course_lessons.py",
          "sha256": "e6e97db262f7fabf9543ce6696eecae5bc5f145ccdb057258756a61cb0d0740b"
        }
      ],
      "contentSha256": "97087d5085acaf2c8f8ec31e86f5d902dbf1fed09c08f60a3bcd8ab9cb740e42"
    },
    {
      "id": "ai-outage",
      "kind": "continuity",
      "sequence": 10,
      "title": "Interrupt a 50 MW AI cluster",
      "question": "How long can 5 MWh of stored energy bridge a 50 MW load?",
      "description": "Aggregate AI power demand",
      "tags": [
        "Aggregate AI power demand"
      ],
      "modelFamily": "power-continuity",
      "overviewPath": "/learn/ai-outage/",
      "runtimePath": "/?lesson=ai-outage",
      "sharedOverview": false,
      "evidenceLinks": [
        "/learn/ai-outage/",
        "/learn/ai-outage/results.json",
        "docs/engineering/electrical-continuity.md",
        "tests/test_course_lessons.py"
      ],
      "sourceFiles": [
        {
          "path": "apps/web/src/course-lessons.ts",
          "sha256": "f11f3115e80aee80d47e4e09c893005b2d76943c9fd3795e7127e227605b7df5"
        },
        {
          "path": "apps/web/src/js-engine/continuity.ts",
          "sha256": "6da773947488279a2aa30ab3f4c7830d52c80dc1b47b489ec3ce9cd5cd5edf7f"
        },
        {
          "path": "datacenter_twin/continuity.py",
          "sha256": "bcffea3c63344fa97650b2b0faa478ff4435bbcceaff57f76cdb0f1598a7205c"
        },
        {
          "path": "docs/engineering/electrical-continuity.md",
          "sha256": "4fc5a86fd066eae2bcfb35d32a667dd9690c0f77fa3330bdf1b7b1753139bd99"
        },
        {
          "path": "tests/test_course_lessons.py",
          "sha256": "e6e97db262f7fabf9543ce6696eecae5bc5f145ccdb057258756a61cb0d0740b"
        }
      ],
      "contentSha256": "937762d6c1043bb14dec110efff319892862c7898b9c9ae103aa53cbe4b815bc"
    },
    {
      "id": "recovery-deadline",
      "kind": "continuity",
      "sequence": 11,
      "title": "Catch a sub-second service gap",
      "question": "Does 57 kWh bridge recovery at 500 seconds? Does 58 kWh?",
      "description": "Exact event timing",
      "tags": [
        "Exact event timing"
      ],
      "modelFamily": "power-continuity",
      "overviewPath": "/learn/recovery-deadline/",
      "runtimePath": "/?lesson=recovery-deadline",
      "sharedOverview": false,
      "evidenceLinks": [
        "/learn/recovery-deadline/",
        "/learn/recovery-deadline/results.json",
        "docs/engineering/electrical-continuity.md",
        "tests/test_course_lessons.py"
      ],
      "sourceFiles": [
        {
          "path": "apps/web/src/course-lessons.ts",
          "sha256": "f11f3115e80aee80d47e4e09c893005b2d76943c9fd3795e7127e227605b7df5"
        },
        {
          "path": "apps/web/src/js-engine/continuity.ts",
          "sha256": "6da773947488279a2aa30ab3f4c7830d52c80dc1b47b489ec3ce9cd5cd5edf7f"
        },
        {
          "path": "datacenter_twin/continuity.py",
          "sha256": "bcffea3c63344fa97650b2b0faa478ff4435bbcceaff57f76cdb0f1598a7205c"
        },
        {
          "path": "docs/engineering/electrical-continuity.md",
          "sha256": "4fc5a86fd066eae2bcfb35d32a667dd9690c0f77fa3330bdf1b7b1753139bd99"
        },
        {
          "path": "tests/test_course_lessons.py",
          "sha256": "e6e97db262f7fabf9543ce6696eecae5bc5f145ccdb057258756a61cb0d0740b"
        }
      ],
      "contentSha256": "213dab230b2111d916152e689a5d4ace4f66f99e33af332b0a8d942bba8f3132"
    },
    {
      "id": "pue",
      "kind": "continuity",
      "sequence": 12,
      "title": "Separate PUE from continuity",
      "question": "How does assumed PUE change annual energy for the same 50 MW IT load?",
      "description": "Facility energy planning",
      "tags": [
        "Facility energy planning"
      ],
      "modelFamily": "annual-pue",
      "overviewPath": "/learn/pue/",
      "runtimePath": "/?lesson=pue",
      "sharedOverview": false,
      "evidenceLinks": [
        "/learn/pue/",
        "/learn/pue/results.json",
        "docs/engineering/course-studio.md",
        "tests/test_course_lessons.py"
      ],
      "sourceFiles": [
        {
          "path": "apps/web/src/course-lessons.ts",
          "sha256": "f11f3115e80aee80d47e4e09c893005b2d76943c9fd3795e7127e227605b7df5"
        },
        {
          "path": "apps/web/src/js-engine/planning.ts",
          "sha256": "9686b5b980df56dfacd3e4c300f2dd03df1ebcf258de2864cd26173df775bc7f"
        },
        {
          "path": "datacenter_twin/contracts.py",
          "sha256": "34154db95e287629b19f002de6ce8fd82384ceb40834d16a2c4ea313adc44ddd"
        },
        {
          "path": "datacenter_twin/engine.py",
          "sha256": "547932649b2900212ce6a04b61e5f83807d689f592a90b88707f6c1b8b7b1a69"
        },
        {
          "path": "docs/engineering/course-studio.md",
          "sha256": "12d6064058b504bd8b748f94ac1f82ec0330b3762a9accf0f799acfaaca4fd33"
        },
        {
          "path": "tests/test_course_lessons.py",
          "sha256": "e6e97db262f7fabf9543ce6696eecae5bc5f145ccdb057258756a61cb0d0740b"
        }
      ],
      "contentSha256": "946f68d172fd201e17658d48e17fef05a178e76037e0c9a55d3ecbe719126cf1"
    },
    {
      "id": "emt",
      "kind": "emt",
      "sequence": null,
      "title": "Inside a voltage sag",
      "question": null,
      "description": "Explore a 200 ms DC-link transient. Change the circuit, replay the waveforms and check where the stored energy goes.",
      "tags": [
        "EMT fundamentals",
        "DC-link RLC"
      ],
      "modelFamily": "dc-link-rlc",
      "overviewPath": "/studies/emt/",
      "runtimePath": "/?mode=emt",
      "sharedOverview": false,
      "evidenceLinks": [
        "/studies/emt/",
        "/studies/emt/default-result.json",
        "docs/studies/emt.md",
        "tests/test_emt.py"
      ],
      "sourceFiles": [
        {
          "path": "apps/web/seo-emt.ts",
          "sha256": "71a28f79b5edd29d88e952084cd4654b24633b881f7c26e97638a639844b0cc0"
        },
        {
          "path": "apps/web/src/emt/engine.ts",
          "sha256": "b4325e3190e40030a7e2e58f589f69be00aa8cbd9abd7b8d90463065faea74df"
        },
        {
          "path": "datacenter_twin/emt.py",
          "sha256": "50966641b05282055c42f9cee377de7c0c7d380bbec636e2adb25239f2e1923a"
        },
        {
          "path": "docs/studies/emt.md",
          "sha256": "a7d36d17aab9ca38ddbbb6a3400f4bcf03b69a67f9840ec28ccf1f20c9d1fc57"
        },
        {
          "path": "tests/test_emt.py",
          "sha256": "f91da73a6be7029c1363703bd82fc670247aee43b7a3d17c8959d80ccc0771d4"
        }
      ],
      "contentSha256": "576daf56a0f6cd544e96d0b021b760d711f95e99b48c9c09ff2dd69b645e1b26"
    },
    {
      "id": "load-step",
      "kind": "dynamics",
      "sequence": 1,
      "title": "Load-step response",
      "question": "How quickly does PCC power follow a change from 0.5 to 0.6 pu?",
      "description": "Run an equilibrated 21-state converter chain. Compare the requested load, PCC response and DC-link voltage.",
      "tags": [
        "Load-step response"
      ],
      "modelFamily": "power-dynamics",
      "overviewPath": "/studies/power-dynamics/",
      "runtimePath": "/?study=load-step",
      "sharedOverview": true,
      "evidenceLinks": [
        "/studies/power-dynamics/",
        "docs/studies/power-dynamics.md",
        "tests/test_research.py"
      ],
      "sourceFiles": [
        {
          "path": "apps/web/seo-research.ts",
          "sha256": "a1afbf07254b0ab19603ecbb4ab32ea17c74df22e0f5bee15accce76a8c0c3a7"
        },
        {
          "path": "apps/web/src/research/types.ts",
          "sha256": "b5b65b8a35a799531cfede4637b8cc3e5f11f1895f3bc5ba1ee596c7f2d3076b"
        },
        {
          "path": "datacenter_twin/research/__init__.py",
          "sha256": "ea409992154cf1507762bbdad00aee2f8e0ee50d7e1766e0f75efebdb75a0541"
        },
        {
          "path": "tests/test_research.py",
          "sha256": "5216144fde49882d293bc4c8d98f2e5fd77e0d6eea1f6d5129d65badbb9fc103"
        },
        {
          "path": "docs/studies/power-dynamics.md",
          "sha256": "119bc33ffdc837aa04389c745bdf1d0b2fe11bc4f15cb6ce13c5b4c3ea4769b2"
        },
        {
          "path": "datacenter_twin/research/sdcib.py",
          "sha256": "1d4439d1a06aebd6907236e998a5fde7a0c9ee3668c7b6c46d2486e250c6dd5d"
        }
      ],
      "contentSha256": "7a2e2ab51f8c6223c3458ee43bc031fab5c47cdfdd0ccb1125979f72ec365373"
    },
    {
      "id": "modal",
      "kind": "dynamics",
      "sequence": 2,
      "title": "Modes and frequency response",
      "question": "What changes when the voltage-loop bandwidth changes?",
      "description": "Inspect eigenvalues, damping, dominant state participation and a sampled small-signal frequency response.",
      "tags": [
        "Modes and frequency response"
      ],
      "modelFamily": "power-dynamics",
      "overviewPath": "/studies/power-dynamics/",
      "runtimePath": "/?study=modal",
      "sharedOverview": true,
      "evidenceLinks": [
        "/studies/power-dynamics/",
        "docs/studies/power-dynamics.md",
        "tests/test_research.py"
      ],
      "sourceFiles": [
        {
          "path": "apps/web/seo-research.ts",
          "sha256": "a1afbf07254b0ab19603ecbb4ab32ea17c74df22e0f5bee15accce76a8c0c3a7"
        },
        {
          "path": "apps/web/src/research/types.ts",
          "sha256": "b5b65b8a35a799531cfede4637b8cc3e5f11f1895f3bc5ba1ee596c7f2d3076b"
        },
        {
          "path": "datacenter_twin/research/__init__.py",
          "sha256": "ea409992154cf1507762bbdad00aee2f8e0ee50d7e1766e0f75efebdb75a0541"
        },
        {
          "path": "tests/test_research.py",
          "sha256": "5216144fde49882d293bc4c8d98f2e5fd77e0d6eea1f6d5129d65badbb9fc103"
        },
        {
          "path": "docs/studies/power-dynamics.md",
          "sha256": "119bc33ffdc837aa04389c745bdf1d0b2fe11bc4f15cb6ce13c5b4c3ea4769b2"
        },
        {
          "path": "datacenter_twin/research/sdcib.py",
          "sha256": "1d4439d1a06aebd6907236e998a5fde7a0c9ee3668c7b6c46d2486e250c6dd5d"
        }
      ],
      "contentSha256": "689050eddfdc19deda2478f5f0305b5a96d4357900df2efb93f52b22de6b2550"
    },
    {
      "id": "forced-response",
      "kind": "dynamics",
      "sequence": 3,
      "title": "Synthetic load spectrum",
      "question": "Which part of a repeating load swing reaches the PCC?",
      "description": "Apply a bounded sinusoidal load and compare its time response and spectrum. The input is explicitly synthetic.",
      "tags": [
        "Synthetic load spectrum"
      ],
      "modelFamily": "power-dynamics",
      "overviewPath": "/studies/power-dynamics/",
      "runtimePath": "/?study=forced-response",
      "sharedOverview": true,
      "evidenceLinks": [
        "/studies/power-dynamics/",
        "docs/studies/power-dynamics.md",
        "tests/test_research.py"
      ],
      "sourceFiles": [
        {
          "path": "apps/web/seo-research.ts",
          "sha256": "a1afbf07254b0ab19603ecbb4ab32ea17c74df22e0f5bee15accce76a8c0c3a7"
        },
        {
          "path": "apps/web/src/research/types.ts",
          "sha256": "b5b65b8a35a799531cfede4637b8cc3e5f11f1895f3bc5ba1ee596c7f2d3076b"
        },
        {
          "path": "datacenter_twin/research/__init__.py",
          "sha256": "ea409992154cf1507762bbdad00aee2f8e0ee50d7e1766e0f75efebdb75a0541"
        },
        {
          "path": "tests/test_research.py",
          "sha256": "5216144fde49882d293bc4c8d98f2e5fd77e0d6eea1f6d5129d65badbb9fc103"
        },
        {
          "path": "docs/studies/power-dynamics.md",
          "sha256": "119bc33ffdc837aa04389c745bdf1d0b2fe11bc4f15cb6ce13c5b4c3ea4769b2"
        },
        {
          "path": "datacenter_twin/research/sdcib.py",
          "sha256": "1d4439d1a06aebd6907236e998a5fde7a0c9ee3668c7b6c46d2486e250c6dd5d"
        }
      ],
      "contentSha256": "5c75af5f4b7bac5a25be5afaf6ea056beb5b6badc82fc07be30847e5dff86896"
    },
    {
      "id": "model-comparison",
      "kind": "dynamics",
      "sequence": 4,
      "title": "Phase model versus QSS",
      "question": "What does the reduced formulation leave out?",
      "description": "Compare the supplied 41-state abc and 21-state quasi-steady formulations, including their hand-set startup and a shared step at 0.04 s in a bounded 0.08 s window.",
      "tags": [
        "Phase model versus QSS"
      ],
      "modelFamily": "power-dynamics",
      "overviewPath": "/studies/power-dynamics/",
      "runtimePath": "/?study=model-comparison",
      "sharedOverview": true,
      "evidenceLinks": [
        "/studies/power-dynamics/",
        "docs/studies/power-dynamics.md",
        "tests/test_research.py"
      ],
      "sourceFiles": [
        {
          "path": "apps/web/seo-research.ts",
          "sha256": "a1afbf07254b0ab19603ecbb4ab32ea17c74df22e0f5bee15accce76a8c0c3a7"
        },
        {
          "path": "apps/web/src/research/types.ts",
          "sha256": "b5b65b8a35a799531cfede4637b8cc3e5f11f1895f3bc5ba1ee596c7f2d3076b"
        },
        {
          "path": "datacenter_twin/research/__init__.py",
          "sha256": "ea409992154cf1507762bbdad00aee2f8e0ee50d7e1766e0f75efebdb75a0541"
        },
        {
          "path": "tests/test_research.py",
          "sha256": "5216144fde49882d293bc4c8d98f2e5fd77e0d6eea1f6d5129d65badbb9fc103"
        },
        {
          "path": "docs/studies/power-dynamics.md",
          "sha256": "119bc33ffdc837aa04389c745bdf1d0b2fe11bc4f15cb6ce13c5b4c3ea4769b2"
        },
        {
          "path": "datacenter_twin/research/model_comparison.py",
          "sha256": "c68a2c2e3c8ce93eecc923c7e23a985e38d6c62707c008651a9c0d5d30c8646f"
        }
      ],
      "contentSha256": "09318d57bf5ae5a71c23dea773b400bb093b45a95789167f257c6b50d2a15575"
    },
    {
      "id": "grid-network",
      "kind": "dynamics",
      "sequence": 5,
      "title": "Interacting grid ports",
      "question": "Does a solved power flow imply stable dynamics?",
      "description": "Explore a modified nine-bus network with synchronous-machine, grid-forming, grid-following and data-center ports.",
      "tags": [
        "Interacting grid ports"
      ],
      "modelFamily": "power-dynamics",
      "overviewPath": "/studies/power-dynamics/",
      "runtimePath": "/?study=grid-network",
      "sharedOverview": true,
      "evidenceLinks": [
        "/studies/power-dynamics/",
        "docs/studies/power-dynamics.md",
        "tests/test_research.py"
      ],
      "sourceFiles": [
        {
          "path": "apps/web/seo-research.ts",
          "sha256": "a1afbf07254b0ab19603ecbb4ab32ea17c74df22e0f5bee15accce76a8c0c3a7"
        },
        {
          "path": "apps/web/src/research/types.ts",
          "sha256": "b5b65b8a35a799531cfede4637b8cc3e5f11f1895f3bc5ba1ee596c7f2d3076b"
        },
        {
          "path": "datacenter_twin/research/__init__.py",
          "sha256": "ea409992154cf1507762bbdad00aee2f8e0ee50d7e1766e0f75efebdb75a0541"
        },
        {
          "path": "tests/test_research.py",
          "sha256": "5216144fde49882d293bc4c8d98f2e5fd77e0d6eea1f6d5129d65badbb9fc103"
        },
        {
          "path": "docs/studies/power-dynamics.md",
          "sha256": "119bc33ffdc837aa04389c745bdf1d0b2fe11bc4f15cb6ce13c5b4c3ea4769b2"
        },
        {
          "path": "datacenter_twin/research/grid_network.py",
          "sha256": "b4b070dfb87f918876029bd2026b9b498675f4e4c9f92e464ab42832c239fc06"
        }
      ],
      "contentSha256": "0abf08a413430cdc3cd0cc9f08c78fbd28f4ee3924e8d512940ff1a958feb0dc"
    },
    {
      "id": "evidence-load-ledger",
      "kind": "infrastructure",
      "sequence": 13,
      "title": "Build an evidence-controlled load ledger",
      "question": "Keeping 6.2 MW cooling unchanged, can the revised design ratio accommodate the ledger?",
      "description": "Begin where the original course leaves off: not with a bigger battery, but with a more disciplined definition of demand. A facility total is meaningful only when every term belongs to the same boundary and operating condition. In this lesson, a 20 MW IT allocation becomes a traceable facility ledger, while a second example demonstrates why conflicting source values must remain visible.",
      "tags": [
        "Separate connected ratings, coincident demand and future reservation.",
        "Reconcile IT, cooling electricity, other loads and losses without duplication.",
        "Distinguish an assumed design-point ratio from an interval energy PUE."
      ],
      "modelFamily": "infrastructure-screen-1",
      "overviewPath": "/learn/infrastructure/evidence-load-ledger/",
      "runtimePath": "/?lesson=evidence-load-ledger",
      "sharedOverview": false,
      "evidenceLinks": [
        "/learn/infrastructure/evidence-load-ledger/",
        "/learn/infrastructure/evidence-load-ledger/results.json",
        "docs/validation/infrastructure-serialization.md"
      ],
      "sourceFiles": [
        {
          "path": "apps/web/src/infrastructure/content/13-evidence-load-ledger.json",
          "sha256": "00083b3e0ca68ba936c0ce5d372f4fbac7c552133dcac8de79248a0180a9a4aa"
        },
        {
          "path": "apps/web/src/infrastructure/screens.ts",
          "sha256": "740a4a79d3229a99a7af3d132f9b55bcbbbfc0716d9e121eae32e20af27b757c"
        },
        {
          "path": "scripts/verify_infrastructure.py",
          "sha256": "98cd76aee324228aa185348fd0fbda1df479f7323e032212d360199d09394df6"
        }
      ],
      "contentSha256": "8d649f8e0b1f4435447b8c6a552dada3bbf2bc012741a24a6e5443dd4002cddf"
    },
    {
      "id": "resilience-state-matrix",
      "kind": "infrastructure",
      "sequence": 14,
      "title": "Test capacity, paths and common dependencies",
      "question": "Does one spare still leave enough usable capacity?",
      "description": "The existing lessons show how a surviving path or shared controller can govern electrical service. Now extend that intuition into a state matrix. Installed equipment, connected equipment and independently substitutable equipment are different sets. A spare counts only when it can reach the required load in the state being assessed.",
      "tags": [
        "Calculate available capacity after specified losses.",
        "Distinguish a bank screen from a connectivity proof.",
        "Explain how common dependence changes an ideal availability model."
      ],
      "modelFamily": "infrastructure-screen-1",
      "overviewPath": "/learn/infrastructure/resilience-state-matrix/",
      "runtimePath": "/?lesson=resilience-state-matrix",
      "sharedOverview": false,
      "evidenceLinks": [
        "/learn/infrastructure/resilience-state-matrix/",
        "/learn/infrastructure/resilience-state-matrix/results.json",
        "docs/validation/infrastructure-serialization.md"
      ],
      "sourceFiles": [
        {
          "path": "apps/web/src/infrastructure/content/14-resilience-state-matrix.json",
          "sha256": "53c900c89bf599adc80f40f7dc037050b3e117f0150ba0dafacb209ef64b8e47"
        },
        {
          "path": "apps/web/src/infrastructure/screens.ts",
          "sha256": "740a4a79d3229a99a7af3d132f9b55bcbbbfc0716d9e121eae32e20af27b757c"
        },
        {
          "path": "scripts/verify_infrastructure.py",
          "sha256": "98cd76aee324228aa185348fd0fbda1df479f7323e032212d360199d09394df6"
        }
      ],
      "contentSha256": "ee3b391426e0f7ee75aa752a19bd3f2f0dbf9d093acec2490257dc3eebec0dd6"
    },
    {
      "id": "transformer-fault-boundaries",
      "kind": "infrastructure",
      "sequence": 15,
      "title": "Declare transformer and fault-current boundaries",
      "question": "What changes when the upstream source is idealized as infinite?",
      "description": "A current value without its voltage, power base and network boundary is easy to misuse. This lesson builds a small equivalent circuit in layers, then shows how changing an assumption changes a fault-current screen. The purpose is to expose model limits before equipment selection, not to turn an attractive fault animation into a completed short-circuit study.",
      "tags": [
        "Calculate consistent three-phase current and impedance bases.",
        "Compare infinite- and finite-source fault estimates.",
        "Keep continuous, peak, interrupting and thermal duties distinct."
      ],
      "modelFamily": "infrastructure-screen-1",
      "overviewPath": "/learn/infrastructure/transformer-fault-boundaries/",
      "runtimePath": "/?lesson=transformer-fault-boundaries",
      "sharedOverview": false,
      "evidenceLinks": [
        "/learn/infrastructure/transformer-fault-boundaries/",
        "/learn/infrastructure/transformer-fault-boundaries/results.json",
        "docs/validation/infrastructure-serialization.md"
      ],
      "sourceFiles": [
        {
          "path": "apps/web/src/infrastructure/content/15-transformer-fault-boundaries.json",
          "sha256": "6b1befe1116cdab93196aca5c55ce095919df47ddec5ede54621d47f332b2170"
        },
        {
          "path": "apps/web/src/infrastructure/screens.ts",
          "sha256": "740a4a79d3229a99a7af3d132f9b55bcbbbfc0716d9e121eae32e20af27b757c"
        },
        {
          "path": "scripts/verify_infrastructure.py",
          "sha256": "98cd76aee324228aa185348fd0fbda1df479f7323e032212d360199d09394df6"
        }
      ],
      "contentSha256": "d8afd6e0e2d1a1716428a02ebf05316accc9c92e66a9e86044e10f03579cf9f5"
    },
    {
      "id": "generator-bank-fuel",
      "kind": "infrastructure",
      "sequence": 16,
      "title": "Audit generator banks and usable fuel",
      "question": "Does thirteen installed per side close the capacity screen?",
      "description": "The original startup lessons ask whether a generator becomes available in time. This lesson asks a different question: can the available bank carry the backed load at all? Follow a source claim through its real-power conversion, post-loss capacity and fuel ledger. A failed arithmetic claim should stay failed even when the combined installed nameplates look impressive.",
      "tags": [
        "Convert the source-specific generator kVA rating to real-power capability.",
        "Test one independent bank after one unit is unavailable.",
        "Separate usable fuel consumption from gross tank volume and dynamic qualification."
      ],
      "modelFamily": "infrastructure-screen-1",
      "overviewPath": "/learn/infrastructure/generator-bank-fuel/",
      "runtimePath": "/?lesson=generator-bank-fuel",
      "sharedOverview": false,
      "evidenceLinks": [
        "/learn/infrastructure/generator-bank-fuel/",
        "/learn/infrastructure/generator-bank-fuel/results.json",
        "docs/validation/infrastructure-serialization.md"
      ],
      "sourceFiles": [
        {
          "path": "apps/web/src/infrastructure/content/16-generator-bank-fuel.json",
          "sha256": "53f37e1188a233000317afc1ffd4a2ec9551eaef5d4fb26aca8d248cecbf15e3"
        },
        {
          "path": "apps/web/src/infrastructure/screens.ts",
          "sha256": "740a4a79d3229a99a7af3d132f9b55bcbbbfc0716d9e121eae32e20af27b757c"
        },
        {
          "path": "apps/web/src/infrastructure/fuel.ts",
          "sha256": "bd6e17748cc2b5bfc48539bd8a38f671bcb71341eac1cb79c04d37092dd362c0"
        },
        {
          "path": "scripts/verify_infrastructure.py",
          "sha256": "98cd76aee324228aa185348fd0fbda1df479f7323e032212d360199d09394df6"
        }
      ],
      "contentSha256": "9f4d7a4901e010324c99b4474e967393f879d50afc878f94340d27443085da6d"
    },
    {
      "id": "ups-battery-station-dc",
      "kind": "infrastructure",
      "sequence": 17,
      "title": "Separate UPS power, battery energy and trip DC",
      "question": "How do the energy screens change at the same output power?",
      "description": "The battery lesson already distinguishes reserve from ride-through. Now separate three further boundaries: AC output energy, delivered DC energy and nominal end-of-life storage. Then examine the protection DC circuit, where enough ampere-hours can coexist with insufficient voltage at the device that must operate.",
      "tags": [
        "Compute AC, delivered DC and nominal energy as different quantities.",
        "Evaluate constant-power current at minimum loaded DC voltage.",
        "Separate UPS module redundancy, battery dependence and station DC integrity."
      ],
      "modelFamily": "infrastructure-screen-1",
      "overviewPath": "/learn/infrastructure/ups-battery-station-dc/",
      "runtimePath": "/?lesson=ups-battery-station-dc",
      "sharedOverview": false,
      "evidenceLinks": [
        "/learn/infrastructure/ups-battery-station-dc/",
        "/learn/infrastructure/ups-battery-station-dc/results.json",
        "docs/validation/infrastructure-serialization.md"
      ],
      "sourceFiles": [
        {
          "path": "apps/web/src/infrastructure/content/17-ups-battery-station-dc.json",
          "sha256": "a97134a5857c285a2d6ed98f0468654391e2388df10a5c00530b44af49e9ef51"
        },
        {
          "path": "apps/web/src/infrastructure/screens.ts",
          "sha256": "740a4a79d3229a99a7af3d132f9b55bcbbbfc0716d9e121eae32e20af27b757c"
        },
        {
          "path": "scripts/verify_infrastructure.py",
          "sha256": "98cd76aee324228aa185348fd0fbda1df479f7323e032212d360199d09394df6"
        }
      ],
      "contentSha256": "e480eabb574f8f6009f88ea48cbf83d6ed1195a0845023e28e0d9bdafb5f6269"
    },
    {
      "id": "protection-trip-chain",
      "kind": "infrastructure",
      "sequence": 18,
      "title": "Trace protection zones and the full trip chain",
      "question": "What happens near the pickup boundary?",
      "description": "Protection is not a green status field at one current. It is a chain from the actual fault through measurement, logic, DC supply and interruption. Use a declared inverse-time curve to learn how a calculation behaves, then inspect what that curve cannot establish about CT saturation, electrical zones or selectivity.",
      "tags": [
        "Evaluate the stated inverse-time teaching model.",
        "Distinguish a nominal timing margin from full coordination.",
        "Identify CT-defined zone boundaries and end-to-end trip evidence."
      ],
      "modelFamily": "infrastructure-screen-1",
      "overviewPath": "/learn/infrastructure/protection-trip-chain/",
      "runtimePath": "/?lesson=protection-trip-chain",
      "sharedOverview": false,
      "evidenceLinks": [
        "/learn/infrastructure/protection-trip-chain/",
        "/learn/infrastructure/protection-trip-chain/results.json",
        "docs/validation/infrastructure-serialization.md"
      ],
      "sourceFiles": [
        {
          "path": "apps/web/src/infrastructure/content/18-protection-trip-chain.json",
          "sha256": "a156f84f313ce7aba3c3c1f4a2cfabc9c99b584807ca1857ba97906f97101780"
        },
        {
          "path": "apps/web/src/infrastructure/screens.ts",
          "sha256": "740a4a79d3229a99a7af3d132f9b55bcbbbfc0716d9e121eae32e20af27b757c"
        },
        {
          "path": "scripts/verify_infrastructure.py",
          "sha256": "98cd76aee324228aa185348fd0fbda1df479f7323e032212d360199d09394df6"
        }
      ],
      "contentSha256": "3d0ba33d86d35bb613c4fc5f349165dc4320c48c7b8d8c0f6a83f11f509ff419"
    },
    {
      "id": "grounding-power-quality",
      "kind": "infrastructure",
      "sequence": 19,
      "title": "Inspect grounding, distortion and control-power loops",
      "question": "What changes if the fundamental current falls while harmonics and reference demand stay fixed?",
      "description": "Low resistance, low distortion and a nominal battery voltage each answer only a narrowly defined question. This lesson turns those single numbers into explicit boundaries. Follow the ground current, compare harmonic denominators, and include the return conductor in the trip circuit before drawing any conclusion about service.",
      "tags": [
        "Distinguish ground-potential rise from touch/step assessment.",
        "Calculate THD and TDD using different denominators.",
        "Evaluate a complete DC loop and explain frequency-change consequences."
      ],
      "modelFamily": "infrastructure-screen-1",
      "overviewPath": "/learn/infrastructure/grounding-power-quality/",
      "runtimePath": "/?lesson=grounding-power-quality",
      "sharedOverview": false,
      "evidenceLinks": [
        "/learn/infrastructure/grounding-power-quality/",
        "/learn/infrastructure/grounding-power-quality/results.json",
        "docs/validation/infrastructure-serialization.md"
      ],
      "sourceFiles": [
        {
          "path": "apps/web/src/infrastructure/content/19-grounding-power-quality.json",
          "sha256": "430b6e667f277c8f0057f2a8daa5f29ee1477e4ab0ca0307ba6ebb71f31318a5"
        },
        {
          "path": "apps/web/src/infrastructure/screens.ts",
          "sha256": "740a4a79d3229a99a7af3d132f9b55bcbbbfc0716d9e121eae32e20af27b757c"
        },
        {
          "path": "scripts/verify_infrastructure.py",
          "sha256": "98cd76aee324228aa185348fd0fbda1df479f7323e032212d360199d09394df6"
        }
      ],
      "contentSha256": "24a438f37adeca7e89159752155527d1d1fddf0d936e8782b939edffe3b9bae4"
    },
    {
      "id": "thermal-liquid-continuity",
      "kind": "infrastructure",
      "sequence": 20,
      "title": "Coordinate liquid cooling and thermal ride-through",
      "question": "How much room heat remains at the new rack boundary?",
      "description": "Battery minutes do not create cooling minutes. Start with the manuscript’s mixed-cooling rack, then move to a separately labelled facility thermal model. The visual goal is to make both heat paths and their shared rejection boundary visible, so that the learner never mistakes a liquid-cooled label for complete removal of room heat.",
      "tags": [
        "Calculate liquid capture and residual air-cooling demand.",
        "Use a sensible heat balance with declared fluid properties.",
        "Compare a lumped thermal interval with electrical storage and restoration time."
      ],
      "modelFamily": "infrastructure-screen-1",
      "overviewPath": "/learn/infrastructure/thermal-liquid-continuity/",
      "runtimePath": "/?lesson=thermal-liquid-continuity",
      "sharedOverview": false,
      "evidenceLinks": [
        "/learn/infrastructure/thermal-liquid-continuity/",
        "/learn/infrastructure/thermal-liquid-continuity/results.json",
        "docs/validation/infrastructure-serialization.md"
      ],
      "sourceFiles": [
        {
          "path": "apps/web/src/infrastructure/content/20-thermal-liquid-continuity.json",
          "sha256": "728997273086db095fdcb0f2df354f8a13fa39ff2372173de077e29ad6a01303"
        },
        {
          "path": "apps/web/src/infrastructure/screens.ts",
          "sha256": "740a4a79d3229a99a7af3d132f9b55bcbbbfc0716d9e121eae32e20af27b757c"
        },
        {
          "path": "scripts/verify_infrastructure.py",
          "sha256": "98cd76aee324228aa185348fd0fbda1df479f7323e032212d360199d09394df6"
        }
      ],
      "contentSha256": "88abb4a16b70ceb0e679ef95c8633ee3719cb09e9af95e0e5ddba9b0fb6da9c2"
    },
    {
      "id": "network-optical-budget",
      "kind": "infrastructure",
      "sequence": 21,
      "title": "Separate physical routes, optical budgets and fabric capacity",
      "question": "Does one uplink failure change the optical budget of the remaining channel?",
      "description": "Two fibres are not automatically two independent services, and a low optical loss is not automatically an application pass. Separate the physical administration route from the logical fabric, then calculate a narrow loss budget and post-uplink-loss capacity. The lesson adds communications reasoning without pretending that the existing electrical simulator already models packets.",
      "tags": [
        "Distinguish distribution spaces from switching functions.",
        "Calculate optical loss plus an explicit engineering margin.",
        "Evaluate post-failure uplink capacity and common route dependencies."
      ],
      "modelFamily": "infrastructure-screen-1",
      "overviewPath": "/learn/infrastructure/network-optical-budget/",
      "runtimePath": "/?lesson=network-optical-budget",
      "sharedOverview": false,
      "evidenceLinks": [
        "/learn/infrastructure/network-optical-budget/",
        "/learn/infrastructure/network-optical-budget/results.json",
        "docs/validation/infrastructure-serialization.md"
      ],
      "sourceFiles": [
        {
          "path": "apps/web/src/infrastructure/content/21-network-optical-budget.json",
          "sha256": "5b53724dd1eae96f943956b720441a357a70ae22baef37f066d22d10f8f51781"
        },
        {
          "path": "apps/web/src/infrastructure/screens.ts",
          "sha256": "740a4a79d3229a99a7af3d132f9b55bcbbbfc0716d9e121eae32e20af27b757c"
        },
        {
          "path": "scripts/verify_infrastructure.py",
          "sha256": "98cd76aee324228aa185348fd0fbda1df479f7323e032212d360199d09394df6"
        }
      ],
      "contentSha256": "e0d6b333368fd0f3f259c806fefa3df6d146316cd5777d48be08d14483b6c947"
    },
    {
      "id": "facilities-phased-development",
      "kind": "infrastructure",
      "sequence": 22,
      "title": "Review spatial capacity and phased development",
      "question": "What average pressure does the new rack screen produce?",
      "description": "A rack count is not a facility plan. Equipment requires service space, replacement routes, structural capacity and coordinated boundaries through every construction phase. Use the manuscript’s historical operating account to practise reporting what was actually stated without turning different area descriptions into one misleading density metric.",
      "tags": [
        "Keep gross, tenant, raised-floor, pod and occupied-rack boundaries separate.",
        "Distinguish average pressure from concentrated structural loading.",
        "Assess initial, expansion, tie-in and final service states."
      ],
      "modelFamily": "infrastructure-screen-1",
      "overviewPath": "/learn/infrastructure/facilities-phased-development/",
      "runtimePath": "/?lesson=facilities-phased-development",
      "sharedOverview": false,
      "evidenceLinks": [
        "/learn/infrastructure/facilities-phased-development/",
        "/learn/infrastructure/facilities-phased-development/results.json",
        "docs/validation/infrastructure-serialization.md"
      ],
      "sourceFiles": [
        {
          "path": "apps/web/src/infrastructure/content/22-facilities-phased-development.json",
          "sha256": "01df01e8971d1ca5ce565e49c1f889500b11d15af79c3bfd0c206eeae0a9d66e"
        },
        {
          "path": "apps/web/src/infrastructure/screens.ts",
          "sha256": "740a4a79d3229a99a7af3d132f9b55bcbbbfc0716d9e121eae32e20af27b757c"
        },
        {
          "path": "scripts/verify_infrastructure.py",
          "sha256": "98cd76aee324228aa185348fd0fbda1df479f7323e032212d360199d09394df6"
        }
      ],
      "contentSha256": "d1709c386c063fdd7cb080e857eba77cf921d69b83727cc673439d4c9cad531d"
    },
    {
      "id": "commissioning-evidence-loop",
      "kind": "infrastructure",
      "sequence": 23,
      "title": "Build an integrated commissioning evidence loop",
      "question": "Which teaching constraint fails when staged restoration takes 23 s?",
      "description": "A completed component test answers a component question. Integrated continuity requires an initial state, expected sequence, instruments, acceptance criteria, stop conditions and recovery boundary that span the service chain. Compare two clocks, then examine the measurement boundary behind an apparently precise efficiency number.",
      "tags": [
        "Build observable cause-and-effect and acceptance records.",
        "Compare restoration time with electrical and thermal intervals.",
        "Compute interval energy and first-order PUE standard uncertainty."
      ],
      "modelFamily": "infrastructure-screen-1",
      "overviewPath": "/learn/infrastructure/commissioning-evidence-loop/",
      "runtimePath": "/?lesson=commissioning-evidence-loop",
      "sharedOverview": false,
      "evidenceLinks": [
        "/learn/infrastructure/commissioning-evidence-loop/",
        "/learn/infrastructure/commissioning-evidence-loop/results.json",
        "docs/validation/infrastructure-serialization.md"
      ],
      "sourceFiles": [
        {
          "path": "apps/web/src/infrastructure/content/23-commissioning-evidence-loop.json",
          "sha256": "4fc3afe0513d34fba7457f5da17890bec5703cf16634950836f48bc974370d83"
        },
        {
          "path": "apps/web/src/infrastructure/screens.ts",
          "sha256": "740a4a79d3229a99a7af3d132f9b55bcbbbfc0716d9e121eae32e20af27b757c"
        },
        {
          "path": "scripts/verify_infrastructure.py",
          "sha256": "98cd76aee324228aa185348fd0fbda1df479f7323e032212d360199d09394df6"
        }
      ],
      "contentSha256": "d450551553d307c2766a7256e43ba2eb2ba0c396b549e93f8950d60ff6cc9b1a"
    },
    {
      "id": "integrated-design-release",
      "kind": "infrastructure",
      "sequence": 24,
      "title": "Audit the correction before releasing the design",
      "question": "Does correcting the transformer count close the whole design?",
      "description": "The final lesson asks for a justified release decision, not the largest possible green score. Bring capacity, connectivity, protection, thermal behaviour, controls and evidence together. Then audit a proposed correction from the manuscript’s separate campus example: a remedy is another engineering assertion and must be recalculated.",
      "tags": [
        "Assemble a cross-system acceptance matrix.",
        "Reject a proposed remedy that still fails its capacity or current screen.",
        "Preserve source namespaces and unresolved evidence in the final decision."
      ],
      "modelFamily": "infrastructure-screen-1",
      "overviewPath": "/learn/infrastructure/integrated-design-release/",
      "runtimePath": "/?lesson=integrated-design-release",
      "sharedOverview": false,
      "evidenceLinks": [
        "/learn/infrastructure/integrated-design-release/",
        "/learn/infrastructure/integrated-design-release/results.json",
        "docs/validation/infrastructure-serialization.md"
      ],
      "sourceFiles": [
        {
          "path": "apps/web/src/infrastructure/content/24-integrated-design-release.json",
          "sha256": "cabf152c18d129c8e70c90cb1d72d749fdeaa526310917e41a582f20c6736461"
        },
        {
          "path": "apps/web/src/infrastructure/screens.ts",
          "sha256": "740a4a79d3229a99a7af3d132f9b55bcbbbfc0716d9e121eae32e20af27b757c"
        },
        {
          "path": "scripts/verify_infrastructure.py",
          "sha256": "98cd76aee324228aa185348fd0fbda1df479f7323e032212d360199d09394df6"
        }
      ],
      "contentSha256": "77de4e3a24363452e46bb5be86fd6e57daf83539dbf245dea8593276183af9c3"
    }
  ]
}
