S9: skip the prediction disclaimer line when choosing the moment topic #1293

Closed
opened 2026-10-23 21:52:37 +00:00 by jared · 2 comments
Owner

Problem

After #1289, the live S9 refresh on the real Store (365 moments, 289 embedded, 2026-10-23) still gives 0 lesson candidates. One cluster holds 49 moments from 34 sessions with agreement 0.74. Its topic texts are the disclaimer line that the main session writes above a shown prediction, for example *This is a prediction, not your ruling. I take no action until you decide.* and This is a **prediction, not a decision**. Nothing runs until you reply. The shown predictions have no Toward: line, so MomentTopic uses the first line that is not a heading or a stock opener, and that line is the disclaimer.

A diagnostic run with the disclaimer added to MomentTopic::STOCK_OPENERS gave: largest cluster 6 moments, 3 clusters with 3 or more sessions, 2 eligible candidates.

Approach

Add one stock opener to MomentTopic::STOCK_OPENERS: a line that starts with This is a prediction, with optional leading * or _ emphasis marks and optional ** before prediction. Case-insensitive, like the existing openers. Also allow optional leading ** on You are right, as the Short answer opener already does.

Required work:

  1. Add the prediction-disclaimer opener to MomentTopic::STOCK_OPENERS — check: present This is a in plugins/os-me/lib/os_me/moment_topic.rb

Acceptance criteria

  1. Given a ruling moment whose AI message is *This is a prediction, not your ruling. I take no action until you decide.*, then Use option B for the cache., when CandidateRefresh#run runs with a fake embedder, then the embedder receives clustering: Use option B for the cache.
  2. Given a ruling moment whose AI message is This is a **prediction, not a decision**. Nothing runs until you reply., then Keep the worker count at two., when the refresh runs, then the embedder receives clustering: Keep the worker count at two.
  3. Given a ruling moment whose AI message is **You are right** about the cache., then Drop the second worker., when the refresh runs, then the embedder receives clustering: Drop the second worker.

All criteria run in Minitest under plugins/os-me/test, with fixture transcripts in a temp dir and a fake embedder. No model call, no network.

Owner sketch

module OsMe
  class MomentTopic
    STOCK_OPENERS = [/\A\**\s*Short answer/i, /\A\**\s*You are right/i, /\A[*_]*\s*This is a \**\s*prediction/i].freeze
  end
end

Scope and blocking

