diff --git a/internal/trace/writer.go b/internal/trace/writer.go index 77f10a2..594001d 100644 --- a/internal/trace/writer.go +++ b/internal/trace/writer.go @@ -87,6 +87,14 @@ type Action struct { // the model's short rationale, shown by the replay UI to explain the pick. Source string `json:"source,omitempty"` LLMReasoning string `json:"llm_reasoning,omitempty"` + // LLMRanked is the model's full ranked candidate-index list; LLMChosenRank + // is the 1-based position in it that produced this action (1 = the model's + // top pick; >1 means earlier picks were invalid and skipped). Together they + // let the replay UI reconcile the reasoning with the executed action: the + // reasoning describes the model's top pick, so a ChosenRank > 1 is why the + // prose can name a different target than the one acted on. + LLMRanked []int `json:"llm_ranked,omitempty"` + LLMChosenRank int `json:"llm_chosen_rank,omitempty"` } type BoundsRecord struct {