---
title: "ADR-0015: One installable extension"
manual: "HTTP Guard"
version: "main"
permalink: "https://docs.typo3.org/permalink/netresearch/nr-http-guard:adr-0015@main"
source: "Adr/ADR-0015-SingleExtension.rst"
rendered: "2026-10-18T14:31:38+00:00"
---

<a id="decision-single-extension"></a>

# ADR-0015: One installable extension {#adr-0015}

-   *Status:* Accepted
-   *Date:* 2026-10-09
-   *Supersedes:* ADR-0002, package and publication proposal

## Context {#decision-single-extension-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 {#decision-single-extension-choice}

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](https://docs.typo3.org/permalink/netresearch/nr-http-guard:adr-index@main). 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](https://docs.typo3.org/permalink/netresearch/nr-http-guard:development-requirements@main) 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](https://docs.typo3.org/permalink/netresearch/nr-http-guard:adr-0016@main),
[ADR-0017: Controlled DNS queries for the default resolver](https://docs.typo3.org/permalink/netresearch/nr-http-guard:adr-0017@main) and [ADR-0018: One cURL factory creation per transfer lease](https://docs.typo3.org/permalink/netresearch/nr-http-guard:adr-0018@main).

## Alternatives considered {#adr-0015-alternatives}

The separate library and adapter packages proposed in [ADR-0002: A shared library instead of a Vault dependency for every extension](https://docs.typo3.org/permalink/netresearch/nr-http-guard:adr-0002@main)
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 {#decision-single-extension-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.
