emrg: red-line guard — tests never run the real auto-upgrade chain (rant 2026-08-21T10:35:57) - #908

Merged
argszero merged 1 commit into
masterfrom
feature/test-upgrade-chain-hermeticity
Aug 21, 2026
Merged

emrg: red-line guard — tests never run the real auto-upgrade chain (rant 2026-08-21T10:35:57)#908
argszero merged 1 commit into
masterfrom
feature/test-upgrade-chain-hermeticity

Conversation

@argszero

Copy link
Copy Markdown
Owner

Summary

A long-running pytest session (PID 72994, 21h) was really executing the auto-upgrade chain in the background: real GitHub releases API requests, real ~/.emrg/install/version.txt reads, and real emrg-upgrade session writes (downgrade prompt, delay=1440, target=v0.2.57) every 5 minutes — continuing across daemon restarts and even after emrg stop stopped all real processes (writes at 10:23:12 / 10:28:15 / 10:33:17 after the 10:22:56 stop).

Root cause: EmrgServer.serve() unconditionally starts the 5-minute _upgrade_tick_loop, which builds UpgradeManager(load_update_config(), …) with enabled=True by default. Any test booting a real server over a long session lets the tick run the real chain.

Changes

  • tests/conftest.py — new autouse _guard_upgrade_hermeticity fixture (mirrors the existing _guard_stop_daemon_hermeticity red-line pattern):
    1. httpx.AsyncClient in emrg.server.upgrade raises AssertionError on instantiation (module-local — the global httpx module is untouched).
    2. upgrade.VERSION_FILE is redirected to a per-test tmp path — the real ~/.emrg/install/version.txt is never read/written.
    3. EmrgServer._get_or_create_session for SESSION_ID (emrg-upgrade) raises — no real upgrade session may be created/written.
  • tests/test_ws_e2e.py_boot_server forces the upgrade manager disabled (patches emrg.config.load_update_configUpdateConfig(enabled=False)) so booted test servers' tick loop is a no-op; restored in cleanup. Covers test_daemon_manager_e2e (reuses _boot_server).
  • tests/test_upgrade.py — the daemon session-runner test now isolates the session factory (_get_or_create_session); new test_upgrade_chain_hermeticity_guards proves the guards are active by default.
  • MANIFESTO.md — 第四条附则三 codifies the permanent red line (same status as the stop_daemon red line, host 2026-08-21 10:35).
  • Agent.md — documented test count 985 → 986.

Verification

  • uv run pytest tests/985 passed + 1 skipped (986 collected) (was 984+1)
  • uv run python -c "from emrg.client.app import run_client" → OK
  • uv run python -m emrg --help → OK

…ant 2026-08-21T10:35:57)
A long-running pytest session (PID 72994, 21h) really executed the
auto-upgrade chain in the background: real GitHub releases requests,
real ~/.emrg/install/version.txt reads, and real emrg-upgrade session
writes every 5 minutes — continuing across daemon restarts and even
after 'emrg stop'. serve() unconditionally starts the 5-minute
_upgrade_tick_loop with a default-enabled UpgradeManager.
Fix (mirrors the stop_daemon red-line pattern):
- tests/conftest.py: autouse _guard_upgrade_hermeticity fixture blocks
every side-effect endpoint — upgrade-module httpx.AsyncClient raises
(module-local, global httpx untouched), VERSION_FILE redirected to a
per-test tmp path, EmrgServer._get_or_create_session for SESSION_ID
'emrg-upgrade' raises. Tests that legitimately exercise the chain
stub these after the fixture as usual.
- tests/test_ws_e2e.py: _boot_server forces the upgrade manager disabled
(patches emrg.config.load_update_config) so booted test servers' tick
loop is a no-op; restored in cleanup.
- tests/test_upgrade.py: _run_upgrade_session runner test isolates the
session factory; new test proves the guards are active by default.
- MANIFESTO.md: 第四条附则三 codifies the permanent red line (same
status as the stop_daemon red line, host 2026-08-21 10:35).
- Agent.md: documented test count 985 -> 986.

@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

Fresh review of the upgrade-chain red-line guard:

  • conftest autouse _guard_upgrade_hermeticity blocks all three side-effect endpoints: upgrade-module httpx.AsyncClient raises (module-local, global httpx untouched), VERSION_FILE redirected to per-test tmp, EmrgServer._get_or_create_session for 'emrg-upgrade' raises.
  • _boot_server forces the upgrade manager disabled via emrg.config.load_update_config patch (restored in cleanup) — booted test servers' 5-min tick loop becomes a no-op.
  • test_upgrade session-runner test isolates the session factory; new guard-verification test proves guards active by default.
  • MANIFESTO 附则三 codifies the permanent red line; Agent.md count synced.

Verified locally: pytest 985 passed + 1 skipped (986 collected), import + CLI OK; CI test + test-windows both 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

Re-review (head 316455f unchanged since the 1st LGTM, MERGEABLE/CLEAN):

  • Negative-state verification: test_upgrade_chain_hermeticity_guards confirms the autouse fixture raises on a real upgrade-module httpx.AsyncClient and redirects VERSION_FILE away from the real install path.
  • Full local suite: pytest 985 passed + 1 skipped (986 collected), import + CLI OK.
  • CI test + test-windows both PASS on the same head.

2/3 consecutive LGTMs.

@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

3rd consecutive LGTM (cycles 1193, 1194, 1195). Fresh verification on head 316455f (unchanged):

  • pytest 985 passed + 1 skipped (986 collected) on the PR branch
  • import + CLI OK
  • CI test + test-windows both PASS
  • MERGEABLE/CLEAN

3/3 consecutive LGTMs — merging.

@argszero
argszero merged commit 88cbba2 into masterAug 21, 2026
2 checks passed
@argszero
argszero deleted the feature/test-upgrade-chain-hermeticity branch August 21, 2026 03:38
argszero added a commit that referenced this pull request Aug 21, 2026
Co-authored-by: EMRG Evolution <emrg@argszero.dev>
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)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n 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;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

emrg: red-line guard — tests never run the real auto-upgrade chain (rant 2026-08-21T10:35:57) - #908

Merged
argszero merged 1 commit into
masterfrom
feature/test-upgrade-chain-hermeticity
Aug 21, 2026
Merged

emrg: red-line guard — tests never run the real auto-upgrade chain (rant 2026-08-21T10:35:57)#908
argszero merged 1 commit into
masterfrom
feature/test-upgrade-chain-hermeticity

Conversation

@argszero

Copy link
Copy Markdown
Owner

Summary

A long-running pytest session (PID 72994, 21h) was really executing the auto-upgrade chain in the background: real GitHub releases API requests, real ~/.emrg/install/version.txt reads, and real emrg-upgrade session writes (downgrade prompt, delay=1440, target=v0.2.57) every 5 minutes — continuing across daemon restarts and even after emrg stop stopped all real processes (writes at 10:23:12 / 10:28:15 / 10:33:17 after the 10:22:56 stop).

Root cause: EmrgServer.serve() unconditionally starts the 5-minute _upgrade_tick_loop, which builds UpgradeManager(load_update_config(), …) with enabled=True by default. Any test booting a real server over a long session lets the tick run the real chain.

Changes

  • tests/conftest.py — new autouse _guard_upgrade_hermeticity fixture (mirrors the existing _guard_stop_daemon_hermeticity red-line pattern):
    1. httpx.AsyncClient in emrg.server.upgrade raises AssertionError on instantiation (module-local — the global httpx module is untouched).
    2. upgrade.VERSION_FILE is redirected to a per-test tmp path — the real ~/.emrg/install/version.txt is never read/written.
    3. EmrgServer._get_or_create_session for SESSION_ID (emrg-upgrade) raises — no real upgrade session may be created/written.
  • tests/test_ws_e2e.py_boot_server forces the upgrade manager disabled (patches emrg.config.load_update_configUpdateConfig(enabled=False)) so booted test servers' tick loop is a no-op; restored in cleanup. Covers test_daemon_manager_e2e (reuses _boot_server).
  • tests/test_upgrade.py — the daemon session-runner test now isolates the session factory (_get_or_create_session); new test_upgrade_chain_hermeticity_guards proves the guards are active by default.
  • MANIFESTO.md — 第四条附则三 codifies the permanent red line (same status as the stop_daemon red line, host 2026-08-21 10:35).
  • Agent.md — documented test count 985 → 986.

Verification

  • uv run pytest tests/985 passed + 1 skipped (986 collected) (was 984+1)
  • uv run python -c "from emrg.client.app import run_client" → OK
  • uv run python -m emrg --help → OK

…ant 2026-08-21T10:35:57)
A long-running pytest session (PID 72994, 21h) really executed the
auto-upgrade chain in the background: real GitHub releases requests,
real ~/.emrg/install/version.txt reads, and real emrg-upgrade session
writes every 5 minutes — continuing across daemon restarts and even
after 'emrg stop'. serve() unconditionally starts the 5-minute
_upgrade_tick_loop with a default-enabled UpgradeManager.
Fix (mirrors the stop_daemon red-line pattern):
- tests/conftest.py: autouse _guard_upgrade_hermeticity fixture blocks
every side-effect endpoint — upgrade-module httpx.AsyncClient raises
(module-local, global httpx untouched), VERSION_FILE redirected to a
per-test tmp path, EmrgServer._get_or_create_session for SESSION_ID
'emrg-upgrade' raises. Tests that legitimately exercise the chain
stub these after the fixture as usual.
- tests/test_ws_e2e.py: _boot_server forces the upgrade manager disabled
(patches emrg.config.load_update_config) so booted test servers' tick
loop is a no-op; restored in cleanup.
- tests/test_upgrade.py: _run_upgrade_session runner test isolates the
session factory; new test proves the guards are active by default.
- MANIFESTO.md: 第四条附则三 codifies the permanent red line (same
status as the stop_daemon red line, host 2026-08-21 10:35).
- Agent.md: documented test count 985 -> 986.

@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

Fresh review of the upgrade-chain red-line guard:

  • conftest autouse _guard_upgrade_hermeticity blocks all three side-effect endpoints: upgrade-module httpx.AsyncClient raises (module-local, global httpx untouched), VERSION_FILE redirected to per-test tmp, EmrgServer._get_or_create_session for 'emrg-upgrade' raises.
  • _boot_server forces the upgrade manager disabled via emrg.config.load_update_config patch (restored in cleanup) — booted test servers' 5-min tick loop becomes a no-op.
  • test_upgrade session-runner test isolates the session factory; new guard-verification test proves guards active by default.
  • MANIFESTO 附则三 codifies the permanent red line; Agent.md count synced.

Verified locally: pytest 985 passed + 1 skipped (986 collected), import + CLI OK; CI test + test-windows both 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

Re-review (head 316455f unchanged since the 1st LGTM, MERGEABLE/CLEAN):

  • Negative-state verification: test_upgrade_chain_hermeticity_guards confirms the autouse fixture raises on a real upgrade-module httpx.AsyncClient and redirects VERSION_FILE away from the real install path.
  • Full local suite: pytest 985 passed + 1 skipped (986 collected), import + CLI OK.
  • CI test + test-windows both PASS on the same head.

2/3 consecutive LGTMs.

@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

3rd consecutive LGTM (cycles 1193, 1194, 1195). Fresh verification on head 316455f (unchanged):

  • pytest 985 passed + 1 skipped (986 collected) on the PR branch
  • import + CLI OK
  • CI test + test-windows both PASS
  • MERGEABLE/CLEAN

3/3 consecutive LGTMs — merging.

@argszero
argszero merged commit 88cbba2 into masterAug 21, 2026
2 checks passed
@argszero
argszero deleted the feature/test-upgrade-chain-hermeticity branch August 21, 2026 03:38
argszero added a commit that referenced this pull request Aug 21, 2026
Co-authored-by: EMRG Evolution <emrg@argszero.dev>
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)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

