From 771f09ae386b4e8862bfaedef07372dac8d98f19 Mon Sep 17 00:00:00 2001 From: Nucleic Date: Tue, 4 Aug 2026 20:55:46 -0700 Subject: [PATCH] Merge nucleic/jolly-coral-egret-smoz into dev --- label_swe_chat_prose.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/label_swe_chat_prose.py b/label_swe_chat_prose.py index 48ff4b9..5dfbbea 100644 --- a/label_swe_chat_prose.py +++ b/label_swe_chat_prose.py @@ -10,8 +10,16 @@ prose slice drops into `prepare_data.py` with no downstream change. Only the prose reaches the canonical dataset. The user prompt is teacher-only context and lives solely in the ignored candidate/state artifacts, as a hash in the audit sidecar. -Two failure modes are specific to this slice and are enforced rather than hoped for: +Three rules are specific to this slice and are enforced rather than hoped for: +* When a reply reports finishing one kind of work and announces another, the label is the + work it is *moving to*. This is the drift signal itself, and it is the one rule the + keyword heuristic can never learn — "I built the settings screen" and "next I'll build + the settings screen" have identical keywords and opposite meanings for Context Switch. + The rule is the same one the AFM template carries verbatim + (`IntelligenceDelegate.classifyReplyPurpose`), because a purpose-lite trained here is + meant to *replace* that AFM call (CONTEXT_SWITCH §3.2); a model taught to label the + completed work instead would offer a switch into work the session has already left. * A reply that merely *asks* about work ("Should I start on the UI next?") states no purpose of its own. Labeling it `frontendImpl` would teach the classifier to fire on exactly the replies §4 of `docs/CONTEXT_SWITCH.md` requires it not fire on, so the @@ -193,6 +201,13 @@ pure acknowledgements, pure status noise, scaffolding, and non-technical materia that reports completed work is kept and labeled with that work's purpose, even when it matches the preceding message's purpose. +When a reply reports finishing one kind of work and says it is moving to another, label the +work it is moving to: what the agent says it will do NEXT outranks what it reports having +just done. "The rate limiter is in and the tests pass. Next I'll wire up the settings +screen" is frontendImpl, not backendImpl. Label the completed work only when the prose +names nothing further. This is a statement about *reported* next work, not an offer — an +offer is still rejected by the rule above. + Set recoverableFromProse=true when the primary label is knowable from agent_reply_prose alone. Set it false when you needed preceding_user_message to decide — a reply full of pronouns referring back to the request is the common case. For false, retain the record but