---
name: varick-docs
description: "Produce a general Varick Agents branded document as an editable .docx. Use this whenever the user asks to generate, create, write, or draft a doc, docx, PDF, memo, proposal, brief, policy, process document, internal doc, client-facing writeup, or any downloadable deliverable for Varick — including phrasings like 'generate a doc', 'put this in a document', 'make a PDF of this', 'write this up for the client', or 'make it look like our other docs'. Trigger it even when the user doesn't say 'Varick' or 'brand', since every document the company issues uses this layout: wordmark lockup masthead, Helvetica Neue, navy #002870, hairline rules, three-part footer. Use this BEFORE the generic docx or pdf skills so the house style is applied. Route away for the specialised documents: invoices (varick-invoice), engagement letters and SOWs (varick-engagement-letter), multi-page navy-cover reports (varick-report), charts (varick-charts)."
---

# Varick Agents documents

This is the catch-all for documents that don't have a dedicated skill. It runs
the same visual system as `varick-engagement-letter` and `varick-invoice` —
the wordmark lockup masthead on every page, Helvetica Neue at one weight, navy
`#002870`, hairline rules, the three-part footer with page numbers — so a memo
and an invoice read as the same company.

`references/template.js` is a complete, tested generator covering every block
below. **Copy it, replace the content in `buildDoc()`, keep the helpers.**
Rebuilding components from scratch is how the house style drifts.

Read `/mnt/skills/public/docx/SKILL.md` first for docx-js mechanics.

## Route first

| The user wants | Skill |
|---|---|
| An invoice or bill | `varick-invoice` |
| An engagement letter, SOW, scope or Phase 1 letter | `varick-engagement-letter` |
| A multi-page navy-cover report or explainer | `varick-report` |
| A chart, graph or data viz | `varick-charts` |
| Anything else in a document | this skill |

## Workflow

1. Copy `references/template.js` into the working directory alongside a copy
   of `assets/`, then rewrite `buildDoc()`. Don't touch the helpers.

2. Build, validate, render, and **look at every page**:

```bash
node template.js "Varick Agents — Order-to-Cash Diagnostic.docx"
python /mnt/skills/public/docx/scripts/office/validate.py "Varick Agents — Order-to-Cash Diagnostic.docx"
soffice --headless --convert-to pdf "Varick Agents — Order-to-Cash Diagnostic.docx"
pdftoppm -jpeg -r 100 "Varick Agents — Order-to-Cash Diagnostic.pdf" page
```

   Check five things: the masthead and its rule sit at the top of *each* page,
   every page's first line clears that rule by about 0.3in, the footer reads
   `Page X of Y` with the right total, no heading is stranded from the table it
   introduces, and no bracketed placeholder survived.

3. Deliver the `.docx` to `/mnt/user-data/outputs/`. Google Docs opens and
   edits `.docx` natively, so that's the editable deliverable. Add the PDF too
   only if they asked for one.

## Brand constants

```javascript
const V = {
  // Colour. Navy plus greys. That is the whole palette.
  NAVY: "002870",       // headings, title, labels, table header fill, bullets
  NAVY_MID: "3E6FA8",   // indicative gantt bars ONLY
  INK: "1A1A1A",        // body text
  INK_SOFT: "3F3F3F",   // secondary text inside tables
  GREY: "8A8A8A",       // meta labels, notes, footer
  RULE: "D9D9D9",       // table strokes
  HAIRLINE: "E7E7E7",   // dividers inside meta rows and signature fields
  BAND: "F3F6FB",       // band / callout fill
  LABEL_BG: "FAFAFA",   // deflist label column
  WHITE: "FFFFFF",

  // Type. One face, one weight, no bold, no italic.
  FONT: "Helvetica Neue",
  SZ_TITLE: 34,   // 17pt navy
  SZ_H1: 28,      // 14pt navy section heading
  SZ_H2: 24,      // 12pt navy subhead
  SZ_BODY: 21,    // 10.5pt body AND every table cell
  SZ_META: 18,    // 9pt meta rows, footer, gantt labels
  SZ_LABEL: 16,   // 8pt small-caps kicker and column labels
  SZ_NOTE: 15,    // 7.5pt grey qualifier
  LINE: 276,      // 1.15

  // Layout, DXA (1440 = 1in). US Letter, 6.7in content column — same as the
  // invoice, so the wordmark scales identically across every document.
  PAGE_W: 12240, PAGE_H: 15840,
  MARGIN_X: 1296, MARGIN_TOP: 1900, MARGIN_BOTTOM: 1080,
  HEADER_DIST: 720, FOOTER_DIST: 620,
  CONTENT_W: 9648,
  CELL_MARGINS: { top: 90, bottom: 90, left: 110, right: 110 },
  SP_BEFORE: 200, SP_AFTER: 140,
};
```

Hierarchy comes from **navy, size and small caps** — never from weight. The
bold faces aren't in the package and `bold: false` is written on every run.

## Blocks

Each maps to one helper in `template.js`. One block, one renderer, so a
document can't drift off-brand by being written differently.

| Helper | What it's for |
|---|---|
| `masthead()` | The wordmark lockup, in the page header so it repeats. Never call it in the body |
| `titleBlock({kicker, title, from, meta})` | Small-caps kicker, 17pt navy title, then meta rows on hairlines. `from` renders as the first meta row |
| `section(title)` | Numbered heading, 14pt navy, **no rule underneath**. Numbers itself in order; pass `null` for unnumbered |
| `subhead(text)` | 12pt navy label inside a section |
| `para(text)` | Running prose |
| `bullets(items)` | Round navy bullets via the numbering config — a real list that survives Google Docs |
| `deflist(rows)` | Label/value grid, pale `#fafafa` label column. The Engagement at a Glance / Commercials opener |
| `table(head, rows, opts)` | Navy header row, hairline grid, 10.5pt. A cell that is an **array** renders as bullets. `emphasizeFirst: true` sets the first column navy as a claim. `widths: [..]` in dxa, partial is fine — the rest split what's left |
| `band(text)` | Tinted callout with a navy left bar. The `**Impact:**` lines |
| `gantt({cols, rows, milestones})` | Week-by-week plan as a native table, so it stays editable. `spans` are `[first, last, kind]`, kind `solid` (committed) or `light` (indicative). Adjacent same-kind spans merge into one continuous bar |
| `figure(file, caption, heightPx)` | PNG or JPEG at the content width with a grey caption. Charts come from `varick-charts` |
| `signature(parties)` | Parties side by side, each field on its own hairline |
| `note(text)` | 7.5pt grey qualifier, for "illustrative only" lines |
| `rule()` `spacer()` `pagebreak()` | Divider, vertical space, forced page |
| `houseFooter()` | `[CONFIDENTIAL]` · `Varick Agents` · `Page X of Y`, all grey, every page |

**Emphasis:** wrap a phrase in `**double asterisks**` in any prose string and
it renders navy. That is the only inline emphasis there is.

**Spacing is fixed.** Every block sits on the same `SP_BEFORE` / `SP_AFTER`
pair so the rhythm down the page is even. Don't tune spacing per block, and
don't set sizes per block — if a document runs long, cut copy.

## What not to change

The renderers are the design decision; `buildDoc()` is the content.

- **Don't replace the wordmark with text.** The masthead is
  `assets/varick-wordmark.png`, shared with `varick-invoice`, scaled to the
  6.7in content width (0.5in tall). That asset is a *lockup* — wordmark plus a
  hairline spanning the full canvas — so the rule **is** the masthead divider.
  Never add a second rule under it.
- **Don't add a tagline under the wordmark.** It was removed deliberately.
- **Don't re-cut the wordmark or render the SVG as-is.**
  `assets/varick-wordmark.svg` is the source of truth but its path is
  `fill="none" stroke="#022B72"`, so rendering it directly gives hollow,
  outlined letterforms. The PNG is already correct: `cairosvg` at `scale=8`,
  3856×288.
- **Don't switch fonts and don't reach for bold.** Helvetica Neue only. Never
  Geist, never Inter, never Cambria, never a mono or serif face, never italic.
- **Don't add colour.** Navy `#002870`, one mid-navy `#3e6fa8` for indicative
  gantt bars, `#f3f6fb` for band fills, `#fafafa` for the label column,
  `#d9d9d9` for rules. No second accent, no gradients, no rounded corners.
- **Don't put a rule under a section heading.** The size does the work.
- **Don't add a banner.** The old template opened with a navy `VARICK AGENTS`
  block; the masthead replaced it.
- **Don't centre anything.** The whole system is left-aligned.
- **Don't touch the footer.** The page number is a live Word field — never
  replace it with a literal number.
- **Don't hand-edit the `.docx`.** Change `buildDoc()` and rebuild.

## Watch for

- **Don't split a long table into two blocks with a "(continued)" header.**
  One `table` call, however long — it flows across the page break and the navy
  header row repeats itself.
- **Stranded headings.** `section` and `subhead` carry `keepNext`, so a heading
  follows its content to the next page. If a page still ends awkwardly, cut
  copy rather than inserting a `pagebreak`.
- **`Page X of Y` shows the wrong total** in a reader that hasn't recalculated
  fields. The PDF is always right; Google Docs updates on open.
- **Table widths must sum to `CONTENT_W`.** `fitWidths()` handles this — pass
  the leading columns and let it split the remainder. Percentage widths break
  in Google Docs; keep everything in dxa.
- **`ShadingType.CLEAR`, never `SOLID`** — solid renders black.

## Writing style

Load `anti-ai-writing` before drafting the copy. The short version:

- Use contractions
- Never use em dashes
- Never open with "Here's X"
- No dramatic fragments, no filler adjectives ("incredibly", "fundamentally",
  "game-changing")
- Hyperlink URLs, never paste them raw
- The legal entity is `SolidCart, Inc (d/b/a Varick Agents)`
- Number section headings in client-facing documents
- Prefer tables over prose walls, so a reader can jump to the section that
  matters to them

## Editing a document that already exists

Reconstruct the content in `buildDoc()` and rebuild rather than patching the
`.docx` — that keeps one source of truth. Recover an issued document with
`pandoc -t markdown old.docx`, or `pdftotext -layout old.pdf -` if all you have
is the PDF.

## Dependencies

`docx` (npm, preinstalled) · LibreOffice (`soffice`) · `pdftoppm` · `pandoc`
