# The job build loop Source: https://docs.minicor.com/agents/job-build-loop The canonical way an agent works on a job: samples define done, then build until they pass. This is the loop every agent should run when building or fixing a job. It is the same loop the platform's own builder follows. There are two ways to get the steps written: hand the work to the builder with `teach_job`, or author the step graph yourself with `register_job` and `update_job`. Either way, this loop is how the work is verified. ## The loop Before touching the job, make sure it has samples that encode what correct means. Use `teach_job` with a real input and a plain-language intent, or `add_test_case` with an input and checks. Group related samples into scenarios. A job with no samples has no definition of correct, and nothing you build against it can be verified. Create or update the job's step graph with `register_job` or `update_job` with `variant: "draft"`. Steps call whole automations or run code blocks. Data flows through `ctx`: each step can save its output under a key, and later steps reference it. `run_tests` with `variant: "draft"` runs every sample. Green means go live. Red means step 4. Never declare a job working without a green run of its samples. `resolve_job_state` tells you where the job stands and what to do next. `get_test_report` shows which scenarios failed, and `inspect_job_execution` drills a failing sample down to the failing step and its run underneath. If the problem is in the job's wiring (step order, data passing, checks), update the draft and re-run just the failing slice: `run_job` from a step, seeded with the failed execution so earlier steps' values resolve without re-running them. If the problem is inside an automation step, fix the step's code, then return to step 3. Fixes are proven by samples, not by eyeballing a single run. When the draft's samples are green, `publish_job` takes it live. Traffic at the trigger URL switches immediately. ## Rules that keep the loop honest * **Samples define done.** If the user describes new behavior, teach it as a sample before building it. * **Never edit live directly.** All work happens on the draft; live changes only through going live. * **Pass `variant: "draft"` explicitly.** `update_job`, `run_job`, and `run_tests` default to the live variant. Teach and build work always targets the draft. * **Reproduce with the seed.** When re-running a failing slice, seed from the failed execution so you are debugging the real state, not a fresh one. * **Stops are cooperative.** There is no pause. Stopping a run lets the current operation finish; plan around that for long automations. * **When lost, ask the platform.** `resolve_job_state` returns the concrete next calls for exactly this loop. > The mistake agents make is skipping step 1: building first and never defining done. Run the steps in order; every later step leans on the samples to say what correct is. # The Minicor MCP Source: https://docs.minicor.com/agents/mcp Connect any coding agent to Minicor. Everything the dashboard does, your agent can do through MCP. Minicor exposes a Model Context Protocol server. Point Cursor, Claude Code, or any MCP-capable agent at it and the agent can teach jobs, run samples, inspect failures, drive desktops, and take jobs live, the same surface the dashboard and the co-pilot use. ## Hosted server (recommended) The easiest way to connect: no install, no local process. The server runs at ```text theme={null} https://mcp.minicor.com/mcp ``` Add a URL entry to `~/.cursor/mcp.json`; Cursor prompts for the sign-in on first use: ```json theme={null} { "mcpServers": { "minicor": { "url": "https://mcp.minicor.com/mcp" } } } ``` ```bash theme={null} claude mcp add --transport http minicor https://mcp.minicor.com/mcp ``` Then run `/mcp` inside Claude Code to trigger the sign-in. Go to **Settings > Connectors > Add custom connector**, paste `https://mcp.minicor.com/mcp`, and save. OAuth is auto-discovered; no client ID or secret. Authentication is an OAuth flow: your client opens the Minicor sign-in page, you enter your email, password, and region (US or Canada), and the connection acts as your account. No API keys, no local tokens. Access tokens expire within an hour and refresh automatically for up to 30 days; after that you sign in again. The hosted tool set matches the local server except for the tools that read and write your local disk (workspace clones, sessions, sync). If you need those, install locally. ## Local install Add the server to `~/.cursor/mcp.json`: ```json theme={null} { "mcpServers": { "minicor": { "command": "npx", "args": ["-y", "@minicor/mcp-server"] } } } ``` ```bash theme={null} claude mcp add minicor -- npx -y @minicor/mcp-server ``` Then authenticate: ```bash theme={null} npx -y -p @minicor/mcp-server minicor-mcp-setup ``` This opens a browser to sign in with your Minicor account. Tokens are stored at `~/.minicor/tokens.json` and refresh automatically. On a headless machine or over SSH, add `--cli` to sign in from the terminal. ## What the surface covers | Area | What an agent can do | | -------------- | ---------------------------------------------------------------------------------------------- | | Jobs | Teach with samples, group scenarios, run samples, read run reports, inspect failures, go live. | | Automations | Create and edit the steps underneath a job, run them against a desktop. | | Executions | List runs, read step outputs, fetch replays and screenshots, diagnose failures. | | Desktops | Connect, screenshot, inspect UI elements, execute scripts, control runs. | | Configurations | Create and update key-value configurations, including two-factor channels and secrets. | | Workspace | Issues for shared context, skills for reusable automation patterns, agents on watch. | ## Where to go next * [The job build loop](/agents/job-build-loop) is the canonical way an agent should work on a job. Read it first. The zero-to-live path is short: connect, pick a workspace, make sure a desktop is attached, teach samples, run them until green, go live. * [Sessions](/agents/sessions) covers long-running work and handoffs between agents. * [Tools](/agents/tools) is the one-page overview of the tool families. > These docs are written to be read by agents as much as by people. If you are an agent connected to the MCP: samples define done. Start every job task by making sure the job has samples that encode what correct means. # Sessions Source: https://docs.minicor.com/agents/sessions Long-running work and handoffs: how agents keep state across machines, restarts, and each other. Building an automation often outlasts one context window, one machine, or one agent. Sessions make the work resumable. ## Working in a cloned workspace An agent can clone a workspace to a local folder: the jobs, the automations, the accumulated skills, and the open issues, in files it can read and diff. The clone includes a generated `AGENTS.md` with the workspace's rules and the phase loop for the work. Inside a clone, the contract is: 1. **Call `session_start` first.** It returns the workspace rules, the current state of the work, and whatever a previous session left behind, so the agent resumes rather than restarts. 2. **Checkpoint as you go.** `session_checkpoint` persists progress at meaningful points. 3. **Call `session_end` before finishing.** It writes the final state so the next agent, on any machine, picks up where this one stopped. If an agent disconnects mid-session, the platform checkpoints automatically with an interrupted status. Nothing is lost to a crash or a closed IDE. ## Handoffs Session state syncs to the workspace itself, not just the local folder. That is what makes multi-agent work practical: an agent on another machine, a scheduled run overnight, or a person in the dashboard all see the same record of what was done, what broke, and what was decided. Two conventions carry the context: * **Issues** hold durable notes: quirks of the target system, decisions made, problems encountered. Read them before starting; write them when you learn something the next agent needs. * **Skills** hold reusable automation patterns learned from previous builds, per workspace. Load the relevant ones before writing automation code, and save new ones when you solve something general. > Treat `session_start` and `session_end` as non-negotiable bookends. The cost is two calls; the payoff is that no agent ever starts from zero on work another agent already did. # Tools Source: https://docs.minicor.com/agents/tools The MCP tool families in one page. The Minicor MCP groups its tools by what they operate on. This page is the map; each tool's own description carries its full schema. ## Jobs The endpoint, its samples, and its lifecycle. * `teach_job`, `add_test_case`, `update_test_case`: teach with real inputs, manage samples and their checks, group scenarios. * `register_job`, `update_job`, `get_job`, `delete_job`: the job's step graph, edited with `variant: "draft"`. * `run_job`, `run_tests`, `get_test_report`: run the job or all of its samples, read the results per scenario. * `list_job_executions`, `get_job_execution`, `inspect_job_execution`: run history and failure drill-down. * `resolve_job_state`: where the job stands and the concrete next calls. * `publish_job`, `get_build_status`, `answer_build_question`, `cancel_build`: go live, follow the builder, answer its questions. ## Automations and executions The steps underneath a job and their runs. * Create, read, and edit the automation steps; run an automation whole or from a specific step. * List executions, read each step's input and output, and diagnose failures with automation-aware analysis. * Fetch replays: full recordings, single frames, zoomed regions, and clips around the moment of failure. * Analyze a replay with computer vision: `analyze_recording` maps a run into UI events with timestamps, change regions, click positions, and a step-to-video timeline. Clicks and keystrokes come from the desktop's recorded input telemetry when it is present, and are inferred from the video otherwise. `annotate_recording` renders any moment with the analysis drawn on the frame: event boxes, click markers, the cursor trail. A replay frame annotated by the MCP: the green box is the screen region the analysis saw change, the orange marker is the click it inferred from the video. An agent debugging a failure does not have to watch the video: it asks for the analysis, jumps to the event that matters, and reads the annotated frame. ## Desktops * `vm_connect`, `vm_status`, `vm_screenshot`, `vm_screenshot_region`: attach to a desktop and see it. * `vm_execute_script`, `vm_inspect_ui`, `vm_read_clipboard`, `vm_execution_control`: act on it, inspect the UI element tree, control a running script. * Deployment helpers install and start the Minicor Desktop Service on a new machine. ## Configurations and two-factor * Configurations: create them, read and update the properties resolved into runs. * Two-factor: provision virtual phone numbers and email addresses, register TOTP secrets (including from a QR code), generate current codes, and resolve challenges mid-run. ## Workspace * Workspaces: list, inspect, create. * Issues: durable context shared between agents and people. * Skills: reusable automation patterns, loaded before building and saved after learning something general. * Agents: create and manage on-demand, scheduled, or monitoring agents. * Sessions and sync: clone a workspace locally, `session_start` / `session_checkpoint` / `session_end`, push and pull changes. See [Sessions](/agents/sessions). > When in doubt, start with `resolve_job_state` for job work and `get_workspace_context` for everything else. Both return the situation and the next calls, which beats guessing from tool names. # Authentication Source: https://docs.minicor.com/api/authentication One API key in the x-api-key header, for live calls, teaching, and the reserved paths. All requests to a trigger URL authenticate with an API key in the `x-api-key` header: ```bash theme={null} curl -X POST "https:///create-invoice" \ -H "x-api-key: $MINICOR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "customerName": "Bobs Tires" }' ``` The same key covers live calls, teaching calls, and the reserved introspection paths (`/_jobs`, `/_executions/:id`, `/_builds/:id`). The OpenAPI document at `/swagger.json` is the one path that does not require it. ## Getting the key The key lives with the trigger URL. Open a job and click **Call this job**: the dialog shows the trigger URL and the API key together, ready to copy. Every job behind the same trigger host shares the key. Keys you create under **Settings** are workspace API keys for the Minicor platform itself (the dashboard, the MCP, and platform APIs). They are not the trigger key. ## Handling the key * Pass the key from a secret store or environment variable at request time. Never commit one. * If the key is exposed, contact the Minicor team to replace it. A missing or invalid key returns `401` with no further detail. # Calling jobs Source: https://docs.minicor.com/api/calling-jobs The full HTTP contract for a job's trigger URL. Every live job is an HTTP endpoint at its trigger URL, shown on the job page. All requests carry your API key in the `x-api-key` header. ## Request ```bash theme={null} curl -X POST "https:///create-invoice" \ -H "x-api-key: $MINICOR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "customerName": "Bobs Tires", "amount": 1250.00 }' ``` Jobs can be registered on any HTTP method. The job's input is the merge of query parameters and the JSON body; if a key appears in both, the body wins. Request metadata (method, path, path parameters, headers) is available to the job under `_http`, so a job can read a path parameter or a header when it was taught to. ## Synchronous response By default the connection holds until the run finishes. The body is the job's output as structured JSON. | Status | Meaning | | ------ | ---------------------------------------------------------------- | | `200` | The run succeeded. | | `207` | The run partially succeeded. The body reports per-step outcomes. | | `401` | Missing or invalid `x-api-key`. | | `404` | No job matches the method and path. | | `502` | The run failed. The body carries the error. | ## Asynchronous execution Add `?async=1` to the URL, or send the header `x-job-async: true`. The call returns `202` immediately: ```json theme={null} { "jobExecutionId": "8f2c41d6-93b4-4a1e-9d0e-5b7a2c6f13aa", "status": "queued", "resultPath": "/m/acme/_executions/8f2c41d6-93b4-4a1e-9d0e-5b7a2c6f13aa" } ``` `resultPath` is relative to the host; appended to it, it resolves to the `/_executions/:id` path under your trigger URL. Poll it with the same API key: ```bash theme={null} curl "https:///_executions/8f2c41d6-93b4-4a1e-9d0e-5b7a2c6f13aa" \ -H "x-api-key: $MINICOR_API_KEY" ``` The response reports the execution's status (`running`, then a terminal state) and, once done, the job's output, the same body a synchronous call would have returned. ## Status webhooks Polling tells you where a run stands when you ask. Webhooks tell you the moment it changes. Add a `callback_url` query parameter when you execute an automation and Minicor POSTs a JSON event to that URL as the run progresses: | Event | When it fires | | --------------------- | --------------------------------- | | `execution_started` | The run has started. | | `step_started` | A step has begun. | | `step_completed` | A step finished successfully. | | `step_failed` | A step failed. | | `execution_completed` | The run reached a terminal state. | Step events carry the step's name, its position in the run (`executionOrder` of `totalSteps`), its status, and its result. The completion event carries the final status, the result, and a link to the replay. ```json theme={null} { "eventType": "step_completed", "executionId": 48291, "timestamp": "2026-07-24T17:31:04Z", "step": { "flowName": "Create invoice in billing system", "executionOrder": 3, "totalSteps": 5, "status": "SUCCESS" } } ``` Deliveries are fire-and-forget: a failed delivery is retried once and never blocks or slows the run. The callback URL must be publicly reachable over HTTP or HTTPS. Webhooks fire per automation execution. For a job called at its trigger URL, follow progress by polling the execution's result path, which moves from `queued` to `running` to a terminal status with `done: true`. ## Reserved paths A few paths on your trigger host are reserved for introspection: | Path | Returns | | --------------------------- | ------------------------------------------------------------------------------ | | `GET /swagger.json` | An OpenAPI document describing the jobs on this trigger host. No key required. | | `GET /_jobs` | The list of jobs and their endpoints. | | `GET /_executions/:id` | The status and result of one execution. | | `GET /_builds/:id` | The status of a build, including any open question. | | `POST /_builds/:id/answers` | Answer a builder question. | Everything except the OpenAPI document requires the API key. ## Teaching over the same endpoint A call whose body includes the `minicor.teach` envelope is a teaching call, not a live run. See [The teach envelope](/api/teach). # The teach envelope Source: https://docs.minicor.com/api/teach Add minicor.teach to any call and it becomes a lesson instead of a live run. Teaching happens over the same endpoint as live traffic. A call whose body contains the `minicor` envelope with `teach: true` is a teaching call: it creates or updates a sample, and it never touches live traffic. ## Shape ```json theme={null} { "customerName": "Bobs Tires", "amount": 1250.00, "dueDate": "2026-08-15", "minicor": { "teach": true, "prompt": "Create an invoice in the billing system for this customer. If the customer already has an open invoice for the same amount, refuse and say why.", "scenario": "Rejects duplicate invoice", "artifacts": [ { "type": "url", "url": "https://example.com/sops/invoicing.pdf" }, { "type": "text", "text": "The billing system rejects due dates in the past." } ] } } ``` Everything outside `minicor` is the sample input, exactly as your product would send it on a live call. ## Fields | Field | Required | What it does | | ----------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `teach` | Yes | Marks the call as a teaching call. | | `prompt` | Yes | What the job should do with this input, in plain language. On later samples, use it to describe the expected outcome for this specific case. | | `scenario` | No | Names the scenario this sample belongs to. Without it, the platform buckets the sample automatically. Manual grouping always wins. | | `expect` | No | The expected outcome for this sample: fields the response should contain, or `{ "refusal": "why" }` when the correct behavior is to refuse. | | `artifacts` | No | Context for the builder: SOP documents, transcripts, walkthrough videos, or plain notes. Each entry carries a `type` and a matching `url` or `text` field, plus an optional `description`. | ## What a teach call does 1. The first teach call to an unknown method and path **creates the job** in the Learning state and starts the builder. 2. Every teach call **records a sample**: the input, the intent, and the checks derived from it. 3. The **builder runs** until this sample and every existing sample pass. 4. If the job is already Live, the work happens on a new version and production traffic is untouched until you go live again. The response acknowledges the lesson and points at the build, which you can follow on the job page or poll at `GET /_builds/:id`. > Send the payload your product actually produces, not a cleaned-up version. The sample is the contract for live calls, and the job is only as honest as its inputs. # How it runs Source: https://docs.minicor.com/how-it-runs What happens between your API call and the desktop. You call a job's trigger URL. Minicor runs the automation on a desktop. You get structured JSON back. That is the whole contract, and this page fills in just enough of the middle to reason about it. ## The path of a request ```mermaid theme={null} flowchart LR You[Your product] -->|"POST trigger URL"| Engine[Jobs engine] Engine -->|runs the job steps| Platform[Minicor platform] Platform -->|drives the application| Desktop[Minicor Desktop Service on a Windows desktop] Desktop -->|results and recording| Platform Platform --> Engine Engine -->|structured JSON| You ``` 1. Your product calls the trigger URL with an API key and a JSON body. 2. The jobs engine, the service behind your trigger URLs, matches the request to your job and runs its steps in order. Most steps execute an automation on a desktop; some transform data between steps. 3. On the desktop, the Minicor Desktop Service drives the target application the way a person would, while recording the screen. 4. The result flows back as structured JSON. By default the call is synchronous; for long-running work you can ask for an execution ID and poll instead. See [Calling your job](/running/calling-your-job). ## What makes it reliable The determinism of an API, the power of AI. The automation steps are deterministic code, built and tested against your real samples until every scenario passes. The intelligence is spent at teach time, not on every request. When something new does break in production, you teach the job the new case and the fix becomes a permanent scenario. See [Self-healing](/teaching/self-healing). ## The same platform, three ways in * **The dashboard**, where you teach jobs, watch the builder, and go live. * **The co-pilot**, a chat rail inside the dashboard that operates the platform for you. See [Co-pilot](/teaching/co-pilot). * **The Minicor MCP**, the same tool surface exposed to your own coding agents. See [Connect an agent](/agents/mcp). > Everything you can do in the dashboard, an agent can do through the MCP. The [For agents](/agents/mcp) section exists so agents can operate the platform end to end. # What is Minicor? Source: https://docs.minicor.com/index The interface between AI and legacy desktop applications: call them like any API. Minicor is SOC 2 Type II certified and HIPAA compliant. Automations and their data can run entirely [on your own cloud](/operations/network-boundary). Minicor is the interface between AI and legacy desktop applications: call them like any API. Minicor agentically builds self-healing automations on any no-API system, EHR, ERP, DMS, TMS, SCM, CMS, then hands you an API endpoint to call. No integration to build, nothing to maintain. The unit of automation is a **job**. A job is an endpoint that represents an automation. You teach it by sending real sample API calls. The builder works on the automation until every sample passes. Then you go live and call the same endpoint from your product, like any other API. The Jobs page: each job is an endpoint with a state, and taught changes waiting to be promoted show as Live · new lesson ready. ## How you work with Minicor 1. **Connect a desktop.** Jobs run on a Windows machine with the [Minicor Desktop Service](/running/desktop-service) installed. Use a cloud desktop provisioned through Minicor or a machine in your own environment. 2. **Teach a job with real examples.** Send sample API inputs to the job's endpoint. The platform buckets your samples into **scenarios**, one for each behavior the job needs to handle. 3. **Watch the builder work.** The builder constructs and refines the automation until every sample passes. It asks you questions when it needs answers. 4. **Go live.** The job earns a [stability score](/teaching/stability) as samples pass and live traffic succeeds. When you go live, the same URL serves production traffic. > The samples you teach are the definition of correct. The more scenarios a job has, the more reliable it gets. That is also how [self-healing](/teaching/self-healing) works on Minicor. ## What runs underneath Each job is a sequence of automation steps that execute on a desktop through the Minicor Desktop Service. Steps drive the target application the way a person would: navigating screens, filling fields, reading results. Every run is recorded, so you can watch a [replay](/running/executions-and-replays) of exactly what happened on the desktop. ## What the platform gives you | | | | ----------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Stay in control** | [Verification](/operations/verification) checks the screen before critical actions, human review steps gate the writes you choose, and agent actions require your approval. | | **End-to-end observability** | Audit logs and a video [replay](/running/executions-and-replays) of every step, for every run. | | **Plugs into your stack** | [Status webhooks](/api/calling-jobs#status-webhooks) and telemetry push events to your systems in real time. | | **Authentication that holds** | [2FA / OTP](/running/two-factor) handled inside the run, credentials vaulted in [configurations](/running/configurations), and authenticated sessions reused across runs. | | **Scale** | Run many jobs at once. Runs serialize per [desktop](/running/desktops) and scale out across desktops. | | **Deploy anywhere** | [Desktops, virtual machines, browsers, and Citrix](/running/desktops#where-automations-run). Host on our cloud, or [entirely on yours](/operations/network-boundary). | ## Where to start Teach your first job in a few minutes. What happens between your API call and the desktop. How teaching works and how scenarios are formed. Point your coding agent at the Minicor MCP. # Exceptions and telemetry Source: https://docs.minicor.com/operations/exceptions-and-telemetry How failures are categorized, where they surface, and how they reach your systems. Automations against legacy systems fail for reasons that have nothing in common: a UI change, bad input, the target system being down. Operating at scale means categorizing failures so each kind routes to the right fix, instead of being triaged by hand every time. ## The four categories | Category | What happened | Resolution | | ------------------- | ---------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------- | | Automation failure | The job did not do what it should: a missed click, a wrong field, an element that moved. | Watch the replay, teach the failing case, go live with the fix. | | Bad input | The caller sent data the target system rejects: a missing field, an invalid format, a date rule violation. | Route back to the caller. This is an upstream fix. | | System instability | The target system is down, hanging, or in maintenance. A person could not complete the task either. | Retry later. Excluded from the job's stability signal. | | External dependency | A prerequisite owned by someone else is missing: a document not uploaded, an approval not given. | Hold and notify whoever owns the prerequisite. | Tracking bad input over time is worth the effort on its own. A validation error that fires many times a day is a signal to add validation upstream in your product; one that fires monthly is not worth the engineering. ## Where failures surface **Callbacks.** The primary machine channel. When a run fails, your failure endpoint receives structured error information, including the category, so your system can update statuses, open tickets, or trigger its own flows automatically. **Slack.** Executions post to a dedicated telemetry channel: job name, status, and a link to the replay. Failures are flagged with what likely went wrong. Most production triage happens directly from this channel, without opening the dashboard. **Your observability stack.** Failures can flow into your existing tooling through an OpenTelemetry pipeline or a notification endpoint you define. Execution artifacts and logs can be written to a storage bucket you choose, including one inside [your own boundary](/operations/network-boundary). Callbacks, Slack channels, and export destinations are wired up with your Minicor team when you move to production. > The failure loop is teach-shaped on purpose. An automation failure becomes a sample, the sample becomes a scenario, and the same failure does not come back. See [Self-healing](/teaching/self-healing). # Human in the loop Source: https://docs.minicor.com/operations/human-in-the-loop Patterns for putting a person exactly where one belongs: on the write that matters, and nowhere else. Most of a job should run without anyone watching. The point of human-in-the-loop is precision: a person on the one action that deserves judgment, automation on everything else. These are the patterns, from lightest to heaviest, and how to build each one. ## Verify, gate, write The default. Before a critical action, a [verification step](/operations/verification) checks the screen against a plain-language expectation and a gate stops the run if it fails. No person involved unless something is wrong, and when something is wrong, nothing gets written. **Build it:** ask for it when you teach. "Verify we are on the right screen before submitting, and stop if we are not." The builder puts the verification and the gate in place. ## Refuse instead of guessing When the input itself is the problem, the right behavior is a refusal the caller can act on, not a best guess. A job taught with refusal scenarios rejects bad input instantly and returns why. **Build it:** teach a sample with `expect: { "refusal": "why" }` in the [teach envelope](/api/teach). Duplicate records, missing fields, and unknown entities each become a scenario that refuses cleanly. ## A person approves the write For high-stakes writes, regulatory requirements, or judgment calls, a [human review step](/operations/verification#human-review) pauses the run and notifies your Slack channel with the context and the state of the desktop. Approved runs continue; rejected runs stop safely. **Build it:** ask for it when you teach: "before saving, send this for review and wait for approval." ## Your own review queue When approvals belong in your product rather than ours, run the loop yourself: call the job [asynchronously](/running/calling-your-job#asynchronous-for-long-work), follow progress with [status webhooks](/api/calling-jobs#status-webhooks) or polling, and surface the run to your reviewer with whatever context your product has. Their decision becomes the next API call. **Build it:** split the work into two jobs, one that reads and prepares, one that writes, and put your approval between them. ## Take the desktop yourself Sometimes the loop is literal: a one-time dialog, a manual sign-in, a state only a person can untangle. Every desktop has a [live view](/running/desktops#watching-and-intervening) and you can take control from the browser mid-run. ## Approving what agents do The [co-pilot](/teaching/co-pilot) and any agent on the [MCP](/agents/mcp) propose actions with consequences, teaching a job, going live, running a script, as approval cards. You approve or decline each one. > Start with verify-gate-write everywhere, add refusals for bad input, and reserve human approval for the writes where being wrong is expensive. A loop with a person in the wrong place is just a slow automation. # Monitoring and reporting Source: https://docs.minicor.com/operations/monitoring-and-reporting What operating live jobs looks like: agents watching traffic, and reports you can hand to your own customers. Going live is the start of the operating loop, not the end of the project. Live jobs are watched continuously, and the platform is built so most of that watching is not done by a person. ## The operating loop 1. Executions post to [telemetry](/operations/exceptions-and-telemetry) with their status and replay link. 2. Failures are categorized, so bad input routes to the caller and automation failures route to a fix. 3. Fixes arrive by teaching: the failing case becomes a sample, the builder makes it pass, you go live. The [stability score](/teaching/stability) reflects the job's live record the whole time. ## Agents on watch You can set an agent to watch a live automation. It watches runs, investigates failures by reading the run and the replay, and can trigger teach mode with the failing case, so the fix is often waiting for your review before you have read the alert. Agents run on demand, on a schedule, or as monitors, and their runs are recorded and reviewable like any other execution. The dashboard aggregates the same signal for people: stability at a glance, readiness across the workspace, and which jobs need attention. The workspace dashboard: executions, success rate, jobs live, and the execution history over the last week. ## Reporting Minicor produces periodic usage and error reports per job: total runs, retries, failures with their categories, and trends over time. The reports are written to be handed downstream. When one of your own customers is the source of malformed input, the report documents it concretely, which turns a recurring support argument into a data point. > Use replays to see what happened, categories to decide whose fix it is, and reports when you need a paper trail. # Deploy on your cloud Source: https://docs.minicor.com/operations/network-boundary Deploy the jobs engine inside your own cloud, so sensitive data never leaves your project. For customers handling regulated data, Minicor deploys the jobs engine and the stack around it inside your cloud project: the jobs engine, the platform API, the dashboard, the automation desktop, and the storage for replays and execution data. Sensitive data, PHI included, stays inside your boundary. We run this in production today for healthcare customers. ## What lives where Inside your cloud project: * The jobs engine serving your trigger URLs. * The platform API and dashboard. * The Windows desktop running the Minicor Desktop Service and the target application. * Your storage buckets and database, holding replays, screenshots, and run payloads. What crosses to Minicor cloud is coordination, not content: | Crosses the boundary | What it contains | | -------------------------------------------- | ------------------------------------------------------------------------- | | Job and automation definitions, run metadata | What the steps are and how runs went. No payload data. | | Coordination state | Locks and run bookkeeping, so one run drives a desktop at a time. | | The command bus | Instructions to the desktop and their results in transit. | | Verification screenshots | Sent for a pass or fail verdict under BAA, passed through and not stored. | Traffic in and out rides your edge (your CDN, WAF, and load balancers), and services inside the project talk to each other without leaving it. We provide a complete allowlist of every endpoint the deployment talks to, in both directions, so your network team can pin the boundary down and audit it. ## How a run flows ```mermaid theme={null} sequenceDiagram autonumber participant P as Your product participant E as Jobs engine (your cloud) participant A as Platform API (your cloud) participant D as Desktop (your cloud) participant S as Your storage (your cloud) participant M as Minicor cloud P->>E: POST trigger URL (x-api-key) E->>A: run the job's steps A->>M: read definitions, write run metadata A->>D: execute automation steps D->>S: replay and screenshots D->>A: step results A->>M: screenshot verdict (pass-through, not stored) A->>E: job result E->>P: structured JSON back ``` The payloads, the replays, and everything the automation read off the screen stay in your project. Minicor cloud sees that a run happened and how it went, not what was in it. ## What this takes A deployment like this is set up together with your infrastructure team: a cloud project you own, a Windows VM for the desktop, and the network rules from the allowlist. Deployments update through your own CI/CD, so you control what ships and when. Talk to us at [connect@minicor.com](mailto:connect@minicor.com) to scope one. # Verification Source: https://docs.minicor.com/operations/verification Screenshot checks, gates, and human review keep an automation from writing to the wrong place. Legacy UIs are unpredictable. A pop-up, a session timeout, or an unexpected navigation state can leave an automation on the wrong screen, and writing data into the wrong record is the one failure that is hard to unwind. Verification steps exist so that never happens silently. ## Screenshot verification Before a critical action, the automation captures a screenshot of the desktop and checks it against a plain-language expectation: "Is this the order entry form for customer 12345?" The check runs against the actual pixels on screen, so it catches exactly the failures that break blind automations: the wrong patient chart, the stale session, the dialog covering the form.