feat: תיקון-ציטוט בדלי-החילוץ + קישור-לתור מדף-פרט (#133 follow-ups)
All checks were successful
G12 Leak-Guard / leak-guard (pull_request) Successful in 6s

אושר ב-Claude Design (כרטיס 20-halacha-followups).

א׳ תיקון-חילוץ אמיתי ל-quote_unverified:
- `update_halacha` מקבל `supporting_quote`; בעדכונו מריץ `_verify_quote`
  הקיים מול `case_law.full_text` השמור (דטרמיניסטי — בלי OCR/LLM מחדש,
  feedback_no_reocr_retrofit) ומסנכרן `quote_verified` + מוסיף/מסיר את
  הדגל `quote_unverified`. יו"ר שמדביק את הנוסח הנכון מהמקור → הדגל נמחק
  → ההלכה עוזבת את דלי-החילוץ. `HalachaUpdateRequest`+handler מעבירים את
  השדה; `HalachaPatch` + מצב-העריכה ב-HalachaCard כוללים textarea-ציטוט
  (נשלח רק כששונה) + hint.

ב׳ דף-פרט פסיקה — ביטול כפילות-המשטח:
- הלכה pending ב-`ExtractedHalachotSection` מציגה קישור "עבור לתור הלכות"
  במקום כפתורי אשר/דחה כפולים (שער-אישור יחיד, INV-IA/G10).
- `/precedents` Tabs הפך נשלט וקורא `?tab=review` (post-mount, בלי
  hydration-mismatch) כדי שהקישור ינחת על טאב-התור.

display-only ל-G10 (האימות מסנכרן מטא-איכות, לא review_status). ולידציה:
py_compile + tsc + eslint נקיים.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-12 09:03:29 +00:00
parent 99fe16a43d
commit 2962538c09
6 changed files with 96 additions and 25 deletions

View File

@@ -1,7 +1,8 @@
"use client";
import { useMemo, useState } from "react";
import { Check, X, RotateCcw } from "lucide-react";
import Link from "next/link";
import { Check, X, RotateCcw, ArrowLeft } from "lucide-react";
import { toast } from "sonner";
import { Badge } from "@/components/ui/badge";
import { Button } from "@/components/ui/button";
@@ -250,23 +251,19 @@ export function ExtractedHalachotSection({ halachot }: { halachot: Halacha[] })
</Button>
</>
)}
{/* #133 — the chair approves in the unified queue, not here:
a pending halacha links to the queue instead of duplicating the
approve/reject card (single gate, INV-IA/G10). */}
{h.review_status === "pending_review" && (
<>
<Button size="sm" variant="ghost" disabled={update.isPending}
onClick={() => {
if (window.confirm("לדחות הלכה זו?")) setStatus(h, "rejected");
}}
className="text-danger hover:text-danger hover:bg-danger-bg">
<X className="w-3.5 h-3.5 me-1" />
דחה
</Button>
<Button size="sm" disabled={update.isPending}
onClick={() => setStatus(h, "approved")}
className="bg-gold text-navy hover:bg-gold-deep">
<Check className="w-3.5 h-3.5 me-1" />
אשר
</Button>
</>
<Link
href="/precedents?tab=review"
className="inline-flex items-center gap-1.5 text-[0.78rem] font-semibold
text-gold-deep bg-gold-wash border border-gold/40 rounded-md px-3 py-1.5
hover:bg-gold-wash/70 transition-colors"
>
עבור לתור הלכות
<ArrowLeft className="w-3.5 h-3.5" />
</Link>
)}
</div>
</li>