diff --git a/plugins/openclaw/slash_sleep.py b/plugins/openclaw/slash_sleep.py index a09c500..c857666 100755 --- a/plugins/openclaw/slash_sleep.py +++ b/plugins/openclaw/slash_sleep.py @@ -208,7 +208,12 @@ def reject(night: str = None) -> int: def schedule_cmd(hour: int, minute: int) -> int: - """Install a nightly cron entry via the shared SkillOpt-Sleep scheduler.""" + """Install a nightly cron entry via the shared SkillOpt-Sleep scheduler. + + Note: this schedules the shared engine (``python -m skillopt_sleep run``), + not the OpenClaw-specific ``run_sleep.py``. Use ``run_sleep_cron.sh`` if + you need the OpenClaw-native backend and category task files instead. + """ try: from skillopt_sleep.scheduler import schedule except ImportError: diff --git a/skillopt_sleep/harvest.py b/skillopt_sleep/harvest.py index c971d8c..3645d3f 100644 --- a/skillopt_sleep/harvest.py +++ b/skillopt_sleep/harvest.py @@ -148,8 +148,11 @@ def _is_headless_replay(digest: "SessionDigest") -> bool: for marker in _REPLAY_PROMPT_MARKERS: if marker in prompt: return True - # Sub-3-second single-turn sessions are almost certainly programmatic. - if digest.started_at and digest.ended_at: + # Sub-3-second single-turn sessions with short prompts are almost + # certainly programmatic (engine grader/judge calls). We require the + # prompt to also be short (<200 chars) to avoid false-positives on + # real one-shot questions that Claude happens to answer quickly. + if digest.started_at and digest.ended_at and len(prompt) < 200: try: fmt = "%Y-%m-%dT%H:%M:%S" start = datetime.strptime(digest.started_at[:19], fmt)