ADR-0015: One installable extension 

Status

Accepted

Date

2026-10-09

Supersedes

ADR-0002, package and publication proposal

Context 

The extension must include all its runtime components and its complete manual, and support installation in classic TYPO3 projects without a Composer command. An additional required library package would make this installation path depend on separate dependency management. The separation between policy and transport code and TYPO3 integration remains necessary for isolated tests and adapter development.

Decision 

One TYPO3 extension, netresearch/nr-http-guard, is supplied with the key nr_http_guard. The security core is under Classes/HttpGuard/, and its runtime data is under Resources/Private/HttpGuard/data/. The public PHP namespaces and APIs remain intact. TYPO3 registers both production namespaces from the bundled PSR-4 metadata.

The extension does not contain a second vendor copy. Classic projects use the dependencies of the official Core archive; Composer projects use their project locks. Production constraints use semantic ranges with explicit minima and supported majors. Runtime guards check the actual parent API, SDK capabilities and middleware inventory. A single-use public cURL factory limits each lease to at most one delegated factory creation, independently of private SDK retry counters. Fixed Core/SDK fixtures remain reproducible test snapshots; the currently tested official Core archives supply the Guzzle 8 graph.

The complete manual, requirements overview and accepted decisions are under Documentation/; maintained tests and build tools are under Tests/ and Build/. The numbered historical ADRs remain in Architecture decision records. Original Markdown specifications, raw runs and the optional foreign Vault overlay remain in immutable Git history and a verified external archive, rather than another installable package. See Requirements and security invariants for the original IDs and current mapping.

The implemented public Core RequestFactory boundary, controlled DNS wire backend and single-use SDK factory are detailed in ADR-0016: Public RequestFactory as the URI boundary, ADR-0017: Controlled DNS queries for the default resolver and ADR-0018: One cURL factory creation per transfer lease.

Alternatives considered 

The separate library and adapter packages proposed in ADR-0002: A shared library instead of a Vault dependency for every extension require separate dependency installation in classic TYPO3 projects. The single extension satisfies the requested TER installation path while retaining the internal separation between the security kernel and adapter. Bundling another vendor tree would duplicate Core dependencies and make their maintenance ambiguous; the extension uses the installed Core's graph.

Consequences 

Runtime loading paths and test configurations change; policy rules and APIs remain unchanged. The additional classic dependency row extends only the reproducible fixture coverage. Compatible patches and minors within the semantic ranges remain usable without a new extension release. Actual API incompatibilities and unsupported major graphs fail closed. Fixed and floating native CI rows exercise Core, wire and mutation-sensitive behavior; each recorded execution remains bound to its own source and dependency lock.

The package is a GPL-2.0-or-later extension that preserves the MIT notices of its embedded core. Its internal framework-independent structure allows separate core tests, but does not promise a second published Composer product. Alpha version 0.1.1 is published on TER and Packagist, with an importable extension ZIP. Publication does not establish an operator pilot or deployment of the historical nr-vault reference patch. The user has authorized alpha development and merging after repeated independent reviews and green applicable checks without an additional human acceptance gate.