Outbound validator + refine loop

Refine button

When a draft is blocked by the outbound validator, the operator sees three options on the draft surface — V28 inbox, V28 Pulse task tile, mobile thread, legacy DueTodayTaskCard, mobile MobileTaskResolveSheet, task-drawer V28TaskRowActions, dashboard task-card.

The three buttons:

Button What
Refine Run one refinement pass: the validator's findings get fed back to the LLM, which rewrites the draft addressing them. Re-validate; if clean, send; if still blocked, return for another decision.
Send Anyway Override the block + send the draft as-is. Audit row written with validatorVerdict=overridden. Use when the validator is wrong.
Dismiss Discard the draft + mark the task done without sending. Use when no send was needed in the first place.

Where they appear

  • the sibling-site sweep, the 3-button surface is consistent across:

  • V28 Inbox composer (parent — operator's primary surface)

  • V28 Pulse task tile
  • V28 Task drawer / V28TaskRowActions
  • V28 Dashboard task-card
  • Legacy DueTodayTaskCard
  • Mobile thread
  • Mobile MobileTaskResolveSheet

Earlier each surface had its own (mostly broken) handling — raw JSON dumps, missing SEND ANYWAY, no Refine. Now all 8 surfaces use the same component.

The validation banner

Before the 3 buttons, the surface shows an operator-friendly summary of why the validator blocked:

⚠ This draft was blocked by Parking-info-relevance (MAJOR). The validator flagged: "the draft mentions parking but the guest never asked about parking."

Earlier the surface showed raw [slug]/MAJOR framing + raw JSON. the message is operator-friendly: human label + plain-English finding.

Refine result UX

When you tap Refine, the surface shows a VALIDATING indicator while the refine + re-validate runs. Either:

  • ✓ Refined + cleared → composer re-populates with the refined draft → tap SEND to send it.
  • ⚠ Refined but still blocked → surface returns with the new validator finding + the 3 buttons again.

Refine guards

A refine pass historically had two failure modes:

  • **
  • **

If you see the refined draft going wrong (copying prior message / placeholder garbage), that's a regression — file a bug report.

Source: the FlatsBratislava operator manual.