You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
## Summary
Codex L2 food trucks can be killed by the raw stdout byte-idle watchdog
while doing legitimate long MCP work. The immediate failure is not just
a low timeout; it is an architectural mismatch between independent
timeout scalars and actual backend liveness.
Today, Codex builders copy `run_skill.stream_idle_timeout_ms` into
`CmdSpec.process_idle_timeout_ms`, and `_execute_claude_headless()`
treats that value as a lower cap on the outer AutoSkillit process idle
watchdog. For Codex, that collapses default L2 food-truck idle from
fleet's intended `1800s` to `600s`, while
`run_skill.mcp_tool_timeout_sec` and fleet session deadlines allow much
longer blocking calls. Codex `item.started` / `item.updated
status=in_progress` MCP records are ignored as liveness, so a healthy
in-flight MCP call can look identical to a hung stdout stream.
The immunity plan is to replace raw timeout-field propagation with one
resolved session liveness contract plus a process-level liveness
supervisor. The contract must be resolved once per backend and session
kind, then consumed by every watcher. Codex operation lifecycle events
must become first-class liveness inputs, bounded by MCP/session
deadlines rather than by an arbitrary marker-suppression cap.
## Implementation Plan
Plan file:
`/home/talon/projects/autoskillit-runs/remediation-20260708-205019-355728/.autoskillit/temp/rectify/rectify_codex_l2_liveness_policy_2026-07-08_211800.md`
Closes#4202
🤖 Generated with [Claude Code](https://claude.com/claude-code) via
AutoSkillit
<!-- autoskillit:pipeline-signature
steps=prepare_pr,run_arch_lenses,compose_pr,annotate_pr_diff,review_pr
-->
|`_type_capture.py`|`CaptureEntrySpec` and `CaptureValueTypeError` for typed capture contract enforcement |
32
32
|`_type_dispatch_identity.py`|`DispatchIdentity` frozen value object, `PromptContractError`, and `assert_prompt_sentinel` for sentinel contract enforcement |
33
33
|`_type_helpers.py`| Text processing and skill-name extraction utilities |
6.**Add a `FeatureDef`** — add an entry to `FEATURE_REGISTRY` in `core/types/_type_constants_features.py` with `default_enabled=False` and `requires_backend_alignment=True`.
38
38
39
39
7.**Extend test coverage** — add tests to `tests/execution/backends/test_backend_registry.py`, `tests/contracts/test_backend_compliance.py`, and `tests/contracts/test_backend_protocol.py`.
40
+
41
+
## Backend liveness contract
42
+
43
+
- Backend stream parsers emit raw observations only. They must not decide whether a
44
+
process is healthy, stale, or killable.
45
+
- Codex lifecycle records for long-running tool items (`item.started`, `item.updated`,
46
+
`item.completed`) must preserve the raw backend record and emit `OperationLiveness`
47
+
when `item.id` is stable and `item.type` is one of the long-running operation types.
48
+
-`item.started` and `item.updated` remain `BackendEventKind.IGNORED`; they are liveness
49
+
signals, not result evidence, write evidence, or command/MCP completion evidence.
50
+
- Parent stdout-idle behavior is owned by the resolved `SessionLivenessSpec` in
51
+
`execution/headless/_headless_liveness.py`. Backend builders may set child env hints,
52
+
but `_execute_claude_headless()` must normalize `AUTOSKILLIT_IDLE_OUTPUT_TIMEOUT`
53
+
from the resolved spec before invoking the runner.
0 commit comments