{
  "passed": true,
  "current_hash_checks": [
    {
      "repository": "/Users/rvanvuren/Projects/alqove-api/api",
      "checked_files": 187,
      "changed": []
    },
    {
      "repository": "/Users/rvanvuren/Projects/alqove-web",
      "checked_files": 6,
      "changed": []
    }
  ],
  "api": {
    "passed": true,
    "summary": "PASS for the narrow recipient-revalidation delta and the three previously remediated migration/payroll findings; not an overall release or production-concurrency certification.",
    "evidence": {
      "prior_review": "/Users/rvanvuren/.hermes/cache/delegation/live/deleg_1805827c/task-1.log",
      "recipient_fix": {
        "source": "app/Modules/Team/Services/InvitationService.php:132-146,196-214",
        "finding_status": "INVITATION-STALE-RECIPIENT closed on current snapshot",
        "analysis": "Acceptance rereads the authenticated user by immutable ID with the scoped User query and lockForUpdate after store, ordered memberships, and invitation locks. User SoftDeletes scope excludes soft-deleted rows; null rejects both absent and soft-deleted recipients before recipient validation or membership/audit writes. Unbound validation now reads current email; bound-account validation still compares account ID and does not require unchanged email.",
        "executed_controls": [
          "Exact TransactionBeginning injection changes current database email from hire@example.com to changed@example.com while authenticated request model retains hire@example.com: HTTP 422, no membership, no accepted_at, no invitation-accepted audit.",
          "Soft and hard deletion at transaction boundary, each bound and unbound: all four cases HTTP 422 with opaque invalid/expired message and no acceptance side effects.",
          "Bound account after email change still succeeds with HTTP 201, exactly one membership and acceptance audit.",
          "Unbound account with newly matching uppercase email succeeds with HTTP 201, exactly one membership and acceptance audit.",
          "Acquisition-order regression confirms store -> ordered memberships -> invitation -> recipient-user query order for accept; revoke/supersession retain their original parent-first sequence.",
          "Invitation endpoint and lifecycle controls, including bound-account mismatch, recipient mismatch, revoked/superseded state and inviter-authority controls, pass."
        ]
      },
      "adjacent_callers": [
        {
          "files": [
            "app/Modules/Team/Controllers/InvitationController.php:65-74",
            "app/Modules/Users/Controllers/UserController.php:21-28",
            "app/Modules/Users/Requests/UpdateProfileRequest.php:17-28"
          ],
          "result": "Controller passes request-time User to the now-authoritative acceptance boundary. Profile email update uses a direct User UPDATE, not invitation or membership locks."
        },
        {
          "files": [
            "app/Modules/Auth/Services/AuthService.php:21-118",
            "app/Modules/Kiosk/Services/KioskCustomerResolver.php:18-115",
            "app/Modules/Kiosk/Services/BuyIntakeService.php:62-149"
          ],
          "result": "Reviewed other mutable-user email writers and their user-row locks. Auth/Kiosk paths do not explicitly acquire Team invitation/membership locks after locking the user. Production foreign-key and row-lock contention remains unexecuted, not certified by SQLite."
        },
        {
          "files": [
            "app/Models/User.php:17-24",
            "database/migrations/2026_09_02_000002_create_store_memberships_table.php:14-25",
            "database/migrations/2026_09_02_000004_create_store_invitations_table.php:14-25"
          ],
          "result": "User uses SoftDeletes. Hard deletion has membership cascade and invitation recipient/sender SET NULL semantics; current accepting-user absence is rejected even if the invitation becomes unbound. Application search found no User deletion endpoint/observer; deletion behavior exercised via actual Eloquent delete/forceDelete regression controls."
        },
        {
          "files": [
            "app/Modules/Team/Services/MembershipManager.php:51-98",
            "app/Modules/Scheduling/Services/ScheduleWriteLock.php:13-22",
            "app/Modules/Team/Services/InvitationService.php:182-193"
          ],
          "result": "Existing membership update/termination writes and scheduling parent/membership order inspected; recipient fix does not reorder existing parent/membership/invitation acquisitions."
        }
      ],
      "prior_findings_closed": [
        {
          "id": "MIGRATION-RESTART",
          "status": "closed within tested restart contract",
          "sources": [
            "database/migrations/2026_09_06_000100_add_scheduling_settings.php",
            "database/migrations/2026_09_06_000200_create_time_punches_table.php",
            "database/migrations/2026_09_06_000300_create_payroll_tables.php"
          ],
          "evidence": "39 SchedulingMigrationRestartTest cases pass: all 9 settings column prefixes, 3 clock table prefixes, 4 payroll table prefixes; 21 incomplete-table column/index/unique/FK/delete-action controls fail closed preserving schema and rows, including intervening duplicate writes. Normal down/up and interrupted operator index repair/rerun pass. Existing data is retained and missing later tables/columns converge without drop/recreate."
        },
        {
          "id": "OBSOLETE-WEEK-APPROVAL-IDENTITY",
          "status": "closed",
          "sources": [
            "app/Modules/Payroll/Services/TimesheetLifecycleService.php:18-28",
            "app/Modules/Payroll/Services/TimesheetRecalculationService.php:36-45"
          ],
          "evidence": "Current bounds are compared with persisted week_start_date before recalculation. Obsolete ID approval returns HTTP 409 with identical persisted attributes, no replacement/approved/exported row and no approval audit. Explicit current-week selection has distinct ID, approval/export target only that ID, and recalculateAffected skips obsolete pending history."
        },
        {
          "id": "EMPTY-DAILY-BREAKDOWN-OBJECT",
          "status": "closed",
          "sources": [
            "app/Modules/Payroll/Resources/TimesheetResource.php:22-27",
            "tests/Feature/Payroll/TimesheetIdentityContractTest.php:48-96"
          ],
          "evidence": "Real HTTP raw JSON decoding preserves object/array distinction: empty daily_breakdown is {}, while DB value remains []. Empty and populated output are checked against canonical OpenAPI and payroll fragment object contracts; nonempty manager response still hides pay."
        }
      ],
      "targeted_test_execution": {
        "command": "env APP_ENV=testing APP_CONFIG_CACHE=/tmp/alqove-api-final-review-nonexistent-config.php DB_CONNECTION=sqlite DB_DATABASE=:memory: DB_URL= CACHE_STORE=array SESSION_DRIVER=array QUEUE_CONNECTION=sync SCOUT_DRIVER=null MAIL_MAILER=array BROADCAST_CONNECTION=null LOG_CHANNEL=null TWILIO_ENABLED=false ABLY_KEY= XDEBUG_MODE=off /opt/homebrew/bin/php vendor/bin/phpunit --do-not-cache-result --colors=never --log-junit /tmp/alqove-api-final-review-tests.xml tests/Feature/Team/InvitationConcurrencyTest.php tests/Feature/Team/InvitationEndpointsTest.php tests/Feature/Team/InvitationLifecycleTest.php tests/Feature/Scheduling/SchedulingMigrationRestartTest.php tests/Feature/Payroll/TimesheetIdentityContractTest.php",
        "preflight": {
          "driver": "sqlite",
          "database": ":memory:",
          "pdo_driver": "sqlite",
          "configured_cache_present": false
        },
        "runtime": "PHP 8.5.0 / PHPUnit 12.5.17",
        "exit_code": 0,
        "totals": {
          "tests": 86,
          "assertions": 729,
          "failures": 0,
          "errors": 0,
          "skipped": 0
        },
        "stdout_summary": "OK (86 tests, 729 assertions)",
        "duration_reported": "00:05.916",
        "memory_reported": "79.00 MB",
        "suites": [
          {
            "name": "Tests\\Feature\\Team\\InvitationConcurrencyTest",
            "tests": "20",
            "assertions": "97",
            "errors": "0",
            "failures": "0",
            "skipped": "0"
          },
          {
            "name": "Tests\\Feature\\Team\\InvitationEndpointsTest",
            "tests": "15",
            "assertions": "35",
            "errors": "0",
            "failures": "0",
            "skipped": "0"
          },
          {
            "name": "Tests\\Feature\\Team\\InvitationLifecycleTest",
            "tests": "7",
            "assertions": "11",
            "errors": "0",
            "failures": "0",
            "skipped": "0"
          },
          {
            "name": "Tests\\Feature\\Scheduling\\SchedulingMigrationRestartTest",
            "tests": "39",
            "assertions": "436",
            "errors": "0",
            "failures": "0",
            "skipped": "0"
          },
          {
            "name": "Tests\\Feature\\Payroll\\TimesheetIdentityContractTest",
            "tests": "5",
            "assertions": "150",
            "errors": "0",
            "failures": "0",
            "skipped": "0"
          }
        ],
        "junit_path": "/tmp/alqove-api-final-review-tests.xml",
        "junit_sha256": "ee24f0f695797888ffbc920760c90b7f41a3c99e0188d9715ea4d738a50b9cfc",
        "isolation": "Explicit in-memory SQLite default verified before PHPUnit. Migration restart tests use a separate migration_restart in-memory SQLite connection and assert its database name. No normal application database writes; no E2E server/port operations."
      },
      "static_checks": {
        "php_lint_files": 10,
        "php_lint_failures": [],
        "invitation_diff_check_exit_code": 0,
        "invitation_added_line_security_scan": {
          "hardcoded_secret": [],
          "eval_or_exec": [],
          "debug_output": []
        },
        "manual_security_review": "Recipient query uses Eloquent parameter binding; no new raw SQL, external calls, secret material, dynamic evaluation or debug output in the recipient delta."
      },
      "changes_by_reviewer": {
        "production_files_modified": [],
        "test_files_modified": [],
        "commits": [],
        "pushes": [],
        "created_artifacts": [
          "/tmp/alqove-api-final-review.json",
          "/tmp/alqove-api-final-review-tests.xml"
        ]
      }
    },
    "source_hashes": {
      "app/Models/StoreInvitation.php": "d646c40a5a41ee52c53007e4b5dfae66cdb97251283cbc146226446edacd8217",
      "app/Models/StoreMembership.php": "5708bfe9ba70adb9c6f06f6a9b9b3ca8ec0d976ad14e7bd551a5f8e45519cb23",
      "app/Models/User.php": "9a137417b0e976a9e2190cb03f810b805959ce991a1aef8b56af88b94abb970d",
      "app/Modules/Auth/Controllers/AuthController.php": "f660641df1310bd4f75deea220b57c636cdd3b24858502730e6ed015ef2e786e",
      "app/Modules/Auth/Requests/LoginRequest.php": "2241b2dde5efc56568e9705ad427061134695fb4135eb4610b2ca6fe4087e766",
      "app/Modules/Auth/Requests/RegisterRequest.php": "7a9e8219305c5513809ec824e454cd47fe3bd3edf1c23825653bbacaf4773de8",
      "app/Modules/Auth/Resources/UserResource.php": "0ad6dfc999822cd5f87ecbb338a3dc35d0a53fbf2e22457ad86b650299095816",
      "app/Modules/Auth/Services/AuthService.php": "57f7ae65a62932c5dbb77b2a4a78eb51882026e8579db6b855f6db953bb636e4",
      "app/Modules/Auth/routes.php": "a33bace1460c6f1507cb9daea48cd110520a1b7890c705f189513d72ff330f72",
      "app/Modules/Kiosk/Services/BuyIntakeService.php": "d644289fed8060c0647bd2fa680d3b6e74225ee62f33d35185838c99ac285a4c",
      "app/Modules/Kiosk/Services/KioskCustomerResolver.php": "6557007064daa224e0dd929727b03b8678d1ceff01e83cbc3010ec06bb71136d",
      "app/Modules/Payroll/Controllers/OvertimeRuleController.php": "258ebc13167117da57dc8d28515884748ad971457e7a8f4819be81e3104bb3d7",
      "app/Modules/Payroll/Controllers/PayrollExportController.php": "6100020951ead64bfd4e0c565ad9fc456d0cc3fb5a47971f983039b73b52aec0",
      "app/Modules/Payroll/Controllers/TimesheetController.php": "b4bfc44fc4bdeb3073a3dc680ebe02f1349e3fc5117866f34a26b4d9d3181281",
      "app/Modules/Payroll/Data/OvertimeRules.php": "22c4543b153871c26f00f4a988eed5df7adf34d51fd4bb73ffd45c6d699cb56b",
      "app/Modules/Payroll/Listeners/RecalculateAfterPayRateSet.php": "babf691e48b97767b024c7d372165fa79f45bb0eb531cda58a2d41e52b775373",
      "app/Modules/Payroll/Requests/ApprovalRequest.php": "584e1cd9b52276302c7505910e19d0263762cae2ca5c63c6cfcb350667ff62ec",
      "app/Modules/Payroll/Requests/ExportRequest.php": "c42f7a52e241f767d19eaa2c3d176ecbecf0a33c8a4dd777e4f119bbf07d327c",
      "app/Modules/Payroll/Requests/OvertimeRuleRequest.php": "e01d1c700b14973e170de5689c27d1ad949b73817771d08c3f60f28b392d078a",
      "app/Modules/Payroll/Requests/WeekRequest.php": "847585a52d43d532e3646b2bff6543b3b2d44c18a498d11e04d91a7990cae408",
      "app/Modules/Payroll/Resources/TimesheetResource.php": "4cb1ac73cd0e1caab261be85e866b95e37785e8bd2a8174220119689c7f21409",
      "app/Modules/Payroll/Services/OvertimeCalculator.php": "409b3f00ee1e98e5d80a4e4610a8d0fd86cbaf63ff080373fb8c97acb82a850d",
      "app/Modules/Payroll/Services/PayrollExportService.php": "00f0c0921ecfca22d0b3eeab4919503d57a95146abfdeedc13917a0e94e71f1b",
      "app/Modules/Payroll/Services/PunchSegments.php": "989c701cc7034a0178daaa36ee072232576cff32c96f2127c06c39f051c02f64",
      "app/Modules/Payroll/Services/TimesheetLifecycleService.php": "8556fac73baf975ae0ae287a8e4c9eec29d244c735ac840915ef09798bfdcdc6",
      "app/Modules/Payroll/Services/TimesheetRecalculationService.php": "fb6ec15982b57ce8ed6b5dde9ae15ebae393342969691f73d61c2ad3988bb794",
      "app/Modules/Payroll/routes.php": "aba882ae3ebd5092503f6c5504f2d87757c5823f31d50cd3e47939c972f899c5",
      "app/Modules/Scheduling/Controllers/ClockController.php": "8eb2c9d57f14195ddf774f38232424c95db116ac7524ffc65cafdc68f2a27d33",
      "app/Modules/Scheduling/Controllers/CopyWeekController.php": "9db5962347318b45416d78610d5b6002c878b68425dbe76db818713bca86440b",
      "app/Modules/Scheduling/Controllers/PunchController.php": "d61736e552ed3eadb1bfa60f065bbf1656319a283c7f99f774da903a3ea8d8ae",
      "app/Modules/Scheduling/Controllers/ScheduleSettingsController.php": "8bb77dca8f742bc6c07d138344116893558a3c48869012f0eac2d0de0df15316",
      "app/Modules/Scheduling/Controllers/ScheduleWeekController.php": "ccd8f54047ff7c9062b9ea7003a4832ac7badcd2838bc6215fcd37ad11af60cc",
      "app/Modules/Scheduling/Controllers/ShiftController.php": "9c8f394c10f4c778aae487c449e3efc511cc4c922d7bf0abbce6e8963ed950f9",
      "app/Modules/Scheduling/Listeners/UnassignTerminatedMember.php": "625d3e86e30791d4b1bb295daa5902761721e0124978d798fdc4183738109f88",
      "app/Modules/Scheduling/Requests/ClockRequest.php": "14f610579a262300c1ae81e8255473fc44fb7725735466ce245831efa5a10eab",
      "app/Modules/Scheduling/Requests/CopyWeekRequest.php": "6f4cef39fd92fd1e7404cd61c80dbc19d5ac19b9276f36a003e625b98791f503",
      "app/Modules/Scheduling/Requests/CorrectPunchRequest.php": "5c65ffa2162d877bf7dae85dd195b7d4227410f4d8a1a5fab9b248613bcf3dde",
      "app/Modules/Scheduling/Requests/ListPunchRequest.php": "03237a9a6e9dd16f4bcc8d67c95a5a2f987e5275097261d1bd208fd791370e7f",
      "app/Modules/Scheduling/Requests/ShiftRequest.php": "b2643888f444aa812669ad5974d948db920082382c6010998e5abd73fba1f105",
      "app/Modules/Scheduling/Requests/UpdateScheduleSettingsRequest.php": "8ee0e903660ba1095062f44804943959f694570e7e21f747b58ae06b87278d1b",
      "app/Modules/Scheduling/Requests/WeekRequest.php": "fcbf46b0b739c19e663013d6870899718d5d2f9f42d91f09dcabbb7d122c7aca",
      "app/Modules/Scheduling/Resources/ShiftResource.php": "1df364308dd999387be17c597d7afa68fb71c6ea5e6a0ba8260b945c85851520",
      "app/Modules/Scheduling/Resources/TimePunchResource.php": "38a352b00653aa6e42ab08c18d124dc9b60238633feab17347a0248557e61de7",
      "app/Modules/Scheduling/Services/ClockService.php": "cf740ca86039024196a8d01ebb5e8dfb2cb1169d373bd60081e92a2ca882ab01",
      "app/Modules/Scheduling/Services/CopyWeekService.php": "63a523e3f70cd5abe8cb6eeffd57b41883dc0d5e1054dc4efc5672e62875a59d",
      "app/Modules/Scheduling/Services/PunchPeriodGuard.php": "cd20f49864215a2cd89fc174b7d7ba8120a7b735200336687e14f78429bbd51a",
      "app/Modules/Scheduling/Services/PunchSequence.php": "bf6aa7ee62481b1a9cfc4ba04daa4ea84c46e58631f3a7952ba4b198846e737b",
      "app/Modules/Scheduling/Services/PunchService.php": "19cd803c47e1206f1f895ad434893fd73c670441f87e3d85a84a76702ea425ec",
      "app/Modules/Scheduling/Services/ScheduleSettingsService.php": "59fb4a41c1cfedc2a571df70559d3f25202eba52ad9541ed64a7f0576fc7d5f9",
      "app/Modules/Scheduling/Services/ScheduleWeekService.php": "aed8502815738f91b1dbd9c72935a6b21950779aa211d5993ad058920657c705",
      "app/Modules/Scheduling/Services/ScheduleWriteLock.php": "d3eb87decd716b7f74e8e4d3b948421bc32ca2ac35bee1e64aceb91785dc480f",
      "app/Modules/Scheduling/Services/ShiftService.php": "c94f2ef9ed21985cc458f7a3bf86eeba61ee964c19edae02d5c077fc6130ac97",
      "app/Modules/Scheduling/Services/WorkWeek.php": "9aea91b47a0a06ba1993d5bd936aa3d7cf9b817f5c260c0c681dfc56cc053475",
      "app/Modules/Scheduling/punch-routes.php": "70bcb9793cf9061b553884196bb50d19e1391ab01470f2ae95821984d6bcd9f4",
      "app/Modules/Scheduling/routes.php": "24c034b6e0803bd5df43ba7f06d6367db03adc2076a280824719a537aa534af5",
      "app/Modules/Team/Console/AuditStoreAccessCommand.php": "c18507f5a0fe1e2a62d7d95b721373f7ca57ab28a07d7388bca64fb3dd7267fc",
      "app/Modules/Team/Console/BackfillOwnerMembershipsCommand.php": "203e5956b805e2a4ef7aa552946656c5ee7645b0c45ae1c13a632eb21a88e084",
      "app/Modules/Team/Controllers/InvitationController.php": "5552d6a1bc8a8a825b3c5bc94efb64688715b90998504198333e8ff0193f15f0",
      "app/Modules/Team/Controllers/MembershipController.php": "e72f8b1fdb55737607911838103dc880cd148ac4f16d532a0a4b57678076bbee",
      "app/Modules/Team/Controllers/PayRateController.php": "f9e720c0216cdea77fae6cd5bd7cb13c2bba1d8ecd796324a76ce1eac239dabe",
      "app/Modules/Team/Controllers/PositionController.php": "7d7d0620de576b577127459d359ec98dbeaa13aee731e77b6f95c3556e225170",
      "app/Modules/Team/Data/StoreViewer.php": "9e4b181ea824955a06c08d0f7e89f2efd8aa58847024d1ed14ee97ec52bf5b31",
      "app/Modules/Team/Events/MembershipPayRateSet.php": "2855644ea6ae63d139a6681bbb458207d9f5d1b211040ab5222e4f5e90a0361c",
      "app/Modules/Team/Events/MembershipTerminated.php": "b151032c28cad539f13d890b0ecfd4338c4b106abb1d66882bd8ac8794162000",
      "app/Modules/Team/Requests/AcceptInvitationRequest.php": "47a2ff18b52e8326afe757a230e60ca75b0ed76db7f3959d7681ae4bac1723bb",
      "app/Modules/Team/Requests/CreateInvitationRequest.php": "0e5210f9781bfb8aa343ddafe41e38d8d01b692097a50a7bbb932096be0eb6e6",
      "app/Modules/Team/Requests/CreatePayRateRequest.php": "2bc7b37047f831db17e1a918ffbf7c4248956a4668d4d696c156fc3140189031",
      "app/Modules/Team/Requests/CreatePositionRequest.php": "7fc2dc7eb1e16cea578e1c218da1302dbdd9f8560c830902fe9b7607c9cc1d50",
      "app/Modules/Team/Requests/UpdateMembershipRequest.php": "5f1849464909b0ce8549710f8db80577e1cc358c439fdd5bab20257dcc412c0d",
      "app/Modules/Team/Requests/UpdatePositionRequest.php": "756ae004bfecc9049650d65c5f3c8b8f3595bc9915ba549f842d010732eb16ce",
      "app/Modules/Team/Resources/InvitationResource.php": "206ec2db9e73f38f9d4d44edeb66f68010c3a9f816101e658d0a2394071e66af",
      "app/Modules/Team/Resources/MembershipResource.php": "4b188f4871caf70d8ef8961fa594c80ceb5fef9731e863b2be0c993965c3d0ce",
      "app/Modules/Team/Resources/PayRateResource.php": "036c35c063f03aed1badb4b4cc5b8ac9605003388f851178006981f22de238c4",
      "app/Modules/Team/Resources/PositionResource.php": "9c93631699bb454118e6ca4029f411a625be027e0c437f1e329eee57e001f2fa",
      "app/Modules/Team/Resources/StoreMemberResource.php": "515a4995c3e78e5f0959b8ac26a2f72dd956d54d8381dcfb7faa48e8bd12afc1",
      "app/Modules/Team/Services/InvitationService.php": "edbefda1aa14965d55e2584d7fb15a1c195e8455bbc173a84184db1d8ce5df4f",
      "app/Modules/Team/Services/MembershipManager.php": "62fdd1bbb04ce5e2ee34f8ed9d8fdc3381e1556953247380f702d0d7ce8f1c7c",
      "app/Modules/Team/Services/MembershipProvisioner.php": "4f868664541494c1e4fd0bc7611b7708de825d347f37f34bc9dc73610c82973f",
      "app/Modules/Team/Services/StoreViewerResolver.php": "6f7bd8714c6deb75f0f2c425aecf5213dbbded0987306306316902d85ad689ec",
      "app/Modules/Team/TeamServiceProvider.php": "04287cfd3ed35f9b29cd3317f4102012931e15dc44cb85f27e1bccb7124b588d",
      "app/Modules/Team/routes.php": "adacda2047fdd6db467f3e7bbbcb31abe8a8b30de800c386691f5621e7a48714",
      "app/Modules/Users/Controllers/UserController.php": "25cd080d6dacc87528d2241ba59e2fc90d7424aa8533ec380d4107d93d244aad",
      "app/Modules/Users/Requests/UpdateProfileRequest.php": "42b7de6b37bdde34ef26c1117aa7a6d36d40ed8a25a511a8ef3c26a9918c89c2",
      "app/Modules/Users/routes.php": "38220646d94f47671f2fefc7679bcd7409f0eea2090f36e0c4612e1aef6d082b",
      "app/Providers/EventServiceProvider.php": "7765ec081aa86be04d3550579cad576e7fa39cb9fdb90d54d984eb4d48827ca3",
      "bootstrap/app.php": "0b3cdd15f8d7cf526568b0946e93c860d26a427c0fa62c4d6ad67e1a0eaf3eff",
      "composer.json": "6f02c062e38b29ec3a6d53a3874d6ffe50ac0b986a17c5f5124937de4d41178b",
      "composer.lock": "b1c5167449fe7d24e512c8e362c155c734162a5196e29e9ab8741487c9b64e64",
      "config/database.php": "180f274ee2d6d052d2b02fdd383a322a64506c0f002274131f52f5dfe3654fb8",
      "contracts/fragments/payroll.yaml": "e141ddc7b1de6ddbfb814cde5a5acb02bd3447cbdf86e9eee75f64f5a6e29856",
      "contracts/openapi.yaml": "7fc9cc6d04d08258d089f514b21b59030af95ebaf0643ff5a8e12b74c56d7b43",
      "database/migrations/0001_01_01_000000_create_users_table.php": "6fac2f4ed883d6abc099528c7b8239a4f7a2d5d5a489161bb2c01fc87a4b578c",
      "database/migrations/0001_01_01_000001_create_cache_table.php": "08debeda8255b50ec3f8d541dfa879514cbb866fcaebd19323fe2468ef0f4b03",
      "database/migrations/0001_01_01_000002_create_jobs_table.php": "86403fd053c46a9b0d5a7496aedf15b1c9dff8b7145acc028384ad19d8629f53",
      "database/migrations/2024_01_01_000010_create_stores_table.php": "dc47fa2be0df89ddb4f94de2ff57b2e77528370299b35beaefea4ab76b6291fe",
      "database/migrations/2024_01_01_000011_create_store_settings_table.php": "9079af4de617fb6b0e10943c40dbb0ca130f0255c95fa72545dfb0a12c1d283a",
      "database/migrations/2024_01_01_000012_create_categories_table.php": "1c2f6a16bf691619b7937fed62c7c044d8b2293a667e3d2e30450464a9839164",
      "database/migrations/2024_01_01_000013_add_store_id_to_users_table.php": "42f0d244cb857c1b6ab1695cc4217d729940f98142b26eaaa535b17bd1ddda67",
      "database/migrations/2024_01_01_000020_create_items_table.php": "dd93a7ee893f332f06029b72d9921147b3dbffa584868058af34679abecf72d6",
      "database/migrations/2024_01_01_000021_create_saved_items_table.php": "2ef25913d2046a43ad4413079fc55c7285ad717bb4bd450c0da46eff8efaf239",
      "database/migrations/2024_01_01_000022_create_addresses_table.php": "37cdb4cdccf73f70ae392caad7a45c988ffe3c418d65e845a400d6b88a687e7f",
      "database/migrations/2024_01_01_000030_create_carts_table.php": "e0bb61c686c4b6fc34cbe961bdcd48cf32e494fd9235aac2030a5d7db5a4342c",
      "database/migrations/2024_01_01_000031_create_cart_items_table.php": "ff2e9ceb50c8e8a7679c1e0d9c91152761466d67848e9fe730362d275a343442",
      "database/migrations/2024_01_01_000032_create_purchases_table.php": "430025f07224e23b5f81ff4c30c0fbe86c4f0ef85b089e98e3410f9ccb52f975",
      "database/migrations/2024_01_01_000033_create_orders_table.php": "55f0d452eaaa4abebfdedcd4d9047bc943a576ca03b67dc0bb566e992d44f6c8",
      "database/migrations/2024_01_01_000034_create_order_items_table.php": "a39fa9d750e18f68de18526839ae006298e24e15abbe607572058146656a05ef",
      "database/migrations/2024_01_01_000040_create_discounts_table.php": "361f054595785e83fe3a26f681e595a4f7071adb5ce88097766af865c9a8f03a",
      "database/migrations/2024_01_01_000041_create_purchase_discounts_table.php": "99c354c7645375eb69ff5b0804542db2a48c6870d95cf00246ab3cc79dfbf360",
      "database/migrations/2024_01_01_000042_create_notification_preferences_table.php": "a20c0668e2d3f1ab9293ff95fad6f115cf3744f36a9d7385f35b17e8c525966f",
      "database/migrations/2026_04_08_172557_create_permission_tables.php": "67c735b77a79565126bfef4bc99f899429ca974273218c3cd3f562fbb858fb6e",
      "database/migrations/2026_04_08_172608_create_activity_log_table.php": "4e8af30018063d6bcd3d4896cc0ff636c55e810ab5f053217b04e94a0e963780",
      "database/migrations/2026_04_08_174957_create_personal_access_tokens_table.php": "dc12ff05185747d46e343b443f21a5f7cf7c497771b0d53e2ec300e7c6c49512",
      "database/migrations/2026_04_09_000001_create_social_accounts_table.php": "b1006b2c11bfc7ea65c964ca7aa20b0da36de3540b734df667041b670b9bec37",
      "database/migrations/2026_04_09_180101_create_media_table.php": "86b0beb08f10c199c07d365853be6c74997cfe3630efa3009ec3a39c6607ee35",
      "database/migrations/2026_04_10_000001_add_published_at_to_items_table.php": "96687448649f7c86d3a010e99d393ee04b9274abf5072c558fa27b5708651cc5",
      "database/migrations/2026_04_16_000000_create_checkouts_table.php": "74150f6aef892dc57353c764082e6e2d684222e2b150702d8f621ce5fc7148e0",
      "database/migrations/2026_04_16_000001_add_fulfillment_fields_to_orders_table.php": "edb87fd9d2228ea27a216ed621b291f23050c007a07a5721f9119db3b68544ed",
      "database/migrations/2026_04_16_000002_add_disputed_to_purchases_table.php": "3fca3bc7fee353b39afeb666a757612a16e0b1de7beb5be03381f10fca6a73fb",
      "database/migrations/2026_04_16_000003_add_ship_from_address_to_stores_table.php": "3e479626eea9d686d97b71bab47b48bfc0167c1f96db961d1d1ba0ffdb49f3a4",
      "database/migrations/2026_04_16_000004_create_store_parcel_presets_table.php": "1e79891dcdaa852be6fec825865dcce117f80d898309b4a0ce3976f7e2c77f8e",
      "database/migrations/2026_04_21_000001_create_notifications_table.php": "337d383fa696d35fb5bd0acc2b9ad8164681a43e60898e017f7e27c8e49560a1",
      "database/migrations/2026_04_22_000001_add_category_to_notifications_table.php": "9bbb094a1575bb90d48d9157fd8d92f0cc2dd984d276d9bd256a711ce9683fe0",
      "database/migrations/2026_04_22_000002_backfill_notification_categories.php": "e661ffc647f4c462894de33dd9af497cfd56b1301f36979a01a0b3064d862842",
      "database/migrations/2026_05_04_000001_create_disputes_table.php": "5e7fede84c0ee93d3cf272bb1439b423e36f2fbe3d7ca073066b7be8eab12117",
      "database/migrations/2026_05_04_000002_add_reversal_columns_to_orders_table.php": "decc5e3ed18e2387493fed0ca824580312e08f959c6d01aa918271112cb749f2",
      "database/migrations/2026_05_04_000004_add_suspension_columns_to_stores_table.php": "6aa1e9459e87d02b4e531aff4bcaebf11e7bbd7d78888b7344fb4701178ef782",
      "database/migrations/2026_05_04_000005_fix_activity_log_morphs_to_uuid.php": "2905436399800278fcd6ac70913d44d6a9a5d25ecbbfaff463a8de88092fc3ec",
      "database/migrations/2026_05_05_000001_add_stripe_refund_id_to_orders_table.php": "7a85e098e411f330033fa99797714272042f78ec5e1e57fc5ce198b0b6bf7b71",
      "database/migrations/2026_05_06_000001_add_evidence_submitted_at_to_disputes_table.php": "c46e1b3add3cfca6f1dc4662680848eec24a3fd1151c585eed399d597bea5b3f",
      "database/migrations/2026_05_06_000001_create_message_threads_table.php": "5d7583a7ed77c4bd3d3c2f28032ab34c3ed04d5e22e82e4df67ca6be0292917a",
      "database/migrations/2026_05_06_000002_create_messages_table.php": "99a591c82b5cb1fb46cfbb13fcb2bb40fb5f3a0185751184005cdfd48fd91a76",
      "database/migrations/2026_05_06_000003_create_message_thread_reads_table.php": "c9e2ef4e98770317dc5641bbce919d35f5a5151866c97bb76543403a52648403",
      "database/migrations/2026_05_06_100001_create_message_attachment_uploads_table.php": "fe2026f1bccc5d8b2d799414194b5e2305d250b2668f3514b0fccb5dc17fb51d",
      "database/migrations/2026_05_07_000001_drop_attachments_column_from_messages_table.php": "2b1877cc5d236039d451a8493444eacc1b009ff5682a2b15e7e22a09428abd74",
      "database/migrations/2026_05_07_100001_create_returns_table.php": "468e205ba1a88b0bbcf5e9aa4a399c5775f7c830c6998486400af7ed4d1297f2",
      "database/migrations/2026_05_07_100002_create_return_items_table.php": "0175fb8019b7902d0118defffe87c26b9f9a3c6e8fe4ea464856239d582341e4",
      "database/migrations/2026_05_07_100003_add_restocking_fee_percent_max_to_store_settings.php": "f50764a6c25cc5f30f6561999fc58f626f586dcf99c44f349659db8b61a05702",
      "database/migrations/2026_05_08_100001_add_label_columns_to_returns.php": "4379f96f35d14e2248f6c2053d3048506c9361dc5ca31bdc8e8f0af6cbee4fe4",
      "database/migrations/2026_05_09_100001_create_return_escalations_table.php": "7443c0f7dfd23d6f9d737062b9e47d95814d4847a8f7cec2a296dd5188963065",
      "database/migrations/2026_05_09_100002_add_refund_overrides_to_returns.php": "fd6a15a30c19f38eb1e0d72686fa9e29c10ae2fa99ee35c023a35d4037d0aa8f",
      "database/migrations/2026_05_11_100001_create_seller_ledger_table.php": "eb5433a710d8908d53f64a80bd5500066e5bd78b5f19d95bfbbe2227125b3a6c",
      "database/migrations/2026_05_11_200001_create_payouts_table.php": "4376abc86cd3bb7640ba0a7fef32ac5d59e5692b09e0686ae1bcb03160517592",
      "database/migrations/2026_05_11_200002_add_payout_id_fk_to_seller_ledger.php": "7b944c877d0b2766f1850a3f92d92655b2c331ac53171969acf630511afccd3b",
      "database/migrations/2026_05_11_200003_add_connect_health_to_stores_table.php": "ced29f86c1871900098cb370d90db8d880c192ebcbd1f8d72143794bf8daf4d9",
      "database/migrations/2026_05_12_100001_create_manual_adjustments_table.php": "34eacb0c6127f0618e7418fa6a63f895146d570f6bd51d69d63f76c75b0ae665",
      "database/migrations/2026_05_12_100002_add_admin_void_columns_to_payouts.php": "2789f96f5dcd00bdf76b7fca819003a3ad29235d2ba73cdd255ffec1c6363fc4",
      "database/migrations/2026_05_13_100001_create_reviews_table.php": "d72e6c08aa3ceb5196761f8a2c0d4c3af8c0552e249c5932533f7376c91166ac",
      "database/migrations/2026_05_13_100002_add_review_counters_to_stores_table.php": "47c33fd7a2f74d5acb87618397c5554187b3f6d13e26470ef02dc51215ee7ca6",
      "database/migrations/2026_05_13_100003_create_review_attachment_uploads_table.php": "71c484d12c6e471891d3032e7286ff788e14e3e14bb3f80af6292a54835f29de",
      "database/migrations/2026_05_13_100099_drop_legacy_rating_from_stores.php": "c303a14655712123ad4370a084fee2bb49b832628cb5dff592fe92725b6f19ca",
      "database/migrations/2026_05_13_200001_relax_reviews_state_check_constraint.php": "6f3349b34b46b75176d89c2801ed0738c55d338f9c1b3a80233f978c88e395f7",
      "database/migrations/2026_05_13_200002_create_review_reports_table.php": "fef677dd870c5e5f5f1aafdf5466a0e695c6a5e8484117c7b8861200957e49ba",
      "database/migrations/2026_06_02_000001_add_kiosk_fields_to_users_table.php": "49c2471fca74faf56e6316589d5e45e872ad1d72e7f595eeafaa91c78c761db0",
      "database/migrations/2026_06_02_000002_create_kiosk_devices_table.php": "fd5b0cef5c0ac525216d3af7ef94fb7ddc999554edc1dc03c2e056fb4ecaeb78",
      "database/migrations/2026_06_03_000001_add_kiosk_loyalty_to_store_settings_table.php": "45d96732dbd113a980708cc5fca0dab34e7e48619fb90107f8f25f2694297112",
      "database/migrations/2026_06_03_000002_create_buys_table.php": "cc389f05a42750adc92665ed29ddb8f19de2274209fa928016f0e146900726e2",
      "database/migrations/2026_06_03_000003_create_loyalty_transactions_table.php": "0697a44c813e868759f7398173d2081346f8bdbe96f07e27b3dc5358260fec1a",
      "database/migrations/2026_06_16_000001_add_remote_checkin_fields_to_buys_table.php": "e299a4ddf1ab1794bf1b35a432eb7c3fadf9981f0349b10324d908281acd950d",
      "database/migrations/2026_06_16_000002_create_store_checkin_links_table.php": "b99515beaee2537c8f3fa4b5b06991eea78f8dc3e127ea5a2f6f51991818bec3",
      "database/migrations/2026_06_16_000003_add_checkin_fields_to_store_settings_table.php": "a382c4e8efc48b6227ec022e3d85169c2d4a1237e6f4c396e0e03cd5f42b6fee",
      "database/migrations/2026_06_16_000004_create_pos_devices_table.php": "992ee8b5759e963d527c8a0d25e159ec4d22423203d15c9db9174a3a2a62b595",
      "database/migrations/2026_06_17_000001_create_capture_devices_table.php": "6a027843d2c173e1dc754346e5cd7d6b65f010cc905f64c4900dee8123223c46",
      "database/migrations/2026_06_17_000002_create_pairing_tokens_table.php": "8ac70a437b082b37563ec730064ec8e9f8dbacafbcd66ba12e1529d9ca7e30ad",
      "database/migrations/2026_06_17_000003_create_capture_uploads_table.php": "335659a6887171bc9810b7f6288ce632b2b1c6aa2efd282228b96cfd61202db3",
      "database/migrations/2026_06_24_000001_create_buy_items_table.php": "f7b17d08b6bc725131c8162049d9c3b4d0d96c082ff418c2069b002dcb80d2c0",
      "database/migrations/2026_06_24_000002_add_settlement_fields_to_buys_table.php": "03d5a5228f66da1c1e5e9b3f3e96882ba8803acee19225dd6a2a1b26f9b8f65c",
      "database/migrations/2026_08_19_000001_add_slug_to_stores_table.php": "11b703a8a1c7216ebac3d2e4029a822d6885d2ee558efe0614498e75d55c2c2b",
      "database/migrations/2026_08_19_000002_create_store_sites_table.php": "d14a3325d9893454edf403bdb93b5b9a570fb7af371dfc999ba6389c748d58b0",
      "database/migrations/2026_08_19_000003_create_store_site_pages_table.php": "076795e805aa4797acaf85b219d422cfd46df69d0d5f9184eadf1df19bc1c974",
      "database/migrations/2026_08_19_000004_create_store_domains_table.php": "fed3d47240479ce013984418b43cc07f6914f687142774f74cc32ecd57a8b312",
      "database/migrations/2026_09_02_000001_create_store_positions_table.php": "849c3b0b55a77de6a1f0f83a794a795a155d382531ba5a15ab1c0072c52c2240",
      "database/migrations/2026_09_02_000002_create_store_memberships_table.php": "e7a4f3484a8ea845d258aefc0fce02656e538e7cb89bb4901e4a48de6f47d7b2",
      "database/migrations/2026_09_02_000003_create_membership_pay_rates_table.php": "710eef13815481cd7dcddf0ebba99a7bc90230f74cea2d10950cd42b6b310915",
      "database/migrations/2026_09_02_000004_create_store_invitations_table.php": "d8a5c5a6aaaeae315fc4bd5af809c6d81f3e6dacff2fb9ebef3f9f3f3a7f2ec8",
      "database/migrations/2026_09_06_000100_add_scheduling_settings.php": "b5288eb5f2aedf06a7e4985261d382a1fd268f9ed0da356a1f6f53585811c05e",
      "database/migrations/2026_09_06_000100_create_schedule_publications.php": "d15c34292cbf1c7f673c8598b07be73b1e2abad81fcfb860464edf4456e10157",
      "database/migrations/2026_09_06_000100_create_shifts.php": "babea07b8a6d45ad52daa18d0f0ccc833606c609ffe8129f1f7499f1c57e1f50",
      "database/migrations/2026_09_06_000200_create_time_punches_table.php": "41adf25bd87847870fd7f3c2de193b3a9e093ace5aa67fdd06d8ae158c8a8fa7",
      "database/migrations/2026_09_06_000300_create_payroll_tables.php": "39e8495834137f919a9f917f4ce6542c0a7f5476cd81acd230a8d875ec48e322",
      "phpunit.xml": "0ef1db02bbc735ad59f4fad9c289dc4524b49d107cd6fe0fecfe3ca1934a2ae0",
      "tests/Feature/Payroll/TimesheetIdentityContractTest.php": "71a62f71704ec2ee92cebe5ea7b07b6b2e33228a5a4d916f9d4543fd80207e8c",
      "tests/Feature/Scheduling/SchedulingMigrationRestartTest.php": "f6317a8b0ac9eb579a4e96035a2dae40caba7faf2084da34475bbce8abd5c5f2",
      "tests/Feature/Team/InvitationConcurrencyTest.php": "cc008a97a1e3b2f8e6d13a32e73a49bb2d2df94609d2951e53b6bfc799423250",
      "tests/Feature/Team/InvitationEndpointsTest.php": "e9d98468f20169641e303165d82b4d1cc7b60352777cde96ed46941c31583bce",
      "tests/Feature/Team/InvitationLifecycleTest.php": "8bfae3623f1fec4cb6f5c7c01eff8ce325397217f6770419cd3fd5ee6fdbb625",
      "tests/Support/scheduling-concurrency-worker.php": "ce356658827788d41cfc56bb8b682cae01d426df62a69db2cc20011ed01b76d6",
      "tests/TestCase.php": "1cdd2af8e86d6edbfad0d36d61b9708d208831a30b18b4d02e566fc1bbcb19df"
    },
    "limitations": [
      "Production database-engine concurrency is UNVERIFIED, not passed. SQLite ignores FOR UPDATE; transaction hooks prove authoritative rereads and rollback behavior, not independent commits, production blocking, deadlock freedom, FK-cascade lock order, or retry/liveness behavior.",
      "In particular, hard-deletion cascades and Kiosk user-first transactions with store foreign-key writes need production-engine contention tests before claiming cross-domain deadlock freedom. This narrow review did not establish a new recipient-delta defect from those unexecuted paths.",
      "Migration replay evidence is SQLite-only and covers interrupted DDL prefixes plus incomplete required-column/index/constraint detection; it is not certification against arbitrary out-of-band column type/default corruption or production-engine DDL behavior.",
      "Full API regression, PHPStan and E2E are owned by the parent/other runs and are not credited as passing by this verdict. Existing E2E services on 8105/3100 were untouched.",
      "This reviewer replayed current GREEN tests; did not mutate production code or independently rerun the old-source RED case. Prior exact RED evidence is in the referenced earlier review transcript.",
      "Working tree contains pre-existing shared changes; no stash, stage, source edit, commit or push performed. Parent must read this JSON and recheck source_hashes.end against current files before using this scoped pass. Tests do not prove bug-free software."
    ],
    "suggestions": []
  },
  "frontend": {
    "passed": true,
    "summary": "PASS for the two current frontend lifecycle remediations only: authoritative pending-only punch correction and immutable authentication-epoch invitation continuation. No current scoped security or logic finding; start/end source and test manifest unchanged.",
    "reviewed_sources": {
      "web/src/stores/auth.ts": "3165a3cd27d657226c8e4dcb523be76127cf0ff4cfc027173daa7c32387688c6",
      "web/src/hooks/use-timekeeping.ts": "2cbe6cf075a3a660d1d2e779f5233eb9e38a9ce717f3eed3c3587f844da783ec",
      "web/src/app/(auth)/invitations/accept/page.tsx": "4ec53b15cd3b44448bc69f42d3f351ef6d02782a5d11256dc9b19d36cfe8584b",
      "web/src/app/(seller)/seller/timesheets/timesheets-client.tsx": "ee7e97b967b16ebaf2e9f85a5f86a69595650db16fc9c52ff5a00d4be7c084d1",
      "web/src/lib/stores/store-context.ts": "8ce577367e8a242d449c6fcf13fa6f65380c027b9b8ca818740cc422b227d83f",
      "web/src/lib/invitation-continuation.ts": "9dfd0c6e08bb6fb3338f35a9567fc7f7c10f110bc89b2bebd3b2400269e028dc"
    },
    "focused_tests": 72,
    "supplemental_cases": 14,
    "suggestions": [
      {
        "severity": "non-blocking",
        "finding": "Promote the supplemental deferred rejection and in-flight retry cases into repository regressions. Existing real-store lifecycle tests cover stale successful acceptance/discovery and retry after replacement, while supplemental cases independently cover stale rejection and replacement during retry."
      }
    ],
    "limitations": [
      "This is not a full application or release approval. Full web tests/build and API verification are parent-owned and are not claimed here.",
      "Behavioral tests execute actual components, Zustand auth actions, QueryClient and query hooks under JSDOM with API/network and Next navigation test doubles; no live browser/API E2E is claimed.",
      "No application or repository test files were edited. In-memory mutant runs change only the supplemental loader input, never source on disk.",
      "The original reproduction also emits scheduling and unpublish diagnostics; these are retained as raw evidence but unpublish is outside this remediation verdict."
    ]
  }
}