emrg: red-line guard — tests never run the real auto-upgrade chain (rant 2026-08-21T10:35:57) - #908

Merged
argszero merged 1 commit into
masterfrom
feature/test-upgrade-chain-hermeticity
Aug 21, 2026
Merged

emrg: red-line guard — tests never run the real auto-upgrade chain (rant 2026-08-21T10:35:57)#908
argszero merged 1 commit into
masterfrom
feature/test-upgrade-chain-hermeticity

Conversation

@argszero

Copy link
Copy Markdown
Owner

Summary

A long-running pytest session (PID 72994, 21h) was really executing the auto-upgrade chain in the background: real GitHub releases API requests, real ~/.emrg/install/version.txt reads, and real emrg-upgrade session writes (downgrade prompt, delay=1440, target=v0.2.57) every 5 minutes — continuing across daemon restarts and even after emrg stop stopped all real processes (writes at 10:23:12 / 10:28:15 / 10:33:17 after the 10:22:56 stop).

Root cause: EmrgServer.serve() unconditionally starts the 5-minute _upgrade_tick_loop, which builds UpgradeManager(load_update_config(), …) with enabled=True by default. Any test booting a real server over a long session lets the tick run the real chain.

Changes

  • tests/conftest.py — new autouse _guard_upgrade_hermeticity fixture (mirrors the existing _guard_stop_daemon_hermeticity red-line pattern):
    1. httpx.AsyncClient in emrg.server.upgrade raises AssertionError on instantiation (module-local — the global httpx module is untouched).
    2. upgrade.VERSION_FILE is redirected to a per-test tmp path — the real ~/.emrg/install/version.txt is never read/written.
    3. EmrgServer._get_or_create_session for SESSION_ID (emrg-upgrade) raises — no real upgrade session may be created/written.
  • tests/test_ws_e2e.py_boot_server forces the upgrade manager disabled (patches emrg.config.load_update_configUpdateConfig(enabled=False)) so booted test servers' tick loop is a no-op; restored in cleanup. Covers test_daemon_manager_e2e (reuses _boot_server).
  • tests/test_upgrade.py — the daemon session-runner test now isolates the session factory (_get_or_create_session); new test_upgrade_chain_hermeticity_guards proves the guards are active by default.
  • MANIFESTO.md — 第四条附则三 codifies the permanent red line (same status as the stop_daemon red line, host 2026-08-21 10:35).
  • Agent.md — documented test count 985 → 986.

Verification

  • uv run pytest tests/985 passed + 1 skipped (986 collected) (was 984+1)
  • uv run python -c "from emrg.client.app import run_client" → OK
  • uv run python -m emrg --help → OK

…ant 2026-08-21T10:35:57)
A long-running pytest session (PID 72994, 21h) really executed the
auto-upgrade chain in the background: real GitHub releases requests,
real ~/.emrg/install/version.txt reads, and real emrg-upgrade session
writes every 5 minutes — continuing across daemon restarts and even
after 'emrg stop'. serve() unconditionally starts the 5-minute
_upgrade_tick_loop with a default-enabled UpgradeManager.
Fix (mirrors the stop_daemon red-line pattern):
- tests/conftest.py: autouse _guard_upgrade_hermeticity fixture blocks
every side-effect endpoint — upgrade-module httpx.AsyncClient raises
(module-local, global httpx untouched), VERSION_FILE redirected to a
per-test tmp path, EmrgServer._get_or_create_session for SESSION_ID
'emrg-upgrade' raises. Tests that legitimately exercise the chain
stub these after the fixture as usual.
- tests/test_ws_e2e.py: _boot_server forces the upgrade manager disabled
(patches emrg.config.load_update_config) so booted test servers' tick
loop is a no-op; restored in cleanup.
- tests/test_upgrade.py: _run_upgrade_session runner test isolates the
session factory; new test proves the guards are active by default.
- MANIFESTO.md: 第四条附则三 codifies the permanent red line (same
status as the stop_daemon red line, host 2026-08-21 10:35).
- Agent.md: documented test count 985 -> 986.

@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

Fresh review of the upgrade-chain red-line guard:

  • conftest autouse _guard_upgrade_hermeticity blocks all three side-effect endpoints: upgrade-module httpx.AsyncClient raises (module-local, global httpx untouched), VERSION_FILE redirected to per-test tmp, EmrgServer._get_or_create_session for 'emrg-upgrade' raises.
  • _boot_server forces the upgrade manager disabled via emrg.config.load_update_config patch (restored in cleanup) — booted test servers' 5-min tick loop becomes a no-op.
  • test_upgrade session-runner test isolates the session factory; new guard-verification test proves guards active by default.
  • MANIFESTO 附则三 codifies the permanent red line; Agent.md count synced.

Verified locally: pytest 985 passed + 1 skipped (986 collected), import + CLI OK; CI test + test-windows both 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

Re-review (head 316455f unchanged since the 1st LGTM, MERGEABLE/CLEAN):

  • Negative-state verification: test_upgrade_chain_hermeticity_guards confirms the autouse fixture raises on a real upgrade-module httpx.AsyncClient and redirects VERSION_FILE away from the real install path.
  • Full local suite: pytest 985 passed + 1 skipped (986 collected), import + CLI OK.
  • CI test + test-windows both PASS on the same head.

2/3 consecutive LGTMs.

@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

3rd consecutive LGTM (cycles 1193, 1194, 1195). Fresh verification on head 316455f (unchanged):

  • pytest 985 passed + 1 skipped (986 collected) on the PR branch
  • import + CLI OK
  • CI test + test-windows both PASS
  • MERGEABLE/CLEAN

3/3 consecutive LGTMs — merging.

@argszero
argszero merged commit 88cbba2 into masterAug 21, 2026
2 checks passed
@argszero
argszero deleted the feature/test-upgrade-chain-hermeticity branch August 21, 2026 03:38
argszero added a commit that referenced this pull request Aug 21, 2026
Co-authored-by: EMRG Evolution <emrg@argszero.dev>
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)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

