Repository navigation
Close the v2 re-audit's configs findings - #56
Merged
Merged
Conversation
The release compared the entry's Requires PHP with the require.php of the production packages in vendor/ and the scoped ones in vendor-prefixed/, but never with the project's own composer.json. A plugin that raised its own floor for its own syntax and forgot its header shipped, and with Composer's platform check off the header is the only gate, so sites between the two passed it and failed to parse the plugin. The baseline .distignore and the archive's forbidden-entry check both matched phpunit.xml* only, which misses phpunit.dist.xml, PHPUnit's default name. The header check now reads the project's composer.json beside the shipped packages, and both exclusions match phpunit*.xml*. A row whose root alone requires the higher floor and a phpunit.dist.xml archive row fail without the change. Assisted-by: Claude Code:claude-opus-5-5
AGENTS.md says the unit tests run the release's assertion steps, but "Assert scoped packages bundled", "Verify required workflows passed", the release-notes extraction and the opt-in phpstan.dist.neon.php path discovery had no row, so a change to their logic would pass. They fail closed, but nothing pinned what they accept. Rows now run each step: a complete scoped archive, a missing autoloader or package and a build whose scoping never ran; every, one or no required workflow among the push runs, a malformed list and an unavailable API; a dated, a bracketed and an absent changelog section, a heading whose dots are not wildcards and no changelog at all; and the path discovery over a plugin-shaped directory. Assisted-by: Claude Code:claude-opus-5-5
node/tsconfig.base.json carries only deltas from TypeScript 6's defaults, strict mode among them, but the package declared no typescript peer, so a consumer resolving TypeScript 5 turned strict off without a word. The package lists typescript >=6.0.0 beside its other tool peers, the major it is tested against (6.0.3), and the README names it. Assisted-by: Claude Code:claude-opus-5-5
The README's Requirements gave PHP 8.5, Node 26, npm 11 and WordPress 7.1 as numbers that composer.json, package.json and the PHPCS and PHPStan profiles own, and AGENTS.md required the copies, so a floor change had to edit prose in step with the manifests. The style guide allows no number another file owns, as the framework's READMEs follow. The README names each file and key that holds a floor, and AGENTS.md says so instead. Assisted-by: Claude Code:claude-opus-5-5
Six comments in the workflows and dependabot.yml ran to several sentences, one with an all-caps MUST, against the rule that an inline comment states a non-obvious why in one sentence. Each now states its why once. Assisted-by: Claude Code:claude-opus-5-5
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.
Summary
Five fixes from the v2 re-audit:
the release let a plugin ship with a
Requires PHPbelow its owncomposer.jsonfloor, and it packedphpunit.dist.xml;four release steps and the PHPStan path discovery had no test;
the Node baselines assume TypeScript 6 but declared no
typescriptpeer;the README stated floors as numbers that its manifests own.
Release floor: the header check reads the project's own
composer.jsonbeside the shipped packages, soRequires PHPmust cover the plugin's own floor too.docs/workflows.mdsays so.phpunit.dist.xml: the baseline.distignoreand the archive's forbidden-entry check matchphpunit*.xml*, sophpunit.dist.xml, PHPUnit's default name, stays out of the zip.Release-gate tests: new rows run four steps that had none:
phpstan.dist.neon.php's path discovery, over a plugin-shaped directory.TypeScript peer:
typescript >=6.0.0joins the tool peers.node/tsconfig.base.jsoncarries only deltas from TypeScript 6's strict defaults, so TypeScript 5 silently turned strict mode off. The lock moves only its root entry.Docs and comments: the README and
AGENTS.mdname each floor by the file and key that hold it, and six workflow comments each state their why in one sentence.Workflows +12 −29 (4 files), tests +193 (2 files), docs +6 −6 (3 files),
.distignore+1 −1, npm manifest and lock +4 −3.Type of change
.github/workflows/reusable-*.yml)php/quality-assurance/)Checklist
tests/Unit/):ReleaseWorkflowTest: a rootcomposer.jsonrequiring PHP 8.5 againstRequires PHP: 7.4, and an archive holdingphpunit.dist.xml, both passed the old steps and fail the new ones;PhpstanConfigTest: path discovery adds the conventional root files and source directories and scansvendor-prefixed/.composer testpasses locally:composer quality-check: PHPCS on both profiles, PHPStan and 149 tests;npm run lint:scripts,npm run lint:config, actionlint and zizmor pass.docs/workflows.mdis updated to reflect the new contract. There are no input or output changes; the release's floor rule indocs/workflows.mdnames the project's owncomposer.json.Breaking changes for downstream consumers
Requires PHPis below the project's ownrequire.phpnow fails its build, because the header understated the plugin's floor.typescript >=6.0.0peer, which npm reports as a conflict.Not in this PR: the release's archive tools (WP-CLI,
dist-archive-commandand the i18n command behindwp i18n make-pot) still install unlocked. Locking them needs a decision on where the lock lives, because a consumer ofreusable-release.ymlneed not install this package and a reusable workflow cannot read its own commit.