chore: release 0.27.0 - #782
Merged
Merged
Conversation
Cut the 0.27.0 release: promote the Unreleased section to a dated release entry, restore a fresh Unreleased section, and add the missing changelog entry for #681.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Cut the 0.27.0 release: promote the
[Unreleased]section ofCHANGELOG.mdto a dated release entry and restore a fresh[Unreleased]section.Also adds the missing changelog entry for #681 (merge of the duplicate
allowlist bullet in
docs/security.md), which was merged on master inthe 0.27.0 window but had no changelog entry (completeness check stage).
What's in 0.27.0
The promoted section carries 28 entries across five categories — Docs,
Added, Fixed, Performance and Tests. Highlights, each with its issue
link:
Added: deprecation-removal plan for 1.0 ([Docs] Deprecations have no removal plan — serve_files has been deprecated for 15 minor releases #595); parallel Docker
test runs across git worktrees ([Enhancement] Run the Dockerized test suite in parallel across git worktrees without port conflicts #676); opt-out for the config-cache
permission guard ([Enhancement] Add an explicit opt-out for the config-cache ownership guard #648); cookie-count capping deviation ([Nit] Cookie parsing ignores PHP's max_input_vars — FPM silently drops past the limit, bundle parses all #628);
cause-specific ServerNotRunningException ([Enhancement] ServerNotRunningException message is indistinguishable for "not running" vs "running but unverifiable" #657); docs-only CI
skip-propagation ([CI] Skip full lint/test matrix for docs-only and workflow-doc changes #619);
Connection: closeon streamed HTTP/1.1responses ([Nit] Streamed responses don't echo Connection: close to HTTP/1.1 clients that ask for it #621).
Performance: ResponseConverter header-name normalisation cache
bound ([Memory leak] ResponseConverter header-name normalisation cache is an unbounded process-lifetime static #574) and related optimisations ([Performance] StaticFilesMiddleware realpath cache uses O(n) array_shift eviction and thrashes on high-cardinality URLs #558, [Performance] PollingMonitorWatcher restarts tree traversal from the root on every tick #559, [Performance] RequestConverter control-character filter runs preg_match per header per request — consider strpbrk/strcspn #630).
Tests/CI/tooling: runner scope and scheduler fixes ([Tests] 43 fixed-duration usleep() waits plus "sleep 1" in composer test — Util\Wait::until() already exists #592, [Tests] ConfigLoaderTest::setUp() creates temp dirs with 0777 subject to umask — directory-permission guard makes fixtures environment-dependent #613,
[Code Quality] ConfigLoader E_USER_WARNING fallback escalates to a hard exception under a throwing error handler — untested and undocumented #615, SchedulerWorkerTest: willReturn(DateTimeImmutable('+1 second')) evaluates once and shared 'test_service' key causes static $tickCallbacks cross-test deduplication #668), lint metadata items ([CI] No structural validation for CHANGELOG.md — duplicate headings, stale entries, and format violations pass CI silently #654, [Enhancement] Provide a Dockerfile for running the test suite without local PHP/extensions #674, [Enhancement] Run the Dockerized test suite in parallel across git worktrees without port conflicts #676), config(/timeout)
flexibility ([Enhancement] Allow disabling connection_timeout/keepalive_timeout from YAML — config min(1) contradicts ServerWorker's 0=disabled semantics #625, [Enhancement] Add an explicit opt-out for the config-cache ownership guard #648, [Nit] Streamed responses don't echo Connection: close to HTTP/1.1 clients that ask for it #621, [Enhancement] ServerNotRunningException message is indistinguishable for "not running" vs "running but unverifiable" #657).
Docs: UPGRADE.md backfill for 0.18–0.24 ([Docs] UPGRADE.md has no sections for 0.18–0.24 despite BC-relevant changes #656), deprecation plan
([Docs] Deprecations have no removal plan — serve_files has been deprecated for 15 minor releases #595), docs/workflow cleanups ([Docs] security.md: "Use the allowlist" bullet is a verbatim subset of "Prefer the allowlist over the denylist" — merge into one #681, [CI] Workflow runs on pull_request only — master is never verified and composer audit never re-runs #597, [Docs] 0.25.0 release notes: undocumented BC break in ResponseConverterStrategyInterface, duplicate Fixed heading, stale #571 entry #641, [Performance] ResponseConverter::extractHeaders() re-lowercases every header name that HeaderNameNormalizer already lowercased internally #726).
Checklist
[0.27.0] - 2026-08-23)[Unreleased]restored on top[CI] Include bin/ scripts in php-cs-fixer, PHPStan, and Rector coverage #635 lives in the 0.26.0 section as that change landed before 0.26 was
cut; bin/pow.php --round is hard-coupled to the pi harness's .pi-subagents/ layout, undocumented as a prerequisite #692 closed as
NOT_PLANNED, a process meta-issue, so it iscorrectly outside the product changelog)
v0.27.0+ tagv0.27.0after merge