emrg: red-line guard — tests never run the real auto-upgrade chain (rant 2026-08-21T10:35:57) - #908

Merged
argszero merged 1 commit into
masterfrom
feature/test-upgrade-chain-hermeticity
Aug 21, 2026
Merged

emrg: red-line guard — tests never run the real auto-upgrade chain (rant 2026-08-21T10:35:57)#908
argszero merged 1 commit into
masterfrom
feature/test-upgrade-chain-hermeticity

Conversation

@argszero

Copy link
Copy Markdown
Owner

Summary

A long-running pytest session (PID 72994, 21h) was really executing the auto-upgrade chain in the background: real GitHub releases API requests, real ~/.emrg/install/version.txt reads, and real emrg-upgrade session writes (downgrade prompt, delay=1440, target=v0.2.57) every 5 minutes — continuing across daemon restarts and even after emrg stop stopped all real processes (writes at 10:23:12 / 10:28:15 / 10:33:17 after the 10:22:56 stop).

Root cause: EmrgServer.serve() unconditionally starts the 5-minute _upgrade_tick_loop, which builds UpgradeManager(load_update_config(), …) with enabled=True by default. Any test booting a real server over a long session lets the tick run the real chain.

Changes

  • tests/conftest.py — new autouse _guard_upgrade_hermeticity fixture (mirrors the existing _guard_stop_daemon_hermeticity red-line pattern):
    1. httpx.AsyncClient in emrg.server.upgrade raises AssertionError on instantiation (module-local — the global httpx module is untouched).
    2. upgrade.VERSION_FILE is redirected to a per-test tmp path — the real ~/.emrg/install/version.txt is never read/written.
    3. EmrgServer._get_or_create_session for SESSION_ID (emrg-upgrade) raises — no real upgrade session may be created/written.
  • tests/test_ws_e2e.py_boot_server forces the upgrade manager disabled (patches emrg.config.load_update_configUpdateConfig(enabled=False)) so booted test servers' tick loop is a no-op; restored in cleanup. Covers test_daemon_manager_e2e (reuses _boot_server).
  • tests/test_upgrade.py — the daemon session-runner test now isolates the session factory (_get_or_create_session); new test_upgrade_chain_hermeticity_guards proves the guards are active by default.
  • MANIFESTO.md — 第四条附则三 codifies the permanent red line (same status as the stop_daemon red line, host 2026-08-21 10:35).
  • Agent.md — documented test count 985 → 986.

Verification

  • uv run pytest tests/985 passed + 1 skipped (986 collected) (was 984+1)
  • uv run python -c "from emrg.client.app import run_client" → OK
  • uv run python -m emrg --help → OK

…ant 2026-08-21T10:35:57)
A long-running pytest session (PID 72994, 21h) really executed the
auto-upgrade chain in the background: real GitHub releases requests,
real ~/.emrg/install/version.txt reads, and real emrg-upgrade session
writes every 5 minutes — continuing across daemon restarts and even
after 'emrg stop'. serve() unconditionally starts the 5-minute
_upgrade_tick_loop with a default-enabled UpgradeManager.
Fix (mirrors the stop_daemon red-line pattern):
- tests/conftest.py: autouse _guard_upgrade_hermeticity fixture blocks
every side-effect endpoint — upgrade-module httpx.AsyncClient raises
(module-local, global httpx untouched), VERSION_FILE redirected to a
per-test tmp path, EmrgServer._get_or_create_session for SESSION_ID
'emrg-upgrade' raises. Tests that legitimately exercise the chain
stub these after the fixture as usual.
- tests/test_ws_e2e.py: _boot_server forces the upgrade manager disabled
(patches emrg.config.load_update_config) so booted test servers' tick
loop is a no-op; restored in cleanup.
- tests/test_upgrade.py: _run_upgrade_session runner test isolates the
session factory; new test proves the guards are active by default.
- MANIFESTO.md: 第四条附则三 codifies the permanent red line (same
status as the stop_daemon red line, host 2026-08-21 10:35).
- Agent.md: documented test count 985 -> 986.

@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

Fresh review of the upgrade-chain red-line guard:

  • conftest autouse _guard_upgrade_hermeticity blocks all three side-effect endpoints: upgrade-module httpx.AsyncClient raises (module-local, global httpx untouched), VERSION_FILE redirected to per-test tmp, EmrgServer._get_or_create_session for 'emrg-upgrade' raises.
  • _boot_server forces the upgrade manager disabled via emrg.config.load_update_config patch (restored in cleanup) — booted test servers' 5-min tick loop becomes a no-op.
  • test_upgrade session-runner test isolates the session factory; new guard-verification test proves guards active by default.
  • MANIFESTO 附则三 codifies the permanent red line; Agent.md count synced.

Verified locally: pytest 985 passed + 1 skipped (986 collected), import + CLI OK; CI test + test-windows both 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

Re-review (head 316455f unchanged since the 1st LGTM, MERGEABLE/CLEAN):

  • Negative-state verification: test_upgrade_chain_hermeticity_guards confirms the autouse fixture raises on a real upgrade-module httpx.AsyncClient and redirects VERSION_FILE away from the real install path.
  • Full local suite: pytest 985 passed + 1 skipped (986 collected), import + CLI OK.
  • CI test + test-windows both PASS on the same head.

2/3 consecutive LGTMs.

@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

3rd consecutive LGTM (cycles 1193, 1194, 1195). Fresh verification on head 316455f (unchanged):

  • pytest 985 passed + 1 skipped (986 collected) on the PR branch
  • import + CLI OK
  • CI test + test-windows both PASS
  • MERGEABLE/CLEAN

3/3 consecutive LGTMs — merging.

@argszero
argszero merged commit 88cbba2 into masterAug 21, 2026
2 checks passed
@argszero
argszero deleted the feature/test-upgrade-chain-hermeticity branch August 21, 2026 03:38
argszero added a commit that referenced this pull request Aug 21, 2026
Co-authored-by: EMRG Evolution <emrg@argszero.dev>
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)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

