// These three sections used to be pushed into the DOM after render() had already // written the shell. Keeping them in the markup makes the rendered output the // single source of truth, so an unchanged render can be skipped safely. function renderDeploymentPolicyFields(policy) { const windows = (policy.maintenanceWindows || []) .map((window) => `${window.days.join(",")}:${window.start}-${window.end}`) .join(" | "); return `
${escapeHtml(workload?.classification?.reason || "ForgeFlow needs an explicit decision for this workload.")}
No configuration changes are proposed.
${escapeHtml(plan.blockers.join(" "))}
No tracked file changes between local HEAD and Gitea.
${discovery ? `${escapeHtml(discovery.runtime?.containers || 0)} container(s), ${escapeHtml(discovery.runtime?.services || 0)} service(s) and ${escapeHtml(discovery.runtime?.ports?.length || 0)} port mapping(s) detected. Every imported value remains editable as an explicit override.` : "For a known folder, ForgeFlow can read Docker, Compose and DockerMan metadata. For uncertain matches, use Server inventory and select the actual running workload."}
${escapeHtml(rotation?.recovery || "")}
Plan ${escapeHtml(rotation?.id || "unavailable")}Containers remain untouched. Server pull changes to monitoring-only until restored.
Plan ${escapeHtml(revocation?.id || "unavailable")}${escapeHtml(ui.selectedFile)}
${escapeHtml(hunk.lines.join("\n"))}`).join("")}Resolve these files, then continue: