Skip to content

Claude/cpu guard script dn d8u - #124

Merged
gamblecodezcom merged 8 commits into
mainfrom
claude/cpu-guard-script-DnD8u
Mar 3, 2026
Merged

Claude/cpu guard script dn d8u#124
gamblecodezcom merged 8 commits into
mainfrom
claude/cpu-guard-script-DnD8u

Conversation

@gamblecodezcom

@gamblecodezcom gamblecodezcom commented Mar 3, 2026

Copy link
Copy Markdown
Owner

User description

Summary by Sourcery

Add systemd-managed backend endpoint service, harden backend logging and webhook body handling, and update runtime safeguards and dependencies.

New Features:

  • Introduce a runewager-endpoint systemd service with fallback nohup startup managed from prod-run.sh.

Bug Fixes:

  • Make backend logging resilient to log file creation failures to avoid crashing on stream errors.
  • Ensure /autofix webhook signature verification uses the original raw request body rather than a JSON-reencoded payload.

Enhancements:

  • Relax the Node.js engine restriction to support versions 22 and above.
  • Upgrade Express to version 4.22.1 for the backend server.
  • Extend the CPU guard whitelist to include the gcz_cpu_guard monitoring script.

Deployment:

  • Add provisioning and restart logic for the runewager-endpoint service in the production startup script.

CodeAnt-AI Description

Install managed endpoint service; make logging and webhook verification robust

What Changed

  • The backend no longer crashes if log files or the logs directory cannot be written; log writes fall back to console output when file streams fail.
  • Webhook signature verification for /autofix now uses the original raw request bytes (captured before JSON parsing), preventing signature mismatches caused by JSON re-encoding.
  • Production startup now installs/refreshes a runewager-endpoint systemd unit, clears any process holding port 3001 before start to avoid EADDRINUSE crash loops, and falls back to nohup startup if systemd restart fails.
  • The CPU-guard whitelist adds gcz_cpu_guard so monitoring scripts are not terminated.
  • Node engine requirement broadened to ">=20" and Express is pinned to 4.22.1 so the app runs on newer Node releases and uses a stable Express version.

Impact

✅ Clearer webhook verification (reduces signature mismatches on /autofix)
✅ Fewer backend crashes when log files or directories are unavailable
✅ Fewer endpoint startup crash-loops on port 3001

💡 Usage Guide

Checking Your Pull Request

Every time you make a pull request, our system automatically looks through it. We check for security issues, mistakes in how you're setting up your infrastructure, and common code problems. We do this to make sure your changes are solid and won't cause any trouble later.

Talking to CodeAnt AI

Got a question or need a hand with something in your pull request? You can easily get in touch with CodeAnt AI right here. Just type the following in a comment on your pull request, and replace "Your question here" with whatever you want to ask:

@codeant-ai ask: Your question here

This lets you have a chat with CodeAnt AI about your pull request, making it easier to understand and improve your code.

Example

@codeant-ai ask: Can you suggest a safer alternative to storing this secret?

Preserve Org Learnings with CodeAnt

You can record team preferences so CodeAnt AI applies them in future reviews. Reply directly to the specific CodeAnt AI suggestion (in the same thread) and replace "Your feedback here" with your input:

@codeant-ai: Your feedback here

This helps CodeAnt AI learn and adapt to your team's coding style and standards.

Example

@codeant-ai: Do not flag unused imports.

Retrigger review

Ask CodeAnt AI to review the PR again, by typing:

@codeant-ai: review

Check Your Repository Health

To analyze the health of your code repository, visit our dashboard at https://app.codeant.ai. This tool helps you identify potential issues and areas for improvement in your codebase, ensuring your repository maintains high standards of code health.

claude added 6 commits March 3, 2026 20:23
… main

Combines all changes from this PR into a single clean commit:

- backend.js: store raw buffer on req.rawBody before express.json() runs
  so HMAC verification uses the original bytes (not JSON.stringify output);
  guard log stream creation in try-catch with .on('error') fallback to
  console so filesystem failures never crash the process
- package.json: broaden engine range from >=20 <22 to >=20 (Node v24 compat)
- package-lock.json: regenerate with express@4.x and all transitive deps
  (was missing, causing npm ci to fail on VPS)
- runewager-endpoint.service: User/Group → root (VPS runs as root)
- runewager.service: User/Group → root (VPS runs as root)

https://claude.ai/code/session_01WpEqAiDbpqnBywMjYXJHf4
- Pin express to 4.22.1 (remove ^ semver range) to match the
  explicitly installed version and prevent future version drift
  that caused the missing-dependency failure on Node 21.

