← Back to brief

feedback freshness before surface

memory · feedback_freshness_before_surface.md

The lesson (2026-04-30 incident)

QB's 6:45 AM brief flagged 2 "overdue commitments" to Joseph:

Both were already fulfilled before QB's brief generated:

CommitmentCapturedActual fulfillmentQB still flagged it
Devine Meet4/29 14:49:14ZCalendar event g73k496uc8b3onb3s96tan0f7c created 4/29 14:49:42Z (28 sec later)
Jamie Boulder PM4/28 19:55ZGmail 19dd9b66f9467cf1 sent 4/29 14:48:24Z (handing her off to Adam's Boulder team)
Joseph correctly called this out as a lazy mistake. Plus: Jamie isn't even GC-relevant anymore (Boulder only after her GC purchase fell through) — she shouldn't be in the GC commitment-tracker at all.

Root causes

1. commitment-tracker Step 5 only checks Gmail — Calendar event creation never triggers fulfillment. Devine's invite was a Calendar event, so the ledger stayed overdue forever.

2. QB reads commitments.jsonl directly without re-running fulfillment detection. QB at 6:45 saw status: overdue on both records and surfaced them. The actual fulfillment evidence existed in Calendar (Devine) and Gmail (Jamie) but the ledger hadn't been updated.

3. No scope-out filter. Even if Jamie's commitment had been re-checked, the system has no concept of "this lead is no longer relevant to GC." Joseph addressed her by handing off to Adam's Boulder team — but the commitment-tracker would still flag her on every subsequent miss.

Permanent fixes (wired 2026-04-30)

commitment-tracker Step 5 — multi-channel fulfillment scan

~/.claude/scheduled-tasks/commitment-tracker/SKILL.md Step 5 now has FOUR sub-steps:

QB Step 1a — freshness gate

~/.claude/scheduled-tasks/qb-quarterback/SKILL.md Step 1a (new): before surfacing ANY commitment as overdue, run a quick re-scan on Calendar + Gmail + HS scope. ONLY surviving commitments are eligible to surface. Hard rule: never list a commitment as overdue using stale ledger data alone.

General principle (applies to ALL ledgers + watchdogs)

Any system that surfaces "X is overdue / blocked / needs Joseph's action" MUST re-validate against source-of-truth channels before display:

Surfacing stale data costs trust. Joseph only has to see this kind of mistake once before he stops trusting the morning brief at all.

Full sweep — every watchdog audited (2026-04-30 same-day)

After the commitment-tracker + QB patches, swept every other ledger-surfacing skill. Each got the appropriate freshness gate added:

stalled-deal-watchdog (PATCHED Step 3 + 5)

referral-watchdog (PATCHED Step 3.5)

- lifecyclestage ≠ customer - relationship_to_the_property contains "Former" / "Offboarded" / "Churned" - Recent inbound (30d) contains "cancel" / "terminate" / "switching" / "unhappy" / "complaint" / "lawsuit" - Linked deal flipped back to closedlost

smartlead-bounce-handler (PATCHED Step 8a)

- If HS contact email changed since bounce date → skip the SL-removal (email was likely corrected; let re-bounce signal failure) - If lead already has a prior applied removal action → skip (idempotent) - Same (lead_id, bounce_date) already queued → skip

close-to-onboarding-handoff (PATCHED Step 2a)

- Live HS deal-stage check (must be closedwon); if not, log kg_drift_detected + skip - Gmail prior-handoff detection: search from:joseph.bowens@skyrun.com to:rachel.scott@skyrun.com subject:Handoff <owner_lastname> after:<close_date>. If found, log prior_handoff_detected + retroactively log to handoff-ledger so referral-watchdog 90-day clock works.

deal-postmortem-capture (PATCHED Step 2a)

live-ea (NO PATCH NEEDED — fresh by design)

Standing rule (HARDWIRED 2026-04-30)

Never surface an "overdue" or "blocked" item to Joseph without first re-validating against the SoT channel that would prove it's already done. A 5-second Calendar/Gmail/HS check beats a stale-ledger false alarm every time.

Every new watchdog or surfacing-skill MUST:
1. Identify which channel(s) would PROVE the surfaced item is already done
2. Re-check that channel before surfacing
3. Auto-resolve the ledger entry if proof is found
4. Add a _resolution_note explaining the resolution path

If a skill doesn't have this pattern, it's a bug that needs to be fixed before deployment.

Joseph's verbatim feedback (the trigger)

> "How did that get missed? Implement a process that insures this never happens again. Why is Jamie being flagged to me? She has no more value to me right now as she no longer has a property in GC. only boulder county and I already addressed that. How did you miss that and surface either of these commitments? Implement something that makes you smarter and more diligent to this kind of situation and prevents lazy mistakes like this in the future."

Standing rule (HARDWIRED 2026-04-30)

Never surface an "overdue" or "blocked" item to Joseph without first re-validating against the SoT channel that would prove it's already done. A 5-second Calendar/Gmail/HS check beats a stale-ledger false alarm every time.

EXTENSION 2026-05-03 — covers ad-hoc agent-generated content (THIRD strike on Devine)

The 4/30 fix only patched automated watchdogs. It did NOT prevent the same failure shape from recurring in agent-written ad-hoc content like pre-briefs, summaries, or recommendation lists. Joseph caught the SAME Devine miss on the SAME deal in a 5/3 pre-brief I wrote — calendar invite was already sent 4/29 14:49Z (event id g73k496uc8b3onb3s96tan0f7c), but I copied "calendar invite owed" forward from a 4-day-old memory file. The memory's own system-reminder explicitly warned me about staleness; I read it and ignored it.

Hardwired rule (extends the standing rule):

ANY agent-written content that contains the phrase "outstanding", "owed", "needs to be sent", "pending", "missing", "calendar invite owed", or any equivalent obligation-claim about Joseph's actions MUST first verify the underlying channel. Specifically:

If the channel can't be queried (MCP disconnected etc.), the claim must be hedged with explicit "memory says X but unverified — please confirm" framing — never asserted as fact.

Trigger-detection list

When writing ANY of these content types, I MUST run the freshness gate FIRST:

Why this kept happening

Memory files frame things as "Stage: calendar invite owed" because they were written at a point in time when that was true. Days later, the underlying state changed (Joseph sent the invite). The memory file didn't update. The system-reminder on the memory says "verify against current state" — and that warning gets bypassed when content generation feels routine.

The right reflex: every memory claim involving Joseph's recent action gets verified against the live channel. No exceptions, no shortcuts, even when the memory is "only" 2-4 days old.

Joseph's verbatim feedback (5/3)

> "Devine is on my calendar already - how is this being missed?"