# Typo3 Conformance

> Use when checking which TYPO3 versions an extension says it supports, when composer.json and ext_emconf.php disagree, when a version bump has left some of the files that state it behind, when reviewing a TYPO3 extension for what needs attention, or when auditing coding standards, TER readiness, deprecations and modernization to v12/v13/v14 (v14.3 LTS is the default). Raising an extension to a newer TYPO3 version is not this skill: that belongs to typo3-extension-upgrade.

- Skill: `netresearch/typo3-conformance` (Agent Skill, multi-file: 43 files)
- Install (CLI): `npx skillmds@latest add netresearch/typo3-conformance`
- Raw SKILL.md: https://api.skillmd.com/api/skills/netresearch/typo3-conformance/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: netresearch (https://skillmd.com/u/netresearch)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/netresearch/typo3-conformance

---


# TYPO3 Extension Conformance Checker

Evaluate TYPO3 extensions against TYPO3 coding standards, architecture patterns, and best practices.

## When to Use

- Extension quality / TER readiness
- Scored conformance reports
- Modernization to v12/v13/v14 (**v14.3 LTS is default/gold standard**)

## Delegation

Testing -> `typo3-testing` | Docs -> `typo3-docs` | OpenSSF -> `enterprise-readiness` | Release/TER -> `github-release`

**Raising the extension onto a newer TYPO3 version -> `typo3-extension-upgrade`, and stop here.** Measured: asked to make an extension work with the current LTS, agents loaded this skill instead and delivered a conformance pass — `ext_tables.php` removed, deprecated calls searched, `strict_types` counted — then reported done. The manifest still named the old versions and nothing had been installed or tested against the new one. An audit of the current state is not an upgrade, and a widened constraint is not one either. If the request is a version raise, hand it over rather than auditing what is in front of you.

**Scope:** extensions only. **Site/project** repos (`type: project` + Compose) — score with the gold checker [`typo3-14-gold`](https://git.netresearch.de/typo3/typo3-14-gold)`/tools/conformance`.

## Workflow

### Step 0: Context

Read ext_emconf.php + composer.json for version, type, scope.

### Steps 1-11: Checks

1. **Metadata** -- key, TYPO3 version, type
2. **Structure** -- composer.json, ext_emconf.php, Classes/, Configuration/, Resources/
3. **Coding** -- strict_types, PSR-12, PHP 8.4 explicit nullable, PHP 8.5 float-to-int
4. **Prohibited** -- no `$GLOBALS`, no `GeneralUtility::makeInstance()` for services
5. **Architecture** -- constructor DI, Services.yaml, PSR-14 events (try/catch), PSR-3 logging (LoggerAware+NullLogger), factory fallback
6. **Backend** -- ES6, Modal API, CSRF, CSP (v13+)
7. **Testing** -- PHPUnit, Playwright E2E, coverage >70%
8. **Practices** -- DDEV, runTests.sh, CI/CD
9. **TER** -- publish workflow, upload comment
10. **Audit** -- PHPStan baseline, TCA searchFields, XLIFF, cache has()+get(), query properties, multi-version adapters
11. **v14 readiness** -- no `ext_tables.php`/`HashService`/magic finders; Fluid VHs strict; XLF 2-space. See `references/v14-deprecations.md`.

### Step 12: Verify

Re-run after fixes. Document score delta.

## Quick Grep Recipes

```bash
grep -rL 'strict_types' Classes/ --include='*.php'
grep -rn '\$GLOBALS' Classes/ --include='*.php'
grep -rn 'GeneralUtility::makeInstance' Classes/ --include='*.php'
grep -rPn '\(\s*[A-Za-z\\]+\s+\$\w+\s*=\s*null' Classes/ --include='*.php' | grep -v '?'  # PHP 8.4 implicit nullable
grep -rn '->has(' Classes/ --include='*.php'                          # cache has()+get() anti-pattern
grep -l 'strict_types' ext_emconf.php                                 # ext_emconf must NOT have strict_types
grep -rn '(int)\s*\$' Classes/ --include='*.php'                      # PHP 8.5 implicit float-to-int
grep -rn 'data-toggle\|data-dismiss\|data-ride' Resources/ --include='*.html'  # Bootstrap 4 in Fluid
grep -rn 'HashService\|GeneralUtility::hmac(\|->findBy[A-Z]\|->findOneBy[A-Z]\|->countBy[A-Z]' Classes/ --include='*.php'  # v14 removals
[ -f ext_tables.php ] && echo "WARN: ext_tables.php deprecated (#109438)"   # v14.3 deprecation
```

## Scoring

**Base (0-100):** Architecture(20) + Guidelines(20) + PHP(20) + Testing(20) + Practices(20). Excellence bonus up to 22. Critical issues block regardless.

| Range | Level | Action |
|-------|-------|--------|
| 90+ | Excellent | Production/TER ready |
| 80-89 | Good | Minor fixes |
| 70-79 | Acceptable | Fix before release |
| 50-69 | Needs Work | Significant effort |
| <50 | Critical | Block deployment |

## References

See `references/`:

- **Architecture & code:** `extension-architecture.md`, `directory-structure.md`, `php-architecture.md`, `coding-guidelines.md`, `best-practices.md`, `hooks-and-events.md`
- **Validation:** `composer-validation.md`, `ext-emconf-validation.md`, `ext-files-validation.md`, `runtests-validation.md`, `version-requirements.md`, `testing-standards.md`
- **Multi-version:** `dual-version-compatibility.md`, `v13-v14-dual-compatibility.md`, `multi-version-dependency-compatibility.md`, `v13-deprecations.md`, `v14-deprecations.md`
- **Practices & backend:** `development-environment.md`, `backend-module-v13.md`, `ter-publishing.md`, `report-template.md`, `excellence-indicators.md`, `localization-coverage.md`, `crowdin-integration.md`

Asset templates in `assets/Build/`: PHPStan, PHP-CS-Fixer, Rector, ESLint, Stylelint, TypoScript lint.

