{
  "version": "1.3",
  "title": "Apex Instruments request rubric",
  "effective": "2026-09-01",
  "owner": "Operations Lead",
  "note": "Eight dimensions, weighted. Each dimension is scored 0, 0.5 or 1 by the patterns published here, so the score is a reading of the request rather than an opinion about it. A dimension scores 1 when the labelled form or a strong pattern matches, 0.5 when only a weak pattern matches, and 0 when nothing matches. The weighted total is expressed out of 100.",
  "labelForm": "A request may state a dimension outright, as in a line beginning Audience: followed by the answer. Each dimension carries a labelPattern for that form. It requires at least twelve characters of content after the colon, so a label with a vague word after it still falls through to the ordinary patterns and still scores as vague.",
  "bands": [
    {
      "id": "cannot-start",
      "max": 29,
      "label": "Cannot start",
      "line": "Too much is unstated. Starting here produces something that has to be thrown away."
    },
    {
      "id": "needs-answers",
      "max": 59,
      "label": "Needs answers",
      "line": "The shape is there. Two or three answers turn it into a request that can be worked."
    },
    {
      "id": "workable",
      "max": 84,
      "label": "Workable",
      "line": "Enough is fixed to start. One more answer would remove the last guess."
    },
    {
      "id": "ready",
      "max": 100,
      "label": "Ready",
      "line": "Nothing important is being guessed at. This can go straight to the work."
    }
  ],
  "kinds": [
    {
      "id": "announcement",
      "label": "An announcement",
      "patterns": [
        "announc",
        "\\bnew (plans?|pricing|prices|products?|lines?|tiers?)\\b",
        "\\blaunch",
        "\\bnews\\b",
        "\\broll ?out\\b",
        "\\btell (them|everyone|people|partners|staff)\\b",
        "\\bheads up\\b"
      ]
    },
    {
      "id": "letter",
      "label": "A letter or notice",
      "patterns": [
        "\\bletter\\b",
        "\\bnotice\\b",
        "\\bmemo\\b",
        "\\bmailer\\b",
        "\\bmail (out|piece)\\b",
        "\\bwrite to\\b"
      ]
    },
    {
      "id": "page",
      "label": "A web page",
      "patterns": [
        "\\bweb ?page\\b",
        "\\bwebsite\\b",
        "\\blanding page\\b",
        "\\bmicrosite\\b",
        "\\bpost it online\\b",
        "\\bon the (site|website)\\b",
        "\\bpublish (it|this) (on|to) the\\b"
      ]
    },
    {
      "id": "deck",
      "label": "A deck",
      "patterns": [
        "\\bdecks?\\b",
        "\\bslides?\\b",
        "\\bpresentation\\b",
        "\\bpitch\\b",
        "\\bpowerpoint\\b"
      ]
    },
    {
      "id": "report",
      "label": "A report or analysis",
      "patterns": [
        "\\breport\\b",
        "\\banalys",
        "\\bnumbers\\b",
        "\\bfigures\\b",
        "\\bmetrics\\b",
        "\\breview\\b",
        "\\bbreakdown\\b",
        "\\bhow (many|much)\\b",
        "\\btrend",
        "\\bpull together\\b",
        "\\bturn ?around\\b"
      ]
    },
    {
      "id": "email",
      "label": "An email",
      "patterns": [
        "\\bemails?\\b",
        "\\be-mail",
        "\\bnote to\\b",
        "\\breply\\b",
        "\\bsend (them|it|out)\\b",
        "\\bsubject line\\b"
      ]
    },
    {
      "id": "faq",
      "label": "An FAQ or guide",
      "patterns": [
        "\\bfaqs?\\b",
        "\\bq ?and ?a\\b",
        "\\bquestions? and answers?\\b",
        "\\bguide\\b",
        "\\bhow ?to\\b",
        "\\binstructions?\\b",
        "\\bwalk ?through\\b",
        "\\bexplainer\\b"
      ]
    },
    {
      "id": "policy",
      "label": "A policy or procedure",
      "patterns": [
        "\\bpolic",
        "\\bprocedure\\b",
        "\\bstandard\\b",
        "\\bprocess\\b",
        "\\brules?\\b",
        "\\bterms\\b",
        "\\bguidelines?\\b"
      ]
    }
  ],
  "fallbackKind": {
    "id": "general",
    "label": "A general request"
  },
  "dimensions": [
    {
      "id": "audience",
      "label": "The audience is named",
      "looksFor": "A named group of readers, not a category. Partners, staff, and customers are three different documents.",
      "weight": 18,
      "labelPattern": "\\baudience: .{12,}",
      "whyItMatters": "Every other choice follows from who is reading. A piece written for nobody in particular reads that way.",
      "missing": "No reader is named. The word partners on its own covers a site manager, a buyer, and an owner, and those three need different documents.",
      "weak": "A group is gestured at but not pinned down, so the register and the level of detail are still a guess.",
      "strongPatterns": [
        "\\bsite managers?\\b",
        "\\baccount managers?\\b",
        "\\bpractice owners?\\b",
        "\\boffice managers?\\b",
        "\\bnew (customers?|partners?|buyers?)\\b",
        "\\bexisting (customers?|partners?|clients?)\\b",
        "\\bprospects?\\b",
        "\\bdistributors?\\b",
        "\\bpurchasing\\b",
        "\\bprocurement\\b",
        "\\bnorthlight (group )?(site managers?|contacts?|leads?)\\b",
        "\\b(for|to) (the )?(sales|support|operations|marketing|finance) team\\b",
        "\\bexecutives?\\b",
        "\\bleadership\\b",
        "\\bthe board\\b",
        "\\bfield (technicians?|staff)\\b"
      ],
      "weakPatterns": [
        "\\bpartners?\\b",
        "\\bcustomers?\\b",
        "\\bclients?\\b",
        "\\bstaff\\b",
        "\\bthe team\\b",
        "\\beveryone\\b",
        "\\busers?\\b",
        "\\bthem\\b",
        "\\breaders?\\b"
      ]
    },
    {
      "id": "format",
      "label": "The format is named",
      "looksFor": "The thing that gets delivered, and how long it is. A page, a two page letter, a ten slide deck.",
      "weight": 14,
      "labelPattern": "\\b(format|deliverable): .{12,}",
      "whyItMatters": "Length and format decide what has to be cut. Deciding them at the end means rewriting.",
      "missing": "Nothing says what is being produced. A paragraph, a letter, and a deck are all valid answers to this request, and only one of them is wanted.",
      "weak": "A format is named but not sized, so the amount of detail is still open.",
      "strongPatterns": [
        "\\b(one|two|three|four|1|2|3|4)[ -]pages?\\b",
        "\\b(a|one) page\\b",
        "\\b\\d+ ?(slides?|pages?|words?|paragraphs?|bullets?)\\b",
        "\\bone ?pager\\b",
        "\\bshort email\\b",
        "\\bpdf\\b",
        "\\bletter template\\b",
        "\\bhalf a page\\b",
        "\\bunder \\d+ words\\b",
        "\\bno more than \\d+\\b",
        "\\bspreadsheet\\b",
        "\\btable\\b"
      ],
      "weakPatterns": [
        "\\bletters?\\b",
        "\\bemails?\\b",
        "\\bdecks?\\b",
        "\\bslides?\\b",
        "\\bpages?\\b",
        "\\bfaqs?\\b",
        "\\bmemo\\b",
        "\\bnotice\\b",
        "\\bsummary\\b",
        "\\bwrite ?up\\b",
        "\\bpost\\b",
        "\\breport\\b"
      ]
    },
    {
      "id": "source",
      "label": "The source of truth is named",
      "looksFor": "The file, list, or record the facts come from, with a version or a date on it.",
      "weight": 16,
      "labelPattern": "\\bsource( of truth)?: .{12,}",
      "whyItMatters": "Without a named source the writer picks figures from memory, and the review turns into a fact check instead of a read.",
      "missing": "No source is named, so every figure in the draft will be one somebody remembered.",
      "weak": "A source is referred to loosely. Which version, and as of when, is still unanswered.",
      "strongPatterns": [
        "\\bprice list (dated|effective|of|from) ",
        "\\b(october|november|december|january|february|march|april|may|june|july|august|september) \\d{1,2},? ?20\\d\\d\\b",
        "\\bversion \\d",
        "\\bv\\d+(\\.\\d+)?\\b",
        "\\brev(ision)? \\d",
        "\\beffective \\w+ \\d",
        "\\bas of \\w+ \\d",
        "\\bthe approved \\w+",
        "\\bfrom the (approved|current|published) ",
        "\\b20\\d\\d price (list|sheet|file)\\b"
      ],
      "weakPatterns": [
        "\\bprice list\\b",
        "\\bprice sheet\\b",
        "\\bthe file\\b",
        "\\bthe sheet\\b",
        "\\bthe data\\b",
        "\\bthe record\\b",
        "\\bcrm\\b",
        "\\bthe system\\b",
        "\\bour (numbers|figures|prices)\\b",
        "\\bthe spreadsheet\\b"
      ]
    },
    {
      "id": "deadline",
      "label": "There is a deadline",
      "looksFor": "A date or a day the work is needed by, not a feeling about urgency and not a date that belongs to something else. A date has to be attached to the delivery to count.",
      "weight": 11,
      "labelPattern": "\\b(deadline|needed by|due): .{12,}",
      "whyItMatters": "A deadline decides how much can be attempted. Soon is not a deadline, it is a mood.",
      "missing": "No date is given, so the work cannot be sized and nothing can be sequenced behind it.",
      "weak": "Urgency is stated without a date, which tells the writer to hurry but not when to stop.",
      "strongPatterns": [
        "\\bby (monday|tuesday|wednesday|thursday|friday|saturday|sunday)\\b",
        "\\bby (the )?\\d{1,2}(st|nd|rd|th)?\\b",
        "\\bby (october|november|december|january|february|march|april|may|june|july|august|september)\\b",
        "\\bbefore (the )?(monday|tuesday|wednesday|thursday|friday|meeting|review|call|launch)\\b",
        "\\bdue \\w+",
        "\\bdeadline\\b",
        "\\bend of (day|week|the month)\\b",
        "\\bthis (morning|afternoon)\\b",
        "\\b(by|before|due|needed by|no later than|not after) (the )?(october|november|december|january|february|march|april|may|june|july|august|september) \\d{1,2}\\b",
        "\\bnext (monday|tuesday|wednesday|thursday|friday)\\b"
      ],
      "weakPatterns": [
        "\\basap\\b",
        "\\bsoon\\b",
        "\\burgent\\b",
        "\\bquick(ly)?\\b",
        "\\bright away\\b",
        "\\bwhen you can\\b",
        "\\bthis week\\b",
        "\\bnext week\\b",
        "\\btoday\\b",
        "\\btomorrow\\b"
      ]
    },
    {
      "id": "scope",
      "label": "The scope is bounded",
      "looksFor": "What is in and, more usefully, what is out. One product or the whole line. This quarter or the year.",
      "weight": 15,
      "labelPattern": "\\bscope: .{12,}",
      "whyItMatters": "An unbounded request grows while it is being written, and the first draft is always the wrong size.",
      "missing": "Nothing marks the edges. The new plans could be one plan or every plan, and the draft will cover whichever the writer guesses.",
      "weak": "A subject is named but its boundary is not, so what to leave out is being decided by the writer.",
      "strongPatterns": [
        "\\bonly the\\b",
        "\\b(care|plus|line|bench|pro|kit|quarter|month|year|products?|plans?|instruments?|services?) only\\b",
        "\\bcovers? only\\b",
        "\\bjust the\\b",
        "\\bdo not (include|cover|mention)\\b",
        "\\bexclud",
        "\\bleave out\\b",
        "\\blimited to\\b",
        "\\bnothing (about|on)\\b",
        "\\bwithout (the|any) ",
        "\\bmeridian (bench|pro|field kit)\\b",
        "\\batlas care( plus)?\\b",
        "\\bthis (quarter|month|year)\\b",
        "\\bq[1-4]\\b",
        "\\bin scope\\b",
        "\\bout of scope\\b",
        "\\bcalibration\\b",
        "\\bon ?site training\\b"
      ],
      "weakPatterns": [
        "\\bthe new (plans?|prices?|products?)\\b",
        "\\bthe change\\b",
        "\\bthe update\\b",
        "\\bthe launch\\b",
        "\\beverything\\b",
        "\\ball of\\b",
        "\\bmeridian\\b",
        "\\batlas\\b",
        "\\bthe line\\b",
        "\\bthe programme?\\b",
        "\\bthe program\\b"
      ]
    },
    {
      "id": "example",
      "label": "An example is given",
      "looksFor": "A prior piece, a template, or a named model to write against.",
      "weight": 9,
      "labelPattern": "\\b(example|model|template to follow): .{12,}",
      "whyItMatters": "One example settles tone, structure, and length in a sentence, and saves a round of comments about all three.",
      "missing": "No model is offered, so tone and structure are being invented and then argued about.",
      "weak": "A style is described in words. That is better than nothing and worse than a file.",
      "strongPatterns": [
        "\\blike the\\b",
        "\\bsame as the\\b",
        "\\bmatch(ing)? the\\b",
        "\\btemplate\\b",
        "\\bmodel(l)?ed on\\b",
        "\\buse the \\w+ (letter|page|deck|email|format)\\b",
        "\\bfollow the\\b",
        "\\bthe (march|april|may|june|july|august|september|october) (letter|note|piece|deck)\\b",
        "\\bprevious (letter|version|piece|deck)\\b",
        "\\bexample\\b",
        "\\bhouse (style|format)\\b"
      ],
      "weakPatterns": [
        "\\bplain\\b",
        "\\bformal\\b",
        "\\bfriendly\\b",
        "\\bshort and\\b",
        "\\bin our (voice|tone|style)\\b",
        "\\bon brand\\b",
        "\\bprofessional\\b",
        "\\bsimple\\b"
      ]
    },
    {
      "id": "approval",
      "label": "The approval path is clear",
      "looksFor": "Who reads it before it goes out, and who is allowed to say yes.",
      "weight": 10,
      "labelPattern": "\\bapprov(al|er): .{12,}",
      "whyItMatters": "A draft with no named approver waits. Naming the approver at the start is the difference between a day and a week.",
      "missing": "Nobody is named as the approver, so the draft will sit until somebody decides it is theirs.",
      "weak": "A review is implied without a name, which is the same as no approver at the moment it matters.",
      "strongPatterns": [
        "\\b(dana whitfield|morgan reyes|jordan vale|avery kellen|sami torres)\\b",
        "\\bfor (the )?(coo|operations lead|marketing lead|account manager|customer success lead) to (approve|sign|review)\\b",
        "\\b(approved|signed off) by\\b",
        "\\bapprover\\b",
        "\\bsign ?off from\\b",
        "\\bgoes to \\w+ (first|for approval)\\b",
        "\\bno approval needed\\b",
        "\\bi will approve\\b",
        "\\bmy approval\\b"
      ],
      "weakPatterns": [
        "\\breview\\b",
        "\\bcheck it\\b",
        "\\bapprov",
        "\\bsign ?off\\b",
        "\\bbefore it goes out\\b",
        "\\bsomeone should look\\b"
      ]
    },
    {
      "id": "confidentiality",
      "label": "Confidentiality is stated",
      "looksFor": "Whether this can leave the building, and whether any of it is personal or regulated.",
      "weight": 7,
      "labelPattern": "\\b(confidentiality|handling): .{12,}",
      "whyItMatters": "Confidentiality decides what may be quoted and where the file may live. Found out afterwards, it means a rewrite.",
      "missing": "Nothing says how far this may travel, so the writer will guess, and the safe guess and the useful guess are different documents.",
      "weak": "A handling word appears without a level, so it is a hint rather than an instruction.",
      "strongPatterns": [
        "\\binternal only\\b",
        "\\bdo not (share|forward|publish|circulate)\\b",
        "\\bpublic(ly)?\\b",
        "\\bfor publication\\b",
        "\\bconfidential\\b",
        "\\brestricted\\b",
        "\\bunder nda\\b",
        "\\bpartner ?facing\\b",
        "\\bcustomer ?facing\\b",
        "\\bno (names|personal details|contact details)\\b",
        "\\bredact",
        "\\bcan go on the (site|website)\\b",
        "\\bnot for (partners|customers|the public)\\b"
      ],
      "weakPatterns": [
        "\\binternal\\b",
        "\\bsensitive\\b",
        "\\bprivate\\b",
        "\\bcareful\\b",
        "\\bquiet\\b",
        "\\bkeep it in\\b"
      ]
    }
  ],
  "selection": {
    "note": "The register is scored against the gaps this rubric found. A question that resolves a dimension already answered is worth nothing, which is why the questions change when the request changes. Where two questions tie, the one resolving the dimension this rubric weighs more heavily wins, because the weight is already a statement about what matters.",
    "formula": "priority = impact * gap * fit * (weight / 18), where gap is 1 minus the dimension score, fit is 1.0 for a question written for this kind of request, 0.6 for a question that applies to any request and 0.25 for one written for a different kind, and weight is the rubric weight of the dimension the question resolves",
    "minGap": 0.5,
    "threeQuestionsWhenGapsAtLeast": 3,
    "maxPerDimension": 1,
    "maxQuestions": 3,
    "minQuestions": 2,
    "fewerWhenFewerGaps": "If the register can answer fewer gaps than the minimum, fewer questions are asked. Asking a question about something already settled is how a form teaches people to ignore it."
  }
}