- Add ExecStartPre to runewager-endpoint.service: kills any stale
  process holding port 3001 before each systemd start, eliminating
  the EADDRINUSE → instant-crash → restart loop.  Also tightened
  StartLimitBurst=4 / RestartSec=10 / StartLimitIntervalSec=120
  to reduce CPU spike if the service still fails repeatedly.

- Add section 9d to prod-run.sh: installs/refreshes the endpoint
  service unit from the repo copy, clears port 3001 before restart,
  restarts via systemd with a nohup fallback — so a full prod-run
  now brings both services up cleanly without manual intervention.

https://claude.ai/code/session_01WpEqAiDbpqnBywMjYXJHf4
Monitoring-only companion to rw_cpu_guard.sh. Generates timestamped
Markdown reports under /root/CPU_LOGS for /var/www/html/gcz and
/var/www/html/Runewager stacks, rotates to keep last 10 reports,
and symlinks the latest as CPU_report.md.

Never kills, renice-s, or restarts any process — purely observational.
Coexists safely with rw_cpu_guard.sh (separate log path, no shared state).

Features:
  - System-wide CPU summary via top
  - High-CPU process table (>85% threshold)
  - GCZ stack process listing with ⚠️ flag on hot processes
  - Best-effort dpkg package attribution for flagged pids
  - --status, --install-cron, --dry-run modes
  - Self-exclusion and kernel-thread exclusion from reports

https://claude.ai/code/session_01WpEqAiDbpqnBywMjYXJHf4
…de processes

`pkill -f "node .*backend.js"` was too broad — on a shared host it
could kill any Node process whose cmdline contains "backend.js".
Narrowed both pkill calls (systemd fallback + no-systemd path) to
`node .*<PROJECT_DIR>/backend.js` so only the Runewager endpoint
process is targeted.

https://claude.ai/code/session_01WpEqAiDbpqnBywMjYXJHf4
gcz_cpu_guard.sh lives on the VPS directly, not in this repo.
Added "gcz_cpu_guard" to WHITELIST_PATTERNS in rw_cpu_guard.sh so
the Runewager CPU governor never renice/kills/stops the GCZ monitoring
script regardless of its CPU usage.

https://claude.ai/code/session_01WpEqAiDbpqnBywMjYXJHf4
Both static service files were hardcoding User=root/Group=root,
meaning any RCE in index.js or backend.js yielded full system control
and made ProtectSystem/NoNewPrivileges sandboxing meaningless.

Changes:
- runewager.service: User/Group → runewager (prod-run.sh already
  creates this system user and chowns logs/ + data/ to it)
- runewager-endpoint.service: User/Group → runewager; ExecStartPre
  prefixed with '+' so systemd runs only that port-clear step as root
  (needed to kill stale root-owned processes), while backend.js itself
  runs unprivileged

https://claude.ai/code/session_01WpEqAiDbpqnBywMjYXJHf4
@codeant-ai

codeant-ai Bot commented Mar 3, 2026

Copy link
Copy Markdown

CodeAnt AI is reviewing your PR.


Thanks for using CodeAnt! 🎉

We're free for open-source projects. if you're enjoying it, help us grow by sharing.

Share on X ·
Reddit ·
LinkedIn

@sourcery-ai

sourcery-ai Bot commented Mar 3, 2026

Copy link
Copy Markdown

Reviewer's Guide

Extends the deployment script to manage a dedicated runewager-endpoint systemd service, hardens backend logging and webhook signature verification behavior with Express 4.22.1, broadens supported Node versions, and updates the CPU guard whitelist to protect an additional monitoring script.

Sequence diagram for /autofix webhook handling with raw body capture

