os-me: the prediction parser makes rows from Prediction blocks that an agent report only quotes #1763
Labels
No labels
P0
P1
P2
P3
bug
category/code-change
category/cross-repo
category/eval-run
category/investigation
category/no-test-target
category/owner-ruling
category/prose-artifact
category/recurring-chore
category/structure
category/umbrella
crc-refactor
create
delete
enhancement
filed-by/agent
filed-by/user
frozen
lint-rule
needs-info
needs-triage
next
plugin/cc-architect
plugin/os
plugin/os-adr
plugin/os-aidd-lint
plugin/os-backlog
plugin/os-context
plugin/os-doc-hygiene
plugin/os-sdlc
plugin/os-vault
project/cc-os
ready-for-agent
ready-for-human
recurring
review
rule-proposal
update
waiting
wayfinder:grilling
wayfinder:map
wayfinder:map
wayfinder:research
wayfinder:task
wayfinder:task
wontfix
worklist/deviations
worklist/lint-rule
worklist/new-implement-build
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
jared/cc-os#1763
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem
os-me-eval appendmakes rows fromprediction:blocks that an agent report only quotes. These rows are not Predictions of a predict run. They are false rows in the candidate log, and they change the scores that os-me computes from the log.The cause is in
plugins/os-me/lib/os_me/(branchticket-1758):Entry#prediction_message(entry.rb:40-46) returns[:notification, text]for every main-thread user entry whose text contains<task-notification>(Entry#notification_text,entry.rb:31-38).TranscriptReader#prediction_messages(transcript_reader.rb:17-19) gives all of them to the parser (cli/append_request.rb:12).PredictionParser::Transcript#unseen(prediction_parser/transcript.rb:16-22) makes rows from each fenced block that loads (PredictionParser::Message#predictions,prediction_parser/message.rb:26-29). The fence patternYAML_BLOCK(prediction_parser/message.rb:6) matches a fence at the start of a line.The fault class is older than #1758. Before #1758, the parser took the last block of the text:
def yaml_block(text) = text.to_enum(:scan, YAML_BLOCK).map { Regexp.last_match[:body] }.last(prediction_parser.rb:46at commit43bdc0800). A quoted block then replaced the real Prediction. After #1758, a quoted block adds rows.Scope of harm: sessions where an agent report quotes a Prediction block with the fence at the start of a line. In practice, these are sessions that work on os-me.
Observed
Real-data check of branch
ticket-1758on 2026-11-13 (implementation 292, scratch log, Store not written).2bb44e9c-522c-4c97-8449-bd46bed898e0has one real predict run.os-me-eval appendgave 6 rows.prediction:block with the fence at column 0.Reproduce
Run it against a scratch log with the transcript of session
2bb44e9c-522c-4c97-8449-bd46bed898e0. It gives 6 rows; the session has 1 predict run.Approach
This is a candidate direction. It is not decided.
Join each task-notification to its dispatch. Accept only the notifications of a predict dispatch.
Transcript facts, checked on 2026-11-13 in the transcript of session
2bb44e9c-522c-4c97-8449-bd46bed898e0(48 Agent calls, 46 task-notifications on the main thread):type: userline. Itsmessage.contentis a String. The tool-use id is not a JSON field. It is the<tool-use-id>tag in the text, next to the<task-id>tag. The entry-leveloriginfield is{kind: "task-notification", producer: "session-task", runId}. TherunIdvalue is not the tool-use id.type: assistantline. Itsmessage.content[]has a block withtype: "tool_use",name: "Agent",id, andinput.prompt.Entry#agent_call_ids(entry.rb:48-52) reads thisidnow.<tool-use-id>value is equal to theidof an Agenttool_useblock for 43 of the 46 notifications.<tool-use-id>tag. 1 notification has the id of aSendMessagecall (a continued agent), not of an Agent call. The design must rule on these three cases.ENTRY.mdin the prompt is too weak as the test. 8 Agent prompts in this session contain it, because work on os-me names the file. Only 1 prompt starts with the brief lineRead /home/jared/dev/os-me-store/ENTRY.md and follow it in <predict|respond> mode.(~/dev/os-me-store/brief.md:6;plugins/os-me/skills/predict/SKILL.md:17). That prompt is the real predict dispatch.Required work: none beyond the acceptance criteria.
Acceptance criteria
os-me-eval appendruns, then it adds one row.os-me-eval appendruns on each, then each session keeps its row count.Non-goals
Origin
ticket-1758on 2026-11-13:os-me-eval appendagainst a scratch log for 14 real sessions (implementation 292).PredictionParser::Transcript#unseenmakes rows from each block that loads (plugins/os-me/lib/os_me/prediction_parser/transcript.rb:16-22) ←Entry#prediction_messageaccepts every main-thread task-notification (plugins/os-me/lib/os_me/entry.rb:40-46) ←DESIGN: the parser identifies a Prediction by its block shape only, not by its dispatch (plugins/os-me/lib/os_me/prediction_parser/message.rb:6).OsMe::Entry#prediction_message(plugins/os-me/lib/os_me/entry.rb),OsMe::PredictionParser::Transcript(plugins/os-me/lib/os_me/prediction_parser/transcript.rb)VERDICT: CREATE (ticket-skeptic, 2026-11-13). Reason: observed false rows in the prediction log; #1758 and #1762 do not have this fault; the data-validity floor applies.