Skip to content

fix(test): test_kanban_core_functionality self-SIGTERM via heartbeat enforcement (broken-main, unblocks test(4) on #43/#44/#45) - #46

Merged
sahilm-ai merged 1 commit into
mainfrom
kanban/t_8cd01b66
Jun 3, 2026
Merged

sahilm-ai merged 1 commit into
mainfrom
kanban/t_8cd01b66

Conversation

@sahilm-ai

@sahilm-ai sahilm-ai commented Jun 3, 2026 •

Copy link
Copy Markdown
Collaborator

Problem

tests/hermes_cli/test_kanban_core_functionality.py::test_dispatch_once_stale_disabled_when_timeout_zero deterministically SIGTERMs the pytest process itself (raw pytest RC=143, 5/5 runs). All tests pass, but pytest is killed before printing its summary line, so the parallel harness (scripts/run_tests_parallel.py) scrapes 0 passed/0 failed and buckets the file as "no tests ran". That is what makes the test (4) shard red on #43, #44, AND #45 — broken-main from the 170-commit upstream rebase, not introduced by any of those three PRs (diagnosed in t_8cd01b66).

Root cause

The test stores os.getpid() as the task's worker_pid with started_at 5h ago and no heartbeat, then calls dispatch_once(stale_timeout_seconds=0). dispatch_once runs enforce_missing_heartbeat (hermes_cli/kanban_db.py:6763) independently of stale_timeout_seconds, which os.kill(SIGTERM)s the stored PID = the pytest process. conftest's _guarded_kill explicitly allows self-kills, so the SIGTERM lands. enforce_missing_heartbeat-in-dispatch_once came from fork commit c699bb2 (#37); the test came from e286e68 — the rebase composed the two and exposed the latent self-kill.

Fix

Set a recent last_heartbeat_at on the run so enforce_missing_heartbeat skips the task (this test isolates STALE detection, not heartbeat enforcement). Also hardened test_enforce_max_runtime_integrates_with_dispatch against the same os.getpid()-as-worker_pid footgun on its real-os.kill dispatch_once call.

Test-only change. No production code touched.

Verification

  • Raw venv/bin/python -m pytest test_kanban_core_functionality.py → RC=0, 166 passed, 1 skipped.
  • Targeted: both modified tests pass (2 passed in 0.17s).
  • N/A: no UI-emitting path in this change (test-only).

Sequencing

Merge this BEFORE #43/#44/#45 so their test (4) shard clears.

Summary by CodeRabbit

Tests

  • Improved test reliability and isolation in core functionality tests by adjusting setup procedures to prevent background enforcement mechanisms from triggering during test execution.
  • Refined two test scenarios to ensure accurate verification of timeout and stale detection behaviors without unintended external process interference.

…artbeat enforcement

test_dispatch_once_stale_disabled_when_timeout_zero stored os.getpid() as
worker_pid with a 5h-old started_at and no heartbeat, then called
dispatch_once(stale_timeout_seconds=0). dispatch_once runs
enforce_missing_heartbeat independently of stale_timeout_seconds, which
os.kill(SIGTERM)'d the stored PID = the pytest process itself, killing
pytest before it printed its summary (raw RC=143). The parallel harness
then scraped 0 passed/0 failed and bucketed the file as 'no tests ran',
turning test(4) red on #43/#44/#45 — broken-main from the upstream rebase.

Fix: set a recent last_heartbeat_at on the run so enforce_missing_heartbeat
skips the task. This test isolates STALE detection, not heartbeat
enforcement. Also hardened test_enforce_max_runtime_integrates_with_dispatch
(same os.getpid() footgun on its real-os.kill dispatch_once call).

Test-only change. Verified: raw pytest RC=0, 166 passed 1 skipped.
@coderabbitai

coderabbitai Bot commented Jun 3, 2026 •

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: aa6a85e4-19f7-483d-b273-e90da17f1f6d

📥 Commits

Reviewing files that changed from the base of the PR and between 9b21fa5 and 4ab73a3.

📒 Files selected for processing (1)
  • tests/hermes_cli/test_kanban_core_functionality.py

📝 Walkthrough

Walkthrough

Two test scenarios are adjusted to set last_heartbeat_at when backdating task_runs.started_at, preventing heartbeat enforcement from interfering with test isolation during dispatch_once execution.

Changes

Test Isolation via Heartbeat Control

Layer / File(s) Summary
Heartbeat control in dispatch and stale-detection tests
tests/hermes_cli/test_kanban_core_functionality.py
test_enforce_max_runtime_integrates_with_dispatch and test_dispatch_once_stale_disabled_when_timeout_zero now set last_heartbeat_at to a recent timestamp alongside the backdated started_at, preventing heartbeat enforcement from affecting test outcomes while each test isolates its specific behavior.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

  • sahilm-ti/hermes-agent#26: The test updates to explicitly set task_runs.last_heartbeat_at are directly tied to heartbeat-aware stuck-worker detection logic that depends on last_heartbeat_at.

Poem

🐇 Heartbeat checks, now tamed with grace,
Two tests set timestamps in their place,
No phantom signals shall distract,
Each test stays focused, sharp, intact! ❤️

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title directly addresses the main issue: fixing test failures caused by heartbeat enforcement triggering unintended SIGTERM in kanban core functionality tests.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch kanban/t_8cd01b66

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

❤️ Share

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

@github-actions

github-actions Bot commented Jun 3, 2026

Copy link
Copy Markdown

🔎 Lint report: kanban/t_8cd01b66 vs origin/main

ruff

Total: 0 on HEAD, 0 on base (➖ 0)

🆕 New issues: none

✅ Fixed issues: none

Unchanged: 0 pre-existing issues carried over.

ty (type checker)

Total: 9760 on HEAD, 9760 on base (➖ 0)

🆕 New issues: none

✅ Fixed issues: none

Unchanged: 5053 pre-existing issues carried over.

Diagnostics are surfaced as warnings — this check never fails the build.

@sahilm-ti

Copy link
Copy Markdown
Owner

auto-review: approved → human_review (merge-sequencing call for Sahil).

  • U1 in-scope: PASS — only tests/hermes_cli/test_kanban_core_functionality.py (+15/-4), test-only per AC.
  • U4 AC coverage: PASS — test (4) is GREEN in CI (3m25s), the shard this PR fixes. The self-SIGTERM fix is confirmed beyond local.
  • C5 worker identity: PASS — 1 commit 4ab73a3, Sahil (AI) <266772320+sahilm-ai>.
  • C1 CI: one red — test (3). This is pre-existing broken-main, NOT caused by this PR: the 2 failures (test_unassigned_task_auto_assigned_with_default_assignee, test_dry_run_with_default_assignee_reports_without_mutating) live in test_kanban_default_assignee.py, which this PR does not touch. It's the default_assignee spawn regression diagnosed in t_8cd01b66 and fixed by fix(tests): hermetic kanban dispatch tests + default_assignee spawn regression #43.

Sequencing per AC: merge #46 first (clears test (4)), then #43 (clears test (3)). Auto-review will not merge — Sahil's call.

@sahilm-ai
sahilm-ai merged commit ae370ad into main Jun 3, 2026
23 of 24 checks passed
@sahilm-ai
sahilm-ai deleted the kanban/t_8cd01b66 branch June 3, 2026 17:43
sahilm-ti pushed a commit that referenced this pull request Jun 5, 2026
…artbeat enforcement (#46)

test_dispatch_once_stale_disabled_when_timeout_zero stored os.getpid() as
worker_pid with a 5h-old started_at and no heartbeat, then called
dispatch_once(stale_timeout_seconds=0). dispatch_once runs
enforce_missing_heartbeat independently of stale_timeout_seconds, which
os.kill(SIGTERM)'d the stored PID = the pytest process itself, killing
pytest before it printed its summary (raw RC=143). The parallel harness
then scraped 0 passed/0 failed and bucketed the file as 'no tests ran',
turning test(4) red on #43/#44/#45 — broken-main from the upstream rebase.

Fix: set a recent last_heartbeat_at on the run so enforce_missing_heartbeat
skips the task. This test isolates STALE detection, not heartbeat
enforcement. Also hardened test_enforce_max_runtime_integrates_with_dispatch
(same os.getpid() footgun on its real-os.kill dispatch_once call).

Test-only change. Verified: raw pytest RC=0, 166 passed 1 skipped.

Co-authored-by: Sahil (AI) <266772320+sahilm-ai@users.noreply.github.com>
sahilm-ti pushed a commit that referenced this pull request Jun 15, 2026
…artbeat enforcement (#46)

test_dispatch_once_stale_disabled_when_timeout_zero stored os.getpid() as
worker_pid with a 5h-old started_at and no heartbeat, then called
dispatch_once(stale_timeout_seconds=0). dispatch_once runs
enforce_missing_heartbeat independently of stale_timeout_seconds, which
os.kill(SIGTERM)'d the stored PID = the pytest process itself, killing
pytest before it printed its summary (raw RC=143). The parallel harness
then scraped 0 passed/0 failed and bucketed the file as 'no tests ran',
turning test(4) red on #43/#44/#45 — broken-main from the upstream rebase.

Fix: set a recent last_heartbeat_at on the run so enforce_missing_heartbeat
skips the task. This test isolates STALE detection, not heartbeat
enforcement. Also hardened test_enforce_max_runtime_integrates_with_dispatch
(same os.getpid() footgun on its real-os.kill dispatch_once call).

Test-only change. Verified: raw pytest RC=0, 166 passed 1 skipped.

Co-authored-by: Sahil (AI) <266772320+sahilm-ai@users.noreply.github.com>
sahilm-ti pushed a commit that referenced this pull request Jun 17, 2026
…artbeat enforcement (#46)

test_dispatch_once_stale_disabled_when_timeout_zero stored os.getpid() as
worker_pid with a 5h-old started_at and no heartbeat, then called
dispatch_once(stale_timeout_seconds=0). dispatch_once runs
enforce_missing_heartbeat independently of stale_timeout_seconds, which
os.kill(SIGTERM)'d the stored PID = the pytest process itself, killing
pytest before it printed its summary (raw RC=143). The parallel harness
then scraped 0 passed/0 failed and bucketed the file as 'no tests ran',
turning test(4) red on #43/#44/#45 — broken-main from the upstream rebase.

Fix: set a recent last_heartbeat_at on the run so enforce_missing_heartbeat
skips the task. This test isolates STALE detection, not heartbeat
enforcement. Also hardened test_enforce_max_runtime_integrates_with_dispatch
(same os.getpid() footgun on its real-os.kill dispatch_once call).

Test-only change. Verified: raw pytest RC=0, 166 passed 1 skipped.

Co-authored-by: Sahil (AI) <266772320+sahilm-ai@users.noreply.github.com>
sahilm-ti pushed a commit that referenced this pull request Jun 22, 2026
…artbeat enforcement (#46)

test_dispatch_once_stale_disabled_when_timeout_zero stored os.getpid() as
worker_pid with a 5h-old started_at and no heartbeat, then called
dispatch_once(stale_timeout_seconds=0). dispatch_once runs
enforce_missing_heartbeat independently of stale_timeout_seconds, which
os.kill(SIGTERM)'d the stored PID = the pytest process itself, killing
pytest before it printed its summary (raw RC=143). The parallel harness
then scraped 0 passed/0 failed and bucketed the file as 'no tests ran',
turning test(4) red on #43/#44/#45 — broken-main from the upstream rebase.

Fix: set a recent last_heartbeat_at on the run so enforce_missing_heartbeat
skips the task. This test isolates STALE detection, not heartbeat
enforcement. Also hardened test_enforce_max_runtime_integrates_with_dispatch
(same os.getpid() footgun on its real-os.kill dispatch_once call).

Test-only change. Verified: raw pytest RC=0, 166 passed 1 skipped.

Co-authored-by: Sahil (AI) <266772320+sahilm-ai@users.noreply.github.com>
sahilm-ti pushed a commit that referenced this pull request Jul 3, 2026
…artbeat enforcement (#46)

test_dispatch_once_stale_disabled_when_timeout_zero stored os.getpid() as
worker_pid with a 5h-old started_at and no heartbeat, then called
dispatch_once(stale_timeout_seconds=0). dispatch_once runs
enforce_missing_heartbeat independently of stale_timeout_seconds, which
os.kill(SIGTERM)'d the stored PID = the pytest process itself, killing
pytest before it printed its summary (raw RC=143). The parallel harness
then scraped 0 passed/0 failed and bucketed the file as 'no tests ran',
turning test(4) red on #43/#44/#45 — broken-main from the upstream rebase.

Fix: set a recent last_heartbeat_at on the run so enforce_missing_heartbeat
skips the task. This test isolates STALE detection, not heartbeat
enforcement. Also hardened test_enforce_max_runtime_integrates_with_dispatch
(same os.getpid() footgun on its real-os.kill dispatch_once call).

Test-only change. Verified: raw pytest RC=0, 166 passed 1 skipped.

Co-authored-by: Sahil (AI) <266772320+sahilm-ai@users.noreply.github.com>
sahilm-ti pushed a commit that referenced this pull request Jul 9, 2026
…artbeat enforcement (#46)

test_dispatch_once_stale_disabled_when_timeout_zero stored os.getpid() as
worker_pid with a 5h-old started_at and no heartbeat, then called
dispatch_once(stale_timeout_seconds=0). dispatch_once runs
enforce_missing_heartbeat independently of stale_timeout_seconds, which
os.kill(SIGTERM)'d the stored PID = the pytest process itself, killing
pytest before it printed its summary (raw RC=143). The parallel harness
then scraped 0 passed/0 failed and bucketed the file as 'no tests ran',
turning test(4) red on #43/#44/#45 — broken-main from the upstream rebase.

Fix: set a recent last_heartbeat_at on the run so enforce_missing_heartbeat
skips the task. This test isolates STALE detection, not heartbeat
enforcement. Also hardened test_enforce_max_runtime_integrates_with_dispatch
(same os.getpid() footgun on its real-os.kill dispatch_once call).

Test-only change. Verified: raw pytest RC=0, 166 passed 1 skipped.

Co-authored-by: Sahil (AI) <266772320+sahilm-ai@users.noreply.github.com>
sahilm-ti pushed a commit that referenced this pull request Jul 10, 2026
…artbeat enforcement (#46)

test_dispatch_once_stale_disabled_when_timeout_zero stored os.getpid() as
worker_pid with a 5h-old started_at and no heartbeat, then called
dispatch_once(stale_timeout_seconds=0). dispatch_once runs
enforce_missing_heartbeat independently of stale_timeout_seconds, which
os.kill(SIGTERM)'d the stored PID = the pytest process itself, killing
pytest before it printed its summary (raw RC=143). The parallel harness
then scraped 0 passed/0 failed and bucketed the file as 'no tests ran',
turning test(4) red on #43/#44/#45 — broken-main from the upstream rebase.

Fix: set a recent last_heartbeat_at on the run so enforce_missing_heartbeat
skips the task. This test isolates STALE detection, not heartbeat
enforcement. Also hardened test_enforce_max_runtime_integrates_with_dispatch
(same os.getpid() footgun on its real-os.kill dispatch_once call).

Test-only change. Verified: raw pytest RC=0, 166 passed 1 skipped.

Co-authored-by: Sahil (AI) <266772320+sahilm-ai@users.noreply.github.com>
sahilm-ti pushed a commit that referenced this pull request Jul 11, 2026
…artbeat enforcement (#46)

test_dispatch_once_stale_disabled_when_timeout_zero stored os.getpid() as
worker_pid with a 5h-old started_at and no heartbeat, then called
dispatch_once(stale_timeout_seconds=0). dispatch_once runs
enforce_missing_heartbeat independently of stale_timeout_seconds, which
os.kill(SIGTERM)'d the stored PID = the pytest process itself, killing
pytest before it printed its summary (raw RC=143). The parallel harness
then scraped 0 passed/0 failed and bucketed the file as 'no tests ran',
turning test(4) red on #43/#44/#45 — broken-main from the upstream rebase.

Fix: set a recent last_heartbeat_at on the run so enforce_missing_heartbeat
skips the task. This test isolates STALE detection, not heartbeat
enforcement. Also hardened test_enforce_max_runtime_integrates_with_dispatch
(same os.getpid() footgun on its real-os.kill dispatch_once call).

Test-only change. Verified: raw pytest RC=0, 166 passed 1 skipped.

Co-authored-by: Sahil (AI) <266772320+sahilm-ai@users.noreply.github.com>
sahilm-ti pushed a commit that referenced this pull request Jul 13, 2026
…artbeat enforcement (#46)

test_dispatch_once_stale_disabled_when_timeout_zero stored os.getpid() as
worker_pid with a 5h-old started_at and no heartbeat, then called
dispatch_once(stale_timeout_seconds=0). dispatch_once runs
enforce_missing_heartbeat independently of stale_timeout_seconds, which
os.kill(SIGTERM)'d the stored PID = the pytest process itself, killing
pytest before it printed its summary (raw RC=143). The parallel harness
then scraped 0 passed/0 failed and bucketed the file as 'no tests ran',
turning test(4) red on #43/#44/#45 — broken-main from the upstream rebase.

Fix: set a recent last_heartbeat_at on the run so enforce_missing_heartbeat
skips the task. This test isolates STALE detection, not heartbeat
enforcement. Also hardened test_enforce_max_runtime_integrates_with_dispatch
(same os.getpid() footgun on its real-os.kill dispatch_once call).

Test-only change. Verified: raw pytest RC=0, 166 passed 1 skipped.

Co-authored-by: Sahil (AI) <266772320+sahilm-ai@users.noreply.github.com>
sahilm-ti pushed a commit that referenced this pull request Jul 15, 2026
…artbeat enforcement (#46)

test_dispatch_once_stale_disabled_when_timeout_zero stored os.getpid() as
worker_pid with a 5h-old started_at and no heartbeat, then called
dispatch_once(stale_timeout_seconds=0). dispatch_once runs
enforce_missing_heartbeat independently of stale_timeout_seconds, which
os.kill(SIGTERM)'d the stored PID = the pytest process itself, killing
pytest before it printed its summary (raw RC=143). The parallel harness
then scraped 0 passed/0 failed and bucketed the file as 'no tests ran',
turning test(4) red on #43/#44/#45 — broken-main from the upstream rebase.

Fix: set a recent last_heartbeat_at on the run so enforce_missing_heartbeat
skips the task. This test isolates STALE detection, not heartbeat
enforcement. Also hardened test_enforce_max_runtime_integrates_with_dispatch
(same os.getpid() footgun on its real-os.kill dispatch_once call).

Test-only change. Verified: raw pytest RC=0, 166 passed 1 skipped.

Co-authored-by: Sahil (AI) <266772320+sahilm-ai@users.noreply.github.com>
sahilm-ti pushed a commit that referenced this pull request Jul 17, 2026
…artbeat enforcement (#46)

test_dispatch_once_stale_disabled_when_timeout_zero stored os.getpid() as
worker_pid with a 5h-old started_at and no heartbeat, then called
dispatch_once(stale_timeout_seconds=0). dispatch_once runs
enforce_missing_heartbeat independently of stale_timeout_seconds, which
os.kill(SIGTERM)'d the stored PID = the pytest process itself, killing
pytest before it printed its summary (raw RC=143). The parallel harness
then scraped 0 passed/0 failed and bucketed the file as 'no tests ran',
turning test(4) red on #43/#44/#45 — broken-main from the upstream rebase.

Fix: set a recent last_heartbeat_at on the run so enforce_missing_heartbeat
skips the task. This test isolates STALE detection, not heartbeat
enforcement. Also hardened test_enforce_max_runtime_integrates_with_dispatch
(same os.getpid() footgun on its real-os.kill dispatch_once call).

Test-only change. Verified: raw pytest RC=0, 166 passed 1 skipped.

Co-authored-by: Sahil (AI) <266772320+sahilm-ai@users.noreply.github.com>
sahilm-ti pushed a commit that referenced this pull request Jul 21, 2026
…artbeat enforcement (#46)

test_dispatch_once_stale_disabled_when_timeout_zero stored os.getpid() as
worker_pid with a 5h-old started_at and no heartbeat, then called
dispatch_once(stale_timeout_seconds=0). dispatch_once runs
enforce_missing_heartbeat independently of stale_timeout_seconds, which
os.kill(SIGTERM)'d the stored PID = the pytest process itself, killing
pytest before it printed its summary (raw RC=143). The parallel harness
then scraped 0 passed/0 failed and bucketed the file as 'no tests ran',
turning test(4) red on #43/#44/#45 — broken-main from the upstream rebase.

Fix: set a recent last_heartbeat_at on the run so enforce_missing_heartbeat
skips the task. This test isolates STALE detection, not heartbeat
enforcement. Also hardened test_enforce_max_runtime_integrates_with_dispatch
(same os.getpid() footgun on its real-os.kill dispatch_once call).

Test-only change. Verified: raw pytest RC=0, 166 passed 1 skipped.

Co-authored-by: Sahil (AI) <266772320+sahilm-ai@users.noreply.github.com>
sahilm-ti pushed a commit that referenced this pull request Jul 23, 2026
…artbeat enforcement (#46)

test_dispatch_once_stale_disabled_when_timeout_zero stored os.getpid() as
worker_pid with a 5h-old started_at and no heartbeat, then called
dispatch_once(stale_timeout_seconds=0). dispatch_once runs
enforce_missing_heartbeat independently of stale_timeout_seconds, which
os.kill(SIGTERM)'d the stored PID = the pytest process itself, killing
pytest before it printed its summary (raw RC=143). The parallel harness
then scraped 0 passed/0 failed and bucketed the file as 'no tests ran',
turning test(4) red on #43/#44/#45 — broken-main from the upstream rebase.

Fix: set a recent last_heartbeat_at on the run so enforce_missing_heartbeat
skips the task. This test isolates STALE detection, not heartbeat
enforcement. Also hardened test_enforce_max_runtime_integrates_with_dispatch
(same os.getpid() footgun on its real-os.kill dispatch_once call).

Test-only change. Verified: raw pytest RC=0, 166 passed 1 skipped.

Co-authored-by: Sahil (AI) <266772320+sahilm-ai@users.noreply.github.com>
sahilm-ti pushed a commit that referenced this pull request Jul 28, 2026
…artbeat enforcement (#46)

test_dispatch_once_stale_disabled_when_timeout_zero stored os.getpid() as
worker_pid with a 5h-old started_at and no heartbeat, then called
dispatch_once(stale_timeout_seconds=0). dispatch_once runs
enforce_missing_heartbeat independently of stale_timeout_seconds, which
os.kill(SIGTERM)'d the stored PID = the pytest process itself, killing
pytest before it printed its summary (raw RC=143). The parallel harness
then scraped 0 passed/0 failed and bucketed the file as 'no tests ran',
turning test(4) red on #43/#44/#45 — broken-main from the upstream rebase.

Fix: set a recent last_heartbeat_at on the run so enforce_missing_heartbeat
skips the task. This test isolates STALE detection, not heartbeat
enforcement. Also hardened test_enforce_max_runtime_integrates_with_dispatch
(same os.getpid() footgun on its real-os.kill dispatch_once call).

Test-only change. Verified: raw pytest RC=0, 166 passed 1 skipped.

Co-authored-by: Sahil (AI) <266772320+sahilm-ai@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants