diff --git a/services/pcp-tgu-ops-ui/src/features/tgu-planning/TguPlanDetails.tsx b/services/pcp-tgu-ops-ui/src/features/tgu-planning/TguPlanDetails.tsx
index 78f23e3..ab0b4ed 100644
--- a/services/pcp-tgu-ops-ui/src/features/tgu-planning/TguPlanDetails.tsx
+++ b/services/pcp-tgu-ops-ui/src/features/tgu-planning/TguPlanDetails.tsx
@@ -4,6 +4,13 @@ import { platformLabel } from "./tguTimelineMapper";
import { statusStyle } from "./tguStatus";
import { formatUtcDateTime, parseUtc } from "../../utils/utcTime";
+// Бэкенд (pcp-tgu-service) ждёт решения по плану только waiting-decision-grace-minutes
+// минут после его startTime; затем IssueDuePlanWorker.tryAdvancePastUnconfirmedPlan
+// «молчаливо» продолжает цепочку, оставляя план в WAITING_DECISION, но решение по нему
+// больше не принимается (endpoint вернёт 409). Держим значение синхронным с
+// config-repo/pcp-tgu-service.yaml → tgu.planning.waiting-decision-grace-minutes.
+const DECISION_GRACE_MINUTES = 30;
+
type TguPlanDetailsProps = {
plan?: TguPlanUi;
decisionInFlight: boolean;
@@ -27,6 +34,8 @@ export function TguPlanDetails({ plan, decisionInFlight, notice, error, onDecisi
const style = statusStyle(plan.status);
const duration = formatDuration(plan.endMs - plan.startMs);
+ // Окно решения закрылось, если с момента старта плана прошло больше grace-периода.
+ const decisionWindowClosed = Date.now() > plan.startMs + DECISION_GRACE_MINUTES * 60_000;
const reject = () => {
const reason = window.prompt("Reason для REJECTED", "UI_TEST_REJECTED");
@@ -62,21 +71,27 @@ export function TguPlanDetails({ plan, decisionInFlight, notice, error, onDecisi