Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ jobs:
engine = "../guard-core-php/composer.json"
with open(engine) as f:
d = json.load(f)
d["version"] = "4.2.99"
d["version"] = "4.3.99"
with open(engine, "w") as f:
json.dump(d, f, indent=4)
f.write("\n")
Expand All @@ -85,7 +85,7 @@ jobs:
psr15 = "../psr15-guard/composer.json"
with open(psr15) as f:
d = json.load(f)
d["version"] = "1.2.99"
d["version"] = "1.3.99"
with open(psr15, "w") as f:
json.dump(d, f, indent=4)
f.write("\n")
Expand Down Expand Up @@ -165,7 +165,7 @@ jobs:
engine = "../guard-core-php/composer.json"
with open(engine) as f:
d = json.load(f)
d["version"] = "4.2.99"
d["version"] = "4.3.99"
with open(engine, "w") as f:
json.dump(d, f, indent=4)
f.write("\n")
Expand All @@ -177,7 +177,7 @@ jobs:
psr15 = "../psr15-guard/composer.json"
with open(psr15) as f:
d = json.load(f)
d["version"] = "1.2.99"
d["version"] = "1.3.99"
with open(psr15, "w") as f:
json.dump(d, f, indent=4)
f.write("\n")
Expand Down Expand Up @@ -251,15 +251,15 @@ jobs:
engine = "../guard-core-php/composer.json"
with open(engine) as f:
d = json.load(f)
d["version"] = "4.2.99"
d["version"] = "4.3.99"
with open(engine, "w") as f:
json.dump(d, f, indent=4)
f.write("\n")

psr15 = "../psr15-guard/composer.json"
with open(psr15) as f:
d = json.load(f)
d["version"] = "1.2.99"
d["version"] = "1.3.99"
with open(psr15, "w") as f:
json.dump(d, f, indent=4)
f.write("\n")
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -63,15 +63,15 @@ jobs:
engine = "../guard-core-php/composer.json"
with open(engine) as f:
d = json.load(f)
d["version"] = "4.2.99"
d["version"] = "4.3.99"
with open(engine, "w") as f:
json.dump(d, f, indent=4)
f.write("\n")

psr15 = "../psr15-guard/composer.json"
with open(psr15) as f:
d = json.load(f)
d["version"] = "1.2.99"
d["version"] = "1.3.99"
with open(psr15, "w") as f:
json.dump(d, f, indent=4)
f.write("\n")
Expand Down Expand Up @@ -151,15 +151,15 @@ jobs:
engine = "../guard-core-php/composer.json"
with open(engine) as f:
d = json.load(f)
d["version"] = "4.2.99"
d["version"] = "4.3.99"
with open(engine, "w") as f:
json.dump(d, f, indent=4)
f.write("\n")

psr15 = "../psr15-guard/composer.json"
with open(psr15) as f:
d = json.load(f)
d["version"] = "1.2.99"
d["version"] = "1.3.99"
with open(psr15, "w") as f:
json.dump(d, f, indent=4)
f.write("\n")
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/scheduled-lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ jobs:
engine = "../guard-core-php/composer.json"
with open(engine) as f:
d = json.load(f)
d["version"] = "4.2.99"
d["version"] = "4.3.99"
with open(engine, "w") as f:
json.dump(d, f, indent=4)
f.write("\n")
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/static-analysis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -64,15 +64,15 @@ jobs:
engine = "../guard-core-php/composer.json"
with open(engine) as f:
d = json.load(f)
d["version"] = "4.2.99"
d["version"] = "4.3.99"
with open(engine, "w") as f:
json.dump(d, f, indent=4)
f.write("\n")

psr15 = "../psr15-guard/composer.json"
with open(psr15) as f:
d = json.load(f)
d["version"] = "1.2.99"
d["version"] = "1.3.99"
with open(psr15, "w") as f:
json.dump(d, f, indent=4)
f.write("\n")
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/upstream-drift.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ jobs:
engine = "core-upstream/composer.json"
with open(engine) as f:
d = json.load(f)
d["version"] = "4.2.99"
d["version"] = "4.3.99"
with open(engine, "w") as f:
json.dump(d, f, indent=4)
f.write("\n")
Expand Down Expand Up @@ -84,7 +84,7 @@ jobs:
-e REDIS_HOST=127.0.0.1 \
composer:2 sh -c '
set -e
composer require --no-update --no-interaction "rennf93/guard-core-php:4.2.99"
composer require --no-update --no-interaction "rennf93/guard-core-php:4.3.99"
composer update --no-interaction --no-progress "rennf93/guard-core-php"
composer lint
php bin/test_slim.php
Expand Down
19 changes: 19 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,25 @@ Release Notes

___

v1.3.0 (2026-10-01)
-------------------

### Changed

