import { z } from 'zod'; /** * The three phases between "never heard of Reticle" and "it produced a verdict on my app". * * Named as one vocabulary because the question they exist to answer is one question: WHERE do people * stop. Prior measurement put the break at instrumentation — user retention strong, verification * retention far weaker — and `init_completed` cannot see that, because it fires when the files are * written and the story continues for minutes afterwards. */ export declare const OnboardingPhase: { /** Getting the CLI onto the machine and the MCP registered with the agents that are there. */ readonly INSTALL: "install"; /** Being shown what Reticle is and how it is driven, before being asked to drive anything. */ readonly ONBOARD: "onboard"; /** Instrumenting a real project and driving it until something is actually proved. */ readonly FIRST_RUN: "first_run"; }; export type OnboardingPhase = (typeof OnboardingPhase)[keyof typeof OnboardingPhase]; /** * What became of one step. * * `ABANDONED` is the one that earns its place: a step that is STARTED and never resolved is * indistinguishable from one that was never reached, and both read as "we never got there" in a * funnel. Saying a person walked away from a step we know they began is a different fact from * saying the step failed, and only one of them is our bug. */ export declare const OnboardingStepStatus: { readonly STARTED: "started"; readonly COMPLETED: "completed"; readonly FAILED: "failed"; readonly ABANDONED: "abandoned"; /** Nothing to do — already installed, already instrumented. Not a loss, and not a win either. */ readonly SKIPPED: "skipped"; }; export type OnboardingStepStatus = (typeof OnboardingStepStatus)[keyof typeof OnboardingStepStatus]; /** * The steps, per phase, as ONE table. * * Written down here rather than as string literals at each emit site, for the reason rule 4 exists: * a vocabulary copied into the place that uses it drifts from the place that reads it, and the * reader is a dashboard nobody re-checks. A step that is renamed here is renamed everywhere or it * does not compile. * * The ORDER matters and is the funnel: each phase's steps are listed in the sequence they occur, so * a drop-off curve is this array with counts against it. */ export declare const OnboardingSteps: { readonly install: readonly ["script_started", "runtime_ready", "cli_installed", "agents_detected", "mcp_registered"]; readonly onboard: readonly ["tour_started", "concept_shown", "first_look", "first_act", "first_verdict"]; readonly first_run: readonly ["project_detected", "instrumented", "app_connected", "driven", "flow_recorded", "verdict_produced"]; }; export declare const OnboardingStepSchema: z.ZodObject<{ phase: z.ZodNativeEnum<{ /** Getting the CLI onto the machine and the MCP registered with the agents that are there. */ readonly INSTALL: "install"; /** Being shown what Reticle is and how it is driven, before being asked to drive anything. */ readonly ONBOARD: "onboard"; /** Instrumenting a real project and driving it until something is actually proved. */ readonly FIRST_RUN: "first_run"; }>; /** * Our name for the step, and ONLY one of ours. * * This was `z.string().max(48)`, with a comment promising it was never user text — and a cap is * not a promise. `/Users/someone/secret/project` is 28 characters and validated cleanly, which is * a rule-3 leak (names, never values) reaching the wire from the one payload a person can edit: * the installer's breadcrumb file, on disk, in their own home directory. * * A closed set makes the promise enforceable instead of aspirational. Found by the test written * for that file, not by reading this line. */ step: z.ZodEnum<[string, ...string[]]>; status: z.ZodNativeEnum<{ readonly STARTED: "started"; readonly COMPLETED: "completed"; readonly FAILED: "failed"; readonly ABANDONED: "abandoned"; /** Nothing to do — already installed, already instrumented. Not a loss, and not a win either. */ readonly SKIPPED: "skipped"; }>; /** * Milliseconds this step took. Absent when the step is instantaneous or not timed — absent means * NOT MEASURED, never zero, because a zero would pull every average toward a duration nobody had. */ elapsedMs: z.ZodOptional; /** Classified cause when it failed — our vocabulary, never a raw error or a path. */ reason: z.ZodOptional; /** The stack it was detected on, so a phase that only fails on one framework is visible. */ stack: z.ZodOptional; /** * True when nobody was asked anything — the zero-human-input path an agent takes from a link. * * Recorded because the two audiences fail differently and a funnel that mixes them explains * neither: a human abandons a step, an agent's run exits. */ unattended: z.ZodOptional; }, "strip", z.ZodTypeAny, { status: "skipped" | "started" | "completed" | "failed" | "abandoned"; step: string; phase: "install" | "onboard" | "first_run"; reason?: string | undefined; stack?: string | undefined; elapsedMs?: number | undefined; unattended?: boolean | undefined; }, { status: "skipped" | "started" | "completed" | "failed" | "abandoned"; step: string; phase: "install" | "onboard" | "first_run"; reason?: string | undefined; stack?: string | undefined; elapsedMs?: number | undefined; unattended?: boolean | undefined; }>; export type OnboardingStep = z.infer;