MirrorSphere Content Standards
Single source of truth for brand, voice and structural rules across HaloPSA email templates and HaloPSA knowledge-base articles. Derived from the live reference template -550 BitLocker — New Ticket - rb, the KB master mockup _mockup-744-BitLocker.html, the machine-checkable rules encoded in build-email-template-scorecard.ps1, and the customer-reply voice exemplars captured from production tickets.
1. Purpose & scope
This document is the canonical brand and content reference for anyone — human author or Claude — producing or reviewing a MirrorSphere customer-facing artefact. It covers both transactional email templates (rendered by HaloPSA's EmailTemplate engine) and KB articles (rendered as description_html on the customer portal). The same brand DNA — palette, typography, voice, footer — applies to both. Format-specific rules live in their dedicated sections.
Audience: tech writers, automation engineers, Claude (acting as content drafter or reviewer), and anyone running the audit/scorecard scripts.
2. Brand DNA (applies to email + KB)
2.1 Palette
The brand uses exactly eight colours. Do not invent new ones, and do not use the Material-style variants listed in section 7.
| Role | Name | Hex | Used for |
|---|---|---|---|
| Primary dark | Slate | #394852 | Hero bg, footer bg, body headings, button text on light |
| Primary accent | Teal | #4CBDEE | Links, eyebrows, button bg, accent borders, H2 underline |
| Secondary accent | Orange | #E5833B | Title "dot", warn accents, "Managed IT Services" tag |
| Muted blue-grey | Grey-blue | #92A9BD | Tagline text, secondary metadata, muted pills |
| Success | Success green | #34a853 | Approved states, checklist ticks, success callouts |
| Error | Error red | #c0392b | Rejected states, danger callouts |
| Surface | Panel | #f2f5f8 | Callout backgrounds, ticket-box backgrounds, code bg |
| Surface | Page | #f0f2f5 | Outer page background |
Supporting tones derived from the palette (do not introduce new ones):
| Hex | Role |
|---|---|
#6B8295 | Body paragraph copy (a darker grey-blue) |
#1a2732 | Lede paragraph copy (heaviest body weight) |
#dde5ec | Hairline borders, table row separators |
#e0e8ee | Card / FAQ / TOC borders |
#f8fafc | TOC fill, FAQ question background |
#2d3a43 | Signoff band (slightly darker than slate footer) |
2.2 Accent gradient stripe
Used everywhere there's a transition from dark to light (under hero, above footer). Always horizontal, always 3px tall:
height: 3px;
background: linear-gradient(90deg, #4CBDEE 0%, #92A9BD 100%);
2.3 Typography
font-family: 'Montserrat', Arial, Helvetica, sans-serif;
Montserrat is loaded from Google Fonts at weights 400, 500, 600, 700, 800. The system fallback chain (Arial, Helvetica, sans-serif) is mandatory for email clients that don't support webfonts.
| Element | Size | Weight | Letter-spacing | Notes |
|---|---|---|---|---|
| Hero H1 | 26-28px | 800 | -0.02em | UPPERCASE; trailing . in #E5833B |
| Hero tagline | 8-12px | 600-700 | 0.18-0.20em | UPPERCASE, grey-blue |
| Eyebrow | 8-10px | 700 | 0.12-0.20em | UPPERCASE, teal |
| H2 | 16-17px | 700 | -0.01em | 2px teal underline (#4CBDEE) |
| H3 | 14px | 700 | normal | slate |
| Lede | 15-16px | 600 | normal | #1a2732, line-height 1.6 |
| Body p | 13px | 400 | normal | #6B8295, line-height 1.7-1.75 |
| Body strong | 13px | 700 | normal | #394852 |
| Code | 12px | normal | normal | 'SFMono-Regular', Consolas, monospace; bg #f2f5f8 |
| Footer legal | 9px | 400 | normal | #6B8295 on slate |
2.4 Logo
https://assets.unlayer.com/projects/0/1749050347969-MS_Inline%20logo_Strap_White%20wording_3x-8.png
- Use: In the hero block of every email and every KB article. White inline logo with strapline on slate background.
- Don't use: Inline in body text, as a decorative element, or at any size below 160px wide (it goes blurry).
- Alt text: Always
MirrorSphere.
2.5 Footer block
Branded footer is mandatory on both emails and KB articles. It has three pieces:
1. Footer main band (slate #394852, padding 16px 28px-32px):
> MirrorSphere · Bloxham Mill, Barford Road, Bloxham, OX15 4FF · www.mirrorsphere.com · <phone> Managed IT Services (in orange)
2. Gradient stripe (3px, the accent gradient).
3. Legal block (slate, smaller text):
> This email/article, including its contents and any attachments, is intended solely for the named recipient(s). It may contain confidential and/or legally privileged information. Unauthorised access, use, disclosure, distribution, or copying is strictly prohibited. If received in error, please notify the sender immediately and delete it. MirrorSphere Ltd, registered in England & Wales. Bloxham Mill, Barford Road, Bloxham, Banbury, OX15 4FF · Co. No. 6388568 · VAT: GB918941394
Required tokens that the scorecard checks for: MirrorSphere, Bloxham or OX15 4FF, and one of (VAT, registered in England, Co. No).
3. Voice & content conventions (applies to both)
3.1 Tone
Calm, professional, helpful. Second person ("you", "your"). Sentence case in headings (not Title Case, not ALL CAPS except where the design calls for it in eyebrows/hero titles). Concise.
The customer-reply exemplars (integrations/anthropic/brand-voice/exemplars.md) capture the live tone: warm openers ("I hope you are well!"), conditional politeness ("Could you kindly confirm…"), short paragraphs, explicit next-step asks, sign-offs like "Many thanks in advance!" or "Let me know if that works for you." This is the tone we mirror in transactional content.
3.2 Spelling — UK English
| Use | Do not use |
|---|---|
| authorisation | authorization |
| organisation | organization |
| behaviour | behavior |
| customise | customize |
| centre | center |
| licence (noun) / license (verb) | mixed usage |
| programme | program (except software) |
3.3 Brand name
Always MirrorSphere — one word, two capitals.
Forbidden variants: Mirror Sphere, Mirrorsphere, mirrorsphere, MS (as a standalone brand reference).
3.4 Phone format
+44 (0) 1295 595 444
With the (0), grouped 4-3-3. In email templates use the merge variable $TEAMPHONENUMBER where Halo populates the team-specific line; the literal form above is reserved for the footer/CTA where the brand line is constant.
3.5 Punctuation
| Mark | Convention | HTML entity |
|---|---|---|
| Em-dash | Real em-dash with a space either side — like this | — |
| Right single quote | Curly | ’ |
| Left double quote | Curly | “ |
| Right double quote | Curly | ” |
| Right-pointing chevron | For breadcrumbs and "view ›" links | › |
| Right arrow | On CTA buttons | → |
Do not use straight quotes (', ") or two hyphens (--) in body content. They look unfinished.
3.6 Breadcrumbs
Use › with non-breaking spaces either side, italicised:
<em>Services › Users and Services › USB Enablement</em>
3.7 Emphasis convention
| Tag | Meaning |
|---|---|
<strong> | A button label, menu item, or actionable thing to click |
<em> | A referenced UI element, screen name, or field name |
<code> | A literal command, URL, file path, code value, or token to type |
Examples:
- "Click Submit." → button label,
<strong> - "Open the Asset field." → field name,
<em> - "Browse to
portal.mirrorsphere.com." → URL,<code>
3.8 Step naming
| Article kind | Pattern |
|---|---|
| Process article | Step N — verb phrase (em-dash, sentence case) |
| Reference article | What is X? style |
4. Email template rules (Halo EmailTemplate)
4.1 Required structure
Every transactional email template must contain all 14 elements that build-email-template-scorecard.ps1 checks. The core nine (coreKeys) drive the brand score:
| Element | How it appears in HTML |
|---|---|
| 620px max-width table layout | width="620" or max-width: 620px |
| Montserrat font stack | Montserrat referenced in styles or font-family |
Slate #394852 | hero/footer background |
Orange #E5833B | title dot, accent text |
Teal #4CBDEE | links, button bg, accent stripes |
Grey-blue #92A9BD | tagline / muted text |
| MirrorSphere logo | assets.unlayer.com/projects/0/…MS_Inline… |
| Dark mode block | @media (prefers-color-scheme: dark) |
| Outlook-dark block | [data-ogsc] selector pairs |
| Mobile media query | @media … max-width: 6[0-4]0px |
| Outlook MSO conditional | <!--[if !mso]> |
| Preheader | display: none; max-height: 0; invisible-text block |
| Branded footer | MirrorSphere + (OX15 4FF or Bloxham) |
| Legal block | VAT, Co. No, or registered in England |
The brand-score formula: % of the nine core checks the template passes. ≥80 = Branded (compliant); 40–79 = Partial / needs work; <40 = Off-brand / legacy.
4.2 Layout primitives
The reference template (-550-BitLocker - New Ticket - rb) uses:
outer table (width 100%, bg #f0f2f5)
└── inner table (width 620, max-width 620, table-layout fixed)
├── hero (bg slate + svg circles)
├── 3px gradient stripe
├── body (bg #ffffff, padding 28px 32px 8px)
│ ├── greeting paragraphs
│ ├── ticket box (#f2f5f8, border-left 4px teal)
│ ├── details box (#f2f5f8, border-left 4px teal)
│ ├── what-happens-next box (orange border-left)
│ ├── signoff paragraphs
│ └── CTA card (slate bg, teal left border, teal pill button)
├── footer main (bg slate)
├── 3px gradient stripe
└── legal block (bg slate, 9px copy)
4.3 Dark-mode handling
Two parallel mechanisms (you need both):
- Standards browsers / iOS Mail:
@media (prefers-color-scheme: dark)flipping inner backgrounds. - Outlook.com on dark theme:
[data-ogsc]selectors prefixed via classes (e.g.class="og-dark-text og-dark-bg") so OWA's dark-mode rewriter doesn't tint your branded boxes into illegibility.
4.4 Mobile responsiveness
@media only screen and (max-width: 640px) {
.outer-wrap { padding: 0 !important; }
.header-logo td { display: block !important; width: 100% !important; }
.header-title { display: block !important; text-align: center !important; }
.cta-text, .cta-btn { display: block !important; width: 100% !important; }
/* …pill rows and footer collapse to one-column too */
}
4.5 Halo merge variables
Casing is effectively case-insensitive (the 2026-05-26 audit found $remotelink, $faultid, $symptom2, $apsubject all working in production). Be consistent, prefer uppercase, but don't flag lowercase as a bug.
Critical link distinction — get this wrong and you send agents to the customer portal or vice-versa:
| Variable | Resolves to | Use in |
|---|---|---|
$LINKTOREQUEST | agent.mirrorsphere.com/tickets/{id} | Internal / technician / "rb" (runbook) templates |
$LINKTOREQUESTUSER | portal.mirrorsphere.com/ticket?id={id} | End-user / customer-facing templates |
Other commonly used variables:
| Variable | Meaning |
|---|---|
$FAULTID | Ticket number |
$SYMPTOM / $SYMPTOM2PLAIN | Ticket summary + plain-text detail |
$USERNAME / $FIRSTNAME | Requester name |
$GREETING | Time-of-day greeting ("Good morning") |
$SITE | Site name |
$STATUS | Ticket status |
$SERIOUSNESS2 | Priority label |
$DATEOCCURED | Ticket logged date |
$REQUESTTYPE | Request type label |
$TEAMEMAIL / $TEAMPHONENUMBER | Team contact info |
$SECTION | Department / team name |
$ORPHONE | Organisation phone (for footer line) |
Custom-field variables follow the field code's casing: $CFAssetNameforCannedText, $CF00280. Mixed case is normal and correct for $CF… tokens — don't auto-uppercase them.
Subject: the email subject lives in header_text (not in <title> and not in the HTML body). Subject can use merge variables.
4.6 The body_html vs design.html question
HaloPSA stores email templates in two body fields:
body_html— historical / direct-edit field.design.html— the Unlayer editor's canonical output (held inside thedesignobject).
Canonical body = design.html when non-empty, else body_html. Halo treats the Unlayer output as authoritative on render. In current production data they never diverge, but the scorecard flags divergence (html_divergence) so it can be cleaned up.
4.7 Origin (custom vs standard)
HaloPSA assigns IDs to email templates with a meaningful sign:
| ID range | Origin | Meaning |
|---|---|---|
id < 0 | Custom | Tenant-created (MirrorSphere built); naming often includes -rb, AUTO-, client prefix |
id > 0 | Standard | Halo seeded built-in slot (New Ticket Logged, Ticket Closed, Password Reset, Feedback 1-4, etc.) |
The 174 negative-ID templates in this tenant are all MirrorSphere-built. The 115 positive-ID templates are all recognised Halo defaults. The scorecard uses this to classify "Custom" vs "Standard".
4.8 Audience inference
The scorecard auto-classifies External vs Internal from the strongest signal first:
- Link target (highest confidence):
$LINKTOREQUESTUSERorportal.mirrorsphere→ External (customer)$LINKTOREQUESToragent.mirrorsphere→ Internal (staff)
- Name keywords (medium confidence):
- Internal:
rb,runbook,approval,pending,rejected,approved,technician,agent,popup,mention,notify,digest,ops,internal,timeout,error,warning,alert,cai,reassign,escalat - External:
payment,invoice,stripe,feedback,appointment,welcome,password reset,mfa reset,undertaking,survey,csat,receipt,statement,quote
Internal-name override beats portal-only link (because approval-flow emails embed a portal link for the approver to click but are still internal process emails).
4.9 Hardcoded portal/agent links
Never hardcode https://agent.mirrorsphere.com/... or https://portal.mirrorsphere.com/... URLs inside the template body — use the $LINKTOREQUEST / $LINKTOREQUESTUSER variables instead so Halo can re-target correctly per ticket. The scorecard reports any matches of href="(https?://...(halopsa\.com|agent\.mirrorsphere\.com|portal)...)" as wins to fix.
5. KB article rules (Halo KBArticle)
5.1 Halo field placement — the most important rule
| Halo field | Use for |
|---|---|
description_html | The fully-branded HTML article. Customers see this immediately under the "Description" heading on the portal. |
description (plain) | One utility sentence for search/notification fallback. E.g. "Step-by-step guide for requesting and retrieving your BitLocker recovery key." |
resolution_html | Leave empty. Halo hides the "Resolution" heading when there's no content. |
faqlists | Required on creation. "Ticket Guides" = id 182. |
Why this matters: the agent edit view and the customer portal both render "Description" and "Resolution" as visible section headings. Putting branded content in Resolution leaves an awkward "Resolution" label sitting above the hero. Description placement makes the hero the first thing the reader sees under the first heading.
5.2 Article structure (in order)
Hero (logo + title + tagline)
Eyebrow (KB N · Category · Audience)
Lede paragraph (one-sentence summary)
Opening callouts:
· What is X?
· Who is this for?
Pill row (3-4 from vocabulary)
TOC — only if 5+ H2 sections
--- horizontal rule ---
H2 body sections with id="..." anchors
· ordered/unordered lists for steps
· callouts (info / warn / tip / time / success / danger)
· tables / flow cards / step cards / email rows
· screenshots wrapped in <figure>+<figcaption>
"If something goes wrong" — strongly recommended
FAQ accordion — optional
"Need more help?" key/value table — recommended
CTA card (one urgent action)
Signoff line (KB N · Category · fallback prompt)
Branded footer (always)
5.3 Component vocabulary
These are the 16 KB components authors may use. Don't invent new ones — if something doesn't fit, the master template needs extending.
| Class | Purpose |
|---|---|
.kb-hero | Hero banner: logo + title + tagline. Exactly one per article, at top. |
.kb-eyebrow | Tiny uppercase teal label, e.g. "KB 744 · Account Management · Self Service". |
.kb-lede | One-sentence summary, heavier than body text but lighter than a callout. |
.kb-callout | Info box. Variants: default (info), is-warn, is-success, is-tip, is-time, is-danger. |
.kb-pill-row | 3-4 metadata pills from the vocabulary in section 5.4. |
.kb-toc | Table of contents. Only for articles with 5+ H2 sections. |
.kb-flow-cards | 3-4 horizontal "buckets" with SVG icons. For at-a-glance summaries. |
.kb-flow-pipeline | 5-6 sequential coloured pills with arrows. For linear "state" flows. |
.kb-email-row | Numbered circle + title + description + screenshot. One per email. |
.kb-table | Reference table — dark header, zebra striping. |
.kb-step-card | Dark-header card with eyebrow + title + body. For config steps or failure scenarios. |
.kb-checklist | Green callout with ✓ bullets. For "what success looks like". |
.kb-faq | Stacked Q+A cards. Optional. |
.kb-keyvalue | 2-column label/value table. For "Need more help?" escalation. |
.kb-cta | Dark card with urgency message + phone button. One per article, near the end. |
.kb-signoff | Quiet "KB N · Category · fallback prompt" line above the footer. |
Callout colour mapping:
| Variant | Border-left | Background | Use for |
|---|---|---|---|
| (default) | #4CBDEE | #f2f5f8 | Neutral information |
is-warn | #E5833B | #fff8e1 | "Be aware" / caveat |
is-success | #34a853 | #ecfdf5 | Confirmation / what success looks like |
is-tip | #92A9BD | #f8fafc | Quiet recommendation |
is-time | #f59e0b | #fffbeb | Time-limited / deadline notes |
is-danger | #c0392b | #fef2f2 | Hard constraint / data-loss warning |
5.4 Pill vocabulary
Pick 3-4 pills. Drop any that aren't relevant — don't pad with "Approval: Not Required" filler.
| Label | Values |
|---|---|
| Audience | End User · Approver · Manager · Technician |
| Process Time | "~5 mins" · "~30 mins" · "~1 hour" |
| Last Reviewed | Month + year, e.g. "May 2026" |
| Article Type | Self-Service · Process Guide · Reference · Troubleshooting |
| Difficulty | Easy · Medium · Advanced |
| Approval | Required · Not Required (only when relevant) |
| Platform | Windows · Mac · Mobile · All |
| Access Level | Standard · Privileged · Admin |
Colour rotation across the row: blue (default) → orange (.is-orange) → dark (.is-dark) → muted (.is-muted). Use whichever order reads best.
5.5 Headings & anchors
- Exactly one
<h1>per article — the hero title. Don't add another in the body. - Every H2 that the TOC links to must have an
id="..."attribute for in-page jump navigation. - H2 uses the 2px teal underline; H3 is plain slate.
5.6 Images & screenshots
- Every
<img>needsalttext. Decorative icons usealt="". - Standalone screenshots use
<figure class="kb-figure">+<figcaption class="kb-caption">. - Use sizing modifiers on
.kb-screenshot:is-narrow(≤360px),is-email(≤420px),is-page(≤720px). - Side-by-side pairs go in
.kb-screenshot-grid(collapses to one column on mobile).
5.7 Links
Body links: #4CBDEE text, 1px solid rgba(76,189,238,.35) border-bottom that solidifies on hover. Do not strip the border-bottom — it's the signal that the text is interactive.
CTA buttons (.kb-cta-btn) override the body underline (border-bottom: none).
5.8 Inline-style policy
KB articles use classes only for layout. Inline style="…" is forbidden in body content (the master template's <style> block is the only place styles live). The exception is <img> width attributes inside the HTML the WYSIWYG inserts.
6. Scoring criteria
The machine-checkable spec used by build-email-template-scorecard.ps1 (email) and the proposed equivalents for KB articles. Each check returns a boolean. The "brand score" is the percentage of core checks passed.
| Check key | Label | Applies to | Test (rough description) | |
|---|---|---|---|---|
width620 | 620px layout | width="620" or max-width: 620px | ||
montserrat | Montserrat font | Both | matches Montserrat in style/font-family | |
slate | Slate #394852 | Both | matches #394852 (case-insensitive) | |
orange | Orange #E5833B | Both | matches #E5833B | |
blue | Teal #4CBDEE | Both | matches #4CBDEE | |
greyblue | Grey-blue #92A9BD | Both | matches #92A9BD | |
logo | MS logo | Both | matches MS_Inline or assets.unlayer.com | |
darkmode | Dark mode | matches @media (prefers-color-scheme: dark) | ||
outlookdark | Outlook-dark block | matches [data-ogsc] | ||
mobile | Mobile media query | matches @media … max-width: 6[0-4]0px | ||
mso | Outlook MSO conditional | matches <!--[if !mso]> or <!--[if mso]> | ||
preheader | Preheader text | matches display:none;max-height:0 | ||
footer | Branded footer | Both | matches MirrorSphere AND (OX15 4FF OR Bloxham) | |
legal | Legal block | Both | matches VAT OR Co. No OR registered in England | |
kb_hero | Hero block present | KB | matches class="kb-hero" | |
kb_eyebrow | Eyebrow label | KB | matches class="kb-eyebrow" | |
kb_lede | Lede paragraph | KB | matches class="kb-lede" | |
kb_pill_row | Pill row metadata | KB | matches class="kb-pill-row" | |
kb_toc | TOC (long articles) | KB | matches class="kb-toc" (only required when 5+ H2) | |
kb_callout | At least one callout | KB | matches class="kb-callout" | |
kb_h1_unique | Single H1 | KB | exactly one <h1> element | |
kb_h2_ids | H2 anchors | KB | every <h2> has an id attribute | |
kb_signoff | Signoff line | KB | matches class="kb-signoff" | |
kb_cta | CTA card | KB | matches class="kb-cta" | |
kb_accent_stripe | Accent gradient stripe | Both | matches linear-gradient(90deg,#4CBDEE 0%,#92A9BD 100%) | |
kb_description_placement | Branded HTML in description_html | KB | non-empty description_html, empty resolution_html | |
kb_plain_desc_short | Plain description is one sentence | KB | description field length 20-200 chars, no HTML | |
kb_no_inline_style | No inline styles in body | KB | no style="…" attributes outside the <style> block | |
link_var_consistency | Link variable matches audience | Internal templates use $LINKTOREQUEST; External use $LINKTOREQUESTUSER | ||
no_hardcoded_portal | No hardcoded portal/agent URLs | no href="https://...halopsa.com..." or `href="https://(agent | portal).mirrorsphere.com..."` | |
cf_var_casing | $CF… vars match field code casing | informational only — $CF… mixed case is correct | ||
material_red_absent | No Material red | Both | no #c62828 | |
material_green_absent | No Material green | Both | no #2e7d32 | |
uk_spelling | UK English | Both | no authorize, organize, behavior, customize, center | |
brand_name_consistent | Brand name canonical | Both | no Mirror Sphere, Mirrorsphere, mirrorsphere (case-insensitive) | |
straight_quotes_absent | Curly quotes only | Both | no ' or unescaped straight apostrophes in body copy |
Email core checks (drive the brand score): width620, montserrat, slate, darkmode, mobile, mso, preheader, footer, logo.
KB core checks (proposed): kb_hero, kb_eyebrow, kb_lede, kb_pill_row, kb_callout, kb_signoff, kb_cta, montserrat, slate, kb_accent_stripe, kb_description_placement, kb_h1_unique, footer, brand_name_consistent.
7. Forbidden patterns
Quick reference of what NOT to do. Anything in this list should be auto-flagged.
| Don't do | Do instead |
|---|---|
Use Material-style colours (#2e7d32, #c62828) | Use #34a853 (Success) and #c0392b (Error) |
| Spell the brand "Mirror Sphere" or "Mirrorsphere" | Always MirrorSphere |
| Use American spelling (authorize, organization, behavior) | UK English — authorise, organisation, behaviour |
Wrap content in inline-styled <div style="…"> | Use the .kb-callout (or other) class |
Hardcode https://agent.mirrorsphere.com/tickets/123 in an email | Use $LINKTOREQUEST or $LINKTOREQUESTUSER |
Hardcode https://portal.mirrorsphere.com/ticket?id=… in an email | Use $LINKTOREQUESTUSER |
| Send technicians to the customer portal | $LINKTOREQUEST for agent templates (audit caught this in -506) |
| Use emoji as decoration in body text | Words, callouts, or SVG icons inside .kb-flow-card |
| Write a custom footer per template | Use the canonical branded footer block |
Use straight quotes ' " or -- | Curly quotes ’ “ ” and em-dash — |
Put branded content in resolution_html | Put it in description_html |
Have two <h1> elements in one KB article | One H1 (the hero title), H2s for sections |
| Use "Click here" link text | Quote the button label exactly: <strong>Submit</strong> |
| Pad pill row with "Approval: Not Required" | Drop irrelevant pills, keep 3-4 meaningful ones |
| Reuse body content of the pill row in the body copy | The pills replace that content, they don't duplicate it |
| Skip dark-mode + Outlook-dark blocks on an email | Both @media (prefers-color-scheme: dark) and [data-ogsc] |
| Skip the preheader on an email | Add a display:none;max-height:0 block at the top |
| Use the system font stack without Montserrat first | 'Montserrat', Arial, Helvetica, sans-serif |
Set width="900" on an email outer table | Email layout is 620px; 900 is the KB layout |
| Use sales language or jargon in KB body | Match the customer-reply tone in the exemplars |
8. Reference templates
The canonical examples Claude and authors should imitate. Read these first before writing new content.
templates/halo/email-templates/-550-BitLocker - New Ticket - rb.json— the fully-branded reference template the brand DNA was derived from. Readbody_htmlfor the full layout (hero, ticket box, what-happens-next, signoff, CTA, footer, legal).- Other branded exemplars (score ≥80 in
_scorecard.html): inspect any template classified "Branded (compliant)" intemplates/halo/email-templates/_audit-snapshot/_scorecard.html.
KB article
templates/halo/kb-articles/_mockup-744-BitLocker.html— the master KB template. The<style>block has a content-conventions comment at the top documenting all 16 components, the field-placement rule, and the article-order skeleton.templates/halo/kb-articles/STYLE-GUIDE.html— the one-page visual style guide rendered for human authors.
Voice
integrations/anthropic/brand-voice/exemplars.md— 22 real customer-reply replies from production tickets, with score and tech attribution. Use as few-shot prompts when drafting body copy.
Audit tooling
integrations/halo-psa/pull-email-template-bodies.ps1— pulls every Halo email template's canonical HTML + metadata into_audit-snapshot/.integrations/halo-psa/build-email-template-scorecard.ps1— scores every template against the checks in section 6. Emits_scorecard.htmland_scorecard.csv.integrations/halo-psa/build-email-template-impact-map.ps1— "what references template X" — for safe edits.integrations/cloudflare/build-email-review.ps1— bundles a split-pane review site (Cloudflare Pages, behind Access).
Halo API quick reference
- Email template endpoint:
GET /EmailTemplate(list),GET /EmailTemplate/{id}?includedetails=true&pageinate=false(detail). - KB article endpoint:
GET /KBArticle/{id}returnsdescription_html,description,resolution_html,faqlists. - Email canonical body =
design.htmlif non-empty, elsebody_html. - Email IDs: negative = tenant-custom, positive = Halo seeded standard.
- KB FAQ list ID for "Ticket Guides" =
182— required on KB creation.
Last updated: 2026-05-28. Brand DNA derived from -550-BitLocker - New Ticket - rb (email) and _mockup-744-BitLocker.html (KB). Checks encoded in build-email-template-scorecard.ps1. Voice from integrations/anthropic/brand-voice/exemplars.md.