Skip to content

Cache negative cmux-scope results so system.top stops re-probing every process per poll - #5759

Merged
lawrencecchen merged 2 commits into
mainfrom
task-5756-cache-negative-cmux-scope
Jun 10, 2026
Merged

lawrencecchen merged 2 commits into
mainfrom
task-5756-cache-negative-cmux-scope

Conversation

@lawrencecchen

@lawrencecchen lawrencecchen commented Jun 10, 2026 •

Copy link
Copy Markdown
Contributor

Summary

system.top re-probed every non-cmux process with up to 3 sysctl calls on every poll, because CmuxTopProcessSnapshot.cachedCMUXScope only cached positive scope lookups. Under a heavy local agent fleet this was the single largest on-CPU consumer in a live sample of a beachballing stable build (v0.64.14) — hundreds of processes × 3 syscalls × poll rate.

This caches negative results too, with the nuance needed to stay correct:

  • Negative TTL (15s), not lifetime. The cache key is (pid, process start time), which an exec does not change, while scope is derived from argv/environment, which an exec can change. A lifetime negative cache would permanently mis-attribute a process first sampled in its fork-before-exec window, or one that execs into a cmux hooks … monitor later (e.g. a launchd-parented monitor). The TTL bounds attribution latency to 15s while still collapsing the steady-state per-poll storm. Positive scopes stay cached indefinitely (inherited-env / stable-argv scope doesn't disappear).
  • Permanent procargs denial is cached. KERN_PROCARGS2 fails permanently for other-user / protected processes (not just on exit races). The probe now distinguishes a permanent denial (process still alive → cache nil) from a transient exit/pid-reuse race (stays uncached). Without this, every root/other-user daemon would remain a permanent cache miss and keep the sysctl fan-out unbounded.
  • Concurrency-safe write. capture() runs concurrently (async task-manager sampling and sync system.top socket handling) and the probe runs outside the cache lock, so the post-probe write refuses to overwrite a positive scope a concurrent capture already discovered, and returns that positive.

Drops steady-state per-poll cost from O(non-cmux processes × 3 syscalls) to roughly O(non-cmux processes × 3 syscalls ÷ (TTL ÷ poll interval)).

Testing

New wired Swift Testing suite cmuxTests/CmuxTopSnapshotScopeCacheTests (.serialized, probe-injection + monotonic-clock seam): negatives cached within the TTL (probed once per window, not per poll), positives cached indefinitely, transient failures retried, an expired negative re-probed after exec, and a stale negative never clobbering a concurrently discovered positive. Two-commit red/green: commit 1 adds the seam + tests with the buggy behavior; commit 2 enables the TTL negative caching.

Three Codex autoreview rounds drove the design: a lifetime negative cache (exec problem) → 15s TTL; an unconditional write (concurrency clobber) → conditional write; transient-only failure classification (procargs denial leak) → permanent-denial caching.

Notes

The only workflow-guard-tests failure is the pre-existing AgentLaunchSanitizer.swift file-length-budget overflow on main (untouched here; main's own CI already fails this step). This PR's additions stay within budget in a separate wired test file.

Issues

@vercel

vercel Bot commented Jun 10, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
cmux Ready Ready Preview, Comment Jun 10, 2026 6:30am
cmux-staging Building Building Preview, Comment Jun 10, 2026 6:30am

@coderabbitai

coderabbitai Bot commented Jun 10, 2026 •

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Caches definitive CMUX probe outcomes (including explicit nil), separates transient failures via a probe-result enum, extracts probing into cmuxScopeProbe, makes cachedCMUXScope time-aware and injectable, updates caller usage to pass timestamps, and adds tests plus Xcode wiring for cache semantics.

Changes

CMUX Scope Caching

Layer / File(s) Summary
Scope types and probe result
Sources/CmuxTopSnapshot.swift, Sources/CmuxTopSnapshotScopeCache.swift
CmuxTopProcessScope now conforms to Equatable. Adds CmuxTopProcessScopeProbeResult with .resolved(CmuxTopProcessScope?) and .unavailable to distinguish cacheable from transient probe outcomes.
Process scope probing logic
Sources/CmuxTopSnapshotScopeCache.swift
cmuxScopeProbe reads proc args via sysctl, verifies process start-key before/after the read, and returns .resolved(parsedScope) or .unavailable.
Cache entry shape and conditional storage
Sources/CmuxTopSnapshotScopeCache.swift
Cache values store an optional scope and negativeExpiresAtNanos; cachedCMUXScope accepts nowNanoseconds and an injectable probe, caches only .resolved(...) results (including nil) with negative TTL semantics, and skips caching for .unavailable.
Caller integration
Sources/CmuxTopProcessEnumeration.swift
processInfo(...) now passes sampledAtNanoseconds into cachedCMUXScope, so lookups respect the poll timestamp.
Tests and project wiring
cmuxTests/CmuxTopSnapshotScopeCacheTests.swift, cmux.xcodeproj/project.pbxproj
Adds tests covering negative caching, positive caching, transient failure retries, negative TTL expiry, concurrency clobber prevention; wires the new test file into the cmuxTests target.

Sequence Diagram

sequenceDiagram
  participant ProcessEnumerator
  participant CmuxTopProcessSnapshot
  participant CMUXScopeCache
  participant Sysctl
  ProcessEnumerator->>CmuxTopProcessSnapshot: request cachedCMUXScope(pid, cacheKey, now)
  CmuxTopProcessSnapshot->>CMUXScopeCache: lookup(cacheKey)
  alt cache hit (resolved)
    CMUXScopeCache-->>CmuxTopProcessSnapshot: return scopeOrNil
    CmuxTopProcessSnapshot-->>ProcessEnumerator: return scopeOrNil
  else cache miss
    CmuxTopProcessSnapshot->>CmuxTopProcessSnapshot: cmuxScopeProbe(pid, cacheKey)
    CmuxTopProcessSnapshot->>Sysctl: read KERN_PROC_PID and KERN_PROCARGS2
    Sysctl-->>CmuxTopProcessSnapshot: procinfo/procargs
    alt probe success
      CmuxTopProcessSnapshot->>CMUXScopeCache: store resolved(scopeOrNil) [cache only .resolved]
      CmuxTopProcessSnapshot-->>ProcessEnumerator: return scopeOrNil
    else probe unavailable
      CmuxTopProcessSnapshot-->>ProcessEnumerator: return nil (do not cache)
    end
  end
Loading

🎯 4 (Complex) | ⏱️ ~45 minutes

"A rabbit peeked at sysctl lore,
Cached the 'no' to probe no more.
Positive stays, nil has a lease,
Failures bounce until they cease —
Hooray for quieter CPU!" 🐇✨


Important

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

❌ Failed checks (1 error, 1 warning)

Check name Status Explanation Resolution
Cmux Source Artifacts ❌ Error PR adds 30 artifact files violating source-control-artifacts.md: 25 in .claude/ (AI scratch, explicitly listed), 1 in .agents/, 3 in .greptile/, and .vercelignore. Should delete or add to .gitignore. Remove all files under .claude/, .agents/, .greptile/ directories and .vercelignore from the commit, or add these paths to .gitignore instead of committing them.
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (19 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately describes the primary change: caching negative cmux-scope results to eliminate repeated per-poll probes.
Linked Issues check ✅ Passed The PR directly addresses all coding requirements from #5756: caches negative results with a 15s TTL, distinguishes transient failures from cacheable nil, guards concurrent overwrites, and refactors the probe into a testable enum-returning function.
Out of Scope Changes check ✅ Passed All changes are directly scoped to the cache behavior and its testing: CmuxTopProcessScope gains Equatable, cache logic gains TTL/enum, tests are added, and the enumeration passes sampledAtNanoseconds; no extraneous changes.
Cmux Swift Actor Isolation ✅ Passed All new types properly marked nonisolated; OSAllocatedUnfairLock uses lock isolation. No implicit MainActor, unguarded Sendables, or isolation violations.
Cmux Swift Blocking Runtime ✅ Passed No blocking primitives introduced. Pre-existing lock guards only dictionary ops; sysctl outside lock. Time params are monotonic clock reads for TTL comparisons, not delays.
Cmux Expensive Synchronous Load ✅ Passed No sysctl operations added to @MainActor or interactive paths. All modified code is nonisolated. The refactoring improves caching to reduce syscall frequency, addressing CPU issues.
Cmux Cache Substitution Correctness ✅ Passed Cache is for transient snapshots only, not persistent state. Cold cache: starts empty. Stale cache: handled by 15s negative TTL and process-start-time keying.
Cmux No Hacky Sleeps ✅ Passed The PR modifies only Swift source code and build configuration; the "no hacky sleeps" rule applies only to TypeScript, JavaScript, shell, and build/runtime scripts, which this PR does not contain.
Cmux Algorithmic Complexity ✅ Passed Linear O(N) algorithm with O(1) per-process cache lookups. No nested scans, per-target rescans, or repeated filtering. All sequential passes. No violations of algorithmic complexity rules.
Cmux Swift Concurrency ✅ Passed No legacy async patterns found: probe closure is synchronous dependency injection, all code synchronous with OSAllocatedUnfairLock, no DispatchQueue/Combine/fire-and-forget Tasks.
Cmux Swift @Concurrent ✅ Passed New nonisolated sync functions correctly perform blocking I/O on background threads. MainActor work properly hops via task group. No missing or invalid @concurrent annotations in changes.
Cmux Swift File And Package Boundaries ✅ Passed CmuxTopSnapshotScopeCache.swift (287 lines) is under 400-line threshold with focused scope-caching responsibility; minimal existing-file changes; qualifies as allowed focused bug fix.
Cmux Swift Logging ✅ Passed No logging violations found. Production code adds no print, NSLog, Logger, or file/stdout logging. The os import is for OSAllocatedUnfairLock (concurrency primitive), not logging.
Cmux User-Facing Error Privacy ✅ Passed No user-facing error privacy violations. Internal cache implementation with no user-visible strings, error messages, or credentials exposed.
Cmux Full Internationalization ✅ Passed PR adds backend cache logic with no new user-facing UI text; attribution strings are technical diagnostic markers exempt from localization.
Cmux Swiftui State Layout ✅ Passed PR contains no SwiftUI changes. All modifications are to non-SwiftUI code: caching logic, unit tests, and project configuration. The SwiftUI state layout check is not applicable.
Cmux Architecture Rethink ✅ Passed Proper memoization cache with clear owner, documented invariants, minimal lock usage (dict ops), and no prohibited patterns: no sleeps, polling, observers, timing workarounds, or split ownership.
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed PR adds no NSWindow/NSPanel/NSWindowController/Window/WindowGroup code; changes are exclusively scope-caching logic for system.top performance, not window management.
Description check ✅ Passed The pull request description is comprehensive and well-structured, covering the problem, solution, testing strategy, and addressing known CI issues.
✨ 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 task-5756-cache-negative-cmux-scope

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.

@greptile-apps

greptile-apps Bot commented Jun 10, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR fixes the leading on-CPU hot spot in system.top polling by caching negative cmux-scope results (processes with no cmux scope) under a 15-second TTL, while keeping positive scope results cached for the process lifetime. The probe path is also refactored to return a typed .resolved/.unavailable enum so transient failures (mid-exit, pid reuse) are not cached, while permanent denials (protected/other-user processes) are cached as definitive no-scope entries.

  • CmuxTopSnapshotScopeCache.swift: splits the old synchronous cmuxScope(for:) into cmuxScopeProbe returning CmuxTopProcessScopeProbeResult; cachedCMUXScope now stores scope: CmuxTopProcessScope? in the cache value with a negativeExpiresAtNanos TTL field, and guards against a stale nil probe overwriting a concurrently discovered positive scope.
  • CmuxTopProcessEnumeration.swift: threads the sample-clock timestamp (sampledAtNanoseconds) into every cachedCMUXScope call so TTL expiry uses the same monotonic clock as CPU sampling.
  • CmuxTopSnapshotScopeCacheTests.swift: new wired test suite covering negative-TTL caching, positive lifetime caching, transient-failure retry, TTL-expiry re-probe after exec, and the concurrent nil-clobber guard.

Confidence Score: 5/5

Safe to merge. The change is narrowly scoped to the negative-result caching path, all five edge cases are covered by injectable-probe unit tests, and the concurrent nil-clobber guard is correct.

The lock scope is kept intentionally minimal (dict reads/writes only; sysctls happen outside), the .resolved/.unavailable discrimination correctly separates cacheable permanent denials from uncacheable exit races, and the &+ wrapping on the TTL expiry timestamp degrades gracefully (a spurious re-probe on overflow, not a stale cache hit). No production logic regressions were found.

No files require special attention.

Important Files Changed

Filename Overview
Sources/CmuxTopSnapshotScopeCache.swift Core change: adds TTL-based negative caching and .resolved/.unavailable probe discrimination; concurrent nil-clobber guard is correct; lock scope kept minimal (dict ops only, sysctls outside).
Sources/CmuxTopProcessEnumeration.swift Minimal one-line change threading sampledAtNanoseconds into cachedCMUXScope; correctly reuses the already-computed sample-clock value for TTL comparisons.
Sources/CmuxTopSnapshot.swift Adds Equatable conformance to CmuxTopProcessScope to support test assertions; no logic changes.
cmuxTests/CmuxTopSnapshotScopeCacheTests.swift Thorough probe-injection + time-seam tests covering all five scenarios (negative TTL, positive lifetime, transient retry, TTL-expiry re-probe after exec, concurrent nil-clobber); .serialized correctly serializes against the shared global cache.
cmux.xcodeproj/project.pbxproj Wires the new test file into the test target; no structural project changes.

Reviews (6): Last reviewed commit: "fix(system.top): cache negative cmux-sco..." | Re-trigger Greptile

@lawrencecchen
lawrencecchen force-pushed the task-5756-cache-negative-cmux-scope branch from 0feeaa7 to d012eb7 Compare June 10, 2026 04:33
@lawrencecchen

Copy link
Copy Markdown
Contributor Author

Note on workflow-guard-tests: the Swift file-length-budget step fails on this PR, but the only offender is Packages/CMUXAgentLaunch/Sources/CMUXAgentLaunch/AgentLaunchSanitizer.swift (566 lines, untracked, ≥500 threshold), which is pre-existing on main and not touched by this change — recent main CI runs already fail this same step. This PR's own additions stay within budget: the new regression tests live in a separate, wired cmuxTests/CmuxTopSnapshotScopeCacheTests.swift (96 lines) instead of growing the already-capped CmuxTopSnapshotScopeTests.swift. Compile + lag (tests-build-and-lag) and the unit tests job exercise the new red/green coverage.

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 1923690d02

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread Sources/CmuxTopSnapshotScopeCache.swift Outdated
Comment on lines +126 to +128
guard sysctl(&mib, u_int(mib.count), nil, &size, nil, 0) == 0,
size > MemoryLayout<Int32>.size else {
return nil
return .unavailable

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Cache permanent procargs failures as misses

When KERN_PROCARGS2 fails permanently for protected/other-user processes (for example long-lived system daemons), this path returns .unavailable, and cachedCMUXScope deliberately skips writing any cache entry for .unavailable. Those processes are therefore still re-probed on every system.top poll, preserving the sysctl storm this change is meant to eliminate for a common class of non-cmux processes; only genuinely transient cases such as ESRCH/pid reuse should retry rather than caching a negative result.

Useful? React with 👍 / 👎.

@lawrencecchen
lawrencecchen force-pushed the task-5756-cache-negative-cmux-scope branch from 1923690 to 676ed82 Compare June 10, 2026 05:17

@coderabbitai coderabbitai 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.

Actionable comments posted: 1

🤖 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 `@Sources/CmuxTopSnapshotScopeCache.swift`:
- Around line 12-19: The positive cache entries currently never expire which
lets an exec-changing process keep an old CmuxTopProcessScope indefinitely; add
a staleness policy for positive hits by adding a positiveExpiresAtNanos (UInt64)
timestamp to the cache entry (in the same type that currently has scope and
negativeExpiresAtNanos), set it when inserting positive scopes (e.g. use a short
TTL for scopes derived from cmux-hook-arguments but keep longer/never for truly
inherited stable sources), and update the lookup logic that currently checks
negativeExpiresAtNanos to also treat a positive entry as expired if now >
positiveExpiresAtNanos (or if the source requires revalidation), causing callers
to re-probe instead of returning the stale scope from functions/methods that
reference CmuxTopSnapshotScopeCache, scope, and negativeExpiresAtNanos.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 8f9790ee-c407-4c26-94d1-ff640a9bcc7a

📥 Commits

Reviewing files that changed from the base of the PR and between 1923690 and 676ed82.

📒 Files selected for processing (5)
  • Sources/CmuxTopProcessEnumeration.swift
  • Sources/CmuxTopSnapshot.swift
  • Sources/CmuxTopSnapshotScopeCache.swift
  • cmux.xcodeproj/project.pbxproj
  • cmuxTests/CmuxTopSnapshotScopeCacheTests.swift

Comment on lines +12 to +19
// nil means "this process was probed and has no cmux scope". A negative entry
// is honored as a hit only until `negativeExpiresAtNanos`, so a non-cmux
// process is re-probed at most once per TTL window instead of on every
// system.top poll. Positive entries never expire (`negativeExpiresAtNanos` is
// ignored when `scope != nil`): a cmux scope comes from inherited environment
// or a stable argv and does not disappear for the process lifetime.
let scope: CmuxTopProcessScope?
let negativeExpiresAtNanos: UInt64

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift

Don't keep positive scope hits forever on an exec-stable cache key.

Lines 23-26 already note that exec can change argv/environment without changing (pid, start time), but Lines 73-76 return any positive hit indefinitely. That leaves cmux-hook-arguments scopes stale if a process later execs away from the cmux hooks … monitor argv: subsequent system.top polls will keep attributing the new program to the old workspace/surface for the rest of that process lifetime. Positive entries need their own staleness policy, or at least source-specific revalidation, instead of unconditional indefinite reuse.

As per coding guidelines, cache substitutions in snapshot paths must explicitly handle stale caches, not just cold misses.

Also applies to: 72-107

🤖 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 `@Sources/CmuxTopSnapshotScopeCache.swift` around lines 12 - 19, The positive
cache entries currently never expire which lets an exec-changing process keep an
old CmuxTopProcessScope indefinitely; add a staleness policy for positive hits
by adding a positiveExpiresAtNanos (UInt64) timestamp to the cache entry (in the
same type that currently has scope and negativeExpiresAtNanos), set it when
inserting positive scopes (e.g. use a short TTL for scopes derived from
cmux-hook-arguments but keep longer/never for truly inherited stable sources),
and update the lookup logic that currently checks negativeExpiresAtNanos to also
treat a positive entry as expired if now > positiveExpiresAtNanos (or if the
source requires revalidation), causing callers to re-probe instead of returning
the stale scope from functions/methods that reference CmuxTopSnapshotScopeCache,
scope, and negativeExpiresAtNanos.

Source: Coding guidelines

… probes

Adds a probe-injection seam and monotonic-clock plumbing to
CmuxTopProcessSnapshot.cachedCMUXScope, classifies permanent procargs denials
(other-user/protected processes) as cacheable negatives vs transient exit races,
and adds a new wired Swift Testing suite (CmuxTopSnapshotScopeCacheTests,
serialized for the shared cache) covering: negatives cached within a TTL (not
re-probed every poll), an expired negative re-probed after exec, transient
failures retried, and a stale negative never clobbering a concurrently
discovered positive scope. This commit keeps the buggy behavior (resolved-nil
results are not cached) so the new tests fail; the fix follows in the next commit.

Issue: #5756

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…p per-poll sysctl storm

CmuxTopProcessSnapshot.cachedCMUXScope only cached positive scope lookups, so
every process without a cmux scope (the vast majority on a busy host: system
daemons, helpers, and agent processes with no CMUX_WORKSPACE_ID/CMUX_SURFACE_ID)
was a permanent cache miss. Each system.top / system.memory poll then re-ran the
scope probe (two sysctl(KERN_PROC_PID) + one sysctl(KERN_PROCARGS2)) for every
such process. Under a heavy local agent fleet this was the single largest
on-CPU consumer in a live sample of a beachballing build (hundreds of processes
× 3 syscalls × poll rate).

Cache the resolved nil result too, but under a 15s TTL rather than for the
process lifetime. The cache key is (pid, process start time), which an `exec`
does not change, and the scope is derived from argv/environment, which an exec
can change. Caching the negative forever would mean a process first sampled in
its fork-before-exec window (or one that execs into a `cmux hooks … monitor`
later, e.g. a launchd-parented monitor) would never be attributed. The TTL
bounds that attribution latency to 15s while still collapsing the steady-state
per-poll storm. Positive scopes are still cached indefinitely.

The probe (cmuxScopeProbe) also distinguishes a permanent KERN_PROCARGS2 denial
(other-user/protected process that is still alive) — cached as a definitive
"no readable cmux scope" — from a transient failure (process exited mid-probe /
pid reuse), which stays uncached. Without this, every root/other-user daemon
would remain a permanent cache miss and keep the sysctl fan-out unbounded.

capture() runs concurrently (async task-manager sampling and sync system.top
socket handling) and the probe runs outside the cache lock, so the post-probe
write is conditional: a resolved-nil result never overwrites a positive scope a
concurrent capture already discovered, and returns that positive instead.

Drops steady-state per-poll cost from O(non-cmux processes × 3 syscalls) to
roughly O(non-cmux processes × 3 syscalls / (TTL / poll interval)).

Closes #5756

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@lawrencecchen
lawrencecchen force-pushed the task-5756-cache-negative-cmux-scope branch from e3b9c5e to 79d3456 Compare June 10, 2026 06:17
hhsw2015 pushed a commit to hhsw2015/cmux that referenced this pull request Jun 10, 2026
@lawrencecchen
lawrencecchen merged commit 0a0b60f into main Jun 10, 2026
28 of 30 checks passed
@lawrencecchen
lawrencecchen deleted the task-5756-cache-negative-cmux-scope branch June 10, 2026 22:20
@lawrencecchen
lawrencecchen restored the task-5756-cache-negative-cmux-scope branch July 18, 2026 10:25

This branch was successfully deployed

1 active deployment
Preview – cmux — 79d34565 Deployed Jun 10, 2026 by vercel[bot]
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.

system.top re-probes every non-cmux process with 3 sysctls per poll (negative scope results never cached) — top CPU consumer under heavy agent load

1 participant