{
  "schemaVersion": 1,
  "kind": "actual-current-build-results",
  "packageVersion": "1.1",
  "testCaseCount": 77,
  "allowedStatuses": [
    "PASS",
    "FAIL",
    "BLOCKED",
    "NOT_RUN"
  ],
  "cases": [
    {
      "id": "A01",
      "title": "Baca instruksi repo dan status worktree",
      "expected": "Instruksi existing dipertahankan; perubahan pengguna tidak dihapus",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 11
      },
      "status": "PASS",
      "observed": "PASS: Applicable AGENTS preserved; clean start and read instructions recorded in private discovery",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:42:55.339Z",
      "testRefs": [
        "Applicable AGENTS preserved; clean start and read instructions recorded in private discovery"
      ],
      "commands": [
        "node tools/ops-checks.mjs .local/p1-01-before"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "A02",
      "title": "Inventaris toolchain dan deployment",
      "expected": "Runtime, lockfile, module path, serta command aktual tercatat, bukan asumsi",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 12
      },
      "status": "PASS",
      "observed": "PASS: Actual Node/npm/lockfile/module/build/deploy inventory",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:42:55.339Z",
      "testRefs": [
        "Actual Node/npm/lockfile/module/build/deploy inventory"
      ],
      "commands": [
        "node tools/ops-checks.mjs .local/p1-01-before"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "A03",
      "title": "Bandingkan perubahan terhadap allowlist",
      "expected": "Hanya modul preview dan konfigurasi preview yang disetujui berubah",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 13
      },
      "status": "PASS",
      "observed": "PASS: Change allowlist: isolated module and protected production baseline",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:42:55.339Z",
      "testRefs": [
        "Change allowlist: isolated module and protected production baseline"
      ],
      "commands": [
        "node tools/ops-checks.mjs .local/p1-01-before"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "A04",
      "title": "Baseline route privat",
      "expected": "Respons autentikasi produksi sebelum/sesudah deploy tetap sesuai baseline",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 14
      },
      "status": "PASS",
      "observed": "PASS: Production anonymous routes: actual external baseline before/after publication",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:42:55.339Z",
      "testRefs": [
        "Production anonymous routes: actual external baseline before/after publication"
      ],
      "commands": [
        "node tools/ops-checks.mjs .local/p1-01-before"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "G01",
      "title": "Muat seed awal",
      "expected": "Tepat satu room 8x8, 64 tile unik, satu avatar, tiga entity furnitur awal",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 20
      },
      "status": "PASS",
      "observed": "PASS: [G01 G06 G08 S08] M1: derived JSON fixture equals runtime fixture; 64 cells, cross and access valid · PASS: [G01 N05 N09 N11 C01 C02 C03 C07 C08 C10 S01 R03 R06 R08] M1-M4: ordinary UI real-time two tasks, sofa, relax and reload",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "tests/domain.test.ts: [G01 G06 G08 S08] M1: derived JSON fixture equals runtime fixture; 64 cells, cross and access valid",
        "[G01 N05 N09 N11 C01 C02 C03 C07 C08 C10 S01 R03 R06 R08] M1-M4: ordinary UI real-time two tasks, sofa, relax and reload"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "G02",
      "title": "Top view versus isometrik",
      "expected": "Menggunakan world state yang sama; perpindahan objek muncul konsisten",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 21
      },
      "status": "PASS",
      "observed": "PASS: [G02 G07 N12 E10 E11 R01 R02 P08] shared view state, walls, ghost cancel, keyboard and inventory lifecycle",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "[G02 G07 N12 E10 E11 R01 R02 P08] shared view state, walls, ghost cancel, keyboard and inventory lifecycle"
      ],
      "commands": [
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "G03",
      "title": "Round-trip proyeksi/invers",
      "expected": "Tile center kembali ke world point semula pada zoom/pan berbeda",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 22
      },
      "status": "PASS",
      "observed": "PASS: [G03] GEO-01: known projection, inverse, negative coordinates and height · PASS: [G03 G05] actual renderer camera round-trip and wall coordinates with pan/zoom",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:20.939Z",
      "testRefs": [
        "tests/domain.test.ts: [G03] GEO-01: known projection, inverse, negative coordinates and height",
        "tests/domain.test.ts: [G03 G05] actual renderer camera round-trip and wall coordinates with pan/zoom"
      ],
      "commands": [
        "npm run test:unit"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "G04",
      "title": "Rotasi aset 0/90/180/270/360",
      "expected": "Mask, ukuran, approach, exit, anchor, dan facing konsisten; 360 kembali identik",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 23
      },
      "status": "PASS",
      "observed": "PASS: [G04 E05 N04 N11 R06 R08] P1-01: N expansion keeps both sofa seats and four rotations usable through the doorway · PASS: [G04 E05 N04 N11 R06 R08] P1-01: E expansion keeps both sofa seats and four rotations usable through the doorway · PASS: [G04 E05 N04 N11 R06 R08] P1-01: W expansion keeps both sofa seats and four rotations usable through the doorway · PASS: [G04] GEO-03: four cell/continuous rotations preserve anchors outside footprint · PASS: [E08 G04] NAV/EDIT: blocked exit rejects editor; four sofa rotations expose reachable slots · PASS: [G04 G08] official asset contract: masks, both seats, continuous anchors and facings at all rotations · PASS: [E02 E08 G04 N11] M3: place-sofa intent survives leaving bed; cancel retains inventory; four orientations · PASS: [G04 E01 N05 N06] rotated workstation/bed use anchors and actual pose screenshots · PASS: Viewed all four workstation, bed and sofa orientations; composite furniture, body orientation and support follow rotation. Geometry and both-seat navigation are checked separately by executed tests.",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:39:47.659445+00:00",
      "testRefs": [
        "tests/domain.test.ts: [G04 E05 N04 N11 R06 R08] P1-01: N expansion keeps both sofa seats and four rotations usable through the doorway",
        "tests/domain.test.ts: [G04 E05 N04 N11 R06 R08] P1-01: E expansion keeps both sofa seats and four rotations usable through the doorway",
        "tests/domain.test.ts: [G04 E05 N04 N11 R06 R08] P1-01: W expansion keeps both sofa seats and four rotations usable through the doorway",
        "tests/domain.test.ts: [G04] GEO-03: four cell/continuous rotations preserve anchors outside footprint",
        "tests/domain.test.ts: [E08 G04] NAV/EDIT: blocked exit rejects editor; four sofa rotations expose reachable slots",
        "tests/domain.test.ts: [G04 G08] official asset contract: masks, both seats, continuous anchors and facings at all rotations",
        "[E02 E08 G04 N11] M3: place-sofa intent survives leaving bed; cancel retains inventory; four orientations",
        "[G04 E01 N05 N06] rotated workstation/bed use anchors and actual pose screenshots",
        "Visual inspection of actual captures"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e",
        "view_image of current-build browser screenshots"
      ],
      "evidence": [
        "manifest.json",
        "screenshots/workstation-orientation-180.png"
      ],
      "blocker": null
    },
    {
      "id": "G05",
      "title": "Wall coordinate N/E/S/W",
      "expected": "Posisi u/v diproyeksikan pada bidang benar dan tetap saat zoom",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 24
      },
      "status": "PASS",
      "observed": "PASS: [E06 E07 G05 G06] EDIT-01: wall coordinates, doorway reserve, world orientations and approach · PASS: [G03 G05] actual renderer camera round-trip and wall coordinates with pan/zoom",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:20.939Z",
      "testRefs": [
        "tests/domain.test.ts: [E06 E07 G05 G06] EDIT-01: wall coordinates, doorway reserve, world orientations and approach",
        "tests/domain.test.ts: [G03 G05] actual renderer camera round-trip and wall coordinates with pan/zoom"
      ],
      "commands": [
        "npm run test:unit"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "G06",
      "title": "Wall occupancy",
      "expected": "Whiteboard 2x2 mengisi empat slot; tidak mengambil slot lantai",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 25
      },
      "status": "PASS",
      "observed": "PASS: [G01 G06 G08 S08] M1: derived JSON fixture equals runtime fixture; 64 cells, cross and access valid · PASS: [E06 E07 G05 G06] EDIT-01: wall coordinates, doorway reserve, world orientations and approach",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:20.939Z",
      "testRefs": [
        "tests/domain.test.ts: [G01 G06 G08 S08] M1: derived JSON fixture equals runtime fixture; 64 cells, cross and access valid",
        "tests/domain.test.ts: [E06 E07 G05 G06] EDIT-01: wall coordinates, doorway reserve, world orientations and approach"
      ],
      "commands": [
        "npm run test:unit"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "G07",
      "title": "Collision versus gambar",
      "expected": "Transparansi/bayangan tidak menambah footprint; label tidak menjadi obstacle",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 26
      },
      "status": "PASS",
      "observed": "PASS: [N01 N02 N03 G07] NAV-01: paths respect objects, floor, cardinal edges and unreachable targets · PASS: [G02 G07 N12 E10 E11 R01 R02 P08] shared view state, walls, ghost cancel, keyboard and inventory lifecycle",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "tests/domain.test.ts: [N01 N02 N03 G07] NAV-01: paths respect objects, floor, cardinal edges and unreachable targets",
        "[G02 G07 N12 E10 E11 R01 R02 P08] shared view state, walls, ghost cancel, keyboard and inventory lifecycle"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "G08",
      "title": "Reserved transit",
      "expected": "Cross dua tile kosong dari furnitur; approach awal dapat dicapai",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 27
      },
      "status": "PASS",
      "observed": "PASS: [G01 G06 G08 S08] M1: derived JSON fixture equals runtime fixture; 64 cells, cross and access valid · PASS: [G04 G08] official asset contract: masks, both seats, continuous anchors and facings at all rotations",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:20.939Z",
      "testRefs": [
        "tests/domain.test.ts: [G01 G06 G08 S08] M1: derived JSON fixture equals runtime fixture; 64 cells, cross and access valid",
        "tests/domain.test.ts: [G04 G08] official asset contract: masks, both seats, continuous anchors and facings at all rotations"
      ],
      "commands": [
        "npm run test:unit"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "N01",
      "title": "Klik tile kosong",
      "expected": "Avatar mengikuti path empat arah, titik kaki berhenti di tile center",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 33
      },
      "status": "PASS",
      "observed": "PASS: [N01 N02 N03 G07] NAV-01: paths respect objects, floor, cardinal edges and unreachable targets · PASS: [N01 N02 N03 N08] redirected walking keeps cardinal collision-free steps and clears reservation · PASS: [N01 N03 N06 N07 E08] M2: bed and board interactions, collision rejection, keyboard walk and editor exit",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "tests/domain.test.ts: [N01 N02 N03 G07] NAV-01: paths respect objects, floor, cardinal edges and unreachable targets",
        "tests/domain.test.ts: [N01 N02 N03 N08] redirected walking keeps cardinal collision-free steps and clears reservation",
        "[N01 N03 N06 N07 E08] M2: bed and board interactions, collision rejection, keyboard walk and editor exit"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "N02",
      "title": "Klik di belakang workstation",
      "expected": "Avatar memutari footprint, tidak melintasi meja/kursi",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 34
      },
      "status": "PASS",
      "observed": "PASS: [N01 N02 N03 G07] NAV-01: paths respect objects, floor, cardinal edges and unreachable targets · PASS: [N01 N02 N03 N08] redirected walking keeps cardinal collision-free steps and clears reservation",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:20.939Z",
      "testRefs": [
        "tests/domain.test.ts: [N01 N02 N03 G07] NAV-01: paths respect objects, floor, cardinal edges and unreachable targets",
        "tests/domain.test.ts: [N01 N02 N03 N08] redirected walking keeps cardinal collision-free steps and clears reservation"
      ],
      "commands": [
        "npm run test:unit"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "N03",
      "title": "Target terhalang/di luar ruangan",
      "expected": "Pesan tujuan invalid; tidak teleport atau loop pencarian tanpa akhir",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 35
      },
      "status": "PASS",
      "observed": "PASS: [N01 N02 N03 G07] NAV-01: paths respect objects, floor, cardinal edges and unreachable targets · PASS: [N01 N02 N03 N08] redirected walking keeps cardinal collision-free steps and clears reservation · PASS: [N01 N03 N06 N07 E08] M2: bed and board interactions, collision rejection, keyboard walk and editor exit",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "tests/domain.test.ts: [N01 N02 N03 G07] NAV-01: paths respect objects, floor, cardinal edges and unreachable targets",
        "tests/domain.test.ts: [N01 N02 N03 N08] redirected walking keeps cardinal collision-free steps and clears reservation",
        "[N01 N03 N06 N07 E08] M2: bed and board interactions, collision rejection, keyboard walk and editor exit"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "N04",
      "title": "Sisi dinding tertutup",
      "expected": "Dua tile yang bersisian lintas room tidak terhubung di luar doorway",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 36
      },
      "status": "PASS",
      "observed": "PASS: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: N shared-wall approaches rejected from both rooms without moving avatar · PASS: [G04 E05 N04 N11 R06 R08] P1-01: N expansion keeps both sofa seats and four rotations usable through the doorway · PASS: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: E shared-wall approaches rejected from both rooms without moving avatar · PASS: [G04 E05 N04 N11 R06 R08] P1-01: E expansion keeps both sofa seats and four rotations usable through the doorway · PASS: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: W shared-wall approaches rejected from both rooms without moving avatar · PASS: [G04 E05 N04 N11 R06 R08] P1-01: W expansion keeps both sofa seats and four rotations usable through the doorway · PASS: [N04] NAV-01: adjacent room tiles remain separated without a connection · PASS: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: N gives 128 cells, two open edges, stable economy, one expansion · PASS: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: E gives 128 cells, two open edges, stable economy, one expansion · PASS: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: W gives 128 cells, two open edges, stable economy, one expansion · PASS: [N04 R06] all connected-room journeys cross only the doorway with bounded continuous motion · PASS: [E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI N: reject shared-wall sofa, then enter and exit valid sofa through doorway · PASS: [E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI E: reject shared-wall sofa, then enter and exit valid sofa through doorway · PASS: [E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI W: reject shared-wall sofa, then enter and exit valid sofa through doorway",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "tests/domain.test.ts: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: N shared-wall approaches rejected from both rooms without moving avatar",
        "tests/domain.test.ts: [G04 E05 N04 N11 R06 R08] P1-01: N expansion keeps both sofa seats and four rotations usable through the doorway",
        "tests/domain.test.ts: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: E shared-wall approaches rejected from both rooms without moving avatar",
        "tests/domain.test.ts: [G04 E05 N04 N11 R06 R08] P1-01: E expansion keeps both sofa seats and four rotations usable through the doorway",
        "tests/domain.test.ts: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: W shared-wall approaches rejected from both rooms without moving avatar",
        "tests/domain.test.ts: [G04 E05 N04 N11 R06 R08] P1-01: W expansion keeps both sofa seats and four rotations usable through the doorway",
        "tests/domain.test.ts: [N04] NAV-01: adjacent room tiles remain separated without a connection",
        "tests/domain.test.ts: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: N gives 128 cells, two open edges, stable economy, one expansion",
        "tests/domain.test.ts: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: E gives 128 cells, two open edges, stable economy, one expansion",
        "tests/domain.test.ts: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: W gives 128 cells, two open edges, stable economy, one expansion",
        "tests/domain.test.ts: [N04 R06] all connected-room journeys cross only the doorway with bounded continuous motion",
        "[E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI N: reject shared-wall sofa, then enter and exit valid sofa through doorway",
        "[E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI E: reject shared-wall sofa, then enter and exit valid sofa through doorway",
        "[E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI W: reject shared-wall sofa, then enter and exit valid sofa through doorway"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "N05",
      "title": "Gunakan workstation",
      "expected": "Approach -> turn -> sit/work; badan dan meja berlapis benar",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 37
      },
      "status": "PASS",
      "observed": "PASS: [N05 N06 N07 N11 S03] use heights, safe exits, board facing and complete sofa cooldown · PASS: [G01 N05 N09 N11 C01 C02 C03 C07 C08 C10 S01 R03 R06 R08] M1-M4: ordinary UI real-time two tasks, sofa, relax and reload · PASS: [N05 N06 N10] visible sitting/sleep body and front/back depth evidence · PASS: [G04 E01 N05 N06] rotated workstation/bed use anchors and actual pose screenshots · PASS: Avatar sits on workstation chair; desk and monitor occlude lower body according to orientation.",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:39:47.659445+00:00",
      "testRefs": [
        "tests/domain.test.ts: [N05 N06 N07 N11 S03] use heights, safe exits, board facing and complete sofa cooldown",
        "[G01 N05 N09 N11 C01 C02 C03 C07 C08 C10 S01 R03 R06 R08] M1-M4: ordinary UI real-time two tasks, sofa, relax and reload",
        "[N05 N06 N10] visible sitting/sleep body and front/back depth evidence",
        "[G04 E01 N05 N06] rotated workstation/bed use anchors and actual pose screenshots",
        "Visual inspection of actual captures"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e",
        "view_image of current-build browser screenshots"
      ],
      "evidence": [
        "manifest.json",
        "screenshots/workstation-orientation-0.png"
      ],
      "blocker": null
    },
    {
      "id": "N06",
      "title": "Gunakan bed",
      "expected": "Approach -> berbaring -> keluar; kaki kembali ke exit yang valid",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 38
      },
      "status": "PASS",
      "observed": "PASS: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: N shared-wall approaches rejected from both rooms without moving avatar · PASS: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: E shared-wall approaches rejected from both rooms without moving avatar · PASS: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: W shared-wall approaches rejected from both rooms without moving avatar · PASS: [N06 E08 S09] ANIM/NAV: approach -> enter -> bed -> exit, paused motion and reservation cleanup · PASS: [N05 N06 N07 N11 S03] use heights, safe exits, board facing and complete sofa cooldown · PASS: [N01 N03 N06 N07 E08] M2: bed and board interactions, collision rejection, keyboard walk and editor exit · PASS: [N05 N06 N10] visible sitting/sleep body and front/back depth evidence · PASS: [G04 E01 N05 N06] rotated workstation/bed use anchors and actual pose screenshots · PASS: Lying head, torso and legs are visible on mattress along its long axis in all four rotations.",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:39:47.659445+00:00",
      "testRefs": [
        "tests/domain.test.ts: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: N shared-wall approaches rejected from both rooms without moving avatar",
        "tests/domain.test.ts: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: E shared-wall approaches rejected from both rooms without moving avatar",
        "tests/domain.test.ts: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: W shared-wall approaches rejected from both rooms without moving avatar",
        "tests/domain.test.ts: [N06 E08 S09] ANIM/NAV: approach -> enter -> bed -> exit, paused motion and reservation cleanup",
        "tests/domain.test.ts: [N05 N06 N07 N11 S03] use heights, safe exits, board facing and complete sofa cooldown",
        "[N01 N03 N06 N07 E08] M2: bed and board interactions, collision rejection, keyboard walk and editor exit",
        "[N05 N06 N10] visible sitting/sleep body and front/back depth evidence",
        "[G04 E01 N05 N06] rotated workstation/bed use anchors and actual pose screenshots",
        "Visual inspection of actual captures"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e",
        "view_image of current-build browser screenshots"
      ],
      "evidence": [
        "manifest.json",
        "screenshots/bed-orientation-90.png"
      ],
      "blocker": null
    },
    {
      "id": "N07",
      "title": "Gunakan board",
      "expected": "Avatar tiba pada approach dan menghadap dinding yang benar",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 39
      },
      "status": "PASS",
      "observed": "PASS: [N05 N06 N07 N11 S03] use heights, safe exits, board facing and complete sofa cooldown · PASS: [N01 N03 N06 N07 E08] M2: bed and board interactions, collision rejection, keyboard walk and editor exit",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "tests/domain.test.ts: [N05 N06 N07 N11 S03] use heights, safe exits, board facing and complete sofa cooldown",
        "[N01 N03 N06 N07 E08] M2: bed and board interactions, collision rejection, keyboard walk and editor exit"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "N08",
      "title": "Perintah baru saat berjalan",
      "expected": "Tujuan/reservasi lama dibatalkan, path baru valid",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 40
      },
      "status": "PASS",
      "observed": "PASS: [N01 N02 N03 N08] redirected walking keeps cardinal collision-free steps and clears reservation",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:20.939Z",
      "testRefs": [
        "tests/domain.test.ts: [N01 N02 N03 N08] redirected walking keeps cardinal collision-free steps and clears reservation"
      ],
      "commands": [
        "npm run test:unit"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "N09",
      "title": "Perintah kerja saat bersantai",
      "expected": "Job langsung RUNNING, avatar keluar sofa dan berjalan ke workstation",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 41
      },
      "status": "PASS",
      "observed": "PASS: [N09] ANIM: new task visually exits sofa before walking, idle activity cooldown · PASS: [G01 N05 N09 N11 C01 C02 C03 C07 C08 C10 S01 R03 R06 R08] M1-M4: ordinary UI real-time two tasks, sofa, relax and reload",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "tests/domain.test.ts: [N09] ANIM: new task visually exits sofa before walking, idle activity cooldown",
        "[G01 N05 N09 N11 C01 C02 C03 C07 C08 C10 S01 R03 R06 R08] M1-M4: ordinary UI real-time two tasks, sofa, relax and reload"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "N10",
      "title": "Depth saat di depan/belakang objek",
      "expected": "Tidak ada furniture selalu menggambar di depan avatar pada semua posisi",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 42
      },
      "status": "PASS",
      "observed": "PASS: [N05 N06 N10] visible sitting/sleep body and front/back depth evidence · PASS: Behind view partially occludes avatar with monitor; front view draws avatar in front. Bed support remains below lying body.",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:39:47.659445+00:00",
      "testRefs": [
        "[N05 N06 N10] visible sitting/sleep body and front/back depth evidence",
        "Visual inspection of actual captures"
      ],
      "commands": [
        "npm run test:e2e",
        "view_image of current-build browser screenshots"
      ],
      "evidence": [
        "manifest.json",
        "screenshots/depth-front.png"
      ],
      "blocker": null
    },
    {
      "id": "N11",
      "title": "Sofa otomatis saat idle",
      "expected": "Setelah syarat demo terpenuhi avatar duduk, selesai, lalu cooldown berlaku",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 43
      },
      "status": "PASS",
      "observed": "PASS: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: N shared-wall approaches rejected from both rooms without moving avatar · PASS: [G04 E05 N04 N11 R06 R08] P1-01: N expansion keeps both sofa seats and four rotations usable through the doorway · PASS: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: E shared-wall approaches rejected from both rooms without moving avatar · PASS: [G04 E05 N04 N11 R06 R08] P1-01: E expansion keeps both sofa seats and four rotations usable through the doorway · PASS: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: W shared-wall approaches rejected from both rooms without moving avatar · PASS: [G04 E05 N04 N11 R06 R08] P1-01: W expansion keeps both sofa seats and four rotations usable through the doorway · PASS: [N05 N06 N07 N11 S03] use heights, safe exits, board facing and complete sofa cooldown · PASS: [E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI N: reject shared-wall sofa, then enter and exit valid sofa through doorway · PASS: [E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI E: reject shared-wall sofa, then enter and exit valid sofa through doorway · PASS: [E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI W: reject shared-wall sofa, then enter and exit valid sofa through doorway · PASS: [G01 N05 N09 N11 C01 C02 C03 C07 C08 C10 S01 R03 R06 R08] M1-M4: ordinary UI real-time two tasks, sofa, relax and reload · PASS: [E02 E08 G04 N11] M3: place-sofa intent survives leaving bed; cancel retains inventory; four orientations · PASS: Seated torso and bent legs visible where orientation permits; sofa back appropriately occludes the body in opposite views. Timing and exits tested separately.",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:39:47.659445+00:00",
      "testRefs": [
        "tests/domain.test.ts: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: N shared-wall approaches rejected from both rooms without moving avatar",
        "tests/domain.test.ts: [G04 E05 N04 N11 R06 R08] P1-01: N expansion keeps both sofa seats and four rotations usable through the doorway",
        "tests/domain.test.ts: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: E shared-wall approaches rejected from both rooms without moving avatar",
        "tests/domain.test.ts: [G04 E05 N04 N11 R06 R08] P1-01: E expansion keeps both sofa seats and four rotations usable through the doorway",
        "tests/domain.test.ts: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: W shared-wall approaches rejected from both rooms without moving avatar",
        "tests/domain.test.ts: [G04 E05 N04 N11 R06 R08] P1-01: W expansion keeps both sofa seats and four rotations usable through the doorway",
        "tests/domain.test.ts: [N05 N06 N07 N11 S03] use heights, safe exits, board facing and complete sofa cooldown",
        "[E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI N: reject shared-wall sofa, then enter and exit valid sofa through doorway",
        "[E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI E: reject shared-wall sofa, then enter and exit valid sofa through doorway",
        "[E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI W: reject shared-wall sofa, then enter and exit valid sofa through doorway",
        "[G01 N05 N09 N11 C01 C02 C03 C07 C08 C10 S01 R03 R06 R08] M1-M4: ordinary UI real-time two tasks, sofa, relax and reload",
        "[E02 E08 G04 N11] M3: place-sofa intent survives leaving bed; cancel retains inventory; four orientations",
        "Visual inspection of actual captures"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e",
        "view_image of current-build browser screenshots"
      ],
      "evidence": [
        "manifest.json",
        "screenshots/sofa-orientation-90.png"
      ],
      "blocker": null
    },
    {
      "id": "N12",
      "title": "Toggle dinding",
      "expected": "Visual dinding tersembunyi tetapi collision tetap ada",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 44
      },
      "status": "PASS",
      "observed": "PASS: [G02 G07 N12 E10 E11 R01 R02 P08] shared view state, walls, ghost cancel, keyboard and inventory lifecycle · PASS: [N12] hidden front walls remain closed to navigation",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "[G02 G07 N12 E10 E11 R01 R02 P08] shared view state, walls, ghost cancel, keyboard and inventory lifecycle",
        "[N12] hidden front walls remain closed to navigation"
      ],
      "commands": [
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "E01",
      "title": "Pindah workstation",
      "expected": "Desk, chair, dan computer berpindah sebagai composite; anchor ikut",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 50
      },
      "status": "PASS",
      "observed": "PASS: [E01 E02 E03 E06 E07 E09 P08] M3: invalid placement, rotation/cancel, wall reserve, undo/redo and expansion checkpoint · PASS: [G04 E01 N05 N06] rotated workstation/bed use anchors and actual pose screenshots",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "[E01 E02 E03 E06 E07 E09 P08] M3: invalid placement, rotation/cancel, wall reserve, undo/redo and expansion checkpoint",
        "[G04 E01 N05 N06] rotated workstation/bed use anchors and actual pose screenshots"
      ],
      "commands": [
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "E02",
      "title": "Batal draft",
      "expected": "Layout, saldo, dan inventaris tidak berubah",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 51
      },
      "status": "PASS",
      "observed": "PASS: [E02 E03 E04] EDIT-01: invalid drafts do not mutate saved objects; transit and bounds protected · PASS: [E01 E02 E03 E06 E07 E09 P08] M3: invalid placement, rotation/cancel, wall reserve, undo/redo and expansion checkpoint · PASS: [E02 E08 G04 N11] M3: place-sofa intent survives leaving bed; cancel retains inventory; four orientations",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "tests/domain.test.ts: [E02 E03 E04] EDIT-01: invalid drafts do not mutate saved objects; transit and bounds protected",
        "[E01 E02 E03 E06 E07 E09 P08] M3: invalid placement, rotation/cancel, wall reserve, undo/redo and expansion checkpoint",
        "[E02 E08 G04 N11] M3: place-sofa intent survives leaving bed; cancel retains inventory; four orientations"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "E03",
      "title": "Letakkan objek di reserved transit/pintu",
      "expected": "Commit ditolak dengan teks sebab yang spesifik",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 52
      },
      "status": "PASS",
      "observed": "PASS: [E02 E03 E04] EDIT-01: invalid drafts do not mutate saved objects; transit and bounds protected · PASS: [P09 S01 S05 E03 E05] Idle checkpoints avoid duplicate writes; changed tasks and drafts still persist and revalidate · PASS: [E01 E02 E03 E06 E07 E09 P08] M3: invalid placement, rotation/cancel, wall reserve, undo/redo and expansion checkpoint",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "tests/domain.test.ts: [E02 E03 E04] EDIT-01: invalid drafts do not mutate saved objects; transit and bounds protected",
        "[P09 S01 S05 E03 E05] Idle checkpoints avoid duplicate writes; changed tasks and drafts still persist and revalidate",
        "[E01 E02 E03 E06 E07 E09 P08] M3: invalid placement, rotation/cancel, wall reserve, undo/redo and expansion checkpoint"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "E04",
      "title": "Letakkan objek di luar room/overlap",
      "expected": "Commit ditolak; tidak ada bagian objek hilang keluar batas",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 53
      },
      "status": "PASS",
      "observed": "PASS: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: N shared-wall approaches rejected from both rooms without moving avatar · PASS: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: E shared-wall approaches rejected from both rooms without moving avatar · PASS: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: W shared-wall approaches rejected from both rooms without moving avatar · PASS: [E02 E03 E04] EDIT-01: invalid drafts do not mutate saved objects; transit and bounds protected · PASS: [E04 E05] EDIT-01: overlap, blocked approach and avatar trap rejected · PASS: [E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI N: reject shared-wall sofa, then enter and exit valid sofa through doorway · PASS: [E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI E: reject shared-wall sofa, then enter and exit valid sofa through doorway · PASS: [E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI W: reject shared-wall sofa, then enter and exit valid sofa through doorway",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "tests/domain.test.ts: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: N shared-wall approaches rejected from both rooms without moving avatar",
        "tests/domain.test.ts: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: E shared-wall approaches rejected from both rooms without moving avatar",
        "tests/domain.test.ts: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: W shared-wall approaches rejected from both rooms without moving avatar",
        "tests/domain.test.ts: [E02 E03 E04] EDIT-01: invalid drafts do not mutate saved objects; transit and bounds protected",
        "tests/domain.test.ts: [E04 E05] EDIT-01: overlap, blocked approach and avatar trap rejected",
        "[E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI N: reject shared-wall sofa, then enter and exit valid sofa through doorway",
        "[E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI E: reject shared-wall sofa, then enter and exit valid sofa through doorway",
        "[E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI W: reject shared-wall sofa, then enter and exit valid sofa through doorway"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "E05",
      "title": "Blokir approach furnitur wajib",
      "expected": "Commit ditolak walau footprint objek baru tidak overlap",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 54
      },
      "status": "PASS",
      "observed": "PASS: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: N shared-wall approaches rejected from both rooms without moving avatar · PASS: [G04 E05 N04 N11 R06 R08] P1-01: N expansion keeps both sofa seats and four rotations usable through the doorway · PASS: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: E shared-wall approaches rejected from both rooms without moving avatar · PASS: [G04 E05 N04 N11 R06 R08] P1-01: E expansion keeps both sofa seats and four rotations usable through the doorway · PASS: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: W shared-wall approaches rejected from both rooms without moving avatar · PASS: [G04 E05 N04 N11 R06 R08] P1-01: W expansion keeps both sofa seats and four rotations usable through the doorway · PASS: [E04 E05] EDIT-01: overlap, blocked approach and avatar trap rejected · PASS: [E05 C01 C02] blocking required approach has specific cause; success does not award before accept · PASS: [P09 S01 S05 E03 E05] Idle checkpoints avoid duplicate writes; changed tasks and drafts still persist and revalidate · PASS: [E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI N: reject shared-wall sofa, then enter and exit valid sofa through doorway · PASS: [E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI E: reject shared-wall sofa, then enter and exit valid sofa through doorway · PASS: [E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI W: reject shared-wall sofa, then enter and exit valid sofa through doorway",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "tests/domain.test.ts: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: N shared-wall approaches rejected from both rooms without moving avatar",
        "tests/domain.test.ts: [G04 E05 N04 N11 R06 R08] P1-01: N expansion keeps both sofa seats and four rotations usable through the doorway",
        "tests/domain.test.ts: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: E shared-wall approaches rejected from both rooms without moving avatar",
        "tests/domain.test.ts: [G04 E05 N04 N11 R06 R08] P1-01: E expansion keeps both sofa seats and four rotations usable through the doorway",
        "tests/domain.test.ts: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: W shared-wall approaches rejected from both rooms without moving avatar",
        "tests/domain.test.ts: [G04 E05 N04 N11 R06 R08] P1-01: W expansion keeps both sofa seats and four rotations usable through the doorway",
        "tests/domain.test.ts: [E04 E05] EDIT-01: overlap, blocked approach and avatar trap rejected",
        "tests/domain.test.ts: [E05 C01 C02] blocking required approach has specific cause; success does not award before accept",
        "[P09 S01 S05 E03 E05] Idle checkpoints avoid duplicate writes; changed tasks and drafts still persist and revalidate",
        "[E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI N: reject shared-wall sofa, then enter and exit valid sofa through doorway",
        "[E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI E: reject shared-wall sofa, then enter and exit valid sofa through doorway",
        "[E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI W: reject shared-wall sofa, then enter and exit valid sofa through doorway"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "E06",
      "title": "Pindah whiteboard",
      "expected": "Snap u/v bekerja; kandidat approach dihitung kembali",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 55
      },
      "status": "PASS",
      "observed": "PASS: [E06 E07 G05 G06] EDIT-01: wall coordinates, doorway reserve, world orientations and approach · PASS: [E01 E02 E03 E06 E07 E09 P08] M3: invalid placement, rotation/cancel, wall reserve, undo/redo and expansion checkpoint",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "tests/domain.test.ts: [E06 E07 G05 G06] EDIT-01: wall coordinates, doorway reserve, world orientations and approach",
        "[E01 E02 E03 E06 E07 E09 P08] M3: invalid placement, rotation/cancel, wall reserve, undo/redo and expansion checkpoint"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "E07",
      "title": "Whiteboard di door reserve/out of bounds",
      "expected": "Penempatan ditolak; tidak menghilangkan pintu",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 56
      },
      "status": "PASS",
      "observed": "PASS: [E06 E07 G05 G06] EDIT-01: wall coordinates, doorway reserve, world orientations and approach · PASS: [E01 E02 E03 E06 E07 E09 P08] M3: invalid placement, rotation/cancel, wall reserve, undo/redo and expansion checkpoint",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "tests/domain.test.ts: [E06 E07 G05 G06] EDIT-01: wall coordinates, doorway reserve, world orientations and approach",
        "[E01 E02 E03 E06 E07 E09 P08] M3: invalid placement, rotation/cancel, wall reserve, undo/redo and expansion checkpoint"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "E08",
      "title": "Masuk editor ketika avatar duduk",
      "expected": "Avatar keluar dahulu atau editor ditolak dengan alasan; objek tidak berpindah di bawah avatar",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 57
      },
      "status": "PASS",
      "observed": "PASS: [N06 E08 S09] ANIM/NAV: approach -> enter -> bed -> exit, paused motion and reservation cleanup · PASS: [E08 G04] NAV/EDIT: blocked exit rejects editor; four sofa rotations expose reachable slots · PASS: [N01 N03 N06 N07 E08] M2: bed and board interactions, collision rejection, keyboard walk and editor exit · PASS: [E02 E08 G04 N11] M3: place-sofa intent survives leaving bed; cancel retains inventory; four orientations",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "tests/domain.test.ts: [N06 E08 S09] ANIM/NAV: approach -> enter -> bed -> exit, paused motion and reservation cleanup",
        "tests/domain.test.ts: [E08 G04] NAV/EDIT: blocked exit rejects editor; four sofa rotations expose reachable slots",
        "[N01 N03 N06 N07 E08] M2: bed and board interactions, collision rejection, keyboard walk and editor exit",
        "[E02 E08 G04 N11] M3: place-sofa intent survives leaving bed; cancel retains inventory; four orientations"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "E09",
      "title": "Undo/redo layout",
      "expected": "Posisi dapat dipulihkan; saldo/ledger tidak ikut di-undo",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 58
      },
      "status": "PASS",
      "observed": "PASS: [E09 E10] EDIT-02: undo/redo affects layout only; cancelling/storing sofa preserves ownership · PASS: [E01 E02 E03 E06 E07 E09 P08] M3: invalid placement, rotation/cancel, wall reserve, undo/redo and expansion checkpoint",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "tests/domain.test.ts: [E09 E10] EDIT-02: undo/redo affects layout only; cancelling/storing sofa preserves ownership",
        "[E01 E02 E03 E06 E07 E09 P08] M3: invalid placement, rotation/cancel, wall reserve, undo/redo and expansion checkpoint"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "E10",
      "title": "Sofa kembali ke inventaris",
      "expected": "Jumlah owned tetap satu; dapat ditempatkan lagi tanpa membeli",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 59
      },
      "status": "PASS",
      "observed": "PASS: [E09 E10] EDIT-02: undo/redo affects layout only; cancelling/storing sofa preserves ownership · PASS: [G02 G07 N12 E10 E11 R01 R02 P08] shared view state, walls, ghost cancel, keyboard and inventory lifecycle",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "tests/domain.test.ts: [E09 E10] EDIT-02: undo/redo affects layout only; cancelling/storing sofa preserves ownership",
        "[G02 G07 N12 E10 E11 R01 R02 P08] shared view state, walls, ghost cancel, keyboard and inventory lifecycle"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "E11",
      "title": "Delete furnitur awal",
      "expected": "Aksi tidak diizinkan dan dijelaskan; starter essentials tetap ada",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 60
      },
      "status": "PASS",
      "observed": "PASS: [E11] EDIT-02: starter deletion, duplicate sofa and ownership are domain protected · PASS: [G02 G07 N12 E10 E11 R01 R02 P08] shared view state, walls, ghost cancel, keyboard and inventory lifecycle",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "tests/domain.test.ts: [E11] EDIT-02: starter deletion, duplicate sofa and ownership are domain protected",
        "[G02 G07 N12 E10 E11 R01 R02 P08] shared view state, walls, ghost cancel, keyboard and inventory lifecycle"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "C01",
      "title": "Mulai task",
      "expected": "Satu job RUNNING, waktu aktif 8 detik, semua token diberi label simulasi",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 66
      },
      "status": "PASS",
      "observed": "PASS: [P09 C01 C02 C07 S02] Idle TICK preserves state identity and still rejects invalid elapsed time · PASS: [E05 C01 C02] blocking required approach has specific cause; success does not award before accept · PASS: [G01 N05 N09 N11 C01 C02 C03 C07 C08 C10 S01 R03 R06 R08] M1-M4: ordinary UI real-time two tasks, sofa, relax and reload",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "tests/domain.test.ts: [P09 C01 C02 C07 S02] Idle TICK preserves state identity and still rejects invalid elapsed time",
        "tests/domain.test.ts: [E05 C01 C02] blocking required approach has specific cause; success does not award before accept",
        "[G01 N05 N09 N11 C01 C02 C03 C07 C08 C10 S01 R03 R06 R08] M1-M4: ordinary UI real-time two tasks, sofa, relax and reload"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "C02",
      "title": "Job selesai belum diterima",
      "expected": "State SUCCEEDED, saldo masih belum bertambah",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 67
      },
      "status": "PASS",
      "observed": "PASS: [P09 C01 C02 C07 S02] Idle TICK preserves state identity and still rejects invalid elapsed time · PASS: [E05 C01 C02] blocking required approach has specific cause; success does not award before accept · PASS: [G01 N05 N09 N11 C01 C02 C03 C07 C08 C10 S01 R03 R06 R08] M1-M4: ordinary UI real-time two tasks, sofa, relax and reload",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "tests/domain.test.ts: [P09 C01 C02 C07 S02] Idle TICK preserves state identity and still rejects invalid elapsed time",
        "tests/domain.test.ts: [E05 C01 C02] blocking required approach has specific cause; success does not award before accept",
        "[G01 N05 N09 N11 C01 C02 C03 C07 C08 C10 S01 R03 R06 R08] M1-M4: ordinary UI real-time two tasks, sofa, relax and reload"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "C03",
      "title": "Terima dua job berbeda",
      "expected": "Saldo 200 dan XP 40; tepat dua entri reward",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 68
      },
      "status": "PASS",
      "observed": "PASS: [C03 C04 C07 C08] ECON-01/02: two accepts -> purchase -> 50 coins / 40 XP, exact idempotency · PASS: [G01 N05 N09 N11 C01 C02 C03 C07 C08 C10 S01 R03 R06 R08] M1-M4: ordinary UI real-time two tasks, sofa, relax and reload",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "tests/domain.test.ts: [C03 C04 C07 C08] ECON-01/02: two accepts -> purchase -> 50 coins / 40 XP, exact idempotency",
        "[G01 N05 N09 N11 C01 C02 C03 C07 C08 C10 S01 R03 R06 R08] M1-M4: ordinary UI real-time two tasks, sofa, relax and reload"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "C04",
      "title": "Terima ulang job yang sama",
      "expected": "Tidak menambah saldo/XP atau entri reward",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 69
      },
      "status": "PASS",
      "observed": "PASS: [C03 C04 C07 C08] ECON-01/02: two accepts -> purchase -> 50 coins / 40 XP, exact idempotency",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:20.939Z",
      "testRefs": [
        "tests/domain.test.ts: [C03 C04 C07 C08] ECON-01/02: two accepts -> purchase -> 50 coins / 40 XP, exact idempotency"
      ],
      "commands": [
        "npm run test:unit"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "C05",
      "title": "Job gagal/cancel",
      "expected": "Tidak menghasilkan koin atau XP",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 70
      },
      "status": "PASS",
      "observed": "PASS: [C05 C06] ECON-01: failure, cancel, early acceptance and insufficient balance never reward · PASS: [C05 S09] M4: task pause in editor and hidden tab, failure/cancel have no reward",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "tests/domain.test.ts: [C05 C06] ECON-01: failure, cancel, early acceptance and insufficient balance never reward",
        "[C05 S09] M4: task pause in editor and hidden tab, failure/cancel have no reward"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "C06",
      "title": "Saldo kurang untuk sofa",
      "expected": "Pembelian ditolak tanpa pengurangan uang atau inventaris",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 71
      },
      "status": "PASS",
      "observed": "PASS: [C05 C06] ECON-01: failure, cancel, early acceptance and insufficient balance never reward",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:20.939Z",
      "testRefs": [
        "tests/domain.test.ts: [C05 C06] ECON-01: failure, cancel, early acceptance and insufficient balance never reward"
      ],
      "commands": [
        "npm run test:unit"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "C07",
      "title": "Beli sofa setelah C03",
      "expected": "Saldo 50, XP 40, tepat satu sofa di inventaris",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 72
      },
      "status": "PASS",
      "observed": "PASS: [P09 C01 C02 C07 S02] Idle TICK preserves state identity and still rejects invalid elapsed time · PASS: [C03 C04 C07 C08] ECON-01/02: two accepts -> purchase -> 50 coins / 40 XP, exact idempotency · PASS: [G01 N05 N09 N11 C01 C02 C03 C07 C08 C10 S01 R03 R06 R08] M1-M4: ordinary UI real-time two tasks, sofa, relax and reload",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "tests/domain.test.ts: [P09 C01 C02 C07 S02] Idle TICK preserves state identity and still rejects invalid elapsed time",
        "tests/domain.test.ts: [C03 C04 C07 C08] ECON-01/02: two accepts -> purchase -> 50 coins / 40 XP, exact idempotency",
        "[G01 N05 N09 N11 C01 C02 C03 C07 C08 C10 S01 R03 R06 R08] M1-M4: ordinary UI real-time two tasks, sofa, relax and reload"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "C08",
      "title": "Klik Beli/Accept ganda",
      "expected": "Reducer tidak melakukan transaksi duplikat meskipun event berulang",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 73
      },
      "status": "PASS",
      "observed": "PASS: [C03 C04 C07 C08] ECON-01/02: two accepts -> purchase -> 50 coins / 40 XP, exact idempotency · PASS: [G01 N05 N09 N11 C01 C02 C03 C07 C08 C10 S01 R03 R06 R08] M1-M4: ordinary UI real-time two tasks, sofa, relax and reload",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "tests/domain.test.ts: [C03 C04 C07 C08] ECON-01/02: two accepts -> purchase -> 50 coins / 40 XP, exact idempotency",
        "[G01 N05 N09 N11 C01 C02 C03 C07 C08 C10 S01 R03 R06 R08] M1-M4: ordinary UI real-time two tasks, sofa, relax and reload"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "C09",
      "title": "Satu job sudah berjalan",
      "expected": "Mulai job kedua ditolak tanpa menghapus job pertama",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 74
      },
      "status": "PASS",
      "observed": "PASS: [C09] ECON-02: only one running job; repeated job IDs do not restart; invalid delta rejected",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:20.939Z",
      "testRefs": [
        "tests/domain.test.ts: [C09] ECON-02: only one running job; repeated job IDs do not restart; invalid delta rejected"
      ],
      "commands": [
        "npm run test:unit"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "C10",
      "title": "Network selama seluruh rangkaian",
      "expected": "Tidak ada request provider AI atau API produksi",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 75
      },
      "status": "PASS",
      "observed": "PASS: [G01 N05 N09 N11 C01 C02 C03 C07 C08 C10 S01 R03 R06 R08] M1-M4: ordinary UI real-time two tasks, sofa, relax and reload",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "[G01 N05 N09 N11 C01 C02 C03 C07 C08 C10 S01 R03 R06 R08] M1-M4: ordinary UI real-time two tasks, sofa, relax and reload"
      ],
      "commands": [
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "S01",
      "title": "Reload sesudah sofa dipasang",
      "expected": "Saldo, XP, owned item, posisi, dan koneksi tetap sama",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 81
      },
      "status": "PASS",
      "observed": "PASS: [P09 S01 S05 E03 E05] Idle checkpoints avoid duplicate writes; changed tasks and drafts still persist and revalidate · PASS: [G01 N05 N09 N11 C01 C02 C03 C07 C08 C10 S01 R03 R06 R08] M1-M4: ordinary UI real-time two tasks, sofa, relax and reload",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "[P09 S01 S05 E03 E05] Idle checkpoints avoid duplicate writes; changed tasks and drafts still persist and revalidate",
        "[G01 N05 N09 N11 C01 C02 C03 C07 C08 C10 S01 R03 R06 R08] M1-M4: ordinary UI real-time two tasks, sofa, relax and reload"
      ],
      "commands": [
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "S02",
      "title": "Reload ketika task berjalan",
      "expected": "Remaining time dipulihkan dari checkpoint; tidak ada hadiah ganda",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 82
      },
      "status": "PASS",
      "observed": "PASS: [P09 C01 C02 C07 S02] Idle TICK preserves state identity and still rejects invalid elapsed time · PASS: [S02] SAVE-01: reload retains remaining active time and never gives offline rewards · PASS: [S02 S03] SAVE/NAV: normal walking saves actual position, interaction saves safe exit · PASS: [S02 S11] M4: mid-job reload keeps remaining time; export is local JSON",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "tests/domain.test.ts: [P09 C01 C02 C07 S02] Idle TICK preserves state identity and still rejects invalid elapsed time",
        "tests/domain.test.ts: [S02] SAVE-01: reload retains remaining active time and never gives offline rewards",
        "tests/domain.test.ts: [S02 S03] SAVE/NAV: normal walking saves actual position, interaction saves safe exit",
        "[S02 S11] M4: mid-job reload keeps remaining time; export is local JSON"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "S03",
      "title": "Reload ketika avatar duduk",
      "expected": "Avatar dipulihkan ke titik aman; state job/uang tidak berubah",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 83
      },
      "status": "PASS",
      "observed": "PASS: [S03] SAVE-01: reload recovers avatar from furniture to a valid exit · PASS: [S02 S03] SAVE/NAV: normal walking saves actual position, interaction saves safe exit · PASS: [N05 N06 N07 N11 S03] use heights, safe exits, board facing and complete sofa cooldown · PASS: [S03 S06 S07] sleeping reload is safe; follower cannot tick and no-lock tab never writes",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "tests/domain.test.ts: [S03] SAVE-01: reload recovers avatar from furniture to a valid exit",
        "tests/domain.test.ts: [S02 S03] SAVE/NAV: normal walking saves actual position, interaction saves safe exit",
        "tests/domain.test.ts: [N05 N06 N07 N11 S03] use heights, safe exits, board facing and complete sofa cooldown",
        "[S03 S06 S07] sleeping reload is safe; follower cannot tick and no-lock tab never writes"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "S04",
      "title": "JSON save rusak/versi baru",
      "expected": "Pesan recovery; tidak otomatis menghapus seluruh storage origin",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 84
      },
      "status": "PASS",
      "observed": "PASS: [S04 S05 R06] P1-01: old cross-wall save enters recovery and preserves raw data without writes or deletion · PASS: [S04] SAVE-01: malformed, future schema, invalid layout, duplicate ledger and money drift rejected · PASS: [S04 S05 R06] P1-01 UI: invalid legacy cross-wall save preserves raw export and disables writes · PASS: [S04 S10] M4: corrupted/unknown save retained, raw export offered, reset cancel then confirm scoped",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "tests/domain.test.ts: [S04 S05 R06] P1-01: old cross-wall save enters recovery and preserves raw data without writes or deletion",
        "tests/domain.test.ts: [S04] SAVE-01: malformed, future schema, invalid layout, duplicate ledger and money drift rejected",
        "[S04 S05 R06] P1-01 UI: invalid legacy cross-wall save preserves raw export and disables writes",
        "[S04 S10] M4: corrupted/unknown save retained, raw export offered, reset cancel then confirm scoped"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "S05",
      "title": "Storage diblokir/quota error",
      "expected": "Mode sesi saja atau save error terlihat, bukan Saved palsu",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 85
      },
      "status": "PASS",
      "observed": "PASS: [S04 S05 R06] P1-01: old cross-wall save enters recovery and preserves raw data without writes or deletion · PASS: [S05] SAVE-01: storage write failure is session-only, never reported persisted · PASS: [P09 S01 S05 E03 E05] Idle checkpoints avoid duplicate writes; changed tasks and drafts still persist and revalidate · PASS: [S04 S05 R06] P1-01 UI: invalid legacy cross-wall save preserves raw export and disables writes · PASS: [S05 S07 S08] M4: denied storage and unavailable locks use explicitly isolated session-only mode · PASS: [S05] M4: quota failure after startup stays visible through transaction/reload",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "tests/domain.test.ts: [S04 S05 R06] P1-01: old cross-wall save enters recovery and preserves raw data without writes or deletion",
        "tests/domain.test.ts: [S05] SAVE-01: storage write failure is session-only, never reported persisted",
        "[P09 S01 S05 E03 E05] Idle checkpoints avoid duplicate writes; changed tasks and drafts still persist and revalidate",
        "[S04 S05 R06] P1-01 UI: invalid legacy cross-wall save preserves raw export and disables writes",
        "[S05 S07 S08] M4: denied storage and unavailable locks use explicitly isolated session-only mode",
        "[S05] M4: quota failure after startup stays visible through transaction/reload"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "S06",
      "title": "Dua tab pada origin yang sama",
      "expected": "Satu writer; tab kedua read-only; tidak menggandakan timer/reward",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 86
      },
      "status": "PASS",
      "observed": "PASS: [S06] M4: exclusive writer lock, readonly follower and explicit takeover · PASS: [S03 S06 S07] sleeping reload is safe; follower cannot tick and no-lock tab never writes",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "[S06] M4: exclusive writer lock, readonly follower and explicit takeover",
        "[S03 S06 S07] sleeping reload is safe; follower cannot tick and no-lock tab never writes"
      ],
      "commands": [
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "S07",
      "title": "Browser tanpa Web Locks",
      "expected": "Mode sesi terisolasi dijelaskan dan tidak menulis shared persistent state",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 87
      },
      "status": "PASS",
      "observed": "PASS: [S05 S07 S08] M4: denied storage and unavailable locks use explicitly isolated session-only mode · PASS: [S03 S06 S07] sleeping reload is safe; follower cannot tick and no-lock tab never writes",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "[S05 S07 S08] M4: denied storage and unavailable locks use explicitly isolated session-only mode",
        "[S03 S06 S07] sleeping reload is safe; follower cannot tick and no-lock tab never writes"
      ],
      "commands": [
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "S08",
      "title": "Browser context baru",
      "expected": "Kondisi awal kembali sama, tanpa mengambil progres pengunjung lain",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 88
      },
      "status": "PASS",
      "observed": "PASS: [G01 G06 G08 S08] M1: derived JSON fixture equals runtime fixture; 64 cells, cross and access valid · PASS: [S05 S07 S08] M4: denied storage and unavailable locks use explicitly isolated session-only mode · PASS: [P12 S08 P03] review allowlist is deterministic, frozen, memory-only and rejects fixture URLs",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "tests/domain.test.ts: [G01 G06 G08 S08] M1: derived JSON fixture equals runtime fixture; 64 cells, cross and access valid",
        "[S05 S07 S08] M4: denied storage and unavailable locks use explicitly isolated session-only mode",
        "[P12 S08 P03] review allowlist is deterministic, frozen, memory-only and rejects fixture URLs"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "S09",
      "title": "Tab hidden dan editor aktif",
      "expected": "Task mock/animasi pause; kembali tanpa offline reward atau catch-up besar",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 89
      },
      "status": "PASS",
      "observed": "PASS: [N06 E08 S09] ANIM/NAV: approach -> enter -> bed -> exit, paused motion and reservation cleanup · PASS: [C05 S09] M4: task pause in editor and hidden tab, failure/cancel have no reward",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "tests/domain.test.ts: [N06 E08 S09] ANIM/NAV: approach -> enter -> bed -> exit, paused motion and reservation cleanup",
        "[C05 S09] M4: task pause in editor and hidden tab, failure/cancel have no reward"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "S10",
      "title": "Reset Demo",
      "expected": "Perlu konfirmasi; hanya key demo yang dihapus; data lain tidak tersentuh",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 90
      },
      "status": "PASS",
      "observed": "PASS: [S04 S10] M4: corrupted/unknown save retained, raw export offered, reset cancel then confirm scoped",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "[S04 S10] M4: corrupted/unknown save retained, raw export offered, reset cancel then confirm scoped"
      ],
      "commands": [
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "S11",
      "title": "Ekspor state",
      "expected": "JSON lokal valid dan tidak memuat kredensial, path server, atau data produksi",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 91
      },
      "status": "PASS",
      "observed": "PASS: [S02 S11] M4: mid-job reload keeps remaining time; export is local JSON",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "[S02 S11] M4: mid-job reload keeps remaining time; export is local JSON"
      ],
      "commands": [
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "R01",
      "title": "Sebelum tambah ruang",
      "expected": "Tiga + tepat pada port N/E/W; sisi S tetap entry utama",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 97
      },
      "status": "PASS",
      "observed": "PASS: [G02 G07 N12 E10 E11 R01 R02 P08] shared view state, walls, ghost cancel, keyboard and inventory lifecycle",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "[G02 G07 N12 E10 E11 R01 R02 P08] shared view state, walls, ghost cancel, keyboard and inventory lifecycle"
      ],
      "commands": [
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "R02",
      "title": "Ghost dan batal",
      "expected": "Ruang baru belum tersimpan; existing layout tidak bergeser",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 98
      },
      "status": "PASS",
      "observed": "PASS: [G02 G07 N12 E10 E11 R01 R02 P08] shared view state, walls, ghost cancel, keyboard and inventory lifecycle",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "[G02 G07 N12 E10 E11 R01 R02 P08] shared view state, walls, ghost cancel, keyboard and inventory lifecycle"
      ],
      "commands": [
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "R03",
      "title": "Tambah sisi E",
      "expected": "Origin (8,0), pintu bersama dua tile, total 128 tile tanpa overlap",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 99
      },
      "status": "PASS",
      "observed": "PASS: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: N gives 128 cells, two open edges, stable economy, one expansion · PASS: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: E gives 128 cells, two open edges, stable economy, one expansion · PASS: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: W gives 128 cells, two open edges, stable economy, one expansion · PASS: [G01 N05 N09 N11 C01 C02 C03 C07 C08 C10 S01 R03 R06 R08] M1-M4: ordinary UI real-time two tasks, sofa, relax and reload · PASS: [R03 R04 R05 R06 R07 R08 R09] M5: expansion N, 128 tiles, shared doorway traversal and reload · PASS: [R03 R04 R05 R06 R07 R08 R09] M5: expansion E, 128 tiles, shared doorway traversal and reload · PASS: [R03 R04 R05 R06 R07 R08 R09] M5: expansion W, 128 tiles, shared doorway traversal and reload",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "tests/domain.test.ts: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: N gives 128 cells, two open edges, stable economy, one expansion",
        "tests/domain.test.ts: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: E gives 128 cells, two open edges, stable economy, one expansion",
        "tests/domain.test.ts: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: W gives 128 cells, two open edges, stable economy, one expansion",
        "[G01 N05 N09 N11 C01 C02 C03 C07 C08 C10 S01 R03 R06 R08] M1-M4: ordinary UI real-time two tasks, sofa, relax and reload",
        "[R03 R04 R05 R06 R07 R08 R09] M5: expansion N, 128 tiles, shared doorway traversal and reload",
        "[R03 R04 R05 R06 R07 R08 R09] M5: expansion E, 128 tiles, shared doorway traversal and reload",
        "[R03 R04 R05 R06 R07 R08 R09] M5: expansion W, 128 tiles, shared doorway traversal and reload"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "R04",
      "title": "Tambah sisi N dari seed bersih",
      "expected": "Origin (0,-8), sambungan benar dengan koordinat negatif",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 100
      },
      "status": "PASS",
      "observed": "PASS: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: N shared-wall approaches rejected from both rooms without moving avatar · PASS: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: E shared-wall approaches rejected from both rooms without moving avatar · PASS: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: W shared-wall approaches rejected from both rooms without moving avatar · PASS: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: N gives 128 cells, two open edges, stable economy, one expansion · PASS: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: E gives 128 cells, two open edges, stable economy, one expansion · PASS: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: W gives 128 cells, two open edges, stable economy, one expansion · PASS: [E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI N: reject shared-wall sofa, then enter and exit valid sofa through doorway · PASS: [E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI E: reject shared-wall sofa, then enter and exit valid sofa through doorway · PASS: [E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI W: reject shared-wall sofa, then enter and exit valid sofa through doorway · PASS: [R03 R04 R05 R06 R07 R08 R09] M5: expansion N, 128 tiles, shared doorway traversal and reload · PASS: [R03 R04 R05 R06 R07 R08 R09] M5: expansion E, 128 tiles, shared doorway traversal and reload · PASS: [R03 R04 R05 R06 R07 R08 R09] M5: expansion W, 128 tiles, shared doorway traversal and reload",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "tests/domain.test.ts: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: N shared-wall approaches rejected from both rooms without moving avatar",
        "tests/domain.test.ts: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: E shared-wall approaches rejected from both rooms without moving avatar",
        "tests/domain.test.ts: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: W shared-wall approaches rejected from both rooms without moving avatar",
        "tests/domain.test.ts: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: N gives 128 cells, two open edges, stable economy, one expansion",
        "tests/domain.test.ts: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: E gives 128 cells, two open edges, stable economy, one expansion",
        "tests/domain.test.ts: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: W gives 128 cells, two open edges, stable economy, one expansion",
        "[E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI N: reject shared-wall sofa, then enter and exit valid sofa through doorway",
        "[E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI E: reject shared-wall sofa, then enter and exit valid sofa through doorway",
        "[E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI W: reject shared-wall sofa, then enter and exit valid sofa through doorway",
        "[R03 R04 R05 R06 R07 R08 R09] M5: expansion N, 128 tiles, shared doorway traversal and reload",
        "[R03 R04 R05 R06 R07 R08 R09] M5: expansion E, 128 tiles, shared doorway traversal and reload",
        "[R03 R04 R05 R06 R07 R08 R09] M5: expansion W, 128 tiles, shared doorway traversal and reload"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "R05",
      "title": "Tambah sisi W dari seed bersih",
      "expected": "Origin (-8,0), sambungan benar dengan koordinat negatif",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 101
      },
      "status": "PASS",
      "observed": "PASS: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: N shared-wall approaches rejected from both rooms without moving avatar · PASS: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: E shared-wall approaches rejected from both rooms without moving avatar · PASS: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: W shared-wall approaches rejected from both rooms without moving avatar · PASS: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: N gives 128 cells, two open edges, stable economy, one expansion · PASS: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: E gives 128 cells, two open edges, stable economy, one expansion · PASS: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: W gives 128 cells, two open edges, stable economy, one expansion · PASS: [E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI N: reject shared-wall sofa, then enter and exit valid sofa through doorway · PASS: [E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI E: reject shared-wall sofa, then enter and exit valid sofa through doorway · PASS: [E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI W: reject shared-wall sofa, then enter and exit valid sofa through doorway · PASS: [R03 R04 R05 R06 R07 R08 R09] M5: expansion N, 128 tiles, shared doorway traversal and reload · PASS: [R03 R04 R05 R06 R07 R08 R09] M5: expansion E, 128 tiles, shared doorway traversal and reload · PASS: [R03 R04 R05 R06 R07 R08 R09] M5: expansion W, 128 tiles, shared doorway traversal and reload",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "tests/domain.test.ts: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: N shared-wall approaches rejected from both rooms without moving avatar",
        "tests/domain.test.ts: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: E shared-wall approaches rejected from both rooms without moving avatar",
        "tests/domain.test.ts: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: W shared-wall approaches rejected from both rooms without moving avatar",
        "tests/domain.test.ts: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: N gives 128 cells, two open edges, stable economy, one expansion",
        "tests/domain.test.ts: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: E gives 128 cells, two open edges, stable economy, one expansion",
        "tests/domain.test.ts: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: W gives 128 cells, two open edges, stable economy, one expansion",
        "[E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI N: reject shared-wall sofa, then enter and exit valid sofa through doorway",
        "[E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI E: reject shared-wall sofa, then enter and exit valid sofa through doorway",
        "[E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI W: reject shared-wall sofa, then enter and exit valid sofa through doorway",
        "[R03 R04 R05 R06 R07 R08 R09] M5: expansion N, 128 tiles, shared doorway traversal and reload",
        "[R03 R04 R05 R06 R07 R08 R09] M5: expansion E, 128 tiles, shared doorway traversal and reload",
        "[R03 R04 R05 R06 R07 R08 R09] M5: expansion W, 128 tiles, shared doorway traversal and reload"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "R06",
      "title": "Berjalan antarroom",
      "expected": "Melewati doorway secara kontinu, tidak menembus shared wall lain",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 102
      },
      "status": "PASS",
      "observed": "PASS: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: N shared-wall approaches rejected from both rooms without moving avatar · PASS: [G04 E05 N04 N11 R06 R08] P1-01: N expansion keeps both sofa seats and four rotations usable through the doorway · PASS: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: E shared-wall approaches rejected from both rooms without moving avatar · PASS: [G04 E05 N04 N11 R06 R08] P1-01: E expansion keeps both sofa seats and four rotations usable through the doorway · PASS: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: W shared-wall approaches rejected from both rooms without moving avatar · PASS: [G04 E05 N04 N11 R06 R08] P1-01: W expansion keeps both sofa seats and four rotations usable through the doorway · PASS: [S04 S05 R06] P1-01: old cross-wall save enters recovery and preserves raw data without writes or deletion · PASS: [N04 R06] all connected-room journeys cross only the doorway with bounded continuous motion · PASS: [E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI N: reject shared-wall sofa, then enter and exit valid sofa through doorway · PASS: [E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI E: reject shared-wall sofa, then enter and exit valid sofa through doorway · PASS: [E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI W: reject shared-wall sofa, then enter and exit valid sofa through doorway · PASS: [S04 S05 R06] P1-01 UI: invalid legacy cross-wall save preserves raw export and disables writes · PASS: [G01 N05 N09 N11 C01 C02 C03 C07 C08 C10 S01 R03 R06 R08] M1-M4: ordinary UI real-time two tasks, sofa, relax and reload · PASS: [R03 R04 R05 R06 R07 R08 R09] M5: expansion N, 128 tiles, shared doorway traversal and reload · PASS: [R03 R04 R05 R06 R07 R08 R09] M5: expansion E, 128 tiles, shared doorway traversal and reload · PASS: [R03 R04 R05 R06 R07 R08 R09] M5: expansion W, 128 tiles, shared doorway traversal and reload",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "tests/domain.test.ts: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: N shared-wall approaches rejected from both rooms without moving avatar",
        "tests/domain.test.ts: [G04 E05 N04 N11 R06 R08] P1-01: N expansion keeps both sofa seats and four rotations usable through the doorway",
        "tests/domain.test.ts: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: E shared-wall approaches rejected from both rooms without moving avatar",
        "tests/domain.test.ts: [G04 E05 N04 N11 R06 R08] P1-01: E expansion keeps both sofa seats and four rotations usable through the doorway",
        "tests/domain.test.ts: [E04 E05 N04 N06 N11 R04 R05 R06] P1-01: W shared-wall approaches rejected from both rooms without moving avatar",
        "tests/domain.test.ts: [G04 E05 N04 N11 R06 R08] P1-01: W expansion keeps both sofa seats and four rotations usable through the doorway",
        "tests/domain.test.ts: [S04 S05 R06] P1-01: old cross-wall save enters recovery and preserves raw data without writes or deletion",
        "tests/domain.test.ts: [N04 R06] all connected-room journeys cross only the doorway with bounded continuous motion",
        "[E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI N: reject shared-wall sofa, then enter and exit valid sofa through doorway",
        "[E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI E: reject shared-wall sofa, then enter and exit valid sofa through doorway",
        "[E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI W: reject shared-wall sofa, then enter and exit valid sofa through doorway",
        "[S04 S05 R06] P1-01 UI: invalid legacy cross-wall save preserves raw export and disables writes",
        "[G01 N05 N09 N11 C01 C02 C03 C07 C08 C10 S01 R03 R06 R08] M1-M4: ordinary UI real-time two tasks, sofa, relax and reload",
        "[R03 R04 R05 R06 R07 R08 R09] M5: expansion N, 128 tiles, shared doorway traversal and reload",
        "[R03 R04 R05 R06 R07 R08 R09] M5: expansion E, 128 tiles, shared doorway traversal and reload",
        "[R03 R04 R05 R06 R07 R08 R09] M5: expansion W, 128 tiles, shared doorway traversal and reload"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "R07",
      "title": "Sesudah satu ekspansi",
      "expected": "Tambahan kedua dinonaktifkan sesuai scope, tidak membuat room tanpa batas",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 103
      },
      "status": "PASS",
      "observed": "PASS: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: N gives 128 cells, two open edges, stable economy, one expansion · PASS: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: E gives 128 cells, two open edges, stable economy, one expansion · PASS: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: W gives 128 cells, two open edges, stable economy, one expansion · PASS: [R03 R04 R05 R06 R07 R08 R09] M5: expansion N, 128 tiles, shared doorway traversal and reload · PASS: [R03 R04 R05 R06 R07 R08 R09] M5: expansion E, 128 tiles, shared doorway traversal and reload · PASS: [R03 R04 R05 R06 R07 R08 R09] M5: expansion W, 128 tiles, shared doorway traversal and reload",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "tests/domain.test.ts: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: N gives 128 cells, two open edges, stable economy, one expansion",
        "tests/domain.test.ts: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: E gives 128 cells, two open edges, stable economy, one expansion",
        "tests/domain.test.ts: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: W gives 128 cells, two open edges, stable economy, one expansion",
        "[R03 R04 R05 R06 R07 R08 R09] M5: expansion N, 128 tiles, shared doorway traversal and reload",
        "[R03 R04 R05 R06 R07 R08 R09] M5: expansion E, 128 tiles, shared doorway traversal and reload",
        "[R03 R04 R05 R06 R07 R08 R09] M5: expansion W, 128 tiles, shared doorway traversal and reload"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "R08",
      "title": "Reload room gabungan",
      "expected": "Door pair dan connectionId pulih; old room/furnitur tidak pindah",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 104
      },
      "status": "PASS",
      "observed": "PASS: [G04 E05 N04 N11 R06 R08] P1-01: N expansion keeps both sofa seats and four rotations usable through the doorway · PASS: [G04 E05 N04 N11 R06 R08] P1-01: E expansion keeps both sofa seats and four rotations usable through the doorway · PASS: [G04 E05 N04 N11 R06 R08] P1-01: W expansion keeps both sofa seats and four rotations usable through the doorway · PASS: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: N gives 128 cells, two open edges, stable economy, one expansion · PASS: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: E gives 128 cells, two open edges, stable economy, one expansion · PASS: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: W gives 128 cells, two open edges, stable economy, one expansion · PASS: [E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI N: reject shared-wall sofa, then enter and exit valid sofa through doorway · PASS: [E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI E: reject shared-wall sofa, then enter and exit valid sofa through doorway · PASS: [E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI W: reject shared-wall sofa, then enter and exit valid sofa through doorway · PASS: [G01 N05 N09 N11 C01 C02 C03 C07 C08 C10 S01 R03 R06 R08] M1-M4: ordinary UI real-time two tasks, sofa, relax and reload · PASS: [R03 R04 R05 R06 R07 R08 R09] M5: expansion N, 128 tiles, shared doorway traversal and reload · PASS: [R03 R04 R05 R06 R07 R08 R09] M5: expansion E, 128 tiles, shared doorway traversal and reload · PASS: [R03 R04 R05 R06 R07 R08 R09] M5: expansion W, 128 tiles, shared doorway traversal and reload",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "tests/domain.test.ts: [G04 E05 N04 N11 R06 R08] P1-01: N expansion keeps both sofa seats and four rotations usable through the doorway",
        "tests/domain.test.ts: [G04 E05 N04 N11 R06 R08] P1-01: E expansion keeps both sofa seats and four rotations usable through the doorway",
        "tests/domain.test.ts: [G04 E05 N04 N11 R06 R08] P1-01: W expansion keeps both sofa seats and four rotations usable through the doorway",
        "tests/domain.test.ts: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: N gives 128 cells, two open edges, stable economy, one expansion",
        "tests/domain.test.ts: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: E gives 128 cells, two open edges, stable economy, one expansion",
        "tests/domain.test.ts: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: W gives 128 cells, two open edges, stable economy, one expansion",
        "[E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI N: reject shared-wall sofa, then enter and exit valid sofa through doorway",
        "[E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI E: reject shared-wall sofa, then enter and exit valid sofa through doorway",
        "[E04 E05 N04 N11 R04 R05 R06 R08] P1-01 UI W: reject shared-wall sofa, then enter and exit valid sofa through doorway",
        "[G01 N05 N09 N11 C01 C02 C03 C07 C08 C10 S01 R03 R06 R08] M1-M4: ordinary UI real-time two tasks, sofa, relax and reload",
        "[R03 R04 R05 R06 R07 R08 R09] M5: expansion N, 128 tiles, shared doorway traversal and reload",
        "[R03 R04 R05 R06 R07 R08 R09] M5: expansion E, 128 tiles, shared doorway traversal and reload",
        "[R03 R04 R05 R06 R07 R08 R09] M5: expansion W, 128 tiles, shared doorway traversal and reload"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "R09",
      "title": "Batas dan ukuran",
      "expected": "Tile scale tetap; Fit All hanya mengubah kamera; tidak ada perubahan kavling",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 105
      },
      "status": "PASS",
      "observed": "PASS: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: N gives 128 cells, two open edges, stable economy, one expansion · PASS: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: E gives 128 cells, two open edges, stable economy, one expansion · PASS: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: W gives 128 cells, two open edges, stable economy, one expansion · PASS: [R03 R04 R05 R06 R07 R08 R09] M5: expansion N, 128 tiles, shared doorway traversal and reload · PASS: [R03 R04 R05 R06 R07 R08 R09] M5: expansion E, 128 tiles, shared doorway traversal and reload · PASS: [R03 R04 R05 R06 R07 R08 R09] M5: expansion W, 128 tiles, shared doorway traversal and reload",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "tests/domain.test.ts: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: N gives 128 cells, two open edges, stable economy, one expansion",
        "tests/domain.test.ts: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: E gives 128 cells, two open edges, stable economy, one expansion",
        "tests/domain.test.ts: [N04 R03 R04 R05 R07 R08 R09] ROOM-01/02: W gives 128 cells, two open edges, stable economy, one expansion",
        "[R03 R04 R05 R06 R07 R08 R09] M5: expansion N, 128 tiles, shared doorway traversal and reload",
        "[R03 R04 R05 R06 R07 R08 R09] M5: expansion E, 128 tiles, shared doorway traversal and reload",
        "[R03 R04 R05 R06 R07 R08 R09] M5: expansion W, 128 tiles, shared doorway traversal and reload"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "P01",
      "title": "Browser publik anonim",
      "expected": "App/review/JSON/gambar dapat dibuka langsung tanpa login atau cookie",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 111
      },
      "status": "PASS",
      "observed": "PASS: [P01 P05 P10] HTTPS anonymous app + build ID + headers · PASS: [P01 P05] Published JS executes, real-time task rewarded once, no page errors or off-origin requests · PASS: [P01] Default Python-urllib anonymous reader · PASS: Independent host actual GET/status/content-type for all artifacts",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:42:43Z",
      "testRefs": [
        "[P01 P05 P10] HTTPS anonymous app + build ID + headers",
        "[P01 P05] Published JS executes, real-time task rewarded once, no page errors or off-origin requests",
        "[P01] Default Python-urllib anonymous reader",
        "External HTTPS probe"
      ],
      "commands": [
        "npm run qa:public",
        "python3 tools/external-probe.py BUILD_ID live"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "P02",
      "title": "Review tanpa JavaScript",
      "expected": "Build ID, hasil tes, known issues, caption, dan link tetap terbaca",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 112
      },
      "status": "PASS",
      "observed": "PASS: [P02] Review readable with JavaScript disabled · PASS: Static review without JS includes 77 cases, canonical state, build and image checksums",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:43:01.032Z",
      "testRefs": [
        "[P02] Review readable with JavaScript disabled",
        "Static review without JS includes 77 cases, canonical state, build and image checksums"
      ],
      "commands": [
        "npm run qa:public",
        "node tools/review-checks.mjs"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "P03",
      "title": "Konsistensi build",
      "expected": "App, manifest, screenshot, dan laporan menyebut build yang sama",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 113
      },
      "status": "PASS",
      "observed": "PASS: [P12 S08 P03] review allowlist is deterministic, frozen, memory-only and rejects fixture URLs · PASS: [P03 P10] Review manifest, summary and every screenshot agree with published build · PASS: Static review without JS includes 77 cases, canonical state, build and image checksums",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:43:01.032Z",
      "testRefs": [
        "[P12 S08 P03] review allowlist is deterministic, frozen, memory-only and rejects fixture URLs",
        "[P03 P10] Review manifest, summary and every screenshot agree with published build",
        "Static review without JS includes 77 cases, canonical state, build and image checksums"
      ],
      "commands": [
        "npm run test:e2e",
        "npm run qa:public",
        "node tools/review-checks.mjs"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "P04",
      "title": "Scan output publik",
      "expected": "Tidak ada .env, repo, private source map, raw trace, log, atau PII",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 114
      },
      "status": "PASS",
      "observed": "PASS: [P04] Private routes and internal artifacts return 404 · PASS: [P04] Mutating HTTP methods rejected · PASS: [P04 P05] Synthetic cookie never reflected/consumed or changes static app · PASS: Public allowlist and sensitive artifact scan",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:43:01.032Z",
      "testRefs": [
        "[P04] Private routes and internal artifacts return 404",
        "[P04] Mutating HTTP methods rejected",
        "[P04 P05] Synthetic cookie never reflected/consumed or changes static app",
        "Public allowlist and sensitive artifact scan"
      ],
      "commands": [
        "npm run qa:public",
        "node tools/review-checks.mjs"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "P05",
      "title": "CSP dan request jaringan",
      "expected": "App bekerja dengan policy yang disetujui; tidak mengakses host/API privat",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 115
      },
      "status": "PASS",
      "observed": "PASS: [P01 P05 P10] HTTPS anonymous app + build ID + headers · PASS: [P04 P05] Synthetic cookie never reflected/consumed or changes static app · PASS: [P01 P05] Published JS executes, real-time task rewarded once, no page errors or off-origin requests",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:41:53.303Z",
      "testRefs": [
        "[P01 P05 P10] HTTPS anonymous app + build ID + headers",
        "[P04 P05] Synthetic cookie never reflected/consumed or changes static app",
        "[P01 P05] Published JS executes, real-time task rewarded once, no page errors or off-origin requests"
      ],
      "commands": [
        "npm run qa:public"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "P06",
      "title": "Base path",
      "expected": "Assets dan review bekerja di path selain root; direct link tidak 404",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 116
      },
      "status": "PASS",
      "observed": "PASS: Actual nested base path: app assets, review and direct evidence links",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:43:01.032Z",
      "testRefs": [
        "Actual nested base path: app assets, review and direct evidence links"
      ],
      "commands": [
        "node tools/review-checks.mjs"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "P07",
      "title": "Viewport utama dan kecil",
      "expected": "1440x900/1366x768 dapat diedit; 390x844 tetap dapat membaca/mencoba kontrol dasar",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 117
      },
      "status": "PASS",
      "observed": "PASS: [P07] UI-03: viewport 1366x768, usable controls and no horizontal overflow · PASS: [P07] UI-03: viewport 1920x1080, usable controls and no horizontal overflow · PASS: [P07] UI-03: viewport 1024x768, usable controls and no horizontal overflow · PASS: [P07] UI-03: viewport 390x844, usable controls and no horizontal overflow · PASS: Desktop 1440x900 and 1366x768: actual inspector edit and commit",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:43:01.032Z",
      "testRefs": [
        "[P07] UI-03: viewport 1366x768, usable controls and no horizontal overflow",
        "[P07] UI-03: viewport 1920x1080, usable controls and no horizontal overflow",
        "[P07] UI-03: viewport 1024x768, usable controls and no horizontal overflow",
        "[P07] UI-03: viewport 390x844, usable controls and no horizontal overflow",
        "Desktop 1440x900 and 1366x768: actual inspector edit and commit"
      ],
      "commands": [
        "npm run test:e2e",
        "node tools/review-checks.mjs"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "P08",
      "title": "Keyboard dan reduced motion",
      "expected": "Fokus terlihat, Escape bekerja, status tersedia sebagai teks, gerak nonesensial dapat dikurangi",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 118
      },
      "status": "PASS",
      "observed": "PASS: [E01 E02 E03 E06 E07 E09 P08] M3: invalid placement, rotation/cancel, wall reserve, undo/redo and expansion checkpoint · PASS: [G02 G07 N12 E10 E11 R01 R02 P08] shared view state, walls, ghost cancel, keyboard and inventory lifecycle",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "[E01 E02 E03 E06 E07 E09 P08] M3: invalid placement, rotation/cancel, wall reserve, undo/redo and expansion checkpoint",
        "[G02 G07 N12 E10 E11 R01 R02 P08] shared view state, walls, ghost cancel, keyboard and inventory lifecycle"
      ],
      "commands": [
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "P09",
      "title": "Tes 60 detik",
      "expected": "Perangkat/browser/viewport tercatat; FPS/frame time aktual atau NOT_MEASURED",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 119
      },
      "status": "PASS",
      "observed": "PASS: [P09 C01 C02 C07 S02] Idle TICK preserves state identity and still rejects invalid elapsed time · PASS: [P09 S01 S05 E03 E05] Idle checkpoints avoid duplicate writes; changed tasks and drafts still persist and revalidate · PASS: [P09] 60 seconds each: walking, interactions, editor, connected rooms; actual frame profile · PASS: walking: 37.8 FPS, p95 49.9ms; interactions: 34.8 FPS, p95 50.0ms; editor: 35.2 FPS, p95 50.0ms; two-rooms: 36.7 FPS, p95 50.0ms",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:37:39.447Z",
      "testRefs": [
        "tests/domain.test.ts: [P09 C01 C02 C07 S02] Idle TICK preserves state identity and still rejects invalid elapsed time",
        "[P09 S01 S05 E03 E05] Idle checkpoints avoid duplicate writes; changed tasks and drafts still persist and revalidate",
        "[P09] 60 seconds each: walking, interactions, editor, connected rooms; actual frame profile",
        "Four >=60s frame profiles; user device NOT_MEASURED"
      ],
      "commands": [
        "npm run test:unit",
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "P10",
      "title": "Cache release",
      "expected": "Refresh tidak mencampur JS/build baru dengan manifest lama",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 120
      },
      "status": "PASS",
      "observed": "PASS: [P01 P05 P10] HTTPS anonymous app + build ID + headers · PASS: [P03 P10] Review manifest, summary and every screenshot agree with published build",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:41:53.303Z",
      "testRefs": [
        "[P01 P05 P10] HTTPS anonymous app + build ID + headers",
        "[P03 P10] Review manifest, summary and every screenshot agree with published build"
      ],
      "commands": [
        "npm run qa:public"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "P11",
      "title": "Expiry dan rollback",
      "expected": "Mekanisme aktual terdokumentasi; tidak mematikan panel produksi",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 121
      },
      "status": "PASS",
      "observed": "PASS: Actual preview rollback and restore; production gate preserved",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:42:43.244639+00:00",
      "testRefs": [
        "Preview rollback receipt"
      ],
      "commands": [
        "python3 tools/deploy.py rollback BUILD_ID; external HTTPS probes"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    },
    {
      "id": "P12",
      "title": "Review scenario isolation",
      "expected": "Query review tidak menimpa save pengunjung dan tidak memuat fixture URL arbitrer",
      "source": {
        "path": "ACCEPTANCE_TESTS.md",
        "line": 122
      },
      "status": "PASS",
      "observed": "PASS: [P12 S08 P03] review allowlist is deterministic, frozen, memory-only and rejects fixture URLs",
      "buildId": "px-54c6825277ed",
      "testedAt": "2026-09-06T13:28:23.568Z",
      "testRefs": [
        "[P12 S08 P03] review allowlist is deterministic, frozen, memory-only and rejects fixture URLs"
      ],
      "commands": [
        "npm run test:e2e"
      ],
      "evidence": [
        "manifest.json"
      ],
      "blocker": null
    }
  ],
  "buildId": "px-54c6825277ed",
  "generatedAt": "2026-09-06T13:45:02.593Z",
  "counts": {
    "PASS": 77,
    "FAIL": 0,
    "BLOCKED": 0,
    "NOT_RUN": 0
  }
}