{
  "sourceBase": "703d78a38c04eba8914928c35a7b8b9b8bde94a0",
  "sourceSha256": {
    "packages/schema/patrol.ts": "9e32698ca1602e8074cf04314a6d1e0d82486fadced54cc4614b8c16380a52f1",
    "packages/schema/index.ts": "75c3498e87cd60fbf980c01a67115b5a4fc5b0e30302ce9c993b02ac0cf7e316",
    "packages/compiler/index.ts": "b8b8ddfed769a58fbc835aae55e0420382e2e9332f9bbfcedfee1b0328b89380",
    "packages/simulation/index.ts": "f68a0526adb6b515ea6a9cb688fc22e04b77d927740d857676094a99bbc3370a",
    "packages/simulation/checkpoint.ts": "508c2d9812fa095635bdcc195f3a94c8ee819cd889a753420f8cd414eb888db4",
    "packages/net/protocol.ts": "afe676befafee1a633702579cbebcc55c11a30fc489fe9d6c4523fd578085f85",
    "packages/net/client.ts": "f249b570ff8cd20d0c139bb5a5ddc0d1c12f829b89009fb820186227ca52a736",
    "packages/net/packets.ts": "58503870f0b3794c7cffd6d447842f6477e95f54acb1c697c3c5011db4a513e2",
    "services/relay/server.ts": "5aeb8c7486cfe3c91bb140ff5c779aa79cb438a17d981b79fe3aa13d26f3db4c",
    "packages/presentation/index.ts": "f57cf2e9bb4cfe119e143263dfbef3a8c6feb49eb0fdea795a385bc1882e0a96",
    "packages/render-webgpu/index.ts": "a1ba6bda3f91d5099c4d58fb10c62e79ff21f3d60880d3af8ea2b909978638bd",
    "apps/player/main.ts": "a2841fc360bac95f0bc1c117e29330a7bb797bd66f43358146d6d11538e8d300",
    "apps/player/simulation.worker.ts": "96b40b46930152fda10b9337ca5b1971526a0701439e047f8852c5fcf1315689",
    "games/darkwind/garden-ferry.ts": "cdae74eba417d558f38aca7dcac23ebd9c4916ef211c6475fbb89ed569dd0710",
    "games/engine-zoo/patrol.ts": "ab7ee523a01c111f027da1c1146ab3340fd0cb78c34830d24c223242c89072c7",
    "tests/patrol.test.ts": "7c2ea85425a7c43260c922cb8df991610b6b4c98b1c0670ef95ca11ce4944117",
    "tests/browser/ferry.spec.ts": "fa075b9263d61247ac873284095869cf6398cfc4182947d51ded3eb5687c565f"
  },
  "headless": {
    "fullSuitePassed": 363,
    "fullSuiteFailed": 0,
    "finalFocusedPassed": 5,
    "finalFocusedFailed": 0,
    "followup": "Final focused relay test additionally waits for the disconnected owner lease and authored waypoint pause, then verifies canonical late-join NPC movement."
  },
  "checks": {
    "typescript": "passed",
    "importBoundaries": 78,
    "serverBuild": "passed in /tmp/dw-patrol-server-build",
    "composeConfig": "passed"
  },
  "browser": {
    "startTime": "2026-10-25T05:03:43.678Z",
    "duration": 108992.354,
    "expected": 4,
    "skipped": 0,
    "unexpected": 0,
    "flaky": 0
  },
  "browserSourceNote": "After this browser build, the read-only actor diagnostics getter was changed to copy returned position arrays. Final type/import checks cover that ownership change; renderer behavior is unchanged.",
  "observed": {
    "garden-keeper-rejoined.json": {
      "position": [
        -9.892773232422769e-05,
        0.7848891019821167,
        -0.6133849620819092
      ],
      "paused": true,
      "time": 21.356581645017883,
      "npcTime": 105.35658164501788,
      "npcs": {
        "garden-keeper": {
          "phase": 22.02997179100001,
          "until": 100.58062419800001,
          "owner": ""
        }
      },
      "props": {
        "garden-lantern-crate": 4
      },
      "flags": [
        "garden-lantern-lit",
        "met-gardener"
      ],
      "velocity": [
        0,
        0,
        0
      ],
      "room": {
        "self": "d62ce9e6-96a2-4fa2-a5d3-c6f612954341",
        "host": "d62ce9e6-96a2-4fa2-a5d3-c6f612954341",
        "epoch": "17"
      },
      "rendered": {
        "authored:fedf0000-0000-4000-8000-eeeeeeeeeeee": {
          "position": [
            0,
            0.785,
            1.7495569180079482
          ],
          "yaw": -3.141592653589793,
          "walking": true,
          "airborne": false,
          "stalled": false
        }
      },
      "actors": {
        "rigged": 0,
        "walking": 0,
        "airborne": 0
      }
    }
  },
  "visualReview": "Inspected garden-keeper-speaking.png: actual rig visible in world with content-provided speaker label and conversation UI. Existing temporary character art retained as requested.",
  "corrections": [
    "Normalize a zero patrol yaw to positive zero for stable exact assertions.",
    "The real lease-expiry assertion includes the authored waypoint wait before expecting walking; expiration does not cancel that wait."
  ],
  "limits": [
    "Scripted horizontal authored paths with nonblocking actors; no navmesh, avoidance or dynamic actor collision.",
    "Elected browser game rules and client poses remain trusted.",
    "Server clock must remain accurate across restarts.",
    "Fresh version-3 preview storage; previous releases retained without automatic migration.",
    "Final character redesign remains open.",
    "No Coolify deployment or physical-device performance claim."
  ]
}
