Repository: League-of-Foundry-Developers/foundry-vtt-types
Pull request #3169 (2025-02-15 22:37:21)

Types and tests for `RenderFlags` and `PerceptionManager`
... and associated changes to make the RenderFlags changes work


Patch:
diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml
index 04bc35bfe..1c8928f48 100644
--- a/.github/workflows/checks.yml
+++ b/.github/workflows/checks.yml
@@ -278,7 +278,7 @@ jobs:
           fetch-depth: 1
 
       - name: Download Main Test Results
-        uses: dawidd6/action-download-artifact@v9
+        uses: dawidd6/action-download-artifact@v8
         with:
           branch: main
           name: main-test-results
diff --git a/package-lock.json b/package-lock.json
index 080b24a06..7ccc67f62 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -572,9 +572,9 @@
       }
     },
     "node_modules/@eslint/compat": {
-      "version": "1.2.7",
-      "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.2.7.tgz",
-      "integrity": "sha512-xvv7hJE32yhegJ8xNAnb62ggiAwTYHBpUCWhRxEj/ksvgDJuSXfoDkBcRYaYNFiJ+jH0IE3K16hd+xXzhBgNbg==",
+      "version": "1.2.6",
+      "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.2.6.tgz",
+      "integrity": "sha512-k7HNCqApoDHM6XzT30zGoETj+D+uUcZUb+IVAJmar3u6bvHf7hhHJcWx09QHj4/a2qrKZMWU0E16tvkiAdv06Q==",
       "dev": true,
       "license": "Apache-2.0",
       "engines": {
@@ -629,9 +629,9 @@
       }
     },
     "node_modules/@eslint/core": {
-      "version": "0.12.0",
-      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz",
-      "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==",
+      "version": "0.10.0",
+      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.10.0.tgz",
+      "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==",
       "dev": true,
       "license": "Apache-2.0",
       "dependencies": {
@@ -642,9 +642,9 @@
       }
     },
     "node_modules/@eslint/eslintrc": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.0.tgz",
-      "integrity": "sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==",
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz",
+      "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -703,9 +703,9 @@
       }
     },
     "node_modules/@eslint/js": {
-      "version": "9.21.0",
-      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.21.0.tgz",
-      "integrity": "sha512-BqStZ3HX8Yz6LvsF5ByXYrtigrV5AXADWLAGc7PH/1SxOb7/FIYYMszZZWiUou/GB9P2lXWk2SV4d+Z8h0nknw==",
+      "version": "9.20.0",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.20.0.tgz",
+      "integrity": "sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -723,13 +723,13 @@
       }
     },
     "node_modules/@eslint/plugin-kit": {
-      "version": "0.2.7",
-      "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz",
-      "integrity": "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==",
+      "version": "0.2.5",
+      "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz",
+      "integrity": "sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==",
       "dev": true,
       "license": "Apache-2.0",
       "dependencies": {
-        "@eslint/core": "^0.12.0",
+        "@eslint/core": "^0.10.0",
         "levn": "^0.4.1"
       },
       "engines": {
@@ -797,9 +797,9 @@
       }
     },
     "node_modules/@humanwhocodes/retry": {
-      "version": "0.4.2",
-      "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz",
-      "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==",
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz",
+      "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==",
       "dev": true,
       "license": "Apache-2.0",
       "engines": {
@@ -1814,17 +1814,17 @@
       "license": "MIT"
     },
     "node_modules/@typescript-eslint/eslint-plugin": {
-      "version": "8.25.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.25.0.tgz",
-      "integrity": "sha512-VM7bpzAe7JO/BFf40pIT1lJqS/z1F8OaSsUB3rpFJucQA4cOSuH2RVVVkFULN+En0Djgr29/jb4EQnedUo95KA==",
+      "version": "8.24.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.24.1.tgz",
+      "integrity": "sha512-ll1StnKtBigWIGqvYDVuDmXJHVH4zLVot1yQ4fJtLpL7qacwkxJc1T0bptqw+miBQ/QfUbhl1TcQ4accW5KUyA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/regexpp": "^4.10.0",
-        "@typescript-eslint/scope-manager": "8.25.0",
-        "@typescript-eslint/type-utils": "8.25.0",
-        "@typescript-eslint/utils": "8.25.0",
-        "@typescript-eslint/visitor-keys": "8.25.0",
+        "@typescript-eslint/scope-manager": "8.24.1",
+        "@typescript-eslint/type-utils": "8.24.1",
+        "@typescript-eslint/utils": "8.24.1",
+        "@typescript-eslint/visitor-keys": "8.24.1",
         "graphemer": "^1.4.0",
         "ignore": "^5.3.1",
         "natural-compare": "^1.4.0",
@@ -1843,80 +1843,17 @@
         "typescript": ">=4.8.4 <5.8.0"
       }
     },
-    "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": {
-      "version": "8.25.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.25.0.tgz",
-      "integrity": "sha512-6PPeiKIGbgStEyt4NNXa2ru5pMzQ8OYKO1hX1z53HMomrmiSB+R5FmChgQAP1ro8jMtNawz+TRQo/cSXrauTpg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@typescript-eslint/types": "8.25.0",
-        "@typescript-eslint/visitor-keys": "8.25.0"
-      },
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      }
-    },
-    "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": {
-      "version": "8.25.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.25.0.tgz",
-      "integrity": "sha512-+vUe0Zb4tkNgznQwicsvLUJgZIRs6ITeWSCclX1q85pR1iOiaj+4uZJIUp//Z27QWu5Cseiw3O3AR8hVpax7Aw==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      }
-    },
-    "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": {
-      "version": "8.25.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.25.0.tgz",
-      "integrity": "sha512-kCYXKAum9CecGVHGij7muybDfTS2sD3t0L4bJsEZLkyrXUImiCTq1M3LG2SRtOhiHFwMR9wAFplpT6XHYjTkwQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@typescript-eslint/types": "8.25.0",
-        "eslint-visitor-keys": "^4.2.0"
-      },
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      }
-    },
-    "node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-visitor-keys": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
-      "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/eslint"
-      }
-    },
     "node_modules/@typescript-eslint/parser": {
-      "version": "8.25.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.25.0.tgz",
-      "integrity": "sha512-4gbs64bnbSzu4FpgMiQ1A+D+urxkoJk/kqlDJ2W//5SygaEiAP2B4GoS7TEdxgwol2el03gckFV9lJ4QOMiiHg==",
+      "version": "8.24.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.24.1.tgz",
+      "integrity": "sha512-Tqoa05bu+t5s8CTZFaGpCH2ub3QeT9YDkXbPd3uQ4SfsLoh1/vv2GEYAioPoxCWJJNsenXlC88tRjwoHNts1oQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/scope-manager": "8.25.0",
-        "@typescript-eslint/types": "8.25.0",
-        "@typescript-eslint/typescript-estree": "8.25.0",
-        "@typescript-eslint/visitor-keys": "8.25.0",
+        "@typescript-eslint/scope-manager": "8.24.1",
+        "@typescript-eslint/types": "8.24.1",
+        "@typescript-eslint/typescript-estree": "8.24.1",
+        "@typescript-eslint/visitor-keys": "8.24.1",
         "debug": "^4.3.4"
       },
       "engines": {
@@ -1931,96 +1868,6 @@
         "typescript": ">=4.8.4 <5.8.0"
       }
     },
-    "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": {
-      "version": "8.25.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.25.0.tgz",
-      "integrity": "sha512-6PPeiKIGbgStEyt4NNXa2ru5pMzQ8OYKO1hX1z53HMomrmiSB+R5FmChgQAP1ro8jMtNawz+TRQo/cSXrauTpg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@typescript-eslint/types": "8.25.0",
-        "@typescript-eslint/visitor-keys": "8.25.0"
-      },
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      }
-    },
-    "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": {
-      "version": "8.25.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.25.0.tgz",
-      "integrity": "sha512-+vUe0Zb4tkNgznQwicsvLUJgZIRs6ITeWSCclX1q85pR1iOiaj+4uZJIUp//Z27QWu5Cseiw3O3AR8hVpax7Aw==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      }
-    },
-    "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": {
-      "version": "8.25.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.25.0.tgz",
-      "integrity": "sha512-ZPaiAKEZ6Blt/TPAx5Ot0EIB/yGtLI2EsGoY6F7XKklfMxYQyvtL+gT/UCqkMzO0BVFHLDlzvFqQzurYahxv9Q==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@typescript-eslint/types": "8.25.0",
-        "@typescript-eslint/visitor-keys": "8.25.0",
-        "debug": "^4.3.4",
-        "fast-glob": "^3.3.2",
-        "is-glob": "^4.0.3",
-        "minimatch": "^9.0.4",
-        "semver": "^7.6.0",
-        "ts-api-utils": "^2.0.1"
-      },
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      },
-      "peerDependencies": {
-        "typescript": ">=4.8.4 <5.8.0"
-      }
-    },
-    "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": {
-      "version": "8.25.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.25.0.tgz",
-      "integrity": "sha512-kCYXKAum9CecGVHGij7muybDfTS2sD3t0L4bJsEZLkyrXUImiCTq1M3LG2SRtOhiHFwMR9wAFplpT6XHYjTkwQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@typescript-eslint/types": "8.25.0",
-        "eslint-visitor-keys": "^4.2.0"
-      },
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      }
-    },
-    "node_modules/@typescript-eslint/parser/node_modules/eslint-visitor-keys": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
-      "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/eslint"
-      }
-    },
     "node_modules/@typescript-eslint/scope-manager": {
       "version": "8.24.1",
       "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.24.1.tgz",
@@ -2040,14 +1887,14 @@
       }
     },
     "node_modules/@typescript-eslint/type-utils": {
-      "version": "8.25.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.25.0.tgz",
-      "integrity": "sha512-d77dHgHWnxmXOPJuDWO4FDWADmGQkN5+tt6SFRZz/RtCWl4pHgFl3+WdYCn16+3teG09DY6XtEpf3gGD0a186g==",
+      "version": "8.24.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.24.1.tgz",
+      "integrity": "sha512-/Do9fmNgCsQ+K4rCz0STI7lYB4phTtEXqqCAs3gZW0pnK7lWNkvWd5iW545GSmApm4AzmQXmSqXPO565B4WVrw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/typescript-estree": "8.25.0",
-        "@typescript-eslint/utils": "8.25.0",
+        "@typescript-eslint/typescript-estree": "8.24.1",
+        "@typescript-eslint/utils": "8.24.1",
         "debug": "^4.3.4",
         "ts-api-utils": "^2.0.1"
       },
@@ -2063,10 +1910,10 @@
         "typescript": ">=4.8.4 <5.8.0"
       }
     },
-    "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": {
-      "version": "8.25.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.25.0.tgz",
-      "integrity": "sha512-+vUe0Zb4tkNgznQwicsvLUJgZIRs6ITeWSCclX1q85pR1iOiaj+4uZJIUp//Z27QWu5Cseiw3O3AR8hVpax7Aw==",
+    "node_modules/@typescript-eslint/types": {
+      "version": "8.24.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.24.1.tgz",
+      "integrity": "sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -2077,15 +1924,15 @@
         "url": "https://opencollective.com/typescript-eslint"
       }
     },
-    "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": {
-      "version": "8.25.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.25.0.tgz",
-      "integrity": "sha512-ZPaiAKEZ6Blt/TPAx5Ot0EIB/yGtLI2EsGoY6F7XKklfMxYQyvtL+gT/UCqkMzO0BVFHLDlzvFqQzurYahxv9Q==",
+    "node_modules/@typescript-eslint/typescript-estree": {
+      "version": "8.24.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.24.1.tgz",
+      "integrity": "sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.25.0",
-        "@typescript-eslint/visitor-keys": "8.25.0",
+        "@typescript-eslint/types": "8.24.1",
+        "@typescript-eslint/visitor-keys": "8.24.1",
         "debug": "^4.3.4",
         "fast-glob": "^3.3.2",
         "is-glob": "^4.0.3",
@@ -2104,62 +1951,17 @@
         "typescript": ">=4.8.4 <5.8.0"
       }
     },
-    "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": {
-      "version": "8.25.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.25.0.tgz",
-      "integrity": "sha512-kCYXKAum9CecGVHGij7muybDfTS2sD3t0L4bJsEZLkyrXUImiCTq1M3LG2SRtOhiHFwMR9wAFplpT6XHYjTkwQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@typescript-eslint/types": "8.25.0",
-        "eslint-visitor-keys": "^4.2.0"
-      },
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      }
-    },
-    "node_modules/@typescript-eslint/type-utils/node_modules/eslint-visitor-keys": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
-      "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/eslint"
-      }
-    },
-    "node_modules/@typescript-eslint/types": {
-      "version": "8.24.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.24.1.tgz",
-      "integrity": "sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      }
-    },
     "node_modules/@typescript-eslint/utils": {
-      "version": "8.25.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.25.0.tgz",
-      "integrity": "sha512-syqRbrEv0J1wywiLsK60XzHnQe/kRViI3zwFALrNEgnntn1l24Ra2KvOAWwWbWZ1lBZxZljPDGOq967dsl6fkA==",
+      "version": "8.24.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.24.1.tgz",
+      "integrity": "sha512-OOcg3PMMQx9EXspId5iktsI3eMaXVwlhC8BvNnX6B5w9a4dVgpkQZuU8Hy67TolKcl+iFWq0XX+jbDGN4xWxjQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.4.0",
-        "@typescript-eslint/scope-manager": "8.25.0",
-        "@typescript-eslint/types": "8.25.0",
-        "@typescript-eslint/typescript-estree": "8.25.0"
+        "@typescript-eslint/scope-manager": "8.24.1",
+        "@typescript-eslint/types": "8.24.1",
+        "@typescript-eslint/typescript-estree": "8.24.1"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2173,96 +1975,6 @@
         "typescript": ">=4.8.4 <5.8.0"
       }
     },
-    "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": {
-      "version": "8.25.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.25.0.tgz",
-      "integrity": "sha512-6PPeiKIGbgStEyt4NNXa2ru5pMzQ8OYKO1hX1z53HMomrmiSB+R5FmChgQAP1ro8jMtNawz+TRQo/cSXrauTpg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@typescript-eslint/types": "8.25.0",
-        "@typescript-eslint/visitor-keys": "8.25.0"
-      },
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      }
-    },
-    "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": {
-      "version": "8.25.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.25.0.tgz",
-      "integrity": "sha512-+vUe0Zb4tkNgznQwicsvLUJgZIRs6ITeWSCclX1q85pR1iOiaj+4uZJIUp//Z27QWu5Cseiw3O3AR8hVpax7Aw==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      }
-    },
-    "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": {
-      "version": "8.25.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.25.0.tgz",
-      "integrity": "sha512-ZPaiAKEZ6Blt/TPAx5Ot0EIB/yGtLI2EsGoY6F7XKklfMxYQyvtL+gT/UCqkMzO0BVFHLDlzvFqQzurYahxv9Q==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@typescript-eslint/types": "8.25.0",
-        "@typescript-eslint/visitor-keys": "8.25.0",
-        "debug": "^4.3.4",
-        "fast-glob": "^3.3.2",
-        "is-glob": "^4.0.3",
-        "minimatch": "^9.0.4",
-        "semver": "^7.6.0",
-        "ts-api-utils": "^2.0.1"
-      },
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      },
-      "peerDependencies": {
-        "typescript": ">=4.8.4 <5.8.0"
-      }
-    },
-    "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": {
-      "version": "8.25.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.25.0.tgz",
-      "integrity": "sha512-kCYXKAum9CecGVHGij7muybDfTS2sD3t0L4bJsEZLkyrXUImiCTq1M3LG2SRtOhiHFwMR9wAFplpT6XHYjTkwQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@typescript-eslint/types": "8.25.0",
-        "eslint-visitor-keys": "^4.2.0"
-      },
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      }
-    },
-    "node_modules/@typescript-eslint/utils/node_modules/eslint-visitor-keys": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
-      "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/eslint"
-      }
-    },
     "node_modules/@typescript-eslint/visitor-keys": {
       "version": "8.24.1",
       "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.1.tgz",
@@ -2295,14 +2007,14 @@
       }
     },
     "node_modules/@vitest/expect": {
-      "version": "3.0.7",
-      "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.7.tgz",
-      "integrity": "sha512-QP25f+YJhzPfHrHfYHtvRn+uvkCFCqFtW9CktfBxmB+25QqWsx7VB2As6f4GmwllHLDhXNHvqedwhvMmSnNmjw==",
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.6.tgz",
+      "integrity": "sha512-zBduHf/ja7/QRX4HdP1DSq5XrPgdN+jzLOwaTq/0qZjYfgETNFCKf9nOAp2j3hmom3oTbczuUzrzg9Hafh7hNg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@vitest/spy": "3.0.7",
-        "@vitest/utils": "3.0.7",
+        "@vitest/spy": "3.0.6",
+        "@vitest/utils": "3.0.6",
         "chai": "^5.2.0",
         "tinyrainbow": "^2.0.0"
       },
@@ -2311,13 +2023,13 @@
       }
     },
     "node_modules/@vitest/mocker": {
-      "version": "3.0.7",
-      "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.7.tgz",
-      "integrity": "sha512-qui+3BLz9Eonx4EAuR/i+QlCX6AUZ35taDQgwGkK/Tw6/WgwodSrjN1X2xf69IA/643ZX5zNKIn2svvtZDrs4w==",
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.6.tgz",
+      "integrity": "sha512-KPztr4/tn7qDGZfqlSPQoF2VgJcKxnDNhmfR3VgZ6Fy1bO8T9Fc1stUiTXtqz0yG24VpD00pZP5f8EOFknjNuQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@vitest/spy": "3.0.7",
+        "@vitest/spy": "3.0.6",
         "estree-walker": "^3.0.3",
         "magic-string": "^0.30.17"
       },
@@ -2338,9 +2050,9 @@
       }
     },
     "node_modules/@vitest/pretty-format": {
-      "version": "3.0.7",
-      "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.7.tgz",
-      "integrity": "sha512-CiRY0BViD/V8uwuEzz9Yapyao+M9M008/9oMOSQydwbwb+CMokEq3XVaF3XK/VWaOK0Jm9z7ENhybg70Gtxsmg==",
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.6.tgz",
+      "integrity": "sha512-Zyctv3dbNL+67qtHfRnUE/k8qxduOamRfAL1BurEIQSyOEFffoMvx2pnDSSbKAAVxY0Ej2J/GH2dQKI0W2JyVg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -2351,13 +2063,13 @@
       }
     },
     "node_modules/@vitest/runner": {
-      "version": "3.0.7",
-      "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.7.tgz",
-      "integrity": "sha512-WeEl38Z0S2ZcuRTeyYqaZtm4e26tq6ZFqh5y8YD9YxfWuu0OFiGFUbnxNynwLjNRHPsXyee2M9tV7YxOTPZl2g==",
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.6.tgz",
+      "integrity": "sha512-JopP4m/jGoaG1+CBqubV/5VMbi7L+NQCJTu1J1Pf6YaUbk7bZtaq5CX7p+8sY64Sjn1UQ1XJparHfcvTTdu9cA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@vitest/utils": "3.0.7",
+        "@vitest/utils": "3.0.6",
         "pathe": "^2.0.3"
       },
       "funding": {
@@ -2365,13 +2077,13 @@
       }
     },
     "node_modules/@vitest/snapshot": {
-      "version": "3.0.7",
-      "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.7.tgz",
-      "integrity": "sha512-eqTUryJWQN0Rtf5yqCGTQWsCFOQe4eNz5Twsu21xYEcnFJtMU5XvmG0vgebhdLlrHQTSq5p8vWHJIeJQV8ovsA==",
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.6.tgz",
+      "integrity": "sha512-qKSmxNQwT60kNwwJHMVwavvZsMGXWmngD023OHSgn873pV0lylK7dwBTfYP7e4URy5NiBCHHiQGA9DHkYkqRqg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@vitest/pretty-format": "3.0.7",
+        "@vitest/pretty-format": "3.0.6",
         "magic-string": "^0.30.17",
         "pathe": "^2.0.3"
       },
@@ -2380,9 +2092,9 @@
       }
     },
     "node_modules/@vitest/spy": {
-      "version": "3.0.7",
-      "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.7.tgz",
-      "integrity": "sha512-4T4WcsibB0B6hrKdAZTM37ekuyFZt2cGbEGd2+L0P8ov15J1/HUsUaqkXEQPNAWr4BtPPe1gI+FYfMHhEKfR8w==",
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.6.tgz",
+      "integrity": "sha512-HfOGx/bXtjy24fDlTOpgiAEJbRfFxoX3zIGagCqACkFKKZ/TTOE6gYMKXlqecvxEndKFuNHcHqP081ggZ2yM0Q==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -2393,13 +2105,13 @@
       }
     },
     "node_modules/@vitest/utils": {
-      "version": "3.0.7",
-      "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.7.tgz",
-      "integrity": "sha512-xePVpCRfooFX3rANQjwoditoXgWb1MaFbzmGuPP59MK6i13mrnDw/yEIyJudLeW6/38mCNcwCiJIGmpDPibAIg==",
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.6.tgz",
+      "integrity": "sha512-18ktZpf4GQFTbf9jK543uspU03Q2qya7ZGya5yiZ0Gx0nnnalBvd5ZBislbl2EhLjM8A8rt4OilqKG7QwcGkvQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@vitest/pretty-format": "3.0.7",
+        "@vitest/pretty-format": "3.0.6",
         "loupe": "^3.1.3",
         "tinyrainbow": "^2.0.0"
       },
@@ -3300,22 +3012,22 @@
       }
     },
     "node_modules/eslint": {
-      "version": "9.21.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.21.0.tgz",
-      "integrity": "sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg==",
+      "version": "9.20.1",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.20.1.tgz",
+      "integrity": "sha512-m1mM33o6dBUjxl2qb6wv6nGNwCAsns1eKtaQ4l/NPHeTvhiUPbtdfMyktxN4B3fgHIgsYh1VT3V9txblpQHq+g==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.2.0",
         "@eslint-community/regexpp": "^4.12.1",
-        "@eslint/config-array": "^0.19.2",
-        "@eslint/core": "^0.12.0",
-        "@eslint/eslintrc": "^3.3.0",
-        "@eslint/js": "9.21.0",
-        "@eslint/plugin-kit": "^0.2.7",
+        "@eslint/config-array": "^0.19.0",
+        "@eslint/core": "^0.11.0",
+        "@eslint/eslintrc": "^3.2.0",
+        "@eslint/js": "9.20.0",
+        "@eslint/plugin-kit": "^0.2.5",
         "@humanfs/node": "^0.16.6",
         "@humanwhocodes/module-importer": "^1.0.1",
-        "@humanwhocodes/retry": "^0.4.2",
+        "@humanwhocodes/retry": "^0.4.1",
         "@types/estree": "^1.0.6",
         "@types/json-schema": "^7.0.15",
         "ajv": "^6.12.4",
@@ -3360,9 +3072,9 @@
       }
     },
     "node_modules/eslint-config-prettier": {
-      "version": "10.0.2",
-      "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.0.2.tgz",
-      "integrity": "sha512-1105/17ZIMjmCOJOPNfVdbXafLCLj3hPmkmB7dLgt7XsQ/zkxSuDerE/xgO3RxoHysR1N1whmquY0lSn2O0VLg==",
+      "version": "10.0.1",
+      "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.0.1.tgz",
+      "integrity": "sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw==",
       "dev": true,
       "license": "MIT",
       "bin": {
@@ -3627,6 +3339,19 @@
         "url": "https://opencollective.com/eslint"
       }
     },
+    "node_modules/eslint/node_modules/@eslint/core": {
+      "version": "0.11.0",
+      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.11.0.tgz",
+      "integrity": "sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@types/json-schema": "^7.0.15"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      }
+    },
     "node_modules/eslint/node_modules/brace-expansion": {
       "version": "1.1.11",
       "dev": true,
@@ -5806,9 +5531,9 @@
       }
     },
     "node_modules/prettier": {
-      "version": "3.5.2",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.2.tgz",
-      "integrity": "sha512-lc6npv5PH7hVqozBR7lkBNOGXV9vMwROAPlumdBkX0wTbbzPu/U1hk5yL8p2pt4Xoc+2mkT8t/sow2YrV/M5qg==",
+      "version": "3.5.1",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.1.tgz",
+      "integrity": "sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw==",
       "dev": true,
       "license": "MIT",
       "bin": {
@@ -7010,15 +6735,15 @@
       }
     },
     "node_modules/typescript-eslint": {
-      "version": "8.25.0",
-      "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.25.0.tgz",
-      "integrity": "sha512-TxRdQQLH4g7JkoFlYG3caW5v1S6kEkz8rqt80iQJZUYPq1zD1Ra7HfQBJJ88ABRaMvHAXnwRvRB4V+6sQ9xN5Q==",
+      "version": "8.24.1",
+      "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.24.1.tgz",
+      "integrity": "sha512-cw3rEdzDqBs70TIcb0Gdzbt6h11BSs2pS0yaq7hDWDBtCCSei1pPSUXE9qUdQ/Wm9NgFg8mKtMt1b8fTHIl1jA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/eslint-plugin": "8.25.0",
-        "@typescript-eslint/parser": "8.25.0",
-        "@typescript-eslint/utils": "8.25.0"
+        "@typescript-eslint/eslint-plugin": "8.24.1",
+        "@typescript-eslint/parser": "8.24.1",
+        "@typescript-eslint/utils": "8.24.1"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -7193,9 +6918,9 @@
       }
     },
     "node_modules/vite-node": {
-      "version": "3.0.7",
-      "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.7.tgz",
-      "integrity": "sha512-2fX0QwX4GkkkpULXdT1Pf4q0tC1i1lFOyseKoonavXUNlQ77KpW2XqBGGNIm/J4Ows4KxgGJzDguYVPKwG/n5A==",
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.6.tgz",
+      "integrity": "sha512-s51RzrTkXKJrhNbUzQRsarjmAae7VmMPAsRT7lppVpIg6mK3zGthP9Hgz0YQQKuNcF+Ii7DfYk3Fxz40jRmePw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -7216,19 +6941,19 @@
       }
     },
     "node_modules/vitest": {
-      "version": "3.0.7",
-      "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.7.tgz",
-      "integrity": "sha512-IP7gPK3LS3Fvn44x30X1dM9vtawm0aesAa2yBIZ9vQf+qB69NXC5776+Qmcr7ohUXIQuLhk7xQR0aSUIDPqavg==",
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.6.tgz",
+      "integrity": "sha512-/iL1Sc5VeDZKPDe58oGK4HUFLhw6b5XdY1MYawjuSaDA4sEfYlY9HnS6aCEG26fX+MgUi7MwlduTBHHAI/OvMA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@vitest/expect": "3.0.7",
-        "@vitest/mocker": "3.0.7",
-        "@vitest/pretty-format": "^3.0.7",
-        "@vitest/runner": "3.0.7",
-        "@vitest/snapshot": "3.0.7",
-        "@vitest/spy": "3.0.7",
-        "@vitest/utils": "3.0.7",
+        "@vitest/expect": "3.0.6",
+        "@vitest/mocker": "3.0.6",
+        "@vitest/pretty-format": "^3.0.6",
+        "@vitest/runner": "3.0.6",
+        "@vitest/snapshot": "3.0.6",
+        "@vitest/spy": "3.0.6",
+        "@vitest/utils": "3.0.6",
         "chai": "^5.2.0",
         "debug": "^4.4.0",
         "expect-type": "^1.1.0",
@@ -7240,7 +6965,7 @@
         "tinypool": "^1.0.2",
         "tinyrainbow": "^2.0.0",
         "vite": "^5.0.0 || ^6.0.0",
-        "vite-node": "3.0.7",
+        "vite-node": "3.0.6",
         "why-is-node-running": "^2.3.0"
       },
       "bin": {
@@ -7256,8 +6981,8 @@
         "@edge-runtime/vm": "*",
         "@types/debug": "^4.1.12",
         "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
-        "@vitest/browser": "3.0.7",
-        "@vitest/ui": "3.0.7",
+        "@vitest/browser": "3.0.6",
+        "@vitest/ui": "3.0.6",
         "happy-dom": "*",
         "jsdom": "*"
       },
diff --git a/src/foundry/client-esm/canvas/tokens/ring.d.mts b/src/foundry/client-esm/canvas/tokens/ring.d.mts
index 48394a674..dfeb0743a 100644
--- a/src/foundry/client-esm/canvas/tokens/ring.d.mts
+++ b/src/foundry/client-esm/canvas/tokens/ring.d.mts
@@ -1,4 +1,4 @@
-import type { InitializedOn } from "fvtt-types/utils";
+import type { MaybeInitialized } from "../../../client/game.d.mts";
 
 /**
  * Dynamic Token Ring Manager.
@@ -13,7 +13,7 @@ declare class TokenRing {
   static effects: TokenRing.Effects;
 
   /** Is the token rings framework enabled? Will be `null` if the system hasn't initialized yet. */
-  static get initialized(): InitializedOn<boolean, "init">;
+  static get initialized(): MaybeInitialized<boolean, "init">;
 
   /** Token Rings sprite sheet base texture. */
   static baseTexture: PIXI.BaseTexture;
@@ -110,7 +110,7 @@ declare class TokenRing {
   colorBand: TokenRing.RingColorBand;
 
   /** Reference to the token that should be animated */
-  get token(): InitializedOn<Token.ConfiguredInstance, "init">;
+  get token(): MaybeInitialized<Token.ConfiguredInstance, "init">;
 
   /**
    * Configure the sprite mesh.
diff --git a/src/foundry/client/apps/sidebar/directory-tab-mixin.d.mts b/src/foundry/client/apps/sidebar/directory-tab-mixin.d.mts
index 124a6c1e7..c0ca0cbfa 100644
--- a/src/foundry/client/apps/sidebar/directory-tab-mixin.d.mts
+++ b/src/foundry/client/apps/sidebar/directory-tab-mixin.d.mts
@@ -46,7 +46,7 @@ declare class DirectoryApplication {
    */
   protected _matchSearchFolders(
     query: RegExp,
-    /** @immediate */ includeFolder: (folder: Folder.ConfiguredInstance, autoExpand?: boolean) => boolean,
+    includeFolder: (folder: Folder.ConfiguredInstance, autoExpand?: boolean) => boolean,
   ): void;
 
   /**
@@ -61,7 +61,7 @@ declare class DirectoryApplication {
     query: RegExp,
     entryIds: Set<string>,
     folderIds: Set<string>,
-    /** @immediate */ includeFolder: (folder: Folder.ConfiguredInstance, autoExpand?: boolean) => boolean,
+    includeFolder: (folder: Folder.ConfiguredInstance, autoExpand?: boolean) => boolean,
   ): void;
 
   /**
diff --git a/src/foundry/client/game.d.mts b/src/foundry/client/game.d.mts
index 8c24aa8e1..ab26c0f4f 100644
--- a/src/foundry/client/game.d.mts
+++ b/src/foundry/client/game.d.mts
@@ -1,31 +1,41 @@
 import type { Socket } from "socket.io-client";
-import type {
-  ConfiguredModule,
-  GetKey,
-  EmptyObject,
-  ValueOf,
-  FixedInstanceType,
-  InitializationHook,
-  InitializedOn,
-} from "fvtt-types/utils";
+import type { ConfiguredModule, GetKey, EmptyObject, ValueOf, FixedInstanceType } from "fvtt-types/utils";
 import type BasePackage from "../common/packages/base-package.d.mts";
 import type { Document } from "../common/abstract/module.d.mts";
 
+interface EarlierEvents {
+  none: never;
+  init: "none";
+  i18nInit: "none" | "init";
+  setup: "none" | "init" | "i18nInit";
+  ready: "none" | "init" | "i18nInit" | "setup";
+}
+
+type InitializationEvent = keyof EarlierEvents;
+
 // Must be called with all hooks in a union.
 // Do not increase the complexity of this type. If you do Game related types may get complex enough to complain about not being statically known.
-type SimpleInitializedOn<
-  InitializedTo,
-  MustRun extends InitializationHook,
-  RunHooks extends InitializationHook,
-  BeforeInitialization = undefined,
-> = Extract<RunHooks, MustRun> extends never ? BeforeInitialization : InitializedTo;
+type GameInitialized<Data, MustRun extends InitializationEvent, RunEvents extends InitializationEvent, D = undefined> =
+  Extract<RunEvents, MustRun> extends never ? D : Data;
+
+type HooksRan<T extends InitializationEvent> = EarlierEvents[T] | T;
+
+// May be called with just one hook.
+type MaybeInitialized<Data, MustRun extends InitializationEvent> = GameInitialized<
+  Data,
+  MustRun,
+  HooksRan<ValidHooksRan>,
+  Data | undefined
+>;
+
+type ValidHooksRan = Extract<keyof AssumeHookRan, InitializationEvent>;
 
 /**
  * @privateRemarks In v12 many of these properties were mistakenly stripped of their readonly quality;
  *                 This is preserved in the types despite them being technically writable.
  *                 See https://github.com/foundryvtt/foundryvtt/issues/11813
  */