emrg: red-line guard — tests never run the real auto-upgrade chain (rant 2026-08-21T10:35:57) - #908

Merged
argszero merged 1 commit into
masterfrom
feature/test-upgrade-chain-hermeticity
Aug 21, 2026
Merged

emrg: red-line guard — tests never run the real auto-upgrade chain (rant 2026-08-21T10:35:57)#908
argszero merged 1 commit into
masterfrom
feature/test-upgrade-chain-hermeticity

Conversation

@argszero

Copy link
Copy Markdown
Owner

Summary

A long-running pytest session (PID 72994, 21h) was really executing the auto-upgrade chain in the background: real GitHub releases API requests, real ~/.emrg/install/version.txt reads, and real emrg-upgrade session writes (downgrade prompt, delay=1440, target=v0.2.57) every 5 minutes — continuing across daemon restarts and even after emrg stop stopped all real processes (writes at 10:23:12 / 10:28:15 / 10:33:17 after the 10:22:56 stop).

Root cause: EmrgServer.serve() unconditionally starts the 5-minute _upgrade_tick_loop, which builds UpgradeManager(load_update_config(), …) with enabled=True by default. Any test booting a real server over a long session lets the tick run the real chain.

Changes

  • tests/conftest.py — new autouse _guard_upgrade_hermeticity fixture (mirrors the existing _guard_stop_daemon_hermeticity red-line pattern):
    1. httpx.AsyncClient in emrg.server.upgrade raises AssertionError on instantiation (module-local — the global httpx module is untouched).
    2. upgrade.VERSION_FILE is redirected to a per-test tmp path — the real ~/.emrg/install/version.txt is never read/written.
    3. EmrgServer._get_or_create_session for SESSION_ID (emrg-upgrade) raises — no real upgrade session may be created/written.
  • tests/test_ws_e2e.py_boot_server forces the upgrade manager disabled (patches emrg.config.load_update_configUpdateConfig(enabled=False)) so booted test servers' tick loop is a no-op; restored in cleanup. Covers test_daemon_manager_e2e (reuses _boot_server).
  • tests/test_upgrade.py — the daemon session-runner test now isolates the session factory (_get_or_create_session); new test_upgrade_chain_hermeticity_guards proves the guards are active by default.
  • MANIFESTO.md — 第四条附则三 codifies the permanent red line (same status as the stop_daemon red line, host 2026-08-21 10:35).
  • Agent.md — documented test count 985 → 986.

Verification

  • uv run pytest tests/985 passed + 1 skipped (986 collected) (was 984+1)
  • uv run python -c "from emrg.client.app import run_client" → OK
  • uv run python -m emrg --help → OK

…ant 2026-08-21T10:35:57)
A long-running pytest session (PID 72994, 21h) really executed the
auto-upgrade chain in the background: real GitHub releases requests,
real ~/.emrg/install/version.txt reads, and real emrg-upgrade session
writes every 5 minutes — continuing across daemon restarts and even
after 'emrg stop'. serve() unconditionally starts the 5-minute
_upgrade_tick_loop with a default-enabled UpgradeManager.
Fix (mirrors the stop_daemon red-line pattern):
- tests/conftest.py: autouse _guard_upgrade_hermeticity fixture blocks
every side-effect endpoint — upgrade-module httpx.AsyncClient raises
(module-local, global httpx untouched), VERSION_FILE redirected to a
per-test tmp path, EmrgServer._get_or_create_session for SESSION_ID
'emrg-upgrade' raises. Tests that legitimately exercise the chain
stub these after the fixture as usual.
- tests/test_ws_e2e.py: _boot_server forces the upgrade manager disabled
(patches emrg.config.load_update_config) so booted test servers' tick
loop is a no-op; restored in cleanup.
- tests/test_upgrade.py: _run_upgrade_session runner test isolates the
session factory; new test proves the guards are active by default.
- MANIFESTO.md: 第四条附则三 codifies the permanent red line (same
status as the stop_daemon red line, host 2026-08-21 10:35).
- Agent.md: documented test count 985 -> 986.

@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

Fresh review of the upgrade-chain red-line guard:

  • conftest autouse _guard_upgrade_hermeticity blocks all three side-effect endpoints: upgrade-module httpx.AsyncClient raises (module-local, global httpx untouched), VERSION_FILE redirected to per-test tmp, EmrgServer._get_or_create_session for 'emrg-upgrade' raises.
  • _boot_server forces the upgrade manager disabled via emrg.config.load_update_config patch (restored in cleanup) — booted test servers' 5-min tick loop becomes a no-op.
  • test_upgrade session-runner test isolates the session factory; new guard-verification test proves guards active by default.
  • MANIFESTO 附则三 codifies the permanent red line; Agent.md count synced.

Verified locally: pytest 985 passed + 1 skipped (986 collected), import + CLI OK; CI test + test-windows both 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

Re-review (head 316455f unchanged since the 1st LGTM, MERGEABLE/CLEAN):

  • Negative-state verification: test_upgrade_chain_hermeticity_guards confirms the autouse fixture raises on a real upgrade-module httpx.AsyncClient and redirects VERSION_FILE away from the real install path.
  • Full local suite: pytest 985 passed + 1 skipped (986 collected), import + CLI OK.
  • CI test + test-windows both PASS on the same head.

2/3 consecutive LGTMs.

@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

3rd consecutive LGTM (cycles 1193, 1194, 1195). Fresh verification on head 316455f (unchanged):

  • pytest 985 passed + 1 skipped (986 collected) on the PR branch
  • import + CLI OK
  • CI test + test-windows both PASS
  • MERGEABLE/CLEAN

3/3 consecutive LGTMs — merging.

@argszero
argszero merged commit 88cbba2 into masterAug 21, 2026
2 checks passed
@argszero
argszero deleted the feature/test-upgrade-chain-hermeticity branch August 21, 2026 03:38
argszero added a commit that referenced this pull request Aug 21, 2026
Co-authored-by: EMRG Evolution <emrg@argszero.dev>
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)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

emrg: red-line guard — tests never run the real auto-upgrade chain (rant 2026-08-21T10:35:57) - #908

Merged
argszero merged 1 commit into
masterfrom
feature/test-upgrade-chain-hermeticity
Aug 21, 2026
Merged

emrg: red-line guard — tests never run the real auto-upgrade chain (rant 2026-08-21T10:35:57)#908
argszero merged 1 commit into
masterfrom
feature/test-upgrade-chain-hermeticity

Conversation

@argszero

Copy link
Copy Markdown
Owner

Summary

A long-running pytest session (PID 72994, 21h) was really executing the auto-upgrade chain in the background: real GitHub releases API requests, real ~/.emrg/install/version.txt reads, and real emrg-upgrade session writes (downgrade prompt, delay=1440, target=v0.2.57) every 5 minutes — continuing across daemon restarts and even after emrg stop stopped all real processes (writes at 10:23:12 / 10:28:15 / 10:33:17 after the 10:22:56 stop).

Root cause: EmrgServer.serve() unconditionally starts the 5-minute _upgrade_tick_loop, which builds UpgradeManager(load_update_config(), …) with enabled=True by default. Any test booting a real server over a long session lets the tick run the real chain.

Changes

  • tests/conftest.py — new autouse _guard_upgrade_hermeticity fixture (mirrors the existing _guard_stop_daemon_hermeticity red-line pattern):
    1. httpx.AsyncClient in emrg.server.upgrade raises AssertionError on instantiation (module-local — the global httpx module is untouched).
    2. upgrade.VERSION_FILE is redirected to a per-test tmp path — the real ~/.emrg/install/version.txt is never read/written.
    3. EmrgServer._get_or_create_session for SESSION_ID (emrg-upgrade) raises — no real upgrade session may be created/written.
  • tests/test_ws_e2e.py_boot_server forces the upgrade manager disabled (patches emrg.config.load_update_configUpdateConfig(enabled=False)) so booted test servers' tick loop is a no-op; restored in cleanup. Covers test_daemon_manager_e2e (reuses _boot_server).
  • tests/test_upgrade.py — the daemon session-runner test now isolates the session factory (_get_or_create_session); new test_upgrade_chain_hermeticity_guards proves the guards are active by default.
  • MANIFESTO.md — 第四条附则三 codifies the permanent red line (same status as the stop_daemon red line, host 2026-08-21 10:35).
  • Agent.md — documented test count 985 → 986.

Verification

  • uv run pytest tests/985 passed + 1 skipped (986 collected) (was 984+1)
  • uv run python -c "from emrg.client.app import run_client" → OK
  • uv run python -m emrg --help → OK

…ant 2026-08-21T10:35:57)
A long-running pytest session (PID 72994, 21h) really executed the
auto-upgrade chain in the background: real GitHub releases requests,
real ~/.emrg/install/version.txt reads, and real emrg-upgrade session
writes every 5 minutes — continuing across daemon restarts and even
after 'emrg stop'. serve() unconditionally starts the 5-minute
_upgrade_tick_loop with a default-enabled UpgradeManager.
Fix (mirrors the stop_daemon red-line pattern):
- tests/conftest.py: autouse _guard_upgrade_hermeticity fixture blocks
every side-effect endpoint — upgrade-module httpx.AsyncClient raises
(module-local, global httpx untouched), VERSION_FILE redirected to a
per-test tmp path, EmrgServer._get_or_create_session for SESSION_ID
'emrg-upgrade' raises. Tests that legitimately exercise the chain
stub these after the fixture as usual.
- tests/test_ws_e2e.py: _boot_server forces the upgrade manager disabled
(patches emrg.config.load_update_config) so booted test servers' tick
loop is a no-op; restored in cleanup.
- tests/test_upgrade.py: _run_upgrade_session runner test isolates the
session factory; new test proves the guards are active by default.
- MANIFESTO.md: 第四条附则三 codifies the permanent red line (same
status as the stop_daemon red line, host 2026-08-21 10:35).
- Agent.md: documented test count 985 -> 986.

@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

Fresh review of the upgrade-chain red-line guard:

  • conftest autouse _guard_upgrade_hermeticity blocks all three side-effect endpoints: upgrade-module httpx.AsyncClient raises (module-local, global httpx untouched), VERSION_FILE redirected to per-test tmp, EmrgServer._get_or_create_session for 'emrg-upgrade' raises.
  • _boot_server forces the upgrade manager disabled via emrg.config.load_update_config patch (restored in cleanup) — booted test servers' 5-min tick loop becomes a no-op.
  • test_upgrade session-runner test isolates the session factory; new guard-verification test proves guards active by default.
  • MANIFESTO 附则三 codifies the permanent red line; Agent.md count synced.

Verified locally: pytest 985 passed + 1 skipped (986 collected), import + CLI OK; CI test + test-windows both 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

Re-review (head 316455f unchanged since the 1st LGTM, MERGEABLE/CLEAN):

  • Negative-state verification: test_upgrade_chain_hermeticity_guards confirms the autouse fixture raises on a real upgrade-module httpx.AsyncClient and redirects VERSION_FILE away from the real install path.
  • Full local suite: pytest 985 passed + 1 skipped (986 collected), import + CLI OK.
  • CI test + test-windows both PASS on the same head.

2/3 consecutive LGTMs.

@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

3rd consecutive LGTM (cycles 1193, 1194, 1195). Fresh verification on head 316455f (unchanged):

  • pytest 985 passed + 1 skipped (986 collected) on the PR branch
  • import + CLI OK
  • CI test + test-windows both PASS
  • MERGEABLE/CLEAN

3/3 consecutive LGTMs — merging.

@argszero
argszero merged commit 88cbba2 into masterAug 21, 2026
2 checks passed
@argszero
argszero deleted the feature/test-upgrade-chain-hermeticity branch August 21, 2026 03:38
argszero added a commit that referenced this pull request Aug 21, 2026
Co-authored-by: EMRG Evolution <emrg@argszero.dev>
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)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

