- Added the `advertisements/adsense` module with request normalization, controlled pagination state, AppList view, and a lazy nested route.
- Preserved the legacy list request (`page`/`page_size`, form-encoded POST), the three original columns, controlled status Switch, exact change-status permission, and refresh of the current page after a successful mutation.
- The mutation sends status as the required string (`"1"`/`"0"`). Failed mutations leave the displayed server row unchanged.
- Removed `pages/advertisement/adsense/index.jsx` after routing had switched to the new module.
## Compatibility exception
`pages/advertisement/adsense/request.js` remains intentionally: the un-migrated `pages/advertisement/advert/index.jsx` imports its `getPositionList` helper. Removing it breaks the unrelated advert page and the admin build. The new AdSense module does not import this compatibility file.
## Verification
- Focused state regression test: 2 passed (`useAdsenseList.test.tsx`) using an ephemeral Vitest config because the tracked admin Vitest config only includes `src/test/**` and therefore excludes module-local tests.
-`pnpm build`: passed for learning and admin.
-`pnpm test`: admin's 11 tests passed; the overall workspace command failed in pre-existing learning tests (`src/modules/my/routes.test.tsx`, `src/api/http-auth.test.ts`) unrelated to this migration.