// Internal review / follow-up flow function Reviews() { const review = window.REQUESTS.find((r) => r.status === "internal-review"); const refused = window.REQUESTS.find((r) => r.status === "refused"); return (
Internal review & follow-up
Active review
{review.title}
{review.id} ยท against {refused.id}
Grounds (auto-suggested)
  1. The public interest test under s.35(1)(a) has not been adequately demonstrated; selection criteria for the Behaviour Hubs programme are of significant public interest.
  2. Comparable criteria for the Maths Hubs programme were released under FOI (ref DfE/2024/1182) without invocation of s.35.
  3. The decision letter does not address Tribunal Case EA/2019/0211 (Department for Education v ICO).
Escalation path
{[ { stage: "1", title: "Substantive response", desc: "20 working days from dispatch", state: "done" }, { stage: "2", title: "Internal review", desc: "Up to 40 working days, typically 20", state: "active" }, { stage: "3", title: "ICO complaint", desc: "If review unsatisfactory or not responded", state: "next" }, { stage: "4", title: "First-tier Tribunal", desc: "Appeal against ICO decision notice", state: "future" } ].map((s, i, arr) => (
{s.stage}
{s.title}
{s.desc}
{s.state === "done" && Complete} {s.state === "active" && Current} {s.state === "next" && Drafted}
))}
Original refusal
{refused.id}
{refused.title}
Sections.35(1)(a) Refused on{refused.deadline} Reviewable until{(() => { const d = new Date(refused.deadline); d.setDate(d.getDate() + 40); return d.toISOString().slice(0,10); })()}
Follow-up queue
Auto-drafted on day 19 if no substantive response received
{window.REQUESTS.filter((r) => ["in-progress","acknowledged","overdue"].includes(r.status)).slice(0, 3).map((r) => { const daysLeft = 20 - r.workingDaysElapsed; const tone = daysLeft < 0 ? "danger" : daysLeft <= 2 ? "warn" : "info"; return (
{r.id}
{r.title}
{daysLeft >= 0 ? `${daysLeft}d to follow-up` : `${Math.abs(daysLeft)}d overdue`}
); })}
); } Object.assign(window, { Reviews });