Create a psquared AVV (Auftragsverarbeitungsvertrag, Art. 28 DSGVO) PDF
Announce:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ create-avv started. Checking environment... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
This is the AVV counterpart to create-offer. You attach the resulting PDF to a
psquared offer when a customer becomes a direct data-processing customer. It
reuses the exact same rendering engine (two Chromium passes — edge-to-edge title
page + body pages with margins and Seite X / Y pagination — merged by pdf-lib).
The reference config is examples/avv-example.json. The sub-processor annex
there mirrors the live data policy at app.psquared.dev/legal/dpa — keep them in
sync. It is a template: a lawyer should review before first use.
What this skill produces
A multi-page A4 PDF with psquared branding:
- Title page — lavender gradient, brand mark, AVV reference/date/version, and the two parties (Verantwortlicher = customer, Auftragsverarbeiter = psquared).
- Body — preamble + numbered §-sections (Gegenstand/Dauer, Datenarten, Pflichten, Unterauftragsverarbeiter, Betroffenenrechte, Breach-Meldung, Drittlandtransfer, Löschung, Schlussbestimmungen).
- Signature block — Ort/Datum + Unterschrift for both parties.
- Annexes — Anlage 1 (technische und organisatorische Maßnahmen, Art. 32) and Anlage 2 (genehmigte Unterauftragsverarbeiter, as a table with locations).
Parameters
/create-avv [path-to-config.json] [output.pdf]
- path-to-config.json — optional. JSON describing the AVV (see
examples/avv-example.json). If omitted, interview the user (see STEP 1). - output.pdf — optional. Defaults to
./avv-<client-slug>.pdfin the cwd.
STEP 0 — Verify Setup
cd /Users/<you>/Documents/psquared/psquared-skills/skills/create-avv
bash setup.sh
Idempotent — verifies Node >= 18, installs Playwright + pdf-lib, downloads Chromium. (Shares deps with create-offer; if that's already set up this is fast.)
Announce:
Setup OK. Playwright + Chromium + pdf-lib ready.
STEP 1 — Gather Inputs (only if no config was provided)
If the user passed a JSON path, skip to STEP 2. Otherwise the only thing that
actually changes per customer is the controller block — everything else
(provider, sections, annexes) is psquared-standard and lives in the example.
Copy examples/avv-example.json, then fill:
| Field | Example |
|---|---|
controller.name |
"Doppler Holding GmbH" (legal entity!) |
controller.contactPerson |
"Max Mustermann, Geschäftsführer" |
controller.address |
"Musterstraße 15020 SalzburgÖsterreich" |
controller.email |
"datenschutz@kunde.at" |
doc.referenceNumber |
"YYYY-MMDD-XXX" |
doc.date |
German format: "24. Juni 2026" |
Only edit sections/annexes if this customer needs deviations (e.g. an extra
sub-processor, a customer-specific instruction). Keep Anlage 2 aligned with
/legal/dpa.
Write the config to a temp file (e.g. /tmp/create-avv-<slug>.json) and proceed.
STEP 2 — Build the PDF
cd /Users/<you>/Documents/psquared/psquared-skills/skills/create-avv
node build.mjs <path-to-config.json> <output.pdf>
STEP 3 — Verify
open "<output.pdf>"
Eyeball: title page edge-to-edge gradient; §-headings not orphaned at a page bottom; the signature block isn't split across pages; Anlage 2 table renders with all sub-processors; footer "Seite X / Y" on every body page.
STEP 4 — Report
Announce:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ AVV PDF created. Controller: [controller.name] Reference: [doc.referenceNumber] PDF: [absolute path] · Pages: [count] Reminder: have a lawyer review before sending. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
File layout
skills/create-avv/
├── SKILL.md
├── README.md
├── package.json # pins playwright + pdf-lib (shared with create-offer)
├── setup.sh # idempotent installer
├── build.mjs # two-pass renderer + pdf-lib merge (same engine as create-offer)
├── templates/
│ ├── style.css # psquared branding + print CSS + annex table styles
│ ├── title.html # edge-to-edge title page (parties)
│ └── document.html # preamble + §-sections + signature + annexes
└── examples/
└── avv-example.json # canonical reference — copy + edit `controller`
Notes for the LLM
- Only the
controllerblock changes for a standard deal — don't rewrite the legal §-sections unless the customer explicitly negotiated a deviation. htmlfields are raw HTML ({{{…}}}) — they may contain<ul>,<table>,<strong>. Plain fields (names, dates) are escaped.- Keep Anlage 2 in sync with
app.psquared.dev/legal/dpa— same sub-processor list + locations. - Always add the lawyer-review reminder in the report — this is a legal document.