/** * The commands a deploy refusal sends a reader to when something has to be re-checked. * * TWO ROUTES, and both are named wherever either is. `python3 senpi-strategy-ops/scripts/…` is what * the skills layer teaches today; `senpi validate` is what actually enforces, because a full, * unscoped run at live depth that PASSES is the only thing that writes the `.senpi-proof.json` this * verb now refuses a package without. A refusal naming only the python route sends an agent around * a loop that cannot close: run the python validator, deploy, get refused for a missing proof, * repeat — the python route cannot end it, and nothing in the refusal says so. * * ONE producer, for the same reason `resumeCommand` is one: every string here is pasted into a * shell verbatim, so the quoting rule (a real workspace path has spaces in it) is decided once * rather than per call site. Its own module because the callers span `deploy/` and `universe/`: * `orchestrator.ts` imports `../universe/package-universe.ts`, so a producer living in either one * would be imported back by the other — the same cycle constraint that gave `error-text.ts` a * module of its own. */ /** * `openclaw senpi validate ''` — the route that records a proof. * * The argument is always a DIRECTORY: an instance's `runtimeYamlDir`, a package root when no * instance is known, or — where the package would not load at all — the directory the caller named, * which is the only target left and the one validate diagnoses identically. Never a manifest * instance NAME (validate resolves a path, and a name is not one — the exact confusion the proof * gate exists to survive), and never a ``, which an agent pastes literally. */ export declare function validateCommand(dir: string): string; /** The skills package validator: the author-side checks over a package, and no proof. */ export declare function deployPyValidateCommand(packageDir: string): string; /** The skills universe validator: the live-instrument half of the checks, and no proof. */ export declare function validateUniversePyCommand(packageDir: string): string; /** * Both routes as an indented block, one command per line — the form every refusal below the "fix" * line uses. * * The validate directories are de-duplicated because two instances can legally share one, and the * same line twice reads as two things to do. The runtime route leads: it is the one that ends the * loop, and a reader who runs only the first command they see should be that reader. */ export declare function recheckBlock(validateDirs: readonly string[], pythonCommand: string): string; /** * The sentence that stops "either" from reading as "either one finishes this". * * Named routes without it are a coin flip an agent loses half the time: the python route answers * the question the refusal asked and still leaves the deploy refusing, with nothing in the text to * explain why. It says which route ends the loop, and does not disparage the other — the skills * validator is what the author-side skill teaches, and it catches these same faults. */ export declare const PROOF_ROUTE_NOTE = "Only `openclaw senpi validate` records the proof this deploy requires; the python route writes none."; //# sourceMappingURL=recheck-commands.d.ts.map