In scope: plugins/os-me/lib/os_me/moment_topic.rb and tests under plugins/os-me/test. Out of scope: the **Predicted action:** label lines (6-moment cluster, agreement 0.58, not eligible); the similarity threshold; the predictor output format (#1292). Blocked by: none (#1289 is merged).

Origin

  • Trigger: live S9 refresh after #1289 merged on 2026-10-23 gave 0 candidates
  • Improvised this session: diagnostic script with the opener patched in at runtime
  • Chain: 0 candidates ← 49-moment cluster of prediction disclaimer lines ← shown predictions have no Toward line and start with a disclaimer ← MomentTopic::STOCK_OPENERS lacks the disclaimer. Stop at CODE (plugins/os-me/lib/os_me/moment_topic.rb).
  • Root candidate: none found
  • Where: plugins/os-me/lib/os_me/moment_topic.rb
  • Session: 4f3f95ea-3c6f-4d23-a0ea-e349d6ab02a5
  • Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os/4f3f95ea-3c6f-4d23-a0ea-e349d6ab02a5.jsonl

VERDICT: CREATE (extends the user-ruled B-prime stock-opener rule; backlog search only)

## Problem After #1289, the live S9 refresh on the real Store (365 moments, 289 embedded, 2026-10-23) still gives 0 lesson candidates. One cluster holds 49 moments from 34 sessions with agreement 0.74. Its topic texts are the disclaimer line that the main session writes above a shown prediction, for example `*This is a prediction, not your ruling. I take no action until you decide.*` and `This is a **prediction, not a decision**. Nothing runs until you reply.` The shown predictions have no `Toward:` line, so `MomentTopic` uses the first line that is not a heading or a stock opener, and that line is the disclaimer. A diagnostic run with the disclaimer added to `MomentTopic::STOCK_OPENERS` gave: largest cluster 6 moments, 3 clusters with 3 or more sessions, 2 eligible candidates. ## Approach Add one stock opener to `MomentTopic::STOCK_OPENERS`: a line that starts with `This is a prediction`, with optional leading `*` or `_` emphasis marks and optional `**` before `prediction`. Case-insensitive, like the existing openers. Also allow optional leading `**` on `You are right`, as the `Short answer` opener already does. Required work: 1. Add the prediction-disclaimer opener to `MomentTopic::STOCK_OPENERS` — check: present `This is a` in `plugins/os-me/lib/os_me/moment_topic.rb` ## Acceptance criteria 1. Given a ruling moment whose AI message is `*This is a prediction, not your ruling. I take no action until you decide.*`, then `Use option B for the cache.`, when `CandidateRefresh#run` runs with a fake embedder, then the embedder receives `clustering: Use option B for the cache.` 2. Given a ruling moment whose AI message is `This is a **prediction, not a decision**. Nothing runs until you reply.`, then `Keep the worker count at two.`, when the refresh runs, then the embedder receives `clustering: Keep the worker count at two.` 3. Given a ruling moment whose AI message is `**You are right** about the cache.`, then `Drop the second worker.`, when the refresh runs, then the embedder receives `clustering: Drop the second worker.` All criteria run in Minitest under `plugins/os-me/test`, with fixture transcripts in a temp dir and a fake embedder. No model call, no network. ## Owner sketch ```ruby module OsMe class MomentTopic STOCK_OPENERS = [/\A\**\s*Short answer/i, /\A\**\s*You are right/i, /\A[*_]*\s*This is a \**\s*prediction/i].freeze end end ``` ## Scope and blocking In scope: `plugins/os-me/lib/os_me/moment_topic.rb` and tests under `plugins/os-me/test`. Out of scope: the `**Predicted action:**` label lines (6-moment cluster, agreement 0.58, not eligible); the similarity threshold; the predictor output format (#1292). Blocked by: none (#1289 is merged). ## Origin - Trigger: live S9 refresh after #1289 merged on 2026-10-23 gave 0 candidates - Improvised this session: diagnostic script with the opener patched in at runtime - Chain: 0 candidates ← 49-moment cluster of prediction disclaimer lines ← shown predictions have no Toward line and start with a disclaimer ← `MomentTopic::STOCK_OPENERS` lacks the disclaimer. Stop at CODE (`plugins/os-me/lib/os_me/moment_topic.rb`). - Root candidate: none found - Where: plugins/os-me/lib/os_me/moment_topic.rb - Session: 4f3f95ea-3c6f-4d23-a0ea-e349d6ab02a5 - Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os/4f3f95ea-3c6f-4d23-a0ea-e349d6ab02a5.jsonl VERDICT: CREATE (extends the user-ruled B-prime stock-opener rule; backlog search only)
Author
Owner

Work started on branch ticket-1293 (os-sdlc implement).

Work started on branch ticket-1293 (os-sdlc implement).
Author
Owner

Resolution

Done: MomentTopic::STOCK_OPENERS skips the prediction disclaimer line and a bold You are right

Evidence: Implementation 152 complete in 3 min 12 s, 8 dispatches, all pass; suite gate green

Follow-ups: none; live candidates rerun reported in session

## Resolution **Done:** MomentTopic::STOCK_OPENERS skips the prediction disclaimer line and a bold You are right **Evidence:** Implementation 152 complete in 3 min 12 s, 8 dispatches, all pass; suite gate green **Follow-ups:** none; live candidates rerun reported in session
jared closed this issue 2026-10-23 21:56:16 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
jared/cc-os#1293
No description provided.