diff --git a/NEWS.md b/NEWS.md
index d38becb081aaf76a6faa989c73bb04df7c6aec5c..aadd72a551c2bb167f721b9959b20ef8d190c4a3 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -1,8 +1,10 @@
 # Beanbag-ESLint-Plugin Releases
 
-## Version 3.0.1 (TBD)
+## Version 3.1.0 (TBD)
 
 * Added TypeScript definitions to the build.
+* Added the `@beanbag/spina-wrapped-static-access` rule to detect and suggest
+  fixes for accessing static members inside of `@spina`-wrapped classes.
 
 ## Version 3.0.0 (8-October-2025)
 
diff --git a/eslint.config.mjs b/eslint.config.mjs
index c8f0b4e019669f0aa229944f10e83b439f6ff2e6..e7f1a42be3ff165498c367c3b9bbe4bd1a40407d 100644
--- a/eslint.config.mjs
+++ b/eslint.config.mjs
@@ -3,7 +3,10 @@
 
 import { FlatCompat } from '@eslint/eslintrc';
 import js from '@eslint/js';
-import { defineConfig } from 'eslint/config';
+import {
+    defineConfig,
+    globalIgnores,
+} from 'eslint/config';
 import globals from 'globals';
 
 import beanbag from '@beanbag/eslint-plugin';
@@ -17,16 +20,21 @@
     recommendedConfig: js.configs.recommended,
 });
 
-export default defineConfig([{
-    extends: compat.extends('plugin:@beanbag/recommended'),
-
-    plugins: {
-        '@beanbag': beanbag,
-    },
-
-    languageOptions: {
-        globals: {
-            ...globals.node,
-        },
-    },
-}]);
+export default defineConfig([
+    globalIgnores([
+        '_build/**/*',
+        'lib/**/*',
+        'tests/**/*.js',
+    ]),
+    {
+        extends: compat.extends('plugin:@beanbag/recommended'),
+        languageOptions: {
+            globals: {
+                ...globals.node,
+            },
+        },
+        plugins: {
+            '@beanbag': beanbag,
+        },
+    },
+]);
diff --git a/package-lock.json b/package-lock.json
index 799d9ec62786e7f7a32af2408af1c230dd2f9dd9..d0131058c823d67d7f5f8f7778fbb9aad53dac79 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -18,8 +18,11 @@
                 "@beanbag/frontend-buildkit": "^1.2.0",
                 "@eslint/eslintrc": "^3.3.1",
                 "@eslint/js": "^9.37.0",
+                "@types/jasmine": "^5.1.11",
+                "@typescript-eslint/utils": "^8.46.1",
                 "eslint": "^9.37.0",
                 "globals": "^16.4.0",
+                "jasmine": "^5.12.0",
                 "typescript": "^5.9.3"
             },
             "peerDependencies": {
@@ -1980,6 +1983,24 @@
                 "url": "https://github.com/sponsors/nzakas"
             }
         },
+        "node_modules/@isaacs/cliui": {
+            "version": "8.0.2",
+            "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+            "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+            "dev": true,
+            "license": "ISC",
+            "dependencies": {
+                "string-width": "^5.1.2",
+                "string-width-cjs": "npm:string-width@^4.2.0",
+                "strip-ansi": "^7.0.1",
+                "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+                "wrap-ansi": "^8.1.0",
+                "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+            },
+            "engines": {
+                "node": ">=12"
+            }
+        },
         "node_modules/@jridgewell/gen-mapping": {
             "version": "0.3.13",
             "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
@@ -2062,6 +2083,17 @@
                 "node": ">= 8"
             }
         },
+        "node_modules/@pkgjs/parseargs": {
+            "version": "0.11.0",
+            "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+            "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "engines": {
+                "node": ">=14"
+            }
+        },
         "node_modules/@rollup/plugin-babel": {
             "version": "6.1.0",
             "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-6.1.0.tgz",
@@ -2200,6 +2232,13 @@
             "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
             "license": "MIT"
         },
+        "node_modules/@types/jasmine": {
+            "version": "5.1.11",
+            "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.11.tgz",
+            "integrity": "sha512-eAij9lMAsosuA8cvRcqw7p2vO+LUraktQDmOUFx2jAnya8NUchr3DryHksfhZbRzU83vzNUSZhlk1cFdoePxwA==",
+            "dev": true,
+            "license": "MIT"
+        },
         "node_modules/@types/json-schema": {
             "version": "7.0.15",
             "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
@@ -2488,6 +2527,19 @@
                 "url": "https://github.com/sponsors/epoberezkin"
             }
         },
