Three-layer completion evaluation (structured output → marker → continue), capacity rejection outranks completion claim. Use when working with completion.py.
Install
npx skillscat add the-vibey-project/vibey/codexloop-completion Install via the SkillsCat registry.
codexloop completion detection
CompletionEvaluator in domain/completion.py maps TurnSignals +CapacityState into a CompletionVerdict.
CompletionVerdict variants
Done # task fully complete
Continue # remaining: list[str]
Blocked # reason: str — human intervention neededThree-layer evaluation
Capacity rejection always outranks a completion claim. If the turn is
not Available, return Continue regardless of structured output or
markers.
For an Available turn, the layers are:
Structured output (
StructuredOutputtool call result):blocked_onset →Blocked(reason=blocked_on).complete: trueandremaining_work: []→Done.complete: truebutremaining_worknot empty →Continue.complete: false→Continue(remaining=remaining_work).
Marker on own line: if
CODEXLOOP_TASK_FULLY_COMPLETEappears on
its own line in the final message →Done.Fallback:
Continue(remaining=[]).
The marker check uses _marker_on_own_line(message, done_marker): the
string must be the only non-whitespace on the line. Partial matches or
inline occurrences do not count.
Never treat a non-Available turn as Done. Rate-limit windows and
transient errors are waitable; completion is deferred until capacity
returns.