-declare class InternalGame<RunEvents extends InitializationHook> {
+declare class InternalGame<RunEvents extends InitializationEvent> {
   /**
    * @param view      - The named view which is active for this game instance.
    * @param data      - An object of all the World data vended by the server when the client first connects
@@ -80,7 +90,7 @@ declare class InternalGame<RunEvents extends InitializationHook> {
    * A mapping of CompendiumCollection instances, one per Compendium pack.
    * @remarks Initialized just before the `"setup"` hook event is called.
    */
-  readonly packs: SimpleInitializedOn<CompendiumPacks, "setup", RunEvents>;
+  readonly packs: GameInitialized<CompendiumPacks, "setup", RunEvents>;
 
   /**
    * A registry of document sub-types and their respective data models.
@@ -104,7 +114,7 @@ declare class InternalGame<RunEvents extends InitializationHook> {
    * The global document index.
    * @remarks Initialized just before the `"setup"` hook event is called.
    */
-  readonly documentIndex: SimpleInitializedOn<DocumentIndex, "setup", RunEvents>;
+  readonly documentIndex: GameInitialized<DocumentIndex, "setup", RunEvents>;
 
   /**
    * The UUID redirects tree.
@@ -116,7 +126,7 @@ declare class InternalGame<RunEvents extends InitializationHook> {
    * A mapping of WorldCollection instances, one per primary Document type.
    * @remarks Initialized just before the `"setup"` hook event is called.
    */
-  readonly collections: SimpleInitializedOn<
+  readonly collections: GameInitialized<
     foundry.utils.Collection<WorldCollection<Document.AnyConstructor, string>>,
     "setup",
     RunEvents
@@ -126,73 +136,73 @@ declare class InternalGame<RunEvents extends InitializationHook> {
    * The collection of Actor documents which exists in the World.
    * @remarks Initialized just before the `"setup"` hook event.
    */
-  readonly actors: SimpleInitializedOn<ConfiguredCollectionClassForName<"Actor">, "setup", RunEvents>;
+  readonly actors: GameInitialized<ConfiguredCollectionClassForName<"Actor">, "setup", RunEvents>;
 
   /**
    * The collection of Cards documents which exists in the World.
    * @remarks Initialized just before the `"setup"` hook event.
    */
-  readonly cards: SimpleInitializedOn<ConfiguredCollectionClassForName<"Cards">, "setup", RunEvents>;
+  readonly cards: GameInitialized<ConfiguredCollectionClassForName<"Cards">, "setup", RunEvents>;
 
   /**
    * The collection of Combat documents which exists in the World.
    * @remarks Initialized just before the `"setup"` hook event.
    */
-  readonly combats: SimpleInitializedOn<ConfiguredCollectionClassForName<"Combat">, "setup", RunEvents>;
+  readonly combats: GameInitialized<ConfiguredCollectionClassForName<"Combat">, "setup", RunEvents>;
 
   /**
    * The collection of Folder documents which exists in the World.
    * @remarks Initialized just before the `"setup"` hook event.
    */
-  readonly folders: SimpleInitializedOn<ConfiguredCollectionClassForName<"Folder">, "setup", RunEvents>;
+  readonly folders: GameInitialized<ConfiguredCollectionClassForName<"Folder">, "setup", RunEvents>;
 
   /**
    * The collection of Item documents which exists in the World.
    * @remarks Initialized just before the `"setup"` hook event.
    */
-  readonly items: SimpleInitializedOn<ConfiguredCollectionClassForName<"Item">, "setup", RunEvents>;
+  readonly items: GameInitialized<ConfiguredCollectionClassForName<"Item">, "setup", RunEvents>;
 
   /**
    * The collection of JournalEntry documents which exists in the World.
    * @remarks Initialized just before the `"setup"` hook event.
    */
-  readonly journal: SimpleInitializedOn<ConfiguredCollectionClassForName<"JournalEntry">, "setup", RunEvents>;
+  readonly journal: GameInitialized<ConfiguredCollectionClassForName<"JournalEntry">, "setup", RunEvents>;
 
   /**
    * The collection of Macro documents which exists in the World.
    * @remarks Initialized just before the `"setup"` hook event.
    */
-  readonly macros: SimpleInitializedOn<ConfiguredCollectionClassForName<"Macro">, "setup", RunEvents>;
+  readonly macros: GameInitialized<ConfiguredCollectionClassForName<"Macro">, "setup", RunEvents>;
 
   /**
    * The collection of ChatMessage documents which exists in the World.
    * @remarks Initialized just before the `"setup"` hook event.
    */
-  readonly messages: SimpleInitializedOn<ConfiguredCollectionClassForName<"ChatMessage">, "setup", RunEvents>;
+  readonly messages: GameInitialized<ConfiguredCollectionClassForName<"ChatMessage">, "setup", RunEvents>;
 
   /**
    * The collection of Playlist documents which exists in the World.
    * @remarks Initialized just before the `"setup"` hook event.
    */
-  readonly playlists: SimpleInitializedOn<ConfiguredCollectionClassForName<"Playlist">, "setup", RunEvents>;
+  readonly playlists: GameInitialized<ConfiguredCollectionClassForName<"Playlist">, "setup", RunEvents>;
 
   /**
    * The collection of Scene documents which exists in the World.
    * @remarks Initialized just before the `"setup"` hook event.
    */
-  readonly scenes: SimpleInitializedOn<ConfiguredCollectionClassForName<"Scene">, "setup", RunEvents>;
+  readonly scenes: GameInitialized<ConfiguredCollectionClassForName<"Scene">, "setup", RunEvents>;
 
   /**
    * The collection of RollTable documents which exists in the World.
    * @remarks Initialized just before the `"setup"` hook event.
    */
-  readonly tables: SimpleInitializedOn<ConfiguredCollectionClassForName<"RollTable">, "setup", RunEvents>;
+  readonly tables: GameInitialized<ConfiguredCollectionClassForName<"RollTable">, "setup", RunEvents>;
 
   /**
    * The collection of User documents which exists in the World.
    * @remarks Initialized just before the `"setup"` hook event.
    */
-  readonly users: SimpleInitializedOn<ConfiguredCollectionClassForName<"User">, "setup", RunEvents>;
+  readonly users: GameInitialized<ConfiguredCollectionClassForName<"User">, "setup", RunEvents>;
 
   /**
    * The Release data for this version of Foundry
@@ -220,13 +230,13 @@ declare class InternalGame<RunEvents extends InitializationHook> {
    * The user role permissions setting
    * @remarks Initialized just before the `"setup"` hook event.
    */
-  readonly permissions: SimpleInitializedOn<Game.Permissions, "setup", RunEvents>;
+  readonly permissions: GameInitialized<Game.Permissions, "setup", RunEvents>;
 
   /**
    * A flag for whether the Game has successfully reached the "ready" hook
    * @defaultValue `false`
    */
-  readonly ready: SimpleInitializedOn<true, "ready", RunEvents, false>;
+  readonly ready: GameInitialized<true, "ready", RunEvents, false>;
 
   /**
    * The singleton compendium art manager.
@@ -243,7 +253,7 @@ declare class InternalGame<RunEvents extends InitializationHook> {
    * A singleton reference to the Canvas object which may be used.
    * @remarks Initialized just before the `"ready"` hook event.
    */
-  readonly canvas: SimpleInitializedOn<Canvas, "ready", RunEvents>;
+  readonly canvas: GameInitialized<Canvas, "ready", RunEvents>;
 
   /**
    * The singleton Clipboard Helper.
@@ -254,7 +264,7 @@ declare class InternalGame<RunEvents extends InitializationHook> {
    * Localization support
    * @remarks Initialized just before the `"i18nInit"` hook event.
    */
-  readonly i18n: SimpleInitializedOn<Localization, "i18nInit", RunEvents>;
+  readonly i18n: GameInitialized<Localization, "i18nInit", RunEvents>;
 
   /**
    * The singleton instance of the ClientIssues manager.
@@ -265,25 +275,25 @@ declare class InternalGame<RunEvents extends InitializationHook> {
    * The Gamepad Manager
    * @remarks Initialized just before the `"ready"` hook event.
    */
-  readonly gamepad: SimpleInitializedOn<GamepadManager, "ready", RunEvents>;
+  readonly gamepad: GameInitialized<GamepadManager, "ready", RunEvents>;
 
   /**
    * The Keyboard Manager
    * @remarks Initialized just before the `"ready"` hook event.
    */
-  readonly keyboard: SimpleInitializedOn<KeyboardManager, "ready", RunEvents>;
+  readonly keyboard: GameInitialized<KeyboardManager, "ready", RunEvents>;
 
   /**
    * Client keybindings which are used to configure application behavior
    * @remarks Initialized just before the `"ready"` hook event.
    */
-  readonly keybindings: SimpleInitializedOn<ClientKeybindings, "ready", RunEvents>;
+  readonly keybindings: GameInitialized<ClientKeybindings, "ready", RunEvents>;
 
   /**
    * The Mouse Manager
    * @remarks Initialized just before the `"ready"` hook event.
    */
-  readonly mouse: SimpleInitializedOn<MouseManager, "ready", RunEvents>;
+  readonly mouse: GameInitialized<MouseManager, "ready", RunEvents>;
 
   /**
    * The New User Experience manager.
@@ -306,19 +316,19 @@ declare class InternalGame<RunEvents extends InitializationHook> {
    * A singleton instance of the TooltipManager class
    * @remarks Initialized just before the `"setup"` hook events is called.
    */
-  readonly tooltip: SimpleInitializedOn<TooltipManager, "setup", RunEvents>;
+  readonly tooltip: GameInitialized<TooltipManager, "setup", RunEvents>;
 
   /**
    * A singleton instance of the Tour collection class
    * @remarks Initialized just before the `"setup"` hook events is called.
    */
-  readonly tours: SimpleInitializedOn<Tours, "setup", RunEvents>;
+  readonly tours: GameInitialized<Tours, "setup", RunEvents>;
 
   /**
    * A singleton instance of the Video Helper class
    * @remarks Initialized just before the `"setup"` hook events is called.
    */
-  readonly video: SimpleInitializedOn<VideoHelper, "setup", RunEvents>;
+  readonly video: GameInitialized<VideoHelper, "setup", RunEvents>;
 
   /**
    * A singleton web Worker manager.
@@ -416,7 +426,7 @@ declare class InternalGame<RunEvents extends InitializationHook> {
   /**
    * @remarks Initialized just before the `"ready"` hook event.
    */
-  webrtc: SimpleInitializedOn<AVMaster, "ready", RunEvents>;
+  webrtc: GameInitialized<AVMaster, "ready", RunEvents>;
 
   /**
    * Initialize core UI elements
@@ -463,7 +473,7 @@ declare class InternalGame<RunEvents extends InitializationHook> {
    *
    * @remarks Initialized just before the `"setup"` hook event.
    */
-  get user(): SimpleInitializedOn<Document.Stored<User.ConfiguredInstance>, "setup", RunEvents, null>;
+  get user(): GameInitialized<Document.Stored<User.ConfiguredInstance>, "setup", RunEvents, null>;
 
   /**
    * A convenience accessor for the currently viewed Combat encounter
@@ -761,13 +771,13 @@ declare global {
    * @defaultValue `undefined`
    * Initialized just before the `"init"` hook event.
    */
-  let canvas: InitializedOn<Canvas, "init">;
+  let canvas: MaybeInitialized<Canvas, "init">;
 
   /**
    * @defaultValue `undefined`
    * Initialized just before the `"ready"` hook event.
    */
-  let keyboard: InitializedOn<KeyboardManager, "ready">;
+  let keyboard: MaybeInitialized<KeyboardManager, "ready">;
 }
 
 type ConfiguredCollectionClassForName<Name extends foundry.CONST.WORLD_DOCUMENT_TYPES> = FixedInstanceType<
diff --git a/src/foundry/client/head.d.mts b/src/foundry/client/head.d.mts
index 310dbe9ee..9c9ece9d9 100644
--- a/src/foundry/client/head.d.mts
+++ b/src/foundry/client/head.d.mts
@@ -1,6 +1,7 @@
-import type { HooksRan, FixedInstanceType, InitializationHook } from "fvtt-types/utils";
+import type { FixedInstanceType } from "fvtt-types/utils";
+import type { EarlierEvents, InitializationEvent } from "./game.d.mts";
 
-type ValidRanHooks = Extract<keyof AssumeHookRan, InitializationHook>;
+type ValidRanHooks = Extract<keyof AssumeHookRan, InitializationEvent>;
 
 type _UninitializedGame = { [K in keyof Game]?: never };
 
@@ -16,7 +17,7 @@ interface Games {
 }
 
 // Needs to include the current hook as well as all hooks that can run after it.
-type GameHooks = Exclude<InitializationHook, HooksRan<ValidRanHooks>>;
+type GameHooks = Exclude<InitializationEvent, EarlierEvents[ValidRanHooks]>;
 
 type MaybeUI = Extract<ValidRanHooks, "ready"> extends never ? Partial<UiApplications> : UiApplications;
 
diff --git a/src/foundry/client/pixi/core/interaction/render-flags.d.mts b/src/foundry/client/pixi/core/interaction/render-flags.d.mts
index 31344c030..c647b1b16 100644
--- a/src/foundry/client/pixi/core/interaction/render-flags.d.mts
+++ b/src/foundry/client/pixi/core/interaction/render-flags.d.mts
@@ -1,4 +1,4 @@
-import type { AnyConstructor, FixedInstanceType, InexactPartial, Mixin } from "fvtt-types/utils";
+import type { AnyConstructor, ConcreteKeys, FixedInstanceType, InexactPartial, Mixin } from "fvtt-types/utils";
 import type { LogCompatibilityWarningOptions } from "../../../../common/utils/logging.d.mts";
 
 declare class RenderFlagObject {
@@ -9,7 +9,7 @@ declare class RenderFlagObject {
    * Configure the render flags used for this class.
    * @defaultValue `{}`
    */
-  static RENDER_FLAGS: Record<string, RenderFlag.Any>;
+  static RENDER_FLAGS: RenderFlagsMixin.RENDER_FLAGS;
 
   /**
    * The ticker priority when RenderFlags of this class are handled.
@@ -35,12 +35,16 @@ declare class RenderFlagObject {
  * @privateRemarks Values are marked as optional here based on use, foundry docs incomplete
  * @internal
  */
-type _RenderFlags<Flags> = InexactPartial<{
-  /** Activating this flag also sets these flags to true */
-  propagate: Array<keyof Flags>;
+type _RenderFlags<Flags extends object> = InexactPartial<{
+  /**
+   * Activating this flag also sets these flags to true
+   */
+  propagate: ConcreteKeys<Flags>[];
 
-  /** Activating this flag resets these flags to false */
-  reset: Array<keyof Flags>;
+  /**
+   * Activating this flag resets these flags to false
+   */
+  reset: ConcreteKeys<Flags>[];
 
   /**
    * Is this flag deprecated? The deprecation options are passed to
@@ -60,10 +64,10 @@ type _RenderFlags<Flags> = InexactPartial<{
 }>;
 
 declare global {
-  // @ts-expect-error - RenderFlag is built around willfully violating subclassing rules.
-  // The primary issue at hand is that each value can refer to the keys, thus making it technically
-  // unsound to apply a subclass to its superclass.
-  interface RenderFlag<out Flags> extends _RenderFlags<Flags> {}
+  // Note(LukeAbby): The usage of `ConcreteKeys` is a hazard; if tsc were to become smarter it might
+  // notice that `ConcreteKeys<Flags>` is actually contravariant and reject this type. However
+  // `RenderFlags` is built upon the assumption this is only used in safe ways.
+  interface RenderFlag<out Flags extends object> extends _RenderFlags<Flags> {}
 
   namespace RenderFlag {
     type Any = RenderFlag<any>;
@@ -89,7 +93,7 @@ declare global {
          * Valid options are OBJECTS or PERCEPTION.
          * @defaultValue `PIXI.UPDATE_PRIORITY.OBJECTS`
          */
-        priority?: PIXI.UPDATE_PRIORITY;
+        priority?: typeof PIXI.UPDATE_PRIORITY.OBJECTS | typeof PIXI.UPDATE_PRIORITY.PERCEPTION;
       },
     );
 
@@ -112,8 +116,9 @@ declare global {
 
     /**
      * Activate certain flags, also toggling propagation and reset behaviors
+     * @remarks Flags are only set if `true`, nullish values are discarded
      */
-    set(changes: Record<string, boolean>): void;
+    set(changes: Record<string, boolean | undefined | null>): void;
   }
 
   /**
@@ -131,5 +136,17 @@ declare global {
     interface AnyMixed extends FixedInstanceType<AnyMixedConstructor> {}
 
     type BaseClass = AnyConstructor;
+
+    type RENDER_FLAGS = Record<string, RenderFlag<object>>;
+
+    /**
+     * @internal This type exists only to make sure `ToBooleanFlags` isn't a homomorphic mapped type
+     * to avoid keeping documentation.
+     */
+    type _KeyOf<T> = keyof T;
+
+    type ToBooleanFlags<RenderFlags extends object> = {
+      [K in _KeyOf<RenderFlags>]: boolean;
+    };
   }
 }
diff --git a/src/foundry/client/pixi/perception/perception-manager.d.mts b/src/foundry/client/pixi/perception/perception-manager.d.mts
index 61f794f91..2d8c47130 100644
--- a/src/foundry/client/pixi/perception/perception-manager.d.mts
+++ b/src/foundry/client/pixi/perception/perception-manager.d.mts
@@ -1,117 +1,13 @@
-export {};
+import type { NullishProps } from "../../../../utils/index.d.mts";
 
 declare global {
-  interface PerceptionManagerFlags {
-    /**
-     * Re-initialize the entire lighting configuration. An aggregate behavior
-     * which does no work directly but propagates to set several other flags.
-     */
-    initializeLighting: boolean;
-
-    /** Re-initialize the entire vision configuration. See {@link CanvasVisibility#initializeSources}. */
-    initializeVision: boolean;
-
-    /** Re-initialize the entire vision modes. See {@link CanvasVisibility#initializeVisionMode}. */
-    initializeVisionModes: boolean;
-
-    /** Re-initialize the entire ambient sound configuration. See {@link SoundsLayer#initializeSources}. */
-    initializeSounds: boolean;
-
-    /** Recompute intersections between all registered edges. See {@link CanvasEdges#refresh}. */
-    refreshEdges: boolean;
-
-    /** Refresh the rendered appearance of lighting */
-    refreshLighting: boolean;
-
-    /** Update the configuration of light sources */
-    refreshLightSources: boolean;
-
-    /** Refresh occlusion */
-    refreshOcclusion: boolean;
-
-    /** Refresh the contents of the PrimaryCanvasGroup mesh */
-    refreshPrimary: boolean;
-
-    /** Refresh the audio state of ambient sounds */
-    refreshSounds: boolean;
-
-    /** Refresh the rendered appearance of vision */
-    refreshVision: boolean;
-
-    /** Update the configuration of vision sources */
-    refreshVisionSources: boolean;
-
-    /** Apply a fade duration to sound refresh workflow */
-    soundFadeDuration: boolean;
-  }
-
   /**
    * A helper class which manages the refresh workflow for perception layers on the canvas.
    * This controls the logic which batches multiple requested updates to minimize the amount of work required.
    * A singleton instance is available as {@link Canvas#perception}.
    */
   class PerceptionManager extends RenderFlagsMixin(Object) {
-    static RENDER_FLAGS: {
-      /** @defaultValue `{}` */
-      refreshEdges: RenderFlag<PerceptionManagerFlags>;
-
-      /** @defaultValue `{propagate: ["refreshLighting", "refreshVision"]}` */
-      initializeLighting: RenderFlag<PerceptionManagerFlags>;
-
-      /** @defaultValue `{propagate: ["refreshLighting", "refreshVision", "refreshEdges"]}` */
-      initializeDarknessSources: RenderFlag<PerceptionManagerFlags>;
-
-      /** @defaultValue `{propagate: ["refreshLighting", "refreshVision"]}` */
-      initializeLightSources: RenderFlag<PerceptionManagerFlags>;
-
-      /** @defaultValue `{propagate: ["refreshLightSources"]}` */
-      refreshLighting: RenderFlag<PerceptionManagerFlags>;
-
-      /** @defaultValue `{}` */
-      refreshLightSources: RenderFlag<PerceptionManagerFlags>;
-
-      /** @defaultValue `{propagate: ["refreshVisionSources", "refreshLighting", "refreshPrimary"]}` */
-      initializeVisionModes: RenderFlag<PerceptionManagerFlags>;
-
-      /** @defaultValue `{propagate: ["refreshVision", "refreshTiles", "refreshLighting", "refreshLightSources", "refreshPrimary"]}` */
-      initializeVision: RenderFlag<PerceptionManagerFlags>;
-
-      /** @defaultValue `{propagate: ["refreshVisionSources", "refreshOcclusionMask"]}` */
-      refreshVision: RenderFlag<PerceptionManagerFlags>;
-
-      /** @defaultValue `{}` */
-      refreshVisionSources: RenderFlag<PerceptionManagerFlags>;
-
-      /** @defaultValue `{}` */
-      refreshPrimary: RenderFlag<PerceptionManagerFlags>;
-
-      /** `{propagate: ["refreshOcclusionStates", "refreshOcclusionMask"]}` */
-      refreshOcclusion: RenderFlag<PerceptionManagerFlags>;
-
-      /** @defaultValue `{}` */
-      refreshOcclusionStates: RenderFlag<PerceptionManagerFlags>;
-
-      /** @defaultValue `{}` */
-      refreshOcclusionMask: RenderFlag<PerceptionManagerFlags>;
-
-      /** @defaultValue `{ propagate: ["refreshSounds"] }` */
-      initializeSounds: RenderFlag<PerceptionManagerFlags>;
-
-      /** @defaultValue `{}` */
-      refreshSounds: RenderFlag<PerceptionManagerFlags>;
-
-      /** @defaultValue `{}` */
-      soundFadeDuration: RenderFlag<PerceptionManagerFlags>;
-
-      /** @deprecated since v12, will be removed in v14 */
-      refreshTiles: RenderFlag<PerceptionManagerFlags>;
-
-      /** @deprecated since v12, will be removed in v14 */
-      identifyInteriorWalls: RenderFlag<PerceptionManagerFlags>;
-
-      /** @deprecated since v12, will be removed in v14 */
-      forceUpdateFog: RenderFlag<PerceptionManagerFlags>;
-    };
+    static RENDER_FLAGS: PerceptionManager.RENDER_FLAGS;
 
     static RENDER_FLAG_PRIORITY: "PERCEPTION";
 
@@ -121,47 +17,142 @@ declare global {
      * Update perception manager flags which configure which behaviors occur on the next frame render.
      * @param flags - Flag values (true) to assign where the keys belong to PerceptionManager.FLAGS
      */
-    update(flags: Partial<PerceptionManagerFlags>): void;
+    update(flags: PerceptionManager.PassableFlags): void;
 
     /**
      * A helper function to perform an immediate initialization plus incremental refresh.
      */
-    initialize(): ReturnType<this["update"]>;
+    initialize(): void;
 
     /**
      * @deprecated since v12, will be removed in v14
-     * @remarks `"PerceptionManager#refresh is deprecated in favor of assigning granular "refresh flags"`
-     */
-    refresh(): ReturnType<this["update"]>;
-
-    /**
-     * @deprecated since v11, will be removed in v13
-     * @remarks forceUpdateFog flag is now obsolete and has no replacement. The fog is now always updated when the visibility is refreshed
+     * @remarks "PerceptionManager#refresh is deprecated in favor of assigning granular \"refresh flags\""
      */
-    static forceUpdateFog(): void;
+    refresh(): void;
   }
 
   namespace PerceptionManager {
-    /** @deprecated Old flag structure */
-    interface Options {
-      lighting: {
-        initialize: boolean;
-        refresh: boolean;
-      };
-      sight: {
-        initialize: boolean;
-        refresh: boolean;
-        skipUpdateFog: boolean;
-        forceUpdateFog: boolean;
-      };
-      sounds: {
-        initialize: boolean;
-        refresh: boolean;
-        fade: boolean;
-      };
-      foreground: {
-        refresh: boolean;
-      };
+    interface Any extends AnyPerceptionManager {}
+    type AnyConstructor = typeof AnyPerceptionManager;
+
+    type PassableFlags = NullishProps<RenderFlags>;
+
+    type RenderFlags = RenderFlagsMixin.ToBooleanFlags<RENDER_FLAGS>;
+
+    interface RENDER_FLAGS extends RenderFlagsMixin.RENDER_FLAGS {
+      /**
+       * Recompute intersections between all registered edges. See {@link CanvasEdges#refresh}.
+       * @defaultValue `{}`
+       */
+      refreshEdges: RenderFlag<PerceptionManager.RenderFlags>;
+
+      /**
+       * Re-initialize the entire lighting configuration. An aggregate behavior
+       * which does no work directly but propagates to set several other flags.
+       * @defaultValue `{ propagate: ["initializeDarknessSources", "initializeLightSources"] }`
+       */
+      initializeLighting: RenderFlag<PerceptionManager.RenderFlags>;
+
+      /** @defaultValue `{ propagate: ["refreshLighting", "refreshVision", "refreshEdges"] }` */
+      initializeDarknessSources: RenderFlag<PerceptionManager.RenderFlags>;
+
+      /** @defaultValue `{ propagate: ["refreshLighting", "refreshVision"] }` */
+      initializeLightSources: RenderFlag<PerceptionManager.RenderFlags>;
+
+      /**
+       * Refresh the rendered appearance of lighting
+       * @defaultValue `{ propagate: ["refreshLightSources"] }`
+       */
+      refreshLighting: RenderFlag<PerceptionManager.RenderFlags>;
+
+      /**
+       * Update the configuration of light sources
+       * @defaultValue `{}`
+       */
+      refreshLightSources: RenderFlag<PerceptionManager.RenderFlags>;
+
+      /**
+       * Re-initialize the entire vision modes. See {@link CanvasVisibility#initializeVisionMode}.
+       * @defaultValue `{ propagate: ["refreshVisionSources", "refreshLighting", "refreshPrimary"] }`
+       */
+      initializeVisionModes: RenderFlag<PerceptionManager.RenderFlags>;
+
+      /**
+       * Re-initialize the entire vision configuration. See {@link CanvasVisibility#initializeSources}.
+       * @defaultValue `{ propagate: ["initializeVisionModes", "refreshVision"] }`
+       */
+      initializeVision: RenderFlag<PerceptionManager.RenderFlags>;
+
+      /**
+       * Refresh the rendered appearance of vision
+       * @defaultValue `{ propagate: ["refreshVisionSources", "refreshOcclusionMask"] }`
+       */
+      refreshVision: RenderFlag<PerceptionManager.RenderFlags>;
+
+      /**
+       * Update the configuration of vision sources
+       * @defaultValue `{}`
+       */
+      refreshVisionSources: RenderFlag<PerceptionManager.RenderFlags>;
+
+      /**
+       * Refresh the contents of the PrimaryCanvasGroup mesh
+       * @defaultValue `{}`
+       */
+      refreshPrimary: RenderFlag<PerceptionManager.RenderFlags>;
+
+      /**
+       * Refresh occlusion
+       * @defaultValue `{propagate: ["refreshOcclusionStates", "refreshOcclusionMask"] }`
+       */
+      refreshOcclusion: RenderFlag<PerceptionManager.RenderFlags>;
+
+      /** @defaultValue `{}` */
+      refreshOcclusionStates: RenderFlag<PerceptionManager.RenderFlags>;
+
+      /** @defaultValue `{}` */
+      refreshOcclusionMask: RenderFlag<PerceptionManager.RenderFlags>;
+
+      /**
+       * Re-initialize the entire ambient sound configuration. See {@link SoundsLayer#initializeSources}.
+       * @defaultValue `{ propagate: ["refreshSounds"] }`
+       */
+      initializeSounds: RenderFlag<PerceptionManager.RenderFlags>;
+
+      /**
+       * Refresh the audio state of ambient sounds
+       * @defaultValue `{}`
+       */
+      refreshSounds: RenderFlag<PerceptionManager.RenderFlags>;
+
+      /**
+       * Apply a fade duration to sound refresh workflow
+       * @defaultValue `{}`
+       */
+      soundFadeDuration: RenderFlag<PerceptionManager.RenderFlags>;
+
+      /**
+       * @defaultValue `{ propagate: ["refreshOcclusion"] }`
+       * @deprecated since v12, will be removed in v14
+       */
+      refreshTiles: RenderFlag<PerceptionManager.RenderFlags>;
+
+      /**
+       * @defaultValue `{ propagate: ["initializeLighting", "initializeVision"] }`
+       * @deprecated since v12, will be removed in v14
+       */
+      identifyInteriorWalls: RenderFlag<PerceptionManager.RenderFlags>;
+
+      /**
+       * @defaultValue `{ propagate: ["refreshVision"] }`
+       * @deprecated since v11, will be removed in v13
+       * @remarks In v12 the flag remains, but the static method it would have triggered was removed prematurely (was listed as until v13 in v11)
+       */
+      forceUpdateFog: RenderFlag<PerceptionManager.RenderFlags>;
     }
   }
 }
+
+declare abstract class AnyPerceptionManager extends PerceptionManager {
+  constructor(arg0: never, ...args: never[]);
+}
diff --git a/src/foundry/client/pixi/placeable.d.mts b/src/foundry/client/pixi/placeable.d.mts
index 8f3b1b542..534309c24 100644
--- a/src/foundry/client/pixi/placeable.d.mts
+++ b/src/foundry/client/pixi/placeable.d.mts
@@ -1,4 +1,4 @@
-import type { MakeConform, ValueOf } from "fvtt-types/utils";
+import type { InterfaceToObject, MakeConform, ValueOf } from "fvtt-types/utils";
 import type ApplicationV2 from "../../client-esm/applications/api/application.d.mts";
 import type { Document } from "../../common/abstract/module.d.mts";
 
@@ -55,16 +55,7 @@ declare global {
     /**
      * The flags declared here are required for all PlaceableObject subclasses to also support.
      */
-    static override RENDER_FLAGS: {
-      /** @defaultValue `{ propagate: ["refresh"] }` */
-      redraw: RenderFlag<PlaceableObject.RenderFlags>;
-
-      /** @defaultValue `{ propagate: ["refreshState"], alias: true }` */
-      refresh: RenderFlag<PlaceableObject.RenderFlags>;
-
-      /** @defaultValue `{}` */
-      refreshState: RenderFlag<PlaceableObject.RenderFlags>;
-    };
+    static override RENDER_FLAGS: InterfaceToObject<PlaceableObject.RENDER_FLAGS>;
 
     /**
      * The object that this object is a preview of if this object is a preview
@@ -574,12 +565,17 @@ declare global {
 
     type AnyConstructor = typeof AnyPlaceableObject;
 
-    interface RenderFlags {
-      redraw: boolean;
+    type RenderFlags = RenderFlagsMixin.ToBooleanFlags<RENDER_FLAGS>;
 
-      refresh: boolean;
+    interface RENDER_FLAGS {
+      /** @defaultValue `{ propagate: ["refresh"] }` */
+      redraw: RenderFlag<this>;
+
+      /** @defaultValue `{ propagate: ["refreshState"], alias: true }` */
+      refresh: RenderFlag<this>;
 
-      refreshState: boolean;
+      /** @defaultValue `{}` */
+      refreshState: RenderFlag<this>;
     }
 
     interface ControlOptions {
diff --git a/src/foundry/client/pixi/placeables/drawing.d.mts b/src/foundry/client/pixi/placeables/drawing.d.mts
index cf3256d85..62b279207 100644
--- a/src/foundry/client/pixi/placeables/drawing.d.mts
+++ b/src/foundry/client/pixi/placeables/drawing.d.mts
@@ -6,16 +6,31 @@ declare global {
     type ConfiguredClass = ConfiguredObjectClassOrDefault<typeof Drawing>;
     type ConfiguredInstance = FixedInstanceType<ConfiguredClass>;
 
-    interface RenderFlags extends PlaceableObject.RenderFlags {
-      refreshShape: boolean;
+    interface RENDER_FLAGS {
+      /** @defaultValue `{ propagate: ["refresh"] }` */
+      redraw: RenderFlag<this>;
+
+      /** @defaultValue `{ propagate: ["refreshState", "refreshShape"], alias: true }` */
+      refresh: RenderFlag<this>;
+
+      /** @defaultValue `{ propagate: ["refreshFrame"] }` */
+      refreshState: RenderFlag<this>;
+
+      /** @defaultValue `{ propagate: ["refreshFrame", "refreshText", "refreshMesh"] }` */
+      refreshShape: RenderFlag<this>;
 
-      refreshFrame: boolean;
+      /** @defaultValue `{}` */
+      refreshFrame: RenderFlag<this>;
 
-      refreshText: boolean;
+      /** @defaultValue `{}` */
+      refreshText: RenderFlag<this>;
 
-      refreshMesh: boolean;
+      /** @defaultValue `{}` */
+      refreshMesh: RenderFlag<this>;
     }
 
+    interface RenderFlags extends RenderFlagsMixin.ToBooleanFlags<RENDER_FLAGS> {}
+
     interface TextEditingOptions {
       forceTextEditing?: boolean;
 
@@ -70,28 +85,7 @@ declare global {
 
     static override embeddedName: "Drawing";
 
-    static override RENDER_FLAGS: {
-      /** @defaultValue `{ propagate: ["refresh"] }` */
-      redraw: RenderFlag<Drawing.RenderFlags>;
-
-      /** @defaultValue `{ propagate: ["refreshState", "refreshShape"], alias: true }` */
-      refresh: RenderFlag<Drawing.RenderFlags>;
-
-      /** @defaultValue `{ propagate: ["refreshFrame"] }` */
-      refreshState: RenderFlag<Drawing.RenderFlags>;
-
-      /** @defaultValue `{ propagate: ["refreshFrame", "refreshText", "refreshMesh"] }` */
-      refreshShape: RenderFlag<Drawing.RenderFlags>;
-
-      /** @defaultValue `{}` */
-      refreshFrame: RenderFlag<Drawing.RenderFlags>;
-
-      /** @defaultValue `{}` */
-      refreshText: RenderFlag<Drawing.RenderFlags>;
-
-      /** @defaultValue `{}` */
-      refreshMesh: RenderFlag<Drawing.RenderFlags>;
-    };
+    static override RENDER_FLAGS: Drawing.RENDER_FLAGS;
 
     /**
      * The rate at which points are sampled (in milliseconds) during a freehand drawing workflow
diff --git a/src/foundry/client/pixi/placeables/light.d.mts b/src/foundry/client/pixi/placeables/light.d.mts
index cad44bbb0..bf103ce2a 100644
--- a/src/foundry/client/pixi/placeables/light.d.mts
+++ b/src/foundry/client/pixi/placeables/light.d.mts
@@ -9,11 +9,15 @@ declare global {
     type ConfiguredClass = ConfiguredObjectClassOrDefault<typeof AmbientLight>;
     type ConfiguredInstance = FixedInstanceType<ConfiguredClass>;
 
-    interface RenderFlags extends PlaceableObject.RenderFlags {
-      refreshField: boolean;
+    interface RENDER_FLAGS extends PlaceableObject.RENDER_FLAGS {
+      /** @defaultValue `{ propagate: ["refreshPosition", "refreshState"] }` */
+      refreshField: RenderFlag<this>;
 
-      refreshPosition: boolean;
+      /** @defaultValue `{}` */
+      refreshPosition: RenderFlag<this>;
     }
+
+    interface RenderFlags extends RenderFlagsMixin.ToBooleanFlags<RENDER_FLAGS> {}
   }
 
   /**
@@ -37,22 +41,7 @@ declare global {
 
     static override embeddedName: "AmbientLight";
 
-    static override RENDER_FLAGS: {
-      /** @defaultValue `{ propagate: ["refresh"] }` */
-      redraw: RenderFlag<AmbientLight.RenderFlags>;
-
-      /** @defaultValue `{ propagate: ["refreshField"], alias: true }` */
-      refresh: RenderFlag<AmbientLight.RenderFlags>;
-
-      /** @defaultValue `{ propagate: ["refreshPosition", "refreshState"] }` */
-      refreshField: RenderFlag<AmbientLight.RenderFlags>;
-
-      /** @defaultValue `{}` */
-      refreshPosition: RenderFlag<AmbientLight.RenderFlags>;
-
-      /** @defaultValue `{}` */
-      refreshState: RenderFlag<AmbientLight.RenderFlags>;
-    };
+    static override RENDER_FLAGS: AmbientLight.RENDER_FLAGS;
 
     override get bounds(): PIXI.Rectangle;
 
diff --git a/src/foundry/client/pixi/placeables/note.d.mts b/src/foundry/client/pixi/placeables/note.d.mts
index 3f3a095e4..f51413d30 100644
--- a/src/foundry/client/pixi/placeables/note.d.mts
+++ b/src/foundry/client/pixi/placeables/note.d.mts
@@ -6,13 +6,36 @@ declare global {
     type ConfiguredClass = ConfiguredObjectClassOrDefault<typeof Note>;
     type ConfiguredInstance = FixedInstanceType<ConfiguredClass>;
 
-    interface RenderFlags extends PlaceableObject.RenderFlags {
-      refreshPosition: boolean;
+    interface RENDER_FLAGS extends PlaceableObject.RENDER_FLAGS {
+      /** @defaultValue `{ propagate: ["refresh"] }` */
+      redraw: RenderFlag<this>;
+
+      /** @defaultValue `{ propagate: ["refreshState", "refreshPosition", "refreshTooltip", "refreshElevation"]; alias: true }` */
+      refresh: RenderFlag<this>;
+
+      /** @defaultValue `{ propagate: ["refreshVisibility"] }` */
+      refreshState: RenderFlag<this>;
+
+      /** @defaultValue `{}` */
+      refreshVisibility: RenderFlag<this>;
 
-      refreshVisibility: boolean;
+      /** @defaultValue `{}` */
+      refreshPosition: RenderFlag<this>;
+
+      /** @defaultValue `{}` */
+      refreshTooltip: RenderFlag<this>;
+
+      /** @defaultValue `{ propagate: ["refreshVisibility"] }` */
+      refreshElevation: RenderFlag<this>;
 
-      refreshText: boolean;
+      /**
+       * @defaultValue `{ propagate: ["refreshTooltip"]; deprecated: { since: 12; until: 14 }; alias: true }`
+       * @deprecated since v12
+       */
+      refreshText: RenderFlag<this>;
     }
+
+    interface RenderFlags extends RenderFlagsMixin.ToBooleanFlags<RENDER_FLAGS> {}
   }
 
   /**
@@ -24,25 +47,7 @@ declare global {
   class Note extends PlaceableObject<NoteDocument.ConfiguredInstance> {
     static override embeddedName: "Note";
 
-    static override RENDER_FLAGS: {
-      /** @defaultValue `{ propagate: ["refresh"] }` */
-      redraw: RenderFlag<Note.RenderFlags>;
-
-      /** @defaultValue `{ propagate: ["refreshState", "refreshPosition", "refreshText"], alias: true }` */
-      refresh: RenderFlag<Note.RenderFlags>;
-
-      /** @defaultValue `{ propagate: ["refreshVisibility"] }` */
-      refreshPosition: RenderFlag<Note.RenderFlags>;
-
-      /** @defaultValue `{ propagate: ["refreshVisibility"] }` */
-      refreshState: RenderFlag<Note.RenderFlags>;
-
-      /** @defaultValue `{}` */
-      refreshVisibility: RenderFlag<Note.RenderFlags>;
-
-      /** @defaultValue `{}` */
-      refreshText: RenderFlag<Note.RenderFlags>;
-    };
+    static override RENDER_FLAGS: Note.RENDER_FLAGS;
 
     override get bounds(): PIXI.Rectangle;
 
diff --git a/src/foundry/client/pixi/placeables/region.d.mts b/src/foundry/client/pixi/placeables/region.d.mts
index 0712423ce..0475795d5 100644
--- a/src/foundry/client/pixi/placeables/region.d.mts
+++ b/src/foundry/client/pixi/placeables/region.d.mts
@@ -10,7 +10,21 @@ declare global {
     type ConfiguredClass = ConfiguredObjectClassOrDefault<typeof Region>;
     type ConfiguredInstance = FixedInstanceType<ConfiguredClass>;
 
-    interface RenderFlags extends PlaceableObject.RenderFlags {}
+    interface RENDER_FLAGS {
+      /** @defaultValue `{ propagate: ["refresh"] }` */
+      redraw: RenderFlag<this>;
+
+      /** @defaultValue `{ propagate: ["refreshState", "refreshBorder"]; alias: true }` */
+      refresh: RenderFlag<this>;
+
+      /** @defaultValue `{}` */
+      refreshState: RenderFlag<this>;
+
+      /** @defaultValue `{}` */
+      refreshBorder: RenderFlag<this>;
+    }
+
+    interface RenderFlags extends RenderFlagsMixin.ToBooleanFlags<RENDER_FLAGS> {}
 
     interface RegionMovementWaypoint {
       /** The x-coordinates in pixels (integer) */
@@ -62,19 +76,7 @@ declare global {
 
     static override embeddedName: "Region";
 
-    static override RENDER_FLAGS: {
-      /** @defaultValue `{ propagate: ["refresh"] }` */
-      redraw: RenderFlag<Region.RenderFlags>;
-
-      /** @defaultValue `{ propagate: ["refreshState", "refreshBorder"], alias: true }` */
-      refresh: RenderFlag<Region.RenderFlags>;
-
-      /** @defaultValue `{}` */
-      refreshState: RenderFlag<Region.RenderFlags>;
-
-      /** @defaultValue `{}` */
-      refreshBorder: RenderFlag<Region.RenderFlags>;
-    };
+    static override RENDER_FLAGS: Region.RENDER_FLAGS;
 
     static CLIPPER_SCALING_FACTOR: number;
     static MOVEMENT_SEGMENT_TYPES: Region.MOVEMENT_SEGMENT_TYPES;
diff --git a/src/foundry/client/pixi/placeables/sound.d.mts b/src/foundry/client/pixi/placeables/sound.d.mts
index b2ed3c1ba..33dd6f685 100644
--- a/src/foundry/client/pixi/placeables/sound.d.mts
+++ b/src/foundry/client/pixi/placeables/sound.d.mts
@@ -7,12 +7,25 @@ declare global {
     type ConfiguredClass = ConfiguredObjectClassOrDefault<typeof AmbientSound>;
     type ConfiguredInstance = FixedInstanceType<ConfiguredClass>;
 
-    interface RenderFlags extends PlaceableObject.RenderFlags {
-      refreshField: boolean;
+    interface RENDER_FLAGS {
+      /** @defaultValue `{ propagate: ["refresh"] }` */
+      redraw: RenderFlag<this>;
+
+      /** @defaultValue `{ propagate: ["refreshField"], alias: true }` */
+      refresh: RenderFlag<this>;
+
+      /** @defaultValue `{ propagate: ["refreshPosition", "refreshState"] }` */
+      refreshField: RenderFlag<this>;
 
-      refreshPosition: boolean;
+      /** @defaultValue `{}` */
+      refreshPosition: RenderFlag<this>;
+
+      /** @defaultValue `{}` */
+      refreshState: RenderFlag<this>;
     }
 
+    interface RenderFlags extends RenderFlagsMixin.ToBooleanFlags<RENDER_FLAGS> {}
+
     interface SyncOptions {
       /**
        * A duration in milliseconds to fade volume transition
@@ -56,22 +69,7 @@ declare global {
 
     static override embeddedName: "AmbientSound";
 
-    static override RENDER_FLAGS: {
-      /** @defaultValue `{ propagate: ["refresh"] }` */
-      redraw: RenderFlag<AmbientSound.RenderFlags>;
-
-      /** @defaultValue `{ propagate: ["refreshField"], alias: true }` */
-      refresh: RenderFlag<AmbientSound.RenderFlags>;
-
-      /** @defaultValue `{ propagate: ["refreshPosition", "refreshState"] }` */
-      refreshField: RenderFlag<AmbientSound.RenderFlags>;
-
-      /** @defaultValue `{}` */
-      refreshPosition: RenderFlag<AmbientSound.RenderFlags>;
-
-      /** @defaultValue `{}` */
-      refreshState: RenderFlag<AmbientSound.RenderFlags>;
-    };
+    static override RENDER_FLAGS: AmbientSound.RENDER_FLAGS;
 
     /**
      * Is this ambient sound is currently audible based on its hidden state and the darkness level of the Scene?
diff --git a/src/foundry/client/pixi/placeables/template.d.mts b/src/foundry/client/pixi/placeables/template.d.mts
index d350f7955..ca7e97229 100644
--- a/src/foundry/client/pixi/placeables/template.d.mts
+++ b/src/foundry/client/pixi/placeables/template.d.mts
@@ -6,18 +6,34 @@ declare global {
     type ConfiguredClass = ConfiguredObjectClassOrDefault<typeof MeasuredTemplate>;
     type ConfiguredInstance = FixedInstanceType<ConfiguredClass>;
 
-    interface RenderFlags extends PlaceableObject.RenderFlags {
-      refreshShape: boolean;
+    interface RENDER_FLAGS {
+      /** @defaultValue `{ propagate: ["refresh"] }` */
+      redraw: RenderFlag<this>;
+
+      /** @defaultValue `{ propagate: ["refreshState", "refreshShape"], alias: true }` */
+      refresh: RenderFlag<this>;
+
+      /** @defaultValue `{}` */
+      refreshState: RenderFlag<this>;
+
+      /** @defaultValue `{ propagate: ["refreshPosition", "refreshGrid", "refreshText", "refreshTemplate"] }` */
+      refreshShape: RenderFlag<this>;
 
-      refreshTemplate: boolean;
+      /** @defaultValue `{}` */
+      refreshTemplate: RenderFlag<this>;
 
-      refreshPosition: boolean;
+      /** @defaultValue `{ propagate: ["refreshGrid"] }` */
+      refreshPosition: RenderFlag<this>;
 
-      refreshGrid: boolean;
+      /** @defaultValue `{}` */
+      refreshGrid: RenderFlag<this>;
 
-      refreshText: boolean;
+      /** @defaultValue `{}` */
+      refreshText: RenderFlag<this>;
     }
 
+    interface RenderFlags extends RenderFlagsMixin.ToBooleanFlags<RENDER_FLAGS> {}
+
     // TODO: Fix globalThis.ObjectHUD #2962
     interface ObjectHUD {
       /**
@@ -75,31 +91,7 @@ declare global {
 
     static override embeddedName: "MeasuredTemplate";
 
-    static override RENDER_FLAGS: {
-      /** @defaultValue `{ propagate: ["refresh"] }` */
-      redraw: RenderFlag<MeasuredTemplate.RenderFlags>;
-
-      /** @defaultValue `{ propagate: ["refreshState", "refreshShape"], alias: true }` */
-      refresh: RenderFlag<MeasuredTemplate.RenderFlags>;
-
-      /** @defaultValue `{}` */
-      refreshState: RenderFlag<MeasuredTemplate.RenderFlags>;
-
-      /** @defaultValue `{ propagate: ["refreshPosition", "refreshGrid", "refreshText", "refreshTemplate"] }` */
-      refreshShape: RenderFlag<MeasuredTemplate.RenderFlags>;
-
-      /** @defaultValue `{}` */
-      refreshTemplate: RenderFlag<MeasuredTemplate.RenderFlags>;
-
-      /** @defaultValue `{ propagate: ["refreshGrid"] }` */
-      refreshPosition: RenderFlag<MeasuredTemplate.RenderFlags>;
-
-      /** @defaultValue `{}` */
-      refreshGrid: RenderFlag<MeasuredTemplate.RenderFlags>;
-
-      /** @defaultValue `{}` */
-      refreshText: RenderFlag<MeasuredTemplate.RenderFlags>;
-    };
+    static override RENDER_FLAGS: MeasuredTemplate.RENDER_FLAGS;
 
     override get bounds(): PIXI.Rectangle;
 
diff --git a/src/foundry/client/pixi/placeables/tile.d.mts b/src/foundry/client/pixi/placeables/tile.d.mts
index 5f181e655..6e21e35f4 100644
--- a/src/foundry/client/pixi/placeables/tile.d.mts
+++ b/src/foundry/client/pixi/placeables/tile.d.mts
@@ -6,20 +6,37 @@ declare global {
     type ConfiguredClass = ConfiguredObjectClassOrDefault<typeof Tile>;
     type ConfiguredInstance = FixedInstanceType<ConfiguredClass>;
 
-    interface RenderFlags extends PlaceableObject.RenderFlags {
-      refreshShape: boolean;
+    interface RENDER_FLAGS {
+      /** @defaultValue `{ propagate: ["refresh"] }` */
+      redraw: RenderFlag<this>;
+
+      /** @defaultValue `{ propagate: ["refreshState", "refreshShape", "refreshElevation", "refreshVideo"], alias: true }` */
+      refresh: RenderFlag<this>;
 
-      refreshMesh: boolean;
+      /** @defaultValue `{ propagate: ["refreshFrame"] }` */
+      refreshState: RenderFlag<this>;
 
-      refreshFrame: boolean;
+      /** @defaultValue `{ propagate: ["refreshMesh", "refreshPerception", "refreshFrame"] }` */
+      refreshShape: RenderFlag<this>;
 
-      refreshElevation: boolean;
+      /** @defaultValue `{}` */
+      refreshMesh: RenderFlag<this>;
 
-      refreshPerception: boolean;
+      /** @defaultValue `{}` */
+      refreshFrame: RenderFlag<this>;
 
-      refreshVideo: boolean;
+      /** @defaultValue `{ propagate: ["refreshMesh"] }` */
+      refreshElevation: RenderFlag<this>;
+
+      /** @defaultValue `{}` */
+      refreshPerception: RenderFlag<this>;
+
+      /** @defaultValue `{}` */
+      refreshVideo: RenderFlag<this>;
     }
 
+    interface RenderFlags extends RenderFlagsMixin.ToBooleanFlags<RENDER_FLAGS> {}
+
     interface RefreshOptions {
       /**
        * Also refresh the perception layer.
@@ -70,34 +87,7 @@ declare global {
   class Tile extends PlaceableObject<TileDocument.ConfiguredInstance> {
     static override embeddedName: "Tile";
 
-    static override RENDER_FLAGS: {
-      /** @defaultValue `{ propagate: ["refresh"] }` */
-      redraw: RenderFlag<Tile.RenderFlags>;
-
-      /** @defaultValue `{ propagate: ["refreshState", "refreshShape", "refreshElevation", "refreshVideo"], alias: true }` */
-      refresh: RenderFlag<Tile.RenderFlags>;
-
-      /** @defaultValue `{ propagate: ["refreshFrame"] }` */
-      refreshState: RenderFlag<Tile.RenderFlags>;
-
-      /** @defaultValue `{ propagate: ["refreshMesh", "refreshPerception", "refreshFrame"] }` */
-      refreshShape: RenderFlag<Tile.RenderFlags>;
-
-      /** @defaultValue `{}` */
-      refreshMesh: RenderFlag<Tile.RenderFlags>;
-
-      /** @defaultValue `{}` */
-      refreshFrame: RenderFlag<Tile.RenderFlags>;
-
-      /** @defaultValue `{ propagate: ["refreshMesh"] }` */
-      refreshElevation: RenderFlag<Tile.RenderFlags>;
-
-      /** @defaultValue `{}` */
-      refreshPerception: RenderFlag<Tile.RenderFlags>;
-
-      /** @defaultValue `{}` */
-      refreshVideo: RenderFlag<Tile.RenderFlags>;
-    };
+    static override RENDER_FLAGS: Tile.RENDER_FLAGS;
 
     /**
      * The Tile border frame
diff --git a/src/foundry/client/pixi/placeables/token.d.mts b/src/foundry/client/pixi/placeables/token.d.mts
index 7b416f491..a3911ab51 100644
--- a/src/foundry/client/pixi/placeables/token.d.mts
+++ b/src/foundry/client/pixi/placeables/token.d.mts
@@ -18,32 +18,55 @@ declare global {
     type Properties = BaseToken.Properties;
     type Source = BaseToken.Source;
 
-    interface RenderFlags extends PlaceableObject.RenderFlags {
-      redrawEffects: boolean;
+    interface RENDER_FLAGS {
+      /** @defaultValue `{ propagate: ["refresh"] }` */
+      redraw: RenderFlag<this>;
 
-      refreshSize: boolean;
+      /** @defaultValue `{}` */
+      redrawEffects: RenderFlag<this>;
 
-      refreshPosition: boolean;
+      /** @defaultValue `{ propagate: ["refreshState", "refreshSize", "refreshPosition", "refreshElevation", "refreshBars", "refreshNameplate", "refreshBorder", "refreshShader"], alias: true }` */
+      refresh: RenderFlag<this>;
 
-      refreshElevation: boolean;
+      /** @defaultValue `{ propagate: ["refreshVisibility", "refreshBorder"] }` */
+      refreshState: RenderFlag<this>;
 
-      refreshVisibility: boolean;
+      /** @defaultValue `{ propagate: ["refreshMesh", "refreshBorder", "refreshBars", "refreshPosition", "refreshTarget", "refreshEffects"] }` */
+      refreshSize: RenderFlag<this>;
 
-      refreshEffects: boolean;
+      /** @defaultValue `{ propagate: ["refreshMesh", "refreshVisibility"] }` */
+      refreshPosition: RenderFlag<this>;
 
-      refreshMesh: boolean;
+      /** @defaultValue `{ propagate: ["refreshMesh"] }` */
+      refreshElevation: RenderFlag<this>;
 
-      refreshShader: boolean;
+      /** @defaultValue `{}` */
+      refreshVisibility: RenderFlag<this>;
+
+      /** @defaultValue `{}` */
+      refreshEffects: RenderFlag<this>;
 
-      refreshBars: boolean;
+      /** @defaultValue `{}` */
+      refreshMesh: RenderFlag<this>;
 
-      refreshNameplate: boolean;
+      /** @defaultValue `{}` */
+      refreshShader: RenderFlag<this>;
 
-      refreshBorder: boolean;
+      /** @defaultValue `{}` */
+      refreshBars: RenderFlag<this>;
 
-      refreshTarget: boolean;
+      /** @defaultValue `{}` */
+      refreshNameplate: RenderFlag<this>;
+
+      /** @defaultValue `{}` */
+      refreshBorder: RenderFlag<this>;
+
+      /** @defaultValue `{}` */
+      refreshTarget: RenderFlag<this>;
     }
 
+    interface RenderFlags extends RenderFlagsMixin.ToBooleanFlags<RENDER_FLAGS> {}
+
     interface ReticuleOptions {
       /**
        * The amount of margin between the targeting arrows and the token's bounding box, expressed as a fraction of an arrow's size.
@@ -340,52 +363,7 @@ declare global {
   class Token extends PlaceableObject<TokenDocument.ConfiguredInstance> {
     static override embeddedName: "Token";
 
-    static override RENDER_FLAGS: {
-      /** @defaultValue `{ propagate: ["refresh"] }` */
-      redraw: RenderFlag<Token.RenderFlags>;
-
-      /** @defaultValue `{}` */
-      redrawEffects: RenderFlag<Token.RenderFlags>;
-
-      /** @defaultValue `{ propagate: ["refreshState", "refreshSize", "refreshPosition", "refreshElevation", "refreshBars", "refreshNameplate", "refreshBorder", "refreshShader"], alias: true }` */
-      refresh: RenderFlag<Token.RenderFlags>;
-
-      /** @defaultValue `{ propagate: ["refreshVisibility", "refreshBorder"] }` */
-      refreshState: RenderFlag<Token.RenderFlags>;
-
-      /** @defaultValue `{ propagate: ["refreshMesh", "refreshBorder", "refreshBars", "refreshPosition", "refreshTarget", "refreshEffects"] }` */
-      refreshSize: RenderFlag<Token.RenderFlags>;
-
-      /** @defaultValue `{ propagate: ["refreshMesh", "refreshVisibility"] }` */
-      refreshPosition: RenderFlag<Token.RenderFlags>;
-
-      /** @defaultValue `{ propagate: ["refreshMesh"] }` */
-      refreshElevation: RenderFlag<Token.RenderFlags>;
-
-      /** @defaultValue `{}` */
-      refreshVisibility: RenderFlag<Token.RenderFlags>;
-
-      /** @defaultValue `{}` */
-      refreshEffects: RenderFlag<Token.RenderFlags>;
-
-      /** @defaultValue `{}` */
-      refreshMesh: RenderFlag<Token.RenderFlags>;
-
-      /** @defaultValue `{}` */
-      refreshShader: RenderFlag<Token.RenderFlags>;
-
-      /** @defaultValue `{}` */
-      refreshBars: RenderFlag<Token.RenderFlags>;
-
-      /** @defaultValue `{}` */
-      refreshNameplate: RenderFlag<Token.RenderFlags>;
-
-      /** @defaultValue `{}` */
-      refreshBorder: RenderFlag<Token.RenderFlags>;
-
-      /** @defaultValue `{}` */
-      refreshTarget: RenderFlag<Token.RenderFlags>;
-    };
+    static override RENDER_FLAGS: Token.RENDER_FLAGS;
 
     /**
      * Defines the filter to use for detection.
diff --git a/src/foundry/client/pixi/placeables/wall.d.mts b/src/foundry/client/pixi/placeables/wall.d.mts
index bbdaffab9..5957ccd93 100644
--- a/src/foundry/client/pixi/placeables/wall.d.mts
+++ b/src/foundry/client/pixi/placeables/wall.d.mts
@@ -7,16 +7,31 @@ declare global {
     type ConfiguredClass = ConfiguredObjectClassOrDefault<typeof Wall>;
     type ConfiguredInstance = FixedInstanceType<ConfiguredClass>;
 
-    interface RenderFlags extends PlaceableObject.RenderFlags {
-      refreshLine: boolean;
+    interface RENDER_FLAGS {
+      /** @defaultValue `{ propagate: ["refresh"] }` */
+      redraw: RenderFlag<this>;
+
+      /** @defaultValue `{ propagate: ["refreshState", "refreshLine"], alias: true }` */
+      refresh: RenderFlag<this>;
 
-      refreshEndpoints: boolean;
+      /** @defaultValue `{ propagate: ["refreshEndpoints", "refreshHighlight"] }` */
+      refreshState: RenderFlag<this>;
 
-      refreshDirection: boolean;
+      /** @defaultValue `{ propagate: ["refreshEndpoints", "refreshHighlight", "refreshDirection"] }` */
+      refreshLine: RenderFlag<this>;
+
+      /** @defaultValue `{}` */
+      refreshEndpoints: RenderFlag<this>;
 
-      refreshHighlight: boolean;
+      /** @defaultValue `{}` */
+      refreshDirection: RenderFlag<this>;
+
+      /** @defaultValue `{}` */
+      refreshHighlight: RenderFlag<this>;
     }
 
+    interface RenderFlags extends RenderFlagsMixin.ToBooleanFlags<RENDER_FLAGS> {}
+
     interface ControlOptions extends PlaceableObject.ControlOptions {
       /** @defaultValue `false` */
       chain: boolean;
@@ -36,28 +51,7 @@ declare global {
   class Wall extends PlaceableObject<WallDocument.ConfiguredInstance> {
     static override embeddedName: "Wall";
 
-    static override RENDER_FLAGS: {
-      /** @defaultValue `{ propagate: ["refresh"] }` */
-      redraw: RenderFlag<Wall.RenderFlags>;
-
-      /** @defaultValue `{ propagate: ["refreshState", "refreshLine"], alias: true }` */
-      refresh: RenderFlag<Wall.RenderFlags>;
-
-      /** @defaultValue `{ propagate: ["refreshEndpoints", "refreshHighlight"] }` */
-      refreshState: RenderFlag<Wall.RenderFlags>;
-
-      /** @defaultValue `{ propagate: ["refreshEndpoints", "refreshHighlight", "refreshDirection"] }` */
-      refreshLine: RenderFlag<Wall.RenderFlags>;
-
-      /** @defaultValue `{}` */
-      refreshEndpoints: RenderFlag<Wall.RenderFlags>;
-
-      /** @defaultValue `{}` */
-      refreshDirection: RenderFlag<Wall.RenderFlags>;
-
-      /** @defaultValue `{}` */
-      refreshHighlight: RenderFlag<Wall.RenderFlags>;
-    };
+    static override RENDER_FLAGS: Wall.RENDER_FLAGS;
 
     /**
      * A reference the Door Control icon associated with this Wall, if any
diff --git a/src/foundry/common/primitives/array.d.mts b/src/foundry/common/primitives/array.d.mts
index 91dc41e17..f828f5014 100644
--- a/src/foundry/common/primitives/array.d.mts
+++ b/src/foundry/common/primitives/array.d.mts
@@ -25,8 +25,8 @@ declare global {
      * @param rule - The rule to partition by
      * @returns An Array of length two whose elements are the partitioned pieces of the original
      */
-    partition<S extends T>(/** @immediate */ rule: (val: T) => val is S): [Exclude<T, S>[], S[]];
-    partition(/** @immediate */ rule: (val: T) => boolean): [T[], T[]];
+    partition<S extends T>(rule: (val: T) => val is S): [Exclude<T, S>[], S[]];
+    partition(rule: (val: T) => boolean): [T[], T[]];
 
     /**
      * Join an Array using a string separator, first filtering out any parts which return a false-y value
@@ -41,7 +41,7 @@ declare global {
      * @param replace - A replacement for the spliced element
      * @returns The replacement element, the removed element, or null if no element was found.
      */
-    findSplice(/** @immediate */ find: (value: T, index: number, obj: T[]) => boolean, replace?: T): T | null;
+    findSplice(find: (value: T, index: number, obj: T[]) => boolean, replace?: T): T | null;
   }
 
   interface ArrayConstructor {
diff --git a/src/foundry/common/primitives/math.d.mts b/src/foundry/common/primitives/math.d.mts
index 9011f5dcc..a39b6f5f0 100644
--- a/src/foundry/common/primitives/math.d.mts
+++ b/src/foundry/common/primitives/math.d.mts
@@ -98,12 +98,6 @@ declare global {
      *                  Its period must be 2π
      * @returns The oscillation according to t. `((maxValue - minValue) * (f(2π * t / p) + 1) / 2) + minValue`
      */
-    oscillation(
-      minVal: number,
-      maxVal: number,
-      t: number,
-      p?: number,
-      /** @immediate */ func?: (radians: number) => number,
-    ): number;
+    oscillation(minVal: number, maxVal: number, t: number, p?: number, func?: (radians: number) => number): number;
   }
 }
diff --git a/src/foundry/common/primitives/set.d.mts b/src/foundry/common/primitives/set.d.mts
index 09f17612a..99f7f51fd 100644
--- a/src/foundry/common/primitives/set.d.mts
+++ b/src/foundry/common/primitives/set.d.mts
@@ -57,7 +57,7 @@ declare global {
      * @param test - The test criterion to apply. Positional arguments are the value, the index of iteration, and the set being tested.
      * @returns Does every element in the set satisfy the test criterion?
      */
-    every(/** @immediate */ test: (value: T, index: number, set: Set<T>) => boolean): boolean;
+    every(test: (value: T, index: number, set: Set<T>) => boolean): boolean;
 
     /**
      * Filter this set to create a subset of elements which satisfy a certain test criterion.
@@ -65,8 +65,8 @@ declare global {
      * @param test - The test criterion to apply. Positional arguments are the value, the index of iteration, and the set being filtered.
      * @returns A new Set containing only elements which satisfy the test criterion.
      */
-    filter<F extends T>(/** @immediate */ test: (value: T, index: number, set: Set<T>) => value is F): Set<F>;
-    filter(/** @immediate */ test: (value: T, index: number, set: Set<T>) => boolean): Set<T>;
+    filter<F extends T>(test: (value: T, index: number, set: Set<T>) => value is F): Set<F>;
+    filter(test: (value: T, index: number, set: Set<T>) => boolean): Set<T>;
 
     /**
      * Find the first element in this set which satisfies a certain test criterion.
@@ -74,8 +74,8 @@ declare global {
      * @param test - The test criterion to apply. Positional arguments are the value, the index of iteration, and the set being searched.
      * @returns The first element in the set which satisfies the test criterion, or undefined.
      */
-    find<F extends T>(/** @immediate */ test: (value: T, index: number, set: Set<T>) => value is F): F | undefined;
-    find(/** @immediate */ test: (value: T, index: number, set: Set<T>) => boolean): T | undefined;
+    find<F extends T>(test: (value: T, index: number, set: Set<T>) => value is F): F | undefined;
+    find(test: (value: T, index: number, set: Set<T>) => boolean): T | undefined;
 
     /**
      * Create a new Set where every element is modified by a provided transformation function.
@@ -83,7 +83,7 @@ declare global {
      * @param transform - The transformation function to apply.Positional arguments are the value, the index of iteration, and the set being transformed.
      * @returns A new Set of equal size containing transformed elements.
      */
-    map<V>(/** @immediate */ transform: (value: T, index: number, set: Set<T>) => V): Set<V>;
+    map<V>(transform: (value: T, index: number, set: Set<T>) => V): Set<V>;
 
     /**
      * Create a new Set with elements that are filtered and transformed by a provided reducer function.
@@ -92,10 +92,7 @@ declare global {
      * @param accumulator - The initial value of the returned accumulator.
      * @returns The final value of the accumulator.
      */
-    reduce<V>(
-      /** @immediate */ reducer: (accumulator: V, value: T, index: number, set: Set<T>) => V,
-      accumulator: V,
-    ): V;
+    reduce<V>(reducer: (accumulator: V, value: T, index: number, set: Set<T>) => V, accumulator: V): V;
 
     /**
      * Test whether any element in this Set satisfies a certain test criterion.
@@ -103,6 +100,6 @@ declare global {
      * @param test - The test criterion to apply. Positional arguments are the value, the index of iteration, and the set being tested.
      * @returns Does any element in the set satisfy the test criterion?
      */
-    some(/** @immediate */ test: (value: T, index: number, set: Set<T>) => boolean): boolean;
+    some(test: (value: T, index: number, set: Set<T>) => boolean): boolean;
   }
 }
diff --git a/src/foundry/common/prosemirror/dropdown.d.mts b/src/foundry/common/prosemirror/dropdown.d.mts
index 35e1f6bae..66cedd48e 100644
--- a/src/foundry/common/prosemirror/dropdown.d.mts
+++ b/src/foundry/common/prosemirror/dropdown.d.mts
@@ -47,7 +47,7 @@ declare class ProseMirrorDropDown {
    * Recurse through the menu structure and apply a function to each item in it.
    * @param fn - The function to call on each item. Return false to prevent iterating over any further items.
    */
-  forEachItem(/** @immediate */ fn: (entry: ProseMirrorDropDownMenu.Entry) => boolean): void;
+  forEachItem(fn: (entry: ProseMirrorDropDownMenu.Entry) => boolean): void;
 
   /**
    * Render a list of drop-down menu items.
diff --git a/src/foundry/common/utils/collection.d.mts b/src/foundry/common/utils/collection.d.mts
index 2512ccbc1..cfee8c964 100644
--- a/src/foundry/common/utils/collection.d.mts
+++ b/src/foundry/common/utils/collection.d.mts
@@ -39,10 +39,8 @@ declare class Collection<V> extends Map<string, V> {
    * c.get("a") === c.find(entry => entry === "A"); // true
    * ```
    */
-  find<S extends V>(
-    /** @immediate */ condition: (e: V, index: number, collection: Collection<V>) => e is S,
-  ): S | undefined;
-  find(/** @immediate */ condition: (e: V, index: number, collection: Collection<V>) => boolean): V | undefined;
+  find<S extends V>(condition: (e: V, index: number, collection: Collection<V>) => e is S): S | undefined;
+  find(condition: (e: V, index: number, collection: Collection<V>) => boolean): V | undefined;
 
   /**
    * Filter the Collection, returning an Array of entries which match a functional condition.
@@ -58,8 +56,8 @@ declare class Collection<V> extends Map<string, V> {
    * let hasA = c.filters(entry => entry.slice(0) === "A");
    * ```
    */
-  filter<S extends V>(/** @immediate */ condition: (e: V, index: number, collection: Collection<V>) => e is S): S[];
-  filter(/** @immediate */ condition: (e: V, index: number, collection: Collection<V>) => boolean): V[];
+  filter<S extends V>(condition: (e: V, index: number, collection: Collection<V>) => e is S): S[];
+  filter(condition: (e: V, index: number, collection: Collection<V>) => boolean): V[];
 
   /**
    * Apply a function to each element of the collection
@@ -72,7 +70,7 @@ declare class Collection<V> extends Map<string, V> {
    * c.forEach(e => e.active = true);
    * ```
    */
-  forEach(/** @immediate */ fn: (e: V) => void): void;
+  forEach(fn: (e: V) => void): void;
 
   /**
    * Get an element from the Collection by its key.
@@ -118,7 +116,7 @@ declare class Collection<V> extends Map<string, V> {
    * @typeParam M       - The type of the mapped values
    * @returns An Array of transformed values
    */
-  map<M>(/** @immediate */ transformer: (entity: V, index: number, collection: Collection<V>) => M): M[];
+  map<M>(transformer: (entity: V, index: number, collection: Collection<V>) => M): M[];
 
   /**
    * Reduce the Collection by applying an evaluator function and accumulating entries
@@ -137,10 +135,7 @@ declare class Collection<V> extends Map<string, V> {
    * }, ""); // "ABC"
    * ```
    */
-  reduce<A>(
-    /** @immediate */ evaluator: (accumulator: A, entity: V, index: number, collection: Collection<V>) => A,
-    initial: A,
-  ): A;
+  reduce<A>(evaluator: (accumulator: A, entity: V, index: number, collection: Collection<V>) => A, initial: A): A;
 
   /**
    * Test whether a condition is met by some entry in the Collection.
@@ -149,7 +144,7 @@ declare class Collection<V> extends Map<string, V> {
    *                    and the collection being tested.
    * @returns Was the test condition passed by at least one entry?
    */
-  some(/** @immediate */ condition: (e: V, index: number, collection: Collection<V>) => boolean): boolean;
+  some(condition: (e: V, index: number, collection: Collection<V>) => boolean): boolean;
 
   /**
    * Convert the Collection to a primitive array of its contents.
diff --git a/src/utils/index.d.mts b/src/utils/index.d.mts
index 25e0b0f84..5aaba530e 100644
--- a/src/utils/index.d.mts
+++ b/src/utils/index.d.mts
@@ -1089,42 +1089,3 @@ export type Coalesce<T, D, CoalesceType = undefined> = T extends CoalesceType ?
  * See {@link Coalesce | `Coalesce`}.
  */
 export type NullishCoalesce<T, D> = T extends null | undefined ? D : T;
-
-interface EarlierHook {
-  none: never;
-  init: "none";
-  i18nInit: "none" | "init";
-  setup: "none" | "init" | "i18nInit";
-  ready: "none" | "init" | "i18nInit" | "setup";
-}
-
-/**
- * A hook that's valid to use in {@link AssumeHookRan | `AssumeHookRan`}
- */
-export type InitializationHook = keyof EarlierHook;
-
-/**
- * All hooks ran so far.
- *
- * @example
- * ```ts
- * HooksRan<never>;      // never
- * HooksRan<"none">;     // "none"
- * HooksRan<"init">;     // "none" | "init"
- * HooksRan<"i18nInit">; // "none" | "init" | "i18nInit"
- * HooksRan<"setup">;    // "none" | "init" | "i18nInit" | "setup"
- * HooksRan<"setup">;    // "none" | "init" | "i18nInit" | "setup" | "ready"
- * ```
- */
-export type HooksRan<T extends InitializationHook> = EarlierHook[T] | T;
-type ValidHooksRan = Extract<keyof AssumeHookRan, InitializationHook>;
-
-/**
- * Various things within Foundry are only initialized after a certain hook is ran.
- * `InitializedOn` is useful to help model this pattern.
- */
-export type InitializedOn<
-  InitializedTo,
-  InitializedOnHook extends InitializationHook,
-  BeforeInitialization = InitializedTo | undefined,
-> = Extract<HooksRan<ValidHooksRan>, InitializedOnHook> extends never ? InitializedTo : BeforeInitialization;
diff --git a/tsdoc.json b/tsdoc.json
index 57ad43c98..63bdd3220 100644
--- a/tsdoc.json
+++ b/tsdoc.json
@@ -4,10 +4,6 @@
     {
       "tagName": "@abstract",
       "syntaxKind": "modifier"
-    },
-    {
-      "tagName": "@immediate",
-      "syntaxKind": "modifier"
     }
   ]
 }


Test patch:
diff --git a/tests/foundry/client/pixi/core/interaction/render-flags.test-d.ts b/tests/foundry/client/pixi/core/interaction/render-flags.test-d.ts
index 3a3618c86..4e8fe3804 100644
--- a/tests/foundry/client/pixi/core/interaction/render-flags.test-d.ts
+++ b/tests/foundry/client/pixi/core/interaction/render-flags.test-d.ts
@@ -4,4 +4,4 @@ class MyRenderFlags extends RenderFlagsMixin(PIXI.Text) {}
 
 const myRenderFlagObject = new MyRenderFlags();
 
-expectTypeOf(myRenderFlagObject.renderFlags.flags.refresh.propagate).toEqualTypeOf<string[] | undefined>();
+expectTypeOf(myRenderFlagObject.renderFlags.flags.refresh?.propagate).toEqualTypeOf<string[] | undefined>();
diff --git a/tests/foundry/client/pixi/perception/perception-manager.test-d.ts b/tests/foundry/client/pixi/perception/perception-manager.test-d.ts
index 16e2b7220..1bfbf1ae6 100644
--- a/tests/foundry/client/pixi/perception/perception-manager.test-d.ts
+++ b/tests/foundry/client/pixi/perception/perception-manager.test-d.ts
@@ -19,31 +19,25 @@ expectTypeOf(
     initializeSounds: false,
     refreshSounds: false,
     soundFadeDuration: true,
-    refreshTiles: true,
-  }),
-).toEqualTypeOf<void>();
-
-expectTypeOf(manager.update({})).toEqualTypeOf<void>();
-expectTypeOf(
-  manager.update({
-    initializeLighting: true,
-    initializeVision: true,
-    initializeSounds: true,
-  }),
-).toEqualTypeOf<void>();
-expectTypeOf(
-  manager.update({
-    initializeLighting: true,
-    refreshLighting: true,
-    initializeVision: false,
-    refreshVision: true,
-    initializeSounds: false,
-    refreshSounds: false,
-    soundFadeDuration: true,
-    refreshTiles: true,
+    initializeDarknessSources: undefined,
+    initializeLightSources: null,
+    initializeVisionModes: false,
+    refreshEdges: true,
+    refreshLightSources: undefined,
+    refreshOcclusion: null,
+    refreshOcclusionMask: false,
+    refreshOcclusionStates: true,
+    refreshPrimary: undefined,
+    refreshVisionSources: null,
+    //deprecated
+    identifyInteriorWalls: undefined,
+    refreshTiles: false,
+    // deprecated *and* the call it would have triggered was prematurely removed
+    forceUpdateFog: true,
   }),
 ).toEqualTypeOf<void>();
 
 expectTypeOf(manager.initialize()).toEqualTypeOf<void>();
 
+//deprecated
 expectTypeOf(manager.refresh()).toEqualTypeOf<void>();
diff --git a/tests/foundry/client/pixi/placeable.test-d.ts b/tests/foundry/client/pixi/placeable.test-d.ts
index b50bd16a0..88d98c406 100644
--- a/tests/foundry/client/pixi/placeable.test-d.ts
+++ b/tests/foundry/client/pixi/placeable.test-d.ts
@@ -39,10 +39,10 @@ expectTypeOf(
   new ConcretePlaceableObject(new EmbeddedInSceneDocument()).mouseInteractionManager,
 ).toEqualTypeOf<MouseInteractionManager<ConcretePlaceableObject> | null>();
 
-expectTypeOf(PlaceableObject.RENDER_FLAGS.redraw.propagate).toEqualTypeOf<
-  Array<keyof PlaceableObject.RenderFlags> | undefined
+expectTypeOf(PlaceableObject.RENDER_FLAGS.redraw?.propagate).toEqualTypeOf<
+  Array<"redraw" | "refresh" | "refreshState"> | undefined
 >();
 
-expectTypeOf(AmbientLight.RENDER_FLAGS.redraw.propagate).toEqualTypeOf<
-  Array<keyof AmbientLight.RenderFlags> | undefined
+expectTypeOf(AmbientLight.RENDER_FLAGS.redraw?.propagate).toEqualTypeOf<
+  Array<"redraw" | "refresh" | "refreshState" | "refreshField" | "refreshPosition"> | undefined
 >();