CarterPerez-dev
d431e9014e
feat(rotators): Vault dynamic-secrets rotator + thin Vault client
...
Vault::Client wraps token-auth REST: read_dynamic, revoke_lease,
renew_lease, health. Errors surface as VaultError carrying status.
VaultDynamicRotator's rotation contract leans on Vault as the secret
factory:
- generate: read_dynamic (Vault issues new creds + lease)
- apply: no-op (Vault already provisioned)
- verify: lease renewal acts as liveness check
- commit: revoke OLD lease (tracked in current_lease_id tag)
- rollback_apply: revoke NEW lease
8 unit specs cover client method round-trips, rotator full path with
old-lease revocation, verify-on-Vault-error handling, rollback, and
the no-old-lease pass-through case.
2026-04-29 01:04:12 -04:00
CarterPerez-dev
7e23f58fbb
feat(rotators): AWS Secrets Manager rotator with SigV4 signer + secrets client
...
SigV4 implementation per AWS reference: canonical request -> string-to-sign
-> HMAC-derived signing key (kSecret -> kDate -> kRegion -> kService ->
kSigning) -> HMAC-SHA256 signature. Includes session token (STS) support.
SecretsManagerClient wraps PutSecretValue, GetSecretValue,
UpdateSecretVersionStage with custom endpoint support (LocalStack).
AWS API errors surface as AwsApiError carrying HTTP status + AWS __type.
AwsSecretsRotator implements 4-step contract:
- generate: PutSecretValue with AWSPENDING stage, captures version_id
- apply: no-op (PutSecretValue already exposed it)
- verify: GetSecretValue by version_id, byte-equal SecretString check
- commit: UpdateSecretVersionStage move AWSCURRENT to new + remove from old
- rollback_apply: UpdateSecretVersionStage remove AWSPENDING from new version
13 unit specs verify SigV4 idempotence + format, client methods (with
WebMock), rotator's full 4-step path, verify-mismatch, rollback_apply,
and can_rotate? gating.
2026-04-29 01:02:40 -04:00
CarterPerez-dev
bad50daad2
feat(rotators): abstract Rotator with macro registration + EnvFileRotator + 4-step orchestrator
...
Rotator base exposes the four lifecycle methods as abstract; subclasses
register at compile time via 'register_as :kind' macro. REGISTRY is
populated as soon as the rotator file is required - drop a new file in
src/cre/rotators/ and the orchestrator can dispatch to it.
EnvFileRotator implements the simplest rotation:
- generate: 32 random bytes -> base64-urlsafe (no padding)
- apply: write to PATH.pending atomically (in-place line replace, 0600)
- verify: parse pending file, confirm key=value present and non-empty
- commit: rename PATH.pending -> PATH (atomic on POSIX)
- rollback_apply: unlink PATH.pending
RotationOrchestrator runs the 4-step contract with full event publishing,
state machine transitions in DB (generating -> applying -> verifying ->
committing -> completed | failed), and rollback_apply on apply/verify
failure. 8 specs cover happy path + raised-during-apply + rollback verification.
2026-04-29 00:59:01 -04:00
CarterPerez-dev
538395ebcc
feat(policy): Crystal Policy as Code DSL with macros + compile-time enum autocast
...
- Policy struct: matcher Proc, max_age, warn_at, enforce_action, notify_channels, triggers
- Builder validates all required fields at .build, raises BuilderError with the policy name
- DSL exposes top-level 'policy' method via 'with builder yield' so all
builder methods (description, match, max_age, enforce, notify_via, etc.)
are receiver-less inside the block
- Symbol literals autocast to Action/Channel/Trigger enums on direct calls;
Symbol overload for splat parameters (notify_via :telegram, :email)
- Evaluator subscribes to bus, fires PolicyViolation + RotationScheduled
(rotate_immediately) or AlertRaised (notify_only/quarantine) when overdue
- 15 unit specs cover Policy.matches?/overdue?/in_warning_window?,
Builder validation, DSL syntax with closures, evaluator action dispatch
2026-04-29 00:56:29 -04:00
CarterPerez-dev
2ba81cfd82
feat(engine): typed event hierarchy + EventBus with fanout + AuditSubscriber + Engine
...
Events form a Crystal class hierarchy so subscribers pattern-match
exhaustively. EventBus delivers to subscribers via Crystal channels with
per-subscriber overflow policy (Block for audit, Drop for best-effort).
AuditSubscriber listens for all rotation/policy/drift/alert events and
serializes them into the hash-chained audit log via AuditLog.append.
Engine wires Persistence + AuditLog + AuditSubscriber + EventBus together
so callers just .start/.stop. 7 unit specs verify boot, fanout to N
subscribers, drop-on-overflow semantics, and end-to-end event -> audit row.
2026-04-29 00:47:45 -04:00
CarterPerez-dev
fe5e9cd07b
feat(audit): hash chain + HMAC ratchet + Merkle batches + Ed25519 signing
...
Three layers of integrity:
- Hash chain (SHA-256 chained) catches silent edits
- HMAC ratchet rotates keys every N entries with HKDF-style derivation
and zeroizes old key bytes from memory
- Merkle batch sealing builds tree over content_hashes, signs root
with Ed25519 (FFI to libcrypto EVP_PKEY_ED25519 directly since stdlib
lacks the high-level OpenSSL::PKey wrapper)
AuditLog.append is mutex-guarded for serial writes; verify_chain detects
both single-row tampering and structural inconsistency. BatchSealer's
pack_message format (BE start_seq || BE end_seq || merkle_root) is shared
between signer and verifier so external auditors can validate offline.
2026-04-29 00:45:54 -04:00
CarterPerez-dev
4723716e08
feat(crypto): AEAD envelope encryption with AES-256-GCM, KEK loader, secure random
...
- Random with constant-time-equal helper
- KEK loader from env (Tier 1) with InvalidKekError on bad/missing var
- AEAD via direct LibCrypto FFI bindings (Crystal 1.20 stdlib OpenSSL::Cipher
doesn't expose GCM auth_data/auth_tag, so we extend LibCrypto with
EVP_CIPHER_CTX_ctrl + EVP_aes_256_gcm and call them directly)
- Envelope: per-row DEK wrapped by KEK, AAD-bound, algorithm_id reserved
for crypto agility (0x01 = AES-256-GCM today, 0x02/0x03 reserved)
- 17 unit specs including a 100-iteration random property test
- Tag-tampered ciphertext / wrong-AAD / wrong-key all raise Aead::Error
2026-04-29 00:43:12 -04:00
CarterPerez-dev
5971cbd33e
feat(persistence): PostgreSQL adapter with append-only audit trigger
...
- All 4 repos mirror the SQLite contracts using PG-native types
(UUID, BYTEA, JSONB, BIGSERIAL, TIMESTAMPTZ, SMALLINT)
- audit_no_modify() trigger refuses UPDATE/DELETE/TRUNCATE on audit_events
- pg_advisory_xact_lock for cross-process row locking
- Integration tests verify trigger fires correctly on tamper attempt
- Test cleanup helper temporarily disables trigger to reset between specs
- 4 integration specs all green against PostgreSQL 16
2026-04-29 00:39:53 -04:00
CarterPerez-dev
58e12941e9
feat(persistence): SQLite adapter with credentials/versions/rotations/audit repos
...
All four repos implement their abstract contracts. Migrations create
tables idempotently. Bytes round-trip through SQLite BLOB columns
correctly. RotatorKind and RotationState enums replace Symbol fields
in record types so they round-trip safely through DB string columns.
8 unit specs verify CRUD, find_by_external, in_flight filtering,
revocation, and audit append/range/latest_hash genesis behavior.
2026-04-29 00:36:22 -04:00
CarterPerez-dev
fb4e26c798
feat(persistence): abstract Persistence + repo contracts (CredentialsRepo, VersionsRepo, RotationsRepo, AuditRepo) and record types
2026-04-29 00:33:26 -04:00
CarterPerez-dev
d91477cfa1
feat(domain): NewSecret and CredentialVersion structs
...
CredentialVersion adds a revoked? predicate so callers don't need to
nil-check revoked_at directly. Both structs are immutable value types.
2026-04-29 00:32:53 -04:00
CarterPerez-dev
fd77a4c323
feat(domain): Credential struct with kind enum and tag accessor
...
CredentialKind enum covers AwsSecretsmgr, AwsIamKey, VaultDynamic,
GithubPat, EnvFile, Database. Auto-generated kind predicates
(c.kind.aws_secretsmgr?) drive policy matching at compile time.
tag() accepts both string and symbol keys.
2026-04-29 00:28:54 -04:00
CarterPerez-dev
8ebdd3fee7
feat(cre): source tree skeleton with empty module dirs and CI workflow
...
- src/cre.cr entry point + version.cr
- Empty module dirs: cli, tui, engine, events, rotators, policy, audit, crypto, persistence, notifiers, compliance, config, domain, aws, vault, github, demo
- spec/ unit + integration + fixtures structure mirroring src/
- spec_helper.cr with stdlib spec + cre require
- GitHub Actions CI: format, unit matrix (Crystal 1.19/1.20/nightly x ubuntu/macos), integration with PG service, build job
2026-04-28 23:54:59 -04:00
CarterPerez-dev
e69cc301cf
feat(cre): bootstrap Crystal project shell
...
- shard.yml with db, pg, sqlite3, tourmaline (deps), webmock (dev)
- Makefile with build/test/format/lint/demo targets
- .gitignore, .editorconfig, LICENSE (MIT), README skeleton
- ameba lint deferred until libpcre3-dev is available on this env
2026-04-28 18:05:36 -04:00
CarterPerez-dev
ef315b072b
chore: add demos for projects, update haskell-reverse-proxy modules, refresh siem assets
...
- Add DEMO.md and screenshots for bug-bounty-platform, hash-cracker,
linux-cis-hardening-auditor, simple-port-scanner, simple-vulnerability-scanner,
systemd-persistence-scanner, base64-tool, caesar-cipher, dns-lookup,
metadata-scrubber-tool, network-traffic-analyzer, siem-dashboard
- Link DEMO.md from project READMEs
- Add .gitignore entries for DEMO-TRACKER and simple-port-scanner build dir
- Restructure haskell-reverse-proxy with DDoS, Fingerprint, ML, RateLimit, WAF,
Geo, and Honeypot modules; drop superseded research docs and old Makefile
- Refresh siem-dashboard dashboard.png and rename alerts.png to alert-detail.png
2026-04-26 23:12:48 -04:00
CarterPerez-dev
dc6567ae25
chore complete + add pre commit chnages
2026-04-19 18:54:08 -04:00
Carter Perez
b6f75db1a7
Update README.md
2026-04-19 13:27:28 -04:00
Carter Perez
1321a813ae
Update badge link for Cybersecurity Projects
2026-04-19 13:25:49 -04:00
Carter Perez
d7ebd7956a
Merge pull request #183 from CarterPerez-dev/project/honeypot-network
...
feat: advanced honeypot-network project complete
2026-04-19 13:22:10 -04:00
CarterPerez-dev
e35d752289
feat: advanced honeypot-network project complete
2026-04-19 13:13:49 -04:00
Carter Perez
e20848b45a
Merge pull request #180 from CarterPerez-dev/dependabot/uv/PROJECTS/advanced/bug-bounty-platform/backend/mako-1.3.11
...
chore(deps): bump mako from 1.3.10 to 1.3.11 in /PROJECTS/advanced/bug-bounty-platform/backend
2026-04-18 03:17:28 -04:00
Carter Perez
8ba4e88865
Merge pull request #179 from CarterPerez-dev/dependabot/uv/PROJECTS/advanced/ai-threat-detection/backend/mako-1.3.11
...
chore(deps): bump mako from 1.3.10 to 1.3.11 in /PROJECTS/advanced/ai-threat-detection/backend
2026-04-18 03:17:12 -04:00
Carter Perez
3b7b2e4f8f
Merge pull request #178 from CarterPerez-dev/dependabot/uv/PROJECTS/beginner/metadata-scrubber-tool/pypdf-6.10.2
...
chore(deps): bump pypdf from 6.10.1 to 6.10.2 in /PROJECTS/beginner/metadata-scrubber-tool
2026-04-18 03:16:48 -04:00
Carter Perez
b419685e6a
Merge pull request #177 from CarterPerez-dev/dependabot/npm_and_yarn/PROJECTS/intermediate/api-security-scanner/frontend/axios-1.15.0
...
chore(deps): bump axios from 1.13.5 to 1.15.0 in /PROJECTS/intermediate/api-security-scanner/frontend
2026-04-18 03:16:32 -04:00
Carter Perez
119893c8e6
Merge pull request #182 from CarterPerez-dev/dependabot/uv/PROJECTS/advanced/api-rate-limiter/python-multipart-0.0.26
...
chore(deps): bump python-multipart from 0.0.22 to 0.0.26 in /PROJECTS/advanced/api-rate-limiter
2026-04-18 03:16:19 -04:00
dependabot[bot]
d68cc2e21e
chore(deps): bump python-multipart
...
Bumps [python-multipart](https://github.com/Kludex/python-multipart ) from 0.0.22 to 0.0.26.
- [Release notes](https://github.com/Kludex/python-multipart/releases )
- [Changelog](https://github.com/Kludex/python-multipart/blob/master/CHANGELOG.md )
- [Commits](https://github.com/Kludex/python-multipart/compare/0.0.22...0.0.26 )
---
updated-dependencies:
- dependency-name: python-multipart
dependency-version: 0.0.26
dependency-type: indirect
...
Signed-off-by: dependabot[bot] <support@github.com>
2026-04-17 22:49:17 +00:00
dependabot[bot]
be41a9ac0f
chore(deps): bump github.com/go-git/go-git/v5
...
Bumps [github.com/go-git/go-git/v5](https://github.com/go-git/go-git ) from 5.17.1 to 5.18.0.
- [Release notes](https://github.com/go-git/go-git/releases )
- [Commits](https://github.com/go-git/go-git/compare/v5.17.1...v5.18.0 )
---
updated-dependencies:
- dependency-name: github.com/go-git/go-git/v5
dependency-version: 5.18.0
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
2026-04-17 22:41:45 +00:00
dependabot[bot]
e0a9bcbebf
chore(deps): bump mako in /PROJECTS/advanced/bug-bounty-platform/backend
...
Bumps [mako](https://github.com/sqlalchemy/mako ) from 1.3.10 to 1.3.11.
- [Release notes](https://github.com/sqlalchemy/mako/releases )
- [Changelog](https://github.com/sqlalchemy/mako/blob/main/CHANGES )
- [Commits](https://github.com/sqlalchemy/mako/commits )
---
updated-dependencies:
- dependency-name: mako
dependency-version: 1.3.11
dependency-type: indirect
...
Signed-off-by: dependabot[bot] <support@github.com>
2026-04-16 23:24:08 +00:00
dependabot[bot]
786a1ea0c3
chore(deps): bump mako in /PROJECTS/advanced/ai-threat-detection/backend
...
Bumps [mako](https://github.com/sqlalchemy/mako ) from 1.3.10 to 1.3.11.
- [Release notes](https://github.com/sqlalchemy/mako/releases )
- [Changelog](https://github.com/sqlalchemy/mako/blob/main/CHANGES )
- [Commits](https://github.com/sqlalchemy/mako/commits )
---
updated-dependencies:
- dependency-name: mako
dependency-version: 1.3.11
dependency-type: indirect
...
Signed-off-by: dependabot[bot] <support@github.com>
2026-04-16 23:20:58 +00:00
dependabot[bot]
69a1a3989a
chore(deps): bump pypdf in /PROJECTS/beginner/metadata-scrubber-tool
...
Bumps [pypdf](https://github.com/py-pdf/pypdf ) from 6.10.1 to 6.10.2.
- [Release notes](https://github.com/py-pdf/pypdf/releases )
- [Changelog](https://github.com/py-pdf/pypdf/blob/main/CHANGELOG.md )
- [Commits](https://github.com/py-pdf/pypdf/compare/6.10.1...6.10.2 )
---
updated-dependencies:
- dependency-name: pypdf
dependency-version: 6.10.2
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
2026-04-16 22:32:38 +00:00
dependabot[bot]
6205385fd4
chore(deps): bump axios
...
Bumps [axios](https://github.com/axios/axios ) from 1.13.5 to 1.15.0.
- [Release notes](https://github.com/axios/axios/releases )
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md )
- [Commits](https://github.com/axios/axios/compare/v1.13.5...v1.15.0 )
---
updated-dependencies:
- dependency-name: axios
dependency-version: 1.15.0
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
2026-04-15 23:58:24 +00:00
Carter Perez
cac4a65232
Merge pull request #172 from CarterPerez-dev/dependabot/uv/PROJECTS/beginner/metadata-scrubber-tool/pypdf-6.10.1
...
chore(deps): bump pypdf from 6.10.0 to 6.10.1 in /PROJECTS/beginner/metadata-scrubber-tool
2026-04-15 19:40:51 -04:00
Carter Perez
280c1f9aee
Merge pull request #175 from CarterPerez-dev/dependabot/uv/PROJECTS/advanced/encrypted-p2p-chat/backend/python-multipart-0.0.26
...
chore(deps): bump python-multipart from 0.0.22 to 0.0.26 in /PROJECTS/advanced/encrypted-p2p-chat/backend
2026-04-15 19:40:39 -04:00
Carter Perez
87ed5c73e6
Merge pull request #174 from CarterPerez-dev/dependabot/uv/PROJECTS/beginner/c2-beacon/backend/python-multipart-0.0.26
...
chore(deps): bump python-multipart from 0.0.22 to 0.0.26 in /PROJECTS/beginner/c2-beacon/backend
2026-04-15 19:40:23 -04:00
Carter Perez
d5f3aecfe7
Merge pull request #173 from CarterPerez-dev/dependabot/uv/PROJECTS/advanced/bug-bounty-platform/backend/python-multipart-0.0.26
...
chore(deps): bump python-multipart from 0.0.21 to 0.0.26 in /PROJECTS/advanced/bug-bounty-platform/backend
2026-04-15 19:40:07 -04:00
Carter Perez
cccd383b30
Merge branch 'main' into project/systemd-persistence-scanner
2026-04-15 19:37:43 -04:00
CarterPerez-dev
8c8a37c654
docs: add learn folder and update README for systemd persistence scanner
2026-04-15 19:21:56 -04:00
dependabot[bot]
467e5c88ac
chore(deps): bump python-multipart
...
Bumps [python-multipart](https://github.com/Kludex/python-multipart ) from 0.0.22 to 0.0.26.
- [Release notes](https://github.com/Kludex/python-multipart/releases )
- [Changelog](https://github.com/Kludex/python-multipart/blob/master/CHANGELOG.md )
- [Commits](https://github.com/Kludex/python-multipart/compare/0.0.22...0.0.26 )
---
updated-dependencies:
- dependency-name: python-multipart
dependency-version: 0.0.26
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
2026-04-15 21:19:02 +00:00
dependabot[bot]
d3b48ef80a
chore(deps): bump python-multipart
...
Bumps [python-multipart](https://github.com/Kludex/python-multipart ) from 0.0.22 to 0.0.26.
- [Release notes](https://github.com/Kludex/python-multipart/releases )
- [Changelog](https://github.com/Kludex/python-multipart/blob/master/CHANGELOG.md )
- [Commits](https://github.com/Kludex/python-multipart/compare/0.0.22...0.0.26 )
---
updated-dependencies:
- dependency-name: python-multipart
dependency-version: 0.0.26
dependency-type: indirect
...
Signed-off-by: dependabot[bot] <support@github.com>
2026-04-15 21:13:20 +00:00
dependabot[bot]
cfc4b7a21b
chore(deps): bump python-multipart
...
Bumps [python-multipart](https://github.com/Kludex/python-multipart ) from 0.0.21 to 0.0.26.
- [Release notes](https://github.com/Kludex/python-multipart/releases )
- [Changelog](https://github.com/Kludex/python-multipart/blob/master/CHANGELOG.md )
- [Commits](https://github.com/Kludex/python-multipart/compare/0.0.21...0.0.26 )
---
updated-dependencies:
- dependency-name: python-multipart
dependency-version: 0.0.26
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
2026-04-15 21:06:26 +00:00
dependabot[bot]
64fb1d0dbd
chore(deps): bump pypdf in /PROJECTS/beginner/metadata-scrubber-tool
...
Bumps [pypdf](https://github.com/py-pdf/pypdf ) from 6.10.0 to 6.10.1.
- [Release notes](https://github.com/py-pdf/pypdf/releases )
- [Changelog](https://github.com/py-pdf/pypdf/blob/main/CHANGELOG.md )
- [Commits](https://github.com/py-pdf/pypdf/compare/6.10.0...6.10.1 )
---
updated-dependencies:
- dependency-name: pypdf
dependency-version: 6.10.1
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
2026-04-15 20:42:36 +00:00
CarterPerez-dev
aa0c03d0e9
feat: add systemd persistence scanner project
...
17 scanner modules covering systemd, cron, shell profiles, SSH,
XDG autostart, PAM, udev, kernel modules, LD_PRELOAD, MOTD,
init.d, at jobs, logrotate hooks, systemd generators, bash
completion, network interface hooks, and sshrc.
16 detection patterns with MITRE ATT&CK mappings, baseline
diffing, JSON output, and ignore-list support.
go install: github.com/CarterPerez-dev/sentinel/cmd/sentinel@latest
2026-04-15 09:00:16 -04:00
Carter Perez
ec319b2e49
Merge pull request #164 from CarterPerez-dev/dependabot/uv/PROJECTS/beginner/keylogger/pytest-9.0.3
...
chore(deps): bump pytest from 8.4.1 to 9.0.3 in /PROJECTS/beginner/keylogger
2026-04-15 07:03:07 -04:00
Carter Perez
928d9ee68d
Merge pull request #163 from CarterPerez-dev/dependabot/uv/PROJECTS/beginner/network-traffic-analyzer/python/pillow-12.2.0
...
chore(deps): bump pillow from 12.1.1 to 12.2.0 in /PROJECTS/beginner/network-traffic-analyzer/python
2026-04-15 07:02:54 -04:00
Carter Perez
f19599356e
Merge pull request #162 from CarterPerez-dev/dependabot/uv/PROJECTS/advanced/ai-threat-detection/backend/pillow-12.2.0
...
chore(deps): bump pillow from 12.1.1 to 12.2.0 in /PROJECTS/advanced/ai-threat-detection/backend
2026-04-15 07:02:41 -04:00
Carter Perez
cfdd501975
Merge pull request #161 from CarterPerez-dev/dependabot/uv/PROJECTS/beginner/metadata-scrubber-tool/pillow-12.2.0
...
chore(deps): bump pillow from 12.1.0 to 12.2.0 in /PROJECTS/beginner/metadata-scrubber-tool
2026-04-15 07:02:20 -04:00
Carter Perez
3d3d189458
Merge pull request #165 from CarterPerez-dev/dependabot/uv/PROJECTS/advanced/api-rate-limiter/pytest-9.0.3
...
chore(deps): bump pytest from 9.0.2 to 9.0.3 in /PROJECTS/advanced/api-rate-limiter
2026-04-15 07:02:06 -04:00
Carter Perez
db5c6ca1f0
Merge pull request #166 from CarterPerez-dev/dependabot/uv/PROJECTS/beginner/caesar-cipher/pytest-9.0.3
...
chore(deps): bump pytest from 9.0.2 to 9.0.3 in /PROJECTS/beginner/caesar-cipher
2026-04-15 07:01:46 -04:00
dependabot[bot]
0faca40468
chore(deps): bump pytest in /PROJECTS/advanced/api-rate-limiter
...
Bumps [pytest](https://github.com/pytest-dev/pytest ) from 9.0.2 to 9.0.3.
- [Release notes](https://github.com/pytest-dev/pytest/releases )
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst )
- [Commits](https://github.com/pytest-dev/pytest/compare/9.0.2...9.0.3 )
---
updated-dependencies:
- dependency-name: pytest
dependency-version: 9.0.3
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
2026-04-15 11:01:29 +00:00
dependabot[bot]
5b2b7e86a4
chore(deps): bump pytest in /PROJECTS/beginner/caesar-cipher
...
Bumps [pytest](https://github.com/pytest-dev/pytest ) from 9.0.2 to 9.0.3.
- [Release notes](https://github.com/pytest-dev/pytest/releases )
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst )
- [Commits](https://github.com/pytest-dev/pytest/compare/9.0.2...9.0.3 )
---
updated-dependencies:
- dependency-name: pytest
dependency-version: 9.0.3
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
2026-04-15 11:01:27 +00:00