{
  "version": "1.2",
  "title": "Apex Instruments commands and agents",
  "effective": "2026-09-01",
  "owner": "Operations Lead",
  "note": "Sixteen things a person or an agent can set running. Each one declares the level it needs to read, whether a person has to be the one who starts it, whether it is staged, and the condition it stops on and hands back. Nothing here runs without a stopping condition, because a command that cannot stop is not a command, it is a hope.",
  "flags": {
    "operatorOnly": "A person holding the operator role starts it. Not an agent on a schedule, and not somebody who merely reads at the right level. Clearance says what may be read. This flag says who may act.",
    "staged": "Written, reviewed, and not running unattended. It waits on something named, and it says what. Staged is a state with an exit, not a shelf."
  },
  "commands": [
    {
      "id": "brand-check",
      "name": "Brand check",
      "kind": "command",
      "does": "Reads a page, a deck, or a piece of copy and checks every colour, typeface, and wordmark against the published brand rules, naming the rule that fired.",
      "levelNeeded": "L1",
      "operatorOnly": false,
      "staged": false,
      "needsPurpose": null,
      "stopsFor": "A colour or a wordmark it cannot match to a published rule. It reports the near miss rather than picking the closest rule and calling it a pass."
    },
    {
      "id": "draft",
      "name": "Drafter",
      "kind": "agent",
      "does": "Produces a new piece from the right template in the right tone, routed through the house rules and saved into the review queue.",
      "levelNeeded": "L1",
      "operatorOnly": false,
      "staged": false,
      "needsPurpose": null,
      "stopsFor": "A request that scores below the front door threshold. It returns the questions rather than a draft, because a draft written against a guess costs more than the questions do."
    },
    {
      "id": "facts",
      "name": "Librarian",
      "kind": "agent",
      "does": "Answers a factual question about the company from the files, with the file cited beside every answer.",
      "levelNeeded": "L1",
      "operatorOnly": false,
      "staged": false,
      "needsPurpose": null,
      "stopsFor": "A question it cannot answer from a file it can cite. It says nothing is on record rather than assembling a plausible answer."
    },
    {
      "id": "proof",
      "name": "Proofer",
      "kind": "agent",
      "does": "Checks a draft against the facts, the voice rules, and the confidentiality rules before it goes for approval.",
      "levelNeeded": "L2",
      "operatorOnly": false,
      "staged": false,
      "needsPurpose": null,
      "stopsFor": "A claim with no source line. The draft comes back marked rather than approved with the claim left in."
    },
    {
      "id": "price-check",
      "name": "Price proofer",
      "kind": "command",
      "does": "Compares every price on a partner page against the authoritative price file, row by row, and returns a pass, flag, or fail per partner.",
      "levelNeeded": "L2",
      "operatorOnly": false,
      "staged": false,
      "needsPurpose": null,
      "stopsFor": "A row that is not in the source file at all. It reports the row as unmatched and never edits a price to make the check pass."
    },
    {
      "id": "partner-brief",
      "name": "Account briefer",
      "kind": "agent",
      "does": "Builds one partner's account brief: history, contacts, terms, what collateral they hold, and what is open.",
      "levelNeeded": "L2",
      "operatorOnly": false,
      "staged": true,
      "stagedUntil": "the partner facts to be filed",
      "stagedWhy": "The brief is assembled from that register, and there is nothing to assemble from yet.",
      "needsPurpose": null,
      "stopsFor": "A partner with no filed terms. It names what is missing rather than writing a brief around a hole."
    },
    {
      "id": "onboard-kit",
      "name": "Partner onboarder",
      "kind": "agent",
      "does": "Produces a new partner's full onboarding kit in one run: welcome piece, quick start guide, and checklist.",
      "levelNeeded": "L2",
      "operatorOnly": false,
      "staged": true,
      "stagedUntil": "the four templates it builds from to be approved",
      "stagedWhy": "Otherwise the kit ships an unapproved template at scale, which is worse than shipping nothing.",
      "needsPurpose": null,
      "stopsFor": "A template that is not in the approved set. It refuses the whole kit rather than shipping three of four."
    },
    {
      "id": "migrate-collateral",
      "name": "Collateral migration fleet",
      "kind": "agent",
      "does": "Runs one partner batch of the rebrand across every piece of collateral they hold, as a supervised fleet.",
      "levelNeeded": "L2",
      "operatorOnly": true,
      "staged": true,
      "stagedUntil": "the brand to be locked",
      "stagedWhy": "A migration run against a brand that is still moving has to be run again, over every piece it already touched.",
      "needsPurpose": null,
      "stopsFor": "A piece whose brand version is not the locked one. The batch halts on the piece rather than converting it to a version that is about to change."
    },
    {
      "id": "publish",
      "name": "Publish",
      "kind": "command",
      "does": "Diffs the build, regenerates what changed, audits every link, and uploads only if the audit is clean.",
      "levelNeeded": "L2",
      "operatorOnly": true,
      "staged": false,
      "needsPurpose": null,
      "stopsFor": "A blocking link audit fault. The run exits non zero and nothing is uploaded, which is the whole point of having a gate."
    },
    {
      "id": "promote",
      "name": "Promote",
      "kind": "command",
      "does": "Moves an approved piece out of the review queue into the approved set, copying rather than moving, with a dated archive and a changelog line.",
      "levelNeeded": "L2",
      "operatorOnly": true,
      "staged": false,
      "needsPurpose": null,
      "stopsFor": "A piece with no recorded approval. It will not promote on the word of the person running it, including an operator."
    },
    {
      "id": "rebuild-price-list",
      "name": "Rebuild price list",
      "kind": "command",
      "does": "Rebuilds every partner price sheet from the authoritative source files, to the letter, with no rounding of its own.",
      "levelNeeded": "L3",
      "operatorOnly": true,
      "staged": false,
      "needsPurpose": null,
      "stopsFor": "A source file whose checksum moved since the last run. It stops and asks whether the move was intended before it rebuilds anything from it."
    },
    {
      "id": "redact",
      "name": "Redactor",
      "kind": "command",
      "does": "Produces a version of a record with the personal parts removed: the name replaced by the case reference, contact details replaced by the channel, third parties dropped.",
      "levelNeeded": "L1",
      "operatorOnly": false,
      "staged": false,
      "needsPurpose": null,
      "touchesPersonal": true,
      "stopsFor": "A field it cannot classify. An unclassified field is treated as personal and the output is held, rather than passed through because it looked harmless."
    },
    {
      "id": "records-export",
      "name": "Records export",
      "kind": "command",
      "does": "Exports a set of records for a request from outside the company, in the form the request asks for.",
      "levelNeeded": "L4",
      "operatorOnly": true,
      "staged": true,
      "stagedUntil": "the lawful purpose register to exist",
      "stagedWhy": "Every export has to be recorded against a written purpose before it runs, and there is nowhere to record it.",
      "needsPurpose": null,
      "stopsFor": "A request with no named lawful purpose. There is no default purpose and no purpose that means all records."
    },
    {
      "id": "support-lookup",
      "name": "Support lookup",
      "kind": "agent",
      "does": "Opens one support case record for the person handling that case, and only the part of it the case needs.",
      "levelNeeded": "L4",
      "operatorOnly": false,
      "staged": false,
      "needsPurpose": "support-case",
      "stopsFor": "A lookup with no open case behind it. Curiosity is not a purpose, and neither is a name somebody remembered."
    },
    {
      "id": "delete-record",
      "name": "Delete record",
      "kind": "command",
      "does": "Removes a record permanently, with the deletion logged against the instruction that asked for it.",
      "levelNeeded": "L3",
      "operatorOnly": true,
      "staged": true,
      "stagedUntil": "the retention rule to be written down",
      "stagedWhy": "A deletion that is not covered by a written rule cannot be defended afterwards, by anybody.",
      "needsPurpose": null,
      "stopsFor": "Anything with no written instruction naming the record. It will not take a deletion on a conversation."
    },
    {
      "id": "send-campaign",
      "name": "Send campaign",
      "kind": "command",
      "does": "Sends a campaign to an audience, once, with the send recorded against the approved copy.",
      "levelNeeded": "L2",
      "operatorOnly": true,
      "staged": true,
      "stagedUntil": "the audience list to be built by the system rather than pasted in",
      "stagedWhy": "A pasted list is a personal export that nobody logged and nobody can account for.",
      "needsPurpose": null,
      "stopsFor": "An audience list it did not build itself. A pasted list is refused whatever it contains."
    }
  ]
}