emrg: red-line guard — tests never run the real auto-upgrade chain (rant 2026-08-21T10:35:57) - #908

Merged
argszero merged 1 commit into
masterfrom
feature/test-upgrade-chain-hermeticity
Aug 21, 2026
Merged

emrg: red-line guard — tests never run the real auto-upgrade chain (rant 2026-08-21T10:35:57)#908
argszero merged 1 commit into
masterfrom
feature/test-upgrade-chain-hermeticity

Conversation

@argszero

Copy link
Copy Markdown
Owner

Summary

A long-running pytest session (PID 72994, 21h) was really executing the auto-upgrade chain in the background: real GitHub releases API requests, real ~/.emrg/install/version.txt reads, and real emrg-upgrade session writes (downgrade prompt, delay=1440, target=v0.2.57) every 5 minutes — continuing across daemon restarts and even after emrg stop stopped all real processes (writes at 10:23:12 / 10:28:15 / 10:33:17 after the 10:22:56 stop).

Root cause: EmrgServer.serve() unconditionally starts the 5-minute _upgrade_tick_loop, which builds UpgradeManager(load_update_config(), …) with enabled=True by default. Any test booting a real server over a long session lets the tick run the real chain.

Changes

  • tests/conftest.py — new autouse _guard_upgrade_hermeticity fixture (mirrors the existing _guard_stop_daemon_hermeticity red-line pattern):
    1. httpx.AsyncClient in emrg.server.upgrade raises AssertionError on instantiation (module-local — the global httpx module is untouched).
    2. upgrade.VERSION_FILE is redirected to a per-test tmp path — the real ~/.emrg/install/version.txt is never read/written.
    3. EmrgServer._get_or_create_session for SESSION_ID (emrg-upgrade) raises — no real upgrade session may be created/written.
  • tests/test_ws_e2e.py_boot_server forces the upgrade manager disabled (patches emrg.config.load_update_configUpdateConfig(enabled=False)) so booted test servers' tick loop is a no-op; restored in cleanup. Covers test_daemon_manager_e2e (reuses _boot_server).
  • tests/test_upgrade.py — the daemon session-runner test now isolates the session factory (_get_or_create_session); new test_upgrade_chain_hermeticity_guards proves the guards are active by default.
  • MANIFESTO.md — 第四条附则三 codifies the permanent red line (same status as the stop_daemon red line, host 2026-08-21 10:35).
  • Agent.md — documented test count 985 → 986.

Verification

  • uv run pytest tests/985 passed + 1 skipped (986 collected) (was 984+1)
  • uv run python -c "from emrg.client.app import run_client" → OK
  • uv run python -m emrg --help → OK

…ant 2026-08-21T10:35:57)
A long-running pytest session (PID 72994, 21h) really executed the
auto-upgrade chain in the background: real GitHub releases requests,
real ~/.emrg/install/version.txt reads, and real emrg-upgrade session
writes every 5 minutes — continuing across daemon restarts and even
after 'emrg stop'. serve() unconditionally starts the 5-minute
_upgrade_tick_loop with a default-enabled UpgradeManager.
Fix (mirrors the stop_daemon red-line pattern):
- tests/conftest.py: autouse _guard_upgrade_hermeticity fixture blocks
every side-effect endpoint — upgrade-module httpx.AsyncClient raises
(module-local, global httpx untouched), VERSION_FILE redirected to a
per-test tmp path, EmrgServer._get_or_create_session for SESSION_ID
'emrg-upgrade' raises. Tests that legitimately exercise the chain
stub these after the fixture as usual.
- tests/test_ws_e2e.py: _boot_server forces the upgrade manager disabled
(patches emrg.config.load_update_config) so booted test servers' tick
loop is a no-op; restored in cleanup.
- tests/test_upgrade.py: _run_upgrade_session runner test isolates the
session factory; new test proves the guards are active by default.
- MANIFESTO.md: 第四条附则三 codifies the permanent red line (same
status as the stop_daemon red line, host 2026-08-21 10:35).
- Agent.md: documented test count 985 -> 986.

@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

Fresh review of the upgrade-chain red-line guard:

  • conftest autouse _guard_upgrade_hermeticity blocks all three side-effect endpoints: upgrade-module httpx.AsyncClient raises (module-local, global httpx untouched), VERSION_FILE redirected to per-test tmp, EmrgServer._get_or_create_session for 'emrg-upgrade' raises.
  • _boot_server forces the upgrade manager disabled via emrg.config.load_update_config patch (restored in cleanup) — booted test servers' 5-min tick loop becomes a no-op.
  • test_upgrade session-runner test isolates the session factory; new guard-verification test proves guards active by default.
  • MANIFESTO 附则三 codifies the permanent red line; Agent.md count synced.

Verified locally: pytest 985 passed + 1 skipped (986 collected), import + CLI OK; CI test + test-windows both 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

Re-review (head 316455f unchanged since the 1st LGTM, MERGEABLE/CLEAN):

  • Negative-state verification: test_upgrade_chain_hermeticity_guards confirms the autouse fixture raises on a real upgrade-module httpx.AsyncClient and redirects VERSION_FILE away from the real install path.
  • Full local suite: pytest 985 passed + 1 skipped (986 collected), import + CLI OK.
  • CI test + test-windows both PASS on the same head.

2/3 consecutive LGTMs.

@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

3rd consecutive LGTM (cycles 1193, 1194, 1195). Fresh verification on head 316455f (unchanged):

  • pytest 985 passed + 1 skipped (986 collected) on the PR branch
  • import + CLI OK
  • CI test + test-windows both PASS
  • MERGEABLE/CLEAN

3/3 consecutive LGTMs — merging.

@argszero
argszero merged commit 88cbba2 into masterAug 21, 2026
2 checks passed
@argszero
argszero deleted the feature/test-upgrade-chain-hermeticity branch August 21, 2026 03:38
argszero added a commit that referenced this pull request Aug 21, 2026
Co-authored-by: EMRG Evolution <emrg@argszero.dev>
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)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

