Skip to content

Commit 7823a28

Browse files
enriquephlclaude
andcommitted
fix(pipeline): narrow signals query to tip-flagged gift_user rows only (codex P2 v2)
Previous fix (5f5c09b) widened too far — it counted all gift_user rows including legacy in-app-gift rows written by routes/companion.rs:827 via append_message. Those rows lack tip metadata and never counted as user activity pre-PR. Narrow to: role = 'user' OR (role = 'gift_user' AND metadata ? 'tips_amount_usd') so only the new tip-replacing path counts. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 1fb81d2 commit 7823a28

1 file changed

Lines changed: 18 additions & 9 deletions

File tree

  • crates/eros-engine-server/src/pipeline

crates/eros-engine-server/src/pipeline/mod.rs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,10 @@ pub async fn compute_signals_for_session(
6060
) -> Result<ConversationSignals, AppError> {
6161
let message_count: i64 = sqlx::query_scalar(
6262
"SELECT COUNT(*) FROM engine.chat_messages \
63-
WHERE session_id = $1 AND role IN ('user', 'gift_user')",
63+
WHERE session_id = $1 AND (\
64+
role = 'user' \
65+
OR (role = 'gift_user' AND metadata ? 'tips_amount_usd')\
66+
)",
6467
)
6568
.bind(session_id)
6669
.fetch_one(pool)
@@ -69,7 +72,10 @@ pub async fn compute_signals_for_session(
6972

7073
let last_time: Option<chrono::DateTime<chrono::Utc>> = sqlx::query_scalar(
7174
"SELECT MAX(sent_at) FROM engine.chat_messages \
72-
WHERE session_id = $1 AND role IN ('user', 'gift_user')",
75+
WHERE session_id = $1 AND (\
76+
role = 'user' \
77+
OR (role = 'gift_user' AND metadata ? 'tips_amount_usd')\
78+
)",
7379
)
7480
.bind(session_id)
7581
.fetch_optional(pool)
@@ -152,17 +158,20 @@ mod tests {
152158
(genome_id, instance_id, session_id)
153159
}
154160

155-
/// Tip turns persisted as `gift_user` must be counted by
156-
/// `compute_signals_for_session` exactly like `user` turns.
157-
/// Regression guard for the codex P2 finding on PR #52.
161+
/// Tip `gift_user` rows (with `tips_amount_usd` in metadata) must be
162+
/// counted exactly like `user` turns; legacy in-app-gift `gift_user` rows
163+
/// (no tip metadata, written by routes/companion.rs:827) must NOT count.
164+
/// Regression guard for codex P2 v2 finding on PR #52.
158165
#[sqlx::test(migrations = "../eros-engine-store/migrations")]
159-
async fn signals_count_includes_gift_user_rows(pool: PgPool) {
166+
async fn signals_count_includes_tip_gift_user_but_excludes_legacy_gifts(pool: PgPool) {
160167
let user_id = Uuid::new_v4();
161168
let (_genome_id, instance_id, session_id) = seed_session(&pool, user_id).await;
162169

163170
sqlx::query(
164-
"INSERT INTO engine.chat_messages (session_id, role, content) \
165-
VALUES ($1, 'user', 'hi'), ($1, 'gift_user', '(打赏 $20)')",
171+
"INSERT INTO engine.chat_messages (session_id, role, content, metadata) VALUES \
172+
($1, 'user', 'hi', NULL), \
173+
($1, 'gift_user', '(打赏 $20)', '{\"tips_amount_usd\": 20.0}'::jsonb), \
174+
($1, 'gift_user', 'in-app gift label', NULL)",
166175
)
167176
.bind(session_id)
168177
.execute(&pool)
@@ -176,7 +185,7 @@ mod tests {
176185

177186
assert_eq!(
178187
signals.message_count, 2,
179-
"gift_user tip rows must count toward message_count signals"
188+
"user + tip gift_user count (2); legacy gift_user row does not"
180189
);
181190
}
182191

0 commit comments

Comments
 (0)