From 394b9b9d9d35cad51005abe866b75c57a20864cd Mon Sep 17 00:00:00 2001 From: ganesh47 <22994026+ganesh47@users.noreply.github.com> Date: Thu, 23 Apr 2026 10:19:34 +0530 Subject: [PATCH] fix(validation): restrict local commands to inferred safe set --- src/validation.ts | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/validation.ts b/src/validation.ts index 0754e08..7e88af4 100644 --- a/src/validation.ts +++ b/src/validation.ts @@ -1412,6 +1412,17 @@ async function runCommandSet(cwd: string, runDir: string, commands: string[]): P }; } +function selectApprovedLocalValidationCommands(requested: string[], inferred: string[]): string[] { + const approved = new Set(uniqueStrings(inferred)); + const selected: string[] = []; + for (const command of uniqueStrings(requested)) { + if (approved.has(command)) { + selected.push(command); + } + } + return selected; +} + async function runValidationSpecialist(options: { cwd: string; runId: string; @@ -2107,12 +2118,16 @@ export async function runDeliverValidationExecution(options: DeliverValidationEx }; } + const approvedLocalCommands = selectApprovedLocalValidationCommands( + validationPlan.localValidation.commands, + initialPlan.localValidation.commands + ); const localValidationRecord: DeliverValidationLocalRecord = result.code === 0 - ? await runCommandSet(options.cwd, options.paths.stageDir, validationPlan.localValidation.commands) + ? await runCommandSet(options.cwd, options.paths.stageDir, approvedLocalCommands) : { status: "not-run", - requestedCommands: validationPlan.localValidation.commands, + requestedCommands: approvedLocalCommands, results: [], notes: "Local validation commands were skipped because the validation lead did not complete successfully." };