sequenceDiagram
    actor ExternalService
    participant ExpressApp
    participant RawBodyMiddleware as /autofix raw body middleware
    participant JsonMiddleware as express.json middleware
    participant WebhookHandler as /autofix/webhook handler
    participant SignatureVerifier
    participant Logger

    ExternalService->>ExpressApp: POST /autofix/webhook (body, x-autofix-signature)
    ExpressApp->>RawBodyMiddleware: Invoke for /autofix
    RawBodyMiddleware->>RawBodyMiddleware: express.raw({ type:*/*, limit:1mb })
    RawBodyMiddleware->>ExpressApp: Set req.rawBody if Buffer

    ExpressApp->>JsonMiddleware: express.json({ limit:1mb })
    JsonMiddleware->>ExpressApp: Parse JSON into req.body

    ExpressApp->>WebhookHandler: Call handler with req, res
    WebhookHandler->>WebhookHandler: Read sig from headers
    WebhookHandler->>WebhookHandler: rawBody = req.rawBody or Buffer.alloc(0)
    WebhookHandler->>SignatureVerifier: verifySignature(rawBody, sig)
    SignatureVerifier-->>WebhookHandler: valid / invalid

    alt Signature valid and AUTOFIX_SECRET set
        WebhookHandler->>Logger: info(autofix_webhook_received)
        WebhookHandler-->>ExternalService: 200 OK
    else Signature invalid or secret missing
        WebhookHandler->>Logger: warn(autofix_webhook_rejected)
        WebhookHandler-->>ExternalService: 401/400 error
    end
Loading

Class diagram for backend logging and webhook handling

classDiagram
    class Logger {
        +info(eventType, msg, extra)
        +warn(eventType, msg, extra)
        +error(eventType, msg, extra)
        +_entry(level, eventType, msg, extra)
        +_write(streams, obj)
    }

    class LogStreamsModule {
        <<module>>
        -_logStream
        -_errStream
        +initLogStreams()
    }

    class BackendServer {
        <<module>>
        +app
        +configureMiddleware()
        +handleAutofixRaw(req, res, next)
        +handleAutofixWebhook(req, res)
    }

    class SignatureVerifier {
        <<utility>>
        +verifySignature(bodyBuffer, signature)
    }

    LogStreamsModule <.. Logger : uses
    BackendServer <.. Logger : logs_with
    BackendServer <.. SignatureVerifier : verifies_with

    BackendServer : app uses handleAutofixRaw as /autofix middleware
    BackendServer : app uses express.json for JSON parsing
    BackendServer : handleAutofixRaw stores req.rawBody
    BackendServer : handleAutofixWebhook reads req.rawBody
Loading

File-Level Changes

Change Details Files
Add managed deployment and restart flow for the runewager-endpoint backend service, with systemd integration and nohup fallback.
  • Introduce ENDPOINT_* configuration variables and log file handling for the backend endpoint on port 3001
  • Install or refresh the runewager-endpoint.systemd unit from the repository copy when systemd is available, enabling and daemon-reloading as needed
  • Before restart, free any conflicting process using the endpoint port and then restart via systemctl when possible
  • Implement a nohup-based fallback to start backend.js when systemd restart fails or systemd is unavailable, including killing prior node backend instances and wiring logs
prod-run.sh
Make backend logging more robust by handling log stream initialization failures and avoiding writes to invalid streams.
  • Create log streams inside a guarded try/catch, falling back to console logging if files cannot be opened or if stream errors occur
  • Change logger write logic to skip null streams and log to stdout instead when necessary
backend.js
Fix raw-body capture for /autofix routes to ensure correct HMAC verification behavior.
  • Replace direct express.raw middleware use with a wrapper that captures the raw Buffer in req.rawBody before JSON parsing
  • Update webhook signature verification to use req.rawBody or an empty buffer when absent
backend.js
Update runtime constraints and Express dependency to a newer version.
  • Relax Node engine constraint to allow Node 22 and above
  • Pin Express dependency to version 4.22.1 and refresh lockfile accordingly
package.json
package-lock.json
Extend CPU guard whitelist to exempt an additional monitoring script from termination.
  • Add gcz_cpu_guard to the whitelist patterns so the guard script does not kill it
scripts/rw_cpu_guard.sh
Introduce or refresh the systemd service definition for the runewager-endpoint backend.
  • Add or update runewager-endpoint.service unit file to be used by prod-run.sh for managing the backend endpoint process
runewager-endpoint.service

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@coderabbitai

coderabbitai Bot commented Mar 3, 2026

Copy link
Copy Markdown

Warning

Rate limit exceeded

@gamblecodezcom has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 15 minutes and 40 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between 947bb5a and 613da2f.

📒 Files selected for processing (4)
  • backend.js
  • prod-run.sh
  • runewager-endpoint.service
  • scripts/rw_cpu_guard.sh
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch claude/cpu-guard-script-DnD8u

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@codeant-ai codeant-ai Bot added the size:XL This PR changes 500-999 lines, ignoring generated files label Mar 3, 2026

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Hey - I've found 3 issues, and left some high level feedback:

  • The new /autofix raw-body middleware still relies on express.raw(), which will mark the request as already parsed and prevent express.json() from running for those routes; if any /autofix handlers expect a JSON-parsed req.body, consider using body-parser’s verify option on express.json() instead, or explicitly re-run JSON parsing after capturing req.rawBody.
  • prod-run.sh directs the endpoint’s stdout/stderr to $LOG_DIR/backend.log and backend-error.log, while backend.js writes to logs/backend.log and backend-error.log under its own directory; consider consolidating these paths to avoid having two separate backend log locations with the same filenames.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- The new /autofix raw-body middleware still relies on express.raw(), which will mark the request as already parsed and prevent express.json() from running for those routes; if any /autofix handlers expect a JSON-parsed req.body, consider using body-parser’s `verify` option on express.json() instead, or explicitly re-run JSON parsing after capturing req.rawBody.
- prod-run.sh directs the endpoint’s stdout/stderr to `$LOG_DIR/backend.log` and `backend-error.log`, while backend.js writes to `logs/backend.log` and `backend-error.log` under its own directory; consider consolidating these paths to avoid having two separate backend log locations with the same filenames.

## Individual Comments

### Comment 1
<location path="backend.js" line_range="41-50" />
<code_context>
+let _logStream = null;
</code_context>
<issue_to_address>
**suggestion (bug_risk):** Avoid logging the same entry multiple times to stdout when multiple streams are null.

In `_write`, this logic means a call like `logger.error(...)` with `[_logStream, _errStream]` will log the same line twice to stdout if both streams are `null`. Consider filtering to writable streams first and only falling back to a single `console.log` when none are available.

Suggested implementation:

```javascript
function _write(streams, line) {
    const writableStreams = streams.filter((s) => s);

    if (writableStreams.length > 0) {
        for (const stream of writableStreams) {
            stream.write(line + '\n');
        }
    } else {
        console.log(line);
    }
}

```

If the actual `_write` implementation differs (e.g., different parameter names, using `process.stdout.write`, etc.), adjust the `SEARCH` section to match the existing function body, and keep the `REPLACE` logic the same:

1. Ensure `streams` (or equivalent) is filtered to only truthy/writable streams.
2. Write to each available stream without any console fallback inside that loop.
3. Add a single `console.log` (or your existing stdout mechanism) in the `else` branch when no streams are available.
</issue_to_address>

### Comment 2
<location path="backend.js" line_range="204-209" />
<code_context>
     try {
         const sig     = req.headers['x-autofix-signature'] ?? req.headers['x-hub-signature-256'] ?? '';
-        const rawBody = Buffer.isBuffer(req.body) ? req.body : Buffer.from(JSON.stringify(req.body ?? {}));
+        const rawBody = req.rawBody ?? Buffer.alloc(0);

         if (!AUTOFIX_SECRET || !verifySignature(rawBody, sig)) {
</code_context>
<issue_to_address>
**suggestion (bug_risk):** Consider failing fast if req.rawBody is missing on the webhook route.

Using `Buffer.alloc(0)` means a missing `req.rawBody` will just look like a normal signature mismatch. If this endpoint should always have `rawBody` (because of the raw-body middleware), consider treating its absence as a 5xx (or at least logging it distinctly) so you can distinguish middleware misconfiguration from a genuinely bad signature.

```suggestion
    const requestId = req.id;
    try {
        const sig = req.headers['x-autofix-signature'] ?? req.headers['x-hub-signature-256'] ?? '';
        const rawBody = req.rawBody;

        if (!rawBody || !Buffer.isBuffer(rawBody)) {
            console.error('Missing or invalid rawBody on webhook request', { requestId });
            res.status(500).send('Internal server error');
            return;
        }

        if (!AUTOFIX_SECRET || !verifySignature(rawBody, sig)) {
```
</issue_to_address>

### Comment 3
<location path="prod-run.sh" line_range="423-433" />
<code_context>
+        sleep 1
+    fi
+
+    if systemctl restart "${ENDPOINT_SERVICE_NAME}.service" 2>/dev/null; then
+        say "runewager-endpoint restarted via systemd"
+    else
+        warn "systemctl restart runewager-endpoint failed — falling back to nohup"
+        pkill -f "node .*${PROJECT_DIR}/backend\.js" 2>/dev/null || true
+        sleep 1
+        nohup node "$PROJECT_DIR/backend.js" \
+            >> "$ENDPOINT_LOG" 2>> "$ENDPOINT_ERR" < /dev/null &
+        disown || true
</code_context>
<issue_to_address>
**suggestion:** Re-check and free the endpoint port before starting the nohup fallback after a failed systemd restart.

There’s a race window between the initial `ENDPOINT_PORT` cleanup and the failed `systemctl restart`: another process could bind the port in that gap, causing the nohup fallback to fail to bind (or bind differently). Consider running the `is_port_listening`/`free_port_if_conflicted` logic again in the fallback path immediately before `nohup node ...`.

```suggestion
    if systemctl restart "${ENDPOINT_SERVICE_NAME}.service" 2>/dev/null; then
        say "runewager-endpoint restarted via systemd"
    else
        warn "systemctl restart runewager-endpoint failed — falling back to nohup"
        pkill -f "node .*${PROJECT_DIR}/backend\.js" 2>/dev/null || true
        sleep 1
        # Re-check and free endpoint port before nohup fallback, to avoid race with other binders
        if is_port_listening "$ENDPOINT_PORT"; then
            say "Port $ENDPOINT_PORT in use — freeing before nohup fallback..."
            free_port_if_conflicted "$ENDPOINT_PORT" "" || true
            sleep 1
        fi
        nohup node "$PROJECT_DIR/backend.js" \
            >> "$ENDPOINT_LOG" 2>> "$ENDPOINT_ERR" < /dev/null &
        disown || true
        say "runewager-endpoint started via nohup fallback"
    fi
```
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

Comment thread backend.js
Comment thread backend.js
Comment thread prod-run.sh
prod-run.sh: kept scoped pkill pattern (node .*PROJECT_DIR/backend.js)
  over the broad main version (node .*backend.js) — prevents killing
  unrelated node processes on shared hosts.

runewager-endpoint.service: kept our version with ExecStartPre '+' prefix
  (root-exec for port-clear step) and User/Group=runewager over main's
  root user with unprefixed ExecStartPre.

https://claude.ai/code/session_01WpEqAiDbpqnBywMjYXJHf4
@codeant-ai

codeant-ai Bot commented Mar 3, 2026

Copy link
Copy Markdown

Nitpicks 🔍

🔒 No security issues identified
⚡ Recommended areas for review

  • Aggressive prestart kill
    The unit's ExecStartPre kills any PID found on the port with SIGKILL (-9) in a single shot. This can abruptly terminate unrelated processes and may lead to data loss or inconsistent system state. Prefer graceful termination (SIGTERM) with a timed escalation to SIGKILL, and avoid killing processes not owned by the service user unless absolutely necessary.

  • Stream Creation/Error Handling
    Write streams are created inside the try block and error handlers clear the references on 'error'. There is no check when writing to streams for properties like writable/destroyed and writes are attempted without try/catch. Consider defensive checks to avoid writing to destroyed streams or swallowing synchronous errors.

  • Logging Fallback
    The logger's _write currently falls back to console.log individually for every missing stream. If both streams are unavailable this will log duplicate lines. Also writes aren't guarded by checks for stream state (writable/destroyed) or try/catch, so runtime stream errors could cause inconsistent behavior or multiple fallback outputs.

  • Silent log creation
    The script silently ignores failure to create endpoint log files (touch ... 2>/dev/null || true). If the log directory or files are not writable, the nohup fallback will try to append to unreachable files and the launched backend may run without captured logs. The deployment should detect and surface this condition and fall back to a safe writable path (e.g., /tmp) or fix permissions.

  • Whitelist correctness
    The new whitelist entry gcz_cpu_guard was added as a substring match. Verify that the process names/command lines on target hosts actually contain this substring and that the simple substring/regex matching doesn't accidentally protect unintended processes. Also confirm the ordering doesn't allow overly generic safe-patterns to mask real offenders.

backend.js — _write double-logging:
  Filter to writable streams first; fall back to a single console.log
  only when none are available. Previously logger.error() with two null
  streams would print the same line twice to stdout.

backend.js — rawBody guard on webhook:
  Treat missing/non-Buffer req.rawBody as a 500 (middleware
  misconfiguration) rather than silently falling back to Buffer.alloc(0),
  which was indistinguishable from a genuine signature mismatch.

prod-run.sh — port race in nohup fallback:
  After a failed systemctl restart, re-check and free ENDPOINT_PORT
  before launching the nohup fallback. The original cleanup ran before
  the systemd attempt, leaving a race window where another process
  could bind the port.

Note: log paths are NOT a conflict — prod-run.sh LOG_DIR resolves to
$PROJECT_DIR/logs, same as backend.js path.join(__dirname, 'logs').

https://claude.ai/code/session_01WpEqAiDbpqnBywMjYXJHf4
@codeant-ai

codeant-ai Bot commented Mar 3, 2026

Copy link
Copy Markdown

CodeAnt AI finished reviewing your PR.

@gamblecodezcom
gamblecodezcom merged commit b090755 into main Mar 3, 2026
6 checks passed
@gamblecodezcom
gamblecodezcom deleted the claude/cpu-guard-script-DnD8u branch March 3, 2026 21:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL This PR changes 500-999 lines, ignoring generated files

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants