Skip to content

fix: resolve all CodeRabbit vulnerabilities and harden protocol#18

Merged
dsecurity49 merged 2 commits into
mainfrom
fix/coderabbit-final-hardening
May 22, 2026
Merged

fix: resolve all CodeRabbit vulnerabilities and harden protocol#18
dsecurity49 merged 2 commits into
mainfrom
fix/coderabbit-final-hardening

Conversation

@dsecurity49
Copy link
Copy Markdown
Owner

@dsecurity49 dsecurity49 commented May 22, 2026

Summary by CodeRabbit

  • New Features

    • Ephemeral claim tokens added for secure job claiming and mutation.
  • Security

    • Tightened request signature rules and startup/auth checks.
    • Endpoints now require claim tokens for fulfill/fail/extend flows.
    • Expanded security headers and admin auth controls.
  • Documentation

    • Spec, README, examples, and security docs updated for v7.61 and claim-token semantics.
  • Tests

    • New/updated tests cover claim-token isolation and related workflows.

Review Change Stack

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 22, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: bcaa36ff-a411-4ef8-bbe1-ced5b5b781e4

📥 Commits

Reviewing files that changed from the base of the PR and between c4290f0 and ac36a6c.

📒 Files selected for processing (5)
  • Examples/discord_worker.sh
  • flask_app.py
  • logger.sh
  • tests/test_server_advanced.py
  • tests/test_server_basic.py

📝 Walkthrough

Walkthrough

This PR implements Intent Bus v7.61 with ephemeral cryptographic claim tokens for securing job state mutations. Changes span the protocol, server implementation, worker scripts, tests, and documentation to enforce token-based mutations, strict HMAC canonicalization, and replay protection.

Changes

Intent Bus v7.61 Claim Token Enforcement

Layer / File(s) Summary
Protocol specification and security model
SPEC.md, SECURITY.md, WORKER_SECURITY.md, CHANGELOG.md
Intent Protocol v2.1 introduces ephemeral cryptographic claim_token for state mutation isolation, RFC 3986 HMAC canonicalization rules, claim ownership semantics, and lease-loss non-retry behavior; security model clarifies Standard vs Strict authentication and operational hardening.
Server database schema, helpers, and request authentication
flask_app.py
Adds claim_token column to intents with NULL backfill; introduces ensure_columns, strict_quote, valid_label, now, api_error; implements strict query canonicalization for HMAC verification and DB nonce insert replay protection; extends migration/index creation and metrics/admin auth handling.
Claim lifecycle endpoints with token validation
flask_app.py (routes /claim, /extend_claim, /fail, /fulfill, admin routes)
/claim now generates and returns a per-lease claim_token; /extend_claim, /fail, /fulfill require and validate claim_token, clear it on state transitions, and treat 404 on token mismatch/expiry as permanent lease loss; cleanup extended to remove stale rate_limits, idempotency_keys, and request_nonces.
Server logging, headers, and version bumping
flask_app.py (logging, after_request, endpoints)
Structured JSON logging includes allowed extras; guarded duration calculation; adds security headers and X-Intent-Version; updates /, /health, and dashboard to report version 7.61.
Basic server test setup and lifecycle verification
tests/test_server_basic.py
Refactors client fixture with deterministic teardown restoring env/DB; adds BUS_TRUST_PROXY handling; updates /health expected version to 7.61; formats tests for clearer request construction while preserving assertions.
Advanced server tests with token enforcement and dead-letter verification
tests/test_server_advanced.py
Sets required BUS_* env before importing flask_app; refactors client fixture; asserts claim_token returned by /claim, uses tokens in /fail across attempts, adds test_cross_attempt_token_isolation verifying old tokens fail (404) and latest succeeds.
Generic worker script with claim token handling
worker.sh
Switches to stricter shell options, makes BASE_URL configurable, replaces ownership checks with portable stat UID check, captures HTTP code and headers, requires claim_token in claim responses, and includes claim_token in fulfill/fail payloads; treats 404 as lease-lost termination.
Logger shell worker with POSIX compatibility and token handling
logger.sh
Refactors startup/config, enforces non-symlink API key and chmod 600, adds sleep_with_backoff helpers and parse_retry_after, captures HTTP code in report_status, requires id and claim_token from claims, and includes claim_token in fulfillment/failure reports.
Discord example worker updated for claim tokens and Retry-After handling
Examples/discord_worker.sh
Moves to #!/bin/bash, environment-driven config, simplified dependency checks, adds parse_retry_after(), requires claim_token in claims, sanitizes CR/LF/T to spaces, includes claim_token in fail/fulfill JSON, and fails intent on 429 with "Discord rate limited" reason.
User and developer documentation for v7.61 protocol and claim tokens
README.md, Examples/README.md, CONTRIBUTING.md
Updates How-it-works and quickstarts to describe atomic claiming with claim_token, Retry-After guidance, Smart Routing header examples (X-Worker-Capabilities, X-Worker-ID), Python worker guidance for signed requests and token handling, and CONTRIBUTING wording/casing and .gitignore guidance.
Configuration and metadata updates
.flake8, server-requirements.txt
Adds .flake8 config (ignores, max-line-length 120, excludes tests/); updates # Last Updated timestamp in server-requirements.txt.

🎯 4 (Complex) | ⏱️ ~75 minutes

🐰 A token for each claim,
Cryptographic dreams take shape,
Leases now secure—
Workers dance in v7.61's grace,
Dead letters find their place! 🐇

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 5.41% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'fix: resolve all CodeRabbit vulnerabilities and harden protocol' directly matches the primary objective of this PR, which is to address CodeRabbit-identified issues and strengthen security through protocol hardening as evidenced by extensive changes across authentication, claim tokens, and cryptographic validation.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/coderabbit-final-hardening

Comment @coderabbitai help to get the list of available commands and usage tips.

Comment thread worker.sh
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
tests/test_server_basic.py (1)

83-260: ⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift

Add tests for POST /extend_claim/<iid> claim_token validation

  • tests/test_server_basic.py (and tests/test_server_advanced.py) has no coverage for /extend_claim.
  • The endpoint requires claim_token in the POST JSON body and returns:
    • 200 when the claim_token matches an active claim for the intent
    • 404 for an invalid/expired/overwritten claim_token (updates only when status='claimed' and claim_token matches)
    • 400 when claim_token is missing (invalid_request: "Missing claim_token.")
  • Add the lifecycle test steps: claim an intent → extend with the extracted token (200) → extend with "invalid_token" (404) → extend without claim_token (400).
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/test_server_basic.py` around lines 83 - 260, Add tests covering POST
/extend_claim/<iid> claim_token validation by mirroring the claim/fulfill
lifecycle: in tests/test_server_basic.py (and similarly in
tests/test_server_advanced.py) create an intent via client.post("/intent",
headers={"X-API-KEY": TEST_API_KEY}, json=...), claim it via
client.post("/claim?goal=...&namespace=...") to extract claim_token and
intent_id, then POST to f"/extend_claim/{intent_id}" with JSON {"claim_token":
<token>} and assert 200; next POST with {"claim_token":"invalid_token"} and
assert 404; finally POST with no claim_token and assert 400 and that the JSON
error message equals or contains "Missing claim_token."; follow the existing
test patterns (e.g., test_publish_and_claim_lifecycle,
test_claim_token_required) and reuse the client and TEST_API_KEY headers.
🧹 Nitpick comments (5)
worker.sh (1)

162-168: 💤 Low value

Consider using jq for JSON payload construction.

String interpolation for JSON payloads is fragile—if $RESULT ever contains quotes or backslashes (e.g., from dynamic task output), the JSON will be malformed or vulnerable to injection. The other workers (logger.sh, discord_worker.sh) correctly use jq -n for safe construction.

Currently safe since RESULT is hardcoded, but this pattern invites bugs if the script is extended.

♻️ Suggested fix using jq
-            FULFILL_RESPONSE=$(curl -sS \
-                --max-time 10 \
-                -X POST "$BASE_URL/fulfill/$INTENT_ID" \
-                -H "X-API-KEY: $API_KEY" \
-                -H "Content-Type: application/json" \
-                -d "{\"claim_token\":\"$CLAIM_TOKEN\",\"result\":\"$RESULT\",\"result_type\":\"$RESULT_TYPE\"}" \
-                -w "\n%{http_code}")
+            FULFILL_PAYLOAD=$(jq -n \
+                --arg t "$CLAIM_TOKEN" \
+                --arg r "$RESULT" \
+                --arg rt "$RESULT_TYPE" \
+                '{claim_token:$t,result:$r,result_type:$rt}')
+
+            FULFILL_RESPONSE=$(curl -sS \
+                --max-time 10 \
+                -X POST "$BASE_URL/fulfill/$INTENT_ID" \
+                -H "X-API-KEY: $API_KEY" \
+                -H "Content-Type: application/json" \
+                -d "$FULFILL_PAYLOAD" \
+                -w "\n%{http_code}")

Note: This would require adding jq as a dependency (currently optional for this script).

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@worker.sh` around lines 162 - 168, The current curl payload construction in
the FULFILL_RESPONSE assignment uses fragile string interpolation for JSON (the
-d
"{\"claim_token\":\"$CLAIM_TOKEN\",\"result\":\"$RESULT\",\"result_type\":\"$RESULT_TYPE\"}")
which will break if $RESULT contains quotes/backslashes; update the code that
builds the POST body for the curl call (the block that sets FULFILL_RESPONSE and
posts to "$BASE_URL/fulfill/$INTENT_ID") to construct JSON safely using jq -n
(e.g., build an object with jq -n --arg claim_token "$CLAIM_TOKEN" --arg result
"$RESULT" --arg result_type "$RESULT_TYPE" '{claim_token:$claim_token,
result:$result, result_type:$result_type}') and pipe that into curl via --data
`@-` (or similar), and document that jq is required as a dependency for this
script.
tests/test_server_advanced.py (1)

101-101: ⚡ Quick win

Strengthen the claim_token validation.

The assertion only checks for key presence but doesn't validate the token is a non-empty string, which is a security requirement.

🔒 Proposed fix to validate token value
     assert res3.status_code == 200
     assert res3.json["goal"] == "process_video"
-    assert "claim_token" in res3.json
+    claim_token = res3.json.get("claim_token")
+    assert isinstance(claim_token, str) and len(claim_token) > 0
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/test_server_advanced.py` at line 101, The test currently only checks
the presence of "claim_token" in res3.json; update the assertion in the test
(the assertion referencing res3 and the "claim_token" key) to also validate that
res3.json["claim_token"] is a non-empty string (e.g., assert it's an instance of
str and that len(res3.json["claim_token"].strip()) > 0 or truthy) so the token
value is not empty or invalid.
tests/test_server_basic.py (1)

109-111: ⚡ Quick win

Strengthen the claim_token assertion.

The current assertion assert claim_token only checks truthiness, which would pass for empty strings or other falsy values. Consider validating both type and content.

🔒 Proposed fix to strengthen validation
-    claim_token = claim_res.json["claim_token"]
-
-    assert claim_token
+    claim_token = claim_res.json.get("claim_token")
+    assert isinstance(claim_token, str) and len(claim_token) > 0
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/test_server_basic.py` around lines 109 - 111, The assertion for
claim_token is too weak; update the test to validate that
claim_res.json["claim_token"] is a non-empty string (and optionally matches the
expected token format) rather than just truthy. Locate the usage of claim_token
(variable claim_token and claim_res.json access) and replace the simple
truthiness check with explicit checks such as asserting isinstance(claim_token,
str) and asserting len(claim_token) > 0 (or a regex match if a specific token
pattern is expected).
.flake8 (2)

2-3: 💤 Low value

Configuration clarification: E501 ignore makes max-line-length ineffective.

Setting max-line-length = 120 changes the threshold for E501 violations, but since E501 is in the ignore list, Flake8 won't enforce any line length limit. This configuration is contradictory.

Choose one approach:

  • To enforce 120-character lines: Remove E501 from the ignore list and keep max-line-length = 120
  • To disable line length checking entirely: Remove the max-line-length setting and keep E501 in ignore
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.flake8 around lines 2 - 3, The Flake8 config currently ignores E501 while
also setting max-line-length = 120, which is contradictory; decide whether to
enforce or disable line-length checks and update the .flake8 accordingly: either
remove E501 from the ignore list so max-line-length = 120 is applied, or remove
the max-line-length setting and keep E501 in ignore; update the ignore line
(E501) or the max-line-length entry to reflect your chosen policy.

4-4: ⚡ Quick win

Consider linting test files to maintain code quality.

Excluding tests/ from linting can hide code quality issues in test code. Tests should follow the same coding standards as production code for maintainability and readability.

♻️ Suggested fix
-exclude = .git,__pycache__,venv,env,.venv,tests/
+exclude = .git,__pycache__,venv,env,.venv
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.flake8 at line 4, The .flake8 configuration currently excludes tests/ from
linting via the "exclude" setting; remove the tests/ entry from the exclude
value in .flake8 so test files are linted (e.g., change the exclude list to omit
tests/), then run flake8 against the repo to confirm no new violations; update
any test-specific lint exceptions via per-file-ignores in .flake8 if necessary
rather than excluding the entire tests/ directory.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@Examples/discord_worker.sh`:
- Around line 1-6: The script uses a POSIX shebang (#!/bin/sh) but also uses the
Bash-only setting "set -uo pipefail"; either change the shebang to a Bash
interpreter (e.g., update the shebang line to /bin/bash) or make the settings
POSIX-safe by removing "pipefail" and keeping "set -uo" (or implement a portable
pipe-failure workaround); locate the lines containing the shebang and the "set
-uo pipefail" statement in Examples/discord_worker.sh (look for the exact token
"set -uo pipefail") and apply one of these two fixes so the script runs on the
intended shell.

In `@flask_app.py`:
- Around line 1466-1468: The SQL predicate currently grants a 2-second
post-expiry grace by comparing COALESCE(claim_expires_at, claimed_at + ?) > (? -
2); remove that subtraction so the condition strictly requires
COALESCE(claim_expires_at, claimed_at + ?) > ? (i.e., compare directly to
now()). Update both occurrences referenced by the /fail and /fulfill handlers
(the queries using iid, g.api_key, claim_token, DEFAULT_CLAIM_TIMEOUT, now()) so
the SQL and its parameter list remain consistent but no longer subtract 2
seconds.
- Around line 251-255: The current auth logic returns False when an
Authorization header starts with "Bearer " but the token check fails, preventing
admin_auth_ok() from being considered; change the flow in the block that reads
auth_header (and uses METRICS_TOKEN and hmac.compare_digest) so that if
auth_header startswith "Bearer " you return True when the token matches and
otherwise do not short-circuit—call and return admin_auth_ok() as the fallback;
ensure you still respect the METRICS_TOKEN truthiness check when comparing the
token.

In `@logger.sh`:
- Around line 1-2: The script uses a non-POSIX option: replace or fix the
shebang/flags around the line with "set -uo pipefail" in logger.sh; either
change the shebang from "/bin/sh" to "/bin/bash" and update the accompanying
comment on lines describing the shell, or remove "pipefail" and keep a strictly
POSIX-safe "set -uo" invocation so the script runs under dash/ash—modify the
"set -uo pipefail" invocation accordingly and update the script header comment
to reflect the chosen shell.

In `@tests/test_server_advanced.py`:
- Around line 55-350: Add a new test (e.g., test_cross_attempt_token_isolation)
that publishes an intent via POST /intent, claims it once via POST /claim and
saves claim_token as token1, fails it via POST /fail to return it to the queue,
claims it again via POST /claim and saves claim_token as token2, then attempt to
fulfill/complete the intent using token1 and assert the server returns 404 (or
an appropriate token-not-found response) and does not succeed, and finally
fulfill using token2 and assert success; reference the endpoints and JSON fields
used in existing tests (POST /intent, POST /claim, POST /fail, claim_token) and
ensure the assertions mirror the style in test_dead_letters_and_backoff (status
codes and response body checks).
- Around line 247-294: The test must assert that each claim produces a fresh
ephemeral token: after obtaining token1 from the first claim (claim1) and token2
from the second claim (claim2), add an assertion that token1 != token2 to ensure
tokens are unique between attempts; reference the claim response parsing
(token1, token2) and the fail handlers (fail1, fail2) so the assertion is placed
after token2 is extracted and before using token2 in the second fail call.

In `@tests/test_server_basic.py`:
- Line 165: The test currently allows 403 for a missing claim_token but the
/fulfill/<iid> endpoint returns a 400 via api_error("invalid_request", "Missing
claim_token."); update the assertion in test_claim_token_required to assert
fulfill_res.status_code == 400 (and optionally assert
fulfill_res.json()["error"] == "invalid_request" and the message contains
"Missing claim_token.") so the test matches the actual behavior.

---

Outside diff comments:
In `@tests/test_server_basic.py`:
- Around line 83-260: Add tests covering POST /extend_claim/<iid> claim_token
validation by mirroring the claim/fulfill lifecycle: in
tests/test_server_basic.py (and similarly in tests/test_server_advanced.py)
create an intent via client.post("/intent", headers={"X-API-KEY": TEST_API_KEY},
json=...), claim it via client.post("/claim?goal=...&namespace=...") to extract
claim_token and intent_id, then POST to f"/extend_claim/{intent_id}" with JSON
{"claim_token": <token>} and assert 200; next POST with
{"claim_token":"invalid_token"} and assert 404; finally POST with no claim_token
and assert 400 and that the JSON error message equals or contains "Missing
claim_token."; follow the existing test patterns (e.g.,
test_publish_and_claim_lifecycle, test_claim_token_required) and reuse the
client and TEST_API_KEY headers.

---

Nitpick comments:
In @.flake8:
- Around line 2-3: The Flake8 config currently ignores E501 while also setting
max-line-length = 120, which is contradictory; decide whether to enforce or
disable line-length checks and update the .flake8 accordingly: either remove
E501 from the ignore list so max-line-length = 120 is applied, or remove the
max-line-length setting and keep E501 in ignore; update the ignore line (E501)
or the max-line-length entry to reflect your chosen policy.
- Line 4: The .flake8 configuration currently excludes tests/ from linting via
the "exclude" setting; remove the tests/ entry from the exclude value in .flake8
so test files are linted (e.g., change the exclude list to omit tests/), then
run flake8 against the repo to confirm no new violations; update any
test-specific lint exceptions via per-file-ignores in .flake8 if necessary
rather than excluding the entire tests/ directory.

In `@tests/test_server_advanced.py`:
- Line 101: The test currently only checks the presence of "claim_token" in
res3.json; update the assertion in the test (the assertion referencing res3 and
the "claim_token" key) to also validate that res3.json["claim_token"] is a
non-empty string (e.g., assert it's an instance of str and that
len(res3.json["claim_token"].strip()) > 0 or truthy) so the token value is not
empty or invalid.

In `@tests/test_server_basic.py`:
- Around line 109-111: The assertion for claim_token is too weak; update the
test to validate that claim_res.json["claim_token"] is a non-empty string (and
optionally matches the expected token format) rather than just truthy. Locate
the usage of claim_token (variable claim_token and claim_res.json access) and
replace the simple truthiness check with explicit checks such as asserting
isinstance(claim_token, str) and asserting len(claim_token) > 0 (or a regex
match if a specific token pattern is expected).

In `@worker.sh`:
- Around line 162-168: The current curl payload construction in the
FULFILL_RESPONSE assignment uses fragile string interpolation for JSON (the -d
"{\"claim_token\":\"$CLAIM_TOKEN\",\"result\":\"$RESULT\",\"result_type\":\"$RESULT_TYPE\"}")
which will break if $RESULT contains quotes/backslashes; update the code that
builds the POST body for the curl call (the block that sets FULFILL_RESPONSE and
posts to "$BASE_URL/fulfill/$INTENT_ID") to construct JSON safely using jq -n
(e.g., build an object with jq -n --arg claim_token "$CLAIM_TOKEN" --arg result
"$RESULT" --arg result_type "$RESULT_TYPE" '{claim_token:$claim_token,
result:$result, result_type:$result_type}') and pipe that into curl via --data
`@-` (or similar), and document that jq is required as a dependency for this
script.
🪄 Autofix (Beta)

✅ Autofix completed


ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 3f27a24a-7a1e-4f51-a3c2-0578ad9c2626

📥 Commits

Reviewing files that changed from the base of the PR and between d1729c0 and c4290f0.

📒 Files selected for processing (15)
  • .flake8
  • CHANGELOG.md
  • CONTRIBUTING.md
  • Examples/README.md
  • Examples/discord_worker.sh
  • README.md
  • SECURITY.md
  • SPEC.md
  • WORKER_SECURITY.md
  • flask_app.py
  • logger.sh
  • server-requirements.txt
  • tests/test_server_advanced.py
  • tests/test_server_basic.py
  • worker.sh

Comment thread Examples/discord_worker.sh Outdated
Comment thread flask_app.py
Comment thread flask_app.py
Comment thread logger.sh Outdated
Comment thread tests/test_server_advanced.py
Comment thread tests/test_server_advanced.py
Comment thread tests/test_server_basic.py Outdated
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 22, 2026

Note

Autofix is a beta feature. Expect some limitations and changes as we gather feedback and continue to improve it.

Fixes Applied Successfully

Fixed 5 file(s) based on 7 unresolved review comments.

Files modified:

  • Examples/discord_worker.sh
  • flask_app.py
  • logger.sh
  • tests/test_server_advanced.py
  • tests/test_server_basic.py

Commit: ac36a6c156aff436933d6e7f9720484ab82deff6

The changes have been pushed to the fix/coderabbit-final-hardening branch.

Time taken: 6m 10s

Fixed 5 file(s) based on 7 unresolved review comments.

Co-authored-by: CodeRabbit <noreply@coderabbit.ai>
@dsecurity49 dsecurity49 merged commit 6619683 into main May 22, 2026
7 checks passed
@dsecurity49 dsecurity49 deleted the fix/coderabbit-final-hardening branch May 22, 2026 15:52
@dsecurity49 dsecurity49 restored the fix/coderabbit-final-hardening branch May 22, 2026 15:52
@dsecurity49 dsecurity49 deleted the fix/coderabbit-final-hardening branch May 22, 2026 15:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant