basquetWi + New ticket

wasteNot: behaviour-inference first (read recipient's next N msgs), opinion DM only as fallback; fold in unanswered-asks predicate

Done high bvbin-venus-cc

Elazar correction 2026-09-02: DMing agents to make them answer old messages manufactures the traffic wasteNot exists to remove. Change llmmsg-wastenot.sh so the PRIMARY evidence is behaviour, not opinion. For each candidate row, and for each unanswered ask (fold in the predicate from ~/agents/monitor-llmmsgsrv/bin/unanswered-asks.sh v1.1 - directed, kind in ask/question/request/review/poll/blocked OR expects_reply=1, fanout=0 OR explicit_to=1, no re=tag and no recipient->sender reply after, skip DORMANT recipients and retired mailboxes), have haiku read the recipient's NEXT 10 messages or 2h of their traffic after the ask and decide from what they DID: acted/referenced it -> not a candidate; carried on unrelated and never referenced it -> insert candidate with the behaviour evidence in reason. Opinion DM becomes the FALLBACK, sent only when the next-N read is undecidable, and then to ONE party not both. Caps unchanged (10/run, one per pair/24h). unanswered-asks.sh standalone cadence is retired - it becomes a candidate source inside this script.

Sub-tickets

No sub-tickets.
+ Add sub-ticket

Activity

  • wi-cli-venus created · 6w ago
    parent=#3240
  • bin-venus-cc completed · 1w ago
    SHIPPED. Both halves are live in llmmsg-wastenot.sh v2.5 (16d774d) and were already live before this pass. (1) BEHAVIOUR-INFERENCE FIRST: step 3 attaches the recipient's next TRAIL_N=10 outbound messages OR everything they sent within TRAIL_H=2h, whichever reaches further - the UNION of two bounds, not the intersection, because a fast agent emits ten messages in four minutes and a slow one two in two hours, and intersecting would starve both. The analyst judges from that trail. (2) OPINION DM AS FALLBACK ONLY: a 'wasted' verdict is recorded and nothing is sent; only 'undecidable' asks, and only the recipient. Measured on the live table: 101 of 136 rows are undecidable and 16 wasted, so the fallback is the common path and worth keeping cheap. (3) UNANSWERED-ASKS PREDICATE FOLDED IN: it is the second prefilter leg (src=ask), kind IN (ask,question,request,review,poll,blocked) OR expects_reply=1, ORed rather than relying on expects_reply alone because that flag is set on only ~2% of rows. THE FOLD-IN IS WHAT CARRIED A DEFECT, fixed this pass: the two legs differ only in their src literal, so UNION's whole-row dedupe never fired and a message matching BOTH predicates was analysed twice, counted twice, and stamped with a tag split by a literal newline - 14 of 136 live rows, latest 2026-10-05 20:03. Deduped in SQL; the two-leg case now reports ask+waste. NOT COVERED: reason groundedness, unchanged by either half.
task
6w ago by wi-cli-venus
1w ago
2026-10-06 01:24