diff --git a/harness/.pi/extensions/tht-gate.js b/harness/.pi/extensions/tht-gate.js index 96772680..fed1490c 100644 --- a/harness/.pi/extensions/tht-gate.js +++ b/harness/.pi/extensions/tht-gate.js @@ -620,8 +620,31 @@ export default function (pi) { `CTE plan approvato (${names.length} CTE, sessione ${session}).`, ); } - if (kind === "cte_result" || kind === "sql") { - const dt = kind === "sql" ? "sql_approved" : "cte_approved"; + if (kind === "cte_result") { + // The CTE under review is always next_cte (plan order is enforced by + // `tht cte test`). Approve it BY NAME: `cte_approved` keys on the CTE + // name (phase.approved_ctes / next_cte); a `phase:N` subject is rejected + // by `decision add` (exit 5) and never satisfies F6's advance prereq. + const cteName = tht(ctx, [ + "cte", + "next", + "--session", + session, + ]).trim(); + if (!cteName) { + return textResult( + `Nessun CTE in attesa di approvazione (sessione ${session}).`, + ); + } + const err = relayIfThtFails( + ctx, + ["decision", "add", "--session", session, "--type", "cte_approved", "--subject", cteName], + "", + ); + if (err) return err; + return textResult(`CTE '${cteName}' approvato (sessione ${session}).`); + } + if (kind === "sql") { const err = relayIfThtFails( ctx, [ @@ -630,14 +653,14 @@ export default function (pi) { "--session", session, "--type", - dt, + "sql_approved", "--subject", `phase:${currentPhase(ctx, session)}`, ], "", ); if (err) return err; - return textResult(`${kind} approvato (sessione ${session}).`); + return textResult(`SQL approvato (sessione ${session}).`); } return textResult(`Approvato (kind=${kind}, sessione ${session}).`); },