emrg: red-line guard — tests never run the real auto-upgrade chain (rant 2026-08-21T10:35:57) - #908

Merged
argszero merged 1 commit into
masterfrom
feature/test-upgrade-chain-hermeticity
Aug 21, 2026
Merged

emrg: red-line guard — tests never run the real auto-upgrade chain (rant 2026-08-21T10:35:57)#908
argszero merged 1 commit into
masterfrom
feature/test-upgrade-chain-hermeticity

Conversation

@argszero

Copy link
Copy Markdown
Owner

Summary

A long-running pytest session (PID 72994, 21h) was really executing the auto-upgrade chain in the background: real GitHub releases API requests, real ~/.emrg/install/version.txt reads, and real emrg-upgrade session writes (downgrade prompt, delay=1440, target=v0.2.57) every 5 minutes — continuing across daemon restarts and even after emrg stop stopped all real processes (writes at 10:23:12 / 10:28:15 / 10:33:17 after the 10:22:56 stop).

Root cause: EmrgServer.serve() unconditionally starts the 5-minute _upgrade_tick_loop, which builds UpgradeManager(load_update_config(), …) with enabled=True by default. Any test booting a real server over a long session lets the tick run the real chain.

Changes

  • tests/conftest.py — new autouse _guard_upgrade_hermeticity fixture (mirrors the existing _guard_stop_daemon_hermeticity red-line pattern):
    1. httpx.AsyncClient in emrg.server.upgrade raises AssertionError on instantiation (module-local — the global httpx module is untouched).
    2. upgrade.VERSION_FILE is redirected to a per-test tmp path — the real ~/.emrg/install/version.txt is never read/written.
    3. EmrgServer._get_or_create_session for SESSION_ID (emrg-upgrade) raises — no real upgrade session may be created/written.
  • tests/test_ws_e2e.py_boot_server forces the upgrade manager disabled (patches emrg.config.load_update_configUpdateConfig(enabled=False)) so booted test servers' tick loop is a no-op; restored in cleanup. Covers test_daemon_manager_e2e (reuses _boot_server).
  • tests/test_upgrade.py — the daemon session-runner test now isolates the session factory (_get_or_create_session); new test_upgrade_chain_hermeticity_guards proves the guards are active by default.
  • MANIFESTO.md — 第四条附则三 codifies the permanent red line (same status as the stop_daemon red line, host 2026-08-21 10:35).
  • Agent.md — documented test count 985 → 986.

Verification

  • uv run pytest tests/985 passed + 1 skipped (986 collected) (was 984+1)
  • uv run python -c "from emrg.client.app import run_client" → OK
  • uv run python -m emrg --help → OK

…ant 2026-08-21T10:35:57)
A long-running pytest session (PID 72994, 21h) really executed the
auto-upgrade chain in the background: real GitHub releases requests,
real ~/.emrg/install/version.txt reads, and real emrg-upgrade session
writes every 5 minutes — continuing across daemon restarts and even
after 'emrg stop'. serve() unconditionally starts the 5-minute
_upgrade_tick_loop with a default-enabled UpgradeManager.
Fix (mirrors the stop_daemon red-line pattern):
- tests/conftest.py: autouse _guard_upgrade_hermeticity fixture blocks
every side-effect endpoint — upgrade-module httpx.AsyncClient raises
(module-local, global httpx untouched), VERSION_FILE redirected to a
per-test tmp path, EmrgServer._get_or_create_session for SESSION_ID
'emrg-upgrade' raises. Tests that legitimately exercise the chain
stub these after the fixture as usual.
- tests/test_ws_e2e.py: _boot_server forces the upgrade manager disabled
(patches emrg.config.load_update_config) so booted test servers' tick
loop is a no-op; restored in cleanup.
- tests/test_upgrade.py: _run_upgrade_session runner test isolates the
session factory; new test proves the guards are active by default.
- MANIFESTO.md: 第四条附则三 codifies the permanent red line (same
status as the stop_daemon red line, host 2026-08-21 10:35).
- Agent.md: documented test count 985 -> 986.

@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

Fresh review of the upgrade-chain red-line guard:

  • conftest autouse _guard_upgrade_hermeticity blocks all three side-effect endpoints: upgrade-module httpx.AsyncClient raises (module-local, global httpx untouched), VERSION_FILE redirected to per-test tmp, EmrgServer._get_or_create_session for 'emrg-upgrade' raises.
  • _boot_server forces the upgrade manager disabled via emrg.config.load_update_config patch (restored in cleanup) — booted test servers' 5-min tick loop becomes a no-op.
  • test_upgrade session-runner test isolates the session factory; new guard-verification test proves guards active by default.
  • MANIFESTO 附则三 codifies the permanent red line; Agent.md count synced.

Verified locally: pytest 985 passed + 1 skipped (986 collected), import + CLI OK; CI test + test-windows both 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

Re-review (head 316455f unchanged since the 1st LGTM, MERGEABLE/CLEAN):

  • Negative-state verification: test_upgrade_chain_hermeticity_guards confirms the autouse fixture raises on a real upgrade-module httpx.AsyncClient and redirects VERSION_FILE away from the real install path.
  • Full local suite: pytest 985 passed + 1 skipped (986 collected), import + CLI OK.
  • CI test + test-windows both PASS on the same head.

2/3 consecutive LGTMs.

@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

3rd consecutive LGTM (cycles 1193, 1194, 1195). Fresh verification on head 316455f (unchanged):

  • pytest 985 passed + 1 skipped (986 collected) on the PR branch
  • import + CLI OK
  • CI test + test-windows both PASS
  • MERGEABLE/CLEAN

3/3 consecutive LGTMs — merging.

@argszero
argszero merged commit 88cbba2 into masterAug 21, 2026
2 checks passed
@argszero
argszero deleted the feature/test-upgrade-chain-hermeticity branch August 21, 2026 03:38
argszero added a commit that referenced this pull request Aug 21, 2026
Co-authored-by: EMRG Evolution <emrg@argszero.dev>
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