/**
 * Design Quality Validation Rules
 *
 * Deterministic, AST-inspectable rules that catch common workflow design problems.
 * A workflow can compile fine and still be poorly designed: missing error paths,
 * unbounded retries, fan-out without fan-in, dead-end branches.
 *
 * All rules are warnings or info. None block compilation.
 * Users can suppress any with @suppress.
 *
 * Rules:
 * 1. DESIGN_ASYNC_NO_ERROR_PATH - Async node has no onFailure connection
 * 2. DESIGN_SCOPE_NO_FAILURE_EXIT - Scope has no failure path out
 * 3. DESIGN_UNBOUNDED_RETRY - Retry scope has no visible attempt limit
 * 4. DESIGN_FANOUT_NO_FANIN - Fan-out to step targets with no merge back
 * 5. DESIGN_EXIT_DATA_UNREACHABLE - Exit data port has no connection and no pull-execution provider
 * 6. DESIGN_PULL_CANDIDATE - Node with no incoming step but consumed data outputs
 * 7. DESIGN_PULL_UNUSED - Node marked pullExecution but no downstream reads its output
 */
import type { TValidationRule } from '../ast/types.js';
/**
 * Async nodes (network, disk, AI) can fail. If onFailure is unconnected,
 * failures may be silently swallowed or crash the workflow.
 */
export declare const asyncNoErrorPathRule: TValidationRule;
/**
 * A scope (retry/forEach) with no failure path out means if every iteration
 * fails, execution stalls with no way to surface the error.
 */
export declare const scopeNoFailureExitRule: TValidationRule;
/**
 * A scope used as a retry loop without a visible attempt limit could loop
 * indefinitely. Check if the parent node type name/function suggests retry
 * semantics but lacks a maxAttempts-like input or config.
 */
export declare const unboundedRetryRule: TValidationRule;
/**
 * A node that fans out via step connections to multiple targets, but none of
 * those paths merge back to a shared downstream node. Data from parallel
 * branches may be lost.
 */
export declare const fanoutNoFaninRule: TValidationRule;
/**
 * Extends UNREACHABLE_EXIT_PORT to consider pull execution. An exit data port
 * is fine if a pull-executed node is wired to provide it, even without a
 * step path.
 */
export declare const exitDataUnreachableRule: TValidationRule;
/**
 * A node with no incoming step connections but data outputs consumed downstream
 * is a candidate for pullExecution. Without it, the node may never execute.
 */
export declare const pullCandidateRule: TValidationRule;
/**
 * A node marked with pullExecution but no downstream node reads its data output.
 * The node will never execute since pull execution requires a consumer.
 */
export declare const pullUnusedRule: TValidationRule;
export declare const designValidationRules: TValidationRule[];
export declare function getDesignValidationRules(): TValidationRule[];
//# sourceMappingURL=design-rules.d.ts.map