Skip to content

emrg: remove emrgd.pid entirely — fixed-port probe + cmdline scan for daemon liveness/kill (rant 2026-08-21T16:45:06) - #920

Merged
argszero merged 1 commit into
masterfrom
feature/remove-emrgd-pid-file
Aug 21, 2026
Merged

emrg: remove emrgd.pid entirely — fixed-port probe + cmdline scan for daemon liveness/kill (rant 2026-08-21T16:45:06)#920
argszero merged 1 commit into
masterfrom
feature/remove-emrgd-pid-file

Conversation

@argszero

Copy link
Copy Markdown
Owner

Problem (rant 2026-08-21T16:45:06)

emrgd.pid no longer serves any purpose after #918 switched the GUI liveness check to a fixed-port TCP probe — the fixed port 56031 is the daemon's only ground truth (rant 2026-08-19T08:05:21; connect.py is_server_running_sync is already a TCP probe). The pid file was itself the root cause of repeated misjudgments/mis-deletions (#918 fixed the GUI side, but the file was still written/read in daemon.py / _stop_all.py).

Changes

  1. emrg/server/daemon.py — deleted the startup emrgd.pid write (was "diagnostics only") and the shutdown self-delete step; _shutdown_all() dropped its pid_file parameter.
  2. emrg/_stop_all.py:
    • deleted _read_pid_file()
    • stop_daemon(): ws shutdown → wait on fixed-port TCP probe (_port_is_open) → cmdline-scan kill fallback (_daemon_scan_pids, matches -m emrg.server) → token cleanup once the port is confirmed closed
    • added _port_is_open() (mirrors connect.py is_server_running_sync, pure stdlib for the standalone installer) and _daemon_scan_pids() (POSIX ps-scan filtered by new _EMRG_SERVER_RE; Windows reuses the CIM scan with server_only=True)
    • _scan_windows_python_emrg() gained a server_only param (filter -m emrg\.server vs -m emrg)
    • verify() daemon residual is now the port probe (previously _read_pid_file + _pid_alive)
    • module header docstring updated
  3. emrg/gui/daemon_client.js — comment cleanup only (already port-probe since emrg: GUI daemon liveness — fixed-port TCP probe, never delete healthy daemon's token (rant 2026-08-21T15:26:42) #918).
  4. Grep confirmed no other emrgd.pid readers/writers in scheduler.py / __main__.py / connect.py.

Tests

  • tests/test_daemon.py: pid-file assertions removed/negated (no pid file may be written); _shutdown_all() calls updated to the no-arg signature
  • tests/test_stop_all.py: TestPidFileTestPortIsOpen (3) + TestDaemonScanPids (4, incl. POSIX daemon-only filter + Windows server_only delegation); verify tests patch _port_is_open instead of _read_pid_file
  • tests/test_installer_stop.py: wiring assertions now check _port_is_open / _daemon_scan_pids / _EMRG_SERVER_RE
  • Python test count 995 → 1001 (net +6); Agent.md doc-count guard synced; GUI 257 unchanged

Verification

emrg stop now handles alive / half-dead / missing-pid scenarios via port probe + cmdline scan; full suite green (pytest 1000 passed + 1 skipped, GUI 249 + 8); no emrgd.pid reads/writes remain anywhere in emrg/.

… as the only daemon liveness/kill path (rant 2026-08-21T16:45:06)

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

✅ LGTM — cycle 1214. emrgd.pid fully removed: daemon.py no longer writes/cleans it; _stop_all.py uses fixed-port TCP probe (_port_is_open) for liveness + cmdline scan (_daemon_scan_pids, -m emrg.server) for the kill fallback; verify() residual is port-based. Positive/negative states covered (port open/closed, POSIX daemon-only filter, Windows server_only delegation). Full suite green locally (pytest 1000+1, GUI 249+8), CI test + test-windows PASS.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

✅ LGTM — cycle

2nd review (head 980c8e6, MERGEABLE/CLEAN, CI test + test-windows PASS):

  • Fresh local verification on this branch: pytest 1000 passed + 1 skipped (1001 collected, matches Agent.md sync), GUI npm test 257 (249 pass / 0 fail / 8 skipped), import + CLI OK.
  • emrgd.pid fully removed: daemon.py no longer writes/cleans it; _shutdown_all() dropped the pid_file param; grep confirms zero emrgd.pid readers/writers in emrg/ (only comments).
  • _port_is_open() mirrors connect.py is_server_running_sync (stdlib socket, standalone-safe); _daemon_scan_pids() scans '-m emrg.server' cmdlines (POSIX ps + Windows CIM server_only) for the kill fallback; verify() daemon residual is now the port probe.
  • Tests: TestPidFile → TestPortIsOpen (3) + TestDaemonScanPids (4, incl. POSIX daemon-only filter + Windows server_only delegation); installer wiring asserts the new symbols.
  • Completes the #918 direction: fixed port is the sole ground truth for daemon liveness.

2/3.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

✅ LGTM — cycle 1215. Independent re-review on head 980c8e6 (MERGEABLE, CI test + test-windows PASS):

  • emrgd.pid fully gone from code: daemon.py no longer writes/cleans it, _shutdown_all() dropped the pid_file param; only comments + the deliberate negative-state GUI test (writes a pid file, asserts the port probe stays authoritative) remain.
  • _port_is_open() = fixed-port TCP probe (127.0.0.1:56031) mirroring connect.py is_server_running_sync; used for the ws-grace wait, token cleanup gate, and verify() residual — port is the sole liveness ground truth.
  • _daemon_scan_pids() = daemon-only cmdline identity (-m emrg.server): POSIX ps-scan filtered by _EMRG_SERVER_RE (excludes TUI -m emrg), Windows CIM scan with server_only=True. TUI clients are stopped earlier in the chain, so the daemon-only kill fallback is safe.
  • Tests: TestPortIsOpen (open/refused/OSError), TestDaemonScanPids (TUI-vs-daemon filter, own-pid exclusion, Windows server_only delegation + CIM filter), verify residual rewritten to the port probe.
  • Local: pytest 1000 passed + 1 skipped (matches Agent.md sync on this branch), import + CLI OK.

@argszero
argszero merged commit fc10d99 into masterAug 21, 2026
2 checks passed
argszero added a commit that referenced this pull request Aug 21, 2026
Co-authored-by: EMRG Evolution <emrg@argszero.dev>
@argszero
argszero deleted the feature/remove-emrgd-pid-file branch August 23, 2026 02:26
Sign up for freeto 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

@argszero
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
emrg: remove emrgd.pid entirely — fixed-port probe + cmdline scan for daemon liveness/kill (rant 2026-08-21T16:45:06) by argszero · Pull Request #920 · argszero/emrg · GitHub
Skip to content

emrg: remove emrgd.pid entirely — fixed-port probe + cmdline scan for daemon liveness/kill (rant 2026-08-21T16:45:06) - #920

Merged
argszero merged 1 commit into
masterfrom
feature/remove-emrgd-pid-file
Aug 21, 2026
Merged

emrg: remove emrgd.pid entirely — fixed-port probe + cmdline scan for daemon liveness/kill (rant 2026-08-21T16:45:06)#920
argszero merged 1 commit into
masterfrom
feature/remove-emrgd-pid-file

Conversation

@argszero

Copy link
Copy Markdown
Owner

Problem (rant 2026-08-21T16:45:06)

emrgd.pid no longer serves any purpose after #918 switched the GUI liveness check to a fixed-port TCP probe — the fixed port 56031 is the daemon's only ground truth (rant 2026-08-19T08:05:21; connect.py is_server_running_sync is already a TCP probe). The pid file was itself the root cause of repeated misjudgments/mis-deletions (#918 fixed the GUI side, but the file was still written/read in daemon.py / _stop_all.py).

Changes

  1. emrg/server/daemon.py — deleted the startup emrgd.pid write (was "diagnostics only") and the shutdown self-delete step; _shutdown_all() dropped its pid_file parameter.
  2. emrg/_stop_all.py:
    • deleted _read_pid_file()
    • stop_daemon(): ws shutdown → wait on fixed-port TCP probe (_port_is_open) → cmdline-scan kill fallback (_daemon_scan_pids, matches -m emrg.server) → token cleanup once the port is confirmed closed
    • added _port_is_open() (mirrors connect.py is_server_running_sync, pure stdlib for the standalone installer) and _daemon_scan_pids() (POSIX ps-scan filtered by new _EMRG_SERVER_RE; Windows reuses the CIM scan with server_only=True)
    • _scan_windows_python_emrg() gained a server_only param (filter -m emrg\.server vs -m emrg)
    • verify() daemon residual is now the port probe (previously _read_pid_file + _pid_alive)
    • module header docstring updated
  3. emrg/gui/daemon_client.js — comment cleanup only (already port-probe since emrg: GUI daemon liveness — fixed-port TCP probe, never delete healthy daemon's token (rant 2026-08-21T15:26:42) #918).
  4. Grep confirmed no other emrgd.pid readers/writers in scheduler.py / __main__.py / connect.py.

Tests

  • tests/test_daemon.py: pid-file assertions removed/negated (no pid file may be written); _shutdown_all() calls updated to the no-arg signature
  • tests/test_stop_all.py: TestPidFileTestPortIsOpen (3) + TestDaemonScanPids (4, incl. POSIX daemon-only filter + Windows server_only delegation); verify tests patch _port_is_open instead of _read_pid_file
  • tests/test_installer_stop.py: wiring assertions now check _port_is_open / _daemon_scan_pids / _EMRG_SERVER_RE
  • Python test count 995 → 1001 (net +6); Agent.md doc-count guard synced; GUI 257 unchanged

Verification

emrg stop now handles alive / half-dead / missing-pid scenarios via port probe + cmdline scan; full suite green (pytest 1000 passed + 1 skipped, GUI 249 + 8); no emrgd.pid reads/writes remain anywhere in emrg/.

… as the only daemon liveness/kill path (rant 2026-08-21T16:45:06)

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

✅ LGTM — cycle 1214. emrgd.pid fully removed: daemon.py no longer writes/cleans it; _stop_all.py uses fixed-port TCP probe (_port_is_open) for liveness + cmdline scan (_daemon_scan_pids, -m emrg.server) for the kill fallback; verify() residual is port-based. Positive/negative states covered (port open/closed, POSIX daemon-only filter, Windows server_only delegation). Full suite green locally (pytest 1000+1, GUI 249+8), CI test + test-windows PASS.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

✅ LGTM — cycle

2nd review (head 980c8e6, MERGEABLE/CLEAN, CI test + test-windows PASS):

  • Fresh local verification on this branch: pytest 1000 passed + 1 skipped (1001 collected, matches Agent.md sync), GUI npm test 257 (249 pass / 0 fail / 8 skipped), import + CLI OK.
  • emrgd.pid fully removed: daemon.py no longer writes/cleans it; _shutdown_all() dropped the pid_file param; grep confirms zero emrgd.pid readers/writers in emrg/ (only comments).
  • _port_is_open() mirrors connect.py is_server_running_sync (stdlib socket, standalone-safe); _daemon_scan_pids() scans '-m emrg.server' cmdlines (POSIX ps + Windows CIM server_only) for the kill fallback; verify() daemon residual is now the port probe.
  • Tests: TestPidFile → TestPortIsOpen (3) + TestDaemonScanPids (4, incl. POSIX daemon-only filter + Windows server_only delegation); installer wiring asserts the new symbols.
  • Completes the #918 direction: fixed port is the sole ground truth for daemon liveness.

2/3.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

✅ LGTM — cycle 1215. Independent re-review on head 980c8e6 (MERGEABLE, CI test + test-windows PASS):

  • emrgd.pid fully gone from code: daemon.py no longer writes/cleans it, _shutdown_all() dropped the pid_file param; only comments + the deliberate negative-state GUI test (writes a pid file, asserts the port probe stays authoritative) remain.
  • _port_is_open() = fixed-port TCP probe (127.0.0.1:56031) mirroring connect.py is_server_running_sync; used for the ws-grace wait, token cleanup gate, and verify() residual — port is the sole liveness ground truth.
  • _daemon_scan_pids() = daemon-only cmdline identity (-m emrg.server): POSIX ps-scan filtered by _EMRG_SERVER_RE (excludes TUI -m emrg), Windows CIM scan with server_only=True. TUI clients are stopped earlier in the chain, so the daemon-only kill fallback is safe.
  • Tests: TestPortIsOpen (open/refused/OSError), TestDaemonScanPids (TUI-vs-daemon filter, own-pid exclusion, Windows server_only delegation + CIM filter), verify residual rewritten to the port probe.
  • Local: pytest 1000 passed + 1 skipped (matches Agent.md sync on this branch), import + CLI OK.

@argszero
argszero merged commit fc10d99 into masterAug 21, 2026
2 checks passed
argszero added a commit that referenced this pull request Aug 21, 2026
Co-authored-by: EMRG Evolution <emrg@argszero.dev>
@argszero
argszero deleted the feature/remove-emrgd-pid-file branch August 23, 2026 02:26
Sign up for freeto 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

@argszero
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' emrg: remove emrgd.pid entirely — fixed-port probe + cmdline scan for daemon liveness/kill (rant 2026-08-21T16:45:06) by argszero · Pull Request #920 · argszero/emrg · GitHub
Skip to content

emrg: remove emrgd.pid entirely — fixed-port probe + cmdline scan for daemon liveness/kill (rant 2026-08-21T16:45:06) - #920

Merged
argszero merged 1 commit into
masterfrom
feature/remove-emrgd-pid-file
Aug 21, 2026
Merged

emrg: remove emrgd.pid entirely — fixed-port probe + cmdline scan for daemon liveness/kill (rant 2026-08-21T16:45:06)#920
argszero merged 1 commit into
masterfrom
feature/remove-emrgd-pid-file

Conversation

@argszero

Copy link
Copy Markdown
Owner

Problem (rant 2026-08-21T16:45:06)

emrgd.pid no longer serves any purpose after #918 switched the GUI liveness check to a fixed-port TCP probe — the fixed port 56031 is the daemon's only ground truth (rant 2026-08-19T08:05:21; connect.py is_server_running_sync is already a TCP probe). The pid file was itself the root cause of repeated misjudgments/mis-deletions (#918 fixed the GUI side, but the file was still written/read in daemon.py / _stop_all.py).

Changes

  1. emrg/server/daemon.py — deleted the startup emrgd.pid write (was "diagnostics only") and the shutdown self-delete step; _shutdown_all() dropped its pid_file parameter.
  2. emrg/_stop_all.py:
    • deleted _read_pid_file()
    • stop_daemon(): ws shutdown → wait on fixed-port TCP probe (_port_is_open) → cmdline-scan kill fallback (_daemon_scan_pids, matches -m emrg.server) → token cleanup once the port is confirmed closed
    • added _port_is_open() (mirrors connect.py is_server_running_sync, pure stdlib for the standalone installer) and _daemon_scan_pids() (POSIX ps-scan filtered by new _EMRG_SERVER_RE; Windows reuses the CIM scan with server_only=True)
    • _scan_windows_python_emrg() gained a server_only param (filter -m emrg\.server vs -m emrg)
    • verify() daemon residual is now the port probe (previously _read_pid_file + _pid_alive)
    • module header docstring updated
  3. emrg/gui/daemon_client.js — comment cleanup only (already port-probe since emrg: GUI daemon liveness — fixed-port TCP probe, never delete healthy daemon's token (rant 2026-08-21T15:26:42) #918).
  4. Grep confirmed no other emrgd.pid readers/writers in scheduler.py / __main__.py / connect.py.

Tests

  • tests/test_daemon.py: pid-file assertions removed/negated (no pid file may be written); _shutdown_all() calls updated to the no-arg signature
  • tests/test_stop_all.py: TestPidFileTestPortIsOpen (3) + TestDaemonScanPids (4, incl. POSIX daemon-only filter + Windows server_only delegation); verify tests patch _port_is_open instead of _read_pid_file
  • tests/test_installer_stop.py: wiring assertions now check _port_is_open / _daemon_scan_pids / _EMRG_SERVER_RE
  • Python test count 995 → 1001 (net +6); Agent.md doc-count guard synced; GUI 257 unchanged

Verification

emrg stop now handles alive / half-dead / missing-pid scenarios via port probe + cmdline scan; full suite green (pytest 1000 passed + 1 skipped, GUI 249 + 8); no emrgd.pid reads/writes remain anywhere in emrg/.

… as the only daemon liveness/kill path (rant 2026-08-21T16:45:06)

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

✅ LGTM — cycle 1214. emrgd.pid fully removed: daemon.py no longer writes/cleans it; _stop_all.py uses fixed-port TCP probe (_port_is_open) for liveness + cmdline scan (_daemon_scan_pids, -m emrg.server) for the kill fallback; verify() residual is port-based. Positive/negative states covered (port open/closed, POSIX daemon-only filter, Windows server_only delegation). Full suite green locally (pytest 1000+1, GUI 249+8), CI test + test-windows PASS.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

✅ LGTM — cycle

2nd review (head 980c8e6, MERGEABLE/CLEAN, CI test + test-windows PASS):

  • Fresh local verification on this branch: pytest 1000 passed + 1 skipped (1001 collected, matches Agent.md sync), GUI npm test 257 (249 pass / 0 fail / 8 skipped), import + CLI OK.
  • emrgd.pid fully removed: daemon.py no longer writes/cleans it; _shutdown_all() dropped the pid_file param; grep confirms zero emrgd.pid readers/writers in emrg/ (only comments).
  • _port_is_open() mirrors connect.py is_server_running_sync (stdlib socket, standalone-safe); _daemon_scan_pids() scans '-m emrg.server' cmdlines (POSIX ps + Windows CIM server_only) for the kill fallback; verify() daemon residual is now the port probe.
  • Tests: TestPidFile → TestPortIsOpen (3) + TestDaemonScanPids (4, incl. POSIX daemon-only filter + Windows server_only delegation); installer wiring asserts the new symbols.
  • Completes the #918 direction: fixed port is the sole ground truth for daemon liveness.

2/3.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

✅ LGTM — cycle 1215. Independent re-review on head 980c8e6 (MERGEABLE, CI test + test-windows PASS):

  • emrgd.pid fully gone from code: daemon.py no longer writes/cleans it, _shutdown_all() dropped the pid_file param; only comments + the deliberate negative-state GUI test (writes a pid file, asserts the port probe stays authoritative) remain.
  • _port_is_open() = fixed-port TCP probe (127.0.0.1:56031) mirroring connect.py is_server_running_sync; used for the ws-grace wait, token cleanup gate, and verify() residual — port is the sole liveness ground truth.
  • _daemon_scan_pids() = daemon-only cmdline identity (-m emrg.server): POSIX ps-scan filtered by _EMRG_SERVER_RE (excludes TUI -m emrg), Windows CIM scan with server_only=True. TUI clients are stopped earlier in the chain, so the daemon-only kill fallback is safe.
  • Tests: TestPortIsOpen (open/refused/OSError), TestDaemonScanPids (TUI-vs-daemon filter, own-pid exclusion, Windows server_only delegation + CIM filter), verify residual rewritten to the port probe.
  • Local: pytest 1000 passed + 1 skipped (matches Agent.md sync on this branch), import + CLI OK.

@argszero
argszero merged commit fc10d99 into masterAug 21, 2026
2 checks passed
argszero added a commit that referenced this pull request Aug 21, 2026
Co-authored-by: EMRG Evolution <emrg@argszero.dev>
@argszero
argszero deleted the feature/remove-emrgd-pid-file branch August 23, 2026 02:26
Sign up for freeto 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

@argszero
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' emrg: remove emrgd.pid entirely — fixed-port probe + cmdline scan for daemon liveness/kill (rant 2026-08-21T16:45:06) by argszero · Pull Request #920 · argszero/emrg · GitHub
Skip to content

emrg: remove emrgd.pid entirely — fixed-port probe + cmdline scan for daemon liveness/kill (rant 2026-08-21T16:45:06) - #920

Merged
argszero merged 1 commit into
masterfrom
feature/remove-emrgd-pid-file
Aug 21, 2026
Merged

emrg: remove emrgd.pid entirely — fixed-port probe + cmdline scan for daemon liveness/kill (rant 2026-08-21T16:45:06)#920
argszero merged 1 commit into
masterfrom
feature/remove-emrgd-pid-file

Conversation

@argszero

Copy link
Copy Markdown
Owner

Problem (rant 2026-08-21T16:45:06)

emrgd.pid no longer serves any purpose after #918 switched the GUI liveness check to a fixed-port TCP probe — the fixed port 56031 is the daemon's only ground truth (rant 2026-08-19T08:05:21; connect.py is_server_running_sync is already a TCP probe). The pid file was itself the root cause of repeated misjudgments/mis-deletions (#918 fixed the GUI side, but the file was still written/read in daemon.py / _stop_all.py).

Changes

  1. emrg/server/daemon.py — deleted the startup emrgd.pid write (was "diagnostics only") and the shutdown self-delete step; _shutdown_all() dropped its pid_file parameter.
  2. emrg/_stop_all.py:
    • deleted _read_pid_file()
    • stop_daemon(): ws shutdown → wait on fixed-port TCP probe (_port_is_open) → cmdline-scan kill fallback (_daemon_scan_pids, matches -m emrg.server) → token cleanup once the port is confirmed closed
    • added _port_is_open() (mirrors connect.py is_server_running_sync, pure stdlib for the standalone installer) and _daemon_scan_pids() (POSIX ps-scan filtered by new _EMRG_SERVER_RE; Windows reuses the CIM scan with server_only=True)
    • _scan_windows_python_emrg() gained a server_only param (filter -m emrg\.server vs -m emrg)
    • verify() daemon residual is now the port probe (previously _read_pid_file + _pid_alive)
    • module header docstring updated
  3. emrg/gui/daemon_client.js — comment cleanup only (already port-probe since emrg: GUI daemon liveness — fixed-port TCP probe, never delete healthy daemon's token (rant 2026-08-21T15:26:42) #918).
  4. Grep confirmed no other emrgd.pid readers/writers in scheduler.py / __main__.py / connect.py.

Tests

  • tests/test_daemon.py: pid-file assertions removed/negated (no pid file may be written); _shutdown_all() calls updated to the no-arg signature
  • tests/test_stop_all.py: TestPidFileTestPortIsOpen (3) + TestDaemonScanPids (4, incl. POSIX daemon-only filter + Windows server_only delegation); verify tests patch _port_is_open instead of _read_pid_file
  • tests/test_installer_stop.py: wiring assertions now check _port_is_open / _daemon_scan_pids / _EMRG_SERVER_RE
  • Python test count 995 → 1001 (net +6); Agent.md doc-count guard synced; GUI 257 unchanged

Verification

emrg stop now handles alive / half-dead / missing-pid scenarios via port probe + cmdline scan; full suite green (pytest 1000 passed + 1 skipped, GUI 249 + 8); no emrgd.pid reads/writes remain anywhere in emrg/.

… as the only daemon liveness/kill path (rant 2026-08-21T16:45:06)

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

✅ LGTM — cycle 1214. emrgd.pid fully removed: daemon.py no longer writes/cleans it; _stop_all.py uses fixed-port TCP probe (_port_is_open) for liveness + cmdline scan (_daemon_scan_pids, -m emrg.server) for the kill fallback; verify() residual is port-based. Positive/negative states covered (port open/closed, POSIX daemon-only filter, Windows server_only delegation). Full suite green locally (pytest 1000+1, GUI 249+8), CI test + test-windows PASS.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

✅ LGTM — cycle

2nd review (head 980c8e6, MERGEABLE/CLEAN, CI test + test-windows PASS):

  • Fresh local verification on this branch: pytest 1000 passed + 1 skipped (1001 collected, matches Agent.md sync), GUI npm test 257 (249 pass / 0 fail / 8 skipped), import + CLI OK.
  • emrgd.pid fully removed: daemon.py no longer writes/cleans it; _shutdown_all() dropped the pid_file param; grep confirms zero emrgd.pid readers/writers in emrg/ (only comments).
  • _port_is_open() mirrors connect.py is_server_running_sync (stdlib socket, standalone-safe); _daemon_scan_pids() scans '-m emrg.server' cmdlines (POSIX ps + Windows CIM server_only) for the kill fallback; verify() daemon residual is now the port probe.
  • Tests: TestPidFile → TestPortIsOpen (3) + TestDaemonScanPids (4, incl. POSIX daemon-only filter + Windows server_only delegation); installer wiring asserts the new symbols.
  • Completes the #918 direction: fixed port is the sole ground truth for daemon liveness.

2/3.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

✅ LGTM — cycle 1215. Independent re-review on head 980c8e6 (MERGEABLE, CI test + test-windows PASS):

  • emrgd.pid fully gone from code: daemon.py no longer writes/cleans it, _shutdown_all() dropped the pid_file param; only comments + the deliberate negative-state GUI test (writes a pid file, asserts the port probe stays authoritative) remain.
  • _port_is_open() = fixed-port TCP probe (127.0.0.1:56031) mirroring connect.py is_server_running_sync; used for the ws-grace wait, token cleanup gate, and verify() residual — port is the sole liveness ground truth.
  • _daemon_scan_pids() = daemon-only cmdline identity (-m emrg.server): POSIX ps-scan filtered by _EMRG_SERVER_RE (excludes TUI -m emrg), Windows CIM scan with server_only=True. TUI clients are stopped earlier in the chain, so the daemon-only kill fallback is safe.
  • Tests: TestPortIsOpen (open/refused/OSError), TestDaemonScanPids (TUI-vs-daemon filter, own-pid exclusion, Windows server_only delegation + CIM filter), verify residual rewritten to the port probe.
  • Local: pytest 1000 passed + 1 skipped (matches Agent.md sync on this branch), import + CLI OK.

@argszero
argszero merged commit fc10d99 into masterAug 21, 2026
2 checks passed
argszero added a commit that referenced this pull request Aug 21, 2026
Co-authored-by: EMRG Evolution <emrg@argszero.dev>
@argszero
argszero deleted the feature/remove-emrgd-pid-file branch August 23, 2026 02:26
Sign up for freeto 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

@argszero
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' emrg: remove emrgd.pid entirely — fixed-port probe + cmdline scan for daemon liveness/kill (rant 2026-08-21T16:45:06) by argszero · Pull Request #920 · argszero/emrg · GitHub
Skip to content

emrg: remove emrgd.pid entirely — fixed-port probe + cmdline scan for daemon liveness/kill (rant 2026-08-21T16:45:06) - #920

Merged
argszero merged 1 commit into
masterfrom
feature/remove-emrgd-pid-file
Aug 21, 2026
Merged

emrg: remove emrgd.pid entirely — fixed-port probe + cmdline scan for daemon liveness/kill (rant 2026-08-21T16:45:06)#920
argszero merged 1 commit into
masterfrom
feature/remove-emrgd-pid-file

Conversation

@argszero

Copy link
Copy Markdown
Owner

Problem (rant 2026-08-21T16:45:06)

emrgd.pid no longer serves any purpose after #918 switched the GUI liveness check to a fixed-port TCP probe — the fixed port 56031 is the daemon's only ground truth (rant 2026-08-19T08:05:21; connect.py is_server_running_sync is already a TCP probe). The pid file was itself the root cause of repeated misjudgments/mis-deletions (#918 fixed the GUI side, but the file was still written/read in daemon.py / _stop_all.py).

Changes

  1. emrg/server/daemon.py — deleted the startup emrgd.pid write (was "diagnostics only") and the shutdown self-delete step; _shutdown_all() dropped its pid_file parameter.
  2. emrg/_stop_all.py:
    • deleted _read_pid_file()
    • stop_daemon(): ws shutdown → wait on fixed-port TCP probe (_port_is_open) → cmdline-scan kill fallback (_daemon_scan_pids, matches -m emrg.server) → token cleanup once the port is confirmed closed
    • added _port_is_open() (mirrors connect.py is_server_running_sync, pure stdlib for the standalone installer) and _daemon_scan_pids() (POSIX ps-scan filtered by new _EMRG_SERVER_RE; Windows reuses the CIM scan with server_only=True)
    • _scan_windows_python_emrg() gained a server_only param (filter -m emrg\.server vs -m emrg)
    • verify() daemon residual is now the port probe (previously _read_pid_file + _pid_alive)
    • module header docstring updated
  3. emrg/gui/daemon_client.js — comment cleanup only (already port-probe since emrg: GUI daemon liveness — fixed-port TCP probe, never delete healthy daemon's token (rant 2026-08-21T15:26:42) #918).
  4. Grep confirmed no other emrgd.pid readers/writers in scheduler.py / __main__.py / connect.py.

Tests

  • tests/test_daemon.py: pid-file assertions removed/negated (no pid file may be written); _shutdown_all() calls updated to the no-arg signature
  • tests/test_stop_all.py: TestPidFileTestPortIsOpen (3) + TestDaemonScanPids (4, incl. POSIX daemon-only filter + Windows server_only delegation); verify tests patch _port_is_open instead of _read_pid_file
  • tests/test_installer_stop.py: wiring assertions now check _port_is_open / _daemon_scan_pids / _EMRG_SERVER_RE
  • Python test count 995 → 1001 (net +6); Agent.md doc-count guard synced; GUI 257 unchanged

Verification

emrg stop now handles alive / half-dead / missing-pid scenarios via port probe + cmdline scan; full suite green (pytest 1000 passed + 1 skipped, GUI 249 + 8); no emrgd.pid reads/writes remain anywhere in emrg/.

… as the only daemon liveness/kill path (rant 2026-08-21T16:45:06)

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

✅ LGTM — cycle 1214. emrgd.pid fully removed: daemon.py no longer writes/cleans it; _stop_all.py uses fixed-port TCP probe (_port_is_open) for liveness + cmdline scan (_daemon_scan_pids, -m emrg.server) for the kill fallback; verify() residual is port-based. Positive/negative states covered (port open/closed, POSIX daemon-only filter, Windows server_only delegation). Full suite green locally (pytest 1000+1, GUI 249+8), CI test + test-windows PASS.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

✅ LGTM — cycle

2nd review (head 980c8e6, MERGEABLE/CLEAN, CI test + test-windows PASS):

  • Fresh local verification on this branch: pytest 1000 passed + 1 skipped (1001 collected, matches Agent.md sync), GUI npm test 257 (249 pass / 0 fail / 8 skipped), import + CLI OK.
  • emrgd.pid fully removed: daemon.py no longer writes/cleans it; _shutdown_all() dropped the pid_file param; grep confirms zero emrgd.pid readers/writers in emrg/ (only comments).
  • _port_is_open() mirrors connect.py is_server_running_sync (stdlib socket, standalone-safe); _daemon_scan_pids() scans '-m emrg.server' cmdlines (POSIX ps + Windows CIM server_only) for the kill fallback; verify() daemon residual is now the port probe.
  • Tests: TestPidFile → TestPortIsOpen (3) + TestDaemonScanPids (4, incl. POSIX daemon-only filter + Windows server_only delegation); installer wiring asserts the new symbols.
  • Completes the #918 direction: fixed port is the sole ground truth for daemon liveness.

2/3.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

✅ LGTM — cycle 1215. Independent re-review on head 980c8e6 (MERGEABLE, CI test + test-windows PASS):

  • emrgd.pid fully gone from code: daemon.py no longer writes/cleans it, _shutdown_all() dropped the pid_file param; only comments + the deliberate negative-state GUI test (writes a pid file, asserts the port probe stays authoritative) remain.
  • _port_is_open() = fixed-port TCP probe (127.0.0.1:56031) mirroring connect.py is_server_running_sync; used for the ws-grace wait, token cleanup gate, and verify() residual — port is the sole liveness ground truth.
  • _daemon_scan_pids() = daemon-only cmdline identity (-m emrg.server): POSIX ps-scan filtered by _EMRG_SERVER_RE (excludes TUI -m emrg), Windows CIM scan with server_only=True. TUI clients are stopped earlier in the chain, so the daemon-only kill fallback is safe.
  • Tests: TestPortIsOpen (open/refused/OSError), TestDaemonScanPids (TUI-vs-daemon filter, own-pid exclusion, Windows server_only delegation + CIM filter), verify residual rewritten to the port probe.
  • Local: pytest 1000 passed + 1 skipped (matches Agent.md sync on this branch), import + CLI OK.

@argszero
argszero merged commit fc10d99 into masterAug 21, 2026
2 checks passed
argszero added a commit that referenced this pull request Aug 21, 2026
Co-authored-by: EMRG Evolution <emrg@argszero.dev>
@argszero
argszero deleted the feature/remove-emrgd-pid-file branch August 23, 2026 02:26
Sign up for freeto 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

@argszero
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' emrg: remove emrgd.pid entirely — fixed-port probe + cmdline scan for daemon liveness/kill (rant 2026-08-21T16:45:06) by argszero · Pull Request #920 · argszero/emrg · GitHub
Skip to content

emrg: remove emrgd.pid entirely — fixed-port probe + cmdline scan for daemon liveness/kill (rant 2026-08-21T16:45:06) - #920

Merged
argszero merged 1 commit into
masterfrom
feature/remove-emrgd-pid-file
Aug 21, 2026
Merged

emrg: remove emrgd.pid entirely — fixed-port probe + cmdline scan for daemon liveness/kill (rant 2026-08-21T16:45:06)#920
argszero merged 1 commit into
masterfrom
feature/remove-emrgd-pid-file

Conversation

@argszero

Copy link
Copy Markdown
Owner

Problem (rant 2026-08-21T16:45:06)

emrgd.pid no longer serves any purpose after #918 switched the GUI liveness check to a fixed-port TCP probe — the fixed port 56031 is the daemon's only ground truth (rant 2026-08-19T08:05:21; connect.py is_server_running_sync is already a TCP probe). The pid file was itself the root cause of repeated misjudgments/mis-deletions (#918 fixed the GUI side, but the file was still written/read in daemon.py / _stop_all.py).

Changes

  1. emrg/server/daemon.py — deleted the startup emrgd.pid write (was "diagnostics only") and the shutdown self-delete step; _shutdown_all() dropped its pid_file parameter.
  2. emrg/_stop_all.py:
    • deleted _read_pid_file()
    • stop_daemon(): ws shutdown → wait on fixed-port TCP probe (_port_is_open) → cmdline-scan kill fallback (_daemon_scan_pids, matches -m emrg.server) → token cleanup once the port is confirmed closed
    • added _port_is_open() (mirrors connect.py is_server_running_sync, pure stdlib for the standalone installer) and _daemon_scan_pids() (POSIX ps-scan filtered by new _EMRG_SERVER_RE; Windows reuses the CIM scan with server_only=True)
    • _scan_windows_python_emrg() gained a server_only param (filter -m emrg\.server vs -m emrg)
    • verify() daemon residual is now the port probe (previously _read_pid_file + _pid_alive)
    • module header docstring updated
  3. emrg/gui/daemon_client.js — comment cleanup only (already port-probe since emrg: GUI daemon liveness — fixed-port TCP probe, never delete healthy daemon's token (rant 2026-08-21T15:26:42) #918).
  4. Grep confirmed no other emrgd.pid readers/writers in scheduler.py / __main__.py / connect.py.

Tests

  • tests/test_daemon.py: pid-file assertions removed/negated (no pid file may be written); _shutdown_all() calls updated to the no-arg signature
  • tests/test_stop_all.py: TestPidFileTestPortIsOpen (3) + TestDaemonScanPids (4, incl. POSIX daemon-only filter + Windows server_only delegation); verify tests patch _port_is_open instead of _read_pid_file
  • tests/test_installer_stop.py: wiring assertions now check _port_is_open / _daemon_scan_pids / _EMRG_SERVER_RE
  • Python test count 995 → 1001 (net +6); Agent.md doc-count guard synced; GUI 257 unchanged

Verification

emrg stop now handles alive / half-dead / missing-pid scenarios via port probe + cmdline scan; full suite green (pytest 1000 passed + 1 skipped, GUI 249 + 8); no emrgd.pid reads/writes remain anywhere in emrg/.

… as the only daemon liveness/kill path (rant 2026-08-21T16:45:06)

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

✅ LGTM — cycle 1214. emrgd.pid fully removed: daemon.py no longer writes/cleans it; _stop_all.py uses fixed-port TCP probe (_port_is_open) for liveness + cmdline scan (_daemon_scan_pids, -m emrg.server) for the kill fallback; verify() residual is port-based. Positive/negative states covered (port open/closed, POSIX daemon-only filter, Windows server_only delegation). Full suite green locally (pytest 1000+1, GUI 249+8), CI test + test-windows PASS.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

✅ LGTM — cycle

2nd review (head 980c8e6, MERGEABLE/CLEAN, CI test + test-windows PASS):

  • Fresh local verification on this branch: pytest 1000 passed + 1 skipped (1001 collected, matches Agent.md sync), GUI npm test 257 (249 pass / 0 fail / 8 skipped), import + CLI OK.
  • emrgd.pid fully removed: daemon.py no longer writes/cleans it; _shutdown_all() dropped the pid_file param; grep confirms zero emrgd.pid readers/writers in emrg/ (only comments).
  • _port_is_open() mirrors connect.py is_server_running_sync (stdlib socket, standalone-safe); _daemon_scan_pids() scans '-m emrg.server' cmdlines (POSIX ps + Windows CIM server_only) for the kill fallback; verify() daemon residual is now the port probe.
  • Tests: TestPidFile → TestPortIsOpen (3) + TestDaemonScanPids (4, incl. POSIX daemon-only filter + Windows server_only delegation); installer wiring asserts the new symbols.
  • Completes the #918 direction: fixed port is the sole ground truth for daemon liveness.

2/3.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

✅ LGTM — cycle 1215. Independent re-review on head 980c8e6 (MERGEABLE, CI test + test-windows PASS):

  • emrgd.pid fully gone from code: daemon.py no longer writes/cleans it, _shutdown_all() dropped the pid_file param; only comments + the deliberate negative-state GUI test (writes a pid file, asserts the port probe stays authoritative) remain.
  • _port_is_open() = fixed-port TCP probe (127.0.0.1:56031) mirroring connect.py is_server_running_sync; used for the ws-grace wait, token cleanup gate, and verify() residual — port is the sole liveness ground truth.
  • _daemon_scan_pids() = daemon-only cmdline identity (-m emrg.server): POSIX ps-scan filtered by _EMRG_SERVER_RE (excludes TUI -m emrg), Windows CIM scan with server_only=True. TUI clients are stopped earlier in the chain, so the daemon-only kill fallback is safe.
  • Tests: TestPortIsOpen (open/refused/OSError), TestDaemonScanPids (TUI-vs-daemon filter, own-pid exclusion, Windows server_only delegation + CIM filter), verify residual rewritten to the port probe.
  • Local: pytest 1000 passed + 1 skipped (matches Agent.md sync on this branch), import + CLI OK.

@argszero
argszero merged commit fc10d99 into masterAug 21, 2026
2 checks passed
argszero added a commit that referenced this pull request Aug 21, 2026
Co-authored-by: EMRG Evolution <emrg@argszero.dev>
@argszero
argszero deleted the feature/remove-emrgd-pid-file branch August 23, 2026 02:26
Sign up for freeto 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

@argszero
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); emrg: remove emrgd.pid entirely — fixed-port probe + cmdline scan for daemon liveness/kill (rant 2026-08-21T16:45:06) by argszero · Pull Request #920 · argszero/emrg · GitHub
Skip to content

emrg: remove emrgd.pid entirely — fixed-port probe + cmdline scan for daemon liveness/kill (rant 2026-08-21T16:45:06) - #920

Merged
argszero merged 1 commit into
masterfrom
feature/remove-emrgd-pid-file
Aug 21, 2026
Merged

emrg: remove emrgd.pid entirely — fixed-port probe + cmdline scan for daemon liveness/kill (rant 2026-08-21T16:45:06)#920
argszero merged 1 commit into
masterfrom
feature/remove-emrgd-pid-file

Conversation

@argszero

Copy link
Copy Markdown
Owner

Problem (rant 2026-08-21T16:45:06)

emrgd.pid no longer serves any purpose after #918 switched the GUI liveness check to a fixed-port TCP probe — the fixed port 56031 is the daemon's only ground truth (rant 2026-08-19T08:05:21; connect.py is_server_running_sync is already a TCP probe). The pid file was itself the root cause of repeated misjudgments/mis-deletions (#918 fixed the GUI side, but the file was still written/read in daemon.py / _stop_all.py).

Changes

  1. emrg/server/daemon.py — deleted the startup emrgd.pid write (was "diagnostics only") and the shutdown self-delete step; _shutdown_all() dropped its pid_file parameter.
  2. emrg/_stop_all.py:
    • deleted _read_pid_file()
    • stop_daemon(): ws shutdown → wait on fixed-port TCP probe (_port_is_open) → cmdline-scan kill fallback (_daemon_scan_pids, matches -m emrg.server) → token cleanup once the port is confirmed closed
    • added _port_is_open() (mirrors connect.py is_server_running_sync, pure stdlib for the standalone installer) and _daemon_scan_pids() (POSIX ps-scan filtered by new _EMRG_SERVER_RE; Windows reuses the CIM scan with server_only=True)
    • _scan_windows_python_emrg() gained a server_only param (filter -m emrg\.server vs -m emrg)
    • verify() daemon residual is now the port probe (previously _read_pid_file + _pid_alive)
    • module header docstring updated
  3. emrg/gui/daemon_client.js — comment cleanup only (already port-probe since emrg: GUI daemon liveness — fixed-port TCP probe, never delete healthy daemon's token (rant 2026-08-21T15:26:42) #918).
  4. Grep confirmed no other emrgd.pid readers/writers in scheduler.py / __main__.py / connect.py.

Tests

  • tests/test_daemon.py: pid-file assertions removed/negated (no pid file may be written); _shutdown_all() calls updated to the no-arg signature
  • tests/test_stop_all.py: TestPidFileTestPortIsOpen (3) + TestDaemonScanPids (4, incl. POSIX daemon-only filter + Windows server_only delegation); verify tests patch _port_is_open instead of _read_pid_file
  • tests/test_installer_stop.py: wiring assertions now check _port_is_open / _daemon_scan_pids / _EMRG_SERVER_RE
  • Python test count 995 → 1001 (net +6); Agent.md doc-count guard synced; GUI 257 unchanged

Verification

emrg stop now handles alive / half-dead / missing-pid scenarios via port probe + cmdline scan; full suite green (pytest 1000 passed + 1 skipped, GUI 249 + 8); no emrgd.pid reads/writes remain anywhere in emrg/.

… as the only daemon liveness/kill path (rant 2026-08-21T16:45:06)

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

✅ LGTM — cycle 1214. emrgd.pid fully removed: daemon.py no longer writes/cleans it; _stop_all.py uses fixed-port TCP probe (_port_is_open) for liveness + cmdline scan (_daemon_scan_pids, -m emrg.server) for the kill fallback; verify() residual is port-based. Positive/negative states covered (port open/closed, POSIX daemon-only filter, Windows server_only delegation). Full suite green locally (pytest 1000+1, GUI 249+8), CI test + test-windows PASS.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

✅ LGTM — cycle

2nd review (head 980c8e6, MERGEABLE/CLEAN, CI test + test-windows PASS):

  • Fresh local verification on this branch: pytest 1000 passed + 1 skipped (1001 collected, matches Agent.md sync), GUI npm test 257 (249 pass / 0 fail / 8 skipped), import + CLI OK.
  • emrgd.pid fully removed: daemon.py no longer writes/cleans it; _shutdown_all() dropped the pid_file param; grep confirms zero emrgd.pid readers/writers in emrg/ (only comments).
  • _port_is_open() mirrors connect.py is_server_running_sync (stdlib socket, standalone-safe); _daemon_scan_pids() scans '-m emrg.server' cmdlines (POSIX ps + Windows CIM server_only) for the kill fallback; verify() daemon residual is now the port probe.
  • Tests: TestPidFile → TestPortIsOpen (3) + TestDaemonScanPids (4, incl. POSIX daemon-only filter + Windows server_only delegation); installer wiring asserts the new symbols.
  • Completes the #918 direction: fixed port is the sole ground truth for daemon liveness.

2/3.

@argszeroargszero left a comment

Copy link
Copy Markdown
OwnerAuthor

Choose a reason for hiding this comment

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

✅ LGTM — cycle 1215. Independent re-review on head 980c8e6 (MERGEABLE, CI test + test-windows PASS):

  • emrgd.pid fully gone from code: daemon.py no longer writes/cleans it, _shutdown_all() dropped the pid_file param; only comments + the deliberate negative-state GUI test (writes a pid file, asserts the port probe stays authoritative) remain.
  • _port_is_open() = fixed-port TCP probe (127.0.0.1:56031) mirroring connect.py is_server_running_sync; used for the ws-grace wait, token cleanup gate, and verify() residual — port is the sole liveness ground truth.
  • _daemon_scan_pids() = daemon-only cmdline identity (-m emrg.server): POSIX ps-scan filtered by _EMRG_SERVER_RE (excludes TUI -m emrg), Windows CIM scan with server_only=True. TUI clients are stopped earlier in the chain, so the daemon-only kill fallback is safe.
  • Tests: TestPortIsOpen (open/refused/OSError), TestDaemonScanPids (TUI-vs-daemon filter, own-pid exclusion, Windows server_only delegation + CIM filter), verify residual rewritten to the port probe.
  • Local: pytest 1000 passed + 1 skipped (matches Agent.md sync on this branch), import + CLI OK.

@argszero
argszero merged commit fc10d99 into masterAug 21, 2026
2 checks passed
argszero added a commit that referenced this pull request Aug 21, 2026
Co-authored-by: EMRG Evolution <emrg@argszero.dev>
@argszero
argszero deleted the feature/remove-emrgd-pid-file branch August 23, 2026 02:26
Sign up for freeto 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

@argszero