{
  "generatedAt": "2026-09-09T17:28:28.622Z",
  "harness": {
    "name": "eval-skills",
    "version": "1.0.0",
    "entry": "qa/eval-skills.mjs",
    "browserUsed": true
  },
  "checkDefinitions": [
    {
      "id": "fiction-marker",
      "short": "Fiction marker",
      "name": "Fiction marker",
      "proves": "Every page names the fictional company, so a document that leaves this site cannot be mistaken for a real account.",
      "severity": "blocking",
      "scope": "universal",
      "applies": null
    },
    {
      "id": "disclaimer",
      "short": "Disclaimer",
      "name": "Demo-data disclaimer",
      "proves": "Every file opens with the demo-data comment, so the disclaimer travels with the file when it is saved or forwarded.",
      "severity": "blocking",
      "scope": "universal",
      "applies": null
    },
    {
      "id": "no-dashes",
      "short": "No dashes",
      "name": "No en or em dashes",
      "proves": "The house punctuation rule holds in the generated output, not just in the instruction that asked for it.",
      "severity": "blocking",
      "scope": "universal",
      "applies": null
    },
    {
      "id": "phone-format",
      "short": "Phone format",
      "name": "Phone number format",
      "proves": "Every phone-shaped string is a reserved (555) number in one house format, so no real line is ever printed.",
      "severity": "blocking",
      "scope": "universal",
      "applies": null
    },
    {
      "id": "fonts-single-source",
      "short": "Font source",
      "name": "Fonts from one source",
      "proves": "Each document links exactly one stylesheet, the self-hosted font file, and fetches nothing else over the network.",
      "severity": "blocking",
      "scope": "universal",
      "applies": null
    },
    {
      "id": "no-real-names",
      "short": "No real names",
      "name": "No real names or clinical words",
      "proves": "Nothing from the real client work leaked into the demo set: no company, partner, or clinical vocabulary.",
      "severity": "blocking",
      "scope": "universal",
      "applies": null
    },
    {
      "id": "meta-complete",
      "short": "Manifest",
      "name": "Manifest matches the folder",
      "proves": "meta.json is a true index of the folder: every HTML file is listed, every listed file exists, every entry is labelled.",
      "severity": "blocking",
      "scope": "universal",
      "applies": null
    },
    {
      "id": "pdf-pages",
      "short": "PDF pages",
      "name": "PDF page count",
      "proves": "The rendered PDF holds the number of pages the manifest claims, counted out of the PDF file itself rather than trusted.",
      "severity": "blocking",
      "scope": "universal",
      "applies": null
    },
    {
      "id": "render-present",
      "short": "Renders",
      "name": "Renders present",
      "proves": "Every file the manifest says was rendered has a real PNG behind it, not a missing or empty placeholder.",
      "severity": "blocking",
      "scope": "universal",
      "applies": null
    },
    {
      "id": "price-source-match",
      "short": "Price source",
      "name": "Prices trace to the data file",
      "proves": "Every figure printed on a price sheet is reconciled against data.csv, and every partner price is recomputed from the stated discount rather than trusted.",
      "severity": "blocking",
      "scope": "skill",
      "applies": [
        "price-sheet"
      ]
    },
    {
      "id": "merge-fields-exist",
      "short": "Merge fields",
      "name": "Merge fields exist",
      "proves": "Every merge token in the postcard and the letter is a real column in the recipient list, so no piece mails with an empty slot.",
      "severity": "blocking",
      "scope": "skill",
      "applies": [
        "direct-mail"
      ]
    },
    {
      "id": "callout-numbers",
      "short": "Callouts",
      "name": "Callouts match steps",
      "proves": "On every step page the numbered callouts in the drawing correspond one to one with the numbered steps in the text.",
      "severity": "blocking",
      "scope": "skill",
      "applies": [
        "quick-start"
      ]
    },
    {
      "id": "frame-sizes",
      "short": "Frame sizes",
      "name": "Frames are exact size",
      "proves": "Each social frame declares its platform size in CSS and the rendered PNG is exactly those pixels, read from the PNG header.",
      "severity": "blocking",
      "scope": "skill",
      "applies": [
        "social-kit"
      ]
    },
    {
      "id": "safe-zone",
      "short": "Safe zone",
      "name": "Story safe zone",
      "proves": "The story frame keeps its top and bottom 250px clear of text, so nothing sits under the platform interface.",
      "severity": "blocking",
      "scope": "skill",
      "applies": [
        "social-kit"
      ]
    },
    {
      "id": "tat-consistency",
      "short": "TAT agrees",
      "name": "Turnaround figures agree",
      "proves": "Every turnaround figure that appears on both the co-branded and the general sheet carries the same number on each.",
      "severity": "blocking",
      "scope": "skill",
      "applies": [
        "tat-sheet"
      ]
    }
  ],
  "skills": [
    {
      "id": "welcome-flyer",
      "title": "Welcome flyers",
      "shape": "Two Letter pages. Page one welcomes and introduces the team; page two tells the reader how to reach us and what to keep handy.",
      "files": 2,
      "htmlFiles": 2,
      "pages": 3,
      "pdfPagesVerified": 3,
      "rendersVerified": 2,
      "score": {
        "blockingPassed": 9,
        "blockingRun": 9,
        "percent": 100
      },
      "checks": [
        {
          "check": "fiction-marker",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "All 2 HTML files name Apex Instruments."
        },
        {
          "check": "disclaimer",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "All 2 HTML files open with the demo-data comment naming the company as fictional."
        },
        {
          "check": "no-dashes",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "No en or em dash in 2 HTML files."
        },
        {
          "check": "phone-format",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "8 phone numbers across 2 files, 4 distinct, every one in the form (555) ddd-dddd."
        },
        {
          "check": "fonts-single-source",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "2 stylesheet links, all /assets/fonts/fonts.css, and no other http or https resource is loaded."
        },
        {
          "check": "no-real-names",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "None of the 17 banned terms appear in 2 HTML files. \"rx\" is matched as a word in readable text only, because SVG uses rx as a corner-radius attribute."
        },
        {
          "check": "meta-complete",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "meta.json lists 2 files, covering all 2 HTML files in the folder; every entry has a label and a kind and every listed file exists."
        },
        {
          "check": "pdf-pages",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "2 PDFs counted from the file itself (page tree /Count and leaf page objects agree), 3 pages in total, each matching meta.json: index.pdf 2p; variant-general.pdf 1p."
        },
        {
          "check": "render-present",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "2 renders present and over 5 KB: index.png 312 KB; variant-general.png 310 KB."
        }
      ]
    },
    {
      "id": "print-set",
      "title": "One-pagers, trifolds & catalogs",
      "shape": "A Letter one-pager, a two-sided 11 x 8.5 trifold, and an eight-page catalog, all from one product record.",
      "files": 3,
      "htmlFiles": 3,
      "pages": 11,
      "pdfPagesVerified": 11,
      "rendersVerified": 3,
      "score": {
        "blockingPassed": 9,
        "blockingRun": 9,
        "percent": 100
      },
      "checks": [
        {
          "check": "fiction-marker",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "All 3 HTML files name Apex Instruments."
        },
        {
          "check": "disclaimer",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "All 3 HTML files open with the demo-data comment naming the company as fictional."
        },
        {
          "check": "no-dashes",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "No en or em dash in 3 HTML files."
        },
        {
          "check": "phone-format",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "5 phone numbers across 3 files, 1 distinct, every one in the form (555) ddd-dddd."
        },
        {
          "check": "fonts-single-source",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "3 stylesheet links, all /assets/fonts/fonts.css, and no other http or https resource is loaded."
        },
        {
          "check": "no-real-names",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "None of the 17 banned terms appear in 3 HTML files. \"rx\" is matched as a word in readable text only, because SVG uses rx as a corner-radius attribute."
        },
        {
          "check": "meta-complete",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "meta.json lists 3 files, covering all 3 HTML files in the folder; every entry has a label and a kind and every listed file exists."
        },
        {
          "check": "pdf-pages",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "3 PDFs counted from the file itself (page tree /Count and leaf page objects agree), 11 pages in total, each matching meta.json: one-pager.pdf 1p; trifold.pdf 2p; catalog.pdf 8p."
        },
        {
          "check": "render-present",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "3 renders present and over 5 KB: one-pager.png 306 KB; trifold.png 369 KB; catalog.png 97 KB."
        }
      ]
    },
    {
      "id": "guides",
      "title": "Onboarding guides",
      "shape": "Four Letter pages: cover with contents, checklist, what-to-send table, and how we get back to you.",
      "files": 2,
      "htmlFiles": 2,
      "pages": 8,
      "pdfPagesVerified": 8,
      "rendersVerified": 2,
      "score": {
        "blockingPassed": 9,
        "blockingRun": 9,
        "percent": 100
      },
      "checks": [
        {
          "check": "fiction-marker",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "All 2 HTML files name Apex Instruments."
        },
        {
          "check": "disclaimer",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "All 2 HTML files open with the demo-data comment naming the company as fictional."
        },
        {
          "check": "no-dashes",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "No en or em dash in 2 HTML files."
        },
        {
          "check": "phone-format",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "14 phone numbers across 2 files, 4 distinct, every one in the form (555) ddd-dddd."
        },
        {
          "check": "fonts-single-source",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "2 stylesheet links, all /assets/fonts/fonts.css, and no other http or https resource is loaded."
        },
        {
          "check": "no-real-names",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "None of the 17 banned terms appear in 2 HTML files. \"rx\" is matched as a word in readable text only, because SVG uses rx as a corner-radius attribute."
        },
        {
          "check": "meta-complete",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "meta.json lists 2 files, covering all 2 HTML files in the folder; every entry has a label and a kind and every listed file exists."
        },
        {
          "check": "pdf-pages",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "2 PDFs counted from the file itself (page tree /Count and leaf page objects agree), 8 pages in total, each matching meta.json: index.pdf 4p; co-branded.pdf 4p."
        },
        {
          "check": "render-present",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "2 renders present and over 5 KB: index.png 168 KB; co-branded.png 186 KB."
        }
      ]
    },
    {
      "id": "quick-start",
      "title": "Quick-start directions",
      "shape": "Six Letter pages plus a one-page wall card.",
      "files": 2,
      "htmlFiles": 2,
      "pages": 7,
      "pdfPagesVerified": 7,
      "rendersVerified": 2,
      "score": {
        "blockingPassed": 10,
        "blockingRun": 10,
        "percent": 100
      },
      "checks": [
        {
          "check": "fiction-marker",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "All 2 HTML files name Apex Instruments."
        },
        {
          "check": "disclaimer",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "All 2 HTML files open with the demo-data comment naming the company as fictional."
        },
        {
          "check": "no-dashes",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "No en or em dash in 2 HTML files."
        },
        {
          "check": "phone-format",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "8 phone numbers across 2 files, 3 distinct, every one in the form (555) ddd-dddd. 1 candidate skipped and named: index.html: \"Tracking: 1Z 884 220 0311\" is a labelled identifier, not a phone number."
        },
        {
          "check": "fonts-single-source",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "2 stylesheet links, all /assets/fonts/fonts.css, and no other http or https resource is loaded."
        },
        {
          "check": "no-real-names",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "None of the 17 banned terms appear in 2 HTML files. \"rx\" is matched as a word in readable text only, because SVG uses rx as a corner-radius attribute."
        },
        {
          "check": "meta-complete",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "meta.json lists 2 files, covering all 2 HTML files in the folder; every entry has a label and a kind and every listed file exists."
        },
        {
          "check": "pdf-pages",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "2 PDFs counted from the file itself (page tree /Count and leaf page objects agree), 7 pages in total, each matching meta.json: index.pdf 6p; wall-card.pdf 1p."
        },
        {
          "check": "render-present",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "2 renders present and over 5 KB: index.png 218 KB; wall-card.png 319 KB."
        },
        {
          "check": "callout-numbers",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "4 step pages checked, 18 callouts in total, each numbered set matching its steps one to one: Placing an order 5; Tracking status 4; Requesting service 5; Managing users and locations 4."
        }
      ]
    },
    {
      "id": "tat-sheet",
      "title": "Turnaround-time sheets",
      "shape": "Two Letter pages: service table and priority box, then holidays, shipping cutoffs, escalation, and revision history.",
      "files": 2,
      "htmlFiles": 2,
      "pages": 3,
      "pdfPagesVerified": 3,
      "rendersVerified": 2,
      "score": {
        "blockingPassed": 10,
        "blockingRun": 10,
        "percent": 100
      },
      "checks": [
        {
          "check": "fiction-marker",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "All 2 HTML files name Apex Instruments."
        },
        {
          "check": "disclaimer",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "All 2 HTML files open with the demo-data comment naming the company as fictional."
        },
        {
          "check": "no-dashes",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "No en or em dash in 2 HTML files."
        },
        {
          "check": "phone-format",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "10 phone numbers across 2 files, 4 distinct, every one in the form (555) ddd-dddd."
        },
        {
          "check": "fonts-single-source",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "2 stylesheet links, all /assets/fonts/fonts.css, and no other http or https resource is loaded."
        },
        {
          "check": "no-real-names",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "None of the 17 banned terms appear in 2 HTML files. \"rx\" is matched as a word in readable text only, because SVG uses rx as a corner-radius attribute."
        },
        {
          "check": "meta-complete",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "meta.json lists 2 files, covering all 2 HTML files in the folder; every entry has a label and a kind and every listed file exists."
        },
        {
          "check": "pdf-pages",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "2 PDFs counted from the file itself (page tree /Count and leaf page objects agree), 3 pages in total, each matching meta.json: index.pdf 2p; variant-general.pdf 1p."
        },
        {
          "check": "render-present",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "2 renders present and over 5 KB: index.png 394 KB; variant-general.png 430 KB."
        },
        {
          "check": "tat-consistency",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "7 service lines appear on both sheets; standard days, priority days, and cutoff agree on every one (21 figures compared). Lines: Calibration, Repair, tier 1, Repair, tier 2, Repair, tier 3, Replacement parts, Custom configuration, On-site training."
        }
      ]
    },
    {
      "id": "price-sheet",
      "title": "Price sheets",
      "shape": "Two Letter pages of tables and terms, plus the CSV that generated them.",
      "files": 3,
      "htmlFiles": 2,
      "pages": 4,
      "pdfPagesVerified": 4,
      "rendersVerified": 2,
      "score": {
        "blockingPassed": 10,
        "blockingRun": 10,
        "percent": 100
      },
      "checks": [
        {
          "check": "fiction-marker",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "All 2 HTML files name Apex Instruments."
        },
        {
          "check": "disclaimer",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "All 2 HTML files open with the demo-data comment naming the company as fictional."
        },
        {
          "check": "no-dashes",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "No en or em dash in 2 HTML files."
        },
        {
          "check": "phone-format",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "6 phone numbers across 2 files, 3 distinct, every one in the form (555) ddd-dddd."
        },
        {
          "check": "fonts-single-source",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "2 stylesheet links, all /assets/fonts/fonts.css, and no other http or https resource is loaded."
        },
        {
          "check": "no-real-names",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "None of the 17 banned terms appear in 2 HTML files. \"rx\" is matched as a word in readable text only, because SVG uses rx as a corner-radius attribute."
        },
        {
          "check": "meta-complete",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "meta.json lists 3 files, covering all 2 HTML files in the folder; every entry has a label and a kind and every listed file exists."
        },
        {
          "check": "pdf-pages",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "2 PDFs counted from the file itself (page tree /Count and leaf page objects agree), 4 pages in total, each matching meta.json: index.pdf 2p; variant-general.pdf 2p."
        },
        {
          "check": "render-present",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "2 renders present and over 5 KB: index.png 340 KB; variant-general.png 310 KB."
        },
        {
          "check": "price-source-match",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "43 dollar figures printed across the two sheets: 28 list prices, 14 partner prices, 1 stated savings (list minus partner). All 14 partner prices in data.csv recomputed at the 10% rate printed on the sheet and matched to the dollar."
        }
      ]
    },
    {
      "id": "social-kit",
      "title": "Social kits & platform graphics",
      "shape": "Six frames (square, story, LinkedIn, X, Facebook, YouTube) plus captions and a kit overview.",
      "files": 8,
      "htmlFiles": 7,
      "pages": 7,
      "pdfPagesVerified": 0,
      "rendersVerified": 7,
      "score": {
        "blockingPassed": 11,
        "blockingRun": 11,
        "percent": 100
      },
      "checks": [
        {
          "check": "fiction-marker",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "All 7 HTML files name Apex Instruments."
        },
        {
          "check": "disclaimer",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "All 7 HTML files open with the demo-data comment naming the company as fictional."
        },
        {
          "check": "no-dashes",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "No en or em dash in 7 HTML files."
        },
        {
          "check": "phone-format",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "No phone-shaped string appears in 7 files, so there is nothing that could carry a real number."
        },
        {
          "check": "fonts-single-source",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "7 stylesheet links, all /assets/fonts/fonts.css, and no other http or https resource is loaded."
        },
        {
          "check": "no-real-names",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "None of the 17 banned terms appear in 7 HTML files. \"rx\" is matched as a word in readable text only, because SVG uses rx as a corner-radius attribute."
        },
        {
          "check": "meta-complete",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "meta.json lists 8 files, covering all 7 HTML files in the folder; every entry has a label and a kind and every listed file exists."
        },
        {
          "check": "pdf-pages",
          "pass": true,
          "severity": "blocking",
          "skipped": true,
          "reason": "No file in this folder is marked kind \"print\", so there is no PDF page count to verify."
        },
        {
          "check": "render-present",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "7 renders present and over 5 KB: index.png 271 KB; ig-post.png 210 KB; ig-story.png 297 KB; and 4 more."
        },
        {
          "check": "frame-sizes",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "7 frames match on all three: CSS geometry, meta.json, and the PNG IHDR header read from the file bytes. index 1400x900; ig-post 1080x1080; ig-story 1080x1920; linkedin 1200x627; x 1600x900; facebook 1200x630; youtube-thumb 1280x720."
        },
        {
          "check": "safe-zone",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "Measured in a 1080x1920 render: 7 text runs, the highest starting at y=304 and the lowest ending at y=1616. Both clear of the 250px bands (top band ends at 250, bottom band starts at 1670)."
        }
      ]
    },
    {
      "id": "launch-pack",
      "title": "Launch communications pack",
      "shape": "Ten Letter pages, from message house to approval log.",
      "files": 1,
      "htmlFiles": 1,
      "pages": 10,
      "pdfPagesVerified": 10,
      "rendersVerified": 1,
      "score": {
        "blockingPassed": 9,
        "blockingRun": 9,
        "percent": 100
      },
      "checks": [
        {
          "check": "fiction-marker",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "All 1 HTML file names Apex Instruments."
        },
        {
          "check": "disclaimer",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "All 1 HTML file opens with the demo-data comment naming the company as fictional."
        },
        {
          "check": "no-dashes",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "No en or em dash in 1 HTML file."
        },
        {
          "check": "phone-format",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "7 phone numbers across 1 file, 5 distinct, every one in the form (555) ddd-dddd."
        },
        {
          "check": "fonts-single-source",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "1 stylesheet link, all /assets/fonts/fonts.css, and no other http or https resource is loaded."
        },
        {
          "check": "no-real-names",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "None of the 17 banned terms appear in 1 HTML file. \"rx\" is matched as a word in readable text only, because SVG uses rx as a corner-radius attribute."
        },
        {
          "check": "meta-complete",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "meta.json lists 1 file, covering all 1 HTML file in the folder; every entry has a label and a kind and every listed file exists."
        },
        {
          "check": "pdf-pages",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "1 PDF counted from the file itself (page tree /Count and leaf page objects agree), 10 pages in total, each matching meta.json: index.pdf 10p."
        },
        {
          "check": "render-present",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "1 render present and over 5 KB: index.png 227 KB."
        }
      ]
    },
    {
      "id": "email-kit",
      "title": "Email templates, sequences & webinar kits",
      "shape": "A template, a sequence map with full copy, and a four-page webinar kit.",
      "files": 4,
      "htmlFiles": 3,
      "pages": 7,
      "pdfPagesVerified": 4,
      "rendersVerified": 3,
      "score": {
        "blockingPassed": 9,
        "blockingRun": 9,
        "percent": 100
      },
      "checks": [
        {
          "check": "fiction-marker",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "All 3 HTML files name Apex Instruments."
        },
        {
          "check": "disclaimer",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "All 3 HTML files open with the demo-data comment naming the company as fictional."
        },
        {
          "check": "no-dashes",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "No en or em dash in 3 HTML files."
        },
        {
          "check": "phone-format",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "4 phone numbers across 3 files, 2 distinct, every one in the form (555) ddd-dddd."
        },
        {
          "check": "fonts-single-source",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "3 stylesheet links, all /assets/fonts/fonts.css, and no other http or https resource is loaded. 1 hyperlink target present and not counted as a load: template.html links to https://apexinstruments.example/atlas."
        },
        {
          "check": "no-real-names",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "None of the 17 banned terms appear in 3 HTML files. \"rx\" is matched as a word in readable text only, because SVG uses rx as a corner-radius attribute."
        },
        {
          "check": "meta-complete",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "meta.json lists 4 files, covering all 3 HTML files in the folder; every entry has a label and a kind and every listed file exists."
        },
        {
          "check": "pdf-pages",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "1 PDF counted from the file itself (page tree /Count and leaf page objects agree), 4 pages in total, each matching meta.json: webinar-kit.pdf 4p."
        },
        {
          "check": "render-present",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "3 renders present and over 5 KB: template.png 287 KB; sequence.png 364 KB; webinar-kit.png 365 KB."
        }
      ]
    },
    {
      "id": "generators",
      "title": "Letterhead & signature generators",
      "shape": "Two single-file tools: a letterhead writer and a signature builder.",
      "files": 3,
      "htmlFiles": 3,
      "pages": 3,
      "pdfPagesVerified": 0,
      "rendersVerified": 3,
      "score": {
        "blockingPassed": 9,
        "blockingRun": 9,
        "percent": 100
      },
      "checks": [
        {
          "check": "fiction-marker",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "All 3 HTML files name Apex Instruments."
        },
        {
          "check": "disclaimer",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "All 3 HTML files open with the demo-data comment naming the company as fictional."
        },
        {
          "check": "no-dashes",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "No en or em dash in 3 HTML files."
        },
        {
          "check": "phone-format",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "5 phone numbers across 3 files, 4 distinct, every one in the form (555) ddd-dddd."
        },
        {
          "check": "fonts-single-source",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "3 stylesheet links, all /assets/fonts/fonts.css, and no other http or https resource is loaded."
        },
        {
          "check": "no-real-names",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "None of the 17 banned terms appear in 3 HTML files. \"rx\" is matched as a word in readable text only, because SVG uses rx as a corner-radius attribute."
        },
        {
          "check": "meta-complete",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "meta.json lists 3 files, covering all 3 HTML files in the folder; every entry has a label and a kind and every listed file exists."
        },
        {
          "check": "pdf-pages",
          "pass": true,
          "severity": "blocking",
          "skipped": true,
          "reason": "No file in this folder is marked kind \"print\", so there is no PDF page count to verify."
        },
        {
          "check": "render-present",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "3 renders present and over 5 KB: index.png 62 KB; letterhead.png 154 KB; signature.png 173 KB."
        }
      ]
    },
    {
      "id": "order-forms",
      "title": "Order & intake forms",
      "shape": "An 11 x 8.5 order form, a two-page intake form, and a cover page.",
      "files": 3,
      "htmlFiles": 3,
      "pages": 4,
      "pdfPagesVerified": 4,
      "rendersVerified": 3,
      "score": {
        "blockingPassed": 9,
        "blockingRun": 9,
        "percent": 100
      },
      "checks": [
        {
          "check": "fiction-marker",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "All 3 HTML files name Apex Instruments."
        },
        {
          "check": "disclaimer",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "All 3 HTML files open with the demo-data comment naming the company as fictional."
        },
        {
          "check": "no-dashes",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "No en or em dash in 3 HTML files."
        },
        {
          "check": "phone-format",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "7 phone numbers across 3 files, 3 distinct, every one in the form (555) ddd-dddd."
        },
        {
          "check": "fonts-single-source",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "3 stylesheet links, all /assets/fonts/fonts.css, and no other http or https resource is loaded."
        },
        {
          "check": "no-real-names",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "None of the 17 banned terms appear in 3 HTML files. \"rx\" is matched as a word in readable text only, because SVG uses rx as a corner-radius attribute."
        },
        {
          "check": "meta-complete",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "meta.json lists 3 files, covering all 3 HTML files in the folder; every entry has a label and a kind and every listed file exists."
        },
        {
          "check": "pdf-pages",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "3 PDFs counted from the file itself (page tree /Count and leaf page objects agree), 4 pages in total, each matching meta.json: index.pdf 1p; order-form.pdf 1p; intake-form.pdf 2p."
        },
        {
          "check": "render-present",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "3 renders present and over 5 KB: index.png 222 KB; order-form.png 351 KB; intake-form.png 227 KB."
        }
      ]
    },
    {
      "id": "direct-mail",
      "title": "Direct mail",
      "shape": "A 6 x 9 postcard front and back, a merge letter, the sample list, the QR, and the tracking plan.",
      "files": 6,
      "htmlFiles": 3,
      "pages": 4,
      "pdfPagesVerified": 4,
      "rendersVerified": 3,
      "score": {
        "blockingPassed": 10,
        "blockingRun": 10,
        "percent": 100
      },
      "checks": [
        {
          "check": "fiction-marker",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "All 3 HTML files name Apex Instruments."
        },
        {
          "check": "disclaimer",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "All 3 HTML files open with the demo-data comment naming the company as fictional."
        },
        {
          "check": "no-dashes",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "No en or em dash in 3 HTML files."
        },
        {
          "check": "phone-format",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "4 phone numbers across 3 files, 2 distinct, every one in the form (555) ddd-dddd."
        },
        {
          "check": "fonts-single-source",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "3 stylesheet links, all /assets/fonts/fonts.css, and no other http or https resource is loaded."
        },
        {
          "check": "no-real-names",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "None of the 17 banned terms appear in 3 HTML files. \"rx\" is matched as a word in readable text only, because SVG uses rx as a corner-radius attribute."
        },
        {
          "check": "meta-complete",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "meta.json lists 6 files, covering all 3 HTML files in the folder; every entry has a label and a kind and every listed file exists."
        },
        {
          "check": "pdf-pages",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "3 PDFs counted from the file itself (page tree /Count and leaf page objects agree), 4 pages in total, each matching meta.json: index.pdf 1p; postcard.pdf 2p; letter.pdf 1p."
        },
        {
          "check": "render-present",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "3 renders present and over 5 KB: index.png 414 KB; postcard.png 276 KB; letter.png 254 KB."
        },
        {
          "check": "merge-fields-exist",
          "pass": true,
          "severity": "blocking",
          "skipped": false,
          "reason": "9 merge tokens used across the postcard and the letter (address1, city, code, first_name, last_name, practice_name, rep_name, state, zip); every one is a column in merge-sample.csv, which has 9 columns and 6 rows."
        }
      ]
    }
  ],
  "summary": {
    "skills": 12,
    "checksRun": 114,
    "checksPassed": 114,
    "blockingRun": 114,
    "blockingPassed": 114,
    "advisoryRun": 0,
    "advisoryPassed": 0,
    "files": 39,
    "htmlFiles": 33,
    "pages": 71,
    "pdfPagesVerified": 58,
    "rendersVerified": 33,
    "failures": []
  }
}