+        "node_modules/ansi-regex": {
+            "version": "6.2.2",
+            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
+            "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=12"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+            }
+        },
         "node_modules/ansi-styles": {
             "version": "4.3.0",
             "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
@@ -2880,6 +2932,13 @@
                 "node": ">=0.10.0"
             }
         },
+        "node_modules/eastasianwidth": {
+            "version": "0.2.0",
+            "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+            "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+            "dev": true,
+            "license": "MIT"
+        },
         "node_modules/electron-to-chromium": {
             "version": "1.5.203",
             "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.203.tgz",
@@ -2887,6 +2946,13 @@
             "dev": true,
             "license": "ISC"
         },
+        "node_modules/emoji-regex": {
+            "version": "9.2.2",
+            "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+            "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+            "dev": true,
+            "license": "MIT"
+        },
         "node_modules/errno": {
             "version": "0.1.8",
             "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
@@ -3257,6 +3323,23 @@
             "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
             "license": "ISC"
         },
+        "node_modules/foreground-child": {
+            "version": "3.3.1",
+            "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
+            "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
+            "dev": true,
+            "license": "ISC",
+            "dependencies": {
+                "cross-spawn": "^7.0.6",
+                "signal-exit": "^4.0.1"
+            },
+            "engines": {
+                "node": ">=14"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/isaacs"
+            }
+        },
         "node_modules/fraction.js": {
             "version": "4.3.7",
             "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
@@ -3547,6 +3630,16 @@
                 "node": ">=0.10.0"
             }
         },
+        "node_modules/is-fullwidth-code-point": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+            "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=8"
+            }
+        },
         "node_modules/is-glob": {
             "version": "4.0.3",
             "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
@@ -3598,6 +3691,64 @@
             "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
             "license": "ISC"
         },
+        "node_modules/jackspeak": {
+            "version": "3.4.3",
+            "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+            "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+            "dev": true,
+            "license": "BlueOak-1.0.0",
+            "dependencies": {
+                "@isaacs/cliui": "^8.0.2"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/isaacs"
+            },
+            "optionalDependencies": {
+                "@pkgjs/parseargs": "^0.11.0"
+            }
+        },
+        "node_modules/jasmine": {
+            "version": "5.12.0",
+            "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-5.12.0.tgz",
+            "integrity": "sha512-KmKeTNuH8rgAuPRL5AUsXWSdJVlDu+pgqi2dLXoZUSH/g3kR+7Ho8B7hEhwDu0fu1PLuiXZtfaxmQ/mB5wqihw==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "glob": "^10.2.2",
+                "jasmine-core": "~5.12.0"
+            },
+            "bin": {
+                "jasmine": "bin/jasmine.js"
+            }
+        },
+        "node_modules/jasmine-core": {
+            "version": "5.12.0",
+            "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.12.0.tgz",
+            "integrity": "sha512-QqO4pX33GEML5JoGQU6BM5NHKPgEsg+TXp3jCIDek9MbfEp2JUYEFBo9EF1+hegWy/bCHS1m5nP0BOp18G6rVA==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/jasmine/node_modules/glob": {
+            "version": "10.4.5",
+            "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+            "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+            "dev": true,
+            "license": "ISC",
+            "dependencies": {
+                "foreground-child": "^3.1.0",
+                "jackspeak": "^3.1.2",
+                "minimatch": "^9.0.4",
+                "minipass": "^7.1.2",
+                "package-json-from-dist": "^1.0.0",
+                "path-scurry": "^1.11.1"
+            },
+            "bin": {
+                "glob": "dist/esm/bin.mjs"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/isaacs"
+            }
+        },
         "node_modules/js-tokens": {
             "version": "4.0.0",
             "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -3833,6 +3984,16 @@
                 "url": "https://github.com/sponsors/isaacs"
             }
         },
+        "node_modules/minipass": {
+            "version": "7.1.2",
+            "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+            "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+            "dev": true,
+            "license": "ISC",
+            "engines": {
+                "node": ">=16 || 14 >=14.17"
+            }
+        },
         "node_modules/ms": {
             "version": "2.1.3",
             "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -3967,6 +4128,13 @@
                 "url": "https://github.com/sponsors/sindresorhus"
             }
         },
+        "node_modules/package-json-from-dist": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+            "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+            "dev": true,
+            "license": "BlueOak-1.0.0"
+        },
         "node_modules/parent-module": {
             "version": "1.0.1",
             "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@@ -4024,6 +4192,30 @@
             "dev": true,
             "license": "MIT"
         },
