From 160d7f075e465fba6b0a5773c1784c6b765d390f Mon Sep 17 00:00:00 2001 From: mptyl Date: Wed, 1 Jul 2026 16:34:54 +0200 Subject: [PATCH] fix(gate): F6 approves each CTE by name, not 'phase:6' MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit reviewer_confirm kind:'cte_result' registered cte_approved --subject phase:6, which decision_cmd rejects (exit 5) and next_cte never recognizes — dead-ending F6. Derive the CTE name from 'tht cte next' (plan-order single source of truth) and approve by name. sql path (sql_approved:phase:N) unchanged. Co-Authored-By: Claude Opus 4.8 --- harness/.pi/extensions/tht-gate.js | 31 ++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) 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}).`); },