/**
* 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