+        "node_modules/path-scurry": {
+            "version": "1.11.1",
+            "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+            "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+            "dev": true,
+            "license": "BlueOak-1.0.0",
+            "dependencies": {
+                "lru-cache": "^10.2.0",
+                "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+            },
+            "engines": {
+                "node": ">=16 || 14 >=14.18"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/isaacs"
+            }
+        },
+        "node_modules/path-scurry/node_modules/lru-cache": {
+            "version": "10.4.3",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+            "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+            "dev": true,
+            "license": "ISC"
+        },
         "node_modules/picocolors": {
             "version": "1.1.1",
             "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
@@ -4411,6 +4603,19 @@
                 "node": ">=8"
             }
         },
+        "node_modules/signal-exit": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+            "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+            "dev": true,
+            "license": "ISC",
+            "engines": {
+                "node": ">=14"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/isaacs"
+            }
+        },
         "node_modules/slash": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
@@ -4450,6 +4655,110 @@
             "dev": true,
             "license": "MIT"
         },
+        "node_modules/string-width": {
+            "version": "5.1.2",
+            "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+            "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "eastasianwidth": "^0.2.0",
+                "emoji-regex": "^9.2.2",
+                "strip-ansi": "^7.0.1"
+            },
+            "engines": {
+                "node": ">=12"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/string-width-cjs": {
+            "name": "string-width",
+            "version": "4.2.3",
+            "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+            "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "emoji-regex": "^8.0.0",
+                "is-fullwidth-code-point": "^3.0.0",
+                "strip-ansi": "^6.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/string-width-cjs/node_modules/ansi-regex": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+            "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/string-width-cjs/node_modules/emoji-regex": {
+            "version": "8.0.0",
+            "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+            "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/string-width-cjs/node_modules/strip-ansi": {
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+            "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "ansi-regex": "^5.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/strip-ansi": {
+            "version": "7.1.2",
+            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz",
+            "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "ansi-regex": "^6.0.1"
+            },
+            "engines": {
+                "node": ">=12"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+            }
+        },
+        "node_modules/strip-ansi-cjs": {
+            "name": "strip-ansi",
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+            "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "ansi-regex": "^5.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+            "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=8"
+            }
+        },
         "node_modules/strip-json-comments": {
             "version": "3.1.1",
             "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
@@ -4665,6 +4974,101 @@
                 "node": ">=0.10.0"
             }
         },
