Skip to content

fix: auto-skip real_api-marked tests by default - #328

Merged
Jason Robert (jrob5756) merged 2 commits into
mainfrom
fix/326-real-api-tests-not-deselected
Jul 21, 2026
Merged

fix: auto-skip real_api-marked tests by default#328
Jason Robert (jrob5756) merged 2 commits into
mainfrom
fix/326-real-api-tests-not-deselected

Conversation

@jrob5756

Copy link
Copy Markdown
Collaborator

Summary

Fixes#326.

@pytest.mark.real_api was registered in pyproject.toml but nothing
deselected it by default — only CI/release workflows hand-filtered with
-m "not real_api and not performance". A plain pytest,
pytest -m "not performance", or make test would run those tests,
spawning real copilot/claude subprocesses. That's more than a hygiene
issue: it can hard-kill a live conductor run --web-bg workflow when run
from inside it (unhandled SIGTERM, no workflow_failed event, PID file
left behind).

Changes

  • tests/conftest.py: add a pytest_collection_modifyitems hook that
    skips any real_api-marked item unless the caller's -m expression
    already references real_api (word-boundary match) — covering both
    explicit opt-in (-m real_api) and CI's existing
    -m "not real_api and not performance", which keep working unchanged
    since pytest's own marker-expression evaluation handles those cases.
  • tests/test_config/test_real_api_marker.py: new pytester-based
    regression suite that loads the actual hook by file path (not a copy)
    and verifies:
    • default run (no -m) skips the real_api test
    • -m "not performance" skips it (the issue's exact repro)
    • -m real_api runs it
    • CI's exact -m "not real_api and not performance" still deselects it
    • a reverted/no-op hook would not skip it (load-bearing check, so
      this suite would catch a future regression)

No changes needed to Makefile/CI/release workflows — their existing -m
expressions are unaffected by the hook.

Validation

  • make lint / make typecheck — clean (pre-existing unrelated ty
    warning in dialog_evaluator.py only).
  • uv run pytest tests/test_config/test_real_api_marker.py -v — 5/5 pass.
  • uv run pytest tests/test_integration/test_copilot_large_write.py tests/test_integration/test_claude_real_api.py tests/test_config/test_ci_infrastructure.py -v (no -m) — all
    real_api tests report skipped, proving no subprocess spawn.
  • uv run pytest tests/test_config/test_ci_infrastructure.py -m real_api -v
    — confirms opt-in still runs them.
  • Full suite uv run pytest -q -m "not performance"
    4161 passed, 29 skipped, 29 deselected, 0 failed (previously 1 failed
    from a real session.create call per the issue repro).

🤖 Generated with Copilot CLI

Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com

Jason Robertand others added 2 commits July 21, 2026 14:11
Add a pytest_collection_modifyitems hook to tests/conftest.py that skips
any @pytest.mark.real_api test unless the caller's -m expression already
references real_api (e.g. `-m real_api` to opt in, or CI's exact
`-m "not real_api and not performance"`), in which case pytest's own
marker-expression filtering is left to decide selection/deselection.
Previously nothing deselected real_api tests by default: a plain
pytest, `pytest -m "not performance"`, or `make test` would run them,
spawning real copilot/claude subprocesses that can collide with (and
kill) a live `conductor run --web-bg` session.
Adds tests/test_config/test_real_api_marker.py, a pytester-based
regression suite that exercises the actual hook (loaded by file path)
against a synthetic real_api-marked test, verifying:
- default run (no -m) skips it
- -m "not performance" skips it (the issue's exact repro)
- -m real_api runs it
- CI's exact -m "not real_api and not performance" still deselects it
- a reverted/no-op hook would NOT skip it (load-bearing check)
Verified full suite: 4161 passed, 29 skipped, 29 deselected, 0 failed
(previously 1 failed from a real session.create call).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Update tests/conftest.py module docstring to mention the new
pytest_collection_modifyitems hook instead of only "fixtures".
- Use config.getoption("markexpr") instead of the "-m" option-string
alias, and drop the redundant `or ""` fallback (pytest defaults -m to
"" already).
- De-duplicate the issue #326 rationale between the hook's docstring and
the test module's docstring; the test module now points to the hook as
the source of truth.
- Note in test_ci_marker_expression_still_deselects that its -m string
is duplicated in ci.yml/release.yml and should be kept in sync.
- Add test_regex_does_not_match_unrelated_marker_name to directly verify
the \breal_api\b word-boundary regex doesn't false-positive on an
unrelated marker name that merely contains "real_api" as a substring.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@jrob5756
Jason Robert (jrob5756) merged commit bafe343 into mainJul 21, 2026
10 checks passed
@jrob5756
Jason Robert (jrob5756) deleted the fix/326-real-api-tests-not-deselected branch July 21, 2026 18:42
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.

real_api tests are not deselected by default; running the suite spawns real copilot subprocesses (can silently kill a live --web-bg workflow)

1 participant

@jrob5756
, '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" + '
fix: auto-skip real_api-marked tests by default by jrob5756 · Pull Request #328 · microsoft/conductor · GitHub
Skip to content

fix: auto-skip real_api-marked tests by default - #328

Merged
Jason Robert (jrob5756) merged 2 commits into
mainfrom
fix/326-real-api-tests-not-deselected
Jul 21, 2026
Merged

fix: auto-skip real_api-marked tests by default#328
Jason Robert (jrob5756) merged 2 commits into
mainfrom
fix/326-real-api-tests-not-deselected

Conversation

@jrob5756

Copy link
Copy Markdown
Collaborator

Summary

Fixes#326.

@pytest.mark.real_api was registered in pyproject.toml but nothing
deselected it by default — only CI/release workflows hand-filtered with
-m "not real_api and not performance". A plain pytest,
pytest -m "not performance", or make test would run those tests,
spawning real copilot/claude subprocesses. That's more than a hygiene
issue: it can hard-kill a live conductor run --web-bg workflow when run
from inside it (unhandled SIGTERM, no workflow_failed event, PID file
left behind).

Changes

  • tests/conftest.py: add a pytest_collection_modifyitems hook that
    skips any real_api-marked item unless the caller's -m expression
    already references real_api (word-boundary match) — covering both
    explicit opt-in (-m real_api) and CI's existing
    -m "not real_api and not performance", which keep working unchanged
    since pytest's own marker-expression evaluation handles those cases.
  • tests/test_config/test_real_api_marker.py: new pytester-based
    regression suite that loads the actual hook by file path (not a copy)
    and verifies:
    • default run (no -m) skips the real_api test
    • -m "not performance" skips it (the issue's exact repro)
    • -m real_api runs it
    • CI's exact -m "not real_api and not performance" still deselects it
    • a reverted/no-op hook would not skip it (load-bearing check, so
      this suite would catch a future regression)

No changes needed to Makefile/CI/release workflows — their existing -m
expressions are unaffected by the hook.

Validation

  • make lint / make typecheck — clean (pre-existing unrelated ty
    warning in dialog_evaluator.py only).
  • uv run pytest tests/test_config/test_real_api_marker.py -v — 5/5 pass.
  • uv run pytest tests/test_integration/test_copilot_large_write.py tests/test_integration/test_claude_real_api.py tests/test_config/test_ci_infrastructure.py -v (no -m) — all
    real_api tests report skipped, proving no subprocess spawn.
  • uv run pytest tests/test_config/test_ci_infrastructure.py -m real_api -v
    — confirms opt-in still runs them.
  • Full suite uv run pytest -q -m "not performance"
    4161 passed, 29 skipped, 29 deselected, 0 failed (previously 1 failed
    from a real session.create call per the issue repro).

🤖 Generated with Copilot CLI

Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com

Jason Robertand others added 2 commits July 21, 2026 14:11
Add a pytest_collection_modifyitems hook to tests/conftest.py that skips
any @pytest.mark.real_api test unless the caller's -m expression already
references real_api (e.g. `-m real_api` to opt in, or CI's exact
`-m "not real_api and not performance"`), in which case pytest's own
marker-expression filtering is left to decide selection/deselection.
Previously nothing deselected real_api tests by default: a plain
pytest, `pytest -m "not performance"`, or `make test` would run them,
spawning real copilot/claude subprocesses that can collide with (and
kill) a live `conductor run --web-bg` session.
Adds tests/test_config/test_real_api_marker.py, a pytester-based
regression suite that exercises the actual hook (loaded by file path)
against a synthetic real_api-marked test, verifying:
- default run (no -m) skips it
- -m "not performance" skips it (the issue's exact repro)
- -m real_api runs it
- CI's exact -m "not real_api and not performance" still deselects it
- a reverted/no-op hook would NOT skip it (load-bearing check)
Verified full suite: 4161 passed, 29 skipped, 29 deselected, 0 failed
(previously 1 failed from a real session.create call).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Update tests/conftest.py module docstring to mention the new
pytest_collection_modifyitems hook instead of only "fixtures".
- Use config.getoption("markexpr") instead of the "-m" option-string
alias, and drop the redundant `or ""` fallback (pytest defaults -m to
"" already).
- De-duplicate the issue #326 rationale between the hook's docstring and
the test module's docstring; the test module now points to the hook as
the source of truth.
- Note in test_ci_marker_expression_still_deselects that its -m string
is duplicated in ci.yml/release.yml and should be kept in sync.
- Add test_regex_does_not_match_unrelated_marker_name to directly verify
the \breal_api\b word-boundary regex doesn't false-positive on an
unrelated marker name that merely contains "real_api" as a substring.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@jrob5756
Jason Robert (jrob5756) merged commit bafe343 into mainJul 21, 2026
10 checks passed
@jrob5756
Jason Robert (jrob5756) deleted the fix/326-real-api-tests-not-deselected branch July 21, 2026 18:42
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.

real_api tests are not deselected by default; running the suite spawns real copilot subprocesses (can silently kill a live --web-bg workflow)

1 participant

@jrob5756
, '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('^' + ".*" + ' fix: auto-skip real_api-marked tests by default by jrob5756 · Pull Request #328 · microsoft/conductor · GitHub
Skip to content

fix: auto-skip real_api-marked tests by default - #328

Merged
Jason Robert (jrob5756) merged 2 commits into
mainfrom
fix/326-real-api-tests-not-deselected
Jul 21, 2026
Merged

fix: auto-skip real_api-marked tests by default#328
Jason Robert (jrob5756) merged 2 commits into
mainfrom
fix/326-real-api-tests-not-deselected

Conversation

@jrob5756

Copy link
Copy Markdown
Collaborator

Summary

Fixes#326.

@pytest.mark.real_api was registered in pyproject.toml but nothing
deselected it by default — only CI/release workflows hand-filtered with
-m "not real_api and not performance". A plain pytest,
pytest -m "not performance", or make test would run those tests,
spawning real copilot/claude subprocesses. That's more than a hygiene
issue: it can hard-kill a live conductor run --web-bg workflow when run
from inside it (unhandled SIGTERM, no workflow_failed event, PID file
left behind).

Changes

  • tests/conftest.py: add a pytest_collection_modifyitems hook that
    skips any real_api-marked item unless the caller's -m expression
    already references real_api (word-boundary match) — covering both
    explicit opt-in (-m real_api) and CI's existing
    -m "not real_api and not performance", which keep working unchanged
    since pytest's own marker-expression evaluation handles those cases.
  • tests/test_config/test_real_api_marker.py: new pytester-based
    regression suite that loads the actual hook by file path (not a copy)
    and verifies:
    • default run (no -m) skips the real_api test
    • -m "not performance" skips it (the issue's exact repro)
    • -m real_api runs it
    • CI's exact -m "not real_api and not performance" still deselects it
    • a reverted/no-op hook would not skip it (load-bearing check, so
      this suite would catch a future regression)

No changes needed to Makefile/CI/release workflows — their existing -m
expressions are unaffected by the hook.

Validation

  • make lint / make typecheck — clean (pre-existing unrelated ty
    warning in dialog_evaluator.py only).
  • uv run pytest tests/test_config/test_real_api_marker.py -v — 5/5 pass.
  • uv run pytest tests/test_integration/test_copilot_large_write.py tests/test_integration/test_claude_real_api.py tests/test_config/test_ci_infrastructure.py -v (no -m) — all
    real_api tests report skipped, proving no subprocess spawn.
  • uv run pytest tests/test_config/test_ci_infrastructure.py -m real_api -v
    — confirms opt-in still runs them.
  • Full suite uv run pytest -q -m "not performance"
    4161 passed, 29 skipped, 29 deselected, 0 failed (previously 1 failed
    from a real session.create call per the issue repro).

🤖 Generated with Copilot CLI

Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com

Jason Robertand others added 2 commits July 21, 2026 14:11
Add a pytest_collection_modifyitems hook to tests/conftest.py that skips
any @pytest.mark.real_api test unless the caller's -m expression already
references real_api (e.g. `-m real_api` to opt in, or CI's exact
`-m "not real_api and not performance"`), in which case pytest's own
marker-expression filtering is left to decide selection/deselection.
Previously nothing deselected real_api tests by default: a plain
pytest, `pytest -m "not performance"`, or `make test` would run them,
spawning real copilot/claude subprocesses that can collide with (and
kill) a live `conductor run --web-bg` session.
Adds tests/test_config/test_real_api_marker.py, a pytester-based
regression suite that exercises the actual hook (loaded by file path)
against a synthetic real_api-marked test, verifying:
- default run (no -m) skips it
- -m "not performance" skips it (the issue's exact repro)
- -m real_api runs it
- CI's exact -m "not real_api and not performance" still deselects it
- a reverted/no-op hook would NOT skip it (load-bearing check)
Verified full suite: 4161 passed, 29 skipped, 29 deselected, 0 failed
(previously 1 failed from a real session.create call).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Update tests/conftest.py module docstring to mention the new
pytest_collection_modifyitems hook instead of only "fixtures".
- Use config.getoption("markexpr") instead of the "-m" option-string
alias, and drop the redundant `or ""` fallback (pytest defaults -m to
"" already).
- De-duplicate the issue #326 rationale between the hook's docstring and
the test module's docstring; the test module now points to the hook as
the source of truth.
- Note in test_ci_marker_expression_still_deselects that its -m string
is duplicated in ci.yml/release.yml and should be kept in sync.
- Add test_regex_does_not_match_unrelated_marker_name to directly verify
the \breal_api\b word-boundary regex doesn't false-positive on an
unrelated marker name that merely contains "real_api" as a substring.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@jrob5756
Jason Robert (jrob5756) merged commit bafe343 into mainJul 21, 2026
10 checks passed
@jrob5756
Jason Robert (jrob5756) deleted the fix/326-real-api-tests-not-deselected branch July 21, 2026 18:42
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.

real_api tests are not deselected by default; running the suite spawns real copilot subprocesses (can silently kill a live --web-bg workflow)

1 participant

@jrob5756
, '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('^' + ".*" + ' fix: auto-skip real_api-marked tests by default by jrob5756 · Pull Request #328 · microsoft/conductor · GitHub
Skip to content

fix: auto-skip real_api-marked tests by default - #328

Merged
Jason Robert (jrob5756) merged 2 commits into
mainfrom
fix/326-real-api-tests-not-deselected
Jul 21, 2026
Merged

fix: auto-skip real_api-marked tests by default#328
Jason Robert (jrob5756) merged 2 commits into
mainfrom
fix/326-real-api-tests-not-deselected

Conversation

@jrob5756

Copy link
Copy Markdown
Collaborator

Summary

Fixes#326.

@pytest.mark.real_api was registered in pyproject.toml but nothing
deselected it by default — only CI/release workflows hand-filtered with
-m "not real_api and not performance". A plain pytest,
pytest -m "not performance", or make test would run those tests,
spawning real copilot/claude subprocesses. That's more than a hygiene
issue: it can hard-kill a live conductor run --web-bg workflow when run
from inside it (unhandled SIGTERM, no workflow_failed event, PID file
left behind).

Changes

  • tests/conftest.py: add a pytest_collection_modifyitems hook that
    skips any real_api-marked item unless the caller's -m expression
    already references real_api (word-boundary match) — covering both
    explicit opt-in (-m real_api) and CI's existing
    -m "not real_api and not performance", which keep working unchanged
    since pytest's own marker-expression evaluation handles those cases.
  • tests/test_config/test_real_api_marker.py: new pytester-based
    regression suite that loads the actual hook by file path (not a copy)
    and verifies:
    • default run (no -m) skips the real_api test
    • -m "not performance" skips it (the issue's exact repro)
    • -m real_api runs it
    • CI's exact -m "not real_api and not performance" still deselects it
    • a reverted/no-op hook would not skip it (load-bearing check, so
      this suite would catch a future regression)

No changes needed to Makefile/CI/release workflows — their existing -m
expressions are unaffected by the hook.

Validation

  • make lint / make typecheck — clean (pre-existing unrelated ty
    warning in dialog_evaluator.py only).
  • uv run pytest tests/test_config/test_real_api_marker.py -v — 5/5 pass.
  • uv run pytest tests/test_integration/test_copilot_large_write.py tests/test_integration/test_claude_real_api.py tests/test_config/test_ci_infrastructure.py -v (no -m) — all
    real_api tests report skipped, proving no subprocess spawn.
  • uv run pytest tests/test_config/test_ci_infrastructure.py -m real_api -v
    — confirms opt-in still runs them.
  • Full suite uv run pytest -q -m "not performance"
    4161 passed, 29 skipped, 29 deselected, 0 failed (previously 1 failed
    from a real session.create call per the issue repro).

🤖 Generated with Copilot CLI

Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com

Jason Robertand others added 2 commits July 21, 2026 14:11
Add a pytest_collection_modifyitems hook to tests/conftest.py that skips
any @pytest.mark.real_api test unless the caller's -m expression already
references real_api (e.g. `-m real_api` to opt in, or CI's exact
`-m "not real_api and not performance"`), in which case pytest's own
marker-expression filtering is left to decide selection/deselection.
Previously nothing deselected real_api tests by default: a plain
pytest, `pytest -m "not performance"`, or `make test` would run them,
spawning real copilot/claude subprocesses that can collide with (and
kill) a live `conductor run --web-bg` session.
Adds tests/test_config/test_real_api_marker.py, a pytester-based
regression suite that exercises the actual hook (loaded by file path)
against a synthetic real_api-marked test, verifying:
- default run (no -m) skips it
- -m "not performance" skips it (the issue's exact repro)
- -m real_api runs it
- CI's exact -m "not real_api and not performance" still deselects it
- a reverted/no-op hook would NOT skip it (load-bearing check)
Verified full suite: 4161 passed, 29 skipped, 29 deselected, 0 failed
(previously 1 failed from a real session.create call).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Update tests/conftest.py module docstring to mention the new
pytest_collection_modifyitems hook instead of only "fixtures".
- Use config.getoption("markexpr") instead of the "-m" option-string
alias, and drop the redundant `or ""` fallback (pytest defaults -m to
"" already).
- De-duplicate the issue #326 rationale between the hook's docstring and
the test module's docstring; the test module now points to the hook as
the source of truth.
- Note in test_ci_marker_expression_still_deselects that its -m string
is duplicated in ci.yml/release.yml and should be kept in sync.
- Add test_regex_does_not_match_unrelated_marker_name to directly verify
the \breal_api\b word-boundary regex doesn't false-positive on an
unrelated marker name that merely contains "real_api" as a substring.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@jrob5756
Jason Robert (jrob5756) merged commit bafe343 into mainJul 21, 2026
10 checks passed
@jrob5756
Jason Robert (jrob5756) deleted the fix/326-real-api-tests-not-deselected branch July 21, 2026 18:42
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.

real_api tests are not deselected by default; running the suite spawns real copilot subprocesses (can silently kill a live --web-bg workflow)

1 participant

@jrob5756
, '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" + ' fix: auto-skip real_api-marked tests by default by jrob5756 · Pull Request #328 · microsoft/conductor · GitHub
Skip to content

fix: auto-skip real_api-marked tests by default - #328

Merged
Jason Robert (jrob5756) merged 2 commits into
mainfrom
fix/326-real-api-tests-not-deselected
Jul 21, 2026
Merged

fix: auto-skip real_api-marked tests by default#328
Jason Robert (jrob5756) merged 2 commits into
mainfrom
fix/326-real-api-tests-not-deselected

Conversation

@jrob5756

Copy link
Copy Markdown
Collaborator

Summary

Fixes#326.

@pytest.mark.real_api was registered in pyproject.toml but nothing
deselected it by default — only CI/release workflows hand-filtered with
-m "not real_api and not performance". A plain pytest,
pytest -m "not performance", or make test would run those tests,
spawning real copilot/claude subprocesses. That's more than a hygiene
issue: it can hard-kill a live conductor run --web-bg workflow when run
from inside it (unhandled SIGTERM, no workflow_failed event, PID file
left behind).

Changes

  • tests/conftest.py: add a pytest_collection_modifyitems hook that
    skips any real_api-marked item unless the caller's -m expression
    already references real_api (word-boundary match) — covering both
    explicit opt-in (-m real_api) and CI's existing
    -m "not real_api and not performance", which keep working unchanged
    since pytest's own marker-expression evaluation handles those cases.
  • tests/test_config/test_real_api_marker.py: new pytester-based
    regression suite that loads the actual hook by file path (not a copy)
    and verifies:
    • default run (no -m) skips the real_api test
    • -m "not performance" skips it (the issue's exact repro)
    • -m real_api runs it
    • CI's exact -m "not real_api and not performance" still deselects it
    • a reverted/no-op hook would not skip it (load-bearing check, so
      this suite would catch a future regression)

No changes needed to Makefile/CI/release workflows — their existing -m
expressions are unaffected by the hook.

Validation

  • make lint / make typecheck — clean (pre-existing unrelated ty
    warning in dialog_evaluator.py only).
  • uv run pytest tests/test_config/test_real_api_marker.py -v — 5/5 pass.
  • uv run pytest tests/test_integration/test_copilot_large_write.py tests/test_integration/test_claude_real_api.py tests/test_config/test_ci_infrastructure.py -v (no -m) — all
    real_api tests report skipped, proving no subprocess spawn.
  • uv run pytest tests/test_config/test_ci_infrastructure.py -m real_api -v
    — confirms opt-in still runs them.
  • Full suite uv run pytest -q -m "not performance"
    4161 passed, 29 skipped, 29 deselected, 0 failed (previously 1 failed
    from a real session.create call per the issue repro).

🤖 Generated with Copilot CLI

Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com

Jason Robertand others added 2 commits July 21, 2026 14:11
Add a pytest_collection_modifyitems hook to tests/conftest.py that skips
any @pytest.mark.real_api test unless the caller's -m expression already
references real_api (e.g. `-m real_api` to opt in, or CI's exact
`-m "not real_api and not performance"`), in which case pytest's own
marker-expression filtering is left to decide selection/deselection.
Previously nothing deselected real_api tests by default: a plain
pytest, `pytest -m "not performance"`, or `make test` would run them,
spawning real copilot/claude subprocesses that can collide with (and
kill) a live `conductor run --web-bg` session.
Adds tests/test_config/test_real_api_marker.py, a pytester-based
regression suite that exercises the actual hook (loaded by file path)
against a synthetic real_api-marked test, verifying:
- default run (no -m) skips it
- -m "not performance" skips it (the issue's exact repro)
- -m real_api runs it
- CI's exact -m "not real_api and not performance" still deselects it
- a reverted/no-op hook would NOT skip it (load-bearing check)
Verified full suite: 4161 passed, 29 skipped, 29 deselected, 0 failed
(previously 1 failed from a real session.create call).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Update tests/conftest.py module docstring to mention the new
pytest_collection_modifyitems hook instead of only "fixtures".
- Use config.getoption("markexpr") instead of the "-m" option-string
alias, and drop the redundant `or ""` fallback (pytest defaults -m to
"" already).
- De-duplicate the issue #326 rationale between the hook's docstring and
the test module's docstring; the test module now points to the hook as
the source of truth.
- Note in test_ci_marker_expression_still_deselects that its -m string
is duplicated in ci.yml/release.yml and should be kept in sync.
- Add test_regex_does_not_match_unrelated_marker_name to directly verify
the \breal_api\b word-boundary regex doesn't false-positive on an
unrelated marker name that merely contains "real_api" as a substring.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@jrob5756
Jason Robert (jrob5756) merged commit bafe343 into mainJul 21, 2026
10 checks passed
@jrob5756
Jason Robert (jrob5756) deleted the fix/326-real-api-tests-not-deselected branch July 21, 2026 18:42
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.

real_api tests are not deselected by default; running the suite spawns real copilot subprocesses (can silently kill a live --web-bg workflow)

1 participant

@jrob5756
, '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('^' + ".*" + ' fix: auto-skip real_api-marked tests by default by jrob5756 · Pull Request #328 · microsoft/conductor · GitHub
Skip to content

fix: auto-skip real_api-marked tests by default - #328

Merged
Jason Robert (jrob5756) merged 2 commits into
mainfrom
fix/326-real-api-tests-not-deselected
Jul 21, 2026
Merged

fix: auto-skip real_api-marked tests by default#328
Jason Robert (jrob5756) merged 2 commits into
mainfrom
fix/326-real-api-tests-not-deselected

Conversation

@jrob5756

Copy link
Copy Markdown
Collaborator

Summary

Fixes#326.

@pytest.mark.real_api was registered in pyproject.toml but nothing
deselected it by default — only CI/release workflows hand-filtered with
-m "not real_api and not performance". A plain pytest,
pytest -m "not performance", or make test would run those tests,
spawning real copilot/claude subprocesses. That's more than a hygiene
issue: it can hard-kill a live conductor run --web-bg workflow when run
from inside it (unhandled SIGTERM, no workflow_failed event, PID file
left behind).

Changes

  • tests/conftest.py: add a pytest_collection_modifyitems hook that
    skips any real_api-marked item unless the caller's -m expression
    already references real_api (word-boundary match) — covering both
    explicit opt-in (-m real_api) and CI's existing
    -m "not real_api and not performance", which keep working unchanged
    since pytest's own marker-expression evaluation handles those cases.
  • tests/test_config/test_real_api_marker.py: new pytester-based
    regression suite that loads the actual hook by file path (not a copy)
    and verifies:
    • default run (no -m) skips the real_api test
    • -m "not performance" skips it (the issue's exact repro)
    • -m real_api runs it
    • CI's exact -m "not real_api and not performance" still deselects it
    • a reverted/no-op hook would not skip it (load-bearing check, so
      this suite would catch a future regression)

No changes needed to Makefile/CI/release workflows — their existing -m
expressions are unaffected by the hook.

Validation

  • make lint / make typecheck — clean (pre-existing unrelated ty
    warning in dialog_evaluator.py only).
  • uv run pytest tests/test_config/test_real_api_marker.py -v — 5/5 pass.
  • uv run pytest tests/test_integration/test_copilot_large_write.py tests/test_integration/test_claude_real_api.py tests/test_config/test_ci_infrastructure.py -v (no -m) — all
    real_api tests report skipped, proving no subprocess spawn.
  • uv run pytest tests/test_config/test_ci_infrastructure.py -m real_api -v
    — confirms opt-in still runs them.
  • Full suite uv run pytest -q -m "not performance"
    4161 passed, 29 skipped, 29 deselected, 0 failed (previously 1 failed
    from a real session.create call per the issue repro).

🤖 Generated with Copilot CLI

Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com

Jason Robertand others added 2 commits July 21, 2026 14:11
Add a pytest_collection_modifyitems hook to tests/conftest.py that skips
any @pytest.mark.real_api test unless the caller's -m expression already
references real_api (e.g. `-m real_api` to opt in, or CI's exact
`-m "not real_api and not performance"`), in which case pytest's own
marker-expression filtering is left to decide selection/deselection.
Previously nothing deselected real_api tests by default: a plain
pytest, `pytest -m "not performance"`, or `make test` would run them,
spawning real copilot/claude subprocesses that can collide with (and
kill) a live `conductor run --web-bg` session.
Adds tests/test_config/test_real_api_marker.py, a pytester-based
regression suite that exercises the actual hook (loaded by file path)
against a synthetic real_api-marked test, verifying:
- default run (no -m) skips it
- -m "not performance" skips it (the issue's exact repro)
- -m real_api runs it
- CI's exact -m "not real_api and not performance" still deselects it
- a reverted/no-op hook would NOT skip it (load-bearing check)
Verified full suite: 4161 passed, 29 skipped, 29 deselected, 0 failed
(previously 1 failed from a real session.create call).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Update tests/conftest.py module docstring to mention the new
pytest_collection_modifyitems hook instead of only "fixtures".
- Use config.getoption("markexpr") instead of the "-m" option-string
alias, and drop the redundant `or ""` fallback (pytest defaults -m to
"" already).
- De-duplicate the issue #326 rationale between the hook's docstring and
the test module's docstring; the test module now points to the hook as
the source of truth.
- Note in test_ci_marker_expression_still_deselects that its -m string
is duplicated in ci.yml/release.yml and should be kept in sync.
- Add test_regex_does_not_match_unrelated_marker_name to directly verify
the \breal_api\b word-boundary regex doesn't false-positive on an
unrelated marker name that merely contains "real_api" as a substring.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@jrob5756
Jason Robert (jrob5756) merged commit bafe343 into mainJul 21, 2026
10 checks passed
@jrob5756
Jason Robert (jrob5756) deleted the fix/326-real-api-tests-not-deselected branch July 21, 2026 18:42
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.

real_api tests are not deselected by default; running the suite spawns real copilot subprocesses (can silently kill a live --web-bg workflow)

1 participant

@jrob5756
, '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); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix: auto-skip real_api-marked tests by default by jrob5756 · Pull Request #328 · microsoft/conductor · GitHub
Skip to content

fix: auto-skip real_api-marked tests by default - #328

Merged
Jason Robert (jrob5756) merged 2 commits into
mainfrom
fix/326-real-api-tests-not-deselected
Jul 21, 2026
Merged

fix: auto-skip real_api-marked tests by default#328
Jason Robert (jrob5756) merged 2 commits into
mainfrom
fix/326-real-api-tests-not-deselected

Conversation

@jrob5756

Copy link
Copy Markdown
Collaborator

Summary

Fixes#326.

@pytest.mark.real_api was registered in pyproject.toml but nothing
deselected it by default — only CI/release workflows hand-filtered with
-m "not real_api and not performance". A plain pytest,
pytest -m "not performance", or make test would run those tests,
spawning real copilot/claude subprocesses. That's more than a hygiene
issue: it can hard-kill a live conductor run --web-bg workflow when run
from inside it (unhandled SIGTERM, no workflow_failed event, PID file
left behind).

Changes

  • tests/conftest.py: add a pytest_collection_modifyitems hook that
    skips any real_api-marked item unless the caller's -m expression
    already references real_api (word-boundary match) — covering both
    explicit opt-in (-m real_api) and CI's existing
    -m "not real_api and not performance", which keep working unchanged
    since pytest's own marker-expression evaluation handles those cases.
  • tests/test_config/test_real_api_marker.py: new pytester-based
    regression suite that loads the actual hook by file path (not a copy)
    and verifies:
    • default run (no -m) skips the real_api test
    • -m "not performance" skips it (the issue's exact repro)
    • -m real_api runs it
    • CI's exact -m "not real_api and not performance" still deselects it
    • a reverted/no-op hook would not skip it (load-bearing check, so
      this suite would catch a future regression)

No changes needed to Makefile/CI/release workflows — their existing -m
expressions are unaffected by the hook.

Validation

  • make lint / make typecheck — clean (pre-existing unrelated ty
    warning in dialog_evaluator.py only).
  • uv run pytest tests/test_config/test_real_api_marker.py -v — 5/5 pass.
  • uv run pytest tests/test_integration/test_copilot_large_write.py tests/test_integration/test_claude_real_api.py tests/test_config/test_ci_infrastructure.py -v (no -m) — all
    real_api tests report skipped, proving no subprocess spawn.
  • uv run pytest tests/test_config/test_ci_infrastructure.py -m real_api -v
    — confirms opt-in still runs them.
  • Full suite uv run pytest -q -m "not performance"
    4161 passed, 29 skipped, 29 deselected, 0 failed (previously 1 failed
    from a real session.create call per the issue repro).

🤖 Generated with Copilot CLI

Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com

Jason Robertand others added 2 commits July 21, 2026 14:11
Add a pytest_collection_modifyitems hook to tests/conftest.py that skips
any @pytest.mark.real_api test unless the caller's -m expression already
references real_api (e.g. `-m real_api` to opt in, or CI's exact
`-m "not real_api and not performance"`), in which case pytest's own
marker-expression filtering is left to decide selection/deselection.
Previously nothing deselected real_api tests by default: a plain
pytest, `pytest -m "not performance"`, or `make test` would run them,
spawning real copilot/claude subprocesses that can collide with (and
kill) a live `conductor run --web-bg` session.
Adds tests/test_config/test_real_api_marker.py, a pytester-based
regression suite that exercises the actual hook (loaded by file path)
against a synthetic real_api-marked test, verifying:
- default run (no -m) skips it
- -m "not performance" skips it (the issue's exact repro)
- -m real_api runs it
- CI's exact -m "not real_api and not performance" still deselects it
- a reverted/no-op hook would NOT skip it (load-bearing check)
Verified full suite: 4161 passed, 29 skipped, 29 deselected, 0 failed
(previously 1 failed from a real session.create call).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Update tests/conftest.py module docstring to mention the new
pytest_collection_modifyitems hook instead of only "fixtures".
- Use config.getoption("markexpr") instead of the "-m" option-string
alias, and drop the redundant `or ""` fallback (pytest defaults -m to
"" already).
- De-duplicate the issue #326 rationale between the hook's docstring and
the test module's docstring; the test module now points to the hook as
the source of truth.
- Note in test_ci_marker_expression_still_deselects that its -m string
is duplicated in ci.yml/release.yml and should be kept in sync.
- Add test_regex_does_not_match_unrelated_marker_name to directly verify
the \breal_api\b word-boundary regex doesn't false-positive on an
unrelated marker name that merely contains "real_api" as a substring.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@jrob5756
Jason Robert (jrob5756) merged commit bafe343 into mainJul 21, 2026
10 checks passed
@jrob5756
Jason Robert (jrob5756) deleted the fix/326-real-api-tests-not-deselected branch July 21, 2026 18:42
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.

real_api tests are not deselected by default; running the suite spawns real copilot subprocesses (can silently kill a live --web-bg workflow)

1 participant

@jrob5756
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); fix: auto-skip real_api-marked tests by default by jrob5756 · Pull Request #328 · microsoft/conductor · GitHub
Skip to content

fix: auto-skip real_api-marked tests by default - #328

Merged
Jason Robert (jrob5756) merged 2 commits into
mainfrom
fix/326-real-api-tests-not-deselected
Jul 21, 2026
Merged

fix: auto-skip real_api-marked tests by default#328
Jason Robert (jrob5756) merged 2 commits into
mainfrom
fix/326-real-api-tests-not-deselected

Conversation

@jrob5756

Copy link
Copy Markdown
Collaborator

Summary

Fixes#326.

@pytest.mark.real_api was registered in pyproject.toml but nothing
deselected it by default — only CI/release workflows hand-filtered with
-m "not real_api and not performance". A plain pytest,
pytest -m "not performance", or make test would run those tests,
spawning real copilot/claude subprocesses. That's more than a hygiene
issue: it can hard-kill a live conductor run --web-bg workflow when run
from inside it (unhandled SIGTERM, no workflow_failed event, PID file
left behind).

Changes

  • tests/conftest.py: add a pytest_collection_modifyitems hook that
    skips any real_api-marked item unless the caller's -m expression
    already references real_api (word-boundary match) — covering both
    explicit opt-in (-m real_api) and CI's existing
    -m "not real_api and not performance", which keep working unchanged
    since pytest's own marker-expression evaluation handles those cases.
  • tests/test_config/test_real_api_marker.py: new pytester-based
    regression suite that loads the actual hook by file path (not a copy)
    and verifies:
    • default run (no -m) skips the real_api test
    • -m "not performance" skips it (the issue's exact repro)
    • -m real_api runs it
    • CI's exact -m "not real_api and not performance" still deselects it
    • a reverted/no-op hook would not skip it (load-bearing check, so
      this suite would catch a future regression)

No changes needed to Makefile/CI/release workflows — their existing -m
expressions are unaffected by the hook.

Validation

  • make lint / make typecheck — clean (pre-existing unrelated ty
    warning in dialog_evaluator.py only).
  • uv run pytest tests/test_config/test_real_api_marker.py -v — 5/5 pass.
  • uv run pytest tests/test_integration/test_copilot_large_write.py tests/test_integration/test_claude_real_api.py tests/test_config/test_ci_infrastructure.py -v (no -m) — all
    real_api tests report skipped, proving no subprocess spawn.
  • uv run pytest tests/test_config/test_ci_infrastructure.py -m real_api -v
    — confirms opt-in still runs them.
  • Full suite uv run pytest -q -m "not performance"
    4161 passed, 29 skipped, 29 deselected, 0 failed (previously 1 failed
    from a real session.create call per the issue repro).

🤖 Generated with Copilot CLI

Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com

Jason Robertand others added 2 commits July 21, 2026 14:11
Add a pytest_collection_modifyitems hook to tests/conftest.py that skips
any @pytest.mark.real_api test unless the caller's -m expression already
references real_api (e.g. `-m real_api` to opt in, or CI's exact
`-m "not real_api and not performance"`), in which case pytest's own
marker-expression filtering is left to decide selection/deselection.
Previously nothing deselected real_api tests by default: a plain
pytest, `pytest -m "not performance"`, or `make test` would run them,
spawning real copilot/claude subprocesses that can collide with (and
kill) a live `conductor run --web-bg` session.
Adds tests/test_config/test_real_api_marker.py, a pytester-based
regression suite that exercises the actual hook (loaded by file path)
against a synthetic real_api-marked test, verifying:
- default run (no -m) skips it
- -m "not performance" skips it (the issue's exact repro)
- -m real_api runs it
- CI's exact -m "not real_api and not performance" still deselects it
- a reverted/no-op hook would NOT skip it (load-bearing check)
Verified full suite: 4161 passed, 29 skipped, 29 deselected, 0 failed
(previously 1 failed from a real session.create call).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Update tests/conftest.py module docstring to mention the new
pytest_collection_modifyitems hook instead of only "fixtures".
- Use config.getoption("markexpr") instead of the "-m" option-string
alias, and drop the redundant `or ""` fallback (pytest defaults -m to
"" already).
- De-duplicate the issue #326 rationale between the hook's docstring and
the test module's docstring; the test module now points to the hook as
the source of truth.
- Note in test_ci_marker_expression_still_deselects that its -m string
is duplicated in ci.yml/release.yml and should be kept in sync.
- Add test_regex_does_not_match_unrelated_marker_name to directly verify
the \breal_api\b word-boundary regex doesn't false-positive on an
unrelated marker name that merely contains "real_api" as a substring.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@jrob5756
Jason Robert (jrob5756) merged commit bafe343 into mainJul 21, 2026
10 checks passed
@jrob5756
Jason Robert (jrob5756) deleted the fix/326-real-api-tests-not-deselected branch July 21, 2026 18:42
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.

real_api tests are not deselected by default; running the suite spawns real copilot subprocesses (can silently kill a live --web-bg workflow)

1 participant

@jrob5756