Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

harvest: user messages wrapped in `<pasted_content …>` are treated as meta, so pasted briefs never become tasks

Abierto
#318 1 comentario 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 2 días

@SU-AN-coder ya está trabajando en esto.

Desde el 18/10/2026.

  • #321 de @SU-AN-coder — abierto

Evaluación

Dificultad
3/5
Tiempo estimado
1-2 días
Aptitud para principiantes
66/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
python
Área
devtools

Línea de trabajo

Start with _is_meta_prompt() in skillopt_sleep/harvest.py (about lines 137-155) and _is_headless_replay() (about lines 217-218), then heuristic_mine() in skillopt_sleep/mine.py (about line 175). Run the synthetic repro in the issue with SKILLOPT_REPO set; it prints which sessions are harvested and each mined intent. Done when the pasted brief is kept as intent, <system-reminder> blocks are stripped, and s2-pasted-only is no longer dropped.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Version examined
  • microsoft/SkillOpt main @ 343db229dbd5ddaf9df6b1d5540d8bcdb2604d5c (2026-10-06), package skillopt_sleep.
  • Claude Code plugin skillopt-sleep 0.1.0 from the same commit.
  • Windows 11 Pro (build 26300), Python 3.12.13, plugin runner started from Git Bash 5.3.
  • Transcripts written by the Claude Code desktop app (Code tab), version 2.1.271.
Observed behavior

_is_meta_prompt() (skillopt_sleep/harvest.py, lines 137-155) treats any text that starts with < and ends with > as system noise (line 142).

The desktop app stores pasted text in the user message wrapped in a tag pair carrying the same id: <pasted_content id="…"> … </pasted_content id="…">. We verified this on our own transcripts by checking only the opening and closing tag, without exporting their content. A pasted brief is therefore dropped, and it is often the main request of the session.

Three consequences, all reproduced below with synthetic data:

  1. Wrong intent. If the user then writes a short follow-up such as "Yes, go ahead with option A.", that follow-up becomes the mined task intent, because heuristic_mine() takes the first surviving prompt (skillopt_sleep/mine.py, line 175).
  2. Session silently lost. If the pasted brief is the only user message, n_user_turns is 0. _is_headless_replay() (harvest.py, lines 217-218) then classifies the session as one of the engine's own replays, and the whole session is dropped, although it contains real assistant work.
  3. Related. A user message that starts with a host-injected <system-reminder>…</system-reminder> block and then contains the real request does not end with >, so it is kept, but the reminder block is copied verbatim into the task intent.

In a real run, 2 of 5 hand-picked sessions were mined from the wrong message for reason 1.

Expected behavior
  • Treat <pasted_content …> blocks as user content: strip the wrapper tags and keep the inner text as the user's intent.
  • Limit the "meta" heuristic to known host and system tags (for example <command-message>, <command-name>, <local-command-stdout>, <system-reminder>) instead of any text wrapped in angle brackets.
  • Strip host-injected <system-reminder> blocks from intents.
  • Do not classify a session that has real assistant turns as a headless replay only because all its user turns were filtered out.
Minimal synthetic reproduction

No model calls and no network. Run from the repository root, or set SKILLOPT_REPO to it.

"""Synthetic repro: pasted briefs are dropped by the harvest meta filter (no model calls, no network)."""
import json
import os
import sys
import tempfile

sys.path.insert(0, os.environ.get("SKILLOPT_REPO", "."))
from skillopt_sleep.harvest import _is_meta_prompt, harvest  # noqa: E402
from skillopt_sleep.mine import heuristic_mine  # noqa: E402

ROOT = tempfile.mkdtemp(prefix="skillopt-d19-")
PROJECT = os.path.join(ROOT, "proj")
TRANSCRIPTS = os.path.join(ROOT, "projects")
os.makedirs(PROJECT)

BRIEF = ('<pasted_content id="a1b2">\nInstall tool X into a dedicated folder, pin the version, '
         'back up the configs first and write a short report.\n</pasted_content id="a1b2">')
REMINDER = ('<system-reminder>\nStatus note injected by the host app.\n</system-reminder>\n\n'
            'Yes: run the third review on range r2..abc1234 and update the report.')


def session(sid, turns):
    folder = os.path.join(TRANSCRIPTS, "proj")
    os.makedirs(folder, exist_ok=True)
    with open(os.path.join(folder, sid + ".jsonl"), "w", encoding="utf-8") as f:
        for i, (role, text) in enumerate(turns):
            f.write(json.dumps({"type": role, "cwd": PROJECT, "sessionId": sid,
                                "timestamp": f"2026-01-01T10:{i:02d}:00Z",
                                "message": {"role": role, "content": text}}) + "\n")


session("s1-pasted-then-followup", [("user", BRIEF), ("assistant", "Plan: ..."),
                                    ("user", "Yes, go ahead with option A."), ("assistant", "Done.")])
session("s2-pasted-only", [("user", BRIEF), ("assistant", "Plan: ..."), ("assistant", "Done.")])
session("s3-reminder-prefix", [("user", REMINDER), ("assistant", "Running the review.")])

print("_is_meta_prompt(BRIEF) =", _is_meta_prompt(BRIEF))
digests = harvest(TRANSCRIPTS, scope="invoked", invoked_project=PROJECT)
print("harvested sessions:", sorted(d.session_id for d in digests))
for t in heuristic_mine(digests):
    print(f"task from {t.source_sessions[0]}: intent = {t.intent!r}")

Output at the commit above:

_is_meta_prompt(BRIEF) = True
harvested sessions: ['s1-pasted-then-followup', 's3-reminder-prefix']
task from s3-reminder-prefix: intent = '<system-reminder>\nStatus note injected by the host app.\n</system-reminder>\n\nYes: run the third review on range r2..abc1234 and update the report.'
task from s1-pasted-then-followup: intent = 'Yes, go ahead with option A.'

s2-pasted-only is missing from the harvested sessions: the pasted brief was its only user message.

Related
  • #99 extended _is_meta_prompt() to skip expanded slash-command bodies (<command-message>, <command-name>, # /…).
  • #295 skips records marked isMeta: true and leaves the text heuristics of _is_meta_prompt() unchanged.
  • Neither covers <pasted_content>: a pasted brief is typed by the user and is not marked isMeta. We found no open or closed issue or PR about it.
Not verified
  • Whether the Claude Code terminal CLI, or other clients, use the same <pasted_content> wrapper. We observed it only in the desktop app.
  • Whether other host tags that wrap a whole user message exist and are dropped the same way.
Lenguaje dominante
Python
Estrellas
18.5k
Forks
1.8k
Merge medio
5 d 18 h
PR fusionados (30 d)
15

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de microsoft/SkillOpt

Todos los issues de microsoft/SkillOpt

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.