+        "node_modules/wrap-ansi": {
+            "version": "8.1.0",
+            "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+            "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "ansi-styles": "^6.1.0",
+                "string-width": "^5.0.1",
+                "strip-ansi": "^7.0.1"
+            },
+            "engines": {
+                "node": ">=12"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+            }
+        },
+        "node_modules/wrap-ansi-cjs": {
+            "name": "wrap-ansi",
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+            "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "ansi-styles": "^4.0.0",
+                "string-width": "^4.1.0",
+                "strip-ansi": "^6.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+            }
+        },
+        "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+            "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
+            "version": "8.0.0",
+            "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+            "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+            "dev": true,
+            "license": "MIT"
+        },
+        "node_modules/wrap-ansi-cjs/node_modules/string-width": {
+            "version": "4.2.3",
+            "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+            "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "emoji-regex": "^8.0.0",
+                "is-fullwidth-code-point": "^3.0.0",
+                "strip-ansi": "^6.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+            "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+            "dev": true,
+            "license": "MIT",
+            "dependencies": {
+                "ansi-regex": "^5.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/wrap-ansi/node_modules/ansi-styles": {
+            "version": "6.2.3",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+            "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
+            "dev": true,
+            "license": "MIT",
+            "engines": {
+                "node": ">=12"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
         "node_modules/wrappy": {
             "version": "1.0.2",
             "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
diff --git a/package.json b/package.json
index cd9c0acf89e7069e1f90667edc3c3d7b9225fbe3..aa0d8bf1dc3b9e627f2295ae3fa6631f5551c0a2 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "@beanbag/eslint-plugin",
-    "version": "3.0.1",
+    "version": "3.1.0",
     "description": "Configuration used for linting Beanbag JavaScript codebases.",
     "homepage": "https://github.com/beanbaginc/beanbag-eslint-plugin",
     "github": "https://github.com/beanbaginc/beanbag-eslint-plugin",
@@ -26,7 +26,8 @@
         "clean": "rm -rf lib _build",
         "build": "tsc && rollup -c --bundleConfigAsCjs",
         "full-build": "npm run clean && npm run build",
-        "lint": "eslint src"
+        "lint": "eslint src",
+        "test": "jasmine"
     },
     "dependencies": {
         "@stylistic/eslint-plugin": "^5.4.0",
@@ -38,8 +39,11 @@
         "@beanbag/frontend-buildkit": "^1.2.0",
         "@eslint/eslintrc": "^3.3.1",
         "@eslint/js": "^9.37.0",
+        "@types/jasmine": "^5.1.11",
+        "@typescript-eslint/utils": "^8.46.1",
         "eslint": "^9.37.0",
         "globals": "^16.4.0",
+        "jasmine": "^5.12.0",
         "typescript": "^5.9.3"
     },
     "peerDependencies": {
diff --git a/rollup.config.js b/rollup.config.js
index ac758a8389f3dc5c0247a4821ea718a5c95167ed..d74043efb6863f5688fe4a93db59b670c7c51b32 100644
--- a/rollup.config.js
+++ b/rollup.config.js
@@ -8,6 +8,12 @@
 
 export default [
     {
+        external: [
+            '@typescript-eslint/utils',
+            '@typescript-eslint/eslint-plugin',
+            '@stylistic/eslint-plugin',
+            'eslint-plugin-jasmine',
+        ],
         input: './src/index.ts',
         output: [
             {
@@ -15,6 +21,14 @@
                 exports: 'named',
                 file: 'lib/index.js',
                 format: 'umd',
+                globals: {
+                    '@stylistic/eslint-plugin':
+                        'StylisticESLintPlugin',
+                    '@typescript-eslint/eslint-plugin':
+                        'TypeScriptESLintPlugin',
+                    '@typescript-eslint/utils': 'TypeScriptESLintUtils',
+                    'eslint-plugin-jasmine': 'ESLintPluginJasmine',
+                },
                 name: 'BeanbagESLintPlugin',
                 sourcemap: true,
             },
diff --git a/spec/support/jasmine.mjs b/spec/support/jasmine.mjs
new file mode 100644
index 0000000000000000000000000000000000000000..7adbcf5e542b4526f8033f98e58a10202f0dd7f7

--- /dev/null
+++ b/spec/support/jasmine.mjs
@@ -0,0 +1,14 @@
+export default {
+    env: {
+        forbidDuplicateNames: true,
+        random: true,
+        stopSpecOnExpectationFailure: false,
+    },
+    helpers: [
+        'helpers/**/*.?(m)js',
+    ],
+    spec_dir: 'tests',
+    spec_files: [
+        '**/*[sS]pec.?(m)js',
+    ],
+};
diff --git a/src/index.ts b/src/index.ts
index b8654e13ec83e24a914eaa6de951c2c3b1b9cc45..c37e4a520711c849e9dbc19eb71bea462ea9c534 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -11,6 +11,8 @@
 
 'use strict';
 
+import spinaWrappedStaticAccess from './rules/spina-wrapped-static-access';
+
 
 /*
  * A string regex pattern used for `case` fall-through markers in `switch`.
@@ -1108,6 +1110,15 @@
          * disallow it. We convert to a warning, to help port legacy code.
          */
         '@typescript-eslint/no-this-alias': 'warn',
+
+        /*
+         * Disallow direct static member access in @spina decorated classes.
+         *
+         * In classes decorated with @spina, static members should be accessed
+         * via `this.constructor` instead of the class name to ensure proper
+         * inheritance behavior.
+         */
+        '@beanbag/spina-wrapped-static-access': 'error',
     },
 };
 
@@ -1388,3 +1399,8 @@
         RB: false,
     },
 };
+
+
+export const rules = {
+    'spina-wrapped-static-access': spinaWrappedStaticAccess,
+};
diff --git a/src/rules/spina-wrapped-static-access.ts b/src/rules/spina-wrapped-static-access.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6b300e835e15cb74df3ffc51a096e8c9400ae04e

--- /dev/null
+++ b/src/rules/spina-wrapped-static-access.ts
@@ -0,0 +1,294 @@
+/**
+ * Rule to detect direct static member access in @spina decorated classes.
+ */
+
+import {
+    type TSESTree,
+    ESLintUtils,
+    TSESLint,
+} from '@typescript-eslint/utils';
+
+
+type MessageIds = (
+    'avoidDirectStaticAccess' |
+    'avoidDirectStaticAccessInStatic'
+);
+
+type Options = [];
+
+
+/**
+ * Check if a decorator is the @spina decorator.
+ *
+ * Args:
+ *     decorator (TSESTree.Decorator):
+ *         The decorator node.
+ *
+ * Returns:
+ *     boolean:
+ *     ``true`` if the decorator is the ``@spina`` decorator. ``false``,
+ *     otherwise.
+ */
+function isSpinaDecorator(
+    decorator: TSESTree.Decorator,
+): boolean {
+    const expr = decorator.expression;
+
+    if (expr.type === 'Identifier' &&
+        (expr as TSESTree.Identifier).name === 'spina') {
+        return true;
+    }
+
+    /* Handle @spina() with call expression. */
+    if (expr.type === 'CallExpression' && expr.callee.type === 'Identifier') {
+        return (expr.callee as TSESTree.Identifier).name === 'spina';
+    }
+
+    return false;
+}
+
+/**
+ * Check if the class already has a constructor declaration
+ *
+ * Args:
+ *     classNode (TSESTree.ClassDeclaration):
+ *         The class node.
+ *
+ * Returns:
+ *     ``true`` if the class has a ``declare: ['constructor']`` line.
+ *     ``false``, otherwise.
+ */
+function hasCtorDeclaration(
+    classNode: TSESTree.ClassDeclaration,
+): boolean {
+    const classBody = classNode?.body?.body || [];
+
+    return classBody.some((member: TSESTree.ClassElement) => {
+        return (
+            member.type === 'PropertyDefinition' &&
+            member.key?.type === 'Literal' &&
+            member.key?.value === 'constructor' &&
+            member.declare === true
+        );
+    });
+}
+
+/**
+ * Create fixes for replacing static member access.
+ *
+ * Args:
+ *     fixer (TSESLint.RuleFixer):
+ *         The fixer object.
+ *
+ *     context (TSESLint.RuleContext):
+ *         The rule context.
+ *
+ *     memberExpr (TSESTree.MemberExpression):
+ *         The expression node for the member assignment.
+ *
+ *     currentClassNode (TSESTree.ClassDeclaration):
+ *         The node for the current class.
+ *
+ *     currentSpinaClassName (string):
+ *         The name of the current class.
+ *
+ *     constructorDeclarationAdded (boolean):
+ *         Whether the class has the ``declare ['constructor']``
+ *         definition added.
+ *
+ * Returns:
+ *     Array of TSESLint.RuleFix:
+ *     The fixes to apply.
+ */
+function createFixes(
+    fixer: TSESLint.RuleFixer,
+    context: TSESLint.RuleContext<MessageIds, Options>,
+    memberExpr: TSESTree.MemberExpression,
+    currentClassNode: TSESTree.ClassDeclaration,
+    currentSpinaClassName: string,
+    constructorDeclarationAdded: boolean,
+): TSESLint.RuleFix[] {
+    const sourceCode = context.sourceCode;
+    const fixes = [];
+
+    /*
+     * If no constructor declaration exists and we haven't added it yet,
+     * add it.
+     */
+    if (!hasCtorDeclaration(currentClassNode) &&
+        !constructorDeclarationAdded &&
+        currentClassNode?.body) {
+        const classBodyStart = currentClassNode.body.range[0] + 1;
+        const indentation =
+            sourceCode.getText(currentClassNode).match(/^(\s*)/)?.[1] || '';
+        const memberIndent = indentation + '    ';
+
+        fixes.push(
+            fixer.insertTextAfterRange(
+                [classBodyStart, classBodyStart],
+                `\n${memberIndent}declare ['constructor']: ` +
+                `typeof ${currentSpinaClassName};\n`,
+            ),
+        );
+    }
+
+    /* Replace ClassName.property with this.constructor.property. */
+    fixes.push(
+        fixer.replaceText(memberExpr.object, 'this.constructor'),
+    );
+
+    return fixes;
+}
+
+
+const rule = ESLintUtils.RuleCreator.withoutDocs({
+    defaultOptions: [],
+    meta: {
+        docs: {
+            description:
+                'Disallow direct static member access in @spina decorated ' +
+                'classes',
+        },
+        fixable: 'code',
+        messages: {
+            avoidDirectStaticAccess:
+                'Avoid accessing static members via class name ' +
+                '"{{className}}" in @spina decorated classes. Use ' +
+                '"this.constructor.{{propertyName}}" instead in ' +
+                'instance methods.',
+            avoidDirectStaticAccessInStatic:
+                'Avoid accessing static members via class name ' +
+                '"{{className}}" in @spina decorated classes. This ' +
+                'cannot be fixed in static methods - consider ' +
+                'refactoring.',
+        },
+        schema: [],
+        type: 'problem',
+    },
+
+    create(
+        context: TSESLint.RuleContext<MessageIds, Options>,
+    ): TSESLint.RuleListener {
+        let currentSpinaClassName: string | null = null;
+        let currentClassNode: TSESTree.ClassDeclaration | null = null;
+        let inStaticMethod = false;
+        let constructorDeclarationAdded = false;
+
+        return {
+            ClassDeclaration(
+                node: TSESTree.ClassDeclaration,
+            ): void {
+                /* Check if this class has the @spina decorator. */
+                if (node.decorators && node.decorators.length > 0) {
+                    const hasSpinaDecorator = node.decorators.some(
+                        (decorator: TSESTree.Decorator) => {
+                            return isSpinaDecorator(decorator);
+                        });
+
+                    if (hasSpinaDecorator && node.id) {
+                        currentSpinaClassName = node.id.name;
+                        currentClassNode = node;
+                    }
+                }
+            },
+
+            'ClassDeclaration:exit'(): void {
+                currentSpinaClassName = null;
+                currentClassNode = null;
+                constructorDeclarationAdded = false;
+            },
+
+            MethodDefinition(
+                node: TSESTree.MethodDefinition,
+            ): void {
+                inStaticMethod = node.static === true;
+            },
+
+            'MethodDefinition:exit'(): void {
+                inStaticMethod = false;
+            },
+
+            MemberExpression(
+                node: TSESTree.MemberExpression,
+            ): void {
+                /* Only check if we're inside a @spina decorated class. */
+                if (!currentSpinaClassName) {
+                    return;
+                }
+
+                const memberExpr = node as TSESTree.MemberExpression;
+
+                /*
+                 * Check if the object is an identifier matching the class
+                 * name.
+                 */
+                if (memberExpr.object.type === 'Identifier') {
+                    const objectName =
+                        (memberExpr.object as TSESTree.Identifier).name;
+
+                    if (objectName !== currentSpinaClassName) {
+                        return;
+                    }
+
+                    /* Get the property name for the error message. */
+                    let propertyName = '(property)';
+
+                    if (memberExpr.property.type === 'Identifier') {
+                        propertyName =
+                            (memberExpr.property as TSESTree.Identifier).name;
+                    }
+
+                    /*
+                     * Report different messages for static vs instance
+                     * methods.
+                     */
+                    if (inStaticMethod) {
+                        /* No fix for static methods. */
+                        context.report({
+                            data: {
+                                className: currentSpinaClassName,
+                                propertyName,
+                            },
+                            messageId: 'avoidDirectStaticAccessInStatic',
+                            node,
+                        });
+                    } else {
+                        /* Provide fix for instance methods. */
+                        context.report({
+                            data: {
+                                className: currentSpinaClassName,
+                                propertyName,
+                            },
+                            fix(fixer: TSESLint.RuleFixer) {
+                                const fixes = createFixes(
+                                    fixer,
+                                    context,
+                                    memberExpr,
+                                    currentClassNode,
+                                    currentSpinaClassName,
+                                    constructorDeclarationAdded,
+                                );
+
+                                /*
+                                 * Mark that we've added the constructor
+                                 * declaration if it was added.
+                                 */
+                                if (!hasCtorDeclaration(currentClassNode) &&
+                                    !constructorDeclarationAdded) {
+                                    constructorDeclarationAdded = true;
+                                }
+
+                                return fixes;
+                            },
+                            messageId: 'avoidDirectStaticAccess',
+                            node,
+                        });
+                    }
+                }
+            },
+        };
+    },
+});
+
+
+export default rule;
diff --git a/tests/rules/spina-wrapped-static-access.spec.js b/tests/rules/spina-wrapped-static-access.spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..f70dd3a4676829cad908542ffb23c0cb35c89921

--- /dev/null
+++ b/tests/rules/spina-wrapped-static-access.spec.js
@@ -0,0 +1,413 @@
+/**
+ * Tests for @beanbag/spina-wrapped-static-access rule.
+ */
+
+const { RuleTester } = require('eslint');
+const rule = require('../../lib/index.js').rules['spina-wrapped-static-access'];
+
+// Configure RuleTester to use Jasmine's assertion methods
+RuleTester.describe = describe;
+RuleTester.it = it;
+
+const ruleTester = new RuleTester({
+    languageOptions: {
+        ecmaVersion: 2020,
+        sourceType: 'module',
+        parser: require('@typescript-eslint/parser'),
+    },
+});
+
+describe('spina-wrapped-static-access', () => {
+    ruleTester.run('spina-wrapped-static-access', rule, {
+        valid: [
+            // Class without @spina decorator
+            {
+                code: `
+                    class MyClass {
+                        static HELLO = 42;
+                        doThing() {
+                            console.log(MyClass.HELLO);
+                        }
+                    }
+                `,
+            },
+
+            // Using this.constructor (correct pattern)
+            {
+                code: `
+                    @spina
+                    class MyClass {
+                        static HELLO = 42;
+                        doThing() {
+                            console.log(this.constructor.HELLO);
+                        }
+                    }
+                `,
+            },
+
+            // Accessing different class's static
+            {
+                code: `
+                    @spina
+                    class MyClass {
+                        static HELLO = 42;
+                        doThing() {
+                            console.log(OtherClass.HELLO);
+                        }
+                    }
+                `,
+            },
+
+            // Static member outside of class
+            {
+                code: `
+                    @spina
+                    class MyClass {
+                        static HELLO = 42;
+                    }
+                    console.log(MyClass.HELLO);
+                `,
+            },
+
+            // Multiple decorators without @spina - should not trigger
+            {
+                code: `
+                    @otherDecorator
+                    @anotherDecorator
+                    class MyClass {
+                        static HELLO = 42;
+                        doThing() {
+                            console.log(MyClass.HELLO);
+                        }
+                    }
+                `,
+            },
+
+            // Multiple decorators with @spina but using correct pattern
+            {
+                code: `
+                    @otherDecorator
+                    @spina
+                    @anotherDecorator
+                    class MyClass {
+                        static HELLO = 42;
+                        doThing() {
+                            console.log(this.constructor.HELLO);
+                        }
+                    }
+                `,
+            },
+        ],
+
+        invalid: [
+            // Instance method accessing own static via class name
+            {
+                code: `
+                    @spina
+                    class MyClass {
+                        static HELLO = 42;
+                        doThing() {
+                            console.log(MyClass.HELLO);
+                        }
+                    }
+                `,
+                output: `
+                    @spina
+                    class MyClass {
+    declare ['constructor']: typeof MyClass;
+
+                        static HELLO = 42;
+                        doThing() {
+                            console.log(this.constructor.HELLO);
+                        }
+                    }
+                `,
+                errors: [
+                    {
+                        messageId: 'avoidDirectStaticAccess',
+                        data: {
+                            className: 'MyClass',
+                            propertyName: 'HELLO',
+                        },
+                        type: 'MemberExpression',
+                    },
+                ],
+            },
+
+            // Multiple static accesses
+            {
+                code: `
+                    @spina
+                    class MyClass {
+                        static HELLO = 42;
+                        static WORLD = 99;
+                        doThing() {
+                            console.log(MyClass.HELLO);
+                            console.log(MyClass.WORLD);
+                        }
+                    }
+                `,
+                output: `
+                    @spina
+                    class MyClass {
+    declare ['constructor']: typeof MyClass;
+
+                        static HELLO = 42;
+                        static WORLD = 99;
+                        doThing() {
+                            console.log(this.constructor.HELLO);
+                            console.log(this.constructor.WORLD);
+                        }
+                    }
+                `,
+                errors: [
+                    {
+                        messageId: 'avoidDirectStaticAccess',
+                        data: {
+                            className: 'MyClass',
+                            propertyName: 'HELLO',
+                        },
+                    },
+                    {
+                        messageId: 'avoidDirectStaticAccess',
+                        data: {
+                            className: 'MyClass',
+                            propertyName: 'WORLD',
+                        },
+                    },
+                ],
+            },
+
+            // Static method accessing own static via class name
+            {
+                code: `
+                    @spina
+                    class MyClass {
+                        static HELLO = 42;
+                        static staticMethod() {
+                            console.log(MyClass.HELLO);
+                        }
+                    }
+                `,
+                errors: [
+                    {
+                        messageId: 'avoidDirectStaticAccessInStatic',
+                        data: {
+                            className: 'MyClass',
+                            propertyName: 'HELLO',
+                        },
+                        type: 'MemberExpression',
+                    },
+                ],
+            },
+
+            // @spina() with parentheses
+            {
+                code: `
+                    @spina()
+                    class MyClass {
+                        static HELLO = 42;
+                        doThing() {
+                            console.log(MyClass.HELLO);
+                        }
+                    }
+                `,
+                output: `
+                    @spina()
+                    class MyClass {
+    declare ['constructor']: typeof MyClass;
+
+                        static HELLO = 42;
+                        doThing() {
+                            console.log(this.constructor.HELLO);
+                        }
+                    }
+                `,
+                errors: [
+                    {
+                        messageId: 'avoidDirectStaticAccess',
+                    },
+                ],
+            },
+
+            // Variable assignment
+            {
+                code: `
+                    @spina
+                    class MyClass {
+                        static FOO = 1;
+                        test() {
+                            const x = MyClass.FOO;
+                        }
+                    }
+                `,
+                output: `
+                    @spina
+                    class MyClass {
+    declare ['constructor']: typeof MyClass;
+
+                        static FOO = 1;
+                        test() {
+                            const x = this.constructor.FOO;
+                        }
+                    }
+                `,
+                errors: [
+                    {
+                        messageId: 'avoidDirectStaticAccess',
+                        data: {
+                            className: 'MyClass',
+                            propertyName: 'FOO',
+                        },
+                    },
+                ],
+            },
+
+            // Multiple decorators with @spina first
+            {
+                code: `
+                    @spina
+                    @otherDecorator
+                    class MyClass {
+                        static HELLO = 42;
+                        doThing() {
+                            console.log(MyClass.HELLO);
+                        }
+                    }
+                `,
+                output: `
+                    @spina
+                    @otherDecorator
+                    class MyClass {
+    declare ['constructor']: typeof MyClass;
+
+                        static HELLO = 42;
+                        doThing() {
+                            console.log(this.constructor.HELLO);
+                        }
+                    }
+                `,
+                errors: [
+                    {
+                        messageId: 'avoidDirectStaticAccess',
+                        data: {
+                            className: 'MyClass',
+                            propertyName: 'HELLO',
+                        },
+                    },
+                ],
+            },
+
+            // Multiple decorators with @spina in the middle
+            {
+                code: `
+                    @otherDecorator
+                    @spina
+                    @anotherDecorator
+                    class MyClass {
+                        static VALUE = 99;
+                        method() {
+                            return MyClass.VALUE;
+                        }
+                    }
+                `,
+                output: `
+                    @otherDecorator
+                    @spina
+                    @anotherDecorator
+                    class MyClass {
+    declare ['constructor']: typeof MyClass;
+
+                        static VALUE = 99;
+                        method() {
+                            return this.constructor.VALUE;
+                        }
+                    }
+                `,
+                errors: [
+                    {
+                        messageId: 'avoidDirectStaticAccess',
+                        data: {
+                            className: 'MyClass',
+                            propertyName: 'VALUE',
+                        },
+                    },
+                ],
+            },
+
+            // Multiple decorators with @spina last
+            {
+                code: `
+                    @otherDecorator
+                    @anotherDecorator
+                    @spina
+                    class MyClass {
+                        static DATA = 'test';
+                        getData() {
+                            return MyClass.DATA;
+                        }
+                    }
+                `,
+                output: `
+                    @otherDecorator
+                    @anotherDecorator
+                    @spina
+                    class MyClass {
+    declare ['constructor']: typeof MyClass;
+
+                        static DATA = 'test';
+                        getData() {
+                            return this.constructor.DATA;
+                        }
+                    }
+                `,
+                errors: [
+                    {
+                        messageId: 'avoidDirectStaticAccess',
+                        data: {
+                            className: 'MyClass',
+                            propertyName: 'DATA',
+                        },
+                    },
+                ],
+            },
+
+            // Multiple decorators with @spina() call expression
+            {
+                code: `
+                    @otherDecorator
+                    @spina()
+                    @yetAnother
+                    class MyClass {
+                        static COUNT = 0;
+                        increment() {
+                            MyClass.COUNT++;
+                        }
+                    }
+                `,
+                output: `
+                    @otherDecorator
+                    @spina()
+                    @yetAnother
+                    class MyClass {
+    declare ['constructor']: typeof MyClass;
+
+                        static COUNT = 0;
+                        increment() {
+                            this.constructor.COUNT++;
+                        }
+                    }
+                `,
+                errors: [
+                    {
+                        messageId: 'avoidDirectStaticAccess',
+                        data: {
+                            className: 'MyClass',
+                            propertyName: 'COUNT',
+                        },
+                    },
+                ],
+            },
+        ],
+    });
+});
