-
Notifications
You must be signed in to change notification settings - Fork 0
Description
Summary: Tests for Worklog 'findNextWorkItem' selection logic are failing due to tie-break and in-progress boost handling. This work item will triage and implement a minimal, well-tested fix so the test-suite passes.
Problem: selectBySortIndex currently falls back to effective priority and createdAt when sortIndex values are equal. We attempted to use computeScore for tie-breaking but that call was missing ancestor in-progress context and introduced nondeterminism. Several tests in tests/database.test.ts and tests/next-regression.test.ts are failing intermittently.
Acceptance criteria:
- Reproduce each failing test in isolation with and capture logs.
- Implement a minimal fix to selectBySortIndex/computeScore usage so that: 1) priority dominance (1000 per level) is preserved over blocks boosts (500), 2) in-progress ancestor boosts are applied correctly when intended, and 3) tie-breaking remains deterministic where tests expect createdAt ordering.
- Add focused unit tests to lock the intended behavior.
- All tests pass locally (
�[1m�[46m RUN �[49m�[22m �[36mv4.0.18 �[39m�[90m/home/rgardler/projects/ContextHub�[39m
�[90mstdout�[2m | tests/tui/tui-github-metadata.test.ts�[2m > �[22m�[2mTUI G key (shift+G) GitHub action�[2m > �[22m�[2mshows no-item toast when nothing is selected
�[22m�[39mNo work items found
�[32m✓�[39m tests/sync-worktree.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 263�[2mms�[22m�[39m
�[32m✓�[39m test/validator.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 241�[2mms�[22m�[39m
�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?1000h�[?1002h�[?1005h�[?1l�>�[?12l�[?25h�[H�[2J�[?1000l�[?1002l�[?1005l�[?1049l�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?1l�>�[?12l�[?25h�[H�[2J�[?1049l �[32m✓�[39m tests/cli/helpers-tree-rendering.test.ts �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[32m 267�[2mms�[22m�[39m
�[32m✓�[39m test/tui-integration.test.ts �[2m(�[22m�[2m10 tests�[22m�[2m)�[22m�[33m 412�[2mms�[22m�[39m
�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?1l�>�[?12l�[?25h�[H�[2J�[?1049l�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?1l�>�[?12l�[?25h�[H�[2J�[?1049l �[32m✓�[39m tests/normalize-sqlite-bindings.test.ts �[2m(�[22m�[2m23 tests�[22m�[2m)�[22m�[33m 349�[2mms�[22m�[39m
�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?12l�[?25h�[?25l�[?12l�[?25h�[?1l�>�[?12l�[?25h�[H�[2J�[?1049l�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?12l�[?25h�[?25l�[?12l�[?25h�[?25l�[?12l�[?25h�[?1l�>�[?12l�[?25h�[H�[2J�[?1049l�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?12l�[?25h�[?25l�[?12l�[?25h�[?25l�[?12l�[?25h�[?25l�[?12l�[?25h�[?1l�>�[?12l�[?25h�[H�[2J�[?1049l�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?1l�>�[?12l�[?25h�[H�[2J�[?1049l�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?1l�>�[?12l�[?25h�[H�[2J�[?1049l�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?12l�[?25h�[?1l�>�[?12l�[?25h�[H�[2J�[?1049l�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?1l�>�[?12l�[?25h�[H�[2J�[?1049l�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?1l�>�[?12l�[?25h�[H�[2J�[?1049l �[32m✓�[39m tests/tui/tui-github-metadata.test.ts �[2m(�[22m�[2m14 tests�[22m�[2m)�[22m�[32m 270�[2mms�[22m�[39m
�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?12l�[?25h�[?25l�[?12l�[?25h�[?25l�[?12l�[?25h�[?1l�>�[?12l�[?25h�[H�[2J�[?1049l �[32m✓�[39m test/throttler.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[33m 507�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m refills tokens over time according to rate �[33m 501�[2mms�[22m�[39m
�[32m✓�[39m tests/integration/github-upsert-preservation.test.ts �[2m(�[22m�[2m9 tests�[22m�[2m)�[22m�[33m 471�[2mms�[22m�[39m
�[90mstdout�[2m | tests/tui/copy-id.test.ts�[2m > �[22m�[2mTUI C key copy ID to clipboard�[2m > �[22m�[2mdoes nothing when no item is selected
�[22m�[39mNo work items found
�[32m✓�[39m tests/unit/database-upsert.test.ts �[2m(�[22m�[2m13 tests�[22m�[2m | �[22m�[33m2 skipped�[39m�[2m)�[22m�[33m 502�[2mms�[22m�[39m
�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?1l�>�[?12l�[?25h�[H�[2J�[?1049l�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?1l�>�[?12l�[?25h�[H�[2J�[?1049l�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?1l�>�[?12l�[?25h�[H�[2J�[?1049l�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?1l�>�[?12l�[?25h�[H�[2J�[?1049l�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?1l�>�[?12l�[?25h�[H�[2J�[?1049l �[32m✓�[39m tests/config.test.ts �[2m(�[22m�[2m19 tests�[22m�[2m)�[22m�[32m 209�[2mms�[22m�[39m
�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?1l�>�[?12l�[?25h�[H�[2J�[?1049l �[32m✓�[39m tests/tui/copy-id.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 217�[2mms�[22m�[39m
�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?1000h�[?1002h�Ptmux;��[?1003h�\�[?1005h�[?1l�>�[?12l�[?25h�[H�[2J�[?1000l�[?1002l�Ptmux;��[?1003l�\�[?1005l�[?1049l�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?1000h�[?1002h�Ptmux;��[?1003h�\�[?1005h�[?1l�>�[?12l�[?25h�[H�[2J�[?1000l�[?1002l�Ptmux;��[?1003l�\�[?1005l�[?1049l�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?1000h�[?1002h�Ptmux;��[?1003h�\�[?1005h�[?1l�>�[?12l�[?25h�[H�[2J�[?1000l�[?1002l�Ptmux;��[?1003l�\�[?1005l�[?1049l�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?1l�>�[?12l�[?25h�[H�[2J�[?1049l�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?1l�>�[?12l�[?25h�[H�[2J�[?1049l�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?1l�>�[?12l�[?25h�[H�[2J�[?1049l�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?1l�>�[?12l�[?25h�[H�[2J�[?1049l�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?1l�>�[?12l�[?25h�[H�[2J�[?1049l �[32m✓�[39m tests/cli/status.test.ts �[2m(�[22m�[2m6 tests�[22m�[2m | �[22m�[33m1 skipped�[39m�[2m)�[22m�[33m 322�[2mms�[22m�[39m
�Ptmux;��[?1003h�\�Ptmux;��[?1003l�\ �[32m✓�[39m tests/tui/tui-update-dialog.test.ts �[2m(�[22m�[2m36 tests�[22m�[2m)�[22m�[33m 569�[2mms�[22m�[39m
�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?1l�>�[?12l�[?25h�[H�[2J�[?1049l�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?1l�>�[?12l�[?25h�[H�[2J�[?1049l�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?1l�>�[?12l�[?25h�[H�[2J�[?1049l�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?1000h�[?1002h�Ptmux;��[?1003h�\ �[32m✓�[39m tests/cli/doctor-upgrade.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 172�[2mms�[22m�[39m
�[?1005h�[?1l�>�[?12l�[?25h�[H�[2J�[?1000l�[?1002l�Ptmux;��[?1003l�\�[?1005l�[?1049l�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?1000h�[?1002h�Ptmux;��[?1003h�\�[?1005h�[?1l�>�[?12l�[?25h�[H�[2J�[?1000l�[?1002l�Ptmux;��[?1003l�\�[?1005l�[?1049l �[32m✓�[39m tests/cli/team.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 207�[2mms�[22m�[39m
�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?1000h�[?1002h�Ptmux;��[?1003h�\�[?1005h�[?1l�>�[?12l�[?25h�[H�[2J�[?1000l�[?1002l�Ptmux;��[?1003l�\�[?1005l�[?1049l�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?1l�>�[?12l�[?25h�[H�[2J�[?1049l�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?1000h�[?1002h�Ptmux;��[?1003h�\�[?1005h�[?1l�>�[?12l�[?25h�[H�[2J�[?1000l�[?1002l�Ptmux;��[?1003l�\�[?1005l�[?1049l �[32m✓�[39m tests/migrations.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 152�[2mms�[22m�[39m
�[32m✓�[39m tests/tui/tui-mouse-guard.test.ts �[2m(�[22m�[2m20 tests�[22m�[2m)�[22m�[32m 142�[2mms�[22m�[39m
�[32m✓�[39m tests/cli/initialization-check.test.ts �[2m(�[22m�[2m15 tests�[22m�[2m)�[22m�[32m 164�[2mms�[22m�[39m
�[32m✓�[39m tests/plugin-loader.test.ts �[2m(�[22m�[2m37 tests�[22m�[2m)�[22m�[32m 161�[2mms�[22m�[39m
�[32m✓�[39m tests/cli/debug-inproc.test.ts �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[33m 461�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m debug in-process runner outputs �[33m 460�[2mms�[22m�[39m
�[32m✓�[39m tests/validator.test.ts �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 128�[2mms�[22m�[39m
�[32m✓�[39m test/tui-opencode-integration.test.ts �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 77�[2mms�[22m�[39m
�[32m✓�[39m tests/grouping.test.ts �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 98�[2mms�[22m�[39m
�[32m✓�[39m test/migrations.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 111�[2mms�[22m�[39m
�[32m✓�[39m tests/cli/create-description-file.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 131�[2mms�[22m�[39m
�[32m✓�[39m tests/tui/filter.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 79�[2mms�[22m�[39m
�[32m✓�[39m test/tui-chords.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 83�[2mms�[22m�[39m
�[32m✓�[39m tests/tui/opencode-integration.test.ts �[2m(�[22m�[2m16 tests�[22m�[2m)�[22m�[32m 133�[2mms�[22m�[39m
�[32m✓�[39m tests/tui/opencode-child-lifecycle.test.ts �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[33m 1004�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m removes listeners and kills child on stopServer and allows restart without leaking �[33m 1003�[2mms�[22m�[39m
�[90mstdout�[2m | tests/debug/update-debug.test.ts�[2m > �[22m�[2mdebug update with description-file
�[22m�[39mCREATE STDOUT:
{
"success": true,
"workItem": {
"id": "DBG-0MN7GBAKI1X94TR0",
"title": "To update",
"description": "",
"status": "open",
"priority": "medium",
"sortIndex": 100,
"parentId": null,
"createdAt": "2026-03-26T12:31:07.842Z",
"updatedAt": "2026-03-26T12:31:07.842Z",
"tags": [],
"assignee": "",
"stage": "idea",
"issueType": "",
"createdBy": "",
"deletedBy": "",
"deleteReason": "",
"risk": "",
"effort": "",
"needsProducerReview": false
}
}
CREATE STDERR:
Invalid config: statusStageCompatibility for status "open" references unknown stage "idea"
�[32m✓�[39m tests/cli/github-push-timestamp.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 117�[2mms�[22m�[39m
�[90mstdout�[2m | tests/debug/update-debug.test.ts�[2m > �[22m�[2mdebug update with description-file
�[22m�[39mUPDATE STDOUT:
{
"success": true,
"workItem": {
"id": "DBG-0MN7GBAKI1X94TR0",
"title": "To update",
"description": "Debug desc",
"status": "open",
"priority": "medium",
"sortIndex": 100,
"parentId": null,
"createdAt": "2026-03-26T12:31:07.842Z",
"updatedAt": "2026-03-26T12:31:07.868Z",
"tags": [],
"assignee": "",
"stage": "idea",
"issueType": "",
"createdBy": "",
"deletedBy": "",
"deleteReason": "",
"risk": "",
"effort": "",
"needsProducerReview": false
}
}
UPDATE STDERR:
Invalid config: statusStageCompatibility for status "open" references unknown stage "idea"
�[32m✓�[39m tests/debug/update-debug.test.ts �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 84�[2mms�[22m�[39m
�[32m✓�[39m tests/computeScore.nonstack.test.ts �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 63�[2mms�[22m�[39m
�[32m✓�[39m tests/tui/next-dialog-wrap.test.ts �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 68�[2mms�[22m�[39m
�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?1000h�[?1002h�[?1005h�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?1000h�[?1002h�[?1005h�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?1000h�[?1002h�[?1005h�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?1000h�[?1002h�[?1005h �[32m✓�[39m tests/tui/layout.test.ts �[2m(�[22m�[2m8 tests�[22m�[2m)�[22m�[32m 69�[2mms�[22m�[39m
�[?1l�>�[?12l�[?25h�[H�[2J�[?1000l�[?1002l�Ptmux;��[?1003l�\�[?1005l�[?1049l�[?1l�>�[?12l�[?25h�[H�[2J�[?1000l�[?1002l�Ptmux;��[?1003l�\�[?1005l�[?1049l�[?1l�>�[?12l�[?25h�[H�[2J�[?1000l�[?1002l�Ptmux;��[?1003l�\�[?1005l�[?1049l�[?1l�>�[?12l�[?25h�[H�[2J�[?1000l�[?1002l�Ptmux;��[?1003l�\�[?1005l�[?1049l �[32m✓�[39m tests/cli/github-pre-filter-fallback.test.ts �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 60�[2mms�[22m�[39m
�[32m✓�[39m tests/computeScore.nonstack.unit.test.ts �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 61�[2mms�[22m�[39m
�[32m✓�[39m tests/tui/focus-cycling-integration.test.ts �[2m(�[22m�[2m10 tests�[22m�[2m)�[22m�[32m 78�[2mms�[22m�[39m
�[32m✓�[39m tests/cli/inproc-harness.test.ts �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 90�[2mms�[22m�[39m
�[32m✓�[39m tests/computeScore.debug.test.ts �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 62�[2mms�[22m�[39m
�[32m✓�[39m tests/tui/opencode-layout-integration.test.ts �[2m(�[22m�[2m8 tests�[22m�[2m)�[22m�[32m 65�[2mms�[22m�[39m
�[32m✓�[39m tests/cli/github-push-start-timestamp.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[33m 800�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m timestamp is written even when items exist but none have GitHub mapping �[33m 555�[2mms�[22m�[39m
�[32m✓�[39m tests/cli/github-push-force.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[33m 836�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m --all with seeded items shows item count in output �[33m 619�[2mms�[22m�[39m
�[32m✓�[39m tests/tui/controller-watch-integration.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[33m 1017�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m should detect changes when database file is modified �[33m 512�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m should detect changes when WAL file is modified (SQLite WAL mode) �[33m 504�[2mms�[22m�[39m
�[32m✓�[39m test/comment-update.test.ts �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 59�[2mms�[22m�[39m
�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?1000h�[?1002h�[?1005h�7�[1;1H�[1;40;37mP�[m�8�7�[1;1H �8�7�[1;1H�[1;40;37mP�[m�8�7�[1;1H �8�7�[1;1H�[1;40;37mP�[m�8�7�[1;1H �8�7�[1;1H�[1;40;37mP�[m�8�7�[1;1H �8�7�[1;1H�[1;40;37mP�[m�8�7�[1;1H �8�7�[1;1H�[1;40;37mP�[m�8�7�[1;1H �8�7�[1;1H�[1;40;37mP�[m�8�7�[1;1H �8�7�[1;1H�[1;40;37mP�[m�8�7�[1;1H �8�7�[1;1H�[1;40;37mP�[m�8�7�[1;1H �8�7�[1;1H�[1;40;37mP�[m�8�7�[1;1H �8�7�[1;1H�[1;40;37mP�[m�8�7�[1;1H �8�7�[1;1H�[1;40;37mP�[m�8�7�[1;1H �8�7�[1;1H�[1;40;37mP�[m�8�7�[1;1H �8�7�[1;1H�[1;40;37mP�[m�8�7�[1;1H �8�7�[1;1H�[1;40;37mP�[m�8�7�[1;1H �8�7�[1;1H�[1;40;37mP�[m�8�7�[1;1H �8�7�[1;1H�[1;40;37mP�[m�8�7�[1;1H �8�7�[1;1H�[1;40;37mP�[m�8�7�[1;1H �8�7�[1;1H�[1;40;37mP�[m�8�7�[1;1H �8�7�[1;1H�[1;40;37mP�[m�8�7�[1;1H �8�7�[1;1H�[1;40;37mP�[m�8�7�[1;1H �8�7�[1;1H�[1;40;37mP�[m�8�7�[1;1H �8�7�[1;1H�[1;40;37mP�[m�8�7�[1;1H �8�7�[1;1H�[1;40;37mP�[m�8�7�[1;1H �8�7�[1;1H�[1;40;37mP�[m�8�7�[1;1H �8�7�[1;1H�[1;40;37mP�[m�8�7�[1;1H �8�7�[1;1H�[1;40;37mP�[m�8�7�[1;1H �8�7�[1;1H�[1;40;37mP�[m�8�7�[1;1H �8�7�[1;1H�[1;40;37mP�[m�8�7�[1;1H �8�7�[1;1H�[1;40;37mP�[m�8�7�[1;1H �8 �[32m✓�[39m tests/tui/widget-create-destroy-others.test.ts �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 36�[2mms�[22m�[39m
�[32m✓�[39m tests/cli/misc.test.ts �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 64�[2mms�[22m�[39m
�[32m✓�[39m tests/tui/event-cleanup.test.ts �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 42�[2mms�[22m�[39m
�[32m✓�[39m tests/cli/git-mock-roundtrip.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 34�[2mms�[22m�[39m
�[?1049h�[?1h�=�[1;1r�[?25l�[1;1H�[H�[2J�[?1000h�[?1002h�[?1005h�[?1l�>�[?12l�[?25h�[H�[2J�[?1000l�[?1002l�Ptmux;��[?1003l�\�[?1005l�[?1049l �[32m✓�[39m tests/tui/widget-create-destroy.test.ts �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 40�[2mms�[22m�[39m
�[32m✓�[39m tests/tui/persistence-integration.test.ts �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[32m 53�[2mms�[22m�[39m
�[?1l�>�[?12l�[?25h�[H�[2J�[?1000l�[?1002l�Ptmux;��[?1003l�\�[?1005l�[?1049l �[32m✓�[39m tests/tui/tui-50-50-layout.test.ts �[2m(�[22m�[2m9 tests�[22m�[2m)�[22m�[32m 53�[2mms�[22m�[39m
�[32m✓�[39m test/tui-opencode-sse-handler.test.ts �[2m(�[22m�[2m14 tests�[22m�[2m)�[22m�[32m 51�[2mms�[22m�[39m
�[32m✓�[39m tests/tui/clipboard.test.ts �[2m(�[22m�[2m20 tests�[22m�[2m)�[22m�[32m 17�[2mms�[22m�[39m
�[32m✓�[39m tests/jsonl.test.ts �[2m(�[22m�[2m12 tests�[22m�[2m)�[22m�[32m 18�[2mms�[22m�[39m
�[32m✓�[39m tests/github-push-state.test.ts �[2m(�[22m�[2m18 tests�[22m�[2m)�[22m�[32m 20�[2mms�[22m�[39m
�[32m✓�[39m tests/tui/opencode-triple-keypress.repro.test.ts �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 19�[2mms�[22m�[39m
�[32m✓�[39m tests/tui/opencode-session-selection.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 11�[2mms�[22m�[39m
�[32m✓�[39m tests/github-import-label-resolution.test.ts �[2m(�[22m�[2m27 tests�[22m�[2m)�[22m�[32m 13�[2mms�[22m�[39m
�[32m✓�[39m tests/tui/opencode-prompt-input.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 32�[2mms�[22m�[39m
�[32m✓�[39m tests/tui/opencode-activity.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 15�[2mms�[22m�[39m
�[32m✓�[39m tests/lib/github-helper.test.ts �[2m(�[22m�[2m23 tests�[22m�[2m)�[22m�[32m 10�[2mms�[22m�[39m
�[32m✓�[39m tests/tui/controller-watch.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[33m 1228�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m should refresh when database file changes �[33m 412�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m should refresh on every watch event (no mtime filtering) �[33m 409�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m should watch WAL file for SQLite WAL mode �[33m 406�[2mms�[22m�[39m
�[32m✓�[39m tests/github-label-categories.test.ts �[2m(�[22m�[2m42 tests�[22m�[2m)�[22m�[32m 9�[2mms�[22m�[39m
�[32m✓�[39m tests/github-pre-filter.test.ts �[2m(�[22m�[2m35 tests�[22m�[2m)�[22m�[32m 6�[2mms�[22m�[39m
�[90mstdout�[2m | tests/cli/update-do-not-delegate.test.ts�[2m > �[22m�[2mupdate --do-not-delegate�[2m > �[22m�[2madds the tag when true
�[22m�[39mUpdated work item:
Sample WL-TEST-1
Status: Open · Stage: Undefined | Priority: medium
SortIndex: 0
Risk: —
Effort: —
Tags: do-not-delegate
�[90mstdout�[2m | tests/cli/update-do-not-delegate.test.ts�[2m > �[22m�[2mupdate --do-not-delegate�[2m > �[22m�[2mremoves the tag when false
�[22m�[39mUpdated work item:
Sample WL-TEST-1
Status: Open · Stage: Undefined | Priority: medium
SortIndex: 0
Risk: —
Effort: —
�[32m✓�[39m tests/cli/update-do-not-delegate.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 10�[2mms�[22m�[39m
�[32m✓�[39m tests/cli/delegate-guard-rails.test.ts �[2m(�[22m�[2m16 tests�[22m�[2m)�[22m�[32m 11�[2mms�[22m�[39m
�[32m✓�[39m tests/sync.test.ts �[2m(�[22m�[2m20 tests�[22m�[2m | �[22m�[33m1 skipped�[39m�[2m)�[22m�[32m 7�[2mms�[22m�[39m
�[32m✓�[39m tests/github-sync-deleted.test.ts �[2m(�[22m�[2m10 tests�[22m�[2m)�[22m�[32m 8�[2mms�[22m�[39m
�[32m✓�[39m tests/tui/toggle-do-not-delegate.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 18�[2mms�[22m�[39m
�[32m✓�[39m tests/tui/controller.test.ts �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 13�[2mms�[22m�[39m
�[32m✓�[39m tests/github-sync-output.test.ts �[2m(�[22m�[2m9 tests�[22m�[2m)�[22m�[32m 7�[2mms�[22m�[39m
�[32m✓�[39m tests/tui/opencode-sse.test.ts �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[32m 4�[2mms�[22m�[39m
�[90mstdout�[2m | tests/cli/reviewed.test.ts�[2m > �[22m�[2mreviewed command�[2m > �[22m�[2mtoggles needsProducerReview when value omitted
�[22m�[39mneedsProducerReview set to true for WL-TEST-1
�[90mstdout�[2m | tests/cli/reviewed.test.ts�[2m > �[22m�[2mreviewed command�[2m > �[22m�[2msets needsProducerReview when value provided
�[22m�[39mneedsProducerReview set to true for WL-TEST-1
�[90mstdout�[2m | tests/cli/reviewed.test.ts�[2m > �[22m�[2mreviewed command�[2m > �[22m�[2msets needsProducerReview when value provided
�[22m�[39mneedsProducerReview set to false for WL-TEST-1
�[32m✓�[39m tests/cli/reviewed.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 4�[2mms�[22m�[39m
�[32m✓�[39m tests/github-label-resolution.test.ts �[2m(�[22m�[2m16 tests�[22m�[2m)�[22m�[32m 6�[2mms�[22m�[39m
�[32m✓�[39m tests/github-sync-comments.test.ts �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[32m 6�[2mms�[22m�[39m
�[32m✓�[39m tests/github-sync-self-link.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 4�[2mms�[22m�[39m
�[32m✓�[39m tests/github-comment-import-push.test.ts �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[32m 6�[2mms�[22m�[39m
�[32m✓�[39m tests/tui/autocomplete-widget.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 7�[2mms�[22m�[39m
�[32m✓�[39m tests/cli/unlock.test.ts �[2m(�[22m�[2m10 tests�[22m�[2m)�[22m�[32m 24�[2mms�[22m�[39m
�[32m✓�[39m tests/tui/persistence.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 4�[2mms�[22m�[39m
�[32m✓�[39m tests/tui/move-mode.test.ts �[2m(�[22m�[2m12 tests�[22m�[2m)�[22m�[32m 4�[2mms�[22m�[39m
�[32m✓�[39m tests/tui/status-stage-validation.test.ts �[2m(�[22m�[2m8 tests�[22m�[2m)�[22m�[32m 5�[2mms�[22m�[39m
�[32m✓�[39m tests/tui/state.test.ts �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[32m 3�[2mms�[22m�[39m
�[32m✓�[39m test/tui-style.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 3�[2mms�[22m�[39m
�[32m✓�[39m tests/cli/action-opts-normalization.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 3�[2mms�[22m�[39m
�[32m✓�[39m tests/audit.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 2�[2mms�[22m�[39m
�[32m✓�[39m test/tui/id-utils.test.ts �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[32m 3�[2mms�[22m�[39m
�[32m✓�[39m test/doctor-dependency-check.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 3�[2mms�[22m�[39m
�[32m✓�[39m tests/tui/shutdown-flow.test.ts �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 2�[2mms�[22m�[39m
�[32m✓�[39m tests/tui/autocomplete.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 2�[2mms�[22m�[39m
�[32m✓�[39m test/doctor-status-stage.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 2�[2mms�[22m�[39m
�[2m�[90m↓�[39m�[22m tests/lockless-reads.test.ts �[2m(�[22m�[2m1 test�[22m�[2m | �[22m�[33m1 skipped�[39m�[2m)�[22m
�[32m✓�[39m tests/tui/tui-state.test.ts �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[32m 2�[2mms�[22m�[39m
�[32m✓�[39m tests/plugin-integration.test.ts �[2m(�[22m�[2m14 tests�[22m�[2m)�[22m�[33m 1787�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m should load and execute a simple external plugin �[33m 306�[2mms�[22m�[39m
�[32m✓�[39m tests/github-label-events.test.ts �[2m(�[22m�[2m33 tests�[22m�[2m)�[22m�[33m 2026�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m returns empty array and caches on API failure �[33m 2015�[2mms�[22m�[39m
�[32m✓�[39m tests/cli/update-batch.test.ts �[2m(�[22m�[2m25 tests�[22m�[2m)�[22m�[33m 2070�[2mms�[22m�[39m
�[32m✓�[39m tests/fts-search.test.ts �[2m(�[22m�[2m68 tests�[22m�[2m)�[22m�[33m 2702�[2mms�[22m�[39m
�[32m✓�[39m tests/cli/fresh-install.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[33m 2713�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m wl init --json produces clean stderr (no plugin errors) �[33m 489�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m wl stats --json returns valid JSON after fresh init �[33m 863�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m wl list --json --verbose shows no plugin errors �[33m 677�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m first-init and re-init both include statsPlugin in JSON �[33m 683�[2mms�[22m�[39m
�[32m✓�[39m tests/github-assign-issue.test.ts �[2m(�[22m�[2m11 tests�[22m�[2m)�[22m�[33m 3512�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m retries on rate-limit errors �[33m 1503�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m retries on 403 errors �[33m 502�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m returns error after exhausting retries on persistent rate limit �[33m 1502�[2mms�[22m�[39m
�[32m✓�[39m tests/cli/issue-status.test.ts �[2m(�[22m�[2m41 tests�[22m�[2m)�[22m�[33m 3191�[2mms�[22m�[39m
�[32m✓�[39m tests/sort-operations.test.ts �[2m(�[22m�[2m40 tests�[22m�[2m)�[22m�[33m 3538�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m should handle 1000 items efficiently �[33m 400�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m should handle 1000 items per hierarchy level �[33m 387�[2mms�[22m�[39m
�[31m❯�[39m tests/next-regression.test.ts �[2m(�[22m�[2m73 tests�[22m�[2m | �[22m�[31m3 failed�[39m�[2m)�[22m�[33m 3607�[2mms�[22m�[39m
�[32m✓�[39m should never return a deleted item even if it has the highest priority�[32m 42�[2mms�[22m�[39m
�[32m✓�[39m should return null when only deleted items exist�[32m 42�[2mms�[22m�[39m
�[32m✓�[39m should filter deleted items from batch results�[32m 43�[2mms�[22m�[39m
�[32m✓�[39m should promote open child under completed parent to root level�[32m 46�[2mms�[22m�[39m
�[32m✓�[39m should promote deeply nested orphan when all ancestors are completed�[32m 44�[2mms�[22m�[39m
�[32m✓�[39m should promote orphan under deleted parent to root level�[32m 49�[2mms�[22m�[39m
�[32m✓�[39m should NOT promote child when parent is open�[32m 45�[2mms�[22m�[39m
�[32m✓�[39m should surface a childless epic as a candidate�[32m 45�[2mms�[22m�[39m
�[32m✓�[39m should surface a critical childless epic over lower-priority non-epics�[32m 45�[2mms�[22m�[39m
�[32m✓�[39m should descend into epic children when they exist�[32m 48�[2mms�[22m�[39m
�[32m✓�[39m should return the epic itself when all children are completed�[32m 48�[2mms�[22m�[39m
�[32m✓�[39m should return unique items in batch mode�[32m 49�[2mms�[22m�[39m
�[32m✓�[39m should not return duplicates when requesting more items than available�[32m 47�[2mms�[22m�[39m
�[32m✓�[39m should return unique items with hierarchy�[32m 46�[2mms�[22m�[39m
�[32m✓�[39m should exclude blocked in_review items by default�[32m 40�[2mms�[22m�[39m
�[31m �[31m�[31m should include blocked in_review items when includeInReview=true�[39m�[32m 57�[2mms�[22m�[39m
�[32m✓�[39m should return null when only in-review items exist and flag is off�[32m 48�[2mms�[22m�[39m
�[32m✓�[39m should prefer higher-priority open item over blocker of lower-priority blocked item�[32m 36�[2mms�[22m�[39m
�[32m✓�[39m should prefer blocker when blocked item has higher priority than all competitors�[32m 48�[2mms�[22m�[39m
�[32m✓�[39m should prefer blocker when blocked item has equal priority to best competitor�[32m 54�[2mms�[22m�[39m
�[32m✓�[39m should prefer higher-priority open item over child blocker of lower-priority blocked item�[32m 49�[2mms�[22m�[39m
�[32m✓�[39m should prefer child blocker when blocked parent has critical priority�[32m 45�[2mms�[22m�[39m
�[32m✓�[39m should not return a dependency-blocked item by default�[32m 45�[2mms�[22m�[39m
�[32m✓�[39m should return a dependency-blocked item when includeBlocked=true�[32m 46�[2mms�[22m�[39m
�[32m✓�[39m should not filter items whose dependency target is completed (edge inactive)�[32m 46�[2mms�[22m�[39m
�[32m✓�[39m should still surface blockers for critical dep-blocked items�[32m 44�[2mms�[22m�[39m
�[32m✓�[39m should not return a dep-blocked in-progress item�[32m 47�[2mms�[22m�[39m
�[32m✓�[39m should prefer item blocking a critical downstream item over equal-priority peer�[32m 42�[2mms�[22m�[39m
�[32m✓�[39m should prefer item blocking a high downstream item over equal-priority peer�[32m 45�[2mms�[22m�[39m
�[32m✓�[39m should preserve priority dominance: high beats medium that blocks high�[32m 49�[2mms�[22m�[39m
�[32m✓�[39m should prefer item blocking critical over item blocking only high�[32m 43�[2mms�[22m�[39m
�[32m✓�[39m should NOT boost an item that only blocks low/medium priority items�[32m 122�[2mms�[22m�[39m
�[32m✓�[39m should not boost for completed or deleted downstream items�[32m 115�[2mms�[22m�[39m
�[32m✓�[39m should select oldest item when priorities are equal�[32m 53�[2mms�[22m�[39m
�[32m✓�[39m should select oldest item in batch mode as first result�[32m 62�[2mms�[22m�[39m
�[32m✓�[39m should exclude blocked+in_review by default�[32m 42�[2mms�[22m�[39m
�[32m✓�[39m should include blocked+in_review when includeInReview=true�[32m 42�[2mms�[22m�[39m
�[32m✓�[39m should not affect blocked items without in_review stage�[32m 38�[2mms�[22m�[39m
�[32m✓�[39m should not affect open items with in_review stage (edge case)�[32m 41�[2mms�[22m�[39m
�[31m �[31m�[31m should ignore blocking issues mentioned in description�[39m�[32m 36�[2mms�[22m�[39m
�[31m �[31m�[31m should ignore blocking issues mentioned in comments�[39m�[32m 48�[2mms�[22m�[39m
�[32m✓�[39m should prefer medium-priority unblocker over equal-priority peers when it blocks a high-priority item�[32m 97�[2mms�[22m�[39m
�[32m✓�[39m should select unblocked high-priority item over medium unblocker�[32m 87�[2mms�[22m�[39m
�[32m✓�[39m should not return in-progress item when it has no open children�[32m 41�[2mms�[22m�[39m
�[32m✓�[39m should select direct child under in-progress item�[32m 36�[2mms�[22m�[39m
�[32m✓�[39m should skip in-progress item and select next open item when no open children�[32m 49�[2mms�[22m�[39m
�[32m✓�[39m should descend into best child of selected root�[32m 38�[2mms�[22m�[39m
�[32m✓�[39m should select among root-level candidates using sortIndex�[32m 36�[2mms�[22m�[39m
�[32m✓�[39m should surface blocker of critical item assigned to a different user�[32m 54�[2mms�[22m�[39m
�[32m✓�[39m should surface dep-edge blocker of critical item from full set�[32m 53�[2mms�[22m�[39m
�[32m✓�[39m should prefer unblocked critical over non-critical items regardless of sortIndex�[32m 50�[2mms�[22m�[39m
�[32m✓�[39m should select among multiple unblocked criticals by sortIndex�[32m 34�[2mms�[22m�[39m
�[32m✓�[39m should fall back to priority+age when all criticals have same sortIndex�[32m 48�[2mms�[22m�[39m
�[32m✓�[39m should return blocked critical as last resort when no blockers found�[32m 48�[2mms�[22m�[39m
�[32m✓�[39m should not surface blocked+in_review critical when includeInReview is false�[32m 42�[2mms�[22m�[39m
�[32m✓�[39m should surface blocked+in_review critical when includeInReview is true�[32m 34�[2mms�[22m�[39m
�[32m✓�[39m should surface blocker from outside search filter for critical item�[32m 41�[2mms�[22m�[39m
�[32m✓�[39m should handle critical with both child and dep-edge blockers�[32m 34�[2mms�[22m�[39m
�[32m✓�[39m should skip excluded blockers in batch mode�[32m 45�[2mms�[22m�[39m
�[32m✓�[39m should elevate a low-priority item that blocks a critical item via dependency edge�[32m 63�[2mms�[22m�[39m
�[32m✓�[39m should prefer higher effective priority over raw priority when sortIndex values are equal�[32m 56�[2mms�[22m�[39m
�[32m✓�[39m should inherit priority from parent via parent-child relationship�[32m 64�[2mms�[22m�[39m
�[32m✓�[39m should not inherit priority from completed dependents�[32m 56�[2mms�[22m�[39m
�[32m✓�[39m should not inherit priority from deleted parent�[32m 46�[2mms�[22m�[39m
�[32m✓�[39m should take the maximum of own priority and inherited priority�[32m 60�[2mms�[22m�[39m
�[32m✓�[39m should include effective priority info in reason string when priority is inherited�[32m 61�[2mms�[22m�[39m
�[32m✓�[39m should show own priority in reason when no inheritance occurs�[32m 34�[2mms�[22m�[39m
�[32m✓�[39m should inherit the highest priority among multiple dependents�[32m 72�[2mms�[22m�[39m
�[32m✓�[39m should use effective priority in batch mode across multiple selections�[32m 69�[2mms�[22m�[39m
�[32m✓�[39m computeEffectivePriority returns correct result for item with no dependents�[32m 35�[2mms�[22m�[39m
�[32m✓�[39m computeEffectivePriority returns inherited priority from dependency edge�[32m 32�[2mms�[22m�[39m
�[32m✓�[39m computeEffectivePriority returns inherited priority from parent�[32m 31�[2mms�[22m�[39m
�[32m✓�[39m computeEffectivePriority uses cache for repeated calls�[32m 35�[2mms�[22m�[39m
�[32m✓�[39m tests/cli/init.test.ts �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[33m 3733�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m should insert the AGENTS.md pointer line when an existing file is present �[33m 422�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m should not duplicate the AGENTS.md pointer line on re-run �[33m 469�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m should create semaphore when config exists but semaphore does not �[33m 390�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m should allow init command without initialization �[33m 1003�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m should sync remote work items on init in new checkout �[33m 540�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m should place .worklog in main repo when initializing �[33m 406�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m should find main repo .worklog when in subdirectory �[33m 501�[2mms�[22m�[39m
�[32m✓�[39m tests/cli/issue-management.test.ts �[2m(�[22m�[2m48 tests�[22m�[2m)�[22m�[33m 4332�[2mms�[22m�[39m
�[32m✓�[39m tests/cli/github-push-batching.test.ts �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[33m 4513�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m --id with a valid item pushes only that item (command completes without error) �[33m 557�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m --id honours --no-update-timestamp �[33m 585�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m --id writes timestamp when --no-update-timestamp is not set �[33m 582�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m push with many items completes and writes timestamp (batching path) �[33m 1527�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m push with exactly BATCH_SIZE items completes successfully (single batch) �[33m 1194�[2mms�[22m�[39m
�[31m❯�[39m tests/database.test.ts �[2m(�[22m�[2m143 tests�[22m�[2m | �[22m�[31m5 failed�[39m�[2m | �[22m�[33m3 skipped�[39m�[2m)�[22m�[33m 4858�[2mms�[22m�[39m
�[32m✓�[39m should create a work item with required fields�[32m 44�[2mms�[22m�[39m
�[32m✓�[39m should create a work item with all optional fields�[32m 41�[2mms�[22m�[39m
�[32m✓�[39m should create a work item with a structured audit�[32m 42�[2mms�[22m�[39m
�[32m✓�[39m should create a work item with a parent�[32m 44�[2mms�[22m�[39m
�[32m✓�[39m should generate unique IDs for multiple items�[32m 44�[2mms�[22m�[39m
�[32m✓�[39m should normalize underscore-form status on create�[32m 48�[2mms�[22m�[39m
�[32m✓�[39m should normalize underscore-form status on update�[32m 44�[2mms�[22m�[39m
�[32m✓�[39m should leave already-hyphenated status unchanged�[32m 48�[2mms�[22m�[39m
�[32m✓�[39m should normalize status when querying with underscore form�[32m 48�[2mms�[22m�[39m
�[32m✓�[39m should retrieve a work item by ID�[32m 42�[2mms�[22m�[39m
�[32m✓�[39m should return null for non-existent ID�[32m 44�[2mms�[22m�[39m
�[32m✓�[39m should list all work items when no filters are provided�[32m 52�[2mms�[22m�[39m
�[32m✓�[39m should filter by status�[32m 50�[2mms�[22m�[39m
�[32m✓�[39m should filter by priority�[32m 48�[2mms�[22m�[39m
�[32m✓�[39m should filter by status and priority�[32m 44�[2mms�[22m�[39m
�[32m✓�[39m should filter by tags�[32m 46�[2mms�[22m�[39m
�[32m✓�[39m should filter by assignee�[32m 49�[2mms�[22m�[39m
�[32m✓�[39m should filter by parentId null (root items)�[32m 39�[2mms�[22m�[39m
�[32m✓�[39m should filter by needsProducerReview true�[32m 46�[2mms�[22m�[39m
�[32m✓�[39m should filter by needsProducerReview false�[32m 51�[2mms�[22m�[39m
�[32m✓�[39m should update a work item title�[32m 55�[2mms�[22m�[39m
�[32m✓�[39m should update multiple fields�[32m 47�[2mms�[22m�[39m
�[32m✓�[39m should update structured audit fields�[32m 45�[2mms�[22m�[39m
�[32m✓�[39m should return null for non-existent ID�[32m 49�[2mms�[22m�[39m
�[32m✓�[39m should delete a work item�[32m 49�[2mms�[22m�[39m
�[32m✓�[39m should not regress deleted status after dependent reconciliation�[32m 53�[2mms�[22m�[39m
�[32m✓�[39m should return false for non-existent ID�[32m 38�[2mms�[22m�[39m
�[32m✓�[39m should return children of a work item�[32m 44�[2mms�[22m�[39m
�[32m✓�[39m should return empty array for item with no children�[32m 42�[2mms�[22m�[39m
�[32m✓�[39m should return all descendants including nested children�[32m 48�[2mms�[22m�[39m
�[32m✓�[39m should create a comment�[32m 45�[2mms�[22m�[39m
�[32m✓�[39m should create a comment with references�[32m 38�[2mms�[22m�[39m
�[32m✓�[39m should get a comment by ID�[32m 44�[2mms�[22m�[39m
�[32m✓�[39m should list comments for a work item�[32m 55�[2mms�[22m�[39m
�[32m✓�[39m should update a comment�[32m 42�[2mms�[22m�[39m
�[32m✓�[39m should delete a comment�[32m 43�[2mms�[22m�[39m
�[32m✓�[39m should add and list outbound dependency edges�[32m 37�[2mms�[22m�[39m
�[32m✓�[39m should list inbound dependency edges�[32m 52�[2mms�[22m�[39m
�[32m✓�[39m should remove dependency edges�[32m 44�[2mms�[22m�[39m
�[32m✓�[39m should return null when adding edge with missing items�[32m 41�[2mms�[22m�[39m
�[32m✓�[39m should open a blocked dependent when dependency is removed and no blockers remain�[32m 39�[2mms�[22m�[39m
�[32m✓�[39m should keep blocked status when other active blockers remain�[32m 43�[2mms�[22m�[39m
�[32m✓�[39m should unblock dependents when target becomes inactive�[32m 41�[2mms�[22m�[39m
�[32m✓�[39m should unblock dependent when blocker is closed via status completed�[32m 43�[2mms�[22m�[39m
�[32m✓�[39m should keep dependent blocked when one of multiple blockers is closed�[32m 48�[2mms�[22m�[39m
�[32m✓�[39m should unblock dependent when all blockers are closed�[32m 49�[2mms�[22m�[39m
�[32m✓�[39m should not change completed dependent when blocker is closed�[32m 50�[2mms�[22m�[39m
�[32m✓�[39m should not change deleted dependent when blocker is closed�[32m 41�[2mms�[22m�[39m
�[32m✓�[39m should be idempotent: closing an already-completed blocker is a no-op�[32m 39�[2mms�[22m�[39m
�[32m✓�[39m should handle chain dependencies: A blocks B blocks C�[32m 44�[2mms�[22m�[39m
�[32m✓�[39m should unblock dependent when blocker is deleted�[32m 41�[2mms�[22m�[39m
�[32m✓�[39m should re-block dependent when closed blocker is reopened�[32m 45�[2mms�[22m�[39m
�[32m✓�[39m should unblock multiple dependents when their shared blocker is closed�[32m 34�[2mms�[22m�[39m
�[32m✓�[39m should emit debug log to stderr when WL_DEBUG is set and dependent is unblocked�[32m 47�[2mms�[22m�[39m
�[32m✓�[39m should not emit debug log when WL_DEBUG is not set during reconciliation�[32m 42�[2mms�[22m�[39m
�[32m✓�[39m should unblock dependent when sole blocker moves to in_review stage�[32m 39�[2mms�[22m�[39m
�[32m✓�[39m should keep dependent blocked when one of multiple blockers moves to in_review�[32m 42�[2mms�[22m�[39m
�[32m✓�[39m should unblock dependent when all blockers move to in_review�[32m 38�[2mms�[22m�[39m
�[32m✓�[39m should unblock dependent when mix of in_review and completed blockers are all non-blocking�[32m 38�[2mms�[22m�[39m
�[32m✓�[39m should be idempotent: moving blocker to in_review multiple times does not break state�[32m 48�[2mms�[22m�[39m
�[32m✓�[39m should re-block dependent when blocker moves back from in_review to in_progress�[32m 36�[2mms�[22m�[39m
�[32m✓�[39m should unblock multiple dependents when their shared blocker moves to in_review�[32m 39�[2mms�[22m�[39m
�[32m✓�[39m should import work items�[32m 38�[2mms�[22m�[39m
�[2m�[90m↓�[39m�[22m should record lastJsonlExportMtime in metadata after export
�[32m✓�[39m should return null when no work items exist�[32m 34�[2mms�[22m�[39m
�[32m✓�[39m should return the only open item when no in-progress items exist�[32m 38�[2mms�[22m�[39m
�[32m✓�[39m should return highest priority item when multiple open items exist�[32m 39�[2mms�[22m�[39m
�[32m✓�[39m should return oldest item when priorities are equal�[32m 47�[2mms�[22m�[39m
�[32m✓�[39m should select direct child under in-progress item�[32m 40�[2mms�[22m�[39m
�[32m✓�[39m should skip completed and deleted items�[32m 37�[2mms�[22m�[39m
�[32m✓�[39m should never return an in-progress item as a candidate�[32m 31�[2mms�[22m�[39m
�[32m✓�[39m should return null when only in-progress items exist�[32m 42�[2mms�[22m�[39m
�[32m✓�[39m should find open children of in-progress parent without returning the parent�[32m 30�[2mms�[22m�[39m
�[32m✓�[39m should exclude blocked in_review items by default�[32m 38�[2mms�[22m�[39m
�[31m �[31m�[31m should include blocked in_review items when requested�[39m�[32m 41�[2mms�[22m�[39m
�[32m✓�[39m should filter by assignee when provided�[32m 36�[2mms�[22m�[39m
�[32m✓�[39m should filter by search term in title�[32m 47�[2mms�[22m�[39m
�[32m✓�[39m should filter by search term in description�[32m 37�[2mms�[22m�[39m
�[32m✓�[39m should filter by search term in comments�[32m 37�[2mms�[22m�[39m
�[32m✓�[39m should filter by search term in id�[32m 41�[2mms�[22m�[39m
�[32m✓�[39m should not return in-progress item when it has no suitable children�[32m 44�[2mms�[22m�[39m
�[32m✓�[39m should skip in-progress item with no children and select next open item�[32m 38�[2mms�[22m�[39m
�[31m �[31m�[31m should select highest priority child when multiple children exist�[39m�[32m 48�[2mms�[22m�[39m
�[32m✓�[39m should apply assignee filter to children�[32m 31�[2mms�[22m�[39m
�[32m✓�[39m should apply search filter to children�[32m 32�[2mms�[22m�[39m
�[32m✓�[39m should select blocking child for blocked item�[32m 28�[2mms�[22m�[39m
�[32m✓�[39m should select dependency blocker for blocked item�[32m 34�[2mms�[22m�[39m
�[31m �[31m�[31m should ignore blocking issues mentioned in description�[39m�[32m 25�[2mms�[22m�[39m
�[31m �[31m�[31m should ignore blocking issues mentioned in comments�[39m�[32m 29�[2mms�[22m�[39m
�[32m✓�[39m should prefer higher-priority open item over blocker of lower-priority blocked item�[32m 32�[2mms�[22m�[39m
�[32m✓�[39m should prefer blocker when blocked item has higher priority than competing open items�[32m 25�[2mms�[22m�[39m
�[32m✓�[39m should prefer blocker when blocked item has equal priority to best competing open item�[32m 30�[2mms�[22m�[39m
�[32m✓�[39m should prefer blocker when no competing open items exist�[32m 29�[2mms�[22m�[39m
�[32m✓�[39m should prefer higher-priority open item over child blocker of lower-priority blocked item�[32m 22�[2mms�[22m�[39m
�[32m✓�[39m should prefer blocker of higher-priority blocked item over lower-priority open items with child blockers�[32m 27�[2mms�[22m�[39m
�[31m �[31m�[31m Phase 4: sibling wins over child of lower-priority parent (Example 1)�[39m�[32m 37�[2mms�[22m�[39m
�[32m✓�[39m Phase 4: child wins when parent priority >= sibling (Example 2)�[32m 35�[2mms�[22m�[39m
�[32m✓�[39m Phase 4: low-priority child wins when parent priority >= sibling (Example 3)�[32m 36�[2mms�[22m�[39m
�[32m✓�[39m Phase 4: top-level items without children are selected normally�[32m 33�[2mms�[22m�[39m
�[32m✓�[39m Phase 4: top-level item with children descends to best child�[32m 40�[2mms�[22m�[39m
�[32m✓�[39m should not return a dependency-blocked item by default�[32m 27�[2mms�[22m�[39m
�[32m✓�[39m should return a dependency-blocked item when includeBlocked=true�[32m 23�[2mms�[22m�[39m
�[32m✓�[39m should return a dep-blocked item whose blocker is completed (edge inactive)�[32m 26�[2mms�[22m�[39m
�[32m✓�[39m should still surface blockers for critical dep-blocked items�[32m 28�[2mms�[22m�[39m
�[32m✓�[39m should not affect items with no dependency edges (regression guard)�[32m 29�[2mms�[22m�[39m
�[32m✓�[39m should not return a dep-blocked in-progress item�[32m 31�[2mms�[22m�[39m
�[32m✓�[39m should prefer item blocking a critical downstream item over equal-priority peer�[32m 27�[2mms�[22m�[39m
�[32m✓�[39m should prefer item blocking a high downstream item over equal-priority peer blocking nothing�[32m 25�[2mms�[22m�[39m
�[32m✓�[39m should preserve priority dominance: high-priority item beats medium that blocks high�[32m 31�[2mms�[22m�[39m
�[32m✓�[39m should prefer item blocking multiple high-priority items over one blocking a single high-priority item�[32m 27�[2mms�[22m�[39m
�[32m✓�[39m should fall through to existing heuristics when blocks-high-priority scores are equal�[32m 32�[2mms�[22m�[39m
�[32m✓�[39m should NOT boost an item that only blocks low/medium priority items�[32m 48�[2mms�[22m�[39m
�[32m✓�[39m should not boost for completed or deleted downstream items�[32m 57�[2mms�[22m�[39m
�[32m✓�[39m should prefer medium-priority unblocker over equal-priority peers when it blocks a high-priority item�[32m 31�[2mms�[22m�[39m
�[32m✓�[39m should include unblocking context in the reason string�[32m 28�[2mms�[22m�[39m
�[32m✓�[39m should select a high-priority item over the medium unblocker when one exists and is unblocked�[32m 28�[2mms�[22m�[39m
�[32m✓�[39m should not surface open child under completed parent before a root-level open item with higher sortIndex�[32m 18�[2mms�[22m�[39m
�[32m✓�[39m should promote deeply nested orphan to root level when all ancestors are completed�[32m 16�[2mms�[22m�[39m
�[32m✓�[39m should not promote child when parent is still open (non-completed)�[32m 14�[2mms�[22m�[39m
�[32m✓�[39m should promote orphan under deleted parent to root level�[32m 18�[2mms�[22m�[39m
�[32m✓�[39m should surface a childless epic as a candidate�[32m 11�[2mms�[22m�[39m
�[32m✓�[39m should surface a critical childless epic over lower-priority non-epics�[32m 11�[2mms�[22m�[39m
�[32m✓�[39m should descend into epic children when they exist�[32m 10�[2mms�[22m�[39m
�[32m✓�[39m should return the epic itself when all children are completed�[32m 11�[2mms�[22m�[39m
�[32m✓�[39m should fall back to cached SQLite data when JSONL is corrupted�[32m 11�[2mms�[22m�[39m
�[2m�[90m↓�[39m�[22m should emit debug log to stderr when WL_DEBUG is set and JSONL is corrupted
�[2m�[90m↓�[39m�[22m should not throw when JSONL file is deleted between existsSync and statSync
�[32m✓�[39m should not emit debug log when WL_DEBUG is not set and JSONL is corrupted�[32m 17�[2mms�[22m�[39m
�[32m✓�[39m should re-sort active items by score and reassign sortIndex�[32m 10�[2mms�[22m�[39m
�[32m✓�[39m should not re-sort completed or deleted items�[32m 8�[2mms�[22m�[39m
�[32m✓�[39m should accept a recency policy parameter�[32m 8�[2mms�[22m�[39m
�[32m✓�[39m should accept a custom gap parameter�[32m 10�[2mms�[22m�[39m
�[32m✓�[39m should cause findNextWorkItem to select high priority item despite stale sortIndex�[32m 8�[2mms�[22m�[39m
�[32m✓�[39m should preserve stale sortIndex order when reSort is NOT called (--no-re-sort behavior)�[32m 10�[2mms�[22m�[39m
�[32m✓�[39m should change ordering based on recency policy (prefer vs avoid)�[32m 10�[2mms�[22m�[39m
�[32m✓�[39m should boost an in-progress item above a same-priority open item�[32m 11�[2mms�[22m�[39m
�[32m✓�[39m should boost an ancestor of an in-progress item above a same-priority open item�[32m 12�[2mms�[22m�[39m
�[32m✓�[39m should apply only the in-progress boost (not ancestor boost) when item is itself in-progress�[32m 18�[2mms�[22m�[39m
�[32m✓�[39m should not boost a blocked item even if it is an ancestor of an in-progress item�[32m 13�[2mms�[22m�[39m
�[32m✓�[39m should not modify the stored priority field when applying in-progress boost�[32m 10�[2mms�[22m�[39m
�[32m✓�[39m should still boost ancestor when multiple in-progress children exist at different depths�[32m 12�[2mms�[22m�[39m
�[32m✓�[39m should boost all ancestors when in-progress items exist at multiple depths�[32m 9�[2mms�[22m�[39m
�[32m✓�[39m should not boost ancestor when in-progress child is completed�[32m 9�[2mms�[22m�[39m
�[32m✓�[39m tests/file-lock.test.ts �[2m(�[22m�[2m73 tests�[22m�[2m)�[22m�[33m 24173�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m should respect the timeout option �[33m 302�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m should recover from corrupted lock file with garbage content �[33m 1534�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m should recover from an empty lock file (0 bytes) �[33m 2414�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m should recover from lock file with valid JSON but missing required fields �[33m 3516�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m should use increasing delays between retry attempts �[33m 2002�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m should cap delay at maxRetryDelay �[33m 5002�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m should add jitter within 0-25% of base delay �[33m 5002�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m should serialize writes when workers run concurrently (parallel spawn) �[33m 348�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m should log stale lock cleanup reason when lock is corrupted �[33m 1574�[2mms�[22m�[39m
�[2m Test Files �[22m �[1m�[31m2 failed�[39m�[22m�[2m | �[22m�[1m�[32m104 passed�[39m�[22m�[2m | �[22m�[33m1 skipped�[39m�[90m (107)�[39m
�[2m Tests �[22m �[1m�[31m8 failed�[39m�[22m�[2m | �[22m�[1m�[32m1287 passed�[39m�[22m�[2m | �[22m�[33m8 skipped�[39m�[90m (1303)�[39m
�[2m Start at �[22m 12:31:06
�[2m Duration �[22m 24.62s�[2m (transform 8.67s, setup 1.47s, import 17.34s, tests 80.13s, environment 10ms)�[22m).
Implementation plan:
- Reproduce failing tests individually with debug logs.
- Modify to either pass into computeScore during tie-break, or constrain tie-break to deterministic score components.
- Add unit tests in covering priority dominance, blocks boost boundaries, and ancestor in-progress boost behavior.
- Run full test suite and iterate until green.
Notes:
- Keep changes minimal and well-scoped.
- Reference this work item id in all commits and comments.
,--issue-type:bug,--priority:high,--json:true