Skip to content

fix(honesty): estimate-recovery shows 'Approved' not 'Recovered' at proof=0 (pre-First-Light blocker)#661

Open
Victor "David" Medina (Victor-David-Medina) wants to merge 2 commits into
mainfrom
claude/estimate-recovered-honesty
Open

fix(honesty): estimate-recovery shows 'Approved' not 'Recovered' at proof=0 (pre-First-Light blocker)#661
Victor "David" Medina (Victor-David-Medina) wants to merge 2 commits into
mainfrom
claude/estimate-recovered-honesty

Conversation

@Victor-David-Medina

Copy link
Copy Markdown
Collaborator

Estimate Recovery: approval is not recovery (proof=0 honesty)

Rank-1 blocker from the pre-First-Light adversarial gate. EstimateRecoveryClient counted items.filter(status === "approved") and rendered it as a green success "Recovered" SummaryCard. At proof_events=0, the instant the owner approves the single First-Light estimate send, that card would display "Recovered: 1" - a fabricated recovered-outcome claim on the exact buyer surface the recovered-revenue wedge depends on. PR #656 hedged only the separate ProofLedger component, not this one.

Fix (honest, minimal)

  • Tally + filter tab "Recovered" → "Approved" (intent word, reflects status==='approved' exactly).
  • Dropped the green variant="success" → neutral stone card (approval is not a success/outcome).
  • Renamed the count recoveredapproved; added a proof=0 honesty rationale comment.
  • The "Recover" action button (imperative product CTA) is unchanged - the fix targets achieved-state labels, not the call-to-action.
  • A real recovered figure only comes from a provider-observed proof_event (Pulse-owned).

Guard

__tests__/estimate-recovery-honesty.test.ts - source-level assertion (mirrors the repo's existing outreach-consumer-safety guard): no label="Recovered" success card, the tally is label="Approved", and the honesty rationale must persist. Cannot silently regress.

Verified: no em-dash; CheckCircle2 import still used; all "recovered-as-fact" card/status labels removed (the page-purpose copy "Recover them into booked work" is aspirational intent, left as-is).

Generated with Claude Code by RelayLaunch

…Recovered' (proof=0)

Pre-First-Light adversarial gate (rank-1 blocker): EstimateRecoveryClient rendered
items.filter(status==='approved') as a green success 'Recovered' SummaryCard. At
proof_events=0, the instant the owner approves the single First-Light estimate send
the card would show 'Recovered: 1' - a fabricated recovered-outcome claim on the
exact surface the recovered-revenue wedge depends on. Not covered by #656 (that
hedged the separate ProofLedger only).

Fix: relabel the tally + filter tab 'Recovered' -> 'Approved' (honest intent word),
drop the green success variant -> neutral card, rename the count var recovered->approved.
An approval is not a recovered dollar; a real recovered figure only comes from a
provider-observed proof_event (Pulse-owned). The 'Recover' action button (imperative
product CTA) is unchanged. Source-guard honesty test added so it cannot regress.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Jul 2, 2026

Copy link
Copy Markdown

🛡️ Cascade Quality Score: 100/100

Category Score Status
TypeScript 20/20
ESLint 20/20
Brand Compliance 15/15
Test Suite 25/25
Build 20/20

Threshold: 85/100 | Result: PASS ✅

… tab label

The existing test clicked the old 'Recovered' filter-tab button; the honesty fix
renamed it to 'Approved' (an approval is not a recovered dollar at proof=0). Update
the test to match the corrected label. No behavior change beyond the honest relabel.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant