[CL-CTRL-PLANE-FIX] Phase 8.1 pending-tasks async marker carve-out in description #8

Merged
andrei merged 1 commit from feature/claude-pending-tasks-async-desc-20260517 into master 2026-05-18 07:28:27 +00:00
Owner

Phase 8 v1 scanned async marker only in task subject. Operators put marker in description via TaskUpdate. Result false-positive PENDING TASKS feedback each Stop, evidence reset, recurring pain.

Fix tracks taskDescription via TaskUpdate.input.description plus TaskCreate payload pairing. isAsyncMarked scans subject AND description. Plus 2 new tests.

CEO 2026-05-17 fixi enforcers. Resolves recurring false-positive enforcement loop on legitimate async background work.

Tests new 3/3, regression 22/22, DOCTOR_RUN_TESTS=1 ALL CHECKS PASSED (400 tests), 16/16 MCP.

Phase 8 v1 scanned async marker only in task subject. Operators put marker in description via TaskUpdate. Result false-positive PENDING TASKS feedback each Stop, evidence reset, recurring pain. Fix tracks taskDescription via TaskUpdate.input.description plus TaskCreate payload pairing. isAsyncMarked scans subject AND description. Plus 2 new tests. CEO 2026-05-17 fixi enforcers. Resolves recurring false-positive enforcement loop on legitimate async background work. Tests new 3/3, regression 22/22, DOCTOR_RUN_TESTS=1 ALL CHECKS PASSED (400 tests), 16/16 MCP.
[CL-CTRL-PLANE-FIX] Phase 8.1: pending-tasks-enforcer async marker carve-out in description
Some checks failed
Forgejo Smoke Test / Smoke (pull_request) Has been cancelled
216c690b9a
## Что сделано

- `pending-tasks-enforcer.js`: track `taskDescription` через TaskUpdate.input.description + TaskCreate payload pairing. `isAsyncMarked()` теперь сканирует subject AND description.
- New test `__tests__/pending-tasks-async-desc-20260517.test.js`: 3 кейса (TaskUpdate desc marker, TaskCreate desc marker, regression on plain pending).
- New test `__tests__/control-plane-baseline-20260517.test.js`: 5 инвариантов MANIFEST.json + dead mcp.json absence.

## Зачем

CEO 2026-05-17 «исправь енфорсы». Phase 8 v1 (2026-05-02) сканировал `(async)` маркер только в subject. Операторы помещают маркер в description через TaskUpdate (естественное место — descriptions длиннее). Результат: legitimate async tasks помечались как stale → Stop hook fires PENDING TASKS → tool-skill-pretool-gate сбрасывал evidence окно → recurring false-positive enforcement loop на каждый turn.

Phase 8.1 extends carve-out на description tracking. Backward-compatible: subject-only marker всё ещё работает. Не сужает поведение, не ломает existing test L247 в tool-skill-gate.test.js (там pending без любого marker → reset evidence корректно).

## План тестирования

- [x] New test `pending-tasks-async-desc-20260517.test.js`: 3/3 PASS
- [x] Regression `pending-tasks-async-aware.test.js`: 7/7 PASS (Phase 8 subject carve-out preserved)
- [x] Regression `pending-tasks-enforcer.test.js`: 7/7 PASS
- [x] Regression `pending-tasks.test.js`: 8/8 PASS
- [x] Full hook sweep: DOCTOR_RUN_TESTS=1 claude-doctor → ALL CHECKS PASSED (400 tests)
- [x] claude-doctor: 0 failures
- [x] 16/16 MCP connected

## Где могу ошибаться

- `_lastTaskCreatePayload` уровень модуля, не per-id. Если несколько TaskCreate вызовов до tool_result, последний выигрывает (rare race in chained TaskCreate). Edge case acceptable — covered by tool_result pairing right after each TaskCreate.
- TaskUpdate без description в input не очищает старое значение (last-write-wins на set, не на unset). Намеренно: TaskUpdate updates fields, не replaces task.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
andrei merged commit 5ea770b752 into master 2026-05-18 07:28:27 +00:00
andrei referenced this pull request from a commit 2026-05-18 07:28:27 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
europa-tech-srl/claude-dotfiles!8
No description provided.