- **Both floors rise: `rennf93/guard-core-php` ^4.3.0 and `rennf93/psr15-guard` ^1.3.0.** 1.3.0 tracks the safety-corpus train: the engine ships the spec 12 event bus with dynamic rules and Redis-backed metrics persistence, the spec 10 geo download and refresh lifecycle, the spec 04 ReDoS safety gates over PCRE plus the performance monitor, and the pattern_safety / events / redis_interop conformance runners, while the composed psr15-guard 1.3.0 floors that engine and carries the process scaffold and the coverage gate. Nothing in the Slim surface changes: SlimGuard composes the psr15-guard middleware, so the new engine surfaces ride config through the unchanged factory wiring. The CI sibling version stamps move with the floors (engine 4.2.99 -> 4.3.99, psr15-guard 1.2.99 -> 1.3.99 in ci.yml, release.yml, static-analysis.yml, upstream-drift.yml, scheduled-lint.yml) so the floors resolve against the master siblings while the published constraints stay ^4.3.0/^1.3.0, and `composer.lock` resolves both packages at their released v4.3.0 / v1.3.0.

### Added

- **Release Gate and lock fixes (PRs #18, #19).** The v1.2.0 tag's Release Gate failed at Install dependencies with `Source path ../psr15-guard is not found` (the 1.2.0 release added the psr15-guard ^1.2.0 dependency and the ../psr15-guard path repository, and learned ci.yml the sibling checkout and the 1.2.99 stamp, but release.yml never got them): both release jobs (test matrix and composer-audit) now mirror the ci.yml pattern - check out psr15-guard@master into the sibling location, version-stamp it next to the engine, keep the two path repositories while dropping only the eager VCS entries, and composer update both path packages on install. The weekly Scheduled Lint was unbroken separately (PR #19): the committed composer.lock pinned the dev-stamp versions `guard-core-php 4.2.99` / `psr15-guard 1.2.99`, which exist in no registry, so `composer install` could not resolve psr15-guard from Packagist; the lock regenerated against the released versions and the scheduled-lint workflow itself was already correct (the engine path sibling resolves the stamped dev version via the existing composer update step).
- **Process scaffold (PR #20).** `SECURITY.md` (supported versions, advisory reporting), `CONTRIBUTING.md`, `CODE_OF_CONDUCT.md`, `.github/FUNDING.yml`, the PR template and the issue templates, modeled on the Go family and the fastapi-guard baseline. `.github/workflows/static-analysis.yml`: phpstan via the docker pattern these repos already use (composer:2 install with the same ci-only path-repository patch as ci.yml, then `ghcr.io/phpstan/phpstan:latest analyse src --level=5`), on push/pr to master plus the weekly Monday cron; level 5 is the highest level with zero findings on master (level 6 reports one generic return type). `.github/workflows/live-smoke.yml` gains the `live-smoke-advanced` job (the existing simple_app job untouched): a dockerized run of `examples/advanced_app` on host port 8081 asserting `GET /` and `GET /health` 200 plus one blocked-request check (`GET /admin/check?ip=203.0.113.9` without `X-Admin-Token` returns the admin gate's 400 "Missing required header: X-Admin-Token"). CodeQL was drafted and dropped after the first run proved GitHub CodeQL no longer supports PHP (`Did not recognize the following languages: php`); `.github/workflows/semgrep.yml` is the substitute, running the pinned semgrep/semgrep:1.177.0 container with the p/security-audit and p/secrets rulesets over src/ (path-filtered push/PR triggers plus a weekly Monday cron, metrics off).
- **100% line coverage gate (PR #21, following the psr15-guard pilot).** The bespoke `bin/test_*.php` suites stay as they are; `.github/coverage-runner.php` (phpunit/php-code-coverage ^11 + pcov) executes each suite under coverage in collect mode and a merge pass gates on 100.00% measured lines in src/. Coverage went from 70.59% to 100.00% lines (pcov, php 8.3): `bin/test_slim.php` (81 assertions) plus the new `bin/test_slim_no_psr7.php` (4 assertions) covering the documented no-slim/psr7 fallback in `SlimGuard::resolveStreamFactory()` - composer's autoloader cannot reach that branch (slim/psr7 is a dev dependency, so the soft class_exists reference always resolves in a composer-booted process), so the new suite boots through `tests/scoped_autoloader.php` with no composer autoloader and no slim/psr7 mapping, reproducing the production shape the branch exists for. The coverage job mirrors ci.yml's path-repo/stamp resolution and suite pass/fail stays gated by the existing test job.

### Verification

- `make lint` exit 0 and `make test` exit 0 on php 8.5.11 (host Redis on 6379, 81/81 checks green), with `composer.lock` resolving guard-core-php v4.3.0 and psr15-guard v1.3.0.

___

v1.2.0 (2026-09-27)
-------------------

Expand Down
4 changes: 2 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
"license": "MIT",
"require": {
"php": "^8.2",
"rennf93/guard-core-php": "^4.2.0",
"rennf93/psr15-guard": "^1.2.0",
"rennf93/guard-core-php": "^4.3.0",
"rennf93/psr15-guard": "^1.3.0",
"slim/slim": "^4.12",
"psr/http-factory": "^1.0"
},
Expand Down
34 changes: 19 additions & 15 deletions composer.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading